如何使用结构作为参数为 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"]
]
]
我正在尝试创建一个允许同时发送多个元素的 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"]
]
]