Skip to content

Commit

Permalink
tokens mapping test
Browse files Browse the repository at this point in the history
  • Loading branch information
gshep committed Sep 9, 2024
1 parent 475ace2 commit f15f3f6
Show file tree
Hide file tree
Showing 5 changed files with 185 additions and 18 deletions.
25 changes: 13 additions & 12 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions gear-programs/erc20-relay/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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 = []
11 changes: 10 additions & 1 deletion gear-programs/erc20-relay/app/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"] }
Expand All @@ -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
157 changes: 157 additions & 0 deletions gear-programs/erc20-relay/app/tests/gclient.rs
Original file line number Diff line number Diff line change
@@ -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());
}
6 changes: 3 additions & 3 deletions gear-programs/erc20-relay/client/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"]

0 comments on commit f15f3f6

Please sign in to comment.