Skip to content

Commit

Permalink
Merge branch 'main' into 2025-02-18-gui-deposit-getter
Browse files Browse the repository at this point in the history
  • Loading branch information
hardyjosh authored Feb 20, 2025
2 parents 1a1fe81 + c89463b commit b1ae90e
Show file tree
Hide file tree
Showing 50 changed files with 959 additions and 648 deletions.
3 changes: 2 additions & 1 deletion crates/cli/src/commands/order/detail.rs
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,8 @@ mod tests {
"from": encode_prefixed(alloy::primitives::Address::random())
}
}],
"trades": []
"trades": [],
"removeEvents": []
}
}
})
Expand Down
3 changes: 2 additions & 1 deletion crates/cli/src/commands/order/list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,8 @@ mod tests {
"from": encode_prefixed(alloy::primitives::Address::random())
}
}],
"trades": []
"trades": [],
"removeEvents": []
}]
}
})
Expand Down
4 changes: 2 additions & 2 deletions crates/common/src/dotrain_order/calldata.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ use std::{collections::HashMap, str::FromStr, sync::Arc};
#[cfg_attr(target_family = "wasm", derive(Tsify))]
pub struct ApprovalCalldata {
#[cfg_attr(target_family = "wasm", tsify(type = "string"))]
token: Address,
pub token: Address,
#[cfg_attr(target_family = "wasm", tsify(type = "string"))]
calldata: Bytes,
pub calldata: Bytes,
}
#[cfg(target_family = "wasm")]
impl_all_wasm_traits!(ApprovalCalldata);
Expand Down
5 changes: 5 additions & 0 deletions crates/js_api/src/gui/deposits.rs
Original file line number Diff line number Diff line change
Expand Up @@ -134,4 +134,9 @@ impl DotrainOrderGui {
}
Ok(missing_deposits)
}

#[wasm_bindgen(js_name = "hasAnyDeposit")]
pub fn has_any_deposit(&self) -> bool {
!self.deposits.is_empty()
}
}
134 changes: 111 additions & 23 deletions crates/js_api/src/gui/order_operations.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,14 @@ use rain_orderbook_bindings::OrderBook::multicallCall;
use rain_orderbook_common::{deposit::DepositArgs, dotrain_order, transaction::TransactionArgs};
use std::{collections::HashMap, str::FromStr, sync::Arc};

pub enum CalldataFunction {
Allowance,
Approval,
Deposit,
AddOrder,
DepositAndAddOrder,
}

#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Tsify)]

