Skip to content
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions rs/dogecoin/ckdoge/minter/tests/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,7 @@ mod withdrawal {

setup
.withdrawal_flow()
.minter_await_fee_refresh(RETRIEVE_DOGE_MIN_AMOUNT)
.ledger_approve_minter(account, RETRIEVE_DOGE_MIN_AMOUNT)
.minter_retrieve_doge_with_approval(
RETRIEVE_DOGE_MIN_AMOUNT,
Expand Down Expand Up @@ -415,6 +416,7 @@ mod withdrawal {

let withdrawal_flow = setup
.withdrawal_flow()
.minter_await_fee_refresh(RETRIEVE_DOGE_MIN_AMOUNT)
.ledger_approve_minter(account, RETRIEVE_DOGE_MIN_AMOUNT);

setup.ledger().stop();
Expand Down Expand Up @@ -454,6 +456,7 @@ mod withdrawal {

setup
.withdrawal_flow()
.minter_await_fee_refresh(RETRIEVE_DOGE_MIN_AMOUNT)
.ledger_approve_minter(account, RETRIEVE_DOGE_MIN_AMOUNT)
.minter_retrieve_doge_with_approval(
RETRIEVE_DOGE_MIN_AMOUNT,
Expand Down Expand Up @@ -542,6 +545,7 @@ mod withdrawal {

setup
.withdrawal_flow()
.minter_await_fee_refresh(withdrawal_amount)
.ledger_approve_minter(account, withdrawal_amount)
.minter_retrieve_doge_with_approval(
withdrawal_amount,
Expand Down Expand Up @@ -584,6 +588,7 @@ mod withdrawal {

setup
.withdrawal_flow()
.minter_await_fee_refresh(withdrawal_amount)
.ledger_approve_minter(account, withdrawal_amount)
.minter_retrieve_doge_with_approval(
withdrawal_amount,
Expand Down Expand Up @@ -697,6 +702,7 @@ mod post_upgrade {

setup
.withdrawal_flow()
.minter_await_fee_refresh(RETRIEVE_DOGE_MIN_AMOUNT)
.ledger_approve_minter(account, RETRIEVE_DOGE_MIN_AMOUNT)
.minter_retrieve_doge_with_approval(
RETRIEVE_DOGE_MIN_AMOUNT,
Expand Down
35 changes: 34 additions & 1 deletion rs/dogecoin/ckdoge/test_utils/src/flow/withdrawal.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use crate::BLOCK_TIME;
use crate::FEE_PERCENTILES_REFRESH_INTERVAL;
use crate::MAX_TIME_IN_QUEUE;
use crate::MIN_CONFIRMATIONS;
use crate::{Setup, into_outpoint, parse_dogecoin_address};
Expand Down Expand Up @@ -28,7 +29,7 @@ use std::time::Duration;

/// Entry point in the withdrawal flow
///
/// Step 1: approve the minter to burn user's funds
/// Step 1: await a refresh of the minter's median fee percentiles
pub struct WithdrawalFlowStart<S> {
setup: S,
}
Expand All @@ -38,6 +39,38 @@ impl<S> WithdrawalFlowStart<S> {
Self { setup }
}

pub fn minter_await_fee_refresh(self, withdrawal_amount: u64) -> WithdrawalFlowApproval<S>
where
S: AsRef<Setup>,
{
let minter = self.setup.as_ref().minter();
let env = self.setup.as_ref().env.clone();

let max_refreshes = 10;
let mut previous = minter.estimate_withdrawal_fee(withdrawal_amount);
for _ in 0..max_refreshes {
env.advance_time(FEE_PERCENTILES_REFRESH_INTERVAL + Duration::from_secs(1));
for _ in 0..10 {
env.tick();
}
let current = minter.estimate_withdrawal_fee(withdrawal_amount);
if current == previous {
return WithdrawalFlowApproval { setup: self.setup };
}
previous = current;
}
panic!(
"BUG: fee estimate did not stabilize after {max_refreshes} refreshes; last estimate: {previous:?}"
);
}
Comment thread
gregorydemay marked this conversation as resolved.
Outdated
}

/// Step 2: approve the minter to burn user's funds
pub struct WithdrawalFlowApproval<S> {
setup: S,
}

impl<S> WithdrawalFlowApproval<S> {
pub fn ledger_approve_minter<A>(self, account: A, amount: u64) -> RetrieveDogeFlow<S>
where
A: Into<Account>,
Expand Down
2 changes: 2 additions & 0 deletions rs/dogecoin/ckdoge/test_utils/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ pub const LEDGER_TRANSFER_FEE: u64 = DOGE / 100;
const MAX_TIME_IN_QUEUE: Duration = Duration::from_secs(10);
pub const MIN_CONFIRMATIONS: u32 = 60;
pub const BLOCK_TIME: Duration = Duration::from_secs(60);
/// Must be at least the minter's `refresh_fee_percentiles_frequency`.
pub const FEE_PERCENTILES_REFRESH_INTERVAL: Duration = Duration::from_secs(360);

pub struct Setup {
pub env: Arc<PocketIc>,
Expand Down
Loading