github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/rpcclient/nep17/nep17_test.go (about) 1 package nep17 2 3 import ( 4 "errors" 5 "math/big" 6 "testing" 7 8 "github.com/nspcc-dev/neo-go/pkg/core/transaction" 9 "github.com/nspcc-dev/neo-go/pkg/neorpc/result" 10 "github.com/nspcc-dev/neo-go/pkg/util" 11 "github.com/nspcc-dev/neo-go/pkg/vm/stackitem" 12 "github.com/stretchr/testify/require" 13 ) 14 15 type testAct struct { 16 err error 17 res *result.Invoke 18 tx *transaction.Transaction 19 txh util.Uint256 20 vub uint32 21 } 22 23 func (t *testAct) Call(contract util.Uint160, operation string, params ...any) (*result.Invoke, error) { 24 return t.res, t.err 25 } 26 func (t *testAct) MakeRun(script []byte) (*transaction.Transaction, error) { 27 return t.tx, t.err 28 } 29 func (t *testAct) MakeUnsignedRun(script []byte, attrs []transaction.Attribute) (*transaction.Transaction, error) { 30 return t.tx, t.err 31 } 32 func (t *testAct) SendRun(script []byte) (util.Uint256, uint32, error) { 33 return t.txh, t.vub, t.err 34 } 35 36 func TestReaderBalanceOf(t *testing.T) { 37 ta := new(testAct) 38 tr := NewReader(ta, util.Uint160{1, 2, 3}) 39 40 ta.err = errors.New("") 41 _, err := tr.BalanceOf(util.Uint160{3, 2, 1}) 42 require.Error(t, err) 43 44 ta.err = nil 45 ta.res = &result.Invoke{ 46 State: "HALT", 47 Stack: []stackitem.Item{ 48 stackitem.Make(100500), 49 }, 50 } 51 bal, err := tr.BalanceOf(util.Uint160{3, 2, 1}) 52 require.NoError(t, err) 53 require.Equal(t, big.NewInt(100500), bal) 54 55 ta.res = &result.Invoke{ 56 State: "HALT", 57 Stack: []stackitem.Item{ 58 stackitem.Make([]stackitem.Item{}), 59 }, 60 } 61 _, err = tr.BalanceOf(util.Uint160{3, 2, 1}) 62 require.Error(t, err) 63 } 64 65 type tData struct { 66 someInt int 67 someString string 68 } 69 70 func (d *tData) ToStackItem() (stackitem.Item, error) { 71 return stackitem.NewStruct([]stackitem.Item{ 72 stackitem.Make(d.someInt), 73 stackitem.Make(d.someString), 74 }), nil 75 } 76 77 func (d *tData) FromStackItem(si stackitem.Item) error { 78 panic("TODO") 79 } 80 81 func TestTokenTransfer(t *testing.T) { 82 ta := new(testAct) 83 tok := New(ta, util.Uint160{1, 2, 3}) 84 85 for name, fun := range map[string]func(from util.Uint160, to util.Uint160, amount *big.Int, data any) (util.Uint256, uint32, error){ 86 "Tranfer": tok.Transfer, 87 "MultiTransfer": func(from util.Uint160, to util.Uint160, amount *big.Int, data any) (util.Uint256, uint32, error) { 88 return tok.MultiTransfer([]TransferParameters{{from, to, amount, data}, {from, to, amount, data}}) 89 }, 90 } { 91 t.Run(name, func(t *testing.T) { 92 ta.err = errors.New("") 93 _, _, err := fun(util.Uint160{3, 2, 1}, util.Uint160{3, 2, 1}, big.NewInt(1), nil) 94 require.Error(t, err) 95 96 ta.err = nil 97 ta.txh = util.Uint256{1, 2, 3} 98 ta.vub = 42 99 h, vub, err := fun(util.Uint160{3, 2, 1}, util.Uint160{3, 2, 1}, big.NewInt(1), nil) 100 require.NoError(t, err) 101 require.Equal(t, ta.txh, h) 102 require.Equal(t, ta.vub, vub) 103 104 ta.err = nil 105 ta.txh = util.Uint256{1, 2, 3} 106 ta.vub = 42 107 h, vub, err = fun(util.Uint160{3, 2, 1}, util.Uint160{3, 2, 1}, big.NewInt(1), &tData{ 108 someInt: 5, 109 someString: "ur", 110 }) 111 require.NoError(t, err) 112 require.Equal(t, ta.txh, h) 113 require.Equal(t, ta.vub, vub) 114 115 _, _, err = fun(util.Uint160{3, 2, 1}, util.Uint160{3, 2, 1}, big.NewInt(1), stackitem.NewInterop(nil)) 116 require.Error(t, err) 117 }) 118 } 119 _, _, err := tok.MultiTransfer(nil) 120 require.Error(t, err) 121 _, _, err = tok.MultiTransfer([]TransferParameters{}) 122 require.Error(t, err) 123 } 124 125 func TestTokenTransferTransaction(t *testing.T) { 126 ta := new(testAct) 127 tok := New(ta, util.Uint160{1, 2, 3}) 128 129 for name, fun := range map[string]func(from util.Uint160, to util.Uint160, amount *big.Int, data any) (*transaction.Transaction, error){ 130 "TransferTransaction": tok.TransferTransaction, 131 "TransferUnsigned": tok.TransferUnsigned, 132 "MultiTransferTransaction": func(from util.Uint160, to util.Uint160, amount *big.Int, data any) (*transaction.Transaction, error) { 133 return tok.MultiTransferTransaction([]TransferParameters{{from, to, amount, data}, {from, to, amount, data}}) 134 }, 135 "MultiTransferUnsigned": func(from util.Uint160, to util.Uint160, amount *big.Int, data any) (*transaction.Transaction, error) { 136 return tok.MultiTransferUnsigned([]TransferParameters{{from, to, amount, data}, {from, to, amount, data}}) 137 }, 138 } { 139 t.Run(name, func(t *testing.T) { 140 ta.err = errors.New("") 141 _, err := fun(util.Uint160{3, 2, 1}, util.Uint160{3, 2, 1}, big.NewInt(1), nil) 142 require.Error(t, err) 143 144 ta.err = nil 145 ta.tx = &transaction.Transaction{Nonce: 100500, ValidUntilBlock: 42} 146 tx, err := fun(util.Uint160{3, 2, 1}, util.Uint160{3, 2, 1}, big.NewInt(1), nil) 147 require.NoError(t, err) 148 require.Equal(t, ta.tx, tx) 149 150 ta.err = nil 151 ta.tx = &transaction.Transaction{Nonce: 100500, ValidUntilBlock: 42} 152 tx, err = fun(util.Uint160{3, 2, 1}, util.Uint160{3, 2, 1}, big.NewInt(1), &tData{ 153 someInt: 5, 154 someString: "ur", 155 }) 156 require.NoError(t, err) 157 require.Equal(t, ta.tx, tx) 158 159 _, err = fun(util.Uint160{3, 2, 1}, util.Uint160{3, 2, 1}, big.NewInt(1), stackitem.NewInterop(nil)) 160 require.Error(t, err) 161 }) 162 } 163 _, err := tok.MultiTransferTransaction(nil) 164 require.Error(t, err) 165 _, err = tok.MultiTransferTransaction([]TransferParameters{}) 166 require.Error(t, err) 167 _, err = tok.MultiTransferUnsigned(nil) 168 require.Error(t, err) 169 _, err = tok.MultiTransferUnsigned([]TransferParameters{}) 170 require.Error(t, err) 171 }