web3j
web3j copied to clipboard
Two-dimensional array problem???
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
public RemoteFunctionCall<TransactionReceipt> setOrderss(List<List<Order>> param0) {
// code
}
How should I write this code???
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 @NickSneo hi brother, When the problem can be fixed?
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[]"
}