The view functions returning simple structs (e.g., containing u32 and ManagedBuffer) serialize correctly and return the expected data (e.g., 0000002a0000000474657374
). However, functions returning MultiValueEncoded<MultiValue2<u32, ManagedBuffer>>
fail to serialize properly, returning inconsistent or incomplete data (e.g., 01 instead of the expected list of tuples like [(1, "first"), (2, "second")]
).
Is this a known serialization issue with complex types in the Klever SC runtime or testnet node?
ContractAddress:
klv1qqqqqqqqqqqqqpgqc9elepdc0sdeh6lxt6ts5p05408v4lq964fsle5xx0
getSimpleData → Simple Struct → works
curl -X POST https://node.testnet.klever.finance/vm/hex \
-H "Content-Type: application/json" \
-d '{"scAddress": "klv1qqqqqqqqqqqqqpgqc9elepdc0sdeh6lxt6ts5p05408v4lq964fsle5xx0", "funcName": "getSimpleData", "args": []}'
Result:
{"data":{"data":"0000002a0000000474657374"},"error":"","code":"successful"}
getSimpleData → ManagedBuffer → works
curl -X POST https://node.testnet.klever.finance/vm/hex \
-H "Content-Type: application/json" \
-d '{"scAddress": "klv1qqqqqqqqqqqqqpgqc9elepdc0sdeh6lxt6ts5p05408v4lq964fsle5xx0", "funcName": "getRawData", "args": []}'
result: {"data":{"data":"7374617469632064617461"},"error":"","code":"successful"}
getSimpleData → MultiValueEncoded → don´t work
curl -X POST https://node.testnet.klever.finance/vm/hex \
-H "Content-Type: application/json" \
-d '{"scAddress": "klv1qqqqqqqqqqqqqpgqc9elepdc0sdeh6lxt6ts5p05408v4lq964fsle5xx0", "funcName": "getListData", "args": []}'
Result:
{"data":{"data":"01"},"error":"","code":"successful"}
Expected Result:
{"data":{"data":"000000020000000100000005666972737400000002000000067365636f6e64"},"error":"","code":"successful"}
The Contract-Code for testing:
#![no_std]
klever_sc::imports!();
klever_sc::derive_imports!();
use klever_sc::types::{ManagedBuffer, MultiValueEncoded};
#[klever_sc::contract]
pub trait TestContract {
#[init]
fn init(&self) {}
// Einfacher Struct, der funktioniert
#[view(getSimpleData)]
fn get_simple_data(&self) -> SimpleData<Self::Api> {
SimpleData {
number: 42,
text: ManagedBuffer::new_from_bytes(b"test"),
}
}
// ManagedBuffer, der funktioniert
#[view(getRawData)]
fn get_raw_data(&self) -> ManagedBuffer<Self::Api> {
ManagedBuffer::new_from_bytes(b"static data")
}
// MultiValueEncoded, das nicht funktioniert
#[view(getListData)]
fn get_list_data(&self) -> MultiValueEncoded<Self::Api, MultiValue2<u32, ManagedBuffer<Self::Api>>> {
let mut result = MultiValueEncoded::new();
result.push(MultiValue2((1, ManagedBuffer::new_from_bytes(b"first"))));
result.push(MultiValue2((2, ManagedBuffer::new_from_bytes(b"second"))));
result
}
}
#[derive(TopEncode, TopDecode, TypeAbi)]
pub struct SimpleData<M: ManagedTypeApi> {
pub number: u32,
pub text: ManagedBuffer<M>,
}