diff --git a/Cargo.lock b/Cargo.lock index b14beaa543..464582b920 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5033,6 +5033,7 @@ dependencies = [ name = "pangolin-runtime" version = "1.0.1" dependencies = [ + "array-bytes", "darwinia-balances", "darwinia-balances-rpc-runtime-api", "darwinia-claims", diff --git a/bin/node/cli/src/chain_spec.rs b/bin/node/cli/src/chain_spec.rs index e8ccb6713f..82e9197075 100644 --- a/bin/node/cli/src/chain_spec.rs +++ b/bin/node/cli/src/chain_spec.rs @@ -112,6 +112,8 @@ fn pangolin_build_spec_genesis() -> GenesisConfig { const GENESIS_VALIDATOR_STASH: &'static str = "Alice//stash"; const GENESIS_VALIDATOR_BOND: Balance = COIN; const GENESIS_EVM_ACCOUNT: &'static str = "0x68898db1012808808c903f390909c52d9f706749"; + const GENESIS_ETHEREUM_RELAY_AUTHORITY_SIGNER: &'static str = + "0x6aA70f55E5D770898Dd45aa1b7078b8A80AAbD6C"; const TOKEN_REDEEM_ADDRESS: &'static str = "0x49262B932E439271d05634c32978294C7Ea15d0C"; const DEPOSIT_REDEEM_ADDRESS: &'static str = "0x6EF538314829EfA8386Fc43386cB13B4e0A67D1e"; @@ -177,7 +179,7 @@ fn pangolin_build_spec_genesis() -> GenesisConfig { pallet_membership_Instance0: Some(Default::default()), darwinia_claims: Some(Default::default()), darwinia_vesting: Some(Default::default()), - pallet_sudo: Some(SudoConfig { key: root }), + pallet_sudo: Some(SudoConfig { key: root.clone() }), darwinia_crab_issuing: Some(CrabIssuingConfig { total_mapped_ring: 1 << 56 }), @@ -211,6 +213,9 @@ fn pangolin_build_spec_genesis() -> GenesisConfig { accounts: evm_accounts, }), dvm_ethereum: Some(Default::default()), + darwinia_relay_authorities_Instance0: Some(EthereumRelayAuthoritiesConfig { + authorities: vec![(root, fixed_hex_bytes_unchecked!(GENESIS_ETHEREUM_RELAY_AUTHORITY_SIGNER, 20), 1)] + }), } } @@ -271,6 +276,9 @@ fn pangolin_development_genesis( endowed_accounts: Vec, evm_accounts: BTreeMap, ) -> GenesisConfig { + const GENESIS_ETHEREUM_RELAY_AUTHORITY_SIGNER: &'static str = + "0x6aA70f55E5D770898Dd45aa1b7078b8A80AAbD6C"; + const TOKEN_REDEEM_ADDRESS: &'static str = "0x49262B932E439271d05634c32978294C7Ea15d0C"; const DEPOSIT_REDEEM_ADDRESS: &'static str = "0x6EF538314829EfA8386Fc43386cB13B4e0A67D1e"; const RING_TOKEN_ADDRESS: &'static str = "0xb52FBE2B925ab79a821b261C82c5Ba0814AAA5e0"; @@ -332,7 +340,7 @@ fn pangolin_development_genesis( ), }), darwinia_vesting: Some(Default::default()), - pallet_sudo: Some(SudoConfig { key: root_key }), + pallet_sudo: Some(SudoConfig { key: root_key.clone() }), darwinia_crab_issuing: Some(CrabIssuingConfig { total_mapped_ring: 1 << 56 }), @@ -366,5 +374,8 @@ fn pangolin_development_genesis( accounts: evm_accounts, }), dvm_ethereum: Some(Default::default()), + darwinia_relay_authorities_Instance0: Some(EthereumRelayAuthoritiesConfig { + authorities: vec![(root_key, fixed_hex_bytes_unchecked!(GENESIS_ETHEREUM_RELAY_AUTHORITY_SIGNER, 20), 1)] + }), } } diff --git a/bin/node/runtime/pangolin/Cargo.toml b/bin/node/runtime/pangolin/Cargo.toml index 011c89980d..57fe052495 100644 --- a/bin/node/runtime/pangolin/Cargo.toml +++ b/bin/node/runtime/pangolin/Cargo.toml @@ -16,6 +16,7 @@ serde = { version = "1.0.118", optional = true } smallvec = { version = "1.5.1" } static_assertions = { version = "1.1.0" } # darwinia +array-bytes = { default-features = false, path = "../../../../primitives/array-bytes" } darwinia-balances = { default-features = false, path = "../../../../frame/balances" } darwinia-balances-rpc-runtime-api = { default-features = false, path = "../../../../frame/balances/rpc/runtime-api" } darwinia-claims = { default-features = false, path = "../../../../frame/claims" } @@ -88,6 +89,7 @@ default = ["std"] std = [ "codec/std", "serde", + "array-bytes/std", "darwinia-balances/std", "darwinia-balances-rpc-runtime-api/std", "darwinia-claims/std", diff --git a/bin/node/runtime/pangolin/src/lib.rs b/bin/node/runtime/pangolin/src/lib.rs index 62b10af022..7be361eb19 100644 --- a/bin/node/runtime/pangolin/src/lib.rs +++ b/bin/node/runtime/pangolin/src/lib.rs @@ -301,7 +301,7 @@ type Executive = frame_executive::Executive< frame_system::ChainContext, Runtime, AllModules, - // CustomOnRuntimeUpgrade, + CustomOnRuntimeUpgrade, >; /// The payload being signed in transactions. type SignedPayload = generic::SignedPayload; @@ -1184,7 +1184,7 @@ construct_runtime!( EVM: darwinia_evm::{Module, Config, Call, Storage, Event}, Ethereum: dvm_ethereum::{Module, Call, Storage, Event, Config, ValidateUnsigned}, - EthereumRelayAuthorities: darwinia_relay_authorities::::{Module, Call, Storage, Event}, + EthereumRelayAuthorities: darwinia_relay_authorities::::{Module, Call, Storage, Config, Event}, } ); @@ -1568,3 +1568,44 @@ impl dvm_rpc_runtime_api::ConvertTransaction for TransactionCon OpaqueExtrinsic::decode(&mut &encoded[..]).expect("Encoded extrinsic is always valid") } } + +pub struct CustomOnRuntimeUpgrade; +impl frame_support::traits::OnRuntimeUpgrade for CustomOnRuntimeUpgrade { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + // --- substrate --- + use frame_support::migration::*; + // --- darwinia --- + use array_bytes::fixed_hex_bytes_unchecked; + use darwinia_relay_primitives::relay_authorities::RelayAuthority; + use darwinia_support::balance::lock::{LockFor, LockableCurrency, WithdrawReasons}; + + let account_id = fixed_hex_bytes_unchecked!( + "0x72819fbc1b93196fa230243947c1726cbea7e33044c7eb6f736ff345561f9e4c", + 32 + ) + .into(); + let signer = fixed_hex_bytes_unchecked!("0x6aA70f55E5D770898Dd45aa1b7078b8A80AAbD6C", 20); + let stake = 1; + + Ring::set_lock( + EthereumRelayAuthoritiesLockId::get(), + &account_id, + LockFor::Common { amount: stake }, + WithdrawReasons::all(), + ); + + put_storage_value( + b"Instance0DarwiniaRelayAuthorities", + b"Authorities", + &[], + vec![RelayAuthority { + account_id, + signer, + stake, + term: System::block_number() + EthereumRelayAuthoritiesTermDuration::get(), + }], + ); + + ::MaximumBlockWeight::get() + } +} diff --git a/frame/bridge/relay-authorities/src/lib.rs b/frame/bridge/relay-authorities/src/lib.rs index c14e032130..f95230574d 100644 --- a/frame/bridge/relay-authorities/src/lib.rs +++ b/frame/bridge/relay-authorities/src/lib.rs @@ -190,6 +190,30 @@ decl_storage! { /// The mmr root signature submit duration, will be delayed if on authorities change pub SubmitDuration get(fn submit_duration): BlockNumber = T::SubmitDuration::get(); } + add_extra_genesis { + config(authorities): Vec<(AccountId, Signer, RingBalance)>; + build(|config| { + let mut authorities = vec![]; + + for (account_id, signer, stake) in config.authorities.iter() { + T::RingCurrency::set_lock( + T::LockId::get(), + account_id, + LockFor::Common { amount: *stake }, + WithdrawReasons::all(), + ); + + authorities.push(RelayAuthority { + account_id: account_id.to_owned(), + signer: signer.to_owned(), + stake: *stake, + term: >::block_number() + T::TermDuration::get() + }); + } + + >::put(authorities); + }); + } } decl_module! {