Skip to content

Commit

Permalink
Merge pull request #835 from rainlanguage/2024-09-06-local-evm
Browse files Browse the repository at this point in the history
local evm test helper
  • Loading branch information
hardyjosh authored Sep 6, 2024
2 parents 8262193 + 85ee887 commit 4c9fdee
Show file tree
Hide file tree
Showing 16 changed files with 567 additions and 183 deletions.
30 changes: 20 additions & 10 deletions Cargo.lock

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

4 changes: 4 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ resolver = "2"
[workspace.package]
edition = "2021"
license = "CAL-1.0"
version = "0.0.0-alpha.0"
homepage = "https://github.com/rainprotocol/rain.orderbook"

[workspace.dependencies]
Expand Down Expand Up @@ -71,3 +72,6 @@ path = "crates/settings"

[workspace.dependencies.rain_orderbook_quote]
path = "crates/quote"

[workspace.dependencies.rain_orderbook_test_fixtures]
path = "crates/test_fixtures"
2 changes: 1 addition & 1 deletion crates/bindings/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "rain_orderbook_bindings"
description = "Bindings for the Rain Orderbook Solidity contracts to Rust types."
version = "0.1.0"
version.workspace = true
edition.workspace = true
license.workspace = true
homepage.workspace = true
Expand Down
8 changes: 4 additions & 4 deletions crates/cli/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
[package]
name = "rain_orderbook_cli"
version = "0.0.4"
edition = "2021"
license = "CAL-1.0"
description = "Rain Orderbook CLI."
homepage = "https://github.com/rainprotocol/rain.orderbook"
version.workspace = true
edition.workspace = true
license.workspace = true
homepage.workspace = true

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

Expand Down
11 changes: 6 additions & 5 deletions crates/common/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
[package]
name = "rain_orderbook_common"
version = "0.0.1"
edition = "2021"
license = "CAL-1.0"
description = "Rain Orderbook CLI."
homepage = "https://github.com/rainprotocol/rain.orderbook"
version.workspace = true
edition.workspace = true
license.workspace = true
homepage.workspace = true

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

