web3j icon indicating copy to clipboard operation
web3j copied to clipboard

How can I parse the return value of the aggregate method in a multicall contract?

Open fastener opened this issue 3 years ago • 1 comments

I use BSC's multicall. The contract address is as follows: 0xf6fd90a470aa0c1b8a54681746b07acdfedc9b

Web3j web3j =Web3j.build(new HttpService("https://bsc-dataseed1.binance.org/")); String addressOfMulticall = "0xfF6FD90A470Aaa0c1B8A54681746b07AcdFedc9B"; Address addressOfDaiTokens = new Address("0xC0Ff5EaB9909E78b7391539fa43e9688DD0b9e31"); String encodeDataOfNameFunction= EvmContractsUtil.functionEncode(ERC20TokenUtil.NAME,null); DynamicStruct staticStruct = new DynamicStruct(addressOfDaiTokens, new DynamicBytes(Hex.decode(encodeDataOfNameFunction.substring(2).getBytes()))); Function aggregateFunction = new Function("aggregate", List.of(new DynamicArray(DynamicStruct.class, staticStruct)) , List.of(new TypeReference<Uint256>() { }, new TypeReference<DynamicArray<DynamicBytes>>() { })); String encodeFunctionDataOfMulticall = FunctionEncoder.encode(aggregateFunction); ReadonlyTransactionManager readonlyTransactionManager = new ReadonlyTransactionManager(web3j, addressOfMulticall);

    String value = readonlyTransactionManager.sendCall(addressOfMulticall, encodeFunctionDataOfMulticall, DefaultBlockParameterName.PENDING);

The code is as above, and the returned data is:

0x0000000000000000000000000000000000000000000000000000000000f40b460000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000035449500000000000000000000000000000000000000000000000000000000000

How can I parse this data? I only know that the first 66 bits are blocknumber, but how can I parse the remaining parameters?

fastener avatar Mar 12 '22 12:03 fastener

You'll need to use FunctionReturnDecoder to decode the returned data.

FunctionReturnDecoder.decode(data, aggregateFunction.outputParameters)

anthony-hermet avatar Aug 10 '22 08:08 anthony-hermet