Skip to content Search Apps Documentation Source Content File Folder Download Copy Actions State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

Community realm. Read the code first. Community realm, deployed by its author. Read the code before you interact or send coins.

buy.gno

1.52 Kb · 50 lines
 1package kourt
 2import (
 3	"chain"
 4	"chain/banker"
 5	"chain/runtime/unsafe"
 6)
 7const gnotDenom = "ugnot"
 8const burnSinkPath = "gno.land/r/g1ecsuj0q572jr0dhu29q9njtnmw03hyu7tyyvv6/kourt:burned"
 9func Buy(cur realm, slug string) int64 {
10	if !cur.IsCurrent() {
11		panic(errStaleRealm)
12	}
13	prev := cur.Previous()
14	if !prev.IsUserCall() {
15		panic("kourtv2: a buy must be a direct user call")
16	}
17	buyer := prev.Address()
18	c := mustCourt(slug)
19	if buyer == cur.Address() {
20		panic("kourtv2: the court's own address may not buy")
21	}
22	touch(c)
23	sent := unsafe.OriginSend().AmountOf(gnotDenom)
24	if sent <= 0 {
25		panic("kourtv2: send GNOT to buy the coin")
26	}
27	delta, spent := c.crv.Minted(c.minted, sent)
28	if delta <= 0 {
29		panic("kourtv2: payment too small to mint a coin")
30	}
31	c.minted += delta
32	recordPrice(c)
33	c.coin.Mint(buyer, delta)
34	reindexBurn(c, spent)
35	accrueFranchise(c, buyer, spent)
36	b := banker.NewBanker(banker.BankerTypeRealmSend, cur)
37	b.SendCoins(cur.Address(), chain.PackageAddress(burnSinkPath),
38		chain.Coins{chain.NewCoin(gnotDenom, spent)})
39	if r := sent - spent; r > 0 {
40		b.SendCoins(cur.Address(), buyer, chain.Coins{chain.NewCoin(gnotDenom, r)})
41	}
42	return delta
43}
44func CurvePosition(slug string) int64 { return mustCourt(slug).minted }
45func BurnSink() address { return chain.PackageAddress(burnSinkPath) }
46func BurnedGNOT() int64 {
47	b := banker.NewReadonlyBanker()
48	return b.GetCoins(chain.PackageAddress(burnSinkPath)).AmountOf(gnotDenom)
49}
50func CoinBalanceOf(slug string, who address) int64 { return mustCourt(slug).coin.BalanceOf(who) }