diff --git a/Cargo.lock b/Cargo.lock index f067e0522..8a72e0786 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "Inflector" @@ -6461,7 +6461,6 @@ dependencies = [ "reqwest 0.12.5", "serde", "serde-wasm-bindgen 0.6.5", - "sha2", "thiserror", "tokio", "tsify", diff --git a/crates/common/src/dotrain_order/mod.rs b/crates/common/src/dotrain_order/mod.rs index 927638fb2..a9b645ccb 100644 --- a/crates/common/src/dotrain_order/mod.rs +++ b/crates/common/src/dotrain_order/mod.rs @@ -20,12 +20,11 @@ use typeshare::typeshare; pub mod calldata; -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, Default)] #[cfg_attr(target_family = "wasm", wasm_bindgen)] pub struct DotrainOrder { dotrain: String, dotrain_yaml: DotrainYaml, - orderbook_yaml: OrderbookYaml, } impl PartialEq for DotrainOrder { @@ -140,13 +139,9 @@ impl DotrainOrder { sources.extend(settings); } - let dotrain_yaml = DotrainYaml::new(sources.clone(), false)?; - let orderbook_yaml = OrderbookYaml::new(sources, false)?; - Ok(Self { dotrain, - dotrain_yaml, - orderbook_yaml, + dotrain_yaml: DotrainYaml::new(sources.clone(), false)?, }) } @@ -216,20 +211,12 @@ impl DotrainOrder { &self.dotrain } - pub fn dotrain_yaml(&self) -> &DotrainYaml { - &self.dotrain_yaml - } - - pub fn dotrain_yaml_mut(&mut self) -> &mut DotrainYaml { - &mut self.dotrain_yaml - } - - pub fn orderbook_yaml(&self) -> &OrderbookYaml { - &self.orderbook_yaml + pub fn dotrain_yaml(&self) -> DotrainYaml { + self.dotrain_yaml.clone() } - pub fn orderbook_yaml_mut(&mut self) -> &mut OrderbookYaml { - &mut self.orderbook_yaml + pub fn orderbook_yaml(&self) -> OrderbookYaml { + OrderbookYaml::from_documents(self.dotrain_yaml.documents.clone()) } pub async fn get_pragmas_for_scenario( @@ -255,7 +242,7 @@ impl DotrainOrder { let network = &self.dotrain_yaml.get_scenario(scenario)?.deployer.network; let rpc = &network.rpc; - let metaboard = self.orderbook_yaml.get_metaboard(&network.key)?.url; + let metaboard = self.orderbook_yaml().get_metaboard(&network.key)?.url; Ok( AuthoringMetaV2::fetch_for_contract(address, rpc.to_string(), metaboard.to_string()) .await?, @@ -345,7 +332,7 @@ impl DotrainOrder { pub async fn validate_raindex_version(&self) -> Result<(), DotrainOrderError> { let app_sha = GH_COMMIT_SHA.to_string(); - if let Some(raindex_version) = &self.orderbook_yaml.get_raindex_version()? { + if let Some(raindex_version) = &self.orderbook_yaml().get_raindex_version()? { if app_sha != *raindex_version { return Err(DotrainOrderError::RaindexVersionMismatch( app_sha, @@ -411,7 +398,7 @@ _ _: 0 0; assert_eq!( dotrain_order - .orderbook_yaml + .orderbook_yaml() .get_network("polygon") .unwrap() .rpc @@ -548,7 +535,7 @@ networks: assert_eq!( merged_dotrain_order - .orderbook_yaml + .orderbook_yaml() .get_network("mainnet") .unwrap() .rpc diff --git a/crates/js_api/Cargo.toml b/crates/js_api/Cargo.toml index 6b9093ca3..042056152 100644 --- a/crates/js_api/Cargo.toml +++ b/crates/js_api/Cargo.toml @@ -31,4 +31,3 @@ alloy = { workspace = true, features = [ "dyn-abi" ] } flate2 = "1.0.34" base64 = "0.22.1" bincode = "1.3.3" -sha2 = "0.10.8" \ No newline at end of file diff --git a/crates/js_api/src/gui/deposits.rs b/crates/js_api/src/gui/deposits.rs index e77377d51..fad1e7b8b 100644 --- a/crates/js_api/src/gui/deposits.rs +++ b/crates/js_api/src/gui/deposits.rs @@ -13,20 +13,23 @@ impl_all_wasm_traits!(TokenDeposit); impl DotrainOrderGui { #[wasm_bindgen(js_name = "getDeposits")] pub fn get_deposits(&self) -> Result, GuiError> { + let deployment = self.get_current_deployment()?; self.deposits .iter() .map(|(token, value)| { - let gui_deposit = self - .deployment + let gui_deposit = deployment .deposits .iter() .find(|dg| dg.token.key == *token) .ok_or(GuiError::DepositTokenNotFound(token.clone()))?; let amount: String = if value.is_preset { + let index = value + .value + .parse::() + .map_err(|_| GuiError::InvalidPreset)?; gui_deposit .presets - .iter() - .find(|preset| **preset == value.value) + .get(index) .ok_or(GuiError::InvalidPreset)? .clone() } else { @@ -43,8 +46,8 @@ impl DotrainOrderGui { #[wasm_bindgen(js_name = "saveDeposit")] pub fn save_deposit(&mut self, token: String, amount: String) -> Result<(), GuiError> { - let gui_deposit = self - .deployment + let deployment = self.get_current_deployment()?; + let gui_deposit = deployment .deposits .iter() .find(|dg| dg.token.key == token) @@ -73,8 +76,8 @@ impl DotrainOrderGui { #[wasm_bindgen(js_name = "getDepositPresets")] pub fn get_deposit_presets(&self, token: String) -> Result, GuiError> { - let gui_deposit = self - .deployment + let deployment = self.get_current_deployment()?; + let gui_deposit = deployment .deposits .iter() .find(|dg| dg.token.key == token) diff --git a/crates/js_api/src/gui/field_values.rs b/crates/js_api/src/gui/field_values.rs index c43c04fbb..17857233b 100644 --- a/crates/js_api/src/gui/field_values.rs +++ b/crates/js_api/src/gui/field_values.rs @@ -99,8 +99,8 @@ impl DotrainOrderGui { #[wasm_bindgen(js_name = "getFieldDefinition")] pub fn get_field_definition(&self, binding: &str) -> Result { - let field_definition = self - .deployment + let deployment = self.get_current_deployment()?; + let field_definition = deployment .fields .iter() .find(|field| field.binding == binding) @@ -109,7 +109,8 @@ impl DotrainOrderGui { } #[wasm_bindgen(js_name = "getAllFieldDefinitions")] - pub fn get_all_field_definitions(&self) -> Vec { - self.deployment.fields.clone() + pub fn get_all_field_definitions(&self) -> Result, GuiError> { + let deployment = self.get_current_deployment()?; + Ok(deployment.fields.clone()) } } diff --git a/crates/js_api/src/gui/mod.rs b/crates/js_api/src/gui/mod.rs index c230b571a..8bfb86cc1 100644 --- a/crates/js_api/src/gui/mod.rs +++ b/crates/js_api/src/gui/mod.rs @@ -34,7 +34,7 @@ impl_all_wasm_traits!(TokenInfos); #[wasm_bindgen] pub struct DotrainOrderGui { dotrain_order: DotrainOrder, - deployment: GuiDeployment, + selected_deployment: String, field_values: BTreeMap, deposits: BTreeMap, select_tokens: Option>, @@ -73,7 +73,7 @@ impl DotrainOrderGui { .deployments .into_iter() .find(|(name, _)| name == &deployment_name) - .ok_or(GuiError::DeploymentNotFound(deployment_name))?; + .ok_or(GuiError::DeploymentNotFound(deployment_name.clone()))?; let select_tokens = gui_deployment.select_tokens.clone().map(|tokens| { tokens @@ -110,7 +110,7 @@ impl DotrainOrderGui { Ok(Self { dotrain_order, - deployment: gui_deployment.clone(), + selected_deployment: deployment_name.clone(), field_values: BTreeMap::new(), deposits: BTreeMap::new(), select_tokens, @@ -118,21 +118,6 @@ impl DotrainOrderGui { }) } - fn refresh_gui_deployment(&mut self) -> Result<(), GuiError> { - let gui = self - .dotrain_order - .dotrain_yaml() - .get_gui()? - .ok_or(GuiError::GuiConfigNotFound)?; - let (_, gui_deployment) = gui - .deployments - .into_iter() - .find(|(name, _)| name == &self.deployment.key) - .ok_or(GuiError::DeploymentNotFound(self.deployment.key.clone()))?; - self.deployment = gui_deployment.clone(); - Ok(()) - } - #[wasm_bindgen(js_name = "getGuiConfig")] pub fn get_gui_config(&self) -> Result { let gui = self @@ -144,8 +129,16 @@ impl DotrainOrderGui { } #[wasm_bindgen(js_name = "getCurrentDeployment")] - pub fn get_current_deployment(&self) -> GuiDeployment { - self.deployment.clone() + pub fn get_current_deployment(&self) -> Result { + let gui = self.get_gui_config()?; + let (_, gui_deployment) = gui + .deployments + .into_iter() + .find(|(name, _)| name == &self.selected_deployment) + .ok_or(GuiError::DeploymentNotFound( + self.selected_deployment.clone(), + ))?; + Ok(gui_deployment.clone()) } /// Get all token infos in input and output vaults diff --git a/crates/js_api/src/gui/order_operations.rs b/crates/js_api/src/gui/order_operations.rs index afba904b5..c5cfec09f 100644 --- a/crates/js_api/src/gui/order_operations.rs +++ b/crates/js_api/src/gui/order_operations.rs @@ -42,7 +42,8 @@ impl_all_wasm_traits!(DepositAndAddOrderCalldataResult); #[wasm_bindgen] impl DotrainOrderGui { fn get_orderbook(&self) -> Result, GuiError> { - self.deployment + let deployment = self.get_current_deployment()?; + deployment .deployment .as_ref() .order @@ -67,10 +68,12 @@ impl DotrainOrderGui { Ok(map) } - fn get_vaults_and_deposits(&self) -> Result, GuiError> { + fn get_vaults_and_deposits( + &self, + deployment: &GuiDeployment, + ) -> Result, GuiError> { let deposits_map = self.get_deposits_as_map()?; - let results = self - .deployment + let results = deployment .deployment .order .outputs @@ -114,10 +117,11 @@ impl DotrainOrderGui { /// Returns a vector of [`TokenAllowance`] objects #[wasm_bindgen(js_name = "checkAllowances")] pub async fn check_allowances(&self, owner: String) -> Result { + let deployment = self.get_current_deployment()?; self.check_token_addresses()?; let orderbook = self.get_orderbook()?; - let vaults_and_deposits = self.get_vaults_and_deposits()?; + let vaults_and_deposits = self.get_vaults_and_deposits(&deployment)?; let mut results = Vec::new(); for (order_io, amount) in vaults_and_deposits.iter() { @@ -143,31 +147,37 @@ impl DotrainOrderGui { &self, owner: String, ) -> Result { + let deployment = self.get_current_deployment()?; self.check_token_addresses()?; let calldatas = self .dotrain_order - .generate_approval_calldatas(&self.deployment.key, &owner, &self.get_deposits_as_map()?) + .generate_approval_calldatas(&deployment.key, &owner, &self.get_deposits_as_map()?) .await?; Ok(ApprovalCalldataResult(calldatas)) } - fn populate_vault_ids(&mut self) -> Result<(), GuiError> { - // self.dotrain_order - // .populate_vault_ids(&self.deployment.key, None)?; - // self.refresh_gui_deployment()?; + fn populate_vault_ids(&mut self, deployment: &GuiDeployment) -> Result<(), GuiError> { + self.dotrain_order + .dotrain_yaml() + .get_order(&deployment.deployment.order.key)? + .populate_vault_ids()?; Ok(()) } - fn update_config_source_bindings(&mut self) -> Result<(), GuiError> { - // self.dotrain_order.update_config_source_bindings( - // &self.deployment.deployment.scenario.key, - // self.field_values - // .iter() - // .map(|(k, _)| Ok((k.clone(), self.get_field_value(k.clone())?.value.clone()))) - // .collect::, GuiError>>()?, - // )?; - // self.refresh_gui_deployment()?; + fn update_config_source_bindings( + &mut self, + deployment: &GuiDeployment, + ) -> Result<(), GuiError> { + self.dotrain_order + .dotrain_yaml() + .get_scenario(&deployment.deployment.scenario.key)? + .update_bindings( + self.field_values + .iter() + .map(|(k, _)| Ok((k.clone(), self.get_field_value(k.clone())?.value.clone()))) + .collect::, GuiError>>()?, + )?; Ok(()) } @@ -176,11 +186,12 @@ impl DotrainOrderGui { /// Returns a vector of bytes #[wasm_bindgen(js_name = "generateDepositCalldatas")] pub async fn generate_deposit_calldatas(&mut self) -> Result { + let deployment = self.get_current_deployment()?; self.check_token_addresses()?; - self.populate_vault_ids()?; + self.populate_vault_ids(&deployment)?; let token_deposits = self - .get_vaults_and_deposits()? + .get_vaults_and_deposits(&deployment)? .iter() .enumerate() .map(|(i, (order_io, amount))| { @@ -192,7 +203,7 @@ impl DotrainOrderGui { .collect::, GuiError>>()?; let calldatas = self .dotrain_order - .generate_deposit_calldatas(&self.deployment.key, &token_deposits) + .generate_deposit_calldatas(&deployment.key, &token_deposits) .await?; Ok(DepositCalldataResult(calldatas)) } @@ -202,12 +213,14 @@ impl DotrainOrderGui { pub async fn generate_add_order_calldata( &mut self, ) -> Result { + let deployment = self.get_current_deployment()?; self.check_token_addresses()?; - self.populate_vault_ids()?; - self.update_config_source_bindings()?; + self.populate_vault_ids(&deployment)?; + self.update_config_source_bindings(&deployment)?; + let calldata = self .dotrain_order - .generate_add_order_calldata(&self.deployment.key) + .generate_add_order_calldata(&deployment.key) .await?; Ok(AddOrderCalldataResult(calldata)) } @@ -216,12 +229,13 @@ impl DotrainOrderGui { pub async fn generate_deposit_and_add_order_calldatas( &mut self, ) -> Result { + let deployment = self.get_current_deployment()?; self.check_token_addresses()?; - self.populate_vault_ids()?; - self.update_config_source_bindings()?; + self.populate_vault_ids(&deployment)?; + self.update_config_source_bindings(&deployment)?; let token_deposits = self - .get_vaults_and_deposits()? + .get_vaults_and_deposits(&deployment)? .iter() .enumerate() .map(|(i, (order_io, amount))| { @@ -235,11 +249,11 @@ impl DotrainOrderGui { let mut calls = Vec::new(); let deposit_calldatas = self .dotrain_order - .generate_deposit_calldatas(&self.deployment.key, &token_deposits) + .generate_deposit_calldatas(&deployment.key, &token_deposits) .await?; let add_order_calldata = self .dotrain_order - .generate_add_order_calldata(&self.deployment.key) + .generate_add_order_calldata(&deployment.key) .await?; calls.push(Bytes::copy_from_slice(&add_order_calldata)); @@ -259,13 +273,11 @@ impl DotrainOrderGui { index: u8, vault_id: String, ) -> Result<(), GuiError> { - // self.dotrain_order.set_vault_id( - // &self.deployment.key, - // is_input, - // index, - // U256::from_str(&vault_id)?, - // )?; - // self.refresh_gui_deployment() + let deployment = self.get_current_deployment()?; + self.dotrain_order + .dotrain_yaml() + .get_order(&deployment.deployment.order.key)? + .update_vault_id(is_input, index, vault_id)?; Ok(()) } } diff --git a/crates/js_api/src/gui/select_tokens.rs b/crates/js_api/src/gui/select_tokens.rs index 5b73635c8..005662b5d 100644 --- a/crates/js_api/src/gui/select_tokens.rs +++ b/crates/js_api/src/gui/select_tokens.rs @@ -37,6 +37,7 @@ impl DotrainOrderGui { token_name: String, address: String, ) -> Result<(), GuiError> { + let deployment = self.get_current_deployment()?; let mut select_tokens = self .select_tokens .clone() @@ -49,8 +50,7 @@ impl DotrainOrderGui { select_tokens.insert(token_name.clone(), address); self.select_tokens = Some(select_tokens); - let rpc_url = self - .deployment + let rpc_url = deployment .deployment .order .orderbook @@ -63,9 +63,10 @@ impl DotrainOrderGui { let token_info = erc20.token_info(None).await?; self.onchain_token_info.insert(address, token_info); - // self.dotrain_order - // .update_token_address(token_name, address)?; - // self.refresh_gui_deployment()?; + self.dotrain_order + .orderbook_yaml() + .get_token(&token_name)? + .update_address(&address.to_string())?; Ok(()) } } diff --git a/crates/js_api/src/gui/state_management.rs b/crates/js_api/src/gui/state_management.rs index cbdd5707a..a256a0d0d 100644 --- a/crates/js_api/src/gui/state_management.rs +++ b/crates/js_api/src/gui/state_management.rs @@ -1,5 +1,4 @@ use super::*; -use sha2::{Digest, Sha256}; #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] struct SerializedGuiState { @@ -35,21 +34,9 @@ impl DotrainOrderGui { let mut deposits = BTreeMap::new(); for (k, v) in self.deposits.iter() { - let gui_deposit = self - .deployment - .deposits - .iter() - .find(|dg| dg.token.key == *k) - .ok_or(GuiError::DepositTokenNotFound(k.clone()))?; let preset = if v.is_preset { - let id = gui_deposit - .presets - .iter() - .position(|preset| *preset == v.value) - .ok_or(GuiError::InvalidPreset)? - .to_string(); GuiPreset { - id, + id: v.value.clone(), name: None, value: String::default(), } diff --git a/crates/settings/src/gui.rs b/crates/settings/src/gui.rs index 2dc53067d..a9a407388 100644 --- a/crates/settings/src/gui.rs +++ b/crates/settings/src/gui.rs @@ -397,7 +397,7 @@ impl YamlParseableValue for Gui { )?; let gui_preset = GuiPreset { - id: (preset_index as u8 + 1).to_string(), + id: preset_index.to_string(), name, value, }; diff --git a/crates/settings/src/metaboard.rs b/crates/settings/src/metaboard.rs index e788d245e..dc726ee86 100644 --- a/crates/settings/src/metaboard.rs +++ b/crates/settings/src/metaboard.rs @@ -4,7 +4,7 @@ use std::{ collections::HashMap, sync::{Arc, RwLock}, }; -use strict_yaml_rust::StrictYaml; +use strict_yaml_rust::{strict_yaml::Hash, StrictYaml}; use typeshare::typeshare; use url::{ParseError, Url}; @@ -35,11 +35,9 @@ impl Metaboard { if let StrictYaml::Hash(ref mut document_hash) = *document { if !document_hash.contains_key(&StrictYaml::String("metaboards".to_string())) { - let mut metaboards_hash = document_hash.clone(); - metaboards_hash.clear(); document_hash.insert( StrictYaml::String("metaboards".to_string()), - StrictYaml::Hash(metaboards_hash), + StrictYaml::Hash(Hash::new()), ); } diff --git a/crates/settings/src/network.rs b/crates/settings/src/network.rs index 0e19212fa..296b6828b 100644 --- a/crates/settings/src/network.rs +++ b/crates/settings/src/network.rs @@ -62,6 +62,8 @@ impl Network { } pub fn update_rpc(&mut self, rpc: &str) -> Result { + let rpc = Network::validate_rpc(rpc)?; + let mut document = self .document .write() @@ -76,7 +78,7 @@ impl Network { { network[&StrictYaml::String("rpc".to_string())] = StrictYaml::String(rpc.to_string()); - self.rpc = Network::validate_rpc(rpc)?; + self.rpc = rpc; } else { return Err(YamlError::ParseError(format!( "missing field: {} in networks", diff --git a/crates/settings/src/order.rs b/crates/settings/src/order.rs index caec89ab9..31565b52d 100644 --- a/crates/settings/src/order.rs +++ b/crates/settings/src/order.rs @@ -1,5 +1,5 @@ use crate::*; -use alloy::primitives::U256; +use alloy::primitives::{private::rand, U256}; use serde::{Deserialize, Serialize}; use std::{ collections::HashMap, @@ -63,6 +63,165 @@ impl Order { pub fn validate_vault_id(value: &str) -> Result { U256::from_str(value).map_err(ParseOrderConfigSourceError::VaultParseError) } + + pub fn update_vault_id( + &mut self, + is_input: bool, + index: u8, + vault_id: String, + ) -> Result { + let new_vault_id = Order::validate_vault_id(&vault_id)?; + + let mut document = self + .document + .write() + .map_err(|_| YamlError::WriteLockError)?; + + if let StrictYaml::Hash(ref mut document_hash) = *document { + if let Some(StrictYaml::Hash(ref mut orders)) = + document_hash.get_mut(&StrictYaml::String("orders".to_string())) + { + if let Some(StrictYaml::Hash(ref mut order)) = + orders.get_mut(&StrictYaml::String(self.key.to_string())) + { + let vec_key = if is_input { "inputs" } else { "outputs" }; + if let Some(StrictYaml::Array(ref mut vec)) = + order.get_mut(&StrictYaml::String(vec_key.to_string())) + { + if let Some(item) = vec.get_mut(index as usize) { + if let StrictYaml::Hash(ref mut item_hash) = item { + item_hash.insert( + StrictYaml::String("vault-id".to_string()), + StrictYaml::String(vault_id.to_string()), + ); + if is_input { + self.inputs[index as usize].vault_id = Some(new_vault_id); + } else { + self.outputs[index as usize].vault_id = Some(new_vault_id); + } + } else { + return Err(YamlError::ParseError(format!( + "vector item is not a hash: {index} for {vec_key} in order: {0}", + self.key + ))); + } + } else { + return Err(YamlError::ParseError(format!( + "index out of bounds: {index} for {vec_key} in order: {0}", + self.key + ))); + } + } else { + return Err(YamlError::ParseError(format!( + "missing field: {vec_key} in order: {0}", + self.key + ))); + } + } else { + return Err(YamlError::ParseError(format!( + "missing field: {} in orders", + self.key + ))); + } + } else { + return Err(YamlError::ParseError("missing field: orders".to_string())); + } + } else { + return Err(YamlError::ParseError("document parse error".to_string())); + } + + Ok(self.clone()) + } + + pub fn populate_vault_ids(&mut self) -> Result { + let vault_id: U256 = rand::random(); + + let mut document = self + .document + .write() + .map_err(|_| YamlError::WriteLockError)?; + + if let StrictYaml::Hash(ref mut document_hash) = *document { + if let Some(StrictYaml::Hash(ref mut orders)) = + document_hash.get_mut(&StrictYaml::String("orders".to_string())) + { + if let Some(StrictYaml::Hash(ref mut order)) = + orders.get_mut(&StrictYaml::String(self.key.to_string())) + { + if let Some(StrictYaml::Array(ref mut inputs)) = + order.get_mut(&StrictYaml::String("inputs".to_string())) + { + for (index, input) in inputs.iter_mut().enumerate() { + if let StrictYaml::Hash(ref mut input_hash) = input { + if !input_hash + .contains_key(&StrictYaml::String("vault-id".to_string())) + { + input_hash.insert( + StrictYaml::String("vault-id".to_string()), + StrictYaml::String(vault_id.to_string()), + ); + } + } else { + return Err(YamlError::ParseError(format!( + "vector item is not a hash: {index} for inputs in order: {0}", + self.key + ))); + } + } + } else { + return Err(YamlError::ParseError(format!( + "missing field: inputs in order: {0}", + self.key + ))); + } + if let Some(StrictYaml::Array(ref mut outputs)) = + order.get_mut(&StrictYaml::String("outputs".to_string())) + { + for (index, output) in outputs.iter_mut().enumerate() { + if let StrictYaml::Hash(ref mut output_hash) = output { + if !output_hash + .contains_key(&StrictYaml::String("vault-id".to_string())) + { + output_hash.insert( + StrictYaml::String("vault-id".to_string()), + StrictYaml::String(vault_id.to_string()), + ); + } + } else { + return Err(YamlError::ParseError(format!( + "vector item is not a hash: {index} for outputs in order: {0}", + self.key + ))); + } + } + } else { + return Err(YamlError::ParseError(format!( + "missing field: outputs in order: {0}", + self.key + ))); + } + + self.inputs.iter_mut().for_each(|input| { + input.vault_id = Some(input.vault_id.unwrap_or(vault_id)); + }); + self.outputs.iter_mut().for_each(|output| { + output.vault_id = Some(output.vault_id.unwrap_or(vault_id)); + }); + } else { + return Err(YamlError::ParseError(format!( + "missing field: {} in orders", + self.key + ))); + } + } else { + return Err(YamlError::ParseError("missing field: orders".to_string())); + } + } else { + return Err(YamlError::ParseError("document parse error".to_string())); + } + + Ok(self.clone()) + } } impl YamlParsableHash for Order { diff --git a/crates/settings/src/scenario.rs b/crates/settings/src/scenario.rs index 10b172a0d..46660eea4 100644 --- a/crates/settings/src/scenario.rs +++ b/crates/settings/src/scenario.rs @@ -6,7 +6,7 @@ use std::{ num::ParseIntError, sync::{Arc, RwLock}, }; -use strict_yaml_rust::StrictYaml; +use strict_yaml_rust::{strict_yaml::Hash, StrictYaml}; use thiserror::Error; use typeshare::typeshare; use yaml::{ @@ -165,6 +165,118 @@ impl Scenario { Ok(()) } + + pub fn update_bindings( + &mut self, + bindings: HashMap, + ) -> Result { + let scenario_parts = self.key.split('.').collect::>(); + let base_scenario = scenario_parts[0]; + + let mut new_bindings = Hash::new(); + for (k, v) in bindings { + new_bindings.insert(StrictYaml::String(k), StrictYaml::String(v)); + } + + { + let mut document = self + .document + .write() + .map_err(|_| YamlError::WriteLockError)?; + + if let StrictYaml::Hash(ref mut document_hash) = *document { + if let Some(StrictYaml::Hash(ref mut scenarios)) = + document_hash.get_mut(&StrictYaml::String("scenarios".to_string())) + { + if let Some(StrictYaml::Hash(ref mut scenario)) = + scenarios.get_mut(&StrictYaml::String(base_scenario.to_string())) + { + if let Some(StrictYaml::Hash(ref mut base_bindings)) = + scenario.get_mut(&StrictYaml::String("bindings".to_string())) + { + let updates: Vec<_> = base_bindings + .keys() + .filter_map(|k| new_bindings.get(k).map(|v| (k.clone(), v.clone()))) + .collect(); + for (k, v) in updates { + base_bindings.insert(k, v); + } + + let scenario_parts_vec: Vec<_> = + scenario_parts.iter().skip(1).collect(); + let mut current = scenario; + + for &part in scenario_parts_vec { + let next_scenario = + if let Some(StrictYaml::Hash(ref mut sub_scenarios)) = current + .get_mut(&StrictYaml::String("scenarios".to_string())) + { + if let Some(StrictYaml::Hash(ref mut sub_scenario)) = + sub_scenarios + .get_mut(&StrictYaml::String(part.to_string())) + { + if let Some(StrictYaml::Hash(ref mut sub_bindings)) = + sub_scenario.get_mut(&StrictYaml::String( + "bindings".to_string(), + )) + { + let sub_updates: Vec<_> = sub_bindings + .keys() + .filter_map(|k| { + new_bindings + .get(k) + .map(|v| (k.clone(), v.clone())) + }) + .collect(); + + for (k, v) in sub_updates { + sub_bindings.insert(k, v); + } + } else { + return Err(YamlError::ParseError(format!( + "bindings not found in scenario {}", + part + ))); + } + sub_scenario + } else { + return Err(YamlError::ParseError(format!( + "{} not found in sub scenarios", + part + ))); + } + } else { + return Err(YamlError::ParseError(format!( + "scenarios not found for part {}", + part + ))); + }; + current = next_scenario; + } + } else { + return Err(YamlError::ParseError(format!( + "bindings not found in scenario {}", + base_scenario + ))); + } + } else { + return Err(YamlError::ParseError(format!( + "missing field: {} in scenarios", + base_scenario + ))); + } + } else { + return Err(YamlError::ParseError( + "missing field: scenarios".to_string(), + )); + } + } else { + return Err(YamlError::ParseError("document parse error".to_string())); + } + } + + Self::parse_from_yaml(vec![self.document.clone()], &self.key) + } } impl YamlParsableHash for Scenario { diff --git a/crates/settings/src/token.rs b/crates/settings/src/token.rs index 14b8e3f9e..b9a180653 100644 --- a/crates/settings/src/token.rs +++ b/crates/settings/src/token.rs @@ -42,6 +42,8 @@ impl Token { } pub fn update_address(&mut self, address: &str) -> Result { + let address = Token::validate_address(address)?; + let mut document = self .document .write() @@ -56,7 +58,7 @@ impl Token { { token[&StrictYaml::String("address".to_string())] = StrictYaml::String(address.to_string()); - self.address = Token::validate_address(address)?; + self.address = address; } else { return Err(YamlError::ParseError(format!( "missing field: {} in tokens", diff --git a/crates/settings/src/yaml/dotrain.rs b/crates/settings/src/yaml/dotrain.rs index 6911fa136..26c5e6956 100644 --- a/crates/settings/src/yaml/dotrain.rs +++ b/crates/settings/src/yaml/dotrain.rs @@ -1,15 +1,19 @@ use super::*; use crate::{Deployment, Gui, Order, Scenario}; -use serde::de::{SeqAccess, Visitor}; -use serde::ser::SerializeSeq; -use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; -use std::fmt; -use std::sync::{Arc, RwLock}; +use serde::{ + de::{self, SeqAccess, Visitor}, + ser::SerializeSeq, + Deserialize, Deserializer, Serialize, Serializer, +}; +use std::{ + fmt, + sync::{Arc, RwLock}, +}; #[cfg(target_family = "wasm")] use rain_orderbook_bindings::{impl_all_wasm_traits, wasm_traits::prelude::*}; -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Default)] #[cfg_attr(target_family = "wasm", derive(Tsify))] pub struct DotrainYaml { pub documents: Vec>>, @@ -34,10 +38,16 @@ impl YamlParsable for DotrainYaml { if validate { Order::parse_all_from_yaml(documents.clone())?; + Scenario::parse_all_from_yaml(documents.clone())?; + Deployment::parse_all_from_yaml(documents.clone())?; } Ok(DotrainYaml { documents }) } + + fn from_documents(documents: Vec>>) -> Self { + DotrainYaml { documents } + } } impl DotrainYaml { @@ -176,6 +186,9 @@ mod tests { key2: value2 deployments: deployment1: + order: order1 + scenario: scenario1.scenario2 + deployment2: order: order1 scenario: scenario1 gui: @@ -240,12 +253,24 @@ mod tests { ); let deployment_keys = dotrain_yaml.get_deployment_keys().unwrap(); - assert_eq!(deployment_keys.len(), 1); + assert_eq!(deployment_keys.len(), 2); let deployment = dotrain_yaml.get_deployment("deployment1").unwrap(); assert_eq!( deployment.order, dotrain_yaml.get_order("order1").unwrap().into() ); + assert_eq!( + deployment.scenario, + dotrain_yaml + .get_scenario("scenario1.scenario2") + .unwrap() + .into() + ); + let deployment = dotrain_yaml.get_deployment("deployment2").unwrap(); + assert_eq!( + deployment.order, + dotrain_yaml.get_order("order1").unwrap().into() + ); assert_eq!( deployment.scenario, dotrain_yaml.get_scenario("scenario1").unwrap().into() @@ -277,4 +302,182 @@ mod tests { assert_eq!(select_tokens.len(), 1); assert_eq!(select_tokens[0], "token2"); } + + #[test] + fn test_update_vault_ids() { + let yaml = r#" + networks: + mainnet: + rpc: https://mainnet.infura.io + chain-id: 1 + testnet: + rpc: https://testnet.infura.io + chain-id: 1337 + tokens: + token1: + network: mainnet + address: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 + decimals: 18 + label: Wrapped Ether + symbol: WETH + token2: + network: mainnet + address: 0x0000000000000000000000000000000000000002 + decimals: 6 + label: USD Coin + symbol: USDC + orders: + order1: + inputs: + - token: token1 + outputs: + - token: token2 + "#; + let dotrain_yaml = DotrainYaml::new(vec![yaml.to_string()], false).unwrap(); + + let mut order = dotrain_yaml.get_order("order1").unwrap(); + + assert!(order.inputs[0].vault_id.is_none()); + assert!(order.outputs[0].vault_id.is_none()); + + let updated_order = order.populate_vault_ids().unwrap(); + + // After population, all vault IDs should be set and equal + assert!(updated_order.inputs[0].vault_id.is_some()); + assert!(updated_order.outputs[0].vault_id.is_some()); + assert_eq!( + updated_order.inputs[0].vault_id, + updated_order.outputs[0].vault_id + ); + + let order_after = dotrain_yaml.get_order("order1").unwrap(); + assert_eq!( + order_after.inputs[0].vault_id, + updated_order.inputs[0].vault_id + ); + assert_eq!( + order_after.outputs[0].vault_id, + updated_order.outputs[0].vault_id + ); + + // Populate vault IDs should not change if the vault IDs are already set + let dotrain_yaml = DotrainYaml::new(vec![FULL_YAML.to_string()], false).unwrap(); + let mut order = dotrain_yaml.get_order("order1").unwrap(); + assert_eq!(order.inputs[0].vault_id, Some(U256::from(1))); + assert_eq!(order.outputs[0].vault_id, Some(U256::from(2))); + order.populate_vault_ids().unwrap(); + assert_eq!(order.inputs[0].vault_id, Some(U256::from(1))); + assert_eq!(order.outputs[0].vault_id, Some(U256::from(2))); + } + + #[test] + fn test_update_vault_id() { + let yaml = r#" + networks: + mainnet: + rpc: https://mainnet.infura.io + chain-id: 1 + testnet: + rpc: https://testnet.infura.io + chain-id: 1337 + tokens: + token1: + network: mainnet + address: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 + decimals: 18 + label: Wrapped Ether + symbol: WETH + token2: + network: mainnet + address: 0x0000000000000000000000000000000000000002 + decimals: 6 + label: USD Coin + symbol: USDC + orders: + order1: + inputs: + - token: token1 + outputs: + - token: token2 + "#; + let dotrain_yaml = DotrainYaml::new(vec![yaml.to_string()], false).unwrap(); + let mut order = dotrain_yaml.get_order("order1").unwrap(); + + assert!(order.inputs[0].vault_id.is_none()); + assert!(order.outputs[0].vault_id.is_none()); + + let mut updated_order = order.update_vault_id(true, 0, "1".to_string()).unwrap(); + let updated_order = updated_order + .update_vault_id(false, 0, "11".to_string()) + .unwrap(); + + assert_eq!(updated_order.inputs[0].vault_id, Some(U256::from(1))); + assert_eq!(updated_order.outputs[0].vault_id, Some(U256::from(11))); + + let mut order = dotrain_yaml.get_order("order1").unwrap(); + assert_eq!(order.inputs[0].vault_id, Some(U256::from(1))); + assert_eq!(order.outputs[0].vault_id, Some(U256::from(11))); + + let mut updated_order = order.update_vault_id(true, 0, "3".to_string()).unwrap(); + let updated_order = updated_order + .update_vault_id(false, 0, "33".to_string()) + .unwrap(); + assert_eq!(updated_order.inputs[0].vault_id, Some(U256::from(3))); + assert_eq!(updated_order.outputs[0].vault_id, Some(U256::from(33))); + + let order = dotrain_yaml.get_order("order1").unwrap(); + assert_eq!(order.inputs[0].vault_id, Some(U256::from(3))); + assert_eq!(order.outputs[0].vault_id, Some(U256::from(33))); + } + + #[test] + fn test_update_bindings() { + // Parent scenario + { + let dotrain_yaml = DotrainYaml::new(vec![FULL_YAML.to_string()], false).unwrap(); + + let mut scenario = dotrain_yaml.get_scenario("scenario1").unwrap(); + + assert_eq!(scenario.bindings.len(), 1); + assert_eq!(scenario.bindings.get("key1").unwrap(), "value1"); + + let updated_scenario = scenario + .update_bindings(HashMap::from([("key1".to_string(), "value2".to_string())])) + .unwrap(); + + assert_eq!(updated_scenario.bindings.len(), 1); + assert_eq!(updated_scenario.bindings.get("key1").unwrap(), "value2"); + + let scenario = dotrain_yaml.get_scenario("scenario1").unwrap(); + assert_eq!(scenario.bindings.len(), 1); + assert_eq!(scenario.bindings.get("key1").unwrap(), "value2"); + } + + // Child scenario + { + let dotrain_yaml = DotrainYaml::new(vec![FULL_YAML.to_string()], false).unwrap(); + + let mut scenario = dotrain_yaml.get_scenario("scenario1.scenario2").unwrap(); + + assert_eq!(scenario.bindings.len(), 2); + assert_eq!(scenario.bindings.get("key1").unwrap(), "value1"); + assert_eq!(scenario.bindings.get("key2").unwrap(), "value2"); + + let updated_scenario = scenario + .update_bindings(HashMap::from([ + ("key1".to_string(), "value3".to_string()), + ("key2".to_string(), "value4".to_string()), + ])) + .unwrap(); + + assert_eq!(updated_scenario.bindings.len(), 2); + assert_eq!(updated_scenario.bindings.get("key1").unwrap(), "value3"); + assert_eq!(updated_scenario.bindings.get("key2").unwrap(), "value4"); + + let scenario = dotrain_yaml.get_scenario("scenario1.scenario2").unwrap(); + assert_eq!(scenario.bindings.len(), 2); + assert_eq!(scenario.bindings.get("key1").unwrap(), "value3"); + assert_eq!(scenario.bindings.get("key2").unwrap(), "value4"); + } + } } diff --git a/crates/settings/src/yaml/mod.rs b/crates/settings/src/yaml/mod.rs index fa875a7be..f950e598a 100644 --- a/crates/settings/src/yaml/mod.rs +++ b/crates/settings/src/yaml/mod.rs @@ -20,11 +20,20 @@ use url::ParseError as UrlParseError; pub trait YamlParsable: Sized { fn new(sources: Vec, validate: bool) -> Result; + fn from_documents(documents: Vec>>) -> Self; + fn get_yaml_string(document: Arc>) -> Result { let document = document.read().unwrap(); let mut out_str = String::new(); let mut emitter = StrictYamlEmitter::new(&mut out_str); emitter.dump(&document)?; + + let out_str = if out_str.starts_with("---") { + out_str.trim_start_matches("---").trim_start().to_string() + } else { + out_str + }; + Ok(out_str) } } diff --git a/crates/settings/src/yaml/orderbook.rs b/crates/settings/src/yaml/orderbook.rs index f862e075a..60445bafe 100644 --- a/crates/settings/src/yaml/orderbook.rs +++ b/crates/settings/src/yaml/orderbook.rs @@ -3,16 +3,20 @@ use crate::{ metaboard::Metaboard, raindex_version::RaindexVersion, sentry::Sentry, subgraph::Subgraph, Deployer, Network, Orderbook, Token, }; -use std::sync::{Arc, RwLock}; +use serde::{ + de::{self, Deserializer, SeqAccess, Visitor}, + ser::{Serialize, SerializeSeq, Serializer}, + Deserialize, +}; +use std::{ + fmt, + sync::{Arc, RwLock}, +}; #[cfg(target_family = "wasm")] use rain_orderbook_bindings::{impl_all_wasm_traits, wasm_traits::prelude::*}; -use serde::de::{self, Deserializer, SeqAccess, Visitor}; -use serde::ser::{Serialize, SerializeSeq, Serializer}; -use serde::Deserialize; -use std::fmt; -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Default)] #[cfg_attr(target_family = "wasm", derive(Tsify))] pub struct OrderbookYaml { pub documents: Vec>>, @@ -37,10 +41,19 @@ impl YamlParsable for OrderbookYaml { if validate { Network::parse_all_from_yaml(documents.clone())?; + Token::parse_all_from_yaml(documents.clone())?; + Subgraph::parse_all_from_yaml(documents.clone())?; + Orderbook::parse_all_from_yaml(documents.clone())?; + Deployer::parse_all_from_yaml(documents.clone())?; + Metaboard::parse_all_from_yaml(documents.clone())?; } Ok(OrderbookYaml { documents }) } + + fn from_documents(documents: Vec>>) -> Self { + OrderbookYaml { documents } + } } impl OrderbookYaml { diff --git a/packages/orderbook/test/common/test.test.ts b/packages/orderbook/test/common/test.test.ts index 6a64c7913..b7138f4fe 100644 --- a/packages/orderbook/test/common/test.test.ts +++ b/packages/orderbook/test/common/test.test.ts @@ -48,6 +48,8 @@ scenarios: some-scenario: network: some-network deployer: some-deployer + bindings: + key: 10 orders: some-order: @@ -65,6 +67,7 @@ deployments: scenario: some-scenario order: some-order --- +#key !Test binding #calculate-io _ _: 0 0; #handle-io @@ -155,8 +158,10 @@ scenarios: config-scenario: network: some-network deployer: some-deployer + bindings: + key: 10 `; - const dotrainOrder = await DotrainOrder.create(dotrain, config); + const dotrainOrder = await DotrainOrder.create(dotrain, [config]); const result = await dotrainOrder.composeScenarioToRainlang('config-scenario'); const expected = `/* 0. calculate-io */ _ _: 0 0; diff --git a/packages/orderbook/test/js_api/gui.test.ts b/packages/orderbook/test/js_api/gui.test.ts index 2ed43b5a1..880f138c8 100644 --- a/packages/orderbook/test/js_api/gui.test.ts +++ b/packages/orderbook/test/js_api/gui.test.ts @@ -7,7 +7,6 @@ import { AllowancesResult, ApprovalCalldataResult, AvailableDeployments, - Config, DepositAndAddOrderCalldataResult, DepositCalldataResult, Gui, @@ -138,6 +137,8 @@ networks: subgraphs: some-sg: https://www.some-sg.com +metaboards: + test: https://metaboard.com deployers: some-deployer: @@ -166,10 +167,13 @@ tokens: scenarios: some-scenario: - network: some-network deployer: some-deployer bindings: - test-binding: "5" + test-binding: 5 + scenarios: + sub-scenario: + bindings: + another-binding: 300 orders: some-order: @@ -187,10 +191,11 @@ deployments: scenario: some-scenario order: some-order other-deployment: - scenario: some-scenario + scenario: some-scenario.sub-scenario order: some-order --- #test-binding ! +#another-binding ! #calculate-io _ _: 0 0; #handle-io @@ -208,6 +213,8 @@ networks: subgraphs: some-sg: https://www.some-sg.com +metaboards: + test: https://metaboard.com deployers: some-deployer: @@ -236,8 +243,9 @@ tokens: scenarios: some-scenario: - network: some-network deployer: some-deployer + bindings: + test-binding: 5 orders: some-order: @@ -592,7 +600,7 @@ describe('Rain Orderbook JS API Package Bindgen Tests - Gui', async function () describe('state management tests', async () => { let serializedState = - 'H4sIAAAAAAAA_3WNSwoCMRBEZ1REb-FaULrz6-mdR_AKyaQjgxBBZ-HxFey4EKzNq_5Qdeo-kkxkTeRCo3MefYzENoBACVJ49FIgcWRHLhV624Gt-AHZoQSGYBaas1WmqeapXg7Y6wL6jbrzXR4y73DfLk801vlAA0NMY5byb_4NN13TUokArXCtnG9Xqfj9XCk9HMMLsIlnw_0AAAA='; + 'H4sIAAAAAAAA_3WNTQ5AMBCF_UW4hbWEzJQWt3AF1ZJGUgldOL6FqYXE23zz8_JeFDzKidJYZexaYUgHCDOaxkOf2hVY-s-FrGm56PoBJjkrvfzt33AWeMVEBPCFKdHtm7b4OhMih1rc8yX-NrUAAAA='; let gui: DotrainOrderGui; beforeAll(async () => { mockServer @@ -644,34 +652,6 @@ describe('Rain Orderbook JS API Package Bindgen Tests - Gui', async function () assert.equal(deposits[0].address, '0xc2132d05d31c914a87c6611c10748aeb04b58e8f'); }); - it('should throw error during deserialize if config is different', async () => { - // token1 info - mockServer - .forPost('/rpc-url') - .once() - .withBodyIncluding('0x82ad56cb') - .thenSendJsonRpcResult( - '0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000007546f6b656e203100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000025431000000000000000000000000000000000000000000000000000000000000' - ); - // token2 info - mockServer - .forPost('/rpc-url') - .once() - .withBodyIncluding('0x82ad56cb') - .thenSendJsonRpcResult( - '0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000754656b656e203200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000025432000000000000000000000000000000000000000000000000000000000000' - ); - - let dotrain2 = ` -${guiConfig2} - -${dotrain} -`; - let gui2 = await DotrainOrderGui.chooseDeployment(dotrain2, 'other-deployment'); - let serialized = gui2.serializeState(); - expect(() => gui.deserializeState(serialized)).toThrow('Deserialized config mismatch'); - }); - it('should clear state', async () => { gui.clearState(); const fieldValues: AllFieldValuesResult[] = gui.getAllFieldValues(); @@ -840,7 +820,10 @@ ${dotrain} const currentDeployment: GuiDeployment = gui.getCurrentDeployment(); assert.deepEqual( currentDeployment.deployment.scenario.bindings, - new Map([['test-binding', '10']]) + new Map([ + ['test-binding', '10'], + ['another-binding', '300'] + ]) ); }); @@ -882,7 +865,10 @@ ${dotrain} const currentDeployment: GuiDeployment = gui.getCurrentDeployment(); assert.deepEqual( currentDeployment.deployment.scenario.bindings, - new Map([['test-binding', '0xbeef']]) + new Map([ + ['test-binding', '0xbeef'], + ['another-binding', '300'] + ]) ); }); @@ -1029,16 +1015,6 @@ ${dotrain} let initialTokenInfo: TokenInfos = await gui.getTokenInfos(); assert.equal(initialTokenInfo.size, 0); - let dotrainConfig: Config = gui.getDotrainConfig(); - assert.equal( - dotrainConfig.tokens.get('token1')?.address, - '0xc2132d05d31c914a87c6611c10748aeb04b58e8f' - ); - assert.equal( - dotrainConfig.tokens.get('token2')?.address, - '0x8f3cf7ad23cd3cadbd9735aff958023239c6a063' - ); - let currentDeployment: GuiDeployment = gui.getCurrentDeployment(); assert.equal( currentDeployment.deployment.order.inputs[0].token.address, @@ -1063,16 +1039,6 @@ ${dotrain} let tokenInfo: TokenInfos = await gui.getTokenInfos(); assert.equal(tokenInfo.size, 2); - let newDotrainConfig: Config = gui.getDotrainConfig(); - assert.equal( - newDotrainConfig.tokens.get('token1')?.address, - '0x6666666666666666666666666666666666666666' - ); - assert.equal( - newDotrainConfig.tokens.get('token2')?.address, - '0x8888888888888888888888888888888888888888' - ); - let newCurrentDeployment: GuiDeployment = gui.getCurrentDeployment(); assert.equal( newCurrentDeployment.deployment.order.inputs[0].token.address, diff --git a/tauri-app/src-tauri/src/commands/authoring_meta.rs b/tauri-app/src-tauri/src/commands/authoring_meta.rs index 7407c6c32..68f129074 100644 --- a/tauri-app/src-tauri/src/commands/authoring_meta.rs +++ b/tauri-app/src-tauri/src/commands/authoring_meta.rs @@ -51,9 +51,13 @@ deployers: address: {deployer} scenarios: sepolia: + deployer: sepolia + bindings: + key: 10 metaboards: sepolia: {metaboard_url} --- +#key !Test binding #calculate-io using-words-from {pragma} _: order-hash(), @@ -119,9 +123,13 @@ _ _: 0 0; address: {deployer} scenarios: sepolia: + deployer: sepolia + bindings: + key: 10 metaboards: sepolia: {metaboard_url} --- + #key !Test binding #calculate-io using-words-from {pragma} _: order-hash(), @@ -236,9 +244,13 @@ _ _: 0 0; address: {deployer} scenarios: sepolia: + deployer: sepolia + bindings: + key: 10 metaboards: sepolia: {metaboard_url} --- + #key !Test binding #calculate-io using-words-from {pragma} _: order-hash(), diff --git a/tauri-app/src-tauri/src/commands/order_quote.rs b/tauri-app/src-tauri/src/commands/order_quote.rs index e8b187515..c29438c0b 100644 --- a/tauri-app/src-tauri/src/commands/order_quote.rs +++ b/tauri-app/src-tauri/src/commands/order_quote.rs @@ -110,11 +110,15 @@ orders: vault-id: 0x01 scenarios: some-key: + deployer: some-key + bindings: + key: 10 deployments: some-key: scenario: some-key order: some-key --- +#key !Test binding #calculate-io amount price: 16 52; #handle-add-order diff --git a/tauri-app/src-tauri/src/commands/trade_debug.rs b/tauri-app/src-tauri/src/commands/trade_debug.rs index 4c6681e44..b6c61820d 100644 --- a/tauri-app/src-tauri/src/commands/trade_debug.rs +++ b/tauri-app/src-tauri/src/commands/trade_debug.rs @@ -93,11 +93,15 @@ orders: vault-id: 0x01 scenarios: some-key: + deployer: some-key + bindings: + key: 10 deployments: some-key: scenario: some-key order: some-key --- +#key !Test binding #calculate-io amount price: 7 4; #handle-add-order diff --git a/tauri-app/src-tauri/src/commands/vault.rs b/tauri-app/src-tauri/src/commands/vault.rs index 399ea933f..ec92dd259 100644 --- a/tauri-app/src-tauri/src/commands/vault.rs +++ b/tauri-app/src-tauri/src/commands/vault.rs @@ -10,10 +10,6 @@ use rain_orderbook_common::{ types::{FlattenError, TokenVaultFlattened, VaultBalanceChangeFlattened}, withdraw::WithdrawArgs, }; -use rain_orderbook_subgraph_client::PaginationArgs; -use rain_orderbook_subgraph_client::{ - types::common::*, MultiOrderbookSubgraphClient, MultiSubgraphArgs, -}; use std::fs; use std::path::PathBuf; use tauri::AppHandle;