From 95a2ac9adcd6dde3499ec3a6d72597e22f2f0d4a Mon Sep 17 00:00:00 2001 From: jaypan Date: Wed, 18 Dec 2024 16:45:43 +0100 Subject: [PATCH] Add commission rate and the wait list --- pallets/parachain-staking/src/lib.rs | 3 +- .../parachain-staking/ParachainStaking.sol | 5 ++ precompiles/parachain-staking/src/lib.rs | 51 +++++++++++++++++-- 3 files changed, 53 insertions(+), 6 deletions(-) diff --git a/pallets/parachain-staking/src/lib.rs b/pallets/parachain-staking/src/lib.rs index 31669ea6..97bea90c 100644 --- a/pallets/parachain-staking/src/lib.rs +++ b/pallets/parachain-staking/src/lib.rs @@ -576,9 +576,10 @@ pub mod pallet { /// /// It maps from an account to its information. /// Moreover, it counts the number of candidates. + /// Precompiles will call this structure to list all #[pallet::storage] #[pallet::getter(fn candidate_pool)] - pub(crate) type CandidatePool = CountedStorageMap< + pub type CandidatePool = CountedStorageMap< _, Twox64Concat, T::AccountId, diff --git a/precompiles/parachain-staking/ParachainStaking.sol b/precompiles/parachain-staking/ParachainStaking.sol index a4b5b782..0ef1c503 100644 --- a/precompiles/parachain-staking/ParachainStaking.sol +++ b/precompiles/parachain-staking/ParachainStaking.sol @@ -16,12 +16,17 @@ interface ParachainStaking { struct CollatorInfo { bytes32 owner; uint256 amount; + uint256 commission; } /// Get all collator informations // selector: 0xaaacb283 function getCollatorList() external view returns (CollatorInfo[] memory); + /// Get all wait informations + // selector: 0x83d2afed + function getWaitList() external view returns (CollatorInfo[] memory); + /// Join the set of delegators by delegating to a collator candidate /// selector: 0xd9f511cd function joinDelegators(bytes32 collator, uint256 stake) external; diff --git a/precompiles/parachain-staking/src/lib.rs b/precompiles/parachain-staking/src/lib.rs index 39a0f6e7..e38b7ef0 100644 --- a/precompiles/parachain-staking/src/lib.rs +++ b/precompiles/parachain-staking/src/lib.rs @@ -50,6 +50,7 @@ pub struct ParachainStakingPrecompile(PhantomData); pub struct CollatorInfo { owner: H256, amount: U256, + commission: U256, } #[precompile_utils::precompile] @@ -73,13 +74,53 @@ where handle.record_db_read::(7200)?; - Ok(parachain_staking::Pallet::::top_candidates() + let all_collators = parachain_staking::CandidatePool::::iter() + .map(|(_id, stake_info)| { + CollatorInfo { + owner: H256::from( as Into<[u8; 32]>>::into(stake_info.id)), + amount: stake_info.stake.into(), + commission: U256::from(stake_info.commission.deconstruct() as u128), + } + }).collect::>(); + let top_candiate = parachain_staking::Pallet::::top_candidates() .into_iter() - .map(|stake_info| CollatorInfo { - owner: H256::from( as Into<[u8; 32]>>::into(stake_info.owner)), - amount: stake_info.amount.into(), + .map(|stake_info| { + H256::from( as Into<[u8; 32]>>::into(stake_info.owner)) }) - .collect::>()) + .collect::>(); + let candidate_list = all_collators + .into_iter() + .filter(|x| top_candiate.contains(&x.owner)); + Ok(candidate_list.collect::>()) + } + + #[precompile::public("getWaitList()")] + #[precompile::public("get_wait_list()")] + #[precompile::view] + fn get_wait_list(handle: &mut impl PrecompileHandle) -> EvmResult> { + // CandidatePool: UnBoundedVec(AccountId(32) + Balance(16)) + // we account for a theoretical 150 pool. + + handle.record_db_read::(7200)?; + + let all_collators = parachain_staking::CandidatePool::::iter() + .map(|(_id, stake_info)| { + CollatorInfo { + owner: H256::from( as Into<[u8; 32]>>::into(stake_info.id)), + amount: stake_info.stake.into(), + commission: U256::from(stake_info.commission.deconstruct() as u128), + } + }).collect::>(); + let top_candiate = parachain_staking::Pallet::::top_candidates() + .into_iter() + .map(|stake_info| { + H256::from( as Into<[u8; 32]>>::into(stake_info.owner)) + }) + .collect::>(); + let candidate_list = all_collators + .into_iter() + .filter(|x| !top_candiate.contains(&x.owner)); + Ok(candidate_list.collect::>()) } #[precompile::public("joinDelegators(bytes32,uint256)")]