From f77ca05d3f1a37b68ae8fc4196690841cbc320ae Mon Sep 17 00:00:00 2001 From: Uncle Stinky Date: Sat, 26 Sep 2026 16:20:46 +0300 Subject: [PATCH] avoid partial writes during register_incoming/register_outgoing Signed-off-by: Uncle Stinky --- pallets/networks/Cargo.toml | 2 +- pallets/networks/src/lib.rs | 56 ++++++++++++++++++++----------------- 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/pallets/networks/Cargo.toml b/pallets/networks/Cargo.toml index c1c186d..b73f6b9 100644 --- a/pallets/networks/Cargo.toml +++ b/pallets/networks/Cargo.toml @@ -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 diff --git a/pallets/networks/src/lib.rs b/pallets/networks/src/lib.rs index 6f10886..8ff7a2e 100644 --- a/pallets/networks/src/lib.rs +++ b/pallets/networks/src/lib.rs @@ -833,23 +833,25 @@ impl NetworkDataMutateHandler> for Pallet::try_mutate(network_id, |gatekeeper_amount| -> Result<(), ()> { - *gatekeeper_amount = gatekeeper_amount.checked_add(&amount).ok_or(())?; - Ok(()) - })?; + let increased_gatekeeper_amount = GatekeeperAmounts::::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::::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::::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::::insert(network_id, increased_gatekeeper_amount); + NetworkImbalance::::put(imbalance_state); Ok(final_amount) } @@ -862,23 +864,25 @@ impl NetworkDataMutateHandler> for Pallet::try_mutate(network_id, |gatekeeper_amount| -> Result<(), ()> { - *gatekeeper_amount = gatekeeper_amount.checked_sub(&amount).ok_or(())?; - Ok(()) - })?; + let decreased_gatekeeper_amount = GatekeeperAmounts::::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::::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::::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::::insert(network_id, decreased_gatekeeper_amount); + NetworkImbalance::::put(imbalance_state); Ok(final_amount) }