Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions contracts/feature-tests/basic-features/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,15 @@ barnard = ["multiversx-sc/barnard"]
version = "0.60.0"
path = "../../../framework/base"

[dependencies.serde]
version = "1.0"
default-features = false
features = ["derive"]

[dependencies.serde_json]
version = "1.0"
default-features = false

[dev-dependencies.multiversx-sc-scenario]
version = "0.60.0"
features = ["wasmer-experimental"]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ pub mod managed_decimal_features;
pub mod managed_map_features;
pub mod managed_vec_features;
pub mod non_zero_features;
pub mod serde_features;
pub mod small_num_overflow_test_ops;
pub mod special_roles_from_system_account;
pub mod storage_direct_load;
Expand Down Expand Up @@ -62,6 +63,7 @@ pub trait BasicFeatures:
+ managed_address_features::ManagedAddressFeatures
+ managed_buffer_features::ManagedBufferFeatures
+ managed_vec_features::ManagedVecFeatures
+ serde_features::SerdeFeatures
+ storage_raw_api_features::StorageRawApiFeatures
+ storage_direct_load::StorageLoadFeatures
+ storage_direct_store::StorageStoreFeatures
Expand Down
36 changes: 36 additions & 0 deletions contracts/feature-tests/basic-features/src/serde_features.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
use serde::{Deserialize, Serialize};

multiversx_sc::imports!();

multiversx_sc::derive_imports!();

#[type_abi]
#[derive(
NestedEncode,
NestedDecode,
TopEncode,
TopDecode,
PartialEq,
Eq,
Debug,
Clone,
Serialize,
Deserialize,
)]
pub struct StructManaged<M: ManagedTypeApi> {
pub m_buffer: ManagedBuffer<M>,
pub m_vec_of_m_buffers: ManagedVec<M, ManagedBuffer<M>>,
}

#[multiversx_sc::module]
pub trait SerdeFeatures {
#[endpoint]
fn managed_serialize(&self, json: ManagedBuffer) -> StructManaged<Self::Api> {
todo!();
}

#[endpoint]
fn managed_deserialize(&self, m_struct: StructManaged<Self::Api>) -> ManagedBuffer {
todo!();
}
}
17 changes: 15 additions & 2 deletions framework/base/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,23 @@ version = "0.60.0"
edition = "2021"
rust-version = "1.83"

authors = ["Andrei Marinica <[email protected]>", "MultiversX <[email protected]>"]
authors = [
"Andrei Marinica <[email protected]>",
"MultiversX <[email protected]>",
]
license = "GPL-3.0-only"
readme = "README.md"
repository = "https://github.com/multiversx/mx-sdk-rs"
homepage = "https://multiversx.com/"
documentation = "https://docs.multiversx.com/"
description = "MultiversX smart contract API"
keywords = ["multiversx", "wasm", "webassembly", "blockchain", "contract"]
categories = ["no-std", "wasm", "cryptography::cryptocurrencies", "development-tools"]
categories = [
"no-std",
"wasm",
"cryptography::cryptocurrencies",
"development-tools",
]

[package.metadata.docs.rs]
all-features = true
Expand All @@ -26,6 +34,11 @@ esdt-token-payment-legacy-decode = []
barnard = []

[dependencies]
serde = { version = "1.0", default-features = false, features = [
"derive",
"alloc",
] }
postcard = { version = "1.0", default-features = false }
hex-literal = "1.0"
bitflags = "2.9"
num-traits = { version = "=0.2.19", default-features = false }
Expand Down
2 changes: 2 additions & 0 deletions framework/base/src/types/managed.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
mod basic;
mod codec_util;
mod managed_serde;
mod managed_type_trait;
mod multi_value;
mod wrapped;

pub use basic::*;
pub use codec_util::*;
pub use managed_serde::*;
pub use managed_type_trait::ManagedType;
pub use multi_value::*;
pub use wrapped::*;
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
use postcard::from_bytes;
use serde::de::DeserializeOwned;

use crate::{api::ManagedTypeApi, types::ManagedBuffer};

