2

我试图在智能合约的视图方法中获取单个结构的数据和该结构列表的数据。该结构将类似于:

#[derive(NestedEncode, NestedDecode, TopEncode, TopDecode, TypeAbi, Clone)]
pub struct Stream<M: ManagedTypeApi> {
    pub id: u64,
    pub payment: BigUint<M>,
    pub enddate: u64,
    pub receiver: ManagedAddress<M>,
}

单个视图如下:

#[view(getStream)]
fn get_stream(&self, id: u64) -> Stream<Self::Api> {
    let payment = self.payment( id.clone() ).get().clone();
    let enddate = self.enddate( id.clone() ).get().clone();
    let receiver = self.receiver( id.clone() ).get().clone();
    Stream {
        id,
        payment,
        enddate,
        receiver,
    }
}

在 mandos 测试中,我期望类似:

"expect": {
    "out": [
        "u64:1",
        "100,000,000,000",
        "u64:200,000",
        "address:my_address"
    ]
],

但在测试中我总是得到一个未编码的字节结果,如:

Want: ["u64:1", "100,000,000,000", "u64:200,000", "address:my_address"]. Have: [0x000000000000000100000005174876e8000000000000030d406d795f616464726573735f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f]

我还尝试了不同的返回类型,例如ManagedMultiResultVec,ManagedMultiResultVecMultiResultwith ManagedVec。但似乎都为我产生了这个输出。

我也找不到如何使用 erdjs lib 在 TypeScript 中的 dApp 中检索和解码这样的结果。

有人可以告诉我我错过了什么吗?

4

1 回答 1

2

在 mandos 中,您应该期望这样:

["u64:1|biguint:100,000,000,000|u64:200,000|address:my_address"]

或者

{
"0id": "u64:1",
"1payment": "biguint:100,000,000,000",
"2enddate": "u64:200,000",
"3receiver": "address:my_address"
}

我觉得应该是对的。

在 Dapp 中,您需要合约的 ABI 文件,并且需要执行以下操作:

const result = ...; // do transaction here

const abi = await SmartContractAbi.fromAbiPath('...abi.json');

result.setEndpointDefinition(abi.getEndpoint('get_stream'));

console.log(result.unpackOutput());

从那里你可以弄清楚如何转换结果。

于 2021-12-11T08:26:11.500 回答