package grc20 import ( "testing" "gno.land/p/demo/testutils" "gno.land/p/demo/uassert" "gno.land/p/demo/ufmt" "gno.land/p/demo/urequire" ) func TestCallerTellerImpl(t *testing.T) { tok, _ := NewToken("Dummy", "DUMMY", 4) teller := tok.CallerTeller() urequire.False(t, tok == nil) var _ Teller = teller } func TestTeller(t *testing.T) { var ( alice = testutils.TestAddress("alice") bob = testutils.TestAddress("bob") carl = testutils.TestAddress("carl") ) token, ledger := NewToken("Dummy", "DUMMY", 6) checkBalances := func(aliceEB, bobEB, carlEB uint64) { t.Helper() exp := ufmt.Sprintf("alice=%d bob=%d carl=%d", aliceEB, bobEB, carlEB) aliceGB := token.BalanceOf(alice) bobGB := token.BalanceOf(bob) carlGB := token.BalanceOf(carl) got := ufmt.Sprintf("alice=%d bob=%d carl=%d", aliceGB, bobGB, carlGB) uassert.Equal(t, got, exp, "invalid balances") } checkAllowances := func(abEB, acEB, baEB, bcEB, caEB, cbEB uint64) { t.Helper() exp := ufmt.Sprintf("ab=%d ac=%d ba=%d bc=%d ca=%d cb=%s", abEB, acEB, baEB, bcEB, caEB, cbEB) abGB := token.Allowance(alice, bob) acGB := token.Allowance(alice, carl) baGB := token.Allowance(bob, alice) bcGB := token.Allowance(bob, carl) caGB := token.Allowance(carl, alice) cbGB := token.Allowance(carl, bob) got := ufmt.Sprintf("ab=%d ac=%d ba=%d bc=%d ca=%d cb=%s", abGB, acGB, baGB, bcGB, caGB, cbGB) uassert.Equal(t, got, exp, "invalid allowances") } checkBalances(0, 0, 0) checkAllowances(0, 0, 0, 0, 0, 0) urequire.NoError(t, ledger.Mint(alice, 1000)) urequire.NoError(t, ledger.Mint(alice, 100)) checkBalances(1100, 0, 0) checkAllowances(0, 0, 0, 0, 0, 0) urequire.NoError(t, ledger.Approve(alice, bob, 99999999)) checkBalances(1100, 0, 0) checkAllowances(99999999, 0, 0, 0, 0, 0) urequire.NoError(t, ledger.Approve(alice, bob, 400)) checkBalances(1100, 0, 0) checkAllowances(400, 0, 0, 0, 0, 0) urequire.Error(t, ledger.TransferFrom(alice, bob, carl, 100000000)) checkBalances(1100, 0, 0) checkAllowances(400, 0, 0, 0, 0, 0) urequire.NoError(t, ledger.TransferFrom(alice, bob, carl, 100)) checkBalances(1000, 0, 100) checkAllowances(300, 0, 0, 0, 0, 0) urequire.Error(t, ledger.SpendAllowance(alice, bob, 2000000)) checkBalances(1000, 0, 100) checkAllowances(300, 0, 0, 0, 0, 0) urequire.NoError(t, ledger.SpendAllowance(alice, bob, 100)) checkBalances(1000, 0, 100) checkAllowances(200, 0, 0, 0, 0, 0) } func TestCallerTeller(t *testing.T) { alice := testutils.TestAddress("alice") bob := testutils.TestAddress("bob") carl := testutils.TestAddress("carl") token, ledger := NewToken("Dummy", "DUMMY", 6) teller := token.CallerTeller() checkBalances := func(aliceEB, bobEB, carlEB uint64) { t.Helper() exp := ufmt.Sprintf("alice=%d bob=%d carl=%d", aliceEB, bobEB, carlEB) aliceGB := token.BalanceOf(alice) bobGB := token.BalanceOf(bob) carlGB := token.BalanceOf(carl) got := ufmt.Sprintf("alice=%d bob=%d carl=%d", aliceGB, bobGB, carlGB) uassert.Equal(t, got, exp, "invalid balances") } checkAllowances := func(abEB, acEB, baEB, bcEB, caEB, cbEB uint64) { t.Helper() exp := ufmt.Sprintf("ab=%d ac=%d ba=%d bc=%d ca=%d cb=%s", abEB, acEB, baEB, bcEB, caEB, cbEB) abGB := token.Allowance(alice, bob) acGB := token.Allowance(alice, carl) baGB := token.Allowance(bob, alice) bcGB := token.Allowance(bob, carl) caGB := token.Allowance(carl, alice) cbGB := token.Allowance(carl, bob) got := ufmt.Sprintf("ab=%d ac=%d ba=%d bc=%d ca=%d cb=%s", abGB, acGB, baGB, bcGB, caGB, cbGB) uassert.Equal(t, got, exp, "invalid allowances") } urequire.NoError(t, ledger.Mint(alice, 1000)) checkBalances(1000, 0, 0) checkAllowances(0, 0, 0, 0, 0, 0) testing.SetOriginCaller(alice) urequire.NoError(t, teller.Approve(bob, 600)) checkBalances(1000, 0, 0) checkAllowances(600, 0, 0, 0, 0, 0) testing.SetOriginCaller(bob) urequire.Error(t, teller.TransferFrom(alice, carl, 700)) checkBalances(1000, 0, 0) checkAllowances(600, 0, 0, 0, 0, 0) urequire.NoError(t, teller.TransferFrom(alice, carl, 400)) checkBalances(600, 0, 400) checkAllowances(200, 0, 0, 0, 0, 0) }