//go:build unittest package eth import ( "reflect" "testing" "github.com/trezor/blockbook/bchain" ) func Test_parseSimpleStringProperty(t *testing.T) { tests := []struct { name string args string want string }{ { name: "1", args: "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000758504c4f44444500000000000000000000000000000000000000000000000000", want: "XPLODDE", }, { name: "2", args: "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000022426974436c617665202d20436f6e73756d657220416374697669747920546f6b656e00000000000000", want: "BitClave - Consumer Activity Token", }, { name: "short", args: "0x44616920537461626c65636f696e2076312e3000000000000000000000000000", want: "Dai Stablecoin v1.0", }, { name: "short2", args: "0x44616920537461626c65636f696e2076312e3020444444444444444444444444", want: "Dai Stablecoin v1.0 DDDDDDDDDDDD", }, { name: "long", args: "0x556e6973776170205631000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", want: "Uniswap V1", }, { name: "garbage", args: "0x2234880850896048596206002535425366538144616734015984380565810000", want: "", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got := parseSimpleStringProperty(tt.args) // the addresses could have different case if got != tt.want { t.Errorf("parseSimpleStringProperty = %v, want %v", got, tt.want) } }) } } func TestGetSignatureFromData(t *testing.T) { tests := []struct { name string data string want uint32 }{ { name: "0x9e53a69a", data: "0x9e53a69a000000000000000000000000000000000000000000000", want: 2656282266, }, { name: "9e53a69b", data: "9e53a69b000000000000000000000000000000000000000000000", want: 2656282267, }, { name: "0x9e53 short", data: "0x9e53", want: 0, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := GetSignatureFromData(tt.data); got != tt.want { t.Errorf("GetSignatureFromData() = %v, want %v", got, tt.want) } }) } } func TestParseInputData(t *testing.T) { signatures := []bchain.FourByteSignature{ { Name: "mintFighter", Parameters: []string{}, }, { Name: "cancelMultipleMakerOrders", Parameters: []string{"uint256[]"}, }, { Name: "mockRegisterFact", Parameters: []string{"bytes32"}, }, { Name: "vestingDeposits", Parameters: []string{"address"}, }, { Name: "addLiquidityETH", Parameters: []string{"address", "uint256", "uint256", "uint256", "address", "uint256"}, }, { Name: "spread", Parameters: []string{"uint256", "address[]"}, }, { Name: "registerWithConfig", Parameters: []string{"string", "address", "uint256", "bytes32", "address", "address"}, }, { Name: "atomicMatch_", Parameters: []string{"address[14]", "uint256[18]", "uint8[8]", "bytes", "bytes", "bytes", "bytes", "bytes", "bytes", "uint8[2]", "bytes32[5]"}, }, { Name: "transmitAndSellTokenForEth", Parameters: []string{"address", "uint256", "uint256", "uint256", "address", "(uint8,bytes32,bytes32)", "bytes"}, }, } tests := []struct { name string signatures *[]bchain.FourByteSignature data string want *bchain.EthereumParsedInputData wantErr bool }{ { name: "transfer", signatures: &signatures, data: "", want: &bchain.EthereumParsedInputData{ Name: "Transfer", }, }, { name: "mintFighter", signatures: &signatures, data: "0xa19b9082", want: &bchain.EthereumParsedInputData{ MethodId: "0xa19b9082", Name: "Mint Fighter", Function: "mintFighter()", Params: []bchain.EthereumParsedInputParam{}, }, }, { name: "mockRegisterFact", signatures: &signatures, data: "0xf69507abdc8fa8fe57a22de66a1d5898496c524068cb04c31f72497b3ac9f3b449e58725", want: &bchain.EthereumParsedInputData{ MethodId: "0xf69507ab", Name: "Mock Register Fact", Function: "mockRegisterFact(bytes32)", Params: []bchain.EthereumParsedInputParam{ { Type: "bytes32", Values: []string{"0xdc8fa8fe57a22de66a1d5898496c524068cb04c31f72497b3ac9f3b449e58725"}, }, }, }, }, { name: "cancelMultipleMakerOrders", signatures: &signatures, data: "0x9e53a69a000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000017f62f8db30", want: &bchain.EthereumParsedInputData{ MethodId: "0x9e53a69a", Name: "Cancel Multiple Maker Orders", Function: "cancelMultipleMakerOrders(uint256[])", Params: []bchain.EthereumParsedInputParam{ { Type: "uint256[]", Values: []string{"1646632950576"}, }, }, }, }, { name: "addLiquidityETH", signatures: &signatures, data: "0xf305d719000000000000000000000000b80e5aaa2131c07568128f68b8538ed3c8951234000000000000000000000000000000000000007e37be2022c0914b2680000000000000000000000000000000000000000000007e37be2022c0914b26800000000000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000009f64b014ca26f2def573246543dd1115b229e4f400000000000000000000000000000000000000000000000000000000623f56f8", want: &bchain.EthereumParsedInputData{ MethodId: "0xf305d719", Name: "Add Liquidity ETH", Function: "addLiquidityETH(address, uint256, uint256, uint256, address, uint256)", Params: []bchain.EthereumParsedInputParam{ { Type: "address", Values: []string{"0xB80e5AaA2131c07568128f68b8538eD3C8951234"}, }, { Type: "uint256", Values: []string{"10000000000000000000000000000000"}, }, { Type: "uint256", Values: []string{"10000000000000000000000000000000"}, }, { Type: "uint256", Values: []string{"1000000000000000000"}, }, { Type: "address", Values: []string{"0x9f64B014CA26F2DeF573246543DD1115b229e4F4"}, }, { Type: "uint256", Values: []string{"1648318200"}, }, }, }, }, { name: "addLiquidityETH data don't match - too long", signatures: &signatures, data: "0xf305d719000000000000000000000000b80e5aaa2131c07568128f68b8538ed3c8951234000000000000000000000000000000000000007e37be2022c0914b2680000000000000000000000000000000000000000000007e37be2022c0914b26800000000000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000009f64b014ca26f2def573246543dd1115b229e4f400000000000000000000000000000000000000000000000000000000623f56f800000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff", want: &bchain.EthereumParsedInputData{ MethodId: "0xf305d719", }, }, { name: "addLiquidityETH data don't match - too short", signatures: &signatures, data: "0xf305d719000000000000000000000000b80e5aaa2131c07568128f68b8538ed3c8951234000000000000000000000000000000000000007e37be2022c0914b2680000000000000000000000000000000000000000000007e37be2022c0914b26800000000000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000009f64b014ca26f2def573246543dd1115b229e4f4", want: &bchain.EthereumParsedInputData{ MethodId: "0xf305d719", }, }, { name: "spread", signatures: &signatures, data: "0xcd51b093000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000048c999d9206fcf2a0ecde10049de6dc2d1704bb2000000000000000000000000d2dae6b2309ada5d4c983b4c7d2c942452adc759", want: &bchain.EthereumParsedInputData{ MethodId: "0xcd51b093", Name: "Spread", Function: "spread(uint256, address[])", Params: []bchain.EthereumParsedInputParam{ { Type: "uint256", Values: []string{"100000000000000000"}, }, { Type: "address[]", Values: []string{"0x48c999d9206fcf2A0ecdE10049de6Dc2d1704Bb2", "0xD2DAE6B2309aDa5d4c983B4c7D2c942452aDC759"}, }, }, }, }, { name: "atomicMatch_", // mainnet tx 0x57aff22b0f812e05467fb73caec8ac0364a535382496e5f64eb9df9fb32bd85f signatures: &signatures, data: "0xab834bab0000000000000000000000007f268357a8c2552623316e2562d90e642bb538e50000000000000000000000001676b0ab0aeb83122c58abc3d6a50b6c4a9d376300000000000000000000000024c57fbb5c260edf158583818177cfd5c2dec4700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000baf2127b49fc93cbca6269fade0f7f31df4c88a7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f268357a8c2552623316e2562d90e642bb538e500000000000000000000000024c57fbb5c260edf158583818177cfd5c2dec47000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b3256965e7c3cf26e11fcaf296dfc8807c01073000000000000000000000000baf2127b49fc93cbca6269fade0f7f31df4c88a70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062531f6400000000000000000000000000000000000000000000000000000000000000000227db897c05fe6409bc72c6bee932b99a92ca45e155cf85e763424e7a3ee61500000000000000000000000000000000000000000000000000000000000002ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000625313f800000000000000000000000000000000000000000000000000000000627aa14b79166058af7dd96e2190730f926c56d6131af9d72b4dd2138b58c30e268c7f300000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000008e00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b200000000000000000000000000000000000000000000000000000000000000b20000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001c77e6196859305642ea4751b9597a9507472acb04b9f1f4759aa0f27af41edd8960513f1649f58782cacce26b1341575b584594f940bba0614aff302d25b4b10477e6196859305642ea4751b9597a9507472acb04b9f1f4759aa0f27af41edd8960513f1649f58782cacce26b1341575b584594f940bba0614aff302d25b4b104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4fb16a59500000000000000000000000000000000000000000000000000000000000000000000000000000000000000001676b0ab0aeb83122c58abc3d6a50b6c4a9d3763000000000000000000000000f25f4f4f6517101dc947d1c0370571ebdd25f14a00000000000000000000000000000000000000000000000000000000000002c7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4fb16a59500000000000000000000000024c57fbb5c260edf158583818177cfd5c2dec4700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f25f4f4f6517101dc947d1c0370571ebdd25f14a00000000000000000000000000000000000000000000000000000000000002c7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e400000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", want: &bchain.EthereumParsedInputData{ MethodId: "0xab834bab", Name: "Atomic Match_", Function: "atomicMatch_(address[14], uint256[18], uint8[8], bytes, bytes, bytes, bytes, bytes, bytes, uint8[2], bytes32[5])", Params: []bchain.EthereumParsedInputParam{ { Type: "address[14]", Values: []string{ "0x7f268357A8c2552623316e2562D90e642bB538E5", "0x1676b0AB0Aeb83122C58ABC3d6a50B6c4A9d3763", "0x24C57FBB5c260EDf158583818177Cfd5C2dec470", "0x0000000000000000000000000000000000000000", "0xBAf2127B49fC93CbcA6269FAdE0F7F31dF4c88a7", "0x0000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000", "0x7f268357A8c2552623316e2562D90e642bB538E5", "0x24C57FBB5c260EDf158583818177Cfd5C2dec470", "0x0000000000000000000000000000000000000000", "0x5b3256965e7C3cF26E11FCAf296DfC8807C01073", "0xBAf2127B49fC93CbcA6269FAdE0F7F31dF4c88a7", "0x0000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000"}, }, { Type: "uint256[18]", Values: []string{ "750", "0", "0", "0", "10000000000000000", "0", "1649614692", "0", "975047921716720136517384107537725863826800092678142650456874303300963329557", "750", "0", "0", "0", "10000000000000000", "0", "1649611768", "1652203851", "54769390272606378508076535204478407261307419838517394120712398796227861053232"}, }, { Type: "uint8[8]", Values: []string{"1", "0", "0", "1", "1", "1", "0", "1"}, }, { Type: "bytes", Values: []string{"0xfb16a59500000000000000000000000000000000000000000000000000000000000000000000000000000000000000001676b0ab0aeb83122c58abc3d6a50b6c4a9d3763000000000000000000000000f25f4f4f6517101dc947d1c0370571ebdd25f14a00000000000000000000000000000000000000000000000000000000000002c7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000"}, }, { Type: "bytes", Values: []string{"0xfb16a59500000000000000000000000024c57fbb5c260edf158583818177cfd5c2dec4700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f25f4f4f6517101dc947d1c0370571ebdd25f14a00000000000000000000000000000000000000000000000000000000000002c7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000"}, }, { Type: "bytes", Values: []string{"0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, }, { Type: "bytes", Values: []string{"0x000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, }, { Type: "bytes", Values: []string{""}, }, { Type: "bytes", Values: []string{""}, }, { Type: "uint8[2]", Values: []string{"28", "28"}, }, { Type: "bytes32[5]", Values: []string{"0x77e6196859305642ea4751b9597a9507472acb04b9f1f4759aa0f27af41edd89", "0x60513f1649f58782cacce26b1341575b584594f940bba0614aff302d25b4b104", "0x77e6196859305642ea4751b9597a9507472acb04b9f1f4759aa0f27af41edd89", "0x60513f1649f58782cacce26b1341575b584594f940bba0614aff302d25b4b104", "0x0000000000000000000000000000000000000000000000000000000000000000"}, }, }, }, }, { name: "registerWithConfig", signatures: &signatures, data: "0xf7a1696300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000769cbf44073741ccb4c39c945402130b46fa8a70000000000000000000000000000000000000000000000000000000012cf35707a8c22626793047f41a428e815e2bb12ced6d5db4246a8b0bda488c541647bef0000000000000000000000004976fb03c32e5b8cfe2b6ccb31c09ba78ebaba410000000000000000000000000769cbf44073741ccb4c39c945402130b46fa8a700000000000000000000000000000000000000000000000000000000000000076d6f6e7369746100000000000000000000000000000000000000000000000000", want: &bchain.EthereumParsedInputData{ MethodId: "0xf7a16963", Name: "Register With Config", Function: "registerWithConfig(string, address, uint256, bytes32, address, address)", Params: []bchain.EthereumParsedInputParam{ { Type: "string", Values: []string{"monsita"}, }, { Type: "address", Values: []string{"0x0769cBf44073741cCb4C39c945402130B46fa8A7"}, }, { Type: "uint256", Values: []string{"315569520"}, }, { Type: "bytes32", Values: []string{"0x7a8c22626793047f41a428e815e2bb12ced6d5db4246a8b0bda488c541647bef"}, }, { Type: "address", Values: []string{"0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41"}, }, { Type: "address", Values: []string{"0x0769cBf44073741cCb4C39c945402130B46fa8A7"}, }, }, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got := ParseInputData(tt.signatures, tt.data) if !reflect.DeepEqual(got, tt.want) { t.Errorf("ParseInputData() = %v, want %v", got, tt.want) } }) } }