#generate #client #abi #near #macro #contract #smart

macro unc-abi-client-macros

Library to generate Rust clients for NEAR smart contracts

3 unstable releases

0.10.1 May 23, 2024
0.10.0 May 22, 2024
0.1.0 Mar 7, 2024

#134 in #smart


Used in 3 crates (via unc-abi-client)

MIT/Apache

6KB

unc-abi-client-rs

Library to generate Rust client code with workspaces-rs from ABI schemas on NEAR

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 client 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 project using macro API to get a client and use it.

To generate a struct named ClientName based on ABI located at path/to/abi.json (relative to the current file's directory):

mod mymod {
    unc_abi_client::generate!(ClientName for "path/to/abi.json");
}

Placing the macro invocation inside a mod section is optional, but helps reducing unexpected behaviors such as name clashes.

Now, assuming you have a contract: utility_workspaces::Contract deployed, you can make a call like this:

let contract = mymod::ClientName { contract };
let res = contract
    .my_method_name(arg1, arg2)
    .await?;

Generation API

Checkout the delegator-generation example for a standalone project using generation API to generate a client and use it.

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

fn main() -> anyhow::Result<()> {
    unc_abi_client::Generator::new("path/to/out/dir".into())
        .file("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 a contract: utility_workspaces::Contract deployed, you can make a call like this:

let contract = mymod::AbiClient { contract };
let res = contract
    .my_method_name(arg1, arg2)
    .await?;

Feel free to explore what other methods Generator has to customize the resulting code (e.g. client struct name).

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.

Dependencies

~5MB
~98K SLoC