avoid partial writes during register_incoming/register_outgoing

Signed-off-by: Uncle Stinky <uncle.stinky@ghostchain.io>
This commit is contained in:
Uncle Stinky 2026-09-26 16:20:46 +03:00
parent 0162da4604
commit f77ca05d3f
Signed by: st1nky
GPG Key ID: 016064BD97603B40
2 changed files with 31 additions and 27 deletions

View File

@ -1,6 +1,6 @@
[package]
name = "ghost-networks"
version = "0.2.10"
version = "0.2.11"
description = "Registry and lifecycle management for external network metadata and cryptographic profiles."
license.workspace = true
authors.workspace = true

View File

@ -833,23 +833,25 @@ impl<T: Config> NetworkDataMutateHandler<NetworkData, BalanceOf<T>> for Pallet<T
.map(|network| network.incoming_share)
.ok_or(())?;
GatekeeperAmounts::<T>::try_mutate(network_id, |gatekeeper_amount| -> Result<(), ()> {
*gatekeeper_amount = gatekeeper_amount.checked_add(&amount).ok_or(())?;
Ok(())
})?;
let increased_gatekeeper_amount = GatekeeperAmounts::<T>::get(network_id)
.checked_add(&amount)
.ok_or(())?;
let curve_share = Perbill::from_parts(incoming_share).mul_ceil(amount);
let final_amount = amount.saturating_sub(curve_share);
NetworkImbalance::<T>::try_mutate(|imbalance_state| -> Result<(), ()> {
imbalance_state.incoming = imbalance_state.incoming
.checked_add(&final_amount)
.ok_or(())?;
imbalance_state.curve_share = imbalance_state.curve_share
.checked_add(&curve_share)
.ok_or(())?;
Ok(())
})?;
let mut imbalance_state = NetworkImbalance::<T>::get();
imbalance_state.incoming = imbalance_state.incoming
.checked_add(&final_amount)
.ok_or(())?;
imbalance_state.curve_share = imbalance_state.curve_share
.checked_add(&curve_share)
.ok_or(())?;
GatekeeperAmounts::<T>::insert(network_id, increased_gatekeeper_amount);
NetworkImbalance::<T>::put(imbalance_state);
Ok(final_amount)
}
@ -862,23 +864,25 @@ impl<T: Config> NetworkDataMutateHandler<NetworkData, BalanceOf<T>> for Pallet<T
.map(|network| network.outgoing_share)
.ok_or(())?;
GatekeeperAmounts::<T>::try_mutate(network_id, |gatekeeper_amount| -> Result<(), ()> {
*gatekeeper_amount = gatekeeper_amount.checked_sub(&amount).ok_or(())?;
Ok(())
})?;
let decreased_gatekeeper_amount = GatekeeperAmounts::<T>::get(network_id)
.checked_sub(&amount)
.ok_or(())?;
let curve_share = Perbill::from_parts(outgoing_share).mul_ceil(amount);
let final_amount = amount.saturating_sub(curve_share);
NetworkImbalance::<T>::try_mutate(|imbalance_state| -> Result<(), ()> {
imbalance_state.outgoing = imbalance_state.outgoing
.checked_add(&final_amount)
.ok_or(())?;
imbalance_state.curve_share = imbalance_state.curve_share
.checked_add(&curve_share)
.ok_or(())?;
Ok(())
})?;
let mut imbalance_state = NetworkImbalance::<T>::get();
imbalance_state.outgoing = imbalance_state.outgoing
.checked_add(&final_amount)
.ok_or(())?;
imbalance_state.curve_share = imbalance_state.curve_share
.checked_add(&curve_share)
.ok_or(())?;
GatekeeperAmounts::<T>::insert(network_id, decreased_gatekeeper_amount);
NetworkImbalance::<T>::put(imbalance_state);
Ok(final_amount)
}