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