用0xE592427A0AEce92De3Edee1F18E0157C05861564
的abi, 具体用法搜一搜
https://etherscan.io/tx/0xecb398ee0e00ec3b3f1bc4d3d34c69153c2abeef995d39a69c1f30300330c18e

0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000104414bf389000000000000000000000000c5e7703d4647ff77bc733bb56d120471b83382e2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006507f7280000000000000000000000000000000000000000000000000001d6c3ef643800000000000000000000000000000000000000000000000000014fcd4e1e5ce130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c000000000000000000000000000000000000000000000000014fcd4e1e5ce13000000000000000000000000019edc2f769ac416c725e1c4032be50c1d4b3bd3a00000000000000000000000000000000000000000000000000000000

let calls = web3.eth.abi.decodeParameters(['bytes[]'], calldata)[0];
console.log(`calls1:${calls}`)

0x414bf389000000000000000000000000c5e7703d4647ff77bc733bb56d120471b83382e2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006507f7280000000000000000000000000000000000000000000000000001d6c3ef643800000000000000000000000000000000000000000000000000014fcd4e1e5ce1300000000000000000000000000000000000000000000000000000000000000000
,
0x49404b7c000000000000000000000000000000000000000000000000014fcd4e1e5ce13000000000000000000000000019edc2f769ac416c725e1c4032be50c1d4b3bd3a
这个类型是bytes[]
的数据,请问是怎么解析出2个bytes
数据的。解析区分出这2个bytes
的原理是什么呢。
有没有对应Java的写法解析web3.eth.abi.decodeParameters

String callData = "00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000104414bf389000000000000000000000000c5e7703d4647ff77bc733bb56d120471b83382e2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006507f7280000000000000000000000000000000000000000000000000001d6c3ef643800000000000000000000000000000000000000000000000000014fcd4e1e5ce130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c000000000000000000000000000000000000000000000000014fcd4e1e5ce13000000000000000000000000019edc2f769ac416c725e1c4032be50c1d4b3bd3a00000000000000000000000000000000000000000000000000000000";
List list = new ArrayList();
int index = 64;//32字节
int length = callData.length() / index;
int beginIndex = 0;
int endIndex = 64;
for (int i = 0; i < length; i++) {
list.add(Numeric.hexStringToByteArray(callData.substring(beginIndex, endIndex)));
beginIndex = beginIndex + index;
endIndex = endIndex + index;
}
Function function = new Function("multicall", Arrays.<Type>asList(new DynamicArray<DynamicBytes>(DynamicBytes.class, org.web3j.abi.Utils.typeMap(list, DynamicBytes.class))), Arrays.<TypeReference<?>>asList(new TypeReference<DynamicArray<DynamicBytes>>() {
}));
System.out.println("encoded:" + FunctionEncoder.encode(function));
List<Type> decode = FunctionReturnDecoder.decode(callData, function.getOutputParameters());
List<DynamicBytes> decodeList = (List<DynamicBytes>) decode.get(0).getValue();
String data1 = Numeric.toHexString(decodeList.get(0).getValue());
String data2 = Numeric.toHexString(decodeList.get(1).getValue());
System.out.println("decode1:" + data1);
System.out.println("decode2:" + data2);
String currentDirectory = System.getProperty("user.dir");
AbiDecoder abiDecoder = new AbiDecoder(currentDirectory + "/robot-monitor/abi/SwapV3Router.json");
DecodedFunctionCall decodedFunctionCall = abiDecoder.decodeFunctionCall(data1);
System.out.println("解析对应abi数据:" + JSON.toJSONString(decodedFunctionCall));

decode1:0x414bf389000000000000000000000000c5e7703d4647ff77bc733bb56d120471b83382e2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006507f7280000000000000000000000000000000000000000000000000001d6c3ef643800000000000000000000000000000000000000000000000000014fcd4e1e5ce1300000000000000000000000000000000000000000000000000000000000000000
decode2:0x49404b7c000000000000000000000000000000000000000000000000014fcd4e1e5ce13000000000000000000000000019edc2f769ac416c725e1c4032be50c1d4b3bd3a
解析对应abi数据:{"name":"exactInputSingle","paramList":[{"name":"params","type":"tuple","value":["0xc5e7703d4647ff77bc733bb56d120471b83382e2","0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",3000,"0x0000000000000000000000000000000000000000",1695020840,517612000000000,94519852598616368,0]}],"params":[{"$ref":"$.paramList[0]"}],"size":1}
解析对应abi数据:{"name":"unwrapWETH9","paramList":[{"name":"amountMinimum","type":"uint256","value":94519852598616368},{"name":"recipient","type":"address","value":"0x19edc2f769ac416c725e1c4032be50c1d4b3bd3a"}],"params":[{"$ref":"$.paramList[0]"},{"$ref":"$.paramList[1]"}],"size":2}