From 443b7aed3dffd9230f174a820b30cbd1de825ad7 Mon Sep 17 00:00:00 2001 From: Arda Nakisci Date: Tue, 10 Mar 2026 13:32:00 +0300 Subject: [PATCH 1/2] Make get_add_orders_for_transaction public and remove orderbook_address param The function now accepts only chain_id and tx_hash, looping through all configured orderbooks for the chain via get_orderbooks_by_chain_id and aggregating results. Callers no longer need to know which orderbook a transaction targeted. Updated WASM binding, JS/TS callers, tests, and README examples accordingly. --- .../common/src/raindex_client/add_orders.rs | 85 +++++++++---------- .../src/raindex_client/local_db/orders.rs | 1 - packages/orderbook/README.md | 5 +- .../test/js_api/raindexClient.test.ts | 6 +- .../transactions/TransactionManager.ts | 2 +- 5 files changed, 44 insertions(+), 55 deletions(-) diff --git a/crates/common/src/raindex_client/add_orders.rs b/crates/common/src/raindex_client/add_orders.rs index 11cecfe674..5a33eed73b 100644 --- a/crates/common/src/raindex_client/add_orders.rs +++ b/crates/common/src/raindex_client/add_orders.rs @@ -20,13 +20,13 @@ enum PollError { impl RaindexClient { /// Fetches orders that were added in a specific transaction /// - /// Retrieves all orders created within a single blockchain transaction, useful - /// for tracking order deployment. + /// Retrieves all orders created within a single blockchain transaction across + /// all configured orderbooks for the given chain, useful for tracking order deployment. /// /// ## Examples /// /// ```javascript - /// const result = await client.getAddOrdersForTransaction(1, "0x1234567890abcdef1234567890abcdef12345678"); + /// const result = await client.getAddOrdersForTransaction(1, "0xabc..."); /// if (result.error) { /// console.error("Cannot fetch added orders:", result.error.readableMsg); /// return; @@ -44,12 +44,6 @@ impl RaindexClient { &self, #[wasm_export(js_name = "chainId", param_description = "Chain ID for the network")] chain_id: u32, - #[wasm_export( - js_name = "orderbookAddress", - param_description = "Orderbook contract address", - unchecked_param_type = "Hex" - )] - orderbook_address: String, #[wasm_export( js_name = "txHash", param_description = "Transaction hash", @@ -67,11 +61,9 @@ impl RaindexClient { )] interval_ms: Option, ) -> Result, RaindexError> { - let orderbook_address = Address::from_str(&orderbook_address)?; let tx_hash = B256::from_str(&tx_hash)?; self.get_add_orders_for_transaction( chain_id, - orderbook_address, tx_hash, max_attempts.map(|v| v as usize), interval_ms.map(|v| v as u64), @@ -80,16 +72,19 @@ impl RaindexClient { } } impl RaindexClient { - async fn get_add_orders_for_transaction( + pub async fn get_add_orders_for_transaction( &self, chain_id: u32, - orderbook_address: Address, tx_hash: B256, max_attempts: Option, interval_ms: Option, ) -> Result, RaindexError> { let raindex_client = ClientRef::new(self.clone()); + let orderbooks = self.orderbook_yaml.get_orderbooks_by_chain_id(chain_id)?; + let orderbook_addresses: Vec
= + orderbooks.iter().map(|ob| ob.address).collect(); + let attempts = max_attempts .unwrap_or(DEFAULT_ADD_ORDER_POLL_ATTEMPTS) .max(1); @@ -100,14 +95,18 @@ impl RaindexClient { let local_source = LocalDbOrders::new(&local_db, raindex_client.clone()); let local_result = retry_with_constant_interval( || async { - let orders = local_source - .get_added_by_tx_hash(chain_id, orderbook_address, tx_hash) - .await - .map_err(PollError::Inner)?; - if orders.is_empty() { + let mut all_orders = Vec::new(); + for &orderbook_address in &orderbook_addresses { + let orders = local_source + .get_added_by_tx_hash(chain_id, orderbook_address, tx_hash) + .await + .map_err(PollError::Inner)?; + all_orders.extend(orders); + } + if all_orders.is_empty() { Err(PollError::Empty) } else { - Ok(orders) + Ok(all_orders) } }, attempts, @@ -132,20 +131,24 @@ impl RaindexClient { let subgraph_source = SubgraphOrders::new(self); let subgraph_result = retry_with_constant_interval( || async { - let orders = match subgraph_source - .get_added_by_tx_hash(chain_id, orderbook_address, tx_hash) - .await - { - Ok(orders) => orders, - Err(RaindexError::OrderbookSubgraphClientError( - rain_orderbook_subgraph_client::OrderbookSubgraphClientError::Empty, - )) => return Err(PollError::Empty), - Err(e) => return Err(PollError::Inner(e)), - }; - if orders.is_empty() { + let mut all_orders = Vec::new(); + for &orderbook_address in &orderbook_addresses { + let orders = match subgraph_source + .get_added_by_tx_hash(chain_id, orderbook_address, tx_hash) + .await + { + Ok(orders) => orders, + Err(RaindexError::OrderbookSubgraphClientError( + rain_orderbook_subgraph_client::OrderbookSubgraphClientError::Empty, + )) => continue, + Err(e) => return Err(PollError::Inner(e)), + }; + all_orders.extend(orders); + } + if all_orders.is_empty() { Err(PollError::Empty) } else { - Ok(orders) + Ok(all_orders) } }, attempts, @@ -178,9 +181,7 @@ mod tests { #[cfg(not(target_family = "wasm"))] mod non_wasm { use super::*; - use crate::raindex_client::tests::{ - get_test_yaml, new_with_local_db, CHAIN_ID_1_ORDERBOOK_ADDRESS, - }; + use crate::raindex_client::tests::{get_test_yaml, new_with_local_db}; use crate::{ local_db::query::{ fetch_orders::LocalDbOrder, FromDbJson, LocalDbQueryError, LocalDbQueryExecutor, @@ -364,7 +365,6 @@ mod tests { let res = raindex_client .get_add_orders_for_transaction( 1, - Address::from_str(CHAIN_ID_1_ORDERBOOK_ADDRESS).unwrap(), b256!("0x0000000000000000000000000000000000000000000000000000000000000123"), None, None, @@ -549,7 +549,6 @@ mod tests { let res = raindex_client .get_add_orders_for_transaction( 1, - Address::from_str(CHAIN_ID_1_ORDERBOOK_ADDRESS).unwrap(), b256!("0x0000000000000000000000000000000000000000000000000000000000000123"), Some(DEFAULT_ADD_ORDER_POLL_ATTEMPTS), Some(10), @@ -583,7 +582,6 @@ mod tests { let err = raindex_client .get_add_orders_for_transaction( 1, - Address::from_str(CHAIN_ID_1_ORDERBOOK_ADDRESS).unwrap(), b256!("0x0000000000000000000000000000000000000000000000000000000000000123"), Some(DEFAULT_ADD_ORDER_POLL_ATTEMPTS), Some(10), @@ -603,8 +601,6 @@ mod tests { async fn test_get_transaction_add_orders_prefers_local_db() { let tx_hash = b256!("0x00000000000000000000000000000000000000000000000000000000deadbeef"); - let orderbook_address = - Address::from_str("0x0987654321098765432109876543210987654321").unwrap(); let owner = Address::from_str("0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa").unwrap(); let local_order = LocalDbOrder { @@ -615,7 +611,10 @@ mod tests { owner, block_timestamp: 1_000, block_number: 50, - orderbook_address, + orderbook_address: Address::from_str( + "0x0987654321098765432109876543210987654321", + ) + .unwrap(), order_bytes: Bytes::from_str("0x01").unwrap(), transaction_hash: tx_hash, inputs: None, @@ -651,7 +650,7 @@ mod tests { .await; let res = client - .get_add_orders_for_transaction(137, orderbook_address, tx_hash, Some(3), Some(1)) + .get_add_orders_for_transaction(137, tx_hash, Some(3), Some(1)) .await .unwrap(); @@ -671,8 +670,6 @@ mod tests { async fn test_get_transaction_add_orders_exhausts_local_without_fallback() { let tx_hash = b256!("0x00000000000000000000000000000000000000000000000000000000cafebabe"); - let orderbook_address = - Address::from_str("0x0987654321098765432109876543210987654321").unwrap(); let local_exec = CountingJsonExec { json: "[]".to_string(), @@ -701,7 +698,7 @@ mod tests { .await; let err = client - .get_add_orders_for_transaction(137, orderbook_address, tx_hash, Some(2), Some(1)) + .get_add_orders_for_transaction(137, tx_hash, Some(2), Some(1)) .await .unwrap_err(); diff --git a/crates/common/src/raindex_client/local_db/orders.rs b/crates/common/src/raindex_client/local_db/orders.rs index 5708713d13..482874aca2 100644 --- a/crates/common/src/raindex_client/local_db/orders.rs +++ b/crates/common/src/raindex_client/local_db/orders.rs @@ -627,7 +627,6 @@ mod tests { let orders = client .get_add_orders_for_transaction_wasm_binding( 137, - orderbook_address.to_string(), transaction_hash.to_string(), Some(1), Some(1), diff --git a/packages/orderbook/README.md b/packages/orderbook/README.md index 7865f639a4..b57896f8dd 100644 --- a/packages/orderbook/README.md +++ b/packages/orderbook/README.md @@ -268,16 +268,14 @@ async function waitForOrderFromTx( client: RaindexClient, { chainId, - orderbookAddress, txHash }: { chainId: number; - orderbookAddress: string; txHash: string; } ) { for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) { - const result = await client.getAddOrdersForTransaction(chainId, orderbookAddress, txHash); + const result = await client.getAddOrdersForTransaction(chainId, txHash); if (result.error) throw new Error(result.error.readableMsg); if (result.value.length) { @@ -291,7 +289,6 @@ async function waitForOrderFromTx( const txReceipt = await executeOrder(...); const raindexOrder = await waitForOrderFromTx(client, { chainId: 8453, - orderbookAddress: '0x52CEB8eBEf648744fFDDE89F7Bc9C3aC35944775', txHash: txReceipt.transactionHash }); ``` diff --git a/packages/orderbook/test/js_api/raindexClient.test.ts b/packages/orderbook/test/js_api/raindexClient.test.ts index 1199ae7e5d..90b5da90ce 100644 --- a/packages/orderbook/test/js_api/raindexClient.test.ts +++ b/packages/orderbook/test/js_api/raindexClient.test.ts @@ -1599,11 +1599,7 @@ describe('Rain Orderbook JS API Package Bindgen Tests - Raindex Client', async f const raindexClient = extractWasmEncodedData(await RaindexClient.new([YAML])); const result = extractWasmEncodedData( - await raindexClient.getAddOrdersForTransaction( - 1, - CHAIN_ID_1_ORDERBOOK_ADDRESS, - mockOrder.transaction.id - ) + await raindexClient.getAddOrdersForTransaction(1, mockOrder.transaction.id) ); assert.equal(result[0].id, mockAddOrder.order.id); assert.equal(result[0].chainId, BigInt(1)); diff --git a/packages/ui-components/src/lib/providers/transactions/TransactionManager.ts b/packages/ui-components/src/lib/providers/transactions/TransactionManager.ts index 7207213e89..07278db770 100644 --- a/packages/ui-components/src/lib/providers/transactions/TransactionManager.ts +++ b/packages/ui-components/src/lib/providers/transactions/TransactionManager.ts @@ -480,7 +480,7 @@ export class TransactionManager { // SDK-based indexing - the SDK's getAddOrdersForTransaction handles // local-DB-first polling followed by subgraph fallback internally const awaitIndexingFn = createSdkIndexingFn({ - call: () => raindexClient.getAddOrdersForTransaction(chainId, orderbook, txHash), + call: () => raindexClient.getAddOrdersForTransaction(chainId, txHash), isSuccess: (orders) => Array.isArray(orders) && orders.length > 0, buildLinks: (orders) => { if (!Array.isArray(orders) || orders.length === 0) return []; From f510840767c5d57048abbdd17d880a0bd43659d2 Mon Sep 17 00:00:00 2001 From: Arda Nakisci Date: Tue, 10 Mar 2026 14:05:38 +0300 Subject: [PATCH 2/2] Fix WASM test: use chain 42161 matching the local_db_test_yaml config The test was using chain_id 137 but the YAML only defines chain 42161. Now that get_add_orders_for_transaction calls get_orderbooks_by_chain_id, the chain must exist in the YAML config. --- crates/common/src/raindex_client/local_db/orders.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/common/src/raindex_client/local_db/orders.rs b/crates/common/src/raindex_client/local_db/orders.rs index 482874aca2..3895270027 100644 --- a/crates/common/src/raindex_client/local_db/orders.rs +++ b/crates/common/src/raindex_client/local_db/orders.rs @@ -602,7 +602,7 @@ mod tests { let orderbook_address = address!("0x2f209e5b67A33B8fE96E28f24628dF6Da301c8eB"); let local_order = LocalDbOrder { - chain_id: 137, + chain_id: 42161, order_hash, owner, block_timestamp: 123456, @@ -621,12 +621,12 @@ mod tests { let client = new_test_client_with_db_callback( vec![get_local_db_test_yaml()], callback, - vec![42161, 137], + vec![42161], ); let orders = client .get_add_orders_for_transaction_wasm_binding( - 137, + 42161, transaction_hash.to_string(), Some(1), Some(1), @@ -636,7 +636,7 @@ mod tests { assert_eq!(orders.len(), 1); let order = &orders[0]; - assert_eq!(order.chain_id(), 137); + assert_eq!(order.chain_id(), 42161); assert_eq!(order.order_hash(), order_hash.to_string()); assert_eq!(order.order_bytes(), order_bytes.to_string()); let tx = order.transaction().expect("transaction should be set");