1package abt_test23import (4 "chain"5 "chain/runtime"6 "testing"78 "gno.land/p/nt/testutils/v0"9 "gno.land/p/nt/uassert/v0"10 "gno.land/r/akkadia/beta/abt"11 "gno.land/r/akkadia/beta/admin"12)1314func TestExternalWrapperLifecycle(cur realm, t *testing.T) {15 caller := testutils.TestAddress("abtExternalAdmin")16 owner := testutils.TestAddress("abtExternalOwner")17 other := testutils.TestAddress("abtExternalOther")18 testing.SetOriginCaller(admin.GetAdmin())19 testing.SetRealm(testing.NewUserRealm(admin.GetAdmin()))20 admin.TransferAdmin(cross(cur), caller)21 testing.SetOriginCaller(caller)22 testing.SetRealm(testing.NewUserRealm(caller))23 admin.AcceptAdmin(cross(cur))24 testing.SetOriginSend(chain.Coins{})25 testing.SetRealm(runtime.NewRealm(caller, "gno.land/e/"+caller.String()+"/run"))26 abt.SetFrozen(cross(cur), true)27 supplyBefore := abt.TotalSupply()28 abt.Mint(cross(cur), owner, 20)29 uassert.Equal(t, "Akkadia Beta Token", abt.GetName())30 uassert.Equal(t, "abt", abt.GetSymbol())31 uassert.Equal(t, 6, abt.GetDecimals())32 uassert.Equal(t, supplyBefore+20, abt.TotalSupply())33 uassert.True(t, abt.IsFrozen())34 abt.SetFrozen(cross(cur), false)35 testing.SetOriginCaller(owner)36 testing.SetRealm(testing.NewUserRealm(owner))37 abt.Transfer(cross(cur), other, 2)38 abt.Approve(cross(cur), other, 5)39 testing.SetOriginCaller(other)40 testing.SetRealm(testing.NewUserRealm(other))41 abt.TransferFrom(cross(cur), owner, other, 3)42 uassert.Equal(t, int64(15), abt.BalanceOf(owner))43 uassert.Equal(t, int64(5), abt.BalanceOf(other))44 uassert.Equal(t, int64(2), abt.Allowance(owner, other))45 uassert.Equal(t, "15", abt.Render("balance/"+owner.String()))46 // A later failing transfer must preserve allowance even if its abort is caught.47 uassert.AbortsWithMessage(t, cur, "abt transfer failed: cannot send transfer to self", func() {48 abt.TransferFrom(cross(cur), owner, owner, 1)49 })50 uassert.Equal(t, int64(2), abt.Allowance(owner, other))51 testing.SetOriginCaller(caller)52 testing.SetRealm(testing.NewUserRealm(caller))53 abt.SetFrozen(cross(cur), true)54 testing.SetOriginCaller(other)55 testing.SetRealm(testing.NewUserRealm(other))56 uassert.AbortsWithMessage(t, cur, "abt is frozen", func() { abt.TransferFrom(cross(cur), owner, other, 2) })57 uassert.Equal(t, int64(2), abt.Allowance(owner, other))58 uassert.Equal(t, supplyBefore+20, abt.TotalSupply())59}60Allowance(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.