banker_grc20_filetest.gno

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