Newer
Older
//! Mocks for the tokens module.
#![cfg(test)]
impl_outer_event, impl_outer_origin, parameter_types,
traits::{ChangeMembers, Contains, ContainsLengthBound, GenesisBuild, SaturatingCurrencyToVote},
use orml_traits::{parameter_type_with_key, LockIdentifier};
use sp_runtime::{
testing::Header,
traits::{AccountIdConversion, IdentityLookup},
AccountId32, ModuleId, Permill,
pub type AccountId = AccountId32;
pub type CurrencyId = u32;
pub type Balance = u64;
pub const DOT: CurrencyId = 1;
pub const BTC: CurrencyId = 2;
pub const ETH: CurrencyId = 3;
pub const ALICE: AccountId = AccountId32::new([0u8; 32]);
pub const BOB: AccountId = AccountId32::new([1u8; 32]);
pub const TREASURY_ACCOUNT: AccountId = AccountId32::new([2u8; 32]);
pub const ID_1: LockIdentifier = *b"1 ";
pub const ID_2: LockIdentifier = *b"2 ";
impl_outer_origin! {
pub enum Origin for Runtime {}
}
mod tokens {
pub use crate::Event;
}
impl_outer_event! {
pub enum TestEvent for Runtime {
pallet_treasury<T>,
pallet_elections_phragmen<T>,
}
}
// Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted.
#[derive(Clone, PartialEq, Eq, Debug)]
pub struct Runtime;
parameter_types! {
pub const BlockHashCount: u64 = 250;
}
type Call = ();
type Index = u64;
type BlockNumber = u64;
type Hash = H256;
type AccountId = AccountId;
type Lookup = IdentityLookup<Self::AccountId>;
type Header = Header;
type Event = TestEvent;
type BlockHashCount = BlockHashCount;
type BlockWeights = ();
type BlockLength = ();
pub type System = frame_system::Module<Runtime>;
static TEN_TO_FOURTEEN: RefCell<Vec<AccountId>> = RefCell::new(vec![
AccountId32::new([10u8; 32]),
AccountId32::new([11u8; 32]),
AccountId32::new([12u8; 32]),
AccountId32::new([13u8; 32]),
AccountId32::new([14u8; 32]),
]);
impl Contains<AccountId> for TenToFourteen {
fn sorted_members() -> Vec<AccountId> {
TEN_TO_FOURTEEN.with(|v| v.borrow().clone())
}
#[cfg(feature = "runtime-benchmarks")]
TEN_TO_FOURTEEN.with(|v| {
let mut members = v.borrow_mut();
members.push(*new);
members.sort();
})
}
}
impl ContainsLengthBound for TenToFourteen {
fn max_len() -> usize {
TEN_TO_FOURTEEN.with(|v| v.borrow().len())
}
fn min_len() -> usize {
0
}
}
parameter_types! {
pub const ProposalBond: Permill = Permill::from_percent(5);
pub const ProposalBondMinimum: u64 = 1;
pub const SpendPeriod: u64 = 2;
pub const Burn: Permill = Permill::from_percent(50);
pub const TreasuryModuleId: ModuleId = ModuleId(*b"py/trsry");
type ModuleId = TreasuryModuleId;
type Currency = CurrencyAdapter<Runtime, GetTokenId>;
type ApproveOrigin = frame_system::EnsureRoot<AccountId>;
type RejectOrigin = frame_system::EnsureRoot<AccountId>;
type ProposalBond = ProposalBond;
type ProposalBondMinimum = ProposalBondMinimum;
type SpendPeriod = SpendPeriod;
type Burn = Burn;
pub type Treasury = pallet_treasury::Module<Runtime>;
pub static MEMBERS: RefCell<Vec<AccountId>> = RefCell::new(vec![]);
pub static PRIME: RefCell<Option<AccountId>> = RefCell::new(None);
impl ChangeMembers<AccountId> for TestChangeMembers {
fn change_members_sorted(incoming: &[AccountId], outgoing: &[AccountId], new: &[AccountId]) {
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
// new, incoming, outgoing must be sorted.
let mut new_sorted = new.to_vec();
new_sorted.sort();
assert_eq!(new, &new_sorted[..]);
let mut incoming_sorted = incoming.to_vec();
incoming_sorted.sort();
assert_eq!(incoming, &incoming_sorted[..]);
let mut outgoing_sorted = outgoing.to_vec();
outgoing_sorted.sort();
assert_eq!(outgoing, &outgoing_sorted[..]);
// incoming and outgoing must be disjoint
for x in incoming.iter() {
assert!(outgoing.binary_search(x).is_err());
}
let mut old_plus_incoming = MEMBERS.with(|m| m.borrow().to_vec());
old_plus_incoming.extend_from_slice(incoming);
old_plus_incoming.sort();
let mut new_plus_outgoing = new.to_vec();
new_plus_outgoing.extend_from_slice(outgoing);
new_plus_outgoing.sort();
assert_eq!(
old_plus_incoming, new_plus_outgoing,
"change members call is incorrect!"
);
MEMBERS.with(|m| *m.borrow_mut() = new.to_vec());
PRIME.with(|p| *p.borrow_mut() = None);
}
PRIME.with(|p| *p.borrow_mut() = who);
}
}
parameter_types! {
pub const ElectionsPhragmenModuleId: LockIdentifier = *b"phrelect";
pub const CandidacyBond: u64 = 3;
pub const VotingBond: u64 = 2;
pub const DesiredMembers: u32 = 2;
pub const DesiredRunnersUp: u32 = 2;
pub const TermDuration: u64 = 5;
pub const VotingBondBase: u64 = 2;
pub const VotingBondFactor: u64 = 0;
impl pallet_elections_phragmen::Config for Runtime {
type ModuleId = ElectionsPhragmenModuleId;
type Event = TestEvent;
type Currency = CurrencyAdapter<Runtime, GetTokenId>;
type ChangeMembers = TestChangeMembers;
type InitializeMembers = ();
type CandidacyBond = CandidacyBond;
type VotingBondBase = VotingBondBase;
type VotingBondFactor = VotingBondFactor;
type TermDuration = TermDuration;
type DesiredMembers = DesiredMembers;
type DesiredRunnersUp = DesiredRunnersUp;
type LoserCandidate = ();
type KickedMember = ();
type WeightInfo = ();
}
pub ExistentialDeposits: |currency_id: CurrencyId| -> Balance {
match currency_id {
&BTC => 1,
&DOT => 2,
_ => 0,
}
};
}
parameter_types! {
pub DustAccount: AccountId = ModuleId(*b"orml/dst").into_account();
type Event = TestEvent;
type Balance = Balance;
type ExistentialDeposits = ExistentialDeposits;
type OnDust = TransferDust<Runtime, DustAccount>;
pub type TreasuryCurrencyAdapter = <Runtime as pallet_treasury::Config>::Currency;
endowed_accounts: Vec<(AccountId, CurrencyId, Balance)>,
}
impl Default for ExtBuilder {
fn default() -> Self {
Self {
endowed_accounts: vec![],
pub fn balances(mut self, endowed_accounts: Vec<(AccountId, CurrencyId, Balance)>) -> Self {
self.endowed_accounts = endowed_accounts;
self
}
pub fn one_hundred_for_alice_n_bob(self) -> Self {
self.balances(vec![(ALICE, DOT, 100), (BOB, DOT, 100)])
pub fn one_hundred_for_treasury_account(mut self) -> Self {
self.treasury_genesis = true;
.build_storage::<Runtime>()
.unwrap();
GenesisConfig::<Runtime> {
endowed_accounts: self.endowed_accounts,
}
.assimilate_storage(&mut t)
.unwrap();
if self.treasury_genesis {
pallet_treasury::GenesisConfig::default()
.unwrap();
pallet_elections_phragmen::GenesisConfig::<Runtime> {
members: vec![(TREASURY_ACCOUNT, 10)],
}
.assimilate_storage(&mut t)
.unwrap();
}
let mut ext = sp_io::TestExternalities::new(t);
ext.execute_with(|| System::set_block_number(1));
ext