1package tokens23import (4 "strconv"5 "strings"67 "gno.land/p/samcrew/launchpad/meta/v1"8 sm "gno.land/p/samcrew/launchpad/safemath/v1"9)1011// int64 amounts and versions are decimal strings so JSON clients cannot round12// a valid value above JavaScript's exact integer range.13func infoJSON(e *entry) string {14 i := e.info15 return "{" +16 `"id":` + meta.JSONString(i.ID) +17 `,"registryKey":` + meta.JSONString(i.RegistryKey) +18 `,"grc20Id":` + meta.JSONString(i.GRC20ID) +19 `,"issuer":` + meta.JSONString(i.Issuer.String()) +20 `,"creator":` + meta.JSONString(i.Creator.String()) +21 `,"mode":` + meta.JSONString(i.Mode) +22 `,"name":` + meta.JSONString(i.Name) +23 `,"ticker":` + meta.JSONString(i.Ticker) +24 `,"decimals":` + strconv.Itoa(i.Decimals) +25 `,"initialSupply":` + meta.JSONString(strconv.FormatInt(i.InitialSupply, 10)) +26 `,"maxSupply":` + meta.JSONString(strconv.FormatInt(i.MaxSupply, 10)) +27 `,"totalSupply":` + meta.JSONString(strconv.FormatInt(e.token.TotalSupply(), 10)) +28 `,"configVersion":` + meta.JSONString(strconv.FormatInt(i.ConfigVersion, 10)) +29 `,"currencyKey":` + meta.JSONString(i.CurrencyKey) +30 `,"description":` + meta.JSONString(i.Metadata.Description) +31 `,"image":` + meta.JSONString(i.Metadata.Image) +32 `,"website":` + meta.JSONString(i.Metadata.Website) +33 `,"xHandle":` + meta.JSONString(i.Metadata.XHandle) +34 `,"telegram":` + meta.JSONString(i.Metadata.Telegram) +35 `,"metadataFrozen":` + strconv.FormatBool(i.MetadataFrozen) +36 `,"mintAuthority":` + meta.JSONString(i.MintAuthority.String()) +37 `,"pendingMintAuthority":` + meta.JSONString(i.PendingMintAuth.String()) +38 `,"mintRenounced":` + strconv.FormatBool(i.MintRenounced) + "}"39}4041func TokenJSON(id string) string { return infoJSON(mustEntry(id)) }4243// ListTokensJSON returns a zero-based page; page size is strictly 1..100.44func ListTokensJSON(page, size int64) string {45 if page < 0 || size < 1 || size > 100 {46 panic("launchpad/tokens: invalid page")47 }48 offset := sm.Mul(page, size)49 if offset >= Count() {50 return "[]"51 }52 end := offset + size53 if end > Count() {54 end = Count()55 }56 var b strings.Builder57 b.WriteByte('[')58 for i := offset; i < end; i++ {59 if i > offset {60 b.WriteByte(',')61 }62 // Entry i of the list is the token created (i+1)th.63 b.WriteString(infoJSON(mustEntry("T" + strconv.FormatInt(i+1, 10))))64 }65 b.WriteByte(']')66 return b.String()67}68AcceptMintAuthority(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}, id string)
Allowance(id string, 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}, id string, spender string, amount int64)
BalanceOf(id string, owner string) int64
Burn(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}, id string, amount int64)
CancelMintAuthority(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}, id string)
Count() int64
Create(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}, creator string, mode string, name string, ticker string, decimals int, initialSupply int64, maxSupply int64, currencyKey string, expectedVersion int64, description string, image string, website string, xHandle string, telegram string) string
FreezeMetadata(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}, id string)
GetInfo(id string) struct{ID string; RegistryKey string; GRC20ID string; Issuer .uverse.address; Creator .uverse.address; Mode string; Name string; Ticker string; Decimals int; InitialSupply int64; MaxSupply int64; ConfigVersion int64; CurrencyKey string; Metadata gno.land/r/samcrew/launchpad/tokens/v1.Metadata; MetadataFrozen bool; MintAuthority .uverse.address; PendingMintAuth .uverse.address; MintRenounced bool}
ListTokensJSON(page int64, size int64) string
MintCapped(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}, id string, authority string, amount int64)
ProposeMintAuthority(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}, id string, next string)
RegistryKeyOf(id string) string
Render(path string) string
RenounceMintAuthority(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}, id string)
SetMetadata(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}, id string, description string, image string, website string, xHandle string, telegram string)
TokenJSON(id string) string
TotalSupply(id string) 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}, id 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}, id 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.