// Copyright (C) Parity Technologies (UK) Ltd. // SPDX-License-Identifier: Apache-2.0 // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. use super::*; use crate as pallet_asset_conversion_tx_payment; use codec; use frame_support::{ dispatch::DispatchClass, instances::Instance2, ord_parameter_types, pallet_prelude::*, parameter_types, traits::{AsEnsureOriginWithArg, ConstU32, ConstU64, ConstU8, Imbalance, OnUnbalanced}, weights::{Weight, WeightToFee as WeightToFeeT}, PalletId, }; use frame_system as system; use frame_system::{EnsureRoot, EnsureSignedBy}; use pallet_asset_conversion::{NativeOrAssetId, NativeOrAssetIdConverter}; use pallet_transaction_payment::CurrencyAdapter; use sp_core::H256; use sp_runtime::{ traits::{AccountIdConversion, BlakeTwo256, IdentityLookup, SaturatedConversion}, Permill, }; type Block = frame_system::mocking::MockBlock; type Balance = u64; type AccountId = u64; frame_support::construct_runtime!( pub enum Runtime { System: system, Balances: pallet_balances, TransactionPayment: pallet_transaction_payment, Assets: pallet_assets, PoolAssets: pallet_assets::, AssetConversion: pallet_asset_conversion, AssetTxPayment: pallet_asset_conversion_tx_payment, } ); parameter_types! { pub(crate) static ExtrinsicBaseWeight: Weight = Weight::zero(); } pub struct BlockWeights; impl Get for BlockWeights { fn get() -> frame_system::limits::BlockWeights { frame_system::limits::BlockWeights::builder() .base_block(Weight::zero()) .for_class(DispatchClass::all(), |weights| { weights.base_extrinsic = ExtrinsicBaseWeight::get().into(); }) .for_class(DispatchClass::non_mandatory(), |weights| { weights.max_total = Weight::from_parts(1024, u64::MAX).into(); }) .build_or_panic() } } parameter_types! { pub static WeightToFee: u64 = 1; pub static TransactionByteFee: u64 = 1; } impl frame_system::Config for Runtime { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = BlockWeights; type BlockLength = (); type DbWeight = (); type RuntimeOrigin = RuntimeOrigin; type Nonce = u64; type RuntimeCall = RuntimeCall; type Hash = H256; type Hashing = BlakeTwo256; type AccountId = AccountId; type Lookup = IdentityLookup; type Block = Block; type RuntimeEvent = RuntimeEvent; type BlockHashCount = ConstU64<250>; type Version = (); type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); type SystemWeightInfo = (); type SS58Prefix = (); type OnSetCode = (); type MaxConsumers = ConstU32<16>; } parameter_types! { pub const ExistentialDeposit: u64 = 10; } impl pallet_balances::Config for Runtime { type Balance = Balance; type RuntimeEvent = RuntimeEvent; type DustRemoval = (); type ExistentialDeposit = ConstU64<10>; type AccountStore = System; type MaxLocks = (); type WeightInfo = (); type MaxReserves = ConstU32<50>; type ReserveIdentifier = [u8; 8]; type FreezeIdentifier = (); type MaxFreezes = (); type RuntimeHoldReason = (); type MaxHolds = (); } impl WeightToFeeT for WeightToFee { type Balance = u64; fn weight_to_fee(weight: &Weight) -> Self::Balance { Self::Balance::saturated_from(weight.ref_time()) .saturating_mul(WEIGHT_TO_FEE.with(|v| *v.borrow())) } } impl WeightToFeeT for TransactionByteFee { type Balance = u64; fn weight_to_fee(weight: &Weight) -> Self::Balance { Self::Balance::saturated_from(weight.ref_time()) .saturating_mul(TRANSACTION_BYTE_FEE.with(|v| *v.borrow())) } } parameter_types! { pub(crate) static TipUnbalancedAmount: u64 = 0; pub(crate) static FeeUnbalancedAmount: u64 = 0; } pub struct DealWithFees; impl OnUnbalanced> for DealWithFees { fn on_unbalanceds( mut fees_then_tips: impl Iterator>, ) { if let Some(fees) = fees_then_tips.next() { FeeUnbalancedAmount::mutate(|a| *a += fees.peek()); if let Some(tips) = fees_then_tips.next() { TipUnbalancedAmount::mutate(|a| *a += tips.peek()); } } } } impl pallet_transaction_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; type OnChargeTransaction = CurrencyAdapter; type WeightToFee = WeightToFee; type LengthToFee = TransactionByteFee; type FeeMultiplierUpdate = (); type OperationalFeeMultiplier = ConstU8<5>; } type AssetId = u32; impl pallet_assets::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Balance = Balance; type AssetId = AssetId; type AssetIdParameter = codec::Compact; type Currency = Balances; type CreateOrigin = AsEnsureOriginWithArg>; type ForceOrigin = EnsureRoot; type AssetDeposit = ConstU64<2>; type AssetAccountDeposit = ConstU64<2>; type MetadataDepositBase = ConstU64<0>; type MetadataDepositPerByte = ConstU64<0>; type ApprovalDeposit = ConstU64<0>; type StringLimit = ConstU32<20>; type Freezer = (); type Extra = (); type CallbackHandle = (); type WeightInfo = (); type RemoveItemsLimit = ConstU32<1000>; pallet_assets::runtime_benchmarks_enabled! { type BenchmarkHelper = (); } } impl pallet_assets::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Balance = u64; type RemoveItemsLimit = ConstU32<1000>; type AssetId = u32; type AssetIdParameter = u32; type Currency = Balances; type CreateOrigin = AsEnsureOriginWithArg>; type ForceOrigin = frame_system::EnsureRoot; type AssetDeposit = ConstU64<0>; type AssetAccountDeposit = ConstU64<0>; type MetadataDepositBase = ConstU64<0>; type MetadataDepositPerByte = ConstU64<0>; type ApprovalDeposit = ConstU64<0>; type StringLimit = ConstU32<50>; type Freezer = (); type Extra = (); type WeightInfo = (); type CallbackHandle = (); pallet_assets::runtime_benchmarks_enabled! { type BenchmarkHelper = (); } } parameter_types! { pub const AssetConversionPalletId: PalletId = PalletId(*b"py/ascon"); pub storage AllowMultiAssetPools: bool = false; // should be non-zero if AllowMultiAssetPools is true, otherwise can be zero pub storage LiquidityWithdrawalFee: Permill = Permill::from_percent(0); pub const MaxSwapPathLength: u32 = 4; } ord_parameter_types! { pub const AssetConversionOrigin: u64 = AccountIdConversion::::into_account_truncating(&AssetConversionPalletId::get()); } impl pallet_asset_conversion::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Currency = Balances; type AssetBalance = ::Balance; type AssetId = u32; type PoolAssetId = u32; type Assets = Assets; type PoolAssets = PoolAssets; type PalletId = AssetConversionPalletId; type WeightInfo = (); type LPFee = ConstU32<3>; // means 0.3% type PoolSetupFee = ConstU64<100>; // should be more or equal to the existential deposit type PoolSetupFeeReceiver = AssetConversionOrigin; type LiquidityWithdrawalFee = LiquidityWithdrawalFee; type AllowMultiAssetPools = AllowMultiAssetPools; type MaxSwapPathLength = MaxSwapPathLength; type MintMinLiquidity = ConstU64<100>; // 100 is good enough when the main currency has 12 decimals. type Balance = u64; type HigherPrecisionBalance = u128; type MultiAssetId = NativeOrAssetId; type MultiAssetIdConverter = NativeOrAssetIdConverter; pallet_asset_conversion::runtime_benchmarks_enabled! { type BenchmarkHelper = (); } } impl Config for Runtime { type RuntimeEvent = RuntimeEvent; type Fungibles = Assets; type OnChargeAssetTransaction = AssetConversionAdapter; }