Skip to content

Commit

Permalink
resolves a bullet in #1256 about examples/adder
Browse files Browse the repository at this point in the history
  • Loading branch information
dj8yf0μl committed Mar 3, 2025
1 parent 7fe8625 commit bd7a8c8
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 60 deletions.
94 changes: 36 additions & 58 deletions examples/adder/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,47 +1,45 @@
use near_sdk::near;
use near_sdk::{env, near, Promise};

#[derive(Debug, PartialEq, Eq)]
#[near(serializers=[borsh, json])]
pub struct Pair(u32, u32);

#[near(serializers=[borsh, json])]
pub struct DoublePair {
first: Pair,
second: Pair,
}

#[derive(Default)]
#[near(serializers=[borsh, json], contract_state)]
pub struct Adder {}

#[near]
impl Adder {
/// Call functions a, b, and c, d, asynchronously and handle results with `add_callback_vec`.
pub fn call_all() -> Promise {
Self::ext(env::current_account_id())
.a()
.and(Self::ext(env::current_account_id()).b())
.and(Self::ext(env::current_account_id()).c())
.and(Self::ext(env::current_account_id()).d())
.then(Self::ext(env::current_account_id()).add_callback_vec())
}

/// Adds two pairs point-wise.
pub fn add(&self, a: Pair, b: Pair) -> Pair {
sum_pair(&a, &b)
pub fn a(&self) -> Pair {
Pair(1, 1)
}

#[result_serializer(borsh)]
pub fn add_borsh(&self, #[serializer(borsh)] a: Pair, #[serializer(borsh)] b: Pair) -> Pair {
sum_pair(&a, &b)
pub fn b(&self) -> Pair {
Pair(2, 3)
}

pub fn add_callback(
&self,
#[callback_unwrap] a: DoublePair,
#[callback_unwrap] b: DoublePair,
) -> DoublePair {
Some(b).iter().fold(a, |acc, el| DoublePair {
first: sum_pair(&acc.first, &el.first),
second: sum_pair(&acc.second, &el.second),
})
pub fn c(&self) -> Pair {
Pair(5, 8)
}

pub fn add_callback_vec(&self, #[callback_vec] elements: Vec<DoublePair>) -> DoublePair {
let start = DoublePair { first: Pair(0, 0), second: Pair(0, 0) };
elements.iter().fold(start, |acc, el| DoublePair {
first: sum_pair(&acc.first, &el.first),
second: sum_pair(&acc.second, &el.second),
})
pub fn d(&self) -> Pair {
Pair(13, 21)
}

pub fn add_callback_vec(&self, #[callback_vec] elements: Vec<Pair>) -> Pair {
let start = Pair(0, 0);
elements.iter().fold(start, |acc, el| sum_pair(&acc, &el))
}
}

Expand All @@ -51,44 +49,24 @@ fn sum_pair(a: &Pair, b: &Pair) -> Pair {

#[cfg(all(test, not(target_arch = "wasm32")))]
mod tests {
use near_abi::*;
use near_sdk::serde_json;
use crate::Pair;

#[tokio::test]
async fn embedded_abi_test() -> anyhow::Result<()> {
async fn test_add_callback_vec() -> anyhow::Result<()> {
let wasm = near_workspaces::compile_project("./").await?;
let worker = near_workspaces::sandbox().await?;
let contract = worker.dev_deploy(&wasm).await?;

let res = contract.view("__contract_abi").await?;

let abi_root = serde_json::from_slice::<AbiRoot>(&zstd::decode_all(&res.result[..])?)?;

assert_eq!(abi_root.schema_version, "0.4.0");
assert_eq!(abi_root.metadata.name, Some("adder".to_string()));
// assert_eq!(abi_root.metadata.version, Some("0.1.0".to_string()));
// assert_eq!(
// &abi_root.metadata.authors[..],
// &["Near Inc <hello@nearprotocol.com>"]
// );
// assert_eq!(abi_root.body.functions.len(), 3);

// let add_function = &abi_root.body.functions[0];
let res = contract
.call("call_all")
.args_json(())
.gas(near_sdk::Gas::from_tgas(300))
.transact()
.await?;
println!("res: {:#?}", res);

// assert_eq!(add_function.name, "add");
// assert_eq!(add_function.doc, Some(" Adds two pairs point-wise.".to_string()));
// assert_eq!(add_function.kind, AbiFunctionKind::View);
// assert_eq!(add_function.modifiers, &[]);
// match &add_function.params {
// AbiParameters::Json { args } => {
// assert_eq!(args.len(), 2);
// assert_eq!(args[0].name, "a");
// assert_eq!(args[1].name, "b");
// }
// AbiParameters::Borsh { .. } => {
// assert!(false);
// }
// }
let result = res.json::<Pair>()?;
assert_eq!(result, Pair(21, 33));

Ok(())
}
Expand Down
2 changes: 0 additions & 2 deletions near-sdk/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -449,8 +449,6 @@ extern crate quickcheck;
///
/// - `Cross-Contract Factorial` again [examples/cross-contract-calls](https://github.com/near/near-sdk-rs/tree/master/examples/cross-contract-calls/high-level/src/lib.rs?plain=1#L26)
/// - same example as [above](near#example-with-cross-contract-factorial), but uses [`Promise::then`] instead of [`env`](mod@env) host functions calls to set up a callback of `factorial_mult`
/// - [examples/adder](https://github.com/near/near-sdk-rs/tree/master/examples/adder/src/lib.rs?plain=1#L30)
/// - [examples/adder](https://github.com/near/near-sdk-rs/tree/master/examples/adder/src/lib.rs?plain=1#L31)
/// - [examples/callback-results](https://github.com/near/near-sdk-rs/tree/master/examples/callback-results/src/lib.rs?plain=1#L51)
///
/// ### Implementation details of `#[callback_unwrap]` macro and **host functions** calls used
Expand Down

0 comments on commit bd7a8c8

Please sign in to comment.