Skip to content

Commit

Permalink
Merge branch 'main' into 01/13/25-Fix-telegram-icon-in-sidebar
Browse files Browse the repository at this point in the history
  • Loading branch information
hardingjam authored Jan 15, 2025
2 parents a4cda94 + a82995c commit 9e78618
Show file tree
Hide file tree
Showing 17 changed files with 742 additions and 715 deletions.
56 changes: 35 additions & 21 deletions crates/common/src/add_order.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,10 @@ pub enum AddOrderArgsError {
#[cfg(not(target_family = "wasm"))]
#[error(transparent)]
ForkCallError(#[from] ForkCallError),
#[error("Input token not found for index: {0}")]
InputTokenNotFound(String),
#[error("Output token not found for index: {0}")]
OutputTokenNotFound(String),
}

#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
Expand All @@ -80,50 +84,60 @@ impl AddOrderArgs {
) -> Result<AddOrderArgs, AddOrderArgsError> {
let random_vault_id: U256 = rand::random();
let mut inputs = vec![];
for input in &deployment.order.inputs {
if let Some(decimals) = input.token.decimals {
for (i, input) in deployment.order.inputs.iter().enumerate() {
let input_token = input
.token
.as_ref()
.ok_or_else(|| AddOrderArgsError::InputTokenNotFound(i.to_string()))?;

if let Some(decimals) = input_token.decimals {
inputs.push(IO {
token: input.token.address,
token: input_token.address,
vaultId: input.vault_id.unwrap_or(random_vault_id),
decimals,
});
} else {
let client = ReadableClientHttp::new_from_url(input.token.network.rpc.to_string())?;
let client = ReadableClientHttp::new_from_url(input_token.network.rpc.to_string())?;
let parameters = ReadContractParameters {
address: input.token.address,
address: input_token.address,
call: decimalsCall {},
block_number: None,
gas: None,
};
let decimals = client.read(parameters).await?._0;
inputs.push(IO {
token: input.token.address,
token: input_token.address,
vaultId: input.vault_id.unwrap_or(random_vault_id),
decimals,
});
}
}

let mut outputs = vec![];
for output in &deployment.order.outputs {
if let Some(decimals) = output.token.decimals {
for (i, output) in deployment.order.outputs.iter().enumerate() {
let output_token = output
.token
.as_ref()
.ok_or_else(|| AddOrderArgsError::OutputTokenNotFound(i.to_string()))?;

if let Some(decimals) = output_token.decimals {
outputs.push(IO {
token: output.token.address,
token: output_token.address,
vaultId: output.vault_id.unwrap_or(random_vault_id),
decimals,
});
} else {
let client =
ReadableClientHttp::new_from_url(output.token.network.rpc.to_string())?;
ReadableClientHttp::new_from_url(output_token.network.rpc.to_string())?;
let parameters = ReadContractParameters {
address: output.token.address,
address: output_token.address,
call: decimalsCall {},
block_number: None,
gas: None,
};
let decimals = client.read(parameters).await?._0;
outputs.push(IO {
token: output.token.address,
token: output_token.address,
vaultId: output.vault_id.unwrap_or(random_vault_id),
decimals,
});
Expand Down Expand Up @@ -489,16 +503,16 @@ price: 2e18;
key: "".to_string(),
inputs: vec![
OrderIO {
token: token1_arc.clone(),
token: Some(token1_arc.clone()),
vault_id: None,
},
OrderIO {
token: token2_arc.clone(),
token: Some(token2_arc.clone()),
vault_id: Some(known_vault_id),
},
],
outputs: vec![OrderIO {
token: token3_arc.clone(),
token: Some(token3_arc.clone()),
vault_id: None,
}],
network: network_arc.clone(),
Expand Down Expand Up @@ -599,16 +613,16 @@ _ _: 0 0;
key: "".to_string(),
inputs: vec![
OrderIO {
token: token1_arc.clone(),
token: Some(token1_arc.clone()),
vault_id: Some(U256::from(2)),
},
OrderIO {
token: token2_arc.clone(),
token: Some(token2_arc.clone()),
vault_id: Some(U256::from(1)),
},
],
outputs: vec![OrderIO {
token: token3_arc.clone(),
token: Some(token3_arc.clone()),
vault_id: Some(U256::from(4)),
}],
network: network_arc.clone(),
Expand Down Expand Up @@ -745,16 +759,16 @@ _ _: 0 0;
key: "".to_string(),
inputs: vec![
OrderIO {
token: token1_arc.clone(),
token: Some(token1_arc.clone()),
vault_id: None,
},
OrderIO {
token: token2_arc.clone(),
token: Some(token2_arc.clone()),
vault_id: Some(known_vault_id),
},
],
outputs: vec![OrderIO {
token: token3_arc.clone(),
token: Some(token3_arc.clone()),
vault_id: None,
}],
network: network_arc.clone(),
Expand Down
32 changes: 22 additions & 10 deletions crates/common/src/dotrain_order/calldata.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,18 +45,23 @@ impl DotrainOrder {
&self,
deployment_name: &str,
owner: &str,
token_deposits: &HashMap<Address, U256>,
token_deposits: &HashMap<String, U256>,
) -> Result<Vec<ApprovalCalldata>, DotrainOrderCalldataError> {
let deployment = self.get_deployment(deployment_name)?;
let orderbook = self.get_orderbook(deployment_name)?;

let mut calldatas = Vec::new();

for output in &deployment.order.outputs {
if let Some(deposit_amount) = token_deposits.get(&output.token.address) {
for (i, output) in deployment.order.outputs.iter().enumerate() {
let output_token = output
.token
.as_ref()
.ok_or_else(|| DotrainOrderCalldataError::OutputTokenNotFound(i.to_string()))?;

if let Some(deposit_amount) = token_deposits.get(&output_token.key) {
let deposit_amount = deposit_amount.to_owned();
let deposit_args = DepositArgs {
token: output.token.address,
token: output_token.address,
amount: deposit_amount,
vault_id: U256::default(),
};
Expand All @@ -75,7 +80,7 @@ impl DotrainOrder {
.get_approve_calldata(transaction_args, allowance)
.await?;
calldatas.push(ApprovalCalldata {
token: output.token.address,
token: output_token.address,
calldata: Bytes::copy_from_slice(&approve_call),
});
}
Expand All @@ -94,22 +99,26 @@ impl DotrainOrder {
let mut calldatas = Vec::new();

for (i, output) in deployment.order.outputs.iter().enumerate() {
let output_token = output
.token
.as_ref()
.ok_or_else(|| DotrainOrderCalldataError::OutputTokenNotFound(i.to_string()))?;
let vault_id = output
.vault_id
.ok_or(DotrainOrderCalldataError::VaultIdNotFound(i.to_string()))?;

let token_deposit = token_deposits
.get(&(vault_id, output.token.address))
.get(&(vault_id, output_token.address))
.ok_or(DotrainOrderCalldataError::TokenNotFound(
output.token.address.to_string(),
output_token.address.to_string(),
))?;

if *token_deposit == U256::ZERO {
continue;
}

let calldata = DepositArgs {
token: output.token.address,
token: output_token.address,
amount: token_deposit.to_owned(),
vault_id,
}
Expand Down Expand Up @@ -150,12 +159,15 @@ pub enum DotrainOrderCalldataError {
#[error("Orderbook not found")]
OrderbookNotFound,

#[error("Token not found {0}")]
TokenNotFound(String),
#[error("Token not found for output index: {0}")]
OutputTokenNotFound(String),

#[error("Vault id not found for output index: {0}")]
VaultIdNotFound(String),

#[error("Token not found {0}")]
TokenNotFound(String),

#[error(transparent)]
DepositError(#[from] DepositError),

Expand Down
24 changes: 15 additions & 9 deletions crates/js_api/src/gui/deposits.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@ impl DotrainOrderGui {
let deployment = self.get_current_deployment()?;
self.deposits
.iter()
.map(|(token, value)| {
.map(|(key, value)| {
let gui_deposit = deployment
.deposits
.iter()
.find(|dg| dg.token.key == *token)
.ok_or(GuiError::DepositTokenNotFound(token.clone()))?;
.find(|dg| dg.token.as_ref().map_or(false, |t| t.key == *key))
.ok_or(GuiError::DepositTokenNotFound(key.clone()))?;
let amount: String = if value.is_preset {
let index = value
.value
Expand All @@ -35,10 +35,16 @@ impl DotrainOrderGui {
} else {
value.value.clone()
};

if gui_deposit.token.is_none() {
return Err(GuiError::TokenMustBeSelected(key.clone()));
}
let token = gui_deposit.token.as_ref().unwrap();

Ok(TokenDeposit {
token: gui_deposit.token.key.clone(),
token: token.key.clone(),
amount,
address: gui_deposit.token.address,
address: token.address,
})
})
.collect::<Result<Vec<TokenDeposit>, GuiError>>()
Expand All @@ -50,7 +56,7 @@ impl DotrainOrderGui {
let gui_deposit = deployment
.deposits
.iter()
.find(|dg| dg.token.key == token)
.find(|dg| dg.token.as_ref().map_or(false, |t| t.key == token))
.ok_or(GuiError::DepositTokenNotFound(token.clone()))?;

let value = if let Some(index) = gui_deposit.presets.iter().position(|p| **p == amount) {
Expand All @@ -75,13 +81,13 @@ impl DotrainOrderGui {
}

#[wasm_bindgen(js_name = "getDepositPresets")]
pub fn get_deposit_presets(&self, token: String) -> Result<Vec<String>, GuiError> {
pub fn get_deposit_presets(&self, key: String) -> Result<Vec<String>, GuiError> {
let deployment = self.get_current_deployment()?;
let gui_deposit = deployment
.deposits
.iter()
.find(|dg| dg.token.key == token)
.ok_or(GuiError::DepositTokenNotFound(token.clone()))?;
.find(|dg| dg.token.as_ref().map_or(false, |t| t.key == key))
.ok_or(GuiError::DepositTokenNotFound(key.clone()))?;
Ok(gui_deposit.presets.clone())
}
}
Loading

0 comments on commit 9e78618

Please sign in to comment.