github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/rpcclient/nep11/divisible_test.go (about) 1 package nep11 2 3 import ( 4 "errors" 5 "math/big" 6 "testing" 7 8 "github.com/google/uuid" 9 "github.com/nspcc-dev/neo-go/pkg/core/transaction" 10 "github.com/nspcc-dev/neo-go/pkg/neorpc/result" 11 "github.com/nspcc-dev/neo-go/pkg/util" 12 "github.com/nspcc-dev/neo-go/pkg/vm/stackitem" 13 "github.com/stretchr/testify/require" 14 ) 15 16 func TestDivisibleBalanceOf(t *testing.T) { 17 ta := new(testAct) 18 tr := NewDivisibleReader(ta, util.Uint160{1, 2, 3}) 19 tt := NewDivisible(ta, util.Uint160{1, 2, 3}) 20 21 for name, fun := range map[string]func(util.Uint160, []byte) (*big.Int, error){ 22 "Reader": tr.BalanceOfD, 23 "Full": tt.BalanceOfD, 24 } { 25 t.Run(name, func(t *testing.T) { 26 ta.err = errors.New("") 27 _, err := fun(util.Uint160{3, 2, 1}, []byte{1, 2, 3}) 28 require.Error(t, err) 29 30 ta.err = nil 31 ta.res = &result.Invoke{ 32 State: "HALT", 33 Stack: []stackitem.Item{ 34 stackitem.Make(100500), 35 }, 36 } 37 bal, err := fun(util.Uint160{3, 2, 1}, []byte{1, 2, 3}) 38 require.NoError(t, err) 39 require.Equal(t, big.NewInt(100500), bal) 40 41 ta.res = &result.Invoke{ 42 State: "HALT", 43 Stack: []stackitem.Item{ 44 stackitem.Make([]stackitem.Item{}), 45 }, 46 } 47 _, err = fun(util.Uint160{3, 2, 1}, []byte{1, 2, 3}) 48 require.Error(t, err) 49 }) 50 } 51 } 52 53 func TestDivisibleOwnerOfExpanded(t *testing.T) { 54 ta := new(testAct) 55 tr := NewDivisibleReader(ta, util.Uint160{1, 2, 3}) 56 tt := NewDivisible(ta, util.Uint160{1, 2, 3}) 57 58 for name, fun := range map[string]func([]byte, int) ([]util.Uint160, error){ 59 "Reader": tr.OwnerOfExpanded, 60 "Full": tt.OwnerOfExpanded, 61 } { 62 t.Run(name, func(t *testing.T) { 63 ta.err = errors.New("") 64 _, err := fun([]byte{1, 2, 3}, 1) 65 require.Error(t, err) 66 67 ta.err = nil 68 ta.res = &result.Invoke{ 69 State: "HALT", 70 Stack: []stackitem.Item{ 71 stackitem.Make(100500), 72 }, 73 } 74 _, err = fun([]byte{1, 2, 3}, 1) 75 require.Error(t, err) 76 77 h := util.Uint160{3, 2, 1} 78 ta.res = &result.Invoke{ 79 State: "HALT", 80 Stack: []stackitem.Item{ 81 stackitem.Make([]stackitem.Item{stackitem.Make(h.BytesBE())}), 82 }, 83 } 84 owls, err := fun([]byte{1, 2, 3}, 1) 85 require.NoError(t, err) 86 require.Equal(t, []util.Uint160{h}, owls) 87 }) 88 } 89 } 90 91 func TestDivisibleOwnerOf(t *testing.T) { 92 ta := new(testAct) 93 tr := NewDivisibleReader(ta, util.Uint160{1, 2, 3}) 94 tt := NewDivisible(ta, util.Uint160{1, 2, 3}) 95 96 for name, fun := range map[string]func([]byte) (*OwnerIterator, error){ 97 "Reader": tr.OwnerOf, 98 "Full": tt.OwnerOf, 99 } { 100 t.Run(name, func(t *testing.T) { 101 ta.err = errors.New("") 102 _, err := fun([]byte{1}) 103 require.Error(t, err) 104 105 iid := uuid.New() 106 ta.err = nil 107 ta.res = &result.Invoke{ 108 Session: uuid.New(), 109 State: "HALT", 110 Stack: []stackitem.Item{ 111 stackitem.NewInterop(result.Iterator{ 112 ID: &iid, 113 }), 114 }, 115 } 116 iter, err := fun([]byte{1}) 117 require.NoError(t, err) 118 119 ta.res = &result.Invoke{ 120 Stack: []stackitem.Item{ 121 stackitem.Make([]stackitem.Item{}), 122 }, 123 } 124 _, err = iter.Next(10) 125 require.Error(t, err) 126 127 ta.res = &result.Invoke{ 128 Stack: []stackitem.Item{ 129 stackitem.Make("not uint160"), 130 }, 131 } 132 _, err = iter.Next(10) 133 require.Error(t, err) 134 135 h1 := util.Uint160{1, 2, 3} 136 h2 := util.Uint160{3, 2, 1} 137 ta.res = &result.Invoke{ 138 Stack: []stackitem.Item{ 139 stackitem.Make(h1.BytesBE()), 140 stackitem.Make(h2.BytesBE()), 141 }, 142 } 143 vals, err := iter.Next(10) 144 require.NoError(t, err) 145 require.Equal(t, []util.Uint160{h1, h2}, vals) 146 147 ta.err = errors.New("") 148 _, err = iter.Next(1) 149 require.Error(t, err) 150 151 err = iter.Terminate() 152 require.Error(t, err) 153 154 // Value-based iterator. 155 ta.err = nil 156 ta.res = &result.Invoke{ 157 State: "HALT", 158 Stack: []stackitem.Item{ 159 stackitem.NewInterop(result.Iterator{ 160 Values: []stackitem.Item{ 161 stackitem.Make(h1.BytesBE()), 162 stackitem.Make(h2.BytesBE()), 163 }, 164 }), 165 }, 166 } 167 iter, err = fun([]byte{1}) 168 require.NoError(t, err) 169 170 ta.err = errors.New("") 171 err = iter.Terminate() 172 require.NoError(t, err) 173 }) 174 } 175 } 176 177 func TestDivisibleTransfer(t *testing.T) { 178 ta := new(testAct) 179 tok := NewDivisible(ta, util.Uint160{1, 2, 3}) 180 181 ta.err = errors.New("") 182 _, _, err := tok.TransferD(util.Uint160{1, 2, 3}, util.Uint160{3, 2, 1}, big.NewInt(10), []byte{3, 2, 1}, nil) 183 require.Error(t, err) 184 185 ta.err = nil 186 ta.txh = util.Uint256{1, 2, 3} 187 ta.vub = 42 188 h, vub, err := tok.TransferD(util.Uint160{1, 2, 3}, util.Uint160{3, 2, 1}, big.NewInt(10), []byte{3, 2, 1}, nil) 189 require.NoError(t, err) 190 require.Equal(t, ta.txh, h) 191 require.Equal(t, ta.vub, vub) 192 193 ta.err = nil 194 ta.txh = util.Uint256{1, 2, 3} 195 ta.vub = 42 196 h, vub, err = tok.TransferD(util.Uint160{1, 2, 3}, util.Uint160{3, 2, 1}, big.NewInt(10), []byte{3, 2, 1}, &tData{ 197 someInt: 5, 198 someString: "ur", 199 }) 200 require.NoError(t, err) 201 require.Equal(t, ta.txh, h) 202 require.Equal(t, ta.vub, vub) 203 204 _, _, err = tok.TransferD(util.Uint160{1, 2, 3}, util.Uint160{3, 2, 1}, big.NewInt(10), []byte{3, 2, 1}, stackitem.NewInterop(nil)) 205 require.Error(t, err) 206 } 207 208 func TestDivisibleTransferTransaction(t *testing.T) { 209 ta := new(testAct) 210 tok := NewDivisible(ta, util.Uint160{1, 2, 3}) 211 212 for _, fun := range []func(from util.Uint160, to util.Uint160, amount *big.Int, id []byte, data any) (*transaction.Transaction, error){ 213 tok.TransferDTransaction, 214 tok.TransferDUnsigned, 215 } { 216 ta.err = errors.New("") 217 _, err := fun(util.Uint160{1, 2, 3}, util.Uint160{3, 2, 1}, big.NewInt(10), []byte{3, 2, 1}, nil) 218 require.Error(t, err) 219 220 ta.err = nil 221 ta.tx = &transaction.Transaction{Nonce: 100500, ValidUntilBlock: 42} 222 tx, err := fun(util.Uint160{1, 2, 3}, util.Uint160{3, 2, 1}, big.NewInt(10), []byte{3, 2, 1}, nil) 223 require.NoError(t, err) 224 require.Equal(t, ta.tx, tx) 225 226 ta.err = nil 227 ta.tx = &transaction.Transaction{Nonce: 100500, ValidUntilBlock: 42} 228 tx, err = fun(util.Uint160{1, 2, 3}, util.Uint160{3, 2, 1}, big.NewInt(10), []byte{3, 2, 1}, &tData{ 229 someInt: 5, 230 someString: "ur", 231 }) 232 require.NoError(t, err) 233 require.Equal(t, ta.tx, tx) 234 235 _, err = fun(util.Uint160{1, 2, 3}, util.Uint160{3, 2, 1}, big.NewInt(10), []byte{3, 2, 1}, stackitem.NewInterop(nil)) 236 require.Error(t, err) 237 } 238 }