Search Apps Documentation Source Content File Folder Download Copy Actions Download State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

banker_grc20_filetest.gno

3.69 Kb · 137 lines
  1// PKGPATH: gno.land/r/treasury/main
  2
  3package main
  4
  5import (
  6	"chain"
  7	"strings"
  8
  9	"gno.land/p/demo/tokens/grc20"
 10	"gno.land/p/nt/seqid/v0"
 11	"gno.land/p/nt/treasury/v0"
 12)
 13
 14const amount = int64(1000)
 15
 16var nextTokenID seqid.ID
 17
 18func createToken(_ int, rlm realm, name string, toMint address) *grc20.Token {
 19	// Create the token.
 20	symbol := strings.ToUpper(name)
 21	token, ledger := grc20.NewToken(name, symbol, 0, nextTokenID.Next(), rlm)
 22
 23	// Mint the requested amount.
 24	ledger.Mint(toMint, amount)
 25
 26	return token
 27}
 28
 29func main(cur realm) {
 30	// Define addresses for the sender (owner) and destination.
 31	ownerAddr := chain.PackageAddress("gno.land/r/treasury/main")
 32	destAddr := chain.PackageAddress("gno.land/r/dest/main")
 33
 34	// Try to create a GRC20Banker using a nil lister.
 35	gbanker, err := treasury.NewGRC20BankerWithOwner(ownerAddr, nil)
 36	if err == nil {
 37		panic("expected error when creating GRC20Banker with nil lister")
 38	}
 39
 40	// Define a list of token and the associated lister.
 41	tokens := []*grc20.Token{
 42		createToken(0, cur, "TestToken0", ownerAddr),
 43		createToken(0, cur, "TestToken1", ownerAddr),
 44		createToken(0, cur, "TestToken2", ownerAddr),
 45	}
 46
 47	grc20Lister := func() map[string]*grc20.Token {
 48		tokensMap := make(map[string]*grc20.Token, len(tokens))
 49
 50		for _, token := range tokens {
 51			tokensMap[token.GetSymbol()] = token
 52		}
 53
 54		return tokensMap
 55	}
 56
 57	// Create a GRC20Banker.
 58	gbanker, err = treasury.NewGRC20BankerWithOwner(ownerAddr, grc20Lister)
 59	if err != nil {
 60		panic("failed to create GRC20Banker: " + err.Error())
 61	}
 62
 63	println("GRC20Banker ID:", gbanker.ID())
 64	println("GRC20Banker Address:", gbanker.Address())
 65
 66	// Check if the GRC20Banker address matches the owner address.
 67	if gbanker.Address() != ownerAddr.String() {
 68		panic("GRC20Banker address does not match current realm address")
 69	}
 70
 71	// Check the balances of the GRC20Banker.
 72	println("GRC20Banker Balances count:", len(gbanker.Balances()))
 73	for _, balance := range gbanker.Balances() {
 74		if balance.Amount != amount {
 75			panic("GRC20Banker balance does not match expected amount")
 76		}
 77	}
 78
 79	// Send a valid payment.
 80	token := tokens[len(tokens)-1]
 81	validPayment := treasury.NewGRC20Payment(
 82		token.GetSymbol(),
 83		100,
 84		destAddr,
 85	)
 86	err = gbanker.Send(0, cur, validPayment)
 87	println("Valid payment error:", err)
 88	if err != nil {
 89		panic("failed to send valid payment: " + err.Error())
 90	}
 91
 92	println("Owner balance:", token.BalanceOf(ownerAddr))
 93	println("Dest balance:", token.BalanceOf(destAddr))
 94
 95	// Send an unknown token payment.
 96	unknownPayment := treasury.NewGRC20Payment(
 97		"unknown",
 98		100,
 99		destAddr,
100	)
101	err = gbanker.Send(0, cur, unknownPayment)
102	println("Unknown token payment error:", err)
103	if err == nil {
104		panic("expected error for unknown token, but got none")
105	}
106
107	// Send an unsufficient funds payment.
108	unsufficientPayment := treasury.NewGRC20Payment(
109		tokens[0].GetSymbol(),
110		amount+1,
111		destAddr,
112	)
113	err = gbanker.Send(0, cur, unsufficientPayment)
114	println("Unsufficient funds payment error:", err)
115	if err == nil {
116		panic("expected error for insufficient funds, but got none")
117	}
118
119	// Send a payment with an invalid type.
120	invalidPaymentType := treasury.NewCoinsPayment(chain.Coins{}, destAddr)
121	err = gbanker.Send(0, cur, invalidPaymentType)
122	println("Invalid payment type error:", err)
123	if err == nil {
124		panic("expected error for invalid payment type, but got none")
125	}
126}
127
128// Output:
129// GRC20Banker ID: GRC20
130// GRC20Banker Address: g1ynsdz5zaxhn9gnqtr6t40m5k4fueeutq7xy224
131// GRC20Banker Balances count: 3
132// Valid payment error: undefined
133// Owner balance: 900
134// Dest balance: 100
135// Unknown token payment error: GRC20 token not found: unknown
136// Unsufficient funds payment error: insufficient balance
137// Invalid payment type error: invalid payment type