diff --git a/substrate/client/src/genesis.rs b/substrate/client/src/genesis.rs index 9a49df5e08..ebd8326b44 100644 --- a/substrate/client/src/genesis.rs +++ b/substrate/client/src/genesis.rs @@ -48,8 +48,7 @@ mod tests { use polkadot_executor::executor; use primitives::{AccountId, Hash}; use primitives::block::{Number as BlockNumber, Header, Digest}; - use primitives::runtime_function::Function; - use primitives::transaction::{UncheckedTransaction, Transaction}; + use primitives::transaction::{UncheckedTransaction, Transaction, Function}; use primitives::contract::CallData; use ed25519::Pair; diff --git a/substrate/executor/src/native_executor.rs b/substrate/executor/src/native_executor.rs index 5e0bdaa7fb..176b4240d2 100644 --- a/substrate/executor/src/native_executor.rs +++ b/substrate/executor/src/native_executor.rs @@ -1,10 +1,27 @@ -use std::panic::catch_unwind; -use primitives::contract::CallData; -use state_machine::{Externalities, CodeExecutor}; +// Copyright 2017 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 . + use error::{Error, ErrorKind, Result}; -use wasm_executor::WasmExecutor; use native_runtime as runtime; +use primitives::contract::CallData; use runtime_std; +use state_machine::{Externalities, CodeExecutor}; +use wasm_executor::WasmExecutor; + +use std::panic::catch_unwind; pub struct NativeExecutor; @@ -47,9 +64,8 @@ mod tests { use native_runtime::runtime::staking::balance; use state_machine::TestExternalities; use primitives::{twox_128, Hash}; - use primitives::runtime_function::Function; use primitives::block::{Header, Number as BlockNumber, Block, Digest}; - use primitives::transaction::{Transaction, UncheckedTransaction}; + use primitives::transaction::{Transaction, UncheckedTransaction, Function}; use ed25519::Pair; const BLOATY_CODE: &[u8] = include_bytes!("../../wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.wasm"); diff --git a/substrate/executor/src/wasm_executor.rs b/substrate/executor/src/wasm_executor.rs index e409d6ab94..520557edd4 100644 --- a/substrate/executor/src/wasm_executor.rs +++ b/substrate/executor/src/wasm_executor.rs @@ -294,9 +294,8 @@ mod tests { use native_runtime::runtime::staking::balance; use state_machine::TestExternalities; use primitives::{twox_128, AccountId}; - use primitives::runtime_function::Function; use primitives::block::Header; - use primitives::transaction::{Transaction, UncheckedTransaction}; + use primitives::transaction::{Transaction, UncheckedTransaction, Function}; use runtime_std; use ed25519::Pair; diff --git a/substrate/primitives/src/lib.rs b/substrate/primitives/src/lib.rs index 3ecc0a77c0..32cb18f8e1 100644 --- a/substrate/primitives/src/lib.rs +++ b/substrate/primitives/src/lib.rs @@ -70,8 +70,6 @@ pub mod contract; pub mod hash; pub mod hexdisplay; pub mod parachain; -pub mod proposal; -pub mod runtime_function; pub mod transaction; pub mod uint; pub mod validator; diff --git a/substrate/primitives/src/proposal.rs b/substrate/primitives/src/proposal.rs deleted file mode 100644 index 65e85fa641..0000000000 --- a/substrate/primitives/src/proposal.rs +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright 2017 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 . - -//! Proposals for relay-chain governance. -//! -//! This describes a combination of a function ID and data that can be used to call into -//! an internal function. - -use bytes::Vec; -use block::Number as BlockNumber; -use codec::Slicable; - -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[repr(u8)] -enum InternalFunctionId { - /// Set the system's code. - SystemSetCode = 0x00, - - /// Set the session length. - SessionSetLength = 0x10, - /// Force a new session. - SessionForceNewSession = 0x11, - - /// Set the number of sessions per era. - StakingSetSessionsPerEra = 0x20, - /// Set the minimum bonding duration for staking. - StakingSetBondingDuration = 0x21, - /// Set the validator count for staking. - StakingSetValidatorCount = 0x22, - /// Force a new staking era. - StakingForceNewEra = 0x23, - - /// Set the per-mille of validator approval required for governance changes. - GovernanceSetApprovalPpmRequired = 0x30, - -} - -impl InternalFunctionId { - /// Derive `Some` value from a `u8`, or `None` if it's invalid. - fn from_u8(value: u8) -> Option { - let functions = [ - InternalFunctionId::SystemSetCode, - InternalFunctionId::SessionSetLength, - InternalFunctionId::SessionForceNewSession, - InternalFunctionId::StakingSetSessionsPerEra, - InternalFunctionId::StakingSetBondingDuration, - InternalFunctionId::StakingSetValidatorCount, - InternalFunctionId::StakingForceNewEra, - InternalFunctionId::GovernanceSetApprovalPpmRequired, - ]; - functions.iter().map(|&f| f).find(|&f| value == f as u8) - } -} - -/// Internal functions that can be dispatched to. -#[derive(Debug, Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -pub enum InternalFunction { - /// Set the system's code. - SystemSetCode(Vec), - /// Set the session length. - SessionSetLength(BlockNumber), - /// Force a new session. - SessionForceNewSession, - /// Set the number of sessions per era. - StakingSetSessionsPerEra(BlockNumber), - /// Set the minimum bonding duration for staking. - StakingSetBondingDuration(BlockNumber), - /// Set the validator count for staking. - StakingSetValidatorCount(u32), - /// Force a new staking era. - StakingForceNewEra, - /// Set the per-mille of validator approval required for governance changes. - GovernanceSetApprovalPpmRequired(u32), - -} - -/// An internal function. -#[derive(Debug, Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -pub struct Proposal { - /// The privileged function to call. - pub function: InternalFunction, -} - -impl Slicable for Proposal { - fn from_slice(value: &mut &[u8]) -> Option { - let id = try_opt!(u8::from_slice(value).and_then(InternalFunctionId::from_u8)); - let function = match id { - InternalFunctionId::SystemSetCode => - InternalFunction::SystemSetCode(try_opt!(Slicable::from_slice(value))), - InternalFunctionId::SessionSetLength => - InternalFunction::SessionSetLength(try_opt!(Slicable::from_slice(value))), - InternalFunctionId::SessionForceNewSession => InternalFunction::SessionForceNewSession, - InternalFunctionId::StakingSetSessionsPerEra => - InternalFunction::StakingSetSessionsPerEra(try_opt!(Slicable::from_slice(value))), - InternalFunctionId::StakingSetBondingDuration => - InternalFunction::StakingSetBondingDuration(try_opt!(Slicable::from_slice(value))), - InternalFunctionId::StakingSetValidatorCount => - InternalFunction::StakingSetValidatorCount(try_opt!(Slicable::from_slice(value))), - InternalFunctionId::StakingForceNewEra => InternalFunction::StakingForceNewEra, - InternalFunctionId::GovernanceSetApprovalPpmRequired => - InternalFunction::GovernanceSetApprovalPpmRequired(try_opt!(Slicable::from_slice(value))), - }; - - Some(Proposal { function }) - } - - fn to_vec(&self) -> Vec { - let mut v = Vec::new(); - match self.function { - InternalFunction::SystemSetCode(ref data) => { - (InternalFunctionId::SystemSetCode as u8).as_slice_then(|s| v.extend(s)); - data.as_slice_then(|s| v.extend(s)); - } - InternalFunction::SessionSetLength(ref data) => { - (InternalFunctionId::SessionSetLength as u8).as_slice_then(|s| v.extend(s)); - data.as_slice_then(|s| v.extend(s)); - } - InternalFunction::SessionForceNewSession => { - (InternalFunctionId::SessionForceNewSession as u8).as_slice_then(|s| v.extend(s)); - } - InternalFunction::StakingSetSessionsPerEra(ref data) => { - (InternalFunctionId::StakingSetSessionsPerEra as u8).as_slice_then(|s| v.extend(s)); - data.as_slice_then(|s| v.extend(s)); - } - InternalFunction::StakingSetBondingDuration(ref data) => { - (InternalFunctionId::StakingSetBondingDuration as u8).as_slice_then(|s| v.extend(s)); - data.as_slice_then(|s| v.extend(s)); - } - InternalFunction::StakingSetValidatorCount(ref data) => { - (InternalFunctionId::StakingSetValidatorCount as u8).as_slice_then(|s| v.extend(s)); - data.as_slice_then(|s| v.extend(s)); - } - InternalFunction::StakingForceNewEra => { - (InternalFunctionId::StakingForceNewEra as u8).as_slice_then(|s| v.extend(s)); - } - InternalFunction::GovernanceSetApprovalPpmRequired(ref data) => { - (InternalFunctionId::GovernanceSetApprovalPpmRequired as u8).as_slice_then(|s| v.extend(s)); - data.as_slice_then(|s| v.extend(s)); - } - } - - v - } - - fn as_slice_then R>(&self, f: F) -> R { - f(self.to_vec().as_slice()) - } -} diff --git a/substrate/primitives/src/runtime_function.rs b/substrate/primitives/src/runtime_function.rs deleted file mode 100644 index 48e5afdc61..0000000000 --- a/substrate/primitives/src/runtime_function.rs +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright 2017 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 . - -//! Polkadot runtime functions. -//! This describes a function that can be called from an external transaction. - -use bytes::Vec; -use codec::Slicable; - -/// Public functions that can be dispatched to. -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[repr(u8)] -enum FunctionId { - /// Set the timestamp. - TimestampSet = 0x00, - /// Set temporary session key as a validator. - SessionSetKey = 0x10, - /// Staking subsystem: begin staking. - StakingStake = 0x20, - /// Staking subsystem: stop staking. - StakingUnstake = 0x21, - /// Staking subsystem: transfer stake. - StakingTransfer = 0x22, - /// Make a proposal for the governance system. - GovernancePropose = 0x30, - /// Approve a proposal for the governance system. - GovernanceApprove = 0x31, -} - -impl FunctionId { - /// Derive `Some` value from a `u8`, or `None` if it's invalid. - fn from_u8(value: u8) -> Option { - use self::*; - let functions = [FunctionId::StakingStake, FunctionId::StakingUnstake, - FunctionId::StakingTransfer, FunctionId::SessionSetKey, FunctionId::TimestampSet, - FunctionId::GovernancePropose, FunctionId::GovernanceApprove]; - functions.iter().map(|&f| f).find(|&f| value == f as u8) - } -} - -/// Functions on the runtime. -#[derive(Debug, Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -pub enum Function { - /// Set the timestamp. - TimestampSet(::Timestamp), - /// Set temporary session key as a validator. - SessionSetKey(::SessionKey), - /// Staking subsystem: begin staking. - StakingStake, - /// Staking subsystem: stop staking. - StakingUnstake, - /// Staking subsystem: transfer stake. - StakingTransfer(::AccountId, ::Balance), - /// Make a proposal for the governance system. - GovernancePropose(::proposal::Proposal), - /// Approve a proposal for the governance system. - GovernanceApprove(::block::Number), -} - -impl Slicable for Function { - fn from_slice(value: &mut &[u8]) -> Option { - let id = try_opt!(u8::from_slice(value).and_then(FunctionId::from_u8)); - Some(match id { - FunctionId::TimestampSet => - Function::TimestampSet(try_opt!(Slicable::from_slice(value))), - FunctionId::SessionSetKey => - Function::SessionSetKey(try_opt!(Slicable::from_slice(value))), - FunctionId::StakingStake => Function::StakingStake, - FunctionId::StakingUnstake => Function::StakingUnstake, - FunctionId::StakingTransfer => { - let to = try_opt!(Slicable::from_slice(value)); - let amount = try_opt!(Slicable::from_slice(value)); - - Function::StakingTransfer(to, amount) - } - FunctionId::GovernancePropose => - Function::GovernancePropose(try_opt!(Slicable::from_slice(value))), - FunctionId::GovernanceApprove => - Function::GovernanceApprove(try_opt!(Slicable::from_slice(value))), - }) - } - - fn to_vec(&self) -> Vec { - let mut v = Vec::new(); - match *self { - Function::TimestampSet(ref data) => { - (FunctionId::TimestampSet as u8).as_slice_then(|s| v.extend(s)); - data.as_slice_then(|s| v.extend(s)); - } - Function::SessionSetKey(ref data) => { - (FunctionId::SessionSetKey as u8).as_slice_then(|s| v.extend(s)); - data.as_slice_then(|s| v.extend(s)); - } - Function::StakingStake => { - (FunctionId::StakingStake as u8).as_slice_then(|s| v.extend(s)); - } - Function::StakingUnstake => { - (FunctionId::StakingUnstake as u8).as_slice_then(|s| v.extend(s)); - } - Function::StakingTransfer(ref to, ref amount) => { - (FunctionId::StakingTransfer as u8).as_slice_then(|s| v.extend(s)); - to.as_slice_then(|s| v.extend(s)); - amount.as_slice_then(|s| v.extend(s)); - } - Function::GovernancePropose(ref data) => { - (FunctionId::GovernancePropose as u8).as_slice_then(|s| v.extend(s)); - data.as_slice_then(|s| v.extend(s)); - } - Function::GovernanceApprove(ref data) => { - (FunctionId::GovernanceApprove as u8).as_slice_then(|s| v.extend(s)); - data.as_slice_then(|s| v.extend(s)); - } - } - - v - } - - fn as_slice_then R>(&self, f: F) -> R { - f(self.to_vec().as_slice()) - } -} diff --git a/substrate/primitives/src/tests.rs b/substrate/primitives/src/tests.rs index 311f596400..51721ac85c 100644 --- a/substrate/primitives/src/tests.rs +++ b/substrate/primitives/src/tests.rs @@ -20,8 +20,7 @@ use codec::Slicable; use ::AccountId; use block::{Block, Header, Digest, Log}; -use runtime_function::Function; -use transaction::{UncheckedTransaction, Transaction}; +use transaction::{UncheckedTransaction, Transaction, Function}; #[test] fn serialise_transaction_works() { diff --git a/substrate/primitives/src/transaction.rs b/substrate/primitives/src/transaction.rs index c7723a7f1a..ff815ba627 100644 --- a/substrate/primitives/src/transaction.rs +++ b/substrate/primitives/src/transaction.rs @@ -18,7 +18,6 @@ use bytes::Vec; use codec::Slicable; -use runtime_function::Function; #[cfg(feature = "std")] use std::fmt; @@ -26,6 +25,264 @@ use std::fmt; #[cfg(not(feature = "std"))] use alloc::fmt; +use block::Number as BlockNumber; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[repr(u8)] +enum InternalFunctionId { + /// Set the system's code. + SystemSetCode = 0x00, + + /// Set the session length. + SessionSetLength = 0x10, + /// Force a new session. + SessionForceNewSession = 0x11, + + /// Set the number of sessions per era. + StakingSetSessionsPerEra = 0x20, + /// Set the minimum bonding duration for staking. + StakingSetBondingDuration = 0x21, + /// Set the validator count for staking. + StakingSetValidatorCount = 0x22, + /// Force a new staking era. + StakingForceNewEra = 0x23, + + /// Set the per-mille of validator approval required for governance changes. + GovernanceSetApprovalPpmRequired = 0x30, + +} + +impl InternalFunctionId { + /// Derive `Some` value from a `u8`, or `None` if it's invalid. + fn from_u8(value: u8) -> Option { + let functions = [ + InternalFunctionId::SystemSetCode, + InternalFunctionId::SessionSetLength, + InternalFunctionId::SessionForceNewSession, + InternalFunctionId::StakingSetSessionsPerEra, + InternalFunctionId::StakingSetBondingDuration, + InternalFunctionId::StakingSetValidatorCount, + InternalFunctionId::StakingForceNewEra, + InternalFunctionId::GovernanceSetApprovalPpmRequired, + ]; + functions.iter().map(|&f| f).find(|&f| value == f as u8) + } +} + +/// Internal functions that can be dispatched to. +#[derive(Debug, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +pub enum InternalFunction { + /// Set the system's code. + SystemSetCode(Vec), + /// Set the session length. + SessionSetLength(BlockNumber), + /// Force a new session. + SessionForceNewSession, + /// Set the number of sessions per era. + StakingSetSessionsPerEra(BlockNumber), + /// Set the minimum bonding duration for staking. + StakingSetBondingDuration(BlockNumber), + /// Set the validator count for staking. + StakingSetValidatorCount(u32), + /// Force a new staking era. + StakingForceNewEra, + /// Set the per-mille of validator approval required for governance changes. + GovernanceSetApprovalPpmRequired(u32), + +} + +/// An internal function. +#[derive(Debug, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +pub struct Proposal { + /// The privileged function to call. + pub function: InternalFunction, +} + +impl Slicable for Proposal { + fn from_slice(value: &mut &[u8]) -> Option { + let id = try_opt!(u8::from_slice(value).and_then(InternalFunctionId::from_u8)); + let function = match id { + InternalFunctionId::SystemSetCode => + InternalFunction::SystemSetCode(try_opt!(Slicable::from_slice(value))), + InternalFunctionId::SessionSetLength => + InternalFunction::SessionSetLength(try_opt!(Slicable::from_slice(value))), + InternalFunctionId::SessionForceNewSession => InternalFunction::SessionForceNewSession, + InternalFunctionId::StakingSetSessionsPerEra => + InternalFunction::StakingSetSessionsPerEra(try_opt!(Slicable::from_slice(value))), + InternalFunctionId::StakingSetBondingDuration => + InternalFunction::StakingSetBondingDuration(try_opt!(Slicable::from_slice(value))), + InternalFunctionId::StakingSetValidatorCount => + InternalFunction::StakingSetValidatorCount(try_opt!(Slicable::from_slice(value))), + InternalFunctionId::StakingForceNewEra => InternalFunction::StakingForceNewEra, + InternalFunctionId::GovernanceSetApprovalPpmRequired => + InternalFunction::GovernanceSetApprovalPpmRequired(try_opt!(Slicable::from_slice(value))), + }; + + Some(Proposal { function }) + } + + fn to_vec(&self) -> Vec { + let mut v = Vec::new(); + match self.function { + InternalFunction::SystemSetCode(ref data) => { + (InternalFunctionId::SystemSetCode as u8).as_slice_then(|s| v.extend(s)); + data.as_slice_then(|s| v.extend(s)); + } + InternalFunction::SessionSetLength(ref data) => { + (InternalFunctionId::SessionSetLength as u8).as_slice_then(|s| v.extend(s)); + data.as_slice_then(|s| v.extend(s)); + } + InternalFunction::SessionForceNewSession => { + (InternalFunctionId::SessionForceNewSession as u8).as_slice_then(|s| v.extend(s)); + } + InternalFunction::StakingSetSessionsPerEra(ref data) => { + (InternalFunctionId::StakingSetSessionsPerEra as u8).as_slice_then(|s| v.extend(s)); + data.as_slice_then(|s| v.extend(s)); + } + InternalFunction::StakingSetBondingDuration(ref data) => { + (InternalFunctionId::StakingSetBondingDuration as u8).as_slice_then(|s| v.extend(s)); + data.as_slice_then(|s| v.extend(s)); + } + InternalFunction::StakingSetValidatorCount(ref data) => { + (InternalFunctionId::StakingSetValidatorCount as u8).as_slice_then(|s| v.extend(s)); + data.as_slice_then(|s| v.extend(s)); + } + InternalFunction::StakingForceNewEra => { + (InternalFunctionId::StakingForceNewEra as u8).as_slice_then(|s| v.extend(s)); + } + InternalFunction::GovernanceSetApprovalPpmRequired(ref data) => { + (InternalFunctionId::GovernanceSetApprovalPpmRequired as u8).as_slice_then(|s| v.extend(s)); + data.as_slice_then(|s| v.extend(s)); + } + } + + v + } + + fn as_slice_then R>(&self, f: F) -> R { + f(self.to_vec().as_slice()) + } +} + + +/// Public functions that can be dispatched to. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[repr(u8)] +enum FunctionId { + /// Set the timestamp. + TimestampSet = 0x00, + /// Set temporary session key as a validator. + SessionSetKey = 0x10, + /// Staking subsystem: begin staking. + StakingStake = 0x20, + /// Staking subsystem: stop staking. + StakingUnstake = 0x21, + /// Staking subsystem: transfer stake. + StakingTransfer = 0x22, + /// Make a proposal for the governance system. + GovernancePropose = 0x30, + /// Approve a proposal for the governance system. + GovernanceApprove = 0x31, +} + +impl FunctionId { + /// Derive `Some` value from a `u8`, or `None` if it's invalid. + fn from_u8(value: u8) -> Option { + use self::*; + let functions = [FunctionId::StakingStake, FunctionId::StakingUnstake, + FunctionId::StakingTransfer, FunctionId::SessionSetKey, FunctionId::TimestampSet, + FunctionId::GovernancePropose, FunctionId::GovernanceApprove]; + functions.iter().map(|&f| f).find(|&f| value == f as u8) + } +} + +/// Functions on the runtime. +#[derive(Debug, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +pub enum Function { + /// Set the timestamp. + TimestampSet(::Timestamp), + /// Set temporary session key as a validator. + SessionSetKey(::SessionKey), + /// Staking subsystem: begin staking. + StakingStake, + /// Staking subsystem: stop staking. + StakingUnstake, + /// Staking subsystem: transfer stake. + StakingTransfer(::AccountId, ::Balance), + /// Make a proposal for the governance system. + GovernancePropose(Proposal), + /// Approve a proposal for the governance system. + GovernanceApprove(::block::Number), +} + +impl Slicable for Function { + fn from_slice(value: &mut &[u8]) -> Option { + let id = try_opt!(u8::from_slice(value).and_then(FunctionId::from_u8)); + Some(match id { + FunctionId::TimestampSet => + Function::TimestampSet(try_opt!(Slicable::from_slice(value))), + FunctionId::SessionSetKey => + Function::SessionSetKey(try_opt!(Slicable::from_slice(value))), + FunctionId::StakingStake => Function::StakingStake, + FunctionId::StakingUnstake => Function::StakingUnstake, + FunctionId::StakingTransfer => { + let to = try_opt!(Slicable::from_slice(value)); + let amount = try_opt!(Slicable::from_slice(value)); + + Function::StakingTransfer(to, amount) + } + FunctionId::GovernancePropose => + Function::GovernancePropose(try_opt!(Slicable::from_slice(value))), + FunctionId::GovernanceApprove => + Function::GovernanceApprove(try_opt!(Slicable::from_slice(value))), + }) + } + + fn to_vec(&self) -> Vec { + let mut v = Vec::new(); + match *self { + Function::TimestampSet(ref data) => { + (FunctionId::TimestampSet as u8).as_slice_then(|s| v.extend(s)); + data.as_slice_then(|s| v.extend(s)); + } + Function::SessionSetKey(ref data) => { + (FunctionId::SessionSetKey as u8).as_slice_then(|s| v.extend(s)); + data.as_slice_then(|s| v.extend(s)); + } + Function::StakingStake => { + (FunctionId::StakingStake as u8).as_slice_then(|s| v.extend(s)); + } + Function::StakingUnstake => { + (FunctionId::StakingUnstake as u8).as_slice_then(|s| v.extend(s)); + } + Function::StakingTransfer(ref to, ref amount) => { + (FunctionId::StakingTransfer as u8).as_slice_then(|s| v.extend(s)); + to.as_slice_then(|s| v.extend(s)); + amount.as_slice_then(|s| v.extend(s)); + } + Function::GovernancePropose(ref data) => { + (FunctionId::GovernancePropose as u8).as_slice_then(|s| v.extend(s)); + data.as_slice_then(|s| v.extend(s)); + } + Function::GovernanceApprove(ref data) => { + (FunctionId::GovernanceApprove as u8).as_slice_then(|s| v.extend(s)); + data.as_slice_then(|s| v.extend(s)); + } + } + + v + } + + fn as_slice_then R>(&self, f: F) -> R { + f(self.to_vec().as_slice()) + } +} + /// A vetted and verified transaction from the external world. #[derive(Debug, PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] @@ -113,7 +370,6 @@ impl fmt::Debug for UncheckedTransaction { #[cfg(test)] mod tests { use ::codec::Slicable; - use runtime_function::Function; use super::*; #[test] diff --git a/substrate/wasm-runtime/polkadot/src/runtime/governance.rs b/substrate/wasm-runtime/polkadot/src/runtime/governance.rs index ad71a7a236..5c846beea7 100644 --- a/substrate/wasm-runtime/polkadot/src/runtime/governance.rs +++ b/substrate/wasm-runtime/polkadot/src/runtime/governance.rs @@ -29,7 +29,7 @@ use runtime_std::prelude::*; use codec::KeyedVec; use support::storage; use primitives::{AccountId, Hash, BlockNumber}; -use primitives::proposal::Proposal; +use primitives::transaction::Proposal; use runtime::{staking, system, session}; const APPROVALS_REQUIRED: &[u8] = b"gov:apr"; @@ -95,7 +95,7 @@ pub mod privileged { pub mod internal { use super::*; - use primitives::proposal::{Proposal, InternalFunction}; + use primitives::transaction::{Proposal, InternalFunction}; /// Current era is ending; we should finish up any proposals. pub fn end_of_an_era() { @@ -150,7 +150,7 @@ mod tests { use codec::{KeyedVec, Joiner}; use support::{one, two, with_env}; use primitives::AccountId; - use primitives::proposal::InternalFunction; + use primitives::transaction::InternalFunction; use runtime::{staking, session}; fn new_test_ext() -> TestExternalities { diff --git a/substrate/wasm-runtime/polkadot/src/runtime/system.rs b/substrate/wasm-runtime/polkadot/src/runtime/system.rs index 22f72fff79..2437fec912 100644 --- a/substrate/wasm-runtime/polkadot/src/runtime/system.rs +++ b/substrate/wasm-runtime/polkadot/src/runtime/system.rs @@ -23,8 +23,7 @@ use codec::{KeyedVec, Slicable}; use support::{Hashable, storage, with_env}; use primitives::{AccountId, Hash, TxOrder}; use primitives::block::{Block, Header, Number as BlockNumber}; -use primitives::transaction::UncheckedTransaction; -use primitives::runtime_function::Function; +use primitives::transaction::{UncheckedTransaction, Function}; use runtime::{staking, session}; const NONCE_OF: &[u8] = b"sys:non:"; @@ -215,8 +214,7 @@ mod tests { use runtime_std::{with_externalities, twox_128, TestExternalities}; use codec::{Joiner, KeyedVec, Slicable}; use support::{StaticHexInto, HexDisplay, one, two}; - use primitives::transaction::{UncheckedTransaction, Transaction}; - use primitives::runtime_function::Function; + use primitives::transaction::{UncheckedTransaction, Transaction, Function}; use primitives::block::{Header, Digest}; use runtime::staking; diff --git a/substrate/wasm-runtime/polkadot/src/support/storage.rs b/substrate/wasm-runtime/polkadot/src/support/storage.rs index 71c6a77e87..5cc1e57845 100644 --- a/substrate/wasm-runtime/polkadot/src/support/storage.rs +++ b/substrate/wasm-runtime/polkadot/src/support/storage.rs @@ -338,7 +338,7 @@ mod tests { #[test] fn proposals_can_be_stored() { - use primitives::proposal::{Proposal, InternalFunction}; + use primitives::transaction::{Proposal, InternalFunction}; let mut t = TestExternalities { storage: HashMap::new(), }; with_externalities(&mut t, || { let x = Proposal {