diff --git a/Cargo.lock b/Cargo.lock index 30b97d40f4b5a..b7864308fd1e5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5340,8 +5340,11 @@ dependencies = [ "xrml-xaccounts 0.4.0", "xrml-xassets-assets 0.4.0", "xrml-xassets-records 0.4.0", + "xrml-xbridge-bitcoin 0.9.0", + "xrml-xbridge-common 0.1.0", "xrml-xbridge-features 0.1.0", "xrml-xfee-manager 0.4.0", + "xrml-xmultisig 0.4.0", "xrml-xsession 0.1.0", "xrml-xsupport 0.4.0", "xrml-xsystem 0.4.0", diff --git a/cli/src/chainx_runtime.compact.wasm b/cli/src/chainx_runtime.compact.wasm index a6c7b378a6f44..58e342c504426 100644 Binary files a/cli/src/chainx_runtime.compact.wasm and b/cli/src/chainx_runtime.compact.wasm differ diff --git a/cli/src/genesis_config.rs b/cli/src/genesis_config.rs index 0cdead70b3c5d..d4632ac8966cd 100644 --- a/cli/src/genesis_config.rs +++ b/cli/src/genesis_config.rs @@ -128,7 +128,8 @@ pub fn testnet_genesis(genesis_spec: GenesisSpec) -> GenesisConfig { bonding_duration, intention_bonding_duration, current_era: 0, - minimum_penalty: 10_000_000, // 0.1 PCX by default + minimum_penalty: 1_000_000, // 0.01 PCX by default + missed_blocks_severity: 3, }), xtokens: Some(XTokensConfig { token_discount: vec![ diff --git a/runtime/wasm/target/wasm32-unknown-unknown/release/chainx_runtime.compact.wasm b/runtime/wasm/target/wasm32-unknown-unknown/release/chainx_runtime.compact.wasm index a6c7b378a6f44..58e342c504426 100644 Binary files a/runtime/wasm/target/wasm32-unknown-unknown/release/chainx_runtime.compact.wasm and b/runtime/wasm/target/wasm32-unknown-unknown/release/chainx_runtime.compact.wasm differ diff --git a/xrml/xmining/staking/Cargo.toml b/xrml/xmining/staking/Cargo.toml index 6075a2101b03c..700e74b54266f 100644 --- a/xrml/xmining/staking/Cargo.toml +++ b/xrml/xmining/staking/Cargo.toml @@ -32,6 +32,10 @@ timestamp = { package ="srml-timestamp", git = "https://github.com/chainpool/sub # ChainX xfee-manager = { package = "xrml-xfee-manager", path = "../../xfee/manager" } xrecords = { package = "xrml-xassets-records", path = "../../xassets/records" } +xbitcoin = { package = "xrml-xbridge-bitcoin", path = "../../xbridge/bitcoin" } +xbridge-features = { package = "xrml-xbridge-features", path = "../../xbridge/features" } +xbridge-common = { package = "xrml-xbridge-common", path = "../../xbridge/common" } +xmultisig = { package = "xrml-xmultisig", path = "../../xmultisig", default-features = false } [features] default = ["std"] diff --git a/xrml/xmining/staking/src/lib.rs b/xrml/xmining/staking/src/lib.rs index 160fccd13d7fe..9f264ea68dee1 100644 --- a/xrml/xmining/staking/src/lib.rs +++ b/xrml/xmining/staking/src/lib.rs @@ -239,6 +239,12 @@ decl_module! { >::put(new); } + /// The severity of missed blocks per session. + fn set_missed_blocks_severity(new: Compact) { + let new: u32 = new.into(); + >::put(new); + } + /// Force there to be a new era. This also forces a new session immediately after. /// `apply_rewards` should be true for validators to get the session reward. fn force_new_era(apply_rewards: bool) -> Result { @@ -317,6 +323,8 @@ decl_storage! { pub OfflineValidatorsPerSession get(offline_validators_per_session): Vec; /// Total blocks that each active validator missed in the current session. pub MissedOfPerSession get(missed_of_per_session): map T::AccountId => u32; + /// The higher the severity, the more slash for missed blocks. + pub MissedBlockSeverity get(missed_blocks_severity) config(): u32; } } diff --git a/xrml/xmining/staking/src/mock.rs b/xrml/xmining/staking/src/mock.rs index bebdc731f643f..19546ee533700 100644 --- a/xrml/xmining/staking/src/mock.rs +++ b/xrml/xmining/staking/src/mock.rs @@ -5,6 +5,7 @@ use super::*; // Substrate +use parity_codec::{Decode, Encode}; use primitives::{ testing::{ConvertUintAuthorityId, Digest, DigestItem, Header, UintAuthorityId}, traits::BlakeTwo256, @@ -58,10 +59,73 @@ impl timestamp::Trait for Test { } impl xaccounts::Trait for Test { - type Event = (); type DetermineIntentionJackpotAccountId = DummyDetermineIntentionJackpotAccountId; } +impl xbridge_features::Trait for Test { + type TrusteeMultiSig = DummyMultiSigIdFor; + type Event = (); +} + +impl xmultisig::Trait for Test { + type MultiSig = DummyMultiSig; + type GenesisMultiSig = DummyGenesisMultiSig; + type Proposal = DummyTrusteeCall; + type Event = (); +} + +pub struct DummyMultiSig; +impl xmultisig::MultiSigFor for DummyMultiSig { + fn multi_sig_addr_for(who: &u64) -> u64 { + who + 2 + } + + fn multi_sig_id_for(_who: &u64, _addr: &u64, _data: &[u8]) -> H256 { + H256::default() + } +} + +#[derive(Clone, Eq, PartialEq, Encode, Decode, Debug)] +pub struct DummyTrusteeCall; +impl xmultisig::TrusteeCall for DummyTrusteeCall { + fn allow(&self) -> bool { + true + } + + fn exec(&self, _execiser: &u64) -> Result { + Ok(()) + } +} + +impl support::dispatch::Dispatchable for DummyTrusteeCall { + type Origin = Origin; + type Trait = DummyTrusteeCall; + fn dispatch(self, _origin: Origin) -> support::dispatch::Result { + Ok(()) + } +} + +pub struct DummyMultiSigIdFor; +impl xbridge_features::TrusteeMultiSigFor for DummyMultiSigIdFor { + fn multi_sig_addr_for_trustees(_chain: xassets::Chain, _who: &Vec) -> u64 { + 1 + } +} + +pub struct DummyBitcoinTrusteeMultiSig; +impl xbridge_common::traits::TrusteeMultiSig for DummyBitcoinTrusteeMultiSig { + fn multisig_for_trustees() -> u64 { + 777 + } +} + +pub struct DummyGenesisMultiSig; +impl xmultisig::GenesisMultiSig for DummyGenesisMultiSig { + fn gen_genesis_multisig(_accounts: Vec) -> (u64, u64) { + (666, 888) + } +} + pub struct DummyDetermineIntentionJackpotAccountId; impl xaccounts::IntentionJackpotAccountIdFor for DummyDetermineIntentionJackpotAccountId { fn accountid_for(origin: &u64) -> u64 { @@ -109,9 +173,20 @@ impl xsession::Trait for Test { } impl xbitcoin::Trait for Test { + type AccountExtractor = DummyExtractor; + type TrusteeSessionProvider = XBridgeFeatures; + type TrusteeMultiSigProvider = DummyBitcoinTrusteeMultiSig; + type CrossChainProvider = XBridgeFeatures; type Event = (); } +pub struct DummyExtractor; +impl xbridge_common::traits::Extractable for DummyExtractor { + fn account_info(_data: &[u8]) -> Option<(u64, Option>)> { + Some((999, None)) + } +} + impl xrecords::Trait for Test { type Event = (); } @@ -180,7 +255,7 @@ pub fn new_test_ext() -> runtime_io::TestExternalities { sessions_per_era: 1, sessions_per_epoch: 10, minimum_penalty: 10_000_000, // 0.1 PCX by default - validator_stake_threshold: 1, + missed_blocks_severity: 3, } .build_storage() .unwrap() @@ -216,5 +291,7 @@ pub type Indices = indices::Module; pub type System = system::Module; pub type XSession = xsession::Module; pub type XAssets = xassets::Module; +pub type XMultiSig = xmultisig::Module; pub type XAccounts = xaccounts::Module; +pub type XBridgeFeatures = xbridge_features::Module; pub type XStaking = Module; diff --git a/xrml/xmining/staking/src/shifter.rs b/xrml/xmining/staking/src/shifter.rs index 0e233dc6b6c09..3dceb7503adf3 100644 --- a/xrml/xmining/staking/src/shifter.rs +++ b/xrml/xmining/staking/src/shifter.rs @@ -87,7 +87,7 @@ impl Module { let missed = >::take(who) as u64; let reward_per_block = Self::reward_of_per_block(my_reward); let total_slash = cmp::max( - T::Balance::sa(reward_per_block.as_() * 10 * missed), + T::Balance::sa(reward_per_block.as_() * missed * Self::missed_blocks_severity() as u64), T::Balance::sa(Self::minimum_penalty().as_() * missed), );