Skip to content

Commit 9115294

Browse files
committed
Align account/balances HTTP tests with token-decimals scaling
1 parent 30f1e2e commit 9115294

1 file changed

Lines changed: 36 additions & 35 deletions

File tree

services/api/tests/account_balances_http.rs

Lines changed: 36 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -171,11 +171,12 @@ async fn happy_path_returns_outcomes_sorted_by_id() {
171171
let Some((service, pool, _kek, pn)) = common::setup().await else { return };
172172
let (pmp, ob) = seed_market(&pool, "happy-bal").await;
173173
let pn_addr = seeded_pn_address(&pool).await;
174-
seed_open_sell(&pool, &ob, 1001, 1, &pn_addr, "100").await; // outcome 1: 1.00 locked
175-
seed_open_sell(&pool, &ob, 1002, 1, &pn_addr, "50").await; // outcome 1: +0.50 = 1.50 total
174+
// Token-atom scale (decimals=9), matching on-chain order amounts / _stakes.amount.
175+
seed_open_sell(&pool, &ob, 1001, 1, &pn_addr, "1000000000").await; // outcome 1: 1.0 locked
176+
seed_open_sell(&pool, &ob, 1002, 1, &pn_addr, "500000000").await; // outcome 1: +0.5 = 1.5 total
176177

177178
pn.set_stake(Some(PnStake {
178-
amount: vec!["1000".into(), "500".into()], // outcome 0=10.00, 1=5.00
179+
amount: vec!["10000000000".into(), "5000000000".into()], // outcome 0=10, 1=5 tokens
179180
debt_amount: vec!["0".into(), "0".into()],
180181
coupons_amount: vec!["0".into(), "0".into()],
181182
}));
@@ -198,20 +199,20 @@ async fn happy_path_returns_outcomes_sorted_by_id() {
198199
assert_eq!(body.balances.len(), 2);
199200
assert_eq!(body.balances[0].outcome_id, 0);
200201
assert_eq!(body.balances[0].symbol, "happy-bal-NO");
201-
assert_eq!(body.balances[0].free, "10.00");
202-
assert_eq!(body.balances[0].locked_in_orders, "0.00");
202+
assert_eq!(body.balances[0].free, "10.000000000");
203+
assert_eq!(body.balances[0].locked_in_orders, "0.000000000");
203204
assert_eq!(body.balances[1].outcome_id, 1);
204205
assert_eq!(body.balances[1].symbol, "happy-bal-YES");
205-
assert_eq!(body.balances[1].free, "5.00");
206-
assert_eq!(body.balances[1].locked_in_orders, "1.50");
206+
assert_eq!(body.balances[1].free, "5.000000000");
207+
assert_eq!(body.balances[1].locked_in_orders, "1.500000000");
207208
}
208209

209210
#[tokio::test]
210211
async fn no_stake_yields_zero_free_with_nonzero_locked() {
211212
let Some((service, pool, _kek, pn)) = common::setup().await else { return };
212213
let (pmp, ob) = seed_market(&pool, "nostake-bal").await;
213214
let pn_addr = seeded_pn_address(&pool).await;
214-
seed_open_sell(&pool, &ob, 2001, 0, &pn_addr, "75").await;
215+
seed_open_sell(&pool, &ob, 2001, 0, &pn_addr, "750000000").await; // 0.75 locked (atoms)
215216
pn.set_stake(None);
216217

217218
let ts = now_ms();
@@ -227,11 +228,11 @@ async fn no_stake_yields_zero_free_with_nonzero_locked() {
227228
assert_eq!(resp.status_code, Some(StatusCode::OK));
228229
let body = resp.take_json::<BalancesBody>().await.expect("ok");
229230
assert_eq!(body.balances.len(), 2);
230-
assert_eq!(body.balances[0].free, "0.00");
231-
assert_eq!(body.balances[0].locked_in_orders, "0.75");
231+
assert_eq!(body.balances[0].free, "0.000000000");
232+
assert_eq!(body.balances[0].locked_in_orders, "0.750000000");
232233
assert_eq!(body.balances[1].outcome_id, 1);
233-
assert_eq!(body.balances[1].free, "0.00");
234-
assert_eq!(body.balances[1].locked_in_orders, "0.00");
234+
assert_eq!(body.balances[1].free, "0.000000000");
235+
assert_eq!(body.balances[1].locked_in_orders, "0.000000000");
235236
}
236237

237238
#[tokio::test]
@@ -314,7 +315,7 @@ async fn terminal_market_serves_balances() {
314315
.await
315316
.unwrap();
316317
pn.set_stake(Some(PnStake {
317-
amount: vec!["100".into(), "200".into()],
318+
amount: vec!["1000000000".into(), "2000000000".into()], // 1 / 2 tokens (atoms)
318319
debt_amount: vec!["0".into(), "0".into()],
319320
coupons_amount: vec!["0".into(), "0".into()],
320321
}));
@@ -331,10 +332,10 @@ async fn terminal_market_serves_balances() {
331332
assert_eq!(resp.status_code, Some(StatusCode::OK));
332333
let body = resp.take_json::<BalancesBody>().await.expect("balances body");
333334
assert_eq!(body.balances.len(), 2);
334-
// outcome 0: free = 100 scaled by quantity_precision=2 → "1.00"
335-
assert_eq!(body.balances[0].free, "1.00");
336-
// outcome 1: free = 200 scaled → "2.00"
337-
assert_eq!(body.balances[1].free, "2.00");
335+
// outcome 0: free = 1e9 atoms scaled by decimals=9 → "1.000000000"
336+
assert_eq!(body.balances[0].free, "1.000000000");
337+
// outcome 1: free = 2e9 atoms → "2.000000000"
338+
assert_eq!(body.balances[1].free, "2.000000000");
338339
}
339340

340341
#[tokio::test]
@@ -386,8 +387,8 @@ async fn cross_tenant_isolation_excludes_other_owner_orders() {
386387
let pn1 = common::seeded_pn_address_for_key(&pool, SEED_API_KEY).await;
387388
let pn2 = common::seeded_pn_address_for_key(&pool, SEED_API_KEY_2).await;
388389

389-
seed_open_sell(&pool, &ob, 9901, 0, &pn1, "100").await;
390-
seed_open_sell(&pool, &ob, 9902, 0, &pn2, "999").await;
390+
seed_open_sell(&pool, &ob, 9901, 0, &pn1, "1000000000").await; // 1.0 (atoms)
391+
seed_open_sell(&pool, &ob, 9902, 0, &pn2, "999000000000").await; // pn2, must be excluded
391392

392393
pn.set_stake_for(
393394
&pn1,
@@ -410,9 +411,9 @@ async fn cross_tenant_isolation_excludes_other_owner_orders() {
410411
.await;
411412
assert_eq!(resp.status_code, Some(StatusCode::OK));
412413
let body = resp.take_json::<BalancesBody>().await.expect("ok");
413-
// outcome 0: pn1 locked 100 / quantity_precision=2 → "1.00"
414-
// pn2's 999 must NOT contribute.
415-
assert_eq!(body.balances[0].locked_in_orders, "1.00");
414+
// outcome 0: pn1 locked 1e9 atoms / decimals=9 → "1.000000000"
415+
// pn2's amount must NOT contribute.
416+
assert_eq!(body.balances[0].locked_in_orders, "1.000000000");
416417
}
417418

418419
#[tokio::test]
@@ -426,8 +427,8 @@ async fn cross_tenant_isolation_symmetric_from_second_account() {
426427
let pn1 = common::seeded_pn_address_for_key(&pool, SEED_API_KEY).await;
427428
let pn2 = common::seeded_pn_address_for_key(&pool, SEED_API_KEY_2).await;
428429

429-
seed_open_sell(&pool, &ob, 9911, 0, &pn1, "100").await;
430-
seed_open_sell(&pool, &ob, 9912, 0, &pn2, "999").await;
430+
seed_open_sell(&pool, &ob, 9911, 0, &pn1, "1000000000").await; // pn1, must be excluded
431+
seed_open_sell(&pool, &ob, 9912, 0, &pn2, "9990000000").await; // 9.99 (atoms)
431432

432433
pn.set_stake_for(
433434
&pn2,
@@ -450,9 +451,9 @@ async fn cross_tenant_isolation_symmetric_from_second_account() {
450451
.await;
451452
assert_eq!(resp.status_code, Some(StatusCode::OK));
452453
let body = resp.take_json::<BalancesBody>().await.expect("ok");
453-
// outcome 0: pn2 locked 999 / quantity_precision=2 → "9.99"
454-
// pn1's "1.00" must NOT appear; the value must be exactly "9.99".
455-
assert_eq!(body.balances[0].locked_in_orders, "9.99");
454+
// outcome 0: pn2 locked 9.99e9 atoms / decimals=9 → "9.990000000"
455+
// pn1's amount must NOT appear; the value must be exactly "9.990000000".
456+
assert_eq!(body.balances[0].locked_in_orders, "9.990000000");
456457
}
457458

458459
#[tokio::test]
@@ -490,9 +491,9 @@ async fn cross_tenant_isolation_free_side_does_not_leak_other_pn_stake() {
490491
.await;
491492
assert_eq!(resp.status_code, Some(StatusCode::OK));
492493
let body = resp.take_json::<BalancesBody>().await.expect("ok");
493-
// pn2 has no stake registered; pn1's "700"/"300" must NOT appear.
494-
assert_eq!(body.balances[0].free, "0.00");
495-
assert_eq!(body.balances[1].free, "0.00");
494+
// pn2 has no stake registered; pn1's amounts must NOT appear.
495+
assert_eq!(body.balances[0].free, "0.000000000");
496+
assert_eq!(body.balances[1].free, "0.000000000");
496497
}
497498

498499
#[tokio::test]
@@ -520,7 +521,7 @@ async fn production_hasher_is_wired_to_stake_lookup() {
520521
pn.set_stake_for_hash(
521522
&expected_hash,
522523
Some(PnStake {
523-
amount: vec!["700".into(), "300".into()],
524+
amount: vec!["7000000000".into(), "3000000000".into()], // 7 / 3 tokens (atoms)
524525
debt_amount: vec!["0".into(), "0".into()],
525526
coupons_amount: vec!["0".into(), "0".into()],
526527
}),
@@ -540,8 +541,8 @@ async fn production_hasher_is_wired_to_stake_lookup() {
540541
let body = resp.take_json::<BalancesBody>().await.expect("balances body");
541542
// Non-zero free => the production hasher emitted exactly `expected_hash`
542543
// and the handler looked up `_stakes` with that key.
543-
assert_eq!(body.balances[0].free, "7.00");
544-
assert_eq!(body.balances[1].free, "3.00");
544+
assert_eq!(body.balances[0].free, "7.000000000");
545+
assert_eq!(body.balances[1].free, "3.000000000");
545546
}
546547

547548
#[tokio::test]
@@ -576,8 +577,8 @@ async fn stake_registered_at_wrong_hash_yields_zero_free() {
576577
.await;
577578
assert_eq!(resp.status_code, Some(StatusCode::OK));
578579
let body = resp.take_json::<BalancesBody>().await.expect("balances body");
579-
assert_eq!(body.balances[0].free, "0.00");
580-
assert_eq!(body.balances[1].free, "0.00");
580+
assert_eq!(body.balances[0].free, "0.000000000");
581+
assert_eq!(body.balances[1].free, "0.000000000");
581582
}
582583

583584
#[tokio::test]

0 commit comments

Comments
 (0)