From 7997cec0cb9472d336995ed3c36f43bded838c52 Mon Sep 17 00:00:00 2001 From: Edwin Wang Date: Tue, 28 Sep 2021 20:21:04 +0800 Subject: [PATCH] Refactor Asgard runtime --- node/service/src/chain_spec/asgard.rs | 2 +- runtime/asgard/src/lib.rs | 302 +++++++++++++------------- runtime/bifrost/src/lib.rs | 2 +- 3 files changed, 159 insertions(+), 147 deletions(-) diff --git a/node/service/src/chain_spec/asgard.rs b/node/service/src/chain_spec/asgard.rs index 7447340a49..6b1f5f830f 100644 --- a/node/service/src/chain_spec/asgard.rs +++ b/node/service/src/chain_spec/asgard.rs @@ -67,7 +67,7 @@ pub fn asgard_genesis( council_membership: Default::default(), technical_membership: Default::default(), treasury: Default::default(), - elections: Default::default(), + phragmen_election: Default::default(), sudo: SudoConfig { key: root_key.clone() }, parachain_info: ParachainInfoConfig { parachain_id: id }, collator_selection: CollatorSelectionConfig { diff --git a/runtime/asgard/src/lib.rs b/runtime/asgard/src/lib.rs index 79e51f43db..25e76d3578 100644 --- a/runtime/asgard/src/lib.rs +++ b/runtime/asgard/src/lib.rs @@ -82,7 +82,8 @@ use bifrost_runtime_common::{ BifrostAccountIdToMultiLocation, BifrostAssetMatcher, BifrostCurrencyIdConvert, BifrostFilteredAssets, BifrostXcmTransactFilter, MultiWeightTraders, }, - EnsureRootOrAllTechnicalCommittee, SlowAdjustingFeeUpdate, + CouncilCollective, EnsureRootOrAllTechnicalCommittee, MoreThanHalfCouncil, + SlowAdjustingFeeUpdate, TechnicalCollective, }; use codec::{Decode, Encode, MaxEncodedLen}; use constants::{currency::*, time::*}; @@ -92,9 +93,10 @@ use frame_support::{ traits::{EnsureOrigin, OnRuntimeUpgrade}, }; pub use node_primitives::{ - AccountId, Amount, Balance, BlockNumber, CurrencyId, ExtraFeeName, Moment, Nonce, ParaId, - ParachainDerivedProxyAccountType, ParachainTransactProxyType, ParachainTransactType, PoolId, - RpcContributionStatus, TokenSymbol, TransferOriginType, XcmBaseWeight, + traits::CheckSubAccount, AccountId, Amount, Balance, BlockNumber, CurrencyId, ExtraFeeName, + Moment, Nonce, ParaId, ParachainDerivedProxyAccountType, ParachainTransactProxyType, + ParachainTransactType, PoolId, RpcContributionStatus, TokenSymbol, TransferOriginType, + XcmBaseWeight, }; // orml imports use orml_currencies::BasicCurrencyAdapter; @@ -154,8 +156,8 @@ const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(10); /// We allow `Normal` extrinsics to fill up the block up to 75%, the rest can be used /// by Operational extrinsics. const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); -/// We allow for 2 seconds of compute with a 6 second average block time. -const MAXIMUM_BLOCK_WEIGHT: Weight = 2 * WEIGHT_PER_SECOND; +/// We allow for .5 seconds of compute with a 12 second average block time. +const MAXIMUM_BLOCK_WEIGHT: Weight = WEIGHT_PER_SECOND / 2; parameter_types! { pub const BlockHashCount: BlockNumber = 250; @@ -190,6 +192,16 @@ parameter_types! { pub SelfParaId: u32 = ParachainInfo::parachain_id().into(); } +parameter_types! { + pub const TreasuryPalletId: PalletId = PalletId(*b"bf/trsry"); + pub const BifrostCrowdloanId: PalletId = PalletId(*b"bf/salp#"); + pub const LiquidityMiningPalletId: PalletId = PalletId(*b"bf/lm###"); +} + +pub fn get_all_pallet_accounts() -> Vec { + vec![TreasuryPalletId::get().into_account(), BifrostCrowdloanId::get().into_account()] +} + impl frame_system::Config for Runtime { type AccountData = pallet_balances::AccountData; /// The identifier used to distinguish between accounts. @@ -242,10 +254,10 @@ impl pallet_timestamp::Config for Runtime { } parameter_types! { - pub const ExistentialDeposit: u128 = 1 * MILLIBNC; - pub const TransferFee: u128 = 1 * MILLIBNC; - pub const CreationFee: u128 = 1 * MILLIBNC; - pub const TransactionByteFee: u128 = 1 * MICROBNC; + pub const ExistentialDeposit: Balance = 10 * MILLIBNC; + pub const TransferFee: Balance = 1 * MILLIBNC; + pub const CreationFee: Balance = 1 * MILLIBNC; + pub const TransactionByteFee: Balance = 1 * MICROBNC; pub const MaxLocks: u32 = 50; pub const MaxReserves: u32 = 50; } @@ -320,7 +332,7 @@ impl InstanceFilter for ProxyType { Call::Democracy(..) | Call::Council(..) | Call::TechnicalCommittee(..) | - Call::Elections(..) | + Call::PhragmenElection(..) | Call::TechnicalMembership(..) | Call::Treasury(..) | Call::Bounties(..) | @@ -336,9 +348,9 @@ impl InstanceFilter for ProxyType { c, Call::Democracy(..) | Call::Council(..) | Call::TechnicalCommittee(..) | - Call::Elections(..) | Call::Treasury(..) | - Call::Bounties(..) | Call::Tips(..) | - Call::Utility(..) + Call::PhragmenElection(..) | + Call::Treasury(..) | Call::Bounties(..) | + Call::Tips(..) | Call::Utility(..) ), ProxyType::CancelProxy => { matches!(c, Call::Proxy(pallet_proxy::Call::reject_announcement(..))) @@ -416,12 +428,11 @@ impl pallet_balances::Config for Runtime { } parameter_types! { - pub const CouncilMotionDuration: BlockNumber = 3 * DAYS; + pub const CouncilMotionDuration: BlockNumber = 2 * DAYS; pub const CouncilMaxProposals: u32 = 100; pub const CouncilMaxMembers: u32 = 100; } -type CouncilCollective = pallet_collective::Instance1; impl pallet_collective::Config for Runtime { type DefaultVote = pallet_collective::PrimeDefaultVote; type Event = Event; @@ -434,46 +445,11 @@ impl pallet_collective::Config for Runtime { } parameter_types! { - pub const CandidacyBond: Balance = 100 * CENTS; - // 1 storage item created, key size is 32 bytes, value size is 16+16. - pub const VotingBondBase: Balance = deposit(1, 64); - // additional data per vote is 32 bytes (account id). - pub const VotingBondFactor: Balance = deposit(0, 32); - /// Daily council elections - pub const TermDuration: BlockNumber = 24 * HOURS; - pub const DesiredMembers: u32 = 19; - pub const DesiredRunnersUp: u32 = 19; - pub const PhragmenElectionPalletId: LockIdentifier = *b"phrelect"; -} - -// Make sure that there are no more than MaxMembers members elected via phragmen. -const_assert!(DesiredMembers::get() <= CouncilMaxMembers::get()); - -impl pallet_elections_phragmen::Config for Runtime { - type CandidacyBond = CandidacyBond; - type ChangeMembers = Council; - type Currency = Balances; - type CurrencyToVote = frame_support::traits::U128CurrencyToVote; - type DesiredMembers = DesiredMembers; - type DesiredRunnersUp = DesiredRunnersUp; - type Event = Event; - type InitializeMembers = Council; - type KickedMember = Treasury; - type LoserCandidate = Treasury; - type PalletId = PhragmenElectionPalletId; - type TermDuration = TermDuration; - type VotingBondBase = VotingBondBase; - type VotingBondFactor = VotingBondFactor; - type WeightInfo = pallet_elections_phragmen::weights::SubstrateWeight; -} - -parameter_types! { - pub const TechnicalMotionDuration: BlockNumber = 3 * DAYS; + pub const TechnicalMotionDuration: BlockNumber = 2 * DAYS; pub const TechnicalMaxProposals: u32 = 100; pub const TechnicalMaxMembers: u32 = 100; } -type TechnicalCollective = pallet_collective::Instance2; impl pallet_collective::Config for Runtime { type DefaultVote = pallet_collective::PrimeDefaultVote; type Event = Event; @@ -485,12 +461,6 @@ impl pallet_collective::Config for Runtime { type WeightInfo = pallet_collective::weights::SubstrateWeight; } -type MoreThanHalfCouncil = EnsureOneOf< - AccountId, - EnsureRoot, - pallet_collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>, ->; - impl pallet_membership::Config for Runtime { type AddOrigin = MoreThanHalfCouncil; type Event = Event; @@ -517,15 +487,48 @@ impl pallet_membership::Config for Runtime { type WeightInfo = pallet_membership::weights::SubstrateWeight; } +parameter_types! { + pub const CandidacyBond: Balance = 100 * CENTS; + // 1 storage item created, key size is 32 bytes, value size is 16+16. + pub const VotingBondBase: Balance = deposit(1, 64); + // additional data per vote is 32 bytes (account id). + pub const VotingBondFactor: Balance = deposit(0, 32); + /// Daily council elections + pub const TermDuration: BlockNumber = 24 * HOURS; + pub const DesiredMembers: u32 = 7; + pub const DesiredRunnersUp: u32 = 7; + pub const PhragmenElectionPalletId: LockIdentifier = *b"phrelect"; +} + +// Make sure that there are no more than MaxMembers members elected via phragmen. +const_assert!(DesiredMembers::get() <= CouncilMaxMembers::get()); + +impl pallet_elections_phragmen::Config for Runtime { + type CandidacyBond = CandidacyBond; + type ChangeMembers = Council; + type Currency = Balances; + type CurrencyToVote = frame_support::traits::U128CurrencyToVote; + type DesiredMembers = DesiredMembers; + type DesiredRunnersUp = DesiredRunnersUp; + type Event = Event; + type InitializeMembers = Council; + type KickedMember = Treasury; + type LoserCandidate = Treasury; + type PalletId = PhragmenElectionPalletId; + type TermDuration = TermDuration; + type VotingBondBase = VotingBondBase; + type VotingBondFactor = VotingBondFactor; + type WeightInfo = pallet_elections_phragmen::weights::SubstrateWeight; +} + parameter_types! { pub const LaunchPeriod: BlockNumber = 7 * DAYS; pub const VotingPeriod: BlockNumber = 7 * DAYS; pub const FastTrackVotingPeriod: BlockNumber = 3 * HOURS; - pub const MinimumDeposit: Balance = 50 * DOLLARS; - pub const EnactmentPeriod: BlockNumber = 8 * DAYS; + pub const MinimumDeposit: Balance = 100 * DOLLARS; + pub const EnactmentPeriod: BlockNumber = 2 * DAYS; pub const CooloffPeriod: BlockNumber = 7 * DAYS; - // One cent: $10,000 / MB - pub const PreimageByteDeposit: Balance = 100 * MILLICENTS; + pub const PreimageByteDeposit: Balance = 10 * MILLICENTS; pub const InstantAllowed: bool = true; pub const MaxVotes: u32 = 100; pub const MaxProposals: u32 = 100; @@ -574,8 +577,7 @@ impl pallet_democracy::Config for Runtime { type PreimageByteDeposit = PreimageByteDeposit; type Proposal = Call; type Scheduler = Scheduler; - // NOTE: Treasury replaced by `()`. - type Slash = (); + type Slash = Treasury; // Any single technical committee member may veto a coming council proposal, however they can // only do it once and it lasts only for the cool-off period. type VetoOrigin = pallet_collective::EnsureMember; @@ -585,10 +587,9 @@ impl pallet_democracy::Config for Runtime { parameter_types! { pub const ProposalBond: Permill = Permill::from_percent(5); - pub const ProposalBondMinimum: Balance = 50 * DOLLARS; + pub const ProposalBondMinimum: Balance = 100 * DOLLARS; pub const SpendPeriod: BlockNumber = 6 * DAYS; - pub const Burn: Permill = Permill::from_perthousand(2); - pub const TreasuryPalletId: PalletId = PalletId(*b"py/trsry"); + pub const Burn: Permill = Permill::from_perthousand(0); pub const TipCountdown: BlockNumber = 1 * DAYS; pub const TipFindersFee: Percent = Percent::from_percent(20); @@ -645,7 +646,7 @@ impl pallet_tips::Config for Runtime { type TipCountdown = TipCountdown; type TipFindersFee = TipFindersFee; type TipReportDepositBase = TipReportDepositBase; - type Tippers = Elections; + type Tippers = PhragmenElection; type WeightInfo = pallet_tips::weights::SubstrateWeight; } @@ -918,29 +919,48 @@ impl pallet_collator_selection::Config for Runtime { // culumus runtime end -// bifrost runtime start - -parameter_types! { - // 3 hours(1800 blocks) as an era - pub const VtokenMintDuration: BlockNumber = 3 * 60 * MINUTES; - pub const StakingPalletId: PalletId = PalletId(*b"staking "); +impl pallet_vesting::Config for Runtime { + type BlockNumberToBalance = ConvertInto; + type Currency = Balances; + type Event = Event; + type MinVestedTransfer = ExistentialDeposit; + type WeightInfo = weights::pallet_vesting::WeightInfo; } -impl bifrost_vtoken_mint::Config for Runtime { + +// orml runtime start + +impl orml_currencies::Config for Runtime { type Event = Event; - type MinterReward = MinterReward; - type MultiCurrency = Currencies; - type WeightInfo = weights::bifrost_vtoken_mint::WeightInfo; + type GetNativeCurrencyId = NativeCurrencyId; + type MultiCurrency = Tokens; + type NativeCurrency = BasicCurrencyAdapter; + type WeightInfo = (); } orml_traits::parameter_type_with_key! { pub ExistentialDeposits: |currency_id: CurrencyId| -> Balance { match currency_id { - &CurrencyId::Native(TokenSymbol::ASG) => 1 * CENTS, - _ => Zero::zero(), + &CurrencyId::Native(TokenSymbol::ASG) => 10 * MILLIBNC, + &CurrencyId::Stable(TokenSymbol::KUSD) => 10 * MILLICENTS, + &CurrencyId::Token(TokenSymbol::KSM) => 10 * MILLICENTS, + &CurrencyId::Token(TokenSymbol::KAR) => 10 * MILLICENTS, + &CurrencyId::Token(TokenSymbol::ZLK) => 1_000_000_000_000, // ZLK has a decimals of 10e18 + &CurrencyId::VSToken(TokenSymbol::KSM) => 10 * MILLICENTS, + &CurrencyId::VSBond(TokenSymbol::ASG, ..) => 10 * MILLICENTS, + &CurrencyId::VSBond(TokenSymbol::KSM, ..) => 10 * MILLICENTS, + _ => Balance::max_value() // unsupported } }; } +pub struct DustRemovalWhitelist; +impl Contains for DustRemovalWhitelist { + fn contains(a: &AccountId) -> bool { + get_all_pallet_accounts().contains(a) || + LiquidityMiningPalletId::get().check_sub_account::(a) + } +} + parameter_types! { pub BifrostTreasuryAccount: AccountId = TreasuryPalletId::get().into_account(); } @@ -949,7 +969,7 @@ impl orml_tokens::Config for Runtime { type Amount = Amount; type Balance = Balance; type CurrencyId = CurrencyId; - type DustRemovalWhitelist = (); + type DustRemovalWhitelist = DustRemovalWhitelist; type Event = Event; type ExistentialDeposits = ExistentialDeposits; type MaxLocks = MaxLocks; @@ -957,6 +977,47 @@ impl orml_tokens::Config for Runtime { type WeightInfo = (); } +parameter_types! { + pub SelfLocation: MultiLocation = X2(Parent, Parachain(ParachainInfo::get().into())); +} + +impl orml_xtokens::Config for Runtime { + type Event = Event; + type Balance = Balance; + type CurrencyId = CurrencyId; + type CurrencyIdConvert = BifrostCurrencyIdConvert; + type AccountIdToMultiLocation = BifrostAccountIdToMultiLocation; + type SelfLocation = SelfLocation; + type XcmExecutor = XcmExecutor; + type Weigher = FixedWeightBounds; + type BaseXcmWeight = XcmWeight; +} + +impl orml_unknown_tokens::Config for Runtime { + type Event = Event; +} + +impl orml_xcm::Config for Runtime { + type Event = Event; + type SovereignOrigin = MoreThanHalfCouncil; +} + +// orml runtime end + +// bifrost runtime start + +parameter_types! { + // 3 hours(1800 blocks) as an era + pub const VtokenMintDuration: BlockNumber = 3 * 60 * MINUTES; + pub const StakingPalletId: PalletId = PalletId(*b"staking "); +} +impl bifrost_vtoken_mint::Config for Runtime { + type Event = Event; + type MinterReward = MinterReward; + type MultiCurrency = Currencies; + type WeightInfo = weights::bifrost_vtoken_mint::WeightInfo; +} + // Aggregate name getter to get fee names if the call needs to pay extra fees. // If any call need to pay extra fees, it should be added as an item here. // Used together with AggregateExtraFeeFilter below. @@ -1061,8 +1122,7 @@ impl EnsureOrigin for EnsureConfirmAsMultiSig { } parameter_types! { - pub const MinContribution: Balance = 1 * DOLLARS; - pub const BifrostCrowdloanId: PalletId = PalletId(*b"bf/salp#"); + pub const MinContribution: Balance = DOLLARS / 10; pub const RemoveKeysLimit: u32 = 500; pub const VSBondValidPeriod: BlockNumber = 30 * DAYS; pub const ReleaseCycle: BlockNumber = 1 * DAYS; @@ -1145,23 +1205,22 @@ parameter_types! { pub const MaximumDepositInPool: Balance = 1_000_000_000 * DOLLARS; pub const MinimumDepositOfUser: Balance = 1_000_000; pub const MinimumRewardPerBlock: Balance = 1_000; - pub const MinimumDuration: BlockNumber = DAYS; - pub const MaximumApproved: u32 = 8; + pub const MinimumDuration: BlockNumber = HOURS; pub const MaximumOptionRewards: u32 = 7; - pub const LiquidityMiningPalletId: PalletId = PalletId(*b"bf/lm###"); + pub const MaximumCharged: u32 = 32; } impl bifrost_liquidity_mining::Config for Runtime { type Event = Event; type ControlOrigin = - pallet_collective::EnsureProportionAtLeast<_2, _3, AccountId, TechnicalCollective>; + pallet_collective::EnsureProportionAtLeast<_1, _2, AccountId, CouncilCollective>; type MultiCurrency = Currencies; type RelayChainTokenSymbol = RelayChainTokenSymbol; type MaximumDepositInPool = MaximumDepositInPool; type MinimumDepositOfUser = MinimumDepositOfUser; type MinimumRewardPerBlock = MinimumRewardPerBlock; type MinimumDuration = MinimumDuration; - type MaximumCharged = MaximumApproved; + type MaximumCharged = MaximumCharged; type MaximumOptionRewards = MaximumOptionRewards; type PalletId = LiquidityMiningPalletId; type WeightInfo = (); @@ -1271,59 +1330,8 @@ where } } -parameter_types! { - pub const MinVestedTransfer: Balance = 100 * CENTS; -} - -impl pallet_vesting::Config for Runtime { - type BlockNumberToBalance = ConvertInto; - type Currency = Balances; - type Event = Event; - type MinVestedTransfer = MinVestedTransfer; - type WeightInfo = weights::pallet_vesting::WeightInfo; -} - // zenlink runtime end -// orml runtime start - -pub type BifrostToken = BasicCurrencyAdapter; - -impl orml_currencies::Config for Runtime { - type Event = Event; - type GetNativeCurrencyId = NativeCurrencyId; - type MultiCurrency = Tokens; - type NativeCurrency = BifrostToken; - type WeightInfo = (); -} - -parameter_types! { - pub SelfLocation: MultiLocation = X2(Parent, Parachain(ParachainInfo::get().into())); -} - -impl orml_xtokens::Config for Runtime { - type Event = Event; - type Balance = Balance; - type CurrencyId = CurrencyId; - type CurrencyIdConvert = BifrostCurrencyIdConvert; - type AccountIdToMultiLocation = BifrostAccountIdToMultiLocation; - type SelfLocation = SelfLocation; - type XcmExecutor = XcmExecutor; - type Weigher = FixedWeightBounds; - type BaseXcmWeight = XcmWeight; -} - -impl orml_unknown_tokens::Config for Runtime { - type Event = Event; -} - -impl orml_xcm::Config for Runtime { - type Event = Event; - type SovereignOrigin = MoreThanHalfCouncil; -} - -// orml runtime end - construct_runtime! { pub enum Runtime where Block = Block, @@ -1354,12 +1362,9 @@ construct_runtime! { Democracy: pallet_democracy::{Pallet, Call, Storage, Config, Event} = 30, Council: pallet_collective::::{Pallet, Call, Storage, Origin, Event, Config} = 31, TechnicalCommittee: pallet_collective::::{Pallet, Call, Storage, Origin, Event, Config} = 32, - Elections: pallet_elections_phragmen::{Pallet, Call, Storage, Event, Config} = 33, + PhragmenElection: pallet_elections_phragmen::{Pallet, Call, Storage, Event, Config} = 33, CouncilMembership: pallet_membership::::{Pallet, Call, Storage, Event, Config} = 34, TechnicalMembership: pallet_membership::::{Pallet, Call, Storage, Event, Config} = 35, - Treasury: pallet_treasury::{Pallet, Call, Storage, Config, Event} = 36, - Bounties: pallet_bounties::{Pallet, Call, Storage, Event} = 37, - Tips: pallet_tips::{Pallet, Call, Storage, Event} = 38, // XCM helpers. XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event} = 40, @@ -1376,18 +1381,24 @@ construct_runtime! { // Vesting. Usable initially, but removed once all vesting is finished. Vesting: pallet_vesting::{Pallet, Call, Storage, Event, Config} = 60, + // Treasury stuff + Treasury: pallet_treasury::{Pallet, Call, Storage, Config, Event} = 61, + Bounties: pallet_bounties::{Pallet, Call, Storage, Event} = 62, + Tips: pallet_tips::{Pallet, Call, Storage, Event} = 63, + // Third party modules - ZenlinkProtocol: zenlink_protocol::{Pallet, Call, Storage, Event} = 61, XTokens: orml_xtokens::{Pallet, Call, Event} = 70, Tokens: orml_tokens::{Pallet, Call, Storage, Event, Config} = 71, Currencies: orml_currencies::{Pallet, Call, Event} = 72, UnknownTokens: orml_unknown_tokens::{Pallet, Storage, Event} = 73, OrmlXcm: orml_xcm::{Pallet, Call, Event} = 74, + ZenlinkProtocol: zenlink_protocol::{Pallet, Call, Storage, Event} = 80, + // Bifrost modules + FlexibleFee: bifrost_flexible_fee::{Pallet, Call, Storage, Event} = 100, VtokenMint: bifrost_vtoken_mint::{Pallet, Call, Storage, Event, Config} = 101, MinterReward: bifrost_minter_reward::{Pallet, Call, Storage, Event, Config} = 102, - FlexibleFee: bifrost_flexible_fee::{Pallet, Call, Storage, Event} = 104, Salp: bifrost_salp::{Pallet, Call, Storage, Event} = 105, Bancor: bifrost_bancor::{Pallet, Call, Storage, Event, Config} = 106, VSBondAuction: bifrost_vsbond_auction::{Pallet, Call, Storage, Event} = 107, @@ -1416,6 +1427,7 @@ pub type BlockId = generic::BlockId; /// The SignedExtension to the basic transaction logic. pub type SignedExtra = ( frame_system::CheckSpecVersion, + frame_system::CheckTxVersion, frame_system::CheckGenesis, frame_system::CheckEra, frame_system::CheckNonce, diff --git a/runtime/bifrost/src/lib.rs b/runtime/bifrost/src/lib.rs index 9267edfc75..8fbe0c20ae 100644 --- a/runtime/bifrost/src/lib.rs +++ b/runtime/bifrost/src/lib.rs @@ -740,7 +740,6 @@ impl Config for XcmConfig { type Call = Call; type IsReserve = BifrostFilteredAssets; type IsTeleporter = BifrostFilteredAssets; - // <- should be enough to allow teleportation of ROC type LocationInverter = LocationInverter; type OriginConverter = XcmOriginToTransactDispatchOrigin; type ResponseHandler = (); @@ -1154,6 +1153,7 @@ construct_runtime! { Bounties: pallet_bounties::{Pallet, Call, Storage, Event} = 62, Tips: pallet_tips::{Pallet, Call, Storage, Event} = 63, + // Third party modules XTokens: orml_xtokens::{Pallet, Call, Event} = 70, Tokens: orml_tokens::{Pallet, Call, Storage, Event, Config} = 71, Currencies: orml_currencies::{Pallet, Call, Event} = 72,