Skip to content

Commit

Permalink
test: test randomizer, store, swithc to contract-transcode
Browse files Browse the repository at this point in the history
Signed-off-by: Raymond Yeh <extraymond@gmail.com>
  • Loading branch information
extraymond committed Aug 30, 2022
1 parent 92f326e commit a8d68ea
Show file tree
Hide file tree
Showing 16 changed files with 568 additions and 526 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

17 changes: 10 additions & 7 deletions integration/subxt-tests/src/cases/asserts.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use crate::{build_selector, node, WriteContract};
use crate::{load_project, node, WriteContract};
use contract_transcode::ContractMessageTranscoder;
use hex::FromHex;
use parity_scale_codec::{Decode, Encode};
use sp_core::hexdisplay::AsBytesRef;
Expand All @@ -11,10 +12,12 @@ use crate::{
#[tokio::test]
async fn case() -> anyhow::Result<()> {
let api = API::new().await?;

let code = std::fs::read("./contracts/asserts.wasm")?;

let selector = build_selector("861731d5", None)?;
let p = load_project("./contracts/asserts.contract")?;
let transcoder = ContractMessageTranscoder::new(&p);

let selector = transcoder.encode::<_, String>("new", [])?;

let deployed = DeployContract {
caller: sp_keyring::AccountKeyring::Alice,
Expand All @@ -25,7 +28,7 @@ async fn case() -> anyhow::Result<()> {
.execute(&api)
.await?;

let selector = build_selector("8b74985e", None)?;
let selector = transcoder.encode::<_, String>("var", [])?;

let rv = ReadContract {
caller: sp_keyring::AccountKeyring::Alice,
Expand All @@ -40,7 +43,7 @@ async fn case() -> anyhow::Result<()> {
let output = i64::decode(&mut rv.return_value.as_bytes_ref())?;
assert!(output == 1);

let selector = build_selector("7b4356fc", None)?;
let selector = transcoder.encode::<_, String>("test_assert_rpc", [])?;

// read should fail
let res = ReadContract {
Expand All @@ -57,7 +60,7 @@ async fn case() -> anyhow::Result<()> {
assert!(r.to_string().contains("ContractTrapped"));
}

let selector = build_selector("1d2d4c34", None)?;
let selector = transcoder.encode::<_, String>("test_assert_rpc", [])?;

// write should failed
let res = WriteContract {
Expand All @@ -74,7 +77,7 @@ async fn case() -> anyhow::Result<()> {
}

// state should not change after failed operation
let selector = build_selector("8b74985e", None)?;
let selector = transcoder.encode::<_, String>("var", [])?;

let rv = ReadContract {
caller: sp_keyring::AccountKeyring::Alice,
Expand Down
35 changes: 15 additions & 20 deletions integration/subxt-tests/src/cases/builtins.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use std::time::{Instant, SystemTime, UNIX_EPOCH};

use crate::{build_selector, node, DeployContract, Execution, ReadContract, API};
use crate::{build_selector, load_project, node, DeployContract, Execution, ReadContract, API};
use contract_transcode::ContractMessageTranscoder;
use parity_scale_codec::{Decode, Encode};
use sp_core::hexdisplay::AsBytesRef;

Expand All @@ -9,7 +10,11 @@ async fn case() -> anyhow::Result<()> {
let api = API::new().await?;
let code = std::fs::read("./contracts/builtins.wasm")?;

let selector = build_selector("861731d5", None)?;
let p = load_project("./contracts/builtins.contract")?;
let transcoder = ContractMessageTranscoder::new(&p);

let selector = transcoder.encode::<_, String>("new", [])?;

let deployed = DeployContract {
caller: sp_keyring::AccountKeyring::Alice,
selector,
Expand All @@ -21,12 +26,9 @@ async fn case() -> anyhow::Result<()> {

// check ripmed160
let input_str = "Call me Ishmael.";
let selector = build_selector(
"dc610b88",
Some(&mut |s| {
input_str.encode_to(s);
}),
)?;

let selector =
transcoder.encode("hash_ripemd160", [format!("0x{}", hex::encode(&input_str))])?;

let rv = ReadContract {
caller: sp_keyring::AccountKeyring::Alice,
Expand All @@ -41,12 +43,7 @@ async fn case() -> anyhow::Result<()> {
assert_eq!(rv.return_value, expected);

// check sha256
let selector = build_selector(
"ae5194d8",
Some(&mut |s| {
input_str.encode_to(s);
}),
)?;
let selector = transcoder.encode("hash_sha256", [format!("0x{}", hex::encode(&input_str))])?;

let rv = ReadContract {
caller: sp_keyring::AccountKeyring::Alice,
Expand All @@ -61,11 +58,9 @@ async fn case() -> anyhow::Result<()> {
assert_eq!(rv.return_value, expected);

// check keccak256
let selector = build_selector(
"f2f6eee6",
Some(&mut |s| {
input_str.encode_to(s);
}),
let selector = transcoder.encode(
"hash_kecccak256",
[format!("0x{}", hex::encode(&input_str))],
)?;

let rv = ReadContract {
Expand All @@ -81,7 +76,7 @@ async fn case() -> anyhow::Result<()> {
assert_eq!(rv.return_value, expected);

// check timestamp
let selector = build_selector("25f51532", None)?;
let selector = transcoder.encode::<_, String>("mr_now", [])?;

let rv = ReadContract {
caller: sp_keyring::AccountKeyring::Alice,
Expand Down
43 changes: 18 additions & 25 deletions integration/subxt-tests/src/cases/builtins2.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,20 @@
use contract_transcode::ContractMessageTranscoder;
use parity_scale_codec::{Decode, Encode};
use sp_core::hexdisplay::AsBytesRef;

use crate::{build_selector, node, DeployContract, Execution, ReadContract, API, GAS_LIMIT};
use crate::{
build_selector, load_project, node, DeployContract, Execution, ReadContract, API, GAS_LIMIT,
};

#[tokio::test]
async fn case() -> anyhow::Result<()> {
let api = API::new().await?;
let code = std::fs::read("./contracts/builtins2.wasm")?;

let selector = build_selector("861731d5", None)?;
let p = load_project("./contracts/builtins2.contract")?;
let transcoder = ContractMessageTranscoder::new(&p);

let selector = transcoder.encode::<_, String>("new", [])?;
let deployed = DeployContract {
caller: sp_keyring::AccountKeyring::Alice,
selector,
Expand All @@ -20,11 +26,10 @@ async fn case() -> anyhow::Result<()> {

// check blake2_128
let input_str = "Call me Ishmael.";
let selector = build_selector(
"9e23bab6",
Some(&mut |s| {
input_str.encode_to(s);
}),

let selector = transcoder.encode(
"hash_blake2_128",
[format!("0x{}", hex::encode(&input_str))],
)?;

let rv = ReadContract {
Expand All @@ -40,11 +45,9 @@ async fn case() -> anyhow::Result<()> {
assert_eq!(rv.return_value, expected);

// check blake2_256
let selector = build_selector(
"bbe04a1d",
Some(&mut |s| {
input_str.encode_to(s);
}),
let selector = transcoder.encode(
"hash_blake2_256",
[format!("0x{}", hex::encode(&input_str))],
)?;

let rv = ReadContract {
Expand All @@ -60,7 +63,7 @@ async fn case() -> anyhow::Result<()> {
assert_eq!(rv.return_value, expected);

// check block_height
let selector = build_selector("a2969adc", None)?;
let selector = transcoder.encode::<_, String>("block_height", [])?;

let rv = ReadContract {
caller: sp_keyring::AccountKeyring::Alice,
Expand All @@ -80,12 +83,7 @@ async fn case() -> anyhow::Result<()> {
assert!((decoded - rpc_block_number as i64).abs() <= 3);

// check gas burn
let selector = build_selector(
"2c5b8945",
Some(&mut |s| {
0_u64.encode_to(s);
}),
)?;
let selector = transcoder.encode::<_, String>("burn_gas", [format!("{}", 0_u64)])?;

let rv = ReadContract {
caller: sp_keyring::AccountKeyring::Alice,
Expand All @@ -104,12 +102,7 @@ async fn case() -> anyhow::Result<()> {

for i in 1_u64..100 {
// check gas burn
let selector = build_selector(
"2c5b8945",
Some(&mut |s| {
i.encode_to(s);
}),
)?;
let selector = transcoder.encode::<_, String>("burn_gas", [format!("{}", i)])?;

let rv = ReadContract {
caller: sp_keyring::AccountKeyring::Alice,
Expand Down
30 changes: 18 additions & 12 deletions integration/subxt-tests/src/cases/create_contract.rs
Original file line number Diff line number Diff line change
@@ -1,21 +1,30 @@
use std::str::FromStr;

use contract_transcode::ContractMessageTranscoder;
use hex::FromHex;
use parity_scale_codec::{Decode, Encode};
use sp_core::{crypto::AccountId32, hexdisplay::AsBytesRef, H256};

use crate::{
build_selector, node, DeployContract, Execution, ReadContract, ReadLayout, WriteContract, API,
build_selector, free_balance_of, load_project, node, DeployContract, Execution, ReadContract,
ReadLayout, WriteContract, API,
};

#[tokio::test]
async fn case() -> anyhow::Result<()> {
let api = API::new().await?;

let creator_code = std::fs::read("./contracts/creator.wasm")?;

let p_creator = load_project("./contracts/creator.contract")?;
let t_creator = ContractMessageTranscoder::new(&p_creator);

let child_code = std::fs::read("./contracts/child.wasm")?;

let selector = build_selector("861731d5", None)?;
let p_child = load_project("./contracts/child.contract")?;
let t_child = ContractMessageTranscoder::new(&p_child);

let selector = t_creator.encode::<_, String>("new", [])?;

let creator = DeployContract {
caller: sp_keyring::AccountKeyring::Alice,
Expand All @@ -26,7 +35,7 @@ async fn case() -> anyhow::Result<()> {
.execute(&api)
.await?;

let selector = build_selector("861731d5", None)?;
let selector = t_child.encode::<_, String>("new", [])?;

// upload child code hash for creator to use it
DeployContract {
Expand All @@ -38,7 +47,7 @@ async fn case() -> anyhow::Result<()> {
.execute(&api)
.await?;

let selector = build_selector("c5095d7e", None)?;
let selector = t_creator.encode::<_, String>("create_child", [])?;

WriteContract {
caller: sp_keyring::AccountKeyring::Alice,
Expand All @@ -49,7 +58,7 @@ async fn case() -> anyhow::Result<()> {
.execute(&api)
.await?;

let selector = build_selector("58926a71", None)?;
let selector = t_creator.encode::<_, String>("call_child", [])?;

let rv = ReadContract {
caller: sp_keyring::AccountKeyring::Alice,
Expand All @@ -63,7 +72,7 @@ async fn case() -> anyhow::Result<()> {

assert_eq!(rv, "child");

let selector = build_selector("58926a71", None)?;
let selector = t_creator.encode::<_, String>("call_child", [])?;

let rv = ReadContract {
caller: sp_keyring::AccountKeyring::Alice,
Expand All @@ -77,8 +86,7 @@ async fn case() -> anyhow::Result<()> {

assert_eq!(rv, "child");

// the selector for storage is keccak hashed string of `$var()`
let selector = build_selector("c3da42b8", None)?;
let selector = t_creator.encode::<_, String>("c", [])?;

let child_addr = ReadContract {
caller: sp_keyring::AccountKeyring::Alice,
Expand All @@ -90,11 +98,9 @@ async fn case() -> anyhow::Result<()> {
.await
.and_then(|v| <AccountId32>::decode(&mut v.return_value.as_bytes_ref()).map_err(Into::into))?;

let key = node::storage().system().account(child_addr);

let child_balance_rpc = api.storage().fetch_or_default(&key, None).await?;
let child_balance_rpc = free_balance_of(&api, child_addr).await?;

assert!(10_u128.pow(15) - child_balance_rpc.data.free < 10_u128.pow(11));
assert!(10_u128.pow(15) - child_balance_rpc < 10_u128.pow(11));

Ok(())
}
24 changes: 14 additions & 10 deletions integration/subxt-tests/src/cases/destruct.rs
Original file line number Diff line number Diff line change
@@ -1,16 +1,21 @@
use contract_transcode::ContractMessageTranscoder;
use parity_scale_codec::{Decode, Encode};
use sp_core::hexdisplay::AsBytesRef;

use crate::{
build_selector, free_balance_of, DeployContract, Execution, ReadContract, WriteContract, API,
build_selector, free_balance_of, load_project, DeployContract, Execution, ReadContract,
WriteContract, API,
};

#[tokio::test]
async fn case() -> anyhow::Result<()> {
let api = API::new().await?;
let code = std::fs::read("./contracts/destruct.wasm")?;

let selector = build_selector("861731d5", None)?;
let p = load_project("./contracts/destruct.contract")?;
let transcoder = ContractMessageTranscoder::new(&p);

let selector = transcoder.encode::<_, String>("new", [])?;

let deployed = DeployContract {
caller: sp_keyring::AccountKeyring::Alice,
Expand All @@ -21,7 +26,7 @@ async fn case() -> anyhow::Result<()> {
.execute(&api)
.await?;

let selector = build_selector("19ff1d21", None)?;
let selector = transcoder.encode::<_, String>("hello", [])?;

let rv = ReadContract {
caller: sp_keyring::AccountKeyring::Alice,
Expand All @@ -39,13 +44,12 @@ async fn case() -> anyhow::Result<()> {
free_balance_of(&api, sp_keyring::AccountKeyring::Dave.to_account_id()).await?;
let contract_before = free_balance_of(&api, deployed.contract_address.clone()).await?;

let selector = build_selector(
"ea19c3d5",
Some(&mut |s| {
sp_keyring::AccountKeyring::Dave
.to_account_id()
.encode_to(s);
}),
let selector = transcoder.encode::<_, String>(
"selfterminate",
[format!(
"0x{}",
hex::encode(sp_keyring::AccountKeyring::Dave.to_account_id())
)],
)?;

WriteContract {
Expand Down
Loading

0 comments on commit a8d68ea

Please sign in to comment.