pub fn from_managed_buffer<M: ManagedTypeApi, T: DeserializeOwned>(
mb: &ManagedBuffer<M>,
) -> Result<T, postcard::Error> {
mb.with_buffer_contents(|slice| from_bytes(slice))
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
use crate::{api::ManagedTypeApi, types::ManagedVec};
use postcard::from_bytes;
use serde::de::DeserializeOwned;

pub fn from_managed_vec<M: ManagedTypeApi, T: DeserializeOwned>(
mv: &ManagedVec<M, u8>,
) -> Result<T, postcard::Error> {
mv.with_self_as_slice(|mv_slice| from_bytes(mv_slice))

Check failure on line 8 in framework/base/src/types/managed/managed_serde/from_managed_vec.rs

View workflow job for this annotation

GitHub Actions / Template tool test - current (unreleased) templates

method `with_self_as_slice` is private

Check failure on line 8 in framework/base/src/types/managed/managed_serde/from_managed_vec.rs

View workflow job for this annotation

GitHub Actions / Gas test (experimental wasmer)

method `with_self_as_slice` is private

Check failure on line 8 in framework/base/src/types/managed/managed_serde/from_managed_vec.rs

View workflow job for this annotation

GitHub Actions / Proxy compare - newly generated vs present in file tree

method `with_self_as_slice` is private

Check failure on line 8 in framework/base/src/types/managed/managed_serde/from_managed_vec.rs

View workflow job for this annotation

GitHub Actions / Gas test (prod wasmer)

method `with_self_as_slice` is private

Check failure on line 8 in framework/base/src/types/managed/managed_serde/from_managed_vec.rs

View workflow job for this annotation

GitHub Actions / Template tool test - released templates

method `with_self_as_slice` is private

Check failure on line 8 in framework/base/src/types/managed/managed_serde/from_managed_vec.rs

View workflow job for this annotation

GitHub Actions / Build and test on Windows

method `with_self_as_slice` is private

Check failure on line 8 in framework/base/src/types/managed/managed_serde/from_managed_vec.rs

View workflow job for this annotation

GitHub Actions / Build and test on Windows

method `with_self_as_slice` is private

Check failure on line 8 in framework/base/src/types/managed/managed_serde/from_managed_vec.rs

View workflow job for this annotation

GitHub Actions / Build and test on Windows

method `with_self_as_slice` is private

Check failure on line 8 in framework/base/src/types/managed/managed_serde/from_managed_vec.rs

View workflow job for this annotation

GitHub Actions / Build and test on Windows

method `with_self_as_slice` is private

Check failure on line 8 in framework/base/src/types/managed/managed_serde/from_managed_vec.rs

View workflow job for this annotation

GitHub Actions / Plotter tests

method `with_self_as_slice` is private

Check failure on line 8 in framework/base/src/types/managed/managed_serde/from_managed_vec.rs

View workflow job for this annotation

GitHub Actions / Contracts / Wasm tests

method `with_self_as_slice` is private

Check failure on line 8 in framework/base/src/types/managed/managed_serde/from_managed_vec.rs

View workflow job for this annotation

GitHub Actions / Contracts / Test Coverage

method `with_self_as_slice` is private

Check failure on line 8 in framework/base/src/types/managed/managed_serde/from_managed_vec.rs

View workflow job for this annotation

GitHub Actions / Contracts / Rust tests

method `with_self_as_slice` is private

Check failure on line 8 in framework/base/src/types/managed/managed_serde/from_managed_vec.rs

View workflow job for this annotation

GitHub Actions / Contracts / Interactor tests

method `with_self_as_slice` is private

Check failure on line 8 in framework/base/src/types/managed/managed_serde/from_managed_vec.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] framework/base/src/types/managed/managed_serde/from_managed_vec.rs#L8

error[E0624]: method `with_self_as_slice` is private --> framework/base/src/types/managed/managed_serde/from_managed_vec.rs:8:8 | 8 | mv.with_self_as_slice(|mv_slice| from_bytes(mv_slice)) | ^^^^^^^^^^^^^^^^^^ private method | ::: framework/base/src/types/managed/wrapped/managed_vec.rs:354:5 | 354 | / fn with_self_as_slice<R, F>(&self, f: F) -> R 355 | | where 356 | | F: FnOnce(&[EncodedManagedVecItem<T>]) -> R, | |____________________________________________________- private method defined here
Raw output
framework/base/src/types/managed/managed_serde/from_managed_vec.rs:8:8:e:error[E0624]: method `with_self_as_slice` is private
   --> framework/base/src/types/managed/managed_serde/from_managed_vec.rs:8:8
    |
8   |       mv.with_self_as_slice(|mv_slice| from_bytes(mv_slice))
    |          ^^^^^^^^^^^^^^^^^^ private method
    |
   ::: framework/base/src/types/managed/wrapped/managed_vec.rs:354:5
    |
354 | /     fn with_self_as_slice<R, F>(&self, f: F) -> R
355 | |     where
356 | |         F: FnOnce(&[EncodedManagedVecItem<T>]) -> R,
    | |____________________________________________________- private method defined here


__END__

Check failure on line 8 in framework/base/src/types/managed/managed_serde/from_managed_vec.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] framework/base/src/types/managed/managed_serde/from_managed_vec.rs#L8

