diff --git a/.gitignore b/.gitignore index 851df5be..48388b9a 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ node_modules .next dist/ + +**/*.test diff --git a/abi/encoding_test.go b/abi/encoding_test.go index df0d348c..9a8fdd1d 100644 --- a/abi/encoding_test.go +++ b/abi/encoding_test.go @@ -757,3 +757,62 @@ func TestEncodingStruct_camcelCase(t *testing.T) { t.Fatal("bad") } } + +func TestEncodingStructDynamic(t *testing.T) { + typ := MustNewType("tuple(string A, address B, uint256 C, bytes[] D, bytes[] E, address[] F, int256 G)") + + type Abcdefg struct { + A string + B ethgo.Address + C *big.Int + D [][]byte + E [][]byte + F []ethgo.Address + G *big.Int + } + + a := Abcdefg{ + A: "submitKeygen(bytes)", + B: ethgo.HexToAddress("0xa16E02E87b7454126E5E10d957A927A7F5B5d2be"), + C: big.NewInt(4), + D: [][]byte{mustDecodeHex("0x04792730167230add71afb0459dd093980a5dbef6b8cfd2c9eef5f403d8b87a7a03da89bde572e8f564a39ad05452f854fe45328fa8ee7148fb8ee3131b78e6226"), + mustDecodeHex("0x043770e37d91bbbb001e8c60de87d4fafd44626c8b85e08fbadf8f45778841a0462b0b88cea6cbb10ca931b0cb70d9d2aca23635100e0365bf1e6b07f929b45b32"), + mustDecodeHex("0x04e397c219c024160ce8c5e35a23dd51ab6b9296cad9f3d6c03f7dbe6b294c4d61c529fd79bd30d1f2dda9a9f70d6f316de01ed9d100e0496cc30a4454215cb726"), + mustDecodeHex("0x0463b437e92335bf367ab5b3b5bda4ff218cf5e2ac6555b47c187e20ac274476fcf30d1b56ce6fc861c23b8ab147f00df140c53291257ecb58e89e4815803f0f47")}, + E: [][]byte{}, + F: []ethgo.Address{}, + G: big.NewInt(0), + } + + encoded, err := typ.Encode(&a) + if err != nil { + t.Fatal(err) + } + + hexencoded := hex.EncodeToString(encoded) + data := "000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000a16e02e87b7454126e5e10d957a927a7f5b5d2be0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000003e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000137375626d69744b657967656e286279746573290000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000004104792730167230add71afb0459dd093980a5dbef6b8cfd2c9eef5f403d8b87a7a03da89bde572e8f564a39ad05452f854fe45328fa8ee7148fb8ee3131b78e6226000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041043770e37d91bbbb001e8c60de87d4fafd44626c8b85e08fbadf8f45778841a0462b0b88cea6cbb10ca931b0cb70d9d2aca23635100e0365bf1e6b07f929b45b3200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004104e397c219c024160ce8c5e35a23dd51ab6b9296cad9f3d6c03f7dbe6b294c4d61c529fd79bd30d1f2dda9a9f70d6f316de01ed9d100e0496cc30a4454215cb7260000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410463b437e92335bf367ab5b3b5bda4ff218cf5e2ac6555b47c187e20ac274476fcf30d1b56ce6fc861c23b8ab147f00df140c53291257ecb58e89e4815803f0f470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + if hexencoded != data { + t.Fatal("encoding failed for Abcdefg") + } + + var b Abcdefg + if err := typ.DecodeStruct(encoded, &b); err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(a, b) { + t.Fatal("bad encode-decode cycle in Abcdefg") + } + + d, err := hex.DecodeString(data) + if err != nil { + t.Fatal(err) + } + res, err := typ.Decode(d) + if err != nil { + t.Fatal(err) + } + + if (res.(*Abcdefg)).G != big.NewInt(1) { + t.Fatal("decoding not as expected for Abcdefg") + } +}