分享个代码示例,用java接收合约返回的多个参数,摘自宝葫芦读取1155
这是用java调合约的程序员们大概率都会遇到的一个问题
@Override
public Pair<BigInteger[], BigInteger[]> pledgedERC1155(String address, int pid) {
CFXBlockChain bc = Lookup.getDefault().lookup(CFXBlockChain.class);
Cfx cfx = bc.getCfx();
ContractCall contract = new ContractCall(cfx, new Address(CONTRACT));
// passing method name and parameter to `contract.call`
// note: parameters should use web3j.abi.datatypes type
String value = contract.call("接口名称", new org.web3j.abi.datatypes.Uint(BigInteger.valueOf(pid)), new Address(address).getABIAddress()).sendAndGet();
return decodepLedgedERC1155(value);
}
/**
* 返回值是两个动态数组,第一个是tokenId列表,第二个是数量列表
* @param encoded
* @return
*/
private Pair<BigInteger[], BigInteger[]> decodepLedgedERC1155(String encoded) {
encoded = Numeric.cleanHexPrefix(encoded);
TupleDecoder decoder = new TupleDecoder(encoded);
decoder.nextUint256(); // 跳过offset0
decoder.nextUint256(); // 跳过offset1
// 第一个动态数组
int length = decoder.nextUint256().intValueExact();
BigInteger[] value0 = new BigInteger[length];
for(int i=0; i<length; i++) {
value0[i] = decoder.nextUint256();
System.out.println("value0[" + i + "]" + value0[i].toString());
}
// 第二个动态数组
length = decoder.nextUint256().intValueExact();
BigInteger[] value1 = new BigInteger[length];
for(int i=0; i<length; i++) {
value1[i] = decoder.nextUint256();
System.out.println("value1[" + i + "]" + value1[i].toString());
}
return new Pair<>(value0, value1);
}