Westend Mark II (#983)

* Initial draft

* More work

* Build

* Docs

* Insert westend keys

* Add badBlock to fork from old chain

* Updated spec to reset westend

* Use raw spec

* Fix spec format and use westend2 for both id's

* Correct public key for bootnode 3

* Build

* Extra space

* Fix build

* Lock

* Update lock

* Fixes

* Fix for he startup text

* Bump

Co-authored-by: Gav Wood <gavin@parity.io>
This commit is contained in:
ddorganandGav Wood authored and GitHub committed 2020-04-14 09:34:40 +02:00
1 parent 14b9ea691c
commit 4f9f1c879f
16 files changed
+1702 -235

No files matched your search

+197 -124
View File
File diff suppressed because it is too large. Load diff
+2
View File
@@ -31,6 +31,7 @@ members = [
"runtime/common",
"runtime/polkadot",
"runtime/kusama",
"runtime/westend",
"runtime/test-runtime",
"runtime/test-runtime/client",
"service",
@@ -46,6 +47,7 @@ members = [
exclude = [
"runtime/polkadot/wasm",
"runtime/kusama/wasm",
"runtime/westend/wasm",
"parachain/test-parachains/adder/wasm",
]
View File
Whitespace-only changes.
+4
View File
@@ -55,6 +55,10 @@ pub struct RunCmd {
#[structopt(long = "force-kusama")]
pub force_kusama: bool,
/// Force using Westend native runtime.
#[structopt(long = "force-westend")]
pub force_westend: bool,
#[allow(missing_docs)]
#[structopt(long = "enable-authority-discovery")]
pub authority_discovery_enabled: bool,
+30 -12
View File
@@ -16,14 +16,13 @@
use log::info;
use sp_runtime::traits::BlakeTwo256;
use service::{IsKusama, Block, self, RuntimeApiCollection, TFullClient};
use service::{IdentifyVariant, Block, self, RuntimeApiCollection, TFullClient};
use sp_api::ConstructRuntimeApi;
use sc_cli::{SubstrateCli, Result};
use sc_executor::NativeExecutionDispatch;
use crate::cli::{Cli, Subcommand};
impl SubstrateCli for Cli {
fn impl_name() -> &'static str { "parity-polkadot" }
fn impl_name() -> &'static str { "Parity Polkadot" }
fn impl_version() -> &'static str { env!("SUBSTRATE_CLI_IMPL_VERSION") }
@@ -47,9 +46,15 @@ impl SubstrateCli for Cli {
"kusama-staging" => Box::new(service::chain_spec::kusama_staging_testnet_config()),
"westend" => Box::new(service::chain_spec::westend_config()?),
"kusama" | "" => Box::new(service::chain_spec::kusama_config()?),
"westend-dev" => Box::new(service::chain_spec::westend_development_config()),
"westend-local" => Box::new(service::chain_spec::westend_local_testnet_config()),
"westend-staging" => Box::new(service::chain_spec::westend_staging_testnet_config()),
path if self.run.force_kusama => {
Box::new(service::KusamaChainSpec::from_json_file(std::path::PathBuf::from(path))?)
},
path if self.run.force_westend => {
Box::new(service::WestendChainSpec::from_json_file(std::path::PathBuf::from(path))?)
},
path => Box::new(service::PolkadotChainSpec::from_json_file(std::path::PathBuf::from(path))?),
})
}
@@ -63,7 +68,6 @@ pub fn run() -> Result<()> {
None => {
let runtime = cli.create_runner(&cli.run.base)?;
let config = runtime.config();
let is_kusama = config.chain_spec.is_kusama();
let authority_discovery_enabled = cli.run.authority_discovery_enabled;
let grandpa_pause = if cli.run.grandpa_pause.is_empty() {
None
@@ -71,8 +75,7 @@ pub fn run() -> Result<()> {
Some((cli.run.grandpa_pause[0], cli.run.grandpa_pause[1]))
};
if is_kusama {
info!("⛓ Native runtime: {}", service::KusamaExecutor::native_version().runtime_version);
if config.chain_spec.is_kusama() {
info!("----------------------------");
info!("This chain is not in any way");
info!(" endorsed by the ");
@@ -84,9 +87,13 @@ pub fn run() -> Result<()> {
service::KusamaExecutor,
service::kusama_runtime::UncheckedExtrinsic,
>(runtime, authority_discovery_enabled, grandpa_pause)
} else if config.chain_spec.is_westend() {
run_node::<
service::westend_runtime::RuntimeApi,
service::WestendExecutor,
service::westend_runtime::UncheckedExtrinsic,
>(runtime, authority_discovery_enabled, grandpa_pause)
} else {
info!("⛓ Native runtime: {}", service::PolkadotExecutor::native_version().runtime_version);
run_node::<
service::polkadot_runtime::RuntimeApi,
service::PolkadotExecutor,
@@ -96,9 +103,8 @@ pub fn run() -> Result<()> {
},
Some(Subcommand::Base(subcommand)) => {
let runtime = cli.create_runner(subcommand)?;
let is_kusama = runtime.config().chain_spec.is_kusama();
if is_kusama {
if runtime.config().chain_spec.is_kusama() {
runtime.run_subcommand(subcommand, |config|
service::new_chain_ops::<
service::kusama_runtime::RuntimeApi,
@@ -106,6 +112,14 @@ pub fn run() -> Result<()> {
service::kusama_runtime::UncheckedExtrinsic,
>(config)
)
} else if runtime.config().chain_spec.is_westend() {
runtime.run_subcommand(subcommand, |config|
service::new_chain_ops::<
service::westend_runtime::RuntimeApi,
service::WestendExecutor,
service::westend_runtime::UncheckedExtrinsic,
>(config)
)
} else {
runtime.run_subcommand(subcommand, |config|
service::new_chain_ops::<
@@ -129,12 +143,15 @@ pub fn run() -> Result<()> {
},
Some(Subcommand::Benchmark(cmd)) => {
let runtime = cli.create_runner(cmd)?;
let is_kusama = runtime.config().chain_spec.is_kusama();
if is_kusama {
if runtime.config().chain_spec.is_kusama() {
runtime.sync_run(|config| {
cmd.run::<service::kusama_runtime::Block, service::KusamaExecutor>(config)
})
} else if runtime.config().chain_spec.is_westend() {
runtime.sync_run(|config| {
cmd.run::<service::westend_runtime::Block, service::WestendExecutor>(config)
})
} else {
runtime.sync_run(|config| {
cmd.run::<service::polkadot_runtime::Block, service::PolkadotExecutor>(config)
@@ -177,6 +194,7 @@ where
6000,
grandpa_pause,
).map(|(s, _)| s),
D::native_version().runtime_version,
)
}
+1 -1
View File
@@ -27,7 +27,7 @@ mod cli;
mod command;
pub use service::{
AbstractService, ProvideRuntimeApi, CoreApi, ParachainHost, IsKusama,
AbstractService, ProvideRuntimeApi, CoreApi, ParachainHost, IdentifyVariant,
Block, self, RuntimeApiCollection, TFullClient
};
+1 -1
View File
@@ -63,7 +63,7 @@ use polkadot_primitives::{
}
};
use polkadot_cli::{
ProvideRuntimeApi, AbstractService, ParachainHost, IsKusama,
ProvideRuntimeApi, AbstractService, ParachainHost, IdentifyVariant,
service::{self, Role}
};
pub use polkadot_cli::service::Configuration;
+5
View File
@@ -147,6 +147,11 @@ pub trait SwapAux {
fn on_swap(one: Id, other: Id) -> Result<(), &'static str>;
}
impl SwapAux for () {
fn ensure_can_swap(_: Id, _: Id) -> Result<(), &'static str> { Err("Swapping disabled") }
fn on_swap(_: Id, _: Id) -> Result<(), &'static str> { Err("Swapping disabled") }
}
/// Identifier for a chain, either one of a number of parachains or the relay chain.
#[derive(Copy, Clone, PartialEq, Encode, Decode)]
#[cfg_attr(feature = "std", derive(Debug))]
+151
View File
@@ -0,0 +1,151 @@
[package]
name = "westend-runtime"
version = "0.7.29-pre1"
authors = ["Parity Technologies <admin@parity.io>"]
edition = "2018"
build = "build.rs"
[dependencies]
bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] }
codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] }
log = { version = "0.3.9", optional = true }
rustc-hex = { version = "2.0.1", default-features = false }
serde = { version = "1.0.102", default-features = false }
serde_derive = { version = "1.0.102", optional = true }
authority-discovery-primitives = { package = "sp-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
babe-primitives = { package = "sp-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
inherents = { package = "sp-inherents", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
offchain-primitives = { package = "sp-offchain", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
sp-std = { package = "sp-std", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
sp-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
sp-session = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
version = { package = "sp-version", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
tx-pool-api = { package = "sp-transaction-pool", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
block-builder-api = { package = "sp-block-builder", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
authority-discovery = { package = "pallet-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
authorship = { package = "pallet-authorship", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
babe = { package = "pallet-babe", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
balances = { package = "pallet-balances", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
transaction-payment = { package = "pallet-transaction-payment", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
transaction-payment-rpc-runtime-api = { package = "pallet-transaction-payment-rpc-runtime-api", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
collective = { package = "pallet-collective", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
democracy = { package = "pallet-democracy", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
elections-phragmen = { package = "pallet-elections-phragmen", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
executive = { package = "frame-executive", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
finality-tracker = { package = "pallet-finality-tracker", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
grandpa = { package = "pallet-grandpa", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
identity = { package = "pallet-identity", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
im-online = { package = "pallet-im-online", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
indices = { package = "pallet-indices", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
membership = { package = "pallet-membership", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
nicks = { package = "pallet-nicks", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
offences = { package = "pallet-offences", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
randomness-collective-flip = { package = "pallet-randomness-collective-flip", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
recovery = { package = "pallet-recovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
scheduler = { package = "pallet-scheduler", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
session = { package = "pallet-session", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
society = { package = "pallet-society", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
staking = { package = "pallet-staking", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
pallet-staking-reward-curve = { package = "pallet-staking-reward-curve", git = "https://github.com/paritytech/substrate", branch = "master" }
sudo = { package = "pallet-sudo", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
system = { package = "frame-system", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
system_rpc_runtime_api = { package = "frame-system-rpc-runtime-api", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
timestamp = { package = "pallet-timestamp", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
treasury = { package = "pallet-treasury", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
utility = { package = "pallet-utility", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
vesting = { package = "pallet-vesting", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true }
runtime-common = { package = "polkadot-runtime-common", path = "../common", default-features = false }
primitives = { package = "polkadot-primitives", path = "../../primitives", default-features = false }
polkadot-parachain = { path = "../../parachain", default-features = false }
[dev-dependencies]
hex-literal = "0.2.1"
libsecp256k1 = "0.3.2"
tiny-keccak = "1.5.0"
keyring = { package = "sp-keyring", git = "https://github.com/paritytech/substrate", branch = "master" }
sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master" }
trie-db = "0.20.0"
serde_json = "1.0.41"
[build-dependencies]
wasm-builder-runner = { package = "substrate-wasm-builder-runner", version = "1.0.5" }
[features]
default = ["std"]
no_std = []
only-staking = []
std = [
"authority-discovery-primitives/std",
"authority-discovery/std",
"bitvec/std",
"primitives/std",
"rustc-hex/std",
"codec/std",
"inherents/std",
"sp-core/std",
"polkadot-parachain/std",
"sp-api/std",
"tx-pool-api/std",
"block-builder-api/std",
"offchain-primitives/std",
"sp-std/std",
"sp-io/std",
"frame-support/std",
"authorship/std",
"balances/std",
"transaction-payment/std",
"transaction-payment-rpc-runtime-api/std",
"collective/std",
"elections-phragmen/std",
"democracy/std",
"executive/std",
"finality-tracker/std",
"grandpa/std",
"identity/std",
"im-online/std",
"indices/std",
"membership/std",
"nicks/std",
"offences/std",
"recovery/std",
"sp-runtime/std",
"sp-staking/std",
"scheduler/std",
"session/std",
"society/std",
"staking/std",
"sudo/std",
"system/std",
"system_rpc_runtime_api/std",
"timestamp/std",
"treasury/std",
"version/std",
"utility/std",
"vesting/std",
"serde_derive",
"serde/std",
"log",
"babe/std",
"babe-primitives/std",
"sp-session/std",
"randomness-collective-flip/std",
"runtime-common/std",
]
runtime-benchmarks = [
"collective/runtime-benchmarks",
"frame-benchmarking",
"frame-support/runtime-benchmarks",
"runtime-common/runtime-benchmarks",
"elections-phragmen/runtime-benchmarks",
"society/runtime-benchmarks",
"system/runtime-benchmarks",
]
+26
View File
@@ -0,0 +1,26 @@
// Copyright 2019-2020 Parity Technologies (UK) Ltd.
// This file is part of Polkadot.
// Substrate 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.
// Substrate 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 Substrate. If not, see <http://www.gnu.org/licenses/>.
use wasm_builder_runner::WasmBuilder;
fn main() {
WasmBuilder::new()
.with_current_project()
.with_wasm_builder_from_git("https://github.com/paritytech/substrate.git", "8c672e107789ed10973d937ba8cac245404377e2")
.import_memory()
.export_heap_base()
.build()
}
+70
View File
@@ -0,0 +1,70 @@
// Copyright 2019-2020 Parity Technologies (UK) Ltd.
// This file is part of Polkadot.
// Polkadot 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.
// Polkadot 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 Polkadot. If not, see <http://www.gnu.org/licenses/>.
/// Money matters.
pub mod currency {
use primitives::Balance;
pub const DOTS: Balance = 1_000_000_000_000;
pub const DOLLARS: Balance = DOTS;
pub const CENTS: Balance = DOLLARS / 100;
pub const MILLICENTS: Balance = CENTS / 1_000;
}
/// Time and blocks.
pub mod time {
use primitives::{Moment, BlockNumber};
pub const MILLISECS_PER_BLOCK: Moment = 6000;
pub const SLOT_DURATION: Moment = MILLISECS_PER_BLOCK;
pub const EPOCH_DURATION_IN_BLOCKS: BlockNumber = 1 * HOURS;
// These time units are defined in number of blocks.
pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber);
pub const HOURS: BlockNumber = MINUTES * 60;
pub const DAYS: BlockNumber = HOURS * 24;
// 1 in 4 blocks (on average, not counting collisions) will be primary babe blocks.
pub const PRIMARY_PROBABILITY: (u64, u64) = (1, 4);
}
/// Fee-related.
pub mod fee {
pub use sp_runtime::Perbill;
use primitives::Balance;
use frame_support::weights::Weight;
use sp_runtime::traits::Convert;
/// The block saturation level. Fees will be updates based on this value.
pub const TARGET_BLOCK_FULLNESS: Perbill = Perbill::from_percent(25);
/// Handles converting a weight scalar to a fee value, based on the scale and granularity of the
/// node's balance type.
///
/// This should typically create a mapping between the following ranges:
/// - [0, system::MaximumBlockWeight]
/// - [Balance::min, Balance::max]
///
/// Yet, it can be used for any other sort of change to weight-fee. Some examples being:
/// - Setting it to `0` will essentially disable the weight fee.
/// - Setting it to `1` will cause the literal `#[weight = x]` values to be charged.
pub struct WeightToFee;
impl Convert<Weight, Balance> for WeightToFee {
fn convert(x: Weight) -> Balance {
// in Kusama a weight of 10_000 (smallest non-zero weight) is mapped to 1/10 CENT:
Balance::from(x).saturating_mul(super::currency::CENTS / (10 * 10_000))
}
}
}
+763
View File
@@ -0,0 +1,763 @@
// Copyright 2017-2020 Parity Technologies (UK) Ltd.
// This file is part of Polkadot.
// Polkadot 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.
// Polkadot 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 Polkadot. If not, see <http://www.gnu.org/licenses/>.
//! The Polkadot runtime. This can be compiled with `#[no_std]`, ready for Wasm.
#![cfg_attr(not(feature = "std"), no_std)]
// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256.
#![recursion_limit="256"]
use sp_std::prelude::*;
use codec::{Encode, Decode};
use primitives::{
AccountId, AccountIndex, Balance, BlockNumber, Hash, Nonce, Signature, Moment,
parachain::{self, ActiveParas, AbridgedCandidateReceipt, SigningContext}, ValidityError,
};
use runtime_common::{attestations, parachains, registrar,
impls::{CurrencyToVoteHandler, TargetedFeeAdjustment, ToAuthor},
BlockHashCount, MaximumBlockWeight, AvailableBlockRatio, MaximumBlockLength,
};
use sp_runtime::{
create_runtime_str, generic, impl_opaque_keys,
ApplyExtrinsicResult, KeyTypeId, Perbill, RuntimeDebug,
transaction_validity::{
TransactionValidity, InvalidTransaction, TransactionValidityError, TransactionSource,
TransactionPriority,
},
curve::PiecewiseLinear,
traits::{
BlakeTwo256, Block as BlockT, SignedExtension, OpaqueKeys, ConvertInto, IdentityLookup,
DispatchInfoOf,
},
};
#[cfg(feature = "runtime-benchmarks")]
use sp_runtime::RuntimeString;
use version::RuntimeVersion;
use grandpa::{AuthorityId as GrandpaId, fg_primitives};
#[cfg(any(feature = "std", test))]
use version::NativeVersion;
use sp_core::OpaqueMetadata;
use sp_staking::SessionIndex;
use frame_support::{parameter_types, construct_runtime, traits::{KeyOwnerProofSystem, Randomness}};
use im_online::sr25519::AuthorityId as ImOnlineId;
use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId;
use system::offchain::TransactionSubmitter;
use transaction_payment_rpc_runtime_api::RuntimeDispatchInfo;
use session::{historical as session_historical};
#[cfg(feature = "std")]
pub use staking::StakerStatus;
#[cfg(any(feature = "std", test))]
pub use sp_runtime::BuildStorage;
pub use timestamp::Call as TimestampCall;
pub use balances::Call as BalancesCall;
pub use attestations::{Call as AttestationsCall, MORE_ATTESTATIONS_IDENTIFIER};
pub use parachains::Call as ParachainsCall;
/// Constant values used within the runtime.
pub mod constants;
use constants::{time::*, currency::*, fee::*};
// Make the WASM binary available.
#[cfg(feature = "std")]
include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs"));
/// Runtime version (Kusama).
pub const VERSION: RuntimeVersion = RuntimeVersion {
spec_name: create_runtime_str!("westend"),
impl_name: create_runtime_str!("parity-westend"),
authoring_version: 2,
spec_version: 2,
impl_version: 1,
apis: RUNTIME_API_VERSIONS,
};
/// Native version.
#[cfg(any(feature = "std", test))]
pub fn native_version() -> NativeVersion {
NativeVersion {
runtime_version: VERSION,
can_author_with: Default::default(),
}
}
/// Avoid processing transactions from slots and parachain registrar.
#[derive(Default, Encode, Decode, Clone, Eq, PartialEq, RuntimeDebug)]
pub struct RestrictFunctionality;
impl SignedExtension for RestrictFunctionality {
const IDENTIFIER: &'static str = "RestrictFunctionality";
type AccountId = AccountId;
type Call = Call;
type AdditionalSigned = ();
type Pre = ();
fn additional_signed(&self) -> sp_std::result::Result<(), TransactionValidityError> { Ok(()) }
fn validate(
&self,
_: &Self::AccountId,
call: &Self::Call,
_: &DispatchInfoOf<Self::Call>,
_: usize
)
-> TransactionValidity
{
match call {
Call::Registrar(_)
=> Err(InvalidTransaction::Custom(ValidityError::NoPermission.into()).into()),
_ => Ok(Default::default()),
}
}
}
parameter_types! {
pub const Version: RuntimeVersion = VERSION;
}
impl system::Trait for Runtime {
type Origin = Origin;
type Call = Call;
type Index = Nonce;
type BlockNumber = BlockNumber;
type Hash = Hash;
type Hashing = BlakeTwo256;
type AccountId = AccountId;
type Lookup = IdentityLookup<Self::AccountId>;
type Header = generic::Header<BlockNumber, BlakeTwo256>;
type Event = Event;
type BlockHashCount = BlockHashCount;
type MaximumBlockWeight = MaximumBlockWeight;
type MaximumBlockLength = MaximumBlockLength;
type AvailableBlockRatio = AvailableBlockRatio;
type Version = Version;
type ModuleToIndex = ModuleToIndex;
type AccountData = balances::AccountData<Balance>;
type OnNewAccount = ();
type OnKilledAccount = ();
}
impl scheduler::Trait for Runtime {
type Event = Event;
type Origin = Origin;
type Call = Call;
type MaximumWeight = MaximumBlockWeight;
}
parameter_types! {
pub const EpochDuration: u64 = EPOCH_DURATION_IN_BLOCKS as u64;
pub const ExpectedBlockTime: Moment = MILLISECS_PER_BLOCK;
}
impl babe::Trait for Runtime {
type EpochDuration = EpochDuration;
type ExpectedBlockTime = ExpectedBlockTime;
// session module is the trigger
type EpochChangeTrigger = babe::ExternalTrigger;
}
parameter_types! {
pub const IndexDeposit: Balance = 1 * DOLLARS;
}
impl indices::Trait for Runtime {
type AccountIndex = AccountIndex;
type Currency = Balances;
type Deposit = IndexDeposit;
type Event = Event;
}
parameter_types! {
pub const ExistentialDeposit: Balance = 1 * CENTS;
}
impl balances::Trait for Runtime {
type Balance = Balance;
type DustRemoval = ();
type Event = Event;
type ExistentialDeposit = ExistentialDeposit;
type AccountStore = System;
}
parameter_types! {
pub const TransactionBaseFee: Balance = 1 * CENTS;
pub const TransactionByteFee: Balance = 10 * MILLICENTS;
// for a sane configuration, this should always be less than `AvailableBlockRatio`.
pub const TargetBlockFullness: Perbill = Perbill::from_percent(25);
}
impl transaction_payment::Trait for Runtime {
type Currency = Balances;
type OnTransactionPayment = ToAuthor<Runtime>;
type TransactionBaseFee = TransactionBaseFee;
type TransactionByteFee = TransactionByteFee;
type WeightToFee = WeightToFee;
type FeeMultiplierUpdate = TargetedFeeAdjustment<TargetBlockFullness, Self>;
}
parameter_types! {
pub const MinimumPeriod: u64 = SLOT_DURATION / 2;
}
impl timestamp::Trait for Runtime {
type Moment = u64;
type OnTimestampSet = Babe;
type MinimumPeriod = MinimumPeriod;
}
parameter_types! {
pub const UncleGenerations: u32 = 0;
}
// TODO: substrate#2986 implement this properly
impl authorship::Trait for Runtime {
type FindAuthor = session::FindAccountFromAuthorIndex<Self, Babe>;
type UncleGenerations = UncleGenerations;
type FilterUncle = ();
type EventHandler = (Staking, ImOnline);
}
parameter_types! {
pub const Period: BlockNumber = 10 * MINUTES;
pub const Offset: BlockNumber = 0;
}
impl_opaque_keys! {
pub struct SessionKeys {
pub grandpa: Grandpa,
pub babe: Babe,
pub im_online: ImOnline,
pub parachain_validator: Parachains,
pub authority_discovery: AuthorityDiscovery,
}
}
parameter_types! {
pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(17);
}
impl session::Trait for Runtime {
type Event = Event;
type ValidatorId = AccountId;
type ValidatorIdOf = staking::StashOf<Self>;
type ShouldEndSession = Babe;
type NextSessionRotation = Babe;
type SessionManager = Staking;
type SessionHandler = <SessionKeys as OpaqueKeys>::KeyTypeIdProviders;
type Keys = SessionKeys;
type DisabledValidatorsThreshold = DisabledValidatorsThreshold;
}
impl session::historical::Trait for Runtime {
type FullIdentification = staking::Exposure<AccountId, Balance>;
type FullIdentificationOf = staking::ExposureOf<Runtime>;
}
pallet_staking_reward_curve::build! {
const REWARD_CURVE: PiecewiseLinear<'static> = curve!(
min_inflation: 0_025_000,
max_inflation: 0_100_000,
ideal_stake: 0_500_000,
falloff: 0_050_000,
max_piece_count: 40,
test_precision: 0_005_000,
);
}
parameter_types! {
// Six sessions in an era (6 hours).
pub const SessionsPerEra: SessionIndex = 6;
// 28 eras for unbonding (7 days).
pub const BondingDuration: staking::EraIndex = 28;
// 28 eras in which slashes can be cancelled (7 days).
pub const SlashDeferDuration: staking::EraIndex = 28;
pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE;
pub const MaxNominatorRewardedPerValidator: u32 = 64;
// quarter of the last session will be for election.
pub const ElectionLookahead: BlockNumber = EPOCH_DURATION_IN_BLOCKS / 4;
}
impl staking::Trait for Runtime {
type Currency = Balances;
type UnixTime = Timestamp;
type CurrencyToVote = CurrencyToVoteHandler<Self>;
type RewardRemainder = ();
type Event = Event;
type Slash = ();
type Reward = ();
type SessionsPerEra = SessionsPerEra;
type BondingDuration = BondingDuration;
type SlashDeferDuration = SlashDeferDuration;
// A majority of the council can cancel the slash.
type SlashCancelOrigin = system::EnsureRoot<AccountId>;
type SessionInterface = Self;
type RewardCurve = RewardCurve;
type MaxNominatorRewardedPerValidator = MaxNominatorRewardedPerValidator;
type NextNewSession = Session;
type ElectionLookahead = ElectionLookahead;
type Call = Call;
type SubmitTransaction = TransactionSubmitter<(), Runtime, UncheckedExtrinsic>;
type UnsignedPriority = StakingUnsignedPriority;
}
parameter_types! {
pub const LaunchPeriod: BlockNumber = 7 * DAYS;
pub const VotingPeriod: BlockNumber = 7 * DAYS;
pub const FastTrackVotingPeriod: BlockNumber = 3 * HOURS;
pub const MinimumDeposit: Balance = 1 * DOLLARS;
pub const EnactmentPeriod: BlockNumber = 8 * DAYS;
pub const CooloffPeriod: BlockNumber = 7 * DAYS;
// One cent: $10,000 / MB
pub const PreimageByteDeposit: Balance = 10 * MILLICENTS;
pub const InstantAllowed: bool = true;
}
impl offences::Trait for Runtime {
type Event = Event;
type IdentificationTuple = session::historical::IdentificationTuple<Self>;
type OnOffenceHandler = Staking;
}
impl authority_discovery::Trait for Runtime {}
type SubmitTransaction = TransactionSubmitter<ImOnlineId, Runtime, UncheckedExtrinsic>;
parameter_types! {
pub const SessionDuration: BlockNumber = EPOCH_DURATION_IN_BLOCKS as _;
}
parameter_types! {
pub const StakingUnsignedPriority: TransactionPriority = TransactionPriority::max_value() / 2;
pub const ImOnlineUnsignedPriority: TransactionPriority = TransactionPriority::max_value();
}
impl im_online::Trait for Runtime {
type AuthorityId = ImOnlineId;
type Event = Event;
type Call = Call;
type SubmitTransaction = SubmitTransaction;
type ReportUnresponsiveness = Offences;
type SessionDuration = SessionDuration;
type UnsignedPriority = StakingUnsignedPriority;
}
impl grandpa::Trait for Runtime {
type Event = Event;
}
parameter_types! {
pub const WindowSize: BlockNumber = finality_tracker::DEFAULT_WINDOW_SIZE.into();
pub const ReportLatency: BlockNumber = finality_tracker::DEFAULT_REPORT_LATENCY.into();
}
impl finality_tracker::Trait for Runtime {
type OnFinalizationStalled = ();
type WindowSize = WindowSize;
type ReportLatency = ReportLatency;
}
parameter_types! {
pub const AttestationPeriod: BlockNumber = 50;
}
impl attestations::Trait for Runtime {
type AttestationPeriod = AttestationPeriod;
type ValidatorIdentities = parachains::ValidatorIdentities<Runtime>;
type RewardAttestation = Staking;
}
parameter_types! {
pub const MaxCodeSize: u32 = 10 * 1024 * 1024; // 10 MB
pub const MaxHeadDataSize: u32 = 20 * 1024; // 20 KB
pub const ValidationUpgradeFrequency: BlockNumber = 2 * DAYS;
pub const ValidationUpgradeDelay: BlockNumber = 8 * HOURS;
pub const SlashPeriod: BlockNumber = 7 * DAYS;
}
impl parachains::Trait for Runtime {
type Origin = Origin;
type Call = Call;
type ParachainCurrency = Balances;
type BlockNumberConversion = sp_runtime::traits::Identity;
type Randomness = RandomnessCollectiveFlip;
type ActiveParachains = Registrar;
type Registrar = Registrar;
type MaxCodeSize = MaxCodeSize;
type MaxHeadDataSize = MaxHeadDataSize;
type ValidationUpgradeFrequency = ValidationUpgradeFrequency;
type ValidationUpgradeDelay = ValidationUpgradeDelay;
type SlashPeriod = SlashPeriod;
type Proof = session::historical::Proof;
type KeyOwnerProofSystem = session::historical::Module<Self>;
type IdentificationTuple = <Self::KeyOwnerProofSystem as KeyOwnerProofSystem<(KeyTypeId, Vec<u8>)>>::IdentificationTuple;
type ReportOffence = Offences;
type BlockHashConversion = sp_runtime::traits::Identity;
}
parameter_types! {
pub const ParathreadDeposit: Balance = 5 * DOLLARS;
pub const QueueSize: usize = 2;
pub const MaxRetries: u32 = 3;
}
impl registrar::Trait for Runtime {
type Event = Event;
type Origin = Origin;
type Currency = Balances;
type ParathreadDeposit = ParathreadDeposit;
type SwapAux = ();
type QueueSize = QueueSize;
type MaxRetries = MaxRetries;
}
parameter_types! {
// Minimum 100 bytes/KSM deposited (1 CENT/byte)
pub const BasicDeposit: Balance = 10 * DOLLARS; // 258 bytes on-chain
pub const FieldDeposit: Balance = 250 * CENTS; // 66 bytes on-chain
pub const SubAccountDeposit: Balance = 2 * DOLLARS; // 53 bytes on-chain
pub const MaxSubAccounts: u32 = 100;
pub const MaxAdditionalFields: u32 = 100;
}
impl identity::Trait for Runtime {
type Event = Event;
type Currency = Balances;
type Slashed = ();
type BasicDeposit = BasicDeposit;
type FieldDeposit = FieldDeposit;
type SubAccountDeposit = SubAccountDeposit;
type MaxSubAccounts = MaxSubAccounts;
type MaxAdditionalFields = MaxAdditionalFields;
type RegistrarOrigin = system::EnsureRoot<AccountId>;
type ForceOrigin = system::EnsureRoot<AccountId>;
}
parameter_types! {
// One storage item; value is size 4+4+16+32 bytes = 56 bytes.
pub const MultisigDepositBase: Balance = 30 * CENTS;
// Additional storage item size of 32 bytes.
pub const MultisigDepositFactor: Balance = 5 * CENTS;
pub const MaxSignatories: u16 = 100;
}
impl utility::Trait for Runtime {
type Event = Event;
type Call = Call;
type Currency = Balances;
type MultisigDepositBase = MultisigDepositBase;
type MultisigDepositFactor = MultisigDepositFactor;
type MaxSignatories = MaxSignatories;
}
parameter_types! {
pub const ConfigDepositBase: Balance = 5 * DOLLARS;
pub const FriendDepositFactor: Balance = 50 * CENTS;
pub const MaxFriends: u16 = 9;
pub const RecoveryDeposit: Balance = 5 * DOLLARS;
}
impl recovery::Trait for Runtime {
type Event = Event;
type Call = Call;
type Currency = Balances;
type ConfigDepositBase = ConfigDepositBase;
type FriendDepositFactor = FriendDepositFactor;
type MaxFriends = MaxFriends;
type RecoveryDeposit = RecoveryDeposit;
}
parameter_types! {
pub const MinVestedTransfer: Balance = 100 * DOLLARS;
}
impl vesting::Trait for Runtime {
type Event = Event;
type Currency = Balances;
type BlockNumberToBalance = ConvertInto;
type MinVestedTransfer = MinVestedTransfer;
}
impl sudo::Trait for Runtime {
type Event = Event;
type Call = Call;
}
construct_runtime! {
pub enum Runtime where
Block = Block,
NodeBlock = primitives::Block,
UncheckedExtrinsic = UncheckedExtrinsic
{
// Basic stuff; balances is uncallable initially.
System: system::{Module, Call, Storage, Config, Event<T>},
RandomnessCollectiveFlip: randomness_collective_flip::{Module, Storage},
// Must be before session.
Babe: babe::{Module, Call, Storage, Config, Inherent(Timestamp)},
Timestamp: timestamp::{Module, Call, Storage, Inherent},
Indices: indices::{Module, Call, Storage, Config<T>, Event<T>},
Balances: balances::{Module, Call, Storage, Config<T>, Event<T>},
TransactionPayment: transaction_payment::{Module, Storage},
// Consensus support.
Authorship: authorship::{Module, Call, Storage},
Staking: staking::{Module, Call, Storage, Config<T>, Event<T>},
Offences: offences::{Module, Call, Storage, Event},
Historical: session_historical::{Module},
Session: session::{Module, Call, Storage, Event, Config<T>},
FinalityTracker: finality_tracker::{Module, Call, Storage, Inherent},
Grandpa: grandpa::{Module, Call, Storage, Config, Event},
ImOnline: im_online::{Module, Call, Storage, Event<T>, ValidateUnsigned, Config<T>},
AuthorityDiscovery: authority_discovery::{Module, Call, Config},
// Parachains stuff; slots are disabled (no auctions initially). The rest are safe as they
// have no public dispatchables.
Parachains: parachains::{Module, Call, Storage, Config, Inherent, Origin},
Attestations: attestations::{Module, Call, Storage},
Registrar: registrar::{Module, Call, Storage, Event, Config<T>},
// Utility module.
Utility: utility::{Module, Call, Storage, Event<T>},
// Less simple identity module.
Identity: identity::{Module, Call, Storage, Event<T>},
// Social recovery module.
Recovery: recovery::{Module, Call, Storage, Event<T>},
// Vesting. Usable initially, but removed once all vesting is finished.
Vesting: vesting::{Module, Call, Storage, Event<T>, Config<T>},
// System scheduler.
Scheduler: scheduler::{Module, Call, Storage, Event<T>},
// Sudo.
Sudo: sudo::{Module, Call, Storage, Event<T>, Config<T>}
}
}
/// The address format for describing accounts.
pub type Address = AccountId;
/// Block header type as expected by this runtime.
pub type Header = generic::Header<BlockNumber, BlakeTwo256>;
/// Block type as expected by this runtime.
pub type Block = generic::Block<Header, UncheckedExtrinsic>;
/// A Block signed with a Justification
pub type SignedBlock = generic::SignedBlock<Block>;
/// BlockId type as expected by this runtime.
pub type BlockId = generic::BlockId<Block>;
/// The SignedExtension to the basic transaction logic.
pub type SignedExtra = (
RestrictFunctionality,
system::CheckVersion<Runtime>,
system::CheckGenesis<Runtime>,
system::CheckEra<Runtime>,
system::CheckNonce<Runtime>,
system::CheckWeight<Runtime>,
transaction_payment::ChargeTransactionPayment::<Runtime>,
registrar::LimitParathreadCommits<Runtime>,
parachains::ValidateDoubleVoteReports<Runtime>,
);
/// Unchecked extrinsic type as expected by this runtime.
pub type UncheckedExtrinsic = generic::UncheckedExtrinsic<Address, Call, Signature, SignedExtra>;
/// Extrinsic type that has already been checked.
pub type CheckedExtrinsic = generic::CheckedExtrinsic<AccountId, Nonce, Call>;
/// Executive: handles dispatch to the various modules.
pub type Executive = executive::Executive<Runtime, Block, system::ChainContext<Runtime>, Runtime, AllModules>;
sp_api::impl_runtime_apis! {
impl sp_api::Core<Block> for Runtime {
fn version() -> RuntimeVersion {
VERSION
}
fn execute_block(block: Block) {
Executive::execute_block(block)
}
fn initialize_block(header: &<Block as BlockT>::Header) {
Executive::initialize_block(header)
}
}
impl sp_api::Metadata<Block> for Runtime {
fn metadata() -> OpaqueMetadata {
Runtime::metadata().into()
}
}
impl block_builder_api::BlockBuilder<Block> for Runtime {
fn apply_extrinsic(extrinsic: <Block as BlockT>::Extrinsic) -> ApplyExtrinsicResult {
Executive::apply_extrinsic(extrinsic)
}
fn finalize_block() -> <Block as BlockT>::Header {
Executive::finalize_block()
}
fn inherent_extrinsics(data: inherents::InherentData) -> Vec<<Block as BlockT>::Extrinsic> {
data.create_extrinsics()
}
fn check_inherents(
block: Block,
data: inherents::InherentData,
) -> inherents::CheckInherentsResult {
data.check_extrinsics(&block)
}
fn random_seed() -> <Block as BlockT>::Hash {
RandomnessCollectiveFlip::random_seed()
}
}
impl tx_pool_api::runtime_api::TaggedTransactionQueue<Block> for Runtime {
fn validate_transaction(
source: TransactionSource,
tx: <Block as BlockT>::Extrinsic,
) -> TransactionValidity {
Executive::validate_transaction(source, tx)
}
}
impl offchain_primitives::OffchainWorkerApi<Block> for Runtime {
fn offchain_worker(header: &<Block as BlockT>::Header) {
Executive::offchain_worker(header)
}
}
impl parachain::ParachainHost<Block> for Runtime {
fn validators() -> Vec<parachain::ValidatorId> {
Parachains::authorities()
}
fn duty_roster() -> parachain::DutyRoster {
Parachains::calculate_duty_roster().0
}
fn active_parachains() -> Vec<(parachain::Id, Option<(parachain::CollatorId, parachain::Retriable)>)> {
Registrar::active_paras()
}
fn global_validation_schedule() -> parachain::GlobalValidationSchedule {
Parachains::global_validation_schedule()
}
fn local_validation_data(id: parachain::Id) -> Option<parachain::LocalValidationData> {
Parachains::current_local_validation_data(&id)
}
fn parachain_code(id: parachain::Id) -> Option<parachain::ValidationCode> {
Parachains::parachain_code(&id)
}
fn get_heads(extrinsics: Vec<<Block as BlockT>::Extrinsic>)
-> Option<Vec<AbridgedCandidateReceipt>>
{
extrinsics
.into_iter()
.find_map(|ex| match UncheckedExtrinsic::decode(&mut ex.encode().as_slice()) {
Ok(ex) => match ex.function {
Call::Parachains(ParachainsCall::set_heads(heads)) => {
Some(heads.into_iter().map(|c| c.candidate).collect())
}
_ => None,
}
Err(_) => None,
})
}
fn signing_context() -> SigningContext {
Parachains::signing_context()
}
}
impl fg_primitives::GrandpaApi<Block> for Runtime {
fn grandpa_authorities() -> Vec<(GrandpaId, u64)> {
Grandpa::grandpa_authorities()
}
}
impl babe_primitives::BabeApi<Block> for Runtime {
fn configuration() -> babe_primitives::BabeConfiguration {
// The choice of `c` parameter (where `1 - c` represents the
// probability of a slot being empty), is done in accordance to the
// slot duration and expected target block time, for safely
// resisting network delays of maximum two seconds.
// <https://research.web3.foundation/en/latest/polkadot/BABE/Babe/#6-practical-results>
babe_primitives::BabeConfiguration {
slot_duration: Babe::slot_duration(),
epoch_length: EpochDuration::get(),
c: PRIMARY_PROBABILITY,
genesis_authorities: Babe::authorities(),
randomness: Babe::randomness(),
secondary_slots: true,
}
}
fn current_epoch_start() -> babe_primitives::SlotNumber {
Babe::current_epoch_start()
}
}
impl authority_discovery_primitives::AuthorityDiscoveryApi<Block> for Runtime {
fn authorities() -> Vec<AuthorityDiscoveryId> {
AuthorityDiscovery::authorities()
}
}
impl sp_session::SessionKeys<Block> for Runtime {
fn generate_session_keys(seed: Option<Vec<u8>>) -> Vec<u8> {
SessionKeys::generate(seed)
}
fn decode_session_keys(
encoded: Vec<u8>,
) -> Option<Vec<(Vec<u8>, sp_core::crypto::KeyTypeId)>> {
SessionKeys::decode_into_raw_public_keys(&encoded)
}
}
impl system_rpc_runtime_api::AccountNonceApi<Block, AccountId, Nonce> for Runtime {
fn account_nonce(account: AccountId) -> Nonce {
System::account_nonce(account)
}
}
impl transaction_payment_rpc_runtime_api::TransactionPaymentApi<
Block,
Balance,
UncheckedExtrinsic,
> for Runtime {
fn query_info(uxt: UncheckedExtrinsic, len: u32) -> RuntimeDispatchInfo<Balance> {
TransactionPayment::query_info(uxt, len)
}
}
#[cfg(feature = "runtime-benchmarks")]
impl frame_benchmarking::Benchmark<Block> for Runtime {
fn dispatch_benchmark(
pallet: Vec<u8>,
benchmark: Vec<u8>,
lowest_range_values: Vec<u32>,
highest_range_values: Vec<u32>,
steps: Vec<u32>,
repeat: u32,
) -> Result<Vec<frame_benchmarking::BenchmarkBatch>, RuntimeString> {
use frame_benchmarking::{Benchmarking, BenchmarkBatch, add_benchmark};
let mut batches = Vec::<BenchmarkBatch>::new();
let params = (&pallet, &benchmark, &lowest_range_values, &highest_range_values, &steps, repeat);
if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) }
Ok(batches)
}
}
}
+2 -1
View File
@@ -17,6 +17,7 @@ consensus = { package = "polkadot-validation", path = "../validation", optional
polkadot-primitives = { path = "../primitives" }
polkadot-runtime = { path = "../runtime/polkadot" }
kusama-runtime = { path = "../runtime/kusama" }
westend-runtime = { path = "../runtime/westend" }
polkadot-network = { path = "../network", optional = true }
polkadot-rpc = { path = "../rpc" }
sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" }
@@ -62,5 +63,5 @@ sc-block-builder = { git = "https://github.com/paritytech/substrate", branch = "
[features]
default = ["rocksdb", "full-node"]
rocksdb = ["service/rocksdb"]
runtime-benchmarks = ["polkadot-runtime/runtime-benchmarks", "kusama-runtime/runtime-benchmarks"]
runtime-benchmarks = ["polkadot-runtime/runtime-benchmarks", "kusama-runtime/runtime-benchmarks", "westend-runtime/runtime-benchmarks"]
full-node = ["av_store", "consensus", "polkadot-network"]
+95 -90
View File
@@ -1,13 +1,13 @@
{
"name": "Westend",
"id": "westend",
"id": "westend2",
"bootNodes": [
"/ip4/104.155.79.90/tcp/30333/p2p/QmZ4HcUygvbrPaABU9MfjqFsSPUKwmH6LyXBFYX2xSXGo2",
"/ip4/104.155.79.90/tcp/30334/ws/p2p/QmZ4HcUygvbrPaABU9MfjqFsSPUKwmH6LyXBFYX2xSXGo2",
"/ip4/35.205.142.129/tcp/30333/p2p/QmaynNd1C321UowxH8a8MVBe6R8FUYQmaU6Sm4wnvdTyuq",
"/ip4/35.205.142.129/tcp/30334/ws/p2p/QmaynNd1C321UowxH8a8MVBe6R8FUYQmaU6Sm4wnvdTyuq",
"/ip4/34.73.55.183/tcp/30333/p2p/QmerZUpaWoJ1eqcwfcwGVtLmySUKZs5EZBusse5DGopcLU",
"/ip4/34.73.55.183/tcp/30334/ws/p2p/QmerZUpaWoJ1eqcwfcwGVtLmySUKZs5EZBusse5DGopcLU",
"/ip4/34.73.55.183/tcp/30333/p2p/QmPDkHPQtjVQzhVUwhg1hKyV3U2rmF46aUN4pDUXopZd9j",
"/ip4/34.73.55.183/tcp/30334/ws/p2p/QmPDkHPQtjVQzhVUwhg1hKyV3U2rmF46aUN4pDUXopZd9j",
"/ip4/35.243.227.147/tcp/30333/p2p/QmfZHq4crnQyJky6vLgUECCVmLiCM1VuiGUpdw44FvLEr5",
"/ip4/35.243.227.147/tcp/30334/ws/p2p/QmfZHq4crnQyJky6vLgUECCVmLiCM1VuiGUpdw44FvLEr5"
],
@@ -17,7 +17,7 @@
0
]
],
"protocolId": "wnd",
"protocolId": "wnd2",
"properties": {
"ss58Format": 42,
"tokenDecimals": 12,
@@ -29,96 +29,101 @@
"genesis": {
"raw": {
"top": {
"0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x1008264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606df268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836aebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c439349ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d",
"0xf2794c22e353e9a839f12faab03a911b7f17cdfbfa73331856cca0acddd7842e": "0x00000000",
"0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb39fe6329cc0b39e09343a73657373696f6e3a6b657973cf50a09ae18df1c947f36663a3815d9093c38b9e224dd38677df7f6ac0a227c8": "0xfeca0be2c87141f6074b221c919c0161a1c468d9173c5c1be59b68fab9a0ff937ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b65797373a1099056768c0dac58bc0b2cdebaaa280fcd4c1942bafa135a64f0bbf42773": "0x08264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d",
"0xc2261276cc9d1f8598ea4b6a74b15c2f6482b9ade7bc6657aaca787ba1add3b421388af3dd204958d0a2ea1287b1402f36ac1ef7e0779bdcf1d120e7851931e1": "0x0000c16ff28623000000000000000000",
"0xc2261276cc9d1f8598ea4b6a74b15c2f6482b9ade7bc6657aaca787ba1add3b489d89afc0491eeba61cf9fca6c24db1c087a729229091e45281ef1eb8739243f": "0x0000c16ff28623000000000000000000",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b6579731135c688d7e0bceaef2dfe15081dad9f1595e8d6938eb790e8d5638271394708": "0x9ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d",
"0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade98cf50a09ae18df1c947f36663a3815d9093c38b9e224dd38677df7f6ac0a227c8": "0x00",
"0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e169033b564a683e22524c0ee053666d9daaab59c91edd46ba5e19cbdb958268ed86cf": "0x000001f268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b6579733fda0f26624477ab9cc4d6dd7f44f0fbed35e82f66ed184589beda02da6b46e6": "0x9ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b657973eccdc8e1af0dc9a9131c988de878aa05c190e3e6d702bbfa190ec8e63b4dfefd": "0x08264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d",
"0x3fba98689ebed1138735e0e7a5a790ab0b76934f4cc08dee01012d059e1b83ee": "0x00",
"0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe7089d89afc0491eeba61cf9fca6c24db1c087a729229091e45281ef1eb8739243f": "0x8011fb3641f0641f5570ba8787a64a0ff7d9c9999481f333d7207c4abd7e981c",
"0xc2261276cc9d1f8598ea4b6a74b15c2f6482b9ade7bc6657aaca787ba1add3b4cf50a09ae18df1c947f36663a3815d9093c38b9e224dd38677df7f6ac0a227c8": "0x0000c16ff28623000000000000000000",
"0x5f3e4907f716ac89b6347d15ececedca83e585bbc5fdcec57219c0dc81ef5ff43b564a683e22524c0ee053666d9daaab59c91edd46ba5e19cbdb958268ed86cf": "0x0f0000c16ff286230f0000c16ff2862300",
"0x5f3e4907f716ac89b6347d15ececedca6a93112633bb3354e67952fcdd740cd5": "0x08264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d",
"0x1a736d37504c2e3fb73dad160c55b2917ac6a308d645671864cda07d358e751211da6d1f761ddf9bdb4c9d6e5303ebd41f61858d0a5647a1a7bfe089bf921be9": "0x146648d7f3382690650c681aba1b993cd11e54deb4df21a3a18c3e2177de9f73429ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81daebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934f268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f583608264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d",
"0x5f3e4907f716ac89b6347d15ececedcab49a2738eeb30896aacb8b3fb46471bd": "0x01000000",
"0xc2261276cc9d1f8598ea4b6a74b15c2f6482b9ade7bc6657aaca787ba1add3b41a27c953ba92f8a42f88a3c036ca0ee89a9d4f52cae8c85a79502ab0bf636ea8": "0x0000f444829163450000000000000000",
"0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb39fe6329cc0b39e09343a73657373696f6e3a6b65797389d89afc0491eeba61cf9fca6c24db1c087a729229091e45281ef1eb8739243f": "0x959cebf18fecb305b96fd998c95f850145f52cbbb64b3ef937c0575cc7ebd65272bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e300172bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e300172bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e300172bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b657973a98753e9021549bbcc44156253c72a18a132446021f48f496c7ba29d0146465f": "0xaebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934",
"0x5f3e4907f716ac89b6347d15ececedca308ce9615de0775a82f8a94dc3d285a1": "0x01000000",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b657973ed2a33503249c1e849159c5074ad30737fa9ecd1b0f97f79334612148fadf7d9": "0x9ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d",
"0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x1008264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d9fc415cce1d0b2eed702c9e05f476217d23b46a8723fd56f08cddad650be7c2da8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4fa8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4fa8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4fa8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4ff268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836fc9d33059580a69454179ffa41cbae6de2bc8d2bd2c3f1d018fe5484a5a9195674bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673eaebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934feca0be2c87141f6074b221c919c0161a1c468d9173c5c1be59b68fab9a0ff937ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a9ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d959cebf18fecb305b96fd998c95f850145f52cbbb64b3ef937c0575cc7ebd65272bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e300172bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e300172bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e300172bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001",
"0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc439e2f3d8825dfd092a6bf98ab5f9f8df61b4e158ba689e2b7ea41596c2658189": "0xf268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f58360f0000c16ff286230f0000c16ff2862300",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b6579735b4178328c7a84a57f0bc252987e150cfa9aa44ddc3ef1bf41cb9ad51710b441": "0xaebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934",
"0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe703b564a683e22524c0ee053666d9daaab59c91edd46ba5e19cbdb958268ed86cf": "0x8671d451c3d4f6de8c16ea0bc61cf714914d6b2ffa2899872620525419327478",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b657973dd94903a38d066be02fde84f942fad2424c5493930944a096d4326772f6f137e": "0xf268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836",
"0x5f3e4907f716ac89b6347d15ececedca9cbd2f0b29a008a36009ac44cca0c969": "0x0000c16ff28623000000000000000000",
"0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb39fe6329cc0b39e09343a73657373696f6e3a6b65797321388af3dd204958d0a2ea1287b1402f36ac1ef7e0779bdcf1d120e7851931e1": "0xfc9d33059580a69454179ffa41cbae6de2bc8d2bd2c3f1d018fe5484a5a9195674bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b657973857a485cd1158134d1b08c92b384af93b840b0e9a959a1b7297772f2e6cce000": "0xaebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934",
"0x3a65787472696e7369635f696e646578": "0x00000000",
"0x2371e21684d2fae99bcb4d579242f74a8a2d09463effcc78a22d75b9cb87dffc": "0x0000000000000000",
"0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e1690321388af3dd204958d0a2ea1287b1402f36ac1ef7e0779bdcf1d120e7851931e1": "0x000108264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d01aebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934",
"0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc689d89afc0491eeba61cf9fca6c24db1c087a729229091e45281ef1eb8739243f": "0x047374616b696e67200000c16ff28623000000000000000000ffffffff1f",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b657973c5724ed47efe0df50e27d6e4a94f14f520ad080ad1393d9f7958805abcdbea65": "0xf268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836",
"0x9c5d795d0297be56027a4b2464e33397f43d6436dec51f09c3b71287a8fc9d48": "0x00000000000000000000000000000000",
"0x5f3e4907f716ac89b6347d15ececedca0b6a45321efae92aea15e0740ec7afe7": "0x00000000",
"0x5f3e4907f716ac89b6347d15ececedca83e585bbc5fdcec57219c0dc81ef5ff421388af3dd204958d0a2ea1287b1402f36ac1ef7e0779bdcf1d120e7851931e1": "0x0f0000c16ff286230f0000c16ff2862300",
"0x5f3e4907f716ac89b6347d15ececedca83e585bbc5fdcec57219c0dc81ef5ff4cf50a09ae18df1c947f36663a3815d9093c38b9e224dd38677df7f6ac0a227c8": "0x0f0000c16ff286230f0000c16ff2862300",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b657973ba88b542122a0fd1aebf266643a1d0ec67346ea7ed95a8baa9b266c50a3d5930": "0xf268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836",
"0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e16903cf50a09ae18df1c947f36663a3815d9093c38b9e224dd38677df7f6ac0a227c8": "0x0001f268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836019ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d",
"0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc6cf50a09ae18df1c947f36663a3815d9093c38b9e224dd38677df7f6ac0a227c8": "0x047374616b696e67200000c16ff28623000000000000000000ffffffff1f",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b6579732bbf06ecd7c44d1dcd49b8f7bde94910cfc3561d5f23665df2644685c84f7c8e": "0x08264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b65797363e57f282f2dd8b9cf52390479094dec02a6f22aac3e1979049d10503d21e1b3": "0x9ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d",
"0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe70cf50a09ae18df1c947f36663a3815d9093c38b9e224dd38677df7f6ac0a227c8": "0xcaf27345aebc2fefeca85c9a67f4859eab3178d28ef92244714402290f3f415a",
"0xf2794c22e353e9a839f12faab03a911bbdcb0c5143a8617ed38ae3810dd45bc6": "0x00000000",
"0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade9889d89afc0491eeba61cf9fca6c24db1c087a729229091e45281ef1eb8739243f": "0x00",
"0x5f3e4907f716ac89b6347d15ececedcaf7dad0317324aecae8744b87fc95f2f3": "0x02",
"0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb39fe6329cc0b39e09343a73657373696f6e3a6b6579733b564a683e22524c0ee053666d9daaab59c91edd46ba5e19cbdb958268ed86cf": "0x9fc415cce1d0b2eed702c9e05f476217d23b46a8723fd56f08cddad650be7c2da8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4fa8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4fa8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4fa8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f",
"0x2099d7f109d6e535fb000bba623fd4409f99a2ce711f3a31b2fc05604c93f179": "0x10a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a72bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001",
"0xf2794c22e353e9a839f12faab03a911be2f6cb0456905c189bcb0458f9440f13": "0x00000000",
"0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade983b564a683e22524c0ee053666d9daaab59c91edd46ba5e19cbdb958268ed86cf": "0x00",
"0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c11874611da6d1f761ddf9bdb4c9d6e5303ebd41f61858d0a5647a1a7bfe089bf921be9": "0x4545454545454545454545454545454545454545454545454545454545454545",
"0x2b06af9719ac64d755623cda8ddd9b949f99a2ce711f3a31b2fc05604c93f179": "0x10a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a72bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001",
"0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe7021388af3dd204958d0a2ea1287b1402f36ac1ef7e0779bdcf1d120e7851931e1": "0x4c17a9bfdd19411f452fa32420fa7acab622e87e57351f4ba3248ae40ce75123",
"0x5f3e4907f716ac89b6347d15ececedca5579297f4dfb9609e7e4c2ebab9ce40a": "0x109ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81daebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934f268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f583608264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d",
"0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc63b564a683e22524c0ee053666d9daaab59c91edd46ba5e19cbdb958268ed86cf": "0x047374616b696e67200000c16ff28623000000000000000000ffffffff1f",
"0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x0000f8034cadf1450000000000000000",
"0x26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac": "0x01000000",
"0x3a636f6465": "0x0061736d0100000001ae022c60037f7f7f017f60027f7f017f60027f7f0060017f0060017f017e60037f7e7e0060017e017f60027e7e0060017e0060017e017e60037f7e7f017f6000017f60027f7e017e60047f7e7e7e017f60027f7e017f6000017e60037f7f7e017e60027f7f017e60017f017f60037e7e7f017e60000060037f7f7f0060057f7f7f7f7f0060027e7f017f60057f7f7f7f7f017f60047f7f7f7f017f60047f7f7f7f0060067f7e7e7f7f7f0060057f7e7e7f7f0060057f7f7f7e7e0060027f7e0060067f7f7f7f7f7f0060047f7f7e7e0060067f7f7e7e7f7f0060077f7f7e7e7f7e7e0060067f7f7f7e7e7f0060077f7f7f7f7f7e7e0060027e7f0060077f7e7e7e7e7e7e0060087e7e7e7e7e7e7e7e017f60047f7e7e7e0060047f7e7e7f0060057f7e7e7e7e0060067f7e7e7e7e7f0002f30a2203656e76196578745f6c6f6767696e675f6c6f675f76657273696f6e5f31000503656e761d6578745f68617368696e675f74776f785f36345f76657273696f6e5f31000603656e76206578745f68617368696e675f626c616b65325f3235365f76657273696f6e5f31000603656e76196578745f73746f726167655f7365745f76657273696f6e5f31000703656e761e6578745f68617368696e675f74776f785f3132385f76657273696f6e5f31000603656e761b6578745f73746f726167655f636c6561725f76657273696f6e5f31000803656e761d6578745f6d6973635f7072696e745f757466385f76657273696f6e5f31000803656e76196578745f73746f726167655f6765745f76657273696f6e5f31000903656e76226578745f73746f726167655f636c6561725f7072656669785f76657273696f6e5f31000803656e76206578745f68617368696e675f626c616b65325f3132385f76657273696f6e5f31000603656e76236578745f63727970746f5f737232353531395f7665726966795f76657273696f6e5f31000a03656e76226578745f6d6973635f72756e74696d655f76657273696f6e5f76657273696f6e5f31000903656e76206578745f68617368696e675f6b656363616b5f3235365f76657273696f6e5f31000603656e76236578745f63727970746f5f656432353531395f7665726966795f76657273696f6e5f31000a03656e761c6578745f6d6973635f7072696e745f6865785f76657273696f6e5f31000803656e76236578745f6f6666636861696e5f69735f76616c696461746f725f76657273696f6e5f31000b03656e76286578745f6f6666636861696e5f6c6f63616c5f73746f726167655f6765745f76657273696f6e5f31000c03656e76346578745f6f6666636861696e5f6c6f63616c5f73746f726167655f636f6d706172655f616e645f7365745f76657273696f6e5f31000d03656e76286578745f6f6666636861696e5f6c6f63616c5f73746f726167655f7365745f76657273696f6e5f31000503656e76256578745f63727970746f5f656432353531395f67656e65726174655f76657273696f6e5f31000e03656e761a6578745f73746f726167655f726f6f745f76657273696f6e5f31000f03656e76226578745f73746f726167655f6368616e6765735f726f6f745f76657273696f6e5f31000903656e76256578745f63727970746f5f737232353531395f67656e65726174655f76657273696f6e5f31000e03656e762a6578745f747269655f626c616b65325f3235365f6f7264657265645f726f6f745f76657273696f6e5f31000603656e76296578745f6f6666636861696e5f7375626d69745f7472616e73616374696f6e5f76657273696f6e5f31000903656e76246578745f6f6666636861696e5f6e6574776f726b5f73746174655f76657273696f6e5f31000f03656e76286578745f63727970746f5f737232353531395f7075626c69635f6b6579735f76657273696f6e5f31000403656e76216578745f63727970746f5f737232353531395f7369676e5f76657273696f6e5f31001003656e762c6578745f63727970746f5f736563703235366b315f65636473615f7265636f7665725f76657273696f6e5f31001103656e76376578745f63727970746f5f736563703235366b315f65636473615f7265636f7665725f636f6d707265737365645f76657273696f6e5f31001103656e761e6578745f616c6c6f6361746f725f6d616c6c6f635f76657273696f6e5f31001203656e761c6578745f616c6c6f6361746f725f667265655f76657273696f6e5f31000303656e761a6578745f73746f726167655f726561645f76657273696f6e5f31001303656e761c6578745f6d6973635f7072696e745f6e756d5f76657273696f6e5f31000803dd04db04121203030000121211141414150215001416000101020117030418190202001a0101010201010101150101001a0101000101000100030101010202150201020100010115010203021a1502020202020202020202120303021501020203030202020202020202120112021502020203021602150203141a021515020b021b0202021503030202030302020202030102020102020202020215150202021c020215050502151d021e15021502021503030301021f0202020103032003030703052122020202020220231521201d2005030302030203030302021515030215030303030303030303030303030303030303030302030102020202020202021502021202150215021515151a1502020212020202151a15021a021a24020202161503141202030315030302020202070503030302020202020202020202020202021502030203020b12021a1503151515010215021503150303020f020215020303020216251602020202150303020303020202151a020201160202011a1502030315020215031402020202262701161a0315030203021203021903030202020216030303020303030202020101020303022802120202020202020202020202020215020202020303020215030303020302020303030203030303110211020311111111111111111511020203160011111111111111111111111511110302021202020202021603150202030303030302020203011515030302020203200203140302150202020203020202020302030303020202031a0212030302020202030202020202160302030315151201010205011601010000000029292a2a2a2b0407017001bc01bc0105030100120619037f01418080c0000b7f0041b0ffc6000b7f0041b0ffc6000b07b0061d066d656d6f72790200195f5f696e6469726563745f66756e6374696f6e5f7461626c65010009686173685f74657374002a0c436f72655f76657273696f6e00f90312436f72655f657865637574655f626c6f636b00fb0315436f72655f696e697469616c697a655f626c6f636b00fe03114d657461646174615fLine truncated
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b657973b5235554d2d5d0441fab02cd2ae8f3e344bd4548f4866d731a57dc4ac96a8a36": "0xf268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836",
"0x0b76934f4cc08dee01012d059e1b83ee5e0621c4869aa60c02be9adcc98a0d1d": "0x10a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a72bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001",
"0x1a736d37504c2e3fb73dad160c55b291b35b5a09b938edfd10fcbacc615abb0c": "0x00000000",
"0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc69406b1b580f3fd70373207c005e38adff268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836": "0x047374616b696e672000407a10f35a0000000000000000000002",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950df2ec3df1d2fc39f6772616e80959cebf18fecb305b96fd998c95f850145f52cbbb64b3ef937c0575cc7ebd652": "0x9ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d",
"0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90566b5cb12e1bb0dd3301e8ab40c6d0508264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d": "0x000000000300407a10f35a000000000000000000000000000000000000000000000000000000407a10f35a0000000000000000000000407a10f35a00000000000000000000",
"0x5f3e4907f716ac89b6347d15ececedca42982b9d6c7acc99faa9094c912372c2b4def25cfda6ef3a00000000ce6a96a3775ab416f268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836": "0x0b00407a10f35a0b00407a10f35a00",
"0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade9803adc196911e491e08264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d": "0x00",
"0x5f3e4907f716ac89b6347d15ececedcaea07de2b8f010516dca3f7ef52f7ac5a": "0x040000000000000000",
"0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc6afdf816f281ad669fe59fe0f725f72759ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d": "0x047374616b696e672000407a10f35a0000000000000000000002",
"0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9bb08f275d00049b315666c2c44130a106648d7f3382690650c681aba1b993cd11e54deb4df21a3a18c3e2177de9f7342": "0x0000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"0x1cb6f36e027abb2091cfb5110ab5087f66e8f035c8adbe7f1547b43c51e6f8a4": "0x00000000",
"0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0x6648d7f3382690650c681aba1b993cd11e54deb4df21a3a18c3e2177de9f7342",
"0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc4115dcc331691cda4f829036068a6ee6c5c51a47b2418e760309d52e3324449e6": "0x08264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d0f0000c16ff286230f0000c16ff2862300",
"0x5f3e4907f716ac89b6347d15ececedcac29a0310e1bb45d20cace77ccb62c97d": "0x00e1f505",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b65797382c335b2b9960bfce7d46a394d38e5508f4f4a175bc7798fde4020a2d56180f4": "0xf268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836",
"0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc46b4733f302253576d2c9e3343506828c3dc9b6d966354eccb5930ec38631ec72": "0x9ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d0f0000c16ff286230f0000c16ff2862300",
"0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade9821388af3dd204958d0a2ea1287b1402f36ac1ef7e0779bdcf1d120e7851931e1": "0x00",
"0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc4cb93394fbdc7451bd459438d1dcacd98ba80c5993a8eb094efd84b1a54f1bf35": "0xaebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c439340f0000c16ff286230f0000c16ff2862300",
"0x1cb6f36e027abb2091cfb5110ab5087f5e0621c4869aa60c02be9adcc98a0d1d": "0x10a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f010000000000000074bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e01000000000000007ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a010000000000000072bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e30010100000000000000",
"0x5f3e4907f716ac89b6347d15ececedca0ea0ecac76457d0f9b39b981dd107012": "0x1008264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606df268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836aebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c439349ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b657973be2241b22fa04edd0f69a990422e43b1b36be8022335156766a1df47b416e726": "0x08264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d",
"0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e1690389d89afc0491eeba61cf9fca6c24db1c087a729229091e45281ef1eb8739243f": "0x0001aebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c4393400",
"0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x041c77657374656e64",
"0x2b06af9719ac64d755623cda8ddd9b949f99a2ce711f3a31b2fc05604c93f179": "0x10a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a72bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e300174bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e",
"0x5f3e4907f716ac89b6347d15ececedca138e71612491192d68deab7e6f563fe1": "0x32000000",
"0x5f3e4907f716ac89b6347d15ececedca8bde0a0ea8864605e3b68ed9cb2da01bb4def25cfda6ef3a0000000003adc196911e491e08264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d": "0x0b00407a10f35a0b00407a10f35a00",
"0x2371e21684d2fae99bcb4d579242f74a8a2d09463effcc78a22d75b9cb87dffc": "0x0000000000000000",
"0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb35c69b53821debaa39ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d": "0x959cebf18fecb305b96fd998c95f850145f52cbbb64b3ef937c0575cc7ebd65272bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e300172bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e300172bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e300172bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001",
"0x5f3e4907f716ac89b6347d15ececedca682db92dde20a10d96d00ff0e9e221c0b4def25cfda6ef3a00000000ce6a96a3775ab416f268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836": "0x00",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195024a1470c7a02f07e696d6f6e807ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a": "0xaebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934",
"0x3a636f6465": "0x0061736d0100000001ae022c60037f7f7f017f60027f7f017f60027f7f0060017f017e60017f0060047f7f7f7f0060037f7e7e0060017e017f6000017e60017e017e60017f017f60037e7e7f017e60027f7f017e60037f7f7e017e60017e0060027e7e0060037f7e7f017f60027f7e017e60047f7e7e7e017f6000017f60027f7e017f60000060037f7f7f0060057f7f7f7f7f0060027e7f017f60057f7f7f7f7f017f60047f7f7f7f017f60077f7f7f7f7f7f7f017f60087e7e7e7e7e7e7e7e017f60077f7e7e7e7e7e7e0060027f7e0060067f7f7f7f7f7f0060057f7e7e7f7f0060057f7f7f7e7e0060057f7f7e7e7f0060047e7e7e7e017f60047f7f7e7e0060067f7e7e7f7f7f0060067f7f7f7e7e7f0060027e7f0060067f7f7f7f7e7e0060047f7e7e7f0060057f7e7e7e7e0060067f7e7e7e7e7f0002cc0a2203656e76066d656d6f727902001203656e76196578745f6c6f6767696e675f6c6f675f76657273696f6e5f31000603656e762a6578745f747269655f626c616b65325f3235365f6f7264657265645f726f6f745f76657273696f6e5f31000703656e76246578745f6f6666636861696e5f6e6574776f726b5f73746174655f76657273696f6e5f31000803656e76296578745f6f6666636861696e5f7375626d69745f7472616e73616374696f6e5f76657273696f6e5f31000903656e761e6578745f616c6c6f6361746f725f6d616c6c6f635f76657273696f6e5f31000a03656e761c6578745f616c6c6f6361746f725f667265655f76657273696f6e5f31000403656e761a6578745f73746f726167655f726561645f76657273696f6e5f31000b03656e76376578745f63727970746f5f736563703235366b315f65636473615f7265636f7665725f636f6d707265737365645f76657273696f6e5f31000c03656e76286578745f63727970746f5f737232353531395f7075626c69635f6b6579735f76657273696f6e5f31000303656e76216578745f63727970746f5f737232353531395f7369676e5f76657273696f6e5f31000d03656e761d6578745f6d6973635f7072696e745f757466385f76657273696f6e5f31000e03656e761c6578745f6d6973635f7072696e745f6e756d5f76657273696f6e5f31000e03656e761e6578745f68617368696e675f74776f785f3132385f76657273696f6e5f31000703656e761d6578745f68617368696e675f74776f785f36345f76657273696f6e5f31000703656e76196578745f73746f726167655f7365745f76657273696f6e5f31000f03656e76206578745f68617368696e675f626c616b65325f3132385f76657273696f6e5f31000703656e76196578745f73746f726167655f6765745f76657273696f6e5f31000903656e761b6578745f73746f726167655f636c6561725f76657273696f6e5f31000e03656e76226578745f73746f726167655f636c6561725f7072656669785f76657273696f6e5f31000e03656e76236578745f63727970746f5f737232353531395f7665726966795f76657273696f6e5f32001003656e76286578745f6f6666636861696e5f6c6f63616c5f73746f726167655f6765745f76657273696f6e5f31001103656e76346578745f6f6666636861696e5f6c6f63616c5f73746f726167655f636f6d706172655f616e645f7365745f76657273696f6e5f31001203656e76286578745f6f6666636861696e5f6c6f63616c5f73746f726167655f7365745f76657273696f6e5f31000603656e76226578745f6d6973635f72756e74696d655f76657273696f6e5f76657273696f6e5f31000903656e76206578745f68617368696e675f626c616b65325f3235365f76657273696f6e5f31000703656e761e6578745f73746f726167655f6e6578745f6b65795f76657273696f6e5f31000903656e761a6578745f73746f726167655f726f6f745f76657273696f6e5f31000803656e76226578745f73746f726167655f6368616e6765735f726f6f745f76657273696f6e5f31000903656e76236578745f63727970746f5f656432353531395f7665726966795f76657273696f6e5f31001003656e761c6578745f6d6973635f7072696e745f6865785f76657273696f6e5f31000e03656e76236578745f6f6666636861696e5f69735f76616c696461746f725f76657273696f6e5f31001303656e76256578745f63727970746f5f656432353531395f67656e65726174655f76657273696f6e5f31001403656e76256578745f63727970746f5f737232353531395f67656e65726174655f76657273696f6e5f310014038b0589050a0a040400000a0a0c1515151616021600151517000101020102020201180403191a161600170101010a1b0101011601010005010100010100000100040101020216021602000101160102010102040202010216051602041616160a0101021c011d01010202040200171e1f160217020104011616161616161616161616161616161616161616161616160216161616160216161616160204021601020416160202020202020202160202021604020201020202160216170216020516161604161604021602021620060f020204150a0402020216020202020202020402020202020405020219021602160a2102021616020216020402162202021602232419040505160204040001010201021602020101020401010201010404040204020204170a020502021602130125020216040404161616040202020404160204010202020202020404040404040404040404040404041502021602020216162605260a02020204021602161702020201020202021616160416020202020202040202020402020104041604040402020404040416051602021602160202021616161902040202160216160202020402000604040202021a02040402020202020202020202021504040404041508020217020216020404021604040204040202040202020202020202020216020216020404020204042717160202021604010216020201020201160202161616010404020402020216051f28020404010201040402020202150416160404040202040501000402040204020202040416160404020402020202161616040404040404040c0c0c0c0c0c0c040c0c0c0c150c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0204040204020402160202160423160404040402040000000029292a2a2a2b0407017001ad01ad010619037f01418080c0000b7f0041a0abc7000b7f0041a0abc7000b07a2071f195f5f696e6469726563745f66756e6374696f6e5f7461626c65010009686173685f7465737400290c436f72655f76657273696f6e00ee0412436f72655f657865637574655f626c6f636b00ef0415436f72655f696e697469616c697a655f626c6f636b00f004114d657461646174615f6d657461646174Line truncated
"0x5f3e4907f716ac89b6347d15ececedca487df464e44a534ba6b0cbb32407b587": "0x0000000000",
"0x0b76934f4cc08dee01012d059e1b83ee5e0621c4869aa60c02be9adcc98a0d1d": "0x10a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a72bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e300174bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950bd5e21ce53b32bef696d6f6e8072bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001": "0x9ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950775c11433d27a3e6696d6f6e80a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f": "0x08264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d",
"0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e169034245138345ca3fd8aebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934": "0x00",
"0x3fba98689ebed1138735e0e7a5a790ab0b76934f4cc08dee01012d059e1b83ee": "0x00",
"0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb303adc196911e491e08264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d": "0x9fc415cce1d0b2eed702c9e05f476217d23b46a8723fd56f08cddad650be7c2da8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4fa8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4fa8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4fa8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f",
"0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e16903ce6a96a3775ab416f268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836": "0x00",
"0x3a65787472696e7369635f696e646578": "0x00000000",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950cf58e078d2188b43617564698074bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e": "0xf268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d6dc0db87ce29bd36261626580a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f": "0x08264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d",
"0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99406b1b580f3fd70373207c005e38adff268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836": "0x000000000300407a10f35a000000000000000000000000000000000000000000000000000000407a10f35a0000000000000000000000407a10f35a00000000000000000000",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950e696c69c865d348f61756469807ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a": "0xaebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934",
"0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da937af01a62f70176413143d943b7d30b9aebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934": "0x000000000300407a10f35a000000000000000000000000000000000000000000000000000000407a10f35a0000000000000000000000407a10f35a00000000000000000000",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195093c237b163af4d50617564698072bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001": "0x9ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195053c90cc3c184c72c6772616e80feca0be2c87141f6074b221c919c0161a1c468d9173c5c1be59b68fab9a0ff93": "0xaebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934",
"0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00004de97f22e20d0000000000000000",
"0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc60566b5cb12e1bb0dd3301e8ab40c6d0508264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d": "0x047374616b696e672000407a10f35a0000000000000000000002",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19502c959753b2d73959696d6f6e8074bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e": "0xf268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195071eb6ac6f0e199fd7061726180a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f": "0x08264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d",
"0x5f3e4907f716ac89b6347d15ececedca682db92dde20a10d96d00ff0e9e221c0b4def25cfda6ef3a000000005c69b53821debaa39ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d": "0x00",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19508f3986108b781adb6772616e809fc415cce1d0b2eed702c9e05f476217d23b46a8723fd56f08cddad650be7c2d": "0x08264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d",
"0x5f3e4907f716ac89b6347d15ececedcaa141c4fe67c2d11f4a10c6aca7a79a04b4def25cfda6ef3a00000000": "0x0000e941cc6b01000000000000000000",
"0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545",
"0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc621388af3dd204958d0a2ea1287b1402f36ac1ef7e0779bdcf1d120e7851931e1": "0x047374616b696e67200000c16ff28623000000000000000000ffffffff1f",
"0x492a52699edf49c972c21db794cfcf57ba7fb8745735dc3be2a2c61a72c39e78": "0x00",
"0x5f3e4907f716ac89b6347d15ececedca308ce9615de0775a82f8a94dc3d285a1": "0x02",
"0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc4d92e108794d5f65011d80545fd17e2b58671d451c3d4f6de8c16ea0bc61cf714914d6b2ffa2899872620525419327478": "0x08264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d0b00407a10f35a0b00407a10f35a0000",
"0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x1008264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606daebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c439349ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81df268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836",
"0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe705c69b53821debaa39ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d": "0x8011fb3641f0641f5570ba8787a64a0ff7d9c9999481f333d7207c4abd7e981c",
"0x5f3e4907f716ac89b6347d15ececedcaac0a2cbf8e355f5ea6cb2de8727bfb0c": "0x54000000",
"0x5f3e4907f716ac89b6347d15ececedcae1791577e4efcb083fdc3cb21e85b2e4": "0x00",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195004564cbf88f48197626162658074bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e": "0xf268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836",
"0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc4b807e5088f44d540645b9875a5c73c31caf27345aebc2fefeca85c9a67f4859eab3178d28ef92244714402290f3f415a": "0xaebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c439340b00407a10f35a0b00407a10f35a0000",
"0x5f3e4907f716ac89b6347d15ececedca8bde0a0ea8864605e3b68ed9cb2da01bb4def25cfda6ef3a00000000ce6a96a3775ab416f268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836": "0x0b00407a10f35a0b00407a10f35a00",
"0x5f3e4907f716ac89b6347d15ececedca682db92dde20a10d96d00ff0e9e221c0b4def25cfda6ef3a0000000003adc196911e491e08264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d": "0x00",
"0x5f3e4907f716ac89b6347d15ececedca42982b9d6c7acc99faa9094c912372c2b4def25cfda6ef3a000000005c69b53821debaa39ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d": "0x0b00407a10f35a0b00407a10f35a00",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19504e2a9aebc209c0bf706172618072bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001": "0x9ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d",
"0x5f3e4907f716ac89b6347d15ececedca42982b9d6c7acc99faa9094c912372c2b4def25cfda6ef3a0000000003adc196911e491e08264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d": "0x0b00407a10f35a0b00407a10f35a00",
"0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe70ce6a96a3775ab416f268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836": "0x4c17a9bfdd19411f452fa32420fa7acab622e87e57351f4ba3248ae40ce75123",
"0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc46095c93c32e331c00441c72d2b5397df8011fb3641f0641f5570ba8787a64a0ff7d9c9999481f333d7207c4abd7e981c": "0x9ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d0b00407a10f35a0b00407a10f35a0000",
"0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade984245138345ca3fd8aebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934": "0x00",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950e944edfdfb59968570617261807ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a": "0xaebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934",
"0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade985c69b53821debaa39ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d": "0x00",
"0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb34245138345ca3fd8aebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934": "0xfeca0be2c87141f6074b221c919c0161a1c468d9173c5c1be59b68fab9a0ff937ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a",
"0x5f3e4907f716ac89b6347d15ececedca0b6a45321efae92aea15e0740ec7afe7": "0x00000000",
"0x3a6772616e6470615f617574686f726974696573": "0x01109fc415cce1d0b2eed702c9e05f476217d23b46a8723fd56f08cddad650be7c2d0100000000000000feca0be2c87141f6074b221c919c0161a1c468d9173c5c1be59b68fab9a0ff930100000000000000959cebf18fecb305b96fd998c95f850145f52cbbb64b3ef937c0575cc7ebd6520100000000000000fc9d33059580a69454179ffa41cbae6de2bc8d2bd2c3f1d018fe5484a5a919560100000000000000",
"0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01",
"0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9afdf816f281ad669fe59fe0f725f72759ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d": "0x000000000300407a10f35a000000000000000000000000000000000000000000000000000000407a10f35a0000000000000000000000407a10f35a00000000000000000000",
"0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x1008264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d9fc415cce1d0b2eed702c9e05f476217d23b46a8723fd56f08cddad650be7c2da8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4fa8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4fa8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4fa8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4faebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934feca0be2c87141f6074b221c919c0161a1c468d9173c5c1be59b68fab9a0ff937ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a9ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d959cebf18fecb305b96fd998c95f850145f52cbbb64b3ef937c0575cc7ebd65272bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e300172bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e300172bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e300172bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001f268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836fc9d33059580a69454179ffa41cbae6de2bc8d2bd2c3f1d018fe5484a5a9195674bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e",
"0x5f3e4907f716ac89b6347d15ececedca8bde0a0ea8864605e3b68ed9cb2da01bb4def25cfda6ef3a000000005c69b53821debaa39ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d": "0x0b00407a10f35a0b00407a10f35a00",
"0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe7003adc196911e491e08264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d": "0x8671d451c3d4f6de8c16ea0bc61cf714914d6b2ffa2899872620525419327478",
"0x5f3e4907f716ac89b6347d15ececedca682db92dde20a10d96d00ff0e9e221c0b4def25cfda6ef3a000000004245138345ca3fd8aebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934": "0x00",
"0x5f3e4907f716ac89b6347d15ececedcab49a2738eeb30896aacb8b3fb46471bd": "0x04000000",
"0x2099d7f109d6e535fb000bba623fd4409f99a2ce711f3a31b2fc05604c93f179": "0x10a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a72bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e300174bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e",
"0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545",
"0x5f3e4907f716ac89b6347d15ececedcaf7dad0317324aecae8744b87fc95f2f3": "0x02",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19502d9ed59755f843d8706172618074bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e": "0xf268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836",
"0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e1690303adc196911e491e08264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d": "0x00",
"0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e169035c69b53821debaa39ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d": "0x00",
"0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc472e2b7edbdd300480b61e7ad485ddb234c17a9bfdd19411f452fa32420fa7acab622e87e57351f4ba3248ae40ce75123": "0xf268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f58360b00407a10f35a0b00407a10f35a0000",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f2f72e2480caa5c862616265807ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a": "0xaebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934",
"0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3ce6a96a3775ab416f268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836": "0xfc9d33059580a69454179ffa41cbae6de2bc8d2bd2c3f1d018fe5484a5a9195674bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e",
"0x1cb6f36e027abb2091cfb5110ab5087f5e0621c4869aa60c02be9adcc98a0d1d": "0x10a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f01000000000000007ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a010000000000000072bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001010000000000000074bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e0100000000000000",
"0x5f3e4907f716ac89b6347d15ececedca8bde0a0ea8864605e3b68ed9cb2da01bb4def25cfda6ef3a000000004245138345ca3fd8aebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934": "0x0b00407a10f35a0b00407a10f35a00",
"0x5f3e4907f716ac89b6347d15ececedca28dccb559b95c40168a1b2696581b5a7": "0x00000000000000000000000000000000",
"0x3a6772616e6470615f617574686f726974696573": "0x01109fc415cce1d0b2eed702c9e05f476217d23b46a8723fd56f08cddad650be7c2d0100000000000000fc9d33059580a69454179ffa41cbae6de2bc8d2bd2c3f1d018fe5484a5a919560100000000000000feca0be2c87141f6074b221c919c0161a1c468d9173c5c1be59b68fab9a0ff930100000000000000959cebf18fecb305b96fd998c95f850145f52cbbb64b3ef937c0575cc7ebd6520100000000000000",
"0x5f3e4907f716ac89b6347d15ececedca83e585bbc5fdcec57219c0dc81ef5ff489d89afc0491eeba61cf9fca6c24db1c087a729229091e45281ef1eb8739243f": "0x0f0000c16ff286230f0000c16ff2862300",
"0x5f3e4907f716ac89b6347d15ececedca138e71612491192d68deab7e6f563fe1": "0x04000000",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b657973299c031ae90b0895a312d2a23ffdc5bdea17f6dee60435fd257b45f544a65606": "0x9ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b657973c7951795ec6649edba0472adcf69163dc323f17e3adffa3d48e03b360baef2ab": "0x08264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d",
"0xc2261276cc9d1f8598ea4b6a74b15c2f6482b9ade7bc6657aaca787ba1add3b43b564a683e22524c0ee053666d9daaab59c91edd46ba5e19cbdb958268ed86cf": "0x0000c16ff28623000000000000000000",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b657973b2eb4ea282ae8a7cb6b7b1c33634a51e6baab18cb311c6dc5c2fc622248a7364": "0xaebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509fe6329cc0b39e09343a73657373696f6e3a6b657973f9e9a37f2e0a2dbb1ed7e61ece27ef234c10d6f7932c2e0be8645a5f9cc407b0": "0xaebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934"
"0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade98ce6a96a3775ab416f268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836": "0x00",
"0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe704245138345ca3fd8aebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934": "0xcaf27345aebc2fefeca85c9a67f4859eab3178d28ef92244714402290f3f415a",
"0x5f3e4907f716ac89b6347d15ececedca42982b9d6c7acc99faa9094c912372c2b4def25cfda6ef3a000000004245138345ca3fd8aebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934": "0x0b00407a10f35a0b00407a10f35a00",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195072134b407e7eb75c626162658072bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001": "0x9ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d47edb55da4253996175646980a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f": "0x08264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d",
"0x5f3e4907f716ac89b6347d15ececedca5579297f4dfb9609e7e4c2ebab9ce40a": "0x109ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81daebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934f268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f583608264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d",
"0x5f3e4907f716ac89b6347d15ececedcac29a0310e1bb45d20cace77ccb62c97d": "0x00e1f505",
"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950eb4a0fcc18f0aed36772616e80fc9d33059580a69454179ffa41cbae6de2bc8d2bd2c3f1d018fe5484a5a91956": "0xf268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836",
"0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0x6648d7f3382690650c681aba1b993cd11e54deb4df21a3a18c3e2177de9f7342",
"0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc637af01a62f70176413143d943b7d30b9aebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934": "0x047374616b696e672000407a10f35a0000000000000000000002",
"0x5f3e4907f716ac89b6347d15ececedcaad811cd65a470ddc5f1d628ff0550982b4def25cfda6ef3a00000000": "0x00000000"
},
"children": {}
}
}
}
}
+290 -1
View File
@@ -20,8 +20,10 @@ use sp_core::{Pair, Public, crypto::UncheckedInto, sr25519};
use polkadot_primitives::{AccountId, AccountPublic, parachain::ValidatorId};
use polkadot_runtime as polkadot;
use kusama_runtime as kusama;
use westend_runtime as westend;
use polkadot::constants::currency::DOTS;
use kusama::constants::currency::DOTS as KSM;
use westend::constants::currency::DOTS as WND;
use sc_chain_spec::{ChainSpecExtension, ChainType};
use sp_runtime::{traits::IdentifyAccount, Perbill};
use serde::{Serialize, Deserialize};
@@ -35,6 +37,7 @@ use pallet_staking::Forcing;
const POLKADOT_STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/";
const KUSAMA_STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/";
const WESTEND_STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/";
const DEFAULT_PROTOCOL_ID: &str = "dot";
/// Node `ChainSpec` extensions.
@@ -62,6 +65,12 @@ pub type KusamaChainSpec = service::GenericChainSpec<
Extensions,
>;
/// The `ChainSpec parametrised for westend runtime`.
pub type WestendChainSpec = service::GenericChainSpec<
westend::GenesisConfig,
Extensions,
>;
pub fn kusama_config() -> Result<KusamaChainSpec, String> {
KusamaChainSpec::from_json_bytes(&include_bytes!("../res/kusama.json")[..])
}
@@ -90,6 +99,16 @@ fn kusama_session_keys(
kusama::SessionKeys { babe, grandpa, im_online, parachain_validator, authority_discovery }
}
fn westend_session_keys(
babe: BabeId,
grandpa: GrandpaId,
im_online: ImOnlineId,
parachain_validator: ValidatorId,
authority_discovery: AuthorityDiscoveryId
) -> westend::SessionKeys {
westend::SessionKeys { babe, grandpa, im_online, parachain_validator, authority_discovery }
}
fn polkadot_staging_testnet_config_genesis() -> polkadot::GenesisConfig {
// subkey inspect "$SECRET"
let endowed_accounts = vec![];
@@ -177,6 +196,146 @@ fn polkadot_staging_testnet_config_genesis() -> polkadot::GenesisConfig {
}
}
fn westend_staging_testnet_config_genesis() -> westend::GenesisConfig {
// subkey inspect "$SECRET"
let endowed_accounts = vec![
// 5ENpP27BrVdJTdUfY6djmcw3d3xEJ6NzSUU52CCPmGpMrdEY
hex!["6648d7f3382690650c681aba1b993cd11e54deb4df21a3a18c3e2177de9f7342"].into(),
];
// for i in 1 2 3 4; do for j in stash controller; do subkey inspect "$SECRET//$i//$j"; done; done
// for i in 1 2 3 4; do for j in babe; do subkey --sr25519 inspect "$SECRET//$i//$j"; done; done
// for i in 1 2 3 4; do for j in grandpa; do subkey --ed25519 inspect "$SECRET//$i//$j"; done; done
// for i in 1 2 3 4; do for j in im_online; do subkey --sr25519 inspect "$SECRET//$i//$j"; done; done
// for i in 1 2 3 4; do for j in parachains; do subkey --sr25519 inspect "$SECRET//$i//$j"; done; done
let initial_authorities: Vec<(
AccountId,
AccountId,
BabeId,
GrandpaId,
ImOnlineId,
ValidatorId,
AuthorityDiscoveryId
)> = vec![(
// 5FZoQhgUCmqBxnkHX7jCqThScS2xQWiwiF61msg63CFL3Y8f
hex!["9ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d"].into(),
// 5ExdKyXFhtrjiFhexnyQPDyGSP8xU9qHc4KDwVrtWxaP2RP6
hex!["8011fb3641f0641f5570ba8787a64a0ff7d9c9999481f333d7207c4abd7e981c"].into(),
// 5Ef8qY8LRV6RFd4bThrwxBhhWfLjzqmd4rK8nX3Xs7zJqqp7
hex!["72bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001"].unchecked_into(),
// 5FSscBiPfaPaEhFbAt2qRhcYjryKBKf714X76F5nFfwtdXLa
hex!["959cebf18fecb305b96fd998c95f850145f52cbbb64b3ef937c0575cc7ebd652"].unchecked_into(),
// 5Ef8qY8LRV6RFd4bThrwxBhhWfLjzqmd4rK8nX3Xs7zJqqp7
hex!["72bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001"].unchecked_into(),
// 5Ef8qY8LRV6RFd4bThrwxBhhWfLjzqmd4rK8nX3Xs7zJqqp7
hex!["72bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001"].unchecked_into(),
// 5Ef8qY8LRV6RFd4bThrwxBhhWfLjzqmd4rK8nX3Xs7zJqqp7
hex!["72bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001"].unchecked_into(),
),(
// 5G1ojzh47Yt8KoYhuAjXpHcazvsoCXe3G8LZchKDvumozJJJ
hex!["aebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934"].into(),
// 5GeoZ1Mzix6Xnj32X8Xpj7q89X1SQHU5XTK1cnUVNXKTvXdK
hex!["caf27345aebc2fefeca85c9a67f4859eab3178d28ef92244714402290f3f415a"].into(),
// 5Et8y49AyE7ncVKiSRgzN6zbqbYtMK6y7kKuUaS8YqvfLBD9
hex!["7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a"].unchecked_into(),
// 5Hpn3HVViECsuxMDFtinWjRj2dNfpRp1kB24nZHvQCJsSUek
hex!["feca0be2c87141f6074b221c919c0161a1c468d9173c5c1be59b68fab9a0ff93"].unchecked_into(),
// 5Et8y49AyE7ncVKiSRgzN6zbqbYtMK6y7kKuUaS8YqvfLBD9
hex!["7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a"].unchecked_into(),
// 5Et8y49AyE7ncVKiSRgzN6zbqbYtMK6y7kKuUaS8YqvfLBD9
hex!["7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a"].unchecked_into(),
// 5Et8y49AyE7ncVKiSRgzN6zbqbYtMK6y7kKuUaS8YqvfLBD9
hex!["7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a"].unchecked_into(),
),(
// 5HYYWyhyUQ7Ae11f8fCid58bhJ7ikLHM9bU8A6Ynwoc3dStR
hex!["f268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836"].into(),
// 5DnUXT3xiQn6ZRttFT6eSCJbT9P2tiLdexr5WsvnbLG8igqW
hex!["4c17a9bfdd19411f452fa32420fa7acab622e87e57351f4ba3248ae40ce75123"].into(),
// 5EhnN1SumSv5KxwLAdwE8ugJaw1S8xARZb8V2BMYCKaD7ure
hex!["74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e"].unchecked_into(),
// 5Hmvd2qjb1zatrJTkPwgFicxPfZuwaTwa2L7adSRmz6mVxfb
hex!["fc9d33059580a69454179ffa41cbae6de2bc8d2bd2c3f1d018fe5484a5a91956"].unchecked_into(),
// 5EhnN1SumSv5KxwLAdwE8ugJaw1S8xARZb8V2BMYCKaD7ure
hex!["74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e"].unchecked_into(),
// 5EhnN1SumSv5KxwLAdwE8ugJaw1S8xARZb8V2BMYCKaD7ure
hex!["74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e"].unchecked_into(),
// 5EhnN1SumSv5KxwLAdwE8ugJaw1S8xARZb8V2BMYCKaD7ure
hex!["74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e"].unchecked_into(),
),(
// 5CFPcUJgYgWryPaV1aYjSbTpbTLu42V32Ytw1L9rfoMAsfGh
hex!["08264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d"].into(),
// 5F6z64cYZFRAmyMUhp7rnge6jaZmbY6o7XfA9czJyuAUiaFD
hex!["8671d451c3d4f6de8c16ea0bc61cf714914d6b2ffa2899872620525419327478"].into(),
// 5Ft7o2uqDq5pXCK4g5wR94BctmtLEzCBy5MvPqRa8753ZemD
hex!["a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f"].unchecked_into(),
// 5FgBijJLL6p7nDZgQed56L3BM7ovgwc4t4FYsv9apYtRGAGv
hex!["9fc415cce1d0b2eed702c9e05f476217d23b46a8723fd56f08cddad650be7c2d"].unchecked_into(),
// 5Ft7o2uqDq5pXCK4g5wR94BctmtLEzCBy5MvPqRa8753ZemD
hex!["a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f"].unchecked_into(),
// 5Ft7o2uqDq5pXCK4g5wR94BctmtLEzCBy5MvPqRa8753ZemD
hex!["a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f"].unchecked_into(),
// 5Ft7o2uqDq5pXCK4g5wR94BctmtLEzCBy5MvPqRa8753ZemD
hex!["a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f"].unchecked_into(),
)];
const ENDOWMENT: u128 = 1_000_000 * WND;
const STASH: u128 = 100 * WND;
westend::GenesisConfig {
system: Some(westend::SystemConfig {
code: westend::WASM_BINARY.to_vec(),
changes_trie_config: Default::default(),
}),
balances: Some(westend::BalancesConfig {
balances: endowed_accounts.iter()
.map(|k: &AccountId| (k.clone(), ENDOWMENT))
.chain(initial_authorities.iter().map(|x| (x.0.clone(), STASH)))
.collect(),
}),
indices: Some(westend::IndicesConfig {
indices: vec![],
}),
session: Some(westend::SessionConfig {
keys: initial_authorities.iter().map(|x| (
x.0.clone(),
x.0.clone(),
westend_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()),
)).collect::<Vec<_>>(),
}),
staking: Some(westend::StakingConfig {
validator_count: 50,
minimum_validator_count: 4,
stakers: initial_authorities
.iter()
.map(|x| (x.0.clone(), x.1.clone(), STASH, westend::StakerStatus::Validator))
.collect(),
invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(),
force_era: Forcing::ForceNone,
slash_reward_fraction: Perbill::from_percent(10),
.. Default::default()
}),
babe: Some(Default::default()),
grandpa: Some(Default::default()),
im_online: Some(Default::default()),
authority_discovery: Some(westend::AuthorityDiscoveryConfig {
keys: vec![],
}),
parachains: Some(westend::ParachainsConfig {
authorities: vec![],
}),
registrar: Some(westend::RegistrarConfig {
parachains: vec![],
_phdata: Default::default(),
}),
vesting: Some(westend::VestingConfig {
vesting: vec![],
}),
sudo: Some(westend::SudoConfig {
key: endowed_accounts[0].clone(),
}),
}
}
fn kusama_staging_testnet_config_genesis() -> kusama::GenesisConfig {
// subkey inspect "$SECRET"
let endowed_accounts = vec![
@@ -363,6 +522,23 @@ pub fn kusama_staging_testnet_config() -> KusamaChainSpec {
)
}
/// Westend staging testnet config.
pub fn westend_staging_testnet_config() -> WestendChainSpec {
let boot_nodes = vec![];
WestendChainSpec::from_genesis(
"Westend Staging Testnet",
"westend_staging_testnet",
ChainType::Live,
westend_staging_testnet_config_genesis,
boot_nodes,
Some(TelemetryEndpoints::new(vec![(WESTEND_STAGING_TELEMETRY_URL.to_string(), 0)])
.expect("Westend Staging telemetry url is valid; qed")),
Some(DEFAULT_PROTOCOL_ID),
None,
Default::default(),
)
}
/// Helper function to generate a crypto pair from seed
pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {
TPublic::Pair::from_string(&format!("//{}", seed), None)
@@ -567,6 +743,68 @@ pub fn kusama_testnet_genesis(
}
}
/// Helper function to create polkadot GenesisConfig for testing
pub fn westend_testnet_genesis(
initial_authorities: Vec<(AccountId, AccountId, BabeId, GrandpaId, ImOnlineId, ValidatorId, AuthorityDiscoveryId)>,
root_key: AccountId,
endowed_accounts: Option<Vec<AccountId>>,
) -> westend::GenesisConfig {
let endowed_accounts: Vec<AccountId> = endowed_accounts.unwrap_or_else(testnet_accounts);
const ENDOWMENT: u128 = 1_000_000 * DOTS;
const STASH: u128 = 100 * DOTS;
westend::GenesisConfig {
system: Some(westend::SystemConfig {
code: westend::WASM_BINARY.to_vec(),
changes_trie_config: Default::default(),
}),
indices: Some(westend::IndicesConfig {
indices: vec![],
}),
balances: Some(westend::BalancesConfig {
balances: endowed_accounts.iter().map(|k| (k.clone(), ENDOWMENT)).collect(),
}),
session: Some(westend::SessionConfig {
keys: initial_authorities.iter().map(|x| (
x.0.clone(),
x.0.clone(),
westend_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()),
)).collect::<Vec<_>>(),
}),
staking: Some(westend::StakingConfig {
minimum_validator_count: 1,
validator_count: 2,
stakers: initial_authorities.iter()
.map(|x| (x.0.clone(), x.1.clone(), STASH, westend::StakerStatus::Validator))
.collect(),
invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(),
force_era: Forcing::NotForcing,
slash_reward_fraction: Perbill::from_percent(10),
.. Default::default()
}),
babe: Some(Default::default()),
grandpa: Some(Default::default()),
im_online: Some(Default::default()),
authority_discovery: Some(westend::AuthorityDiscoveryConfig {
keys: vec![],
}),
parachains: Some(westend::ParachainsConfig {
authorities: vec![],
}),
registrar: Some(westend::RegistrarConfig{
parachains: vec![],
_phdata: Default::default(),
}),
vesting: Some(westend::VestingConfig {
vesting: vec![],
}),
sudo: Some(westend::SudoConfig {
key: root_key,
}),
}
}
fn polkadot_development_config_genesis() -> polkadot::GenesisConfig {
polkadot_testnet_genesis(
vec![
@@ -580,7 +818,17 @@ fn polkadot_development_config_genesis() -> polkadot::GenesisConfig {
fn kusama_development_config_genesis() -> kusama::GenesisConfig {
kusama_testnet_genesis(
vec![
get_authority_keys_from_seed("Alice"),
get_authority_keys_from_seed("Alice"),
],
get_account_id_from_seed::<sr25519::Public>("Alice"),
None,
)
}
fn westend_development_config_genesis() -> westend::GenesisConfig {
westend_testnet_genesis(
vec![
get_authority_keys_from_seed("Alice"),
],
get_account_id_from_seed::<sr25519::Public>("Alice"),
None,
@@ -617,6 +865,21 @@ pub fn kusama_development_config() -> KusamaChainSpec {
)
}
/// Westend development config (single validator Alice)
pub fn westend_development_config() -> WestendChainSpec {
WestendChainSpec::from_genesis(
"Development",
"westend_dev",
ChainType::Development,
westend_development_config_genesis,
vec![],
None,
Some(DEFAULT_PROTOCOL_ID),
None,
Default::default(),
)
}
fn polkadot_local_testnet_genesis() -> polkadot::GenesisConfig {
polkadot_testnet_genesis(
vec![
@@ -668,3 +931,29 @@ pub fn kusama_local_testnet_config() -> KusamaChainSpec {
Default::default(),
)
}
fn westend_local_testnet_genesis() -> westend::GenesisConfig {
westend_testnet_genesis(
vec![
get_authority_keys_from_seed("Alice"),
get_authority_keys_from_seed("Bob"),
],
get_account_id_from_seed::<sr25519::Public>("Alice"),
None,
)
}
/// Westend local testnet config (multivalidator Alice + Bob)
pub fn westend_local_testnet_config() -> WestendChainSpec {
WestendChainSpec::from_genesis(
"Westend Local Testnet",
"westend_local_testnet",
ChainType::Local,
westend_local_testnet_genesis,
vec![],
None,
Some(DEFAULT_PROTOCOL_ID),
None,
Default::default(),
)
}
+65 -5
View File
@@ -31,9 +31,9 @@ use inherents::InherentDataProviders;
use sc_executor::native_executor_instance;
use log::info;
pub use service::{
AbstractService, Role, PruningMode, TransactionPoolOptions, Error, RuntimeGenesis, ServiceBuilderCommand,
AbstractService, Role, PruningMode, TransactionPoolOptions, Error, RuntimeGenesis,
TFullClient, TLightClient, TFullBackend, TLightBackend, TFullCallExecutor, TLightCallExecutor,
Configuration, ChainSpec,
Configuration, ChainSpec, ServiceBuilderCommand,
};
pub use service::config::{DatabaseConfig, PrometheusConfig};
pub use sc_executor::NativeExecutionDispatch;
@@ -45,12 +45,13 @@ pub use consensus_common::SelectChain;
pub use polkadot_primitives::parachain::{CollatorId, ParachainHost};
pub use polkadot_primitives::Block;
pub use sp_runtime::traits::{Block as BlockT, self as runtime_traits, BlakeTwo256};
pub use chain_spec::{PolkadotChainSpec, KusamaChainSpec};
pub use chain_spec::{PolkadotChainSpec, KusamaChainSpec, WestendChainSpec};
#[cfg(not(target_os = "unknown"))]
pub use consensus::run_validation_worker;
pub use codec::Codec;
pub use polkadot_runtime;
pub use kusama_runtime;
pub use westend_runtime;
use prometheus_endpoint::Registry;
native_executor_instance!(
@@ -67,6 +68,13 @@ native_executor_instance!(
frame_benchmarking::benchmarking::HostFunctions,
);
native_executor_instance!(
pub WestendExecutor,
westend_runtime::api::dispatch,
westend_runtime::native_version,
frame_benchmarking::benchmarking::HostFunctions,
);
/// A set of APIs that polkadot-like runtimes must implement.
pub trait RuntimeApiCollection<Extrinsic: codec::Codec + Send + Sync + 'static> :
sp_transaction_pool::runtime_api::TaggedTransactionQueue<Block>
@@ -108,15 +116,21 @@ pub trait RuntimeExtrinsic: codec::Codec + Send + Sync + 'static {}
impl<E> RuntimeExtrinsic for E where E: codec::Codec + Send + Sync + 'static {}
/// Can be called for a `Configuration` to check if it is a configuration for the `Kusama` network.
pub trait IsKusama {
pub trait IdentifyVariant {
/// Returns if this is a configuration for the `Kusama` network.
fn is_kusama(&self) -> bool;
/// Returns if this is a configuration for the `Westend` network.
fn is_westend(&self) -> bool;
}
impl IsKusama for Box<dyn ChainSpec> {
impl IdentifyVariant for Box<dyn ChainSpec> {
fn is_kusama(&self) -> bool {
self.id().starts_with("kusama") || self.id().starts_with("ksm")
}
fn is_westend(&self) -> bool {
self.id().starts_with("westend") || self.id().starts_with("wnd")
}
}
// If we're using prometheus, use a registry with a prefix of `polkadot`.
@@ -272,6 +286,37 @@ pub fn kusama_new_full(
)
}
/// Create a new Kusama service for a full node.
#[cfg(feature = "full-node")]
pub fn westend_new_full(
config: Configuration,
collating_for: Option<(CollatorId, parachain::Id)>,
max_block_data_size: Option<u64>,
authority_discovery_enabled: bool,
slot_duration: u64,
grandpa_pause: Option<(u32, u32)>,
)
-> Result<(
impl AbstractService<
Block = Block,
RuntimeApi = westend_runtime::RuntimeApi,
Backend = TFullBackend<Block>,
SelectChain = LongestChain<TFullBackend<Block>, Block>,
CallExecutor = TFullCallExecutor<Block, KusamaExecutor>,
>,
FullNodeHandles,
), ServiceError>
{
new_full(
config,
collating_for,
max_block_data_size,
authority_discovery_enabled,
slot_duration,
grandpa_pause,
)
}
/// Handles to other sub-services that full nodes instantiate, which consumers
/// of the node may use.
#[cfg(feature = "full-node")]
@@ -576,6 +621,21 @@ pub fn kusama_new_light(
new_light(config)
}
/// Create a new Westend service for a light client.
pub fn westend_new_light(
config: Configuration,
)
-> Result<impl AbstractService<
Block = Block,
RuntimeApi = westend_runtime::RuntimeApi,
Backend = TLightBackend<Block>,
SelectChain = LongestChain<TLightBackend<Block>, Block>,
CallExecutor = TLightCallExecutor<Block, KusamaExecutor>,
>, ServiceError>
{
new_light(config)
}
// We can't use service::TLightClient due to
// Rust bug: https://github.com/rust-lang/rust/issues/43580
type TLocalLightClient<Runtime, Dispatch> = Client<