From cc876125f64fb1eb803459f0b37431783072d40d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dino=20Pa=C4=8Dandi?= <3002868+Dinonard@users.noreply.github.com> Date: Thu, 29 Aug 2024 13:47:12 +0200 Subject: [PATCH] Runtime genesis generation (#1341) * Remove vendor precompile-utils * Init commit * temp * Shiden & primitives * Rest of the runtimes * Working local * All runtimes covered * Changes * Modifications * Parachain primitive * zombienet config * update * clippy fix * Cargo.lock update * Remove comment --- Cargo.lock | 9 + Cargo.toml | 2 +- bin/collator/Cargo.toml | 1 + bin/collator/src/local/chain_spec.rs | 191 +-------------- .../src/parachain/chain_spec/astar.rs | 185 +-------------- bin/collator/src/parachain/chain_spec/mod.rs | 11 +- .../src/parachain/chain_spec/shibuya.rs | 224 +----------------- .../src/parachain/chain_spec/shiden.rs | 187 +-------------- pallets/dapp-staking/src/lib.rs | 1 + pallets/inflation/src/lib.rs | 1 + primitives/src/genesis.rs | 75 ++++++ primitives/src/lib.rs | 6 + primitives/src/parachain.rs | 24 ++ runtime/astar/Cargo.toml | 4 + runtime/astar/src/genesis_config.rs | 161 +++++++++++++ runtime/astar/src/lib.rs | 16 +- runtime/local/Cargo.toml | 4 + runtime/local/src/genesis_config.rs | 175 ++++++++++++++ runtime/local/src/lib.rs | 19 +- runtime/shibuya/Cargo.toml | 4 + runtime/shibuya/src/genesis_config.rs | 202 ++++++++++++++++ runtime/shibuya/src/lib.rs | 16 +- runtime/shiden/Cargo.toml | 5 + runtime/shiden/src/genesis_config.rs | 161 +++++++++++++ runtime/shiden/src/lib.rs | 16 +- third-party/zombienet/multi_parachains.toml | 3 +- third-party/zombienet/single_parachain.toml | 3 +- third-party/zombienet/smoke.toml | 3 +- 28 files changed, 898 insertions(+), 811 deletions(-) create mode 100644 primitives/src/genesis.rs create mode 100644 primitives/src/parachain.rs create mode 100644 runtime/astar/src/genesis_config.rs create mode 100644 runtime/local/src/genesis_config.rs create mode 100644 runtime/shibuya/src/genesis_config.rs create mode 100644 runtime/shiden/src/genesis_config.rs diff --git a/Cargo.lock b/Cargo.lock index a025dd999..48b7a8a57 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -702,6 +702,7 @@ dependencies = [ "sp-consensus", "sp-consensus-aura", "sp-core", + "sp-genesis-builder", "sp-inherents", "sp-io", "sp-keyring", @@ -771,6 +772,7 @@ dependencies = [ "cumulus-primitives-core", "cumulus-primitives-utility", "dapp-staking-runtime-api", + "fp-evm", "fp-rpc", "fp-self-contained", "frame-benchmarking", @@ -839,6 +841,7 @@ dependencies = [ "polkadot-runtime-common", "precompile-utils", "scale-info", + "serde_json", "smallvec", "sp-api", "sp-arithmetic", @@ -6547,6 +6550,7 @@ dependencies = [ "array-bytes 6.2.3", "astar-primitives", "dapp-staking-runtime-api", + "fp-evm", "fp-rpc", "fp-self-contained", "frame-benchmarking", @@ -6608,6 +6612,7 @@ dependencies = [ "parity-scale-codec", "precompile-utils", "scale-info", + "serde_json", "smallvec", "sp-api", "sp-arithmetic", @@ -14373,6 +14378,7 @@ dependencies = [ "cumulus-primitives-core", "cumulus-primitives-utility", "dapp-staking-runtime-api", + "fp-evm", "fp-rpc", "fp-self-contained", "frame-benchmarking", @@ -14453,6 +14459,7 @@ dependencies = [ "polkadot-runtime-common", "precompile-utils", "scale-info", + "serde_json", "smallvec", "sp-api", "sp-arithmetic", @@ -14492,6 +14499,7 @@ dependencies = [ "cumulus-primitives-core", "cumulus-primitives-utility", "dapp-staking-runtime-api", + "fp-evm", "fp-rpc", "fp-self-contained", "frame-benchmarking", @@ -14561,6 +14569,7 @@ dependencies = [ "polkadot-runtime-common", "precompile-utils", "scale-info", + "serde_json", "smallvec", "sp-api", "sp-arithmetic", diff --git a/Cargo.toml b/Cargo.toml index 66c30a964..e413f0d65 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -77,7 +77,7 @@ clap = { version = "4.2.5", features = ["derive"] } env_logger = "0.10.0" futures = { version = "0.3.30" } serde = { version = "1.0.151", default-features = false, features = ["derive", "alloc"] } -serde_json = "1.0.92" +serde_json = { version = "1.0.92", default-features = false } tokio = { version = "1.24.2", features = ["macros", "sync"] } url = "2.2.2" jsonrpsee = { version = "0.22.5", features = ["server"] } diff --git a/bin/collator/Cargo.toml b/bin/collator/Cargo.toml index c843099e6..a784f981b 100644 --- a/bin/collator/Cargo.toml +++ b/bin/collator/Cargo.toml @@ -33,6 +33,7 @@ sp-api = { workspace = true, features = ["std"] } sp-block-builder = { workspace = true, features = ["std"] } sp-consensus-aura = { workspace = true, features = ["std"] } sp-core = { workspace = true, features = ["std"] } +sp-genesis-builder = { workspace = true, features = ["std"] } sp-inherents = { workspace = true, features = ["std"] } sp-io = { workspace = true, features = ["std"] } sp-offchain = { workspace = true, features = ["std"] } diff --git a/bin/collator/src/local/chain_spec.rs b/bin/collator/src/local/chain_spec.rs index e545408bc..af35be4a5 100644 --- a/bin/collator/src/local/chain_spec.rs +++ b/bin/collator/src/local/chain_spec.rs @@ -16,208 +16,27 @@ // You should have received a copy of the GNU General Public License // along with Astar. If not, see . -//! Chain specifications. - -use local_runtime::{ - wasm_binary_unwrap, AccountId, AuraConfig, AuraId, BalancesConfig, - CommunityCouncilMembershipConfig, CommunityTreasuryPalletId, CouncilMembershipConfig, - DappStakingConfig, EVMConfig, GrandpaConfig, GrandpaId, InflationConfig, InflationParameters, - Precompiles, RuntimeGenesisConfig, Signature, SudoConfig, TechnicalCommitteeMembershipConfig, - TierThreshold, TreasuryPalletId, VestingConfig, AST, -}; +use local_runtime::wasm_binary_unwrap; use sc_service::ChainType; -use sp_core::{crypto::Ss58Codec, sr25519, Pair, Public}; -use sp_runtime::{ - traits::{AccountIdConversion, IdentifyAccount, Verify}, - Perbill, Permill, -}; - -type AccountPublic = ::Signer; -/// Specialized `ChainSpec` for Shiden Network. +/// Specialized `ChainSpec` for local network. pub type ChainSpec = sc_service::GenericChainSpec; -/// Helper function to generate a crypto pair from seed -fn get_from_seed(seed: &str) -> ::Public { - TPublic::Pair::from_string(&format!("//{}", seed), None) - .expect("static values are valid; qed") - .public() -} - -/// Helper function to generate an account ID from seed -fn get_account_id_from_seed(seed: &str) -> AccountId -where - AccountPublic: From<::Public>, -{ - AccountPublic::from(get_from_seed::(seed)).into_account() -} - -/// Generate an Aura authority key. -pub fn authority_keys_from_seed(s: &str) -> (AuraId, GrandpaId) { - (get_from_seed::(s), get_from_seed::(s)) -} - -/// Development config (single validator Alice) +/// Development config. pub fn development_config() -> ChainSpec { let mut properties = serde_json::map::Map::new(); properties.insert("tokenSymbol".into(), "LOC".into()); properties.insert("tokenDecimals".into(), 18.into()); + ChainSpec::builder(wasm_binary_unwrap(), None) .with_name("Development") .with_id("dev") .with_chain_type(ChainType::Development) .with_properties(properties) - .with_genesis_config(testnet_genesis( - vec![authority_keys_from_seed("Alice")], - get_account_id_from_seed::("Alice"), - vec![ - get_account_id_from_seed::("Alice"), - get_account_id_from_seed::("Bob"), - get_account_id_from_seed::("Dave"), - get_account_id_from_seed::("Charlie"), - get_account_id_from_seed::("Eve"), - get_account_id_from_seed::("Ferdie"), - TreasuryPalletId::get().into_account_truncating(), - CommunityTreasuryPalletId::get().into_account_truncating(), - // Arrakis.TEST account in MetaMask - // Import known test account with private key - // 0x01ab6e801c06e59ca97a14fc0a1978b27fa366fc87450e0b65459dd3515b7391 - // H160 address: 0xaaafB3972B05630fCceE866eC69CdADd9baC2771 - AccountId::from_ss58check("5FQedkNQcF2fJPwkB6Z1ZcMgGti4vcJQNs6x85YPv3VhjBBT") - .unwrap(), - ], - )) + .with_genesis_config(local_runtime::genesis_config::default_config()) .build() } -fn testnet_genesis( - initial_authorities: Vec<(AuraId, GrandpaId)>, - root_key: AccountId, - endowed_accounts: Vec, -) -> serde_json::Value { - let accounts: Vec = vec!["Alice", "Bob", "Charlie", "Dave", "Eve"] - .iter() - .map(|s| get_account_id_from_seed::(s)) - .collect(); - - // This is supposed the be the simplest bytecode to revert without returning any data. - // We will pre-deploy it under all of our precompiles to ensure they can be called from - // within contracts. - // (PUSH1 0x00 PUSH1 0x00 REVERT) - let revert_bytecode = vec![0x60, 0x00, 0x60, 0x00, 0xFD]; - let config = RuntimeGenesisConfig { - system: Default::default(), - balances: BalancesConfig { - balances: endowed_accounts - .iter() - .cloned() - .map(|k| (k, 1_000_000_000 * AST)) - .collect(), - }, - vesting: VestingConfig { vesting: vec![] }, - aura: AuraConfig { - authorities: initial_authorities.iter().map(|x| (x.0.clone())).collect(), - }, - grandpa: GrandpaConfig { - authorities: initial_authorities - .iter() - .map(|x| (x.1.clone(), 1)) - .collect(), - ..Default::default() - }, - evm: EVMConfig { - // We need _some_ code inserted at the precompile address so that - // the evm will actually call the address. - accounts: Precompiles::used_addresses_h160() - .map(|addr| { - ( - addr, - fp_evm::GenesisAccount { - nonce: Default::default(), - balance: Default::default(), - storage: Default::default(), - code: revert_bytecode.clone(), - }, - ) - }) - .collect(), - ..Default::default() - }, - ethereum: Default::default(), - sudo: SudoConfig { - key: Some(root_key), - }, - assets: Default::default(), - transaction_payment: Default::default(), - dapp_staking: DappStakingConfig { - reward_portion: vec![ - Permill::from_percent(40), - Permill::from_percent(30), - Permill::from_percent(20), - Permill::from_percent(10), - ], - slot_distribution: vec![ - Permill::from_percent(10), - Permill::from_percent(20), - Permill::from_percent(30), - Permill::from_percent(40), - ], - tier_thresholds: vec![ - TierThreshold::DynamicPercentage { - percentage: Perbill::from_parts(35_700_000), // 3.57% - minimum_required_percentage: Perbill::from_parts(23_800_000), // 2.38% - }, - TierThreshold::DynamicPercentage { - percentage: Perbill::from_parts(8_900_000), // 0.89% - minimum_required_percentage: Perbill::from_parts(6_000_000), // 0.6% - }, - TierThreshold::DynamicPercentage { - percentage: Perbill::from_parts(23_800_000), // 2.38% - minimum_required_percentage: Perbill::from_parts(17_900_000), // 1.79% - }, - TierThreshold::FixedPercentage { - required_percentage: Perbill::from_parts(600_000), // 0.06% - }, - ], - slots_per_tier: vec![10, 20, 30, 40], - safeguard: Some(false), - ..Default::default() - }, - inflation: InflationConfig { - params: InflationParameters::default(), - ..Default::default() - }, - council_membership: CouncilMembershipConfig { - members: accounts - .clone() - .try_into() - .expect("Should support at least 5 members."), - phantom: Default::default(), - }, - technical_committee_membership: TechnicalCommitteeMembershipConfig { - members: accounts[..3] - .to_vec() - .try_into() - .expect("Should support at least 3 members."), - phantom: Default::default(), - }, - community_council_membership: CommunityCouncilMembershipConfig { - members: accounts - .try_into() - .expect("Should support at least 5 members."), - phantom: Default::default(), - }, - council: Default::default(), - technical_committee: Default::default(), - community_council: Default::default(), - democracy: Default::default(), - treasury: Default::default(), - community_treasury: Default::default(), - }; - - serde_json::to_value(&config).expect("Could not build genesis config.") -} - #[cfg(test)] pub(crate) mod tests { use super::*; diff --git a/bin/collator/src/parachain/chain_spec/astar.rs b/bin/collator/src/parachain/chain_spec/astar.rs index f5e0ec349..47819db0c 100644 --- a/bin/collator/src/parachain/chain_spec/astar.rs +++ b/bin/collator/src/parachain/chain_spec/astar.rs @@ -18,42 +18,17 @@ //! Astar chain specifications. -use super::{get_from_seed, Extensions}; -use astar_primitives::oracle::CurrencyAmount; -use astar_runtime::{ - wasm_binary_unwrap, AccountId, AuraId, Balance, DappStakingConfig, EVMConfig, InflationConfig, - InflationParameters, OracleMembershipConfig, ParachainInfoConfig, Precompiles, - PriceAggregatorConfig, Signature, TierThreshold, ASTR, -}; -use cumulus_primitives_core::ParaId; +use super::Extensions; +use astar_primitives::parachain::ASTAR_ID; +use astar_runtime::wasm_binary_unwrap; use sc_service::ChainType; -use sp_core::{sr25519, Pair, Public}; -use sp_runtime::{ - traits::{IdentifyAccount, Verify}, - Perbill, Permill, -}; - -const PARA_ID: u32 = 2006; /// Specialized `ChainSpec` for Astar Network. pub type AstarChainSpec = sc_service::GenericChainSpec; -/// Gen Astar chain specification for given parachain id. +/// Get Astar chain specification. pub fn get_chain_spec() -> AstarChainSpec { - // Alice as default - let sudo_key = get_account_id_from_seed::("Alice"); - let endowned = vec![ - ( - get_account_id_from_seed::("Alice"), - 1_000_000_000 * ASTR, - ), - ( - get_account_id_from_seed::("Bob"), - 1_000_000_000 * ASTR, - ), - ]; - let mut properties = serde_json::map::Map::new(); properties.insert("tokenSymbol".into(), "ASTR".into()); properties.insert("tokenDecimals".into(), 18.into()); @@ -63,161 +38,13 @@ pub fn get_chain_spec() -> AstarChainSpec { Extensions { bad_blocks: Default::default(), relay_chain: "tokyo".into(), - para_id: PARA_ID, + para_id: ASTAR_ID, }, ) .with_name("Astar Testnet") .with_id("astar") .with_chain_type(ChainType::Development) .with_properties(properties) - .with_genesis_config(make_genesis( - endowned.clone(), - sudo_key.clone(), - PARA_ID.into(), - )) + .with_genesis_config(astar_runtime::genesis_config::default_config(ASTAR_ID)) .build() } - -fn session_keys(aura: AuraId) -> astar_runtime::SessionKeys { - astar_runtime::SessionKeys { aura } -} - -/// Helper function to create RuntimeGenesisConfig. -fn make_genesis( - balances: Vec<(AccountId, Balance)>, - root_key: AccountId, - parachain_id: ParaId, -) -> serde_json::Value { - let authorities = vec![ - ( - get_account_id_from_seed::("Alice"), - get_from_seed::("Alice"), - ), - ( - get_account_id_from_seed::("Bob"), - get_from_seed::("Bob"), - ), - ]; - - // This is supposed the be the simplest bytecode to revert without returning any data. - // We will pre-deploy it under all of our precompiles to ensure they can be called from - // within contracts. - // (PUSH1 0x00 PUSH1 0x00 REVERT) - let revert_bytecode = vec![0x60, 0x00, 0x60, 0x00, 0xFD]; - - let config = astar_runtime::RuntimeGenesisConfig { - system: Default::default(), - sudo: astar_runtime::SudoConfig { - key: Some(root_key), - }, - parachain_info: ParachainInfoConfig { - parachain_id, - ..Default::default() - }, - balances: astar_runtime::BalancesConfig { balances }, - vesting: astar_runtime::VestingConfig { vesting: vec![] }, - session: astar_runtime::SessionConfig { - keys: authorities - .iter() - .map(|x| (x.0.clone(), x.0.clone(), session_keys(x.1.clone()))) - .collect::>(), - }, - aura: astar_runtime::AuraConfig { - authorities: vec![], - }, - aura_ext: Default::default(), - collator_selection: astar_runtime::CollatorSelectionConfig { - desired_candidates: 32, - candidacy_bond: 3_200_000 * ASTR, - invulnerables: authorities.iter().map(|x| x.0.clone()).collect::>(), - }, - evm: EVMConfig { - // We need _some_ code inserted at the precompile address so that - // the evm will actually call the address. - accounts: Precompiles::used_addresses_h160() - .map(|addr| { - ( - addr, - fp_evm::GenesisAccount { - nonce: Default::default(), - balance: Default::default(), - storage: Default::default(), - code: revert_bytecode.clone(), - }, - ) - }) - .collect(), - ..Default::default() - }, - ethereum: Default::default(), - polkadot_xcm: Default::default(), - assets: Default::default(), - parachain_system: Default::default(), - transaction_payment: Default::default(), - dapp_staking: DappStakingConfig { - reward_portion: vec![ - Permill::from_percent(40), - Permill::from_percent(30), - Permill::from_percent(20), - Permill::from_percent(10), - ], - slot_distribution: vec![ - Permill::from_percent(10), - Permill::from_percent(20), - Permill::from_percent(30), - Permill::from_percent(40), - ], - // percentages below are calulated based on total issuance at the time when dApp staking v3 was launched (8.4B) - tier_thresholds: vec![ - TierThreshold::DynamicPercentage { - percentage: Perbill::from_parts(35_700_000), // 3.57% - minimum_required_percentage: Perbill::from_parts(23_800_000), // 2.38% - }, - TierThreshold::DynamicPercentage { - percentage: Perbill::from_parts(8_900_000), // 0.89% - minimum_required_percentage: Perbill::from_parts(6_000_000), // 0.6% - }, - TierThreshold::DynamicPercentage { - percentage: Perbill::from_parts(2_380_000), // 0.238% - minimum_required_percentage: Perbill::from_parts(1_790_000), // 0.179% - }, - TierThreshold::FixedPercentage { - required_percentage: Perbill::from_parts(200_000), // 0.02% - }, - ], - slots_per_tier: vec![10, 20, 30, 40], - safeguard: Some(false), - ..Default::default() - }, - inflation: InflationConfig { - params: InflationParameters::default(), - ..Default::default() - }, - oracle_membership: OracleMembershipConfig { - members: vec![ - get_account_id_from_seed::("Alice"), - get_account_id_from_seed::("Bob"), - ] - .try_into() - .expect("Assumption is that at least two members will be allowed."), - ..Default::default() - }, - price_aggregator: PriceAggregatorConfig { - circular_buffer: vec![CurrencyAmount::from_rational(5, 10)] - .try_into() - .expect("Must work since buffer should have at least a single value."), - }, - }; - - serde_json::to_value(&config).expect("Could not build genesis config.") -} - -type AccountPublic = ::Signer; - -/// Helper function to generate an account ID from seed -fn get_account_id_from_seed(seed: &str) -> AccountId -where - AccountPublic: From<::Public>, -{ - AccountPublic::from(get_from_seed::(seed)).into_account() -} diff --git a/bin/collator/src/parachain/chain_spec/mod.rs b/bin/collator/src/parachain/chain_spec/mod.rs index 14a390909..3c2a6a89f 100644 --- a/bin/collator/src/parachain/chain_spec/mod.rs +++ b/bin/collator/src/parachain/chain_spec/mod.rs @@ -16,11 +16,9 @@ // You should have received a copy of the GNU General Public License // along with Astar. If not, see . +use astar_primitives::Block; use sc_chain_spec::ChainSpecExtension; use serde::{Deserialize, Serialize}; -use sp_core::{Pair, Public}; - -use astar_primitives::Block; pub mod astar; pub mod shibuya; @@ -51,10 +49,3 @@ impl Extensions { sc_chain_spec::get_extension(chain_spec.extensions()) } } - -/// Helper function to generate a crypto pair from seed -fn get_from_seed(seed: &str) -> ::Public { - TPublic::Pair::from_string(&format!("//{}", seed), None) - .expect("static values are valid; qed") - .public() -} diff --git a/bin/collator/src/parachain/chain_spec/shibuya.rs b/bin/collator/src/parachain/chain_spec/shibuya.rs index cab9754a5..fa38806c3 100644 --- a/bin/collator/src/parachain/chain_spec/shibuya.rs +++ b/bin/collator/src/parachain/chain_spec/shibuya.rs @@ -18,46 +18,16 @@ //! Shibuya chain specifications. -use cumulus_primitives_core::ParaId; +use super::Extensions; +use astar_primitives::parachain::SHIBUYA_ID; use sc_service::ChainType; -use shibuya_runtime::{ - wasm_binary_unwrap, AccountId, AuraConfig, AuraId, Balance, BalancesConfig, - CollatorSelectionConfig, CommunityCouncilMembershipConfig, CouncilMembershipConfig, - DappStakingConfig, EVMChainIdConfig, EVMConfig, InflationConfig, InflationParameters, - OracleMembershipConfig, ParachainInfoConfig, Precompiles, PriceAggregatorConfig, - RuntimeGenesisConfig, SessionConfig, SessionKeys, Signature, SudoConfig, - TechnicalCommitteeMembershipConfig, TierThreshold, VestingConfig, SBY, -}; -use sp_core::{sr25519, Pair, Public}; - -use astar_primitives::oracle::CurrencyAmount; -use sp_runtime::{ - traits::{IdentifyAccount, Verify}, - Perbill, Permill, -}; - -use super::{get_from_seed, Extensions}; - -const PARA_ID: u32 = 1000; +use shibuya_runtime::{wasm_binary_unwrap, RuntimeGenesisConfig}; /// Specialized `ChainSpec` for Shibuya testnet. pub type ShibuyaChainSpec = sc_service::GenericChainSpec; -/// Gen Shibuya chain specification for given parachain id. +/// Gen Shibuya chain specification. pub fn get_chain_spec() -> ShibuyaChainSpec { - // Alice as default - let sudo_key = get_account_id_from_seed::("Alice"); - let endowned = vec![ - ( - get_account_id_from_seed::("Alice"), - 1_000_000_000 * SBY, - ), - ( - get_account_id_from_seed::("Bob"), - 1_000_000_000 * SBY, - ), - ]; - let mut properties = serde_json::map::Map::new(); properties.insert("tokenSymbol".into(), "SBY".into()); properties.insert("tokenDecimals".into(), 18.into()); @@ -67,195 +37,13 @@ pub fn get_chain_spec() -> ShibuyaChainSpec { Extensions { bad_blocks: Default::default(), relay_chain: "tokyo".into(), - para_id: PARA_ID, + para_id: SHIBUYA_ID, }, ) .with_name("Shibuya Testnet") .with_id("shibuya") .with_chain_type(ChainType::Development) .with_properties(properties) - .with_genesis_config(make_genesis( - endowned.clone(), - sudo_key.clone(), - PARA_ID.into(), - )) + .with_genesis_config(shibuya_runtime::genesis_config::default_config(SHIBUYA_ID)) .build() } - -fn session_keys(aura: AuraId) -> SessionKeys { - SessionKeys { aura } -} - -/// Helper function to create Shibuya RuntimeGenesisConfig. -fn make_genesis( - balances: Vec<(AccountId, Balance)>, - root_key: AccountId, - parachain_id: ParaId, -) -> serde_json::Value { - let authorities = vec![ - ( - get_account_id_from_seed::("Alice"), - get_from_seed::("Alice"), - ), - ( - get_account_id_from_seed::("Bob"), - get_from_seed::("Bob"), - ), - ]; - let accounts: Vec = vec!["Alice", "Bob", "Charlie", "Dave", "Eve"] - .iter() - .map(|s| get_account_id_from_seed::(s)) - .collect(); - - // This is supposed the be the simplest bytecode to revert without returning any data. - // We will pre-deploy it under all of our precompiles to ensure they can be called from - // within contracts. - // (PUSH1 0x00 PUSH1 0x00 REVERT) - let revert_bytecode = vec![0x60, 0x00, 0x60, 0x00, 0xFD]; - - let config = RuntimeGenesisConfig { - system: Default::default(), - sudo: SudoConfig { - key: Some(root_key), - }, - parachain_info: ParachainInfoConfig { - parachain_id, - ..Default::default() - }, - balances: BalancesConfig { balances }, - vesting: VestingConfig { vesting: vec![] }, - session: SessionConfig { - keys: authorities - .iter() - .map(|x| (x.0.clone(), x.0.clone(), session_keys(x.1.clone()))) - .collect::>(), - }, - aura: AuraConfig { - authorities: vec![], - }, - aura_ext: Default::default(), - collator_selection: CollatorSelectionConfig { - desired_candidates: 32, - candidacy_bond: 32_000 * SBY, - invulnerables: authorities.iter().map(|x| x.0.clone()).collect::>(), - }, - evm: EVMConfig { - // We need _some_ code inserted at the precompile address so that - // the evm will actually call the address. - accounts: Precompiles::used_addresses_h160() - .map(|addr| { - ( - addr, - fp_evm::GenesisAccount { - nonce: Default::default(), - balance: Default::default(), - storage: Default::default(), - code: revert_bytecode.clone(), - }, - ) - }) - .collect(), - ..Default::default() - }, - evm_chain_id: EVMChainIdConfig { - chain_id: 0x51, - ..Default::default() - }, - ethereum: Default::default(), - polkadot_xcm: Default::default(), - assets: Default::default(), - parachain_system: Default::default(), - transaction_payment: Default::default(), - dapp_staking: DappStakingConfig { - reward_portion: vec![ - Permill::from_percent(40), - Permill::from_percent(30), - Permill::from_percent(20), - Permill::from_percent(10), - ], - slot_distribution: vec![ - Permill::from_percent(10), - Permill::from_percent(20), - Permill::from_percent(30), - Permill::from_percent(40), - ], - // percentages below are calulated based on a total issuance at the time when dApp staking v3 was launched (147M) - tier_thresholds: vec![ - TierThreshold::DynamicPercentage { - percentage: Perbill::from_parts(20_000), // 0.0020% - minimum_required_percentage: Perbill::from_parts(17_000), // 0.0017% - }, - TierThreshold::DynamicPercentage { - percentage: Perbill::from_parts(13_000), // 0.0013% - minimum_required_percentage: Perbill::from_parts(10_000), // 0.0010% - }, - TierThreshold::DynamicPercentage { - percentage: Perbill::from_parts(5_400), // 0.00054% - minimum_required_percentage: Perbill::from_parts(3_400), // 0.00034% - }, - TierThreshold::FixedPercentage { - required_percentage: Perbill::from_parts(1_400), // 0.00014% - }, - ], - slots_per_tier: vec![10, 20, 30, 40], - safeguard: Some(false), - ..Default::default() - }, - inflation: InflationConfig { - params: InflationParameters::default(), - ..Default::default() - }, - oracle_membership: OracleMembershipConfig { - members: vec![ - get_account_id_from_seed::("Alice"), - get_account_id_from_seed::("Bob"), - ] - .try_into() - .expect("Assumption is that at least two members will be allowed."), - ..Default::default() - }, - price_aggregator: PriceAggregatorConfig { - circular_buffer: vec![CurrencyAmount::from_rational(5, 10)] - .try_into() - .expect("Must work since buffer should have at least a single value."), - }, - council_membership: CouncilMembershipConfig { - members: accounts - .clone() - .try_into() - .expect("Should support at least 5 members."), - phantom: Default::default(), - }, - technical_committee_membership: TechnicalCommitteeMembershipConfig { - members: accounts[..3] - .to_vec() - .try_into() - .expect("Should support at least 3 members."), - phantom: Default::default(), - }, - community_council_membership: CommunityCouncilMembershipConfig { - members: accounts - .try_into() - .expect("Should support at least 5 members."), - phantom: Default::default(), - }, - council: Default::default(), - technical_committee: Default::default(), - community_council: Default::default(), - democracy: Default::default(), - treasury: Default::default(), - community_treasury: Default::default(), - }; - - serde_json::to_value(&config).expect("Could not build genesis config.") -} - -type AccountPublic = ::Signer; - -/// Helper function to generate an account ID from seed -fn get_account_id_from_seed(seed: &str) -> AccountId -where - AccountPublic: From<::Public>, -{ - AccountPublic::from(get_from_seed::(seed)).into_account() -} diff --git a/bin/collator/src/parachain/chain_spec/shiden.rs b/bin/collator/src/parachain/chain_spec/shiden.rs index a0d77b445..4efc239a2 100644 --- a/bin/collator/src/parachain/chain_spec/shiden.rs +++ b/bin/collator/src/parachain/chain_spec/shiden.rs @@ -18,44 +18,17 @@ //! Shiden chain specifications. -use cumulus_primitives_core::ParaId; +use super::Extensions; +use astar_primitives::parachain::SHIDEN_ID; use sc_service::ChainType; -use shiden_runtime::{ - wasm_binary_unwrap, AccountId, AuraId, Balance, DappStakingConfig, EVMConfig, InflationConfig, - InflationParameters, OracleMembershipConfig, ParachainInfoConfig, Precompiles, - PriceAggregatorConfig, RuntimeGenesisConfig, Signature, TierThreshold, SDN, -}; -use sp_core::{sr25519, Pair, Public}; - -use astar_primitives::oracle::CurrencyAmount; -use sp_runtime::{ - traits::{IdentifyAccount, Verify}, - Perbill, Permill, -}; - -use super::{get_from_seed, Extensions}; - -const PARA_ID: u32 = 2007; +use shiden_runtime::wasm_binary_unwrap; /// Specialized `ChainSpec` for Shiden Network. pub type ShidenChainSpec = sc_service::GenericChainSpec; -/// Gen Shiden chain specification for given parachain id. +/// Gen Shiden chain specification. pub fn get_chain_spec() -> ShidenChainSpec { - // Alice as default - let sudo_key = get_account_id_from_seed::("Alice"); - let endowned = vec![ - ( - get_account_id_from_seed::("Alice"), - 1_000_000_000 * SDN, - ), - ( - get_account_id_from_seed::("Bob"), - 1_000_000_000 * SDN, - ), - ]; - let mut properties = serde_json::map::Map::new(); properties.insert("tokenSymbol".into(), "SDN".into()); properties.insert("tokenDecimals".into(), 18.into()); @@ -65,161 +38,13 @@ pub fn get_chain_spec() -> ShidenChainSpec { Extensions { bad_blocks: Default::default(), relay_chain: "tokyo".into(), - para_id: PARA_ID, + para_id: SHIDEN_ID, }, ) .with_name("Shiden Testnet") .with_id("shiden") .with_chain_type(ChainType::Development) .with_properties(properties) - .with_genesis_config(make_genesis( - endowned.clone(), - sudo_key.clone(), - PARA_ID.into(), - )) + .with_genesis_config(shiden_runtime::genesis_config::default_config(SHIDEN_ID)) .build() } - -fn session_keys(aura: AuraId) -> shiden_runtime::SessionKeys { - shiden_runtime::SessionKeys { aura } -} - -/// Helper function to create RuntimeGenesisConfig. -fn make_genesis( - balances: Vec<(AccountId, Balance)>, - root_key: AccountId, - parachain_id: ParaId, -) -> serde_json::Value { - let authorities = vec![ - ( - get_account_id_from_seed::("Alice"), - get_from_seed::("Alice"), - ), - ( - get_account_id_from_seed::("Bob"), - get_from_seed::("Bob"), - ), - ]; - - // This is supposed the be the simplest bytecode to revert without returning any data. - // We will pre-deploy it under all of our precompiles to ensure they can be called from - // within contracts. - // (PUSH1 0x00 PUSH1 0x00 REVERT) - let revert_bytecode = vec![0x60, 0x00, 0x60, 0x00, 0xFD]; - - let config = RuntimeGenesisConfig { - system: Default::default(), - sudo: shiden_runtime::SudoConfig { - key: Some(root_key), - }, - parachain_info: ParachainInfoConfig { - parachain_id, - ..Default::default() - }, - balances: shiden_runtime::BalancesConfig { balances }, - vesting: shiden_runtime::VestingConfig { vesting: vec![] }, - session: shiden_runtime::SessionConfig { - keys: authorities - .iter() - .map(|x| (x.0.clone(), x.0.clone(), session_keys(x.1.clone()))) - .collect::>(), - }, - aura: shiden_runtime::AuraConfig { - authorities: vec![], - }, - aura_ext: Default::default(), - collator_selection: shiden_runtime::CollatorSelectionConfig { - desired_candidates: 32, - candidacy_bond: 32_000 * SDN, - invulnerables: authorities.iter().map(|x| x.0.clone()).collect::>(), - }, - evm: EVMConfig { - // We need _some_ code inserted at the precompile address so that - // the evm will actually call the address. - accounts: Precompiles::used_addresses_h160() - .map(|addr| { - ( - addr, - fp_evm::GenesisAccount { - nonce: Default::default(), - balance: Default::default(), - storage: Default::default(), - code: revert_bytecode.clone(), - }, - ) - }) - .collect(), - ..Default::default() - }, - ethereum: Default::default(), - polkadot_xcm: Default::default(), - assets: Default::default(), - parachain_system: Default::default(), - transaction_payment: Default::default(), - dapp_staking: DappStakingConfig { - reward_portion: vec![ - Permill::from_percent(40), - Permill::from_percent(30), - Permill::from_percent(20), - Permill::from_percent(10), - ], - slot_distribution: vec![ - Permill::from_percent(10), - Permill::from_percent(20), - Permill::from_percent(30), - Permill::from_percent(40), - ], - // percentages below are calulated based on a total issuance at the time when dApp staking v3 was launched (84.3M) - tier_thresholds: vec![ - TierThreshold::DynamicPercentage { - percentage: Perbill::from_parts(35_700_000), // 3.57% - minimum_required_percentage: Perbill::from_parts(23_800_000), // 2.38% - }, - TierThreshold::DynamicPercentage { - percentage: Perbill::from_parts(8_900_000), // 0.89% - minimum_required_percentage: Perbill::from_parts(6_000_000), // 0.6% - }, - TierThreshold::DynamicPercentage { - percentage: Perbill::from_parts(2_380_000), // 0.238% - minimum_required_percentage: Perbill::from_parts(1_790_000), // 0.179% - }, - TierThreshold::FixedPercentage { - required_percentage: Perbill::from_parts(600_000), // 0.06% - }, - ], - slots_per_tier: vec![10, 20, 30, 40], - safeguard: Some(false), - ..Default::default() - }, - inflation: InflationConfig { - params: InflationParameters::default(), - ..Default::default() - }, - oracle_membership: OracleMembershipConfig { - members: vec![ - get_account_id_from_seed::("Alice"), - get_account_id_from_seed::("Bob"), - ] - .try_into() - .expect("Assumption is that at least two members will be allowed."), - ..Default::default() - }, - price_aggregator: PriceAggregatorConfig { - circular_buffer: vec![CurrencyAmount::from_rational(5, 10)] - .try_into() - .expect("Must work since buffer should have at least a single value."), - }, - }; - - serde_json::to_value(&config).expect("Could not build genesis config.") -} - -type AccountPublic = ::Signer; - -/// Helper function to generate an account ID from seed -fn get_account_id_from_seed(seed: &str) -> AccountId -where - AccountPublic: From<::Public>, -{ - AccountPublic::from(get_from_seed::(seed)).into_account() -} diff --git a/pallets/dapp-staking/src/lib.rs b/pallets/dapp-staking/src/lib.rs index 63f061602..a8dc283af 100644 --- a/pallets/dapp-staking/src/lib.rs +++ b/pallets/dapp-staking/src/lib.rs @@ -509,6 +509,7 @@ pub mod pallet { pub tier_thresholds: Vec, pub slots_per_tier: Vec, pub safeguard: Option, + #[serde(skip)] pub _config: PhantomData, } diff --git a/pallets/inflation/src/lib.rs b/pallets/inflation/src/lib.rs index 72a745c87..25fa4bd50 100644 --- a/pallets/inflation/src/lib.rs +++ b/pallets/inflation/src/lib.rs @@ -201,6 +201,7 @@ pub mod pallet { #[derive(DefaultNoBound)] pub struct GenesisConfig { pub params: InflationParameters, + #[serde(skip)] pub _config: sp_std::marker::PhantomData, } diff --git a/primitives/src/genesis.rs b/primitives/src/genesis.rs new file mode 100644 index 000000000..a4b25a3ae --- /dev/null +++ b/primitives/src/genesis.rs @@ -0,0 +1,75 @@ +// This file is part of Astar. + +// Copyright (C) Stake Technologies Pte.Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later + +// Astar is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Astar is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Astar. If not, see . + +use scale_info::prelude::format; +use sp_core::{Pair, Public}; +use sp_runtime::traits::{IdentifyAccount, Verify}; + +use super::{AccountId, Signature}; + +type AccountPublic = ::Signer; + +/// Helper function to generate a crypto pair from seed +pub fn get_from_seed(seed: &str) -> ::Public { + TPublic::Pair::from_string(&format!("//{}", seed), None) + .expect("static values are valid; qed") + .public() +} + +/// Helper function to generate an account ID from seed +pub fn get_account_id_from_seed(seed: &str) -> AccountId +where + AccountPublic: From<::Public>, +{ + AccountPublic::from(get_from_seed::(seed)).into_account() +} + +/// Helper struct for genesis configuration. +#[derive(Clone, PartialEq, Eq)] +pub struct GenesisAccount { + /// Account ID + pub account_id: AccountId, + /// Public key + pub pub_key: ::Public, +} + +impl GenesisAccount +where + AccountPublic: From<::Public>, +{ + /// Create a new genesis account from a seed. + pub fn from_seed(seed: &str) -> Self { + let pub_key = get_from_seed::(seed); + let account_id = AccountPublic::from(pub_key.clone()).into_account(); + + Self { + account_id, + pub_key, + } + } + + /// Return the `account Id` (address) of the genesis account. + pub fn account_id(&self) -> AccountId { + self.account_id.clone() + } + + /// Return the `public key` of the genesis account. + pub fn pub_key(&self) -> ::Public { + self.pub_key.clone() + } +} diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index c8ce3d460..e67d8059b 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -44,6 +44,12 @@ pub mod oracle; /// Governance primitives. pub mod governance; +/// Genesis generation helpers & primitives. +pub mod genesis; + +/// Parachain related constants. +pub mod parachain; + /// Benchmark primitives #[cfg(feature = "runtime-benchmarks")] pub mod benchmarks; diff --git a/primitives/src/parachain.rs b/primitives/src/parachain.rs new file mode 100644 index 000000000..04dc95676 --- /dev/null +++ b/primitives/src/parachain.rs @@ -0,0 +1,24 @@ +// This file is part of Astar. + +// Copyright (C) Stake Technologies Pte.Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later + +// Astar is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Astar is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Astar. If not, see . + +/// Shibuya parachain Id used in production. +pub const SHIBUYA_ID: u32 = 1000; +/// Astar parachain Id used in production. +pub const ASTAR_ID: u32 = 2006; +/// Shiden parachain Id used in production. +pub const SHIDEN_ID: u32 = 2007; diff --git a/runtime/astar/Cargo.toml b/runtime/astar/Cargo.toml index 1c375c427..c8961aa07 100644 --- a/runtime/astar/Cargo.toml +++ b/runtime/astar/Cargo.toml @@ -14,9 +14,11 @@ log = { workspace = true, optional = true } num_enum = { workspace = true } parity-scale-codec = { workspace = true } scale-info = { workspace = true } +serde_json = { workspace = true } smallvec = { workspace = true } # primitives +fp-evm = { workspace = true } fp-rpc = { workspace = true } fp-self-contained = { workspace = true } sp-api = { workspace = true } @@ -138,8 +140,10 @@ substrate-wasm-builder = { workspace = true, optional = true } default = ["std"] std = [ "parity-scale-codec/std", + "serde_json/std", "sp-genesis-builder/std", "fp-rpc/std", + "fp-evm/std", "fp-self-contained/std", "sp-std/std", "sp-api/std", diff --git a/runtime/astar/src/genesis_config.rs b/runtime/astar/src/genesis_config.rs new file mode 100644 index 000000000..5e45a694e --- /dev/null +++ b/runtime/astar/src/genesis_config.rs @@ -0,0 +1,161 @@ +// This file is part of Astar. + +// Copyright (C) Stake Technologies Pte.Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later + +// Astar is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Astar is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Astar. If not, see . + +use crate::*; +use astar_primitives::{evm::EVM_REVERT_CODE, genesis::GenesisAccount, parachain::ASTAR_ID}; + +/// Provides the JSON representation of predefined genesis config for given `id`. +pub fn get_preset(id: &sp_genesis_builder::PresetId) -> Option> { + let genesis = match id.try_into() { + Ok("development") => default_config(ASTAR_ID), + _ => return None, + }; + Some( + serde_json::to_string(&genesis) + .expect("serialization to json is expected to work. qed.") + .into_bytes(), + ) +} + +/// Get the default genesis config for the Astar runtime. +pub fn default_config(para_id: u32) -> serde_json::Value { + let alice = GenesisAccount::::from_seed("Alice"); + let bob = GenesisAccount::::from_seed("Bob"); + + let balances: Vec<(AccountId, Balance)> = vec![ + (alice.account_id(), 1_000_000_000_000 * ASTR), + (bob.account_id(), 1_000_000_000_000 * ASTR), + ( + TreasuryPalletId::get().into_account_truncating(), + 1_000_000_000 * ASTR, + ), + ]; + + let authorities = vec![&alice, &bob]; + + let config = RuntimeGenesisConfig { + system: Default::default(), + sudo: SudoConfig { + key: Some(alice.account_id()), + }, + parachain_info: ParachainInfoConfig { + parachain_id: para_id.into(), + ..Default::default() + }, + balances: BalancesConfig { balances }, + vesting: VestingConfig { vesting: vec![] }, + session: SessionConfig { + keys: authorities + .iter() + .map(|x| { + ( + x.account_id(), + x.account_id(), + SessionKeys { + aura: x.pub_key().into(), + }, + ) + }) + .collect::>(), + }, + aura: AuraConfig { + authorities: vec![], + }, + aura_ext: Default::default(), + collator_selection: CollatorSelectionConfig { + desired_candidates: 32, + candidacy_bond: 3_200_000 * ASTR, + invulnerables: authorities + .iter() + .map(|x| x.account_id()) + .collect::>(), + }, + evm: EVMConfig { + // We need _some_ code inserted at the precompile address so that + // the evm will actually call the address. + accounts: Precompiles::used_addresses_h160() + .map(|addr| { + ( + addr, + fp_evm::GenesisAccount { + nonce: Default::default(), + balance: Default::default(), + storage: Default::default(), + code: EVM_REVERT_CODE.into(), + }, + ) + }) + .collect(), + ..Default::default() + }, + ethereum: Default::default(), + polkadot_xcm: Default::default(), + assets: Default::default(), + parachain_system: Default::default(), + transaction_payment: Default::default(), + dapp_staking: DappStakingConfig { + reward_portion: vec![ + Permill::from_percent(40), + Permill::from_percent(30), + Permill::from_percent(20), + Permill::from_percent(10), + ], + slot_distribution: vec![ + Permill::from_percent(10), + Permill::from_percent(20), + Permill::from_percent(30), + Permill::from_percent(40), + ], + // percentages below are calculated based on a total issuance at the time when dApp staking v3 was launched (84.3M) + tier_thresholds: vec![ + TierThreshold::DynamicPercentage { + percentage: Perbill::from_parts(35_700_000), // 3.57% + minimum_required_percentage: Perbill::from_parts(23_800_000), // 2.38% + }, + TierThreshold::DynamicPercentage { + percentage: Perbill::from_parts(8_900_000), // 0.89% + minimum_required_percentage: Perbill::from_parts(6_000_000), // 0.6% + }, + TierThreshold::DynamicPercentage { + percentage: Perbill::from_parts(2_380_000), // 0.238% + minimum_required_percentage: Perbill::from_parts(1_790_000), // 0.179% + }, + TierThreshold::FixedPercentage { + required_percentage: Perbill::from_parts(600_000), // 0.06% + }, + ], + slots_per_tier: vec![10, 20, 30, 40], + safeguard: Some(false), + ..Default::default() + }, + inflation: Default::default(), + oracle_membership: OracleMembershipConfig { + members: vec![alice.account_id(), bob.account_id()] + .try_into() + .expect("Assumption is that at least two members will be allowed."), + ..Default::default() + }, + price_aggregator: PriceAggregatorConfig { + circular_buffer: vec![CurrencyAmount::from_rational(5, 10)] + .try_into() + .expect("Must work since buffer should have at least a single value."), + }, + }; + + serde_json::to_value(&config).expect("Could not build genesis config.") +} diff --git a/runtime/astar/src/lib.rs b/runtime/astar/src/lib.rs index 07b98fd20..400f12004 100644 --- a/runtime/astar/src/lib.rs +++ b/runtime/astar/src/lib.rs @@ -26,8 +26,7 @@ use cumulus_primitives_core::AggregateMessageOrigin; use frame_support::{ construct_runtime, dispatch::DispatchClass, - genesis_builder_helper::{build_state, get_preset}, - parameter_types, + genesis_builder_helper, parameter_types, traits::{ fungible::{Balanced, Credit}, AsEnsureOriginWithArg, ConstBool, ConstU32, ConstU64, Contains, FindAuthor, Get, Imbalance, @@ -56,7 +55,7 @@ use pallet_transaction_payment::{ use parity_scale_codec::{Compact, Decode, Encode, MaxEncodedLen}; use polkadot_runtime_common::BlockHashCount; use sp_api::impl_runtime_apis; -use sp_core::{OpaqueMetadata, H160, H256, U256}; +use sp_core::{sr25519, OpaqueMetadata, H160, H256, U256}; use sp_inherents::{CheckInherentsResult, InherentData}; use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, @@ -80,7 +79,7 @@ use astar_primitives::{ PeriodNumber, RankedTier, SmartContract, StandardTierSlots, }, evm::EvmRevertCodeHandler, - oracle::{CurrencyId, DummyCombineData, Price}, + oracle::{CurrencyAmount, CurrencyId, DummyCombineData, Price}, xcm::AssetLocationIdConverter, Address, AssetId, BlockNumber, Hash, Header, Nonce, UnfreezeChainOnFailedMigration, }; @@ -103,6 +102,7 @@ pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; pub use sp_runtime::BuildStorage; mod chain_extensions; +pub mod genesis_config; mod precompiles; mod weights; mod xcm_config; @@ -1980,15 +1980,17 @@ impl_runtime_apis! { impl sp_genesis_builder::GenesisBuilder for Runtime { fn build_state(config: Vec) -> sp_genesis_builder::Result { - build_state::(config) + genesis_builder_helper::build_state::(config) } fn get_preset(id: &Option) -> Option> { - get_preset::(id, |_| None) + genesis_builder_helper::get_preset::(id, &genesis_config::get_preset) } fn preset_names() -> Vec { - vec![] + vec![ + sp_genesis_builder::PresetId::from("development"), + ] } } diff --git a/runtime/local/Cargo.toml b/runtime/local/Cargo.toml index d232ae951..7e00f2eaa 100644 --- a/runtime/local/Cargo.toml +++ b/runtime/local/Cargo.toml @@ -12,8 +12,10 @@ log = { workspace = true, optional = true } num_enum = { workspace = true } parity-scale-codec = { workspace = true } scale-info = { workspace = true } +serde_json = { workspace = true } smallvec = { workspace = true } +fp-evm = { workspace = true } fp-rpc = { workspace = true } fp-self-contained = { workspace = true } frame-executive = { workspace = true } @@ -110,7 +112,9 @@ substrate-wasm-builder = { workspace = true, optional = true } default = ["std"] std = [ "parity-scale-codec/std", + "serde_json/std", "fp-rpc/std", + "fp-evm/std", "fp-self-contained/std", "frame-executive/std", "frame-support/std", diff --git a/runtime/local/src/genesis_config.rs b/runtime/local/src/genesis_config.rs new file mode 100644 index 000000000..621efc7e5 --- /dev/null +++ b/runtime/local/src/genesis_config.rs @@ -0,0 +1,175 @@ +// This file is part of Astar. + +// Copyright (C) Stake Technologies Pte.Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later + +// Astar is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Astar is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Astar. If not, see . + +use crate::*; +use astar_primitives::{ + evm::EVM_REVERT_CODE, + genesis::{get_from_seed, GenesisAccount}, +}; + +/// Provides the JSON representation of predefined genesis config for given `id`. +pub fn get_preset(id: &sp_genesis_builder::PresetId) -> Option> { + let genesis = match id.try_into() { + Ok("development") => default_config(), + _ => return None, + }; + Some( + serde_json::to_string(&genesis) + .expect("serialization to json is expected to work. qed.") + .into_bytes(), + ) +} + +/// Get the default genesis config for the local runtime. +pub fn default_config() -> serde_json::Value { + let alice = GenesisAccount::::from_seed("Alice"); + let bob = GenesisAccount::::from_seed("Bob"); + let charlie = GenesisAccount::::from_seed("Charlie"); + let dave = GenesisAccount::::from_seed("Dave"); + let eve = GenesisAccount::::from_seed("Eve"); + + let balances: Vec<(AccountId, Balance)> = vec![ + (alice.account_id(), 1_000_000_000 * AST), + (bob.account_id(), 1_000_000_000 * AST), + ( + TreasuryPalletId::get().into_account_truncating(), + 1_000_000_000 * AST, + ), + ( + CommunityTreasuryPalletId::get().into_account_truncating(), + 1_000_000_000 * AST, + ), + ]; + + let accounts = vec![&alice, &bob, &charlie, &dave, &eve] + .iter() + .map(|x| x.account_id()) + .collect::>(); + + let config = RuntimeGenesisConfig { + system: Default::default(), + sudo: SudoConfig { + key: Some(alice.account_id()), + }, + balances: BalancesConfig { balances }, + vesting: VestingConfig { vesting: vec![] }, + aura: AuraConfig { + authorities: vec![get_from_seed::("Alice")], + }, + grandpa: GrandpaConfig { + authorities: vec![(get_from_seed::("Alice"), 1)], + ..Default::default() + }, + evm: EVMConfig { + // We need _some_ code inserted at the precompile address so that + // the evm will actually call the address. + accounts: Precompiles::used_addresses_h160() + .map(|addr| { + ( + addr, + fp_evm::GenesisAccount { + nonce: Default::default(), + balance: Default::default(), + storage: Default::default(), + code: EVM_REVERT_CODE.into(), + }, + ) + }) + .collect(), + ..Default::default() + }, + ethereum: Default::default(), + assets: Default::default(), + transaction_payment: Default::default(), + dapp_staking: DappStakingConfig { + reward_portion: vec![ + Permill::from_percent(40), + Permill::from_percent(30), + Permill::from_percent(20), + Permill::from_percent(10), + ], + slot_distribution: vec![ + Permill::from_percent(10), + Permill::from_percent(20), + Permill::from_percent(30), + Permill::from_percent(40), + ], + tier_thresholds: vec![ + TierThreshold::DynamicPercentage { + percentage: Perbill::from_parts(35_700_000), // 3.57% + minimum_required_percentage: Perbill::from_parts(23_800_000), // 2.38% + }, + TierThreshold::DynamicPercentage { + percentage: Perbill::from_parts(8_900_000), // 0.89% + minimum_required_percentage: Perbill::from_parts(6_000_000), // 0.6% + }, + TierThreshold::DynamicPercentage { + percentage: Perbill::from_parts(23_800_000), // 2.38% + minimum_required_percentage: Perbill::from_parts(17_900_000), // 1.79% + }, + TierThreshold::FixedPercentage { + required_percentage: Perbill::from_parts(600_000), // 0.06% + }, + ], + slots_per_tier: vec![10, 20, 30, 40], + safeguard: Some(false), + ..Default::default() + }, + inflation: InflationConfig { + params: InflationParameters { + max_inflation_rate: Perquintill::from_percent(7), + treasury_part: Perquintill::from_percent(5), + collators_part: Perquintill::from_percent(3), + dapps_part: Perquintill::from_percent(20), + base_stakers_part: Perquintill::from_percent(25), + adjustable_stakers_part: Perquintill::from_percent(35), + bonus_part: Perquintill::from_percent(12), + ideal_staking_rate: Perquintill::from_percent(50), + }, + ..Default::default() + }, + council_membership: CouncilMembershipConfig { + members: accounts + .clone() + .try_into() + .expect("Should support at least 5 members."), + phantom: Default::default(), + }, + technical_committee_membership: TechnicalCommitteeMembershipConfig { + members: accounts[..3] + .to_vec() + .try_into() + .expect("Should support at least 3 members."), + phantom: Default::default(), + }, + community_council_membership: CommunityCouncilMembershipConfig { + members: accounts + .try_into() + .expect("Should support at least 5 members."), + phantom: Default::default(), + }, + council: Default::default(), + technical_committee: Default::default(), + community_council: Default::default(), + democracy: Default::default(), + treasury: Default::default(), + community_treasury: Default::default(), + }; + + serde_json::to_value(&config).expect("Could not build genesis config.") +} diff --git a/runtime/local/src/lib.rs b/runtime/local/src/lib.rs index b610fe532..3326113f7 100644 --- a/runtime/local/src/lib.rs +++ b/runtime/local/src/lib.rs @@ -25,9 +25,7 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); use frame_support::{ - construct_runtime, - genesis_builder_helper::{build_state, get_preset}, - parameter_types, + construct_runtime, genesis_builder_helper, parameter_types, traits::{ fungible::{Balanced, Credit, HoldConsideration}, tokens::{PayFromAccount, UnityAssetBalanceConversion}, @@ -52,7 +50,7 @@ use pallet_grandpa::{fg_primitives, AuthorityList as GrandpaAuthorityList}; use pallet_transaction_payment::{FungibleAdapter, Multiplier, TargetedFeeAdjustment}; use parity_scale_codec::{Compact, Decode, Encode, MaxEncodedLen}; use sp_api::impl_runtime_apis; -use sp_core::{crypto::KeyTypeId, ConstBool, OpaqueMetadata, H160, H256, U256}; +use sp_core::{crypto::KeyTypeId, sr25519, ConstBool, OpaqueMetadata, H160, H256, U256}; use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, traits::{ @@ -134,6 +132,7 @@ pub type Precompiles = LocalPrecompiles; mod chain_extensions; pub use chain_extensions::LocalChainExtensions; +pub mod genesis_config; mod weights; /// Constant values used within the runtime. @@ -357,8 +356,8 @@ impl pallet_assets::Config for Runtime { // These values are based on the Astar 2.0 Tokenomics Modeling report. parameter_types! { - pub const TransactionLengthFeeFactor: Balance = 23_500_000_000_000; // 0.000_023_500_000_000_000 SBY per byte - pub const WeightFeeFactor: Balance = 30_855_000_000_000_000; // Around 0.03 SBY per unit of ref time. + pub const TransactionLengthFeeFactor: Balance = 23_500_000_000_000; // 0.000_023_500_000_000_000 AST per byte + pub const WeightFeeFactor: Balance = 30_855_000_000_000_000; // Around 0.03 AST per unit of ref time. pub const TargetBlockFullness: Perquintill = Perquintill::from_percent(25); pub const OperationalFeeMultiplier: u8 = 5; pub AdjustmentVariable: Multiplier = Multiplier::saturating_from_rational(000_015, 1_000_000); // 0.000_015 @@ -1801,15 +1800,17 @@ impl_runtime_apis! { impl sp_genesis_builder::GenesisBuilder for Runtime { fn build_state(config: Vec) -> sp_genesis_builder::Result { - build_state::(config) + genesis_builder_helper::build_state::(config) } fn get_preset(id: &Option) -> Option> { - get_preset::(id, |_| None) + genesis_builder_helper::get_preset::(id, &genesis_config::get_preset) } fn preset_names() -> Vec { - vec![] + vec![ + sp_genesis_builder::PresetId::from("development"), + ] } } diff --git a/runtime/shibuya/Cargo.toml b/runtime/shibuya/Cargo.toml index 5697b8756..967349c82 100644 --- a/runtime/shibuya/Cargo.toml +++ b/runtime/shibuya/Cargo.toml @@ -14,9 +14,11 @@ log = { workspace = true, optional = true } num_enum = { workspace = true } parity-scale-codec = { workspace = true } scale-info = { workspace = true } +serde_json = { workspace = true } smallvec = { workspace = true } # primitives +fp-evm = { workspace = true } fp-rpc = { workspace = true } fp-self-contained = { workspace = true } sp-api = { workspace = true } @@ -151,7 +153,9 @@ substrate-wasm-builder = { workspace = true, optional = true } default = ["std"] std = [ "parity-scale-codec/std", + "serde_json/std", "fp-rpc/std", + "fp-evm/std", "fp-self-contained/std", "sp-std/std", "sp-api/std", diff --git a/runtime/shibuya/src/genesis_config.rs b/runtime/shibuya/src/genesis_config.rs new file mode 100644 index 000000000..1b6ce2db9 --- /dev/null +++ b/runtime/shibuya/src/genesis_config.rs @@ -0,0 +1,202 @@ +// This file is part of Astar. + +// Copyright (C) Stake Technologies Pte.Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later + +// Astar is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Astar is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Astar. If not, see . + +use crate::*; +use astar_primitives::{evm::EVM_REVERT_CODE, genesis::GenesisAccount, parachain::SHIBUYA_ID}; + +/// Provides the JSON representation of predefined genesis config for given `id`. +pub fn get_preset(id: &sp_genesis_builder::PresetId) -> Option> { + let genesis = match id.try_into() { + Ok("development") => default_config(SHIBUYA_ID), + _ => return None, + }; + Some( + serde_json::to_string(&genesis) + .expect("serialization to json is expected to work. qed.") + .into_bytes(), + ) +} + +/// Get the default genesis config for the Shibuya runtime. +pub fn default_config(para_id: u32) -> serde_json::Value { + let alice = GenesisAccount::::from_seed("Alice"); + let bob = GenesisAccount::::from_seed("Bob"); + let charlie = GenesisAccount::::from_seed("Charlie"); + let dave = GenesisAccount::::from_seed("Dave"); + let eve = GenesisAccount::::from_seed("Eve"); + + let balances: Vec<(AccountId, Balance)> = vec![ + (alice.account_id(), 1_000_000_000 * SBY), + (bob.account_id(), 1_000_000_000 * SBY), + ( + TreasuryPalletId::get().into_account_truncating(), + 1_000_000_000 * SBY, + ), + ( + CommunityTreasuryPalletId::get().into_account_truncating(), + 1_000_000_000 * SBY, + ), + ]; + + let authorities = vec![&alice, &bob]; + let accounts = vec![&alice, &bob, &charlie, &dave, &eve] + .iter() + .map(|x| x.account_id()) + .collect::>(); + + let config = RuntimeGenesisConfig { + system: Default::default(), + sudo: SudoConfig { + key: Some(alice.account_id()), + }, + parachain_info: ParachainInfoConfig { + parachain_id: para_id.into(), + ..Default::default() + }, + balances: BalancesConfig { balances }, + vesting: VestingConfig { vesting: vec![] }, + session: SessionConfig { + keys: authorities + .iter() + .map(|x| { + ( + x.account_id(), + x.account_id(), + SessionKeys { + aura: x.pub_key().into(), + }, + ) + }) + .collect::>(), + }, + aura: AuraConfig { + authorities: vec![], + }, + aura_ext: Default::default(), + collator_selection: CollatorSelectionConfig { + desired_candidates: 32, + candidacy_bond: 32_000 * SBY, + invulnerables: authorities + .iter() + .map(|x| x.account_id()) + .collect::>(), + }, + evm: EVMConfig { + // We need _some_ code inserted at the precompile address so that + // the evm will actually call the address. + accounts: Precompiles::used_addresses_h160() + .map(|addr| { + ( + addr, + fp_evm::GenesisAccount { + nonce: Default::default(), + balance: Default::default(), + storage: Default::default(), + code: EVM_REVERT_CODE.into(), + }, + ) + }) + .collect(), + ..Default::default() + }, + evm_chain_id: EVMChainIdConfig { + chain_id: 0x51, + ..Default::default() + }, + ethereum: Default::default(), + polkadot_xcm: Default::default(), + assets: Default::default(), + parachain_system: Default::default(), + transaction_payment: Default::default(), + dapp_staking: DappStakingConfig { + reward_portion: vec![ + Permill::from_percent(40), + Permill::from_percent(30), + Permill::from_percent(20), + Permill::from_percent(10), + ], + slot_distribution: vec![ + Permill::from_percent(10), + Permill::from_percent(20), + Permill::from_percent(30), + Permill::from_percent(40), + ], + // percentages below are calulated based on a total issuance at the time when dApp staking v3 was launched (147M) + tier_thresholds: vec![ + TierThreshold::DynamicPercentage { + percentage: Perbill::from_parts(20_000), // 0.0020% + minimum_required_percentage: Perbill::from_parts(17_000), // 0.0017% + }, + TierThreshold::DynamicPercentage { + percentage: Perbill::from_parts(13_000), // 0.0013% + minimum_required_percentage: Perbill::from_parts(10_000), // 0.0010% + }, + TierThreshold::DynamicPercentage { + percentage: Perbill::from_parts(5_400), // 0.00054% + minimum_required_percentage: Perbill::from_parts(3_400), // 0.00034% + }, + TierThreshold::FixedPercentage { + required_percentage: Perbill::from_parts(1_400), // 0.00014% + }, + ], + slots_per_tier: vec![10, 20, 30, 40], + safeguard: Some(false), + ..Default::default() + }, + inflation: Default::default(), + oracle_membership: OracleMembershipConfig { + members: vec![alice.account_id(), bob.account_id()] + .try_into() + .expect("Assumption is that at least two members will be allowed."), + ..Default::default() + }, + price_aggregator: PriceAggregatorConfig { + circular_buffer: vec![CurrencyAmount::from_rational(5, 10)] + .try_into() + .expect("Must work since buffer should have at least a single value."), + }, + council_membership: CouncilMembershipConfig { + members: accounts + .clone() + .try_into() + .expect("Should support at least 5 members."), + phantom: Default::default(), + }, + technical_committee_membership: TechnicalCommitteeMembershipConfig { + members: accounts[..3] + .to_vec() + .try_into() + .expect("Should support at least 3 members."), + phantom: Default::default(), + }, + community_council_membership: CommunityCouncilMembershipConfig { + members: accounts + .try_into() + .expect("Should support at least 5 members."), + phantom: Default::default(), + }, + council: Default::default(), + technical_committee: Default::default(), + community_council: Default::default(), + democracy: Default::default(), + treasury: Default::default(), + community_treasury: Default::default(), + }; + + serde_json::to_value(&config).expect("Could not build genesis config.") +} diff --git a/runtime/shibuya/src/lib.rs b/runtime/shibuya/src/lib.rs index b9741072f..0c4ff317d 100644 --- a/runtime/shibuya/src/lib.rs +++ b/runtime/shibuya/src/lib.rs @@ -26,8 +26,7 @@ use cumulus_primitives_core::AggregateMessageOrigin; use frame_support::{ construct_runtime, dispatch::DispatchClass, - genesis_builder_helper::{build_state, get_preset}, - parameter_types, + genesis_builder_helper, parameter_types, traits::{ fungible::{Balanced, Credit, HoldConsideration}, tokens::{PayFromAccount, UnityAssetBalanceConversion}, @@ -57,7 +56,7 @@ use pallet_transaction_payment::{ use parity_scale_codec::{Compact, Decode, Encode, MaxEncodedLen}; use polkadot_runtime_common::BlockHashCount; use sp_api::impl_runtime_apis; -use sp_core::{OpaqueMetadata, H160, H256, U256}; +use sp_core::{sr25519, OpaqueMetadata, H160, H256, U256}; use sp_inherents::{CheckInherentsResult, InherentData}; use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, @@ -90,7 +89,7 @@ use astar_primitives::{ MainCouncilMembershipInst, MainTreasuryInst, OracleMembershipInst, TechnicalCommitteeCollectiveInst, TechnicalCommitteeMembershipInst, }, - oracle::{CurrencyId, DummyCombineData, Price}, + oracle::{CurrencyAmount, CurrencyId, DummyCombineData, Price}, xcm::AssetLocationIdConverter, Address, AssetId, BlockNumber, Hash, Header, Nonce, UnfreezeChainOnFailedMigration, }; @@ -115,6 +114,7 @@ pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; pub use sp_runtime::BuildStorage; mod chain_extensions; +pub mod genesis_config; mod precompiles; mod weights; mod xcm_config; @@ -2326,15 +2326,17 @@ impl_runtime_apis! { impl sp_genesis_builder::GenesisBuilder for Runtime { fn build_state(config: Vec) -> sp_genesis_builder::Result { - build_state::(config) + genesis_builder_helper::build_state::(config) } fn get_preset(id: &Option) -> Option> { - get_preset::(id, |_| None) + genesis_builder_helper::get_preset::(id, &genesis_config::get_preset) } fn preset_names() -> Vec { - vec![] + vec![ + sp_genesis_builder::PresetId::from("development"), + ] } } diff --git a/runtime/shiden/Cargo.toml b/runtime/shiden/Cargo.toml index 6bcad447c..cc11dde64 100644 --- a/runtime/shiden/Cargo.toml +++ b/runtime/shiden/Cargo.toml @@ -14,9 +14,11 @@ log = { workspace = true, optional = true } num_enum = { workspace = true } parity-scale-codec = { workspace = true } scale-info = { workspace = true } +serde_json = { workspace = true } smallvec = { workspace = true } # primitives +fp-evm = { workspace = true } fp-rpc = { workspace = true } fp-self-contained = { workspace = true } @@ -141,8 +143,10 @@ substrate-wasm-builder = { workspace = true, optional = true } default = ["std"] std = [ "parity-scale-codec/std", + "serde_json/std", "fp-rpc/std", "fp-self-contained/std", + "fp-evm/std", "sp-std/std", "sp-api/std", "sp-core/std", @@ -241,6 +245,7 @@ std = [ "scale-info/std", ] runtime-benchmarks = [ + "log", "frame-benchmarking", "frame-support/runtime-benchmarks", "frame-system-benchmarking/runtime-benchmarks", diff --git a/runtime/shiden/src/genesis_config.rs b/runtime/shiden/src/genesis_config.rs new file mode 100644 index 000000000..1e72dae59 --- /dev/null +++ b/runtime/shiden/src/genesis_config.rs @@ -0,0 +1,161 @@ +// This file is part of Astar. + +// Copyright (C) Stake Technologies Pte.Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later + +// Astar is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Astar is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Astar. If not, see . + +use crate::*; +use astar_primitives::{evm::EVM_REVERT_CODE, genesis::GenesisAccount, parachain::SHIDEN_ID}; + +/// Provides the JSON representation of predefined genesis config for given `id`. +pub fn get_preset(id: &sp_genesis_builder::PresetId) -> Option> { + let genesis = match id.try_into() { + Ok("development") => default_config(SHIDEN_ID), + _ => return None, + }; + Some( + serde_json::to_string(&genesis) + .expect("serialization to json is expected to work. qed.") + .into_bytes(), + ) +} + +/// Get the default genesis config for the Shiden runtime. +pub fn default_config(para_id: u32) -> serde_json::Value { + let alice = GenesisAccount::::from_seed("Alice"); + let bob = GenesisAccount::::from_seed("Bob"); + + let balances: Vec<(AccountId, Balance)> = vec![ + (alice.account_id(), 1_000_000_000_000 * SDN), + (bob.account_id(), 1_000_000_000_000 * SDN), + ( + TreasuryPalletId::get().into_account_truncating(), + 1_000_000_000 * SDN, + ), + ]; + + let authorities = vec![&alice, &bob]; + + let config = RuntimeGenesisConfig { + system: Default::default(), + sudo: SudoConfig { + key: Some(alice.account_id()), + }, + parachain_info: ParachainInfoConfig { + parachain_id: para_id.into(), + ..Default::default() + }, + balances: BalancesConfig { balances }, + vesting: VestingConfig { vesting: vec![] }, + session: SessionConfig { + keys: authorities + .iter() + .map(|x| { + ( + x.account_id(), + x.account_id(), + SessionKeys { + aura: x.pub_key().into(), + }, + ) + }) + .collect::>(), + }, + aura: AuraConfig { + authorities: vec![], + }, + aura_ext: Default::default(), + collator_selection: CollatorSelectionConfig { + desired_candidates: 32, + candidacy_bond: 32_000 * SDN, + invulnerables: authorities + .iter() + .map(|x| x.account_id()) + .collect::>(), + }, + evm: EVMConfig { + // We need _some_ code inserted at the precompile address so that + // the evm will actually call the address. + accounts: Precompiles::used_addresses_h160() + .map(|addr| { + ( + addr, + fp_evm::GenesisAccount { + nonce: Default::default(), + balance: Default::default(), + storage: Default::default(), + code: EVM_REVERT_CODE.into(), + }, + ) + }) + .collect(), + ..Default::default() + }, + ethereum: Default::default(), + polkadot_xcm: Default::default(), + assets: Default::default(), + parachain_system: Default::default(), + transaction_payment: Default::default(), + dapp_staking: DappStakingConfig { + reward_portion: vec![ + Permill::from_percent(40), + Permill::from_percent(30), + Permill::from_percent(20), + Permill::from_percent(10), + ], + slot_distribution: vec![ + Permill::from_percent(10), + Permill::from_percent(20), + Permill::from_percent(30), + Permill::from_percent(40), + ], + // percentages below are calculated based on a total issuance at the time when dApp staking v3 was launched (84.3M) + tier_thresholds: vec![ + TierThreshold::DynamicPercentage { + percentage: Perbill::from_parts(35_700_000), // 3.57% + minimum_required_percentage: Perbill::from_parts(23_800_000), // 2.38% + }, + TierThreshold::DynamicPercentage { + percentage: Perbill::from_parts(8_900_000), // 0.89% + minimum_required_percentage: Perbill::from_parts(6_000_000), // 0.6% + }, + TierThreshold::DynamicPercentage { + percentage: Perbill::from_parts(2_380_000), // 0.238% + minimum_required_percentage: Perbill::from_parts(1_790_000), // 0.179% + }, + TierThreshold::FixedPercentage { + required_percentage: Perbill::from_parts(600_000), // 0.06% + }, + ], + slots_per_tier: vec![10, 20, 30, 40], + safeguard: Some(false), + ..Default::default() + }, + inflation: Default::default(), + oracle_membership: OracleMembershipConfig { + members: vec![alice.account_id(), bob.account_id()] + .try_into() + .expect("Assumption is that at least two members will be allowed."), + ..Default::default() + }, + price_aggregator: PriceAggregatorConfig { + circular_buffer: vec![CurrencyAmount::from_rational(5, 10)] + .try_into() + .expect("Must work since buffer should have at least a single value."), + }, + }; + + serde_json::to_value(&config).expect("Could not build genesis config.") +} diff --git a/runtime/shiden/src/lib.rs b/runtime/shiden/src/lib.rs index f2db7762a..18d6ee401 100644 --- a/runtime/shiden/src/lib.rs +++ b/runtime/shiden/src/lib.rs @@ -26,8 +26,7 @@ use cumulus_primitives_core::AggregateMessageOrigin; use frame_support::{ construct_runtime, dispatch::DispatchClass, - genesis_builder_helper::{build_state, get_preset}, - parameter_types, + genesis_builder_helper, parameter_types, traits::{ fungible::{Balanced, Credit}, AsEnsureOriginWithArg, ConstBool, ConstU32, ConstU64, Contains, FindAuthor, Get, Imbalance, @@ -55,7 +54,7 @@ use pallet_transaction_payment::{ use parity_scale_codec::{Compact, Decode, Encode, MaxEncodedLen}; use polkadot_runtime_common::BlockHashCount; use sp_api::impl_runtime_apis; -use sp_core::{OpaqueMetadata, H160, H256, U256}; +use sp_core::{sr25519, OpaqueMetadata, H160, H256, U256}; use sp_inherents::{CheckInherentsResult, InherentData}; use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, @@ -80,7 +79,7 @@ use astar_primitives::{ }, evm::EvmRevertCodeHandler, governance::OracleMembershipInst, - oracle::{CurrencyId, DummyCombineData, Price}, + oracle::{CurrencyAmount, CurrencyId, DummyCombineData, Price}, xcm::AssetLocationIdConverter, Address, AssetId, BlockNumber, Hash, Header, Nonce, UnfreezeChainOnFailedMigration, }; @@ -104,6 +103,7 @@ pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; pub use sp_runtime::BuildStorage; mod chain_extensions; +pub mod genesis_config; mod precompiles; mod weights; mod xcm_config; @@ -1981,15 +1981,17 @@ impl_runtime_apis! { impl sp_genesis_builder::GenesisBuilder for Runtime { fn build_state(config: Vec) -> sp_genesis_builder::Result { - build_state::(config) + genesis_builder_helper::build_state::(config) } fn get_preset(id: &Option) -> Option> { - get_preset::(id, |_| None) + genesis_builder_helper::get_preset::(id, &genesis_config::get_preset) } fn preset_names() -> Vec { - vec![] + vec![ + sp_genesis_builder::PresetId::from("development"), + ] } } diff --git a/third-party/zombienet/multi_parachains.toml b/third-party/zombienet/multi_parachains.toml index 16ffe4551..bdab728b0 100644 --- a/third-party/zombienet/multi_parachains.toml +++ b/third-party/zombienet/multi_parachains.toml @@ -25,8 +25,7 @@ chain = "rococo-local" validator = true [[parachains]] -# Right now this has to be 2000 but soon we might be able to use arbitrary para-id -id = 2000 +id = 1000 # Replace this with whichever chain you need to run, e.g. `astar-dev` if you need Astar chain = "shibuya-dev" cumulus_based = true diff --git a/third-party/zombienet/single_parachain.toml b/third-party/zombienet/single_parachain.toml index 9f4a890b0..1e6114331 100644 --- a/third-party/zombienet/single_parachain.toml +++ b/third-party/zombienet/single_parachain.toml @@ -33,8 +33,7 @@ name = "dave" validator = true [[parachains]] -# Right now this has to be 2000 but soon we might be able to use arbitrary para-id -id = 2000 +id = 1000 # Replace this with whichever chain you need to run, e.g. `astar-dev` if you need Astar chain = "shibuya-dev" cumulus_based = true diff --git a/third-party/zombienet/smoke.toml b/third-party/zombienet/smoke.toml index 40ddb4228..34bdad214 100644 --- a/third-party/zombienet/smoke.toml +++ b/third-party/zombienet/smoke.toml @@ -24,8 +24,7 @@ chain = "rococo-local" validator = true [[parachains]] -# Right now this has to be 2000 but soon we might be able to use arbitrary para-id -id = 2000 +id = 1000 chain = "{{CHAIN}}" cumulus_based = true