@@ -172,6 +172,10 @@ pub mod pallet {
172172 AmountBelowDustAmount ,
173173 /// Invalid Cancel request.
174174 InvalidCancelRequest ,
175+ /// Cannot replace self.
176+ ReplaceSelfNotAllowed ,
177+ /// Vault cannot replace different currency.
178+ InvalidWrappedCurrency ,
175179 }
176180
177181 /// The time difference in number of blocks between a redeem request is created and required completion time by a
@@ -541,6 +545,16 @@ impl<T: Config> Pallet<T> {
541545 let old_vault = AccountOrVault :: Vault ( old_vault_id. clone ( ) ) ;
542546 let new_vault = AccountOrVault :: Vault ( new_vault_id. clone ( ) ) ;
543547
548+ // probably this check is not strictly required, but it's better to give an
549+ // explicit error rather than insufficient balance
550+ ensure ! (
551+ old_vault_id. wrapped_currency( ) == new_vault_id. wrapped_currency( ) ,
552+ Error :: <T >:: InvalidWrappedCurrency
553+ ) ;
554+
555+ // don't allow vaults to replace themselves
556+ ensure ! ( old_vault != new_vault, Error :: <T >:: ReplaceSelfNotAllowed ) ;
557+
544558 // Calculate requestable tokens for old vault
545559 let max_requestable_tokens: Amount < T > =
546560 ext:: vault_registry:: requestable_to_be_replaced_tokens :: < T > ( & old_vault_id) ?;
@@ -589,12 +603,12 @@ impl<T: Config> Pallet<T> {
589603 ensure ! ( !btc_address. is_zero( ) , btc_relay:: Error :: <T >:: InvalidBtcHash ) ;
590604
591605 // todo: currently allowed to redeem from one currency to the other for free - decide if this is desirable
592- let fee_wrapped = if redeemer. get_account ( ) . clone ( ) == vault_id. account_id {
606+ let mut fee_wrapped = if redeemer. get_account ( ) . clone ( ) == vault_id. account_id {
593607 Amount :: zero ( vault_id. wrapped_currency ( ) )
594608 } else {
595609 ext:: fee:: get_redeem_fee :: < T > ( & amount_wrapped) ?
596610 } ;
597- let inclusion_fee = Self :: get_current_inclusion_fee ( vault_id. wrapped_currency ( ) ) ?;
611+ let mut inclusion_fee = Self :: get_current_inclusion_fee ( vault_id. wrapped_currency ( ) ) ?;
598612
599613 let vault_to_be_burned_tokens = amount_wrapped. checked_sub ( & fee_wrapped) ?;
600614
@@ -634,6 +648,8 @@ impl<T: Config> Pallet<T> {
634648 } ;
635649
636650 let to_be_received_btc = if redeemer. is_vault_account ( ) {
651+ fee_wrapped = Amount :: zero ( vault_id. wrapped_currency ( ) ) ;
652+ inclusion_fee = Amount :: zero ( vault_id. wrapped_currency ( ) ) ;
637653 amount_wrapped. amount ( )
638654 } else {
639655 user_to_be_received_btc. amount ( )
0 commit comments