From f15f3f688ec13a412aa177f0f4241eba15ccea21 Mon Sep 17 00:00:00 2001 From: Georgy Shepelev Date: Mon, 9 Sep 2024 08:22:33 +0400 Subject: [PATCH] tokens mapping test --- Cargo.lock | 25 +-- gear-programs/erc20-relay/Cargo.toml | 4 +- gear-programs/erc20-relay/app/Cargo.toml | 11 +- .../erc20-relay/app/tests/gclient.rs | 157 ++++++++++++++++++ gear-programs/erc20-relay/client/Cargo.toml | 6 +- 5 files changed, 185 insertions(+), 18 deletions(-) create mode 100644 gear-programs/erc20-relay/app/tests/gclient.rs diff --git a/Cargo.lock b/Cargo.lock index 30788bbf..a22c0ee7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3563,10 +3563,16 @@ dependencies = [ "alloy-rlp", "alloy-sol-types", "checkpoint_light_client-io", + "erc20-relay-client", "ethereum-common", + "futures", + "gclient 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "getrandom 0.2.15", + "gstd 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal", "lazy_static", "sails-rs 0.4.0", + "tokio", ] [[package]] @@ -10328,8 +10334,7 @@ dependencies = [ [[package]] name = "sails-client-gen" version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298eecdb11ee41e68215a02c97541f2bcc7c24c310cec026483a9324254a283a" +source = "git+https://github.com/gear-tech/sails.git?rev=aab08733ee9ccdb809dc9b29c57dd411b2b917b1#aab08733ee9ccdb809dc9b29c57dd411b2b917b1" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -10370,8 +10375,7 @@ dependencies = [ [[package]] name = "sails-idl-gen" version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9007c11042e82c2a1edf720ff510ba0996af4ee549dce3faba455679533f06d9" +source = "git+https://github.com/gear-tech/sails.git?rev=aab08733ee9ccdb809dc9b29c57dd411b2b917b1#aab08733ee9ccdb809dc9b29c57dd411b2b917b1" dependencies = [ "convert_case 0.6.0", "handlebars", @@ -10408,8 +10412,7 @@ dependencies = [ [[package]] name = "sails-idl-parser" version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711bea52cfacceeca67312491b905bd2df6a1a4c0969be313381b30367b54092" +source = "git+https://github.com/gear-tech/sails.git?rev=aab08733ee9ccdb809dc9b29c57dd411b2b917b1#aab08733ee9ccdb809dc9b29c57dd411b2b917b1" dependencies = [ "lalrpop", "lalrpop-util", @@ -10439,8 +10442,7 @@ dependencies = [ [[package]] name = "sails-macros" version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4efcda7e656871d17e79259110a6b17d0d660e2ab3f949a91d55c165bcbd4d0d" +source = "git+https://github.com/gear-tech/sails.git?rev=aab08733ee9ccdb809dc9b29c57dd411b2b917b1#aab08733ee9ccdb809dc9b29c57dd411b2b917b1" dependencies = [ "proc-macro-error", "sails-macros-core 0.4.0", @@ -10476,8 +10478,7 @@ dependencies = [ [[package]] name = "sails-macros-core" version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3694ccad10e20282caf8111c39382c3e1f00433c5f0c48d4592e1f201b82f598" +source = "git+https://github.com/gear-tech/sails.git?rev=aab08733ee9ccdb809dc9b29c57dd411b2b917b1#aab08733ee9ccdb809dc9b29c57dd411b2b917b1" dependencies = [ "convert_case 0.6.0", "parity-scale-codec", @@ -10534,10 +10535,10 @@ dependencies = [ [[package]] name = "sails-rs" version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67effccdaef6232976af5cabf54775bd57e362b09e201ceb5e732f8dd7194c9c" +source = "git+https://github.com/gear-tech/sails.git?rev=aab08733ee9ccdb809dc9b29c57dd411b2b917b1#aab08733ee9ccdb809dc9b29c57dd411b2b917b1" dependencies = [ "futures", + "gclient 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "gear-core 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "gear-core-errors 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "gear-wasm-builder 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/gear-programs/erc20-relay/Cargo.toml b/gear-programs/erc20-relay/Cargo.toml index 9a8ac73a..8c1e9733 100644 --- a/gear-programs/erc20-relay/Cargo.toml +++ b/gear-programs/erc20-relay/Cargo.toml @@ -8,8 +8,8 @@ erc20-relay-app.workspace = true [build-dependencies] erc20-relay-app.workspace = true -sails-rs = { version = "0.4.0", features = ["wasm-builder"] } -sails-idl-gen = "0.4.0" +sails-rs = { git = "https://github.com/gear-tech/sails.git", rev = "aab08733ee9ccdb809dc9b29c57dd411b2b917b1", features = ["wasm-builder"] } +sails-idl-gen = { git = "https://github.com/gear-tech/sails.git", rev = "aab08733ee9ccdb809dc9b29c57dd411b2b917b1" } [features] wasm-binary = [] diff --git a/gear-programs/erc20-relay/app/Cargo.toml b/gear-programs/erc20-relay/app/Cargo.toml index 5b1fd915..266dd250 100644 --- a/gear-programs/erc20-relay/app/Cargo.toml +++ b/gear-programs/erc20-relay/app/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -sails-rs = "0.4.0" +sails-rs = { git = "https://github.com/gear-tech/sails.git", rev = "aab08733ee9ccdb809dc9b29c57dd411b2b917b1" } ethereum-common.workspace = true alloy-rlp.workspace = true alloy-sol-types = { workspace = true, features = ["json"] } @@ -13,3 +13,12 @@ checkpoint_light_client-io.workspace = true [target.'cfg(all(target_arch = "wasm32", target_os = "unknown"))'.dependencies] getrandom = { version = "0.2", default-features = false, features = ["custom"] } lazy_static = { version = "1.1", features = ["spin_no_std"] } + +[dev-dependencies] +erc20-relay-client = { path = "../client" } +futures.workspace = true +gclient.workspace = true +gstd.workspace = true +sails-rs = { git = "https://github.com/gear-tech/sails.git", rev = "aab08733ee9ccdb809dc9b29c57dd411b2b917b1", features = ["gclient"] } +tokio = { workspace = true, features = ["rt", "macros"] } +hex-literal.workspace = true diff --git a/gear-programs/erc20-relay/app/tests/gclient.rs b/gear-programs/erc20-relay/app/tests/gclient.rs new file mode 100644 index 00000000..f0d4f904 --- /dev/null +++ b/gear-programs/erc20-relay/app/tests/gclient.rs @@ -0,0 +1,157 @@ +use erc20_relay_client::{ + ft_manage::events::FtManageEvents, + traits::{Erc20RelayFactory, FtManage}, +}; +use futures::StreamExt; +use gclient::GearApi; +use hex_literal::hex; +use sails_rs::{calls::*, events::*, gclient::calls::*, prelude::*}; + +const PATH_WASM: &str = match cfg!(debug_assertions) { + true => "../../../target/wasm32-unknown-unknown/debug/erc20_relay.opt.wasm", + false => "../../../target/wasm32-unknown-unknown/release/erc20_relay.opt.wasm", +}; + +async fn spin_up_node() -> (GClientRemoting, CodeId, GasUnit) { + let api = GearApi::dev().await.unwrap(); + let gas_limit = api.block_gas_limit().unwrap(); + let remoting = GClientRemoting::new(api); + let code_id = remoting.upload_code_by_path(PATH_WASM).await.unwrap(); + + (remoting, code_id, gas_limit) +} + +#[tokio::test] +async fn tokens_map() { + let (remoting, code_id, gas_limit) = spin_up_node().await; + + let factory = erc20_relay_client::Erc20RelayFactory::new(remoting.clone()); + + let program_id = factory + .new(Default::default(), Default::default()) + .with_gas_limit(gas_limit) + .send_recv(code_id, "") + .await + .unwrap(); + + let mut ft_client = erc20_relay_client::FtManage::new(remoting.clone()); + + let tokens = ft_client.tokens().recv(program_id).await.unwrap(); + assert!(tokens.is_empty()); + + let mut listener = erc20_relay_client::ft_manage::events::listener(remoting.clone()); + let mut events = listener.listen().await.unwrap(); + + let eth_address = H160::from(hex!("52c953cac2269c599b075359EdA11E738a75c6F6")); + let result = ft_client + .add_fungible_token(eth_address, [0u8; 32].into()) + .send_recv(program_id) + .await + .unwrap(); + assert!(result.is_some()); + + let event = events.next().await.unwrap(); + assert_eq!( + ( + program_id, + FtManageEvents::Added { + eth_address, + fungible_token: [0u8; 32].into() + } + ), + event + ); + + let tokens = ft_client.tokens().recv(program_id).await.unwrap(); + assert_eq!(&tokens[..], &[(eth_address, [0u8; 32].into())]); + + // duplicate Eth address + let result = ft_client + .add_fungible_token(eth_address, [0u8; 32].into()) + .send_recv(program_id) + .await + .unwrap(); + assert!(result.is_none()); + + // another mapping + let eth_address2 = H160::from(hex!("52c953cac2269c599b075359EdA11E738a75c6F7")); + let result = ft_client + .add_fungible_token(eth_address2, [0u8; 32].into()) + .send_recv(program_id) + .await + .unwrap(); + assert!(result.is_some()); + + let event = events.next().await.unwrap(); + assert_eq!( + ( + program_id, + FtManageEvents::Added { + eth_address: eth_address2, + fungible_token: [0u8; 32].into() + } + ), + event + ); + + let tokens = ft_client.tokens().recv(program_id).await.unwrap(); + assert_eq!( + &tokens[..], + &[ + (eth_address, [0u8; 32].into()), + (eth_address2, [0u8; 32].into()) + ] + ); + + let result = ft_client + .remove_fungible_token(eth_address2) + .send_recv(program_id) + .await + .unwrap(); + assert!(result.is_some()); + + let event = events.next().await.unwrap(); + assert_eq!( + ( + program_id, + FtManageEvents::Removed { + eth_address: eth_address2 + } + ), + event + ); + + let tokens = ft_client.tokens().recv(program_id).await.unwrap(); + assert_eq!(&tokens[..], &[(eth_address, [0u8; 32].into())]); + + // attempt to remove non-existant entry should do nothig + let result = ft_client + .remove_fungible_token(eth_address2) + .send_recv(program_id) + .await + .unwrap(); + assert!(result.is_none()); + + // another account isn't permitted to manage FTs + let api = GearApi::dev().await.unwrap().with("//Bob").unwrap(); + let remoting = GClientRemoting::new(api); + + let mut ft_client = erc20_relay_client::FtManage::new(remoting.clone()); + + // there should be the single mapping + let tokens = ft_client.tokens().recv(program_id).await.unwrap(); + assert_eq!(&tokens[..], &[(eth_address, [0u8; 32].into())]); + + let eth_address3 = hex!("52c953cac2269c599b075359EdA11E738a75c6F8"); + let result = ft_client + .add_fungible_token(eth_address3.into(), [0u8; 32].into()) + .send_recv(program_id) + .await; + assert!(result.is_err()); + + let result = ft_client + .remove_fungible_token(eth_address) + .send_recv(program_id) + .await; + assert!(result.is_err()); +} diff --git a/gear-programs/erc20-relay/client/Cargo.toml b/gear-programs/erc20-relay/client/Cargo.toml index 3d118708..95a3a232 100644 --- a/gear-programs/erc20-relay/client/Cargo.toml +++ b/gear-programs/erc20-relay/client/Cargo.toml @@ -5,12 +5,12 @@ edition = "2021" [dependencies] mockall = { version = "0.12", optional = true } -sails-rs = "0.4.0" +sails-rs = { git = "https://github.com/gear-tech/sails.git", rev = "aab08733ee9ccdb809dc9b29c57dd411b2b917b1" } [build-dependencies] erc20-relay-app.workspace = true -sails-client-gen = "0.4.0" -sails-idl-gen = "0.4.0" +sails-client-gen = { git = "https://github.com/gear-tech/sails.git", rev = "aab08733ee9ccdb809dc9b29c57dd411b2b917b1" } +sails-idl-gen = { git = "https://github.com/gear-tech/sails.git", rev = "aab08733ee9ccdb809dc9b29c57dd411b2b917b1" } [features] mocks = ["sails-rs/mockall", "dep:mockall"]