From 433da3a4507ee98c57e6c9f32f3018bf0e8779ff Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Thu, 13 Feb 2025 16:16:47 +0100 Subject: [PATCH 01/23] add rust stuff --- crates/subgraph/src/orderbook_client.rs | 21 +++++++++++++++++++++ crates/subgraph/src/types/add_order.rs | 25 +++++++++++++++++++++++++ crates/subgraph/src/types/common.rs | 1 + crates/subgraph/src/types/mod.rs | 1 + 4 files changed, 48 insertions(+) create mode 100644 crates/subgraph/src/types/add_order.rs diff --git a/crates/subgraph/src/orderbook_client.rs b/crates/subgraph/src/orderbook_client.rs index aa902c629..bcc53ee67 100644 --- a/crates/subgraph/src/orderbook_client.rs +++ b/crates/subgraph/src/orderbook_client.rs @@ -2,6 +2,7 @@ use crate::cynic_client::{CynicClient, CynicClientError}; use crate::pagination::{PaginationArgs, PaginationClient, PaginationClientError}; use crate::performance::vol::{get_vaults_vol, VaultVolume}; use crate::performance::OrderPerformance; +use crate::types::add_order::{GetTransactionAddOrders, GetTransactionAddOrdersVariables}; use crate::types::common::*; use crate::types::order::{ BatchOrderDetailQuery, BatchOrderDetailQueryVariables, OrderDetailQuery, OrderIdList, @@ -395,4 +396,24 @@ impl OrderbookSubgraphClient { .ok_or(OrderbookSubgraphClientError::Empty)?; Ok(transaction) } + + /// Fetch all add orders for a given transaction + pub async fn transaction_add_orders( + &self, + id: Id, + ) -> Result, OrderbookSubgraphClientError> { + let data = self + .query::( + GetTransactionAddOrdersVariables { + id: &id.inner().to_string(), + }, + ) + .await?; + + if data.add_orders.is_empty() { + return Err(OrderbookSubgraphClientError::Empty); + } + + Ok(data.add_orders) + } } diff --git a/crates/subgraph/src/types/add_order.rs b/crates/subgraph/src/types/add_order.rs new file mode 100644 index 000000000..ab58eccae --- /dev/null +++ b/crates/subgraph/src/types/add_order.rs @@ -0,0 +1,25 @@ +use super::common::AddOrder; +use crate::schema; +use typeshare::typeshare; + +#[derive(cynic::QueryVariables, Debug)] +pub struct GetTransactionAddOrdersVariables<'a> { + pub id: &'a str, +} + +#[derive(cynic::QueryFragment, Debug)] +#[cynic(graphql_type = "Query", variables = "GetTransactionAddOrdersVariables")] +pub struct GetTransactionAddOrders { + #[arguments(where: { transaction_: { id: $id } })] + pub add_orders: Vec, +} + +#[derive(cynic::QueryFragment, Debug)] +#[typeshare] +pub struct Order { + pub id: Bytes, +} + +#[derive(cynic::Scalar, Debug, Clone)] +#[typeshare] +pub struct Bytes(pub String); diff --git a/crates/subgraph/src/types/common.rs b/crates/subgraph/src/types/common.rs index cc97ff93c..f4e95d5e9 100644 --- a/crates/subgraph/src/types/common.rs +++ b/crates/subgraph/src/types/common.rs @@ -380,6 +380,7 @@ pub struct Transaction { #[typeshare] pub struct AddOrder { pub transaction: Transaction, + pub order: Order, } #[derive(cynic::Scalar, Debug, Clone, PartialEq, Eq, Hash)] diff --git a/crates/subgraph/src/types/mod.rs b/crates/subgraph/src/types/mod.rs index aa590dc15..59d6e66af 100644 --- a/crates/subgraph/src/types/mod.rs +++ b/crates/subgraph/src/types/mod.rs @@ -1,3 +1,4 @@ +pub mod add_order; pub mod common; mod impls; pub mod order; From 6f4eb0b7eb39621755dce570aa8fa1e0207b66c7 Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Fri, 14 Feb 2025 11:02:51 +0100 Subject: [PATCH 02/23] rename --- crates/subgraph/src/orderbook_client.rs | 8 +++----- crates/subgraph/src/types/add_order.rs | 15 ++++++--------- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/crates/subgraph/src/orderbook_client.rs b/crates/subgraph/src/orderbook_client.rs index bcc53ee67..40085bdc3 100644 --- a/crates/subgraph/src/orderbook_client.rs +++ b/crates/subgraph/src/orderbook_client.rs @@ -2,7 +2,7 @@ use crate::cynic_client::{CynicClient, CynicClientError}; use crate::pagination::{PaginationArgs, PaginationClient, PaginationClientError}; use crate::performance::vol::{get_vaults_vol, VaultVolume}; use crate::performance::OrderPerformance; -use crate::types::add_order::{GetTransactionAddOrders, GetTransactionAddOrdersVariables}; +use crate::types::add_order::{TransactionAddOrdersQuery, TransactionAddOrdersVariables}; use crate::types::common::*; use crate::types::order::{ BatchOrderDetailQuery, BatchOrderDetailQueryVariables, OrderDetailQuery, OrderIdList, @@ -403,10 +403,8 @@ impl OrderbookSubgraphClient { id: Id, ) -> Result, OrderbookSubgraphClientError> { let data = self - .query::( - GetTransactionAddOrdersVariables { - id: &id.inner().to_string(), - }, + .query::( + TransactionAddOrdersVariables { id: &id }, ) .await?; diff --git a/crates/subgraph/src/types/add_order.rs b/crates/subgraph/src/types/add_order.rs index ab58eccae..42014ee0c 100644 --- a/crates/subgraph/src/types/add_order.rs +++ b/crates/subgraph/src/types/add_order.rs @@ -1,15 +1,16 @@ -use super::common::AddOrder; +use super::common::{AddOrder, Bytes}; use crate::schema; use typeshare::typeshare; #[derive(cynic::QueryVariables, Debug)] -pub struct GetTransactionAddOrdersVariables<'a> { - pub id: &'a str, +pub struct TransactionAddOrdersVariables<'a> { + pub id: &'a cynic::Id, } #[derive(cynic::QueryFragment, Debug)] -#[cynic(graphql_type = "Query", variables = "GetTransactionAddOrdersVariables")] -pub struct GetTransactionAddOrders { +#[cynic(graphql_type = "Query", variables = "TransactionAddOrdersVariables")] +#[typeshare] +pub struct TransactionAddOrdersQuery { #[arguments(where: { transaction_: { id: $id } })] pub add_orders: Vec, } @@ -19,7 +20,3 @@ pub struct GetTransactionAddOrders { pub struct Order { pub id: Bytes, } - -#[derive(cynic::Scalar, Debug, Clone)] -#[typeshare] -pub struct Bytes(pub String); From 66e7dc20a9196898979c23c7d77eb598959a9d41 Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Fri, 14 Feb 2025 11:44:54 +0100 Subject: [PATCH 03/23] test unreachable --- crates/js_api/src/subgraph/add_order.rs | 16 +++++++ crates/js_api/src/subgraph/mod.rs | 1 + crates/subgraph/src/orderbook_client.rs | 10 ++--- crates/subgraph/src/types/add_order.rs | 6 +-- .../orderbook/test/js_api/addOrder.test.ts | 42 +++++++++++++++++++ 5 files changed, 67 insertions(+), 8 deletions(-) create mode 100644 crates/js_api/src/subgraph/add_order.rs create mode 100644 packages/orderbook/test/js_api/addOrder.test.ts diff --git a/crates/js_api/src/subgraph/add_order.rs b/crates/js_api/src/subgraph/add_order.rs new file mode 100644 index 000000000..57efbba77 --- /dev/null +++ b/crates/js_api/src/subgraph/add_order.rs @@ -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 Add Orders for a given transaction +/// Returns an array of AddOrder structs +#[wasm_bindgen(js_name = "getTransactionAddOrders")] +pub async fn get_transaction_add_orders( + url: &str, + tx_hash: &str, +) -> Result { + let client = OrderbookSubgraphClient::new(Url::parse(url)?); + let add_orders = client.transaction_add_orders(Id::new(tx_hash)).await?; + Ok(to_value(&add_orders)?) +} diff --git a/crates/js_api/src/subgraph/mod.rs b/crates/js_api/src/subgraph/mod.rs index 7df2bad7f..7b843a1ba 100644 --- a/crates/js_api/src/subgraph/mod.rs +++ b/crates/js_api/src/subgraph/mod.rs @@ -7,6 +7,7 @@ use rain_orderbook_subgraph_client::OrderbookSubgraphClientError; use thiserror::Error; use wasm_bindgen::{JsError, JsValue}; +pub mod add_order; pub mod order; pub mod transaction; pub mod vault; diff --git a/crates/subgraph/src/orderbook_client.rs b/crates/subgraph/src/orderbook_client.rs index 40085bdc3..fadc0ad7e 100644 --- a/crates/subgraph/src/orderbook_client.rs +++ b/crates/subgraph/src/orderbook_client.rs @@ -404,14 +404,14 @@ impl OrderbookSubgraphClient { ) -> Result, OrderbookSubgraphClientError> { let data = self .query::( - TransactionAddOrdersVariables { id: &id }, + TransactionAddOrdersVariables { + id: Bytes(id.inner().to_string()), + }, ) .await?; - if data.add_orders.is_empty() { - return Err(OrderbookSubgraphClientError::Empty); - } + let add_orders = data.add_orders.ok_or(OrderbookSubgraphClientError::Empty)?; - Ok(data.add_orders) + Ok(add_orders) } } diff --git a/crates/subgraph/src/types/add_order.rs b/crates/subgraph/src/types/add_order.rs index 42014ee0c..79a9d6b55 100644 --- a/crates/subgraph/src/types/add_order.rs +++ b/crates/subgraph/src/types/add_order.rs @@ -3,8 +3,8 @@ use crate::schema; use typeshare::typeshare; #[derive(cynic::QueryVariables, Debug)] -pub struct TransactionAddOrdersVariables<'a> { - pub id: &'a cynic::Id, +pub struct TransactionAddOrdersVariables { + pub id: Bytes, } #[derive(cynic::QueryFragment, Debug)] @@ -12,7 +12,7 @@ pub struct TransactionAddOrdersVariables<'a> { #[typeshare] pub struct TransactionAddOrdersQuery { #[arguments(where: { transaction_: { id: $id } })] - pub add_orders: Vec, + pub add_orders: Option>, } #[derive(cynic::QueryFragment, Debug)] diff --git a/packages/orderbook/test/js_api/addOrder.test.ts b/packages/orderbook/test/js_api/addOrder.test.ts new file mode 100644 index 000000000..293f2d05b --- /dev/null +++ b/packages/orderbook/test/js_api/addOrder.test.ts @@ -0,0 +1,42 @@ +import assert from 'assert'; +import { getLocal } from 'mockttp'; +import { describe, it, beforeEach, afterEach } from 'vitest'; +import { Transaction, AddOrder } from '../../dist/types/js_api.js'; +import { getTransaction, getTransactionAddOrders } from '../../dist/cjs/js_api.js'; + +const transaction1 = { + id: 'tx1', + from: '0x1', + blockNumber: '1', + timestamp: '1' +} as unknown as Transaction; + +const addOrders = [ + { + id: 'addOrder1', + order: { + id: 'order1', + } + } as unknown as AddOrder, + { + id: 'addOrder2', + order: { + id: 'order2', + } + } as unknown as AddOrder, +] as unknown as AddOrder[]; + +describe('Rain Orderbook JS API Package Bindgen Tests - Add Order', async function () { + // const mockServer = getLocal(); + // beforeEach(() => mockServer.start(8095)); + // afterEach(() => mockServer.stop()); + + it('should fetch add orders for a transaction', async () => { + // await mockServer + // .forPost('/sg2') + // .thenReply(200, JSON.stringify({ data: { add_orders: addOrders } })); + + const result: AddOrder[] = await getTransactionAddOrders('https://api.goldsky.com/api/public/project_clv14x04y9kzi01saerx7bxpg/subgraphs/ob4-flare/2024-12-13-9dc7/gn', '0xb5d715bc74b7a7f2aac8cca544c1c95e209ed4113b82269ac3285142324bc6af'); + console.log(result); + }); +}); From a106aee5b390fded9333333a8a24f07fa514705d Mon Sep 17 00:00:00 2001 From: findolor Date: Fri, 14 Feb 2025 14:10:10 +0300 Subject: [PATCH 04/23] fix graphql query --- crates/subgraph/src/orderbook_client.rs | 8 ++++-- crates/subgraph/src/types/add_order.rs | 10 ++----- crates/subgraph/src/types/common.rs | 8 ++++++ .../orderbook/test/js_api/addOrder.test.ts | 28 +++++++++++++------ 4 files changed, 34 insertions(+), 20 deletions(-) diff --git a/crates/subgraph/src/orderbook_client.rs b/crates/subgraph/src/orderbook_client.rs index fadc0ad7e..c7096bc9f 100644 --- a/crates/subgraph/src/orderbook_client.rs +++ b/crates/subgraph/src/orderbook_client.rs @@ -401,7 +401,7 @@ impl OrderbookSubgraphClient { pub async fn transaction_add_orders( &self, id: Id, - ) -> Result, OrderbookSubgraphClientError> { + ) -> Result, OrderbookSubgraphClientError> { let data = self .query::( TransactionAddOrdersVariables { @@ -410,8 +410,10 @@ impl OrderbookSubgraphClient { ) .await?; - let add_orders = data.add_orders.ok_or(OrderbookSubgraphClientError::Empty)?; + if data.add_orders.is_empty() { + return Err(OrderbookSubgraphClientError::Empty); + } - Ok(add_orders) + Ok(data.add_orders) } } diff --git a/crates/subgraph/src/types/add_order.rs b/crates/subgraph/src/types/add_order.rs index 79a9d6b55..04db0bbe4 100644 --- a/crates/subgraph/src/types/add_order.rs +++ b/crates/subgraph/src/types/add_order.rs @@ -1,4 +1,4 @@ -use super::common::{AddOrder, Bytes}; +use super::common::{AddOrderWithOrder, Bytes}; use crate::schema; use typeshare::typeshare; @@ -12,11 +12,5 @@ pub struct TransactionAddOrdersVariables { #[typeshare] pub struct TransactionAddOrdersQuery { #[arguments(where: { transaction_: { id: $id } })] - pub add_orders: Option>, -} - -#[derive(cynic::QueryFragment, Debug)] -#[typeshare] -pub struct Order { - pub id: Bytes, + pub add_orders: Vec, } diff --git a/crates/subgraph/src/types/common.rs b/crates/subgraph/src/types/common.rs index f4e95d5e9..ecc73bb1c 100644 --- a/crates/subgraph/src/types/common.rs +++ b/crates/subgraph/src/types/common.rs @@ -380,6 +380,14 @@ pub struct Transaction { #[typeshare] pub struct AddOrder { pub transaction: Transaction, +} + +#[derive(cynic::QueryFragment, Debug, Serialize, Clone)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] +#[cynic(graphql_type = "AddOrder")] +#[typeshare] +pub struct AddOrderWithOrder { + pub transaction: Transaction, pub order: Order, } diff --git a/packages/orderbook/test/js_api/addOrder.test.ts b/packages/orderbook/test/js_api/addOrder.test.ts index 293f2d05b..34b2e45bc 100644 --- a/packages/orderbook/test/js_api/addOrder.test.ts +++ b/packages/orderbook/test/js_api/addOrder.test.ts @@ -1,6 +1,6 @@ import assert from 'assert'; import { getLocal } from 'mockttp'; -import { describe, it, beforeEach, afterEach } from 'vitest'; +import { describe, it, beforeEach, afterEach, beforeAll, afterAll } from 'vitest'; import { Transaction, AddOrder } from '../../dist/types/js_api.js'; import { getTransaction, getTransactionAddOrders } from '../../dist/cjs/js_api.js'; @@ -15,28 +15,38 @@ const addOrders = [ { id: 'addOrder1', order: { - id: 'order1', + id: 'order1' } } as unknown as AddOrder, { id: 'addOrder2', order: { - id: 'order2', + id: 'order2' } - } as unknown as AddOrder, + } as unknown as AddOrder ] as unknown as AddOrder[]; describe('Rain Orderbook JS API Package Bindgen Tests - Add Order', async function () { - // const mockServer = getLocal(); - // beforeEach(() => mockServer.start(8095)); - // afterEach(() => mockServer.stop()); + const mockServer = getLocal(); + beforeAll(async () => { + await mockServer.start(8091); + }); + afterAll(async () => { + await mockServer.stop(); + }); + beforeEach(() => { + mockServer.reset(); + }); it('should fetch add orders for a transaction', async () => { // await mockServer // .forPost('/sg2') // .thenReply(200, JSON.stringify({ data: { add_orders: addOrders } })); - const result: AddOrder[] = await getTransactionAddOrders('https://api.goldsky.com/api/public/project_clv14x04y9kzi01saerx7bxpg/subgraphs/ob4-flare/2024-12-13-9dc7/gn', '0xb5d715bc74b7a7f2aac8cca544c1c95e209ed4113b82269ac3285142324bc6af'); - console.log(result); + const result: AddOrder[] = await getTransactionAddOrders( + 'https://api.goldsky.com/api/public/project_clv14x04y9kzi01saerx7bxpg/subgraphs/ob4-flare/2024-12-13-9dc7/gn', + '0xb5d715bc74b7a7f2aac8cca544c1c95e209ed4113b82269ac3285142324bc6af' + ); + console.log(result); }); }); From 2ce9db196bf6576b277f13aa002bbd5999f5e14e Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Fri, 14 Feb 2025 12:34:02 +0100 Subject: [PATCH 05/23] add o --- .../orderbook/test/js_api/addOrder.test.ts | 400 ++++++++++++++++-- .../orderbook/test/js_api/transaction.test.ts | 4 +- .../webapp/src/routes/deploy/+page.svelte | 13 +- 3 files changed, 373 insertions(+), 44 deletions(-) diff --git a/packages/orderbook/test/js_api/addOrder.test.ts b/packages/orderbook/test/js_api/addOrder.test.ts index 34b2e45bc..3ef82733d 100644 --- a/packages/orderbook/test/js_api/addOrder.test.ts +++ b/packages/orderbook/test/js_api/addOrder.test.ts @@ -1,52 +1,372 @@ import assert from 'assert'; import { getLocal } from 'mockttp'; -import { describe, it, beforeEach, afterEach, beforeAll, afterAll } from 'vitest'; -import { Transaction, AddOrder } from '../../dist/types/js_api.js'; -import { getTransaction, getTransactionAddOrders } from '../../dist/cjs/js_api.js'; +import { describe, it, beforeEach, afterEach } from 'vitest'; +import { Transaction, AddOrderWithOrder } from '../../dist/types/js_api.js'; +import { getTransactionAddOrders } from '../../dist/cjs/js_api.js'; -const transaction1 = { - id: 'tx1', - from: '0x1', - blockNumber: '1', - timestamp: '1' -} as unknown as Transaction; +const transaction1: Transaction = { + "id": "0xb5d715bc74b7a7f2aac8cca544c1c95e209ed4113b82269ac3285142324bc6af", + "from": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", + "blockNumber": "37432554", + "timestamp": "1739448802" +} -const addOrders = [ - { - id: 'addOrder1', - order: { - id: 'order1' - } - } as unknown as AddOrder, - { - id: 'addOrder2', - order: { - id: 'order2' - } - } as unknown as AddOrder -] as unknown as AddOrder[]; +const mockAddOrder: AddOrderWithOrder = { + "transaction": { + "id": "0xb5d715bc74b7a7f2aac8cca544c1c95e209ed4113b82269ac3285142324bc6af", + "from": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", + "blockNumber": "37432554", + "timestamp": "1739448802" + }, + "order": { + "id": "0x1a69eeb7970d3c8d5776493327fb262e31fc880c9cc4a951607418a7963d9fa1", + "orderBytes": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000f08bcbce72f62c95dcb7c07dcb5ed26acfcfbc1100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000640392c489ef67afdc348209452c338ea5ba2b6152b936e152f610d05e1a20621a40000000000000000000000005fb33d710f8b58de4c9fdec703b5c2487a5219d600000000000000000000000084c6e7f5a1e5dd89594cc25bef4722a1b8871ae60000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000049d000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000c7d713b49da0000914d696e20747261646520616d6f756e742e00000000000000000000000000008b616d6f756e742d75736564000000000000000000000000000000000000000000000000000000000000000000000000000000000000000340aad21b3b70000000000000000000000000000000000000000000000000006194049f30f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1a2bc2ec500000000000000000000000000000000000000000000000000000e043da6172500008f6c6173742d74726164652d74696d65000000000000000000000000000000008d6c6173742d74726164652d696f0000000000000000000000000000000000008c696e697469616c2d74696d650000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f05b59d3b200000000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000020000915e36ef882941816356bc3718df868054f868ad000000000000000000000000000000000000000000000000000000000000027d0a00000024007400e0015801b401e001f40218025c080500040b20000200100001001000000b120003001000010b110004001000030b0100051305000201100001011000003d120000011000020010000003100404211200001d02000001100003031000010c1200004911000003100404001000012b12000001100003031000010c1200004a0200001a0b00090b1000060b20000700100000001000011b1200001a10000047120000001000001a1000004712000001100000011000002e12000001100005011000042e120000001000053d12000001100004001000042e1200000010000601100005001000032e120000481200011d0b020a0010000001100000011000062713000001100003031000010c12000049110000001000030010000247120000001000010b110008001000050110000700100001201200001f12000001100000011000004712000000100006001000073d120000011000002b12000000100008001000043b120000160901080b1000070b10000901100008001000013d1200001b12000001100006001000013d1200000b100009001000033a120000001000040010000248120001001000000b110008001000053d12000000100006001000042b1200000a0401011a10000001100009031000010c1200004a020000001000000110000a031000010c1200004a020000040200010110000b031000010c120000491100000803000201100009031000010c120000491100000110000a031000010c12000049110000100c01030110000d001000002e1200000110000c3e120000001000010010000100100001001000010010000100100001001000010010000100100001001000013d1a0000020100010210000e3611000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000001d80c49bbbcd1c0911346656b529df9e5c2f783d0000000000000000000000000000000000000000000000000000000000000012a6e3c06415539f92823a18ba63e1c0303040c4892970a0d1e3a27663d7583b33000000000000000000000000000000000000000000000000000000000000000100000000000000000000000012e605bc104e93b45e1ad99f9e555f659051c2bb0000000000000000000000000000000000000000000000000000000000000012a6e3c06415539f92823a18ba63e1c0303040c4892970a0d1e3a27663d7583b33", + "orderHash": "0x557147dd0daa80d5beff0023fe6a3505469b2b8c4406ce1ab873e1a652572dd4", + "owner": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", + "outputs": [ + { + "id": "0x49f6b665c395c7b975caa2fc167cb5119981bbb86798bcaf3c4570153d09dfcf", + "owner": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", + "vaultId": "75486334982066122983501547829219246999490818941767825330875804445439814023987", + "balance": "987000000000000000", + "token": { + "id": "0x12e605bc104e93b45e1ad99f9e555f659051c2bb", + "address": "0x12e605bc104e93b45e1ad99f9e555f659051c2bb", + "name": "Staked FLR", + "symbol": "sFLR", + "decimals": "18" + }, + "orderbook": { + "id": "0xcee8cd002f151a536394e564b84076c41bbbcd4d" + }, + "ordersAsOutput": [ + { + "id": "0x1a69eeb7970d3c8d5776493327fb262e31fc880c9cc4a951607418a7963d9fa1", + "orderHash": "0x557147dd0daa80d5beff0023fe6a3505469b2b8c4406ce1ab873e1a652572dd4", + "active": true + } + ], + "ordersAsInput": [], + "balanceChanges": [ + { + "__typename": "deposit", + "data": { + "id": "0x1bf9c93f8ac04810e733b61a7d5dabba66fc1a47235e6ab027e76c9758a2a9e8", + "__typename": "Deposit", + "amount": "1000000000000000000", + "newVaultBalance": "1000000000000000000", + "oldVaultBalance": "0", + "vault": { + "id": "0x49f6b665c395c7b975caa2fc167cb5119981bbb86798bcaf3c4570153d09dfcf", + "vault_id": "75486334982066122983501547829219246999490818941767825330875804445439814023987", + "token": { + "id": "0x12e605bc104e93b45e1ad99f9e555f659051c2bb", + "address": "0x12e605bc104e93b45e1ad99f9e555f659051c2bb", + "name": "Staked FLR", + "symbol": "sFLR", + "decimals": "18" + } + }, + "timestamp": "1739448802", + "transaction": { + "id": "0xb5d715bc74b7a7f2aac8cca544c1c95e209ed4113b82269ac3285142324bc6af", + "from": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", + "blockNumber": "37432554", + "timestamp": "1739448802" + }, + "orderbook": { + "id": "0xcee8cd002f151a536394e564b84076c41bbbcd4d" + } + } + }, + { + "__typename": "withdrawal", + "data": { + "id": "0x252f6727a7a9bf1047cd9764351e9a2514140c5664589b0e5ecc7f9a4c69329c", + "__typename": "Withdrawal", + "amount": "-11000000000000000", + "newVaultBalance": "987000000000000000", + "oldVaultBalance": "998000000000000000", + "vault": { + "id": "0x49f6b665c395c7b975caa2fc167cb5119981bbb86798bcaf3c4570153d09dfcf", + "vault_id": "75486334982066122983501547829219246999490818941767825330875804445439814023987", + "token": { + "id": "0x12e605bc104e93b45e1ad99f9e555f659051c2bb", + "address": "0x12e605bc104e93b45e1ad99f9e555f659051c2bb", + "name": "Staked FLR", + "symbol": "sFLR", + "decimals": "18" + } + }, + "timestamp": "1739460802", + "transaction": { + "id": "0xf4052dcf0a9ef208be249822c002bf656d273b4583e92928066fd8fb0a67c3f0", + "from": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", + "blockNumber": "37439233", + "timestamp": "1739460802" + }, + "orderbook": { + "id": "0xcee8cd002f151a536394e564b84076c41bbbcd4d" + } + } + }, + { + "__typename": "withdrawal", + "data": { + "id": "0x3b272ce8735a1778d584ed2d49532d571a815909b8f89b2d7d2c6744fcf7cb7c", + "__typename": "Withdrawal", + "amount": "-1000000000000000", + "newVaultBalance": "998000000000000000", + "oldVaultBalance": "999000000000000000", + "vault": { + "id": "0x49f6b665c395c7b975caa2fc167cb5119981bbb86798bcaf3c4570153d09dfcf", + "vault_id": "75486334982066122983501547829219246999490818941767825330875804445439814023987", + "token": { + "id": "0x12e605bc104e93b45e1ad99f9e555f659051c2bb", + "address": "0x12e605bc104e93b45e1ad99f9e555f659051c2bb", + "name": "Staked FLR", + "symbol": "sFLR", + "decimals": "18" + } + }, + "timestamp": "1739460777", + "transaction": { + "id": "0xe3e1be9b3e11420de1f1d34f460c14d8688183b78b2dbcfd9b45560b553e451a", + "from": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", + "blockNumber": "37439219", + "timestamp": "1739460777" + }, + "orderbook": { + "id": "0xcee8cd002f151a536394e564b84076c41bbbcd4d" + } + } + }, + { + "__typename": "withdrawal", + "data": { + "id": "0x9d19a7aa2486c2640669eb04c8c4ed3e11073a04767d6dcfc3468ae12f695849", + "__typename": "Withdrawal", + "amount": "-1000000000000000", + "newVaultBalance": "999000000000000000", + "oldVaultBalance": "1000000000000000000", + "vault": { + "id": "0x49f6b665c395c7b975caa2fc167cb5119981bbb86798bcaf3c4570153d09dfcf", + "vault_id": "75486334982066122983501547829219246999490818941767825330875804445439814023987", + "token": { + "id": "0x12e605bc104e93b45e1ad99f9e555f659051c2bb", + "address": "0x12e605bc104e93b45e1ad99f9e555f659051c2bb", + "name": "Staked FLR", + "symbol": "sFLR", + "decimals": "18" + } + }, + "timestamp": "1739460481", + "transaction": { + "id": "0x3bf239fb20fed202f04da468cc62d762390ab5f80b67b477565f740277f94df3", + "from": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", + "blockNumber": "37439068", + "timestamp": "1739460481" + }, + "orderbook": { + "id": "0xcee8cd002f151a536394e564b84076c41bbbcd4d" + } + } + } + ] + } + ], + "inputs": [ + { + "id": "0x538830b4f8cc03840cea5af799dc532be4363a3ee8f4c6123dbff7a0acc86dac", + "owner": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", + "vaultId": "75486334982066122983501547829219246999490818941767825330875804445439814023987", + "balance": "797990000000000000", + "token": { + "id": "0x1d80c49bbbcd1c0911346656b529df9e5c2f783d", + "address": "0x1d80c49bbbcd1c0911346656b529df9e5c2f783d", + "name": "Wrapped Flare", + "symbol": "WFLR", + "decimals": "18" + }, + "orderbook": { + "id": "0xcee8cd002f151a536394e564b84076c41bbbcd4d" + }, + "ordersAsOutput": [], + "ordersAsInput": [ + { + "id": "0x1a69eeb7970d3c8d5776493327fb262e31fc880c9cc4a951607418a7963d9fa1", + "orderHash": "0x557147dd0daa80d5beff0023fe6a3505469b2b8c4406ce1ab873e1a652572dd4", + "active": true + } + ], + "balanceChanges": [ + { + "__typename": "withdrawal", + "data": { + "id": "0x3c8de8385099c2f7775cb4695af43d7e38863ae9442402d73f70ebf865da1c4c", + "__typename": "Withdrawal", + "amount": "-2000000000000000", + "newVaultBalance": "797990000000000000", + "oldVaultBalance": "799990000000000000", + "vault": { + "id": "0x538830b4f8cc03840cea5af799dc532be4363a3ee8f4c6123dbff7a0acc86dac", + "vault_id": "75486334982066122983501547829219246999490818941767825330875804445439814023987", + "token": { + "id": "0x1d80c49bbbcd1c0911346656b529df9e5c2f783d", + "address": "0x1d80c49bbbcd1c0911346656b529df9e5c2f783d", + "name": "Wrapped Flare", + "symbol": "WFLR", + "decimals": "18" + } + }, + "timestamp": "1739460781", + "transaction": { + "id": "0x6198a5fdf46f37f336bbd8615c18757f3a83ead6ec63ad02d865d46feb284310", + "from": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", + "blockNumber": "37439221", + "timestamp": "1739460781" + }, + "orderbook": { + "id": "0xcee8cd002f151a536394e564b84076c41bbbcd4d" + } + } + }, + { + "__typename": "withdrawal", + "data": { + "id": "0x7616be6722758517786fdcd94549ce0172d7d34fd411b5778ee0667cd1b1bdba", + "__typename": "Withdrawal", + "amount": "-10000000000000", + "newVaultBalance": "999990000000000000", + "oldVaultBalance": "1000000000000000000", + "vault": { + "id": "0x538830b4f8cc03840cea5af799dc532be4363a3ee8f4c6123dbff7a0acc86dac", + "vault_id": "75486334982066122983501547829219246999490818941767825330875804445439814023987", + "token": { + "id": "0x1d80c49bbbcd1c0911346656b529df9e5c2f783d", + "address": "0x1d80c49bbbcd1c0911346656b529df9e5c2f783d", + "name": "Wrapped Flare", + "symbol": "WFLR", + "decimals": "18" + } + }, + "timestamp": "1739460415", + "transaction": { + "id": "0x8562f41d7d4a8af98ed9db1fbb9575f759846edfab0c4310fc2962b93c5eac7d", + "from": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", + "blockNumber": "37439034", + "timestamp": "1739460415" + }, + "orderbook": { + "id": "0xcee8cd002f151a536394e564b84076c41bbbcd4d" + } + } + }, + { + "__typename": "withdrawal", + "data": { + "id": "0x8e0c007bc831906b8b327be965e6aded6f5b8bc4905823b3047dcd2a69f01c83", + "__typename": "Withdrawal", + "amount": "-200000000000000000", + "newVaultBalance": "799990000000000000", + "oldVaultBalance": "999990000000000000", + "vault": { + "id": "0x538830b4f8cc03840cea5af799dc532be4363a3ee8f4c6123dbff7a0acc86dac", + "vault_id": "75486334982066122983501547829219246999490818941767825330875804445439814023987", + "token": { + "id": "0x1d80c49bbbcd1c0911346656b529df9e5c2f783d", + "address": "0x1d80c49bbbcd1c0911346656b529df9e5c2f783d", + "name": "Wrapped Flare", + "symbol": "WFLR", + "decimals": "18" + } + }, + "timestamp": "1739460627", + "transaction": { + "id": "0xb330355574bd73c72d61b102ba7d23a0e07d677cb97e71db4495d0472587649b", + "from": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", + "blockNumber": "37439143", + "timestamp": "1739460627" + }, + "orderbook": { + "id": "0xcee8cd002f151a536394e564b84076c41bbbcd4d" + } + } + }, + { + "__typename": "deposit", + "data": { + "id": "0xcc853bdf3784e8c2e2ac9a43bdc9a2e56cc0d880a10ae8d25c3d675f6d114e74", + "__typename": "Deposit", + "amount": "1000000000000000000", + "newVaultBalance": "1000000000000000000", + "oldVaultBalance": "0", + "vault": { + "id": "0x538830b4f8cc03840cea5af799dc532be4363a3ee8f4c6123dbff7a0acc86dac", + "vault_id": "75486334982066122983501547829219246999490818941767825330875804445439814023987", + "token": { + "id": "0x1d80c49bbbcd1c0911346656b529df9e5c2f783d", + "address": "0x1d80c49bbbcd1c0911346656b529df9e5c2f783d", + "name": "Wrapped Flare", + "symbol": "WFLR", + "decimals": "18" + } + }, + "timestamp": "1739460078", + "transaction": { + "id": "0x1f628ccbe37c1395b81c25cc1d9bfef6266d9782c093e1c42bab225335fe8ba0", + "from": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", + "blockNumber": "37438849", + "timestamp": "1739460078" + }, + "orderbook": { + "id": "0xcee8cd002f151a536394e564b84076c41bbbcd4d" + } + } + } + ] + } + ], + "orderbook": { + "id": "0xcee8cd002f151a536394e564b84076c41bbbcd4d" + }, + "active": true, + "timestampAdded": "1739448802", + "meta": "0xff0a89c674ee7874a300590a932f2a20302e2063616c63756c6174652d696f202a2f200a7573696e672d776f7264732d66726f6d20307846653234313143446131393344394534653833413563323334433746643332303130313838336143203078393135453336656638383239343138313633353662433337313844663836383035344638363861440a616d6f756e742d65706f6368730a74726164652d65706f6368733a63616c6c3c323e28292c0a6d61782d6f75747075743a2063616c6c3c333e28616d6f756e742d65706f6368732074726164652d65706f636873292c0a696f3a2063616c6c3c343e2874726164652d65706f636873292c0a3a63616c6c3c353e28696f293b0a0a2f2a20312e2068616e646c652d696f202a2f200a6d696e2d616d6f756e743a206d756c283120302e39292c0a3a656e7375726528677265617465722d7468616e2d6f722d657175616c2d746f286f75747075742d7661756c742d64656372656173652829206d696e2d616d6f756e742920224d696e20747261646520616d6f756e742e22292c0a757365643a206765742868617368286f726465722d6861736828292022616d6f756e742d757365642229292c0a3a7365742868617368286f726465722d6861736828292022616d6f756e742d757365642229206164642875736564206f75747075742d7661756c742d6465637265617365282929293b0a0a2f2a20322e206765742d65706f6368202a2f200a696e697469616c2d74696d653a2063616c6c3c363e28292c0a6c6173742d74696d65205f3a2063616c6c3c373e28292c0a6475726174696f6e3a20737562286e6f77282920616e79286c6173742d74696d6520696e697469616c2d74696d6529292c0a746f74616c2d6475726174696f6e3a20737562286e6f77282920696e697469616c2d74696d65292c0a726174696f2d667265657a652d616d6f756e742d65706f6368733a2064697628312031292c0a726174696f2d667265657a652d74726164652d65706f6368733a206d756c28726174696f2d667265657a652d616d6f756e742d65706f63687320646976283630203138303029292c0a616d6f756e742d65706f6368733a2064697628746f74616c2d6475726174696f6e203630292c0a74726164652d65706f6368733a2073617475726174696e672d73756228646976286475726174696f6e20313830302920726174696f2d667265657a652d74726164652d65706f636873293b0a0a2f2a20332e20616d6f756e742d666f722d65706f6368202a2f200a616d6f756e742d65706f6368730a74726164652d65706f6368733a2c0a746f74616c2d617661696c61626c653a206c696e6561722d67726f7774682830203120616d6f756e742d65706f636873292c0a757365643a206765742868617368286f726465722d6861736828292022616d6f756e742d757365642229292c0a756e757365643a2073756228746f74616c2d617661696c61626c652075736564292c0a64656361793a2063616c6c3c383e2874726164652d65706f636873292c0a7368792d64656361793a20657665727928677265617465722d7468616e2874726164652d65706f63687320302e303529206465636179292c0a7661726961626c652d636f6d706f6e656e743a2073756228312031292c0a7461726765742d616d6f756e743a206164642831206d756c287661726961626c652d636f6d706f6e656e74207368792d646563617929292c0a6361707065642d756e757365643a206d696e28756e75736564207461726765742d616d6f756e74293b0a0a2f2a20342e20696f2d666f722d65706f6368202a2f200a65706f63683a2c0a6c6173742d696f3a2063616c6c3c373e28292c0a6d61782d6e6578742d74726164653a20616e79286d756c286c6173742d696f20312e3031292063616c6c3c393e2829292c0a626173656c696e652d6e6578742d74726164653a206d756c286c6173742d696f2030292c0a7265616c2d626173656c696e653a206d617828626173656c696e652d6e6578742d74726164652063616c6c3c393e2829292c0a7661726961626c652d636f6d706f6e656e743a2073617475726174696e672d737562286d61782d6e6578742d7472616465207265616c2d626173656c696e65292c0a61626f76652d626173656c696e653a206d756c287661726961626c652d636f6d706f6e656e742063616c6c3c383e2865706f636829292c0a5f3a20616464287265616c2d626173656c696e652061626f76652d626173656c696e65293b0a0a2f2a20352e207365742d6c6173742d7472616465202a2f200a6c6173742d696f3a2c0a3a7365742868617368286f726465722d68617368282920226c6173742d74726164652d74696d652229206e6f772829292c0a3a7365742868617368286f726465722d68617368282920226c6173742d74726164652d696f2229206c6173742d696f293b0a0a2f2a20362e206765742d696e697469616c2d74696d65202a2f200a5f3a6765742868617368286f726465722d6861736828292022696e697469616c2d74696d652229293b0a0a2f2a20372e206765742d6c6173742d7472616465202a2f200a6c6173742d74696d653a6765742868617368286f726465722d68617368282920226c6173742d74726164652d74696d652229292c0a6c6173742d696f3a6765742868617368286f726465722d68617368282920226c6173742d74726164652d696f2229293b0a0a2f2a20382e2068616c666c696665202a2f200a65706f63683a2c0a2f2a2a0a202a20536872696e6b696e6720746865206d756c7469706c696572206c696b6520746869730a202a207468656e206170706c79696e672069742031302074696d657320616c6c6f777320666f720a202a2062657474657220707265636973696f6e207768656e206d61782d696f2d726174696f0a202a2069732076657279206c617267652c20652e672e207e31653130206f72207e316532302b0a202a0a202a205468697320776f726b7320626563617573652060706f77657260206c6f7365730a202a20707265636973696f6e206f6e20626173652060302e3560207768656e207468650a202a206578706f6e656e74206973206c6172676520616e642063616e206576656e20676f0a202a20746f20603060207768696c652074686520696f2d726174696f206973207374696c6c0a202a206c617267652e2042657474657220746f206b65657020746865206d756c7469706c6965720a202a2068696768657220707265636973696f6e20616e642064726f702074686520696f2d726174696f0a202a20736d6f6f74686c7920666f72206173206c6f6e672061732077652063616e2e0a202a2f0a6d756c7469706c6965723a0a2020706f77657228302e35206469762865706f636820313029292c0a76616c3a0a20206d756c280a202020206d756c7469706c6965720a202020206d756c7469706c6965720a202020206d756c7469706c6965720a202020206d756c7469706c6965720a202020206d756c7469706c6965720a202020206d756c7469706c6965720a202020206d756c7469706c6965720a202020206d756c7469706c6965720a202020206d756c7469706c6965720a202020206d756c7469706c6965720a2020293b0a0a2f2a20392e2073666c722d626173656c696e652d696e76202a2f200a5f3a20696e762873666c722d65786368616e67652d726174652829293b011bff13109e41336ff20278186170706c69636174696f6e2f6f637465742d73747265616d", + "addEvents": [ + { + "transaction": { + "id": "0xb5d715bc74b7a7f2aac8cca544c1c95e209ed4113b82269ac3285142324bc6af", + "from": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", + "blockNumber": "37432554", + "timestamp": "1739448802" + } + } + ], + "trades": [] + } +} + +const addOrders: AddOrderWithOrder[] = [mockAddOrder] describe('Rain Orderbook JS API Package Bindgen Tests - Add Order', async function () { const mockServer = getLocal(); - beforeAll(async () => { - await mockServer.start(8091); - }); - afterAll(async () => { - await mockServer.stop(); - }); - beforeEach(() => { - mockServer.reset(); - }); + beforeEach(() => mockServer.start(8091)); + afterEach(() => mockServer.stop()); it('should fetch add orders for a transaction', async () => { - // await mockServer - // .forPost('/sg2') - // .thenReply(200, JSON.stringify({ data: { add_orders: addOrders } })); + await mockServer + .forPost('/sg1') + .thenReply(200, JSON.stringify({ data: { add_orders: addOrders } })); - const result: AddOrder[] = await getTransactionAddOrders( - 'https://api.goldsky.com/api/public/project_clv14x04y9kzi01saerx7bxpg/subgraphs/ob4-flare/2024-12-13-9dc7/gn', - '0xb5d715bc74b7a7f2aac8cca544c1c95e209ed4113b82269ac3285142324bc6af' - ); - console.log(result); + try { + const result: AddOrderWithOrder[] = await getTransactionAddOrders( + mockServer.url + '/sg1', + transaction1.id + ); + assert.deepEqual(result, addOrders); + } catch (e) { + assert.fail('expected to resolve, but failed' + (e instanceof Error ? e.message : String(e))); + } }); }); diff --git a/packages/orderbook/test/js_api/transaction.test.ts b/packages/orderbook/test/js_api/transaction.test.ts index 809db66bb..6600c7d11 100644 --- a/packages/orderbook/test/js_api/transaction.test.ts +++ b/packages/orderbook/test/js_api/transaction.test.ts @@ -11,9 +11,9 @@ const transaction1 = { timestamp: '1' } as unknown as Transaction; -describe('Rain Orderbook JS API Package Bindgen Tests - Order', async function () { +describe('Rain Orderbook JS API Package Bindgen Tests - Transaction', async function () { const mockServer = getLocal(); - beforeEach(() => mockServer.start(8090)); + beforeEach(() => mockServer.start(8093)); afterEach(() => mockServer.stop()); it('should fetch a single transaction', async () => { diff --git a/packages/webapp/src/routes/deploy/+page.svelte b/packages/webapp/src/routes/deploy/+page.svelte index 1259466d2..7241fc780 100644 --- a/packages/webapp/src/routes/deploy/+page.svelte +++ b/packages/webapp/src/routes/deploy/+page.svelte @@ -6,6 +6,7 @@ import { onMount } from 'svelte'; import { rawDotrain } from '$lib/stores/raw-dotrain'; import { page } from '$app/stores'; + import { getTransactionAddOrders } from '@rainlanguage/orderbook/js_api'; let files: { name: string; url: string }[] = []; let inputDotrain = ''; @@ -42,6 +43,14 @@ // add the registry url to the url params window.history.pushState({}, '', window.location.pathname + '?registry=' + $registryUrl); }; + + const handleGetAddOrders = async () => { + const addOrders = await getTransactionAddOrders( + 'https://api.goldsky.com/api/public/project_clv14x04y9kzi01saerx7bxpg/subgraphs/ob4-flare/2024-12-13-9dc7/gn', + '0xb5d715bc74b7a7f2aac8cca544c1c95e209ed4113b82269ac3285142324bc6af' + ); + console.log(addOrders); + }; @@ -51,7 +60,7 @@ - +
{#if advancedMode} @@ -79,7 +88,7 @@

From 26e895e90d89adc9a56aa50a5d94c519f9364d73 Mon Sep 17 00:00:00 2001 From: findolor Date: Fri, 14 Feb 2025 15:09:43 +0300 Subject: [PATCH 06/23] create a new wasm binding for getting deployment detail --- crates/js_api/src/gui/mod.rs | 13 +++++++++++++ packages/orderbook/test/js_api/gui.test.ts | 9 +++++++++ 2 files changed, 22 insertions(+) diff --git a/crates/js_api/src/gui/mod.rs b/crates/js_api/src/gui/mod.rs index 76f7d7170..0f7e607ce 100644 --- a/crates/js_api/src/gui/mod.rs +++ b/crates/js_api/src/gui/mod.rs @@ -162,6 +162,19 @@ impl DotrainOrderGui { Ok(DeploymentDetails(deployment_details.into_iter().collect())) } + #[wasm_bindgen(js_name = "getDeploymentDetail")] + pub async fn get_deployment_detail( + dotrain: String, + key: String, + ) -> Result { + let deployment_details = DotrainOrderGui::get_deployment_details(dotrain).await?; + let deployment_detail = deployment_details + .0 + .get(&key) + .ok_or(GuiError::DeploymentNotFound(key))?; + Ok(deployment_detail.clone()) + } + #[wasm_bindgen(js_name = "generateDotrainText")] pub fn generate_dotrain_text(&self) -> Result { let rain_document = RainDocument::create(self.dotrain_order.dotrain(), None, None, None); diff --git a/packages/orderbook/test/js_api/gui.test.ts b/packages/orderbook/test/js_api/gui.test.ts index 192a24c70..399701b07 100644 --- a/packages/orderbook/test/js_api/gui.test.ts +++ b/packages/orderbook/test/js_api/gui.test.ts @@ -388,6 +388,15 @@ describe('Rain Orderbook JS API Package Bindgen Tests - Gui', async function () assert.equal(entries[1][1].description, 'Buy WETH with USDC for fixed price on Base network.'); }); + it('should get deployment detail', async () => { + const deploymentDetail: NameAndDescription = await DotrainOrderGui.getDeploymentDetail( + dotrainWithGui, + 'other-deployment' + ); + assert.equal(deploymentDetail.name, 'Test test'); + assert.equal(deploymentDetail.description, 'Test test test'); + }); + it('should get token infos', async () => { mockServer .forPost('/rpc-url') From 0d4817380f1b35e73f077f5dd72f202a6567add9 Mon Sep 17 00:00:00 2001 From: findolor Date: Fri, 14 Feb 2025 15:10:24 +0300 Subject: [PATCH 07/23] update UI logic --- .../[strategyName]/[deploymentKey]/+page.ts | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/packages/webapp/src/routes/deploy/[strategyName]/[deploymentKey]/+page.ts b/packages/webapp/src/routes/deploy/[strategyName]/[deploymentKey]/+page.ts index 629672178..3ebfcec44 100644 --- a/packages/webapp/src/routes/deploy/[strategyName]/[deploymentKey]/+page.ts +++ b/packages/webapp/src/routes/deploy/[strategyName]/[deploymentKey]/+page.ts @@ -37,27 +37,12 @@ export const load: PageLoad = async ({ fetch, params, parent }) => { dotrain = await dotrainResponse.text(); } - // Process deployments for both raw and registry strategies - const deploymentWithDetails = await DotrainOrderGui.getDeploymentDetails(dotrain); - const deployments = Array.from(deploymentWithDetails, ([key, details]) => ({ - key, - ...details - })); - - const deployment = deployments.find( - (deployment: { key: string }) => deployment.key === deploymentKey - ); - - if (!deployment) { - throw new Error(`Deployment ${deploymentKey} not found`); - } - - const { key, name, description } = deployment; + const { name, description } = await DotrainOrderGui.getDeploymentDetail(dotrain, deploymentKey); return { dotrain, strategyName, - key, + key: deploymentKey, name, description }; From bedbbb5afba2fc7a720d9f85dff4ea18e5da153e Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Fri, 14 Feb 2025 13:11:50 +0100 Subject: [PATCH 08/23] update props for frontend --- crates/subgraph/src/types/common.rs | 2 +- .../orderbook/test/js_api/addOrder.test.ts | 693 +++++++++--------- .../deployment/DeploymentPage.svelte | 1 + .../deployment/DeploymentSteps.svelte | 7 +- .../src/lib/stores/transactionStore.ts | 49 +- .../src/lib/components/DeployModal.svelte | 4 +- .../lib/components/TransactionModal.svelte | 24 +- packages/webapp/src/lib/services/modal.ts | 1 + 8 files changed, 417 insertions(+), 364 deletions(-) diff --git a/crates/subgraph/src/types/common.rs b/crates/subgraph/src/types/common.rs index ecc73bb1c..18404311d 100644 --- a/crates/subgraph/src/types/common.rs +++ b/crates/subgraph/src/types/common.rs @@ -385,9 +385,9 @@ pub struct AddOrder { #[derive(cynic::QueryFragment, Debug, Serialize, Clone)] #[cfg_attr(target_family = "wasm", derive(Tsify))] #[cynic(graphql_type = "AddOrder")] -#[typeshare] pub struct AddOrderWithOrder { pub transaction: Transaction, + #[cfg_attr(target_family = "wasm", tsify(type = "OrderSubgraph"))] pub order: Order, } diff --git a/packages/orderbook/test/js_api/addOrder.test.ts b/packages/orderbook/test/js_api/addOrder.test.ts index 3ef82733d..5bcc1cc3c 100644 --- a/packages/orderbook/test/js_api/addOrder.test.ts +++ b/packages/orderbook/test/js_api/addOrder.test.ts @@ -5,349 +5,358 @@ import { Transaction, AddOrderWithOrder } from '../../dist/types/js_api.js'; import { getTransactionAddOrders } from '../../dist/cjs/js_api.js'; const transaction1: Transaction = { - "id": "0xb5d715bc74b7a7f2aac8cca544c1c95e209ed4113b82269ac3285142324bc6af", - "from": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", - "blockNumber": "37432554", - "timestamp": "1739448802" -} + id: '0xb5d715bc74b7a7f2aac8cca544c1c95e209ed4113b82269ac3285142324bc6af', + from: '0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11', + blockNumber: '37432554', + timestamp: '1739448802' +}; const mockAddOrder: AddOrderWithOrder = { - "transaction": { - "id": "0xb5d715bc74b7a7f2aac8cca544c1c95e209ed4113b82269ac3285142324bc6af", - "from": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", - "blockNumber": "37432554", - "timestamp": "1739448802" - }, - "order": { - "id": "0x1a69eeb7970d3c8d5776493327fb262e31fc880c9cc4a951607418a7963d9fa1", - "orderBytes": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000f08bcbce72f62c95dcb7c07dcb5ed26acfcfbc1100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000640392c489ef67afdc348209452c338ea5ba2b6152b936e152f610d05e1a20621a40000000000000000000000005fb33d710f8b58de4c9fdec703b5c2487a5219d600000000000000000000000084c6e7f5a1e5dd89594cc25bef4722a1b8871ae60000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000049d000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000c7d713b49da0000914d696e20747261646520616d6f756e742e00000000000000000000000000008b616d6f756e742d75736564000000000000000000000000000000000000000000000000000000000000000000000000000000000000000340aad21b3b70000000000000000000000000000000000000000000000000006194049f30f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1a2bc2ec500000000000000000000000000000000000000000000000000000e043da6172500008f6c6173742d74726164652d74696d65000000000000000000000000000000008d6c6173742d74726164652d696f0000000000000000000000000000000000008c696e697469616c2d74696d650000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f05b59d3b200000000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000020000915e36ef882941816356bc3718df868054f868ad000000000000000000000000000000000000000000000000000000000000027d0a00000024007400e0015801b401e001f40218025c080500040b20000200100001001000000b120003001000010b110004001000030b0100051305000201100001011000003d120000011000020010000003100404211200001d02000001100003031000010c1200004911000003100404001000012b12000001100003031000010c1200004a0200001a0b00090b1000060b20000700100000001000011b1200001a10000047120000001000001a1000004712000001100000011000002e12000001100005011000042e120000001000053d12000001100004001000042e1200000010000601100005001000032e120000481200011d0b020a0010000001100000011000062713000001100003031000010c12000049110000001000030010000247120000001000010b110008001000050110000700100001201200001f12000001100000011000004712000000100006001000073d120000011000002b12000000100008001000043b120000160901080b1000070b10000901100008001000013d1200001b12000001100006001000013d1200000b100009001000033a120000001000040010000248120001001000000b110008001000053d12000000100006001000042b1200000a0401011a10000001100009031000010c1200004a020000001000000110000a031000010c1200004a020000040200010110000b031000010c120000491100000803000201100009031000010c120000491100000110000a031000010c12000049110000100c01030110000d001000002e1200000110000c3e120000001000010010000100100001001000010010000100100001001000010010000100100001001000013d1a0000020100010210000e3611000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000001d80c49bbbcd1c0911346656b529df9e5c2f783d0000000000000000000000000000000000000000000000000000000000000012a6e3c06415539f92823a18ba63e1c0303040c4892970a0d1e3a27663d7583b33000000000000000000000000000000000000000000000000000000000000000100000000000000000000000012e605bc104e93b45e1ad99f9e555f659051c2bb0000000000000000000000000000000000000000000000000000000000000012a6e3c06415539f92823a18ba63e1c0303040c4892970a0d1e3a27663d7583b33", - "orderHash": "0x557147dd0daa80d5beff0023fe6a3505469b2b8c4406ce1ab873e1a652572dd4", - "owner": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", - "outputs": [ - { - "id": "0x49f6b665c395c7b975caa2fc167cb5119981bbb86798bcaf3c4570153d09dfcf", - "owner": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", - "vaultId": "75486334982066122983501547829219246999490818941767825330875804445439814023987", - "balance": "987000000000000000", - "token": { - "id": "0x12e605bc104e93b45e1ad99f9e555f659051c2bb", - "address": "0x12e605bc104e93b45e1ad99f9e555f659051c2bb", - "name": "Staked FLR", - "symbol": "sFLR", - "decimals": "18" - }, - "orderbook": { - "id": "0xcee8cd002f151a536394e564b84076c41bbbcd4d" - }, - "ordersAsOutput": [ - { - "id": "0x1a69eeb7970d3c8d5776493327fb262e31fc880c9cc4a951607418a7963d9fa1", - "orderHash": "0x557147dd0daa80d5beff0023fe6a3505469b2b8c4406ce1ab873e1a652572dd4", - "active": true - } - ], - "ordersAsInput": [], - "balanceChanges": [ - { - "__typename": "deposit", - "data": { - "id": "0x1bf9c93f8ac04810e733b61a7d5dabba66fc1a47235e6ab027e76c9758a2a9e8", - "__typename": "Deposit", - "amount": "1000000000000000000", - "newVaultBalance": "1000000000000000000", - "oldVaultBalance": "0", - "vault": { - "id": "0x49f6b665c395c7b975caa2fc167cb5119981bbb86798bcaf3c4570153d09dfcf", - "vault_id": "75486334982066122983501547829219246999490818941767825330875804445439814023987", - "token": { - "id": "0x12e605bc104e93b45e1ad99f9e555f659051c2bb", - "address": "0x12e605bc104e93b45e1ad99f9e555f659051c2bb", - "name": "Staked FLR", - "symbol": "sFLR", - "decimals": "18" - } - }, - "timestamp": "1739448802", - "transaction": { - "id": "0xb5d715bc74b7a7f2aac8cca544c1c95e209ed4113b82269ac3285142324bc6af", - "from": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", - "blockNumber": "37432554", - "timestamp": "1739448802" - }, - "orderbook": { - "id": "0xcee8cd002f151a536394e564b84076c41bbbcd4d" - } - } - }, - { - "__typename": "withdrawal", - "data": { - "id": "0x252f6727a7a9bf1047cd9764351e9a2514140c5664589b0e5ecc7f9a4c69329c", - "__typename": "Withdrawal", - "amount": "-11000000000000000", - "newVaultBalance": "987000000000000000", - "oldVaultBalance": "998000000000000000", - "vault": { - "id": "0x49f6b665c395c7b975caa2fc167cb5119981bbb86798bcaf3c4570153d09dfcf", - "vault_id": "75486334982066122983501547829219246999490818941767825330875804445439814023987", - "token": { - "id": "0x12e605bc104e93b45e1ad99f9e555f659051c2bb", - "address": "0x12e605bc104e93b45e1ad99f9e555f659051c2bb", - "name": "Staked FLR", - "symbol": "sFLR", - "decimals": "18" - } - }, - "timestamp": "1739460802", - "transaction": { - "id": "0xf4052dcf0a9ef208be249822c002bf656d273b4583e92928066fd8fb0a67c3f0", - "from": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", - "blockNumber": "37439233", - "timestamp": "1739460802" - }, - "orderbook": { - "id": "0xcee8cd002f151a536394e564b84076c41bbbcd4d" - } - } - }, - { - "__typename": "withdrawal", - "data": { - "id": "0x3b272ce8735a1778d584ed2d49532d571a815909b8f89b2d7d2c6744fcf7cb7c", - "__typename": "Withdrawal", - "amount": "-1000000000000000", - "newVaultBalance": "998000000000000000", - "oldVaultBalance": "999000000000000000", - "vault": { - "id": "0x49f6b665c395c7b975caa2fc167cb5119981bbb86798bcaf3c4570153d09dfcf", - "vault_id": "75486334982066122983501547829219246999490818941767825330875804445439814023987", - "token": { - "id": "0x12e605bc104e93b45e1ad99f9e555f659051c2bb", - "address": "0x12e605bc104e93b45e1ad99f9e555f659051c2bb", - "name": "Staked FLR", - "symbol": "sFLR", - "decimals": "18" - } - }, - "timestamp": "1739460777", - "transaction": { - "id": "0xe3e1be9b3e11420de1f1d34f460c14d8688183b78b2dbcfd9b45560b553e451a", - "from": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", - "blockNumber": "37439219", - "timestamp": "1739460777" - }, - "orderbook": { - "id": "0xcee8cd002f151a536394e564b84076c41bbbcd4d" - } - } - }, - { - "__typename": "withdrawal", - "data": { - "id": "0x9d19a7aa2486c2640669eb04c8c4ed3e11073a04767d6dcfc3468ae12f695849", - "__typename": "Withdrawal", - "amount": "-1000000000000000", - "newVaultBalance": "999000000000000000", - "oldVaultBalance": "1000000000000000000", - "vault": { - "id": "0x49f6b665c395c7b975caa2fc167cb5119981bbb86798bcaf3c4570153d09dfcf", - "vault_id": "75486334982066122983501547829219246999490818941767825330875804445439814023987", - "token": { - "id": "0x12e605bc104e93b45e1ad99f9e555f659051c2bb", - "address": "0x12e605bc104e93b45e1ad99f9e555f659051c2bb", - "name": "Staked FLR", - "symbol": "sFLR", - "decimals": "18" - } - }, - "timestamp": "1739460481", - "transaction": { - "id": "0x3bf239fb20fed202f04da468cc62d762390ab5f80b67b477565f740277f94df3", - "from": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", - "blockNumber": "37439068", - "timestamp": "1739460481" - }, - "orderbook": { - "id": "0xcee8cd002f151a536394e564b84076c41bbbcd4d" - } - } - } - ] - } - ], - "inputs": [ - { - "id": "0x538830b4f8cc03840cea5af799dc532be4363a3ee8f4c6123dbff7a0acc86dac", - "owner": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", - "vaultId": "75486334982066122983501547829219246999490818941767825330875804445439814023987", - "balance": "797990000000000000", - "token": { - "id": "0x1d80c49bbbcd1c0911346656b529df9e5c2f783d", - "address": "0x1d80c49bbbcd1c0911346656b529df9e5c2f783d", - "name": "Wrapped Flare", - "symbol": "WFLR", - "decimals": "18" - }, - "orderbook": { - "id": "0xcee8cd002f151a536394e564b84076c41bbbcd4d" - }, - "ordersAsOutput": [], - "ordersAsInput": [ - { - "id": "0x1a69eeb7970d3c8d5776493327fb262e31fc880c9cc4a951607418a7963d9fa1", - "orderHash": "0x557147dd0daa80d5beff0023fe6a3505469b2b8c4406ce1ab873e1a652572dd4", - "active": true - } - ], - "balanceChanges": [ - { - "__typename": "withdrawal", - "data": { - "id": "0x3c8de8385099c2f7775cb4695af43d7e38863ae9442402d73f70ebf865da1c4c", - "__typename": "Withdrawal", - "amount": "-2000000000000000", - "newVaultBalance": "797990000000000000", - "oldVaultBalance": "799990000000000000", - "vault": { - "id": "0x538830b4f8cc03840cea5af799dc532be4363a3ee8f4c6123dbff7a0acc86dac", - "vault_id": "75486334982066122983501547829219246999490818941767825330875804445439814023987", - "token": { - "id": "0x1d80c49bbbcd1c0911346656b529df9e5c2f783d", - "address": "0x1d80c49bbbcd1c0911346656b529df9e5c2f783d", - "name": "Wrapped Flare", - "symbol": "WFLR", - "decimals": "18" - } - }, - "timestamp": "1739460781", - "transaction": { - "id": "0x6198a5fdf46f37f336bbd8615c18757f3a83ead6ec63ad02d865d46feb284310", - "from": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", - "blockNumber": "37439221", - "timestamp": "1739460781" - }, - "orderbook": { - "id": "0xcee8cd002f151a536394e564b84076c41bbbcd4d" - } - } - }, - { - "__typename": "withdrawal", - "data": { - "id": "0x7616be6722758517786fdcd94549ce0172d7d34fd411b5778ee0667cd1b1bdba", - "__typename": "Withdrawal", - "amount": "-10000000000000", - "newVaultBalance": "999990000000000000", - "oldVaultBalance": "1000000000000000000", - "vault": { - "id": "0x538830b4f8cc03840cea5af799dc532be4363a3ee8f4c6123dbff7a0acc86dac", - "vault_id": "75486334982066122983501547829219246999490818941767825330875804445439814023987", - "token": { - "id": "0x1d80c49bbbcd1c0911346656b529df9e5c2f783d", - "address": "0x1d80c49bbbcd1c0911346656b529df9e5c2f783d", - "name": "Wrapped Flare", - "symbol": "WFLR", - "decimals": "18" - } - }, - "timestamp": "1739460415", - "transaction": { - "id": "0x8562f41d7d4a8af98ed9db1fbb9575f759846edfab0c4310fc2962b93c5eac7d", - "from": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", - "blockNumber": "37439034", - "timestamp": "1739460415" - }, - "orderbook": { - "id": "0xcee8cd002f151a536394e564b84076c41bbbcd4d" - } - } - }, - { - "__typename": "withdrawal", - "data": { - "id": "0x8e0c007bc831906b8b327be965e6aded6f5b8bc4905823b3047dcd2a69f01c83", - "__typename": "Withdrawal", - "amount": "-200000000000000000", - "newVaultBalance": "799990000000000000", - "oldVaultBalance": "999990000000000000", - "vault": { - "id": "0x538830b4f8cc03840cea5af799dc532be4363a3ee8f4c6123dbff7a0acc86dac", - "vault_id": "75486334982066122983501547829219246999490818941767825330875804445439814023987", - "token": { - "id": "0x1d80c49bbbcd1c0911346656b529df9e5c2f783d", - "address": "0x1d80c49bbbcd1c0911346656b529df9e5c2f783d", - "name": "Wrapped Flare", - "symbol": "WFLR", - "decimals": "18" - } - }, - "timestamp": "1739460627", - "transaction": { - "id": "0xb330355574bd73c72d61b102ba7d23a0e07d677cb97e71db4495d0472587649b", - "from": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", - "blockNumber": "37439143", - "timestamp": "1739460627" - }, - "orderbook": { - "id": "0xcee8cd002f151a536394e564b84076c41bbbcd4d" - } - } - }, - { - "__typename": "deposit", - "data": { - "id": "0xcc853bdf3784e8c2e2ac9a43bdc9a2e56cc0d880a10ae8d25c3d675f6d114e74", - "__typename": "Deposit", - "amount": "1000000000000000000", - "newVaultBalance": "1000000000000000000", - "oldVaultBalance": "0", - "vault": { - "id": "0x538830b4f8cc03840cea5af799dc532be4363a3ee8f4c6123dbff7a0acc86dac", - "vault_id": "75486334982066122983501547829219246999490818941767825330875804445439814023987", - "token": { - "id": "0x1d80c49bbbcd1c0911346656b529df9e5c2f783d", - "address": "0x1d80c49bbbcd1c0911346656b529df9e5c2f783d", - "name": "Wrapped Flare", - "symbol": "WFLR", - "decimals": "18" - } - }, - "timestamp": "1739460078", - "transaction": { - "id": "0x1f628ccbe37c1395b81c25cc1d9bfef6266d9782c093e1c42bab225335fe8ba0", - "from": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", - "blockNumber": "37438849", - "timestamp": "1739460078" - }, - "orderbook": { - "id": "0xcee8cd002f151a536394e564b84076c41bbbcd4d" - } - } - } - ] - } - ], - "orderbook": { - "id": "0xcee8cd002f151a536394e564b84076c41bbbcd4d" - }, - "active": true, - "timestampAdded": "1739448802", - "meta": "0xff0a89c674ee7874a300590a932f2a20302e2063616c63756c6174652d696f202a2f200a7573696e672d776f7264732d66726f6d20307846653234313143446131393344394534653833413563323334433746643332303130313838336143203078393135453336656638383239343138313633353662433337313844663836383035344638363861440a616d6f756e742d65706f6368730a74726164652d65706f6368733a63616c6c3c323e28292c0a6d61782d6f75747075743a2063616c6c3c333e28616d6f756e742d65706f6368732074726164652d65706f636873292c0a696f3a2063616c6c3c343e2874726164652d65706f636873292c0a3a63616c6c3c353e28696f293b0a0a2f2a20312e2068616e646c652d696f202a2f200a6d696e2d616d6f756e743a206d756c283120302e39292c0a3a656e7375726528677265617465722d7468616e2d6f722d657175616c2d746f286f75747075742d7661756c742d64656372656173652829206d696e2d616d6f756e742920224d696e20747261646520616d6f756e742e22292c0a757365643a206765742868617368286f726465722d6861736828292022616d6f756e742d757365642229292c0a3a7365742868617368286f726465722d6861736828292022616d6f756e742d757365642229206164642875736564206f75747075742d7661756c742d6465637265617365282929293b0a0a2f2a20322e206765742d65706f6368202a2f200a696e697469616c2d74696d653a2063616c6c3c363e28292c0a6c6173742d74696d65205f3a2063616c6c3c373e28292c0a6475726174696f6e3a20737562286e6f77282920616e79286c6173742d74696d6520696e697469616c2d74696d6529292c0a746f74616c2d6475726174696f6e3a20737562286e6f77282920696e697469616c2d74696d65292c0a726174696f2d667265657a652d616d6f756e742d65706f6368733a2064697628312031292c0a726174696f2d667265657a652d74726164652d65706f6368733a206d756c28726174696f2d667265657a652d616d6f756e742d65706f63687320646976283630203138303029292c0a616d6f756e742d65706f6368733a2064697628746f74616c2d6475726174696f6e203630292c0a74726164652d65706f6368733a2073617475726174696e672d73756228646976286475726174696f6e20313830302920726174696f2d667265657a652d74726164652d65706f636873293b0a0a2f2a20332e20616d6f756e742d666f722d65706f6368202a2f200a616d6f756e742d65706f6368730a74726164652d65706f6368733a2c0a746f74616c2d617661696c61626c653a206c696e6561722d67726f7774682830203120616d6f756e742d65706f636873292c0a757365643a206765742868617368286f726465722d6861736828292022616d6f756e742d757365642229292c0a756e757365643a2073756228746f74616c2d617661696c61626c652075736564292c0a64656361793a2063616c6c3c383e2874726164652d65706f636873292c0a7368792d64656361793a20657665727928677265617465722d7468616e2874726164652d65706f63687320302e303529206465636179292c0a7661726961626c652d636f6d706f6e656e743a2073756228312031292c0a7461726765742d616d6f756e743a206164642831206d756c287661726961626c652d636f6d706f6e656e74207368792d646563617929292c0a6361707065642d756e757365643a206d696e28756e75736564207461726765742d616d6f756e74293b0a0a2f2a20342e20696f2d666f722d65706f6368202a2f200a65706f63683a2c0a6c6173742d696f3a2063616c6c3c373e28292c0a6d61782d6e6578742d74726164653a20616e79286d756c286c6173742d696f20312e3031292063616c6c3c393e2829292c0a626173656c696e652d6e6578742d74726164653a206d756c286c6173742d696f2030292c0a7265616c2d626173656c696e653a206d617828626173656c696e652d6e6578742d74726164652063616c6c3c393e2829292c0a7661726961626c652d636f6d706f6e656e743a2073617475726174696e672d737562286d61782d6e6578742d7472616465207265616c2d626173656c696e65292c0a61626f76652d626173656c696e653a206d756c287661726961626c652d636f6d706f6e656e742063616c6c3c383e2865706f636829292c0a5f3a20616464287265616c2d626173656c696e652061626f76652d626173656c696e65293b0a0a2f2a20352e207365742d6c6173742d7472616465202a2f200a6c6173742d696f3a2c0a3a7365742868617368286f726465722d68617368282920226c6173742d74726164652d74696d652229206e6f772829292c0a3a7365742868617368286f726465722d68617368282920226c6173742d74726164652d696f2229206c6173742d696f293b0a0a2f2a20362e206765742d696e697469616c2d74696d65202a2f200a5f3a6765742868617368286f726465722d6861736828292022696e697469616c2d74696d652229293b0a0a2f2a20372e206765742d6c6173742d7472616465202a2f200a6c6173742d74696d653a6765742868617368286f726465722d68617368282920226c6173742d74726164652d74696d652229292c0a6c6173742d696f3a6765742868617368286f726465722d68617368282920226c6173742d74726164652d696f2229293b0a0a2f2a20382e2068616c666c696665202a2f200a65706f63683a2c0a2f2a2a0a202a20536872696e6b696e6720746865206d756c7469706c696572206c696b6520746869730a202a207468656e206170706c79696e672069742031302074696d657320616c6c6f777320666f720a202a2062657474657220707265636973696f6e207768656e206d61782d696f2d726174696f0a202a2069732076657279206c617267652c20652e672e207e31653130206f72207e316532302b0a202a0a202a205468697320776f726b7320626563617573652060706f77657260206c6f7365730a202a20707265636973696f6e206f6e20626173652060302e3560207768656e207468650a202a206578706f6e656e74206973206c6172676520616e642063616e206576656e20676f0a202a20746f20603060207768696c652074686520696f2d726174696f206973207374696c6c0a202a206c617267652e2042657474657220746f206b65657020746865206d756c7469706c6965720a202a2068696768657220707265636973696f6e20616e642064726f702074686520696f2d726174696f0a202a20736d6f6f74686c7920666f72206173206c6f6e672061732077652063616e2e0a202a2f0a6d756c7469706c6965723a0a2020706f77657228302e35206469762865706f636820313029292c0a76616c3a0a20206d756c280a202020206d756c7469706c6965720a202020206d756c7469706c6965720a202020206d756c7469706c6965720a202020206d756c7469706c6965720a202020206d756c7469706c6965720a202020206d756c7469706c6965720a202020206d756c7469706c6965720a202020206d756c7469706c6965720a202020206d756c7469706c6965720a202020206d756c7469706c6965720a2020293b0a0a2f2a20392e2073666c722d626173656c696e652d696e76202a2f200a5f3a20696e762873666c722d65786368616e67652d726174652829293b011bff13109e41336ff20278186170706c69636174696f6e2f6f637465742d73747265616d", - "addEvents": [ - { - "transaction": { - "id": "0xb5d715bc74b7a7f2aac8cca544c1c95e209ed4113b82269ac3285142324bc6af", - "from": "0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11", - "blockNumber": "37432554", - "timestamp": "1739448802" - } - } - ], - "trades": [] - } -} + transaction: { + id: '0xb5d715bc74b7a7f2aac8cca544c1c95e209ed4113b82269ac3285142324bc6af', + from: '0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11', + blockNumber: '37432554', + timestamp: '1739448802' + }, + order: { + id: '0x1a69eeb7970d3c8d5776493327fb262e31fc880c9cc4a951607418a7963d9fa1', + orderBytes: + '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000f08bcbce72f62c95dcb7c07dcb5ed26acfcfbc1100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000640392c489ef67afdc348209452c338ea5ba2b6152b936e152f610d05e1a20621a40000000000000000000000005fb33d710f8b58de4c9fdec703b5c2487a5219d600000000000000000000000084c6e7f5a1e5dd89594cc25bef4722a1b8871ae60000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000049d000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000c7d713b49da0000914d696e20747261646520616d6f756e742e00000000000000000000000000008b616d6f756e742d75736564000000000000000000000000000000000000000000000000000000000000000000000000000000000000000340aad21b3b70000000000000000000000000000000000000000000000000006194049f30f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1a2bc2ec500000000000000000000000000000000000000000000000000000e043da6172500008f6c6173742d74726164652d74696d65000000000000000000000000000000008d6c6173742d74726164652d696f0000000000000000000000000000000000008c696e697469616c2d74696d650000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f05b59d3b200000000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000020000915e36ef882941816356bc3718df868054f868ad000000000000000000000000000000000000000000000000000000000000027d0a00000024007400e0015801b401e001f40218025c080500040b20000200100001001000000b120003001000010b110004001000030b0100051305000201100001011000003d120000011000020010000003100404211200001d02000001100003031000010c1200004911000003100404001000012b12000001100003031000010c1200004a0200001a0b00090b1000060b20000700100000001000011b1200001a10000047120000001000001a1000004712000001100000011000002e12000001100005011000042e120000001000053d12000001100004001000042e1200000010000601100005001000032e120000481200011d0b020a0010000001100000011000062713000001100003031000010c12000049110000001000030010000247120000001000010b110008001000050110000700100001201200001f12000001100000011000004712000000100006001000073d120000011000002b12000000100008001000043b120000160901080b1000070b10000901100008001000013d1200001b12000001100006001000013d1200000b100009001000033a120000001000040010000248120001001000000b110008001000053d12000000100006001000042b1200000a0401011a10000001100009031000010c1200004a020000001000000110000a031000010c1200004a020000040200010110000b031000010c120000491100000803000201100009031000010c120000491100000110000a031000010c12000049110000100c01030110000d001000002e1200000110000c3e120000001000010010000100100001001000010010000100100001001000010010000100100001001000013d1a0000020100010210000e3611000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000001d80c49bbbcd1c0911346656b529df9e5c2f783d0000000000000000000000000000000000000000000000000000000000000012a6e3c06415539f92823a18ba63e1c0303040c4892970a0d1e3a27663d7583b33000000000000000000000000000000000000000000000000000000000000000100000000000000000000000012e605bc104e93b45e1ad99f9e555f659051c2bb0000000000000000000000000000000000000000000000000000000000000012a6e3c06415539f92823a18ba63e1c0303040c4892970a0d1e3a27663d7583b33', + orderHash: '0x557147dd0daa80d5beff0023fe6a3505469b2b8c4406ce1ab873e1a652572dd4', + owner: '0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11', + outputs: [ + { + id: '0x49f6b665c395c7b975caa2fc167cb5119981bbb86798bcaf3c4570153d09dfcf', + owner: '0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11', + vaultId: '75486334982066122983501547829219246999490818941767825330875804445439814023987', + balance: '987000000000000000', + token: { + id: '0x12e605bc104e93b45e1ad99f9e555f659051c2bb', + address: '0x12e605bc104e93b45e1ad99f9e555f659051c2bb', + name: 'Staked FLR', + symbol: 'sFLR', + decimals: '18' + }, + orderbook: { + id: '0xcee8cd002f151a536394e564b84076c41bbbcd4d' + }, + ordersAsOutput: [ + { + id: '0x1a69eeb7970d3c8d5776493327fb262e31fc880c9cc4a951607418a7963d9fa1', + orderHash: '0x557147dd0daa80d5beff0023fe6a3505469b2b8c4406ce1ab873e1a652572dd4', + active: true + } + ], + ordersAsInput: [], + balanceChanges: [ + { + __typename: 'deposit', + data: { + id: '0x1bf9c93f8ac04810e733b61a7d5dabba66fc1a47235e6ab027e76c9758a2a9e8', + __typename: 'Deposit', + amount: '1000000000000000000', + newVaultBalance: '1000000000000000000', + oldVaultBalance: '0', + vault: { + id: '0x49f6b665c395c7b975caa2fc167cb5119981bbb86798bcaf3c4570153d09dfcf', + vault_id: + '75486334982066122983501547829219246999490818941767825330875804445439814023987', + token: { + id: '0x12e605bc104e93b45e1ad99f9e555f659051c2bb', + address: '0x12e605bc104e93b45e1ad99f9e555f659051c2bb', + name: 'Staked FLR', + symbol: 'sFLR', + decimals: '18' + } + }, + timestamp: '1739448802', + transaction: { + id: '0xb5d715bc74b7a7f2aac8cca544c1c95e209ed4113b82269ac3285142324bc6af', + from: '0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11', + blockNumber: '37432554', + timestamp: '1739448802' + }, + orderbook: { + id: '0xcee8cd002f151a536394e564b84076c41bbbcd4d' + } + } + }, + { + __typename: 'withdrawal', + data: { + id: '0x252f6727a7a9bf1047cd9764351e9a2514140c5664589b0e5ecc7f9a4c69329c', + __typename: 'Withdrawal', + amount: '-11000000000000000', + newVaultBalance: '987000000000000000', + oldVaultBalance: '998000000000000000', + vault: { + id: '0x49f6b665c395c7b975caa2fc167cb5119981bbb86798bcaf3c4570153d09dfcf', + vault_id: + '75486334982066122983501547829219246999490818941767825330875804445439814023987', + token: { + id: '0x12e605bc104e93b45e1ad99f9e555f659051c2bb', + address: '0x12e605bc104e93b45e1ad99f9e555f659051c2bb', + name: 'Staked FLR', + symbol: 'sFLR', + decimals: '18' + } + }, + timestamp: '1739460802', + transaction: { + id: '0xf4052dcf0a9ef208be249822c002bf656d273b4583e92928066fd8fb0a67c3f0', + from: '0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11', + blockNumber: '37439233', + timestamp: '1739460802' + }, + orderbook: { + id: '0xcee8cd002f151a536394e564b84076c41bbbcd4d' + } + } + }, + { + __typename: 'withdrawal', + data: { + id: '0x3b272ce8735a1778d584ed2d49532d571a815909b8f89b2d7d2c6744fcf7cb7c', + __typename: 'Withdrawal', + amount: '-1000000000000000', + newVaultBalance: '998000000000000000', + oldVaultBalance: '999000000000000000', + vault: { + id: '0x49f6b665c395c7b975caa2fc167cb5119981bbb86798bcaf3c4570153d09dfcf', + vault_id: + '75486334982066122983501547829219246999490818941767825330875804445439814023987', + token: { + id: '0x12e605bc104e93b45e1ad99f9e555f659051c2bb', + address: '0x12e605bc104e93b45e1ad99f9e555f659051c2bb', + name: 'Staked FLR', + symbol: 'sFLR', + decimals: '18' + } + }, + timestamp: '1739460777', + transaction: { + id: '0xe3e1be9b3e11420de1f1d34f460c14d8688183b78b2dbcfd9b45560b553e451a', + from: '0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11', + blockNumber: '37439219', + timestamp: '1739460777' + }, + orderbook: { + id: '0xcee8cd002f151a536394e564b84076c41bbbcd4d' + } + } + }, + { + __typename: 'withdrawal', + data: { + id: '0x9d19a7aa2486c2640669eb04c8c4ed3e11073a04767d6dcfc3468ae12f695849', + __typename: 'Withdrawal', + amount: '-1000000000000000', + newVaultBalance: '999000000000000000', + oldVaultBalance: '1000000000000000000', + vault: { + id: '0x49f6b665c395c7b975caa2fc167cb5119981bbb86798bcaf3c4570153d09dfcf', + vault_id: + '75486334982066122983501547829219246999490818941767825330875804445439814023987', + token: { + id: '0x12e605bc104e93b45e1ad99f9e555f659051c2bb', + address: '0x12e605bc104e93b45e1ad99f9e555f659051c2bb', + name: 'Staked FLR', + symbol: 'sFLR', + decimals: '18' + } + }, + timestamp: '1739460481', + transaction: { + id: '0x3bf239fb20fed202f04da468cc62d762390ab5f80b67b477565f740277f94df3', + from: '0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11', + blockNumber: '37439068', + timestamp: '1739460481' + }, + orderbook: { + id: '0xcee8cd002f151a536394e564b84076c41bbbcd4d' + } + } + } + ] + } + ], + inputs: [ + { + id: '0x538830b4f8cc03840cea5af799dc532be4363a3ee8f4c6123dbff7a0acc86dac', + owner: '0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11', + vaultId: '75486334982066122983501547829219246999490818941767825330875804445439814023987', + balance: '797990000000000000', + token: { + id: '0x1d80c49bbbcd1c0911346656b529df9e5c2f783d', + address: '0x1d80c49bbbcd1c0911346656b529df9e5c2f783d', + name: 'Wrapped Flare', + symbol: 'WFLR', + decimals: '18' + }, + orderbook: { + id: '0xcee8cd002f151a536394e564b84076c41bbbcd4d' + }, + ordersAsOutput: [], + ordersAsInput: [ + { + id: '0x1a69eeb7970d3c8d5776493327fb262e31fc880c9cc4a951607418a7963d9fa1', + orderHash: '0x557147dd0daa80d5beff0023fe6a3505469b2b8c4406ce1ab873e1a652572dd4', + active: true + } + ], + balanceChanges: [ + { + __typename: 'withdrawal', + data: { + id: '0x3c8de8385099c2f7775cb4695af43d7e38863ae9442402d73f70ebf865da1c4c', + __typename: 'Withdrawal', + amount: '-2000000000000000', + newVaultBalance: '797990000000000000', + oldVaultBalance: '799990000000000000', + vault: { + id: '0x538830b4f8cc03840cea5af799dc532be4363a3ee8f4c6123dbff7a0acc86dac', + vault_id: + '75486334982066122983501547829219246999490818941767825330875804445439814023987', + token: { + id: '0x1d80c49bbbcd1c0911346656b529df9e5c2f783d', + address: '0x1d80c49bbbcd1c0911346656b529df9e5c2f783d', + name: 'Wrapped Flare', + symbol: 'WFLR', + decimals: '18' + } + }, + timestamp: '1739460781', + transaction: { + id: '0x6198a5fdf46f37f336bbd8615c18757f3a83ead6ec63ad02d865d46feb284310', + from: '0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11', + blockNumber: '37439221', + timestamp: '1739460781' + }, + orderbook: { + id: '0xcee8cd002f151a536394e564b84076c41bbbcd4d' + } + } + }, + { + __typename: 'withdrawal', + data: { + id: '0x7616be6722758517786fdcd94549ce0172d7d34fd411b5778ee0667cd1b1bdba', + __typename: 'Withdrawal', + amount: '-10000000000000', + newVaultBalance: '999990000000000000', + oldVaultBalance: '1000000000000000000', + vault: { + id: '0x538830b4f8cc03840cea5af799dc532be4363a3ee8f4c6123dbff7a0acc86dac', + vault_id: + '75486334982066122983501547829219246999490818941767825330875804445439814023987', + token: { + id: '0x1d80c49bbbcd1c0911346656b529df9e5c2f783d', + address: '0x1d80c49bbbcd1c0911346656b529df9e5c2f783d', + name: 'Wrapped Flare', + symbol: 'WFLR', + decimals: '18' + } + }, + timestamp: '1739460415', + transaction: { + id: '0x8562f41d7d4a8af98ed9db1fbb9575f759846edfab0c4310fc2962b93c5eac7d', + from: '0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11', + blockNumber: '37439034', + timestamp: '1739460415' + }, + orderbook: { + id: '0xcee8cd002f151a536394e564b84076c41bbbcd4d' + } + } + }, + { + __typename: 'withdrawal', + data: { + id: '0x8e0c007bc831906b8b327be965e6aded6f5b8bc4905823b3047dcd2a69f01c83', + __typename: 'Withdrawal', + amount: '-200000000000000000', + newVaultBalance: '799990000000000000', + oldVaultBalance: '999990000000000000', + vault: { + id: '0x538830b4f8cc03840cea5af799dc532be4363a3ee8f4c6123dbff7a0acc86dac', + vault_id: + '75486334982066122983501547829219246999490818941767825330875804445439814023987', + token: { + id: '0x1d80c49bbbcd1c0911346656b529df9e5c2f783d', + address: '0x1d80c49bbbcd1c0911346656b529df9e5c2f783d', + name: 'Wrapped Flare', + symbol: 'WFLR', + decimals: '18' + } + }, + timestamp: '1739460627', + transaction: { + id: '0xb330355574bd73c72d61b102ba7d23a0e07d677cb97e71db4495d0472587649b', + from: '0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11', + blockNumber: '37439143', + timestamp: '1739460627' + }, + orderbook: { + id: '0xcee8cd002f151a536394e564b84076c41bbbcd4d' + } + } + }, + { + __typename: 'deposit', + data: { + id: '0xcc853bdf3784e8c2e2ac9a43bdc9a2e56cc0d880a10ae8d25c3d675f6d114e74', + __typename: 'Deposit', + amount: '1000000000000000000', + newVaultBalance: '1000000000000000000', + oldVaultBalance: '0', + vault: { + id: '0x538830b4f8cc03840cea5af799dc532be4363a3ee8f4c6123dbff7a0acc86dac', + vault_id: + '75486334982066122983501547829219246999490818941767825330875804445439814023987', + token: { + id: '0x1d80c49bbbcd1c0911346656b529df9e5c2f783d', + address: '0x1d80c49bbbcd1c0911346656b529df9e5c2f783d', + name: 'Wrapped Flare', + symbol: 'WFLR', + decimals: '18' + } + }, + timestamp: '1739460078', + transaction: { + id: '0x1f628ccbe37c1395b81c25cc1d9bfef6266d9782c093e1c42bab225335fe8ba0', + from: '0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11', + blockNumber: '37438849', + timestamp: '1739460078' + }, + orderbook: { + id: '0xcee8cd002f151a536394e564b84076c41bbbcd4d' + } + } + } + ] + } + ], + orderbook: { + id: '0xcee8cd002f151a536394e564b84076c41bbbcd4d' + }, + active: true, + timestampAdded: '1739448802', + meta: '0xff0a89c674ee7874a300590a932f2a20302e2063616c63756c6174652d696f202a2f200a7573696e672d776f7264732d66726f6d20307846653234313143446131393344394534653833413563323334433746643332303130313838336143203078393135453336656638383239343138313633353662433337313844663836383035344638363861440a616d6f756e742d65706f6368730a74726164652d65706f6368733a63616c6c3c323e28292c0a6d61782d6f75747075743a2063616c6c3c333e28616d6f756e742d65706f6368732074726164652d65706f636873292c0a696f3a2063616c6c3c343e2874726164652d65706f636873292c0a3a63616c6c3c353e28696f293b0a0a2f2a20312e2068616e646c652d696f202a2f200a6d696e2d616d6f756e743a206d756c283120302e39292c0a3a656e7375726528677265617465722d7468616e2d6f722d657175616c2d746f286f75747075742d7661756c742d64656372656173652829206d696e2d616d6f756e742920224d696e20747261646520616d6f756e742e22292c0a757365643a206765742868617368286f726465722d6861736828292022616d6f756e742d757365642229292c0a3a7365742868617368286f726465722d6861736828292022616d6f756e742d757365642229206164642875736564206f75747075742d7661756c742d6465637265617365282929293b0a0a2f2a20322e206765742d65706f6368202a2f200a696e697469616c2d74696d653a2063616c6c3c363e28292c0a6c6173742d74696d65205f3a2063616c6c3c373e28292c0a6475726174696f6e3a20737562286e6f77282920616e79286c6173742d74696d6520696e697469616c2d74696d6529292c0a746f74616c2d6475726174696f6e3a20737562286e6f77282920696e697469616c2d74696d65292c0a726174696f2d667265657a652d616d6f756e742d65706f6368733a2064697628312031292c0a726174696f2d667265657a652d74726164652d65706f6368733a206d756c28726174696f2d667265657a652d616d6f756e742d65706f63687320646976283630203138303029292c0a616d6f756e742d65706f6368733a2064697628746f74616c2d6475726174696f6e203630292c0a74726164652d65706f6368733a2073617475726174696e672d73756228646976286475726174696f6e20313830302920726174696f2d667265657a652d74726164652d65706f636873293b0a0a2f2a20332e20616d6f756e742d666f722d65706f6368202a2f200a616d6f756e742d65706f6368730a74726164652d65706f6368733a2c0a746f74616c2d617661696c61626c653a206c696e6561722d67726f7774682830203120616d6f756e742d65706f636873292c0a757365643a206765742868617368286f726465722d6861736828292022616d6f756e742d757365642229292c0a756e757365643a2073756228746f74616c2d617661696c61626c652075736564292c0a64656361793a2063616c6c3c383e2874726164652d65706f636873292c0a7368792d64656361793a20657665727928677265617465722d7468616e2874726164652d65706f63687320302e303529206465636179292c0a7661726961626c652d636f6d706f6e656e743a2073756228312031292c0a7461726765742d616d6f756e743a206164642831206d756c287661726961626c652d636f6d706f6e656e74207368792d646563617929292c0a6361707065642d756e757365643a206d696e28756e75736564207461726765742d616d6f756e74293b0a0a2f2a20342e20696f2d666f722d65706f6368202a2f200a65706f63683a2c0a6c6173742d696f3a2063616c6c3c373e28292c0a6d61782d6e6578742d74726164653a20616e79286d756c286c6173742d696f20312e3031292063616c6c3c393e2829292c0a626173656c696e652d6e6578742d74726164653a206d756c286c6173742d696f2030292c0a7265616c2d626173656c696e653a206d617828626173656c696e652d6e6578742d74726164652063616c6c3c393e2829292c0a7661726961626c652d636f6d706f6e656e743a2073617475726174696e672d737562286d61782d6e6578742d7472616465207265616c2d626173656c696e65292c0a61626f76652d626173656c696e653a206d756c287661726961626c652d636f6d706f6e656e742063616c6c3c383e2865706f636829292c0a5f3a20616464287265616c2d626173656c696e652061626f76652d626173656c696e65293b0a0a2f2a20352e207365742d6c6173742d7472616465202a2f200a6c6173742d696f3a2c0a3a7365742868617368286f726465722d68617368282920226c6173742d74726164652d74696d652229206e6f772829292c0a3a7365742868617368286f726465722d68617368282920226c6173742d74726164652d696f2229206c6173742d696f293b0a0a2f2a20362e206765742d696e697469616c2d74696d65202a2f200a5f3a6765742868617368286f726465722d6861736828292022696e697469616c2d74696d652229293b0a0a2f2a20372e206765742d6c6173742d7472616465202a2f200a6c6173742d74696d653a6765742868617368286f726465722d68617368282920226c6173742d74726164652d74696d652229292c0a6c6173742d696f3a6765742868617368286f726465722d68617368282920226c6173742d74726164652d696f2229293b0a0a2f2a20382e2068616c666c696665202a2f200a65706f63683a2c0a2f2a2a0a202a20536872696e6b696e6720746865206d756c7469706c696572206c696b6520746869730a202a207468656e206170706c79696e672069742031302074696d657320616c6c6f777320666f720a202a2062657474657220707265636973696f6e207768656e206d61782d696f2d726174696f0a202a2069732076657279206c617267652c20652e672e207e31653130206f72207e316532302b0a202a0a202a205468697320776f726b7320626563617573652060706f77657260206c6f7365730a202a20707265636973696f6e206f6e20626173652060302e3560207768656e207468650a202a206578706f6e656e74206973206c6172676520616e642063616e206576656e20676f0a202a20746f20603060207768696c652074686520696f2d726174696f206973207374696c6c0a202a206c617267652e2042657474657220746f206b65657020746865206d756c7469706c6965720a202a2068696768657220707265636973696f6e20616e642064726f702074686520696f2d726174696f0a202a20736d6f6f74686c7920666f72206173206c6f6e672061732077652063616e2e0a202a2f0a6d756c7469706c6965723a0a2020706f77657228302e35206469762865706f636820313029292c0a76616c3a0a20206d756c280a202020206d756c7469706c6965720a202020206d756c7469706c6965720a202020206d756c7469706c6965720a202020206d756c7469706c6965720a202020206d756c7469706c6965720a202020206d756c7469706c6965720a202020206d756c7469706c6965720a202020206d756c7469706c6965720a202020206d756c7469706c6965720a202020206d756c7469706c6965720a2020293b0a0a2f2a20392e2073666c722d626173656c696e652d696e76202a2f200a5f3a20696e762873666c722d65786368616e67652d726174652829293b011bff13109e41336ff20278186170706c69636174696f6e2f6f637465742d73747265616d', + addEvents: [ + { + transaction: { + id: '0xb5d715bc74b7a7f2aac8cca544c1c95e209ed4113b82269ac3285142324bc6af', + from: '0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11', + blockNumber: '37432554', + timestamp: '1739448802' + } + } + ], + trades: [] + } +}; -const addOrders: AddOrderWithOrder[] = [mockAddOrder] +const addOrders: AddOrderWithOrder[] = [mockAddOrder]; describe('Rain Orderbook JS API Package Bindgen Tests - Add Order', async function () { const mockServer = getLocal(); @@ -357,14 +366,14 @@ describe('Rain Orderbook JS API Package Bindgen Tests - Add Order', async functi it('should fetch add orders for a transaction', async () => { await mockServer .forPost('/sg1') - .thenReply(200, JSON.stringify({ data: { add_orders: addOrders } })); + .thenReply(200, JSON.stringify({ data: { addOrders: addOrders } })); try { const result: AddOrderWithOrder[] = await getTransactionAddOrders( mockServer.url + '/sg1', transaction1.id ); - assert.deepEqual(result, addOrders); + assert.equal(result[0].order.id, mockAddOrder.order.id); } catch (e) { assert.fail('expected to resolve, but failed' + (e instanceof Error ? e.message : String(e))); } diff --git a/packages/ui-components/src/lib/components/deployment/DeploymentPage.svelte b/packages/ui-components/src/lib/components/deployment/DeploymentPage.svelte index 8eeb45d60..0a80d8d27 100644 --- a/packages/ui-components/src/lib/components/deployment/DeploymentPage.svelte +++ b/packages/ui-components/src/lib/components/deployment/DeploymentPage.svelte @@ -24,6 +24,7 @@ orderbookAddress: Hex; chainId: number; subgraphUrl: string; + network: string; }) => void; export let settings: Writable; export let handleUpdateGuiState: (gui: DotrainOrderGui) => void; diff --git a/packages/ui-components/src/lib/components/deployment/DeploymentSteps.svelte b/packages/ui-components/src/lib/components/deployment/DeploymentSteps.svelte index 3edbf88b2..3258c4a48 100644 --- a/packages/ui-components/src/lib/components/deployment/DeploymentSteps.svelte +++ b/packages/ui-components/src/lib/components/deployment/DeploymentSteps.svelte @@ -52,6 +52,7 @@ orderbookAddress: Hex; chainId: number; subgraphUrl: string; + network: string; }) => void; export let handleUpdateGuiState: (gui: DotrainOrderGui) => void; let selectTokens: SelectTokens | null = null; @@ -165,7 +166,8 @@ async function handleAddOrder() { try { - if (!gui || !$wagmiConfig) return; + if (!gui || !$wagmiConfig || !networkKey) + throw new Error(DeploymentStepErrors.ADD_ORDER_FAILED); const { address } = getAccount($wagmiConfig); if (!address) return; let approvals = await gui.generateApprovalCalldatas(address); @@ -190,7 +192,8 @@ deploymentCalldata, orderbookAddress, chainId, - subgraphUrl + subgraphUrl, + network: networkKey }); } catch (e) { error = DeploymentStepErrors.ADD_ORDER_FAILED; diff --git a/packages/ui-components/src/lib/stores/transactionStore.ts b/packages/ui-components/src/lib/stores/transactionStore.ts index 48cbab921..c5715db68 100644 --- a/packages/ui-components/src/lib/stores/transactionStore.ts +++ b/packages/ui-components/src/lib/stores/transactionStore.ts @@ -11,7 +11,7 @@ import type { Vault, WithdrawCalldataResult } from '@rainlanguage/orderbook/js_api'; -import { getTransaction } from '@rainlanguage/orderbook/js_api'; +import { getTransaction, getTransactionAddOrders } from '@rainlanguage/orderbook/js_api'; export const ADDRESS_ZERO = '0x0000000000000000000000000000000000000000'; export const ONE = BigInt('1000000000000000000'); @@ -50,6 +50,7 @@ export type DeploymentTransactionArgs = { orderbookAddress: Hex; chainId: number; subgraphUrl: string; + network: string; }; export type DepositOrWithdrawTransactionArgs = { @@ -76,6 +77,8 @@ export type TransactionState = { data: null; functionName: string; message: string; + newOrderId: string; + network: string; }; export type TransactionStore = { @@ -97,7 +100,9 @@ const initialState: TransactionState = { hash: '', data: null, functionName: '', - message: '' + message: '', + newOrderId: '', + network: '' }; const transactionStore = () => { @@ -135,6 +140,31 @@ const transactionStore = () => { }, 1000); }; + const awaitNewOrderIndexing = async (subgraphUrl: string, txHash: string, network: string) => { + update((state) => ({ + ...state, + status: TransactionStatus.PENDING_SUBGRAPH, + message: 'Waiting for new Order to be indexed...' + })); + + let attempts = 0; + const interval: NodeJS.Timeout = setInterval(async () => { + attempts++; + + const addOrders = await getTransactionAddOrders(subgraphUrl, txHash); + if (addOrders.length > 0) { + clearInterval(interval); + return transactionSuccess(txHash, 'New order indexed successfully.', addOrders[0].order.id, network); + } else if (attempts >= 5) { + update((state) => ({ + ...state, + message: 'The subgraph took too long to respond. Please check again later.', + })); + clearInterval(interval); + } + }, 1000); + }; + const checkingWalletAllowance = (message?: string) => update((state) => ({ ...state, @@ -161,12 +191,14 @@ const transactionStore = () => { status: TransactionStatus.PENDING_DEPLOYMENT, message: 'Confirming transaction...' })); - const transactionSuccess = (hash: string, message?: string) => { + const transactionSuccess = (hash: string, message?: string, newOrderId?: string, network?: string) => { update((state) => ({ ...state, status: TransactionStatus.SUCCESS, hash: hash, - message: message || '' + message: message || '', + newOrderId: newOrderId || '', + network: network || '' })); }; const transactionError = (message: TransactionErrorMessage, hash?: string) => @@ -183,7 +215,8 @@ const transactionStore = () => { deploymentCalldata, orderbookAddress, chainId, - subgraphUrl + subgraphUrl, + network }: DeploymentTransactionArgs) => { try { await switchChain(config, { chainId }); @@ -224,11 +257,7 @@ const transactionStore = () => { try { awaitDeployTx(hash); await waitForTransactionReceipt(config, { hash }); - if (subgraphUrl === '') { - return transactionSuccess(hash, `Strategy deployed successfully.`); - } else { - return awaitTransactionIndexing(subgraphUrl, hash, `Strategy deployed successfully.`); - } + return awaitNewOrderIndexing(subgraphUrl, hash, network); } catch { return transactionError(TransactionErrorMessage.DEPLOYMENT_FAILED); } diff --git a/packages/webapp/src/lib/components/DeployModal.svelte b/packages/webapp/src/lib/components/DeployModal.svelte index 2111651d6..6c0e5d9fb 100644 --- a/packages/webapp/src/lib/components/DeployModal.svelte +++ b/packages/webapp/src/lib/components/DeployModal.svelte @@ -14,6 +14,7 @@ export let orderbookAddress: Hex; export let chainId: number; export let subgraphUrl: string; + export let network: string; const messages = { success: 'Your strategy was successfully deployed.', @@ -27,7 +28,8 @@ deploymentCalldata, orderbookAddress, chainId, - subgraphUrl + subgraphUrl, + network }); diff --git a/packages/webapp/src/lib/components/TransactionModal.svelte b/packages/webapp/src/lib/components/TransactionModal.svelte index 3f7460d79..4b1dbe03e 100644 --- a/packages/webapp/src/lib/components/TransactionModal.svelte +++ b/packages/webapp/src/lib/components/TransactionModal.svelte @@ -58,18 +58,26 @@ > {messages.success}

- {#if $transactionStore.message} -

- {$transactionStore.message} -

- {/if} +
+ {#if $transactionStore.message} +

+ {$transactionStore.message} +

+ {/if} + {#if $transactionStore.newOrderId && $transactionStore.network} + + {/if} +

{:else}
diff --git a/packages/webapp/src/lib/services/modal.ts b/packages/webapp/src/lib/services/modal.ts index 3342ea98d..636535191 100644 --- a/packages/webapp/src/lib/services/modal.ts +++ b/packages/webapp/src/lib/services/modal.ts @@ -16,6 +16,7 @@ export type DeployModalProps = { orderbookAddress: Hex; chainId: number; subgraphUrl: string; + network: string; }; export type DepositOrWithdrawModalProps = { From 42cc66e32277d411e49828cadc51d49a82b914fd Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Fri, 14 Feb 2025 13:28:40 +0100 Subject: [PATCH 09/23] add new order indexing --- .../src/lib/stores/transactionStore.ts | 12 ++++++++---- .../src/lib/components/TransactionModal.svelte | 16 +++++++++------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/packages/ui-components/src/lib/stores/transactionStore.ts b/packages/ui-components/src/lib/stores/transactionStore.ts index c5715db68..423b4a9bc 100644 --- a/packages/ui-components/src/lib/stores/transactionStore.ts +++ b/packages/ui-components/src/lib/stores/transactionStore.ts @@ -146,21 +146,25 @@ const transactionStore = () => { status: TransactionStatus.PENDING_SUBGRAPH, message: 'Waiting for new Order to be indexed...' })); + console.log(network) let attempts = 0; const interval: NodeJS.Timeout = setInterval(async () => { attempts++; + console.log("attempts", attempts) const addOrders = await getTransactionAddOrders(subgraphUrl, txHash); - if (addOrders.length > 0) { - clearInterval(interval); - return transactionSuccess(txHash, 'New order indexed successfully.', addOrders[0].order.id, network); - } else if (attempts >= 5) { + if (attempts >= 10) { update((state) => ({ ...state, message: 'The subgraph took too long to respond. Please check again later.', })); clearInterval(interval); + return transactionError(TransactionErrorMessage.TIMEOUT); + } else if (addOrders.length > 0) { + console.log(addOrders) + clearInterval(interval); + return transactionSuccess(txHash, '', addOrders[0].order.id, network); } }, 1000); }; diff --git a/packages/webapp/src/lib/components/TransactionModal.svelte b/packages/webapp/src/lib/components/TransactionModal.svelte index 4b1dbe03e..5a15cdd7a 100644 --- a/packages/webapp/src/lib/components/TransactionModal.svelte +++ b/packages/webapp/src/lib/components/TransactionModal.svelte @@ -66,15 +66,17 @@ {$transactionStore.message}

{/if} - {#if $transactionStore.newOrderId && $transactionStore.network} - - {/if} + +
+ {#if $transactionStore.newOrderId && $transactionStore.network} + + + + {/if} + +
- {:else}
Date: Fri, 14 Feb 2025 13:29:33 +0100 Subject: [PATCH 10/23] remove button --- packages/webapp/src/routes/deploy/+page.svelte | 9 --------- 1 file changed, 9 deletions(-) diff --git a/packages/webapp/src/routes/deploy/+page.svelte b/packages/webapp/src/routes/deploy/+page.svelte index 7241fc780..c005d1ba9 100644 --- a/packages/webapp/src/routes/deploy/+page.svelte +++ b/packages/webapp/src/routes/deploy/+page.svelte @@ -43,14 +43,6 @@ // add the registry url to the url params window.history.pushState({}, '', window.location.pathname + '?registry=' + $registryUrl); }; - - const handleGetAddOrders = async () => { - const addOrders = await getTransactionAddOrders( - 'https://api.goldsky.com/api/public/project_clv14x04y9kzi01saerx7bxpg/subgraphs/ob4-flare/2024-12-13-9dc7/gn', - '0xb5d715bc74b7a7f2aac8cca544c1c95e209ed4113b82269ac3285142324bc6af' - ); - console.log(addOrders); - }; @@ -60,7 +52,6 @@ -
{#if advancedMode} From e992e9c4f8efeebb24d5c8fdb3bf1ce83d448904 Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Fri, 14 Feb 2025 13:32:35 +0100 Subject: [PATCH 11/23] close modal --- packages/webapp/src/lib/components/TransactionModal.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webapp/src/lib/components/TransactionModal.svelte b/packages/webapp/src/lib/components/TransactionModal.svelte index 5a15cdd7a..04bd8731e 100644 --- a/packages/webapp/src/lib/components/TransactionModal.svelte +++ b/packages/webapp/src/lib/components/TransactionModal.svelte @@ -70,7 +70,7 @@
{#if $transactionStore.newOrderId && $transactionStore.network} - + {/if} From cd300fe5479d6be9c6e9aee6b00db981d72be47f Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Fri, 14 Feb 2025 14:15:10 +0100 Subject: [PATCH 12/23] deploy tx --- .../src/__tests__/transactionStore.test.ts | 21 ++++++++++++------- .../src/lib/stores/transactionStore.ts | 19 ++++++++++------- .../lib/components/TransactionModal.svelte | 2 +- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/packages/ui-components/src/__tests__/transactionStore.test.ts b/packages/ui-components/src/__tests__/transactionStore.test.ts index 666acc68a..4ce078091 100644 --- a/packages/ui-components/src/__tests__/transactionStore.test.ts +++ b/packages/ui-components/src/__tests__/transactionStore.test.ts @@ -106,7 +106,8 @@ describe('transactionStore', () => { deploymentCalldata: mockDeploymentCalldata, orderbookAddress: mockOrderbookAddress as `0x${string}`, chainId: 1, - subgraphUrl: 'test.com' + subgraphUrl: 'test.com', + network: 'flare' }); expect(get(transactionStore).status).toBe(TransactionStatus.PENDING_SUBGRAPH); @@ -122,7 +123,8 @@ describe('transactionStore', () => { deploymentCalldata: '0x', orderbookAddress: mockOrderbookAddress as `0x${string}`, chainId: 1, - subgraphUrl: 'test.com' + subgraphUrl: 'test.com', + network: 'flare' }); expect(get(transactionStore).status).toBe(TransactionStatus.ERROR); @@ -141,7 +143,8 @@ describe('transactionStore', () => { deploymentCalldata: '0x', orderbookAddress: mockOrderbookAddress as `0x${string}`, chainId: 1, - subgraphUrl: 'test.com' + subgraphUrl: 'test.com', + network: 'flare' }); expect(get(transactionStore).status).toBe(TransactionStatus.ERROR); @@ -161,7 +164,8 @@ describe('transactionStore', () => { deploymentCalldata: '0x', orderbookAddress: mockOrderbookAddress as `0x${string}`, chainId: 1, - subgraphUrl: 'test.com' + subgraphUrl: 'test.com', + network: 'flare' }); expect(get(transactionStore).status).toBe(TransactionStatus.ERROR); @@ -178,7 +182,8 @@ describe('transactionStore', () => { deploymentCalldata: '0x', orderbookAddress: mockOrderbookAddress as `0x${string}`, chainId: 1, - subgraphUrl: 'test.com' + subgraphUrl: 'test.com', + network: 'flare' }); expect(get(transactionStore).status).toBe(TransactionStatus.ERROR); @@ -196,7 +201,8 @@ describe('transactionStore', () => { deploymentCalldata: '0x', orderbookAddress: mockOrderbookAddress as `0x${string}`, chainId: 1, - subgraphUrl: 'test.com' + subgraphUrl: 'test.com', + network: 'flare' }); expect(get(transactionStore).status).toBe(TransactionStatus.ERROR); @@ -222,7 +228,8 @@ describe('transactionStore', () => { deploymentCalldata: '0x', orderbookAddress: mockOrderbookAddress as `0x${string}`, chainId: 1, - subgraphUrl: 'test.com' + subgraphUrl: 'test.com', + network: 'flare' }); expect(sendTransaction).toHaveBeenCalledTimes(3); // 2 approvals + 1 deployment diff --git a/packages/ui-components/src/lib/stores/transactionStore.ts b/packages/ui-components/src/lib/stores/transactionStore.ts index 423b4a9bc..909a348d5 100644 --- a/packages/ui-components/src/lib/stores/transactionStore.ts +++ b/packages/ui-components/src/lib/stores/transactionStore.ts @@ -146,23 +146,23 @@ const transactionStore = () => { status: TransactionStatus.PENDING_SUBGRAPH, message: 'Waiting for new Order to be indexed...' })); - console.log(network) + console.log(network); let attempts = 0; const interval: NodeJS.Timeout = setInterval(async () => { attempts++; - console.log("attempts", attempts) + console.log('attempts', attempts); const addOrders = await getTransactionAddOrders(subgraphUrl, txHash); if (attempts >= 10) { update((state) => ({ ...state, - message: 'The subgraph took too long to respond. Please check again later.', + message: 'The subgraph took too long to respond. Please check again later.' })); clearInterval(interval); return transactionError(TransactionErrorMessage.TIMEOUT); } else if (addOrders.length > 0) { - console.log(addOrders) + console.log(addOrders); clearInterval(interval); return transactionSuccess(txHash, '', addOrders[0].order.id, network); } @@ -195,7 +195,12 @@ const transactionStore = () => { status: TransactionStatus.PENDING_DEPLOYMENT, message: 'Confirming transaction...' })); - const transactionSuccess = (hash: string, message?: string, newOrderId?: string, network?: string) => { + const transactionSuccess = ( + hash: string, + message?: string, + newOrderId?: string, + network?: string + ) => { update((state) => ({ ...state, status: TransactionStatus.SUCCESS, @@ -220,7 +225,7 @@ const transactionStore = () => { orderbookAddress, chainId, subgraphUrl, - network + network }: DeploymentTransactionArgs) => { try { await switchChain(config, { chainId }); @@ -261,7 +266,7 @@ const transactionStore = () => { try { awaitDeployTx(hash); await waitForTransactionReceipt(config, { hash }); - return awaitNewOrderIndexing(subgraphUrl, hash, network); + return awaitNewOrderIndexing(subgraphUrl, hash, network); } catch { return transactionError(TransactionErrorMessage.DEPLOYMENT_FAILED); } diff --git a/packages/webapp/src/lib/components/TransactionModal.svelte b/packages/webapp/src/lib/components/TransactionModal.svelte index 04bd8731e..182fe024a 100644 --- a/packages/webapp/src/lib/components/TransactionModal.svelte +++ b/packages/webapp/src/lib/components/TransactionModal.svelte @@ -79,7 +79,7 @@
{:else}
From 27458d9f8e6ca1a62ca8c15dc6b70a42ccc05bc4 Mon Sep 17 00:00:00 2001 From: findolor Date: Fri, 14 Feb 2025 17:58:43 +0300 Subject: [PATCH 13/23] convert set vault ids to work with optional and empty strings --- crates/js_api/src/gui/order_operations.rs | 2 +- crates/js_api/src/gui/state_management.rs | 12 ++++----- crates/settings/src/order.rs | 33 ++++++++++++++++------- 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/crates/js_api/src/gui/order_operations.rs b/crates/js_api/src/gui/order_operations.rs index bbe4fbcf0..22f8b7122 100644 --- a/crates/js_api/src/gui/order_operations.rs +++ b/crates/js_api/src/gui/order_operations.rs @@ -310,7 +310,7 @@ impl DotrainOrderGui { &mut self, is_input: bool, index: u8, - vault_id: String, + vault_id: Option, ) -> Result<(), GuiError> { let deployment = self.get_current_deployment()?; self.dotrain_order diff --git a/crates/js_api/src/gui/state_management.rs b/crates/js_api/src/gui/state_management.rs index e1293c5a4..4bd12feca 100644 --- a/crates/js_api/src/gui/state_management.rs +++ b/crates/js_api/src/gui/state_management.rs @@ -220,13 +220,11 @@ impl DotrainOrderGui { &state.selected_deployment, )?; for ((is_input, index), vault_id) in state.vault_ids { - if let Some(vault_id) = vault_id { - dotrain_order_gui - .dotrain_order - .dotrain_yaml() - .get_order(&order_key) - .and_then(|mut order| order.update_vault_id(is_input, index, vault_id))?; - } + dotrain_order_gui + .dotrain_order + .dotrain_yaml() + .get_order(&order_key) + .and_then(|mut order| order.update_vault_id(is_input, index, vault_id))?; } Ok(dotrain_order_gui) diff --git a/crates/settings/src/order.rs b/crates/settings/src/order.rs index 767e2344f..7e3658531 100644 --- a/crates/settings/src/order.rs +++ b/crates/settings/src/order.rs @@ -69,9 +69,15 @@ impl Order { &mut self, is_input: bool, index: u8, - vault_id: String, + vault_id: Option, ) -> Result { - let new_vault_id = Order::validate_vault_id(&vault_id)?; + let new_vault_id = vault_id.and_then(|v| { + if v.is_empty() { + None + } else { + Some(Order::validate_vault_id(&v).ok()?) + } + }); let mut document = self .document @@ -91,14 +97,23 @@ impl Order { { if let Some(item) = vec.get_mut(index as usize) { if let StrictYaml::Hash(ref mut item_hash) = item { - item_hash.insert( - StrictYaml::String("vault-id".to_string()), - StrictYaml::String(vault_id.to_string()), - ); - if is_input { - self.inputs[index as usize].vault_id = Some(new_vault_id); + if let Some(vault_id) = new_vault_id { + item_hash.insert( + StrictYaml::String("vault-id".to_string()), + StrictYaml::String(vault_id.to_string()), + ); + if is_input { + self.inputs[index as usize].vault_id = Some(vault_id); + } else { + self.outputs[index as usize].vault_id = Some(vault_id); + } } else { - self.outputs[index as usize].vault_id = Some(new_vault_id); + item_hash.remove(&StrictYaml::String("vault-id".to_string())); + if is_input { + self.inputs[index as usize].vault_id = None; + } else { + self.outputs[index as usize].vault_id = None; + } } } else { return Err(YamlError::Field { From 7cd74d1e0a706d9c2b7e4de6c498eb0fa8d96bf4 Mon Sep 17 00:00:00 2001 From: findolor Date: Fri, 14 Feb 2025 17:58:48 +0300 Subject: [PATCH 14/23] update tests --- packages/orderbook/test/js_api/gui.test.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/orderbook/test/js_api/gui.test.ts b/packages/orderbook/test/js_api/gui.test.ts index 192a24c70..59e17a70d 100644 --- a/packages/orderbook/test/js_api/gui.test.ts +++ b/packages/orderbook/test/js_api/gui.test.ts @@ -1200,6 +1200,12 @@ ${dotrainWithoutVaultIds}`; const vaultIds: IOVaultIds = gui.getVaultIds(); assert.equal(vaultIds.get('input')?.[0], '0x123'); assert.equal(vaultIds.get('output')?.[0], '0x234'); + + gui.setVaultId(true, 0, undefined); + assert.equal(gui.getVaultIds().get('input')?.[0], undefined); + + gui.setVaultId(false, 0, ''); + assert.equal(gui.getVaultIds().get('output')?.[0], undefined); }); it('should skip deposits with zero amount for deposit calldata', async () => { From aaf2ff1cba8047f7e9b06dc550c9851c557ee9e1 Mon Sep 17 00:00:00 2001 From: findolor Date: Fri, 14 Feb 2025 18:58:18 +0300 Subject: [PATCH 15/23] return error on invalid values --- crates/settings/src/order.rs | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/crates/settings/src/order.rs b/crates/settings/src/order.rs index 7e3658531..4cc6aeeff 100644 --- a/crates/settings/src/order.rs +++ b/crates/settings/src/order.rs @@ -71,13 +71,30 @@ impl Order { index: u8, vault_id: Option, ) -> Result { - let new_vault_id = vault_id.and_then(|v| { + let new_vault_id = if let Some(ref v) = vault_id { if v.is_empty() { None } else { - Some(Order::validate_vault_id(&v).ok()?) + match Order::validate_vault_id(&v) { + Ok(id) => Some(id), + Err(e) => { + return Err(YamlError::Field { + kind: FieldErrorKind::InvalidValue { + field: "vault-id".to_string(), + reason: e.to_string(), + }, + location: format!( + "index '{index}' of {} in order '{}'", + if is_input { "inputs" } else { "outputs" }, + self.key + ), + }); + } + } } - }); + } else { + None + }; let mut document = self .document @@ -782,7 +799,7 @@ pub enum ParseOrderConfigSourceError { expected: String, found: String, }, - #[error("Failed to parse vault {}", 0)] + #[error("Failed to parse vault id")] VaultParseError(#[from] alloy::primitives::ruint::ParseError), } From 4afe167c7c22c0c59d7fd9c306a1c1fd1e851e48 Mon Sep 17 00:00:00 2001 From: findolor Date: Fri, 14 Feb 2025 18:58:23 +0300 Subject: [PATCH 16/23] update tests --- crates/settings/src/yaml/dotrain.rs | 12 ++++++++---- packages/orderbook/test/js_api/gui.test.ts | 4 ++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/crates/settings/src/yaml/dotrain.rs b/crates/settings/src/yaml/dotrain.rs index 74f0a8dc1..0181a7dd1 100644 --- a/crates/settings/src/yaml/dotrain.rs +++ b/crates/settings/src/yaml/dotrain.rs @@ -548,9 +548,11 @@ mod tests { assert!(order.inputs[0].vault_id.is_none()); assert!(order.outputs[0].vault_id.is_none()); - let mut updated_order = order.update_vault_id(true, 0, "1".to_string()).unwrap(); + let mut updated_order = order + .update_vault_id(true, 0, Some("1".to_string())) + .unwrap(); let updated_order = updated_order - .update_vault_id(false, 0, "11".to_string()) + .update_vault_id(false, 0, Some("11".to_string())) .unwrap(); assert_eq!(updated_order.inputs[0].vault_id, Some(U256::from(1))); @@ -560,9 +562,11 @@ mod tests { assert_eq!(order.inputs[0].vault_id, Some(U256::from(1))); assert_eq!(order.outputs[0].vault_id, Some(U256::from(11))); - let mut updated_order = order.update_vault_id(true, 0, "3".to_string()).unwrap(); + let mut updated_order = order + .update_vault_id(true, 0, Some("3".to_string())) + .unwrap(); let updated_order = updated_order - .update_vault_id(false, 0, "33".to_string()) + .update_vault_id(false, 0, Some("33".to_string())) .unwrap(); assert_eq!(updated_order.inputs[0].vault_id, Some(U256::from(3))); assert_eq!(updated_order.outputs[0].vault_id, Some(U256::from(33))); diff --git a/packages/orderbook/test/js_api/gui.test.ts b/packages/orderbook/test/js_api/gui.test.ts index 59e17a70d..11ed141c1 100644 --- a/packages/orderbook/test/js_api/gui.test.ts +++ b/packages/orderbook/test/js_api/gui.test.ts @@ -1206,6 +1206,10 @@ ${dotrainWithoutVaultIds}`; gui.setVaultId(false, 0, ''); assert.equal(gui.getVaultIds().get('output')?.[0], undefined); + + expect(() => gui.setVaultId(true, 0, 'test')).toThrow( + "Invalid value for field 'vault-id': Failed to parse vault id in index '0' of inputs in order 'some-order'" + ); }); it('should skip deposits with zero amount for deposit calldata', async () => { From 86d1f043c09d499dfadfd8d5f4219c3fdfd78b26 Mon Sep 17 00:00:00 2001 From: findolor Date: Fri, 14 Feb 2025 18:58:32 +0300 Subject: [PATCH 17/23] update UI to show error --- .../src/lib/components/deployment/TokenIOInput.svelte | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/ui-components/src/lib/components/deployment/TokenIOInput.svelte b/packages/ui-components/src/lib/components/deployment/TokenIOInput.svelte index 886ccbc6e..2037f7536 100644 --- a/packages/ui-components/src/lib/components/deployment/TokenIOInput.svelte +++ b/packages/ui-components/src/lib/components/deployment/TokenIOInput.svelte @@ -42,8 +42,13 @@ const handleInput = async () => { const isInput = label === 'Input'; - gui?.setVaultId(isInput, i, inputValue); - handleUpdateGuiState(gui); + try { + gui?.setVaultId(isInput, i, inputValue); + handleUpdateGuiState(gui); + } catch (e) { + const errorMessage = (e as Error).message ? (e as Error).message : 'Error setting vault ID.'; + error = errorMessage; + } }; $: if (vault.token?.key) { From 20057f9cfbb7723357bb4c9b21771fc7c86536a9 Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Fri, 14 Feb 2025 17:20:26 +0100 Subject: [PATCH 18/23] rm logs etc --- .../src/__tests__/transactionStore.test.ts | 61 +++++++++++++++++-- .../components/charts/LightweightChart.svelte | 3 - .../lib/components/detail/OrderDetail.svelte | 1 - .../src/lib/stores/transactionStore.ts | 10 +-- 4 files changed, 59 insertions(+), 16 deletions(-) diff --git a/packages/ui-components/src/__tests__/transactionStore.test.ts b/packages/ui-components/src/__tests__/transactionStore.test.ts index 908c335e0..7fd5e29c6 100644 --- a/packages/ui-components/src/__tests__/transactionStore.test.ts +++ b/packages/ui-components/src/__tests__/transactionStore.test.ts @@ -5,7 +5,7 @@ import transactionStore, { TransactionErrorMessage } from '../lib/stores/transactionStore'; import { waitForTransactionReceipt, sendTransaction, switchChain, type Config } from '@wagmi/core'; -import { getTransaction } from '@rainlanguage/orderbook/js_api'; +import { getTransaction, getTransactionAddOrders } from '@rainlanguage/orderbook/js_api'; import { waitFor } from '@testing-library/svelte'; vi.mock('@wagmi/core', () => ({ @@ -15,7 +15,8 @@ vi.mock('@wagmi/core', () => ({ })); vi.mock('@rainlanguage/orderbook/js_api', () => ({ - getTransaction: vi.fn() + getTransaction: vi.fn(), + getTransactionAddOrders: vi.fn() })); describe('transactionStore', () => { @@ -30,7 +31,8 @@ describe('transactionStore', () => { awaitApprovalTx, transactionSuccess, transactionError, - awaitTransactionIndexing + awaitTransactionIndexing, + awaitNewOrderIndexing } = transactionStore; beforeEach(() => { @@ -49,7 +51,9 @@ describe('transactionStore', () => { hash: '', data: null, functionName: '', - message: '' + message: '', + newOrderId: '', + network: '' }); }); @@ -236,7 +240,7 @@ describe('transactionStore', () => { expect(get(transactionStore).status).toBe(TransactionStatus.PENDING_SUBGRAPH); }); - it.only('should handle waiting for subgraph indexing', async () => { + it('should handle successful waiting for subgraph indexing', async () => { const mockSubgraphUrl = 'test.com'; const mockTxHash = 'mockHash'; const mockSuccessMessage = 'Success! Transaction confirmed'; @@ -274,4 +278,51 @@ describe('transactionStore', () => { vi.useRealTimers(); }); + + it('should handle successful new order indexing', async () => { + const mockSubgraphUrl = 'test.com'; + const mockTxHash = 'mockHash'; + const mockNetwork = 'flare'; + const mockOrderId = 'order123'; + + (getTransactionAddOrders as Mock).mockResolvedValue([{ + order: { + id: mockOrderId + } + }]); + + await awaitNewOrderIndexing(mockSubgraphUrl, mockTxHash, mockNetwork); + + await waitFor(() => { + expect(get(transactionStore).status).toBe(TransactionStatus.SUCCESS); + expect(get(transactionStore).hash).toBe(mockTxHash); + expect(get(transactionStore).newOrderId).toBe(mockOrderId); + expect(get(transactionStore).network).toBe(mockNetwork); + }); + }); + + it('should handle new order indexing timeout', async () => { + vi.useFakeTimers(); + const mockSubgraphUrl = 'test.com'; + const mockTxHash = 'mockHash'; + const mockNetwork = 'flare'; + + (getTransactionAddOrders as Mock).mockResolvedValue([]); + + const indexingPromise = awaitNewOrderIndexing(mockSubgraphUrl, mockTxHash, mockNetwork); + + expect(get(transactionStore).status).toBe(TransactionStatus.PENDING_SUBGRAPH); + expect(get(transactionStore).message).toBe('Waiting for new Order to be indexed...'); + + await vi.advanceTimersByTime(10000); + await indexingPromise; + + expect(get(transactionStore).status).toBe(TransactionStatus.ERROR); + expect(get(transactionStore).message).toBe( + 'The subgraph took too long to respond. Please check again later.' + ); + expect(get(transactionStore).error).toBe(TransactionErrorMessage.TIMEOUT); + + vi.useRealTimers(); + }); }); diff --git a/packages/ui-components/src/lib/components/charts/LightweightChart.svelte b/packages/ui-components/src/lib/components/charts/LightweightChart.svelte index 918a2a807..8713fd332 100644 --- a/packages/ui-components/src/lib/components/charts/LightweightChart.svelte +++ b/packages/ui-components/src/lib/components/charts/LightweightChart.svelte @@ -72,17 +72,14 @@ } function updateNewDataPoints() { - console.log('updating new data points'); if (series === undefined || data.length === 0) return; // If this is the first data set, set all the data if (previousDataLength === 0) { series.setData(data); - console.log(data.length, previousDataLength); } // If we have new data points, only update the new ones else if (data.length > previousDataLength) { - console.log('new data points!'); const newPoints = data.slice(previousDataLength); newPoints.forEach((point) => { series?.update(point); diff --git a/packages/ui-components/src/lib/components/detail/OrderDetail.svelte b/packages/ui-components/src/lib/components/detail/OrderDetail.svelte index b5c3e07b0..b61ac8ec9 100644 --- a/packages/ui-components/src/lib/components/detail/OrderDetail.svelte +++ b/packages/ui-components/src/lib/components/detail/OrderDetail.svelte @@ -75,7 +75,6 @@ $: orderDetailQuery = createQuery({ queryKey: [id, QKEY_ORDER + id], queryFn: () => { - console.log('querying order', id); return getOrder(subgraphUrl, id); }, enabled: !!subgraphUrl diff --git a/packages/ui-components/src/lib/stores/transactionStore.ts b/packages/ui-components/src/lib/stores/transactionStore.ts index 7ee74dd65..4a188c72f 100644 --- a/packages/ui-components/src/lib/stores/transactionStore.ts +++ b/packages/ui-components/src/lib/stores/transactionStore.ts @@ -128,7 +128,6 @@ const transactionStore = () => { newTx = await getTransaction(subgraphUrl, txHash); if (newTx) { - console.log("NEW TX", newTx) clearInterval(interval); transactionSuccess(txHash, successMessage); @@ -149,13 +148,10 @@ const transactionStore = () => { status: TransactionStatus.PENDING_SUBGRAPH, message: 'Waiting for new Order to be indexed...' })); - console.log(network); let attempts = 0; const interval: NodeJS.Timeout = setInterval(async () => { attempts++; - console.log('attempts', attempts); - const addOrders = await getTransactionAddOrders(subgraphUrl, txHash); if (attempts >= 10) { update((state) => ({ @@ -164,8 +160,7 @@ const transactionStore = () => { })); clearInterval(interval); return transactionError(TransactionErrorMessage.TIMEOUT); - } else if (addOrders.length > 0) { - console.log(addOrders); + } else if (addOrders?.length > 0) { clearInterval(interval); return transactionSuccess(txHash, '', addOrders[0].order.id, network); } @@ -379,7 +374,8 @@ const transactionStore = () => { awaitApprovalTx, transactionSuccess, transactionError, - awaitTransactionIndexing + awaitTransactionIndexing, + awaitNewOrderIndexing }; }; From eff3552d8fd85c47786701d68c862d942810e3ea Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Fri, 14 Feb 2025 18:50:30 +0100 Subject: [PATCH 19/23] rm logs and update props --- .../src/__tests__/OrderDetail.test.svelte | 1 + .../src/__tests__/VaultBalanceChart.test.ts | 3 ++- .../src/__tests__/transactionStore.test.ts | 14 ++++++++++---- .../src/lib/components/detail/OrderDetail.svelte | 1 + packages/webapp/src/routes/deploy/+page.svelte | 2 +- 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/packages/ui-components/src/__tests__/OrderDetail.test.svelte b/packages/ui-components/src/__tests__/OrderDetail.test.svelte index 284198db7..4281804cb 100644 --- a/packages/ui-components/src/__tests__/OrderDetail.test.svelte +++ b/packages/ui-components/src/__tests__/OrderDetail.test.svelte @@ -58,6 +58,7 @@ rpcUrl="https://example.com" query={orderDetailQuery} handleDepositOrWithdrawModal={() => {}} + subgraphUrl="https://example.com" /> diff --git a/packages/ui-components/src/__tests__/VaultBalanceChart.test.ts b/packages/ui-components/src/__tests__/VaultBalanceChart.test.ts index 4304faa75..f8847a1d4 100644 --- a/packages/ui-components/src/__tests__/VaultBalanceChart.test.ts +++ b/packages/ui-components/src/__tests__/VaultBalanceChart.test.ts @@ -42,7 +42,8 @@ test('calls getVaultBalanceChanges with correct arguments', async () => { props: { vault: mockVault, subgraphUrl: 'https://example.com', - lightweightChartsTheme: writable({}) + lightweightChartsTheme: writable({}), + id: 'vault1' }, context: new Map([['$$_queryClient', queryClient]]) }); diff --git a/packages/ui-components/src/__tests__/transactionStore.test.ts b/packages/ui-components/src/__tests__/transactionStore.test.ts index 9ae497f95..acfa0983b 100644 --- a/packages/ui-components/src/__tests__/transactionStore.test.ts +++ b/packages/ui-components/src/__tests__/transactionStore.test.ts @@ -293,14 +293,20 @@ describe('transactionStore', () => { const mockNetwork = 'flare'; const mockOrderId = 'order123'; - (getTransactionAddOrders as Mock).mockResolvedValue([{ - order: { - id: mockOrderId + (getTransactionAddOrders as Mock).mockResolvedValue([ + { + order: { + id: mockOrderId + } } - }]); + ]); + + vi.useFakeTimers({ shouldAdvanceTime: true }); await awaitNewOrderIndexing(mockSubgraphUrl, mockTxHash, mockNetwork); + vi.runOnlyPendingTimers(); + await waitFor(() => { expect(get(transactionStore).status).toBe(TransactionStatus.SUCCESS); expect(get(transactionStore).hash).toBe(mockTxHash); diff --git a/packages/ui-components/src/lib/components/detail/OrderDetail.svelte b/packages/ui-components/src/lib/components/detail/OrderDetail.svelte index b61ac8ec9..f5e4d2b9b 100644 --- a/packages/ui-components/src/lib/components/detail/OrderDetail.svelte +++ b/packages/ui-components/src/lib/components/detail/OrderDetail.svelte @@ -165,6 +165,7 @@ {rpcUrl} query={orderDetailQuery} {handleDepositOrWithdrawModal} + {subgraphUrl} /> {/if} diff --git a/packages/webapp/src/routes/deploy/+page.svelte b/packages/webapp/src/routes/deploy/+page.svelte index c005d1ba9..c75112973 100644 --- a/packages/webapp/src/routes/deploy/+page.svelte +++ b/packages/webapp/src/routes/deploy/+page.svelte @@ -79,7 +79,7 @@

From 764117b026cc02d2fe6a0283c12726df16a33f45 Mon Sep 17 00:00:00 2001 From: Jamie Harding Date: Fri, 14 Feb 2025 20:58:06 +0100 Subject: [PATCH 20/23] format --- packages/webapp/src/routes/deploy/+page.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webapp/src/routes/deploy/+page.svelte b/packages/webapp/src/routes/deploy/+page.svelte index 154bfc0b1..9ed35f7a3 100644 --- a/packages/webapp/src/routes/deploy/+page.svelte +++ b/packages/webapp/src/routes/deploy/+page.svelte @@ -42,7 +42,7 @@
Strategies
-
+

Raindex empowers you to take full control of your trading strategies. All the strategies here are non-custodial, perpetual, and automated strategies built with our open-source, DeFi-native From 80e3122e7865c6aacc64e9f4bb5f9906e782fe9d Mon Sep 17 00:00:00 2001 From: findolor Date: Sat, 15 Feb 2025 11:32:41 +0300 Subject: [PATCH 21/23] fix clippy --- crates/settings/src/order.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/settings/src/order.rs b/crates/settings/src/order.rs index 4cc6aeeff..aa8832a65 100644 --- a/crates/settings/src/order.rs +++ b/crates/settings/src/order.rs @@ -75,7 +75,7 @@ impl Order { if v.is_empty() { None } else { - match Order::validate_vault_id(&v) { + match Order::validate_vault_id(v) { Ok(id) => Some(id), Err(e) => { return Err(YamlError::Field { From 1eb6a2005d3e30177b1f9367e7c832e32b8b4f33 Mon Sep 17 00:00:00 2001 From: findolor Date: Sat, 15 Feb 2025 13:10:26 +0300 Subject: [PATCH 22/23] update --- .../[strategyName]/[deploymentKey]/+layout.ts | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/packages/webapp/src/routes/deploy/[strategyName]/[deploymentKey]/+layout.ts b/packages/webapp/src/routes/deploy/[strategyName]/[deploymentKey]/+layout.ts index 0c02e66f8..f2003ee82 100644 --- a/packages/webapp/src/routes/deploy/[strategyName]/[deploymentKey]/+layout.ts +++ b/packages/webapp/src/routes/deploy/[strategyName]/[deploymentKey]/+layout.ts @@ -9,20 +9,10 @@ export const load: LayoutLoad = async ({ params, parent }) => { const { deploymentKey } = params; const { dotrain } = (await parent()) as unknown as LayoutParentData; - // Process deployments for both raw and registry strategies - const deploymentWithDetails = await DotrainOrderGui.getDeploymentDetails(dotrain); - const deployments = Array.from(deploymentWithDetails, ([key, details]) => ({ - key, - ...details - })); - - const deployment = deployments.find( - (deployment: { key: string }) => deployment.key === deploymentKey + const { name, description } = await DotrainOrderGui.getDeploymentDetail( + dotrain, + deploymentKey || '' ); - if (!deployment) { - throw new Error(`Deployment ${deploymentKey} not found`); - } - - return { deployment, dotrain }; + return { deployment: { key: deploymentKey, name, description }, dotrain }; }; From a17c0aa85acae465350ae3367a110a4037c5d57c Mon Sep 17 00:00:00 2001 From: highonhopium Date: Sat, 15 Feb 2025 18:24:58 +0000 Subject: [PATCH 23/23] error msg and advanced options check --- .../components/deployment/DeploymentSteps.svelte | 16 ++++++++++------ .../components/deployment/TokenIOInput.svelte | 1 + 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/packages/ui-components/src/lib/components/deployment/DeploymentSteps.svelte b/packages/ui-components/src/lib/components/deployment/DeploymentSteps.svelte index 84e5124e5..c22f8ae34 100644 --- a/packages/ui-components/src/lib/components/deployment/DeploymentSteps.svelte +++ b/packages/ui-components/src/lib/components/deployment/DeploymentSteps.svelte @@ -227,15 +227,19 @@ const areAllTokensSelected = async () => { if (gui) { try { - allTokensSelected = gui?.areAllTokensSelected(); + allTokensSelected = gui.areAllTokensSelected(); if (!allTokensSelected) return; - const vaultIds = gui?.getVaultIds(); - const inputVaultIds = vaultIds?.get('input'); - const outputVaultIds = vaultIds?.get('output'); // if we have deposits or vault ids set, show advanced options - const deposits = gui?.getDeposits(); - if (deposits || inputVaultIds || outputVaultIds) { + const vaultIds = gui.getVaultIds(); + const inputVaultIds = vaultIds.get('input'); + const outputVaultIds = vaultIds.get('output'); + const deposits = gui.getDeposits(); + if ( + deposits.length > 0 || + (inputVaultIds && inputVaultIds.some((v) => v)) || + (outputVaultIds && outputVaultIds.some((v) => v)) + ) { showAdvancedOptions = true; } } catch (e) { diff --git a/packages/ui-components/src/lib/components/deployment/TokenIOInput.svelte b/packages/ui-components/src/lib/components/deployment/TokenIOInput.svelte index 2037f7536..55280ee78 100644 --- a/packages/ui-components/src/lib/components/deployment/TokenIOInput.svelte +++ b/packages/ui-components/src/lib/components/deployment/TokenIOInput.svelte @@ -42,6 +42,7 @@ const handleInput = async () => { const isInput = label === 'Input'; + error = ''; try { gui?.setVaultId(isInput, i, inputValue); handleUpdateGuiState(gui);