1// based on Wikipedia's Solidity example: https://en.wikipedia.org/wiki/Solidity2package wikicoin34import (5 "chain/runtime/unsafe"67 "gno.land/p/nt/avl/v0"8 "gno.land/p/nt/ufmt/v0"9)1011var balances = avl.NewTree() // addr -> balance12var minter address1314// Constructor code is only run when the contract is created15func init() {16 minter = unsafe.OriginCaller()17}1819func Mint(cur realm, receiver address, amount uint) {20 if unsafe.OriginCaller() != minter {21 panic("restricted")22 }23 curBalance := BalanceOf(receiver)24 newBalance := curBalance + amount25 balances.Set(receiver.String(), newBalance)26}2728func Send(cur realm, receiver address, amount uint) {29 sender := unsafe.OriginCaller()30 senderBalance := BalanceOf(sender)31 if amount > senderBalance {32 panic(ufmt.Sprintf("insufficient balance: %d", senderBalance))33 }34 receiverBalance := BalanceOf(receiver)35 balances.Set(sender.String(), senderBalance-amount)36 balances.Set(receiver.String(), receiverBalance+amount)37}3839func BalanceOf(addr address) uint {40 balance := balances.Get(addr.String())41 if balance == nil {42 return 043 }44 return balance.(uint)45}46BalanceOf(addr string) uint
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}, receiver string, amount uint)
Send(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}, receiver string, amount uint)
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.