Skip to content

Commit

Permalink
Merge pull request Magport#122 from Magport/Magnet-Stack-toints
Browse files Browse the repository at this point in the history
feat: Configurable Address and Proportion in Profit Distribution
  • Loading branch information
wd30130 authored Jul 29, 2024
2 parents 64017b3 + 04549a8 commit 858b122
Show file tree
Hide file tree
Showing 6 changed files with 97 additions and 46 deletions.
16 changes: 14 additions & 2 deletions node/src/chain_spec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ use parachain_magnet_runtime::{AccountId, AuraId, Signature, EXISTENTIAL_DEPOSIT
use sc_chain_spec::{ChainSpecExtension, ChainSpecGroup};
use sc_service::ChainType;
use serde::{Deserialize, Serialize};
use sp_core::{sr25519, Pair, Public, H160, U256};
use sp_core::{crypto::Ss58Codec, sr25519, Pair, Public, H160, U256};
use sp_runtime::traits::{IdentifyAccount, Verify};
use sp_runtime::AccountId32;
use sp_std::marker::PhantomData;
use std::{collections::BTreeMap, str::FromStr};

Expand Down Expand Up @@ -166,6 +167,9 @@ pub fn local_testnet_config() -> ChainSpec {
.build()
}

fn get_account_id_from_address(address: &str) -> AccountId32 {
AccountId32::from_ss58check(address).expect("Invalid address")
}
fn testnet_genesis(
invulnerables: Vec<(AccountId, AuraId)>,
endowed_accounts: Vec<AccountId>,
Expand All @@ -175,6 +179,11 @@ fn testnet_genesis(
let alice = get_from_seed::<sr25519::Public>("Alice");
let bob = get_from_seed::<sr25519::Public>("Bob");

let op_account1 =
get_account_id_from_address("5GP7etLvS2VLLfUar7Q2TkQkaxHweYnDvrhh3s5hhf8eorPW");
let op_account2 =
get_account_id_from_address("5CFuj7WxZAyinLxoqAJ8NH4yEEVXUUSHi9LRhodC3HyzHvN4");

let evm_accounts = {
let mut map = BTreeMap::new();
map.insert(
Expand Down Expand Up @@ -300,7 +309,10 @@ fn testnet_genesis(
"adminKey": Some(root.clone()),
"systemRatio": 20_000_0000,
"treasuryRatio": 33_000_0000,
"operationRatio": 25_000_0000,
"operationRatios": vec![
(op_account1.clone(), 15_000_0000),
(op_account2.clone(), 10_000_0000)
],
"collatorRatio": 22_000_0000,
"minLiquidationThreshold": 20_000_000_000_000_000u128,
"profitDistributionCycle": 10,
Expand Down
1 change: 1 addition & 0 deletions pallets/liquidation/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ std = [
"xcm-builder/std",
"cumulus-pallet-xcmp-queue/std",
"xcm-executor/std",
"sp-consensus-aura/std",
]
try-runtime = [
"frame-support/try-runtime",
Expand Down
87 changes: 50 additions & 37 deletions pallets/liquidation/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -128,8 +128,9 @@ pub mod pallet {
pub type TreasuryRatio<T: Config> = StorageValue<_, u32, ValueQuery>;

#[pallet::storage]
#[pallet::getter(fn operation_ratio)]
pub type OperationRatio<T: Config> = StorageValue<_, u32, ValueQuery>;
#[pallet::getter(fn operation_ratios)]
pub type OperationRatios<T: Config> =
StorageMap<_, Twox64Concat, T::AccountId, u32, ValueQuery>;

#[pallet::storage]
#[pallet::getter(fn collator_ratio)]
Expand All @@ -155,7 +156,7 @@ pub mod pallet {
pub admin_key: Option<T::AccountId>,
pub system_ratio: u32,
pub treasury_ratio: u32,
pub operation_ratio: u32,
pub operation_ratios: Vec<(T::AccountId, u32)>,
pub collator_ratio: u32,
pub min_liquidation_threshold: Balance,
pub profit_distribution_cycle: BlockNumberFor<T>,
Expand All @@ -167,7 +168,7 @@ pub mod pallet {
assert!(
self.system_ratio
+ self.treasury_ratio
+ self.operation_ratio
+ self.operation_ratios.iter().map(|(_, r)| *r).sum::<u32>()
+ self.collator_ratio
<= 100 * (PERCENT_UNIT as u32),
"Ratio sum must be <= 100%"
Expand All @@ -186,10 +187,12 @@ pub mod pallet {
}
SystemRatio::<T>::put(self.system_ratio);
TreasuryRatio::<T>::put(self.treasury_ratio);
OperationRatio::<T>::put(self.operation_ratio);
CollatorRatio::<T>::put(self.collator_ratio);
MinLiquidationThreshold::<T>::put(self.min_liquidation_threshold);
ProfitDistributionCycle::<T>::put(self.profit_distribution_cycle);
for (account, ratio) in &self.operation_ratios {
OperationRatios::<T>::insert(account, ratio);
}
}
}

Expand Down Expand Up @@ -224,8 +227,8 @@ pub mod pallet {
/// Set treasury ratio
TreasuryRatioSet(u32),

/// Set operation ratio
OperationRatioSet(u32),
/// Set operation ratio for a specific account
OperationRatioSet(T::AccountId, u32),

///Set collator ratio
CollatorRatioSet(u32),
Expand Down Expand Up @@ -466,44 +469,50 @@ pub mod pallet {
Error::<T>::GetPotAccountError
})?;

/*
let operation_account = pallet_pot::Pallet::<T>::ensure_pot(
T::OperationAccountName::get(),
)
.map_err(|err| {
log::error!("get maintenance account err:{:?}", err);
Error::<T>::GetPotAccountError
})?;
*/

let system_ratio = SystemRatio::<T>::get();
//let system_ratio = SystemRatio::<T>::get();
let treasury_ratio = TreasuryRatio::<T>::get();
let operation_ratio = OperationRatio::<T>::get();
let collators_ratio = CollatorRatio::<T>::get();
//let total_operation_ratio: u32 = OperationRatios::<T>::iter().map(|(_, r)| r).sum();

let treasury_amount = (treasury_ratio as u128) / PERCENT_UNIT * total_profit
/ PARACHAIN_TO_RELAYCHAIN_UNIT;
let operation_amount = (operation_ratio as u128) / PERCENT_UNIT * total_profit;
let system_amount = (system_ratio as u128) / PERCENT_UNIT * total_profit;
/ 100 / PARACHAIN_TO_RELAYCHAIN_UNIT;
//let operation_amount = (operation_ratio as u128) / PERCENT_UNIT * total_profit;
//let system_amount = (system_ratio as u128) / PERCENT_UNIT * total_profit;
let total_collators_profit =
total_profit.saturating_sub(treasury_amount + operation_amount + system_amount);
(collators_ratio as u128) / PERCENT_UNIT * total_profit / 100;

let origin: OriginFor<T> =
frame_system::RawOrigin::Signed(treasury_account.clone()).into();

let _send_treasury_profit = Self::send_assets_to_relaychain_treasury(
origin,
treasury_account.into(),
treasury_account.clone().into(),
treasury_amount,
)?;

let mut transfers = Vec::new();
/*

let treasury_amount_parachain = treasury_amount * PARACHAIN_TO_RELAYCHAIN_UNIT;
let treasury_account_profit =
treasury_amount.try_into().unwrap_or_else(|_| Zero::zero());
treasury_amount_parachain.try_into().unwrap_or_else(|_| Zero::zero());
transfers.push((treasury_account, treasury_account_profit));
*/

let operation_account_profit =
operation_amount.try_into().unwrap_or_else(|_| Zero::zero());
transfers.push((operation_account, operation_account_profit));
for (operation_account, ratio) in OperationRatios::<T>::iter() {
let operation_amount = (ratio as u128) / PERCENT_UNIT * total_profit / 100;
let operation_account_profit =
operation_amount.try_into().unwrap_or_else(|_| Zero::zero());
transfers.push((operation_account, operation_account_profit));
}

for (collator, collator_cost) in CollatorRealGasCosts::<T>::iter() {
let collator_ratio = Percent::from_rational(collator_cost, total_cost);
Expand Down Expand Up @@ -603,7 +612,7 @@ pub mod pallet {
ensure_root_or_admin::<T>(origin)?;

let treasury_ratio = TreasuryRatio::<T>::get();
let operation_ratio = OperationRatio::<T>::get();
let operation_ratio = OperationRatios::<T>::iter().map(|(_, r)| r).sum();
let collator_ratio = CollatorRatio::<T>::get();

let total_ratio = treasury_ratio + ratio + operation_ratio + collator_ratio;
Expand All @@ -627,7 +636,7 @@ pub mod pallet {
ensure_root_or_admin::<T>(origin)?;

let system_ratio = SystemRatio::<T>::get();
let operation_ratio = OperationRatio::<T>::get();
let operation_ratio = OperationRatios::<T>::iter().map(|(_, r)| r).sum();
let collator_ratio = CollatorRatio::<T>::get();

let total_ratio = system_ratio + ratio + operation_ratio + collator_ratio;
Expand All @@ -648,25 +657,29 @@ pub mod pallet {

#[pallet::call_index(3)]
#[pallet::weight(Weight::from_parts(10_000, 0) + T::DbWeight::get().writes(1))]
pub fn set_operation_ratio(origin: OriginFor<T>, ratio: u32) -> DispatchResultWithPostInfo {
pub fn set_operation_ratio(
origin: OriginFor<T>,
operation_account: T::AccountId,
ratio: u32,
) -> DispatchResultWithPostInfo {
ensure_root_or_admin::<T>(origin)?;

let system_ratio = SystemRatio::<T>::get();
let treasury_ratio = TreasuryRatio::<T>::get();
let collator_ratio = CollatorRatio::<T>::get();

let total_ratio = system_ratio + treasury_ratio + ratio + collator_ratio;
log::info!("3 -+-+-+-+-+ set operation ratio, total ratio:{:?}, system_ratio:{:?}, treasury_ratio:{:?}, collator_ratio:{:?}, operation_ratio:{:?}",
total_ratio, system_ratio, treasury_ratio, collator_ratio, ratio);
ensure_total_ratio_not_exceed_one::<T>(
system_ratio,
treasury_ratio,
ratio,
collator_ratio,
)?;

OperationRatio::<T>::put(ratio);
Self::deposit_event(Event::OperationRatioSet(ratio));
let total_existing_operation_ratio: u32 =
OperationRatios::<T>::iter().map(|(_, r)| r).sum();
let total_ratio = system_ratio
+ treasury_ratio + collator_ratio
+ total_existing_operation_ratio
+ ratio;
log::info!("3 -+-+-+-+-+ set operation ratio, total ratio:{:?}, system_ratio:{:?}, treasury_ratio:{:?}, collator_ratio:{:?}, operation account:{:?}, op_ratio:{:?}",
total_ratio, system_ratio, treasury_ratio, collator_ratio, operation_account, ratio);

ensure!((total_ratio as u128) <= 100 * PERCENT_UNIT, Error::<T>::InvalidRatio);

OperationRatios::<T>::insert(operation_account.clone(), ratio);
Self::deposit_event(Event::OperationRatioSet(operation_account, ratio));
Ok(Pays::No.into())
}

Expand All @@ -677,7 +690,7 @@ pub mod pallet {

let system_ratio = SystemRatio::<T>::get();
let treasury_ratio = TreasuryRatio::<T>::get();
let operation_ratio = OperationRatio::<T>::get();
let operation_ratio = OperationRatios::<T>::iter().map(|(_, r)| r).sum();

let total_ratio = system_ratio + treasury_ratio + ratio + operation_ratio;
log::info!("4. *********** set collator ratio, total ratio:{:?}, system_ratio:{:?}, treasury_ratio:{:?}, operation_ratio:{:?}, collator_ratio:{:?}",
Expand Down
10 changes: 5 additions & 5 deletions pallets/liquidation/src/mock.rs
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,7 @@ pub struct ExtBuilder {
existential_deposit: u128,
system_ratio: u32,
treasury_ratio: u32,
operation_ratio: u32,
operation_ratios: Vec<(AccountId, u32)>,
collator_ratio: u32,
min_liquidation_threshold: Balance,
profit_distribution_cycle: u64,
Expand All @@ -322,7 +322,7 @@ impl Default for ExtBuilder {
existential_deposit: 1,
system_ratio: 20_000_0000,
treasury_ratio: 33_000_0000,
operation_ratio: 25_000_0000,
operation_ratios: vec![(AccountId32::new([1u8; 32]), 25_000_000)],
collator_ratio: 22_000_0000,
min_liquidation_threshold: MILLIUNIT * 20,
profit_distribution_cycle: 10,
Expand All @@ -346,8 +346,8 @@ impl ExtBuilder {
self
}

pub fn operation_ratio(mut self, ratio: u32) -> Self {
self.operation_ratio = ratio;
pub fn operation_ratio(mut self, ratio: Vec<(AccountId, u32)>) -> Self {
self.operation_ratios = ratio;
self
}

Expand Down Expand Up @@ -378,7 +378,7 @@ impl ExtBuilder {
admin_key: Some(SYSTEM_ACCOUNT),
system_ratio: self.system_ratio,
treasury_ratio: self.treasury_ratio,
operation_ratio: self.operation_ratio,
operation_ratios: self.operation_ratios.clone(),
collator_ratio: self.collator_ratio,
min_liquidation_threshold: self.min_liquidation_threshold,
profit_distribution_cycle: self.profit_distribution_cycle,
Expand Down
27 changes: 26 additions & 1 deletion pallets/liquidation/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ fn distribute_profit_should_work() {
.existential_deposit(100)
.system_ratio(20_000_0000)
.treasury_ratio(33_000_0000)
.operation_ratio(25_000_0000)
.operation_ratio(vec![(AccountId32::new([1u8; 32]), 25_000_0000)])
.collator_ratio(22_000_0000)
.min_liquidation_threshold(20_000_000_000)
.profit_distribution_cycle(10)
Expand Down Expand Up @@ -38,3 +38,28 @@ fn distribute_profit_should_work() {
assert!(<CollatorRealGasCosts<Test>>::iter().next().is_none());
});
}

#[test]
fn set_operation_ratios_should_work() {
ExtBuilder::default().build().execute_with(|| {
let new_ratios = vec![
(AccountId32::new([1u8; 32]), 15_000_0000),
(AccountId32::new([2u8; 32]), 10_000_0000),
];

for (account, ratio) in new_ratios.clone() {
assert_ok!(Liquidation::set_operation_ratio(
RuntimeOrigin::root(),
account.clone(),
ratio
));
assert_eq!(OperationRatios::<Test>::get(account), ratio);
}

let total_ratio = SystemRatio::<Test>::get()
+ TreasuryRatio::<Test>::get()
+ CollatorRatio::<Test>::get()
+ OperationRatios::<Test>::iter().map(|(_, r)| r).sum::<u32>();
assert!(total_ratio <= 100 * PERCENT_UNIT as u32);
});
}
2 changes: 1 addition & 1 deletion runtime/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -987,7 +987,7 @@ impl pallet_utility::Config for Runtime {
parameter_types! {
pub const SystemRatio: Perbill = Perbill::from_percent(20); // 20% for system
pub const TreasuryRatio: Perbill = Perbill::from_percent(33); // 33% for treasury
pub const OperationRatio: Perbill = Perbill::from_percent(25); // 25% for maintenance
//pub const OperationRatio: Perbill = Perbill::from_percent(25); // 25% for maintenance
pub const ProfitDistributionCycle: BlockNumber = 10;
pub const ExistDeposit: Balance = EXISTENTIAL_DEPOSIT;
pub const MinLiquidationThreshold: Balance = MILLIUNIT * 20;
Expand Down

0 comments on commit 858b122

Please sign in to comment.