treasury_filetest.gno
3.94 Kb · 136 lines
1// PKGPATH: gno.land/r/treasury/main
2
3package main
4
5import (
6 "chain"
7 "chain/banker"
8 "strings"
9 "testing"
10
11 "gno.land/p/demo/tokens/grc20"
12 "gno.land/p/nt/treasury/v0"
13)
14
15func checkBalanceAndHistory(t *treasury.Treasury, bankerIDs []string) {
16 for _, bankerID := range bankerIDs {
17 balances, err := t.Balances(bankerID)
18 if err != nil {
19 panic("failed to get banker balances: " + err.Error())
20 }
21 println("Banker", bankerID, "Balance:", balances[0].Amount)
22
23 history, err := t.History(bankerID, 1, 10)
24 if err != nil {
25 panic("failed to get banker history: " + err.Error())
26 }
27 println("Banker", bankerID, "History count:", len(history))
28 }
29}
30
31func main() {
32 // Define addresses for the sender (owner) and destination.
33 ownerAddr := chain.PackageAddress("gno.land/r/treasury/main")
34 destAddr := chain.PackageAddress("gno.land/r/dest/main")
35
36 // Try to create a Treasury instance with no bankers.
37 _, err := treasury.New(nil)
38 if err != treasury.ErrNoBankerProvided {
39 panic("expected error when creating Treasury with no bankers")
40 }
41
42 // Define a token and the associated lister.
43 const amount = int64(1000)
44 token, ledger := grc20.NewToken("TestToken", "TEST", 0)
45 ledger.Mint(ownerAddr, amount)
46
47 grc20Lister := func() map[string]*grc20.Token {
48 return map[string]*grc20.Token{
49 "TEST": token,
50 }
51 }
52
53 // Try to create a Treasury instance with a duplicate banker.
54 var (
55 banker_ = banker.NewBanker(banker.BankerTypeRealmSend)
56 coinsBanker, _ = treasury.NewCoinsBanker(banker_)
57 grc20Banker, _ = treasury.NewGRC20Banker(grc20Lister)
58 grc20BankerDup, _ = treasury.NewGRC20Banker(grc20Lister)
59 )
60
61 _, err = treasury.New([]treasury.Banker{coinsBanker, grc20Banker, grc20BankerDup})
62 if !strings.Contains(err.Error(), treasury.ErrDuplicateBanker.Error()) {
63 panic("expected error when creating Treasury with duplicate banker")
64 }
65
66 // Create a Treasury instance with valid bankers.
67 bankers := []treasury.Banker{coinsBanker, grc20Banker}
68 t, err := treasury.New(bankers)
69 if err != nil {
70 panic("failed to create Treasury: " + err.Error())
71 }
72
73 // Test if the Treasury instance has the expected bankers.
74 println("Treasury banker IDs:", t.ListBankerIDs())
75
76 const unknownBankerID = "unknown-banker-id"
77
78 if t.HasBanker(unknownBankerID) {
79 panic("expected banker not to be found")
80 }
81
82 // Check if the addresses of the bankers matches the owner address.
83 for _, banker_ := range bankers {
84 addr, err := t.Address(banker_.ID())
85 if err != nil {
86 panic("failed to get banker address: " + err.Error())
87 }
88 println("Banker", banker_.ID(), "Address:", addr)
89 }
90
91 // Check if the balances and history of the bankers match the expected values.
92 testing.IssueCoins(ownerAddr, chain.NewCoins(chain.NewCoin("ugnot", amount)))
93 bankerIDs := []string{coinsBanker.ID(), grc20Banker.ID()}
94 checkBalanceAndHistory(t, bankerIDs)
95
96 // Send 3 valid payments using the CoinsBanker.
97 validCoinsPayment := treasury.NewCoinsPayment(
98 chain.NewCoins(chain.NewCoin("ugnot", 100)),
99 destAddr,
100 )
101 for i := 0; i < 3; i++ {
102 err = t.Send(validCoinsPayment)
103 if err != nil {
104 panic("failed to send valid Coins payment: " + err.Error())
105 }
106 }
107
108 // Send 3 valid payments using the GRC20Banker.
109 validGRC20Payment := treasury.NewGRC20Payment(
110 token.GetSymbol(),
111 100,
112 destAddr,
113 )
114 for i := 0; i < 3; i++ {
115 err = t.Send(validGRC20Payment)
116 if err != nil {
117 panic("failed to send valid GRC20 payment: " + err.Error())
118 }
119 }
120
121 // Check if the balances and history of the bankers match the expected values.
122 checkBalanceAndHistory(t, bankerIDs)
123}
124
125// Output:
126// Treasury banker IDs: slice[("Coins" string),("GRC20" string)]
127// Banker Coins Address: g1ynsdz5zaxhn9gnqtr6t40m5k4fueeutq7xy224
128// Banker GRC20 Address: g1ynsdz5zaxhn9gnqtr6t40m5k4fueeutq7xy224
129// Banker Coins Balance: 1000
130// Banker Coins History count: 0
131// Banker GRC20 Balance: 1000
132// Banker GRC20 History count: 0
133// Banker Coins Balance: 700
134// Banker Coins History count: 3
135// Banker GRC20 Balance: 700
136// Banker GRC20 History count: 3