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

Folders and files

NameName
Last commit message
Last commit date
Mar 27, 2025
Jan 4, 2023
Jan 16, 2023
Jan 16, 2023
Jan 16, 2023
Dec 22, 2022
Aug 25, 2022
Jan 16, 2023
Jan 4, 2023
Aug 25, 2022
Aug 25, 2022
Jan 16, 2023

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.