[英]how to reference Web3j array type in java or kotlin
如何從 web3j 庫中引用數組類型? 我有一個合約函數,它返回訪問合約的人的地址數組。 我想將這些作為數組放入 java/kotlin 項目中。 這是代碼 -
//gets an array of addresses from the contract
fun getAddressValues(): RemoteCall<Array<Address>> {
val function = Function(
functionGetAddressValues,
listOf(),
listOf<TypeReference<*>>(object : TypeReference<Array<Address>>() {})
)
// TODO: NOTE - THIS ARRAY IS FROM THE WEB3J LIBRARY "org.web3j.abi.datatypes.Array"
return executeRemoteCallSingleValueReturn(function, Array<Address>().javaClass) // TODO: error
}
executeRemoteCallSingleValueReturn(function, Array<Address>().javaClass) // TODO: error
Array<Address>().javaClass
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract VotingContract {
address[] addressStorage;
uint256 partyOneVotes;
uint256 partyTwoVotes;
uint256 partyThreeVotes;
constructor() {
partyOneVotes = 0;
partyTwoVotes = 0;
partyThreeVotes = 0;
}
function registerVote(uint256 num) public {
require(
num < 4 && num > 0,
"the given number is invalid as the number is out of range"
);
bool a = false;
address messageSender = msg.sender;
uint256 i;
for (i = 0; i < addressStorage.length; i++) {
if (messageSender == addressStorage[i]) {
a = false;
//set to true to block multiple entries.
}
}
require(a == false, "Your vote has already been registered");
addressStorage.push(messageSender);
if (num == 1) {
partyOneVotes++;
} else if (num == 2) {
partyTwoVotes++;
} else {
partyThreeVotes++;
}
}
function getAddressValues() public view returns (address[] memory) {
return addressStorage;
}
function getPartyOneVotes() public view returns (uint256) {
return partyOneVotes;
}
function getPartyTwoVotes() public view returns (uint256) {
return partyTwoVotes;
}
function getPartyThreeVotes() public view returns (uint256) {
return partyThreeVotes;
}
}
function getAddressValues() public view returns (address[] memory) {
return addressStorage;
}
也許您為數組使用了錯誤的類型。 我使用 DynamicArray 而不是 Array。
這種和平的代碼調用一個帶有參數地址的函數並返回一個 DynamicArray。 DynamicArray 的值顯示在控制台上:
val function = org.web3j.abi.datatypes.Function("getTokensFromOwner",
inputParameters,
Arrays.asList<TypeReference<*>>(object: TypeReference<org.web3j.abi.datatypes.DynamicArray<Uint256>>() {}))
val encodedFunction = FunctionEncoder.encode(function)
val transaction = Transaction.createEthCallTransaction("0xD8e5D841C0db4c4b95fa9fCEc48936F51Aeeaed8", "0x6Ac98A430D17ef564091bA470785f1389d0b9371", encodedFunction)
val response: EthCall = web3j.ethCall(transaction, DefaultBlockParameter.valueOf("latest")).sendAsync().get() // get the result of the smartcontract
val value = response.value
val someTypes = FunctionReturnDecoder.decode(value, function.outputParameters)
var tokens: DynamicArray<Uint256> = DynamicArray((someTypes.get(0).value as ArrayList<Uint256>).toList())
for (token: Uint256 in tokens.value)
{
Log.v("token ", token.value.toString())
}
智能合約功能:
function getTokensFromOwner(address owner) external view returns (uint256[] memory)
{
uint256 nbTokens = balanceOf(owner);
uint256[] memory tokensId = new uint256[](nbTokens);
for (uint256 i=0; i< nbTokens;i++)
{
tokensId[i] = (tokenOfOwnerByIndex(owner, i));
}
return tokensId;
}
我希望這個例子對你有幫助:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.