Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/2025-02-18-get-transaction-args'…
Browse files Browse the repository at this point in the history
… into 02/19/25-Remove-null-gui-from-DeploymentSteps
  • Loading branch information
hardingjam committed Feb 19, 2025
2 parents 45b7608 + 36fb2bc commit 45119d2
Show file tree
Hide file tree
Showing 6 changed files with 184 additions and 217 deletions.
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
128 changes: 105 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 @@ -356,4 +386,56 @@ impl DotrainOrderGui {
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,
})
}
}
55 changes: 55 additions & 0 deletions packages/orderbook/test/js_api/gui.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
AllowancesResult,
DeploymentDetails,
DeploymentKeys,
DeploymentTransactionArgs,
DepositAndAddOrderCalldataResult,
Gui,
GuiDeployment,
Expand Down Expand Up @@ -1235,6 +1236,60 @@ ${dotrainWithoutVaultIds}`;
const calldatas = await gui.generateDepositCalldatas();
assert.equal(calldatas.Calldatas.length, 0);
});

it('should generate deployment transaction args', async () => {
await mockServer
.forPost('/rpc-url')
.thenSendJsonRpcResult(
'0x00000000000000000000000000000000000000000000003635C9ADC5DEA00000'
);
await mockServer
.forPost('/rpc-url')
.withBodyIncluding('0xf0cfdd37')
.thenSendJsonRpcResult(`0x${'0'.repeat(24) + '1'.repeat(40)}`);
await mockServer
.forPost('/rpc-url')
.withBodyIncluding('0xc19423bc')
.thenSendJsonRpcResult(`0x${'0'.repeat(24) + '2'.repeat(40)}`);
await mockServer
.forPost('/rpc-url')
.withBodyIncluding('0x24376855')
.thenSendJsonRpcResult(`0x${'0'.repeat(24) + '3'.repeat(40)}`);
await mockServer
.forPost('/rpc-url')
.withBodyIncluding('0xa3869e14')
.thenSendJsonRpcResult(
'0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000021234000000000000000000000000000000000000000000000000000000000000'
);

gui.saveDeposit('token2', '5000');
gui.saveFieldValue('test-binding', {
isPreset: false,
value: '10'
});

let result: DeploymentTransactionArgs = await gui.getDeploymentTransactionArgs(
'0x1234567890abcdef1234567890abcdef12345678'
);

assert.equal(result.approvals.length, 1);
assert.equal(
result.approvals[0].calldata,
'0x095ea7b3000000000000000000000000c95a5f8efe14d7a20bd2e5bafec4e71f8ce0b9a600000000000000000000000000000000000000000000010f0cf064dd59200000'
);
assert.equal(result.approvals[0].symbol, 'T2');
assert.equal(result.deploymentCalldata.length, 3146);
assert.equal(result.orderbookAddress, '0xc95a5f8efe14d7a20bd2e5bafec4e71f8ce0b9a6');
assert.equal(result.chainId, 123);

gui.removeDeposit('token2');
result = await gui.getDeploymentTransactionArgs('0x1234567890abcdef1234567890abcdef12345678');

assert.equal(result.approvals.length, 0);
assert.equal(result.deploymentCalldata.length, 2634);
assert.equal(result.orderbookAddress, '0xc95a5f8efe14d7a20bd2e5bafec4e71f8ce0b9a6');
assert.equal(result.chainId, 123);
});
});

describe('select tokens tests', async () => {
Expand Down
Loading

0 comments on commit 45119d2

Please sign in to comment.