Skip to content

Commit 8fbf7b0

Browse files
committed
refactor
1 parent bb8e962 commit 8fbf7b0

File tree

10 files changed

+330
-289
lines changed

10 files changed

+330
-289
lines changed

crates/common/src/raindex_client/vaults.rs

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -363,12 +363,13 @@ impl RaindexVault {
363363

364364
let client = self.get_orderbook_client()?;
365365
let balance_changes = client
366-
.vault_balance_changes_list_with_trade(
366+
.vault_balance_changes_list(
367367
Id::new(self.id.to_string()),
368368
SgPaginationArgs {
369369
page: page.unwrap_or(1),
370370
page_size: 1000,
371371
},
372+
None,
372373
)
373374
.await?;
374375

@@ -2493,7 +2494,8 @@ mod tests {
24932494
});
24942495
sg_server.mock(|when, then| {
24952496
when.path("/sg1")
2496-
.body_contains("SgVaultBalanceChangesListWithTradeQuery");
2497+
.body_contains("SgVaultBalanceChangesListQuery")
2498+
.body_contains("\"skip\":0");
24972499
then.status(200).json_body_obj(&json!({
24982500
"data": {
24992501
"vaultBalanceChanges": [
@@ -2529,6 +2531,16 @@ mod tests {
25292531
}
25302532
}));
25312533
});
2534+
sg_server.mock(|when, then| {
2535+
when.path("/sg1")
2536+
.body_contains("SgVaultBalanceChangesListQuery")
2537+
.body_contains("\"skip\":200");
2538+
then.status(200).json_body_obj(&json!({
2539+
"data": {
2540+
"vaultBalanceChanges": []
2541+
}
2542+
}));
2543+
});
25322544

25332545
let raindex_client = RaindexClient::new(
25342546
vec![get_test_yaml(
@@ -2660,7 +2672,8 @@ mod tests {
26602672
});
26612673
sg_server.mock(|when, then| {
26622674
when.path("/sg1")
2663-
.body_contains("SgVaultBalanceChangesListWithTradeQuery");
2675+
.body_contains("SgVaultBalanceChangesListQuery")
2676+
.body_contains("\"skip\":0");
26642677
then.status(200).json_body_obj(&json!({
26652678
"data": {
26662679
"vaultBalanceChanges": [
@@ -2696,6 +2709,16 @@ mod tests {
26962709
}
26972710
}));
26982711
});
2712+
sg_server.mock(|when, then| {
2713+
when.path("/sg1")
2714+
.body_contains("SgVaultBalanceChangesListQuery")
2715+
.body_contains("\"skip\":200");
2716+
then.status(200).json_body_obj(&json!({
2717+
"data": {
2718+
"vaultBalanceChanges": []
2719+
}
2720+
}));
2721+
});
26992722

27002723
let raindex_client = RaindexClient::new(
27012724
vec![get_test_yaml(
@@ -2745,7 +2768,8 @@ mod tests {
27452768
});
27462769
sg_server.mock(|when, then| {
27472770
when.path("/sg1")
2748-
.body_contains("SgVaultBalanceChangesListWithTradeQuery");
2771+
.body_contains("SgVaultBalanceChangesListQuery")
2772+
.body_contains("\"skip\":0");
27492773
then.status(200).json_body_obj(&json!({
27502774
"data": {
27512775
"vaultBalanceChanges": [
@@ -2781,6 +2805,16 @@ mod tests {
27812805
}
27822806
}));
27832807
});
2808+
sg_server.mock(|when, then| {
2809+
when.path("/sg1")
2810+
.body_contains("SgVaultBalanceChangesListQuery")
2811+
.body_contains("\"skip\":200");
2812+
then.status(200).json_body_obj(&json!({
2813+
"data": {
2814+
"vaultBalanceChanges": []
2815+
}
2816+
}));
2817+
});
27842818
// 6 decimals token info
27852819
sg_server.mock(|when, then| {
27862820
when.method("POST")

crates/common/src/types/error.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,6 @@ pub enum FlattenError {
2222
MissingAddEvent,
2323
#[error("Float error: {0}")]
2424
FloatError(#[from] rain_math_float::FloatError),
25+
#[error("Missing field: {0}")]
26+
MissingField(String),
2527
}

crates/common/src/types/vault_balance_change_flattened.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,41 @@ impl TryFrom<SgVaultBalanceChangeUnwrapped> for VaultBalanceChangeFlattened {
3535
}
3636
}
3737

38+
impl TryFrom<SgVaultBalanceChangeType> for VaultBalanceChangeFlattened {
39+
type Error = FlattenError;
40+
41+
fn try_from(val: SgVaultBalanceChangeType) -> Result<Self, Self::Error> {
42+
let amount_bytes = val
43+
.amount()
44+
.ok_or_else(|| FlattenError::MissingField("amount".to_string()))?;
45+
let amount = Float::from_hex(&amount_bytes.0)?;
46+
let amount_display_signed = amount.format()?;
47+
48+
let timestamp = val
49+
.timestamp()
50+
.ok_or_else(|| FlattenError::MissingField("timestamp".to_string()))?;
51+
let timestamp_display = format_bigint_timestamp_display(timestamp.0.clone())?;
52+
53+
let transaction = val
54+
.transaction()
55+
.ok_or_else(|| FlattenError::MissingField("transaction".to_string()))?;
56+
57+
let new_vault_balance = val
58+
.new_vault_balance()
59+
.ok_or_else(|| FlattenError::MissingField("new_vault_balance".to_string()))?;
60+
61+
Ok(Self {
62+
timestamp: timestamp.clone(),
63+
timestamp_display,
64+
from: transaction.from.clone(),
65+
amount: amount_bytes.clone(),
66+
amount_display_signed,
67+
change_type_display: val.typename().to_string(),
68+
balance: new_vault_balance.clone(),
69+
})
70+
}
71+
}
72+
3873
impl TryIntoCsv<VaultBalanceChangeFlattened> for Vec<VaultBalanceChangeFlattened> {}
3974

4075
#[cfg(test)]

crates/subgraph/src/orderbook_client/mod.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,7 @@ use crate::types::remove_order::{
1313
SgTransactionRemoveOrdersQuery, TransactionRemoveOrdersVariables,
1414
};
1515
use crate::types::transaction::SgTransactionDetailQuery;
16-
use crate::types::vault::{
17-
SgVaultBalanceChangesListWithTradeQuery, SgVaultDetailQuery, SgVaultsListQuery,
18-
};
16+
use crate::types::vault::{SgVaultDetailQuery, SgVaultsListQuery};
1917
use crate::vault_balance_changes_query::VaultBalanceChangesListPageQueryClient;
2018
use cynic::Id;
2119
use reqwest::Url;

crates/subgraph/src/orderbook_client/vault.rs

Lines changed: 49 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ impl OrderbookSubgraphClient {
9090
id: cynic::Id,
9191
pagination_args: SgPaginationArgs,
9292
filter_typenames: Option<&[String]>,
93-
) -> Result<Vec<SgVaultBalanceChangeUnwrapped>, OrderbookSubgraphClientError> {
93+
) -> Result<Vec<SgVaultBalanceChangeType>, OrderbookSubgraphClientError> {
9494
let pagination_vars = Self::parse_pagination_args(pagination_args);
9595
let res = self
9696
.query_paginated(
@@ -109,43 +109,20 @@ impl OrderbookSubgraphClient {
109109
if !typenames.is_empty() {
110110
return Ok(res
111111
.into_iter()
112-
.filter(|item| typenames.contains(&item.__typename))
112+
.filter(|item| typenames.contains(&item.typename().to_string()))
113113
.collect());
114114
}
115115
}
116116

117117
Ok(res)
118118
}
119119

120-
/// Fetch vault balance changes with full type information (including trade event details).
121-
/// This uses inline fragments to distinguish between TakeOrder and Clear trade types.
122-
pub async fn vault_balance_changes_list_with_trade(
123-
&self,
124-
id: cynic::Id,
125-
pagination_args: SgPaginationArgs,
126-
) -> Result<Vec<SgVaultBalanceChangeType>, OrderbookSubgraphClientError> {
127-
let pagination_vars = Self::parse_pagination_args(pagination_args);
128-
let variables = SgPaginationWithIdQueryVariables {
129-
id: SgBytes(id.inner().to_string()),
130-
skip: pagination_vars.skip,
131-
first: pagination_vars.first,
132-
};
133-
134-
let data = self
135-
.query::<SgVaultBalanceChangesListWithTradeQuery, SgPaginationWithIdQueryVariables>(
136-
variables,
137-
)
138-
.await?;
139-
140-
Ok(data.vault_balance_changes)
141-
}
142-
143120
/// Fetch all pages of vault_balance_changes_list query
144121
pub async fn vault_balance_changes_list_all(
145122
&self,
146123
id: cynic::Id,
147124
filter_typenames: Option<&[String]>,
148-
) -> Result<Vec<SgVaultBalanceChangeUnwrapped>, OrderbookSubgraphClientError> {
125+
) -> Result<Vec<SgVaultBalanceChangeType>, OrderbookSubgraphClientError> {
149126
let mut all_pages_merged = vec![];
150127
let mut page = 1;
151128

@@ -174,8 +151,7 @@ impl OrderbookSubgraphClient {
174151
mod tests {
175152
use super::*;
176153
use crate::types::common::{
177-
SgBigInt, SgBytes, SgErc20, SgOrderAsIO, SgOrderbook, SgTransaction, SgVault,
178-
SgVaultBalanceChangeUnwrapped, SgVaultBalanceChangeVault, SgVaultsListFilterArgs,
154+
SgBigInt, SgBytes, SgErc20, SgOrderAsIO, SgOrderbook, SgVault, SgVaultsListFilterArgs,
179155
};
180156
use crate::utils::float::*;
181157
use cynic::Id;
@@ -285,50 +261,35 @@ mod tests {
285261
}
286262
}
287263

288-
fn default_sg_transaction() -> SgTransaction {
289-
SgTransaction {
290-
id: SgBytes("0xTransactionId".to_string()),
291-
from: SgBytes("0xSenderAddress".to_string()),
292-
block_number: SgBigInt("100".to_string()),
293-
timestamp: SgBigInt("1700000000".to_string()),
294-
}
295-
}
296-
297-
fn default_sg_vault_balance_change_vault_ref() -> SgVaultBalanceChangeVault {
298-
SgVaultBalanceChangeVault {
299-
id: SgBytes("0xVaultIdForBalanceChange".to_string()),
300-
vault_id: SgBytes("12345".to_string()),
301-
token: default_sg_erc20(),
302-
}
303-
}
304-
305-
fn default_sg_vault_balance_change_unwrapped() -> SgVaultBalanceChangeUnwrapped {
306-
SgVaultBalanceChangeUnwrapped {
307-
__typename: "Deposit".to_string(),
308-
amount: SgBytes(F0_5.as_hex()),
309-
new_vault_balance: SgBytes(F1_5.as_hex()),
310-
old_vault_balance: SgBytes(F1.as_hex()),
311-
vault: default_sg_vault_balance_change_vault_ref(),
312-
timestamp: SgBigInt("1700000100".to_string()),
313-
transaction: default_sg_transaction(),
314-
orderbook: default_sg_orderbook(),
315-
}
316-
}
317-
318-
fn assert_sg_vault_balance_change_unwrapped_eq(
319-
actual: &SgVaultBalanceChangeUnwrapped,
320-
expected: &SgVaultBalanceChangeUnwrapped,
321-
) {
322-
assert_eq!(actual.__typename, expected.__typename);
323-
assert_eq!(actual.amount, expected.amount);
324-
assert_eq!(actual.new_vault_balance, expected.new_vault_balance);
325-
assert_eq!(actual.old_vault_balance, expected.old_vault_balance);
326-
assert_eq!(actual.vault.id, expected.vault.id);
327-
assert_eq!(actual.vault.vault_id, expected.vault.vault_id);
328-
assert_eq!(actual.vault.token.id, expected.vault.token.id);
329-
assert_eq!(actual.timestamp, expected.timestamp);
330-
assert_eq!(actual.transaction.id, expected.transaction.id);
331-
assert_eq!(actual.orderbook.id, expected.orderbook.id);
264+
fn default_balance_change_json() -> serde_json::Value {
265+
json!({
266+
"__typename": "Deposit",
267+
"id": "0xDepositId",
268+
"amount": F0_5.as_hex(),
269+
"newVaultBalance": F1_5.as_hex(),
270+
"oldVaultBalance": F1.as_hex(),
271+
"vault": {
272+
"id": "0xVaultIdForBalanceChange",
273+
"vaultId": "12345",
274+
"token": {
275+
"id": "0xTokenId",
276+
"address": "0xTokenAddress",
277+
"name": "Test Token",
278+
"symbol": "TTK",
279+
"decimals": "18"
280+
}
281+
},
282+
"timestamp": "1700000100",
283+
"transaction": {
284+
"id": "0xTransactionId",
285+
"from": "0xSenderAddress",
286+
"blockNumber": "100",
287+
"timestamp": "1700000000"
288+
},
289+
"orderbook": {
290+
"id": "0xOrderbookId"
291+
}
292+
})
332293
}
333294

334295
#[tokio::test]
@@ -652,12 +613,12 @@ mod tests {
652613
page: 1,
653614
page_size: 10,
654615
};
655-
let expected_changes = vec![default_sg_vault_balance_change_unwrapped()];
616+
let expected_json = vec![default_balance_change_json()];
656617

657618
sg_server.mock(|when, then| {
658619
when.method(POST).path("/").body_contains("\"skip\":0");
659620
then.status(200)
660-
.json_body(json!({"data": {"vaultBalanceChanges": expected_changes}}));
621+
.json_body(json!({"data": {"vaultBalanceChanges": expected_json}}));
661622
});
662623
sg_server.mock(|when, then| {
663624
when.method(POST).path("/").body_contains("\"skip\":200");
@@ -670,10 +631,8 @@ mod tests {
670631
.await;
671632
assert!(result.is_ok(), "Result was: {:?}", result.err());
672633
let changes = result.unwrap();
673-
assert_eq!(changes.len(), expected_changes.len());
674-
for (actual, expected) in changes.iter().zip(expected_changes.iter()) {
675-
assert_sg_vault_balance_change_unwrapped_eq(actual, expected);
676-
}
634+
assert_eq!(changes.len(), 1);
635+
assert_eq!(changes[0].typename(), "Deposit");
677636
}
678637

679638
#[tokio::test]
@@ -734,24 +693,17 @@ mod tests {
734693
page_size: 10,
735694
};
736695

737-
let deposit_change = SgVaultBalanceChangeUnwrapped {
738-
__typename: "Deposit".to_string(),
739-
..default_sg_vault_balance_change_unwrapped()
740-
};
741-
let withdrawal_change = SgVaultBalanceChangeUnwrapped {
742-
__typename: "Withdrawal".to_string(),
743-
..default_sg_vault_balance_change_unwrapped()
744-
};
745-
let trade_change = SgVaultBalanceChangeUnwrapped {
746-
__typename: "TradeVaultBalanceChange".to_string(),
747-
..default_sg_vault_balance_change_unwrapped()
748-
};
749-
let all_changes = vec![deposit_change, withdrawal_change, trade_change];
696+
let mut deposit_json = default_balance_change_json();
697+
deposit_json["__typename"] = json!("Deposit");
698+
let mut withdrawal_json = default_balance_change_json();
699+
withdrawal_json["__typename"] = json!("Withdrawal");
700+
withdrawal_json["id"] = json!("0xWithdrawalId");
701+
let all_changes_json = vec![deposit_json, withdrawal_json];
750702

751703
sg_server.mock(|when, then| {
752704
when.method(POST).path("/").body_contains("\"skip\":0");
753705
then.status(200)
754-
.json_body(json!({"data": {"vaultBalanceChanges": all_changes}}));
706+
.json_body(json!({"data": {"vaultBalanceChanges": all_changes_json}}));
755707
});
756708
sg_server.mock(|when, then| {
757709
when.method(POST).path("/").body_contains("\"skip\":200");
@@ -766,7 +718,7 @@ mod tests {
766718
assert!(result.is_ok(), "Result was: {:?}", result.err());
767719
let changes = result.unwrap();
768720
assert_eq!(changes.len(), 1);
769-
assert_eq!(changes[0].__typename, "Deposit");
721+
assert_eq!(changes[0].typename(), "Deposit");
770722
}
771723

772724
#[tokio::test]
@@ -776,12 +728,11 @@ mod tests {
776728
let vault_id_str = "0xVaultForBalanceChangesAll";
777729
let vault_id = Id::new(vault_id_str);
778730

779-
let changes_page1: Vec<SgVaultBalanceChangeUnwrapped> = (0..ALL_PAGES_QUERY_PAGE_SIZE)
780-
.map(|_| default_sg_vault_balance_change_unwrapped())
781-
.collect();
782-
let changes_page2: Vec<SgVaultBalanceChangeUnwrapped> = (0..30)
783-
.map(|_| default_sg_vault_balance_change_unwrapped())
731+
let changes_page1: Vec<serde_json::Value> = (0..ALL_PAGES_QUERY_PAGE_SIZE)
732+
.map(|_| default_balance_change_json())
784733
.collect();
734+
let changes_page2: Vec<serde_json::Value> =
735+
(0..30).map(|_| default_balance_change_json()).collect();
785736

786737
sg_server.mock(|when, then| {
787738
when.method(POST)

0 commit comments

Comments
 (0)