【代码分享】用java接收合约返回的多个参数

分享个代码示例,用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);
}