views.gno
3.31 Kb · 139 lines
1package gnogle_market
2
3import (
4 "chain"
5 "strings"
6
7 "gno.land/p/nt/ufmt/v0"
8)
9
10// MarketAddress returns this market realm's address — the address users approve
11// on gnogle_nft (SetApprovalForAll) to enable trading.
12func MarketAddress() string {
13 return chain.PackageAddress("gno.land/r/g18wk4a80cr7dqa25vfka2yug5n3pd50udled6y3/gnogle_market").String()
14}
15
16// ListingsJSON returns all active fixed-price listings.
17func ListingsJSON() string {
18 var b strings.Builder
19 b.WriteString("[")
20 first := true
21 listings.Iterate("", "", func(_ string, v any) bool {
22 l := v.(*Listing)
23 if !first {
24 b.WriteString(",")
25 }
26 first = false
27 b.WriteString(ufmt.Sprintf(`{"collID":%s,"tokenID":%s,"seller":%s,"price":%d}`,
28 js(l.collID), js(l.tokenID), js(l.seller.String()), l.price))
29 return false
30 })
31 b.WriteString("]")
32 return b.String()
33}
34
35// AuctionsJSON returns all active auctions.
36func AuctionsJSON() string {
37 var b strings.Builder
38 b.WriteString("[")
39 first := true
40 auctions.Iterate("", "", func(_ string, v any) bool {
41 a := v.(*Auction)
42 if !first {
43 b.WriteString(",")
44 }
45 first = false
46 b.WriteString(ufmt.Sprintf(
47 `{"collID":%s,"tokenID":%s,"seller":%s,"minBid":%d,"highBid":%d,"highBidder":%s,"endUnix":%d}`,
48 js(a.collID), js(a.tokenID), js(a.seller.String()), a.minBid, a.highestBid, js(a.highestBidder.String()), a.endTime.Unix()))
49 return false
50 })
51 b.WriteString("]")
52 return b.String()
53}
54
55// AllOffersJSON returns every standing offer.
56func AllOffersJSON() string {
57 var b strings.Builder
58 b.WriteString("[")
59 first := true
60 offers.Iterate("", "", func(_ string, v any) bool {
61 o := v.(*Offer)
62 if !first {
63 b.WriteString(",")
64 }
65 first = false
66 b.WriteString(ufmt.Sprintf(`{"collID":%s,"tokenID":%s,"buyer":%s,"amount":%d}`,
67 js(o.collID), js(o.tokenID), js(o.buyer.String()), o.amount))
68 return false
69 })
70 b.WriteString("]")
71 return b.String()
72}
73
74// OffersJSON returns the offers on a single token.
75func OffersJSON(collID, tokenID string) string {
76 prefix := collID + "/" + tokenID + "/"
77 var b strings.Builder
78 b.WriteString("[")
79 first := true
80 offers.Iterate("", "", func(k string, v any) bool {
81 if !strings.HasPrefix(k, prefix) {
82 return false
83 }
84 o := v.(*Offer)
85 if !first {
86 b.WriteString(",")
87 }
88 first = false
89 b.WriteString(ufmt.Sprintf(`{"buyer":%s,"amount":%d}`, js(o.buyer.String()), o.amount))
90 return false
91 })
92 b.WriteString("]")
93 return b.String()
94}
95
96// SalesJSON returns recent sales, newest first, up to limit (default 50).
97func SalesJSON(limit int) string {
98 if limit <= 0 || limit > 200 {
99 limit = 50
100 }
101 var b strings.Builder
102 b.WriteString("[")
103 n := 0
104 for i := len(sales) - 1; i >= 0 && n < limit; i-- {
105 s := sales[i]
106 if n > 0 {
107 b.WriteString(",")
108 }
109 b.WriteString(ufmt.Sprintf(
110 `{"collID":%s,"tokenID":%s,"from":%s,"to":%s,"price":%d,"kind":%s,"height":%d}`,
111 js(s.collID), js(s.tokenID), js(s.from.String()), js(s.to.String()), s.price, js(s.kind), s.height))
112 n++
113 }
114 b.WriteString("]")
115 return b.String()
116}
117
118func js(s string) string {
119 var b strings.Builder
120 b.WriteString(`"`)
121 for _, r := range s {
122 switch r {
123 case '"':
124 b.WriteString(`\"`)
125 case '\\':
126 b.WriteString(`\\`)
127 case '\n':
128 b.WriteString(`\n`)
129 case '\r':
130 b.WriteString(`\r`)
131 case '\t':
132 b.WriteString(`\t`)
133 default:
134 b.WriteString(string(r))
135 }
136 }
137 b.WriteString(`"`)
138 return b.String()
139}