near-sdk-abi-impl

Crates.ionear-sdk-abi-impl
lib.rsnear-sdk-abi-impl
version0.1.0
sourcesrc
created_at2023-01-16 10:29:37.007641
updated_at2023-01-16 10:29:37.007641
descriptionUtility library for making typesafe cross-contract calls in NEAR SDK smart contracts.
homepage
repositoryhttps://github.com/near/near-sdk-abi
max_upload_size
id760078
size9,103
(nearprotocol-ci)

documentation

README

near-sdk-abi

Utility library for making typesafe cross-contract calls with near-sdk-rs smart contracts

Github CI Build Crates.io version Downloads

Release notes

Release notes and unreleased changes can be found in the CHANGELOG

Usage

This crate supports two sets of APIs for users with different needs:

  • Macro-driven. Gives you a cross-contract binding in a single macro invocation.
  • Generation-based. Gives you more control and is transparent about what code you end up using, but requires more setup.

Macro API

Checkout the delegator-macro example for a standalone smart contract using macro API to make a cross-contract call.

To generate a trait named ContractName with ext interface named ext_name based on ABI located at path/to/abi.json (relative to the current file's directory):

near_abi_ext! { mod ext_name trait ContractName for "path/to/abi.json" }

Now, assuming you have an ext_account_id: near_sdk::AccountId representing the contract account id, you can make a cross-contract call like this:

let promise = ext_adder::ext(ext_account_id).my_method_name(arg1, arg2);

Generation API

Checkout the delegator-generation example for a standalone project using generation API to make a cross-contract call.

First, we need our package to have a build.rs file that runs the generation step. The following snippet will generate the contract trait in abi.rs under path/to/out/dir:

fn main() -> anyhow::Result<()> {
    near_sdk_abi::Generator::new("path/to/out/dir".into())
        .file(near_sdk_abi::AbiFile::new("path/to/abi.json"))
        .generate()?;
    Ok(())
}

The resulting file, however, is not included in your source set by itself. You have to include it manually; the recommended way is to create a mod with a custom path:

#[path = "path/to/out/dir/abi.rs"]
mod mymod;

Now, assuming you have an ext_account_id: near_sdk::AccountId representing the contract account id, you can make a cross-contract call like this:

let promise = ext_adder::ext(ext_account_id).my_method_name(arg1, arg2);

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as below, without any additional terms or conditions.

License

Licensed under either of

at your option.

Commit count: 8

cargo fmt