Skip to content

Commit eeed407

Browse files
committed
fix: don't mint kbtc in cancel_redeem for liquidated vault
1 parent faec922 commit eeed407

File tree

2 files changed

+15
-8
lines changed
  • crates/redeem/src
  • parachain/runtime/runtime-tests/src/parachain

2 files changed

+15
-8
lines changed

crates/redeem/src/lib.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -689,7 +689,7 @@ impl<T: Config> Pallet<T> {
689689
amount_to_slash
690690
};
691691

692-
// first update the issued tokens; this logic is the same regardless of whether or not the vault is liquidated
692+
// first update the issued tokens
693693
let new_status = if reimburse {
694694
// Transfer the transaction fee to the pool. Even though the redeem was not
695695
// successful, the user receives a premium in collateral, so it's OK to take the fee.
@@ -698,7 +698,14 @@ impl<T: Config> Pallet<T> {
698698
fee.transfer(&redeem.redeemer, &ext::fee::fee_pool_account_id::<T>())?;
699699
ext::fee::distribute_rewards::<T>(&fee)?;
700700

701-
if ext::vault_registry::is_vault_below_secure_threshold::<T>(&redeem.vault)? {
701+
if vault.is_liquidated() {
702+
// In this situation, tokens are burned and the collateral gets transferred
703+
// to the user. This is similar to what happens in a liquidation_redeem.
704+
vault_to_be_burned_tokens.burn_from(&redeemer)?;
705+
ext::vault_registry::decrease_tokens::<T>(&redeem.vault, &redeem.redeemer, &vault_to_be_burned_tokens)?;
706+
// set to Reimbursed(true) such that the vault can't mint the ibtc/kbtc later on
707+
Self::set_redeem_status(redeem_id, RedeemRequestStatus::Reimbursed(true))
708+
} else if ext::vault_registry::is_vault_below_secure_threshold::<T>(&redeem.vault)? {
702709
// vault can not afford to back the tokens that it would receive, so we burn it
703710
vault_to_be_burned_tokens.burn_from(&redeemer)?;
704711
ext::vault_registry::decrease_tokens::<T>(&redeem.vault, &redeem.redeemer, &vault_to_be_burned_tokens)?;

parachain/runtime/runtime-tests/src/parachain/redeem.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -963,17 +963,15 @@ mod spec_based_tests {
963963
// to-be-redeemed decreased, forwarding to liquidation vault
964964
vault.to_be_redeemed -= redeem.amount_btc() + redeem.transfer_fee_btc();
965965
liquidation_vault.to_be_redeemed -= redeem.amount_btc() + redeem.transfer_fee_btc();
966+
liquidation_vault.issued -= redeem.amount_btc() + redeem.transfer_fee_btc();
966967

967968
*fee_pool.rewards_for(&vault_id) += redeem.fee();
968969

969970
// the collateral that remained with the vault to back this redeem is now transferred to the
970-
// liquidation vault
971+
// user
971972
let collateral_for_this_redeem = collateral_vault / 4;
972973
vault.liquidated_collateral -= collateral_for_this_redeem;
973974

974-
*vault.free_balance.get_mut(&vault_id.wrapped_currency()).unwrap() +=
975-
redeem.amount_btc() + redeem.transfer_fee_btc();
976-
977975
// user's tokens get unlocked
978976
(*user.balances.get_mut(&vault_id.wrapped_currency()).unwrap()).locked -=
979977
redeem.amount_btc() + redeem.fee() + redeem.transfer_fee_btc();
@@ -1780,10 +1778,12 @@ fn integration_test_redeem_wrapped_cancel_liquidated_reimburse() {
17801778
// to-be-redeemed decreased, forwarding to liquidation vault
17811779
vault.to_be_redeemed -= redeem.amount_btc() + redeem.transfer_fee_btc();
17821780
liquidation_vault.to_be_redeemed -= redeem.amount_btc() + redeem.transfer_fee_btc();
1781+
// decrease issued tokens on the liquidation vault by the same amount, s.t. the
1782+
// effective exchange rate (i.e. the one accounting for to_be_redeemed tokens)
1783+
// of the liquidation vault does not change.
1784+
liquidation_vault.issued -= redeem.amount_btc() + redeem.transfer_fee_btc();
17831785

17841786
// tokens are given to the vault, minus a fee that is given to the fee pool
1785-
*vault.free_balance.get_mut(&vault_id.wrapped_currency()).unwrap() +=
1786-
redeem.amount_btc() + redeem.transfer_fee_btc();
17871787
*fee_pool.rewards_for(&vault_id) += redeem.fee();
17881788

17891789
// the collateral that remained with the vault to back this redeem is transferred to the user

0 commit comments

Comments
 (0)