error[E0624]: method `with_self_as_slice` is private --> framework/base/src/types/managed/managed_serde/from_managed_vec.rs:8:8 | 8 | mv.with_self_as_slice(|mv_slice| from_bytes(mv_slice)) | ^^^^^^^^^^^^^^^^^^ private method | ::: framework/base/src/types/managed/wrapped/managed_vec.rs:354:5 | 354 | / fn with_self_as_slice<R, F>(&self, f: F) -> R 355 | | where 356 | | F: FnOnce(&[EncodedManagedVecItem<T>]) -> R, | |____________________________________________________- private method defined here
Raw output
framework/base/src/types/managed/managed_serde/from_managed_vec.rs:8:8:e:error[E0624]: method `with_self_as_slice` is private
   --> framework/base/src/types/managed/managed_serde/from_managed_vec.rs:8:8
    |
8   |       mv.with_self_as_slice(|mv_slice| from_bytes(mv_slice))
    |          ^^^^^^^^^^^^^^^^^^ private method
    |
   ::: framework/base/src/types/managed/wrapped/managed_vec.rs:354:5
    |
354 | /     fn with_self_as_slice<R, F>(&self, f: F) -> R
355 | |     where
356 | |         F: FnOnce(&[EncodedManagedVecItem<T>]) -> R,
    | |____________________________________________________- private method defined here


__END__
}
4 changes: 4 additions & 0 deletions framework/base/src/types/managed/managed_serde/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
pub mod from_managed_buffer;
pub mod from_managed_vec;
pub mod to_managed_buffer;
pub mod to_managed_vec;
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
use serde::Serialize;

use crate::{
api::ManagedTypeApi,
types::{to_managed_vec::to_managed_vec, ManagedBuffer},
};

struct ManagedBufferWriter<'a, M: ManagedTypeApi> {
buffer: &'a mut ManagedBuffer<M>,
}

pub fn to_managed_buffer<M: ManagedTypeApi, T: Serialize>(obj: &T) -> ManagedBuffer<M> {
let mv = to_managed_vec(obj);
mv.buffer
}
22 changes: 22 additions & 0 deletions framework/base/src/types/managed/managed_serde/to_managed_vec.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
use crate::types::ManagedVec;
use postcard::to_slice;
use serde::Serialize;

use crate::api::ManagedTypeApi;

pub fn to_managed_vec<M: ManagedTypeApi, T: Serialize>(obj: &T) -> ManagedVec<M, u8> {
let mut buffer: ManagedVec<M, u8> = ManagedVec::new();

const MAX: usize = 1024;
let mut temp = [0u8; MAX];

let len = to_slice(obj, &mut temp)
.expect("serialization failed")
.len();

for byte in &temp[..len] {
buffer.push(*byte);
}

buffer
}
Loading