从智能合约的角度检索 struct/list 个结构

Retreive a struct/list of structs as views from a smart contract

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

#[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]

我也尝试了不同的 return 类型,例如 ManagedMultiResultVecManagedMultiResultVecMultiResult,一般来说 ManagedVec。但是似乎所有人都为我产生了这个输出。

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

谁能告诉我我错过了什么?

在 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());

从那里您可以了解如何转换结果。