Skip to content

Commit d20316c

Browse files
authored
Account for creation/redemption in performance page PnL (#371)
1 parent 296877c commit d20316c

12 files changed

Lines changed: 970 additions & 64 deletions

File tree

backend/.sqlx/query-8db1e238b93524513e50bf05387d31905399337aa22c733ac95a162dc8128914.json

Lines changed: 44 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

backend/src/convert.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,12 +369,17 @@ impl From<db::Trades> for websocket_api::Trades {
369369
market_id,
370370
trades,
371371
has_full_history,
372+
redemptions,
372373
}: db::Trades,
373374
) -> Self {
374375
Self {
375376
market_id,
376377
trades: trades.into_iter().map(websocket_api::Trade::from).collect(),
377378
has_full_history,
379+
redemptions: redemptions
380+
.into_iter()
381+
.map(websocket_api::Redeemed::from)
382+
.collect(),
378383
}
379384
}
380385
}

backend/src/db.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1283,13 +1283,55 @@ impl DB {
12831283
)
12841284
.fetch_all(&self.pool)
12851285
.await?;
1286+
let redemptions = self.get_market_redemptions(market_id).await?;
12861287
Ok(Ok(Trades {
12871288
market_id,
12881289
trades,
12891290
has_full_history: true,
1291+
redemptions,
12901292
}))
12911293
}
12921294

1295+
#[instrument(err, skip(self))]
1296+
pub async fn get_market_redemptions(&self, fund_id: i64) -> SqlxResult<Vec<Redeemed>> {
1297+
struct Row {
1298+
redeemer_id: i64,
1299+
fund_id: i64,
1300+
amount: Text<Decimal>,
1301+
transaction_id: i64,
1302+
transaction_timestamp: OffsetDateTime,
1303+
}
1304+
let rows = sqlx::query_as!(
1305+
Row,
1306+
r#"
1307+
SELECT
1308+
r.redeemer_id,
1309+
r.fund_id as "fund_id!",
1310+
r.amount as "amount: _",
1311+
r.transaction_id,
1312+
tr.timestamp as "transaction_timestamp"
1313+
FROM redemption r
1314+
JOIN "transaction" tr ON r.transaction_id = tr.id
1315+
WHERE r.fund_id = ?
1316+
"#,
1317+
fund_id
1318+
)
1319+
.fetch_all(&self.pool)
1320+
.await?;
1321+
Ok(rows
1322+
.into_iter()
1323+
.map(|row| Redeemed {
1324+
account_id: row.redeemer_id,
1325+
fund_id: row.fund_id,
1326+
amount: row.amount,
1327+
transaction_info: TransactionInfo {
1328+
id: row.transaction_id,
1329+
timestamp: row.transaction_timestamp,
1330+
},
1331+
})
1332+
.collect())
1333+
}
1334+
12931335
/// Gets the last trade for each market that has trades.
12941336
/// Returns a `HashMap` where keys are `market_id`s and values are the most recent Trade.
12951337
#[instrument(err, skip(self))]
@@ -4044,6 +4086,7 @@ pub struct Trades {
40444086
pub market_id: i64,
40454087
pub trades: Vec<Trade>,
40464088
pub has_full_history: bool,
4089+
pub redemptions: Vec<Redeemed>,
40474090
}
40484091

40494092
#[derive(FromRow, Debug, Clone)]

backend/src/handle_socket.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,7 @@ async fn send_initial_public_data(
432432
market_id,
433433
trades,
434434
has_full_history: false,
435+
redemptions: vec![],
435436
}),
436437
);
437438
if !is_admin {
@@ -500,6 +501,9 @@ async fn conditionally_hide_user_ids(
500501
hide_id(owned_accounts, &mut trade.buyer_id);
501502
hide_id(owned_accounts, &mut trade.seller_id);
502503
}
504+
for redemption in &mut trades.redemptions {
505+
hide_id(owned_accounts, &mut redemption.account_id);
506+
}
503507
}
504508
_ => {}
505509
}

backend/src/test_utils.rs

Lines changed: 74 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ use crate::{
2020
subscriptions::Subscriptions,
2121
websocket_api::{
2222
client_message::Message as CM, server_message::Message as SM, ActAs, Authenticate,
23-
ClientMessage, CreateMarket, CreateOrder, EditMarket, GetFullTradeHistory,
24-
RevokeOwnership, ServerMessage, SettleMarket, SetSudo, Side,
23+
ClientMessage, CreateMarket, CreateOrder, EditMarket, GetFullTradeHistory, MakeTransfer,
24+
Redeem, Redeemable, RevokeOwnership, ServerMessage, SettleMarket, SetSudo, Side,
2525
},
2626
AppState,
2727
};
@@ -373,6 +373,78 @@ impl TestClient {
373373
self.recv_message().await
374374
}
375375

376+
/// Send a `CreateMarket` message with full options (including redeemable).
377+
///
378+
/// # Errors
379+
/// Returns an error if sending fails.
380+
pub async fn create_market_full(
381+
&mut self,
382+
name: &str,
383+
min_settlement: f64,
384+
max_settlement: f64,
385+
hide_account_ids: bool,
386+
redeemable_for: Vec<Redeemable>,
387+
redeem_fee: f64,
388+
) -> anyhow::Result<ServerMessage> {
389+
let request_id = self.next_request_id();
390+
let msg = ClientMessage {
391+
request_id,
392+
message: Some(CM::CreateMarket(CreateMarket {
393+
name: name.to_string(),
394+
description: String::new(),
395+
min_settlement,
396+
max_settlement,
397+
redeemable_for,
398+
redeem_fee,
399+
hide_account_ids,
400+
visible_to: vec![],
401+
type_id: 0,
402+
group_id: 0,
403+
})),
404+
};
405+
self.send_message(msg).await?;
406+
self.recv_message().await
407+
}
408+
409+
/// Send a `Redeem` message.
410+
///
411+
/// # Errors
412+
/// Returns an error if sending fails.
413+
pub async fn redeem(&mut self, fund_id: i64, amount: f64) -> anyhow::Result<ServerMessage> {
414+
let request_id = self.next_request_id();
415+
let msg = ClientMessage {
416+
request_id,
417+
message: Some(CM::Redeem(Redeem { fund_id, amount })),
418+
};
419+
self.send_message(msg).await?;
420+
self.recv_message().await
421+
}
422+
423+
/// Send a `MakeTransfer` message.
424+
///
425+
/// # Errors
426+
/// Returns an error if sending fails.
427+
pub async fn make_transfer(
428+
&mut self,
429+
from_account_id: i64,
430+
to_account_id: i64,
431+
amount: f64,
432+
note: &str,
433+
) -> anyhow::Result<ServerMessage> {
434+
let request_id = self.next_request_id();
435+
let msg = ClientMessage {
436+
request_id,
437+
message: Some(CM::MakeTransfer(MakeTransfer {
438+
from_account_id,
439+
to_account_id,
440+
amount,
441+
note: note.to_string(),
442+
})),
443+
};
444+
self.send_message(msg).await?;
445+
self.recv_message().await
446+
}
447+
376448
/// Send a raw `ClientMessage`.
377449
///
378450
/// # Errors

0 commit comments

Comments
 (0)