Search Apps Documentation Source Content File Folder Download Copy Actions Download

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