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

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) }