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