github.com/guiltylotus/go-ethereum@v1.9.7/accounts/abi/pack_test.go (about) 1 // Copyright 2017 The go-ethereum Authors 2 // This file is part of the go-ethereum library. 3 // 4 // The go-ethereum library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // The go-ethereum library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. 16 17 package abi 18 19 import ( 20 "bytes" 21 "math" 22 "math/big" 23 "reflect" 24 "strings" 25 "testing" 26 27 "github.com/ethereum/go-ethereum/common" 28 ) 29 30 func TestPack(t *testing.T) { 31 for i, test := range []struct { 32 typ string 33 components []ArgumentMarshaling 34 input interface{} 35 output []byte 36 }{ 37 { 38 "uint8", 39 nil, 40 uint8(2), 41 common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"), 42 }, 43 { 44 "uint8[]", 45 nil, 46 []uint8{1, 2}, 47 common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"), 48 }, 49 { 50 "uint16", 51 nil, 52 uint16(2), 53 common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"), 54 }, 55 { 56 "uint16[]", 57 nil, 58 []uint16{1, 2}, 59 common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"), 60 }, 61 { 62 "uint32", 63 nil, 64 uint32(2), 65 common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"), 66 }, 67 { 68 "uint32[]", 69 nil, 70 []uint32{1, 2}, 71 common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"), 72 }, 73 { 74 "uint64", 75 nil, 76 uint64(2), 77 common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"), 78 }, 79 { 80 "uint64[]", 81 nil, 82 []uint64{1, 2}, 83 common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"), 84 }, 85 { 86 "uint256", 87 nil, 88 big.NewInt(2), 89 common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"), 90 }, 91 { 92 "uint256[]", 93 nil, 94 []*big.Int{big.NewInt(1), big.NewInt(2)}, 95 common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"), 96 }, 97 { 98 "int8", 99 nil, 100 int8(2), 101 common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"), 102 }, 103 { 104 "int8[]", 105 nil, 106 []int8{1, 2}, 107 common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"), 108 }, 109 { 110 "int16", 111 nil, 112 int16(2), 113 common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"), 114 }, 115 { 116 "int16[]", 117 nil, 118 []int16{1, 2}, 119 common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"), 120 }, 121 { 122 "int32", 123 nil, 124 int32(2), 125 common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"), 126 }, 127 { 128 "int32[]", 129 nil, 130 []int32{1, 2}, 131 common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"), 132 }, 133 { 134 "int64", 135 nil, 136 int64(2), 137 common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"), 138 }, 139 { 140 "int64[]", 141 nil, 142 []int64{1, 2}, 143 common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"), 144 }, 145 { 146 "int256", 147 nil, 148 big.NewInt(2), 149 common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"), 150 }, 151 { 152 "int256[]", 153 nil, 154 []*big.Int{big.NewInt(1), big.NewInt(2)}, 155 common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"), 156 }, 157 { 158 "bytes1", 159 nil, 160 [1]byte{1}, 161 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 162 }, 163 { 164 "bytes2", 165 nil, 166 [2]byte{1}, 167 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 168 }, 169 { 170 "bytes3", 171 nil, 172 [3]byte{1}, 173 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 174 }, 175 { 176 "bytes4", 177 nil, 178 [4]byte{1}, 179 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 180 }, 181 { 182 "bytes5", 183 nil, 184 [5]byte{1}, 185 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 186 }, 187 { 188 "bytes6", 189 nil, 190 [6]byte{1}, 191 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 192 }, 193 { 194 "bytes7", 195 nil, 196 [7]byte{1}, 197 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 198 }, 199 { 200 "bytes8", 201 nil, 202 [8]byte{1}, 203 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 204 }, 205 { 206 "bytes9", 207 nil, 208 [9]byte{1}, 209 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 210 }, 211 { 212 "bytes10", 213 nil, 214 [10]byte{1}, 215 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 216 }, 217 { 218 "bytes11", 219 nil, 220 [11]byte{1}, 221 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 222 }, 223 { 224 "bytes12", 225 nil, 226 [12]byte{1}, 227 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 228 }, 229 { 230 "bytes13", 231 nil, 232 [13]byte{1}, 233 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 234 }, 235 { 236 "bytes14", 237 nil, 238 [14]byte{1}, 239 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 240 }, 241 { 242 "bytes15", 243 nil, 244 [15]byte{1}, 245 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 246 }, 247 { 248 "bytes16", 249 nil, 250 [16]byte{1}, 251 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 252 }, 253 { 254 "bytes17", 255 nil, 256 [17]byte{1}, 257 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 258 }, 259 { 260 "bytes18", 261 nil, 262 [18]byte{1}, 263 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 264 }, 265 { 266 "bytes19", 267 nil, 268 [19]byte{1}, 269 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 270 }, 271 { 272 "bytes20", 273 nil, 274 [20]byte{1}, 275 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 276 }, 277 { 278 "bytes21", 279 nil, 280 [21]byte{1}, 281 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 282 }, 283 { 284 "bytes22", 285 nil, 286 [22]byte{1}, 287 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 288 }, 289 { 290 "bytes23", 291 nil, 292 [23]byte{1}, 293 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 294 }, 295 { 296 "bytes24", 297 nil, 298 [24]byte{1}, 299 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 300 }, 301 { 302 "bytes25", 303 nil, 304 [25]byte{1}, 305 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 306 }, 307 { 308 "bytes26", 309 nil, 310 [26]byte{1}, 311 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 312 }, 313 { 314 "bytes27", 315 nil, 316 [27]byte{1}, 317 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 318 }, 319 { 320 "bytes28", 321 nil, 322 [28]byte{1}, 323 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 324 }, 325 { 326 "bytes29", 327 nil, 328 [29]byte{1}, 329 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 330 }, 331 { 332 "bytes30", 333 nil, 334 [30]byte{1}, 335 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 336 }, 337 { 338 "bytes31", 339 nil, 340 [31]byte{1}, 341 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 342 }, 343 { 344 "bytes32", 345 nil, 346 [32]byte{1}, 347 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 348 }, 349 { 350 "uint32[2][3][4]", 351 nil, 352 [4][3][2]uint32{{{1, 2}, {3, 4}, {5, 6}}, {{7, 8}, {9, 10}, {11, 12}}, {{13, 14}, {15, 16}, {17, 18}}, {{19, 20}, {21, 22}, {23, 24}}}, 353 common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000015000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000018"), 354 }, 355 { 356 "address[]", 357 nil, 358 []common.Address{{1}, {2}}, 359 common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000"), 360 }, 361 { 362 "bytes32[]", 363 nil, 364 []common.Hash{{1}, {2}}, 365 common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000201000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000"), 366 }, 367 { 368 "function", 369 nil, 370 [24]byte{1}, 371 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), 372 }, 373 { 374 "string", 375 nil, 376 "foobar", 377 common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000006666f6f6261720000000000000000000000000000000000000000000000000000"), 378 }, 379 { 380 "string[]", 381 nil, 382 []string{"hello", "foobar"}, 383 common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002" + // len(array) = 2 384 "0000000000000000000000000000000000000000000000000000000000000040" + // offset 64 to i = 0 385 "0000000000000000000000000000000000000000000000000000000000000080" + // offset 128 to i = 1 386 "0000000000000000000000000000000000000000000000000000000000000005" + // len(str[0]) = 5 387 "68656c6c6f000000000000000000000000000000000000000000000000000000" + // str[0] 388 "0000000000000000000000000000000000000000000000000000000000000006" + // len(str[1]) = 6 389 "666f6f6261720000000000000000000000000000000000000000000000000000"), // str[1] 390 }, 391 { 392 "string[2]", 393 nil, 394 []string{"hello", "foobar"}, 395 common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040" + // offset to i = 0 396 "0000000000000000000000000000000000000000000000000000000000000080" + // offset to i = 1 397 "0000000000000000000000000000000000000000000000000000000000000005" + // len(str[0]) = 5 398 "68656c6c6f000000000000000000000000000000000000000000000000000000" + // str[0] 399 "0000000000000000000000000000000000000000000000000000000000000006" + // len(str[1]) = 6 400 "666f6f6261720000000000000000000000000000000000000000000000000000"), // str[1] 401 }, 402 { 403 "bytes32[][]", 404 nil, 405 [][]common.Hash{{{1}, {2}}, {{3}, {4}, {5}}}, 406 common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002" + // len(array) = 2 407 "0000000000000000000000000000000000000000000000000000000000000040" + // offset 64 to i = 0 408 "00000000000000000000000000000000000000000000000000000000000000a0" + // offset 160 to i = 1 409 "0000000000000000000000000000000000000000000000000000000000000002" + // len(array[0]) = 2 410 "0100000000000000000000000000000000000000000000000000000000000000" + // array[0][0] 411 "0200000000000000000000000000000000000000000000000000000000000000" + // array[0][1] 412 "0000000000000000000000000000000000000000000000000000000000000003" + // len(array[1]) = 3 413 "0300000000000000000000000000000000000000000000000000000000000000" + // array[1][0] 414 "0400000000000000000000000000000000000000000000000000000000000000" + // array[1][1] 415 "0500000000000000000000000000000000000000000000000000000000000000"), // array[1][2] 416 }, 417 418 { 419 "bytes32[][2]", 420 nil, 421 [][]common.Hash{{{1}, {2}}, {{3}, {4}, {5}}}, 422 common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040" + // offset 64 to i = 0 423 "00000000000000000000000000000000000000000000000000000000000000a0" + // offset 160 to i = 1 424 "0000000000000000000000000000000000000000000000000000000000000002" + // len(array[0]) = 2 425 "0100000000000000000000000000000000000000000000000000000000000000" + // array[0][0] 426 "0200000000000000000000000000000000000000000000000000000000000000" + // array[0][1] 427 "0000000000000000000000000000000000000000000000000000000000000003" + // len(array[1]) = 3 428 "0300000000000000000000000000000000000000000000000000000000000000" + // array[1][0] 429 "0400000000000000000000000000000000000000000000000000000000000000" + // array[1][1] 430 "0500000000000000000000000000000000000000000000000000000000000000"), // array[1][2] 431 }, 432 433 { 434 "bytes32[3][2]", 435 nil, 436 [][]common.Hash{{{1}, {2}, {3}}, {{3}, {4}, {5}}}, 437 common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000" + // array[0][0] 438 "0200000000000000000000000000000000000000000000000000000000000000" + // array[0][1] 439 "0300000000000000000000000000000000000000000000000000000000000000" + // array[0][2] 440 "0300000000000000000000000000000000000000000000000000000000000000" + // array[1][0] 441 "0400000000000000000000000000000000000000000000000000000000000000" + // array[1][1] 442 "0500000000000000000000000000000000000000000000000000000000000000"), // array[1][2] 443 }, 444 { 445 // static tuple 446 "tuple", 447 []ArgumentMarshaling{ 448 {Name: "a", Type: "int64"}, 449 {Name: "b", Type: "int256"}, 450 {Name: "c", Type: "int256"}, 451 {Name: "d", Type: "bool"}, 452 {Name: "e", Type: "bytes32[3][2]"}, 453 }, 454 struct { 455 A int64 456 B *big.Int 457 C *big.Int 458 D bool 459 E [][]common.Hash 460 }{1, big.NewInt(1), big.NewInt(-1), true, [][]common.Hash{{{1}, {2}, {3}}, {{3}, {4}, {5}}}}, 461 common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001" + // struct[a] 462 "0000000000000000000000000000000000000000000000000000000000000001" + // struct[b] 463 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + // struct[c] 464 "0000000000000000000000000000000000000000000000000000000000000001" + // struct[d] 465 "0100000000000000000000000000000000000000000000000000000000000000" + // struct[e] array[0][0] 466 "0200000000000000000000000000000000000000000000000000000000000000" + // struct[e] array[0][1] 467 "0300000000000000000000000000000000000000000000000000000000000000" + // struct[e] array[0][2] 468 "0300000000000000000000000000000000000000000000000000000000000000" + // struct[e] array[1][0] 469 "0400000000000000000000000000000000000000000000000000000000000000" + // struct[e] array[1][1] 470 "0500000000000000000000000000000000000000000000000000000000000000"), // struct[e] array[1][2] 471 }, 472 { 473 // dynamic tuple 474 "tuple", 475 []ArgumentMarshaling{ 476 {Name: "a", Type: "string"}, 477 {Name: "b", Type: "int64"}, 478 {Name: "c", Type: "bytes"}, 479 {Name: "d", Type: "string[]"}, 480 {Name: "e", Type: "int256[]"}, 481 {Name: "f", Type: "address[]"}, 482 }, 483 struct { 484 FieldA string `abi:"a"` // Test whether abi tag works 485 FieldB int64 `abi:"b"` 486 C []byte 487 D []string 488 E []*big.Int 489 F []common.Address 490 }{"foobar", 1, []byte{1}, []string{"foo", "bar"}, []*big.Int{big.NewInt(1), big.NewInt(-1)}, []common.Address{{1}, {2}}}, 491 common.Hex2Bytes("00000000000000000000000000000000000000000000000000000000000000c0" + // struct[a] offset 492 "0000000000000000000000000000000000000000000000000000000000000001" + // struct[b] 493 "0000000000000000000000000000000000000000000000000000000000000100" + // struct[c] offset 494 "0000000000000000000000000000000000000000000000000000000000000140" + // struct[d] offset 495 "0000000000000000000000000000000000000000000000000000000000000220" + // struct[e] offset 496 "0000000000000000000000000000000000000000000000000000000000000280" + // struct[f] offset 497 "0000000000000000000000000000000000000000000000000000000000000006" + // struct[a] length 498 "666f6f6261720000000000000000000000000000000000000000000000000000" + // struct[a] "foobar" 499 "0000000000000000000000000000000000000000000000000000000000000001" + // struct[c] length 500 "0100000000000000000000000000000000000000000000000000000000000000" + // []byte{1} 501 "0000000000000000000000000000000000000000000000000000000000000002" + // struct[d] length 502 "0000000000000000000000000000000000000000000000000000000000000040" + // foo offset 503 "0000000000000000000000000000000000000000000000000000000000000080" + // bar offset 504 "0000000000000000000000000000000000000000000000000000000000000003" + // foo length 505 "666f6f0000000000000000000000000000000000000000000000000000000000" + // foo 506 "0000000000000000000000000000000000000000000000000000000000000003" + // bar offset 507 "6261720000000000000000000000000000000000000000000000000000000000" + // bar 508 "0000000000000000000000000000000000000000000000000000000000000002" + // struct[e] length 509 "0000000000000000000000000000000000000000000000000000000000000001" + // 1 510 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + // -1 511 "0000000000000000000000000000000000000000000000000000000000000002" + // struct[f] length 512 "0000000000000000000000000100000000000000000000000000000000000000" + // common.Address{1} 513 "0000000000000000000000000200000000000000000000000000000000000000"), // common.Address{2} 514 }, 515 { 516 // nested tuple 517 "tuple", 518 []ArgumentMarshaling{ 519 {Name: "a", Type: "tuple", Components: []ArgumentMarshaling{{Name: "a", Type: "uint256"}, {Name: "b", Type: "uint256[]"}}}, 520 {Name: "b", Type: "int256[]"}, 521 }, 522 struct { 523 A struct { 524 FieldA *big.Int `abi:"a"` 525 B []*big.Int 526 } 527 B []*big.Int 528 }{ 529 A: struct { 530 FieldA *big.Int `abi:"a"` // Test whether abi tag works for nested tuple 531 B []*big.Int 532 }{big.NewInt(1), []*big.Int{big.NewInt(1), big.NewInt(0)}}, 533 B: []*big.Int{big.NewInt(1), big.NewInt(0)}}, 534 common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040" + // a offset 535 "00000000000000000000000000000000000000000000000000000000000000e0" + // b offset 536 "0000000000000000000000000000000000000000000000000000000000000001" + // a.a value 537 "0000000000000000000000000000000000000000000000000000000000000040" + // a.b offset 538 "0000000000000000000000000000000000000000000000000000000000000002" + // a.b length 539 "0000000000000000000000000000000000000000000000000000000000000001" + // a.b[0] value 540 "0000000000000000000000000000000000000000000000000000000000000000" + // a.b[1] value 541 "0000000000000000000000000000000000000000000000000000000000000002" + // b length 542 "0000000000000000000000000000000000000000000000000000000000000001" + // b[0] value 543 "0000000000000000000000000000000000000000000000000000000000000000"), // b[1] value 544 }, 545 { 546 // tuple slice 547 "tuple[]", 548 []ArgumentMarshaling{ 549 {Name: "a", Type: "int256"}, 550 {Name: "b", Type: "int256[]"}, 551 }, 552 []struct { 553 A *big.Int 554 B []*big.Int 555 }{ 556 {big.NewInt(-1), []*big.Int{big.NewInt(1), big.NewInt(0)}}, 557 {big.NewInt(1), []*big.Int{big.NewInt(2), big.NewInt(-1)}}, 558 }, 559 common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002" + // tuple length 560 "0000000000000000000000000000000000000000000000000000000000000040" + // tuple[0] offset 561 "00000000000000000000000000000000000000000000000000000000000000e0" + // tuple[1] offset 562 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + // tuple[0].A 563 "0000000000000000000000000000000000000000000000000000000000000040" + // tuple[0].B offset 564 "0000000000000000000000000000000000000000000000000000000000000002" + // tuple[0].B length 565 "0000000000000000000000000000000000000000000000000000000000000001" + // tuple[0].B[0] value 566 "0000000000000000000000000000000000000000000000000000000000000000" + // tuple[0].B[1] value 567 "0000000000000000000000000000000000000000000000000000000000000001" + // tuple[1].A 568 "0000000000000000000000000000000000000000000000000000000000000040" + // tuple[1].B offset 569 "0000000000000000000000000000000000000000000000000000000000000002" + // tuple[1].B length 570 "0000000000000000000000000000000000000000000000000000000000000002" + // tuple[1].B[0] value 571 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), // tuple[1].B[1] value 572 }, 573 { 574 // static tuple array 575 "tuple[2]", 576 []ArgumentMarshaling{ 577 {Name: "a", Type: "int256"}, 578 {Name: "b", Type: "int256"}, 579 }, 580 [2]struct { 581 A *big.Int 582 B *big.Int 583 }{ 584 {big.NewInt(-1), big.NewInt(1)}, 585 {big.NewInt(1), big.NewInt(-1)}, 586 }, 587 common.Hex2Bytes("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + // tuple[0].a 588 "0000000000000000000000000000000000000000000000000000000000000001" + // tuple[0].b 589 "0000000000000000000000000000000000000000000000000000000000000001" + // tuple[1].a 590 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), // tuple[1].b 591 }, 592 { 593 // dynamic tuple array 594 "tuple[2]", 595 []ArgumentMarshaling{ 596 {Name: "a", Type: "int256[]"}, 597 }, 598 [2]struct { 599 A []*big.Int 600 }{ 601 {[]*big.Int{big.NewInt(-1), big.NewInt(1)}}, 602 {[]*big.Int{big.NewInt(1), big.NewInt(-1)}}, 603 }, 604 common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040" + // tuple[0] offset 605 "00000000000000000000000000000000000000000000000000000000000000c0" + // tuple[1] offset 606 "0000000000000000000000000000000000000000000000000000000000000020" + // tuple[0].A offset 607 "0000000000000000000000000000000000000000000000000000000000000002" + // tuple[0].A length 608 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + // tuple[0].A[0] 609 "0000000000000000000000000000000000000000000000000000000000000001" + // tuple[0].A[1] 610 "0000000000000000000000000000000000000000000000000000000000000020" + // tuple[1].A offset 611 "0000000000000000000000000000000000000000000000000000000000000002" + // tuple[1].A length 612 "0000000000000000000000000000000000000000000000000000000000000001" + // tuple[1].A[0] 613 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), // tuple[1].A[1] 614 }, 615 } { 616 typ, err := NewType(test.typ, "", test.components) 617 if err != nil { 618 t.Fatalf("%v failed. Unexpected parse error: %v", i, err) 619 } 620 output, err := typ.pack(reflect.ValueOf(test.input)) 621 if err != nil { 622 t.Fatalf("%v failed. Unexpected pack error: %v", i, err) 623 } 624 625 if !bytes.Equal(output, test.output) { 626 t.Errorf("input %d for typ: %v failed. Expected bytes: '%x' Got: '%x'", i, typ.String(), test.output, output) 627 } 628 } 629 } 630 631 func TestMethodPack(t *testing.T) { 632 abi, err := JSON(strings.NewReader(jsondata2)) 633 if err != nil { 634 t.Fatal(err) 635 } 636 637 sig := abi.Methods["slice"].ID() 638 sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...) 639 sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) 640 641 packed, err := abi.Pack("slice", []uint32{1, 2}) 642 if err != nil { 643 t.Error(err) 644 } 645 646 if !bytes.Equal(packed, sig) { 647 t.Errorf("expected %x got %x", sig, packed) 648 } 649 650 var addrA, addrB = common.Address{1}, common.Address{2} 651 sig = abi.Methods["sliceAddress"].ID() 652 sig = append(sig, common.LeftPadBytes([]byte{32}, 32)...) 653 sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) 654 sig = append(sig, common.LeftPadBytes(addrA[:], 32)...) 655 sig = append(sig, common.LeftPadBytes(addrB[:], 32)...) 656 657 packed, err = abi.Pack("sliceAddress", []common.Address{addrA, addrB}) 658 if err != nil { 659 t.Fatal(err) 660 } 661 if !bytes.Equal(packed, sig) { 662 t.Errorf("expected %x got %x", sig, packed) 663 } 664 665 var addrC, addrD = common.Address{3}, common.Address{4} 666 sig = abi.Methods["sliceMultiAddress"].ID() 667 sig = append(sig, common.LeftPadBytes([]byte{64}, 32)...) 668 sig = append(sig, common.LeftPadBytes([]byte{160}, 32)...) 669 sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) 670 sig = append(sig, common.LeftPadBytes(addrA[:], 32)...) 671 sig = append(sig, common.LeftPadBytes(addrB[:], 32)...) 672 sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) 673 sig = append(sig, common.LeftPadBytes(addrC[:], 32)...) 674 sig = append(sig, common.LeftPadBytes(addrD[:], 32)...) 675 676 packed, err = abi.Pack("sliceMultiAddress", []common.Address{addrA, addrB}, []common.Address{addrC, addrD}) 677 if err != nil { 678 t.Fatal(err) 679 } 680 if !bytes.Equal(packed, sig) { 681 t.Errorf("expected %x got %x", sig, packed) 682 } 683 684 sig = abi.Methods["slice256"].ID() 685 sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...) 686 sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) 687 688 packed, err = abi.Pack("slice256", []*big.Int{big.NewInt(1), big.NewInt(2)}) 689 if err != nil { 690 t.Error(err) 691 } 692 693 if !bytes.Equal(packed, sig) { 694 t.Errorf("expected %x got %x", sig, packed) 695 } 696 697 a := [2][2]*big.Int{{big.NewInt(1), big.NewInt(1)}, {big.NewInt(2), big.NewInt(0)}} 698 sig = abi.Methods["nestedArray"].ID() 699 sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...) 700 sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...) 701 sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) 702 sig = append(sig, common.LeftPadBytes([]byte{0}, 32)...) 703 sig = append(sig, common.LeftPadBytes([]byte{0xa0}, 32)...) 704 sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) 705 sig = append(sig, common.LeftPadBytes(addrC[:], 32)...) 706 sig = append(sig, common.LeftPadBytes(addrD[:], 32)...) 707 packed, err = abi.Pack("nestedArray", a, []common.Address{addrC, addrD}) 708 if err != nil { 709 t.Fatal(err) 710 } 711 if !bytes.Equal(packed, sig) { 712 t.Errorf("expected %x got %x", sig, packed) 713 } 714 715 sig = abi.Methods["nestedArray2"].ID() 716 sig = append(sig, common.LeftPadBytes([]byte{0x20}, 32)...) 717 sig = append(sig, common.LeftPadBytes([]byte{0x40}, 32)...) 718 sig = append(sig, common.LeftPadBytes([]byte{0x80}, 32)...) 719 sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...) 720 sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...) 721 sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...) 722 sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...) 723 packed, err = abi.Pack("nestedArray2", [2][]uint8{{1}, {1}}) 724 if err != nil { 725 t.Fatal(err) 726 } 727 if !bytes.Equal(packed, sig) { 728 t.Errorf("expected %x got %x", sig, packed) 729 } 730 731 sig = abi.Methods["nestedSlice"].ID() 732 sig = append(sig, common.LeftPadBytes([]byte{0x20}, 32)...) 733 sig = append(sig, common.LeftPadBytes([]byte{0x02}, 32)...) 734 sig = append(sig, common.LeftPadBytes([]byte{0x40}, 32)...) 735 sig = append(sig, common.LeftPadBytes([]byte{0xa0}, 32)...) 736 sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) 737 sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...) 738 sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) 739 sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) 740 sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...) 741 sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) 742 packed, err = abi.Pack("nestedSlice", [][]uint8{{1, 2}, {1, 2}}) 743 if err != nil { 744 t.Fatal(err) 745 } 746 if !bytes.Equal(packed, sig) { 747 t.Errorf("expected %x got %x", sig, packed) 748 } 749 } 750 751 func TestPackNumber(t *testing.T) { 752 tests := []struct { 753 value reflect.Value 754 packed []byte 755 }{ 756 // Protocol limits 757 {reflect.ValueOf(0), common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000000")}, 758 {reflect.ValueOf(1), common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")}, 759 {reflect.ValueOf(-1), common.Hex2Bytes("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")}, 760 761 // Type corner cases 762 {reflect.ValueOf(uint8(math.MaxUint8)), common.Hex2Bytes("00000000000000000000000000000000000000000000000000000000000000ff")}, 763 {reflect.ValueOf(uint16(math.MaxUint16)), common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000ffff")}, 764 {reflect.ValueOf(uint32(math.MaxUint32)), common.Hex2Bytes("00000000000000000000000000000000000000000000000000000000ffffffff")}, 765 {reflect.ValueOf(uint64(math.MaxUint64)), common.Hex2Bytes("000000000000000000000000000000000000000000000000ffffffffffffffff")}, 766 767 {reflect.ValueOf(int8(math.MaxInt8)), common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000007f")}, 768 {reflect.ValueOf(int16(math.MaxInt16)), common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000007fff")}, 769 {reflect.ValueOf(int32(math.MaxInt32)), common.Hex2Bytes("000000000000000000000000000000000000000000000000000000007fffffff")}, 770 {reflect.ValueOf(int64(math.MaxInt64)), common.Hex2Bytes("0000000000000000000000000000000000000000000000007fffffffffffffff")}, 771 772 {reflect.ValueOf(int8(math.MinInt8)), common.Hex2Bytes("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80")}, 773 {reflect.ValueOf(int16(math.MinInt16)), common.Hex2Bytes("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000")}, 774 {reflect.ValueOf(int32(math.MinInt32)), common.Hex2Bytes("ffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000")}, 775 {reflect.ValueOf(int64(math.MinInt64)), common.Hex2Bytes("ffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000")}, 776 } 777 for i, tt := range tests { 778 packed := packNum(tt.value) 779 if !bytes.Equal(packed, tt.packed) { 780 t.Errorf("test %d: pack mismatch: have %x, want %x", i, packed, tt.packed) 781 } 782 } 783 }