如何使用结构作为参数为 VarArgs MultiArg 端点参数配置 mados scCall 步骤?

How do you configure a mados scCall step for VarArgs MultiArg endpoint argument with a struct as argument?

我正在尝试创建一个允许同时发送多个元素的 elrond 智能合约,以减少将初始信息发送到合约的交易数量。

为此,我使用了一个端点,该端点将 MultiArg3 的 VarArgs 作为参数传入

#[allow(clippy::too_many_arguments)]
#[only_owner]
#[endpoint(createMultipleNft)]
fn create_multipl_nft(
    &self,
    #[var_args] args: VarArgs<MultiArg3<ManagedBuffer, ManagedBuffer, AttributesStruct<Self::Api>>>,
) ->SCResult<u64> { 
...
   Ok(0u64)
}

这是我的 AttributesStruct

#[derive(TypeAbi, NestedEncode, NestedDecode, TopEncode, TopDecode)]
pub struct AttributesStruct<M: ManagedTypeApi> {
    pub value1: ManagedBuffer<M>,
    pub value2: ManagedBuffer<M>,
}

这是我的 Mandos 步骤(其余步骤工作正常,它们都与我之前针对单个元素端点的实现一起使用)。

{
    "step": "scCall",
    "txId": "create-multiple-NFT-1",
    "tx": {
        "from": "address:owner",
        "to": "sc:minter",
        "function": "createMultipleNft",
        "arguments": [
                    ["str:NFT 1"],
                    ["str:www.mycoolnft.com/nft1.jpg"],
                    [
                        ["str:test1", "str:test2"]
                    ]
                ],
        "gasLimit": "20,000,000",
        "gasPrice": "0"
         },
    "expect": {
        "out": [
             "1", "1", "1"
        ],
        "status": "0",
        "message": "",
        "gas": "*",
        "refund": "*"
    }
}

我也试过这个参数:

"arguments": [
    ["str:NFT 1",
    "str:www.mycoolnft.com/nft1.jpg",
    ["str:test1", "str:test2"]
]

还有这个:

"arguments": [
    ["str:NFT 1",
    "str:www.mycoolnft.com/nft1.jpg",
    "str:test1", "str:test2"
]

还有这个:

"arguments": [
    ["str:NFT 1",
    "str:www.mycoolnft.com/nft1.jpg",
    { 
      "0-value1":"str:test1",
      "1-value2":"str:test2"
    }
]

这是错误信息:

FAIL: result code mismatch. Tx create-multiple-NFT-1. Want: 0. Have: 4 (user error). Message: argument decode error (args): input too short

同时,我在使用 ManagedBuffer 的结构的参数输入方面遇到了一些问题。我这样做有问题吗?我正在尝试为 NFT 创建一个参数结构,其中包含多个字符串条目,我可以将其作为参数发送给智能合约。

由于您使用的是结构,因此结构中的 ManagedBuffer 是嵌套编码的。这意味着您需要在它之前添加 ManagedBuffer 的长度。

幸运的是,使用 nested: 前缀有一个快捷方式。

所以你的论点应该是这样的:

"arguments": [
    ["str:NFT 1"],
    ["str:www.mycoolnft.com/nft1.jpg"],
    [
        ["nested:str:test1", "nested:str:test2"]
    ]
]