pub struct TokenAllowance {
Expand Down Expand Up @@ -53,6 +61,24 @@ impl_all_wasm_traits!(DepositAndAddOrderCalldataResult);
pub struct IOVaultIds(HashMap<String, Vec<Option<U256>>>);
impl_all_wasm_traits!(IOVaultIds);

#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Tsify)]
pub struct ExtendedApprovalCalldata {
pub token: Address,
pub calldata: Bytes,
pub symbol: String,
}
impl_all_wasm_traits!(ExtendedApprovalCalldata);

#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Tsify)]
#[serde(rename_all = "camelCase")]
pub struct DeploymentTransactionArgs {
approvals: Vec<ExtendedApprovalCalldata>,
deployment_calldata: Bytes,
orderbook_address: Address,
chain_id: u64,
}
impl_all_wasm_traits!(DeploymentTransactionArgs);

#[wasm_bindgen]
impl DotrainOrderGui {
fn get_orderbook(&self) -> Result<Arc<Orderbook>, GuiError> {
Expand Down Expand Up @@ -129,13 +155,32 @@ impl DotrainOrderGui {
})
}

fn prepare_calldata_generation(
&mut self,
calldata_function: CalldataFunction,
) -> Result<GuiDeployment, GuiError> {
let deployment = self.get_current_deployment()?;
self.check_select_tokens()?;
match calldata_function {
CalldataFunction::Deposit => {
self.populate_vault_ids(&deployment)?;
}
CalldataFunction::AddOrder | CalldataFunction::DepositAndAddOrder => {
self.check_field_values()?;
self.populate_vault_ids(&deployment)?;
self.update_bindings(&deployment)?;
}
_ => {}
}
Ok(self.get_current_deployment()?)
}

/// Check allowances for all inputs and outputs of the order
///
/// Returns a vector of [`TokenAllowance`] objects
#[wasm_bindgen(js_name = "checkAllowances")]
pub async fn check_allowances(&self, owner: String) -> Result<AllowancesResult, GuiError> {
let deployment = self.get_current_deployment()?;
self.check_select_tokens()?;
pub async fn check_allowances(&mut self, owner: String) -> Result<AllowancesResult, GuiError> {
let deployment = self.prepare_calldata_generation(CalldataFunction::Allowance)?;

let orderbook = self.get_orderbook()?;
let vaults_and_deposits = self.get_vaults_and_deposits(&deployment).await?;
Expand Down Expand Up @@ -166,11 +211,10 @@ impl DotrainOrderGui {
/// Returns a vector of [`ApprovalCalldata`] objects
#[wasm_bindgen(js_name = "generateApprovalCalldatas")]
pub async fn generate_approval_calldatas(
&self,
&mut self,
owner: String,
) -> Result<ApprovalCalldataResult, GuiError> {
let deployment = self.get_current_deployment()?;
self.check_select_tokens()?;
let deployment = self.prepare_calldata_generation(CalldataFunction::Approval)?;

let deposits_map = self.get_deposits_as_map().await?;
if deposits_map.is_empty() {
Expand Down Expand Up @@ -210,10 +254,7 @@ impl DotrainOrderGui {
/// Returns a vector of bytes
#[wasm_bindgen(js_name = "generateDepositCalldatas")]
pub async fn generate_deposit_calldatas(&mut self) -> Result<DepositCalldataResult, GuiError> {
let deployment = self.get_current_deployment()?;
self.check_select_tokens()?;
self.populate_vault_ids(&deployment)?;
let deployment = self.get_current_deployment()?;
let deployment = self.prepare_calldata_generation(CalldataFunction::Deposit)?;

let token_deposits = self
.get_vaults_and_deposits(&deployment)
Expand Down Expand Up @@ -251,13 +292,7 @@ impl DotrainOrderGui {
pub async fn generate_add_order_calldata(
&mut self,
) -> Result<AddOrderCalldataResult, GuiError> {
let deployment = self.get_current_deployment()?;
self.check_select_tokens()?;
self.check_field_values()?;
self.populate_vault_ids(&deployment)?;
self.update_bindings(&deployment)?;
let deployment = self.get_current_deployment()?;

let deployment = self.prepare_calldata_generation(CalldataFunction::AddOrder)?;
let calldata = self
.dotrain_order
.generate_add_order_calldata(&deployment.key)
Expand All @@ -269,12 +304,7 @@ impl DotrainOrderGui {
pub async fn generate_deposit_and_add_order_calldatas(
&mut self,
) -> Result<DepositAndAddOrderCalldataResult, GuiError> {
let deployment = self.get_current_deployment()?;
self.check_select_tokens()?;
self.check_field_values()?;
self.populate_vault_ids(&deployment)?;
self.update_bindings(&deployment)?;
let deployment = self.get_current_deployment()?;
let deployment = self.prepare_calldata_generation(CalldataFunction::DepositAndAddOrder)?;

let mut calls = Vec::new();

Expand Down Expand Up @@ -344,10 +374,68 @@ impl DotrainOrderGui {
Ok(IOVaultIds(map))
}

#[wasm_bindgen(js_name = "hasAnyVaultId")]
pub fn has_any_vault_id(&self) -> Result<bool, GuiError> {
let map = self.get_vault_ids()?;
Ok(map.0.values().any(|ids| ids.iter().any(|id| id.is_some())))
}

#[wasm_bindgen(js_name = "updateScenarioBindings")]
pub fn update_scenario_bindings(&mut self) -> Result<(), GuiError> {
let deployment = self.get_current_deployment()?;
self.update_bindings(&deployment)?;
Ok(())
}

#[wasm_bindgen(js_name = "getDeploymentTransactionArgs")]
pub async fn get_deployment_transaction_args(
&mut self,
owner: String,
) -> Result<DeploymentTransactionArgs, GuiError> {
let deployment = self.prepare_calldata_generation(CalldataFunction::DepositAndAddOrder)?;

let mut approvals = Vec::new();
let approval_calldata = self.generate_approval_calldatas(owner).await?;
match approval_calldata {
ApprovalCalldataResult::Calldatas(calldatas) => {
let mut output_token_infos = HashMap::new();
for output in deployment.deployment.order.outputs.clone() {
if output.token.is_none() {
return Err(GuiError::SelectTokensNotSet);
}
let token = output.token.as_ref().unwrap();
let token_info = self.get_token_info(token.key.clone()).await?;
output_token_infos.insert(token.address.clone(), token_info);
}

for calldata in calldatas.iter() {
let token_info = output_token_infos
.get(&calldata.token)
.ok_or(GuiError::TokenNotFound(calldata.token.to_string()))?;
approvals.push(ExtendedApprovalCalldata {
token: calldata.token,
calldata: calldata.calldata.clone(),
symbol: token_info.symbol.clone(),
});
}
}
_ => {}
}

let deposit_and_add_order_calldata =
self.generate_deposit_and_add_order_calldatas().await?;

Ok(DeploymentTransactionArgs {
approvals,
deployment_calldata: deposit_and_add_order_calldata.0,
orderbook_address: deployment
.deployment
.order
.orderbook
.as_ref()
.ok_or(GuiError::OrderbookNotFound)?
.address,
chain_id: deployment.deployment.order.network.chain_id,
})
}
}
1 change: 1 addition & 0 deletions crates/js_api/src/subgraph/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ use wasm_bindgen::{JsError, JsValue};

pub mod add_order;
pub mod order;
pub mod remove_order;
pub mod transaction;
pub mod vault;

Expand Down
16 changes: 16 additions & 0 deletions crates/js_api/src/subgraph/remove_order.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
use cynic::Id;
use rain_orderbook_bindings::wasm_traits::prelude::*;
use rain_orderbook_subgraph_client::{OrderbookSubgraphClient, OrderbookSubgraphClientError};
use reqwest::Url;

/// Internal function to fetch Remove Orders for a given transaction
/// Returns an array of RemoveOrder structs
#[wasm_bindgen(js_name = "getTransactionRemoveOrders")]
pub async fn get_transaction_remove_orders(
url: &str,
tx_hash: &str,
) -> Result<JsValue, OrderbookSubgraphClientError> {
let client = OrderbookSubgraphClient::new(Url::parse(url)?);
let remove_orders = client.transaction_remove_orders(Id::new(tx_hash)).await?;
Ok(to_value(&remove_orders)?)
}
3 changes: 2 additions & 1 deletion crates/quote/src/cli/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,8 @@ mod tests {
}],
"meta": null,
"timestampAdded": "0",
"trades": []
"trades": [],
"removeEvents": []
}]
}
});
Expand Down
1 change: 1 addition & 0 deletions crates/quote/src/order_quotes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,7 @@ amount price: context<3 0>() context<4 0>();
meta: None,
timestamp_added: BigInt(0.to_string()),
trades: vec![],
remove_events: vec![],
};

let result = get_order_quotes(vec![order], None, local_evm.url(), None)
Expand Down
3 changes: 2 additions & 1 deletion crates/quote/src/quote.rs
Original file line number Diff line number Diff line change
Expand Up @@ -431,7 +431,8 @@ mod tests {
}],
"meta": null,
"timestampAdded": "0",
"trades": []
"trades": [],
"removeEvents": []
});
let retrun_sg_data = if batch {
json!({
Expand Down
21 changes: 21 additions & 0 deletions crates/subgraph/src/orderbook_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ use crate::types::order::{
OrdersListQuery,
};
use crate::types::order_trade::{OrderTradeDetailQuery, OrderTradesListQuery};
use crate::types::remove_order::{TransactionRemoveOrdersQuery, TransactionRemoveOrdersVariables};
use crate::types::transaction::TransactionDetailQuery;
use crate::types::vault::{VaultDetailQuery, VaultsListQuery};
use crate::vault_balance_changes_query::VaultBalanceChangesListPageQueryClient;
Expand Down Expand Up @@ -416,4 +417,24 @@ impl OrderbookSubgraphClient {

Ok(data.add_orders)
}

/// Fetch all remove orders for a given transaction
pub async fn transaction_remove_orders(
&self,
id: Id,
) -> Result<Vec<RemoveOrderWithOrder>, OrderbookSubgraphClientError> {
let data = self
.query::<TransactionRemoveOrdersQuery, TransactionRemoveOrdersVariables>(
TransactionRemoveOrdersVariables {
id: Bytes(id.inner().to_string()),
},
)
.await?;

if data.remove_orders.is_empty() {
return Err(OrderbookSubgraphClientError::Empty);
}

Ok(data.remove_orders)
}
}
1 change: 1 addition & 0 deletions crates/subgraph/src/performance/order_performance.rs
Original file line number Diff line number Diff line change
Expand Up @@ -824,6 +824,7 @@ mod test {
meta: None,
add_events: vec![],
trades: vec![],
remove_events: vec![],
}
}

Expand Down
16 changes: 16 additions & 0 deletions crates/subgraph/src/types/common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ pub struct Order {
pub meta: Option<RainMetaV1>,
pub add_events: Vec<AddOrder>,
pub trades: Vec<OrderStructPartialTrade>,
pub remove_events: Vec<RemoveOrder>,
}

#[derive(Debug, Serialize, Deserialize, Clone)]
Expand Down Expand Up @@ -381,6 +382,12 @@ pub struct Transaction {
pub struct AddOrder {
pub transaction: Transaction,
}
#[derive(cynic::QueryFragment, Debug, Serialize, Clone)]
#[cfg_attr(target_family = "wasm", derive(Tsify))]
#[typeshare]
pub struct RemoveOrder {
pub transaction: Transaction,
}

#[derive(cynic::QueryFragment, Debug, Serialize, Clone)]
#[cfg_attr(target_family = "wasm", derive(Tsify))]
Expand All @@ -391,6 +398,15 @@ pub struct AddOrderWithOrder {
pub order: Order,
}

#[derive(cynic::QueryFragment, Debug, Serialize, Clone)]
#[cfg_attr(target_family = "wasm", derive(Tsify))]
#[cynic(graphql_type = "RemoveOrder")]
pub struct RemoveOrderWithOrder {
pub transaction: Transaction,
#[cfg_attr(target_family = "wasm", tsify(type = "OrderSubgraph"))]
pub order: Order,
}

#[derive(cynic::Scalar, Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(target_family = "wasm", derive(Tsify), serde(rename = "SgBigInt"))]
#[typeshare]
Expand Down
1 change: 1 addition & 0 deletions crates/subgraph/src/types/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ mod impls;
pub mod order;
pub mod order_detail_traits;
pub mod order_trade;
pub mod remove_order;
pub mod transaction;
pub mod vault;

Expand Down
3 changes: 2 additions & 1 deletion crates/subgraph/src/types/order_detail_traits.rs
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,8 @@ mod tests {
},
// Only the order_bytes field is used for the conversion
order_bytes: Bytes("0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000006171c21b2e553c59a64d1337211b77c367cefe5d00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000379b966dc6b117dd47b5fc5308534256a4ab1bcc0000000000000000000000006e4b01603edbda617002a077420e98c86595748e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000950000000000000000000000000000000000000000000000000000000000000002ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000015020000000c020200020110000001100001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000050c5725949a6f0c72e6c4a641f24049a917db0cb000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001".into()),
trades: vec![]
trades: vec![],
remove_events: vec![],
};

let order_v3: OrderV3 = order_detail.try_into().unwrap();
Expand Down
Loading

0 comments on commit b1ae90e

Please sign in to comment.