当前位置: 首页 > 知识库问答 >
问题:

如何调用返回元组的函数[]

轩辕乐邦
2023-03-14

相对来说,我是一个与Java智能合约交互的新手,在尝试检索智能合约函数返回的tuple[]时遇到了一个问题。这是我想调用的函数的ABI定义:

{
  "inputs":[{"internalType":"address","name":"account","type":"address"}],
  "name":"claimableRewards",
  "outputs":
    [{"components":
      [
        {"internalType":"address","name":"token","type":"address"},
        {"internalType":"uint256","name":"amount","type":"uint256"}
      ],
      "internalType":"struct MultiFeeDistribution.RewardData[]",
      "name":"rewards",
      "type":"tuple[]"
    }],
  "stateMutability":"view",
  "type":"function"
}

以下是智能合约代码的链接:https://polygonscan . com/address/0x 920 f 22 E1 e 5 da 04504 b 765 f 8110 ab 96 a 20 e 6408 BD # code

下面是我编写的调用该函数的Java代码(为了使代码更容易阅读,我删除了错误检查):

List<Type> claimableRewardsParams = Arrays.<Type>asList(new Address(credentials.getAddress()));
List<TypeReference<?>> claimableRewardsReturnTypes = Arrays.<TypeReference<?>>asList(new TypeReference<DynamicArray<DynamicStruct>>() {});

final Function claimableRewardsFunction = new Function(
        "claimableRewards",
        claimableRewardsParams,
        claimableRewardsReturnTypes);

String claimableRewardsEncodedFunction = FunctionEncoder
        .encode(claimableRewardsFunction);          

EthCall claimableRewardsResponse = web3.ethCall(
        Transaction.createEthCallTransaction(walletAddress, adamantRewardsContractAddress, claimableRewardsEncodedFunction),
        DefaultBlockParameterName.LATEST)
        .sendAsync().get();

List<Type> claimableRewardsSomeTypes = FunctionReturnDecoder.decode(
        claimableRewardsResponse.getValue(), claimableRewardsFunction.getOutputParameters());

当我运行程序时,我得到以下异常:

线程“main”java.lang.RuntimeException中的异常:TypeReferenced结构必须包含具有扩展类型的类型的构造函数

我已经尝试了其他几个可声明的奖励返回类型的定义,但我无法让它工作。有人能帮我吗?

共有2个答案

牟辰龙
2023-03-14
    {
  "inputs":[{"internalType":"address","name":"account","type":"address"}],
  "name":"claimableRewards",
  "outputs":
    [{"components":
      [
        {"internalType":"address","name":"token","type":"address"},
        {"internalType":"uint256[]","name":"amount","type":"uint256[]"}
      ],
      "internalType":"struct MultiFeeDistribution.RewardData[]",
      "name":"rewards",
      "type":"tuple[]"
    }],
  "stateMutability":"view",
  "type":"function"
}
狄望
2023-03-14

您需要定义一个扩展DynamicStruct的类

public class RewardData extends DynamicStruct {
    public RewardData(Address token, Uint256 amount) {
        super(new Type[]{token, amount});
    }
}

然后将DynamicSTRt替换为RewardData

List<TypeReference<?>> claimableRewardsReturnTypes = Arrays.<TypeReference<?>>asList(new TypeReference<DynamicArray<RewardData>>() {});
 类似资料:
  • 我找到了一些很好的SO链接(如何从异步回调函数返回值?以及从node.js中的回调函数返回值等),但它们并不是不能为我的问题提供解决方案。 我的问题:能够得到异步调用的结果,但我如何使用这个结果返回我的函数? 这里获取callBackResponse的值为true或false,并希望将该值用作:

  • 我一直在找这样的东西,但我找不到,所以就来了。 一些背景 我使用opencv从视频文件中检索帧。通常人们会无休止地循环这样做: 或 现在我想检索所有帧并在没有更多帧时退出循环。然而,我在python中的技能还不够强,无法做我想做的事情。 我想知道的是 函数(或方法,我不知道它们在python中是如何调用的)返回一个元组:首先代表操作成功,其次代表返回的帧。当元组的第一个元素为false时,我想打破

  • 问题内容: 我正在使用Postgresql 8.3,并具有以下简单功能,该功能会将a返回 给客户端 现在,我可以使用以下SQL命令来调用此函数并操纵返回的游标,但是游标名称是由PostgreSQL自动生成的 此外,如38.7.3.5中所述,显式地将游标名称声明为函数的输入参数 。返回游标。我可以声明自己的游标名称并使用此游标名称来操纵返回的游标,而不是为我自动生成的Postgresql吗?如果不是

  • 问题内容: 我如何使这个小功能“ imageExists”返回ajax请求是否成功? 问题答案: 我相信您将必须使用同步模式并使用单独的变量来存储返回值。

  • 问题内容: 我正在寻找一种更好的解决方案,以使用jQuery进行AJAX调用,使PHP文件返回一个数组,并将其作为Javascript数组从客户端发布。这是我一直在做的事情: PHP文件(Example.php): JS档案: 我目前的方法对我的口味来说有点太复杂了。 我想做的就是能够 在PHP方面,并在AJAX调用后将其直接转换为Javascript数组。 想法,有人吗? 问题答案: 使用JSO

  • 问题内容: 我想返回数组的奇数,但是Eclipse似乎不接受我的返回码。我认为这需要返回整个数组,因为我将数组设置为方法的参数。如前所述,我需要传递一个数组并获取该数组的特定元素作为回报。即使我将该数组设为静态,如何返回单个元素? 编辑:好吧,这里是: 我知道这里可能存在多个错误,但我正在努力,不仅要返回奇数,还要将它们加在一起。 问题答案: 您的代码应如下所示: 这里的要点是方法返回类型,它应该