From 60767d0d4f388c06a1cbf260e20b3e67f59a4803 Mon Sep 17 00:00:00 2001 From: Yasir Shariff Date: Fri, 8 Sep 2023 13:02:35 +0300 Subject: [PATCH 1/9] chore: add abi client examples --- .gitignore | 3 +- examples/Cargo.toml | 8 +++++ examples/build.rs | 6 ++++ examples/res/adder.json | 66 +++++++++++++++++++++++++++++++++++++++ examples/res/adder.wasm | Bin 0 -> 88582 bytes examples/src/view_abi.rs | 44 ++++++++++++++++++++++++++ workspaces/Cargo.toml | 1 + workspaces/src/lib.rs | 4 +++ 8 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 examples/build.rs create mode 100644 examples/res/adder.json create mode 100755 examples/res/adder.wasm create mode 100644 examples/src/view_abi.rs diff --git a/.gitignore b/.gitignore index ed88c2b2..e69209f0 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ target .vscode # generated files -.near-credentials \ No newline at end of file +.near-credentials +gen diff --git a/examples/Cargo.toml b/examples/Cargo.toml index 7c495e13..62c7bda8 100644 --- a/examples/Cargo.toml +++ b/examples/Cargo.toml @@ -18,6 +18,10 @@ tracing = "0.1" tracing-subscriber = { version = "0.3.5", features = ["env-filter"] } workspaces = { path = "../workspaces" } +[build-dependencies] +anyhow = "1.0" +workspaces = { path = "../workspaces" } + [[example]] name = "async_transaction" path = "src/async_transaction.rs" @@ -49,3 +53,7 @@ path = "src/croncat.rs" [[example]] name = "various_queries" path = "src/various_queries.rs" + +[[example]] +name = "view_abi" +path = "src/view_abi.rs" diff --git a/examples/build.rs b/examples/build.rs new file mode 100644 index 00000000..8e7b9e60 --- /dev/null +++ b/examples/build.rs @@ -0,0 +1,6 @@ +fn main() -> anyhow::Result<()> { + workspaces::near_abi_client::Generator::new("src/gen".into()) + .file("res/adder.json") + .generate()?; + Ok(()) +} diff --git a/examples/res/adder.json b/examples/res/adder.json new file mode 100644 index 00000000..1e768a1c --- /dev/null +++ b/examples/res/adder.json @@ -0,0 +1,66 @@ +{ + "schema_version": "0.3.0", + "metadata": { + "name": "abi", + "version": "0.1.0", + "authors": [ + "Near Inc " + ] + }, + "body": { + "functions": [ + { + "name": "add", + "doc": " Adds two pairs point-wise.", + "kind": "view", + "params": { + "serialization_type": "json", + "args": [ + { + "name": "a", + "type_schema": { + "$ref": "#/definitions/Pair" + } + }, + { + "name": "b", + "type_schema": { + "$ref": "#/definitions/Pair" + } + } + ] + }, + "result": { + "serialization_type": "json", + "type_schema": { + "$ref": "#/definitions/Pair" + } + } + } + ], + "root_schema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "String", + "type": "string", + "definitions": { + "Pair": { + "type": "array", + "items": [ + { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + ], + "maxItems": 2, + "minItems": 2 + } + } + } + } +} diff --git a/examples/res/adder.wasm b/examples/res/adder.wasm new file mode 100755 index 0000000000000000000000000000000000000000..936a36dcc7207a235436b7a34e6c8ff64718126b GIT binary patch literal 88582 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 anyhow::Result<()> { + let worker = workspaces::sandbox().await?; + let wasm = std::fs::read(ADDER_WASM_FILEPATH)?; + let contract = worker.dev_deploy(&wasm).await?; + + macro_run(contract.clone()).await?; + generation_run(contract).await?; + + Ok(()) +} + +/// This part of the example uses the Macro API to get a client and use it. +mod macro_adder { + workspaces::near_abi_client::generate!(Client for "../examples/res/adder.json"); +} + +pub async fn macro_run(contract: workspaces::Contract) -> anyhow::Result<()> { + let contract = macro_adder::Client { contract }; + let res = contract.add(vec![1, 2], vec![3, 4]).await?; + + let res = (res[0].try_into().unwrap(), res[1].try_into().unwrap()); + assert_eq!(res, (4, 6)); + + Ok(()) +} + +/// This part of the example uses the Generation API to generate a client and use it. +#[path = "gen/adder.rs"] +mod generation_adder; + +pub async fn generation_run(contract: workspaces::Contract) -> anyhow::Result<()> { + let contract = generation_adder::AbiClient { contract }; + let res = contract.add(vec![1, 2], vec![3, 4]).await?; + + let res = (res[0].try_into().unwrap(), res[1].try_into().unwrap()); + assert_eq!(res, (4, 6)); + + Ok(()) +} diff --git a/workspaces/Cargo.toml b/workspaces/Cargo.toml index 3dcaab95..a17914a6 100644 --- a/workspaces/Cargo.toml +++ b/workspaces/Cargo.toml @@ -39,6 +39,7 @@ near-primitives = "0.17" near-jsonrpc-primitives = "0.17" near-jsonrpc-client = { version = "0.6", features = ["sandbox"] } near-sandbox-utils = "0.6.2" +near-abi-client = "0.1.0" [build-dependencies] near-sandbox-utils = "0.6.2" diff --git a/workspaces/src/lib.rs b/workspaces/src/lib.rs index c4d1381a..5cd497da 100644 --- a/workspaces/src/lib.rs +++ b/workspaces/src/lib.rs @@ -18,6 +18,10 @@ pub mod result; pub mod rpc; pub mod types; +// The near_abi_client implementation is currently in flux and we offer a re-export +// of it and example code. No public near_abi APIs are baked into workspace-rs yet. +pub use near_abi_client; + pub use network::pick_unused_port; pub use network::variants::{DevNetwork, Network}; pub use result::Result; From ab5e0396d5fd309a4daf857e06e1f20eb3c144cf Mon Sep 17 00:00:00 2001 From: Yasir Shariff Date: Thu, 14 Sep 2023 13:40:12 +0300 Subject: [PATCH 2/9] docs --- workspaces/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workspaces/src/lib.rs b/workspaces/src/lib.rs index 5cd497da..872ab21b 100644 --- a/workspaces/src/lib.rs +++ b/workspaces/src/lib.rs @@ -18,8 +18,8 @@ pub mod result; pub mod rpc; pub mod types; -// The near_abi_client implementation is currently in flux and we offer a re-export -// of it and example code. No public near_abi APIs are baked into workspace-rs yet. +/// The near_abi_client implementation is currently in flux and we offer a re-export +/// of it and example code. No public near_abi APIs are baked into workspace-rs yet. pub use near_abi_client; pub use network::pick_unused_port; From ea6c312444507069647daf61f2c4992330113db4 Mon Sep 17 00:00:00 2001 From: Yasir Shariff Date: Thu, 14 Sep 2023 14:39:28 +0300 Subject: [PATCH 3/9] bug: rm 'arbitrary-precision' feature --- examples/Cargo.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/Cargo.toml b/examples/Cargo.toml index 62c7bda8..028df6dd 100644 --- a/examples/Cargo.toml +++ b/examples/Cargo.toml @@ -11,8 +11,7 @@ maplit = "1.0" near-units = "0.2.0" serde = "1.0" serde_with = "1" -# arbitrary_precision enabled for u128 types that workspaces requires for Balance types -serde_json = { version = "1.0", features = ["arbitrary_precision"] } +serde_json = { version = "1.0" } tokio = { version = "1.10.0", features = ["full"] } tracing = "0.1" tracing-subscriber = { version = "0.3.5", features = ["env-filter"] } From 2de28b65571ea0ed19482cee19dcdac00d467a16 Mon Sep 17 00:00:00 2001 From: Yasir Shariff Date: Thu, 14 Sep 2023 14:57:06 +0300 Subject: [PATCH 4/9] fix: incl. gen file --- .gitignore | 1 - examples/src/gen/adder.rs | 10 ++++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 examples/src/gen/adder.rs diff --git a/.gitignore b/.gitignore index e69209f0..da694856 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,3 @@ target # generated files .near-credentials -gen diff --git a/examples/src/gen/adder.rs b/examples/src/gen/adder.rs new file mode 100644 index 00000000..bfbc230c --- /dev/null +++ b/examples/src/gen/adder.rs @@ -0,0 +1,10 @@ +pub type Pair = Vec; +pub struct AbiClient { + pub contract: workspaces::Contract, +} +impl AbiClient { + pub async fn add(&self, a: Pair, b: Pair) -> anyhow::Result { + let result = self.contract.call("add").args_json([a, b]).view().await?; + Ok(result.json::()?) + } +} From c454ca92bf144ab88982f0c75f6a6a0cb2a9d7ff Mon Sep 17 00:00:00 2001 From: Yasir Shariff Date: Fri, 3 Nov 2023 12:03:00 +0300 Subject: [PATCH 5/9] cleanup --- examples/Cargo.toml | 2 +- examples/build.rs | 2 +- examples/src/gen/adder.rs | 2 +- examples/src/view_abi.rs | 8 ++++---- workspaces/Cargo.toml | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/Cargo.toml b/examples/Cargo.toml index e75babf6..62ff3a5a 100644 --- a/examples/Cargo.toml +++ b/examples/Cargo.toml @@ -22,7 +22,7 @@ near-workspaces = { path = "../workspaces", features = ["experimental", "unstabl [build-dependencies] anyhow = "1.0" -workspaces = { path = "../workspaces" } +near-workspaces = { path = "../workspaces" } [[example]] name = "async_transaction" diff --git a/examples/build.rs b/examples/build.rs index 8e7b9e60..2ba2e91d 100644 --- a/examples/build.rs +++ b/examples/build.rs @@ -1,5 +1,5 @@ fn main() -> anyhow::Result<()> { - workspaces::near_abi_client::Generator::new("src/gen".into()) + near_workspaces::near_abi_client::Generator::new("src/gen".into()) .file("res/adder.json") .generate()?; Ok(()) diff --git a/examples/src/gen/adder.rs b/examples/src/gen/adder.rs index bfbc230c..a7430acd 100644 --- a/examples/src/gen/adder.rs +++ b/examples/src/gen/adder.rs @@ -1,6 +1,6 @@ pub type Pair = Vec; pub struct AbiClient { - pub contract: workspaces::Contract, + pub contract: near_workspaces::Contract, } impl AbiClient { pub async fn add(&self, a: Pair, b: Pair) -> anyhow::Result { diff --git a/examples/src/view_abi.rs b/examples/src/view_abi.rs index 93d62224..061cb9c2 100644 --- a/examples/src/view_abi.rs +++ b/examples/src/view_abi.rs @@ -4,7 +4,7 @@ const ADDER_WASM_FILEPATH: &str = "./examples/res/adder.wasm"; #[tokio::main] async fn main() -> anyhow::Result<()> { - let worker = workspaces::sandbox().await?; + let worker = near_workspaces::sandbox().await?; let wasm = std::fs::read(ADDER_WASM_FILEPATH)?; let contract = worker.dev_deploy(&wasm).await?; @@ -16,10 +16,10 @@ async fn main() -> anyhow::Result<()> { /// This part of the example uses the Macro API to get a client and use it. mod macro_adder { - workspaces::near_abi_client::generate!(Client for "../examples/res/adder.json"); + near_workspaces::near_abi_client::generate!(Client for "../examples/res/adder.json"); } -pub async fn macro_run(contract: workspaces::Contract) -> anyhow::Result<()> { +pub async fn macro_run(contract: near_workspaces::Contract) -> anyhow::Result<()> { let contract = macro_adder::Client { contract }; let res = contract.add(vec![1, 2], vec![3, 4]).await?; @@ -33,7 +33,7 @@ pub async fn macro_run(contract: workspaces::Contract) -> anyhow::Result<()> { #[path = "gen/adder.rs"] mod generation_adder; -pub async fn generation_run(contract: workspaces::Contract) -> anyhow::Result<()> { +pub async fn generation_run(contract: near_workspaces::Contract) -> anyhow::Result<()> { let contract = generation_adder::AbiClient { contract }; let res = contract.add(vec![1, 2], vec![3, 4]).await?; diff --git a/workspaces/Cargo.toml b/workspaces/Cargo.toml index 0daef6c7..e739dc7c 100644 --- a/workspaces/Cargo.toml +++ b/workspaces/Cargo.toml @@ -31,6 +31,7 @@ tokio-retry = "0.3" tracing = "0.1" url = { version = "2.2.2", features = ["serde"] } +near-abi-client = { git = "https://github.com/shariffdev/near-abi-client-rs", branch = "chore/bump-workspaces" } near-gas = { version = "0.2.3", features = ["serde", "borsh", "schemars"] } near-token = { version = "0.2.0", features = ["serde"] } near-sdk = { version = "4.1", optional = true } @@ -39,7 +40,6 @@ near-crypto = "0.17" near-primitives = "0.17" near-jsonrpc-primitives = "0.17" near-jsonrpc-client = { version = "0.6", features = ["sandbox"] } -near-abi-client = "0.1.0" near-sandbox-utils = "0.7.0" near-chain-configs = { version = "0.17.0", optional = true } From 5add8023bdd0f9ff7fb3faa2e876b711d0920ff2 Mon Sep 17 00:00:00 2001 From: Yasir Shariff Date: Tue, 30 Jan 2024 20:01:02 +0300 Subject: [PATCH 6/9] upd: docs & tidying --- examples/Cargo.toml | 14 ++++++++--- examples/res/adder.json | 4 ++-- examples/src/build_gen_abi.rs | 28 ++++++++++++++++++++++ examples/src/gen/.gitignore | 2 ++ examples/src/gen/adder.rs | 10 -------- examples/src/macro_gen_abi.rs | 26 ++++++++++++++++++++ examples/src/view_abi.rs | 45 +++++++++-------------------------- 7 files changed, 80 insertions(+), 49 deletions(-) create mode 100644 examples/src/build_gen_abi.rs create mode 100644 examples/src/gen/.gitignore delete mode 100644 examples/src/gen/adder.rs create mode 100644 examples/src/macro_gen_abi.rs diff --git a/examples/Cargo.toml b/examples/Cargo.toml index 3edaf5e1..9aeb0ef6 100644 --- a/examples/Cargo.toml +++ b/examples/Cargo.toml @@ -58,9 +58,9 @@ path = "src/croncat.rs" name = "various_queries" path = "src/various_queries.rs" -[[example]] -name = "view_abi" -path = "src/view_abi.rs" +# [[example]] +# name = "view_abi" +# path = "src/view_abi.rs" [[example]] name = "genesis_config" @@ -97,3 +97,11 @@ path = "src/noop.rs" [[example]] name = "custom_network" path = "src/custom_network.rs" + +[[example]] +name = "build_gen_abi" +path = "src/build_gen_abi.rs" + +[[example]] +name = "macro_gen_abi" +path = "src/macro_gen_abi.rs" diff --git a/examples/res/adder.json b/examples/res/adder.json index 1e768a1c..e825f295 100644 --- a/examples/res/adder.json +++ b/examples/res/adder.json @@ -1,5 +1,5 @@ { - "schema_version": "0.3.0", + "schema_version": "0.4.0", "metadata": { "name": "abi", "version": "0.1.0", @@ -63,4 +63,4 @@ } } } -} +} \ No newline at end of file diff --git a/examples/src/build_gen_abi.rs b/examples/src/build_gen_abi.rs new file mode 100644 index 00000000..75e8734f --- /dev/null +++ b/examples/src/build_gen_abi.rs @@ -0,0 +1,28 @@ +// This example shows how to use the `near_abi_client` Generation Based API. +// We are generating client code using the schema for the ABI and and `workspaces-rs` to call into the contract. +// More information about usage can be found here: +// +// A good scenario for usage might be when you are interacting with a contract or multiple contracts at an automated level +// and you want to have a type-safe way of interacting with them. + +/// The generated api requires setup in the `build.rs` file to generate the client code. +#[path = "gen/adder.rs"] +mod generation_adder; + +const ADDER_WASM_FILEPATH: &str = "./examples/res/adder.wasm"; + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + let worker = near_workspaces::sandbox().await?; + let wasm = std::fs::read(ADDER_WASM_FILEPATH)?; + let contract = worker.dev_deploy(&wasm).await?; + + // The client is initialized with the contract. + let abi_client = generation_adder::AbiClient { contract }; + + // Here we can call the method, now typed with arguments and return types. + let res = abi_client.add(vec![1, 2], vec![3, 4]).await?; + + assert_eq!(res, [4, 6]); + Ok(()) +} diff --git a/examples/src/gen/.gitignore b/examples/src/gen/.gitignore new file mode 100644 index 00000000..c96a04f0 --- /dev/null +++ b/examples/src/gen/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/examples/src/gen/adder.rs b/examples/src/gen/adder.rs deleted file mode 100644 index a7430acd..00000000 --- a/examples/src/gen/adder.rs +++ /dev/null @@ -1,10 +0,0 @@ -pub type Pair = Vec; -pub struct AbiClient { - pub contract: near_workspaces::Contract, -} -impl AbiClient { - pub async fn add(&self, a: Pair, b: Pair) -> anyhow::Result { - let result = self.contract.call("add").args_json([a, b]).view().await?; - Ok(result.json::()?) - } -} diff --git a/examples/src/macro_gen_abi.rs b/examples/src/macro_gen_abi.rs new file mode 100644 index 00000000..fc5dd0ef --- /dev/null +++ b/examples/src/macro_gen_abi.rs @@ -0,0 +1,26 @@ +// This example shows how to use the `near_abi_client` Macro Based API. +// We are generating client code using the schema for the ABI and and `workspaces-rs` to call into the contract. +// More information about usage can be found here: +// +// A good scenario for usage might be when you are interacting with a contract or multiple contracts at an automated level +// and you want to have a type-safe way of interacting with them. + +const ADDER_WASM_FILEPATH: &str = "./examples/res/adder.wasm"; + +near_workspaces::near_abi_client::generate!(AbiClient for "res/adder.json"); + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + let worker = near_workspaces::sandbox().await?; + let wasm = std::fs::read(ADDER_WASM_FILEPATH)?; + let contract = worker.dev_deploy(&wasm).await?; + + // The client is initialized with the contract. + let abi_client = AbiClient { contract }; + + // Here we can call the method, now typed with arguments and return types. + let res = abi_client.add(vec![1, 2], vec![3, 4]).await?; + + assert_eq!(res, [4, 6]); + Ok(()) +} diff --git a/examples/src/view_abi.rs b/examples/src/view_abi.rs index 061cb9c2..26192ac2 100644 --- a/examples/src/view_abi.rs +++ b/examples/src/view_abi.rs @@ -1,44 +1,21 @@ -use std::convert::TryInto; +// use std::convert::TryInto; -const ADDER_WASM_FILEPATH: &str = "./examples/res/adder.wasm"; -#[tokio::main] -async fn main() -> anyhow::Result<()> { - let worker = near_workspaces::sandbox().await?; - let wasm = std::fs::read(ADDER_WASM_FILEPATH)?; - let contract = worker.dev_deploy(&wasm).await?; - macro_run(contract.clone()).await?; - generation_run(contract).await?; - Ok(()) -} -/// This part of the example uses the Macro API to get a client and use it. -mod macro_adder { - near_workspaces::near_abi_client::generate!(Client for "../examples/res/adder.json"); -} -pub async fn macro_run(contract: near_workspaces::Contract) -> anyhow::Result<()> { - let contract = macro_adder::Client { contract }; - let res = contract.add(vec![1, 2], vec![3, 4]).await?; - let res = (res[0].try_into().unwrap(), res[1].try_into().unwrap()); - assert_eq!(res, (4, 6)); +// /// This part of the example uses the Generation API to generate a client and use it. +// #[path = "gen/adder.rs"] +// mod generation_adder; - Ok(()) -} +// pub async fn generation_run(contract: near_workspaces::Contract) -> anyhow::Result<()> { +// let contract = generation_adder::AbiClient { contract }; +// let res = contract.add(vec![1, 2], vec![3, 4]).await?; -/// This part of the example uses the Generation API to generate a client and use it. -#[path = "gen/adder.rs"] -mod generation_adder; +// let res = (res[0].try_into().unwrap(), res[1].try_into().unwrap()); +// assert_eq!(res, (4, 6)); -pub async fn generation_run(contract: near_workspaces::Contract) -> anyhow::Result<()> { - let contract = generation_adder::AbiClient { contract }; - let res = contract.add(vec![1, 2], vec![3, 4]).await?; - - let res = (res[0].try_into().unwrap(), res[1].try_into().unwrap()); - assert_eq!(res, (4, 6)); - - Ok(()) -} +// Ok(()) +// } From 1effe7390dd033dc2a99c44c7f3014e6cae9b223 Mon Sep 17 00:00:00 2001 From: Yasir Shariff Date: Tue, 30 Jan 2024 20:06:43 +0300 Subject: [PATCH 7/9] cleanup --- examples/Cargo.toml | 4 ---- examples/src/view_abi.rs | 21 --------------------- 2 files changed, 25 deletions(-) delete mode 100644 examples/src/view_abi.rs diff --git a/examples/Cargo.toml b/examples/Cargo.toml index 9aeb0ef6..7e8f4552 100644 --- a/examples/Cargo.toml +++ b/examples/Cargo.toml @@ -58,10 +58,6 @@ path = "src/croncat.rs" name = "various_queries" path = "src/various_queries.rs" -# [[example]] -# name = "view_abi" -# path = "src/view_abi.rs" - [[example]] name = "genesis_config" path = "src/genesis_config.rs" diff --git a/examples/src/view_abi.rs b/examples/src/view_abi.rs deleted file mode 100644 index 26192ac2..00000000 --- a/examples/src/view_abi.rs +++ /dev/null @@ -1,21 +0,0 @@ -// use std::convert::TryInto; - - - - - - - -// /// This part of the example uses the Generation API to generate a client and use it. -// #[path = "gen/adder.rs"] -// mod generation_adder; - -// pub async fn generation_run(contract: near_workspaces::Contract) -> anyhow::Result<()> { -// let contract = generation_adder::AbiClient { contract }; -// let res = contract.add(vec![1, 2], vec![3, 4]).await?; - -// let res = (res[0].try_into().unwrap(), res[1].try_into().unwrap()); -// assert_eq!(res, (4, 6)); - -// Ok(()) -// } From 3ca768db4380938954b1fbb1a06504b2f10091bd Mon Sep 17 00:00:00 2001 From: Yasir Shariff Date: Tue, 30 Jan 2024 20:34:45 +0300 Subject: [PATCH 8/9] fix ci --- examples/src/gen/adder.rs | 1 + 1 file changed, 1 insertion(+) create mode 100644 examples/src/gen/adder.rs diff --git a/examples/src/gen/adder.rs b/examples/src/gen/adder.rs new file mode 100644 index 00000000..175ed801 --- /dev/null +++ b/examples/src/gen/adder.rs @@ -0,0 +1 @@ +// No content here, it's to be generated on build. Here to allow cargofmt to work. From cb82e1bf10f567e19336c40d6c1006daffce0c92 Mon Sep 17 00:00:00 2001 From: Yasir Shariff <141004977+shariffdev@users.noreply.github.com> Date: Tue, 30 Jan 2024 21:38:20 +0300 Subject: [PATCH 9/9] Delete examples/src/gen/.gitignore --- examples/src/gen/.gitignore | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 examples/src/gen/.gitignore diff --git a/examples/src/gen/.gitignore b/examples/src/gen/.gitignore deleted file mode 100644 index c96a04f0..00000000 --- a/examples/src/gen/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore \ No newline at end of file