Expand Down Expand Up @@ -56,4 +56,5 @@ tsify = { version = "0.4.5", default-features = false, features = ["js", "wasm-b
tokio = { workspace = true, features = ["sync", "macros", "io-util", "rt", "time"] }

[dev-dependencies]
httpmock = "0.7.0"
httpmock = "0.7.0"
rain_orderbook_test_fixtures = { workspace = true }
177 changes: 159 additions & 18 deletions crates/common/src/replays/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,36 +42,177 @@ impl TradeReplayer {
#[cfg(test)]
mod tests {
use super::*;
use alloy::primitives::U256;
use rain_orderbook_env::CI_DEPLOY_POLYGON_RPC_URL;
use std::str::FromStr;
use crate::{add_order::AddOrderArgs, dotrain_order::DotrainOrder};
use alloy::{
network::TransactionBuilder,
primitives::{
utils::{parse_ether, parse_units},
Bytes, U256,
},
rpc::types::TransactionRequest,
sol_types::SolCall,
};
use rain_orderbook_test_fixtures::{LocalEvm, Orderbook};

#[tokio::test(flavor = "multi_thread", worker_threads = 10)]
async fn test_trade_replayer() {
let mut local_evm = LocalEvm::new().await;

let token1_holder = local_evm.signer_wallets[0].default_signer().address();
let token2_holder = local_evm.signer_wallets[1].default_signer().address();

let token1 = local_evm
.deploy_new_token(
"T1",
"T1",
18,
parse_units("100", 18).unwrap().into(),
token1_holder,
)
.await;
let token2 = local_evm
.deploy_new_token(
"T2",
"T2",
18,
parse_units("100", 18).unwrap().into(),
token2_holder,
)
.await;
let orderbook = &local_evm.orderbook;

let dotrain = format!(
r#"
networks:
polygon:
rpc: {rpc_url}
chain-id: 137
network-id: 137
currency: MATIC
deployers:
polygon:
address: {deployer}
tokens:
eth:
network: polygon
address: {token2}
decimals: 18
label: Ethereum
symbol: ETH
dai:
network: polygon
address: {token1}
decimals: 18
label: Dai
symbol: DAI
orderbook:
polygon:
address: {orderbook}
orders:
polygon:
inputs:
- token: eth
outputs:
- token: dai
vault-id: 0x01
scenarios:
polygon:
deployments:
polygon:
scenario: polygon
order: polygon
---
#calculate-io
amount price: 2 1;
#handle-add-order
:;
#handle-io
:;
"#,
rpc_url = local_evm.url(),
orderbook = orderbook.address(),
deployer = local_evm.deployer.address(),
token1 = token1.address(),
token2 = token2.address(),
);

// add order
let order = DotrainOrder::new(dotrain.clone(), None).await.unwrap();
let deployment = order.config().deployments["polygon"].as_ref().clone();
let calldata = AddOrderArgs::new_from_deployment(dotrain, deployment)
.await
.unwrap()
.try_into_call(local_evm.url())
.await
.unwrap()
.abi_encode();
let tx = TransactionRequest::default()
.with_input(calldata)
.with_to(*orderbook.address())
.with_from(token1_holder);
local_evm.send_transaction(tx).await.unwrap();

let filter = orderbook.AddOrderV2_filter();
let logs = filter.query().await.unwrap();
let order = logs[0].0.order.clone();

// approve and deposit Token1
local_evm
.send_contract_transaction(
token1.approve(*orderbook.address(), parse_ether("1000").unwrap()),
)
.await
.unwrap();
local_evm
.send_contract_transaction(orderbook.deposit2(
*token1.address(),
U256::from(0x01),
parse_ether("10").unwrap(),
vec![],
))
.await
.unwrap();

// approve T2 spending for token2 holder for orderbook
local_evm
.send_contract_transaction(
token2
.approve(*orderbook.address(), parse_ether("1000").unwrap())
.from(token2_holder),
)
.await
.unwrap();
// take order from token2 holder
let config = Orderbook::TakeOrdersConfigV3 {
orders: vec![Orderbook::TakeOrderConfigV3 {
order,
inputIOIndex: U256::from(0),
outputIOIndex: U256::from(0),
signedContext: vec![],
}],
maximumIORatio: U256::MAX,
maximumInput: U256::MAX,
minimumInput: U256::from(1),
data: Bytes::new(),
};
let tx = local_evm
.send_contract_transaction(orderbook.takeOrders2(config).from(token2_holder))
.await
.unwrap();

let mut replayer = TradeReplayer::new(NewTradeReplayer {
fork_url: Url::from_str(CI_DEPLOY_POLYGON_RPC_URL).unwrap(),
fork_url: local_evm.url().as_str().try_into().unwrap(),
})
.await
.unwrap();

let tx_hash: Result<alloy::primitives::FixedBytes<32>, alloy::hex::FromHexError> =
B256::from_str("0xceb48768613542fe2a05504200caa47dc19c4e508bd70ec3b18e648eebf58177");

let res = replayer.replay_tx(tx_hash.unwrap()).await.unwrap();
let res = replayer.replay_tx(tx.transaction_hash).await.unwrap();

let vec = vec![
118952503035253418u128,
59922244745766602640u128,
7185901000000000000u128,
59922244745766602640u128,
713360056497221460u128,
1724882671000000000000000000u128,
1724882755000000000000000000,
];
let vec = vec![1000000000000000000u128, 2000000000000000000u128];

let expected_stack: Vec<U256> = vec.into_iter().map(U256::from).collect();

assert_eq!(res.traces[1].stack, expected_stack);
assert_eq!(res.traces.len(), 16);
assert_eq!(res.traces.len(), 2);
}
}
2 changes: 1 addition & 1 deletion crates/env/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rain-orderbook-env"
version = "0.0.0"
version.workspace = true
edition.workspace = true
license.workspace = true
homepage.workspace = true
Expand Down
12 changes: 5 additions & 7 deletions crates/integration_tests/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
[package]
name = "rain_orderbook_integration_tests"
version = "0.1.0"
version.workspace = true
edition.workspace = true
license.workspace = true
homepage.workspace = true

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
alloy = { workspace = true, features = ["full", "node-bindings"] }
rain-orderbook-env = { workspace = true }
rain_orderbook_common = { workspace = true }
rain_orderbook_app_settings = { workspace = true }

[dev-dependencies]
tokio = { workspace = true }
rain_orderbook_test_fixtures = { workspace = true }
alloy = { workspace = true, features = ["full", "node-bindings"] }
rain_orderbook_common = { workspace = true }
serde_json = { workspace = true }
Loading

0 comments on commit 4c9fdee

Please sign in to comment.