Search Apps Documentation Source Content File Folder Download Copy Actions Download

views.gno

3.31 Kb · 139 lines
  1package gnogle_market2
  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_market2").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}