From eb6af224dabbed1929e83aec7378ce5079451c3a Mon Sep 17 00:00:00 2001 From: Colin Roberts Date: Thu, 10 Aug 2023 18:22:23 -0400 Subject: [PATCH 1/9] minimum feature set remove unused deps readme + version --- Cargo.toml | 6 +- README.md | 40 +------- arbiter-core/Cargo.toml | 6 +- arbiter-core/README.md | 9 -- arbiter-core/src/environment.rs | 132 +++++++++++++++++---------- arbiter-core/src/lib.rs | 2 +- arbiter-core/src/manager.rs | 50 ++++++---- arbiter-core/src/math.rs | 3 +- arbiter-core/src/middleware.rs | 13 +-- arbiter-core/src/tests/management.rs | 8 +- arbiter-core/src/tests/mod.rs | 44 ++++----- 11 files changed, 155 insertions(+), 158 deletions(-) delete mode 100644 arbiter-core/README.md diff --git a/Cargo.toml b/Cargo.toml index 7f7ba525..e8cfd1b6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ members = [ # Package configuration [package] name = "arbiter" -version = "0.3.0" +version = "1.0.0" edition = "2021" authors = ["Colin Roberts", "Waylon Jepsen"] @@ -20,10 +20,6 @@ path = "bin/main.rs" # Dependencies for the release build [dependencies] - -# Local dependencies -arbiter-core = { path = "arbiter-core" } - # Command line and config clap = { version = "4.3.0", features = ["derive"] } serde = { version = "1.0.163", features =["derive"] } diff --git a/README.md b/README.md index 95107704..fd9a1e6f 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,9 @@ [![](https://dcbadge.vercel.app/api/server/primitive?style=flat)](https://discord.gg/primitive) [![Twitter Badge](https://badgen.net/badge/icon/twitter?icon=twitter&label)](https://twitter.com/primitivefi) + +This library enables user to communicate with a sandboxed revm instance via the implementation of the [ethers-rs](ethers.rs) middleware. + The Ethereum blockchain's execution environment, the Ethereum Virtual machine (EVM), contains a rich collection of decentralized applications. The EVM is stack machine that sequentially executes opcodes sent to it by users and smart contracts. Arbiter is a highly configurable rust interface over [revm](https://github.com/bluealloy/revm) which is a Rust implementation of the EVM stack machine logic. The purpose of Arbiter is to interface with arbitrary agents and contracts and run this all directly on a blazing-fast simulated EVM. Financial engineers need to study a wide array of complex portfolio management strategies against thousands of market conditions, contract parameters, and agents. To configure such a rich simulation environment on a test network could be possible, but a more efficient choice for getting the most robust, yet quick, simulations would bypass any local networking and use a low level language's implementation of the EVM. @@ -20,32 +23,6 @@ Arbiter can be used for: - investigating risk, capital efficiency, rebalancing strategies, and portfolio replication (or performance). (LPs, funds, quants, traders) - Engineering and testing new financial products built on top of more primitive financial products (DeFi firms and academics) -## Features: - -For our next beta release, we will be focusing on the following features: - - -## Build From Source - -First, clone the repository to your local environment so - -```bash -git clone https://github.com/primitivefinance/arbiter.git -cd arbiter -``` - -Install arbiter on your system: - -```bash -cargo install --path . --force -``` - -With the `arbiter` binary generated, you can run commands such as: - -```bash -arbiter simulate uniswap -``` - ## Generating Docs To see the documentation for Arbiter, after cloning the repo, you can run: @@ -56,17 +33,6 @@ cargo doc --workspace --no-deps --open This will generate and open the docs in your browser. From there, you can look at the documentation for each crate in the Arbiter workspace. -## Including More Contracts - -In the `contracts/` directory you can add additional smart contracts or regenerate Rust bindings. Once that is done, you will want to make sure the bindings are generated in the script: - -```bash -./bind.sh -``` -You will need to add the relevant directory for your new contracts to the script above and make sure they are also handled by `forge install`. We look forward to improving upon this UX in the future. - -At the moment, this only builds the bindings for the contracts in the `lib/arbmod/contracts/` and `lib/portfolio/contracts`. You can of course add an additional directory of contracts in `lib/`. Just be sure to include it when you generate bindings! - ## Contributing See our [Contributing Guidelines](https://github.com/primitivefinance/arbiter/blob/main/.github/CONTRIBUTING.md) diff --git a/arbiter-core/Cargo.toml b/arbiter-core/Cargo.toml index ca432821..c1bd74c7 100644 --- a/arbiter-core/Cargo.toml +++ b/arbiter-core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "arbiter-core" -version = "0.3.0" +version = "1.0.0" edition = "2021" # Dependencies for the release build @@ -36,4 +36,6 @@ log = "0.4.19" # Dependencies for the test build and development [dev-dependencies] hex = { version = "0.4.3", default-features = false } -anyhow = "1.0.71" \ No newline at end of file +anyhow = "1.0.71" +env_logger = "0.10.0" +test-log = "0.2.12" \ No newline at end of file diff --git a/arbiter-core/README.md b/arbiter-core/README.md deleted file mode 100644 index 101b59bf..00000000 --- a/arbiter-core/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Simulate Crate - -This crate contains agents, price paths, and middleware to interface with revm. There are two primary sub modules in this crate: `agents` and `stochastic`. - -- The `agents` module contains the agents that are used in the simulations, this module is where we define the behavior of different agents in the simulations. We have some pre-built agents, but we anticipate that users will want to build their own agents and for this module to grow with different use cases. - -- The `stochastic` module contains the price paths and other stochastic processes that are used in the simulations. The existing price paths we support (GBM and OU) are defined here. - -- The rest of the files in this crate are concerned with middleware to interface with revm with utils and tools for backtesting with historical data. diff --git a/arbiter-core/src/environment.rs b/arbiter-core/src/environment.rs index e58b357a..5885e592 100644 --- a/arbiter-core/src/environment.rs +++ b/arbiter-core/src/environment.rs @@ -5,6 +5,7 @@ // TODO: Check the publicness of all structs and functions. use std::{ + convert::Infallible, fmt::Debug, sync::{Arc, Condvar, Mutex}, thread::{self, JoinHandle}, @@ -12,55 +13,49 @@ use std::{ use crossbeam_channel::{unbounded, Receiver, Sender}; use ethers::{core::types::U64, types::Log}; +use log::error; use revm::{ db::{CacheDB, EmptyDB}, - primitives::{ExecutionResult, TxEnv, U256}, + primitives::{EVMError, ExecutionResult, TxEnv, U256}, EVM, }; +use thiserror::Error; use crate::{ - agent::{Agent, IsAttached, NotAttached}, math::*, middleware::RevmMiddleware, }; +pub(crate) type ToTransact = bool; +pub(crate) type ResultSender = Sender; +pub(crate) type ResultReceiver = Receiver; +pub(crate) type TxSender = Sender<(ToTransact, TxEnv, ResultSender)>; +pub(crate) type TxReceiver = Receiver<(ToTransact, TxEnv, ResultSender)>; +pub(crate) type EventSender = Sender>; + pub struct Environment { pub label: String, pub(crate) state: Arc, pub(crate) evm: EVM>, pub(crate) socket: Socket, - pub agents: Vec>>, pub seeded_poisson: SeededPoisson, - pub(crate) handle: Option>, + pub(crate) handle: Option>>, pub(crate) pausevar: Arc<(Mutex<()>, Condvar)>, } -pub(crate) type ToTransact = bool; -pub(crate) type ResultSender = Sender; -pub(crate) type ResultReceiver = Receiver; -pub(crate) type TxSender = Sender<(ToTransact, TxEnv, ResultSender)>; -pub(crate) type TxReceiver = Receiver<(ToTransact, TxEnv, ResultSender)>; +#[derive(Error, Debug)] +pub enum EnvironmentError { + #[error("execution error! the source error is: {cause:?}")] + ExecutionError { cause: EVMError }, -#[atomic_enum::atomic_enum] -#[derive(Eq, PartialEq)] -pub enum State { - Initialization, - Running, - Paused, - Stopped, -} + #[error("error pausing! the source error is: {cause:?}")] + PauseError { cause: String }, -#[derive(Debug, Clone)] -pub(crate) struct Socket { - pub(crate) tx_sender: TxSender, - pub(crate) tx_receiver: TxReceiver, - pub(crate) event_broadcaster: Arc>, -} + #[error("error communicating! the source error is: {cause:?}")] + CommunicationError { cause: String }, -#[derive(Debug, Clone)] -pub(crate) struct RevmResult { - pub(crate) result: ExecutionResult, - pub(crate) block_number: U64, + #[error("conversion error! the source error is: {cause:?}")] + ConversionError { cause: String }, } impl Environment { @@ -85,16 +80,12 @@ impl Environment { state: Arc::new(AtomicState::new(State::Initialization)), evm, socket, - agents: vec![], seeded_poisson, handle: None, pausevar: Arc::new((Mutex::new(()), Condvar::new())), } } - pub fn add_agent(&mut self, agent: Agent) { - agent.attach_to_environment(self); - } pub(crate) fn run(&mut self) { let mut evm = self.evm.clone(); @@ -108,6 +99,7 @@ impl Environment { .store(State::Running, std::sync::atomic::Ordering::Relaxed); let state = Arc::clone(&self.state); let pausevar = Arc::clone(&self.pausevar); + let label = self.label.clone(); let handle = thread::spawn(move || { let mut expected_events_per_block = seeded_poisson.sample(); @@ -116,9 +108,13 @@ impl Environment { State::Stopped => break, State::Paused => { let (lock, cvar) = &*pausevar; - let mut guard = lock.lock().unwrap(); + let mut guard = lock.lock().map_err(|e| EnvironmentError::PauseError { + cause: format!("{:?}", e), + })?; while state.load(std::sync::atomic::Ordering::Relaxed) == State::Paused { - guard = cvar.wait(guard).unwrap(); + guard = cvar.wait(guard).map_err(|e| EnvironmentError::PauseError { + cause: format!("{:?}", e), + })?; } } State::Running => { @@ -133,34 +129,46 @@ impl Environment { if to_transact { let execution_result = match evm.transact_commit() { Ok(val) => val, - // URGENT: change this to a custom error - Err(_) => panic!("failed"), + Err(e) => { + state.store( + State::Paused, + std::sync::atomic::Ordering::Relaxed, + ); + error!("Pausing the environment labeled {} due to an execution error: {:#?}", label, e); + return Err(EnvironmentError::ExecutionError { cause: e }); + } }; - let event_broadcaster = event_broadcaster.lock().unwrap(); + let event_broadcaster = event_broadcaster.lock().map_err(|e| EnvironmentError::CommunicationError { cause: format!("{:?}", e) })?; event_broadcaster.broadcast( crate::middleware::revm_logs_to_ethers_logs( execution_result.logs(), ), - ); + )?; let revm_result = RevmResult { result: execution_result, block_number: convert_uint_to_u64(evm.env.block.number) - .unwrap(), + .map_err(|e| EnvironmentError::ConversionError { cause: format!("{:?}", e) })?, }; - sender.send(revm_result).unwrap(); + sender.send(revm_result).map_err(|e| EnvironmentError::CommunicationError { cause: format!("{:?}", e) })?; counter += 1; } else { - let execution_result = match evm.transact() { - Ok(val) => val, - // URGENT: change this to a custom error - Err(_) => panic!("failed"), + let result = match evm.transact() { + Ok(result_and_state) => result_and_state.result, + Err(e) => { + state.store( + State::Paused, + std::sync::atomic::Ordering::Relaxed, + ); + error!("Pausing the environment labeled {} due to an execution error: {:#?}", label, e); + return Err(EnvironmentError::ExecutionError { cause: e }); + } }; let result_and_block = RevmResult { - result: execution_result.result, + result, block_number: convert_uint_to_u64(evm.env.block.number) - .unwrap(), + .map_err(|e| EnvironmentError::ConversionError { cause: format!("{:?}", e) })?, }; - sender.send(result_and_block).unwrap(); + sender.send(result_and_block).map_err(|e| EnvironmentError::CommunicationError { cause: format!("{:?}", e) })?; } } } @@ -169,27 +177,51 @@ impl Environment { } } } + Ok(()) }); self.handle = Some(handle); } } +#[atomic_enum::atomic_enum] +#[derive(Eq, PartialEq)] +pub enum State { + Initialization, + Running, + Paused, + Stopped, +} + +#[derive(Debug, Clone)] +pub(crate) struct Socket { + pub(crate) tx_sender: TxSender, + pub(crate) tx_receiver: TxReceiver, + pub(crate) event_broadcaster: Arc>, +} + +#[derive(Debug, Clone)] +pub(crate) struct RevmResult { + pub(crate) result: ExecutionResult, + pub(crate) block_number: U64, +} + #[derive(Clone, Debug)] -pub struct EventBroadcaster(Vec>>); +pub struct EventBroadcaster(Vec); impl EventBroadcaster { pub(crate) fn new() -> Self { Self(vec![]) } - pub(crate) fn add_sender(&mut self, sender: crossbeam_channel::Sender>) { + pub(crate) fn add_sender(&mut self, sender: EventSender) { self.0.push(sender); } - pub(crate) fn broadcast(&self, logs: Vec) { + pub(crate) fn broadcast(&self, logs: Vec) -> Result<(), EnvironmentError> { for sender in &self.0 { - sender.send(logs.clone()).unwrap(); + sender.send(logs.clone()).map_err(|e| EnvironmentError::CommunicationError { cause: format!("{:?}", e) })?; } + Ok(()) } } diff --git a/arbiter-core/src/lib.rs b/arbiter-core/src/lib.rs index 5149e842..83a2445a 100644 --- a/arbiter-core/src/lib.rs +++ b/arbiter-core/src/lib.rs @@ -1,6 +1,6 @@ #![warn(missing_docs, unsafe_code)] -pub mod agent; +// pub mod agent; pub mod bindings; // TODO: Add better documentation here and some kind of overwrite protection. pub mod environment; pub mod manager; diff --git a/arbiter-core/src/manager.rs b/arbiter-core/src/manager.rs index fecdd4e2..c4d8b468 100644 --- a/arbiter-core/src/manager.rs +++ b/arbiter-core/src/manager.rs @@ -8,7 +8,7 @@ use log::{info, warn}; use thiserror::Error; use crate::{ - agent::{Agent, NotAttached}, + // agent::{Agent, NotAttached}, environment::{Environment, State}, }; @@ -144,15 +144,25 @@ impl Manager { label: environment_label.into(), }), State::Running => { - environment.state.store(State::Stopped, std::sync::atomic::Ordering::Relaxed); + environment + .state + .store(State::Stopped, std::sync::atomic::Ordering::Relaxed); environment.handle.take().unwrap().join().unwrap(); // these unwraps should never fail - warn!("Stopped running environment labeled {}", environment_label.into()); + warn!( + "Stopped running environment labeled {}", + environment_label.into() + ); Ok(()) } State::Paused => { - environment.state.store(State::Stopped, std::sync::atomic::Ordering::Relaxed); + environment + .state + .store(State::Stopped, std::sync::atomic::Ordering::Relaxed); environment.handle.take().unwrap().join().unwrap(); // these unwraps should never fail - warn!("Stopped paused environment labeled {}", environment_label.into()); + warn!( + "Stopped paused environment labeled {}", + environment_label.into() + ); Ok(()) } State::Stopped => Err(ManagerError::EnvironmentStopped { @@ -165,21 +175,21 @@ impl Manager { } } - pub fn add_agent( - &mut self, - agent: Agent, - environment_label: String, - ) -> Result<(), ManagerError> { - match self.environments.get_mut(&environment_label) { - Some(environment) => { - environment.add_agent(agent); - Ok(()) - } - None => Err(ManagerError::EnvironmentDoesNotExist { - label: environment_label, - }), - } - } + // pub fn add_agent( + // &mut self, + // agent: Agent, + // environment_label: String, + // ) -> Result<(), ManagerError> { + // match self.environments.get_mut(&environment_label) { + // Some(environment) => { + // environment.add_agent(agent); + // Ok(()) + // } + // None => Err(ManagerError::EnvironmentDoesNotExist { + // label: environment_label, + // }), + // } + // } } #[cfg(test)] diff --git a/arbiter-core/src/math.rs b/arbiter-core/src/math.rs index 5d3d5914..930d2023 100644 --- a/arbiter-core/src/math.rs +++ b/arbiter-core/src/math.rs @@ -17,13 +17,12 @@ pub struct SeededPoisson { } impl SeededPoisson { - /// Create new Poisson process with seed. pub fn new(lambda: f64, seed: u64) -> Self { let distribution = Poisson::new(lambda).unwrap(); let rng = StdRng::seed_from_u64(seed); Self { distribution, rng } } - /// Sample Poisson process. + pub fn sample(&mut self) -> usize { self.distribution.sample(&mut self.rng) as usize } diff --git a/arbiter-core/src/middleware.rs b/arbiter-core/src/middleware.rs index 3a1e6f0c..172faf5f 100644 --- a/arbiter-core/src/middleware.rs +++ b/arbiter-core/src/middleware.rs @@ -27,12 +27,12 @@ use ethers::{ Log, }, }; -use rand::{rngs::StdRng, SeedableRng}; +use rand::{rngs::{StdRng, OsRng}, SeedableRng}; use revm::primitives::{CreateScheme, ExecutionResult, Output, TransactTo, TxEnv, B160, U256}; use serde::{de::DeserializeOwned, Serialize}; use crate::{ - agent::{Agent, NotAttached}, + // agent::{Agent, NotAttached}, environment::{Environment, EventBroadcaster, ResultReceiver, ResultSender, TxSender}, }; @@ -51,6 +51,7 @@ pub(crate) struct FilterReceiver { pub(crate) receiver: crossbeam_channel::Receiver>, } +#[allow(clippy::never_loop)] #[async_trait::async_trait] impl JsonRpcClient for Connection { type Error = ProviderError; @@ -97,7 +98,7 @@ pub struct RevmMiddleware { } impl RevmMiddleware { - pub fn new(agent: &Agent, environment: &Environment) -> Self { + pub fn new(environment: &Environment) -> Self { let tx_sender = environment.socket.tx_sender.clone(); let (result_sender, result_receiver) = crossbeam_channel::unbounded(); let connection = Connection { @@ -109,9 +110,9 @@ impl RevmMiddleware { }; let provider = Provider::new(connection); let mut hasher = Sha256::new(); - hasher.update(agent.name.as_bytes()); - let seed = hasher.finalize(); - let mut rng = StdRng::from_seed(seed.into()); + // hasher.update(agent.name.as_bytes()); + // let seed = hasher.finalize(); + let mut rng = OsRng::default(); let wallet = Wallet::new(&mut rng); Self { provider, wallet } } diff --git a/arbiter-core/src/tests/management.rs b/arbiter-core/src/tests/management.rs index 6acbd481..d818f590 100644 --- a/arbiter-core/src/tests/management.rs +++ b/arbiter-core/src/tests/management.rs @@ -1,6 +1,6 @@ use super::*; -#[test] +#[test_log::test] fn add_environment() { let mut manager = Manager::new(); manager.add_environment(TEST_ENV_LABEL, 1.0, 1).unwrap(); @@ -18,7 +18,7 @@ fn add_environment() { ); } -#[test] +#[test_log::test] fn run_environment() { let mut manager = Manager::new(); manager.add_environment(TEST_ENV_LABEL, 1.0, 1).unwrap(); @@ -34,7 +34,7 @@ fn run_environment() { ); } -#[test] +#[test_log::test] fn pause_environment() { let mut manager = Manager::new(); manager.add_environment(TEST_ENV_LABEL, 1.0, 1).unwrap(); @@ -63,7 +63,7 @@ fn pause_environment() { ); } -#[test] +#[test_log::test] fn stop_environment() { let mut manager = Manager::new(); manager.add_environment(TEST_ENV_LABEL, 1.0, 1).unwrap(); diff --git a/arbiter-core/src/tests/mod.rs b/arbiter-core/src/tests/mod.rs index 02c0b506..346f3934 100644 --- a/arbiter-core/src/tests/mod.rs +++ b/arbiter-core/src/tests/mod.rs @@ -1,6 +1,6 @@ #![allow(missing_docs)] -mod interaction; +// mod interaction; mod management; use std::str::FromStr; @@ -12,7 +12,7 @@ use ethers::{ }; use crate::{ - agent::{tests::TEST_AGENT_NAME, *}, + // agent::{tests::TEST_AGENT_NAME, *}, bindings::arbiter_token::*, environment::{tests::TEST_ENV_LABEL, *}, manager::*, @@ -29,23 +29,23 @@ pub const TEST_APPROVAL_AMOUNT: u128 = 420; //TODO: Send a tx before and after pausing the environment. -async fn deploy_and_start() -> Result<(ArbiterToken, Environment)> { - let mut environment = Environment::new(TEST_ENV_LABEL, 1.0, 1); - let agent = Agent::new(TEST_AGENT_NAME); - agent.attach_to_environment(&mut environment); - environment.run(); - Ok(( - ArbiterToken::deploy( - environment.agents[0].client.clone(), - ( - TEST_ARG_NAME.to_string(), - TEST_ARG_SYMBOL.to_string(), - TEST_ARG_DECIMALS, - ), - )? - .send() - .await - .unwrap(), - environment, - )) -} +// async fn deploy_and_start() -> Result<(ArbiterToken, Environment)> { +// let mut environment = Environment::new(TEST_ENV_LABEL, 1.0, 1); +// let agent = Agent::new(TEST_AGENT_NAME); +// agent.attach_to_environment(&mut environment); +// environment.run(); +// Ok(( +// ArbiterToken::deploy( +// environment.agents[0].client.clone(), +// ( +// TEST_ARG_NAME.to_string(), +// TEST_ARG_SYMBOL.to_string(), +// TEST_ARG_DECIMALS, +// ), +// )? +// .send() +// .await +// .unwrap(), +// environment, +// )) +// } From 3a219629ff725b57d369a601283ac84608dda5a9 Mon Sep 17 00:00:00 2001 From: Waylon Jepsen Date: Mon, 14 Aug 2023 09:16:17 -0700 Subject: [PATCH 2/9] Update middleware.rs --- arbiter-core/src/middleware.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/arbiter-core/src/middleware.rs b/arbiter-core/src/middleware.rs index 172faf5f..473168ae 100644 --- a/arbiter-core/src/middleware.rs +++ b/arbiter-core/src/middleware.rs @@ -109,9 +109,6 @@ impl RevmMiddleware { filter_receivers: Arc::new(tokio::sync::Mutex::new(HashMap::new())), }; let provider = Provider::new(connection); - let mut hasher = Sha256::new(); - // hasher.update(agent.name.as_bytes()); - // let seed = hasher.finalize(); let mut rng = OsRng::default(); let wallet = Wallet::new(&mut rng); Self { provider, wallet } From a0817e0414799367d6941033ef57c2279864ffce Mon Sep 17 00:00:00 2001 From: Waylon Jepsen Date: Mon, 14 Aug 2023 09:20:39 -0700 Subject: [PATCH 3/9] Here i add back the address determinism, get the tests to pass and revert the premature version changes Update manager.rs Delete agent.rs --- Cargo.toml | 2 +- arbiter-core/Cargo.toml | 2 +- arbiter-core/src/agent.rs | 118 -------------------------- arbiter-core/src/environment.rs | 6 +- arbiter-core/src/manager.rs | 21 +---- arbiter-core/src/middleware.rs | 30 ++++--- arbiter-core/src/tests/interaction.rs | 26 +++--- arbiter-core/src/tests/mod.rs | 50 ++++++----- arbiter-core/src/tests/strategies.rs | 30 +++---- 9 files changed, 77 insertions(+), 208 deletions(-) delete mode 100644 arbiter-core/src/agent.rs diff --git a/Cargo.toml b/Cargo.toml index e8cfd1b6..e17646d9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ members = [ # Package configuration [package] name = "arbiter" -version = "1.0.0" +version = "0.3.0" edition = "2021" authors = ["Colin Roberts", "Waylon Jepsen"] diff --git a/arbiter-core/Cargo.toml b/arbiter-core/Cargo.toml index c1bd74c7..891cd954 100644 --- a/arbiter-core/Cargo.toml +++ b/arbiter-core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "arbiter-core" -version = "1.0.0" +version = "0.3.0" edition = "2021" # Dependencies for the release build diff --git a/arbiter-core/src/agent.rs b/arbiter-core/src/agent.rs deleted file mode 100644 index fe57d1de..00000000 --- a/arbiter-core/src/agent.rs +++ /dev/null @@ -1,118 +0,0 @@ -#![allow(missing_docs)] -#![warn(unsafe_code)] - -use std::sync::Arc; - -use ethers::providers::Middleware; - -use crate::{environment::Environment, middleware::RevmMiddleware}; - -pub trait Attached { - type Client; -} -pub struct IsAttached { - marker: std::marker::PhantomData, -} -pub struct NotAttached {} -impl Attached for IsAttached { - type Client = Arc; -} -impl Attached for NotAttached { - type Client = (); -} - -pub struct Agent { - pub name: String, - pub client: A::Client, - pub behaviors: Vec>, -} - -impl Agent { - pub fn new>(name: S) -> Self { - Self { - name: name.into(), - client: (), - behaviors: vec![], - } - } - - pub fn add_behavior(&mut self, behavior: B) - where - B: Behavior + 'static, - { - self.behaviors.push(Box::new(behavior)); - } - - pub fn attach_to_client(self, client: Arc) -> Agent> { - Agent::> { - name: self.name, - client, - behaviors: self.behaviors, - } - } - - pub fn attach_to_environment(self, environment: &mut Environment) { - let middleware = Arc::new(RevmMiddleware::new(&self, environment)); - let agent_attached = self.attach_to_client(middleware); - environment.agents.push(agent_attached); - } -} - -// TODO: Note -- Artemis uses a `process_event` function that returns an `Option` for something to happen. -// https://github.com/paradigmxyz/artemis/blob/c8ab223a363a875f685ab177839eacfffc9d8de0/crates/artemis-core/src/types.rs#L25 -#[async_trait::async_trait] -pub trait Behavior: Send + Sync { - async fn process_event(&mut self) -> bool; - fn sync_state(&mut self); -} - -#[cfg(test)] -pub(crate) mod tests { - pub(crate) const TEST_AGENT_NAME: &str = "test_agent"; - pub(crate) const TEST_BEHAVIOR_DATA: &str = "test_behavior_data"; - - use ethers::providers::{MockProvider, ProviderError}; - - use super::*; - - #[derive(Debug)] - pub(crate) struct TestMiddleware {} - - impl Middleware for TestMiddleware { - type Inner = Self; - type Provider = MockProvider; - type Error = ProviderError; - - fn inner(&self) -> &Self::Inner { - self - } - } - - pub(crate) struct TestBehavior { - data: String, - } - - #[async_trait::async_trait] - impl Behavior for TestBehavior { - async fn process_event(&mut self) -> bool { - true - } - fn sync_state(&mut self) { - assert_eq!(self.data, TEST_BEHAVIOR_DATA.to_string()); - } - } - - #[tokio::test] - async fn agent_behavior() { - let name = TEST_AGENT_NAME.to_string(); - let mut agent = Agent::new(name); - - // Add a behavior of the first type. - let data = TEST_BEHAVIOR_DATA.to_string(); - let behavior = TestBehavior { data }; - agent.add_behavior(behavior); - assert!(agent.behaviors.len() == 1); - assert!(agent.behaviors[0].process_event().await); - agent.behaviors[0].sync_state(); - } -} diff --git a/arbiter-core/src/environment.rs b/arbiter-core/src/environment.rs index 820b7320..7c068ccd 100644 --- a/arbiter-core/src/environment.rs +++ b/arbiter-core/src/environment.rs @@ -21,10 +21,7 @@ use revm::{ }; use thiserror::Error; -use crate::{ - math::*, - middleware::RevmMiddleware, -}; +use crate::{math::*, middleware::RevmMiddleware}; pub(crate) type ToTransact = bool; pub(crate) type ResultSender = Sender; @@ -86,7 +83,6 @@ impl Environment { } } - pub(crate) fn run(&mut self) { let mut evm = self.evm.clone(); let tx_receiver = self.socket.tx_receiver.clone(); diff --git a/arbiter-core/src/manager.rs b/arbiter-core/src/manager.rs index c4d8b468..d96b4b34 100644 --- a/arbiter-core/src/manager.rs +++ b/arbiter-core/src/manager.rs @@ -7,10 +7,7 @@ use std::collections::HashMap; use log::{info, warn}; use thiserror::Error; -use crate::{ - // agent::{Agent, NotAttached}, - environment::{Environment, State}, -}; +use crate::environment::{Environment, State}; #[derive(Default)] pub struct Manager { @@ -174,22 +171,6 @@ impl Manager { }), } } - - // pub fn add_agent( - // &mut self, - // agent: Agent, - // environment_label: String, - // ) -> Result<(), ManagerError> { - // match self.environments.get_mut(&environment_label) { - // Some(environment) => { - // environment.add_agent(agent); - // Ok(()) - // } - // None => Err(ManagerError::EnvironmentDoesNotExist { - // label: environment_label, - // }), - // } - // } } #[cfg(test)] diff --git a/arbiter-core/src/middleware.rs b/arbiter-core/src/middleware.rs index 0c733a7d..0d92d7fd 100644 --- a/arbiter-core/src/middleware.rs +++ b/arbiter-core/src/middleware.rs @@ -10,6 +10,7 @@ use std::{ }; use ethers::{ + core::rand::{rngs::StdRng, thread_rng, SeedableRng}, prelude::{ k256::{ ecdsa::SigningKey, @@ -28,16 +29,12 @@ use ethers::{ Log, }, }; -use rand::{rngs::{StdRng, OsRng}, SeedableRng}; +use rand::rngs; use revm::primitives::{CreateScheme, ExecutionResult, Output, TransactTo, TxEnv, B160, U256}; use serde::{de::DeserializeOwned, Serialize}; use thiserror::Error; -use crate::{ - // agent::{Agent, NotAttached}, - environment::{Environment, EventBroadcaster, ResultReceiver, ResultSender, TxSender}, -}; - +use crate::environment::{Environment, EventBroadcaster, ResultReceiver, ResultSender, TxSender}; #[derive(Debug)] pub struct RevmMiddleware { @@ -85,7 +82,7 @@ impl MiddlewareError for RevmMiddlewareError { } impl RevmMiddleware { - pub fn new(environment: &Environment) -> Self { + pub fn new(environment: &Environment, seed: Option) -> Self { let tx_sender = environment.socket.tx_sender.clone(); let (result_sender, result_receiver) = crossbeam_channel::unbounded(); let connection = Connection { @@ -96,9 +93,22 @@ impl RevmMiddleware { filter_receivers: Arc::new(tokio::sync::Mutex::new(HashMap::new())), }; let provider = Provider::new(connection); - let mut rng = OsRng::default(); - let wallet = Wallet::new(&mut rng); - Self { provider, wallet } + + // let mut rng = thread_rng(); + // let wallet = Wallet::new(&mut rng); + // Self { provider, wallet } + if let Some(seed) = seed { + let mut hasher = Sha256::new(); + hasher.update(seed.clone()); + let hashed = hasher.finalize(); + let mut rng: rngs::StdRng = SeedableRng::from_seed(hashed.into()); + let wallet = Wallet::new(&mut rng); + Self { provider, wallet } + } else { + let mut rng = thread_rng(); + let wallet = Wallet::new(&mut rng); + Self { provider, wallet } + } } } diff --git a/arbiter-core/src/tests/interaction.rs b/arbiter-core/src/tests/interaction.rs index b835b4ed..d7ce66ec 100644 --- a/arbiter-core/src/tests/interaction.rs +++ b/arbiter-core/src/tests/interaction.rs @@ -1,8 +1,10 @@ +use ethers::prelude::Client; + use super::*; #[tokio::test] async fn test_deploy() -> Result<()> { - let (arbiter_token, _environment) = deploy_and_start().await?; + let (arbiter_token, _environment, _) = deploy_and_start().await?; println!("{:?}", arbiter_token); assert_eq!( arbiter_token.address(), @@ -13,7 +15,7 @@ async fn test_deploy() -> Result<()> { #[tokio::test] async fn call() -> Result<()> { - let (arbiter_token, _) = deploy_and_start().await?; + let (arbiter_token, _, _) = deploy_and_start().await?; let admin = arbiter_token.admin(); let output = admin.call().await?; assert_eq!( @@ -25,7 +27,7 @@ async fn call() -> Result<()> { #[tokio::test] async fn transact() -> Result<()> { - let (arbiter_token, _) = deploy_and_start().await?; + let (arbiter_token, _, _) = deploy_and_start().await?; let mint = arbiter_token.mint( Address::from_str(TEST_MINT_TO).unwrap(), ethers::types::U256::from(TEST_MINT_AMOUNT), @@ -58,8 +60,8 @@ async fn transact() -> Result<()> { #[tokio::test] async fn filter_watcher() -> Result<()> { - let (arbiter_token, environment) = deploy_and_start().await.unwrap(); - let client = environment.agents[0].client.clone(); + let (arbiter_token, environment, client) = deploy_and_start().await.unwrap(); + // let client = environment.agents[0].client.clone(); let mut filter_watcher = client.watch(&Filter::default()).await?; let approval = arbiter_token.approve( client.default_sender().unwrap(), @@ -103,8 +105,7 @@ async fn filter_watcher() -> Result<()> { #[tokio::test] async fn filter_address() -> Result<()> { - let (arbiter_token, environment) = deploy_and_start().await.unwrap(); - let client = environment.agents[0].client.clone(); + let (arbiter_token, environment, client) = deploy_and_start().await.unwrap(); let mut default_watcher = client.watch(&Filter::default()).await?; let mut address_watcher = client .watch(&Filter::new().address(arbiter_token.address())) @@ -166,8 +167,7 @@ async fn filter_address() -> Result<()> { #[tokio::test] async fn filter_topics() -> Result<()> { - let (arbiter_token, environment) = deploy_and_start().await.unwrap(); - let client = environment.agents[0].client.clone(); + let (arbiter_token, environment, client) = deploy_and_start().await.unwrap(); let mut default_watcher = client.watch(&Filter::default()).await?; let mut approval_watcher = client .watch(&arbiter_token.approval_filter().filter) @@ -227,17 +227,13 @@ async fn transaction_loop() -> Result<()> { let expected_tx_per_block = dist.sample(); println!("expected_tx_per_block: {}", expected_tx_per_block); - - let agent = Agent::new(TEST_AGENT_NAME); - env.add_agent(agent); - let agent = &env.agents[0]; // tx_0 is the transaction that creates the token contract - let (arbiter_token, _) = deploy_and_start().await?; + let (arbiter_token, env, client) = deploy_and_start().await?; for index in 1..expected_tx_per_block { println!("index: {}", index); let tx = arbiter_token - .mint(agent.client.default_sender().unwrap(), 1000u64.into()) + .mint(client.default_sender().unwrap(), 1000u64.into()) .send() .await .unwrap() diff --git a/arbiter-core/src/tests/mod.rs b/arbiter-core/src/tests/mod.rs index 346f3934..90b0b2cc 100644 --- a/arbiter-core/src/tests/mod.rs +++ b/arbiter-core/src/tests/mod.rs @@ -1,9 +1,11 @@ #![allow(missing_docs)] // mod interaction; +mod interaction; mod management; +mod strategies; -use std::str::FromStr; +use std::{str::FromStr, sync::Arc}; use anyhow::{Ok, Result}; use ethers::{ @@ -29,23 +31,29 @@ pub const TEST_APPROVAL_AMOUNT: u128 = 420; //TODO: Send a tx before and after pausing the environment. -// async fn deploy_and_start() -> Result<(ArbiterToken, Environment)> { -// let mut environment = Environment::new(TEST_ENV_LABEL, 1.0, 1); -// let agent = Agent::new(TEST_AGENT_NAME); -// agent.attach_to_environment(&mut environment); -// environment.run(); -// Ok(( -// ArbiterToken::deploy( -// environment.agents[0].client.clone(), -// ( -// TEST_ARG_NAME.to_string(), -// TEST_ARG_SYMBOL.to_string(), -// TEST_ARG_DECIMALS, -// ), -// )? -// .send() -// .await -// .unwrap(), -// environment, -// )) -// } +async fn deploy_and_start() -> Result<( + ArbiterToken, + Environment, + Arc, +)> { + let mut environment = Environment::new(TEST_ENV_LABEL, 1.0, 1); + + let signer = Arc::new(RevmMiddleware::new(&environment, Some("0".to_string()))); + + environment.run(); + Ok(( + ArbiterToken::deploy( + signer.clone(), + ( + TEST_ARG_NAME.to_string(), + TEST_ARG_SYMBOL.to_string(), + TEST_ARG_DECIMALS, + ), + )? + .send() + .await + .unwrap(), + environment, + signer, + )) +} diff --git a/arbiter-core/src/tests/strategies.rs b/arbiter-core/src/tests/strategies.rs index 59ca694d..b2c52452 100644 --- a/arbiter-core/src/tests/strategies.rs +++ b/arbiter-core/src/tests/strategies.rs @@ -1,20 +1,18 @@ +use std::sync::Arc; + use super::*; -#[test] -fn attach_agent() { - let environment = &mut Environment::new(TEST_ENV_LABEL, 1.0, 1); - let agent = Agent::new(TEST_AGENT_NAME); - agent.attach_to_environment(environment); - assert_eq!(environment.agents[0].name, TEST_AGENT_NAME); -} +const TEST_AGENT_NAME: &str = "test_agent"; #[test] fn simulation_agent_wallet() { let environment = &mut Environment::new(TEST_ENV_LABEL, 1.0, 1); - let agent = Agent::new(TEST_AGENT_NAME); - agent.attach_to_environment(environment); + let client_with_signer = Arc::new(RevmMiddleware::new( + environment, + Some(TEST_AGENT_NAME.to_string()), + )); assert_eq!( - environment.agents[0].client.default_sender().unwrap(), + client_with_signer.default_sender().unwrap(), Address::from_str("0x09e12ce98726acd515b68f87f49dc2e5558f6a72").unwrap() ); } @@ -22,13 +20,11 @@ fn simulation_agent_wallet() { #[test] fn multiple_agent_addresses() { let environment = &mut Environment::new(TEST_ENV_LABEL, 1.0, 1); - let agent = Agent::new(TEST_AGENT_NAME); - agent.attach_to_environment(environment); - let agent2 = Agent::new(format!("new_{}", TEST_AGENT_NAME)); - agent2.attach_to_environment(environment); + let client_1_with_signer = Arc::new(RevmMiddleware::new(environment, Some("0".to_string()))); + let client_2_with_signer = Arc::new(RevmMiddleware::new(environment, Some("1".to_string()))); assert_ne!( - environment.agents[0].client.default_sender(), - environment.agents[1].client.default_sender() + client_1_with_signer.default_sender(), + client_2_with_signer.default_sender() ); } @@ -36,4 +32,4 @@ fn multiple_agent_addresses() { #[test] fn agent_name_collision() { todo!(); -} \ No newline at end of file +} From ff4d782b6acb5d7d3916b0000518a9e82599e433 Mon Sep 17 00:00:00 2001 From: Waylon Jepsen Date: Mon, 14 Aug 2023 15:11:03 -0700 Subject: [PATCH 4/9] This revert is so that the template repo doesn't break This reverts commit a0817e0414799367d6941033ef57c2279864ffce. --- Cargo.toml | 2 +- arbiter-core/Cargo.toml | 2 +- arbiter-core/src/agent.rs | 118 ++++++++++++++++++++++++++ arbiter-core/src/environment.rs | 6 +- arbiter-core/src/manager.rs | 21 ++++- arbiter-core/src/middleware.rs | 30 +++---- arbiter-core/src/tests/interaction.rs | 26 +++--- arbiter-core/src/tests/mod.rs | 50 +++++------ arbiter-core/src/tests/strategies.rs | 30 ++++--- 9 files changed, 208 insertions(+), 77 deletions(-) create mode 100644 arbiter-core/src/agent.rs diff --git a/Cargo.toml b/Cargo.toml index e17646d9..e8cfd1b6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ members = [ # Package configuration [package] name = "arbiter" -version = "0.3.0" +version = "1.0.0" edition = "2021" authors = ["Colin Roberts", "Waylon Jepsen"] diff --git a/arbiter-core/Cargo.toml b/arbiter-core/Cargo.toml index 891cd954..c1bd74c7 100644 --- a/arbiter-core/Cargo.toml +++ b/arbiter-core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "arbiter-core" -version = "0.3.0" +version = "1.0.0" edition = "2021" # Dependencies for the release build diff --git a/arbiter-core/src/agent.rs b/arbiter-core/src/agent.rs new file mode 100644 index 00000000..fe57d1de --- /dev/null +++ b/arbiter-core/src/agent.rs @@ -0,0 +1,118 @@ +#![allow(missing_docs)] +#![warn(unsafe_code)] + +use std::sync::Arc; + +use ethers::providers::Middleware; + +use crate::{environment::Environment, middleware::RevmMiddleware}; + +pub trait Attached { + type Client; +} +pub struct IsAttached { + marker: std::marker::PhantomData, +} +pub struct NotAttached {} +impl Attached for IsAttached { + type Client = Arc; +} +impl Attached for NotAttached { + type Client = (); +} + +pub struct Agent { + pub name: String, + pub client: A::Client, + pub behaviors: Vec>, +} + +impl Agent { + pub fn new>(name: S) -> Self { + Self { + name: name.into(), + client: (), + behaviors: vec![], + } + } + + pub fn add_behavior(&mut self, behavior: B) + where + B: Behavior + 'static, + { + self.behaviors.push(Box::new(behavior)); + } + + pub fn attach_to_client(self, client: Arc) -> Agent> { + Agent::> { + name: self.name, + client, + behaviors: self.behaviors, + } + } + + pub fn attach_to_environment(self, environment: &mut Environment) { + let middleware = Arc::new(RevmMiddleware::new(&self, environment)); + let agent_attached = self.attach_to_client(middleware); + environment.agents.push(agent_attached); + } +} + +// TODO: Note -- Artemis uses a `process_event` function that returns an `Option` for something to happen. +// https://github.com/paradigmxyz/artemis/blob/c8ab223a363a875f685ab177839eacfffc9d8de0/crates/artemis-core/src/types.rs#L25 +#[async_trait::async_trait] +pub trait Behavior: Send + Sync { + async fn process_event(&mut self) -> bool; + fn sync_state(&mut self); +} + +#[cfg(test)] +pub(crate) mod tests { + pub(crate) const TEST_AGENT_NAME: &str = "test_agent"; + pub(crate) const TEST_BEHAVIOR_DATA: &str = "test_behavior_data"; + + use ethers::providers::{MockProvider, ProviderError}; + + use super::*; + + #[derive(Debug)] + pub(crate) struct TestMiddleware {} + + impl Middleware for TestMiddleware { + type Inner = Self; + type Provider = MockProvider; + type Error = ProviderError; + + fn inner(&self) -> &Self::Inner { + self + } + } + + pub(crate) struct TestBehavior { + data: String, + } + + #[async_trait::async_trait] + impl Behavior for TestBehavior { + async fn process_event(&mut self) -> bool { + true + } + fn sync_state(&mut self) { + assert_eq!(self.data, TEST_BEHAVIOR_DATA.to_string()); + } + } + + #[tokio::test] + async fn agent_behavior() { + let name = TEST_AGENT_NAME.to_string(); + let mut agent = Agent::new(name); + + // Add a behavior of the first type. + let data = TEST_BEHAVIOR_DATA.to_string(); + let behavior = TestBehavior { data }; + agent.add_behavior(behavior); + assert!(agent.behaviors.len() == 1); + assert!(agent.behaviors[0].process_event().await); + agent.behaviors[0].sync_state(); + } +} diff --git a/arbiter-core/src/environment.rs b/arbiter-core/src/environment.rs index 7c068ccd..820b7320 100644 --- a/arbiter-core/src/environment.rs +++ b/arbiter-core/src/environment.rs @@ -21,7 +21,10 @@ use revm::{ }; use thiserror::Error; -use crate::{math::*, middleware::RevmMiddleware}; +use crate::{ + math::*, + middleware::RevmMiddleware, +}; pub(crate) type ToTransact = bool; pub(crate) type ResultSender = Sender; @@ -83,6 +86,7 @@ impl Environment { } } + pub(crate) fn run(&mut self) { let mut evm = self.evm.clone(); let tx_receiver = self.socket.tx_receiver.clone(); diff --git a/arbiter-core/src/manager.rs b/arbiter-core/src/manager.rs index d96b4b34..c4d8b468 100644 --- a/arbiter-core/src/manager.rs +++ b/arbiter-core/src/manager.rs @@ -7,7 +7,10 @@ use std::collections::HashMap; use log::{info, warn}; use thiserror::Error; -use crate::environment::{Environment, State}; +use crate::{ + // agent::{Agent, NotAttached}, + environment::{Environment, State}, +}; #[derive(Default)] pub struct Manager { @@ -171,6 +174,22 @@ impl Manager { }), } } + + // pub fn add_agent( + // &mut self, + // agent: Agent, + // environment_label: String, + // ) -> Result<(), ManagerError> { + // match self.environments.get_mut(&environment_label) { + // Some(environment) => { + // environment.add_agent(agent); + // Ok(()) + // } + // None => Err(ManagerError::EnvironmentDoesNotExist { + // label: environment_label, + // }), + // } + // } } #[cfg(test)] diff --git a/arbiter-core/src/middleware.rs b/arbiter-core/src/middleware.rs index 0d92d7fd..0c733a7d 100644 --- a/arbiter-core/src/middleware.rs +++ b/arbiter-core/src/middleware.rs @@ -10,7 +10,6 @@ use std::{ }; use ethers::{ - core::rand::{rngs::StdRng, thread_rng, SeedableRng}, prelude::{ k256::{ ecdsa::SigningKey, @@ -29,12 +28,16 @@ use ethers::{ Log, }, }; -use rand::rngs; +use rand::{rngs::{StdRng, OsRng}, SeedableRng}; use revm::primitives::{CreateScheme, ExecutionResult, Output, TransactTo, TxEnv, B160, U256}; use serde::{de::DeserializeOwned, Serialize}; use thiserror::Error; -use crate::environment::{Environment, EventBroadcaster, ResultReceiver, ResultSender, TxSender}; +use crate::{ + // agent::{Agent, NotAttached}, + environment::{Environment, EventBroadcaster, ResultReceiver, ResultSender, TxSender}, +}; + #[derive(Debug)] pub struct RevmMiddleware { @@ -82,7 +85,7 @@ impl MiddlewareError for RevmMiddlewareError { } impl RevmMiddleware { - pub fn new(environment: &Environment, seed: Option) -> Self { + pub fn new(environment: &Environment) -> Self { let tx_sender = environment.socket.tx_sender.clone(); let (result_sender, result_receiver) = crossbeam_channel::unbounded(); let connection = Connection { @@ -93,22 +96,9 @@ impl RevmMiddleware { filter_receivers: Arc::new(tokio::sync::Mutex::new(HashMap::new())), }; let provider = Provider::new(connection); - - // let mut rng = thread_rng(); - // let wallet = Wallet::new(&mut rng); - // Self { provider, wallet } - if let Some(seed) = seed { - let mut hasher = Sha256::new(); - hasher.update(seed.clone()); - let hashed = hasher.finalize(); - let mut rng: rngs::StdRng = SeedableRng::from_seed(hashed.into()); - let wallet = Wallet::new(&mut rng); - Self { provider, wallet } - } else { - let mut rng = thread_rng(); - let wallet = Wallet::new(&mut rng); - Self { provider, wallet } - } + let mut rng = OsRng::default(); + let wallet = Wallet::new(&mut rng); + Self { provider, wallet } } } diff --git a/arbiter-core/src/tests/interaction.rs b/arbiter-core/src/tests/interaction.rs index d7ce66ec..b835b4ed 100644 --- a/arbiter-core/src/tests/interaction.rs +++ b/arbiter-core/src/tests/interaction.rs @@ -1,10 +1,8 @@ -use ethers::prelude::Client; - use super::*; #[tokio::test] async fn test_deploy() -> Result<()> { - let (arbiter_token, _environment, _) = deploy_and_start().await?; + let (arbiter_token, _environment) = deploy_and_start().await?; println!("{:?}", arbiter_token); assert_eq!( arbiter_token.address(), @@ -15,7 +13,7 @@ async fn test_deploy() -> Result<()> { #[tokio::test] async fn call() -> Result<()> { - let (arbiter_token, _, _) = deploy_and_start().await?; + let (arbiter_token, _) = deploy_and_start().await?; let admin = arbiter_token.admin(); let output = admin.call().await?; assert_eq!( @@ -27,7 +25,7 @@ async fn call() -> Result<()> { #[tokio::test] async fn transact() -> Result<()> { - let (arbiter_token, _, _) = deploy_and_start().await?; + let (arbiter_token, _) = deploy_and_start().await?; let mint = arbiter_token.mint( Address::from_str(TEST_MINT_TO).unwrap(), ethers::types::U256::from(TEST_MINT_AMOUNT), @@ -60,8 +58,8 @@ async fn transact() -> Result<()> { #[tokio::test] async fn filter_watcher() -> Result<()> { - let (arbiter_token, environment, client) = deploy_and_start().await.unwrap(); - // let client = environment.agents[0].client.clone(); + let (arbiter_token, environment) = deploy_and_start().await.unwrap(); + let client = environment.agents[0].client.clone(); let mut filter_watcher = client.watch(&Filter::default()).await?; let approval = arbiter_token.approve( client.default_sender().unwrap(), @@ -105,7 +103,8 @@ async fn filter_watcher() -> Result<()> { #[tokio::test] async fn filter_address() -> Result<()> { - let (arbiter_token, environment, client) = deploy_and_start().await.unwrap(); + let (arbiter_token, environment) = deploy_and_start().await.unwrap(); + let client = environment.agents[0].client.clone(); let mut default_watcher = client.watch(&Filter::default()).await?; let mut address_watcher = client .watch(&Filter::new().address(arbiter_token.address())) @@ -167,7 +166,8 @@ async fn filter_address() -> Result<()> { #[tokio::test] async fn filter_topics() -> Result<()> { - let (arbiter_token, environment, client) = deploy_and_start().await.unwrap(); + let (arbiter_token, environment) = deploy_and_start().await.unwrap(); + let client = environment.agents[0].client.clone(); let mut default_watcher = client.watch(&Filter::default()).await?; let mut approval_watcher = client .watch(&arbiter_token.approval_filter().filter) @@ -227,13 +227,17 @@ async fn transaction_loop() -> Result<()> { let expected_tx_per_block = dist.sample(); println!("expected_tx_per_block: {}", expected_tx_per_block); + + let agent = Agent::new(TEST_AGENT_NAME); + env.add_agent(agent); + let agent = &env.agents[0]; // tx_0 is the transaction that creates the token contract - let (arbiter_token, env, client) = deploy_and_start().await?; + let (arbiter_token, _) = deploy_and_start().await?; for index in 1..expected_tx_per_block { println!("index: {}", index); let tx = arbiter_token - .mint(client.default_sender().unwrap(), 1000u64.into()) + .mint(agent.client.default_sender().unwrap(), 1000u64.into()) .send() .await .unwrap() diff --git a/arbiter-core/src/tests/mod.rs b/arbiter-core/src/tests/mod.rs index 90b0b2cc..346f3934 100644 --- a/arbiter-core/src/tests/mod.rs +++ b/arbiter-core/src/tests/mod.rs @@ -1,11 +1,9 @@ #![allow(missing_docs)] // mod interaction; -mod interaction; mod management; -mod strategies; -use std::{str::FromStr, sync::Arc}; +use std::str::FromStr; use anyhow::{Ok, Result}; use ethers::{ @@ -31,29 +29,23 @@ pub const TEST_APPROVAL_AMOUNT: u128 = 420; //TODO: Send a tx before and after pausing the environment. -async fn deploy_and_start() -> Result<( - ArbiterToken, - Environment, - Arc, -)> { - let mut environment = Environment::new(TEST_ENV_LABEL, 1.0, 1); - - let signer = Arc::new(RevmMiddleware::new(&environment, Some("0".to_string()))); - - environment.run(); - Ok(( - ArbiterToken::deploy( - signer.clone(), - ( - TEST_ARG_NAME.to_string(), - TEST_ARG_SYMBOL.to_string(), - TEST_ARG_DECIMALS, - ), - )? - .send() - .await - .unwrap(), - environment, - signer, - )) -} +// async fn deploy_and_start() -> Result<(ArbiterToken, Environment)> { +// let mut environment = Environment::new(TEST_ENV_LABEL, 1.0, 1); +// let agent = Agent::new(TEST_AGENT_NAME); +// agent.attach_to_environment(&mut environment); +// environment.run(); +// Ok(( +// ArbiterToken::deploy( +// environment.agents[0].client.clone(), +// ( +// TEST_ARG_NAME.to_string(), +// TEST_ARG_SYMBOL.to_string(), +// TEST_ARG_DECIMALS, +// ), +// )? +// .send() +// .await +// .unwrap(), +// environment, +// )) +// } diff --git a/arbiter-core/src/tests/strategies.rs b/arbiter-core/src/tests/strategies.rs index b2c52452..59ca694d 100644 --- a/arbiter-core/src/tests/strategies.rs +++ b/arbiter-core/src/tests/strategies.rs @@ -1,18 +1,20 @@ -use std::sync::Arc; - use super::*; -const TEST_AGENT_NAME: &str = "test_agent"; +#[test] +fn attach_agent() { + let environment = &mut Environment::new(TEST_ENV_LABEL, 1.0, 1); + let agent = Agent::new(TEST_AGENT_NAME); + agent.attach_to_environment(environment); + assert_eq!(environment.agents[0].name, TEST_AGENT_NAME); +} #[test] fn simulation_agent_wallet() { let environment = &mut Environment::new(TEST_ENV_LABEL, 1.0, 1); - let client_with_signer = Arc::new(RevmMiddleware::new( - environment, - Some(TEST_AGENT_NAME.to_string()), - )); + let agent = Agent::new(TEST_AGENT_NAME); + agent.attach_to_environment(environment); assert_eq!( - client_with_signer.default_sender().unwrap(), + environment.agents[0].client.default_sender().unwrap(), Address::from_str("0x09e12ce98726acd515b68f87f49dc2e5558f6a72").unwrap() ); } @@ -20,11 +22,13 @@ fn simulation_agent_wallet() { #[test] fn multiple_agent_addresses() { let environment = &mut Environment::new(TEST_ENV_LABEL, 1.0, 1); - let client_1_with_signer = Arc::new(RevmMiddleware::new(environment, Some("0".to_string()))); - let client_2_with_signer = Arc::new(RevmMiddleware::new(environment, Some("1".to_string()))); + let agent = Agent::new(TEST_AGENT_NAME); + agent.attach_to_environment(environment); + let agent2 = Agent::new(format!("new_{}", TEST_AGENT_NAME)); + agent2.attach_to_environment(environment); assert_ne!( - client_1_with_signer.default_sender(), - client_2_with_signer.default_sender() + environment.agents[0].client.default_sender(), + environment.agents[1].client.default_sender() ); } @@ -32,4 +36,4 @@ fn multiple_agent_addresses() { #[test] fn agent_name_collision() { todo!(); -} +} \ No newline at end of file From acddf3ce2166cb9945d7748d1d33f2f546d273f7 Mon Sep 17 00:00:00 2001 From: Waylon Jepsen Date: Tue, 15 Aug 2023 07:33:28 -0700 Subject: [PATCH 5/9] reflected changes - Stack error in recursive error calls - Got tests passing and renamed the strategies test file to signers as it is a little more verbose --- Cargo.toml | 2 +- arbiter-core/Cargo.toml | 2 +- arbiter-core/src/agent.rs | 118 -------------------------- arbiter-core/src/middleware.rs | 32 ++++--- arbiter-core/src/tests/interaction.rs | 37 ++++---- arbiter-core/src/tests/mod.rs | 43 +++++----- arbiter-core/src/tests/signer.rs | 31 +++++++ arbiter-core/src/tests/strategies.rs | 39 --------- 8 files changed, 92 insertions(+), 212 deletions(-) delete mode 100644 arbiter-core/src/agent.rs create mode 100644 arbiter-core/src/tests/signer.rs delete mode 100644 arbiter-core/src/tests/strategies.rs diff --git a/Cargo.toml b/Cargo.toml index e8cfd1b6..e17646d9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ members = [ # Package configuration [package] name = "arbiter" -version = "1.0.0" +version = "0.3.0" edition = "2021" authors = ["Colin Roberts", "Waylon Jepsen"] diff --git a/arbiter-core/Cargo.toml b/arbiter-core/Cargo.toml index c1bd74c7..891cd954 100644 --- a/arbiter-core/Cargo.toml +++ b/arbiter-core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "arbiter-core" -version = "1.0.0" +version = "0.3.0" edition = "2021" # Dependencies for the release build diff --git a/arbiter-core/src/agent.rs b/arbiter-core/src/agent.rs deleted file mode 100644 index fe57d1de..00000000 --- a/arbiter-core/src/agent.rs +++ /dev/null @@ -1,118 +0,0 @@ -#![allow(missing_docs)] -#![warn(unsafe_code)] - -use std::sync::Arc; - -use ethers::providers::Middleware; - -use crate::{environment::Environment, middleware::RevmMiddleware}; - -pub trait Attached { - type Client; -} -pub struct IsAttached { - marker: std::marker::PhantomData, -} -pub struct NotAttached {} -impl Attached for IsAttached { - type Client = Arc; -} -impl Attached for NotAttached { - type Client = (); -} - -pub struct Agent { - pub name: String, - pub client: A::Client, - pub behaviors: Vec>, -} - -impl Agent { - pub fn new>(name: S) -> Self { - Self { - name: name.into(), - client: (), - behaviors: vec![], - } - } - - pub fn add_behavior(&mut self, behavior: B) - where - B: Behavior + 'static, - { - self.behaviors.push(Box::new(behavior)); - } - - pub fn attach_to_client(self, client: Arc) -> Agent> { - Agent::> { - name: self.name, - client, - behaviors: self.behaviors, - } - } - - pub fn attach_to_environment(self, environment: &mut Environment) { - let middleware = Arc::new(RevmMiddleware::new(&self, environment)); - let agent_attached = self.attach_to_client(middleware); - environment.agents.push(agent_attached); - } -} - -// TODO: Note -- Artemis uses a `process_event` function that returns an `Option` for something to happen. -// https://github.com/paradigmxyz/artemis/blob/c8ab223a363a875f685ab177839eacfffc9d8de0/crates/artemis-core/src/types.rs#L25 -#[async_trait::async_trait] -pub trait Behavior: Send + Sync { - async fn process_event(&mut self) -> bool; - fn sync_state(&mut self); -} - -#[cfg(test)] -pub(crate) mod tests { - pub(crate) const TEST_AGENT_NAME: &str = "test_agent"; - pub(crate) const TEST_BEHAVIOR_DATA: &str = "test_behavior_data"; - - use ethers::providers::{MockProvider, ProviderError}; - - use super::*; - - #[derive(Debug)] - pub(crate) struct TestMiddleware {} - - impl Middleware for TestMiddleware { - type Inner = Self; - type Provider = MockProvider; - type Error = ProviderError; - - fn inner(&self) -> &Self::Inner { - self - } - } - - pub(crate) struct TestBehavior { - data: String, - } - - #[async_trait::async_trait] - impl Behavior for TestBehavior { - async fn process_event(&mut self) -> bool { - true - } - fn sync_state(&mut self) { - assert_eq!(self.data, TEST_BEHAVIOR_DATA.to_string()); - } - } - - #[tokio::test] - async fn agent_behavior() { - let name = TEST_AGENT_NAME.to_string(); - let mut agent = Agent::new(name); - - // Add a behavior of the first type. - let data = TEST_BEHAVIOR_DATA.to_string(); - let behavior = TestBehavior { data }; - agent.add_behavior(behavior); - assert!(agent.behaviors.len() == 1); - assert!(agent.behaviors[0].process_event().await); - agent.behaviors[0].sync_state(); - } -} diff --git a/arbiter-core/src/middleware.rs b/arbiter-core/src/middleware.rs index 0c733a7d..96eb5140 100644 --- a/arbiter-core/src/middleware.rs +++ b/arbiter-core/src/middleware.rs @@ -10,6 +10,7 @@ use std::{ }; use ethers::{ + core::rand::{thread_rng, SeedableRng}, prelude::{ k256::{ ecdsa::SigningKey, @@ -28,7 +29,7 @@ use ethers::{ Log, }, }; -use rand::{rngs::{StdRng, OsRng}, SeedableRng}; +use rand::rngs; use revm::primitives::{CreateScheme, ExecutionResult, Output, TransactTo, TxEnv, B160, U256}; use serde::{de::DeserializeOwned, Serialize}; use thiserror::Error; @@ -85,7 +86,7 @@ impl MiddlewareError for RevmMiddlewareError { } impl RevmMiddleware { - pub fn new(environment: &Environment) -> Self { + pub fn new(environment: &Environment, seed_and_label: Option) -> Self { let tx_sender = environment.socket.tx_sender.clone(); let (result_sender, result_receiver) = crossbeam_channel::unbounded(); let connection = Connection { @@ -96,9 +97,18 @@ impl RevmMiddleware { filter_receivers: Arc::new(tokio::sync::Mutex::new(HashMap::new())), }; let provider = Provider::new(connection); - let mut rng = OsRng::default(); - let wallet = Wallet::new(&mut rng); - Self { provider, wallet } + if let Some(seed) = seed_and_label { + let mut hasher = Sha256::new(); + hasher.update(seed.clone()); + let hashed = hasher.finalize(); + let mut rng: rngs::StdRng = SeedableRng::from_seed(hashed.into()); + let wallet = Wallet::new(&mut rng); + Self { provider, wallet } + } else { + let mut rng = thread_rng(); + let wallet = Wallet::new(&mut rng); + Self { provider, wallet } + } } } @@ -142,9 +152,9 @@ impl Middleware for RevmMiddleware { value: U256::ZERO, data: bytes::Bytes::from( tx.data() - .ok_or(Err(RevmMiddlewareError::MissingDataError { + .ok_or(RevmMiddlewareError::MissingDataError { cause: "Data missing in transaction!".to_string(), - })?)? + })? .clone() .to_vec(), ), @@ -182,9 +192,9 @@ impl Middleware for RevmMiddleware { } = unpack_execution_result(revm_result.result)?; match output { Output::Create(_, address) => { - let address = address.ok_or(Err(RevmMiddlewareError::MissingDataError { + let address = address.ok_or(RevmMiddlewareError::MissingDataError { cause: "Address missing in transaction!".to_string(), - })?)?; + })?; let mut pending_tx = PendingTransaction::new(ethers::types::H256::zero(), self.provider()); pending_tx.state = PendingTxState::RevmDeployOutput(recast_address(address)); @@ -223,9 +233,9 @@ impl Middleware for RevmMiddleware { value: U256::ZERO, data: bytes::Bytes::from( tx.data() - .ok_or(Err(RevmMiddlewareError::MissingDataError { + .ok_or(RevmMiddlewareError::MissingDataError { cause: "Data missing in transaction!".to_string(), - })?)? + })? .clone() .to_vec(), ), diff --git a/arbiter-core/src/tests/interaction.rs b/arbiter-core/src/tests/interaction.rs index b835b4ed..c8591736 100644 --- a/arbiter-core/src/tests/interaction.rs +++ b/arbiter-core/src/tests/interaction.rs @@ -2,7 +2,7 @@ use super::*; #[tokio::test] async fn test_deploy() -> Result<()> { - let (arbiter_token, _environment) = deploy_and_start().await?; + let (arbiter_token, _environment, _) = deploy_and_start().await?; println!("{:?}", arbiter_token); assert_eq!( arbiter_token.address(), @@ -13,7 +13,7 @@ async fn test_deploy() -> Result<()> { #[tokio::test] async fn call() -> Result<()> { - let (arbiter_token, _) = deploy_and_start().await?; + let (arbiter_token, _, client) = deploy_and_start().await?; let admin = arbiter_token.admin(); let output = admin.call().await?; assert_eq!( @@ -25,7 +25,7 @@ async fn call() -> Result<()> { #[tokio::test] async fn transact() -> Result<()> { - let (arbiter_token, _) = deploy_and_start().await?; + let (arbiter_token, _, _) = deploy_and_start().await?; let mint = arbiter_token.mint( Address::from_str(TEST_MINT_TO).unwrap(), ethers::types::U256::from(TEST_MINT_AMOUNT), @@ -47,7 +47,7 @@ async fn transact() -> Result<()> { .unwrap(), ]; assert_eq!(receipt.logs[0].topics, topics); - let bytes = hex::decode("0000000000000000000000000000000000000000000000000000000000000001")?; + let bytes = hex::decode("0000000000000000000000000000000000000000000000000000000000000045")?; assert_eq!( receipt.logs[0].data, ethers::core::types::Bytes::from(bytes) @@ -58,8 +58,7 @@ async fn transact() -> Result<()> { #[tokio::test] async fn filter_watcher() -> Result<()> { - let (arbiter_token, environment) = deploy_and_start().await.unwrap(); - let client = environment.agents[0].client.clone(); + let (arbiter_token, environment, client) = deploy_and_start().await.unwrap(); let mut filter_watcher = client.watch(&Filter::default()).await?; let approval = arbiter_token.approve( client.default_sender().unwrap(), @@ -103,8 +102,7 @@ async fn filter_watcher() -> Result<()> { #[tokio::test] async fn filter_address() -> Result<()> { - let (arbiter_token, environment) = deploy_and_start().await.unwrap(); - let client = environment.agents[0].client.clone(); + let (arbiter_token, environment, client) = deploy_and_start().await.unwrap(); let mut default_watcher = client.watch(&Filter::default()).await?; let mut address_watcher = client .watch(&Filter::new().address(arbiter_token.address())) @@ -166,8 +164,7 @@ async fn filter_address() -> Result<()> { #[tokio::test] async fn filter_topics() -> Result<()> { - let (arbiter_token, environment) = deploy_and_start().await.unwrap(); - let client = environment.agents[0].client.clone(); + let (arbiter_token, environment, client) = deploy_and_start().await.unwrap(); let mut default_watcher = client.watch(&Filter::default()).await?; let mut approval_watcher = client .watch(&arbiter_token.approval_filter().filter) @@ -221,23 +218,21 @@ async fn filter_topics() -> Result<()> { // 2 check the block number is incremented after the expected number of transactions is reached. #[tokio::test] async fn transaction_loop() -> Result<()> { - let mut env = Environment::new(TEST_ENV_LABEL, 2.0, 1); + + + // tx_0 is the transaction that creates the token contract + let (arbiter_token, env, client) = deploy_and_start().await?; let mut dist = env.seeded_poisson.clone(); let expected_tx_per_block = dist.sample(); - println!("expected_tx_per_block: {}", expected_tx_per_block); - let agent = Agent::new(TEST_AGENT_NAME); - env.add_agent(agent); - let agent = &env.agents[0]; - // tx_0 is the transaction that creates the token contract - let (arbiter_token, _) = deploy_and_start().await?; - for index in 1..expected_tx_per_block { + + for index in 1..expected_tx_per_block + 1{ println!("index: {}", index); let tx = arbiter_token - .mint(agent.client.default_sender().unwrap(), 1000u64.into()) + .mint(client.default_sender().unwrap(), 1000u64.into()) .send() .await .unwrap() @@ -245,12 +240,12 @@ async fn transaction_loop() -> Result<()> { .unwrap() .unwrap(); - // minus 1 from deploy tx - if index < expected_tx_per_block - 1 { + if index < expected_tx_per_block { let block_number = tx.block_number.unwrap(); println!("block_number: {}", block_number); assert_eq!(block_number, U64::from(0)); } else { + println!("in else"); let block_number = tx.block_number.unwrap(); println!("block_number: {}", block_number); assert_eq!(block_number, U64::from(1)); diff --git a/arbiter-core/src/tests/mod.rs b/arbiter-core/src/tests/mod.rs index 346f3934..bb5171bd 100644 --- a/arbiter-core/src/tests/mod.rs +++ b/arbiter-core/src/tests/mod.rs @@ -2,8 +2,10 @@ // mod interaction; mod management; +mod signer; +mod interaction; -use std::str::FromStr; +use std::{str::FromStr, sync::Arc}; use anyhow::{Ok, Result}; use ethers::{ @@ -29,23 +31,22 @@ pub const TEST_APPROVAL_AMOUNT: u128 = 420; //TODO: Send a tx before and after pausing the environment. -// async fn deploy_and_start() -> Result<(ArbiterToken, Environment)> { -// let mut environment = Environment::new(TEST_ENV_LABEL, 1.0, 1); -// let agent = Agent::new(TEST_AGENT_NAME); -// agent.attach_to_environment(&mut environment); -// environment.run(); -// Ok(( -// ArbiterToken::deploy( -// environment.agents[0].client.clone(), -// ( -// TEST_ARG_NAME.to_string(), -// TEST_ARG_SYMBOL.to_string(), -// TEST_ARG_DECIMALS, -// ), -// )? -// .send() -// .await -// .unwrap(), -// environment, -// )) -// } +async fn deploy_and_start() -> Result<(ArbiterToken, Environment, Arc)> { + let mut environment = Environment::new(TEST_ENV_LABEL, 2.0, 1); + let client = Arc::new(RevmMiddleware::new(&environment, Some("test_agent".to_string()))); + environment.run(); + Ok(( + ArbiterToken::deploy( + client.clone(), + ( + TEST_ARG_NAME.to_string(), + TEST_ARG_SYMBOL.to_string(), + TEST_ARG_DECIMALS, + ), + )? + .send() + .await + .unwrap(), + environment, client + )) +} diff --git a/arbiter-core/src/tests/signer.rs b/arbiter-core/src/tests/signer.rs new file mode 100644 index 00000000..cb68ebda --- /dev/null +++ b/arbiter-core/src/tests/signer.rs @@ -0,0 +1,31 @@ +use std::sync::Arc; + +use super::*; +const TEST_AGENT_NAME: &str = "test_agent"; +#[test] +fn simulation_agent_wallet() { + let environment = &mut Environment::new(TEST_ENV_LABEL, 1.0, 1); + let client = Arc::new(RevmMiddleware::new(environment, Some(TEST_AGENT_NAME.to_string()))); + assert_eq!( + client.default_sender().unwrap(), + Address::from_str("0x09e12ce98726acd515b68f87f49dc2e5558f6a72").unwrap() + ); +} + +#[test] +fn multiple_agent_addresses() { + let environment = &mut Environment::new(TEST_ENV_LABEL, 1.0, 1); + let client_1 = Arc::new(RevmMiddleware::new(environment, Some("0".to_string()))); + let client_2 = Arc::new(RevmMiddleware::new(environment, Some("1".to_string()))); + assert_ne!( + client_1.default_sender(), + client_2.default_sender() + ); +} + +// TODO: Test to see that we prvent agents with the same name from being added. + +#[test] +fn agent_name_collision() { + todo!(); +} \ No newline at end of file diff --git a/arbiter-core/src/tests/strategies.rs b/arbiter-core/src/tests/strategies.rs deleted file mode 100644 index 59ca694d..00000000 --- a/arbiter-core/src/tests/strategies.rs +++ /dev/null @@ -1,39 +0,0 @@ -use super::*; - -#[test] -fn attach_agent() { - let environment = &mut Environment::new(TEST_ENV_LABEL, 1.0, 1); - let agent = Agent::new(TEST_AGENT_NAME); - agent.attach_to_environment(environment); - assert_eq!(environment.agents[0].name, TEST_AGENT_NAME); -} - -#[test] -fn simulation_agent_wallet() { - let environment = &mut Environment::new(TEST_ENV_LABEL, 1.0, 1); - let agent = Agent::new(TEST_AGENT_NAME); - agent.attach_to_environment(environment); - assert_eq!( - environment.agents[0].client.default_sender().unwrap(), - Address::from_str("0x09e12ce98726acd515b68f87f49dc2e5558f6a72").unwrap() - ); -} - -#[test] -fn multiple_agent_addresses() { - let environment = &mut Environment::new(TEST_ENV_LABEL, 1.0, 1); - let agent = Agent::new(TEST_AGENT_NAME); - agent.attach_to_environment(environment); - let agent2 = Agent::new(format!("new_{}", TEST_AGENT_NAME)); - agent2.attach_to_environment(environment); - assert_ne!( - environment.agents[0].client.default_sender(), - environment.agents[1].client.default_sender() - ); -} - -// TODO: Test to see that we prvent agents with the same name from being added. -#[test] -fn agent_name_collision() { - todo!(); -} \ No newline at end of file From 8bb95ed3d091006b03c6281c77b27f8670c1eb21 Mon Sep 17 00:00:00 2001 From: Waylon Jepsen Date: Tue, 15 Aug 2023 08:57:13 -0700 Subject: [PATCH 6/9] fmt + merge commit --- arbiter-core/src/environment.rs | 6 +----- arbiter-core/src/manager.rs | 5 +---- arbiter-core/src/middleware.rs | 5 +---- arbiter-core/src/tests/interaction.rs | 8 ++------ arbiter-core/src/tests/mod.rs | 16 ++++++++++++---- arbiter-core/src/tests/signer.rs | 12 ++++++------ 6 files changed, 23 insertions(+), 29 deletions(-) diff --git a/arbiter-core/src/environment.rs b/arbiter-core/src/environment.rs index 820b7320..7c068ccd 100644 --- a/arbiter-core/src/environment.rs +++ b/arbiter-core/src/environment.rs @@ -21,10 +21,7 @@ use revm::{ }; use thiserror::Error; -use crate::{ - math::*, - middleware::RevmMiddleware, -}; +use crate::{math::*, middleware::RevmMiddleware}; pub(crate) type ToTransact = bool; pub(crate) type ResultSender = Sender; @@ -86,7 +83,6 @@ impl Environment { } } - pub(crate) fn run(&mut self) { let mut evm = self.evm.clone(); let tx_receiver = self.socket.tx_receiver.clone(); diff --git a/arbiter-core/src/manager.rs b/arbiter-core/src/manager.rs index c4d8b468..08ad5298 100644 --- a/arbiter-core/src/manager.rs +++ b/arbiter-core/src/manager.rs @@ -7,10 +7,7 @@ use std::collections::HashMap; use log::{info, warn}; use thiserror::Error; -use crate::{ - // agent::{Agent, NotAttached}, - environment::{Environment, State}, -}; +use crate::environment::{Environment, State}; #[derive(Default)] pub struct Manager { diff --git a/arbiter-core/src/middleware.rs b/arbiter-core/src/middleware.rs index 47c34dce..7b305ca0 100644 --- a/arbiter-core/src/middleware.rs +++ b/arbiter-core/src/middleware.rs @@ -34,10 +34,7 @@ use revm::primitives::{CreateScheme, ExecutionResult, Output, TransactTo, TxEnv, use serde::{de::DeserializeOwned, Serialize}; use thiserror::Error; -use crate::{ - // agent::{Agent, NotAttached}, - environment::{Environment, EventBroadcaster, ResultReceiver, ResultSender, TxSender}, -}; +use crate::environment::{Environment, EventBroadcaster, ResultReceiver, ResultSender, TxSender}; #[derive(Debug)] pub struct RevmMiddleware { diff --git a/arbiter-core/src/tests/interaction.rs b/arbiter-core/src/tests/interaction.rs index c8591736..704c7cb2 100644 --- a/arbiter-core/src/tests/interaction.rs +++ b/arbiter-core/src/tests/interaction.rs @@ -218,8 +218,6 @@ async fn filter_topics() -> Result<()> { // 2 check the block number is incremented after the expected number of transactions is reached. #[tokio::test] async fn transaction_loop() -> Result<()> { - - // tx_0 is the transaction that creates the token contract let (arbiter_token, env, client) = deploy_and_start().await?; @@ -227,9 +225,7 @@ async fn transaction_loop() -> Result<()> { let expected_tx_per_block = dist.sample(); println!("expected_tx_per_block: {}", expected_tx_per_block); - - - for index in 1..expected_tx_per_block + 1{ + for index in 1..expected_tx_per_block + 1 { println!("index: {}", index); let tx = arbiter_token .mint(client.default_sender().unwrap(), 1000u64.into()) @@ -240,7 +236,7 @@ async fn transaction_loop() -> Result<()> { .unwrap() .unwrap(); - if index < expected_tx_per_block { + if index < expected_tx_per_block { let block_number = tx.block_number.unwrap(); println!("block_number: {}", block_number); assert_eq!(block_number, U64::from(0)); diff --git a/arbiter-core/src/tests/mod.rs b/arbiter-core/src/tests/mod.rs index bb5171bd..3dc45feb 100644 --- a/arbiter-core/src/tests/mod.rs +++ b/arbiter-core/src/tests/mod.rs @@ -1,9 +1,9 @@ #![allow(missing_docs)] // mod interaction; +mod interaction; mod management; mod signer; -mod interaction; use std::{str::FromStr, sync::Arc}; @@ -31,9 +31,16 @@ pub const TEST_APPROVAL_AMOUNT: u128 = 420; //TODO: Send a tx before and after pausing the environment. -async fn deploy_and_start() -> Result<(ArbiterToken, Environment, Arc)> { +async fn deploy_and_start() -> Result<( + ArbiterToken, + Environment, + Arc, +)> { let mut environment = Environment::new(TEST_ENV_LABEL, 2.0, 1); - let client = Arc::new(RevmMiddleware::new(&environment, Some("test_agent".to_string()))); + let client = Arc::new(RevmMiddleware::new( + &environment, + Some("test_agent".to_string()), + )); environment.run(); Ok(( ArbiterToken::deploy( @@ -47,6 +54,7 @@ async fn deploy_and_start() -> Result<(ArbiterToken, Environment .send() .await .unwrap(), - environment, client + environment, + client, )) } diff --git a/arbiter-core/src/tests/signer.rs b/arbiter-core/src/tests/signer.rs index cb68ebda..2569eb65 100644 --- a/arbiter-core/src/tests/signer.rs +++ b/arbiter-core/src/tests/signer.rs @@ -5,7 +5,10 @@ const TEST_AGENT_NAME: &str = "test_agent"; #[test] fn simulation_agent_wallet() { let environment = &mut Environment::new(TEST_ENV_LABEL, 1.0, 1); - let client = Arc::new(RevmMiddleware::new(environment, Some(TEST_AGENT_NAME.to_string()))); + let client = Arc::new(RevmMiddleware::new( + environment, + Some(TEST_AGENT_NAME.to_string()), + )); assert_eq!( client.default_sender().unwrap(), Address::from_str("0x09e12ce98726acd515b68f87f49dc2e5558f6a72").unwrap() @@ -17,10 +20,7 @@ fn multiple_agent_addresses() { let environment = &mut Environment::new(TEST_ENV_LABEL, 1.0, 1); let client_1 = Arc::new(RevmMiddleware::new(environment, Some("0".to_string()))); let client_2 = Arc::new(RevmMiddleware::new(environment, Some("1".to_string()))); - assert_ne!( - client_1.default_sender(), - client_2.default_sender() - ); + assert_ne!(client_1.default_sender(), client_2.default_sender()); } // TODO: Test to see that we prvent agents with the same name from being added. @@ -28,4 +28,4 @@ fn multiple_agent_addresses() { #[test] fn agent_name_collision() { todo!(); -} \ No newline at end of file +} From a6a19c5d784cb82cc63d23c3c00d4e3acd55dbcb Mon Sep 17 00:00:00 2001 From: Waylon Jepsen Date: Tue, 15 Aug 2023 09:03:09 -0700 Subject: [PATCH 7/9] removed comments --- arbiter-core/src/lib.rs | 1 - arbiter-core/src/manager.rs | 16 ---------------- 2 files changed, 17 deletions(-) diff --git a/arbiter-core/src/lib.rs b/arbiter-core/src/lib.rs index 83a2445a..49525f88 100644 --- a/arbiter-core/src/lib.rs +++ b/arbiter-core/src/lib.rs @@ -1,6 +1,5 @@ #![warn(missing_docs, unsafe_code)] -// pub mod agent; pub mod bindings; // TODO: Add better documentation here and some kind of overwrite protection. pub mod environment; pub mod manager; diff --git a/arbiter-core/src/manager.rs b/arbiter-core/src/manager.rs index 08ad5298..d96b4b34 100644 --- a/arbiter-core/src/manager.rs +++ b/arbiter-core/src/manager.rs @@ -171,22 +171,6 @@ impl Manager { }), } } - - // pub fn add_agent( - // &mut self, - // agent: Agent, - // environment_label: String, - // ) -> Result<(), ManagerError> { - // match self.environments.get_mut(&environment_label) { - // Some(environment) => { - // environment.add_agent(agent); - // Ok(()) - // } - // None => Err(ManagerError::EnvironmentDoesNotExist { - // label: environment_label, - // }), - // } - // } } #[cfg(test)] From bcca03176151759c154f209beaa6609114241a21 Mon Sep 17 00:00:00 2001 From: Waylon Jepsen Date: Tue, 15 Aug 2023 09:19:26 -0700 Subject: [PATCH 8/9] nits --- arbiter-core/src/tests/interaction.rs | 2 +- arbiter-core/src/tests/mod.rs | 1 - arbiter-core/src/tests/signer.rs | 6 +++--- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/arbiter-core/src/tests/interaction.rs b/arbiter-core/src/tests/interaction.rs index 704c7cb2..138ee217 100644 --- a/arbiter-core/src/tests/interaction.rs +++ b/arbiter-core/src/tests/interaction.rs @@ -1,7 +1,7 @@ use super::*; #[tokio::test] -async fn test_deploy() -> Result<()> { +async fn deploy() -> Result<()> { let (arbiter_token, _environment, _) = deploy_and_start().await?; println!("{:?}", arbiter_token); assert_eq!( diff --git a/arbiter-core/src/tests/mod.rs b/arbiter-core/src/tests/mod.rs index 3dc45feb..542ee705 100644 --- a/arbiter-core/src/tests/mod.rs +++ b/arbiter-core/src/tests/mod.rs @@ -14,7 +14,6 @@ use ethers::{ }; use crate::{ - // agent::{tests::TEST_AGENT_NAME, *}, bindings::arbiter_token::*, environment::{tests::TEST_ENV_LABEL, *}, manager::*, diff --git a/arbiter-core/src/tests/signer.rs b/arbiter-core/src/tests/signer.rs index 2569eb65..8e3f9fa3 100644 --- a/arbiter-core/src/tests/signer.rs +++ b/arbiter-core/src/tests/signer.rs @@ -3,7 +3,7 @@ use std::sync::Arc; use super::*; const TEST_AGENT_NAME: &str = "test_agent"; #[test] -fn simulation_agent_wallet() { +fn simulation_signer() { let environment = &mut Environment::new(TEST_ENV_LABEL, 1.0, 1); let client = Arc::new(RevmMiddleware::new( environment, @@ -16,7 +16,7 @@ fn simulation_agent_wallet() { } #[test] -fn multiple_agent_addresses() { +fn multiple_signer_addresses() { let environment = &mut Environment::new(TEST_ENV_LABEL, 1.0, 1); let client_1 = Arc::new(RevmMiddleware::new(environment, Some("0".to_string()))); let client_2 = Arc::new(RevmMiddleware::new(environment, Some("1".to_string()))); @@ -26,6 +26,6 @@ fn multiple_agent_addresses() { // TODO: Test to see that we prvent agents with the same name from being added. #[test] -fn agent_name_collision() { +fn signer_collision() { todo!(); } From 84f77d7ed7e1055ce47280a5dbc2d54dd4e09c8e Mon Sep 17 00:00:00 2001 From: Waylon Jepsen Date: Tue, 15 Aug 2023 09:31:21 -0700 Subject: [PATCH 9/9] removed instances of agent in tests --- arbiter-core/src/tests/interaction.rs | 4 ++-- arbiter-core/src/tests/mod.rs | 3 ++- arbiter-core/src/tests/signer.rs | 6 +++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/arbiter-core/src/tests/interaction.rs b/arbiter-core/src/tests/interaction.rs index 138ee217..3c92a277 100644 --- a/arbiter-core/src/tests/interaction.rs +++ b/arbiter-core/src/tests/interaction.rs @@ -6,7 +6,7 @@ async fn deploy() -> Result<()> { println!("{:?}", arbiter_token); assert_eq!( arbiter_token.address(), - Address::from_str("0x1a9bb958b1ea4d24475aaa545b25fc2e7eb0871c").unwrap() + Address::from_str("0x067ea9e44c76a2620f10b39a1b51d5124a299192").unwrap() ); Ok(()) } @@ -18,7 +18,7 @@ async fn call() -> Result<()> { let output = admin.call().await?; assert_eq!( output, - Address::from_str("0x09e12ce98726acd515b68f87f49dc2e5558f6a72")? + Address::from_str("0x2efdc9eecfee3a776209fcb8e9a83a6b221d74f5")? ); Ok(()) } diff --git a/arbiter-core/src/tests/mod.rs b/arbiter-core/src/tests/mod.rs index 542ee705..a17e92ec 100644 --- a/arbiter-core/src/tests/mod.rs +++ b/arbiter-core/src/tests/mod.rs @@ -27,6 +27,7 @@ pub const TEST_ARG_DECIMALS: u8 = 18; pub const TEST_MINT_AMOUNT: u128 = 69; pub const TEST_MINT_TO: &str = "0xf7e93cc543d97af6632c9b8864417379dba4bf15"; pub const TEST_APPROVAL_AMOUNT: u128 = 420; +pub const TEST_SIGNER_SEED_AND_LABEL: &str = "test_seed_and_label"; //TODO: Send a tx before and after pausing the environment. @@ -38,7 +39,7 @@ async fn deploy_and_start() -> Result<( let mut environment = Environment::new(TEST_ENV_LABEL, 2.0, 1); let client = Arc::new(RevmMiddleware::new( &environment, - Some("test_agent".to_string()), + Some(TEST_SIGNER_SEED_AND_LABEL.to_string()), )); environment.run(); Ok(( diff --git a/arbiter-core/src/tests/signer.rs b/arbiter-core/src/tests/signer.rs index 8e3f9fa3..0ab4a4b7 100644 --- a/arbiter-core/src/tests/signer.rs +++ b/arbiter-core/src/tests/signer.rs @@ -1,17 +1,17 @@ use std::sync::Arc; use super::*; -const TEST_AGENT_NAME: &str = "test_agent"; + #[test] fn simulation_signer() { let environment = &mut Environment::new(TEST_ENV_LABEL, 1.0, 1); let client = Arc::new(RevmMiddleware::new( environment, - Some(TEST_AGENT_NAME.to_string()), + Some(TEST_SIGNER_SEED_AND_LABEL.to_string()), )); assert_eq!( client.default_sender().unwrap(), - Address::from_str("0x09e12ce98726acd515b68f87f49dc2e5558f6a72").unwrap() + Address::from_str("0x2efdc9eecfee3a776209fcb8e9a83a6b221d74f5").unwrap() ); }