← Back to Realms

Realm

Gno.land Mainnet

gno.land/r/akkadia/beta/abt

Overview

Network
gnoland-1
Realm Path
gno.land/r/akkadia/beta/abt
Exported Functions
13
State Entries
4
Source Files
10
Total Package Entries
20

Exported Functions

13 exported functions

State

4 state entries

Source Code

FILES
abt.gno
go
1package abt
2
3import (
4	"chain"
5	"chain/runtime/unsafe"
6	"strconv"
7
8	"gno.land/p/akkadia/beta/accesscontrol"
9	"gno.land/p/nt/grc20/v0"
10	"gno.land/r/akkadia/beta/admin"
11)
12
13const FrozenChangedEvent = "FrozenChanged"
14
15var (
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
22func 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.
27func 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.
42func 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
57func 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.
65func 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
72func 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
84func IsFrozen() bool                         { return frozen }
85func GetName() string                        { return token.GetName() }
86func GetSymbol() string                      { return token.GetSymbol() }
87func GetDecimals() int                       { return token.GetDecimals() }
88func TotalSupply() int64                     { return token.TotalSupply() }
89func BalanceOf(owner address) int64          { return token.BalanceOf(owner) }
90func Allowance(owner, spender address) int64 { return token.Allowance(owner, spender) }
91
92func assertCanTransfer(_ int, rlm realm) {
93	accesscontrol.AssertCurrentRealm(0, rlm)
94	assertNoCoins(0, rlm)
95	if frozen {
96		panic("abt is frozen")
97	}
98}
99
100func 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

Raw Package Data

Raw JSON data