Восстановите структуру/список структур в виде представлений из смарт — контракта

#elrond

#элронд

Вопрос:

Я пытаюсь получить данные одной структуры и данные списка этой структуры в методах просмотра в смарт-контракте. Структура будет выглядеть примерно так:

 #[derive(NestedEncode, NestedDecode, TopEncode, TopDecode, TypeAbi, Clone)] pub struct Streamlt;M: ManagedTypeApigt; {  pub id: u64,  pub payment: BigUintlt;Mgt;,  pub enddate: u64,  pub receiver: ManagedAddresslt;Mgt;, }  

Один вид был бы похож на:

 #[view(getStream)] fn get_stream(amp;self, id: u64) -gt; Streamlt;Self::Apigt; {  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,  } }  

в тестах мандоса я ожидал бы чего-то вроде:

 "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 , ManagedMultiResultVec или MultiResult с ManagedVec в целом. Но, похоже, все это дает мне такой результат.

Я также не смог выяснить, как я могу получить и декодировать такой результат в DApp в машинописном виде с помощью библиотеки erdjs.

Может ли кто-нибудь сказать мне, что я пропустил?

Ответ №1:

В мандосе вы должны ожидать этого как вне:

 ["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());  

Оттуда вы сможете понять, как преобразовать результат.

Комментарии:

1. сработало лике обаяние. ты герой 🙂