web3j icon indicating copy to clipboard operation
web3j copied to clipboard

Two-dimensional array problem???

Open EthanOK opened this issue 1 year ago • 4 comments

Issue_title

use mvn web3j:generate-sources get java code, Two-dimensional array problem???

Issue_description

1D and 2D arrays generate the same code parameters, which I think might be incorrect?

    function setOrders(Order[] calldata) external {}
    function setOrderss(Order[][] calldata) external {}

Issue_context

solidity code

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract TestArray {
    struct Order {
        address from;
        address to;
    }

    function setOrder(Order calldata) external {}

    function setOrders(Order[] calldata) external {}

    function setOrderss(Order[][] calldata) external {}

    // function get(uint256[][] calldata) external {}
}

use mvn web3j:generate-sources get java code

    public RemoteFunctionCall<TransactionReceipt> setOrder(Order param0) {
        final Function function = new Function(
                FUNC_SETORDER, 
                Arrays.<Type>asList(param0), 
                Collections.<TypeReference<?>>emptyList());
        return executeRemoteCallTransaction(function);
    }

    public RemoteFunctionCall<TransactionReceipt> setOrders(List<Order> param0) {
        final Function function = new Function(
                FUNC_SETORDERS, 
                Arrays.<Type>asList(new org.web3j.abi.datatypes.DynamicArray<Order>(Order.class, param0)), 
                Collections.<TypeReference<?>>emptyList());
        return executeRemoteCallTransaction(function);
    }

    public RemoteFunctionCall<TransactionReceipt> setOrderss(List<Order> param0) {
        final Function function = new Function(
                FUNC_SETORDERSS, 
                Arrays.<Type>asList(new org.web3j.abi.datatypes.DynamicArray<Order>(Order.class, param0)), 
                Collections.<TypeReference<?>>emptyList());
        return executeRemoteCallTransaction(function);
    }

my system cofig:

windows 10, solidity 0.8.17, web3j 4.10.0

EthanOK avatar Jun 02 '23 01:06 EthanOK

public RemoteFunctionCall<TransactionReceipt> setOrderss(List<List<Order>> param0) {
  // code
}

How should I write this code???

EthanOK avatar Jun 02 '23 03:06 EthanOK

I'm not a developer for this project, but looks like the problem you discovered has to do with Java's type erasure, therefore a fix might take a bit. Until then your best bet is probably using setOrders(List<Order> param0) in a loop

andras-ballai avatar Jun 05 '23 12:06 andras-ballai

@andras-ballai @NickSneo hi brother, When the problem can be fixed?

qfengthree avatar Mar 13 '24 02:03 qfengthree

The current getTypeAsString for DynamicArray only supports DynamicStruct as a nested type. I just created another class extending DynamicArray and overrode it so it also supported DynamicArray as a nested type, which worked for me.

override fun getTypeAsString(): String {
        val type = if (value.isEmpty()) {
            if (StructType::class.java.isAssignableFrom(this.componentType)) {
                Utils.getStructType(this.componentType)
            } else {
                AbiTypes.getTypeAString(this.componentType)
            }
        } else if (StructType::class.java.isAssignableFrom((value[0] as Type<*>).javaClass) || (DynamicArray::class.java.isAssignableFrom((value[0] as Type<*>).javaClass))) {
            (value[0] as Type<*>).typeAsString
        } else {
            AbiTypes.getTypeAString(this.componentType)
        }

        return "$type[]"
    }

kxl4126 avatar Aug 02 '24 19:08 kxl4126