Skip to content

Commit 3967663

Browse files
authored
Merge pull request #3534 from autonomys/ensure_no_partial_state
ensure no partial state when XDM is being processed
2 parents 926b510 + b7ea171 commit 3967663

File tree

2 files changed

+52
-38
lines changed

2 files changed

+52
-38
lines changed

domains/pallets/messenger/src/lib.rs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ mod pallet {
160160
use core::cmp::Ordering;
161161
use frame_support::ensure;
162162
use frame_support::pallet_prelude::*;
163+
use frame_support::storage::with_storage_layer;
163164
use frame_support::traits::fungible::{Balanced, Inspect, InspectHold, Mutate, MutateHold};
164165
use frame_support::traits::tokens::{Fortitude, Precision, Preservation};
165166
use frame_support::weights::WeightToFee;
@@ -973,12 +974,18 @@ mod pallet {
973974
if let Some(owner) = &channel.maybe_owner {
974975
let hold_id = T::HoldIdentifier::messenger_channel();
975976
let locked_amount = channel.channel_reserve_fee;
976-
let amount_to_release = {
977+
let (amount_to_release, maybe_amount_to_burn) = {
977978
if channel.state == ChannelState::Open {
978-
locked_amount
979+
(locked_amount, None)
979980
} else {
980981
let protocol_fee = T::ChannelInitReservePortion::get() * locked_amount;
981982
let release_amount = locked_amount.saturating_sub(protocol_fee);
983+
(release_amount, Some(protocol_fee))
984+
}
985+
};
986+
987+
with_storage_layer(|| {
988+
if let Some(protocol_fee) = maybe_amount_to_burn {
982989
T::Currency::burn_held(
983990
&hold_id,
984991
owner,
@@ -987,11 +994,13 @@ mod pallet {
987994
Fortitude::Force,
988995
)?;
989996
T::OnXDMRewards::on_chain_protocol_fees(chain_id, protocol_fee);
990-
release_amount
991997
}
992-
};
993-
T::Currency::release(&hold_id, owner, amount_to_release, Precision::Exact)
994-
.map_err(|_| Error::<T>::BalanceUnlock)?;
998+
999+
T::Currency::release(&hold_id, owner, amount_to_release, Precision::Exact)
1000+
.map_err(|_| Error::<T>::BalanceUnlock)?;
1001+
1002+
Ok::<(), DispatchError>(())
1003+
})?;
9951004
}
9961005

9971006
channel.state = ChannelState::Closed;

domains/pallets/transporter/src/lib.rs

Lines changed: 37 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -482,16 +482,16 @@ impl<T: Config> sp_domains::DomainsTransfersTracker<BalanceOf<T>> for Pallet<T>
482482
) -> Result<(), Self::Error> {
483483
Self::ensure_consensus_chain()?;
484484

485-
if let Some(domain_id) = from_chain_id.maybe_domain_chain() {
486-
DomainBalances::<T>::try_mutate(domain_id, |current_balance| {
487-
*current_balance = current_balance
488-
.checked_sub(&amount)
489-
.ok_or(Error::LowBalanceOnDomain)?;
490-
Ok(())
491-
})?;
492-
}
493-
494485
UnconfirmedTransfers::<T>::try_mutate(from_chain_id, to_chain_id, |total_amount| {
486+
if let Some(domain_id) = from_chain_id.maybe_domain_chain() {
487+
DomainBalances::<T>::try_mutate(domain_id, |current_balance| {
488+
*current_balance = current_balance
489+
.checked_sub(&amount)
490+
.ok_or(Error::LowBalanceOnDomain)?;
491+
Ok(())
492+
})?;
493+
}
494+
495495
*total_amount = total_amount
496496
.checked_add(&amount)
497497
.ok_or(Error::BalanceOverflow)?;
@@ -511,18 +511,19 @@ impl<T: Config> sp_domains::DomainsTransfersTracker<BalanceOf<T>> for Pallet<T>
511511
*total_amount = total_amount
512512
.checked_sub(&amount)
513513
.ok_or(Error::BalanceUnderflow)?;
514+
515+
if let Some(domain_id) = to_chain_id.maybe_domain_chain() {
516+
DomainBalances::<T>::try_mutate(domain_id, |current_balance| {
517+
*current_balance = current_balance
518+
.checked_add(&amount)
519+
.ok_or(Error::BalanceOverflow)?;
520+
Ok(())
521+
})?;
522+
}
523+
514524
Ok(())
515525
})?;
516526

517-
if let Some(domain_id) = to_chain_id.maybe_domain_chain() {
518-
DomainBalances::<T>::try_mutate(domain_id, |current_balance| {
519-
*current_balance = current_balance
520-
.checked_add(&amount)
521-
.ok_or(Error::BalanceOverflow)?;
522-
Ok(())
523-
})?;
524-
}
525-
526527
Ok(())
527528
}
528529

@@ -536,17 +537,19 @@ impl<T: Config> sp_domains::DomainsTransfersTracker<BalanceOf<T>> for Pallet<T>
536537
*total_amount = total_amount
537538
.checked_sub(&amount)
538539
.ok_or(Error::BalanceUnderflow)?;
540+
541+
if let Some(domain_id) = from_chain_id.maybe_domain_chain() {
542+
DomainBalances::<T>::try_mutate(domain_id, |current_balance| {
543+
*current_balance = current_balance
544+
.checked_add(&amount)
545+
.ok_or(Error::BalanceOverflow)?;
546+
Ok(())
547+
})?;
548+
}
549+
539550
Ok(())
540551
})?;
541552

542-
if let Some(domain_id) = from_chain_id.maybe_domain_chain() {
543-
DomainBalances::<T>::try_mutate(domain_id, |current_balance| {
544-
*current_balance = current_balance
545-
.checked_add(&amount)
546-
.ok_or(Error::BalanceOverflow)?;
547-
Ok(())
548-
})?;
549-
}
550553
Ok(())
551554
}
552555

@@ -560,15 +563,17 @@ impl<T: Config> sp_domains::DomainsTransfersTracker<BalanceOf<T>> for Pallet<T>
560563
*total_amount = total_amount
561564
.checked_sub(&amount)
562565
.ok_or(Error::BalanceUnderflow)?;
563-
Ok(())
564-
})?;
565566

566-
CancelledTransfers::<T>::try_mutate(from_chain_id, to_chain_id, |total_amount| {
567-
*total_amount = total_amount
568-
.checked_add(&amount)
569-
.ok_or(Error::BalanceOverflow)?;
567+
CancelledTransfers::<T>::try_mutate(from_chain_id, to_chain_id, |total_amount| {
568+
*total_amount = total_amount
569+
.checked_add(&amount)
570+
.ok_or(Error::BalanceOverflow)?;
571+
Ok(())
572+
})?;
573+
570574
Ok(())
571575
})?;
576+
572577
Ok(())
573578
}
574579

0 commit comments

Comments
 (0)