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 {