From 9294d35bc1dc81f769468d16c4ac82bf4969d26c Mon Sep 17 00:00:00 2001 From: findolor Date: Wed, 22 Jan 2025 10:49:26 +0300 Subject: [PATCH 01/22] add function for vault deposit calldata --- crates/js_api/src/subgraph/mod.rs | 34 ++++++++++++++++++++++++ crates/js_api/src/subgraph/order.rs | 2 +- crates/js_api/src/subgraph/vault.rs | 40 ++++++++++++++++++++++++++++- 3 files changed, 74 insertions(+), 2 deletions(-) diff --git a/crates/js_api/src/subgraph/mod.rs b/crates/js_api/src/subgraph/mod.rs index 22d45e2da..7ba6cb6b0 100644 --- a/crates/js_api/src/subgraph/mod.rs +++ b/crates/js_api/src/subgraph/mod.rs @@ -1,2 +1,36 @@ +use alloy::{hex::FromHexError, primitives::ruint::ParseError}; +use rain_orderbook_common::{ + dotrain_order::calldata::DotrainOrderCalldataError, + transaction::WritableTransactionExecuteError, +}; +use rain_orderbook_subgraph_client::OrderbookSubgraphClientError; +use thiserror::Error; +use wasm_bindgen::{JsError, JsValue}; + pub mod order; pub mod vault; + +#[derive(Error, Debug)] +pub enum SubgraphError { + #[error("Invalid amount")] + InvalidAmount, + #[error("Invalid output index")] + InvalidOutputIndex, + #[error(transparent)] + OrderbookSubgraphClientError(#[from] OrderbookSubgraphClientError), + #[error(transparent)] + DotrainOrderCalldataError(#[from] DotrainOrderCalldataError), + #[error(transparent)] + WritableTransactionExecuteError(#[from] WritableTransactionExecuteError), + #[error(transparent)] + ParseError(#[from] ParseError), + #[error(transparent)] + FromHexError(#[from] FromHexError), + #[error(transparent)] + SerdeWasmBindgenError(#[from] serde_wasm_bindgen::Error), +} +impl From for JsValue { + fn from(value: SubgraphError) -> Self { + JsError::new(&value.to_string()).into() + } +} diff --git a/crates/js_api/src/subgraph/order.rs b/crates/js_api/src/subgraph/order.rs index 2c8b9b5e5..1c23ffffb 100644 --- a/crates/js_api/src/subgraph/order.rs +++ b/crates/js_api/src/subgraph/order.rs @@ -10,7 +10,7 @@ use reqwest::Url; /// Internal function to fetch a single order /// Returns the Order struct -async fn get_sg_order(url: &str, id: &str) -> Result { +pub async fn get_sg_order(url: &str, id: &str) -> Result { let client = OrderbookSubgraphClient::new(Url::parse(url)?); let order = client.order_detail(Id::new(id)).await?; Ok(order) diff --git a/crates/js_api/src/subgraph/vault.rs b/crates/js_api/src/subgraph/vault.rs index c4fbd66af..1dc140189 100644 --- a/crates/js_api/src/subgraph/vault.rs +++ b/crates/js_api/src/subgraph/vault.rs @@ -1,11 +1,17 @@ +use super::order::get_sg_order; +use super::SubgraphError; +use alloy::primitives::{Address, Bytes, U256}; use cynic::Id; -use rain_orderbook_bindings::wasm_traits::prelude::*; +use rain_orderbook_bindings::{impl_all_wasm_traits, wasm_traits::prelude::*}; +use rain_orderbook_common::deposit::DepositArgs; use rain_orderbook_subgraph_client::types::common::VaultsListFilterArgs; use rain_orderbook_subgraph_client::{ MultiOrderbookSubgraphClient, MultiSubgraphArgs, OrderbookSubgraphClient, OrderbookSubgraphClientError, PaginationArgs, }; use reqwest::Url; +use serde::{Deserialize, Serialize}; +use std::str::FromStr; /// Fetch all vaults from multiple subgraphs /// Returns a list of VaultWithSubgraphName structs @@ -43,3 +49,35 @@ pub async fn get_vault_balance_changes( .await?; Ok(to_value(&changes)?) } + +/// Get deposit calldata for a vault +/// Returns a string of the calldata +#[wasm_bindgen(js_name = "getVaultDepositCalldata")] +pub async fn get_vault_deposit_calldata( + url: &str, + order_id: &str, + output_index: u8, + amount: &str, +) -> Result { + let amount = U256::from_str(&amount)?; + if amount == U256::ZERO { + return Err(SubgraphError::InvalidAmount); + } + + let order = get_sg_order(url, order_id).await?; + + let index = output_index as usize; + if order.outputs.len() <= index { + return Err(SubgraphError::InvalidOutputIndex); + } + + let calldata = DepositArgs { + token: Address::from_str(&order.outputs[index].token.address.0)?, + vault_id: U256::from_str(&order.outputs[index].vault_id.0)?, + amount, + } + .get_deposit_calldata() + .await?; + + Ok(to_value(&Bytes::copy_from_slice(&calldata))?) +} From 1e794ca182808d23b114dd1321fc06bcce46c60a Mon Sep 17 00:00:00 2001 From: findolor Date: Wed, 22 Jan 2025 10:49:33 +0300 Subject: [PATCH 02/22] update tests --- packages/orderbook/test/js_api/order.test.ts | 2 +- packages/orderbook/test/js_api/vault.test.ts | 101 ++++++++++++++++++- 2 files changed, 100 insertions(+), 3 deletions(-) diff --git a/packages/orderbook/test/js_api/order.test.ts b/packages/orderbook/test/js_api/order.test.ts index b50ff9847..dae12b853 100644 --- a/packages/orderbook/test/js_api/order.test.ts +++ b/packages/orderbook/test/js_api/order.test.ts @@ -144,7 +144,7 @@ const order2: Order = { trades: [] } as unknown as Order; -const order3 = { +export const order3 = { id: 'order1', orderBytes: '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', diff --git a/packages/orderbook/test/js_api/vault.test.ts b/packages/orderbook/test/js_api/vault.test.ts index e057e7d83..ae2fb89b2 100644 --- a/packages/orderbook/test/js_api/vault.test.ts +++ b/packages/orderbook/test/js_api/vault.test.ts @@ -2,8 +2,12 @@ import assert from 'assert'; import { getLocal } from 'mockttp'; import { describe, it, beforeEach, afterEach } from 'vitest'; import { Vault, VaultWithSubgraphName, Deposit } from '../../dist/types/js_api.js'; -import { getVaults, getVault, getVaultBalanceChanges } from '../../dist/cjs/js_api.js'; -import { VaultBalanceChange } from '../../dist/types/quote.js'; +import { + getVaults, + getVault, + getVaultBalanceChanges, + getVaultDepositCalldata +} from '../../dist/cjs/js_api.js'; const vault1: Vault = { id: 'vault1', @@ -152,4 +156,97 @@ describe('Rain Orderbook JS API Package Bindgen Vault Tests', async function () assert.ok(e); } }); + + const order = { + id: 'order', + orderBytes: + '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + orderHash: '0x1', + owner: '0x0000000000000000000000000000000000000000', + outputs: [ + { + id: '0x0000000000000000000000000000000000000000', + token: { + id: '0x0000000000000000000000000000000000000000', + address: '0x1234567890123456789012345678901234567890', + name: 'T1', + symbol: 'T1', + decimals: '0' + }, + balance: '0', + vaultId: '0x2523', + owner: '0x0000000000000000000000000000000000000000', + ordersAsOutput: [], + ordersAsInput: [], + balanceChanges: [], + orderbook: { + id: '0x0000000000000000000000000000000000000000' + } + } + ], + inputs: [ + { + id: '0x0000000000000000000000000000000000000000', + token: { + id: '0x0000000000000000000000000000000000000000', + address: '0x0000000000000000000000000000000000000000', + name: 'T2', + symbol: 'T2', + decimals: '0' + }, + balance: '0', + vaultId: '0', + owner: '0x0000000000000000000000000000000000000000', + ordersAsOutput: [], + ordersAsInput: [], + balanceChanges: [], + orderbook: { + id: '0x0000000000000000000000000000000000000000' + } + } + ], + active: true, + addEvents: [ + { + transaction: { + blockNumber: '0', + timestamp: '0', + id: '0x0000000000000000000000000000000000000000', + from: '0x0000000000000000000000000000000000000000' + } + } + ], + meta: null, + timestampAdded: '0', + orderbook: { + id: '0x0000000000000000000000000000000000000000' + }, + trades: [] + }; + + it('should get deposit calldata for a vault', async () => { + await mockServer.forPost('/sg4').thenReply(200, JSON.stringify({ data: { order } })); + + let calldata: string = await getVaultDepositCalldata( + mockServer.url + '/sg4', + 'order1', + 0, + '500' + ); + assert.equal(calldata.length, 330); + + try { + await getVaultDepositCalldata(mockServer.url + '/sg4', 'order1', 99, '500'); + assert.fail('expected to reject, but resolved'); + } catch (e) { + assert.equal((e as Error).message, 'Invalid output index'); + } + + try { + await getVaultDepositCalldata(mockServer.url + '/sg4', 'order1', 0, '0'); + assert.fail('expected to reject, but resolved'); + } catch (error) { + assert.equal((error as Error).message, 'Invalid amount'); + } + }); }); From 1de25ce416b655466d4e7840ff3adea4fa7191bc Mon Sep 17 00:00:00 2001 From: findolor Date: Wed, 22 Jan 2025 10:57:14 +0300 Subject: [PATCH 03/22] add function for withdraw calldata --- crates/js_api/src/subgraph/mod.rs | 2 ++ crates/js_api/src/subgraph/vault.rs | 33 +++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/crates/js_api/src/subgraph/mod.rs b/crates/js_api/src/subgraph/mod.rs index 7ba6cb6b0..8d4bb4596 100644 --- a/crates/js_api/src/subgraph/mod.rs +++ b/crates/js_api/src/subgraph/mod.rs @@ -16,6 +16,8 @@ pub enum SubgraphError { InvalidAmount, #[error("Invalid output index")] InvalidOutputIndex, + #[error("Invalid input index")] + InvalidInputIndex, #[error(transparent)] OrderbookSubgraphClientError(#[from] OrderbookSubgraphClientError), #[error(transparent)] diff --git a/crates/js_api/src/subgraph/vault.rs b/crates/js_api/src/subgraph/vault.rs index 1dc140189..f7fbf15bc 100644 --- a/crates/js_api/src/subgraph/vault.rs +++ b/crates/js_api/src/subgraph/vault.rs @@ -4,6 +4,7 @@ use alloy::primitives::{Address, Bytes, U256}; use cynic::Id; use rain_orderbook_bindings::{impl_all_wasm_traits, wasm_traits::prelude::*}; use rain_orderbook_common::deposit::DepositArgs; +use rain_orderbook_common::withdraw::WithdrawArgs; use rain_orderbook_subgraph_client::types::common::VaultsListFilterArgs; use rain_orderbook_subgraph_client::{ MultiOrderbookSubgraphClient, MultiSubgraphArgs, OrderbookSubgraphClient, @@ -81,3 +82,35 @@ pub async fn get_vault_deposit_calldata( Ok(to_value(&Bytes::copy_from_slice(&calldata))?) } + +/// Get withdraw calldata for a vault +/// Returns a string of the calldata +#[wasm_bindgen(js_name = "getVaultWithdrawCalldata")] +pub async fn get_vault_withdraw_calldata( + url: &str, + order_id: &str, + input_index: u8, + amount: &str, +) -> Result { + let amount = U256::from_str(&amount)?; + if amount == U256::ZERO { + return Err(SubgraphError::InvalidAmount); + } + + let order = get_sg_order(url, order_id).await?; + + let index = input_index as usize; + if order.inputs.len() <= index { + return Err(SubgraphError::InvalidInputIndex); + } + + let calldata = WithdrawArgs { + token: Address::from_str(&order.inputs[index].token.address.0)?, + vault_id: U256::from_str(&order.inputs[index].vault_id.0)?, + target_amount: amount, + } + .get_withdraw_calldata() + .await?; + + Ok(to_value(&Bytes::copy_from_slice(&calldata))?) +} From 23d54442fb6934602627d93180db96f4a993888e Mon Sep 17 00:00:00 2001 From: findolor Date: Wed, 22 Jan 2025 10:57:28 +0300 Subject: [PATCH 04/22] update tests --- packages/orderbook/test/js_api/vault.test.ts | 48 +++++++++++++++++--- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/packages/orderbook/test/js_api/vault.test.ts b/packages/orderbook/test/js_api/vault.test.ts index ae2fb89b2..5da748230 100644 --- a/packages/orderbook/test/js_api/vault.test.ts +++ b/packages/orderbook/test/js_api/vault.test.ts @@ -1,12 +1,13 @@ import assert from 'assert'; import { getLocal } from 'mockttp'; -import { describe, it, beforeEach, afterEach } from 'vitest'; +import { describe, it, beforeEach, beforeAll, afterAll } from 'vitest'; import { Vault, VaultWithSubgraphName, Deposit } from '../../dist/types/js_api.js'; import { getVaults, getVault, getVaultBalanceChanges, - getVaultDepositCalldata + getVaultDepositCalldata, + getVaultWithdrawCalldata } from '../../dist/cjs/js_api.js'; const vault1: Vault = { @@ -50,8 +51,15 @@ const vault2: Vault = { describe('Rain Orderbook JS API Package Bindgen Vault Tests', async function () { const mockServer = getLocal(); - beforeEach(() => mockServer.start(8083)); - afterEach(() => mockServer.stop()); + beforeAll(async () => { + await mockServer.start(8083); + }); + afterAll(async () => { + await mockServer.stop(); + }); + beforeEach(() => { + mockServer.reset(); + }); it('should fetch a single vault', async () => { await mockServer.forPost('/sg1').thenReply(200, JSON.stringify({ data: { vault: vault1 } })); @@ -189,13 +197,13 @@ describe('Rain Orderbook JS API Package Bindgen Vault Tests', async function () id: '0x0000000000000000000000000000000000000000', token: { id: '0x0000000000000000000000000000000000000000', - address: '0x0000000000000000000000000000000000000000', + address: '0x9876543210987654321098765432109876543210', name: 'T2', symbol: 'T2', decimals: '0' }, - balance: '0', - vaultId: '0', + balance: '999999999999999', + vaultId: '0x100', owner: '0x0000000000000000000000000000000000000000', ordersAsOutput: [], ordersAsInput: [], @@ -249,4 +257,30 @@ describe('Rain Orderbook JS API Package Bindgen Vault Tests', async function () assert.equal((error as Error).message, 'Invalid amount'); } }); + + it('should get withdraw calldata for a vault', async () => { + await mockServer.forPost('/sg4').thenReply(200, JSON.stringify({ data: { order } })); + + let calldata: string = await getVaultWithdrawCalldata( + mockServer.url + '/sg4', + 'order1', + 0, + '500' + ); + assert.equal(calldata.length, 330); + + try { + await getVaultWithdrawCalldata(mockServer.url + '/sg4', 'order1', 99, '500'); + assert.fail('expected to reject, but resolved'); + } catch (e) { + assert.equal((e as Error).message, 'Invalid input index'); + } + + try { + await getVaultWithdrawCalldata(mockServer.url + '/sg4', 'order1', 0, '0'); + assert.fail('expected to reject, but resolved'); + } catch (error) { + assert.equal((error as Error).message, 'Invalid amount'); + } + }); }); From 078fab5e0256a4c3f4279f98754323b95fd678ee Mon Sep 17 00:00:00 2001 From: findolor Date: Wed, 22 Jan 2025 10:59:36 +0300 Subject: [PATCH 05/22] remove unused imports --- crates/js_api/src/subgraph/vault.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/js_api/src/subgraph/vault.rs b/crates/js_api/src/subgraph/vault.rs index f7fbf15bc..6180c77c5 100644 --- a/crates/js_api/src/subgraph/vault.rs +++ b/crates/js_api/src/subgraph/vault.rs @@ -2,7 +2,7 @@ use super::order::get_sg_order; use super::SubgraphError; use alloy::primitives::{Address, Bytes, U256}; use cynic::Id; -use rain_orderbook_bindings::{impl_all_wasm_traits, wasm_traits::prelude::*}; +use rain_orderbook_bindings::wasm_traits::prelude::*; use rain_orderbook_common::deposit::DepositArgs; use rain_orderbook_common::withdraw::WithdrawArgs; use rain_orderbook_subgraph_client::types::common::VaultsListFilterArgs; @@ -11,7 +11,6 @@ use rain_orderbook_subgraph_client::{ OrderbookSubgraphClientError, PaginationArgs, }; use reqwest::Url; -use serde::{Deserialize, Serialize}; use std::str::FromStr; /// Fetch all vaults from multiple subgraphs From f18ed1f80ec42cca37da554ce681e3f9d61bc720 Mon Sep 17 00:00:00 2001 From: findolor Date: Fri, 24 Jan 2025 11:26:19 +0300 Subject: [PATCH 06/22] add approval related function for vault --- crates/js_api/src/subgraph/mod.rs | 4 +- crates/js_api/src/subgraph/vault.rs | 144 +++++++++++++++++++++------- 2 files changed, 110 insertions(+), 38 deletions(-) diff --git a/crates/js_api/src/subgraph/mod.rs b/crates/js_api/src/subgraph/mod.rs index 8d4bb4596..3241b9c16 100644 --- a/crates/js_api/src/subgraph/mod.rs +++ b/crates/js_api/src/subgraph/mod.rs @@ -1,6 +1,6 @@ use alloy::{hex::FromHexError, primitives::ruint::ParseError}; use rain_orderbook_common::{ - dotrain_order::calldata::DotrainOrderCalldataError, + deposit::DepositError, dotrain_order::calldata::DotrainOrderCalldataError, transaction::WritableTransactionExecuteError, }; use rain_orderbook_subgraph_client::OrderbookSubgraphClientError; @@ -30,6 +30,8 @@ pub enum SubgraphError { FromHexError(#[from] FromHexError), #[error(transparent)] SerdeWasmBindgenError(#[from] serde_wasm_bindgen::Error), + #[error(transparent)] + DepositError(#[from] DepositError), } impl From for JsValue { fn from(value: SubgraphError) -> Self { diff --git a/crates/js_api/src/subgraph/vault.rs b/crates/js_api/src/subgraph/vault.rs index 6180c77c5..545a2f47c 100644 --- a/crates/js_api/src/subgraph/vault.rs +++ b/crates/js_api/src/subgraph/vault.rs @@ -4,8 +4,9 @@ use alloy::primitives::{Address, Bytes, U256}; use cynic::Id; use rain_orderbook_bindings::wasm_traits::prelude::*; use rain_orderbook_common::deposit::DepositArgs; +use rain_orderbook_common::transaction::TransactionArgs; use rain_orderbook_common::withdraw::WithdrawArgs; -use rain_orderbook_subgraph_client::types::common::VaultsListFilterArgs; +use rain_orderbook_subgraph_client::types::common::{Order, VaultsListFilterArgs}; use rain_orderbook_subgraph_client::{ MultiOrderbookSubgraphClient, MultiSubgraphArgs, OrderbookSubgraphClient, OrderbookSubgraphClientError, PaginationArgs, @@ -54,62 +55,131 @@ pub async fn get_vault_balance_changes( /// Returns a string of the calldata #[wasm_bindgen(js_name = "getVaultDepositCalldata")] pub async fn get_vault_deposit_calldata( - url: &str, + rpc_url: &str, order_id: &str, output_index: u8, - amount: &str, + deposit_amount: &str, ) -> Result { - let amount = U256::from_str(&amount)?; - if amount == U256::ZERO { - return Err(SubgraphError::InvalidAmount); - } + let deposit_amount = validate_amount(deposit_amount)?; + let order = get_sg_order(rpc_url, order_id).await?; + let index = validate_io_index(&order, false, output_index)?; - let order = get_sg_order(url, order_id).await?; - - let index = output_index as usize; - if order.outputs.len() <= index { - return Err(SubgraphError::InvalidOutputIndex); - } - - let calldata = DepositArgs { - token: Address::from_str(&order.outputs[index].token.address.0)?, - vault_id: U256::from_str(&order.outputs[index].vault_id.0)?, - amount, - } - .get_deposit_calldata() - .await?; + let (deposit_args, _) = + get_deposit_and_transaction_args(rpc_url, &order, index, deposit_amount)?; - Ok(to_value(&Bytes::copy_from_slice(&calldata))?) + Ok(to_value(&Bytes::copy_from_slice( + &deposit_args.get_deposit_calldata().await?, + ))?) } /// Get withdraw calldata for a vault /// Returns a string of the calldata #[wasm_bindgen(js_name = "getVaultWithdrawCalldata")] pub async fn get_vault_withdraw_calldata( - url: &str, + rpc_url: &str, order_id: &str, input_index: u8, - amount: &str, + withdraw_amount: &str, ) -> Result { - let amount = U256::from_str(&amount)?; - if amount == U256::ZERO { + let withdraw_amount = validate_amount(withdraw_amount)?; + let order = get_sg_order(rpc_url, order_id).await?; + let index = validate_io_index(&order, true, input_index)?; + + Ok(to_value(&Bytes::copy_from_slice( + &WithdrawArgs { + token: Address::from_str(&order.inputs[index].token.address.0)?, + vault_id: U256::from_str(&order.inputs[index].vault_id.0)?, + target_amount: withdraw_amount, + } + .get_withdraw_calldata() + .await?, + ))?) +} + +#[wasm_bindgen(js_name = "getVaultApprovalCalldata")] +pub async fn get_vault_approval_calldata( + rpc_url: &str, + order_id: &str, + input_index: u8, + deposit_amount: &str, +) -> Result { + let deposit_amount = validate_amount(deposit_amount)?; + let order = get_sg_order(rpc_url, order_id).await?; + let index = validate_io_index(&order, true, input_index)?; + + let (deposit_args, transaction_args) = + get_deposit_and_transaction_args(rpc_url, &order, index, deposit_amount)?; + + let allowance = deposit_args + .read_allowance(Address::from_str(&order.owner.0)?, transaction_args.clone()) + .await?; + if allowance > deposit_amount { return Err(SubgraphError::InvalidAmount); } - let order = get_sg_order(url, order_id).await?; + Ok(to_value(&Bytes::copy_from_slice( + &deposit_args + .get_approve_calldata(transaction_args, allowance) + .await?, + ))?) +} + +#[wasm_bindgen(js_name = "checkVaultAllowance")] +pub async fn check_vault_allowance( + rpc_url: &str, + order_id: &str, + input_index: u8, +) -> Result { + let order = get_sg_order(rpc_url, order_id).await?; + let index = validate_io_index(&order, true, input_index)?; + + let (deposit_args, transaction_args) = + get_deposit_and_transaction_args(rpc_url, &order, index, U256::ZERO)?; - let index = input_index as usize; - if order.inputs.len() <= index { - return Err(SubgraphError::InvalidInputIndex); + Ok(to_value( + &deposit_args + .read_allowance(Address::from_str(&order.owner.0)?, transaction_args.clone()) + .await?, + )?) +} + +pub fn validate_amount(amount: &str) -> Result { + let amount = U256::from_str(&amount)?; + if amount == U256::ZERO { + return Err(SubgraphError::InvalidAmount); } + Ok(amount) +} - let calldata = WithdrawArgs { - token: Address::from_str(&order.inputs[index].token.address.0)?, - vault_id: U256::from_str(&order.inputs[index].vault_id.0)?, - target_amount: amount, +pub fn validate_io_index(order: &Order, is_input: bool, index: u8) -> Result { + let index = index as usize; + if is_input { + if order.inputs.len() <= index { + return Err(SubgraphError::InvalidInputIndex); + } + } else { + if order.outputs.len() <= index { + return Err(SubgraphError::InvalidOutputIndex); + } } - .get_withdraw_calldata() - .await?; + Ok(index) +} - Ok(to_value(&Bytes::copy_from_slice(&calldata))?) +pub fn get_deposit_and_transaction_args( + rpc_url: &str, + order: &Order, + index: usize, + amount: U256, +) -> Result<(DepositArgs, TransactionArgs), SubgraphError> { + let deposit_args = DepositArgs { + token: Address::from_str(&order.outputs[index].token.address.0)?, + vault_id: U256::from_str(&order.outputs[index].vault_id.0)?, + amount, + }; + let transaction_args = TransactionArgs { + orderbook_address: Address::from_str(&order.orderbook.id.0)?, + rpc_url: rpc_url.to_string(), + ..Default::default() + }; + Ok((deposit_args, transaction_args)) } From ef8e8338ec458bb3f352fd6daed1914448401fb3 Mon Sep 17 00:00:00 2001 From: findolor Date: Fri, 24 Jan 2025 11:26:24 +0300 Subject: [PATCH 07/22] update tests --- packages/orderbook/test/js_api/vault.test.ts | 87 +++++++++++++++++++- 1 file changed, 85 insertions(+), 2 deletions(-) diff --git a/packages/orderbook/test/js_api/vault.test.ts b/packages/orderbook/test/js_api/vault.test.ts index 5da748230..d45e448aa 100644 --- a/packages/orderbook/test/js_api/vault.test.ts +++ b/packages/orderbook/test/js_api/vault.test.ts @@ -7,7 +7,9 @@ import { getVault, getVaultBalanceChanges, getVaultDepositCalldata, - getVaultWithdrawCalldata + getVaultWithdrawCalldata, + checkVaultAllowance, + getVaultApprovalCalldata } from '../../dist/cjs/js_api.js'; const vault1: Vault = { @@ -181,7 +183,7 @@ describe('Rain Orderbook JS API Package Bindgen Vault Tests', async function () symbol: 'T1', decimals: '0' }, - balance: '0', + balance: '88888888888', vaultId: '0x2523', owner: '0x0000000000000000000000000000000000000000', ordersAsOutput: [], @@ -283,4 +285,85 @@ describe('Rain Orderbook JS API Package Bindgen Vault Tests', async function () assert.equal((error as Error).message, 'Invalid amount'); } }); + + it('should read allowance for a vault', async () => { + await mockServer.forPost('/sg4').thenReply(200, JSON.stringify({ data: { order } })); + await mockServer + .forPost('/sg4') + .once() + .thenSendJsonRpcResult('0x0000000000000000000000000000000000000000000000000000000000000001'); + + let allowance: string = await checkVaultAllowance(mockServer.url + '/sg4', 'order1', 0); + assert.equal(allowance, '0x1'); + + try { + await checkVaultAllowance(mockServer.url + '/sg4', 'order1', 99); + assert.fail('expected to reject, but resolved'); + } catch (e) { + assert.equal((e as Error).message, 'Invalid input index'); + } + }); + + it('should get approval calldata for a vault', async () => { + await mockServer + .forPost('/sg4') + .once() + .thenReply(200, JSON.stringify({ data: { order } })); + await mockServer + .forPost('/sg4') + .once() + .thenSendJsonRpcResult('0x00000000000000000000000000000000000000000000000000000000000001f4'); + + let calldata: string = await getVaultApprovalCalldata( + mockServer.url + '/sg4', + 'order1', + 0, + '600' + ); + assert.equal(calldata.length, 138); + + await mockServer + .forPost('/sg4') + .once() + .thenReply(200, JSON.stringify({ data: { order } })); + await mockServer + .forPost('/sg4') + .once() + .thenSendJsonRpcResult('0x00000000000000000000000000000000000000000000000000000000000001f4'); + + calldata = await getVaultApprovalCalldata(mockServer.url + '/sg4', 'order1', 0, '500'); + assert.equal(calldata.length, 138); + + await mockServer.forPost('/sg4').thenReply(200, JSON.stringify({ data: { order } })); + + try { + await getVaultApprovalCalldata(mockServer.url + '/sg4', 'order1', 0, '0'); + assert.fail('expected to reject, but resolved'); + } catch (e) { + assert.equal((e as Error).message, 'Invalid amount'); + } + + try { + await getVaultApprovalCalldata(mockServer.url + '/sg4', 'order1', 99, '500'); + assert.fail('expected to reject, but resolved'); + } catch (e) { + assert.equal((e as Error).message, 'Invalid input index'); + } + + await mockServer + .forPost('/sg4') + .once() + .thenReply(200, JSON.stringify({ data: { order } })); + await mockServer + .forPost('/sg4') + .once() + .thenSendJsonRpcResult('0x00000000000000000000000000000000000000000000000000000000000001f4'); + + try { + await getVaultApprovalCalldata(mockServer.url + '/sg4', 'order1', 0, '200'); + assert.fail('expected to reject, but resolved'); + } catch (e) { + assert.equal((e as Error).message, 'Invalid amount'); + } + }); }); From 9af1ed8987ccfe5eb838b4c76d00bfedfcd4b830 Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Thu, 30 Jan 2025 12:57:56 +0100 Subject: [PATCH 08/22] add vault and tests --- crates/js_api/src/subgraph/vault.rs | 16 +++++++++------- packages/orderbook/test/js_api/vault.test.ts | 19 ++----------------- 2 files changed, 11 insertions(+), 24 deletions(-) diff --git a/crates/js_api/src/subgraph/vault.rs b/crates/js_api/src/subgraph/vault.rs index 545a2f47c..ed951c102 100644 --- a/crates/js_api/src/subgraph/vault.rs +++ b/crates/js_api/src/subgraph/vault.rs @@ -55,17 +55,19 @@ pub async fn get_vault_balance_changes( /// Returns a string of the calldata #[wasm_bindgen(js_name = "getVaultDepositCalldata")] pub async fn get_vault_deposit_calldata( - rpc_url: &str, - order_id: &str, - output_index: u8, + token_address: &str, + vault_id: &str, deposit_amount: &str, ) -> Result { let deposit_amount = validate_amount(deposit_amount)?; - let order = get_sg_order(rpc_url, order_id).await?; - let index = validate_io_index(&order, false, output_index)?; + let token = Address::from_str(token_address)?; + let vault_id = U256::from_str(vault_id)?; - let (deposit_args, _) = - get_deposit_and_transaction_args(rpc_url, &order, index, deposit_amount)?; + let deposit_args = DepositArgs { + token, + amount: deposit_amount, + vault_id, + }; Ok(to_value(&Bytes::copy_from_slice( &deposit_args.get_deposit_calldata().await?, diff --git a/packages/orderbook/test/js_api/vault.test.ts b/packages/orderbook/test/js_api/vault.test.ts index d45e448aa..f11169b15 100644 --- a/packages/orderbook/test/js_api/vault.test.ts +++ b/packages/orderbook/test/js_api/vault.test.ts @@ -238,26 +238,11 @@ describe('Rain Orderbook JS API Package Bindgen Vault Tests', async function () await mockServer.forPost('/sg4').thenReply(200, JSON.stringify({ data: { order } })); let calldata: string = await getVaultDepositCalldata( - mockServer.url + '/sg4', - 'order1', - 0, + vault1.token.address, + vault1.vaultId, '500' ); assert.equal(calldata.length, 330); - - try { - await getVaultDepositCalldata(mockServer.url + '/sg4', 'order1', 99, '500'); - assert.fail('expected to reject, but resolved'); - } catch (e) { - assert.equal((e as Error).message, 'Invalid output index'); - } - - try { - await getVaultDepositCalldata(mockServer.url + '/sg4', 'order1', 0, '0'); - assert.fail('expected to reject, but resolved'); - } catch (error) { - assert.equal((error as Error).message, 'Invalid amount'); - } }); it('should get withdraw calldata for a vault', async () => { From 05dcc893d850c0a66afccab15c90a25e035874a4 Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Thu, 30 Jan 2025 13:53:56 +0100 Subject: [PATCH 09/22] add --- crates/js_api/src/subgraph/vault.rs | 19 +++-- packages/orderbook/test/js_api/vault.test.ts | 82 +++++++------------- 2 files changed, 38 insertions(+), 63 deletions(-) diff --git a/crates/js_api/src/subgraph/vault.rs b/crates/js_api/src/subgraph/vault.rs index ed951c102..352eb166d 100644 --- a/crates/js_api/src/subgraph/vault.rs +++ b/crates/js_api/src/subgraph/vault.rs @@ -100,20 +100,23 @@ pub async fn get_vault_withdraw_calldata( #[wasm_bindgen(js_name = "getVaultApprovalCalldata")] pub async fn get_vault_approval_calldata( - rpc_url: &str, - order_id: &str, - input_index: u8, + token_address: &str, + vault_id: &str, deposit_amount: &str, ) -> Result { let deposit_amount = validate_amount(deposit_amount)?; - let order = get_sg_order(rpc_url, order_id).await?; - let index = validate_io_index(&order, true, input_index)?; + let token = Address::from_str(token_address)?; + let vault_id = U256::from_str(vault_id)?; - let (deposit_args, transaction_args) = - get_deposit_and_transaction_args(rpc_url, &order, index, deposit_amount)?; + let deposit_args = DepositArgs { + token, + amount: deposit_amount, + vault_id, + }; + let transaction_args = TransactionArgs::default(); let allowance = deposit_args - .read_allowance(Address::from_str(&order.owner.0)?, transaction_args.clone()) + .read_allowance(token, transaction_args.clone()) .await?; if allowance > deposit_amount { return Err(SubgraphError::InvalidAmount); diff --git a/packages/orderbook/test/js_api/vault.test.ts b/packages/orderbook/test/js_api/vault.test.ts index f11169b15..5b3623f91 100644 --- a/packages/orderbook/test/js_api/vault.test.ts +++ b/packages/orderbook/test/js_api/vault.test.ts @@ -170,7 +170,7 @@ describe('Rain Orderbook JS API Package Bindgen Vault Tests', async function () const order = { id: 'order', orderBytes: - '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', orderHash: '0x1', owner: '0x0000000000000000000000000000000000000000', outputs: [ @@ -245,6 +245,26 @@ describe('Rain Orderbook JS API Package Bindgen Vault Tests', async function () assert.equal(calldata.length, 330); }); + it('should handle zero deposit amount', async () => { + await mockServer.forPost('/sg4').thenReply(200, JSON.stringify({ data: { order } })); + + await assert.rejects( + async () => { + await getVaultDepositCalldata(vault1.token.address, vault1.vaultId, '0'); + }, + { message: 'Invalid amount' } + ); + }); + + it('should throw error for invalid deposit amount', async () => { + await assert.rejects( + async () => { + await getVaultDepositCalldata(vault1.token.address, vault1.vaultId, '-100'); + }, + { message: 'invalid digit: -' } + ); + }); + it('should get withdraw calldata for a vault', async () => { await mockServer.forPost('/sg4').thenReply(200, JSON.stringify({ data: { order } })); @@ -289,66 +309,18 @@ describe('Rain Orderbook JS API Package Bindgen Vault Tests', async function () } }); - it('should get approval calldata for a vault', async () => { - await mockServer - .forPost('/sg4') - .once() - .thenReply(200, JSON.stringify({ data: { order } })); + it('should generate valid approval calldata with correct length', async () => { + await mockServer.forPost('/sg4').thenReply(200, JSON.stringify({ data: { order } })); await mockServer .forPost('/sg4') .once() - .thenSendJsonRpcResult('0x00000000000000000000000000000000000000000000000000000000000001f4'); + .thenSendJsonRpcResult('0x0000000000000000000000000000000000000000000000000000000000000001'); - let calldata: string = await getVaultApprovalCalldata( - mockServer.url + '/sg4', - 'order1', - 0, + const calldata: string = await getVaultApprovalCalldata( + vault1.token.address, + vault1.vaultId, '600' ); assert.equal(calldata.length, 138); - - await mockServer - .forPost('/sg4') - .once() - .thenReply(200, JSON.stringify({ data: { order } })); - await mockServer - .forPost('/sg4') - .once() - .thenSendJsonRpcResult('0x00000000000000000000000000000000000000000000000000000000000001f4'); - - calldata = await getVaultApprovalCalldata(mockServer.url + '/sg4', 'order1', 0, '500'); - assert.equal(calldata.length, 138); - - await mockServer.forPost('/sg4').thenReply(200, JSON.stringify({ data: { order } })); - - try { - await getVaultApprovalCalldata(mockServer.url + '/sg4', 'order1', 0, '0'); - assert.fail('expected to reject, but resolved'); - } catch (e) { - assert.equal((e as Error).message, 'Invalid amount'); - } - - try { - await getVaultApprovalCalldata(mockServer.url + '/sg4', 'order1', 99, '500'); - assert.fail('expected to reject, but resolved'); - } catch (e) { - assert.equal((e as Error).message, 'Invalid input index'); - } - - await mockServer - .forPost('/sg4') - .once() - .thenReply(200, JSON.stringify({ data: { order } })); - await mockServer - .forPost('/sg4') - .once() - .thenSendJsonRpcResult('0x00000000000000000000000000000000000000000000000000000000000001f4'); - - try { - await getVaultApprovalCalldata(mockServer.url + '/sg4', 'order1', 0, '200'); - assert.fail('expected to reject, but resolved'); - } catch (e) { - assert.equal((e as Error).message, 'Invalid amount'); - } }); }); From f40fd2972d7a9715caa07d08ed1150307cde67f5 Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Thu, 30 Jan 2025 14:08:35 +0100 Subject: [PATCH 10/22] add vault owner --- crates/js_api/src/subgraph/vault.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/js_api/src/subgraph/vault.rs b/crates/js_api/src/subgraph/vault.rs index 352eb166d..a06f475f3 100644 --- a/crates/js_api/src/subgraph/vault.rs +++ b/crates/js_api/src/subgraph/vault.rs @@ -103,10 +103,12 @@ pub async fn get_vault_approval_calldata( token_address: &str, vault_id: &str, deposit_amount: &str, + vault_owner: &str, ) -> Result { let deposit_amount = validate_amount(deposit_amount)?; let token = Address::from_str(token_address)?; let vault_id = U256::from_str(vault_id)?; + let owner = Address::from_str(vault_owner)?; let deposit_args = DepositArgs { token, @@ -116,7 +118,7 @@ pub async fn get_vault_approval_calldata( let transaction_args = TransactionArgs::default(); let allowance = deposit_args - .read_allowance(token, transaction_args.clone()) + .read_allowance(owner, transaction_args.clone()) .await?; if allowance > deposit_amount { return Err(SubgraphError::InvalidAmount); From 60f71d76b86521f516cb6ab9a9b6209c7715f694 Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Thu, 30 Jan 2025 15:22:47 +0100 Subject: [PATCH 11/22] change prop to vault --- crates/js_api/src/subgraph/vault.rs | 52 +++++++++-------------------- 1 file changed, 16 insertions(+), 36 deletions(-) diff --git a/crates/js_api/src/subgraph/vault.rs b/crates/js_api/src/subgraph/vault.rs index a06f475f3..b7b4a8361 100644 --- a/crates/js_api/src/subgraph/vault.rs +++ b/crates/js_api/src/subgraph/vault.rs @@ -1,4 +1,3 @@ -use super::order::get_sg_order; use super::SubgraphError; use alloy::primitives::{Address, Bytes, U256}; use cynic::Id; @@ -6,7 +5,7 @@ use rain_orderbook_bindings::wasm_traits::prelude::*; use rain_orderbook_common::deposit::DepositArgs; use rain_orderbook_common::transaction::TransactionArgs; use rain_orderbook_common::withdraw::WithdrawArgs; -use rain_orderbook_subgraph_client::types::common::{Order, VaultsListFilterArgs}; +use rain_orderbook_subgraph_client::types::common::{Order, Vault, VaultsListFilterArgs}; use rain_orderbook_subgraph_client::{ MultiOrderbookSubgraphClient, MultiSubgraphArgs, OrderbookSubgraphClient, OrderbookSubgraphClientError, PaginationArgs, @@ -78,19 +77,15 @@ pub async fn get_vault_deposit_calldata( /// Returns a string of the calldata #[wasm_bindgen(js_name = "getVaultWithdrawCalldata")] pub async fn get_vault_withdraw_calldata( - rpc_url: &str, - order_id: &str, - input_index: u8, + vault: &Vault, withdraw_amount: &str, ) -> Result { let withdraw_amount = validate_amount(withdraw_amount)?; - let order = get_sg_order(rpc_url, order_id).await?; - let index = validate_io_index(&order, true, input_index)?; Ok(to_value(&Bytes::copy_from_slice( &WithdrawArgs { - token: Address::from_str(&order.inputs[index].token.address.0)?, - vault_id: U256::from_str(&order.inputs[index].vault_id.0)?, + token: Address::from_str(&vault.token.address.0)?, + vault_id: U256::from_str(&vault.vault_id.0)?, target_amount: withdraw_amount, } .get_withdraw_calldata() @@ -100,23 +95,16 @@ pub async fn get_vault_withdraw_calldata( #[wasm_bindgen(js_name = "getVaultApprovalCalldata")] pub async fn get_vault_approval_calldata( - token_address: &str, - vault_id: &str, + rpc_url: &str, + vault: &Vault, deposit_amount: &str, - vault_owner: &str, ) -> Result { let deposit_amount = validate_amount(deposit_amount)?; - let token = Address::from_str(token_address)?; - let vault_id = U256::from_str(vault_id)?; - let owner = Address::from_str(vault_owner)?; + let owner = Address::from_str(&vault.owner.0)?; - let deposit_args = DepositArgs { - token, - amount: deposit_amount, - vault_id, - }; + let (deposit_args, transaction_args) = + get_deposit_and_transaction_args(rpc_url, &vault, deposit_amount)?; - let transaction_args = TransactionArgs::default(); let allowance = deposit_args .read_allowance(owner, transaction_args.clone()) .await?; @@ -132,20 +120,13 @@ pub async fn get_vault_approval_calldata( } #[wasm_bindgen(js_name = "checkVaultAllowance")] -pub async fn check_vault_allowance( - rpc_url: &str, - order_id: &str, - input_index: u8, -) -> Result { - let order = get_sg_order(rpc_url, order_id).await?; - let index = validate_io_index(&order, true, input_index)?; - +pub async fn check_vault_allowance(rpc_url: &str, vault: &Vault) -> Result { let (deposit_args, transaction_args) = - get_deposit_and_transaction_args(rpc_url, &order, index, U256::ZERO)?; + get_deposit_and_transaction_args(rpc_url, &vault, U256::ZERO)?; Ok(to_value( &deposit_args - .read_allowance(Address::from_str(&order.owner.0)?, transaction_args.clone()) + .read_allowance(Address::from_str(&vault.owner.0)?, transaction_args.clone()) .await?, )?) } @@ -174,17 +155,16 @@ pub fn validate_io_index(order: &Order, is_input: bool, index: u8) -> Result Result<(DepositArgs, TransactionArgs), SubgraphError> { let deposit_args = DepositArgs { - token: Address::from_str(&order.outputs[index].token.address.0)?, - vault_id: U256::from_str(&order.outputs[index].vault_id.0)?, + token: Address::from_str(&vault.token.address.0)?, + vault_id: U256::from_str(&vault.vault_id.0)?, // Use vault_id instead of id amount, }; let transaction_args = TransactionArgs { - orderbook_address: Address::from_str(&order.orderbook.id.0)?, + orderbook_address: Address::from_str(&vault.orderbook.id.0)?, rpc_url: rpc_url.to_string(), ..Default::default() }; From c31706d5dbb29c3a5ffc60dbe25a64d880ea4ba4 Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Thu, 30 Jan 2025 17:48:35 +0100 Subject: [PATCH 12/22] remove minus allowance --- crates/common/src/deposit.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/common/src/deposit.rs b/crates/common/src/deposit.rs index dfe3e9afd..4285bd82a 100644 --- a/crates/common/src/deposit.rs +++ b/crates/common/src/deposit.rs @@ -115,7 +115,7 @@ impl DepositArgs { ) -> Result, WritableTransactionExecuteError> { let approve_call = approveCall { spender: transaction_args.orderbook_address, - amount: self.amount - current_allowance, + amount: self.amount, }; Ok(approve_call.abi_encode()) } From 15354dd4225458d92625204afbd6af01fc251e04 Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Thu, 30 Jan 2025 17:53:08 +0100 Subject: [PATCH 13/22] remove allowance from get allowance --- crates/common/src/deposit.rs | 1 - crates/common/src/dotrain_order/calldata.rs | 4 +--- crates/js_api/src/subgraph/vault.rs | 4 +--- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/crates/common/src/deposit.rs b/crates/common/src/deposit.rs index 4285bd82a..0d26879d2 100644 --- a/crates/common/src/deposit.rs +++ b/crates/common/src/deposit.rs @@ -111,7 +111,6 @@ impl DepositArgs { pub async fn get_approve_calldata( &self, transaction_args: TransactionArgs, - current_allowance: U256, ) -> Result, WritableTransactionExecuteError> { let approve_call = approveCall { spender: transaction_args.orderbook_address, diff --git a/crates/common/src/dotrain_order/calldata.rs b/crates/common/src/dotrain_order/calldata.rs index 88d4a3504..72ad88686 100644 --- a/crates/common/src/dotrain_order/calldata.rs +++ b/crates/common/src/dotrain_order/calldata.rs @@ -76,9 +76,7 @@ impl DotrainOrder { .await?; if allowance < deposit_amount { - let approve_call = deposit_args - .get_approve_calldata(transaction_args, allowance) - .await?; + let approve_call = deposit_args.get_approve_calldata(transaction_args).await?; calldatas.push(ApprovalCalldata { token: output_token.address, calldata: Bytes::copy_from_slice(&approve_call), diff --git a/crates/js_api/src/subgraph/vault.rs b/crates/js_api/src/subgraph/vault.rs index b7b4a8361..0e15240c4 100644 --- a/crates/js_api/src/subgraph/vault.rs +++ b/crates/js_api/src/subgraph/vault.rs @@ -113,9 +113,7 @@ pub async fn get_vault_approval_calldata( } Ok(to_value(&Bytes::copy_from_slice( - &deposit_args - .get_approve_calldata(transaction_args, allowance) - .await?, + &deposit_args.get_approve_calldata(transaction_args).await?, ))?) } From d83b6f71da4061438c199c8dde324a7a293b18cc Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Thu, 30 Jan 2025 18:48:41 +0100 Subject: [PATCH 14/22] add withdraw call data type --- crates/js_api/src/gui/order_operations.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/crates/js_api/src/gui/order_operations.rs b/crates/js_api/src/gui/order_operations.rs index 6390962b3..c4b64124d 100644 --- a/crates/js_api/src/gui/order_operations.rs +++ b/crates/js_api/src/gui/order_operations.rs @@ -31,6 +31,10 @@ impl_all_wasm_traits!(ApprovalCalldataResult); pub struct DepositCalldataResult(Vec); impl_all_wasm_traits!(DepositCalldataResult); +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Tsify)] +pub struct WithdrawCalldataResult(Vec); +impl_all_wasm_traits!(WithdrawCalldataResult); + #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Tsify)] pub struct AddOrderCalldataResult(Bytes); impl_all_wasm_traits!(AddOrderCalldataResult); From 0950513612a4d1c438a4922388e36933c7dba95b Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Fri, 31 Jan 2025 16:25:31 +0100 Subject: [PATCH 15/22] vault tests --- packages/orderbook/test/js_api/gui.test.ts | 2 +- packages/orderbook/test/js_api/vault.test.ts | 59 ++++++++++---------- 2 files changed, 30 insertions(+), 31 deletions(-) diff --git a/packages/orderbook/test/js_api/gui.test.ts b/packages/orderbook/test/js_api/gui.test.ts index bd0fb51ef..4fbeb11a1 100644 --- a/packages/orderbook/test/js_api/gui.test.ts +++ b/packages/orderbook/test/js_api/gui.test.ts @@ -865,7 +865,7 @@ ${dotrain}`; // 5000 - 1000 = 4000 * 10^18 assert.equal( approvalCalldatas[0].calldata, - '0x095ea7b3000000000000000000000000c95a5f8efe14d7a20bd2e5bafec4e71f8ce0b9a60000000000000000000000000000000000000000000000d8d726b7177a800000' + '0x095ea7b3000000000000000000000000c95a5f8efe14d7a20bd2e5bafec4e71f8ce0b9a600000000000000000000000000000000000000000000010f0cf064dd59200000' ); }); diff --git a/packages/orderbook/test/js_api/vault.test.ts b/packages/orderbook/test/js_api/vault.test.ts index 5b3623f91..0b133bba0 100644 --- a/packages/orderbook/test/js_api/vault.test.ts +++ b/packages/orderbook/test/js_api/vault.test.ts @@ -170,7 +170,7 @@ describe('Rain Orderbook JS API Package Bindgen Vault Tests', async function () const order = { id: 'order', orderBytes: - '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', orderHash: '0x1', owner: '0x0000000000000000000000000000000000000000', outputs: [ @@ -269,22 +269,20 @@ describe('Rain Orderbook JS API Package Bindgen Vault Tests', async function () await mockServer.forPost('/sg4').thenReply(200, JSON.stringify({ data: { order } })); let calldata: string = await getVaultWithdrawCalldata( - mockServer.url + '/sg4', - 'order1', - 0, + vault1, '500' ); assert.equal(calldata.length, 330); try { - await getVaultWithdrawCalldata(mockServer.url + '/sg4', 'order1', 99, '500'); + await getVaultWithdrawCalldata(vault1, '0'); assert.fail('expected to reject, but resolved'); } catch (e) { - assert.equal((e as Error).message, 'Invalid input index'); + assert.equal((e as Error).message, 'Invalid amount'); } try { - await getVaultWithdrawCalldata(mockServer.url + '/sg4', 'order1', 0, '0'); + await getVaultWithdrawCalldata(vault1, '0'); assert.fail('expected to reject, but resolved'); } catch (error) { assert.equal((error as Error).message, 'Invalid amount'); @@ -295,32 +293,33 @@ describe('Rain Orderbook JS API Package Bindgen Vault Tests', async function () await mockServer.forPost('/sg4').thenReply(200, JSON.stringify({ data: { order } })); await mockServer .forPost('/sg4') - .once() - .thenSendJsonRpcResult('0x0000000000000000000000000000000000000000000000000000000000000001'); + .thenReply(200, JSON.stringify({ + jsonrpc: '2.0', + id: 1, + result: '0x0000000000000000000000000000000000000000000000000000000000000001' + })); - let allowance: string = await checkVaultAllowance(mockServer.url + '/sg4', 'order1', 0); + const allowance = await checkVaultAllowance(mockServer.url + '/sg4', vault1); assert.equal(allowance, '0x1'); - - try { - await checkVaultAllowance(mockServer.url + '/sg4', 'order1', 99); - assert.fail('expected to reject, but resolved'); - } catch (e) { - assert.equal((e as Error).message, 'Invalid input index'); - } }); - it('should generate valid approval calldata with correct length', async () => { - await mockServer.forPost('/sg4').thenReply(200, JSON.stringify({ data: { order } })); - await mockServer - .forPost('/sg4') - .once() - .thenSendJsonRpcResult('0x0000000000000000000000000000000000000000000000000000000000000001'); +it('should generate valid approval calldata with correct length', async () => { + await mockServer.forPost('/sg4').thenReply(200, JSON.stringify({ data: { order } })); + await mockServer + .forPost('/sg4') + .thenReply(200, JSON.stringify({ + jsonrpc: '2.0', + id: 1, + result: '0x0000000000000000000000000000000000000000000000000000000000000000' + })); - const calldata: string = await getVaultApprovalCalldata( - vault1.token.address, - vault1.vaultId, - '600' - ); - assert.equal(calldata.length, 138); - }); + const calldata = await getVaultApprovalCalldata( + mockServer.url + '/sg4', + vault1, + '600' + ); + + assert.ok(calldata.startsWith('0x')); + assert.equal(calldata.length, 138); +}); }); From 3434e9d9b1a98aa8e407a38bef7cb5f1db803625 Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Fri, 31 Jan 2025 16:25:58 +0100 Subject: [PATCH 16/22] format --- packages/orderbook/test/js_api/vault.test.ts | 47 +++++++++----------- 1 file changed, 21 insertions(+), 26 deletions(-) diff --git a/packages/orderbook/test/js_api/vault.test.ts b/packages/orderbook/test/js_api/vault.test.ts index 0b133bba0..0808b3186 100644 --- a/packages/orderbook/test/js_api/vault.test.ts +++ b/packages/orderbook/test/js_api/vault.test.ts @@ -268,10 +268,7 @@ describe('Rain Orderbook JS API Package Bindgen Vault Tests', async function () it('should get withdraw calldata for a vault', async () => { await mockServer.forPost('/sg4').thenReply(200, JSON.stringify({ data: { order } })); - let calldata: string = await getVaultWithdrawCalldata( - vault1, - '500' - ); + let calldata: string = await getVaultWithdrawCalldata(vault1, '500'); assert.equal(calldata.length, 330); try { @@ -291,35 +288,33 @@ describe('Rain Orderbook JS API Package Bindgen Vault Tests', async function () it('should read allowance for a vault', async () => { await mockServer.forPost('/sg4').thenReply(200, JSON.stringify({ data: { order } })); - await mockServer - .forPost('/sg4') - .thenReply(200, JSON.stringify({ + await mockServer.forPost('/sg4').thenReply( + 200, + JSON.stringify({ jsonrpc: '2.0', id: 1, result: '0x0000000000000000000000000000000000000000000000000000000000000001' - })); + }) + ); const allowance = await checkVaultAllowance(mockServer.url + '/sg4', vault1); assert.equal(allowance, '0x1'); }); -it('should generate valid approval calldata with correct length', async () => { - await mockServer.forPost('/sg4').thenReply(200, JSON.stringify({ data: { order } })); - await mockServer - .forPost('/sg4') - .thenReply(200, JSON.stringify({ - jsonrpc: '2.0', - id: 1, - result: '0x0000000000000000000000000000000000000000000000000000000000000000' - })); + it('should generate valid approval calldata with correct length', async () => { + await mockServer.forPost('/sg4').thenReply(200, JSON.stringify({ data: { order } })); + await mockServer.forPost('/sg4').thenReply( + 200, + JSON.stringify({ + jsonrpc: '2.0', + id: 1, + result: '0x0000000000000000000000000000000000000000000000000000000000000000' + }) + ); - const calldata = await getVaultApprovalCalldata( - mockServer.url + '/sg4', - vault1, - '600' - ); - - assert.ok(calldata.startsWith('0x')); - assert.equal(calldata.length, 138); -}); + const calldata = await getVaultApprovalCalldata(mockServer.url + '/sg4', vault1, '600'); + + assert.ok(calldata.startsWith('0x')); + assert.equal(calldata.length, 138); + }); }); From 2dcea897e2f685cb707cd114d9450937285e1bbc Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Fri, 31 Jan 2025 16:48:20 +0100 Subject: [PATCH 17/22] 0 repsonse --- packages/orderbook/test/js_api/vault.test.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/orderbook/test/js_api/vault.test.ts b/packages/orderbook/test/js_api/vault.test.ts index 0808b3186..af560c65e 100644 --- a/packages/orderbook/test/js_api/vault.test.ts +++ b/packages/orderbook/test/js_api/vault.test.ts @@ -287,8 +287,8 @@ describe('Rain Orderbook JS API Package Bindgen Vault Tests', async function () }); it('should read allowance for a vault', async () => { - await mockServer.forPost('/sg4').thenReply(200, JSON.stringify({ data: { order } })); - await mockServer.forPost('/sg4').thenReply( + await mockServer.forPost('/rpc').thenReply(200, JSON.stringify({ data: '0' })); + await mockServer.forPost('/rpc').thenReply( 200, JSON.stringify({ jsonrpc: '2.0', @@ -297,13 +297,13 @@ describe('Rain Orderbook JS API Package Bindgen Vault Tests', async function () }) ); - const allowance = await checkVaultAllowance(mockServer.url + '/sg4', vault1); + const allowance = await checkVaultAllowance(mockServer.url + '/rpc', vault1); assert.equal(allowance, '0x1'); }); it('should generate valid approval calldata with correct length', async () => { - await mockServer.forPost('/sg4').thenReply(200, JSON.stringify({ data: { order } })); - await mockServer.forPost('/sg4').thenReply( + await mockServer.forPost('/rpc').thenReply(200, JSON.stringify({ data: '0' })); + await mockServer.forPost('/rpc').thenReply( 200, JSON.stringify({ jsonrpc: '2.0', @@ -312,7 +312,7 @@ describe('Rain Orderbook JS API Package Bindgen Vault Tests', async function () }) ); - const calldata = await getVaultApprovalCalldata(mockServer.url + '/sg4', vault1, '600'); + const calldata = await getVaultApprovalCalldata(mockServer.url + '/rpc', vault1, '600'); assert.ok(calldata.startsWith('0x')); assert.equal(calldata.length, 138); From e2da80dbed87bbd05cabb8575c7c51ea31253fd0 Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Fri, 31 Jan 2025 17:05:12 +0100 Subject: [PATCH 18/22] fix tests --- packages/orderbook/test/js_api/vault.test.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/orderbook/test/js_api/vault.test.ts b/packages/orderbook/test/js_api/vault.test.ts index af560c65e..a2b290b1e 100644 --- a/packages/orderbook/test/js_api/vault.test.ts +++ b/packages/orderbook/test/js_api/vault.test.ts @@ -170,7 +170,7 @@ describe('Rain Orderbook JS API Package Bindgen Vault Tests', async function () const order = { id: 'order', orderBytes: - '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', orderHash: '0x1', owner: '0x0000000000000000000000000000000000000000', outputs: [ @@ -287,28 +287,26 @@ describe('Rain Orderbook JS API Package Bindgen Vault Tests', async function () }); it('should read allowance for a vault', async () => { - await mockServer.forPost('/rpc').thenReply(200, JSON.stringify({ data: '0' })); await mockServer.forPost('/rpc').thenReply( 200, JSON.stringify({ jsonrpc: '2.0', id: 1, - result: '0x0000000000000000000000000000000000000000000000000000000000000001' + result: '0x0000000000000000000000000000000000000000000000000000000000000064' }) ); const allowance = await checkVaultAllowance(mockServer.url + '/rpc', vault1); - assert.equal(allowance, '0x1'); + assert.equal(allowance, '0x64'); }); it('should generate valid approval calldata with correct length', async () => { - await mockServer.forPost('/rpc').thenReply(200, JSON.stringify({ data: '0' })); await mockServer.forPost('/rpc').thenReply( 200, JSON.stringify({ jsonrpc: '2.0', id: 1, - result: '0x0000000000000000000000000000000000000000000000000000000000000000' + result: '0x0000000000000000000000000000000000000000000000000000000000000064' }) ); From 550d56511518e410299756b844f6a2079eb38f2d Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Sat, 1 Feb 2025 18:55:25 +0100 Subject: [PATCH 19/22] fix approval --- tauri-app/src-tauri/src/commands/vault.rs | 3 +-- tauri-app/src/lib/components/ModalVaultDeposit.svelte | 1 - tauri-app/src/lib/components/ModalVaultDepositGeneric.svelte | 1 - tauri-app/src/lib/services/vault.ts | 2 -- 4 files changed, 1 insertion(+), 6 deletions(-) diff --git a/tauri-app/src-tauri/src/commands/vault.rs b/tauri-app/src-tauri/src/commands/vault.rs index ec92dd259..f05cd7a20 100644 --- a/tauri-app/src-tauri/src/commands/vault.rs +++ b/tauri-app/src-tauri/src/commands/vault.rs @@ -91,10 +91,9 @@ pub async fn vault_deposit_approve_calldata( app_handle: AppHandle, deposit_args: DepositArgs, transaction_args: TransactionArgs, - current_allowance: U256, ) -> CommandResult { let calldata = deposit_args - .get_approve_calldata(transaction_args, current_allowance) + .get_approve_calldata(transaction_args) .await .map_err(|e| { toast_error(app_handle.clone(), e.to_string()); diff --git a/tauri-app/src/lib/components/ModalVaultDeposit.svelte b/tauri-app/src/lib/components/ModalVaultDeposit.svelte index 28fd76328..8ec180e75 100644 --- a/tauri-app/src/lib/components/ModalVaultDeposit.svelte +++ b/tauri-app/src/lib/components/ModalVaultDeposit.svelte @@ -55,7 +55,6 @@ BigInt(vault.vaultId), vault.token.id, amount, - allowance.toBigInt(), )) as Uint8Array; const approveTx = await ethersExecute(approveCalldata, vault.token.id); toasts.success('Approve Transaction sent successfully!'); diff --git a/tauri-app/src/lib/components/ModalVaultDepositGeneric.svelte b/tauri-app/src/lib/components/ModalVaultDepositGeneric.svelte index 5c83e956f..30eeb6866 100644 --- a/tauri-app/src/lib/components/ModalVaultDepositGeneric.svelte +++ b/tauri-app/src/lib/components/ModalVaultDepositGeneric.svelte @@ -61,7 +61,6 @@ vaultId, tokenAddress, amount, - allowance.toBigInt(), )) as Uint8Array; const approveTx = await ethersExecute(approveCalldata, tokenAddress); toasts.success('Approve Transaction sent successfully!'); diff --git a/tauri-app/src/lib/services/vault.ts b/tauri-app/src/lib/services/vault.ts index c9acc5ec1..3425e6af7 100644 --- a/tauri-app/src/lib/services/vault.ts +++ b/tauri-app/src/lib/services/vault.ts @@ -65,7 +65,6 @@ export async function vaultDepositApproveCalldata( vaultId: bigint, token: string, amount: bigint, - currentAllowance: bigint, ) { return await invoke('vault_deposit_approve_calldata', { depositArgs: { @@ -79,6 +78,5 @@ export async function vaultDepositApproveCalldata( derivation_index: get(ledgerWalletDerivationIndex), chain_id: get(chainId), }, - currentAllowance: currentAllowance.toString(), }); } From 2ca1667f6faa78bd68add5e8717862e5250c3b56 Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Sat, 1 Feb 2025 19:42:30 +0100 Subject: [PATCH 20/22] format --- tauri-app/src/lib/services/vault.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/tauri-app/src/lib/services/vault.ts b/tauri-app/src/lib/services/vault.ts index 3425e6af7..56fdfff58 100644 --- a/tauri-app/src/lib/services/vault.ts +++ b/tauri-app/src/lib/services/vault.ts @@ -61,11 +61,7 @@ export async function vaultDepositCalldata(vaultId: bigint, token: string, amoun }); } -export async function vaultDepositApproveCalldata( - vaultId: bigint, - token: string, - amount: bigint, -) { +export async function vaultDepositApproveCalldata(vaultId: bigint, token: string, amount: bigint) { return await invoke('vault_deposit_approve_calldata', { depositArgs: { vault_id: vaultId.toString(), From f39aec503e5f467ba1498cb4818287f37a98b65c Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Mon, 3 Feb 2025 19:24:47 +0100 Subject: [PATCH 21/22] change to vault prop all functions --- crates/js_api/src/subgraph/vault.rs | 12 ++++-------- packages/orderbook/test/js_api/vault.test.ts | 7 +++---- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/crates/js_api/src/subgraph/vault.rs b/crates/js_api/src/subgraph/vault.rs index 0e15240c4..d8cf9d64d 100644 --- a/crates/js_api/src/subgraph/vault.rs +++ b/crates/js_api/src/subgraph/vault.rs @@ -54,18 +54,15 @@ pub async fn get_vault_balance_changes( /// Returns a string of the calldata #[wasm_bindgen(js_name = "getVaultDepositCalldata")] pub async fn get_vault_deposit_calldata( - token_address: &str, - vault_id: &str, + vault: &Vault, deposit_amount: &str, ) -> Result { let deposit_amount = validate_amount(deposit_amount)?; - let token = Address::from_str(token_address)?; - let vault_id = U256::from_str(vault_id)?; let deposit_args = DepositArgs { - token, - amount: deposit_amount, - vault_id, + token: Address::from_str(&vault.token.address.0)?, + vault_id: U256::from_str(&vault.vault_id.0)?, + amount: deposit_amount, }; Ok(to_value(&Bytes::copy_from_slice( @@ -74,7 +71,6 @@ pub async fn get_vault_deposit_calldata( } /// Get withdraw calldata for a vault -/// Returns a string of the calldata #[wasm_bindgen(js_name = "getVaultWithdrawCalldata")] pub async fn get_vault_withdraw_calldata( vault: &Vault, diff --git a/packages/orderbook/test/js_api/vault.test.ts b/packages/orderbook/test/js_api/vault.test.ts index a2b290b1e..551931684 100644 --- a/packages/orderbook/test/js_api/vault.test.ts +++ b/packages/orderbook/test/js_api/vault.test.ts @@ -238,8 +238,7 @@ describe('Rain Orderbook JS API Package Bindgen Vault Tests', async function () await mockServer.forPost('/sg4').thenReply(200, JSON.stringify({ data: { order } })); let calldata: string = await getVaultDepositCalldata( - vault1.token.address, - vault1.vaultId, + vault1, '500' ); assert.equal(calldata.length, 330); @@ -250,7 +249,7 @@ describe('Rain Orderbook JS API Package Bindgen Vault Tests', async function () await assert.rejects( async () => { - await getVaultDepositCalldata(vault1.token.address, vault1.vaultId, '0'); + await getVaultDepositCalldata(vault1, '0'); }, { message: 'Invalid amount' } ); @@ -259,7 +258,7 @@ describe('Rain Orderbook JS API Package Bindgen Vault Tests', async function () it('should throw error for invalid deposit amount', async () => { await assert.rejects( async () => { - await getVaultDepositCalldata(vault1.token.address, vault1.vaultId, '-100'); + await getVaultDepositCalldata(vault1, '-100'); }, { message: 'invalid digit: -' } ); From d856b2109a688a7a9612d955e244e79aff94c74e Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Tue, 4 Feb 2025 12:15:56 +0100 Subject: [PATCH 22/22] format --- crates/js_api/src/subgraph/vault.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/js_api/src/subgraph/vault.rs b/crates/js_api/src/subgraph/vault.rs index d8cf9d64d..6afc6f20c 100644 --- a/crates/js_api/src/subgraph/vault.rs +++ b/crates/js_api/src/subgraph/vault.rs @@ -60,9 +60,9 @@ pub async fn get_vault_deposit_calldata( let deposit_amount = validate_amount(deposit_amount)?; let deposit_args = DepositArgs { - token: Address::from_str(&vault.token.address.0)?, - vault_id: U256::from_str(&vault.vault_id.0)?, - amount: deposit_amount, + token: Address::from_str(&vault.token.address.0)?, + vault_id: U256::from_str(&vault.vault_id.0)?, + amount: deposit_amount, }; Ok(to_value(&Bytes::copy_from_slice( @@ -154,7 +154,7 @@ pub fn get_deposit_and_transaction_args( ) -> Result<(DepositArgs, TransactionArgs), SubgraphError> { let deposit_args = DepositArgs { token: Address::from_str(&vault.token.address.0)?, - vault_id: U256::from_str(&vault.vault_id.0)?, // Use vault_id instead of id + vault_id: U256::from_str(&vault.vault_id.0)?, amount, }; let transaction_args = TransactionArgs {