Kind Realm (renderable)
Name abt
Namespace akkadia / beta
Exported functions 13
Module gno.land/r/akkadia/beta/abt
gno 0.9 This realm implements a recognized token. abt → abt.gno gno
⧉
1 package abt 2 3 import ( 4 "chain" 5 "chain/runtime/unsafe" 6 "strconv" 7 8 Allowance (owner string, spender string) int64
Approve (cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, spender string, amount int64)
BalanceOf (owner string) int64
GetDecimals () int
GetName () string
GetSymbol () string
IsFrozen () bool
Mint (cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, to string, amount int64)
Render (path string) string
SetFrozen (cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, value bool)
TotalSupply () int64
Transfer (cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, to string, amount int64)
TransferFrom (cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, from string, to string, amount int64)
Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.
vm/qrender output, sanitized (docs/render-security.md) and displayed in an empty-sandbox iframe — scripts, forms and popups cannot run. Links stay inert in-preview; right-click to open.
"gno.land/p/akkadia/beta/accesscontrol"
9 "gno.land/p/nt/grc20/v0"
10 "gno.land/r/akkadia/beta/admin"
11 )
12
13 const FrozenChangedEvent = "FrozenChanged"
14
15 var (
16 // Even a Token can create mutable tellers; keep all capabilities private.
17 token *grc20.Token
18 ledger *grc20.PrivateLedger
19 frozen = true
20 )
21
22 func init(cur realm) {
23 token, ledger = grc20.NewToken( "Akkadia Beta Token" , "abt" , 6 , 0 , cur)
24 }
25
26 // Mint remains available while frozen. Each successful call issues new tokens.
27 func Mint(cur realm, to address, amount int64 ) {
28 accesscontrol.MustGetAdminOrOperatorCaller( 0 , cur, admin.IsAdmin, admin.IsOperator)
29 assertNoCoins( 0 , cur)
30 if !to.IsValid() {
31 panic( "invalid abt recipient" )
32 }
33 if amount <= 0 {
34 panic( "abt amount must be positive" )
35 }
36 if err := ledger.Mint(to, amount); err != nil {
37 panic( "abt mint failed: " + err.Error())
38 }
39 }
40
41 // SetFrozen preserves existing allowances, which become usable after unfreezing.
42 func SetFrozen(cur realm, value bool ) {
43 caller := accesscontrol.MustGetAdminCaller( 0 , cur, admin.IsAdmin)
44 assertNoCoins( 0 , cur)
45 if frozen == value {
46 return
47 }
48 previous := frozen
49 frozen = value
50 chain.Emit(FrozenChangedEvent,
51 "executor" , caller.String(),
52 "previous" , strconv.FormatBool(previous),
53 "frozen" , strconv.FormatBool(frozen),
54 )
55 }
56
57 func Transfer(cur realm, to address, amount int64 ) {
58 assertCanTransfer( 0 , cur)
59 if err := ledger.CallerTeller().Transfer( 0 , cur, to, amount); err != nil {
60 panic( "abt transfer failed: " + err.Error())
61 }
62 }
63
64 // Approve also rejects allowance revocation while frozen.
65 func Approve(cur realm, spender address, amount int64 ) {
66 assertCanTransfer( 0 , cur)
67 if err := ledger.CallerTeller().Approve( 0 , cur, spender, amount); err != nil {
68 panic( "abt approval failed: " + err.Error())
69 }
70 }
71
72 func TransferFrom(cur realm, from, to address, amount int64 ) {
73 assertCanTransfer( 0 , cur)
74 // The library spends allowance before rejecting self-transfers. Reject
75 // here so even a caller that revives the abort cannot consume allowance.
76 if from == to {
77 panic( "abt transfer failed: cannot send transfer to self" )
78 }
79 if err := ledger.CallerTeller().TransferFrom( 0 , cur, from, to, amount); err != nil {
80 panic( "abt transfer failed: " + err.Error())
81 }
82 }
83
84 func IsFrozen() bool { return frozen }
85 func GetName() string { return token.GetName() }
86 func GetSymbol() string { return token.GetSymbol() }
87 func GetDecimals() int { return token.GetDecimals() }
88 func TotalSupply() int64 { return token.TotalSupply() }
89 func BalanceOf(owner address) int64 { return token.BalanceOf(owner) }
90 func Allowance(owner, spender address) int64 { return token.Allowance(owner, spender) }
91
92 func assertCanTransfer(_ int , rlm realm) {
93 accesscontrol.AssertCurrentRealm( 0 , rlm)
94 assertNoCoins( 0 , rlm)
95 if frozen {
96 panic( "abt is frozen" )
97 }
98 }
99
100 func assertNoCoins(_ int , rlm realm) {
101 // OriginSend belongs to the origin call, not a subsequent realm relay.
102 if rlm.Previous().IsUser() && len(unsafe.OriginSend()) != 0 {
103 panic( "attached coins not allowed" )
104 }
105 }
106