Skip to content

ABI utilities used for generating Rust SDK cross-contract calls

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT
Notifications You must be signed in to change notification settings

near/near-sdk-abi

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.

About

ABI utilities used for generating Rust SDK cross-contract calls

Resources

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT

Code of conduct

Security policy

Stars

Watchers

Forks

Packages

No packages published

Languages