Skip to content

Commit 3f1a546

Browse files
authored
Merge branch 'master' into feat/add-weight-comparison-task
2 parents ce7a392 + a4522b3 commit 3f1a546

18 files changed

Lines changed: 1424 additions & 216 deletions

File tree

Cargo.lock

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

integration-tests/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "runtime-integration-tests"
3-
version = "1.84.0"
3+
version = "1.85.0"
44
description = "Integration tests"
55
authors = ["GalacticCouncil"]
66
edition = "2021"

integration-tests/src/omnipool_slip_fees.rs

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,3 +449,87 @@ fn sequential_trades_accumulate_slip_within_block() {
449449
no_slip_drop
450450
);
451451
}
452+
453+
#[test]
454+
fn buy_succeeds_when_slip_cap_is_binding() {
455+
let buy_amount = 100 * UNITS;
456+
let tight_cap = Permill::from_parts(1000); // 0.1%
457+
458+
TestNet::reset();
459+
Hydra::execute_with(|| {
460+
init_omnipool();
461+
assert_ok!(Omnipool::set_slip_fee(
462+
RuntimeOrigin::root(),
463+
Some(SlipFeeConfig {
464+
max_slip_fee: tight_cap
465+
}),
466+
));
467+
468+
let trader = AccountId::from(BOB);
469+
assert_ok!(Currencies::update_balance(
470+
RuntimeOrigin::root(),
471+
trader.clone(),
472+
DAI,
473+
(10_000_000 * UNITS) as i128,
474+
));
475+
476+
let dai_before = Currencies::free_balance(DAI, &trader);
477+
let hdx_before = Currencies::free_balance(HDX, &trader);
478+
479+
assert_ok!(Omnipool::buy(
480+
RuntimeOrigin::signed(trader.clone()),
481+
HDX,
482+
DAI,
483+
buy_amount,
484+
u128::MAX,
485+
));
486+
487+
let hdx_received = Currencies::free_balance(HDX, &trader) - hdx_before;
488+
assert_eq!(hdx_received, buy_amount);
489+
490+
let dai_spent = dai_before - Currencies::free_balance(DAI, &trader);
491+
assert!(dai_spent > 0);
492+
});
493+
}
494+
495+
#[test]
496+
fn buy_with_lrna_succeeds_when_slip_cap_is_binding() {
497+
let buy_amount = 100 * UNITS;
498+
let tight_cap = Permill::from_parts(1000); // 0.1%
499+
500+
TestNet::reset();
501+
Hydra::execute_with(|| {
502+
init_omnipool();
503+
assert_ok!(Omnipool::set_slip_fee(
504+
RuntimeOrigin::root(),
505+
Some(SlipFeeConfig {
506+
max_slip_fee: tight_cap
507+
}),
508+
));
509+
510+
let trader = AccountId::from(BOB);
511+
assert_ok!(Currencies::update_balance(
512+
RuntimeOrigin::root(),
513+
trader.clone(),
514+
LRNA,
515+
(1_000_000 * UNITS) as i128,
516+
));
517+
518+
let lrna_before = Currencies::free_balance(LRNA, &trader);
519+
let dai_before = Currencies::free_balance(DAI, &trader);
520+
521+
assert_ok!(Omnipool::buy(
522+
RuntimeOrigin::signed(trader.clone()),
523+
DAI,
524+
LRNA,
525+
buy_amount,
526+
u128::MAX,
527+
));
528+
529+
let dai_received = Currencies::free_balance(DAI, &trader) - dai_before;
530+
assert_eq!(dai_received, buy_amount);
531+
532+
let lrna_spent = lrna_before - Currencies::free_balance(LRNA, &trader);
533+
assert!(lrna_spent > 0);
534+
});
535+
}

integration-tests/src/staking.rs

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2508,7 +2508,7 @@ fn increase_stake_should_work_when_referendum_ongoing_and_votes_processed() {
25082508
}
25092509

