diff --git a/src/arena.rs b/src/arena.rs index b5939dd..274a7d9 100644 --- a/src/arena.rs +++ b/src/arena.rs @@ -122,7 +122,7 @@ impl Arena { } self.arbitrageur.init(&signal, admin_provider.clone()).await; - self.nonce = 7; + self.nonce = 6; for step in 0..config.steps { let id = fetcher.toId(self.pool.clone().into()).call().await.unwrap(); diff --git a/src/engine/inspector.rs b/src/engine/inspector.rs index 912f583..3d5fe74 100644 --- a/src/engine/inspector.rs +++ b/src/engine/inspector.rs @@ -1,5 +1,5 @@ use std::fs::OpenOptions; - +use std::io::Seek; use serde::{Deserialize, Serialize}; /// Trait allowing custom behavior to be defined for logging and inspecting values. @@ -73,11 +73,12 @@ impl Logger { /// Append a log message to the appropriate file format. fn append_to_file(&self, record: &LogMessage) -> Result<(), Box> { - let file = OpenOptions::new() + let mut file = OpenOptions::new() .append(true) + .write(true) .create(true) .open(&self.file_path)?; - + match self.format { LogFormat::Csv => { let mut writer = csv::Writer::from_writer(file); @@ -85,14 +86,19 @@ impl Logger { writer.flush()?; } LogFormat::Json => { - let mut records: Vec = - serde_json::from_reader(&file).unwrap_or_default(); + let mut records: Vec = if file.metadata()?.len() > 0 { + serde_json::from_reader(&file)? + } else { + Vec::new() + }; records.push(record.clone()); - serde_json::to_writer(file, &records)?; + file.set_len(0)?; + file.seek(std::io::SeekFrom::Start(0))?; + serde_json::to_writer_pretty(file, &records)?; } } Ok(()) - } + } } impl Inspector for Logger { diff --git a/src/lib.rs b/src/lib.rs index 17a56bf..1ea2ba9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -189,7 +189,7 @@ mod tests { config::Config, engine::{ arbitrageur::{Arbitrageur, DefaultArbitrageur, EmptyArbitrageur}, - inspector::EmptyInspector, + inspector::{EmptyInspector, LogMessage, Logger}, }, feed::OrnsteinUhlenbeck, strategy::Strategy, @@ -197,20 +197,21 @@ mod tests { struct StrategyMock; - impl Strategy for StrategyMock { + impl Strategy for StrategyMock { fn init( &self, _provider: AnvilProvider, _signal: Signal, - _inspector: &mut Box>, + _inspector: &mut Box>, ) { } fn process( &self, _provider: AnvilProvider, _signal: Signal, - _inspector: &mut Box>, + inspector: &mut Box>, ) { + inspector.log(LogMessage::new(String::from("test_key"), String::from("test_value"))); } } @@ -218,15 +219,15 @@ mod tests { async fn test_arena() { let builder: ArenaBuilder<_> = ArenaBuilder::new(); - let mut arena: Arena = builder + let mut arena: Arena = builder .with_strategy(Box::new(StrategyMock {})) .with_fee(4000) .with_tick_spacing(2) .with_feed(Box::new(OrnsteinUhlenbeck::new(0.1, 0.1, 0.1, 0.1, 0.1))) - .with_inspector(Box::new(EmptyInspector {})) - .with_arbitrageur(Box::new(DefaultArbitrageur::default())) + .with_inspector(Box::new(Logger::new_csv(String::from("test.csv")))) + .with_arbitrageur(Box::new(EmptyArbitrageur {})) .build(); - arena.run(Config::new(2)).await; + arena.run(Config::new(5)).await; } }