avoid errors from minting sub-existential balance
Signed-off-by: Uncle Stinky <uncle.stinky@ghostchain.io>
This commit is contained in:
parent
7be24ed139
commit
5beb22f116
6
Cargo.lock
generated
6
Cargo.lock
generated
@ -3648,7 +3648,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ghost-networks"
|
name = "ghost-networks"
|
||||||
version = "0.1.5"
|
version = "0.1.6"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"frame-benchmarking",
|
"frame-benchmarking",
|
||||||
"frame-support",
|
"frame-support",
|
||||||
@ -3834,7 +3834,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ghost-slow-clap"
|
name = "ghost-slow-clap"
|
||||||
version = "0.3.23"
|
version = "0.3.24"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"frame-benchmarking",
|
"frame-benchmarking",
|
||||||
"frame-support",
|
"frame-support",
|
||||||
@ -3870,7 +3870,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ghost-traits"
|
name = "ghost-traits"
|
||||||
version = "0.3.21"
|
version = "0.3.22"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"frame-support",
|
"frame-support",
|
||||||
"sp-runtime 31.0.1",
|
"sp-runtime 31.0.1",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "ghost-slow-clap"
|
name = "ghost-slow-clap"
|
||||||
version = "0.3.23"
|
version = "0.3.24"
|
||||||
description = "Applause protocol for the EVM bridge"
|
description = "Applause protocol for the EVM bridge"
|
||||||
license.workspace = true
|
license.workspace = true
|
||||||
authors.workspace = true
|
authors.workspace = true
|
||||||
|
@ -28,7 +28,7 @@ use sp_runtime::{
|
|||||||
self as rt_offchain, HttpError,
|
self as rt_offchain, HttpError,
|
||||||
storage::{MutateStorageError, StorageRetrievalError, StorageValueRef},
|
storage::{MutateStorageError, StorageRetrievalError, StorageValueRef},
|
||||||
},
|
},
|
||||||
traits::{CheckedSub, BlockNumberProvider, Convert, Saturating},
|
traits::{BlockNumberProvider, Convert, Saturating},
|
||||||
};
|
};
|
||||||
use sp_std::{
|
use sp_std::{
|
||||||
vec::Vec, prelude::*,
|
vec::Vec, prelude::*,
|
||||||
@ -330,6 +330,7 @@ pub mod pallet {
|
|||||||
UnregisteredClapRemove,
|
UnregisteredClapRemove,
|
||||||
TooMuchAuthorities,
|
TooMuchAuthorities,
|
||||||
CouldNotAccumulateCommission,
|
CouldNotAccumulateCommission,
|
||||||
|
CouldNotAccumulateIncomingImbalance,
|
||||||
CouldNotIncreaseGatekeeperAmount,
|
CouldNotIncreaseGatekeeperAmount,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -580,25 +581,21 @@ impl<T: Config> Pallet<T> {
|
|||||||
.map(|network_data| Perbill::from_parts(network_data.incoming_fee))
|
.map(|network_data| Perbill::from_parts(network_data.incoming_fee))
|
||||||
.unwrap_or_default()
|
.unwrap_or_default()
|
||||||
.mul_ceil(clap.amount);
|
.mul_ceil(clap.amount);
|
||||||
|
let final_amount = clap.amount.saturating_sub(commission);
|
||||||
|
|
||||||
let final_amount = clap.amount
|
let _ = T::NetworkDataHandler::increase_gatekeeper_amount(&clap.network_id, &clap.amount)
|
||||||
.checked_sub(&commission)
|
|
||||||
.map(|value| T::Currency::minimum_balance()
|
|
||||||
.lt(&value)
|
|
||||||
.then(|| value)
|
|
||||||
)
|
|
||||||
.flatten()
|
|
||||||
.unwrap_or_default();
|
|
||||||
|
|
||||||
let _ = T::NetworkDataHandler::increase_gatekeeper_amount(&clap.network_id, &final_amount)
|
|
||||||
.map_err(|_| Error::<T>::CouldNotIncreaseGatekeeperAmount)?;
|
.map_err(|_| Error::<T>::CouldNotIncreaseGatekeeperAmount)?;
|
||||||
|
let _ = T::NetworkDataHandler::accumulate_incoming_imbalance(&final_amount)
|
||||||
|
.map_err(|_| Error::<T>::CouldNotAccumulateIncomingImbalance)?;
|
||||||
let _ = T::NetworkDataHandler::accumulate_commission(&commission)
|
let _ = T::NetworkDataHandler::accumulate_commission(&commission)
|
||||||
.map_err(|_| Error::<T>::CouldNotAccumulateCommission)?;
|
.map_err(|_| Error::<T>::CouldNotAccumulateCommission)?;
|
||||||
|
|
||||||
|
if final_amount > T::Currency::minimum_balance() {
|
||||||
T::Currency::mint_into(
|
T::Currency::mint_into(
|
||||||
&clap.receiver,
|
&clap.receiver,
|
||||||
final_amount
|
final_amount
|
||||||
)?;
|
)?;
|
||||||
|
}
|
||||||
|
|
||||||
*is_applaused = true;
|
*is_applaused = true;
|
||||||
|
|
||||||
|
@ -265,7 +265,7 @@ fn should_increase_gatkeeper_amount_accordingly() {
|
|||||||
assert_ok!(do_clap_from(session_index, network_id, 1, false));
|
assert_ok!(do_clap_from(session_index, network_id, 1, false));
|
||||||
assert_ok!(do_clap_from(session_index, network_id, 2, false));
|
assert_ok!(do_clap_from(session_index, network_id, 2, false));
|
||||||
|
|
||||||
assert_eq!(Networks::gatekeeper_amount(network_id), amount.saturating_div(2));
|
assert_eq!(Networks::gatekeeper_amount(network_id), amount);
|
||||||
assert_eq!(Networks::bridged_imbalance().bridged_in, amount.saturating_div(2));
|
assert_eq!(Networks::bridged_imbalance().bridged_in, amount.saturating_div(2));
|
||||||
assert_eq!(Networks::bridged_imbalance().bridged_out, 0);
|
assert_eq!(Networks::bridged_imbalance().bridged_out, 0);
|
||||||
});
|
});
|
||||||
@ -594,7 +594,7 @@ fn should_throw_error_on_commission_overflow() {
|
|||||||
assert_ok!(SlowClap::slow_clap(RuntimeOrigin::none(), clap, signature));
|
assert_ok!(SlowClap::slow_clap(RuntimeOrigin::none(), clap, signature));
|
||||||
} else {
|
} else {
|
||||||
assert_err!(SlowClap::slow_clap(RuntimeOrigin::none(), clap, signature),
|
assert_err!(SlowClap::slow_clap(RuntimeOrigin::none(), clap, signature),
|
||||||
Error::<Runtime>::CouldNotIncreaseGatekeeperAmount);
|
Error::<Runtime>::CouldNotAccumulateIncomingImbalance);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -617,19 +617,19 @@ fn should_nullify_commission_on_finalize() {
|
|||||||
let (_, _, amount) = get_mocked_metadata();
|
let (_, _, amount) = get_mocked_metadata();
|
||||||
|
|
||||||
new_test_ext().execute_with(|| {
|
new_test_ext().execute_with(|| {
|
||||||
let _ = prepare_evm_network(Some(network_id), Some(500_000_000));
|
let _ = prepare_evm_network(Some(network_id), Some(1_000_000_000));
|
||||||
let session_index = advance_session_and_get_index();
|
let session_index = advance_session_and_get_index();
|
||||||
|
|
||||||
assert_eq!(Networks::accumulated_commission(), 0);
|
assert_eq!(Networks::accumulated_commission(), 0);
|
||||||
assert_ok!(do_clap_from(session_index, network_id, 0, false));
|
assert_ok!(do_clap_from(session_index, network_id, 0, false));
|
||||||
assert_ok!(do_clap_from(session_index, network_id, 1, false));
|
assert_ok!(do_clap_from(session_index, network_id, 1, false));
|
||||||
assert_eq!(Networks::accumulated_commission(), amount.saturating_div(2));
|
assert_eq!(Networks::accumulated_commission(), amount);
|
||||||
assert_eq!(Networks::is_nullification_period(), false);
|
assert_eq!(Networks::is_nullification_period(), false);
|
||||||
|
|
||||||
assert_eq!(BridgedInflationCurve::<RewardCurve, Runtime>::era_payout(
|
assert_eq!(BridgedInflationCurve::<RewardCurve, Runtime>::era_payout(
|
||||||
total_staked,
|
total_staked,
|
||||||
(total_issuance + amount).into(),
|
total_issuance,
|
||||||
0), (1260099399952u128, 208739900600048u128)); // precomputed values
|
0), (420000000000000, 0)); // precomputed values
|
||||||
assert_eq!(Networks::is_nullification_period(), true);
|
assert_eq!(Networks::is_nullification_period(), true);
|
||||||
Networks::on_finalize(System::block_number());
|
Networks::on_finalize(System::block_number());
|
||||||
|
|
||||||
@ -793,10 +793,40 @@ fn should_emit_event_on_each_clap_and_on_applause() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn should_not_fail_on_sub_existential_balance() {
|
||||||
|
let (network_id, transaction_hash, unique_transaction_hash)
|
||||||
|
= generate_unique_hash(None, None, None, None);
|
||||||
|
let (_, receiver, amount) = get_mocked_metadata();
|
||||||
|
|
||||||
|
new_test_ext().execute_with(|| {
|
||||||
|
let _ = prepare_evm_network(Some(network_id), Some(1_000_000_000)); // 100%
|
||||||
|
let session_index = advance_session_and_get_index();
|
||||||
|
let received_claps_key = (session_index, transaction_hash, unique_transaction_hash);
|
||||||
|
|
||||||
|
assert_eq!(Networks::accumulated_commission(), 0);
|
||||||
|
assert_eq!(Networks::gatekeeper_amount(network_id), 0);
|
||||||
|
assert_eq!(Networks::bridged_imbalance().bridged_in, 0);
|
||||||
|
assert_eq!(Networks::bridged_imbalance().bridged_out, 0);
|
||||||
|
assert_eq!(Balances::balance(&receiver), 0);
|
||||||
|
assert_eq!(SlowClap::applauses_for_transaction(&received_claps_key), false);
|
||||||
|
|
||||||
|
assert_ok!(do_clap_from(session_index, network_id, 0, false));
|
||||||
|
assert_ok!(do_clap_from(session_index, network_id, 1, false));
|
||||||
|
assert_ok!(do_clap_from(session_index, network_id, 2, false));
|
||||||
|
|
||||||
|
assert_eq!(Networks::accumulated_commission(), amount);
|
||||||
|
assert_eq!(Networks::gatekeeper_amount(network_id), amount);
|
||||||
|
assert_eq!(Networks::bridged_imbalance().bridged_in, 0);
|
||||||
|
assert_eq!(Networks::bridged_imbalance().bridged_out, 0);
|
||||||
|
assert_eq!(Balances::balance(&receiver), 0);
|
||||||
|
assert_eq!(SlowClap::applauses_for_transaction(&received_claps_key), true);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: multiple logs will create multiple records
|
// TODO: multiple logs will create multiple records
|
||||||
// TODO: errors should be checked as much as possible
|
// TODO: errors should be checked as much as possible
|
||||||
// TODO: offences generated as expected
|
// TODO: offences generated as expected
|
||||||
// TODO: deal with below existential amount after commission
|
|
||||||
|
|
||||||
fn advance_session_and_get_index() -> u32 {
|
fn advance_session_and_get_index() -> u32 {
|
||||||
advance_session();
|
advance_session();
|
||||||
|
Loading…
Reference in New Issue
Block a user