25102510
#[test]
2511-
fn voting_on_next_referenda_should_process_votes() {
2511+
fn removing_vote_should_process_votes() {
25122512
TestNet::reset();
25132513
Hydra::execute_with(|| {
25142514
init_omnipool();
@@ -2569,27 +2569,41 @@ fn voting_on_next_referenda_should_process_votes() {
25692569

25702570
end_referendum();
25712571

2572+
let alice_position_id = pallet_staking::Pallet::<hydradx_runtime::Runtime>::get_user_position_id(&ALICE.into())
2573+
.unwrap()
2574+
.unwrap();
2575+
2576+
// Before remove_vote, the finished vote has not been settled: still recorded in Votes,
2577+
// no points awarded, and not present in VotesRewarded.
2578+
let position_before =
2579+
pallet_staking::Pallet::<hydradx_runtime::Runtime>::get_position(alice_position_id).unwrap();
2580+
assert!(
2581+
pallet_staking::Pallet::<hydradx_runtime::Runtime>::get_position_votes(alice_position_id)
2582+
.votes
2583+
.iter()
2584+
.any(|(idx, _)| *idx == r)
2585+
);
25722586
assert!(
25732587
pallet_staking::Pallet::<hydradx_runtime::Runtime>::processed_votes::<AccountId, u32>(ALICE.into(), r)
25742588
.is_none()
25752589
);
25762590

2577-
let r = begin_referendum();
2578-
assert_ok!(ConvictionVoting::vote(
2591+
assert_ok!(ConvictionVoting::remove_vote(
25792592
hydradx_runtime::RuntimeOrigin::signed(ALICE.into()),
2580-
r,
2581-
AccountVote::Standard {
2582-
vote: Vote {
2583-
aye: true,
2584-
conviction: Conviction::Locked6x,
2585-
},
2586-
balance: 1_000_000 * UNITS,
2587-
}
2593+
Some(ROOT_TRACK),
2594+
r
25882595
));
2596+
2597+
// After remove_vote, settlement has happened: vote removed from Votes and points awarded.
25892598
assert!(
2590-
pallet_staking::Pallet::<hydradx_runtime::Runtime>::processed_votes::<AccountId, u32>(ALICE.into(), 0)
2591-
.is_some()
2599+
!pallet_staking::Pallet::<hydradx_runtime::Runtime>::get_position_votes(alice_position_id)
2600+
.votes
2601+
.iter()
2602+
.any(|(idx, _)| *idx == r)
25922603
);
2604+
let position_after =
2605+
pallet_staking::Pallet::<hydradx_runtime::Runtime>::get_position(alice_position_id).unwrap();
2606+
assert!(position_after.get_action_points() > position_before.get_action_points());
25932607
});
25942608
}
25952609

math/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ license = 'Apache-2.0'
66
name = "hydra-dx-math"
77
description = "A collection of utilities to make performing liquidity pool calculations more convenient."
88
repository = 'https://github.com/galacticcouncil/hydradx-math'
9-
version = "13.2.1"
9+
version = "13.2.2"
1010

1111
[dependencies]
1212
primitive-types = { workspace = true }

math/src/omnipool/math.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ pub fn calculate_buy_for_hub_asset_state_changes(
218218

219219
// Invert buy-side slip to find how much hub asset the user must provide
220220
let slip_buy_amount = if let Some(slip) = slip {
221-
let d_gross = invert_buy_side_slip(d_net, slip.asset_hub_reserve, slip.asset_delta)?;
221+
let d_gross = invert_buy_side_slip(d_net, slip.asset_hub_reserve, slip.asset_delta, slip.max_slip_fee)?;
222222
d_gross.checked_sub(d_net)?
223223
} else {
224224
0
@@ -277,14 +277,25 @@ pub fn calculate_buy_state_changes(
277277

278278
// Step 2: Invert buy-side slip to find D_gross from D_net
279279
let d_gross = if let Some(slip) = slip {
280-
invert_buy_side_slip(d_net, slip.asset_out_hub_reserve, slip.asset_out_delta)?
280+
invert_buy_side_slip(
281+
d_net,
282+
slip.asset_out_hub_reserve,
283+
slip.asset_out_delta,
284+
slip.max_slip_fee,
285+
)?
281286
} else {
282287
d_net
283288
};
284289

285290
// Step 3: Invert sell-side fees (protocol_fee + sell slip) to find delta_hub_reserve_in
286291
let delta_hub_reserve_in = if let Some(slip) = slip {
287-
invert_sell_side_fees(d_gross, protocol_fee, slip.asset_in_hub_reserve, slip.asset_in_delta)?
292+
invert_sell_side_fees(
293+
d_gross,
294+
protocol_fee,
295+
slip.asset_in_hub_reserve,
296+
slip.asset_in_delta,
297+
slip.max_slip_fee,
298+
)?
288299
} else {
289300
// No slip — original inversion
290301
FixedU128::from_inner(d_net)

0 commit comments

Comments
 (0)