From e1153821f2d51ae940aae51b0cad548c12290214 Mon Sep 17 00:00:00 2001 From: Gav Date: Thu, 6 Sep 2018 17:15:56 +0200 Subject: [PATCH 01/21] System and Balances switched to new call model --- Cargo.lock | 219 ++++---- demo/executor/src/lib.rs | 61 ++- demo/runtime/src/lib.rs | 17 +- substrate/runtime-support/src/dispatch.rs | 26 +- substrate/runtime-support/src/lib.rs | 80 ++- .../runtime-support/src/storage/generator.rs | 4 +- substrate/runtime/balances/src/lib.rs | 40 +- substrate/runtime/balances/src/mock.rs | 6 +- substrate/runtime/balances/src/tests.rs | 20 +- substrate/runtime/consensus/src/lib.rs | 8 +- substrate/runtime/contract/src/lib.rs | 6 +- substrate/runtime/contract/src/tests.rs | 2 +- substrate/runtime/council/src/lib.rs | 14 +- substrate/runtime/council/src/voting.rs | 8 +- substrate/runtime/democracy/src/lib.rs | 10 +- substrate/runtime/example/src/lib.rs | 8 +- substrate/runtime/executive/Cargo.toml | 4 - substrate/runtime/executive/src/lib.rs | 99 ++-- substrate/runtime/primitives/src/generic.rs | 514 ------------------ .../runtime/primitives/src/generic/block.rs | 105 ++++ .../src/generic/checked_extrinsic.rs | 57 ++ .../runtime/primitives/src/generic/header.rs | 193 +++++++ .../runtime/primitives/src/generic/mod.rs | 29 + .../runtime/primitives/src/generic/tests.rs | 66 +++ .../src/generic/unchecked_extrinsic.rs | 158 ++++++ substrate/runtime/primitives/src/lib.rs | 38 -- substrate/runtime/primitives/src/testing.rs | 4 +- substrate/runtime/primitives/src/traits.rs | 2 +- substrate/runtime/session/src/lib.rs | 6 +- substrate/runtime/staking/src/lib.rs | 12 +- substrate/runtime/staking/src/mock.rs | 2 +- substrate/runtime/system/src/lib.rs | 56 +- substrate/runtime/timestamp/src/lib.rs | 8 +- substrate/runtime/treasury/src/lib.rs | 6 +- 34 files changed, 1016 insertions(+), 872 deletions(-) delete mode 100644 substrate/runtime/primitives/src/generic.rs create mode 100644 substrate/runtime/primitives/src/generic/block.rs create mode 100644 substrate/runtime/primitives/src/generic/checked_extrinsic.rs create mode 100644 substrate/runtime/primitives/src/generic/header.rs create mode 100644 substrate/runtime/primitives/src/generic/mod.rs create mode 100644 substrate/runtime/primitives/src/generic/tests.rs create mode 100644 substrate/runtime/primitives/src/generic/unchecked_extrinsic.rs diff --git a/Cargo.lock b/Cargo.lock index 08803e885aa91..7ad4ffae16095 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -436,7 +436,7 @@ dependencies = [ [[package]] name = "datastore" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "base64 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "chashmap 2.2.1 (git+https://github.com/redox-os/tfs)", @@ -1139,27 +1139,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libp2p" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-dns 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-floodsub 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-identify 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-kad 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-mplex 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-peerstore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-ping 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-ratelimit 0.1.1 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-relay 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-secio 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-tcp-transport 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-transport-timeout 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-uds 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-websocket 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-yamux 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-dns 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-floodsub 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-identify 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-kad 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-mplex 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-peerstore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-ping 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-ratelimit 0.1.1 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-relay 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-secio 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-tcp-transport 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-transport-timeout 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-uds 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-websocket 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-yamux 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "stdweb 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-current-thread 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1169,20 +1169,20 @@ dependencies = [ [[package]] name = "libp2p-core" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "bs58 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "multihash 0.8.1-pre (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "multistream-select 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "multihash 0.8.1-pre (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "multistream-select 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "rw-stream-sink 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "smallvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1190,12 +1190,12 @@ dependencies = [ [[package]] name = "libp2p-dns" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "tokio-dns-unofficial 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1203,16 +1203,16 @@ dependencies = [ [[package]] name = "libp2p-floodsub" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "bs58 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1224,15 +1224,15 @@ dependencies = [ [[package]] name = "libp2p-identify" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-peerstore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-peerstore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1243,20 +1243,20 @@ dependencies = [ [[package]] name = "libp2p-kad" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "bigint 4.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "bs58 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "datastore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "datastore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-identify 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-ping 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-identify 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-ping 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1270,12 +1270,12 @@ dependencies = [ [[package]] name = "libp2p-mplex" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1286,13 +1286,13 @@ dependencies = [ [[package]] name = "libp2p-peerstore" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "bs58 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "datastore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "datastore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1301,14 +1301,14 @@ dependencies = [ [[package]] name = "libp2p-ping" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "multistream-select 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "multistream-select 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1318,11 +1318,11 @@ dependencies = [ [[package]] name = "libp2p-ratelimit" version = "0.1.1" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "aio-limited 0.1.0 (git+https://github.com/paritytech/aio-limited.git)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1331,14 +1331,14 @@ dependencies = [ [[package]] name = "libp2p-relay" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-peerstore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-peerstore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "protobuf 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1349,32 +1349,34 @@ dependencies = [ [[package]] name = "libp2p-secio" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "aes-ctr 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "asn1_der 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "ctr 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "eth-secp256k1 0.5.7 (git+https://github.com/paritytech/rust-secp256k1)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "rw-stream-sink 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "twofish 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-tcp-transport" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "tk-listen 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1383,10 +1385,10 @@ dependencies = [ [[package]] name = "libp2p-transport-timeout" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1394,25 +1396,25 @@ dependencies = [ [[package]] name = "libp2p-uds" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "tokio-uds 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-websocket" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "rw-stream-sink 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "rw-stream-sink 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "stdweb 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "websocket 0.20.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1421,11 +1423,11 @@ dependencies = [ [[package]] name = "libp2p-yamux" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1570,19 +1572,19 @@ dependencies = [ [[package]] name = "multiaddr" version = "0.3.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "bs58 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "integer-encoding 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "multihash 0.8.1-pre (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "multihash 0.8.1-pre (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "multihash" version = "0.8.1-pre" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "sha1 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1592,7 +1594,7 @@ dependencies = [ [[package]] name = "multistream-select" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2145,7 +2147,7 @@ dependencies = [ [[package]] name = "rw-stream-sink" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2622,7 +2624,7 @@ dependencies = [ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2830,15 +2832,11 @@ dependencies = [ "substrate-codec-derive 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-balances 0.1.0", - "substrate-runtime-consensus 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-primitives 0.1.0", - "substrate-runtime-session 0.1.0", - "substrate-runtime-staking 0.1.0", "substrate-runtime-std 0.1.0", "substrate-runtime-support 0.1.0", "substrate-runtime-system 0.1.0", - "substrate-runtime-timestamp 0.1.0", ] [[package]] @@ -3514,6 +3512,16 @@ name = "try-lock" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "twofish" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "block-cipher-trait 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "opaque-debug 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "twox-hash" version = "1.1.0" @@ -3850,7 +3858,7 @@ dependencies = [ "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" "checksum ctr 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "50ac3add446ec1f8fe3dc007cd838f5b22bbf33186394feac505451ecc43c018" "checksum ctrlc 1.1.1 (git+https://github.com/paritytech/rust-ctrlc.git)" = "" -"checksum datastore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" +"checksum datastore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" "checksum difference 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3304d19798a8e067e48d8e69b2c37f0b5e9b4e462504ad9e27e9f3fce02bba8" "checksum difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" "checksum digest 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3cae2388d706b52f2f2f9afe280f9d768be36544bd71d1b8120cb34ea6450b55" @@ -3916,23 +3924,23 @@ dependencies = [ "checksum lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e6412c5e2ad9584b0b8e979393122026cdd6d2a80b933f890dcd694ddbe73739" "checksum lazycell 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a6f08839bc70ef4a3fe1d566d5350f519c5912ea86be0df1740a7d247c7fc0ef" "checksum libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "76e3a3ef172f1a0b9a9ff0dd1491ae5e6c948b94479a3021819ba7d860c8645d" -"checksum libp2p 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-dns 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-floodsub 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-identify 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-kad 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-mplex 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-peerstore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-ping 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-ratelimit 0.1.1 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-relay 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-secio 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-tcp-transport 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-transport-timeout 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-uds 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-websocket 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-yamux 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" +"checksum libp2p 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-dns 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-floodsub 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-identify 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-kad 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-mplex 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-peerstore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-ping 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-ratelimit 0.1.1 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-relay 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-secio 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-tcp-transport 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-transport-timeout 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-uds 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-websocket 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-yamux 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" "checksum linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70fb39025bc7cdd76305867c4eccf2f2dcf6e9a57f5b21a93e1c2d86cd03ec9e" "checksum local-encoding 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e1ceb20f39ff7ae42f3ff9795f3986b1daad821caaa1e1732a0944103a5a1a66" "checksum lock_api 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "949826a5ccf18c1b3a7c3d57692778d21768b79e46eb9dd07bfc4c2160036c54" @@ -3949,9 +3957,9 @@ dependencies = [ "checksum mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)" = "6d771e3ef92d58a8da8df7d6976bfca9371ed1de6619d9d5a5ce5b1f29b85bfe" "checksum mio-uds 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "84c7b5caa3a118a6e34dbac36504503b1e8dc5835e833306b9d6af0e05929f79" "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" -"checksum multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum multihash 0.8.1-pre (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum multistream-select 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" +"checksum multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum multihash 0.8.1-pre (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum multistream-select 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" "checksum names 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef320dab323286b50fb5cdda23f61c796a72a89998ab565ca32525c5c556f2da" "checksum nan-preserving-float 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34d4f00fcc2f4c9efa8cc971db0da9e28290e28e97af47585e48691ef10ff31f" "checksum native-tls 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f74dbadc8b43df7864539cedb7bc91345e532fdd913cfdc23ad94f4d2d40fbc0" @@ -4015,7 +4023,7 @@ dependencies = [ "checksum rustc-hex 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2b03280c2813907a030785570c577fb27d3deec8da4c18566751ade94de0ace" "checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" "checksum rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a54aa04a10c68c1c4eacb4337fd883b435997ede17a9385784b990777686b09a" -"checksum rw-stream-sink 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" +"checksum rw-stream-sink 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" "checksum safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" "checksum safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e27a8b19b835f7aea908818e871f5cc3a5a186550c30773be987e155e8163d8f" "checksum schannel 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "85fd9df495640643ad2d00443b3d78aae69802ad488debab4f1dd52fc1806ade" @@ -4084,6 +4092,7 @@ dependencies = [ "checksum transaction-pool 1.13.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fdb8870eea404a57e2f62056ac45067a53a6207fd31866122356481d3c2e1a30" "checksum triehash 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3da77dc2c88bac48769c53f2c7675d99d522a7fc8130da3fadf29d7c6f94c9ac" "checksum try-lock 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee2aa4715743892880f70885373966c83d73ef1b0838a664ef0c76fffd35e7c2" +"checksum twofish 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1eef327f05b0d0ec1b9d7d119d8f4d9f602ceee37e0540aff8071e8e66c2e22e" "checksum twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "475352206e7a290c5fccc27624a163e8d0d115f7bb60ca18a64fc9ce056d7435" "checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" diff --git a/demo/executor/src/lib.rs b/demo/executor/src/lib.rs index 084249cbcaccc..141a5ba8e8dbd 100644 --- a/demo/executor/src/lib.rs +++ b/demo/executor/src/lib.rs @@ -52,11 +52,11 @@ mod tests { use primitives::{twox_128, KeccakHasher}; use demo_primitives::{Hash, BlockNumber, AccountId}; use runtime_primitives::traits::Header as HeaderT; - use runtime_primitives::{ApplyOutcome, ApplyError, ApplyResult, MaybeUnsigned}; + use runtime_primitives::{ApplyOutcome, ApplyError, ApplyResult}; use {balances, staking, session, system, consensus}; use system::{EventRecord, Phase}; - use demo_runtime::{Header, Block, UncheckedExtrinsic, Extrinsic, Call, Runtime, Balances, - BuildStorage, GenesisConfig, BalancesConfig, SessionConfig, StakingConfig, BareExtrinsic, System, Event}; + use demo_runtime::{Header, Block, UncheckedExtrinsic, CheckedExtrinsic, Call, Runtime, Balances, + BuildStorage, GenesisConfig, BalancesConfig, SessionConfig, StakingConfig, System, Event}; use ed25519::{Public, Pair}; const BLOATY_CODE: &[u8] = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm"); @@ -77,20 +77,32 @@ mod tests { AccountId::from(Keyring::Bob.to_raw_public()) } + fn sign(xt: CheckedExtrinsic) -> UncheckedExtrinsic { + match xt.signed { + Some((signed, signature)) => { + let payload = (self.index, self.function); + let pair = Pair::from(Keyring::from_public(Public::from_raw(signed.clone())).unwrap()); + let signature = pair.sign(&payload.encode()).into(); + UncheckedExtrinsic { + signed: Some((signed, signature.into())), + index: payload.0, + function: payload.1, + } + } + None => UncheckedExtrinsic { + signed: None, + index: xt.index, + function: xt.function, + }, + } + } + fn xt() -> UncheckedExtrinsic { - let extrinsic = BareExtrinsic { - signed: alice(), + sign(CheckedExtrinsic { + signed: Some(alice()), index: 0, function: Call::Balances(balances::Call::transfer::(bob().into(), 69)), - }; - let signature = MaybeUnsigned(Keyring::from_raw_public(extrinsic.signed.0.clone()).unwrap() - .sign(&extrinsic.encode()).into()); - let extrinsic = Extrinsic { - signed: extrinsic.signed.into(), - index: extrinsic.index, - function: extrinsic.function, - }; - UncheckedExtrinsic::new(extrinsic, signature) + }) } fn from_block_number(n: u64) -> Header { @@ -225,19 +237,10 @@ mod tests { }.build_storage().unwrap().into() } - fn construct_block(number: BlockNumber, parent_hash: Hash, state_root: Hash, extrinsics: Vec) -> (Vec, Hash) { + fn construct_block(number: BlockNumber, parent_hash: Hash, state_root: Hash, extrinsics: Vec) -> (Vec, Hash) { use triehash::ordered_trie_root; - let extrinsics = extrinsics.into_iter().map(|extrinsic| { - let signature = MaybeUnsigned(Pair::from(Keyring::from_public(Public::from_raw(extrinsic.signed.0.clone())).unwrap()) - .sign(&extrinsic.encode()).into()); - let extrinsic = Extrinsic { - signed: extrinsic.signed.into(), - index: extrinsic.index, - function: extrinsic.function, - }; - UncheckedExtrinsic::new(extrinsic, signature) - }).collect::>(); + let extrinsics = extrinsics.into_iter().map(sign).collect::>(); let extrinsics_root = ordered_trie_root::(extrinsics.iter().map(Encode::encode)).0.into(); @@ -261,7 +264,7 @@ mod tests { // hex!("3437bf4b182ab17bb322af5c67e55f6be487a77084ad2b4e27ddac7242e4ad21").into(), // Keccak hex!("508a68a0918f614b86b2ccfd0975754f6d2abe1026a34e42d6d8d5abdf4db010").into(), - vec![BareExtrinsic { + vec![CheckedExtrinsic { signed: alice(), index: 0, function: Call::Balances(balances::Call::transfer(bob().into(), 69)), @@ -278,12 +281,12 @@ mod tests { // Keccak hex!("171f1b2c01c9c616e40ee2d842a699286b50a5a74874b56d826094dadedffb27").into(), vec![ - BareExtrinsic { + CheckedExtrinsic { signed: bob(), index: 0, function: Call::Balances(balances::Call::transfer(alice().into(), 5)), }, - BareExtrinsic { + CheckedExtrinsic { signed: alice(), index: 1, function: Call::Balances(balances::Call::transfer(bob().into(), 15)), @@ -300,7 +303,7 @@ mod tests { // hex!("2c7231a9c210a7aa4bea169d944bc4aaacd517862b244b8021236ffa7f697991").into(), // Keccak hex!("e45221804da3a3609454d4e09debe6364cc6af63c2ff067d802d1af62fea32ae").into(), - vec![BareExtrinsic { + vec![CheckedExtrinsic { signed: alice(), index: 0, function: Call::Consensus(consensus::Call::remark(vec![0; 60000])), diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index 1cf3e460adb80..fd0bff3a12e2c 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -64,7 +64,7 @@ pub use runtime_primitives::BuildStorage; // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, Copy, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -/// Runtime runtime type used to parameterize the various modules. +/// Runtime type used to collate and parameterize the various modules. pub struct Runtime; /// Runtime version. @@ -84,7 +84,7 @@ impl version::Trait for Runtime { } impl system::Trait for Runtime { - type PublicAux = Self::AccountId; + type Origin = OuterOrigin; type Index = Index; type BlockNumber = BlockNumber; type Hash = Hash; @@ -179,6 +179,11 @@ impl_outer_log! { } } +impl_outer_origin! { + pub enum Origin for Runtime { + } +} + impl DigestItem for Log { type AuthoritiesChange = consensus::AuthoritiesChange; @@ -192,7 +197,7 @@ impl DigestItem for Log { impl_outer_dispatch! { #[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] - pub enum Call where aux: ::PublicAux { + pub enum Call where aux: ::Origin { Consensus, Balances, Session, @@ -226,10 +231,8 @@ pub type Block = generic::Block; pub type BlockId = generic::BlockId; /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; -/// Extrinsic type as expected by this runtime. This is not the type that is signed. -pub type Extrinsic = generic::Extrinsic; -/// Extrinsic type that is signed. -pub type BareExtrinsic = generic::Extrinsic; +/// Extrinsic type that has already been checked. +pub type CheckedExtrinsic = generic::Extrinsic; /// Executive: handles dispatch to the various modules. pub type Executive = executive::Executive; diff --git a/substrate/runtime-support/src/dispatch.rs b/substrate/runtime-support/src/dispatch.rs index d15673b583ece..1b92c87abad83 100644 --- a/substrate/runtime-support/src/dispatch.rs +++ b/substrate/runtime-support/src/dispatch.rs @@ -34,7 +34,7 @@ pub trait Dispatchable { pub trait AuxDispatchable { type Aux; type Trait; - fn dispatch(self, aux: &Self::Aux) -> Result; + fn dispatch(self, aux: Self::Aux) -> Result; } #[cfg(feature = "std")] @@ -207,7 +207,7 @@ macro_rules! decl_dispatch { impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; ) => { impl<$trait_instance: $trait_name> $mod_type<$trait_instance> { - pub fn aux_dispatch>(d: D, aux: &D::Aux) -> $crate::dispatch::Result { + pub fn aux_dispatch>(d: D, aux: D::Aux) -> $crate::dispatch::Result { d.dispatch(aux) } pub fn dispatch>(d: D) -> $crate::dispatch::Result { @@ -290,7 +290,7 @@ macro_rules! __decl_dispatch_module_with_aux { { type Trait = $trait_instance; type Aux = $aux_type; - fn dispatch(self, aux: &Self::Aux) -> $crate::dispatch::Result { + fn dispatch(self, aux: Self::Aux) -> $crate::dispatch::Result { match self { $( $call_type::$fn_name( $( $param_name ),* ) => @@ -521,7 +521,7 @@ macro_rules! impl_outer_dispatch { impl $crate::dispatch::AuxDispatchable for $call_type { type Aux = $aux; type Trait = $call_type; - fn dispatch(self, aux: &$aux) -> $crate::dispatch::Result { + fn dispatch(self, aux: $aux) -> $crate::dispatch::Result { match self { $( $call_type::$camelcase(call) => call.dispatch(&aux), @@ -799,14 +799,14 @@ mod tests { use serde_json; pub trait Trait { - type PublicAux; + type Origin; } decl_module! { pub struct Module; #[derive(Serialize, Deserialize)] - pub enum Call where aux: T::PublicAux { + pub enum Call where aux: T::Origin { /// Hi, this is a comment. fn aux_0(aux) -> Result; fn aux_1(aux, data: i32) -> Result; @@ -826,14 +826,14 @@ mod tests { r#"{ "name": "Module", "calls": [ "#, r#"{ "name": "Call", "functions": { "#, r#""0": { "name": "aux_0", "params": [ "#, - r#"{ "name": "aux", "type": "T::PublicAux" }"#, + r#"{ "name": "aux", "type": "T::Origin" }"#, r#" ], "description": [ " Hi, this is a comment." ] }, "#, r#""0 + 1": { "name": "aux_1", "params": [ "#, - r#"{ "name": "aux", "type": "T::PublicAux" }, "#, + r#"{ "name": "aux", "type": "T::Origin" }, "#, r#"{ "name": "data", "type": "i32" }"#, r#" ], "description": [ ] }, "#, r#""0 + 1 + 1": { "name": "aux_2", "params": [ "#, - r#"{ "name": "aux", "type": "T::PublicAux" }, "#, + r#"{ "name": "aux", "type": "T::Origin" }, "#, r#"{ "name": "data", "type": "i32" }, "#, r#"{ "name": "data2", "type": "String" }"#, r#" ], "description": [ ] }"#, @@ -851,15 +851,15 @@ mod tests { ); impl Module { - fn aux_0(_: &T::PublicAux) -> Result { + fn aux_0(_: &T::Origin) -> Result { unreachable!() } - fn aux_1(_: &T::PublicAux, _: i32) -> Result { + fn aux_1(_: &T::Origin, _: i32) -> Result { unreachable!() } - fn aux_2(_: &T::PublicAux, _: i32, _: String) -> Result { + fn aux_2(_: &T::Origin, _: i32, _: String) -> Result { unreachable!() } @@ -875,7 +875,7 @@ mod tests { struct TraitImpl {} impl Trait for TraitImpl { - type PublicAux = u32; + type Origin = u32; } #[test] diff --git a/substrate/runtime-support/src/lib.rs b/substrate/runtime-support/src/lib.rs index 7bb4d94c3393e..4c5f320980817 100644 --- a/substrate/runtime-support/src/lib.rs +++ b/substrate/runtime-support/src/lib.rs @@ -103,19 +103,19 @@ macro_rules! impl_outer_event { $(#[$attr])* #[allow(non_camel_case_types)] pub enum $name { - system(system::Event), + system(system::$name), $( - $module($module::Event<$trait>), + $module($module::$name<$trait>), )* } - impl From for $name { - fn from(x: system::Event) -> Self { + impl From for $name { + fn from(x: system::$name) -> Self { $name::system(x) } } $( - impl From<$module::Event<$trait>> for $name { - fn from(x: $module::Event<$trait>) -> Self { + impl From<$module::$name<$trait>> for $name { + fn from(x: $module::$name<$trait>) -> Self { $name::$module(x) } } @@ -123,6 +123,74 @@ macro_rules! impl_outer_event { } } +/// The void type - it cannot exist. +// Oh rust, you crack me up... +#[derive(Clone, Eq, PartialEq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum Void {} + +#[macro_export] +macro_rules! impl_outer_origin { + ($(#[$attr:meta])* pub enum $name:ident for $trait:ident where system = $system:ident { $( $module:ident ),* }) => { + // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. + #[derive(Clone, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Debug))] + $(#[$attr])* + #[allow(non_camel_case_types)] + pub enum $name { + system($system::Origin<$trait>), + $( + $module($module::Origin<$trait>), + )* + #[allow(dead_code)] + Void($crate::Void) + } + impl From<$system::Origin<$trait>> for $name { + fn from(x: $system::Origin<$trait>) -> Self { + $name::system(x) + } + } + impl Into>> for $name { + fn into(self) -> Option<$system::Origin<$trait>> { + if let $name::system(l) = self { + Some(l) + } else { + None + } + } + } + impl From::AccountId>> for $name { + fn from(x: Option<<$trait as $system::Trait>::AccountId>) -> Self { + <$system::Origin<$trait>>::from(x).into() + } + } + $( + impl From<$module::Origin<$trait>> for $name { + fn from(x: $module::Origin<$trait>) -> Self { + $name::$module(x) + } + } + impl Into>> for $name { + fn into(self) -> Option<$module::Origin> { + if let $name::$module(l) = self { + Some(l) + } else { + None + } + } + } + )* + }; + ($(#[$attr:meta])* pub enum $name:ident for $trait:ident { $( $module:ident ),* }) => { + impl_outer_origin! { + $(#[$attr])* + pub enum $name for $trait where system = system { + $( $module ),* + } + } + } +} + #[macro_export] macro_rules! impl_outer_log { diff --git a/substrate/runtime-support/src/storage/generator.rs b/substrate/runtime-support/src/storage/generator.rs index 9c9b5223efba6..919e26972aab1 100644 --- a/substrate/runtime-support/src/storage/generator.rs +++ b/substrate/runtime-support/src/storage/generator.rs @@ -1456,7 +1456,7 @@ mod tests { } pub trait Trait { - type PublicAux; + type Origin; } decl_module! { @@ -1500,7 +1500,7 @@ mod tests { struct TraitImpl {} impl Trait for TraitImpl { - type PublicAux = u32; + type Origin = u32; } const EXPECTED_METADATA: &str = concat!( diff --git a/substrate/runtime/balances/src/lib.rs b/substrate/runtime/balances/src/lib.rs index 46317cb1c64f4..fc4920c0f0234 100644 --- a/substrate/runtime/balances/src/lib.rs +++ b/substrate/runtime/balances/src/lib.rs @@ -45,9 +45,10 @@ use rstd::{cmp, result}; use codec::{Encode, Decode, Codec, Input, Output}; use runtime_support::{StorageValue, StorageMap, Parameter}; use runtime_support::dispatch::Result; -use primitives::traits::{Zero, One, RefInto, SimpleArithmetic, OnFinalise, MakePayment, +use primitives::traits::{Zero, One, SimpleArithmetic, OnFinalise, MakePayment, As, AuxLookup, Member, CheckedAdd, CheckedSub}; use address::Address as RawAddress; +use system::{ensure_signed, ensure_root}; mod mock; @@ -135,13 +136,9 @@ decl_module! { pub struct Module; #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum Call where aux: T::PublicAux { + pub enum Call where aux: T::Origin { fn transfer(aux, dest: RawAddress, value: T::Balance) -> Result; - } - - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum PrivCall { - fn set_balance(who: RawAddress, free: T::Balance, reserved: T::Balance) -> Result; + fn set_balance(aux, who: RawAddress, free: T::Balance, reserved: T::Balance) -> Result; } } @@ -233,6 +230,11 @@ pub enum UpdateBalanceOutcome { impl Module { + /// Deposit one of this module's events. + fn deposit_event(event: Event) { + >::deposit_event(::Event::from(event).into()); + } + // PUBLIC IMMUTABLES /// The combined balance of `who`. @@ -283,11 +285,11 @@ impl Module { // PUBLIC DISPATCH /// Transfer some liquid free balance to another staker. - pub fn transfer(aux: &T::PublicAux, dest: Address, value: T::Balance) -> Result { - let dest = Self::lookup(dest)?; + pub fn transfer(origin: T::Origin, dest: Address, value: T::Balance) -> Result { + let transactor = ensure_signed(origin)?; - let transactor = aux.ref_into(); - let from_balance = Self::free_balance(transactor); + let dest = Self::lookup(dest)?; + let from_balance = Self::free_balance(&transactor); let would_create = from_balance.is_zero(); let fee = if would_create { Self::creation_fee() } else { Self::transfer_fee() }; let liability = value + fee; @@ -299,7 +301,7 @@ impl Module { if would_create && value < Self::existential_deposit() { return Err("value too low to create account"); } - T::EnsureAccountLiquid::ensure_account_liquid(transactor)?; + T::EnsureAccountLiquid::ensure_account_liquid(&transactor)?; let to_balance = Self::free_balance(&dest); // NOTE: total stake being stored in the same type means that this could never overflow @@ -309,8 +311,8 @@ impl Module { None => return Err("destination balance too high to receive value"), }; - if transactor != &dest { - Self::set_free_balance(transactor, new_from_balance); + if transactor != dest { + Self::set_free_balance(&transactor, new_from_balance); Self::decrease_total_stake_by(fee); Self::set_free_balance_creating(&dest, new_to_balance); } @@ -318,15 +320,9 @@ impl Module { Ok(()) } - // PRIV DISPATCH - - /// Deposit one of this module's events. - fn deposit_event(event: Event) { - >::deposit_event(::Event::from(event).into()); - } - /// Set the balances of a given account. - fn set_balance(who: Address, free: T::Balance, reserved: T::Balance) -> Result { + fn set_balance(origin: T::Origin, who: Address, free: T::Balance, reserved: T::Balance) -> Result { + ensure_root(origin)?; let who = Self::lookup(who)?; Self::set_free_balance(&who, free); Self::set_reserved_balance(&who, reserved); diff --git a/substrate/runtime/balances/src/mock.rs b/substrate/runtime/balances/src/mock.rs index 803cd995649eb..1f7297c76bbb9 100644 --- a/substrate/runtime/balances/src/mock.rs +++ b/substrate/runtime/balances/src/mock.rs @@ -24,11 +24,15 @@ use substrate_primitives::{H256, KeccakHasher}; use runtime_io; use {GenesisConfig, Module, Trait, system}; +impl_outer_origin!{ + pub enum Origin for Test {} +} + // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] pub struct Test; impl system::Trait for Test { - type PublicAux = Self::AccountId; + type Origin = Origin; type Index = u64; type BlockNumber = u64; type Hash = H256; diff --git a/substrate/runtime/balances/src/tests.rs b/substrate/runtime/balances/src/tests.rs index 7f3a740a931a9..ab6b4ca87b1dc 100644 --- a/substrate/runtime/balances/src/tests.rs +++ b/substrate/runtime/balances/src/tests.rs @@ -47,7 +47,7 @@ fn indexing_lookup_should_work() { fn default_indexing_on_new_accounts_should_work() { with_externalities(&mut new_test_ext(10, true), || { assert_eq!(Balances::lookup_index(4), None); - assert_ok!(Balances::transfer(&1, 5.into(), 10)); + assert_ok!(Balances::transfer(Some(1).into(), 5.into(), 10)); assert_eq!(Balances::lookup_index(4), Some(5)); }); } @@ -59,7 +59,7 @@ fn dust_account_removal_should_work() { assert_eq!(System::account_nonce(&2), 1); assert_eq!(Balances::total_balance(&2), 256 * 20); - assert_ok!(Balances::transfer(&2, 5.into(), 256 * 10 + 1)); // index 1 (account 2) becomes zombie + assert_ok!(Balances::transfer(Some(2).into(), 5.into(), 256 * 10 + 1)); // index 1 (account 2) becomes zombie assert_eq!(Balances::total_balance(&2), 0); assert_eq!(Balances::total_balance(&5), 256 * 10 + 1); assert_eq!(System::account_nonce(&2), 0); @@ -73,10 +73,10 @@ fn reclaim_indexing_on_new_accounts_should_work() { assert_eq!(Balances::lookup_index(4), None); assert_eq!(Balances::total_balance(&2), 256 * 20); - assert_ok!(Balances::transfer(&2, 5.into(), 256 * 20)); // account 2 becomes zombie freeing index 1 for reclaim) + assert_ok!(Balances::transfer(Some(2).into(), 5.into(), 256 * 20)); // account 2 becomes zombie freeing index 1 for reclaim) assert_eq!(Balances::total_balance(&2), 0); - assert_ok!(Balances::transfer(&5, 6.into(), 256 * 1 + 0x69)); // account 6 takes index 1. + assert_ok!(Balances::transfer(Some(5).into(), 6.into(), 256 * 1 + 0x69)); // account 6 takes index 1. assert_eq!(Balances::total_balance(&6), 256 * 1 + 0x69); assert_eq!(Balances::lookup_index(1), Some(6)); }); @@ -95,7 +95,7 @@ fn reserved_balance_should_prevent_reclaim_count() { assert_eq!(Balances::total_balance(&2), 256 * 19 + 1); // reserve still exists. assert_eq!(System::account_nonce(&2), 1); - assert_ok!(Balances::transfer(&4, 5.into(), 256 * 1 + 0x69)); // account 4 tries to take index 1 for account 5. + assert_ok!(Balances::transfer(Some(4).into(), 5.into(), 256 * 1 + 0x69)); // account 4 tries to take index 1 for account 5. assert_eq!(Balances::total_balance(&5), 256 * 1 + 0x69); assert_eq!(Balances::lookup_index(1), Some(2)); // but fails. assert_eq!(System::account_nonce(&2), 1); @@ -104,7 +104,7 @@ fn reserved_balance_should_prevent_reclaim_count() { assert_eq!(Balances::total_balance(&2), 0); // "free" account deleted." assert_eq!(System::account_nonce(&2), 0); - assert_ok!(Balances::transfer(&4, 6.into(), 256 * 1 + 0x69)); // account 4 tries to take index 1 again for account 6. + assert_ok!(Balances::transfer(Some(4).into(), 6.into(), 256 * 1 + 0x69)); // account 4 tries to take index 1 again for account 6. assert_eq!(Balances::total_balance(&6), 256 * 1 + 0x69); assert_eq!(Balances::lookup_index(1), Some(6)); // and succeeds. }); @@ -128,7 +128,7 @@ fn balance_transfer_works() { with_externalities(&mut new_test_ext(0, false), || { Balances::set_free_balance(&1, 111); Balances::increase_total_stake_by(111); - assert_ok!(Balances::transfer(&1, 2.into(), 69)); + assert_ok!(Balances::transfer(Some(1).into(), 2.into(), 69)); assert_eq!(Balances::total_balance(&1), 42); assert_eq!(Balances::total_balance(&2), 69); }); @@ -156,7 +156,7 @@ fn balance_transfer_when_reserved_should_not_work() { with_externalities(&mut new_test_ext(0, false), || { Balances::set_free_balance(&1, 111); assert_ok!(Balances::reserve(&1, 69)); - assert_noop!(Balances::transfer(&1, 2.into(), 69), "balance too low to send value"); + assert_noop!(Balances::transfer(Some(1).into(), 2.into(), 69), "balance too low to send value"); }); } @@ -287,7 +287,7 @@ fn transferring_too_high_value_should_not_panic() { >::insert(2, 1); assert_err!( - Balances::transfer(&1, 2.into(), u64::max_value()), + Balances::transfer(Some(1).into(), 2.into(), u64::max_value()), "destination balance too high to receive value" ); @@ -313,7 +313,7 @@ fn account_removal_on_free_too_low() { // Transfer funds from account 1 of such amount that after this transfer // the balance of account 1 will be below the exsistential threshold. // This should lead to the removal of all balance of this account. - assert_ok!(Balances::transfer(&1, 2.into(), 20)); + assert_ok!(Balances::transfer(Some(1).into(), 2.into(), 20)); // Verify free balance removal of account 1. assert_eq!(Balances::free_balance(&1), 0); diff --git a/substrate/runtime/consensus/src/lib.rs b/substrate/runtime/consensus/src/lib.rs index add01fa3cfb43..1881d2cb87529 100644 --- a/substrate/runtime/consensus/src/lib.rs +++ b/substrate/runtime/consensus/src/lib.rs @@ -144,7 +144,7 @@ decl_module! { pub struct Module; #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum Call where aux: T::PublicAux { + pub enum Call where aux: T::Origin { fn report_misbehavior(aux, report: MisbehaviorReport) -> Result; fn note_offline(aux, offline_val_indices: Vec) -> Result; fn remark(aux, remark: Vec) -> Result; @@ -178,7 +178,7 @@ impl Module { } /// Report some misbehaviour. - fn report_misbehavior(_aux: &T::PublicAux, _report: MisbehaviorReport) -> Result { + fn report_misbehavior(_aux: T::Origin, _report: MisbehaviorReport) -> Result { // TODO. Ok(()) } @@ -186,7 +186,7 @@ impl Module { /// Note the previous block's validator missed their opportunity to propose a block. This only comes in /// if 2/3+1 of the validators agree that no proposal was submitted. It's only relevant /// for the previous block. - fn note_offline(aux: &T::PublicAux, offline_val_indices: Vec) -> Result { + fn note_offline(aux: T::Origin, offline_val_indices: Vec) -> Result { assert!(aux.is_empty()); assert!( >::extrinsic_index() == Some(T::NOTE_OFFLINE_POSITION), @@ -202,7 +202,7 @@ impl Module { } /// Make some on-chain remark. - fn remark(_aux: &T::PublicAux, _remark: Vec) -> Result { + fn remark(_aux: T::Origin, _remark: Vec) -> Result { Ok(()) } diff --git a/substrate/runtime/contract/src/lib.rs b/substrate/runtime/contract/src/lib.rs index 6092787cfddb9..85f5ba8ce5843 100644 --- a/substrate/runtime/contract/src/lib.rs +++ b/substrate/runtime/contract/src/lib.rs @@ -122,7 +122,7 @@ decl_module! { pub struct Module; #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum Call where aux: T::PublicAux { + pub enum Call where aux: T::Origin { // TODO: Change AccountId to staking::Address fn call( aux, @@ -181,7 +181,7 @@ impl double_map::StorageDoubleMap for StorageOf { impl Module { /// Make a call to a specified account, optionally transferring some balance. fn call( - aux: &::PublicAux, + aux: ::Origin, dest: T::AccountId, value: T::Balance, gas_limit: T::Gas, @@ -226,7 +226,7 @@ impl Module { /// after the execution is saved as the `code` of the account. That code will be invoked /// upon any message received by this account. fn create( - aux: &::PublicAux, + aux: ::Origin, endowment: T::Balance, gas_limit: T::Gas, ctor_code: Vec, diff --git a/substrate/runtime/contract/src/tests.rs b/substrate/runtime/contract/src/tests.rs index f96a6fd2c5133..32c8ebcf32c49 100644 --- a/substrate/runtime/contract/src/tests.rs +++ b/substrate/runtime/contract/src/tests.rs @@ -30,7 +30,7 @@ use { #[derive(Clone, Eq, PartialEq)] pub struct Test; impl system::Trait for Test { - type PublicAux = Self::AccountId; + type Origin = Self::AccountId; type Index = u64; type BlockNumber = u64; type Hash = H256; diff --git a/substrate/runtime/council/src/lib.rs b/substrate/runtime/council/src/lib.rs index 8672a581fe2c8..eac6ec8b5063d 100644 --- a/substrate/runtime/council/src/lib.rs +++ b/substrate/runtime/council/src/lib.rs @@ -109,7 +109,7 @@ decl_module! { pub struct Module; #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum Call where aux: T::PublicAux { + pub enum Call where aux: T::Origin { fn set_approvals(aux, votes: Vec, index: VoteIndex) -> Result; fn reap_inactive_voter(aux, signed_index: u32, who: Address, who_index: u32, assumed_vote_index: VoteIndex) -> Result; fn retract_voter(aux, index: u32) -> Result; @@ -235,7 +235,7 @@ impl Module { /// Set candidate approvals. Approval slots stay valid as long as candidates in those slots /// are registered. - fn set_approvals(aux: &T::PublicAux, votes: Vec, index: VoteIndex) -> Result { + fn set_approvals(aux: T::Origin, votes: Vec, index: VoteIndex) -> Result { ensure!(!Self::presentation_active(), "no approval changes during presentation period"); ensure!(index == Self::vote_index(), "incorrect vote index"); if !>::exists(aux.ref_into()) { @@ -260,7 +260,7 @@ impl Module { /// /// May be called by anyone. Returns the voter deposit to `signed`. fn reap_inactive_voter( - aux: &T::PublicAux, + aux: T::Origin, signed_index: u32, who: Address, who_index: u32, @@ -304,7 +304,7 @@ impl Module { } /// Remove a voter. All votes are cancelled and the voter deposit is returned. - fn retract_voter(aux: &T::PublicAux, index: u32) -> Result { + fn retract_voter(aux: T::Origin, index: u32) -> Result { ensure!(!Self::presentation_active(), "cannot retract when presenting"); ensure!(>::exists(aux.ref_into()), "cannot retract non-voter"); let voters = Self::voters(); @@ -320,7 +320,7 @@ impl Module { /// Submit oneself for candidacy. /// /// Account must have enough transferrable funds in it to pay the bond. - fn submit_candidacy(aux: &T::PublicAux, slot: u32) -> Result { + fn submit_candidacy(aux: T::Origin, slot: u32) -> Result { ensure!(!Self::is_a_candidate(aux.ref_into()), "duplicate candidate submission"); let slot = slot as usize; let count = Self::candidate_count() as usize; @@ -350,7 +350,7 @@ impl Module { /// Only works if the `block_number >= current_vote().0` and `< current_vote().0 + presentation_duration()`` /// `signed` should have at least fn present_winner( - aux: &T::PublicAux, + aux: T::Origin, candidate: Address, total: T::Balance, index: VoteIndex @@ -634,7 +634,7 @@ mod tests { #[derive(Clone, Eq, PartialEq, Debug, Serialize, Deserialize)] pub struct Test; impl system::Trait for Test { - type PublicAux = Self::AccountId; + type Origin = Self::AccountId; type Index = u64; type BlockNumber = u64; type Hash = H256; diff --git a/substrate/runtime/council/src/voting.rs b/substrate/runtime/council/src/voting.rs index 41910d2074a02..b5f07b660e717 100644 --- a/substrate/runtime/council/src/voting.rs +++ b/substrate/runtime/council/src/voting.rs @@ -29,7 +29,7 @@ decl_module! { pub struct Module; #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum Call where aux: T::PublicAux { + pub enum Call where aux: T::Origin { fn propose(aux, proposal: Box) -> Result; fn vote(aux, proposal: T::Hash, approve: bool) -> Result; fn veto(aux, proposal_hash: T::Hash) -> Result; @@ -78,7 +78,7 @@ impl Module { } // Dispatch - fn propose(aux: &T::PublicAux, proposal: Box) -> Result { + fn propose(aux: T::Origin, proposal: Box) -> Result { let expiry = >::block_number() + Self::voting_period(); ensure!(Self::will_still_be_councillor_at(aux.ref_into(), expiry), "proposer would not be on council"); @@ -98,7 +98,7 @@ impl Module { Ok(()) } - fn vote(aux: &T::PublicAux, proposal: T::Hash, approve: bool) -> Result { + fn vote(aux: T::Origin, proposal: T::Hash, approve: bool) -> Result { if Self::vote_of((proposal, aux.ref_into().clone())).is_none() { let mut voters = Self::proposal_voters(&proposal); voters.push(aux.ref_into().clone()); @@ -108,7 +108,7 @@ impl Module { Ok(()) } - fn veto(aux: &T::PublicAux, proposal_hash: T::Hash) -> Result { + fn veto(aux: T::Origin, proposal_hash: T::Hash) -> Result { ensure!(Self::is_councillor(aux.ref_into()), "only councillors may veto council proposals"); ensure!(>::exists(&proposal_hash), "proposal must exist to be vetoed"); diff --git a/substrate/runtime/democracy/src/lib.rs b/substrate/runtime/democracy/src/lib.rs index b68c072d15ba2..059d61f7700d4 100644 --- a/substrate/runtime/democracy/src/lib.rs +++ b/substrate/runtime/democracy/src/lib.rs @@ -66,7 +66,7 @@ decl_module! { pub struct Module; #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum Call where aux: T::PublicAux { + pub enum Call where aux: T::Origin { fn propose(aux, proposal: Box, value: T::Balance) -> Result; fn second(aux, proposal: PropIndex) -> Result; fn vote(aux, ref_index: ReferendumIndex, approve_proposal: bool) -> Result; @@ -156,7 +156,7 @@ impl Module { // dispatching. /// Propose a sensitive action to be taken. - fn propose(aux: &T::PublicAux, proposal: Box, value: T::Balance) -> Result { + fn propose(aux: T::Origin, proposal: Box, value: T::Balance) -> Result { ensure!(value >= Self::minimum_deposit(), "value too low"); >::reserve(aux.ref_into(), value) .map_err(|_| "proposer's balance too low")?; @@ -172,7 +172,7 @@ impl Module { } /// Propose a sensitive action to be taken. - fn second(aux: &T::PublicAux, proposal: PropIndex) -> Result { + fn second(aux: T::Origin, proposal: PropIndex) -> Result { let mut deposit = Self::deposit_of(proposal) .ok_or("can only second an existing proposal")?; >::reserve(aux.ref_into(), deposit.0) @@ -184,7 +184,7 @@ impl Module { /// Vote in a referendum. If `approve_proposal` is true, the vote is to enact the proposal; /// false would be a vote to keep the status quo.. - fn vote(aux: &T::PublicAux, ref_index: ReferendumIndex, approve_proposal: bool) -> Result { + fn vote(aux: T::Origin, ref_index: ReferendumIndex, approve_proposal: bool) -> Result { ensure!(Self::is_active_referendum(ref_index), "vote given for invalid referendum."); ensure!(!>::total_balance(aux.ref_into()).is_zero(), "transactor must have balance to signal approval."); @@ -366,7 +366,7 @@ mod tests { #[derive(Clone, Eq, PartialEq, Debug, Serialize, Deserialize)] pub struct Test; impl system::Trait for Test { - type PublicAux = Self::AccountId; + type Origin = Self::AccountId; type Index = u64; type BlockNumber = u64; type Hash = H256; diff --git a/substrate/runtime/example/src/lib.rs b/substrate/runtime/example/src/lib.rs index aa17511869572..c2935da14f643 100644 --- a/substrate/runtime/example/src/lib.rs +++ b/substrate/runtime/example/src/lib.rs @@ -93,11 +93,11 @@ decl_module! { // // When you come to `impl` them later in the module, you must specify the full type for `aux`: // - // `fn foo(aux: T::PublicAux, bar: Bar, baz: Baz) { ... }` + // `fn foo(aux: T::Origin, bar: Bar, baz: Baz) { ... }` // // This is your public interface. Be extremely careful. #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum Call where aux: T::PublicAux { + pub enum Call where aux: T::Origin { // This is just a simple example of how to interact with the module from the external // world. fn accumulate_dummy(aux, increase_by: T::Balance) -> Result; @@ -227,7 +227,7 @@ impl Module { // no progress. // // If you don't respect these rules, it is likely that your chain will be attackable. - fn accumulate_dummy(_aux: &T::PublicAux, increase_by: T::Balance) -> Result { + fn accumulate_dummy(_aux: T::Origin, increase_by: T::Balance) -> Result { // Read the value of dummy from storage. let dummy = Self::dummy(); // Will also work using the `::get` on the storage item type iself: @@ -329,7 +329,7 @@ mod tests { #[derive(Clone, Eq, PartialEq)] pub struct Test; impl system::Trait for Test { - type PublicAux = Self::AccountId; + type Origin = Self::AccountId; type Index = u64; type BlockNumber = u64; type Hash = H256; diff --git a/substrate/runtime/executive/Cargo.toml b/substrate/runtime/executive/Cargo.toml index 74a10d18f8642..f4d9fbf25f2ee 100644 --- a/substrate/runtime/executive/Cargo.toml +++ b/substrate/runtime/executive/Cargo.toml @@ -18,10 +18,6 @@ substrate-runtime-system = { path = "../system", default_features = false } [dev-dependencies] substrate-primitives = { path = "../../primitives" } substrate-runtime-balances = { path = "../balances" } -substrate-runtime-session = { path = "../session" } -substrate-runtime-staking = { path = "../staking" } -substrate-runtime-consensus = { path = "../consensus" } -substrate-runtime-timestamp = { path = "../timestamp" } [features] default = ["std"] diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index 9e0db49391fa2..1cd851f03cc79 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -24,10 +24,6 @@ extern crate serde; #[macro_use] extern crate serde_derive; -#[cfg(test)] -#[macro_use] -extern crate substrate_codec_derive; - #[cfg_attr(test, macro_use)] extern crate substrate_runtime_support as runtime_support; @@ -37,9 +33,6 @@ extern crate substrate_codec as codec; extern crate substrate_runtime_primitives as primitives; extern crate substrate_runtime_system as system; -#[cfg(test)] -extern crate substrate_runtime_timestamp as timestamp; - #[cfg(test)] #[macro_use] extern crate hex_literal; @@ -47,18 +40,9 @@ extern crate hex_literal; #[cfg(test)] extern crate substrate_primitives; -#[cfg(test)] -extern crate substrate_runtime_consensus as consensus; - -#[cfg(test)] -extern crate substrate_runtime_session as session; - #[cfg(test)] extern crate substrate_runtime_balances as balances; -#[cfg(test)] -extern crate substrate_runtime_staking as staking; - use rstd::prelude::*; use rstd::marker::PhantomData; use rstd::result; @@ -244,30 +228,37 @@ mod tests { } } + impl_outer_origin! { + pub enum Origin for Runtime { + } + } + impl From> for Origin { + fn from(s: Option) -> Origin { + match s { + Some(who) => Origin::system(system::Origin::Signed(who)), + None => Origin::system(system::Origin::Inherent), + } + } + } + impl_outer_event!{ - pub enum MetaEvent for Test { - balances, session, staking + pub enum MetaEvent for Runtime { + balances } } // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, Eq, PartialEq, Debug, Serialize, Deserialize)] - pub struct Test; - impl consensus::Trait for Test { - const NOTE_OFFLINE_POSITION: u32 = 1; - type Log = u64; - type SessionKey = u64; - type OnOfflineValidator = staking::Module; - } - impl balances::Trait for Test { + pub struct Runtime; + impl balances::Trait for Runtime { type Balance = u64; type AccountIndex = u64; - type OnFreeBalanceZero = staking::Module; - type EnsureAccountLiquid = staking::Module; + type OnFreeBalanceZero = staking::Module; + type EnsureAccountLiquid = staking::Module; type Event = MetaEvent; } - impl system::Trait for Test { - type PublicAux = Self::AccountId; + impl system::Trait for Runtime { + type Origin = Origin; type Index = u64; type BlockNumber = u64; type Hash = substrate_primitives::H256; @@ -277,27 +268,14 @@ mod tests { type Header = Header; type Event = MetaEvent; } - impl session::Trait for Test { - type ConvertAccountIdToSessionKey = Identity; - type OnSessionChange = staking::Module; - type Event = MetaEvent; - } - impl staking::Trait for Test { - type OnRewardMinted = (); - type Event = MetaEvent; - } - impl timestamp::Trait for Test { - const TIMESTAMP_SET_POSITION: u32 = 0; - type Moment = u64; - } - type TestXt = primitives::testing::TestXt>; - type Executive = super::Executive, NullLookup, balances::Module, (session::Module, staking::Module)>; + type TestXt = primitives::testing::TestXt>; + type Executive = super::Executive, NullLookup, balances::Module, ()>; #[test] - fn staking_balance_transfer_dispatch_works() { - let mut t = system::GenesisConfig::::default().build_storage().unwrap(); - t.extend(balances::GenesisConfig:: { + fn balance_transfer_dispatch_works() { + let mut t = system::GenesisConfig::::default().build_storage().unwrap(); + t.extend(balances::GenesisConfig:: { balances: vec![(1, 111)], transaction_base_fee: 10, transaction_byte_fee: 0, @@ -306,34 +284,19 @@ mod tests { creation_fee: 0, reclaim_rebate: 0, }.build_storage().unwrap()); - t.extend(staking::GenesisConfig:: { - sessions_per_era: 0, - current_era: 0, - intentions: vec![], - validator_count: 0, - minimum_validator_count: 0, - bonding_duration: 0, - early_era_slash: 0, - session_reward: 0, - offline_slash_grace: 0, - }.build_storage().unwrap()); let xt = primitives::testing::TestXt((1, 0, Call::transfer(2.into(), 69))); let mut t = runtime_io::TestExternalities::from(t); with_externalities(&mut t, || { Executive::initialise_block(&Header::new(1, H256::default(), H256::default(), [69u8; 32].into(), Digest::default())); Executive::apply_extrinsic(xt).unwrap(); - assert_eq!(>::total_balance(&1), 32); - assert_eq!(>::total_balance(&2), 69); + assert_eq!(>::total_balance(&1), 32); + assert_eq!(>::total_balance(&2), 69); }); } fn new_test_ext() -> runtime_io::TestExternalities { - let mut t = system::GenesisConfig::::default().build_storage().unwrap(); - t.extend(balances::GenesisConfig::::default().build_storage().unwrap()); - t.extend(consensus::GenesisConfig::::default().build_storage().unwrap()); - t.extend(session::GenesisConfig::::default().build_storage().unwrap()); - t.extend(staking::GenesisConfig::::default().build_storage().unwrap()); - t.extend(timestamp::GenesisConfig::::default().build_storage().unwrap()); + let mut t = system::GenesisConfig::::default().build_storage().unwrap(); + t.extend(balances::GenesisConfig::::default().build_storage().unwrap()); t.into() } @@ -397,7 +360,7 @@ mod tests { with_externalities(&mut t, || { Executive::initialise_block(&Header::new(1, H256::default(), H256::default(), [69u8; 32].into(), Digest::default())); assert!(Executive::apply_extrinsic(xt).is_err()); - assert_eq!(>::extrinsic_index(), Some(0)); + assert_eq!(>::extrinsic_index(), Some(0)); }); } } diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs deleted file mode 100644 index 6305bac8d6c99..0000000000000 --- a/substrate/runtime/primitives/src/generic.rs +++ /dev/null @@ -1,514 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// 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 . - -//! Generic implementations of Extrinsic/Header/Block. - -#[cfg(feature = "std")] -use std::fmt; - -#[cfg(feature = "std")] -use serde::{Deserialize, Deserializer}; - -use rstd::prelude::*; -use codec::{Decode, Encode, Codec, Input, Output}; -use runtime_support::AuxDispatchable; -use traits::{self, Member, SimpleArithmetic, SimpleBitOps, MaybeDisplay, Block as BlockT, - Header as HeaderT, Hash as HashT, DigestItem as DigestItemT}; -use rstd::ops; -use bft::Justification; - -/// Definition of something that the external world might want to say. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub struct Extrinsic { - /// Who signed it (note this is not a signature). - pub signed: Address, - /// The number of extrinsics have come before from the same signer. - pub index: Index, - /// The function that should be called. - pub function: Call, -} - -/// A extrinsic right from the external world. Unchecked. -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -pub struct UncheckedExtrinsic { - /// The actual extrinsic information. - pub extrinsic: Extrinsic, - /// The signature. - pub signature: Signature, -} - -impl UncheckedExtrinsic { - /// New instance. - pub fn new(extrinsic: Extrinsic, signature: Signature) -> Self { - UncheckedExtrinsic { - extrinsic, - signature, - } - } -} - -impl UncheckedExtrinsic> where - Signature: traits::Verify + Default + Eq, - AccountId: Default + Eq, -{ - /// `true` if this extrinsic is signed. - pub fn is_signed(&self) -> bool { - self.signature.is_signed() - } -} - -impl traits::Checkable - for UncheckedExtrinsic> -where - Address: Member + Default + MaybeDisplay, - Index: Member + MaybeDisplay + SimpleArithmetic, - Call: Member, - Signature: traits::Verify + Eq + Default, - AccountId: Member + Default + MaybeDisplay, - ::MaybeUnsigned: Member, - Extrinsic: Codec, - ThisLookup: FnOnce(Address) -> Result, -{ - type Checked = CheckedExtrinsic; - - fn check_with(self, lookup: ThisLookup) -> Result { - if !self.is_signed() { - Ok(CheckedExtrinsic(Extrinsic { - signed: Default::default(), - index: self.extrinsic.index, - function: self.extrinsic.function, - })) - } else { - let extrinsic: Extrinsic - = Extrinsic { - signed: lookup(self.extrinsic.signed)?, - index: self.extrinsic.index, - function: self.extrinsic.function, - }; - if ::verify_encoded_lazy(&self.signature, &extrinsic, &extrinsic.signed) { - Ok(CheckedExtrinsic(extrinsic)) - } else { - Err("bad signature in extrinsic") - } - } - } -} - -impl Decode - for UncheckedExtrinsic -where - Signature: Decode, - Extrinsic: Decode, -{ - fn decode(input: &mut I) -> Option { - // This is a little more complicated than usual since the binary format must be compatible - // with substrate's generic `Vec` type. Basically this just means accepting that there - // will be a prefix of u32, which has the total number of bytes following (we don't need - // to use this). - let _length_do_not_remove_me_see_above: u32 = Decode::decode(input)?; - - Some(UncheckedExtrinsic::new( - Decode::decode(input)?, - Decode::decode(input)? - )) - } -} - -impl Encode - for UncheckedExtrinsic -where - Signature: Encode, - Extrinsic: Encode, -{ - fn encode(&self) -> Vec { - let mut v = Vec::new(); - - // need to prefix with the total length as u32 to ensure it's binary comptible with - // Vec. we'll make room for it here, then overwrite once we know the length. - v.extend(&[0u8; 4]); - - self.extrinsic.encode_to(&mut v); - self.signature.encode_to(&mut v); - - let length = (v.len() - 4) as u32; - length.using_encoded(|s| v[0..4].copy_from_slice(s)); - - v - } -} - -/// TODO: use derive when possible. -#[cfg(feature = "std")] -impl fmt::Debug for UncheckedExtrinsic where - Address: fmt::Debug, - Index: fmt::Debug, - Call: fmt::Debug, -{ - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "UncheckedExtrinsic({:?})", self.extrinsic) - } -} - -/// A type-safe indicator that a extrinsic has been checked. -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub struct CheckedExtrinsic - (Extrinsic); - -impl ops::Deref - for CheckedExtrinsic -where - AccountId: Member + MaybeDisplay, - Index: Member + MaybeDisplay + SimpleArithmetic, - Call: Member, -{ - type Target = Extrinsic; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -impl traits::Applyable - for CheckedExtrinsic -where - AccountId: Member + MaybeDisplay, - Index: Member + MaybeDisplay + SimpleArithmetic, - Call: Member + AuxDispatchable, -{ - type Index = Index; - type AccountId = AccountId; - - fn index(&self) -> &Self::Index { - &self.0.index - } - - fn sender(&self) -> &Self::AccountId { - &self.0.signed - } - - fn apply(self) -> Result<(), &'static str> { - let xt = self.0; - xt.function.dispatch(&xt.signed) - } -} - -#[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -pub struct Digest { - pub logs: Vec, -} - -impl Default for Digest { - fn default() -> Self { - Digest { logs: Vec::new(), } - } -} - -impl traits::Digest for Digest where - Item: DigestItemT + Codec -{ - type Item = Item; - - fn logs(&self) -> &[Self::Item] { - &self.logs - } - - fn push(&mut self, item: Self::Item) { - self.logs.push(item); - } -} - - -/// Abstraction over a block header for a substrate chain. -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Debug, Serialize))] -#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] -#[cfg_attr(feature = "std", serde(deny_unknown_fields))] -pub struct Header { - /// The parent hash. - pub parent_hash: ::Output, - /// The block number. - pub number: Number, - /// The state trie merkle root - pub state_root: ::Output, - /// The merkle root of the extrinsics. - pub extrinsics_root: ::Output, - /// A chain-specific digest of data useful for light clients or referencing auxiliary data. - pub digest: Digest, -} - -// Hack to work around the fact that deriving deserialize doesn't work nicely with -// the `hashing` trait used as a parameter. -// dummy struct that uses the hash type directly. -// https://github.com/serde-rs/serde/issues/1296 -#[cfg(feature = "std")] -#[serde(rename_all = "camelCase")] -#[derive(Deserialize)] -struct DeserializeHeader { - parent_hash: H, - number: N, - state_root: H, - extrinsics_root: H, - digest: Digest, -} - -#[cfg(feature = "std")] -impl From> for Header { - fn from(other: DeserializeHeader) -> Self { - Header { - parent_hash: other.parent_hash, - number: other.number, - state_root: other.state_root, - extrinsics_root: other.extrinsics_root, - digest: other.digest, - } - } -} - -#[cfg(feature = "std")] -impl<'a, Number: 'a, Hash: 'a + HashT, DigestItem: 'a> Deserialize<'a> for Header where - Number: Deserialize<'a>, - Hash::Output: Deserialize<'a>, - DigestItem: Deserialize<'a>, -{ - fn deserialize>(de: D) -> Result { - DeserializeHeader::::deserialize(de).map(Into::into) - } -} - -// TODO [ToDr] Issue with bounds -impl Decode for Header where - Number: Decode, - Hash: HashT, - Hash::Output: Decode, - DigestItem: Decode, -{ - fn decode(input: &mut I) -> Option { - Some(Header { - parent_hash: Decode::decode(input)?, - number: Decode::decode(input)?, - state_root: Decode::decode(input)?, - extrinsics_root: Decode::decode(input)?, - digest: Decode::decode(input)?, - }) - } -} - -impl Encode for Header where - Number: Encode, - Hash: HashT, - Hash::Output: Encode, - DigestItem: Encode, -{ - fn encode_to(&self, dest: &mut T) { - dest.push(&self.parent_hash); - dest.push(&self.number); - dest.push(&self.state_root); - dest.push(&self.extrinsics_root); - dest.push(&self.digest); - } -} - -impl traits::Header for Header where - Number: Member + ::rstd::hash::Hash + Copy + Codec + MaybeDisplay + SimpleArithmetic + Codec, - Hash: HashT, - DigestItem: DigestItemT + Codec, - Hash::Output: Default + ::rstd::hash::Hash + Copy + Member + MaybeDisplay + SimpleBitOps + Codec, - { - type Number = Number; - type Hash = ::Output; - type Hashing = Hash; - type Digest = Digest; - - fn number(&self) -> &Self::Number { &self.number } - fn set_number(&mut self, num: Self::Number) { self.number = num } - - fn extrinsics_root(&self) -> &Self::Hash { &self.extrinsics_root } - fn set_extrinsics_root(&mut self, root: Self::Hash) { self.extrinsics_root = root } - - fn state_root(&self) -> &Self::Hash { &self.state_root } - fn set_state_root(&mut self, root: Self::Hash) { self.state_root = root } - - fn parent_hash(&self) -> &Self::Hash { &self.parent_hash } - fn set_parent_hash(&mut self, hash: Self::Hash) { self.parent_hash = hash } - - fn digest(&self) -> &Self::Digest { &self.digest } - fn set_digest(&mut self, digest: Self::Digest) { self.digest = digest } - - fn new( - number: Self::Number, - extrinsics_root: Self::Hash, - state_root: Self::Hash, - parent_hash: Self::Hash, - digest: Self::Digest - ) -> Self { - Header { - number, extrinsics_root: extrinsics_root, state_root, parent_hash, digest - } - } -} - -impl Header where - Number: Member + ::rstd::hash::Hash + Copy + Codec + MaybeDisplay + SimpleArithmetic + Codec, - Hash: HashT, - DigestItem: DigestItemT + Codec, - Hash::Output: Default + ::rstd::hash::Hash + Copy + Member + MaybeDisplay + SimpleBitOps + Codec, - { - /// Convenience helper for computing the hash of the header without having - /// to import the trait. - pub fn hash(&self) -> Hash::Output { - Hash::hash_of(self) - } -} - -/// Something to identify a block. -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Debug, Serialize))] -#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] -#[cfg_attr(feature = "std", serde(deny_unknown_fields))] -pub enum BlockId { - /// Identify by block header hash. - Hash(<::Header as HeaderT>::Hash), - /// Identify by block number. - Number(<::Header as HeaderT>::Number), -} - -impl BlockId { - /// Create a block ID from a hash. - pub fn hash(hash: Block::Hash) -> Self { - BlockId::Hash(hash) - } - - /// Create a block ID from a number. - pub fn number(number: ::Number) -> Self { - BlockId::Number(number) - } -} - -impl Copy for BlockId {} - -#[cfg(feature = "std")] -impl fmt::Display for BlockId { - fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { - write!(f, "{:?}", self) - } -} - -/// Abstraction over a substrate block. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] -#[cfg_attr(feature = "std", serde(deny_unknown_fields))] -pub struct Block { - /// The block header. - pub header: Header, - /// The accompanying extrinsics. - pub extrinsics: Vec, -} - -impl traits::Block for Block -where - Header: HeaderT, - Extrinsic: Member + Codec, -{ - type Extrinsic = Extrinsic; - type Header = Header; - type Hash = ::Hash; - - fn header(&self) -> &Self::Header { - &self.header - } - fn extrinsics(&self) -> &[Self::Extrinsic] { - &self.extrinsics[..] - } - fn deconstruct(self) -> (Self::Header, Vec) { - (self.header, self.extrinsics) - } - fn new(header: Self::Header, extrinsics: Vec) -> Self { - Block { header, extrinsics } - } -} - -/// Abstraction over a substrate block and justification. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] -#[cfg_attr(feature = "std", serde(deny_unknown_fields))] -pub struct SignedBlock { - /// Full block. - pub block: Block, - /// Block header justification. - pub justification: Justification, -} - -#[cfg(test)] -mod tests { - use codec::{Decode, Encode}; - use substrate_primitives::{H256, H512}; - use super::{Digest, Header, UncheckedExtrinsic, Extrinsic}; - - type Block = super::Block< - Header>, - UncheckedExtrinsic, - >; - - #[test] - fn block_roundtrip_serialization() { - let block: Block = Block { - header: Header { - parent_hash: [0u8; 32].into(), - number: 100_000, - state_root: [1u8; 32].into(), - extrinsics_root: [2u8; 32].into(), - digest: Digest { logs: vec![vec![1, 2, 3], vec![4, 5, 6]] }, - }, - extrinsics: vec![ - UncheckedExtrinsic::new( - Extrinsic { - signed: [255u8; 32].into(), - index: 0, - function: 100, - }, - H512::from([0u8; 64]).into() - ), - UncheckedExtrinsic::new( - Extrinsic { - signed: [128u8; 32].into(), - index: 100, - function: 99, - }, - H512::from([255u8; 64]).into() - ) - ] - }; - - { - let encoded = ::serde_json::to_vec(&block).unwrap(); - let decoded: Block = ::serde_json::from_slice(&encoded).unwrap(); - - assert_eq!(block, decoded); - } - { - let encoded = block.encode(); - let decoded = Block::decode(&mut &encoded[..]).unwrap(); - - assert_eq!(block, decoded); - } - } -} diff --git a/substrate/runtime/primitives/src/generic/block.rs b/substrate/runtime/primitives/src/generic/block.rs new file mode 100644 index 0000000000000..5963a11fde0b7 --- /dev/null +++ b/substrate/runtime/primitives/src/generic/block.rs @@ -0,0 +1,105 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 . + +//! Generic implementations of Extrinsic/Header/Block. + +#[cfg(feature = "std")] +use std::fmt; + +use rstd::prelude::*; +use codec::Codec; +use traits::{self, Member, Block as BlockT, Header as HeaderT}; +use bft::Justification; + +/// Something to identify a block. +#[derive(PartialEq, Eq, Clone)] +#[cfg_attr(feature = "std", derive(Debug, Serialize))] +#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] +#[cfg_attr(feature = "std", serde(deny_unknown_fields))] +pub enum BlockId { + /// Identify by block header hash. + Hash(<::Header as HeaderT>::Hash), + /// Identify by block number. + Number(<::Header as HeaderT>::Number), +} + +impl BlockId { + /// Create a block ID from a hash. + pub fn hash(hash: Block::Hash) -> Self { + BlockId::Hash(hash) + } + + /// Create a block ID from a number. + pub fn number(number: ::Number) -> Self { + BlockId::Number(number) + } +} + +impl Copy for BlockId {} + +#[cfg(feature = "std")] +impl fmt::Display for BlockId { + fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { + write!(f, "{:?}", self) + } +} + +/// Abstraction over a substrate block. +#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] +#[cfg_attr(feature = "std", serde(deny_unknown_fields))] +pub struct Block { + /// The block header. + pub header: Header, + /// The accompanying extrinsics. + pub extrinsics: Vec, +} + +impl traits::Block for Block +where + Header: HeaderT, + Extrinsic: Member + Codec, +{ + type Extrinsic = Extrinsic; + type Header = Header; + type Hash = ::Hash; + + fn header(&self) -> &Self::Header { + &self.header + } + fn extrinsics(&self) -> &[Self::Extrinsic] { + &self.extrinsics[..] + } + fn deconstruct(self) -> (Self::Header, Vec) { + (self.header, self.extrinsics) + } + fn new(header: Self::Header, extrinsics: Vec) -> Self { + Block { header, extrinsics } + } +} + +/// Abstraction over a substrate block and justification. +#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] +#[cfg_attr(feature = "std", serde(deny_unknown_fields))] +pub struct SignedBlock { + /// Full block. + pub block: Block, + /// Block header justification. + pub justification: Justification, +} diff --git a/substrate/runtime/primitives/src/generic/checked_extrinsic.rs b/substrate/runtime/primitives/src/generic/checked_extrinsic.rs new file mode 100644 index 0000000000000..31e29beeb4911 --- /dev/null +++ b/substrate/runtime/primitives/src/generic/checked_extrinsic.rs @@ -0,0 +1,57 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 . + +//! Generic implementations of Extrinsic/Header/Block. + +use runtime_support::AuxDispatchable; +use traits::{self, Member, SimpleArithmetic, MaybeDisplay}; + +/// Definition of something that the external world might want to say; its existence implies that +/// it has been checked and is good. +#[derive(PartialEq, Eq, Clone)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +pub struct CheckedExtrinsic { + /// Who this purports to be from, if anyone (note this is not a signature). + pub signed: Option, + /// The number of extrinsics have come before from the same signer. + pub index: Index, + /// The function that should be called. + pub function: Call, +} + +impl traits::Applyable + for CheckedExtrinsic +where + AccountId: Member + MaybeDisplay, + Index: Member + MaybeDisplay + SimpleArithmetic, + Call: Member + AuxDispatchable, + ::Aux: From> +{ + type Index = Index; + type AccountId = AccountId; + + fn index(&self) -> &Self::Index { + &self.index + } + + fn sender(&self) -> Option<&Self::AccountId> { + self.signed.as_ref() + } + + fn apply(self) -> Result<(), &'static str> { + self.function.dispatch(self.signed.into()) // TODO gav: remove '&'. + } +} diff --git a/substrate/runtime/primitives/src/generic/header.rs b/substrate/runtime/primitives/src/generic/header.rs new file mode 100644 index 0000000000000..82fbbb1185b6e --- /dev/null +++ b/substrate/runtime/primitives/src/generic/header.rs @@ -0,0 +1,193 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 . + +//! Generic implementations of Extrinsic/Header/Block. + +#[cfg(feature = "std")] +use serde::{Deserialize, Deserializer}; + +use rstd::prelude::*; +use codec::{Decode, Encode, Codec, Input, Output}; +use traits::{self, Member, SimpleArithmetic, SimpleBitOps, MaybeDisplay, + Hash as HashT, DigestItem as DigestItemT}; + +#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +pub struct Digest { + pub logs: Vec, +} + +impl Default for Digest { + fn default() -> Self { + Digest { logs: Vec::new(), } + } +} + +impl traits::Digest for Digest where + Item: DigestItemT + Codec +{ + type Item = Item; + + fn logs(&self) -> &[Self::Item] { + &self.logs + } + + fn push(&mut self, item: Self::Item) { + self.logs.push(item); + } +} + +/// Abstraction over a block header for a substrate chain. +#[derive(PartialEq, Eq, Clone)] +#[cfg_attr(feature = "std", derive(Debug, Serialize))] +#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] +#[cfg_attr(feature = "std", serde(deny_unknown_fields))] +pub struct Header { + /// The parent hash. + pub parent_hash: ::Output, + /// The block number. + pub number: Number, + /// The state trie merkle root + pub state_root: ::Output, + /// The merkle root of the extrinsics. + pub extrinsics_root: ::Output, + /// A chain-specific digest of data useful for light clients or referencing auxiliary data. + pub digest: Digest, +} + +// Hack to work around the fact that deriving deserialize doesn't work nicely with +// the `hashing` trait used as a parameter. +// dummy struct that uses the hash type directly. +// https://github.com/serde-rs/serde/issues/1296 +#[cfg(feature = "std")] +#[serde(rename_all = "camelCase")] +#[derive(Deserialize)] +struct DeserializeHeader { + parent_hash: H, + number: N, + state_root: H, + extrinsics_root: H, + digest: Digest, +} + +#[cfg(feature = "std")] +impl From> for Header { + fn from(other: DeserializeHeader) -> Self { + Header { + parent_hash: other.parent_hash, + number: other.number, + state_root: other.state_root, + extrinsics_root: other.extrinsics_root, + digest: other.digest, + } + } +} + +#[cfg(feature = "std")] +impl<'a, Number: 'a, Hash: 'a + HashT, DigestItem: 'a> Deserialize<'a> for Header where + Number: Deserialize<'a>, + Hash::Output: Deserialize<'a>, + DigestItem: Deserialize<'a>, +{ + fn deserialize>(de: D) -> Result { + DeserializeHeader::::deserialize(de).map(Into::into) + } +} + +// TODO [ToDr] Issue with bounds +impl Decode for Header where + Number: Decode, + Hash: HashT, + Hash::Output: Decode, + DigestItem: Decode, +{ + fn decode(input: &mut I) -> Option { + Some(Header { + parent_hash: Decode::decode(input)?, + number: Decode::decode(input)?, + state_root: Decode::decode(input)?, + extrinsics_root: Decode::decode(input)?, + digest: Decode::decode(input)?, + }) + } +} + +impl Encode for Header where + Number: Encode, + Hash: HashT, + Hash::Output: Encode, + DigestItem: Encode, +{ + fn encode_to(&self, dest: &mut T) { + dest.push(&self.parent_hash); + dest.push(&self.number); + dest.push(&self.state_root); + dest.push(&self.extrinsics_root); + dest.push(&self.digest); + } +} + +impl traits::Header for Header where + Number: Member + ::rstd::hash::Hash + Copy + Codec + MaybeDisplay + SimpleArithmetic + Codec, + Hash: HashT, + DigestItem: DigestItemT + Codec, + Hash::Output: Default + ::rstd::hash::Hash + Copy + Member + MaybeDisplay + SimpleBitOps + Codec, + { + type Number = Number; + type Hash = ::Output; + type Hashing = Hash; + type Digest = Digest; + + fn number(&self) -> &Self::Number { &self.number } + fn set_number(&mut self, num: Self::Number) { self.number = num } + + fn extrinsics_root(&self) -> &Self::Hash { &self.extrinsics_root } + fn set_extrinsics_root(&mut self, root: Self::Hash) { self.extrinsics_root = root } + + fn state_root(&self) -> &Self::Hash { &self.state_root } + fn set_state_root(&mut self, root: Self::Hash) { self.state_root = root } + + fn parent_hash(&self) -> &Self::Hash { &self.parent_hash } + fn set_parent_hash(&mut self, hash: Self::Hash) { self.parent_hash = hash } + + fn digest(&self) -> &Self::Digest { &self.digest } + fn set_digest(&mut self, digest: Self::Digest) { self.digest = digest } + + fn new( + number: Self::Number, + extrinsics_root: Self::Hash, + state_root: Self::Hash, + parent_hash: Self::Hash, + digest: Self::Digest + ) -> Self { + Header { + number, extrinsics_root: extrinsics_root, state_root, parent_hash, digest + } + } +} + +impl Header where + Number: Member + ::rstd::hash::Hash + Copy + Codec + MaybeDisplay + SimpleArithmetic + Codec, + Hash: HashT, + DigestItem: DigestItemT + Codec, + Hash::Output: Default + ::rstd::hash::Hash + Copy + Member + MaybeDisplay + SimpleBitOps + Codec, + { + /// Convenience helper for computing the hash of the header without having + /// to import the trait. + pub fn hash(&self) -> Hash::Output { + Hash::hash_of(self) + } +} diff --git a/substrate/runtime/primitives/src/generic/mod.rs b/substrate/runtime/primitives/src/generic/mod.rs new file mode 100644 index 0000000000000..fd56cb4015421 --- /dev/null +++ b/substrate/runtime/primitives/src/generic/mod.rs @@ -0,0 +1,29 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 . + +//! Generic implementations of Extrinsic/Header/Block. + +mod unchecked_extrinsic; +mod checked_extrinsic; +mod header; +mod block; +#[cfg(test)] +mod tests; + +pub use self::unchecked_extrinsic::UncheckedExtrinsic; +pub use self::checked_extrinsic::CheckedExtrinsic; +pub use self::header::{Header, Digest}; +pub use self::block::{Block, SignedBlock, BlockId}; diff --git a/substrate/runtime/primitives/src/generic/tests.rs b/substrate/runtime/primitives/src/generic/tests.rs new file mode 100644 index 0000000000000..445e08beb5963 --- /dev/null +++ b/substrate/runtime/primitives/src/generic/tests.rs @@ -0,0 +1,66 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 . + +//! Generic implementations of Extrinsic/Header/Block. + +use codec::{Decode, Encode}; +use substrate_primitives::{H256, H512}; +use super::{Digest, Header, UncheckedExtrinsic}; + +type Block = super::Block< + Header>, + UncheckedExtrinsic, +>; + +#[test] +fn block_roundtrip_serialization() { + let block: Block = Block { + header: Header { + parent_hash: [0u8; 32].into(), + number: 100_000, + state_root: [1u8; 32].into(), + extrinsics_root: [2u8; 32].into(), + digest: Digest { logs: vec![vec![1, 2, 3], vec![4, 5, 6]] }, + }, + extrinsics: vec![ + UncheckedExtrinsic::new_signed( + 0, + 100, + [255u8; 32].into(), + H512::from([0u8; 64]).into() + ), + UncheckedExtrinsic::new_signed( + 100, + 99, + [128u8; 32].into(), + H512::from([255u8; 64]).into() + ) + ] + }; + + { + let encoded = ::serde_json::to_vec(&block).unwrap(); + let decoded: Block = ::serde_json::from_slice(&encoded).unwrap(); + + assert_eq!(block, decoded); + } + { + let encoded = block.encode(); + let decoded = Block::decode(&mut &encoded[..]).unwrap(); + + assert_eq!(block, decoded); + } +} diff --git a/substrate/runtime/primitives/src/generic/unchecked_extrinsic.rs b/substrate/runtime/primitives/src/generic/unchecked_extrinsic.rs new file mode 100644 index 0000000000000..39b91084baac3 --- /dev/null +++ b/substrate/runtime/primitives/src/generic/unchecked_extrinsic.rs @@ -0,0 +1,158 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 . + +//! Generic implementations of Extrinsic/Header/Block. + +#[cfg(feature = "std")] +use std::fmt; + +use rstd::prelude::*; +use codec::{Decode, Encode, Input}; +use traits::{self, Member, SimpleArithmetic, MaybeDisplay}; +use super::CheckedExtrinsic; + +/// A extrinsic right from the external world. Unchecked. +#[derive(PartialEq, Eq, Clone)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +pub struct UncheckedExtrinsic { + /// The signature. + pub signature: Option<(Address, Signature)>, + /// The number of extrinsics have come before from the same signer. + pub index: Index, + /// The function that should be called. + pub function: Call, +} + +impl UncheckedExtrinsic { + /// New instance of a signed extrinsic aka "transaction". + pub fn new_signed(index: Index, function: Call, signed: Address, signature: Signature) -> Self { + UncheckedExtrinsic { + signature: Some((signed, signature)), + index, + function, + } + } + + /// New instance of an unsigned extrinsic aka "inherent". + pub fn new_unsigned(index: Index, function: Call) -> Self { + UncheckedExtrinsic { + signature: None, + index, + function, + } + } + + /// `true` if there is a signature. + pub fn is_signed(&self) -> bool { + self.signature.is_some() + } +} + +impl traits::Checkable + for UncheckedExtrinsic +where + Address: Member + MaybeDisplay, + Index: Encode + Member + MaybeDisplay + SimpleArithmetic, + Call: Encode + Member, + Signature: Member + traits::Verify, + AccountId: Member + MaybeDisplay, + ThisLookup: FnOnce(Address) -> Result, +{ + type Checked = CheckedExtrinsic; + + fn check_with(self, lookup: ThisLookup) -> Result { + Ok(match self.signature { + Some((signed, signature)) => { + let payload = (self.index, self.function); + let signed = lookup(signed)?; + if !::verify_encoded_lazy(&signature, &payload, &signed) { + return Err("bad signature in extrinsic") + } + CheckedExtrinsic { + signed: Some(signed), + index: payload.0, + function: payload.1, + } + } + None => CheckedExtrinsic { + signed: None, + index: self.index, + function: self.function, + }, + }) + } +} + +impl Decode + for UncheckedExtrinsic +where + Address: Decode, + Signature: Decode, + Index: Decode, + Call: Decode, +{ + fn decode(input: &mut I) -> Option { + // This is a little more complicated than usual since the binary format must be compatible + // with substrate's generic `Vec` type. Basically this just means accepting that there + // will be a prefix of u32, which has the total number of bytes following (we don't need + // to use this). + let _length_do_not_remove_me_see_above: u32 = Decode::decode(input)?; + + Some(UncheckedExtrinsic { + signature: Decode::decode(input)?, + index: Decode::decode(input)?, + function: Decode::decode(input)?, + }) + } +} + +impl Encode + for UncheckedExtrinsic +where + Address: Encode, + Signature: Encode, + Index: Encode, + Call: Encode, +{ + fn encode(&self) -> Vec { + let mut v = Vec::new(); + + // need to prefix with the total length as u32 to ensure it's binary comptible with + // Vec. we'll make room for it here, then overwrite once we know the length. + v.extend(&[0u8; 4]); + + self.signature.encode_to(&mut v); + self.index.encode_to(&mut v); + self.function.encode_to(&mut v); + + let length = (v.len() - 4) as u32; + length.using_encoded(|s| v[0..4].copy_from_slice(s)); + + v + } +} + +/// TODO: use derive when possible. +#[cfg(feature = "std")] +impl fmt::Debug for UncheckedExtrinsic where + Address: fmt::Debug, + Index: fmt::Debug, + Call: fmt::Debug, +{ + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "UncheckedExtrinsic({:?}, {:?}, {:?})", self.signature.as_ref().map(|x| &x.0), self.function, self.index) + } +} diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index 87553942b921e..6bea27f4d6acc 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -146,44 +146,6 @@ impl codec::Encode for ApplyError { /// Result from attempt to apply an extrinsic. pub type ApplyResult = Result; -/// Potentially "unsigned" signature verification. -#[derive(Eq, PartialEq, Clone, Default, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -pub struct MaybeUnsigned(pub T); - -impl MaybeUnsigned where - T: Default + Eq, - ::Signer: Default + Eq, -{ - fn is_signed(&self) -> bool { - self.0 != T::default() - } - - fn is_addressed(&self, signer: &::Signer) -> bool { - signer != &Default::default() - } -} - -impl Verify for MaybeUnsigned where - T: Default + Eq, - ::Signer: Default + Eq, -{ - type Signer = T::Signer; - fn verify>(&self, msg: L, signer: &Self::Signer) -> bool { - if !self.is_signed() { - !self.is_addressed(signer) - } else { - self.0.verify(msg, signer) - } - } -} - -impl From for MaybeUnsigned { - fn from(t: T) -> Self { - MaybeUnsigned(t) - } -} - /// Verify a signature on an encoded value in a lazy manner. This can be /// an optimization if the signature scheme has an "unsigned" escape hash. pub fn verify_encoded_lazy(sig: &V, item: &T, signer: &V::Signer) -> bool { diff --git a/substrate/runtime/primitives/src/testing.rs b/substrate/runtime/primitives/src/testing.rs index 9ac86d7747c82..1cfee22365688 100644 --- a/substrate/runtime/primitives/src/testing.rs +++ b/substrate/runtime/primitives/src/testing.rs @@ -125,7 +125,7 @@ impl Checkable impl + Codec + Sized + Send + Sync + Serialize + DeserializeOwned + Clone + Eq + Debug> Applyable for TestXt { type AccountId = u64; type Index = u64; - fn sender(&self) -> &u64 { &(self.0).0 } + fn sender(&self) -> Option<&u64> { Some(&(self.0).0) } fn index(&self) -> &u64 { &(self.0).1 } - fn apply(self) -> Result<(), &'static str> { (self.0).2.dispatch(&(self.0).0) } + fn apply(self) -> Result<(), &'static str> { (self.0).2.dispatch((self.0).0) } } diff --git a/substrate/runtime/primitives/src/traits.rs b/substrate/runtime/primitives/src/traits.rs index 2d674f1e933f8..8c3a43f93e4b5 100644 --- a/substrate/runtime/primitives/src/traits.rs +++ b/substrate/runtime/primitives/src/traits.rs @@ -427,7 +427,7 @@ pub trait Applyable: Sized + Send + Sync { type AccountId: Member + MaybeDisplay; type Index: Member + MaybeDisplay + SimpleArithmetic; fn index(&self) -> &Self::Index; - fn sender(&self) -> &Self::AccountId; + fn sender(&self) -> Option<&Self::AccountId>; fn apply(self) -> Result<(), &'static str>; } diff --git a/substrate/runtime/session/src/lib.rs b/substrate/runtime/session/src/lib.rs index b155053fe49ab..840b1ebbcbfbd 100644 --- a/substrate/runtime/session/src/lib.rs +++ b/substrate/runtime/session/src/lib.rs @@ -78,7 +78,7 @@ decl_module! { pub struct Module; #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum Call where aux: T::PublicAux { + pub enum Call where aux: T::Origin { fn set_key(aux, key: T::SessionKey) -> Result; } @@ -139,7 +139,7 @@ impl Module { /// Sets the session key of `_validator` to `_key`. This doesn't take effect until the next /// session. - fn set_key(aux: &T::PublicAux, key: T::SessionKey) -> Result { + fn set_key(aux: T::Origin, key: T::SessionKey) -> Result { // set new value for next session >::insert(aux.ref_into(), key); Ok(()) @@ -300,7 +300,7 @@ mod tests { type OnOfflineValidator = (); } impl system::Trait for Test { - type PublicAux = Self::AccountId; + type Origin = Self::AccountId; type Index = u64; type BlockNumber = u64; type Hash = H256; diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index 4242fa01e152d..adc81818a4b98 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -108,7 +108,7 @@ decl_module! { #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] #[cfg_attr(feature = "std", serde(bound(deserialize = "T::Balance: ::serde::de::DeserializeOwned")))] - pub enum Call where aux: T::PublicAux { + pub enum Call where aux: T::Origin { fn stake(aux) -> Result; fn unstake(aux, intentions_index: u32) -> Result; fn nominate(aux, target: Address) -> Result; @@ -232,7 +232,7 @@ impl Module { /// Declare the desire to stake for the transactor. /// /// Effects will be felt at the beginning of the next era. - fn stake(aux: &T::PublicAux) -> Result { + fn stake(aux: T::Origin) -> Result { let aux = aux.ref_into(); ensure!(Self::nominating(aux).is_none(), "Cannot stake if already nominating."); let mut intentions = >::get(); @@ -247,7 +247,7 @@ impl Module { /// Retract the desire to stake for the transactor. /// /// Effects will be felt at the beginning of the next era. - fn unstake(aux: &T::PublicAux, intentions_index: u32) -> Result { + fn unstake(aux: T::Origin, intentions_index: u32) -> Result { // unstake fails in degenerate case of having too few existing staked parties if Self::intentions().len() <= Self::minimum_validator_count() { return Err("cannot unstake when there are too few staked participants") @@ -255,7 +255,7 @@ impl Module { Self::apply_unstake(aux.ref_into(), intentions_index as usize) } - fn nominate(aux: &T::PublicAux, target: Address) -> Result { + fn nominate(aux: T::Origin, target: Address) -> Result { let target = >::lookup(target)?; let aux = aux.ref_into(); @@ -278,7 +278,7 @@ impl Module { /// Will panic if called when source isn't currently nominating target. /// Updates Nominating, NominatorsFor and NominationBalance. - fn unnominate(aux: &T::PublicAux, target_index: u32) -> Result { + fn unnominate(aux: T::Origin, target_index: u32) -> Result { let source = aux.ref_into(); let target_index = target_index as usize; @@ -307,7 +307,7 @@ impl Module { /// /// An error (no-op) if `Self::intentions()[intentions_index] != aux`. fn register_preferences( - aux: &T::PublicAux, + aux: T::Origin, intentions_index: u32, prefs: ValidatorPrefs ) -> Result { diff --git a/substrate/runtime/staking/src/mock.rs b/substrate/runtime/staking/src/mock.rs index b8ae013b38dfc..6b01038511e66 100644 --- a/substrate/runtime/staking/src/mock.rs +++ b/substrate/runtime/staking/src/mock.rs @@ -35,7 +35,7 @@ impl consensus::Trait for Test { type OnOfflineValidator = (); } impl system::Trait for Test { - type PublicAux = Self::AccountId; + type Origin = Self::AccountId; type Index = u64; type BlockNumber = u64; type Hash = H256; diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index 4f691c89afde9..a0c8c1508c395 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -45,7 +45,7 @@ extern crate safe_mix; use rstd::prelude::*; use primitives::traits::{self, CheckEqual, SimpleArithmetic, SimpleBitOps, Zero, One, Bounded, - Hash, Member, MaybeDisplay, RefInto, MaybeEmpty}; + Hash, Member, MaybeDisplay}; use runtime_support::{StorageValue, StorageMap, Parameter}; use safe_mix::TripletMix; @@ -69,9 +69,7 @@ pub fn extrinsics_data_root(xts: Vec>) -> H::Output { } pub trait Trait: Eq + Clone { - // We require that PublicAux impl MaybeEmpty, since we require that inherents - or unsigned - // user-level extrinsics - can exist. - type PublicAux: RefInto + MaybeEmpty; + type Origin: Into>>; type Index: Parameter + Member + Default + MaybeDisplay + SimpleArithmetic + Copy; type BlockNumber: Parameter + Member + MaybeDisplay + SimpleArithmetic + Default + Bounded + Copy + rstd::hash::Hash; type Hash: Parameter + Member + MaybeDisplay + SimpleBitOps + Default + Copy + CheckEqual + rstd::hash::Hash + AsRef<[u8]>; @@ -126,6 +124,30 @@ impl From for () { fn from(_: Event) -> () { () } } +/// Origin for the system module. +#[derive(PartialEq, Eq, Clone)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum RawOrigin { + /// The system itself ordained this dispatch to happen: this is the highest privilege level. + Root, + /// It is signed by some public key and we provide the AccountId. + Signed(AccountId), + /// It is signed by nobody but included and agreed upon by the validators anyway: it's "inherently" true. + Inherent, +} + +impl From> for RawOrigin { + fn from(s: Option) -> RawOrigin { + match s { + Some(who) => RawOrigin::Signed(who), + None => RawOrigin::Inherent, + } + } +} + +/// Exposed trait-generic origin type. +pub type Origin = RawOrigin<::AccountId>; + decl_storage! { trait Store for Module as System { @@ -146,6 +168,24 @@ decl_storage! { } } +pub fn ensure_signed(o: OuterOrigin) -> Result + where OuterOrigin: Into>> +{ + match o.into() { + Some(RawOrigin::Signed(t)) => Ok(t), + _ => Err("bad origin"), + } +} + +pub fn ensure_root(o: OuterOrigin) -> Result<(), &'static str> + where OuterOrigin: Into>> +{ + match o.into() { + Some(RawOrigin::Root) => Ok(()), + _ => Err("bad origin"), + } +} + impl Module { /// Start the execution of a particular block. pub fn initialise(number: &T::BlockNumber, parent_hash: &T::Hash, txs_root: &T::Hash) { @@ -307,10 +347,14 @@ mod tests { use primitives::traits::BlakeTwo256; use primitives::testing::{Digest, Header}; + impl_outer_origin!{ + pub enum Origin for Test where system = super {} + } + #[derive(Clone, Eq, PartialEq)] pub struct Test; impl Trait for Test { - type PublicAux = u64; + type Origin = Origin; type Index = u64; type BlockNumber = u64; type Hash = H256; @@ -332,6 +376,8 @@ mod tests { type System = Module; + + fn new_test_ext() -> runtime_io::TestExternalities { GenesisConfig::::default().build_storage().unwrap().into() } diff --git a/substrate/runtime/timestamp/src/lib.rs b/substrate/runtime/timestamp/src/lib.rs index b8938e7e198f9..8d2c61cd3113d 100644 --- a/substrate/runtime/timestamp/src/lib.rs +++ b/substrate/runtime/timestamp/src/lib.rs @@ -43,7 +43,7 @@ use runtime_support::dispatch::Result; use runtime_primitives::traits::{OnFinalise, MaybeEmpty, SimpleArithmetic, As, Zero}; pub trait Trait: consensus::Trait where - ::PublicAux: MaybeEmpty + ::Origin: MaybeEmpty { // the position of the required timestamp-set extrinsic. const TIMESTAMP_SET_POSITION: u32; @@ -55,7 +55,7 @@ decl_module! { pub struct Module; #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum Call where aux: T::PublicAux { + pub enum Call where aux: T::Origin { fn set(aux, now: T::Moment) -> Result; } } @@ -77,7 +77,7 @@ impl Module { } /// Set the current time. - fn set(aux: &T::PublicAux, now: T::Moment) -> Result { + fn set(aux: T::Origin, now: T::Moment) -> Result { assert!(aux.is_empty()); assert!(!::DidUpdate::exists(), "Timestamp must be updated only once in the block"); assert!( @@ -149,7 +149,7 @@ mod tests { #[derive(Clone, Eq, PartialEq)] pub struct Test; impl system::Trait for Test { - type PublicAux = Self::AccountId; + type Origin = Self::AccountId; type Index = u64; type BlockNumber = u64; type Hash = H256; diff --git a/substrate/runtime/treasury/src/lib.rs b/substrate/runtime/treasury/src/lib.rs index c6ddd21c8ad49..367b807f8e637 100644 --- a/substrate/runtime/treasury/src/lib.rs +++ b/substrate/runtime/treasury/src/lib.rs @@ -66,7 +66,7 @@ decl_module! { pub struct Module; #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum Call where aux: T::PublicAux { + pub enum Call where aux: T::Origin { // Put forward a suggestion for spending. A deposit proportional to the value // is reserved and slashed if the proposal is rejected. It is returned once the // proposal is awarded. @@ -185,7 +185,7 @@ impl Module { // Implement Calls/PrivCalls and add public immutables and private mutables. - fn propose_spend(aux: &T::PublicAux, value: T::Balance, beneficiary: T::AccountId) -> Result { + fn propose_spend(aux: T::Origin, value: T::Balance, beneficiary: T::AccountId) -> Result { let proposer = aux.ref_into(); let bond = Self::calculate_bond(value); @@ -361,7 +361,7 @@ mod tests { #[derive(Clone, Eq, PartialEq)] pub struct Test; impl system::Trait for Test { - type PublicAux = Self::AccountId; + type Origin = Self::AccountId; type Index = u64; type BlockNumber = u64; type Hash = H256; From 9f554f8ddf95a551f4cdd8ced6ce92cabae5ad38 Mon Sep 17 00:00:00 2001 From: Gav Date: Thu, 6 Sep 2018 17:49:09 +0200 Subject: [PATCH 02/21] Fixed up executive for new pardigm --- substrate/runtime-support/src/lib.rs | 12 +++--- substrate/runtime/balances/src/mock.rs | 16 +++---- substrate/runtime/executive/Cargo.toml | 3 +- substrate/runtime/executive/src/lib.rs | 46 ++++++++++----------- substrate/runtime/primitives/src/testing.rs | 13 +++--- 5 files changed, 44 insertions(+), 46 deletions(-) diff --git a/substrate/runtime-support/src/lib.rs b/substrate/runtime-support/src/lib.rs index 4c5f320980817..98e7a93c893d2 100644 --- a/substrate/runtime-support/src/lib.rs +++ b/substrate/runtime-support/src/lib.rs @@ -103,19 +103,19 @@ macro_rules! impl_outer_event { $(#[$attr])* #[allow(non_camel_case_types)] pub enum $name { - system(system::$name), + system(system::Event), $( - $module($module::$name<$trait>), + $module($module::Event<$trait>), )* } - impl From for $name { - fn from(x: system::$name) -> Self { + impl From for $name { + fn from(x: system::Event) -> Self { $name::system(x) } } $( - impl From<$module::$name<$trait>> for $name { - fn from(x: $module::$name<$trait>) -> Self { + impl From<$module::Event<$trait>> for $name { + fn from(x: $module::Event<$trait>) -> Self { $name::$module(x) } } diff --git a/substrate/runtime/balances/src/mock.rs b/substrate/runtime/balances/src/mock.rs index 1f7297c76bbb9..99204b91d121d 100644 --- a/substrate/runtime/balances/src/mock.rs +++ b/substrate/runtime/balances/src/mock.rs @@ -25,13 +25,13 @@ use runtime_io; use {GenesisConfig, Module, Trait, system}; impl_outer_origin!{ - pub enum Origin for Test {} + pub enum Origin for Runtime {} } // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] -pub struct Test; -impl system::Trait for Test { +pub struct Runtime; +impl system::Trait for Runtime { type Origin = Origin; type Index = u64; type BlockNumber = u64; @@ -42,7 +42,7 @@ impl system::Trait for Test { type Header = Header; type Event = (); } -impl Trait for Test { +impl Trait for Runtime { type Balance = u64; type AccountIndex = u64; type OnFreeBalanceZero = (); @@ -51,13 +51,13 @@ impl Trait for Test { } pub fn new_test_ext(ext_deposit: u64, monied: bool) -> runtime_io::TestExternalities { - let mut t = system::GenesisConfig::::default().build_storage().unwrap(); + let mut t = system::GenesisConfig::::default().build_storage().unwrap(); let balance_factor = if ext_deposit > 0 { 256 } else { 1 }; - t.extend(GenesisConfig::{ + t.extend(GenesisConfig::{ balances: if monied { vec![(1, 10 * balance_factor), (2, 20 * balance_factor), (3, 30 * balance_factor), (4, 40 * balance_factor)] } else { @@ -73,5 +73,5 @@ pub fn new_test_ext(ext_deposit: u64, monied: bool) -> runtime_io::TestExternali t.into() } -pub type System = system::Module; -pub type Balances = Module; +pub type System = system::Module; +pub type Balances = Module; diff --git a/substrate/runtime/executive/Cargo.toml b/substrate/runtime/executive/Cargo.toml index f4d9fbf25f2ee..965bbe2a1e2c1 100644 --- a/substrate/runtime/executive/Cargo.toml +++ b/substrate/runtime/executive/Cargo.toml @@ -8,7 +8,6 @@ hex-literal = "0.1.0" serde = { version = "1.0", default_features = false } serde_derive = { version = "1.0", optional = true } substrate-codec = { path = "../../codec", default_features = false } -substrate-codec-derive = { path = "../../codec/derive", default_features = false } substrate-runtime-std = { path = "../../runtime-std", default_features = false } substrate-runtime-io = { path = "../../runtime-io", default_features = false } substrate-runtime-support = { path = "../../runtime-support", default_features = false } @@ -18,6 +17,7 @@ substrate-runtime-system = { path = "../system", default_features = false } [dev-dependencies] substrate-primitives = { path = "../../primitives" } substrate-runtime-balances = { path = "../balances" } +substrate-codec-derive = { path = "../../codec/derive" } [features] default = ["std"] @@ -27,7 +27,6 @@ std = [ "serde/std", "serde_derive", "substrate-codec/std", - "substrate-codec-derive/std", "substrate-runtime-primitives/std", "substrate-runtime-io/std", "substrate-runtime-system/std", diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index 1cd851f03cc79..7d763edd42a09 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -24,6 +24,10 @@ extern crate serde; #[macro_use] extern crate serde_derive; +#[cfg(test)] +#[macro_use] +extern crate substrate_codec_derive; + #[cfg_attr(test, macro_use)] extern crate substrate_runtime_support as runtime_support; @@ -170,20 +174,20 @@ impl< // Verify the signature is good. let xt = uxt.check_with(Lookup::lookup).map_err(internal::ApplyError::BadSignature)?; - if xt.sender() != &Default::default() { + if let Some(sender) = xt.sender() { // check index - let expected_index = >::account_nonce(xt.sender()); + let expected_index = >::account_nonce(sender); if xt.index() != &expected_index { return Err( if xt.index() < &expected_index { internal::ApplyError::Stale } else { internal::ApplyError::Future } ) } // pay any fees. - Payment::make_payment(xt.sender(), encoded_len).map_err(|_| internal::ApplyError::CantPay)?; + Payment::make_payment(sender, encoded_len).map_err(|_| internal::ApplyError::CantPay)?; // AUDIT: Under no circumstances may this function panic from here onwards. // increment nonce in storage - >::inc_account_nonce(xt.sender()); + >::inc_account_nonce(sender); } // decode parameters and dispatch @@ -215,7 +219,7 @@ mod tests { use runtime_io::with_externalities; use substrate_primitives::{H256, KeccakHasher}; use primitives::BuildStorage; - use primitives::traits::{Identity, Header as HeaderT, BlakeTwo256, AuxLookup}; + use primitives::traits::{Header as HeaderT, BlakeTwo256, AuxLookup}; use primitives::testing::{Digest, Header, Block}; use system; @@ -232,14 +236,6 @@ mod tests { pub enum Origin for Runtime { } } - impl From> for Origin { - fn from(s: Option) -> Origin { - match s { - Some(who) => Origin::system(system::Origin::Signed(who)), - None => Origin::system(system::Origin::Inherent), - } - } - } impl_outer_event!{ pub enum MetaEvent for Runtime { @@ -250,13 +246,6 @@ mod tests { // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, Eq, PartialEq, Debug, Serialize, Deserialize)] pub struct Runtime; - impl balances::Trait for Runtime { - type Balance = u64; - type AccountIndex = u64; - type OnFreeBalanceZero = staking::Module; - type EnsureAccountLiquid = staking::Module; - type Event = MetaEvent; - } impl system::Trait for Runtime { type Origin = Origin; type Index = u64; @@ -268,9 +257,16 @@ mod tests { type Header = Header; type Event = MetaEvent; } + impl balances::Trait for Runtime { + type Balance = u64; + type AccountIndex = u64; + type OnFreeBalanceZero = (); + type EnsureAccountLiquid = (); + type Event = MetaEvent; + } type TestXt = primitives::testing::TestXt>; - type Executive = super::Executive, NullLookup, balances::Module, ()>; + type Executive = super::Executive, NullLookup, balances::Module, ()>; #[test] fn balance_transfer_dispatch_works() { @@ -284,7 +280,7 @@ mod tests { creation_fee: 0, reclaim_rebate: 0, }.build_storage().unwrap()); - let xt = primitives::testing::TestXt((1, 0, Call::transfer(2.into(), 69))); + let xt = primitives::testing::TestXt(Some(1), 0, Call::transfer(2.into(), 69)); let mut t = runtime_io::TestExternalities::from(t); with_externalities(&mut t, || { Executive::initialise_block(&Header::new(1, H256::default(), H256::default(), [69u8; 32].into(), Digest::default())); @@ -310,7 +306,7 @@ mod tests { // Blake // state_root: hex!("02532989c613369596025dfcfc821339fc9861987003924913a5a1382f87034a").into(), // Keccak - state_root: hex!("ffe27b4c3a8b421fa10592be61fb28eca7ebbe04cbfa99cdda9f703f35522569").into(), + state_root: hex!("14a253cb1c5f38beeec8bee962a941b2ba0773b7593564fbe62b9c3a46784df5").into(), extrinsics_root: hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421").into(), digest: Digest { logs: vec![], }, }, @@ -344,7 +340,7 @@ mod tests { header: Header { parent_hash: [69u8; 32].into(), number: 1, - state_root: hex!("ffe27b4c3a8b421fa10592be61fb28eca7ebbe04cbfa99cdda9f703f35522569").into(), + state_root: hex!("14a253cb1c5f38beeec8bee962a941b2ba0773b7593564fbe62b9c3a46784df5").into(), extrinsics_root: [0u8; 32].into(), digest: Digest { logs: vec![], }, }, @@ -356,7 +352,7 @@ mod tests { #[test] fn bad_extrinsic_not_inserted() { let mut t = new_test_ext(); - let xt = primitives::testing::TestXt((1, 42, Call::transfer(33.into(), 69))); + let xt = primitives::testing::TestXt(Some(1), 42, Call::transfer(33.into(), 69)); with_externalities(&mut t, || { Executive::initialise_block(&Header::new(1, H256::default(), H256::default(), [69u8; 32].into(), Digest::default())); assert!(Executive::apply_extrinsic(xt).is_err()); diff --git a/substrate/runtime/primitives/src/testing.rs b/substrate/runtime/primitives/src/testing.rs index 1cfee22365688..e2b83d60bfd05 100644 --- a/substrate/runtime/primitives/src/testing.rs +++ b/substrate/runtime/primitives/src/testing.rs @@ -116,16 +116,19 @@ impl(pub (u64, u64, Call)); +pub struct TestXt(pub Option, pub u64, pub Call); impl Checkable for TestXt { type Checked = Self; fn check_with(self, _: Context) -> Result { Ok(self) } } -impl + Codec + Sized + Send + Sync + Serialize + DeserializeOwned + Clone + Eq + Debug> Applyable for TestXt { +impl Applyable for TestXt where + Call: Sized + Send + Sync + Clone + Eq + AuxDispatchable + Codec + Debug + Serialize + DeserializeOwned, + ::Aux: From> +{ type AccountId = u64; type Index = u64; - fn sender(&self) -> Option<&u64> { Some(&(self.0).0) } - fn index(&self) -> &u64 { &(self.0).1 } - fn apply(self) -> Result<(), &'static str> { (self.0).2.dispatch((self.0).0) } + fn sender(&self) -> Option<&u64> { self.0.as_ref() } + fn index(&self) -> &u64 { &self.1 } + fn apply(self) -> Result<(), &'static str> { self.2.dispatch(self.0.into()) } } From 8ba8dc6646540256d8e89d6533ff09ad23ca30c9 Mon Sep 17 00:00:00 2001 From: Gav Date: Thu, 6 Sep 2018 18:32:52 +0200 Subject: [PATCH 03/21] Consensus works with Origin --- substrate/runtime/consensus/src/lib.rs | 27 +++++++++++++------------- substrate/runtime/system/src/lib.rs | 9 +++++++++ 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/substrate/runtime/consensus/src/lib.rs b/substrate/runtime/consensus/src/lib.rs index 1881d2cb87529..92facebf1c107 100644 --- a/substrate/runtime/consensus/src/lib.rs +++ b/substrate/runtime/consensus/src/lib.rs @@ -46,8 +46,9 @@ use runtime_support::{storage, Parameter}; use runtime_support::dispatch::Result; use runtime_support::storage::StorageValue; use runtime_support::storage::unhashed::StorageVec; -use primitives::traits::{MaybeSerializeDebug, MaybeEmpty, OnFinalise, Member, AuthoritiesChangeDigest}; +use primitives::traits::{MaybeSerializeDebug, OnFinalise, Member, AuthoritiesChangeDigest}; use primitives::bft::MisbehaviorReport; +use system::{ensure_signed, ensure_inherent, ensure_root}; #[cfg(any(feature = "std", test))] use substrate_primitives::KeccakHasher; @@ -148,12 +149,8 @@ decl_module! { fn report_misbehavior(aux, report: MisbehaviorReport) -> Result; fn note_offline(aux, offline_val_indices: Vec) -> Result; fn remark(aux, remark: Vec) -> Result; - } - - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum PrivCall { - fn set_code(new: Vec) -> Result; - fn set_storage(items: Vec) -> Result; + fn set_code(aux, new: Vec) -> Result; + fn set_storage(aux, items: Vec) -> Result; } } @@ -164,13 +161,15 @@ impl Module { } /// Set the new code. - fn set_code(new: Vec) -> Result { + fn set_code(origin: T::Origin, new: Vec) -> Result { + ensure_root(origin)?; storage::unhashed::put_raw(CODE, &new); Ok(()) } /// Set some items of storage. - fn set_storage(items: Vec) -> Result { + fn set_storage(origin: T::Origin, items: Vec) -> Result { + ensure_root(origin)?; for i in &items { storage::unhashed::put_raw(&i.0, &i.1); } @@ -178,7 +177,8 @@ impl Module { } /// Report some misbehaviour. - fn report_misbehavior(_aux: T::Origin, _report: MisbehaviorReport) -> Result { + fn report_misbehavior(origin: T::Origin, _report: MisbehaviorReport) -> Result { + ensure_signed(origin)?; // TODO. Ok(()) } @@ -186,8 +186,8 @@ impl Module { /// Note the previous block's validator missed their opportunity to propose a block. This only comes in /// if 2/3+1 of the validators agree that no proposal was submitted. It's only relevant /// for the previous block. - fn note_offline(aux: T::Origin, offline_val_indices: Vec) -> Result { - assert!(aux.is_empty()); + fn note_offline(origin: T::Origin, offline_val_indices: Vec) -> Result { + ensure_inherent(origin)?; assert!( >::extrinsic_index() == Some(T::NOTE_OFFLINE_POSITION), "note_offline extrinsic must be at position {} in the block", @@ -202,7 +202,8 @@ impl Module { } /// Make some on-chain remark. - fn remark(_aux: T::Origin, _remark: Vec) -> Result { + fn remark(origin: T::Origin, _remark: Vec) -> Result { + ensure_signed(origin)?; Ok(()) } diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index a0c8c1508c395..e638706bc4f65 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -186,6 +186,15 @@ pub fn ensure_root(o: OuterOrigin) -> Result<(), &'stati } } +pub fn ensure_inherent(o: OuterOrigin) -> Result<(), &'static str> + where OuterOrigin: Into>> +{ + match o.into() { + Some(RawOrigin::Inherent) => Ok(()), + _ => Err("bad origin"), + } +} + impl Module { /// Start the execution of a particular block. pub fn initialise(number: &T::BlockNumber, parent_hash: &T::Hash, txs_root: &T::Hash) { From 2488e690c724f426a0c1555cba43ed6fa1158ccc Mon Sep 17 00:00:00 2001 From: Gav Date: Thu, 6 Sep 2018 18:55:53 +0200 Subject: [PATCH 04/21] Timestamp ported over --- substrate/runtime-support/src/lib.rs | 5 +++++ substrate/runtime/timestamp/src/lib.rs | 25 ++++++++++++++----------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/substrate/runtime-support/src/lib.rs b/substrate/runtime-support/src/lib.rs index 98e7a93c893d2..8dc49e65058e3 100644 --- a/substrate/runtime-support/src/lib.rs +++ b/substrate/runtime-support/src/lib.rs @@ -145,6 +145,11 @@ macro_rules! impl_outer_origin { #[allow(dead_code)] Void($crate::Void) } + #[allow(dead_code)] + impl $name { + pub const INHERENT: Self = $name::system($system::RawOrigin::Inherent); + pub const ROOT: Self = $name::system($system::RawOrigin::Root); + } impl From<$system::Origin<$trait>> for $name { fn from(x: $system::Origin<$trait>) -> Self { $name::system(x) diff --git a/substrate/runtime/timestamp/src/lib.rs b/substrate/runtime/timestamp/src/lib.rs index 8d2c61cd3113d..684812587b3d0 100644 --- a/substrate/runtime/timestamp/src/lib.rs +++ b/substrate/runtime/timestamp/src/lib.rs @@ -40,11 +40,10 @@ extern crate substrate_codec as codec; use runtime_support::{StorageValue, Parameter}; use runtime_support::dispatch::Result; -use runtime_primitives::traits::{OnFinalise, MaybeEmpty, SimpleArithmetic, As, Zero}; +use runtime_primitives::traits::{OnFinalise, SimpleArithmetic, As, Zero}; +use system::ensure_inherent; -pub trait Trait: consensus::Trait where - ::Origin: MaybeEmpty -{ +pub trait Trait: consensus::Trait + system::Trait { // the position of the required timestamp-set extrinsic. const TIMESTAMP_SET_POSITION: u32; @@ -77,8 +76,8 @@ impl Module { } /// Set the current time. - fn set(aux: T::Origin, now: T::Moment) -> Result { - assert!(aux.is_empty()); + fn set(origin: T::Origin, now: T::Moment) -> Result { + ensure_inherent(origin)?; assert!(!::DidUpdate::exists(), "Timestamp must be updated only once in the block"); assert!( >::extrinsic_index() == Some(T::TIMESTAMP_SET_POSITION), @@ -146,10 +145,14 @@ mod tests { use runtime_primitives::traits::{BlakeTwo256}; use runtime_primitives::testing::{Digest, Header}; + impl_outer_origin!{ + pub enum Origin for Test {} + } + #[derive(Clone, Eq, PartialEq)] pub struct Test; impl system::Trait for Test { - type Origin = Self::AccountId; + type Origin = Origin; type Index = u64; type BlockNumber = u64; type Hash = H256; @@ -178,7 +181,7 @@ mod tests { let mut t = runtime_io::TestExternalities::from(t); with_externalities(&mut t, || { Timestamp::set_timestamp(42); - assert_ok!(Timestamp::aux_dispatch(Call::set(69), &0)); + assert_ok!(Timestamp::aux_dispatch(Call::set(69), Origin::INHERENT)); assert_eq!(Timestamp::now(), 69); }); } @@ -191,8 +194,8 @@ mod tests { let mut t = runtime_io::TestExternalities::from(t); with_externalities(&mut t, || { Timestamp::set_timestamp(42); - assert_ok!(Timestamp::aux_dispatch(Call::set(69), &0)); - let _ = Timestamp::aux_dispatch(Call::set(70), &0); + assert_ok!(Timestamp::aux_dispatch(Call::set(69), Origin::INHERENT)); + let _ = Timestamp::aux_dispatch(Call::set(70), Origin::INHERENT); }); } @@ -204,7 +207,7 @@ mod tests { let mut t = runtime_io::TestExternalities::from(t); with_externalities(&mut t, || { Timestamp::set_timestamp(42); - let _ = Timestamp::aux_dispatch(Call::set(46), &0); + let _ = Timestamp::aux_dispatch(Call::set(46), Origin::INHERENT); }); } } From c05a9ce43de7a37d9e67df7683191fb7b9a21e85 Mon Sep 17 00:00:00 2001 From: Gav Date: Thu, 6 Sep 2018 19:01:41 +0200 Subject: [PATCH 05/21] Session now compatible --- substrate/runtime-support/src/lib.rs | 3 +++ substrate/runtime/session/src/lib.rs | 33 +++++++++++++++----------- substrate/runtime/timestamp/src/lib.rs | 2 +- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/substrate/runtime-support/src/lib.rs b/substrate/runtime-support/src/lib.rs index 8dc49e65058e3..91b3eb0cabdef 100644 --- a/substrate/runtime-support/src/lib.rs +++ b/substrate/runtime-support/src/lib.rs @@ -149,6 +149,9 @@ macro_rules! impl_outer_origin { impl $name { pub const INHERENT: Self = $name::system($system::RawOrigin::Inherent); pub const ROOT: Self = $name::system($system::RawOrigin::Root); + pub fn signed(by: <$trait as $system::Trait>::AccountId) -> Self { + $name::system($system::RawOrigin::Signed(by)) + } } impl From<$system::Origin<$trait>> for $name { fn from(x: $system::Origin<$trait>) -> Self { diff --git a/substrate/runtime/session/src/lib.rs b/substrate/runtime/session/src/lib.rs index 840b1ebbcbfbd..1c4c2f086b2b5 100644 --- a/substrate/runtime/session/src/lib.rs +++ b/substrate/runtime/session/src/lib.rs @@ -52,6 +52,7 @@ use rstd::prelude::*; use primitives::traits::{Zero, One, RefInto, OnFinalise, Convert, As}; use runtime_support::{StorageValue, StorageMap}; use runtime_support::dispatch::Result; +use system::{ensure_signed, ensure_root}; #[cfg(any(feature = "std", test))] use std::collections::HashMap; @@ -80,12 +81,9 @@ decl_module! { #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum Call where aux: T::Origin { fn set_key(aux, key: T::SessionKey) -> Result; - } - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum PrivCall { - fn set_length(new: T::BlockNumber) -> Result; - fn force_new_session(apply_rewards: bool) -> Result; + fn set_length(aux, new: T::BlockNumber) -> Result; + fn force_new_session(aux, apply_rewards: bool) -> Result; } } @@ -140,19 +138,22 @@ impl Module { /// Sets the session key of `_validator` to `_key`. This doesn't take effect until the next /// session. fn set_key(aux: T::Origin, key: T::SessionKey) -> Result { + ensure_signed(aux)?; // set new value for next session >::insert(aux.ref_into(), key); Ok(()) } /// Set a new era length. Won't kick in until the next era change (at current length). - fn set_length(new: T::BlockNumber) -> Result { + fn set_length(aux: T::Origin, new: T::BlockNumber) -> Result { + ensure_root(aux)?; >::put(new); Ok(()) } /// Forces a new session. - pub fn force_new_session(apply_rewards: bool) -> Result { + pub fn force_new_session(aux: T::Origin, apply_rewards: bool) -> Result { + ensure_root(aux)?; >::put(apply_rewards); Ok(()) } @@ -291,6 +292,10 @@ mod tests { use primitives::traits::{Identity, BlakeTwo256}; use primitives::testing::{Digest, Header}; + impl_outer_origin!{ + pub enum Origin for Test {} + } + #[derive(Clone, Eq, PartialEq)] pub struct Test; impl consensus::Trait for Test { @@ -300,7 +305,7 @@ mod tests { type OnOfflineValidator = (); } impl system::Trait for Test { - type Origin = Self::AccountId; + type Origin = Origin; type Index = u64; type BlockNumber = u64; type Hash = H256; @@ -353,7 +358,7 @@ mod tests { fn should_work_with_early_exit() { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); - assert_ok!(Session::set_length(10)); + assert_ok!(Session::set_length(Origin::ROOT, 10)); assert_eq!(Session::blocks_remaining(), 1); Session::check_rotate_session(1); @@ -365,7 +370,7 @@ mod tests { System::set_block_number(7); assert_eq!(Session::current_index(), 1); assert_eq!(Session::blocks_remaining(), 5); - assert_ok!(Session::force_new_session(false)); + assert_ok!(Session::force_new_session(Origin::ROOT, false)); Session::check_rotate_session(7); System::set_block_number(8); @@ -388,14 +393,14 @@ mod tests { with_externalities(&mut new_test_ext(), || { // Block 1: Change to length 3; no visible change. System::set_block_number(1); - assert_ok!(Session::set_length(3)); + assert_ok!(Session::set_length(Origin::ROOT, 3)); Session::check_rotate_session(1); assert_eq!(Session::length(), 2); assert_eq!(Session::current_index(), 0); // Block 2: Length now changed to 3. Index incremented. System::set_block_number(2); - assert_ok!(Session::set_length(3)); + assert_ok!(Session::set_length(Origin::ROOT, 3)); Session::check_rotate_session(2); assert_eq!(Session::length(), 3); assert_eq!(Session::current_index(), 1); @@ -408,7 +413,7 @@ mod tests { // Block 4: Change to length 2; no visible change. System::set_block_number(4); - assert_ok!(Session::set_length(2)); + assert_ok!(Session::set_length(Origin::ROOT, 2)); Session::check_rotate_session(4); assert_eq!(Session::length(), 3); assert_eq!(Session::current_index(), 1); @@ -448,7 +453,7 @@ mod tests { // Block 3: Set new key for validator 2; no visible change. System::set_block_number(3); - assert_ok!(Session::set_key(&2, 5)); + assert_ok!(Session::set_key(Origin::signed(2), 5)); assert_eq!(Consensus::authorities(), vec![1, 2, 3]); Session::check_rotate_session(3); diff --git a/substrate/runtime/timestamp/src/lib.rs b/substrate/runtime/timestamp/src/lib.rs index 684812587b3d0..33ff196a5f6c4 100644 --- a/substrate/runtime/timestamp/src/lib.rs +++ b/substrate/runtime/timestamp/src/lib.rs @@ -145,7 +145,7 @@ mod tests { use runtime_primitives::traits::{BlakeTwo256}; use runtime_primitives::testing::{Digest, Header}; - impl_outer_origin!{ + impl_outer_origin! { pub enum Origin for Test {} } From e84ce49083845a99bd3b5e4dcf8a78fe00ea2157 Mon Sep 17 00:00:00 2001 From: Gav Date: Thu, 6 Sep 2018 19:35:58 +0200 Subject: [PATCH 06/21] Ported staking --- substrate/runtime/session/src/lib.rs | 15 ++-- substrate/runtime/staking/src/lib.rs | 103 ++++++++++++++----------- substrate/runtime/staking/src/mock.rs | 6 +- substrate/runtime/staking/src/tests.rs | 74 +++++++++--------- 4 files changed, 109 insertions(+), 89 deletions(-) diff --git a/substrate/runtime/session/src/lib.rs b/substrate/runtime/session/src/lib.rs index 1c4c2f086b2b5..cdc4ef5f25fd6 100644 --- a/substrate/runtime/session/src/lib.rs +++ b/substrate/runtime/session/src/lib.rs @@ -49,7 +49,7 @@ extern crate substrate_runtime_system as system; extern crate substrate_runtime_timestamp as timestamp; use rstd::prelude::*; -use primitives::traits::{Zero, One, RefInto, OnFinalise, Convert, As}; +use primitives::traits::{Zero, One, OnFinalise, Convert, As}; use runtime_support::{StorageValue, StorageMap}; use runtime_support::dispatch::Result; use system::{ensure_signed, ensure_root}; @@ -138,9 +138,9 @@ impl Module { /// Sets the session key of `_validator` to `_key`. This doesn't take effect until the next /// session. fn set_key(aux: T::Origin, key: T::SessionKey) -> Result { - ensure_signed(aux)?; + let who = ensure_signed(aux)?; // set new value for next session - >::insert(aux.ref_into(), key); + >::insert(who, key); Ok(()) } @@ -154,12 +154,17 @@ impl Module { /// Forces a new session. pub fn force_new_session(aux: T::Origin, apply_rewards: bool) -> Result { ensure_root(aux)?; - >::put(apply_rewards); - Ok(()) + Self::apply_force_new_session(apply_rewards) } // INTERNAL API (available to other runtime modules) + /// Forces a new session, no origin. + pub fn apply_force_new_session(apply_rewards: bool) -> Result { + >::put(apply_rewards); + Ok(()) + } + /// Set the current set of validators. /// /// Called by `staking::next_era()` only. `next_session` should be called after this in order to diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index adc81818a4b98..b3feca05b60dd 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -49,9 +49,10 @@ use rstd::prelude::*; use runtime_support::{Parameter, StorageValue, StorageMap}; use runtime_support::dispatch::Result; use session::OnSessionChange; -use primitives::traits::{Zero, One, Bounded, RefInto, OnFinalise, +use primitives::traits::{Zero, One, Bounded, OnFinalise, As, AuxLookup}; use balances::{address::Address, OnMinted}; +use system::{ensure_root, ensure_signed}; mod mock; @@ -114,15 +115,12 @@ decl_module! { fn nominate(aux, target: Address) -> Result; fn unnominate(aux, target_index: u32) -> Result; fn register_preferences(aux, intentions_index: u32, prefs: ValidatorPrefs) -> Result; - } - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum PrivCall { - fn set_sessions_per_era(new: T::BlockNumber) -> Result; - fn set_bonding_duration(new: T::BlockNumber) -> Result; - fn set_validator_count(new: u32) -> Result; - fn force_new_era(apply_rewards: bool) -> Result; - fn set_offline_slash_grace(new: u32) -> Result; + fn set_sessions_per_era(aux, new: T::BlockNumber) -> Result; + fn set_bonding_duration(aux, new: T::BlockNumber) -> Result; + fn set_validator_count(aux, new: u32) -> Result; + fn force_new_era(aux, apply_rewards: bool) -> Result; + fn set_offline_slash_grace(aux, new: u32) -> Result; } } @@ -192,6 +190,11 @@ decl_storage! { impl Module { + /// Deposit one of this module's events. + fn deposit_event(event: Event) { + >::deposit_event(::Event::from(event).into()); + } + // PUBLIC IMMUTABLES /// MinimumValidatorCount getter, introduces a default. @@ -232,60 +235,62 @@ impl Module { /// Declare the desire to stake for the transactor. /// /// Effects will be felt at the beginning of the next era. - fn stake(aux: T::Origin) -> Result { - let aux = aux.ref_into(); - ensure!(Self::nominating(aux).is_none(), "Cannot stake if already nominating."); + fn stake(origin: T::Origin) -> Result { + let who = ensure_signed(origin)?; + ensure!(Self::nominating(&who).is_none(), "Cannot stake if already nominating."); let mut intentions = >::get(); // can't be in the list twice. - ensure!(intentions.iter().find(|&t| t == aux).is_none(), "Cannot stake if already staked."); - intentions.push(aux.clone()); + ensure!(intentions.iter().find(|&t| t == &who).is_none(), "Cannot stake if already staked."); + + >::insert(&who, T::BlockNumber::max_value()); + intentions.push(who); >::put(intentions); - >::insert(aux, T::BlockNumber::max_value()); Ok(()) } /// Retract the desire to stake for the transactor. /// /// Effects will be felt at the beginning of the next era. - fn unstake(aux: T::Origin, intentions_index: u32) -> Result { + fn unstake(origin: T::Origin, intentions_index: u32) -> Result { + let who = ensure_signed(origin)?; // unstake fails in degenerate case of having too few existing staked parties if Self::intentions().len() <= Self::minimum_validator_count() { return Err("cannot unstake when there are too few staked participants") } - Self::apply_unstake(aux.ref_into(), intentions_index as usize) + Self::apply_unstake(&who, intentions_index as usize) } - fn nominate(aux: T::Origin, target: Address) -> Result { + fn nominate(origin: T::Origin, target: Address) -> Result { + let who = ensure_signed(origin)?; let target = >::lookup(target)?; - let aux = aux.ref_into(); - ensure!(Self::nominating(aux).is_none(), "Cannot nominate if already nominating."); - ensure!(Self::intentions().iter().find(|&t| t == aux.ref_into()).is_none(), "Cannot nominate if already staked."); + ensure!(Self::nominating(&who).is_none(), "Cannot nominate if already nominating."); + ensure!(Self::intentions().iter().find(|&t| t == &who).is_none(), "Cannot nominate if already staked."); // update nominators_for let mut t = Self::nominators_for(&target); - t.push(aux.clone()); + t.push(who.clone()); >::insert(&target, t); // update nominating - >::insert(aux, &target); + >::insert(&who, &target); // Update bondage - >::insert(aux.ref_into(), T::BlockNumber::max_value()); + >::insert(&who, T::BlockNumber::max_value()); Ok(()) } /// Will panic if called when source isn't currently nominating target. /// Updates Nominating, NominatorsFor and NominationBalance. - fn unnominate(aux: T::Origin, target_index: u32) -> Result { - let source = aux.ref_into(); + fn unnominate(origin: T::Origin, target_index: u32) -> Result { + let source = ensure_signed(origin)?; let target_index = target_index as usize; - let target = >::get(source).ok_or("Account must be nominating")?; + let target = >::get(&source).ok_or("Account must be nominating")?; let mut t = Self::nominators_for(&target); - if t.get(target_index) != Some(source) { + if t.get(target_index) != Some(&source) { return Err("Invalid target index") } @@ -296,10 +301,10 @@ impl Module { >::insert(&target, t); // update nominating - >::remove(source); + >::remove(&source); // update bondage - >::insert(aux.ref_into(), >::block_number() + Self::bonding_duration()); + >::insert(source, >::block_number() + Self::bonding_duration()); Ok(()) } @@ -307,55 +312,61 @@ impl Module { /// /// An error (no-op) if `Self::intentions()[intentions_index] != aux`. fn register_preferences( - aux: T::Origin, + origin: T::Origin, intentions_index: u32, prefs: ValidatorPrefs ) -> Result { - let aux = aux.ref_into(); + let who = ensure_signed(origin)?; - if Self::intentions().get(intentions_index as usize) != Some(aux) { + if Self::intentions().get(intentions_index as usize) != Some(&who) { return Err("Invalid index") } - >::insert(aux, prefs); + >::insert(who, prefs); Ok(()) } // PRIV DISPATCH - /// Deposit one of this module's events. - fn deposit_event(event: Event) { - >::deposit_event(::Event::from(event).into()); - } - /// Set the number of sessions in an era. - fn set_sessions_per_era(new: T::BlockNumber) -> Result { + fn set_sessions_per_era(origin: T::Origin, new: T::BlockNumber) -> Result { + ensure_root(origin)?; >::put(&new); Ok(()) } /// The length of the bonding duration in eras. - fn set_bonding_duration(new: T::BlockNumber) -> Result { + fn set_bonding_duration(origin: T::Origin, new: T::BlockNumber) -> Result { + ensure_root(origin)?; >::put(&new); Ok(()) } /// The length of a staking era in sessions. - fn set_validator_count(new: u32) -> Result { + fn set_validator_count(origin: T::Origin, new: u32) -> Result { + ensure_root(origin)?; >::put(&new); Ok(()) } /// 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 { + fn force_new_era(origin: T::Origin, apply_rewards: bool) -> Result { + ensure_root(origin)?; + Self::apply_force_new_era(apply_rewards) + } + + // Just force_new_era without origin check. + fn apply_force_new_era(apply_rewards: bool) -> Result { >::put(()); - >::force_new_session(apply_rewards) + >::apply_force_new_session(apply_rewards) } + /// Set the offline slash grace period. - fn set_offline_slash_grace(new: u32) -> Result { + fn set_offline_slash_grace(origin: T::Origin, new: u32) -> Result { + ensure_root(origin)?; >::put(&new); Ok(()) } @@ -555,7 +566,7 @@ impl consensus::OnOfflineValidator for Module { apply_unstake can only fail if pos wrong; \ Self::intentions() doesn't change; qed"); } - let _ = Self::force_new_era(false); + let _ = Self::apply_force_new_era(false); } RawEvent::OfflineSlash(v, slash) } else { diff --git a/substrate/runtime/staking/src/mock.rs b/substrate/runtime/staking/src/mock.rs index 6b01038511e66..d603e372f272e 100644 --- a/substrate/runtime/staking/src/mock.rs +++ b/substrate/runtime/staking/src/mock.rs @@ -25,6 +25,10 @@ use substrate_primitives::{H256, KeccakHasher}; use runtime_io; use {GenesisConfig, Module, Trait, consensus, session, system, timestamp, balances}; +impl_outer_origin!{ + pub enum Origin for Test {} +} + // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] pub struct Test; @@ -35,7 +39,7 @@ impl consensus::Trait for Test { type OnOfflineValidator = (); } impl system::Trait for Test { - type Origin = Self::AccountId; + type Origin = Origin; type Index = u64; type BlockNumber = u64; type Hash = H256; diff --git a/substrate/runtime/staking/src/tests.rs b/substrate/runtime/staking/src/tests.rs index 4bf9ce9f41051..66da1ed1737be 100644 --- a/substrate/runtime/staking/src/tests.rs +++ b/substrate/runtime/staking/src/tests.rs @@ -21,7 +21,7 @@ use super::*; use consensus::OnOfflineValidator; use runtime_io::with_externalities; -use mock::{Balances, Session, Staking, System, Timestamp, Test, new_test_ext}; +use mock::{Balances, Session, Staking, System, Timestamp, Test, new_test_ext, Origin}; #[test] fn note_null_offline_should_work() { @@ -75,7 +75,7 @@ fn note_offline_grace_should_work() { with_externalities(&mut new_test_ext(0, 3, 3, 0, true, 10), || { Balances::set_free_balance(&10, 70); Balances::set_free_balance(&20, 70); - assert_ok!(Staking::set_offline_slash_grace(1)); + assert_ok!(Staking::set_offline_slash_grace(Origin::ROOT, 1)); assert_eq!(Staking::offline_slash_grace(), 1); assert_eq!(Staking::slash_count(&10), 0); @@ -104,7 +104,7 @@ fn note_offline_force_unstake_session_change_should_work() { with_externalities(&mut new_test_ext(0, 3, 3, 0, true, 10), || { Balances::set_free_balance(&10, 70); Balances::set_free_balance(&20, 70); - assert_ok!(Staking::stake(&1)); + assert_ok!(Staking::stake(Origin::signed(1))); assert_eq!(Staking::slash_count(&10), 0); assert_eq!(Balances::free_balance(&10), 70); @@ -130,7 +130,7 @@ fn note_offline_auto_unstake_session_change_should_work() { with_externalities(&mut new_test_ext(0, 3, 3, 0, true, 10), || { Balances::set_free_balance(&10, 7000); Balances::set_free_balance(&20, 7000); - assert_ok!(Staking::register_preferences(&10, 0, ValidatorPrefs { unstake_threshold: 1, validator_payment: 0 })); + assert_ok!(Staking::register_preferences(Origin::signed(10), 0, ValidatorPrefs { unstake_threshold: 1, validator_payment: 0 })); assert_eq!(Staking::intentions(), vec![10, 20]); @@ -236,14 +236,14 @@ fn staking_should_work() { assert_eq!(Staking::validator_count(), 2); assert_eq!(Session::validators(), vec![10, 20]); - assert_ok!(Staking::set_bonding_duration(2)); + assert_ok!(Staking::set_bonding_duration(Origin::ROOT, 2)); assert_eq!(Staking::bonding_duration(), 2); // Block 1: Add three validators. No obvious change. System::set_block_number(1); - assert_ok!(Staking::stake(&1)); - assert_ok!(Staking::stake(&2)); - assert_ok!(Staking::stake(&4)); + assert_ok!(Staking::stake(Origin::signed(1))); + assert_ok!(Staking::stake(Origin::signed(2))); + assert_ok!(Staking::stake(Origin::signed(4))); Session::check_rotate_session(System::block_number()); assert_eq!(Staking::current_era(), 0); assert_eq!(Session::validators(), vec![10, 20]); @@ -256,8 +256,8 @@ fn staking_should_work() { // Block 3: Unstake highest, introduce another staker. No change yet. System::set_block_number(3); - assert_ok!(Staking::stake(&3)); - assert_ok!(Staking::unstake(&4, Staking::intentions().iter().position(|&x| x == 4).unwrap() as u32)); + assert_ok!(Staking::stake(Origin::signed(3))); + assert_ok!(Staking::unstake(Origin::signed(4), Staking::intentions().iter().position(|&x| x == 4).unwrap() as u32)); assert_eq!(Staking::current_era(), 1); Session::check_rotate_session(System::block_number()); @@ -269,7 +269,7 @@ fn staking_should_work() { // Block 5: Transfer stake from highest to lowest. No change yet. System::set_block_number(5); - assert_ok!(Balances::transfer(&4, 1.into(), 40)); + assert_ok!(Balances::transfer(Origin::signed(4), 1.into(), 40)); Session::check_rotate_session(System::block_number()); // Block 6: Lowest now validator. @@ -279,7 +279,7 @@ fn staking_should_work() { // Block 7: Unstake three. No change yet. System::set_block_number(7); - assert_ok!(Staking::unstake(&3, Staking::intentions().iter().position(|&x| x == 3).unwrap() as u32)); + assert_ok!(Staking::unstake(Origin::signed(3), Staking::intentions().iter().position(|&x| x == 3).unwrap() as u32)); Session::check_rotate_session(System::block_number()); assert_eq!(Session::validators(), vec![1, 3]); @@ -299,10 +299,10 @@ fn nominating_and_rewards_should_work() { assert_eq!(Session::validators(), vec![10, 20]); System::set_block_number(1); - assert_ok!(Staking::stake(&1)); - assert_ok!(Staking::stake(&2)); - assert_ok!(Staking::stake(&3)); - assert_ok!(Staking::nominate(&4, 1.into())); + assert_ok!(Staking::stake(Origin::signed(1))); + assert_ok!(Staking::stake(Origin::signed(2))); + assert_ok!(Staking::stake(Origin::signed(3))); + assert_ok!(Staking::nominate(Origin::signed(4), 1.into())); Session::check_rotate_session(System::block_number()); assert_eq!(Staking::current_era(), 1); assert_eq!(Session::validators(), vec![1, 3]); // 4 + 1, 3 @@ -312,7 +312,7 @@ fn nominating_and_rewards_should_work() { assert_eq!(Balances::total_balance(&4), 40); System::set_block_number(2); - assert_ok!(Staking::unnominate(&4, 0)); + assert_ok!(Staking::unnominate(Origin::signed(4), 0)); Session::check_rotate_session(System::block_number()); assert_eq!(Staking::current_era(), 2); assert_eq!(Session::validators(), vec![3, 2]); @@ -322,9 +322,9 @@ fn nominating_and_rewards_should_work() { assert_eq!(Balances::total_balance(&4), 48); System::set_block_number(3); - assert_ok!(Staking::stake(&4)); - assert_ok!(Staking::unstake(&3, Staking::intentions().iter().position(|&x| x == 3).unwrap() as u32)); - assert_ok!(Staking::nominate(&3, 1.into())); + assert_ok!(Staking::stake(Origin::signed(4))); + assert_ok!(Staking::unstake(Origin::signed(3), Staking::intentions().iter().position(|&x| x == 3).unwrap() as u32)); + assert_ok!(Staking::nominate(Origin::signed(3), 1.into())); Session::check_rotate_session(System::block_number()); assert_eq!(Session::validators(), vec![1, 4]); assert_eq!(Balances::total_balance(&1), 12); @@ -345,9 +345,9 @@ fn nominating_and_rewards_should_work() { fn rewards_with_off_the_table_should_work() { with_externalities(&mut new_test_ext(0, 1, 1, 0, true, 10), || { System::set_block_number(1); - assert_ok!(Staking::stake(&1)); - assert_ok!(Staking::nominate(&2, 1.into())); - assert_ok!(Staking::stake(&3)); + assert_ok!(Staking::stake(Origin::signed(1))); + assert_ok!(Staking::nominate(Origin::signed(2), 1.into())); + assert_ok!(Staking::stake(Origin::signed(3))); Session::check_rotate_session(System::block_number()); assert_eq!(Session::validators(), vec![1, 3]); // 1 + 2, 3 assert_eq!(Balances::total_balance(&1), 10); @@ -355,7 +355,7 @@ fn rewards_with_off_the_table_should_work() { assert_eq!(Balances::total_balance(&3), 30); System::set_block_number(2); - assert_ok!(Staking::register_preferences(&1, Staking::intentions().into_iter().position(|i| i == 1).unwrap() as u32, ValidatorPrefs { unstake_threshold: 3, validator_payment: 4 })); + assert_ok!(Staking::register_preferences(Origin::signed(1), Staking::intentions().into_iter().position(|i| i == 1).unwrap() as u32, ValidatorPrefs { unstake_threshold: 3, validator_payment: 4 })); Session::check_rotate_session(System::block_number()); assert_eq!(Balances::total_balance(&1), 16); assert_eq!(Balances::total_balance(&2), 24); @@ -376,10 +376,10 @@ fn nominating_slashes_should_work() { Timestamp::set_timestamp(15); System::set_block_number(4); - assert_ok!(Staking::stake(&1)); - assert_ok!(Staking::stake(&3)); - assert_ok!(Staking::nominate(&2, 3.into())); - assert_ok!(Staking::nominate(&4, 1.into())); + assert_ok!(Staking::stake(Origin::signed(1))); + assert_ok!(Staking::stake(Origin::signed(3))); + assert_ok!(Staking::nominate(Origin::signed(2), 3.into())); + assert_ok!(Staking::nominate(Origin::signed(4), 1.into())); Session::check_rotate_session(System::block_number()); assert_eq!(Staking::current_era(), 1); @@ -404,12 +404,12 @@ fn nominating_slashes_should_work() { fn double_staking_should_fail() { with_externalities(&mut new_test_ext(0, 1, 2, 0, true, 0), || { System::set_block_number(1); - assert_ok!(Staking::stake(&1)); - assert_noop!(Staking::stake(&1), "Cannot stake if already staked."); - assert_noop!(Staking::nominate(&1, 1.into()), "Cannot nominate if already staked."); - assert_ok!(Staking::nominate(&2, 1.into())); - assert_noop!(Staking::stake(&2), "Cannot stake if already nominating."); - assert_noop!(Staking::nominate(&2, 1.into()), "Cannot nominate if already nominating."); + assert_ok!(Staking::stake(Origin::signed(1))); + assert_noop!(Staking::stake(Origin::signed(1)), "Cannot stake if already staked."); + assert_noop!(Staking::nominate(Origin::signed(1), 1.into()), "Cannot nominate if already staked."); + assert_ok!(Staking::nominate(Origin::signed(2), 1.into())); + assert_noop!(Staking::stake(Origin::signed(2)), "Cannot stake if already nominating."); + assert_noop!(Staking::nominate(Origin::signed(2), 1.into()), "Cannot nominate if already nominating."); }); } @@ -440,7 +440,7 @@ fn staking_eras_work() { // Block 3: Schedule an era length change; no visible changes. System::set_block_number(3); - assert_ok!(Staking::set_sessions_per_era(3)); + assert_ok!(Staking::set_sessions_per_era(Origin::ROOT, 3)); Session::check_rotate_session(System::block_number()); assert_eq!(Session::current_index(), 3); assert_eq!(Staking::sessions_per_era(), 2); @@ -485,8 +485,8 @@ fn staking_eras_work() { fn staking_balance_transfer_when_bonded_should_not_work() { with_externalities(&mut new_test_ext(0, 1, 3, 1, false, 0), || { Balances::set_free_balance(&1, 111); - assert_ok!(Staking::stake(&1)); - assert_noop!(Balances::transfer(&1, 2.into(), 69), "cannot transfer illiquid funds"); + assert_ok!(Staking::stake(Origin::signed(1))); + assert_noop!(Balances::transfer(Origin::signed(1), 2.into(), 69), "cannot transfer illiquid funds"); }); } From c8a993bd57da57fc3510127334f1354b85798fa2 Mon Sep 17 00:00:00 2001 From: Gav Date: Thu, 6 Sep 2018 19:41:07 +0200 Subject: [PATCH 07/21] Treasury compatible --- substrate/runtime/treasury/src/lib.rs | 82 ++++++++++++++------------- 1 file changed, 42 insertions(+), 40 deletions(-) diff --git a/substrate/runtime/treasury/src/lib.rs b/substrate/runtime/treasury/src/lib.rs index 367b807f8e637..62997209a0631 100644 --- a/substrate/runtime/treasury/src/lib.rs +++ b/substrate/runtime/treasury/src/lib.rs @@ -44,8 +44,9 @@ extern crate substrate_runtime_balances as balances; use rstd::ops::{Mul, Div}; use runtime_support::{StorageValue, StorageMap}; use runtime_support::dispatch::Result; -use runtime_primitives::traits::{As, OnFinalise, Zero, RefInto}; +use runtime_primitives::traits::{As, OnFinalise, Zero}; use balances::OnMinted; +use system::{ensure_signed, ensure_root}; /// Our module's configuration trait. All our types and consts go in here. If the /// module is dependent on specific other modules, then their configuration traits @@ -71,27 +72,19 @@ decl_module! { // is reserved and slashed if the proposal is rejected. It is returned once the // proposal is awarded. fn propose_spend(aux, value: T::Balance, beneficiary: T::AccountId) -> Result; - } - // The priviledged entry points. These are provided to allow any governance modules in - // the runtime to be able to execute common functions. Unlike for `Call` there is no - // auxilliary data to encode the sender (since there is no sender). Though still important - // to ensure that these execute in reasonable time and space, they can do what would - // otherwise be costly or unsafe operations. - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum PrivCall { // Set the balance of funds available to spend. - fn set_pot(new_pot: T::Balance) -> Result; + fn set_pot(aux, new_pot: T::Balance) -> Result; // (Re-)configure this module. - fn configure(proposal_bond: Permill, proposal_bond_minimum: T::Balance, spend_period: T::BlockNumber, burn: Permill) -> Result; + fn configure(aux, proposal_bond: Permill, proposal_bond_minimum: T::Balance, spend_period: T::BlockNumber, burn: Permill) -> Result; // Reject a proposed spend. The original deposit will be slashed. - fn reject_proposal(proposal_id: ProposalIndex) -> Result; + fn reject_proposal(aux, roposal_id: ProposalIndex) -> Result; // Approve a proposal. At a later time, the proposal will be allocated to the beneficiary // and the original deposit will be returned. - fn approve_proposal(proposal_id: ProposalIndex) -> Result; + fn approve_proposal(aux, proposal_id: ProposalIndex) -> Result; } } @@ -185,23 +178,24 @@ impl Module { // Implement Calls/PrivCalls and add public immutables and private mutables. - fn propose_spend(aux: T::Origin, value: T::Balance, beneficiary: T::AccountId) -> Result { - let proposer = aux.ref_into(); + fn propose_spend(origin: T::Origin, value: T::Balance, beneficiary: T::AccountId) -> Result { + let proposer = ensure_signed(origin)?; let bond = Self::calculate_bond(value); - >::reserve(proposer, bond) + >::reserve(&proposer, bond) .map_err(|_| "Proposer's balance too low")?; let c = Self::proposal_count(); >::put(c + 1); - >::insert(c, Proposal { proposer: proposer.clone(), value, beneficiary, bond }); + >::insert(c, Proposal { proposer, value, beneficiary, bond }); Self::deposit_event(RawEvent::Proposed(c)); Ok(()) } - fn reject_proposal(proposal_id: ProposalIndex) -> Result { + fn reject_proposal(origin: T::Origin, proposal_id: ProposalIndex) -> Result { + ensure_root(origin)?; let proposal = >::take(proposal_id).ok_or("No proposal at that index")?; let value = proposal.bond; @@ -210,7 +204,8 @@ impl Module { Ok(()) } - fn approve_proposal(proposal_id: ProposalIndex) -> Result { + fn approve_proposal(origin: T::Origin, proposal_id: ProposalIndex) -> Result { + ensure_root(origin)?; ensure!(>::exists(proposal_id), "No proposal at that index"); { @@ -224,7 +219,8 @@ impl Module { Ok(()) } - fn set_pot(new_pot: T::Balance) -> Result { + fn set_pot(origin: T::Origin, new_pot: T::Balance) -> Result { + ensure_root(origin)?; // Put the new value into storage. >::put(new_pot); @@ -233,11 +229,13 @@ impl Module { } fn configure( + origin: T::Origin, proposal_bond: Permill, proposal_bond_minimum: T::Balance, spend_period: T::BlockNumber, burn: Permill ) -> Result { + ensure_root(origin)?; >::put(proposal_bond); >::put(proposal_bond_minimum); >::put(spend_period); @@ -358,10 +356,14 @@ mod tests { use runtime_primitives::traits::{BlakeTwo256}; use runtime_primitives::testing::{Digest, Header}; + impl_outer_origin! { + pub enum Origin for Test {} + } + #[derive(Clone, Eq, PartialEq)] pub struct Test; impl system::Trait for Test { - type Origin = Self::AccountId; + type Origin = Origin; type Index = u64; type BlockNumber = u64; type Hash = H256; @@ -428,7 +430,7 @@ mod tests { #[test] fn spend_proposal_takes_min_deposit() { with_externalities(&mut new_test_ext(), || { - assert_ok!(Treasury::propose_spend(&0, 1, 3)); + assert_ok!(Treasury::propose_spend(Origin::signed(0), 1, 3)); assert_eq!(Balances::free_balance(&0), 99); assert_eq!(Balances::reserved_balance(&0), 1); }); @@ -437,7 +439,7 @@ mod tests { #[test] fn spend_proposal_takes_proportional_deposit() { with_externalities(&mut new_test_ext(), || { - assert_ok!(Treasury::propose_spend(&0, 100, 3)); + assert_ok!(Treasury::propose_spend(Origin::signed(0), 100, 3)); assert_eq!(Balances::free_balance(&0), 95); assert_eq!(Balances::reserved_balance(&0), 5); }); @@ -446,7 +448,7 @@ mod tests { #[test] fn spend_proposal_fails_when_proposer_poor() { with_externalities(&mut new_test_ext(), || { - assert_noop!(Treasury::propose_spend(&2, 100, 3), "Proposer's balance too low"); + assert_noop!(Treasury::propose_spend(Origin::signed(2), 100, 3), "Proposer's balance too low"); }); } @@ -455,8 +457,8 @@ mod tests { with_externalities(&mut new_test_ext(), || { Treasury::on_minted(100); - assert_ok!(Treasury::propose_spend(&0, 100, 3)); - assert_ok!(Treasury::approve_proposal(0)); + assert_ok!(Treasury::propose_spend(Origin::signed(0), 100, 3)); + assert_ok!(Treasury::approve_proposal(Origin::ROOT, 0)); >::on_finalise(1); assert_eq!(Balances::free_balance(&3), 0); @@ -479,8 +481,8 @@ mod tests { with_externalities(&mut new_test_ext(), || { Treasury::on_minted(100); - assert_ok!(Treasury::propose_spend(&0, 100, 3)); - assert_ok!(Treasury::reject_proposal(0)); + assert_ok!(Treasury::propose_spend(Origin::signed(0), 100, 3)); + assert_ok!(Treasury::reject_proposal(Origin::ROOT, 0)); >::on_finalise(2); assert_eq!(Balances::free_balance(&3), 0); @@ -493,23 +495,23 @@ mod tests { with_externalities(&mut new_test_ext(), || { Treasury::on_minted(100); - assert_ok!(Treasury::propose_spend(&0, 100, 3)); - assert_ok!(Treasury::reject_proposal(0)); - assert_noop!(Treasury::reject_proposal(0), "No proposal at that index"); + assert_ok!(Treasury::propose_spend(Origin::signed(0), 100, 3)); + assert_ok!(Treasury::reject_proposal(Origin::ROOT, 0)); + assert_noop!(Treasury::reject_proposal(Origin::ROOT, 0), "No proposal at that index"); }); } #[test] fn reject_non_existant_spend_proposal_fails() { with_externalities(&mut new_test_ext(), || { - assert_noop!(Treasury::reject_proposal(0), "No proposal at that index"); + assert_noop!(Treasury::reject_proposal(Origin::ROOT, 0), "No proposal at that index"); }); } #[test] fn accept_non_existant_spend_proposal_fails() { with_externalities(&mut new_test_ext(), || { - assert_noop!(Treasury::approve_proposal(0), "No proposal at that index"); + assert_noop!(Treasury::approve_proposal(Origin::ROOT, 0), "No proposal at that index"); }); } @@ -518,9 +520,9 @@ mod tests { with_externalities(&mut new_test_ext(), || { Treasury::on_minted(100); - assert_ok!(Treasury::propose_spend(&0, 100, 3)); - assert_ok!(Treasury::reject_proposal(0)); - assert_noop!(Treasury::approve_proposal(0), "No proposal at that index"); + assert_ok!(Treasury::propose_spend(Origin::signed(0), 100, 3)); + assert_ok!(Treasury::reject_proposal(Origin::ROOT, 0)); + assert_noop!(Treasury::approve_proposal(Origin::ROOT, 0), "No proposal at that index"); }); } @@ -529,8 +531,8 @@ mod tests { with_externalities(&mut new_test_ext(), || { Treasury::on_minted(100); - assert_ok!(Treasury::propose_spend(&0, 100, 3)); - assert_ok!(Treasury::approve_proposal(0)); + assert_ok!(Treasury::propose_spend(Origin::signed(0), 100, 3)); + assert_ok!(Treasury::approve_proposal(Origin::ROOT, 0)); >::on_finalise(2); assert_eq!(Balances::free_balance(&3), 100); @@ -543,8 +545,8 @@ mod tests { with_externalities(&mut new_test_ext(), || { Treasury::on_minted(100); - assert_ok!(Treasury::propose_spend(&0, 150, 3)); - assert_ok!(Treasury::approve_proposal(0)); + assert_ok!(Treasury::propose_spend(Origin::signed(0), 150, 3)); + assert_ok!(Treasury::approve_proposal(Origin::ROOT, 0)); >::on_finalise(2); assert_eq!(Treasury::pot(), 100); From 3d4f393cfc7abbf0dddb6bc1256004d2417e6fe6 Mon Sep 17 00:00:00 2001 From: Gav Date: Thu, 6 Sep 2018 19:47:40 +0200 Subject: [PATCH 08/21] Expunge MaybeEmpty --- substrate/runtime/primitives/src/traits.rs | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/substrate/runtime/primitives/src/traits.rs b/substrate/runtime/primitives/src/traits.rs index 8c3a43f93e4b5..e47e28eebb397 100644 --- a/substrate/runtime/primitives/src/traits.rs +++ b/substrate/runtime/primitives/src/traits.rs @@ -108,24 +108,6 @@ impl Convert for () { fn convert(_: T) -> () { () } } -pub trait MaybeEmpty { - fn is_empty(&self) -> bool; -} - -// AccountId is `u64` in tests -impl MaybeEmpty for u64 { - fn is_empty(&self) -> bool { - self.is_zero() - } -} - -// AccountId is H256 in production -impl MaybeEmpty for substrate_primitives::H256 { - fn is_empty(&self) -> bool { - self.is_zero() - } -} - pub trait RefInto { fn ref_into(&self) -> &T; } From f1a1e6a9bc5101bff2bf68350837644c94508393 Mon Sep 17 00:00:00 2001 From: Gav Date: Thu, 6 Sep 2018 21:57:55 +0200 Subject: [PATCH 09/21] Make democracy work --- substrate/runtime-support/src/dispatch.rs | 2 +- substrate/runtime/democracy/Cargo.toml | 1 + substrate/runtime/democracy/src/lib.rs | 124 ++++++++++++---------- substrate/runtime/system/src/lib.rs | 2 +- 4 files changed, 69 insertions(+), 60 deletions(-) diff --git a/substrate/runtime-support/src/dispatch.rs b/substrate/runtime-support/src/dispatch.rs index 1b92c87abad83..aa6bba1d9d890 100644 --- a/substrate/runtime-support/src/dispatch.rs +++ b/substrate/runtime-support/src/dispatch.rs @@ -524,7 +524,7 @@ macro_rules! impl_outer_dispatch { fn dispatch(self, aux: $aux) -> $crate::dispatch::Result { match self { $( - $call_type::$camelcase(call) => call.dispatch(&aux), + $call_type::$camelcase(call) => call.dispatch(aux), )* } } diff --git a/substrate/runtime/democracy/Cargo.toml b/substrate/runtime/democracy/Cargo.toml index 602bf1adb4190..4667e22be3781 100644 --- a/substrate/runtime/democracy/Cargo.toml +++ b/substrate/runtime/democracy/Cargo.toml @@ -31,6 +31,7 @@ std = [ "substrate-runtime-io/std", "substrate-runtime-support/std", "substrate-runtime-primitives/std", + "substrate-runtime-consensus/std", "substrate-runtime-balances/std", "substrate-runtime-system/std", ] diff --git a/substrate/runtime/democracy/src/lib.rs b/substrate/runtime/democracy/src/lib.rs index 059d61f7700d4..90ccfc5af8549 100644 --- a/substrate/runtime/democracy/src/lib.rs +++ b/substrate/runtime/democracy/src/lib.rs @@ -43,9 +43,10 @@ extern crate substrate_runtime_system as system; use rstd::prelude::*; use rstd::result; -use primitives::traits::{Zero, OnFinalise, RefInto, As, MaybeSerializeDebug}; -use substrate_runtime_support::{StorageValue, StorageMap, Parameter, Dispatchable, IsSubType}; +use primitives::traits::{Zero, OnFinalise, As, MaybeSerializeDebug}; +use substrate_runtime_support::{StorageValue, StorageMap, Parameter, AuxDispatchable, IsAuxSubType}; use substrate_runtime_support::dispatch::Result; +use system::{ensure_signed, ensure_root}; #[cfg(any(feature = "std", test))] use std::collections::HashMap; @@ -59,7 +60,7 @@ pub type PropIndex = u32; pub type ReferendumIndex = u32; pub trait Trait: balances::Trait + Sized { - type Proposal: Parameter + Dispatchable + IsSubType> + MaybeSerializeDebug; + type Proposal: Parameter + AuxDispatchable + IsAuxSubType> + MaybeSerializeDebug; } decl_module! { @@ -70,12 +71,9 @@ decl_module! { fn propose(aux, proposal: Box, value: T::Balance) -> Result; fn second(aux, proposal: PropIndex) -> Result; fn vote(aux, ref_index: ReferendumIndex, approve_proposal: bool) -> Result; - } - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum PrivCall { - fn start_referendum(proposal: Box, vote_threshold: VoteThreshold) -> Result; - fn cancel_referendum(ref_index: ReferendumIndex) -> Result; + fn start_referendum(aux, proposal: Box, vote_threshold: VoteThreshold) -> Result; + fn cancel_referendum(aux, ref_index: ReferendumIndex) -> Result; } } @@ -156,49 +154,53 @@ impl Module { // dispatching. /// Propose a sensitive action to be taken. - fn propose(aux: T::Origin, proposal: Box, value: T::Balance) -> Result { + fn propose(origin: T::Origin, proposal: Box, value: T::Balance) -> Result { + let who = ensure_signed(origin)?; ensure!(value >= Self::minimum_deposit(), "value too low"); - >::reserve(aux.ref_into(), value) + >::reserve(&who, value) .map_err(|_| "proposer's balance too low")?; let index = Self::public_prop_count(); >::put(index + 1); - >::insert(index, (value, vec![aux.ref_into().clone()])); + >::insert(index, (value, vec![who.clone()])); let mut props = Self::public_props(); - props.push((index, (*proposal).clone(), aux.ref_into().clone())); + props.push((index, (*proposal).clone(), who)); >::put(props); Ok(()) } /// Propose a sensitive action to be taken. - fn second(aux: T::Origin, proposal: PropIndex) -> Result { + fn second(origin: T::Origin, proposal: PropIndex) -> Result { + let who = ensure_signed(origin)?; let mut deposit = Self::deposit_of(proposal) .ok_or("can only second an existing proposal")?; - >::reserve(aux.ref_into(), deposit.0) + >::reserve(&who, deposit.0) .map_err(|_| "seconder's balance too low")?; - deposit.1.push(aux.ref_into().clone()); + deposit.1.push(who); >::insert(proposal, deposit); Ok(()) } /// Vote in a referendum. If `approve_proposal` is true, the vote is to enact the proposal; /// false would be a vote to keep the status quo.. - fn vote(aux: T::Origin, ref_index: ReferendumIndex, approve_proposal: bool) -> Result { + fn vote(origin: T::Origin, ref_index: ReferendumIndex, approve_proposal: bool) -> Result { + let who = ensure_signed(origin)?; ensure!(Self::is_active_referendum(ref_index), "vote given for invalid referendum."); - ensure!(!>::total_balance(aux.ref_into()).is_zero(), + ensure!(!>::total_balance(&who).is_zero(), "transactor must have balance to signal approval."); - if !>::exists(&(ref_index, aux.ref_into().clone())) { + if !>::exists(&(ref_index, who.clone())) { let mut voters = Self::voters_for(ref_index); - voters.push(aux.ref_into().clone()); + voters.push(who.clone()); >::insert(ref_index, voters); } - >::insert(&(ref_index, aux.ref_into().clone()), approve_proposal); + >::insert(&(ref_index, who), approve_proposal); Ok(()) } /// Start a referendum. - fn start_referendum(proposal: Box, vote_threshold: VoteThreshold) -> Result { + fn start_referendum(origin: T::Origin, proposal: Box, vote_threshold: VoteThreshold) -> Result { + ensure_root(origin)?; Self::inject_referendum( >::block_number() + Self::voting_period(), *proposal, @@ -207,7 +209,8 @@ impl Module { } /// Remove a referendum. - fn cancel_referendum(ref_index: ReferendumIndex) -> Result { + fn cancel_referendum(origin: T::Origin, ref_index: ReferendumIndex) -> Result { + ensure_root(origin)?; Self::clear_referendum(ref_index); Ok(()) } @@ -280,7 +283,7 @@ impl Module { let total_stake = >::total_stake(); Self::clear_referendum(index); if vote_threshold.approved(approve, against, total_stake) { - proposal.dispatch()?; + proposal.dispatch(system::RawOrigin::Root.into())?; } >::put(index + 1); } @@ -355,18 +358,23 @@ mod tests { use primitives::testing::{Digest, Header}; impl_outer_dispatch! { - #[derive(Debug, Clone, Eq, Serialize, Deserialize, PartialEq)] - pub enum Proposal { + #[derive(Clone, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] + pub enum Call where aux: ::Origin { Balances, Democracy, } } + impl_outer_origin! { + pub enum Origin for Test {} + } + // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, Eq, PartialEq, Debug, Serialize, Deserialize)] pub struct Test; impl system::Trait for Test { - type Origin = Self::AccountId; + type Origin = Origin; type Index = u64; type BlockNumber = u64; type Hash = H256; @@ -384,7 +392,7 @@ mod tests { type Event = (); } impl Trait for Test { - type Proposal = Proposal; + type Proposal = Call; } fn new_test_ext() -> runtime_io::TestExternalities { @@ -422,12 +430,12 @@ mod tests { }); } - fn set_balance_proposal(value: u64) -> Proposal { - Proposal::Balances(balances::PrivCall::set_balance(balances::address::Address::Id(42), value, 0)) + fn set_balance_proposal(value: u64) -> Call { + Call::Balances(balances::Call::set_balance(balances::address::Address::Id(42), value, 0)) } fn propose_set_balance(who: u64, value: u64, locked: u64) -> super::Result { - Democracy::propose(&who, Box::new(set_balance_proposal(value)), locked) + Democracy::propose(Origin::signed(who), Box::new(set_balance_proposal(value)), locked) } #[test] @@ -452,7 +460,7 @@ mod tests { System::set_block_number(2); let r = 0; - assert_ok!(Democracy::vote(&1, r, true)); + assert_ok!(Democracy::vote(Origin::signed(1), r, true)); assert_eq!(Democracy::referendum_count(), 1); assert_eq!(Democracy::voters_for(r), vec![1]); @@ -470,10 +478,10 @@ mod tests { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); assert_ok!(propose_set_balance(1, 2, 5)); - assert_ok!(Democracy::second(&2, 0)); - assert_ok!(Democracy::second(&5, 0)); - assert_ok!(Democracy::second(&5, 0)); - assert_ok!(Democracy::second(&5, 0)); + assert_ok!(Democracy::second(Origin::signed(2), 0)); + assert_ok!(Democracy::second(Origin::signed(5), 0)); + assert_ok!(Democracy::second(Origin::signed(5), 0)); + assert_ok!(Democracy::second(Origin::signed(5), 0)); assert_eq!(Balances::free_balance(&1), 5); assert_eq!(Balances::free_balance(&2), 15); assert_eq!(Balances::free_balance(&5), 35); @@ -485,10 +493,10 @@ mod tests { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); assert_ok!(propose_set_balance(1, 2, 5)); - assert_ok!(Democracy::second(&2, 0)); - assert_ok!(Democracy::second(&5, 0)); - assert_ok!(Democracy::second(&5, 0)); - assert_ok!(Democracy::second(&5, 0)); + assert_ok!(Democracy::second(Origin::signed(2), 0)); + assert_ok!(Democracy::second(Origin::signed(5), 0)); + assert_ok!(Democracy::second(Origin::signed(5), 0)); + assert_ok!(Democracy::second(Origin::signed(5), 0)); assert_eq!(Democracy::end_block(System::block_number()), Ok(())); assert_eq!(Balances::free_balance(&1), 10); assert_eq!(Balances::free_balance(&2), 20); @@ -517,7 +525,7 @@ mod tests { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); assert_ok!(propose_set_balance(2, 2, 11)); - assert_noop!(Democracy::second(&1, 0), "seconder\'s balance too low"); + assert_noop!(Democracy::second(Origin::signed(1), 0), "seconder\'s balance too low"); }); } @@ -531,17 +539,17 @@ mod tests { assert_eq!(Democracy::end_block(System::block_number()), Ok(())); System::set_block_number(1); - assert_ok!(Democracy::vote(&1, 0, true)); + assert_ok!(Democracy::vote(Origin::signed(1), 0, true)); assert_eq!(Democracy::end_block(System::block_number()), Ok(())); assert_eq!(Balances::free_balance(&42), 4); System::set_block_number(2); - assert_ok!(Democracy::vote(&1, 1, true)); + assert_ok!(Democracy::vote(Origin::signed(1), 1, true)); assert_eq!(Democracy::end_block(System::block_number()), Ok(())); assert_eq!(Balances::free_balance(&42), 3); System::set_block_number(3); - assert_ok!(Democracy::vote(&1, 2, true)); + assert_ok!(Democracy::vote(Origin::signed(1), 2, true)); assert_eq!(Democracy::end_block(System::block_number()), Ok(())); }); } @@ -551,7 +559,7 @@ mod tests { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove).unwrap(); - assert_ok!(Democracy::vote(&1, r, true)); + assert_ok!(Democracy::vote(Origin::signed(1), r, true)); assert_eq!(Democracy::voters_for(r), vec![1]); assert_eq!(Democracy::vote_of((r, 1)), Some(true)); @@ -568,8 +576,8 @@ mod tests { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove).unwrap(); - assert_ok!(Democracy::vote(&1, r, true)); - assert_ok!(Democracy::cancel_referendum(r)); + assert_ok!(Democracy::vote(Origin::signed(1), r, true)); + assert_ok!(Democracy::cancel_referendum(Origin::ROOT, r)); assert_eq!(Democracy::end_block(System::block_number()), Ok(())); @@ -582,7 +590,7 @@ mod tests { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove).unwrap(); - assert_ok!(Democracy::vote(&1, r, false)); + assert_ok!(Democracy::vote(Origin::signed(1), r, false)); assert_eq!(Democracy::voters_for(r), vec![1]); assert_eq!(Democracy::vote_of((r, 1)), Some(false)); @@ -599,12 +607,12 @@ mod tests { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove).unwrap(); - assert_ok!(Democracy::vote(&1, r, true)); - assert_ok!(Democracy::vote(&2, r, false)); - assert_ok!(Democracy::vote(&3, r, false)); - assert_ok!(Democracy::vote(&4, r, true)); - assert_ok!(Democracy::vote(&5, r, false)); - assert_ok!(Democracy::vote(&6, r, true)); + assert_ok!(Democracy::vote(Origin::signed(1), r, true)); + assert_ok!(Democracy::vote(Origin::signed(2), r, false)); + assert_ok!(Democracy::vote(Origin::signed(3), r, false)); + assert_ok!(Democracy::vote(Origin::signed(4), r, true)); + assert_ok!(Democracy::vote(Origin::signed(5), r, false)); + assert_ok!(Democracy::vote(Origin::signed(6), r, true)); assert_eq!(Democracy::tally(r), (110, 100)); @@ -619,8 +627,8 @@ mod tests { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove).unwrap(); - assert_ok!(Democracy::vote(&5, r, false)); - assert_ok!(Democracy::vote(&6, r, true)); + assert_ok!(Democracy::vote(Origin::signed(5), r, false)); + assert_ok!(Democracy::vote(Origin::signed(6), r, true)); assert_eq!(Democracy::tally(r), (60, 50)); @@ -638,9 +646,9 @@ mod tests { System::set_block_number(1); let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove).unwrap(); - assert_ok!(Democracy::vote(&4, r, true)); - assert_ok!(Democracy::vote(&5, r, false)); - assert_ok!(Democracy::vote(&6, r, true)); + assert_ok!(Democracy::vote(Origin::signed(4), r, true)); + assert_ok!(Democracy::vote(Origin::signed(5), r, false)); + assert_ok!(Democracy::vote(Origin::signed(6), r, true)); assert_eq!(Democracy::tally(r), (100, 50)); diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index e638706bc4f65..2e890d7e16c89 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -69,7 +69,7 @@ pub fn extrinsics_data_root(xts: Vec>) -> H::Output { } pub trait Trait: Eq + Clone { - type Origin: Into>>; + type Origin: Into>> + From>; type Index: Parameter + Member + Default + MaybeDisplay + SimpleArithmetic + Copy; type BlockNumber: Parameter + Member + MaybeDisplay + SimpleArithmetic + Default + Bounded + Copy + rstd::hash::Hash; type Hash: Parameter + Member + MaybeDisplay + SimpleBitOps + Default + Copy + CheckEqual + rstd::hash::Hash + AsRef<[u8]>; From 7ab1505753fa1d93179d710d083c0a026e50a0c8 Mon Sep 17 00:00:00 2001 From: Gav Date: Thu, 6 Sep 2018 22:30:21 +0200 Subject: [PATCH 10/21] Council compatible --- substrate/runtime/council/src/lib.rs | 511 ++++++++++++------------ substrate/runtime/council/src/voting.rs | 129 +++--- 2 files changed, 332 insertions(+), 308 deletions(-) diff --git a/substrate/runtime/council/src/lib.rs b/substrate/runtime/council/src/lib.rs index eac6ec8b5063d..71cee0b6affc7 100644 --- a/substrate/runtime/council/src/lib.rs +++ b/substrate/runtime/council/src/lib.rs @@ -28,7 +28,7 @@ extern crate serde_derive; extern crate integer_sqrt; extern crate substrate_codec as codec; extern crate substrate_primitives; -#[cfg(any(feature = "std", test))] extern crate substrate_keyring as keyring; +#[cfg(feature = "std")] extern crate substrate_keyring as keyring; #[macro_use] extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_io as runtime_io; #[macro_use] extern crate substrate_runtime_support; @@ -38,12 +38,13 @@ extern crate substrate_runtime_democracy as democracy; extern crate substrate_runtime_system as system; use rstd::prelude::*; -use primitives::traits::{Zero, One, RefInto, As, AuxLookup}; +#[cfg(feature = "std")] +use std::collections::HashMap; +use primitives::traits::{Zero, One, As, AuxLookup}; use substrate_runtime_support::{StorageValue, StorageMap}; use substrate_runtime_support::dispatch::Result; use balances::address::Address; -#[cfg(any(feature = "std", test))] -use std::collections::HashMap; +use system::{ensure_signed, ensure_root}; pub mod voting; @@ -111,18 +112,15 @@ decl_module! { #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum Call where aux: T::Origin { fn set_approvals(aux, votes: Vec, index: VoteIndex) -> Result; - fn reap_inactive_voter(aux, signed_index: u32, who: Address, who_index: u32, assumed_vote_index: VoteIndex) -> Result; + fn reap_inactive_voter(aux, reporter_index: u32, who: Address, who_index: u32, assumed_vote_index: VoteIndex) -> Result; fn retract_voter(aux, index: u32) -> Result; fn submit_candidacy(aux, slot: u32) -> Result; fn present_winner(aux, candidate: Address, total: T::Balance, index: VoteIndex) -> Result; - } - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum PrivCall { - fn set_desired_seats(count: u32) -> Result; - fn remove_member(who: Address) -> Result; - fn set_presentation_duration(count: T::BlockNumber) -> Result; - fn set_term_duration(count: T::BlockNumber) -> Result; + fn set_desired_seats(aux, count: u32) -> Result; + fn remove_member(aux, who: Address) -> Result; + fn set_presentation_duration(aux, count: T::BlockNumber) -> Result; + fn set_term_duration(aux, count: T::BlockNumber) -> Result; } } @@ -235,22 +233,24 @@ impl Module { /// Set candidate approvals. Approval slots stay valid as long as candidates in those slots /// are registered. - fn set_approvals(aux: T::Origin, votes: Vec, index: VoteIndex) -> Result { + fn set_approvals(origin: T::Origin, votes: Vec, index: VoteIndex) -> Result { + let who = ensure_signed(origin)?; + ensure!(!Self::presentation_active(), "no approval changes during presentation period"); ensure!(index == Self::vote_index(), "incorrect vote index"); - if !>::exists(aux.ref_into()) { + if !>::exists(&who) { // not yet a voter - deduct bond. // NOTE: this must be the last potential bailer, since it changes state. - >::reserve(aux.ref_into(), Self::voting_bond())?; + >::reserve(&who, Self::voting_bond())?; >::put({ let mut v = Self::voters(); - v.push(aux.ref_into().clone()); + v.push(who.clone()); v }); } - >::insert(aux.ref_into().clone(), votes); - >::insert(aux.ref_into(), index); + >::insert(&who, index); + >::insert(&who, votes); Ok(()) } @@ -260,22 +260,24 @@ impl Module { /// /// May be called by anyone. Returns the voter deposit to `signed`. fn reap_inactive_voter( - aux: T::Origin, - signed_index: u32, + origin: T::Origin, + reporter_index: u32, who: Address, who_index: u32, assumed_vote_index: VoteIndex ) -> Result { + let reporter = ensure_signed(origin)?; + let who = >::lookup(who)?; ensure!(!Self::presentation_active(), "cannot reap during presentation period"); - ensure!(Self::voter_last_active(aux.ref_into()).is_some(), "reaper must be a voter"); + ensure!(Self::voter_last_active(&reporter).is_some(), "reporter must be a voter"); let last_active = Self::voter_last_active(&who).ok_or("target for inactivity cleanup must be active")?; ensure!(assumed_vote_index == Self::vote_index(), "vote index not current"); ensure!(last_active < assumed_vote_index - Self::inactivity_grace_period(), "cannot reap during grace perid"); let voters = Self::voters(); - let signed_index = signed_index as usize; + let reporter_index = reporter_index as usize; let who_index = who_index as usize; - ensure!(signed_index < voters.len() && &voters[signed_index] == aux.ref_into(), "bad reporter index"); + ensure!(reporter_index < voters.len() && voters[reporter_index] == reporter, "bad reporter index"); ensure!(who_index < voters.len() && voters[who_index] == who, "bad target index"); // will definitely kill one of signed or who now. @@ -289,39 +291,43 @@ impl Module { ); Self::remove_voter( - if valid { &who } else { aux.ref_into() }, - if valid { who_index } else { signed_index }, + if valid { &who } else { &reporter }, + if valid { who_index } else { reporter_index }, voters ); if valid { // This only fails if `who` doesn't exist, which it clearly must do since its the aux. // Still, it's no more harmful to propagate any error at this point. - >::repatriate_reserved(&who, aux.ref_into(), Self::voting_bond())?; + >::repatriate_reserved(&who, &reporter, Self::voting_bond())?; } else { - >::slash_reserved(aux.ref_into(), Self::voting_bond()); + >::slash_reserved(&reporter, Self::voting_bond()); } Ok(()) } /// Remove a voter. All votes are cancelled and the voter deposit is returned. - fn retract_voter(aux: T::Origin, index: u32) -> Result { + fn retract_voter(origin: T::Origin, index: u32) -> Result { + let who = ensure_signed(origin)?; + ensure!(!Self::presentation_active(), "cannot retract when presenting"); - ensure!(>::exists(aux.ref_into()), "cannot retract non-voter"); + ensure!(>::exists(&who), "cannot retract non-voter"); let voters = Self::voters(); let index = index as usize; ensure!(index < voters.len(), "retraction index invalid"); - ensure!(&voters[index] == aux.ref_into(), "retraction index mismatch"); + ensure!(voters[index] == who, "retraction index mismatch"); - Self::remove_voter(aux.ref_into(), index, voters); - >::unreserve(aux.ref_into(), Self::voting_bond()); + Self::remove_voter(&who, index, voters); + >::unreserve(&who, Self::voting_bond()); Ok(()) } /// Submit oneself for candidacy. /// /// Account must have enough transferrable funds in it to pay the bond. - fn submit_candidacy(aux: T::Origin, slot: u32) -> Result { - ensure!(!Self::is_a_candidate(aux.ref_into()), "duplicate candidate submission"); + fn submit_candidacy(origin: T::Origin, slot: u32) -> Result { + let who = ensure_signed(origin)?; + + ensure!(!Self::is_a_candidate(&who), "duplicate candidate submission"); let slot = slot as usize; let count = Self::candidate_count() as usize; let candidates = Self::candidates(); @@ -331,18 +337,18 @@ impl Module { "invalid candidate slot" ); // NOTE: This must be last as it has side-effects. - >::reserve(aux.ref_into(), Self::candidacy_bond()) + >::reserve(&who, Self::candidacy_bond()) .map_err(|_| "candidate has not enough funds")?; + >::insert(&who, (Self::vote_index(), slot as u32)); let mut candidates = candidates; if slot == candidates.len() { - candidates.push(aux.ref_into().clone()); + candidates.push(who); } else { - candidates[slot] = aux.ref_into().clone(); + candidates[slot] = who; } >::put(candidates); >::put(count as u32 + 1); - >::insert(aux.ref_into(), (Self::vote_index(), slot as u32)); Ok(()) } @@ -350,18 +356,20 @@ impl Module { /// Only works if the `block_number >= current_vote().0` and `< current_vote().0 + presentation_duration()`` /// `signed` should have at least fn present_winner( - aux: T::Origin, + origin: T::Origin, candidate: Address, total: T::Balance, index: VoteIndex ) -> Result { + let who = ensure_signed(origin)?; + let candidate = >::lookup(candidate)?; ensure!(index == Self::vote_index(), "index not current"); let (_, _, expiring) = Self::next_finalise().ok_or("cannot present outside of presentation period")?; let stakes = Self::snapshoted_stakes(); let voters = Self::voters(); let bad_presentation_punishment = Self::present_slash_per_voter() * T::Balance::sa(voters.len() as u64); - ensure!(>::can_slash(aux.ref_into(), bad_presentation_punishment), "presenter must have sufficient slashable funds"); + ensure!(>::can_slash(&who, bad_presentation_punishment), "presenter must have sufficient slashable funds"); let mut leaderboard = Self::leaderboard().ok_or("leaderboard must exist while present phase active")?; ensure!(total > leaderboard[0].0, "candidate not worthy of leaderboard"); @@ -392,7 +400,7 @@ impl Module { } else { // we can rest assured it will be Ok since we checked `can_slash` earlier; still // better safe than sorry. - let _ = >::slash(aux.ref_into(), bad_presentation_punishment); + let _ = >::slash(&who, bad_presentation_punishment); Err(if dupe { "duplicate presentation" } else { "incorrect total" }) } } @@ -400,7 +408,8 @@ impl Module { /// Set the desired member count; if lower than the current count, then seats will not be up /// election when they expire. If more, then a new vote will be started if one is not already /// in progress. - fn set_desired_seats(count: u32) -> Result { + fn set_desired_seats(origin: T::Origin, count: u32) -> Result { + ensure_root(origin)?; >::put(count); Ok(()) } @@ -408,7 +417,8 @@ impl Module { /// Remove a particular member. A tally will happen instantly (if not already in a presentation /// period) to fill the seat if removal means that the desired members are not met. /// This is effective immediately. - fn remove_member(who: Address) -> Result { + fn remove_member(origin: T::Origin, who: Address) -> Result { + ensure_root(origin)?; let who = >::lookup(who)?; let new_council: Vec<(T::AccountId, T::BlockNumber)> = Self::active_council() .into_iter() @@ -420,14 +430,16 @@ impl Module { /// Set the presentation duration. If there is current a vote being presented for, will /// invoke `finalise_vote`. - fn set_presentation_duration(count: T::BlockNumber) -> Result { + fn set_presentation_duration(origin: T::Origin, count: T::BlockNumber) -> Result { + ensure_root(origin)?; >::put(count); Ok(()) } /// Set the presentation duration. If there is current a vote being presented for, will /// invoke `finalise_vote`. - fn set_term_duration(count: T::BlockNumber) -> Result { + fn set_term_duration(origin: T::Origin, count: T::BlockNumber) -> Result { + ensure_root(origin)?; >::put(count); Ok(()) } @@ -543,7 +555,7 @@ impl Module { } } -#[cfg(any(feature = "std", test))] +#[cfg(feature = "std")] #[derive(Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[serde(deny_unknown_fields)] @@ -566,7 +578,7 @@ pub struct GenesisConfig { pub voting_period: T::BlockNumber, } -#[cfg(any(feature = "std", test))] +#[cfg(feature = "std")] impl Default for GenesisConfig { fn default() -> Self { GenesisConfig { @@ -586,7 +598,7 @@ impl Default for GenesisConfig { } } -#[cfg(any(feature = "std", test))] +#[cfg(feature = "std")] impl primitives::BuildStorage for GenesisConfig { fn build_storage(self) -> ::std::result::Result, Vec>, String> { @@ -623,18 +635,23 @@ mod tests { use substrate_primitives::KeccakHasher; impl_outer_dispatch! { - #[derive(Debug, Clone, Eq, Serialize, Deserialize, PartialEq)] - pub enum Proposal { + #[derive(Clone, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] + pub enum Call where aux: ::Origin { Balances, Democracy, } } + impl_outer_origin! { + pub enum Origin for Test {} + } + // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, Eq, PartialEq, Debug, Serialize, Deserialize)] pub struct Test; impl system::Trait for Test { - type Origin = Self::AccountId; + type Origin = Origin; type Index = u64; type BlockNumber = u64; type Hash = H256; @@ -652,7 +669,7 @@ mod tests { type Event = (); } impl democracy::Trait for Test { - type Proposal = Proposal; + type Proposal = Call; } impl Trait for Test {} @@ -740,14 +757,14 @@ mod tests { assert_eq!(Council::is_a_candidate(&1), false); assert_eq!(Council::is_a_candidate(&2), false); - assert_ok!(Council::submit_candidacy(&1, 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); assert_eq!(Council::candidates(), vec![1]); assert_eq!(Council::candidate_reg_info(1), Some((0, 0))); assert_eq!(Council::candidate_reg_info(2), None); assert_eq!(Council::is_a_candidate(&1), true); assert_eq!(Council::is_a_candidate(&2), false); - assert_ok!(Council::submit_candidacy(&2, 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); assert_eq!(Council::candidates(), vec![1, 2]); assert_eq!(Council::candidate_reg_info(1), Some((0, 0))); assert_eq!(Council::candidate_reg_info(2), Some((0, 1))); @@ -774,10 +791,10 @@ mod tests { System::set_block_number(1); assert_eq!(Council::candidates(), vec![0, 0, 1]); - assert_ok!(Council::submit_candidacy(&2, 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); assert_eq!(Council::candidates(), vec![0, 2, 1]); - assert_ok!(Council::submit_candidacy(&3, 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 0)); assert_eq!(Council::candidates(), vec![3, 2, 1]); }); } @@ -790,10 +807,10 @@ mod tests { System::set_block_number(1); assert_eq!(Council::candidates(), vec![0, 0, 1]); - assert_ok!(Council::submit_candidacy(&2, 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); assert_eq!(Council::candidates(), vec![2, 0, 1]); - assert_ok!(Council::submit_candidacy(&3, 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 1)); assert_eq!(Council::candidates(), vec![2, 3, 1]); }); } @@ -802,7 +819,7 @@ mod tests { fn candidate_submission_not_using_free_slot_should_not_work() { with_externalities(&mut new_test_ext_with_candidate_holes(), || { System::set_block_number(1); - assert_noop!(Council::submit_candidacy(&4, 3), "invalid candidate slot"); + assert_noop!(Council::submit_candidacy(Origin::signed(4), 3), "invalid candidate slot"); }); } @@ -811,7 +828,7 @@ mod tests { with_externalities(&mut new_test_ext(false), || { System::set_block_number(1); assert_eq!(Council::candidates(), Vec::::new()); - assert_noop!(Council::submit_candidacy(&1, 1), "invalid candidate slot"); + assert_noop!(Council::submit_candidacy(Origin::signed(1), 1), "invalid candidate slot"); }); } @@ -820,9 +837,9 @@ mod tests { with_externalities(&mut new_test_ext(false), || { System::set_block_number(1); assert_eq!(Council::candidates(), Vec::::new()); - assert_ok!(Council::submit_candidacy(&1, 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); assert_eq!(Council::candidates(), vec![1]); - assert_noop!(Council::submit_candidacy(&2, 0), "invalid candidate slot"); + assert_noop!(Council::submit_candidacy(Origin::signed(2), 0), "invalid candidate slot"); }); } @@ -831,9 +848,9 @@ mod tests { with_externalities(&mut new_test_ext(false), || { System::set_block_number(1); assert_eq!(Council::candidates(), Vec::::new()); - assert_ok!(Council::submit_candidacy(&1, 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); assert_eq!(Council::candidates(), vec![1]); - assert_noop!(Council::submit_candidacy(&1, 1), "duplicate candidate submission"); + assert_noop!(Council::submit_candidacy(Origin::signed(1), 1), "duplicate candidate submission"); }); } @@ -842,7 +859,7 @@ mod tests { with_externalities(&mut new_test_ext(false), || { System::set_block_number(1); assert_eq!(Council::candidates(), Vec::::new()); - assert_noop!(Council::submit_candidacy(&7, 0), "candidate has not enough funds"); + assert_noop!(Council::submit_candidacy(Origin::signed(7), 0), "candidate has not enough funds"); }); } @@ -851,20 +868,20 @@ mod tests { with_externalities(&mut new_test_ext(false), || { System::set_block_number(1); - assert_ok!(Council::submit_candidacy(&5, 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); - assert_ok!(Council::set_approvals(&1, vec![true], 0)); - assert_ok!(Council::set_approvals(&4, vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![true], 0)); assert_eq!(Council::approvals_of(1), vec![true]); assert_eq!(Council::approvals_of(4), vec![true]); assert_eq!(Council::voters(), vec![1, 4]); - assert_ok!(Council::submit_candidacy(&2, 1)); - assert_ok!(Council::submit_candidacy(&3, 2)); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); - assert_ok!(Council::set_approvals(&2, vec![false, true, true], 0)); - assert_ok!(Council::set_approvals(&3, vec![false, true, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, true, true], 0)); assert_eq!(Council::approvals_of(1), vec![true]); assert_eq!(Council::approvals_of(4), vec![true]); @@ -880,14 +897,14 @@ mod tests { with_externalities(&mut new_test_ext(false), || { System::set_block_number(1); - assert_ok!(Council::submit_candidacy(&5, 0)); - assert_ok!(Council::set_approvals(&4, vec![true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![true], 0)); assert_eq!(Council::approvals_of(4), vec![true]); - assert_ok!(Council::submit_candidacy(&2, 1)); - assert_ok!(Council::submit_candidacy(&3, 2)); - assert_ok!(Council::set_approvals(&4, vec![true, false, true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![true, false, true], 0)); assert_eq!(Council::approvals_of(4), vec![true, false, true]); }); @@ -898,14 +915,14 @@ mod tests { with_externalities(&mut new_test_ext(false), || { System::set_block_number(1); - assert_ok!(Council::submit_candidacy(&5, 0)); - assert_ok!(Council::submit_candidacy(&2, 1)); - assert_ok!(Council::submit_candidacy(&3, 2)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); - assert_ok!(Council::set_approvals(&1, vec![true], 0)); - assert_ok!(Council::set_approvals(&2, vec![false, true, true], 0)); - assert_ok!(Council::set_approvals(&3, vec![false, true, true], 0)); - assert_ok!(Council::set_approvals(&4, vec![true, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, true, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![true, false, true], 0)); assert_eq!(Council::voters(), vec![1, 2, 3, 4]); assert_eq!(Council::approvals_of(1), vec![true]); @@ -913,7 +930,7 @@ mod tests { assert_eq!(Council::approvals_of(3), vec![false, true, true]); assert_eq!(Council::approvals_of(4), vec![true, false, true]); - assert_ok!(Council::retract_voter(&1, 0)); + assert_ok!(Council::retract_voter(Origin::signed(1), 0)); assert_eq!(Council::voters(), vec![4, 2, 3]); assert_eq!(Council::approvals_of(1), Vec::::new()); @@ -921,7 +938,7 @@ mod tests { assert_eq!(Council::approvals_of(3), vec![false, true, true]); assert_eq!(Council::approvals_of(4), vec![true, false, true]); - assert_ok!(Council::retract_voter(&2, 1)); + assert_ok!(Council::retract_voter(Origin::signed(2), 1)); assert_eq!(Council::voters(), vec![4, 3]); assert_eq!(Council::approvals_of(1), Vec::::new()); @@ -929,7 +946,7 @@ mod tests { assert_eq!(Council::approvals_of(3), vec![false, true, true]); assert_eq!(Council::approvals_of(4), vec![true, false, true]); - assert_ok!(Council::retract_voter(&3, 1)); + assert_ok!(Council::retract_voter(Origin::signed(3), 1)); assert_eq!(Council::voters(), vec![4]); assert_eq!(Council::approvals_of(1), Vec::::new()); @@ -943,11 +960,11 @@ mod tests { fn invalid_retraction_index_should_not_work() { with_externalities(&mut new_test_ext(false), || { System::set_block_number(1); - assert_ok!(Council::submit_candidacy(&3, 0)); - assert_ok!(Council::set_approvals(&1, vec![true], 0)); - assert_ok!(Council::set_approvals(&2, vec![true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 0)); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); assert_eq!(Council::voters(), vec![1, 2]); - assert_noop!(Council::retract_voter(&1, 1), "retraction index mismatch"); + assert_noop!(Council::retract_voter(Origin::signed(1), 1), "retraction index mismatch"); }); } @@ -955,9 +972,9 @@ mod tests { fn overflow_retraction_index_should_not_work() { with_externalities(&mut new_test_ext(false), || { System::set_block_number(1); - assert_ok!(Council::submit_candidacy(&3, 0)); - assert_ok!(Council::set_approvals(&1, vec![true], 0)); - assert_noop!(Council::retract_voter(&1, 1), "retraction index invalid"); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 0)); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0)); + assert_noop!(Council::retract_voter(Origin::signed(1), 1), "retraction index invalid"); }); } @@ -965,9 +982,9 @@ mod tests { fn non_voter_retraction_should_not_work() { with_externalities(&mut new_test_ext(false), || { System::set_block_number(1); - assert_ok!(Council::submit_candidacy(&3, 0)); - assert_ok!(Council::set_approvals(&1, vec![true], 0)); - assert_noop!(Council::retract_voter(&2, 0), "cannot retract non-voter"); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 0)); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0)); + assert_noop!(Council::retract_voter(Origin::signed(2), 0), "cannot retract non-voter"); }); } @@ -977,10 +994,10 @@ mod tests { System::set_block_number(4); assert!(!Council::presentation_active()); - assert_ok!(Council::submit_candidacy(&2, 0)); - assert_ok!(Council::submit_candidacy(&5, 1)); - assert_ok!(Council::set_approvals(&2, vec![true, false], 0)); - assert_ok!(Council::set_approvals(&5, vec![false, true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0)); assert_eq!(Council::voters(), vec![2, 5]); assert_eq!(Council::approvals_of(2), vec![true, false]); assert_eq!(Council::approvals_of(5), vec![false, true]); @@ -988,8 +1005,8 @@ mod tests { System::set_block_number(6); assert!(Council::presentation_active()); - assert_eq!(Council::present_winner(&4, 2.into(), 20, 0), Ok(())); - assert_eq!(Council::present_winner(&4, 5.into(), 50, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(4), 2.into(), 20, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(4), 5.into(), 50, 0), Ok(())); assert_eq!(Council::leaderboard(), Some(vec![(0, 0), (0, 0), (20, 2), (50, 5)])); assert_ok!(Council::end_block(System::block_number())); @@ -1011,16 +1028,16 @@ mod tests { assert!(Balances::can_slash(&4, 10)); System::set_block_number(4); - assert_ok!(Council::submit_candidacy(&2, 0)); - assert_ok!(Council::submit_candidacy(&5, 1)); - assert_ok!(Council::set_approvals(&2, vec![true, false], 0)); - assert_ok!(Council::set_approvals(&5, vec![false, true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); - assert_ok!(Council::present_winner(&4, 2.into(), 20, 0)); - assert_ok!(Council::present_winner(&4, 5.into(), 50, 0)); - assert_eq!(Council::present_winner(&4, 5.into(), 50, 0), Err("duplicate presentation")); + assert_ok!(Council::present_winner(Origin::signed(4), 2.into(), 20, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 5.into(), 50, 0)); + assert_eq!(Council::present_winner(Origin::signed(4), 5.into(), 50, 0), Err("duplicate presentation")); assert_ok!(Council::end_block(System::block_number())); assert_eq!(Council::active_council(), vec![(5, 11), (2, 11)]); @@ -1032,24 +1049,24 @@ mod tests { fn retracting_inactive_voter_should_work() { with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); - assert_ok!(Council::submit_candidacy(&2, 0)); - assert_ok!(Council::set_approvals(&2, vec![true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); - assert_ok!(Council::present_winner(&4, 2.into(), 20, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 2.into(), 20, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(8); - assert_ok!(Council::submit_candidacy(&5, 0)); - assert_ok!(Council::set_approvals(&5, vec![true], 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); - assert_ok!(Council::present_winner(&4, 5.into(), 50, 1)); + assert_ok!(Council::present_winner(Origin::signed(4), 5.into(), 50, 1)); assert_ok!(Council::end_block(System::block_number())); - assert_ok!(Council::reap_inactive_voter(&5, + assert_ok!(Council::reap_inactive_voter(Origin::signed(5), Council::voters().iter().position(|&i| i == 5).unwrap() as u32, 2.into(), Council::voters().iter().position(|&i| i == 2).unwrap() as u32, 2 @@ -1066,21 +1083,21 @@ mod tests { fn presenting_for_double_election_should_not_work() { with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); - assert_eq!(Council::submit_candidacy(&2, 0), Ok(())); - assert_ok!(Council::set_approvals(&2, vec![true], 0)); + assert_eq!(Council::submit_candidacy(Origin::signed(2), 0), Ok(())); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); - assert_ok!(Council::present_winner(&4, 2.into(), 20, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 2.into(), 20, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(8); - assert_eq!(Council::submit_candidacy(&2, 0), Ok(())); - assert_ok!(Council::set_approvals(&2, vec![true], 1)); + assert_eq!(Council::submit_candidacy(Origin::signed(2), 0), Ok(())); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 1)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); - assert_noop!(Council::present_winner(&4, 2.into(), 20, 1), "candidate must not form a duplicated member if elected"); + assert_noop!(Council::present_winner(Origin::signed(4), 2.into(), 20, 1), "candidate must not form a duplicated member if elected"); }); } @@ -1088,27 +1105,27 @@ mod tests { fn retracting_inactive_voter_with_other_candidates_in_slots_should_work() { with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); - assert_ok!(Council::submit_candidacy(&2, 0)); - assert_ok!(Council::set_approvals(&2, vec![true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); - assert_ok!(Council::present_winner(&4, 2.into(), 20, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 2.into(), 20, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(8); - assert_ok!(Council::submit_candidacy(&5, 0)); - assert_ok!(Council::set_approvals(&5, vec![true], 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); - assert_ok!(Council::present_winner(&4, 5.into(), 50, 1)); + assert_ok!(Council::present_winner(Origin::signed(4), 5.into(), 50, 1)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(11); - assert_ok!(Council::submit_candidacy(&1, 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); - assert_ok!(Council::reap_inactive_voter(&5, + assert_ok!(Council::reap_inactive_voter(Origin::signed(5), Council::voters().iter().position(|&i| i == 5).unwrap() as u32, 2.into(), Council::voters().iter().position(|&i| i == 2).unwrap() as u32, 2 @@ -1125,24 +1142,24 @@ mod tests { fn retracting_inactive_voter_with_bad_reporter_index_should_not_work() { with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); - assert_ok!(Council::submit_candidacy(&2, 0)); - assert_ok!(Council::set_approvals(&2, vec![true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); - assert_ok!(Council::present_winner(&4, 2.into(), 20, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 2.into(), 20, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(8); - assert_ok!(Council::submit_candidacy(&5, 0)); - assert_ok!(Council::set_approvals(&5, vec![true], 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); - assert_ok!(Council::present_winner(&4, 5.into(), 50, 1)); + assert_ok!(Council::present_winner(Origin::signed(4), 5.into(), 50, 1)); assert_ok!(Council::end_block(System::block_number())); - assert_noop!(Council::reap_inactive_voter(&2, + assert_noop!(Council::reap_inactive_voter(Origin::signed(2), 42, 2.into(), Council::voters().iter().position(|&i| i == 2).unwrap() as u32, 2 @@ -1154,24 +1171,24 @@ mod tests { fn retracting_inactive_voter_with_bad_target_index_should_not_work() { with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); - assert_ok!(Council::submit_candidacy(&2, 0)); - assert_ok!(Council::set_approvals(&2, vec![true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); - assert_ok!(Council::present_winner(&4, 2.into(), 20, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 2.into(), 20, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(8); - assert_ok!(Council::submit_candidacy(&5, 0)); - assert_ok!(Council::set_approvals(&5, vec![true], 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); - assert_ok!(Council::present_winner(&4, 5.into(), 50, 1)); + assert_ok!(Council::present_winner(Origin::signed(4), 5.into(), 50, 1)); assert_ok!(Council::end_block(System::block_number())); - assert_noop!(Council::reap_inactive_voter(&2, + assert_noop!(Council::reap_inactive_voter(Origin::signed(2), Council::voters().iter().position(|&i| i == 2).unwrap() as u32, 2.into(), 42, 2 @@ -1183,33 +1200,33 @@ mod tests { fn attempting_to_retract_active_voter_should_slash_reporter() { with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); - assert_ok!(Council::submit_candidacy(&2, 0)); - assert_ok!(Council::submit_candidacy(&3, 1)); - assert_ok!(Council::submit_candidacy(&4, 2)); - assert_ok!(Council::submit_candidacy(&5, 3)); - assert_ok!(Council::set_approvals(&2, vec![true, false, false, false], 0)); - assert_ok!(Council::set_approvals(&3, vec![false, true, false, false], 0)); - assert_ok!(Council::set_approvals(&4, vec![false, false, true, false], 0)); - assert_ok!(Council::set_approvals(&5, vec![false, false, false, true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(4), 2)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 3)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false, false, false], 0)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, true, false, false], 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, true, false], 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, true], 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); - assert_ok!(Council::present_winner(&4, 2.into(), 20, 0)); - assert_ok!(Council::present_winner(&4, 3.into(), 30, 0)); - assert_ok!(Council::present_winner(&4, 4.into(), 40, 0)); - assert_ok!(Council::present_winner(&4, 5.into(), 50, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 2.into(), 20, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 3.into(), 30, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 4.into(), 40, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 5.into(), 50, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(8); - assert_ok!(Council::set_desired_seats(3)); + assert_ok!(Council::set_desired_seats(Origin::ROOT, 3)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); - assert_ok!(Council::present_winner(&4, 2.into(), 20, 1)); - assert_ok!(Council::present_winner(&4, 3.into(), 30, 1)); + assert_ok!(Council::present_winner(Origin::signed(4), 2.into(), 20, 1)); + assert_ok!(Council::present_winner(Origin::signed(4), 3.into(), 30, 1)); assert_ok!(Council::end_block(System::block_number())); - assert_ok!(Council::reap_inactive_voter(&4, + assert_ok!(Council::reap_inactive_voter(Origin::signed(4), Council::voters().iter().position(|&i| i == 4).unwrap() as u32, 2.into(), Council::voters().iter().position(|&i| i == 2).unwrap() as u32, 2 @@ -1225,28 +1242,28 @@ mod tests { fn attempting_to_retract_inactive_voter_by_nonvoter_should_not_work() { with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); - assert_ok!(Council::submit_candidacy(&2, 0)); - assert_ok!(Council::set_approvals(&2, vec![true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); - assert_ok!(Council::present_winner(&4, 2.into(), 20, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 2.into(), 20, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(8); - assert_ok!(Council::submit_candidacy(&5, 0)); - assert_ok!(Council::set_approvals(&5, vec![true], 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); - assert_ok!(Council::present_winner(&4, 5.into(), 50, 1)); + assert_ok!(Council::present_winner(Origin::signed(4), 5.into(), 50, 1)); assert_ok!(Council::end_block(System::block_number())); - assert_noop!(Council::reap_inactive_voter(&4, + assert_noop!(Council::reap_inactive_voter(Origin::signed(4), 0, 2.into(), Council::voters().iter().position(|&i| i == 2).unwrap() as u32, 2 - ), "reaper must be a voter"); + ), "reporter must be a voter"); }); } @@ -1254,24 +1271,24 @@ mod tests { fn presenting_loser_should_not_work() { with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); - assert_ok!(Council::submit_candidacy(&1, 0)); - assert_ok!(Council::set_approvals(&6, vec![true], 0)); - assert_ok!(Council::submit_candidacy(&2, 1)); - assert_ok!(Council::set_approvals(&2, vec![false, true], 0)); - assert_ok!(Council::submit_candidacy(&3, 2)); - assert_ok!(Council::set_approvals(&3, vec![false, false, true], 0)); - assert_ok!(Council::submit_candidacy(&4, 3)); - assert_ok!(Council::set_approvals(&4, vec![false, false, false, true], 0)); - assert_ok!(Council::submit_candidacy(&5, 4)); - assert_ok!(Council::set_approvals(&5, vec![false, false, false, false, true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(4), 3)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 4)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); - assert_ok!(Council::present_winner(&4, 1.into(), 60, 0)); - assert_ok!(Council::present_winner(&4, 3.into(), 30, 0)); - assert_ok!(Council::present_winner(&4, 4.into(), 40, 0)); - assert_ok!(Council::present_winner(&4, 5.into(), 50, 0)); - assert_noop!(Council::present_winner(&4, 2.into(), 20, 0), "candidate not worthy of leaderboard"); + assert_ok!(Council::present_winner(Origin::signed(4), 1.into(), 60, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 3.into(), 30, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 4.into(), 40, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 5.into(), 50, 0)); + assert_noop!(Council::present_winner(Origin::signed(4), 2.into(), 20, 0), "candidate not worthy of leaderboard"); }); } @@ -1279,24 +1296,24 @@ mod tests { fn presenting_loser_first_should_not_matter() { with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); - assert_ok!(Council::submit_candidacy(&1, 0)); - assert_ok!(Council::set_approvals(&6, vec![true], 0)); - assert_ok!(Council::submit_candidacy(&2, 1)); - assert_ok!(Council::set_approvals(&2, vec![false, true], 0)); - assert_ok!(Council::submit_candidacy(&3, 2)); - assert_ok!(Council::set_approvals(&3, vec![false, false, true], 0)); - assert_ok!(Council::submit_candidacy(&4, 3)); - assert_ok!(Council::set_approvals(&4, vec![false, false, false, true], 0)); - assert_ok!(Council::submit_candidacy(&5, 4)); - assert_ok!(Council::set_approvals(&5, vec![false, false, false, false, true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(4), 3)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 4)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); - assert_ok!(Council::present_winner(&4, 2.into(), 20, 0)); - assert_ok!(Council::present_winner(&4, 1.into(), 60, 0)); - assert_ok!(Council::present_winner(&4, 3.into(), 30, 0)); - assert_ok!(Council::present_winner(&4, 4.into(), 40, 0)); - assert_ok!(Council::present_winner(&4, 5.into(), 50, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 2.into(), 20, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 1.into(), 60, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 3.into(), 30, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 4.into(), 40, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 5.into(), 50, 0)); assert_eq!(Council::leaderboard(), Some(vec![ (30, 3), @@ -1312,7 +1329,7 @@ mod tests { with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); assert!(!Council::presentation_active()); - assert_noop!(Council::present_winner(&5, 5.into(), 1, 0), "cannot present outside of presentation period"); + assert_noop!(Council::present_winner(Origin::signed(5), 5.into(), 1, 0), "cannot present outside of presentation period"); }); } @@ -1320,14 +1337,14 @@ mod tests { fn present_with_invalid_vote_index_should_not_work() { with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); - assert_ok!(Council::submit_candidacy(&2, 0)); - assert_ok!(Council::submit_candidacy(&5, 1)); - assert_ok!(Council::set_approvals(&2, vec![true, false], 0)); - assert_ok!(Council::set_approvals(&5, vec![false, true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); - assert_noop!(Council::present_winner(&4, 2.into(), 20, 1), "index not current"); + assert_noop!(Council::present_winner(Origin::signed(4), 2.into(), 20, 1), "index not current"); }); } @@ -1337,16 +1354,16 @@ mod tests { System::set_block_number(4); assert!(!Council::presentation_active()); - assert_ok!(Council::submit_candidacy(&1, 0)); - assert_ok!(Council::submit_candidacy(&5, 1)); - assert_ok!(Council::set_approvals(&2, vec![true, false], 0)); - assert_ok!(Council::set_approvals(&5, vec![false, true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); assert_eq!(Balances::free_balance(&1), 1); assert_eq!(Balances::reserved_balance(&1), 9); - assert_noop!(Council::present_winner(&1, 1.into(), 20, 0), "presenter must have sufficient slashable funds"); + assert_noop!(Council::present_winner(Origin::signed(1), 1.into(), 20, 0), "presenter must have sufficient slashable funds"); }); } @@ -1357,14 +1374,14 @@ mod tests { assert!(!Council::presentation_active()); assert_eq!(Balances::total_balance(&4), 40); - assert_ok!(Council::submit_candidacy(&2, 0)); - assert_ok!(Council::submit_candidacy(&5, 1)); - assert_ok!(Council::set_approvals(&2, vec![true, false], 0)); - assert_ok!(Council::set_approvals(&5, vec![false, true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); - assert_err!(Council::present_winner(&4, 2.into(), 80, 0), "incorrect total"); + assert_err!(Council::present_winner(Origin::signed(4), 2.into(), 80, 0), "incorrect total"); assert_eq!(Balances::total_balance(&4), 38); }); @@ -1376,31 +1393,31 @@ mod tests { System::set_block_number(4); assert!(!Council::presentation_active()); - assert_ok!(Council::submit_candidacy(&1, 0)); - assert_ok!(Council::set_approvals(&6, vec![true], 0)); - assert_ok!(Council::submit_candidacy(&2, 1)); - assert_ok!(Council::set_approvals(&2, vec![false, true], 0)); - assert_ok!(Council::submit_candidacy(&3, 2)); - assert_ok!(Council::set_approvals(&3, vec![false, false, true], 0)); - assert_ok!(Council::submit_candidacy(&4, 3)); - assert_ok!(Council::set_approvals(&4, vec![false, false, false, true], 0)); - assert_ok!(Council::submit_candidacy(&5, 4)); - assert_ok!(Council::set_approvals(&5, vec![false, false, false, false, true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(4), 3)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 4)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); assert!(Council::presentation_active()); - assert_ok!(Council::present_winner(&4, 1.into(), 60, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 1.into(), 60, 0)); assert_eq!(Council::leaderboard(), Some(vec![ (0, 0), (0, 0), (0, 0), (60, 1) ])); - assert_ok!(Council::present_winner(&4, 3.into(), 30, 0)); - assert_ok!(Council::present_winner(&4, 4.into(), 40, 0)); - assert_ok!(Council::present_winner(&4, 5.into(), 50, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 3.into(), 30, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 4.into(), 40, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 5.into(), 50, 0)); assert_eq!(Council::leaderboard(), Some(vec![ (30, 3), (40, 4), @@ -1433,33 +1450,33 @@ mod tests { fn second_tally_should_use_runners_up() { with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); - assert_ok!(Council::submit_candidacy(&1, 0)); - assert_ok!(Council::set_approvals(&6, vec![true], 0)); - assert_ok!(Council::submit_candidacy(&2, 1)); - assert_ok!(Council::set_approvals(&2, vec![false, true], 0)); - assert_ok!(Council::submit_candidacy(&3, 2)); - assert_ok!(Council::set_approvals(&3, vec![false, false, true], 0)); - assert_ok!(Council::submit_candidacy(&4, 3)); - assert_ok!(Council::set_approvals(&4, vec![false, false, false, true], 0)); - assert_ok!(Council::submit_candidacy(&5, 4)); - assert_ok!(Council::set_approvals(&5, vec![false, false, false, false, true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(4), 3)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 4)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); - assert_ok!(Council::present_winner(&4, 1.into(), 60, 0)); - assert_ok!(Council::present_winner(&4, 3.into(), 30, 0)); - assert_ok!(Council::present_winner(&4, 4.into(), 40, 0)); - assert_ok!(Council::present_winner(&4, 5.into(), 50, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 1.into(), 60, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 3.into(), 30, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 4.into(), 40, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 5.into(), 50, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(8); - assert_ok!(Council::set_approvals(&6, vec![false, false, true, false], 1)); - assert_ok!(Council::set_desired_seats(3)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![false, false, true, false], 1)); + assert_ok!(Council::set_desired_seats(Origin::ROOT, 3)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); - assert_ok!(Council::present_winner(&4, 3.into(), 90, 1)); - assert_ok!(Council::present_winner(&4, 4.into(), 40, 1)); + assert_ok!(Council::present_winner(Origin::signed(4), 3.into(), 90, 1)); + assert_ok!(Council::present_winner(Origin::signed(4), 4.into(), 40, 1)); assert_ok!(Council::end_block(System::block_number())); assert!(!Council::presentation_active()); diff --git a/substrate/runtime/council/src/voting.rs b/substrate/runtime/council/src/voting.rs index b5f07b660e717..51036a97482b3 100644 --- a/substrate/runtime/council/src/voting.rs +++ b/substrate/runtime/council/src/voting.rs @@ -18,12 +18,13 @@ use rstd::prelude::*; use rstd::borrow::Borrow; -use primitives::traits::{OnFinalise, RefInto, Hash}; +use primitives::traits::{OnFinalise, Hash}; use runtime_io::print; use substrate_runtime_support::dispatch::Result; -use substrate_runtime_support::{StorageValue, StorageMap, IsSubType}; +use substrate_runtime_support::{StorageValue, StorageMap, IsAuxSubType}; use {system, democracy}; use super::{Trait, Module as Council}; +use system::{ensure_signed, ensure_root}; decl_module! { pub struct Module; @@ -33,12 +34,9 @@ decl_module! { fn propose(aux, proposal: Box) -> Result; fn vote(aux, proposal: T::Hash, approve: bool) -> Result; fn veto(aux, proposal_hash: T::Hash) -> Result; - } - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum PrivCall { - fn set_cooloff_period(blocks: T::BlockNumber) -> Result; - fn set_voting_period(blocks: T::BlockNumber) -> Result; + fn set_cooloff_period(aux, blocks: T::BlockNumber) -> Result; + fn set_voting_period(aux, blocks: T::BlockNumber) -> Result; } } @@ -78,9 +76,11 @@ impl Module { } // Dispatch - fn propose(aux: T::Origin, proposal: Box) -> Result { + fn propose(origin: T::Origin, proposal: Box) -> Result { + let who = ensure_signed(origin)?; + let expiry = >::block_number() + Self::voting_period(); - ensure!(Self::will_still_be_councillor_at(aux.ref_into(), expiry), "proposer would not be on council"); + ensure!(Self::will_still_be_councillor_at(&who, expiry), "proposer would not be on council"); let proposal_hash = T::Hashing::hash_of(&proposal); @@ -93,31 +93,35 @@ impl Module { Self::set_proposals(&proposals); >::insert(proposal_hash, *proposal); - >::insert(proposal_hash, vec![aux.ref_into().clone()]); - >::insert((proposal_hash, aux.ref_into().clone()), true); + >::insert(proposal_hash, vec![who.clone()]); + >::insert((proposal_hash, who), true); Ok(()) } - fn vote(aux: T::Origin, proposal: T::Hash, approve: bool) -> Result { - if Self::vote_of((proposal, aux.ref_into().clone())).is_none() { + fn vote(origin: T::Origin, proposal: T::Hash, approve: bool) -> Result { + let who = ensure_signed(origin)?; + + if Self::vote_of((proposal, who.clone())).is_none() { let mut voters = Self::proposal_voters(&proposal); - voters.push(aux.ref_into().clone()); + voters.push(who.clone()); >::insert(proposal, voters); } - >::insert((proposal, aux.ref_into().clone()), approve); + >::insert((proposal, who), approve); Ok(()) } - fn veto(aux: T::Origin, proposal_hash: T::Hash) -> Result { - ensure!(Self::is_councillor(aux.ref_into()), "only councillors may veto council proposals"); + fn veto(origin: T::Origin, proposal_hash: T::Hash) -> Result { + let who = ensure_signed(origin)?; + + ensure!(Self::is_councillor(&who), "only councillors may veto council proposals"); ensure!(>::exists(&proposal_hash), "proposal must exist to be vetoed"); let mut existing_vetoers = Self::veto_of(&proposal_hash) .map(|pair| pair.1) .unwrap_or_else(Vec::new); - let insert_position = existing_vetoers.binary_search(aux.ref_into()) + let insert_position = existing_vetoers.binary_search(&who) .err().ok_or("a councillor may not veto a proposal twice")?; - existing_vetoers.insert(insert_position, aux.ref_into().clone()); + existing_vetoers.insert(insert_position, who); Self::set_veto_of(&proposal_hash, >::block_number() + Self::cooloff_period(), existing_vetoers); Self::set_proposals(&Self::proposals().into_iter().filter(|&(_, h)| h != proposal_hash).collect::>()); @@ -129,12 +133,14 @@ impl Module { Ok(()) } - fn set_cooloff_period(blocks: T::BlockNumber) -> Result { + fn set_cooloff_period(origin: T::Origin, blocks: T::BlockNumber) -> Result { + ensure_root(origin)?; >::put(blocks); Ok(()) } - fn set_voting_period(blocks: T::BlockNumber) -> Result { + fn set_voting_period(origin: T::Origin, blocks: T::BlockNumber) -> Result { + ensure_root(origin)?; >::put(blocks); Ok(()) } @@ -182,7 +188,7 @@ impl Module { fn end_block(now: T::BlockNumber) -> Result { while let Some((proposal, proposal_hash)) = Self::take_proposal_if_expiring_at(now) { let tally = Self::take_tally(&proposal_hash); - if let Some(&democracy::PrivCall::cancel_referendum(ref_index)) = IsSubType::>::is_sub_type(&proposal) { + if let Some(&democracy::Call::cancel_referendum(ref_index)) = IsAuxSubType::>::is_aux_sub_type(&proposal) { if let (_, 0, 0) = tally { >::internal_cancel_referendum(ref_index); } @@ -217,6 +223,7 @@ impl OnFinalise for Council { mod tests { use super::*; use ::tests::*; + use ::tests::Call; use substrate_runtime_support::Hashable; use democracy::VoteThreshold; @@ -242,12 +249,12 @@ mod tests { }); } - fn set_balance_proposal(value: u64) -> Proposal { - Proposal::Balances(balances::PrivCall::set_balance(balances::address::Address::Id(42), value, 0)) + fn set_balance_proposal(value: u64) -> Call { + Call::Balances(balances::Call::set_balance(balances::address::Address::Id(42), value, 0)) } - fn cancel_referendum_proposal(id: u32) -> Proposal { - Proposal::Democracy(democracy::PrivCall::cancel_referendum(id)) + fn cancel_referendum_proposal(id: u32) -> Call { + Call::Democracy(democracy::Call::cancel_referendum(id)) } #[test] @@ -260,9 +267,9 @@ mod tests { let cancellation = cancel_referendum_proposal(0); let hash = cancellation.blake2_256().into(); - assert_ok!(CouncilVoting::propose(&1, Box::new(cancellation))); - assert_ok!(CouncilVoting::vote(&2, hash, true)); - assert_ok!(CouncilVoting::vote(&3, hash, true)); + assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(cancellation))); + assert_ok!(CouncilVoting::vote(Origin::signed(2), hash, true)); + assert_ok!(CouncilVoting::vote(Origin::signed(3), hash, true)); assert_eq!(CouncilVoting::proposals(), vec![(2, hash)]); assert_ok!(CouncilVoting::end_block(System::block_number())); @@ -282,9 +289,9 @@ mod tests { let cancellation = cancel_referendum_proposal(0); let hash = cancellation.blake2_256().into(); - assert_ok!(CouncilVoting::propose(&1, Box::new(cancellation))); - assert_ok!(CouncilVoting::vote(&2, hash, true)); - assert_ok!(CouncilVoting::vote(&3, hash, false)); + assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(cancellation))); + assert_ok!(CouncilVoting::vote(Origin::signed(2), hash, true)); + assert_ok!(CouncilVoting::vote(Origin::signed(3), hash, false)); assert_ok!(CouncilVoting::end_block(System::block_number())); System::set_block_number(2); @@ -302,8 +309,8 @@ mod tests { let cancellation = cancel_referendum_proposal(0); let hash = cancellation.blake2_256().into(); - assert_ok!(CouncilVoting::propose(&1, Box::new(cancellation))); - assert_ok!(CouncilVoting::vote(&2, hash, true)); + assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(cancellation))); + assert_ok!(CouncilVoting::vote(Origin::signed(2), hash, true)); assert_ok!(CouncilVoting::end_block(System::block_number())); System::set_block_number(2); @@ -318,8 +325,8 @@ mod tests { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash = proposal.blake2_256().into(); - assert_ok!(CouncilVoting::propose(&1, Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::veto(&2, hash)); + assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); + assert_ok!(CouncilVoting::veto(Origin::signed(2), hash)); assert_eq!(CouncilVoting::proposals().len(), 0); assert_eq!(Democracy::active_referendums().len(), 0); }); @@ -331,12 +338,12 @@ mod tests { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash = proposal.blake2_256().into(); - assert_ok!(CouncilVoting::propose(&1, Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::veto(&2, hash)); + assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); + assert_ok!(CouncilVoting::veto(Origin::signed(2), hash)); System::set_block_number(3); - assert_ok!(CouncilVoting::propose(&1, Box::new(proposal.clone()))); - assert_noop!(CouncilVoting::veto(&2, hash), "a councillor may not veto a proposal twice"); + assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); + assert_noop!(CouncilVoting::veto(Origin::signed(2), hash), "a councillor may not veto a proposal twice"); }); } @@ -346,11 +353,11 @@ mod tests { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash = proposal.blake2_256().into(); - assert_ok!(CouncilVoting::propose(&1, Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::veto(&2, hash)); + assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); + assert_ok!(CouncilVoting::veto(Origin::signed(2), hash)); System::set_block_number(2); - assert_noop!(CouncilVoting::propose(&1, Box::new(proposal.clone())), "proposal is vetoed"); + assert_noop!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone())), "proposal is vetoed"); }); } @@ -360,13 +367,13 @@ mod tests { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash = proposal.blake2_256().into(); - assert_ok!(CouncilVoting::propose(&1, Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::veto(&2, hash)); + assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); + assert_ok!(CouncilVoting::veto(Origin::signed(2), hash)); System::set_block_number(3); - assert_ok!(CouncilVoting::propose(&1, Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::vote(&2, hash, false)); - assert_ok!(CouncilVoting::vote(&3, hash, true)); + assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); + assert_ok!(CouncilVoting::vote(Origin::signed(2), hash, false)); + assert_ok!(CouncilVoting::vote(Origin::signed(3), hash, true)); assert_ok!(CouncilVoting::end_block(System::block_number())); System::set_block_number(4); @@ -382,12 +389,12 @@ mod tests { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash = proposal.blake2_256().into(); - assert_ok!(CouncilVoting::propose(&1, Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::veto(&2, hash)); + assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); + assert_ok!(CouncilVoting::veto(Origin::signed(2), hash)); System::set_block_number(3); - assert_ok!(CouncilVoting::propose(&1, Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::veto(&3, hash)); + assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); + assert_ok!(CouncilVoting::veto(Origin::signed(3), hash)); assert_eq!(CouncilVoting::proposals().len(), 0); assert_eq!(Democracy::active_referendums().len(), 0); }); @@ -399,7 +406,7 @@ mod tests { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash = proposal.blake2_256().into(); - assert_ok!(CouncilVoting::propose(&1, Box::new(proposal.clone()))); + assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); assert_eq!(CouncilVoting::proposals().len(), 1); assert_eq!(CouncilVoting::proposal_voters(&hash), vec![1]); assert_eq!(CouncilVoting::vote_of((hash, 1)), Some(true)); @@ -412,7 +419,7 @@ mod tests { with_externalities(&mut new_test_ext(true), || { System::set_block_number(1); let proposal = set_balance_proposal(42); - assert_ok!(CouncilVoting::propose(&1, Box::new(proposal.clone()))); + assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); assert_eq!(CouncilVoting::tally(&proposal.blake2_256().into()), (1, 0, 2)); assert_ok!(CouncilVoting::end_block(System::block_number())); @@ -428,9 +435,9 @@ mod tests { with_externalities(&mut new_test_ext(true), || { System::set_block_number(1); let proposal = set_balance_proposal(42); - assert_ok!(CouncilVoting::propose(&1, Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::vote(&2, proposal.blake2_256().into(), true)); - assert_ok!(CouncilVoting::vote(&3, proposal.blake2_256().into(), true)); + assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); + assert_ok!(CouncilVoting::vote(Origin::signed(2), proposal.blake2_256().into(), true)); + assert_ok!(CouncilVoting::vote(Origin::signed(3), proposal.blake2_256().into(), true)); assert_eq!(CouncilVoting::tally(&proposal.blake2_256().into()), (3, 0, 0)); assert_ok!(CouncilVoting::end_block(System::block_number())); @@ -446,9 +453,9 @@ mod tests { with_externalities(&mut new_test_ext(true), || { System::set_block_number(1); let proposal = set_balance_proposal(42); - assert_ok!(CouncilVoting::propose(&1, Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::vote(&2, proposal.blake2_256().into(), true)); - assert_ok!(CouncilVoting::vote(&3, proposal.blake2_256().into(), false)); + assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); + assert_ok!(CouncilVoting::vote(Origin::signed(2), proposal.blake2_256().into(), true)); + assert_ok!(CouncilVoting::vote(Origin::signed(3), proposal.blake2_256().into(), false)); assert_eq!(CouncilVoting::tally(&proposal.blake2_256().into()), (2, 1, 0)); assert_ok!(CouncilVoting::end_block(System::block_number())); @@ -464,7 +471,7 @@ mod tests { with_externalities(&mut new_test_ext(true), || { System::set_block_number(1); let proposal = set_balance_proposal(42); - assert_noop!(CouncilVoting::propose(&4, Box::new(proposal)), "proposer would not be on council"); + assert_noop!(CouncilVoting::propose(Origin::signed(4), Box::new(proposal)), "proposer would not be on council"); }); } } From 5e4c1c40f2f1743501d18677302e070d96ebbf72 Mon Sep 17 00:00:00 2001 From: Gav Date: Thu, 6 Sep 2018 22:42:38 +0200 Subject: [PATCH 11/21] Remove some aux-dispatch stuff and fix balances --- substrate/runtime-support/src/dispatch.rs | 116 ---------------------- substrate/runtime-support/src/lib.rs | 2 +- substrate/runtime/balances/src/tests.rs | 20 ++-- 3 files changed, 11 insertions(+), 127 deletions(-) diff --git a/substrate/runtime-support/src/dispatch.rs b/substrate/runtime-support/src/dispatch.rs index aa6bba1d9d890..7b77f95919a34 100644 --- a/substrate/runtime-support/src/dispatch.rs +++ b/substrate/runtime-support/src/dispatch.rs @@ -144,35 +144,6 @@ macro_rules! decl_module { /// Implement several dispatch modules to create a pairing of a dispatch trait and enum. #[macro_export] macro_rules! decl_dispatch { - // WITHOUT AUX - ( - impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; - $(#[$attr:meta])* - pub enum $call_type:ident { - $( - $(#[$fn_attr:meta])* - fn $fn_name:ident( - $( - $param_name:ident : $param:ty - ),* - ) -> $result:ty; - )* - } - $($rest:tt)* - ) => { - __decl_dispatch_module_without_aux! { - impl for $mod_type<$trait_instance: $trait_name>; - $(#[$attr])* - pub enum $call_type; - $( - fn $fn_name( $( $param_name: $param ),* ) -> $result; - )* - } - decl_dispatch! { - impl for $mod_type<$trait_instance: $trait_name>; - $($rest)* - } - }; // WITH AUX ( impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; @@ -217,51 +188,6 @@ macro_rules! decl_dispatch { } } -#[macro_export] -#[doc(hidden)] -/// Implement a single dispatch modules to create a pairing of a dispatch trait and enum. -macro_rules! __decl_dispatch_module_without_aux { - ( - impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; - $(#[$attr:meta])* - pub enum $call_type:ident; - $( - fn $fn_name:ident( - $( - $param_name:ident : $param:ty - ),* - ) - -> $result:ty; - )* - ) => { - __decl_dispatch_module_common! { - impl for $mod_type<$trait_instance: $trait_name>; - $(#[$attr])* - pub enum $call_type; - $( fn $fn_name( $( $param_name : $param ),* ) -> $result; )* - } - impl<$trait_instance: $trait_name> $crate::dispatch::Dispatchable - for $call_type<$trait_instance> - { - type Trait = $trait_instance; - fn dispatch(self) -> $crate::dispatch::Result { - match self { - $( - $call_type::$fn_name( $( $param_name ),* ) => - <$mod_type<$trait_instance>>::$fn_name( $( $param_name ),* ), - )* - $call_type::__PhantomItem(_) => { panic!("__PhantomItem should never be used.") }, - } - } - } - impl<$trait_instance: $trait_name> $crate::dispatch::Callable - for $mod_type<$trait_instance> - { - type Call = $call_type<$trait_instance>; - } - } -} - #[macro_export] #[doc(hidden)] /// Implement a single dispatch modules to create a pairing of a dispatch trait and enum. @@ -491,9 +417,6 @@ macro_rules! __impl_encode { ) => {{}} } -pub trait IsSubType { - fn is_sub_type(&self) -> Option<&::Call>; -} pub trait IsAuxSubType { fn is_aux_sub_type(&self) -> Option<&::Call>; } @@ -541,45 +464,6 @@ macro_rules! impl_outer_dispatch { } )* impl_outer_dispatch!{ $($rest)* } - }; - ( - $(#[$attr:meta])* - pub enum $call_type:ident { - $( - $camelcase:ident, - )* - } - $( $rest:tt )* - ) => { - $(#[$attr])* - pub enum $call_type { - $( - $camelcase ( $crate::dispatch::CallableCallFor<$camelcase> ) - ,)* - } - __impl_outer_dispatch_common! { $call_type, $($camelcase,)* } - impl $crate::dispatch::Dispatchable for $call_type { - type Trait = $call_type; - fn dispatch(self) -> $crate::dispatch::Result { - match self { - $( - $call_type::$camelcase(call) => call.dispatch(), - )* - } - } - } - $( - impl $crate::dispatch::IsSubType<$camelcase> for $call_type { - fn is_sub_type(&self) -> Option<&<$camelcase as $crate::dispatch::Callable>::Call> { - if let $call_type::$camelcase ( ref r ) = *self { - Some(r) - } else { - None - } - } - } - )* - impl_outer_dispatch!{ $($rest)* } } } diff --git a/substrate/runtime-support/src/lib.rs b/substrate/runtime-support/src/lib.rs index 91b3eb0cabdef..a0e5efcfa885c 100644 --- a/substrate/runtime-support/src/lib.rs +++ b/substrate/runtime-support/src/lib.rs @@ -45,7 +45,7 @@ mod hashable; pub use self::storage::{StorageVec, StorageList, StorageValue, StorageMap}; pub use self::hashable::Hashable; -pub use self::dispatch::{Parameter, Dispatchable, Callable, AuxDispatchable, AuxCallable, IsSubType, IsAuxSubType}; +pub use self::dispatch::{Parameter, Dispatchable, Callable, AuxDispatchable, AuxCallable, IsAuxSubType}; pub use runtime_io::print; diff --git a/substrate/runtime/balances/src/tests.rs b/substrate/runtime/balances/src/tests.rs index ab6b4ca87b1dc..7279474a1f9e0 100644 --- a/substrate/runtime/balances/src/tests.rs +++ b/substrate/runtime/balances/src/tests.rs @@ -20,7 +20,7 @@ use super::*; use runtime_io::with_externalities; -use mock::{Balances, System, Test, new_test_ext}; +use mock::{Balances, System, Runtime, new_test_ext}; #[test] fn reward_should_work() { @@ -28,7 +28,7 @@ fn reward_should_work() { assert_eq!(Balances::total_balance(&1), 10); assert_ok!(Balances::reward(&1, 10)); assert_eq!(Balances::total_balance(&1), 20); - assert_eq!(>::get(), 110); + assert_eq!(>::get(), 110); }); } @@ -189,7 +189,7 @@ fn slashing_balance_should_work() { assert!(Balances::slash(&1, 69).is_none()); assert_eq!(Balances::free_balance(&1), 0); assert_eq!(Balances::reserved_balance(&1), 42); - assert_eq!(>::get(), 44); + assert_eq!(>::get(), 44); }); } @@ -202,7 +202,7 @@ fn slashing_incomplete_balance_should_work() { assert!(Balances::slash(&1, 69).is_some()); assert_eq!(Balances::free_balance(&1), 0); assert_eq!(Balances::reserved_balance(&1), 0); - assert_eq!(>::get(), 2); + assert_eq!(>::get(), 2); }); } @@ -226,7 +226,7 @@ fn slashing_reserved_balance_should_work() { assert!(Balances::slash_reserved(&1, 42).is_none()); assert_eq!(Balances::reserved_balance(&1), 69); assert_eq!(Balances::free_balance(&1), 0); - assert_eq!(>::get(), 71); + assert_eq!(>::get(), 71); }); } @@ -239,7 +239,7 @@ fn slashing_incomplete_reserved_balance_should_work() { assert!(Balances::slash_reserved(&1, 69).is_some()); assert_eq!(Balances::free_balance(&1), 69); assert_eq!(Balances::reserved_balance(&1), 0); - assert_eq!(>::get(), 71); + assert_eq!(>::get(), 71); }); } @@ -283,8 +283,8 @@ fn transferring_incomplete_reserved_balance_should_work() { #[test] fn transferring_too_high_value_should_not_panic() { with_externalities(&mut new_test_ext(0, false), || { - >::insert(1, u64::max_value()); - >::insert(2, 1); + >::insert(1, u64::max_value()); + >::insert(2, 1); assert_err!( Balances::transfer(Some(1).into(), 2.into(), u64::max_value()), @@ -307,7 +307,7 @@ fn account_removal_on_free_too_low() { Balances::set_free_balance(&2, 110); Balances::increase_total_stake_by(110); - assert_eq!(>::get(), 732); + assert_eq!(>::get(), 732); } // Transfer funds from account 1 of such amount that after this transfer @@ -319,6 +319,6 @@ fn account_removal_on_free_too_low() { assert_eq!(Balances::free_balance(&1), 0); // Verify that TotalIssuance tracks balance removal when free balance is too low. - assert_eq!(>::get(), 642); + assert_eq!(>::get(), 642); }); } From eb00970f98f7dbaa6ccf418f188f02becc571b0e Mon Sep 17 00:00:00 2001 From: Gav Date: Thu, 6 Sep 2018 23:07:12 +0200 Subject: [PATCH 12/21] Rename aux -> origin, fix contracts --- demo/runtime/src/lib.rs | 2 +- substrate/runtime-support/src/dispatch.rs | 129 ++++++------------ substrate/runtime-support/src/lib.rs | 2 +- substrate/runtime/balances/src/lib.rs | 11 +- substrate/runtime/consensus/src/lib.rs | 13 +- substrate/runtime/contract/src/lib.rs | 34 ++--- substrate/runtime/contract/src/tests.rs | 36 ++--- substrate/runtime/council/src/lib.rs | 29 ++-- substrate/runtime/council/src/voting.rs | 17 ++- substrate/runtime/democracy/src/lib.rs | 19 ++- substrate/runtime/example/src/lib.rs | 16 +-- substrate/runtime/executive/src/lib.rs | 8 +- .../src/generic/checked_extrinsic.rs | 6 +- substrate/runtime/primitives/src/testing.rs | 8 +- substrate/runtime/primitives/src/traits.rs | 2 +- substrate/runtime/session/src/lib.rs | 21 ++- substrate/runtime/staking/src/lib.rs | 29 ++-- substrate/runtime/timestamp/src/lib.rs | 13 +- substrate/runtime/treasury/src/lib.rs | 13 +- 19 files changed, 178 insertions(+), 230 deletions(-) diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index fd0bff3a12e2c..a58b4ac58a742 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -197,7 +197,7 @@ impl DigestItem for Log { impl_outer_dispatch! { #[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] - pub enum Call where aux: ::Origin { + pub enum Call where origin: ::Origin { Consensus, Balances, Session, diff --git a/substrate/runtime-support/src/dispatch.rs b/substrate/runtime-support/src/dispatch.rs index 7b77f95919a34..5397f9ee97bf5 100644 --- a/substrate/runtime-support/src/dispatch.rs +++ b/substrate/runtime-support/src/dispatch.rs @@ -27,29 +27,11 @@ pub use codec::{Codec, Decode, Encode, Input, Output}; pub type Result = result::Result<(), &'static str>; pub trait Dispatchable { + type Origin; type Trait; - fn dispatch(self) -> Result; -} - -pub trait AuxDispatchable { - type Aux; - type Trait; - fn dispatch(self, aux: Self::Aux) -> Result; + fn dispatch(self, origin: Self::Origin) -> Result; } -#[cfg(feature = "std")] -pub trait AuxCallable { - type Call: AuxDispatchable + Codec + ::serde::Serialize + Clone + PartialEq + Eq; -} -#[cfg(not(feature = "std"))] -pub trait AuxCallable { - type Call: AuxDispatchable + Codec + Clone + PartialEq + Eq; -} - -// dirty hack to work around serde_derive issue -// https://github.com/rust-lang/rust/issues/51331 -pub type AuxCallableCallFor = ::Call; - #[cfg(feature = "std")] pub trait Callable { type Call: Dispatchable + Codec + ::serde::Serialize + Clone + PartialEq + Eq; @@ -59,9 +41,9 @@ pub trait Callable { type Call: Dispatchable + Codec + Clone + PartialEq + Eq; } -// dirty hack to work around serde_derive issue. +// dirty hack to work around serde_derive issue // https://github.com/rust-lang/rust/issues/51331 -pub type CallableCallFor = ::Call; +pub type CallableCallFor = ::Call; #[cfg(feature = "std")] pub trait Parameter: Codec + serde::Serialize + Clone + Eq + fmt::Debug {} @@ -106,34 +88,6 @@ macro_rules! decl_module { $($rest)* } - __impl_json_metadata! { - impl for $mod_type<$trait_instance: $trait_name>; - $($rest)* - } - }; - ( - $(#[$attr:meta])* - struct $mod_type:ident<$trait_instance:ident: $trait_name:ident>; - $($rest:tt)* - ) => { - // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. - #[derive(Clone, Copy, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] - #[cfg(feature = "std")] - $(#[$attr])* - struct $mod_type<$trait_instance: $trait_name>(::std::marker::PhantomData<$trait_instance>); - - // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. - #[derive(Clone, Copy, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] - #[cfg(not(feature = "std"))] - $(#[$attr])* - struct $mod_type<$trait_instance: $trait_name>(::core::marker::PhantomData<$trait_instance>); - decl_dispatch! { - impl for $mod_type<$trait_instance: $trait_name>; - $($rest)* - } - __impl_json_metadata! { impl for $mod_type<$trait_instance: $trait_name>; $($rest)* @@ -148,10 +102,10 @@ macro_rules! decl_dispatch { ( impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; $(#[$attr:meta])* - pub enum $call_type:ident where aux: $aux_type:ty { + pub enum $call_type:ident where origin: $aux_type:ty { $( $(#[$fn_attr:meta])* - fn $fn_name:ident(aux + fn $fn_name:ident(origin $( , $param_name:ident : $param:ty )* @@ -163,9 +117,9 @@ macro_rules! decl_dispatch { __decl_dispatch_module_with_aux! { impl for $mod_type<$trait_instance: $trait_name>; $(#[$attr])* - pub enum $call_type where aux: $aux_type; + pub enum $call_type where origin: $aux_type; $( - fn $fn_name(aux $(, $param_name: $param )*) -> $result; + fn $fn_name(origin $(, $param_name: $param )*) -> $result; )* } decl_dispatch! { @@ -178,11 +132,8 @@ macro_rules! decl_dispatch { impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; ) => { impl<$trait_instance: $trait_name> $mod_type<$trait_instance> { - pub fn aux_dispatch>(d: D, aux: D::Aux) -> $crate::dispatch::Result { - d.dispatch(aux) - } - pub fn dispatch>(d: D) -> $crate::dispatch::Result { - d.dispatch() + pub fn dispatch>(d: D, origin: D::Origin) -> $crate::dispatch::Result { + d.dispatch(origin) } } } @@ -195,9 +146,9 @@ macro_rules! __decl_dispatch_module_with_aux { ( impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; $(#[$attr:meta])* - pub enum $call_type:ident where aux: $aux_type:ty; + pub enum $call_type:ident where origin: $aux_type:ty; $( - fn $fn_name:ident(aux + fn $fn_name:ident(origin $( , $param_name:ident : $param:ty )* @@ -211,22 +162,22 @@ macro_rules! __decl_dispatch_module_with_aux { pub enum $call_type; $( fn $fn_name( $( $param_name : $param ),* ) -> $result; )* } - impl<$trait_instance: $trait_name> $crate::dispatch::AuxDispatchable + impl<$trait_instance: $trait_name> $crate::dispatch::Dispatchable for $call_type<$trait_instance> { type Trait = $trait_instance; - type Aux = $aux_type; - fn dispatch(self, aux: Self::Aux) -> $crate::dispatch::Result { + type Origin = $aux_type; + fn dispatch(self, origin: Self::Origin) -> $crate::dispatch::Result { match self { $( $call_type::$fn_name( $( $param_name ),* ) => - <$mod_type<$trait_instance>>::$fn_name( aux $(, $param_name )* ), + <$mod_type<$trait_instance>>::$fn_name( origin $(, $param_name )* ), )* $call_type::__PhantomItem(_) => { panic!("__PhantomItem should never be used.") }, } } } - impl<$trait_instance: $trait_name> $crate::dispatch::AuxCallable + impl<$trait_instance: $trait_name> $crate::dispatch::Callable for $mod_type<$trait_instance> { type Call = $call_type<$trait_instance>; @@ -253,6 +204,7 @@ macro_rules! __decl_dispatch_module_common { ) => { #[cfg(feature = "std")] $(#[$attr])* + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum $call_type<$trait_instance: $trait_name> { __PhantomItem(::std::marker::PhantomData<$trait_instance>), $( @@ -263,6 +215,7 @@ macro_rules! __decl_dispatch_module_common { #[cfg(not(feature = "std"))] $(#[$attr])* + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum $call_type<$trait_instance: $trait_name> { __PhantomItem(::core::marker::PhantomData<$trait_instance>), $( @@ -417,8 +370,8 @@ macro_rules! __impl_encode { ) => {{}} } -pub trait IsAuxSubType { - fn is_aux_sub_type(&self) -> Option<&::Call>; +pub trait IsSubType { + fn is_aux_sub_type(&self) -> Option<&::Call>; } /// Implement a meta-dispatch module to dispatch to other dispatchers. @@ -427,7 +380,7 @@ macro_rules! impl_outer_dispatch { () => (); ( $(#[$attr:meta])* - pub enum $call_type:ident where aux: $aux:ty { + pub enum $call_type:ident where origin: $origin:ty { $( $camelcase:ident, )* @@ -437,24 +390,24 @@ macro_rules! impl_outer_dispatch { $(#[$attr])* pub enum $call_type { $( - $camelcase ( $crate::dispatch::AuxCallableCallFor<$camelcase> ) + $camelcase ( $crate::dispatch::CallableCallFor<$camelcase> ) ,)* } __impl_outer_dispatch_common! { $call_type, $($camelcase,)* } - impl $crate::dispatch::AuxDispatchable for $call_type { - type Aux = $aux; + impl $crate::dispatch::Dispatchable for $call_type { + type Origin = $origin; type Trait = $call_type; - fn dispatch(self, aux: $aux) -> $crate::dispatch::Result { + fn dispatch(self, origin: $origin) -> $crate::dispatch::Result { match self { $( - $call_type::$camelcase(call) => call.dispatch(aux), + $call_type::$camelcase(call) => call.dispatch(origin), )* } } } $( - impl $crate::dispatch::IsAuxSubType<$camelcase> for $call_type { - fn is_aux_sub_type(&self) -> Option<&<$camelcase as $crate::dispatch::AuxCallable>::Call> { + impl $crate::dispatch::IsSubType<$camelcase> for $call_type { + fn is_aux_sub_type(&self) -> Option<&<$camelcase as $crate::dispatch::Callable>::Call> { if let $call_type::$camelcase ( ref r ) = *self { Some(r) } else { @@ -540,10 +493,10 @@ macro_rules! __calls_to_json { ( $prefix_str:tt; $(#[$attr:meta])* - pub enum $call_type:ident where aux: $aux_type:ty { + pub enum $call_type:ident where origin: $aux_type:ty { $( $(#[doc = $doc_attr:tt])* - fn $fn_name:ident(aux + fn $fn_name:ident(origin $( , $param_name:ident : $param:ty )* @@ -556,7 +509,7 @@ macro_rules! __calls_to_json { r#"{ "name": ""#, stringify!($call_type), r#"", "functions": {"#, __functions_to_json!(""; 0; $aux_type; $( - fn $fn_name(aux $(, $param_name: $param )* ) -> $result; + fn $fn_name(origin $(, $param_name: $param )* ) -> $result; __function_doc_to_json!(""; $($doc_attr)*); )*), " } }", __calls_to_json!(","; $($rest)*) ) @@ -598,7 +551,7 @@ macro_rules! __functions_to_json { $prefix_str:tt; $fn_id:expr; $aux_type:ty; - fn $fn_name:ident(aux + fn $fn_name:ident(origin $( , $param_name:ident : $param:ty )* @@ -609,7 +562,7 @@ macro_rules! __functions_to_json { concat!($prefix_str, " ", __function_to_json!( fn $fn_name( - aux: $aux_type + origin: $aux_type $(, $param_name : $param)* ) -> $result; $fn_doc; @@ -690,11 +643,11 @@ mod tests { pub struct Module; #[derive(Serialize, Deserialize)] - pub enum Call where aux: T::Origin { + pub enum Call where origin: T::Origin { /// Hi, this is a comment. - fn aux_0(aux) -> Result; - fn aux_1(aux, data: i32) -> Result; - fn aux_2(aux, data: i32, data2: String) -> Result; + fn aux_0(origin) -> Result; + fn aux_1(origin, data: i32) -> Result; + fn aux_2(origin, data: i32, data2: String) -> Result; } #[derive(Serialize, Deserialize)] @@ -710,14 +663,14 @@ mod tests { r#"{ "name": "Module", "calls": [ "#, r#"{ "name": "Call", "functions": { "#, r#""0": { "name": "aux_0", "params": [ "#, - r#"{ "name": "aux", "type": "T::Origin" }"#, + r#"{ "name": "origin", "type": "T::Origin" }"#, r#" ], "description": [ " Hi, this is a comment." ] }, "#, r#""0 + 1": { "name": "aux_1", "params": [ "#, - r#"{ "name": "aux", "type": "T::Origin" }, "#, + r#"{ "name": "origin", "type": "T::Origin" }, "#, r#"{ "name": "data", "type": "i32" }"#, r#" ], "description": [ ] }, "#, r#""0 + 1 + 1": { "name": "aux_2", "params": [ "#, - r#"{ "name": "aux", "type": "T::Origin" }, "#, + r#"{ "name": "origin", "type": "T::Origin" }, "#, r#"{ "name": "data", "type": "i32" }, "#, r#"{ "name": "data2", "type": "String" }"#, r#" ], "description": [ ] }"#, diff --git a/substrate/runtime-support/src/lib.rs b/substrate/runtime-support/src/lib.rs index a0e5efcfa885c..1ca89965b7986 100644 --- a/substrate/runtime-support/src/lib.rs +++ b/substrate/runtime-support/src/lib.rs @@ -45,7 +45,7 @@ mod hashable; pub use self::storage::{StorageVec, StorageList, StorageValue, StorageMap}; pub use self::hashable::Hashable; -pub use self::dispatch::{Parameter, Dispatchable, Callable, AuxDispatchable, AuxCallable, IsAuxSubType}; +pub use self::dispatch::{Parameter, Dispatchable, Callable, IsSubType}; pub use runtime_io::print; diff --git a/substrate/runtime/balances/src/lib.rs b/substrate/runtime/balances/src/lib.rs index fc4920c0f0234..0e95c9bb1e055 100644 --- a/substrate/runtime/balances/src/lib.rs +++ b/substrate/runtime/balances/src/lib.rs @@ -46,7 +46,7 @@ use codec::{Encode, Decode, Codec, Input, Output}; use runtime_support::{StorageValue, StorageMap, Parameter}; use runtime_support::dispatch::Result; use primitives::traits::{Zero, One, SimpleArithmetic, OnFinalise, MakePayment, - As, AuxLookup, Member, CheckedAdd, CheckedSub}; + As, Lookup, Member, CheckedAdd, CheckedSub}; use address::Address as RawAddress; use system::{ensure_signed, ensure_root}; @@ -135,10 +135,9 @@ pub trait Trait: system::Trait { decl_module! { pub struct Module; - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum Call where aux: T::Origin { - fn transfer(aux, dest: RawAddress, value: T::Balance) -> Result; - fn set_balance(aux, who: RawAddress, free: T::Balance, reserved: T::Balance) -> Result; + pub enum Call where origin: T::Origin { + fn transfer(origin, dest: RawAddress, value: T::Balance) -> Result; + fn set_balance(origin, who: RawAddress, free: T::Balance, reserved: T::Balance) -> Result; } } @@ -643,7 +642,7 @@ impl OnFinalise for Module { } } -impl AuxLookup for Module { +impl Lookup for Module { type Source = address::Address; type Target = T::AccountId; fn lookup(a: Self::Source) -> result::Result { diff --git a/substrate/runtime/consensus/src/lib.rs b/substrate/runtime/consensus/src/lib.rs index 92facebf1c107..98ba1a921d6c0 100644 --- a/substrate/runtime/consensus/src/lib.rs +++ b/substrate/runtime/consensus/src/lib.rs @@ -144,13 +144,12 @@ decl_storage! { decl_module! { pub struct Module; - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum Call where aux: T::Origin { - fn report_misbehavior(aux, report: MisbehaviorReport) -> Result; - fn note_offline(aux, offline_val_indices: Vec) -> Result; - fn remark(aux, remark: Vec) -> Result; - fn set_code(aux, new: Vec) -> Result; - fn set_storage(aux, items: Vec) -> Result; + pub enum Call where origin: T::Origin { + fn report_misbehavior(origin, report: MisbehaviorReport) -> Result; + fn note_offline(origin, offline_val_indices: Vec) -> Result; + fn remark(origin, remark: Vec) -> Result; + fn set_code(origin, new: Vec) -> Result; + fn set_storage(origin, items: Vec) -> Result; } } diff --git a/substrate/runtime/contract/src/lib.rs b/substrate/runtime/contract/src/lib.rs index 85f5ba8ce5843..6d1c1e1de183a 100644 --- a/substrate/runtime/contract/src/lib.rs +++ b/substrate/runtime/contract/src/lib.rs @@ -101,9 +101,10 @@ use account_db::{AccountDb, OverlayAccountDb}; use double_map::StorageDoubleMap; use codec::Codec; -use runtime_primitives::traits::{As, RefInto, SimpleArithmetic, OnFinalise}; +use runtime_primitives::traits::{As, SimpleArithmetic, OnFinalise}; use runtime_support::dispatch::Result; use runtime_support::{Parameter, StorageMap, StorageValue}; +use system::ensure_signed; pub trait Trait: balances::Trait { /// Function type to get the contract address given the creator. @@ -121,11 +122,10 @@ decl_module! { /// Contracts module. pub struct Module; - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum Call where aux: T::Origin { + pub enum Call where origin: T::Origin { // TODO: Change AccountId to staking::Address fn call( - aux, + origin, dest: T::AccountId, value: T::Balance, gas_limit: T::Gas, @@ -133,7 +133,7 @@ decl_module! { ) -> Result; fn create( - aux, + origin, value: T::Balance, gas_limit: T::Gas, ctor: Vec, @@ -181,26 +181,26 @@ impl double_map::StorageDoubleMap for StorageOf { impl Module { /// Make a call to a specified account, optionally transferring some balance. fn call( - aux: ::Origin, + origin: ::Origin, dest: T::AccountId, value: T::Balance, gas_limit: T::Gas, data: Vec, ) -> Result { - let aux = aux.ref_into(); + let origin = ensure_signed(origin)?; // Pay for the gas upfront. // // NOTE: it is very important to avoid any state changes before // paying for the gas. - let mut gas_meter = gas::buy_gas::(aux, gas_limit)?; + let mut gas_meter = gas::buy_gas::(&origin, gas_limit)?; let mut ctx = ExecutionContext { - self_account: aux.clone(), + self_account: origin.clone(), depth: 0, overlay: OverlayAccountDb::::new(&account_db::DirectAccountDb), }; - let result = ctx.call(aux.clone(), dest, value, &mut gas_meter, &data); + let result = ctx.call(origin.clone(), dest, value, &mut gas_meter, &data); if let Ok(_) = result { // Commit all changes that made it thus far into the persistant storage. @@ -211,7 +211,7 @@ impl Module { // // NOTE: this should go after the commit to the storage, since the storage changes // can alter the balance of the caller. - gas::refund_unused_gas::(aux, gas_meter); + gas::refund_unused_gas::(&origin, gas_meter); result.map(|_| ()) } @@ -226,26 +226,26 @@ impl Module { /// after the execution is saved as the `code` of the account. That code will be invoked /// upon any message received by this account. fn create( - aux: ::Origin, + origin: ::Origin, endowment: T::Balance, gas_limit: T::Gas, ctor_code: Vec, data: Vec, ) -> Result { - let aux = aux.ref_into(); + let origin = ensure_signed(origin)?; // Pay for the gas upfront. // // NOTE: it is very important to avoid any state changes before // paying for the gas. - let mut gas_meter = gas::buy_gas::(aux, gas_limit)?; + let mut gas_meter = gas::buy_gas::(&origin, gas_limit)?; let mut ctx = ExecutionContext { - self_account: aux.clone(), + self_account: origin.clone(), depth: 0, overlay: OverlayAccountDb::::new(&account_db::DirectAccountDb), }; - let result = ctx.create(aux.clone(), endowment, &mut gas_meter, &ctor_code, &data); + let result = ctx.create(origin.clone(), endowment, &mut gas_meter, &ctor_code, &data); if let Ok(_) = result { // Commit all changes that made it thus far into the persistant storage. @@ -256,7 +256,7 @@ impl Module { // // NOTE: this should go after the commit to the storage, since the storage changes // can alter the balance of the caller. - gas::refund_unused_gas::(aux, gas_meter); + gas::refund_unused_gas::(&origin, gas_meter); result.map(|_| ()) } diff --git a/substrate/runtime/contract/src/tests.rs b/substrate/runtime/contract/src/tests.rs index 32c8ebcf32c49..9968f804c7b24 100644 --- a/substrate/runtime/contract/src/tests.rs +++ b/substrate/runtime/contract/src/tests.rs @@ -27,10 +27,14 @@ use { GenesisConfig, Module, StorageOf, Trait, }; +impl_outer_origin! { + pub enum Origin for Test {} +} + #[derive(Clone, Eq, PartialEq)] pub struct Test; impl system::Trait for Test { - type Origin = Self::AccountId; + type Origin = Origin; type Index = u64; type BlockNumber = u64; type Hash = H256; @@ -170,7 +174,7 @@ fn contract_transfer() { Balances::set_free_balance(&1, 11); Balances::increase_total_stake_by(11); - assert_ok!(Contract::call(&0, 1, 3, 100_000, Vec::new())); + assert_ok!(Contract::call(Origin::signed(0), 1, 3, 100_000, Vec::new())); assert_eq!( Balances::free_balance(&0), @@ -205,7 +209,7 @@ fn contract_transfer_oog() { Balances::set_free_balance(&1, 11); Balances::increase_total_stake_by(11); - assert_ok!(Contract::call(&0, 1, 3, 135 + 135 + 7, Vec::new())); + assert_ok!(Contract::call(Origin::signed(0), 1, 3, 135 + 135 + 7, Vec::new())); assert_eq!( Balances::free_balance(&0), @@ -237,7 +241,7 @@ fn contract_transfer_max_depth() { Balances::set_free_balance(&CONTRACT_SHOULD_TRANSFER_TO, 11); Balances::increase_total_stake_by(11); - assert_ok!(Contract::call(&0, CONTRACT_SHOULD_TRANSFER_TO, 3, 100_000, Vec::new())); + assert_ok!(Contract::call(Origin::signed(0), CONTRACT_SHOULD_TRANSFER_TO, 3, 100_000, Vec::new())); assert_eq!( Balances::free_balance(&0), @@ -349,7 +353,7 @@ fn contract_create() { >::insert(1, code_create.to_vec()); // When invoked, the contract at address `1` must create a contract with 'transfer' code. - assert_ok!(Contract::call(&0, 1, 11, 100_000, Vec::new())); + assert_ok!(Contract::call(Origin::signed(0), 1, 11, 100_000, Vec::new())); let derived_address = ::DetermineContractAddress::contract_address_for( &code_ctor_transfer, @@ -368,7 +372,7 @@ fn contract_create() { assert_eq!(Balances::free_balance(&derived_address), 3); // Initiate transfer to the newly created contract. - assert_ok!(Contract::call(&0, derived_address, 22, 100_000, Vec::new())); + assert_ok!(Contract::call(Origin::signed(0), derived_address, 22, 100_000, Vec::new())); assert_eq!( Balances::free_balance(&0), @@ -400,7 +404,7 @@ fn top_level_create() { Balances::increase_total_stake_by(30); assert_ok!(Contract::create( - &0, + Origin::signed(0), 11, 100_000, code_ctor_transfer.clone(), @@ -439,7 +443,7 @@ fn refunds_unused_gas() { Balances::set_free_balance(&0, 100_000_000); Balances::increase_total_stake_by(100_000_000); - assert_ok!(Contract::call(&0, 1, 0, 100_000, Vec::new())); + assert_ok!(Contract::call(Origin::signed(0), 1, 0, 100_000, Vec::new())); assert_eq!(Balances::free_balance(&0), 100_000_000 - 4 - (2 * 135)); }); @@ -453,7 +457,7 @@ fn call_with_zero_value() { Balances::set_free_balance(&0, 100_000_000); Balances::increase_total_stake_by(100_000_000); - assert_ok!(Contract::call(&0, 1, 0, 100_000, Vec::new())); + assert_ok!(Contract::call(Origin::signed(0), 1, 0, 100_000, Vec::new())); assert_eq!(Balances::free_balance(&0), 100_000_000 - (2 * 135)); }); @@ -467,7 +471,7 @@ fn create_with_zero_endowment() { Balances::set_free_balance(&0, 100_000_000); Balances::increase_total_stake_by(100_000_000); - assert_ok!(Contract::create(&0, 0, 100_000, code_nop, Vec::new())); + assert_ok!(Contract::create(Origin::signed(0), 0, 100_000, code_nop, Vec::new())); assert_eq!( Balances::free_balance(&0), @@ -500,7 +504,7 @@ fn account_removal_removes_storage() { // the balance of account 1 is will be below than exsistential threshold. // // This should lead to the removal of all storage associated with this account. - assert_ok!(Balances::transfer(&1, 2.into(), 20)); + assert_ok!(Balances::transfer(Origin::signed(1), 2.into(), 20)); // Verify that all entries from account 1 is removed, while // entries from account 2 is in place. @@ -540,7 +544,7 @@ fn top_level_call_refunds_even_if_fails() { Balances::increase_total_stake_by(100_000_000); assert_err!( - Contract::call(&0, 1, 0, 100_000, Vec::new()), + Contract::call(Origin::signed(0), 1, 0, 100_000, Vec::new()), "vm execute returned error while call" ); @@ -571,19 +575,19 @@ fn block_gas_limit() { // Spend 50_000 units of gas (OOG). assert_err!( - Contract::call(&0, 1, 0, 50_000, Vec::new()), + Contract::call(Origin::signed(0), 1, 0, 50_000, Vec::new()), "vm execute returned error while call" ); // Ensure we can't spend more gas than available in block gas limit. assert_err!( - Contract::call(&0, 1, 0, 50_001, Vec::new()), + Contract::call(Origin::signed(0), 1, 0, 50_001, Vec::new()), "block gas limit is reached" ); // However, we can spend another 50_000 assert_err!( - Contract::call(&0, 1, 0, 50_000, Vec::new()), + Contract::call(Origin::signed(0), 1, 0, 50_000, Vec::new()), "vm execute returned error while call" ); }, @@ -656,7 +660,7 @@ fn input_data() { Balances::set_free_balance(&0, 100_000_000); Balances::increase_total_stake_by(100_000_000); - assert_ok!(Contract::call(&0, 1, 0, 50_000, vec![0, 1, 2, 3])); + assert_ok!(Contract::call(Origin::signed(0), 1, 0, 50_000, vec![0, 1, 2, 3])); // all asserts are made within contract code itself. }, diff --git a/substrate/runtime/council/src/lib.rs b/substrate/runtime/council/src/lib.rs index 71cee0b6affc7..664e1509c1df5 100644 --- a/substrate/runtime/council/src/lib.rs +++ b/substrate/runtime/council/src/lib.rs @@ -40,7 +40,7 @@ extern crate substrate_runtime_system as system; use rstd::prelude::*; #[cfg(feature = "std")] use std::collections::HashMap; -use primitives::traits::{Zero, One, As, AuxLookup}; +use primitives::traits::{Zero, One, As, Lookup}; use substrate_runtime_support::{StorageValue, StorageMap}; use substrate_runtime_support::dispatch::Result; use balances::address::Address; @@ -109,18 +109,17 @@ pub trait Trait: democracy::Trait {} decl_module! { pub struct Module; - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum Call where aux: T::Origin { - fn set_approvals(aux, votes: Vec, index: VoteIndex) -> Result; - fn reap_inactive_voter(aux, reporter_index: u32, who: Address, who_index: u32, assumed_vote_index: VoteIndex) -> Result; - fn retract_voter(aux, index: u32) -> Result; - fn submit_candidacy(aux, slot: u32) -> Result; - fn present_winner(aux, candidate: Address, total: T::Balance, index: VoteIndex) -> Result; - - fn set_desired_seats(aux, count: u32) -> Result; - fn remove_member(aux, who: Address) -> Result; - fn set_presentation_duration(aux, count: T::BlockNumber) -> Result; - fn set_term_duration(aux, count: T::BlockNumber) -> Result; + pub enum Call where origin: T::Origin { + fn set_approvals(origin, votes: Vec, index: VoteIndex) -> Result; + fn reap_inactive_voter(origin, reporter_index: u32, who: Address, who_index: u32, assumed_vote_index: VoteIndex) -> Result; + fn retract_voter(origin, index: u32) -> Result; + fn submit_candidacy(origin, slot: u32) -> Result; + fn present_winner(origin, candidate: Address, total: T::Balance, index: VoteIndex) -> Result; + + fn set_desired_seats(origin, count: u32) -> Result; + fn remove_member(origin, who: Address) -> Result; + fn set_presentation_duration(origin, count: T::BlockNumber) -> Result; + fn set_term_duration(origin, count: T::BlockNumber) -> Result; } } @@ -296,7 +295,7 @@ impl Module { voters ); if valid { - // This only fails if `who` doesn't exist, which it clearly must do since its the aux. + // This only fails if `who` doesn't exist, which it clearly must do since its the origin. // Still, it's no more harmful to propagate any error at this point. >::repatriate_reserved(&who, &reporter, Self::voting_bond())?; } else { @@ -637,7 +636,7 @@ mod tests { impl_outer_dispatch! { #[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] - pub enum Call where aux: ::Origin { + pub enum Call where origin: ::Origin { Balances, Democracy, } diff --git a/substrate/runtime/council/src/voting.rs b/substrate/runtime/council/src/voting.rs index 51036a97482b3..6c1780374f1a2 100644 --- a/substrate/runtime/council/src/voting.rs +++ b/substrate/runtime/council/src/voting.rs @@ -21,7 +21,7 @@ use rstd::borrow::Borrow; use primitives::traits::{OnFinalise, Hash}; use runtime_io::print; use substrate_runtime_support::dispatch::Result; -use substrate_runtime_support::{StorageValue, StorageMap, IsAuxSubType}; +use substrate_runtime_support::{StorageValue, StorageMap, IsSubType}; use {system, democracy}; use super::{Trait, Module as Council}; use system::{ensure_signed, ensure_root}; @@ -29,14 +29,13 @@ use system::{ensure_signed, ensure_root}; decl_module! { pub struct Module; - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum Call where aux: T::Origin { - fn propose(aux, proposal: Box) -> Result; - fn vote(aux, proposal: T::Hash, approve: bool) -> Result; - fn veto(aux, proposal_hash: T::Hash) -> Result; + pub enum Call where origin: T::Origin { + fn propose(origin, proposal: Box) -> Result; + fn vote(origin, proposal: T::Hash, approve: bool) -> Result; + fn veto(origin, proposal_hash: T::Hash) -> Result; - fn set_cooloff_period(aux, blocks: T::BlockNumber) -> Result; - fn set_voting_period(aux, blocks: T::BlockNumber) -> Result; + fn set_cooloff_period(origin, blocks: T::BlockNumber) -> Result; + fn set_voting_period(origin, blocks: T::BlockNumber) -> Result; } } @@ -188,7 +187,7 @@ impl Module { fn end_block(now: T::BlockNumber) -> Result { while let Some((proposal, proposal_hash)) = Self::take_proposal_if_expiring_at(now) { let tally = Self::take_tally(&proposal_hash); - if let Some(&democracy::Call::cancel_referendum(ref_index)) = IsAuxSubType::>::is_aux_sub_type(&proposal) { + if let Some(&democracy::Call::cancel_referendum(ref_index)) = IsSubType::>::is_aux_sub_type(&proposal) { if let (_, 0, 0) = tally { >::internal_cancel_referendum(ref_index); } diff --git a/substrate/runtime/democracy/src/lib.rs b/substrate/runtime/democracy/src/lib.rs index 90ccfc5af8549..4816c9b11eba8 100644 --- a/substrate/runtime/democracy/src/lib.rs +++ b/substrate/runtime/democracy/src/lib.rs @@ -44,7 +44,7 @@ extern crate substrate_runtime_system as system; use rstd::prelude::*; use rstd::result; use primitives::traits::{Zero, OnFinalise, As, MaybeSerializeDebug}; -use substrate_runtime_support::{StorageValue, StorageMap, Parameter, AuxDispatchable, IsAuxSubType}; +use substrate_runtime_support::{StorageValue, StorageMap, Parameter, Dispatchable, IsSubType}; use substrate_runtime_support::dispatch::Result; use system::{ensure_signed, ensure_root}; @@ -60,20 +60,19 @@ pub type PropIndex = u32; pub type ReferendumIndex = u32; pub trait Trait: balances::Trait + Sized { - type Proposal: Parameter + AuxDispatchable + IsAuxSubType> + MaybeSerializeDebug; + type Proposal: Parameter + Dispatchable + IsSubType> + MaybeSerializeDebug; } decl_module! { pub struct Module; - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum Call where aux: T::Origin { - fn propose(aux, proposal: Box, value: T::Balance) -> Result; - fn second(aux, proposal: PropIndex) -> Result; - fn vote(aux, ref_index: ReferendumIndex, approve_proposal: bool) -> Result; + pub enum Call where origin: T::Origin { + fn propose(origin, proposal: Box, value: T::Balance) -> Result; + fn second(origin, proposal: PropIndex) -> Result; + fn vote(origin, ref_index: ReferendumIndex, approve_proposal: bool) -> Result; - fn start_referendum(aux, proposal: Box, vote_threshold: VoteThreshold) -> Result; - fn cancel_referendum(aux, ref_index: ReferendumIndex) -> Result; + fn start_referendum(origin, proposal: Box, vote_threshold: VoteThreshold) -> Result; + fn cancel_referendum(origin, ref_index: ReferendumIndex) -> Result; } } @@ -360,7 +359,7 @@ mod tests { impl_outer_dispatch! { #[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] - pub enum Call where aux: ::Origin { + pub enum Call where origin: ::Origin { Balances, Democracy, } diff --git a/substrate/runtime/example/src/lib.rs b/substrate/runtime/example/src/lib.rs index c2935da14f643..0b4fad930e08a 100644 --- a/substrate/runtime/example/src/lib.rs +++ b/substrate/runtime/example/src/lib.rs @@ -82,25 +82,25 @@ decl_module! { // using storage space proportional to any costs paid for by the caller. // // The account that is calling this (i.e. the one that signed the extrinsic) is provided - // via the `aux` argument, always first in each function call. As such functions must + // via the `origin` argument, always first in each function call. As such functions must // always look like: // - // `fn foo(aux, bar: Bar, baz: Baz) -> Result = 0;` + // `fn foo(origin, bar: Bar, baz: Baz) -> Result = 0;` // // The `Result` is required as part of the syntax (and expands to the conventional dispatch // result of `Result<(), &'static str>`). The index after `=` must be unique within this // enum (the `PrivCall` enum is allowed to reuse indexes). // - // When you come to `impl` them later in the module, you must specify the full type for `aux`: + // When you come to `impl` them later in the module, you must specify the full type for `origin`: // - // `fn foo(aux: T::Origin, bar: Bar, baz: Baz) { ... }` + // `fn foo(origin: T::Origin, bar: Bar, baz: Baz) { ... }` // // This is your public interface. Be extremely careful. #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum Call where aux: T::Origin { + pub enum Call where origin: T::Origin { // This is just a simple example of how to interact with the module from the external // world. - fn accumulate_dummy(aux, increase_by: T::Balance) -> Result; + fn accumulate_dummy(origin, increase_by: T::Balance) -> Result; } // The priviledged entry points. These are provided to allow any governance modules in @@ -206,7 +206,7 @@ impl Module { // The first is relatively easy to audit for - just ensure all panickers are removed from // logic that executes in production (which you do anyway, right?!). To ensure the second // is followed, you should do all tests for validity at the top of your function. This - // is stuff like checking the sender (`aux`) or that state is such that the operation + // is stuff like checking the sender (`origin`) or that state is such that the operation // makes sense. // // Once you've determined that it's all good, then enact the operation and change storage. @@ -248,7 +248,7 @@ impl Module { Ok(()) } - // Implementation of a priviledged call. This doesn't have an `aux` parameter because + // Implementation of a priviledged call. This doesn't have an `origin` parameter because // it's not (directly) from an extrinsic, but rather the system as a whole has decided // to execute it. Different runtimes have different reasons for allow priviledged // calls to be executed - we don't need to care why. Because it's priviledged, we can diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index 7d763edd42a09..f66b74268721c 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -51,7 +51,7 @@ use rstd::prelude::*; use rstd::marker::PhantomData; use rstd::result; use primitives::traits::{self, Header, Zero, One, Checkable, Applyable, CheckEqual, OnFinalise, - MakePayment, Hash, AuxLookup}; + MakePayment, Hash, Lookup}; use codec::{Codec, Encode}; use system::extrinsics_root; use primitives::{ApplyOutcome, ApplyError}; @@ -82,7 +82,7 @@ impl< Address, System: system::Trait, Block: traits::Block, - Lookup: AuxLookup, + Lookup: Lookup, Payment: MakePayment, Finalisation: OnFinalise, > Executive where @@ -219,12 +219,12 @@ mod tests { use runtime_io::with_externalities; use substrate_primitives::{H256, KeccakHasher}; use primitives::BuildStorage; - use primitives::traits::{Header as HeaderT, BlakeTwo256, AuxLookup}; + use primitives::traits::{Header as HeaderT, BlakeTwo256, Lookup}; use primitives::testing::{Digest, Header, Block}; use system; struct NullLookup; - impl AuxLookup for NullLookup { + impl Lookup for NullLookup { type Source = u64; type Target = u64; fn lookup(s: Self::Source) -> Result { diff --git a/substrate/runtime/primitives/src/generic/checked_extrinsic.rs b/substrate/runtime/primitives/src/generic/checked_extrinsic.rs index 31e29beeb4911..6f9d9d356f33a 100644 --- a/substrate/runtime/primitives/src/generic/checked_extrinsic.rs +++ b/substrate/runtime/primitives/src/generic/checked_extrinsic.rs @@ -16,7 +16,7 @@ //! Generic implementations of Extrinsic/Header/Block. -use runtime_support::AuxDispatchable; +use runtime_support::Dispatchable; use traits::{self, Member, SimpleArithmetic, MaybeDisplay}; /// Definition of something that the external world might want to say; its existence implies that @@ -37,8 +37,8 @@ impl traits::Applyable where AccountId: Member + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, - Call: Member + AuxDispatchable, - ::Aux: From> + Call: Member + Dispatchable, + ::Origin: From> { type Index = Index; type AccountId = AccountId; diff --git a/substrate/runtime/primitives/src/testing.rs b/substrate/runtime/primitives/src/testing.rs index e2b83d60bfd05..3442bfedf4729 100644 --- a/substrate/runtime/primitives/src/testing.rs +++ b/substrate/runtime/primitives/src/testing.rs @@ -19,7 +19,7 @@ use serde::{Serialize, de::DeserializeOwned}; use std::fmt::Debug; use codec::Codec; -use runtime_support::AuxDispatchable; +use runtime_support::Dispatchable; use traits::{self, Checkable, Applyable, BlakeTwo256}; pub use substrate_primitives::H256; @@ -118,13 +118,13 @@ impl(pub Option, pub u64, pub Call); -impl Checkable for TestXt { +impl Checkable for TestXt { type Checked = Self; fn check_with(self, _: Context) -> Result { Ok(self) } } impl Applyable for TestXt where - Call: Sized + Send + Sync + Clone + Eq + AuxDispatchable + Codec + Debug + Serialize + DeserializeOwned, - ::Aux: From> + Call: Sized + Send + Sync + Clone + Eq + Dispatchable + Codec + Debug + Serialize + DeserializeOwned, + ::Origin: From> { type AccountId = u64; type Index = u64; diff --git a/substrate/runtime/primitives/src/traits.rs b/substrate/runtime/primitives/src/traits.rs index e47e28eebb397..f3c27e19c4c71 100644 --- a/substrate/runtime/primitives/src/traits.rs +++ b/substrate/runtime/primitives/src/traits.rs @@ -47,7 +47,7 @@ pub trait Verify { } /// Means of changing one type into another in a manner dependent on the source type. -pub trait AuxLookup { +pub trait Lookup { /// Type to lookup from. type Source; /// Type to lookup into. diff --git a/substrate/runtime/session/src/lib.rs b/substrate/runtime/session/src/lib.rs index cdc4ef5f25fd6..3a02868b34eb2 100644 --- a/substrate/runtime/session/src/lib.rs +++ b/substrate/runtime/session/src/lib.rs @@ -78,12 +78,11 @@ pub type Event = RawEvent<::BlockNumber>; decl_module! { pub struct Module; - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum Call where aux: T::Origin { - fn set_key(aux, key: T::SessionKey) -> Result; + pub enum Call where origin: T::Origin { + fn set_key(origin, key: T::SessionKey) -> Result; - fn set_length(aux, new: T::BlockNumber) -> Result; - fn force_new_session(aux, apply_rewards: bool) -> Result; + fn set_length(origin, new: T::BlockNumber) -> Result; + fn force_new_session(origin, apply_rewards: bool) -> Result; } } @@ -137,23 +136,23 @@ impl Module { /// Sets the session key of `_validator` to `_key`. This doesn't take effect until the next /// session. - fn set_key(aux: T::Origin, key: T::SessionKey) -> Result { - let who = ensure_signed(aux)?; + fn set_key(origin: T::Origin, key: T::SessionKey) -> Result { + let who = ensure_signed(origin)?; // set new value for next session >::insert(who, key); Ok(()) } /// Set a new era length. Won't kick in until the next era change (at current length). - fn set_length(aux: T::Origin, new: T::BlockNumber) -> Result { - ensure_root(aux)?; + fn set_length(origin: T::Origin, new: T::BlockNumber) -> Result { + ensure_root(origin)?; >::put(new); Ok(()) } /// Forces a new session. - pub fn force_new_session(aux: T::Origin, apply_rewards: bool) -> Result { - ensure_root(aux)?; + pub fn force_new_session(origin: T::Origin, apply_rewards: bool) -> Result { + ensure_root(origin)?; Self::apply_force_new_session(apply_rewards) } diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index b3feca05b60dd..ee65eea084a59 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -50,7 +50,7 @@ use runtime_support::{Parameter, StorageValue, StorageMap}; use runtime_support::dispatch::Result; use session::OnSessionChange; use primitives::traits::{Zero, One, Bounded, OnFinalise, - As, AuxLookup}; + As, Lookup}; use balances::{address::Address, OnMinted}; use system::{ensure_root, ensure_signed}; @@ -107,20 +107,19 @@ pub trait Trait: balances::Trait + session::Trait { decl_module! { pub struct Module; - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] #[cfg_attr(feature = "std", serde(bound(deserialize = "T::Balance: ::serde::de::DeserializeOwned")))] - pub enum Call where aux: T::Origin { - fn stake(aux) -> Result; - fn unstake(aux, intentions_index: u32) -> Result; - fn nominate(aux, target: Address) -> Result; - fn unnominate(aux, target_index: u32) -> Result; - fn register_preferences(aux, intentions_index: u32, prefs: ValidatorPrefs) -> Result; - - fn set_sessions_per_era(aux, new: T::BlockNumber) -> Result; - fn set_bonding_duration(aux, new: T::BlockNumber) -> Result; - fn set_validator_count(aux, new: u32) -> Result; - fn force_new_era(aux, apply_rewards: bool) -> Result; - fn set_offline_slash_grace(aux, new: u32) -> Result; + pub enum Call where origin: T::Origin { + fn stake(origin) -> Result; + fn unstake(origin, intentions_index: u32) -> Result; + fn nominate(origin, target: Address) -> Result; + fn unnominate(origin, target_index: u32) -> Result; + fn register_preferences(origin, intentions_index: u32, prefs: ValidatorPrefs) -> Result; + + fn set_sessions_per_era(origin, new: T::BlockNumber) -> Result; + fn set_bonding_duration(origin, new: T::BlockNumber) -> Result; + fn set_validator_count(origin, new: u32) -> Result; + fn force_new_era(origin, apply_rewards: bool) -> Result; + fn set_offline_slash_grace(origin, new: u32) -> Result; } } @@ -310,7 +309,7 @@ impl Module { /// Set the given account's preference for slashing behaviour should they be a validator. /// - /// An error (no-op) if `Self::intentions()[intentions_index] != aux`. + /// An error (no-op) if `Self::intentions()[intentions_index] != origin`. fn register_preferences( origin: T::Origin, intentions_index: u32, diff --git a/substrate/runtime/timestamp/src/lib.rs b/substrate/runtime/timestamp/src/lib.rs index 33ff196a5f6c4..eda83325442e9 100644 --- a/substrate/runtime/timestamp/src/lib.rs +++ b/substrate/runtime/timestamp/src/lib.rs @@ -53,9 +53,8 @@ pub trait Trait: consensus::Trait + system::Trait { decl_module! { pub struct Module; - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum Call where aux: T::Origin { - fn set(aux, now: T::Moment) -> Result; + pub enum Call where origin: T::Origin { + fn set(origin, now: T::Moment) -> Result; } } @@ -181,7 +180,7 @@ mod tests { let mut t = runtime_io::TestExternalities::from(t); with_externalities(&mut t, || { Timestamp::set_timestamp(42); - assert_ok!(Timestamp::aux_dispatch(Call::set(69), Origin::INHERENT)); + assert_ok!(Timestamp::dispatch(Call::set(69), Origin::INHERENT)); assert_eq!(Timestamp::now(), 69); }); } @@ -194,8 +193,8 @@ mod tests { let mut t = runtime_io::TestExternalities::from(t); with_externalities(&mut t, || { Timestamp::set_timestamp(42); - assert_ok!(Timestamp::aux_dispatch(Call::set(69), Origin::INHERENT)); - let _ = Timestamp::aux_dispatch(Call::set(70), Origin::INHERENT); + assert_ok!(Timestamp::dispatch(Call::set(69), Origin::INHERENT)); + let _ = Timestamp::dispatch(Call::set(70), Origin::INHERENT); }); } @@ -207,7 +206,7 @@ mod tests { let mut t = runtime_io::TestExternalities::from(t); with_externalities(&mut t, || { Timestamp::set_timestamp(42); - let _ = Timestamp::aux_dispatch(Call::set(46), Origin::INHERENT); + let _ = Timestamp::dispatch(Call::set(46), Origin::INHERENT); }); } } diff --git a/substrate/runtime/treasury/src/lib.rs b/substrate/runtime/treasury/src/lib.rs index 62997209a0631..a7efeb8c28b05 100644 --- a/substrate/runtime/treasury/src/lib.rs +++ b/substrate/runtime/treasury/src/lib.rs @@ -66,25 +66,24 @@ decl_module! { // Simple declaration of the `Module` type. Lets the macro know what its working on. pub struct Module; - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum Call where aux: T::Origin { + pub enum Call where origin: T::Origin { // Put forward a suggestion for spending. A deposit proportional to the value // is reserved and slashed if the proposal is rejected. It is returned once the // proposal is awarded. - fn propose_spend(aux, value: T::Balance, beneficiary: T::AccountId) -> Result; + fn propose_spend(origin, value: T::Balance, beneficiary: T::AccountId) -> Result; // Set the balance of funds available to spend. - fn set_pot(aux, new_pot: T::Balance) -> Result; + fn set_pot(origin, new_pot: T::Balance) -> Result; // (Re-)configure this module. - fn configure(aux, proposal_bond: Permill, proposal_bond_minimum: T::Balance, spend_period: T::BlockNumber, burn: Permill) -> Result; + fn configure(origin, proposal_bond: Permill, proposal_bond_minimum: T::Balance, spend_period: T::BlockNumber, burn: Permill) -> Result; // Reject a proposed spend. The original deposit will be slashed. - fn reject_proposal(aux, roposal_id: ProposalIndex) -> Result; + fn reject_proposal(origin, roposal_id: ProposalIndex) -> Result; // Approve a proposal. At a later time, the proposal will be allocated to the beneficiary // and the original deposit will be returned. - fn approve_proposal(aux, proposal_id: ProposalIndex) -> Result; + fn approve_proposal(origin, proposal_id: ProposalIndex) -> Result; } } From 7aaf27258161a390579e875bc89c3e23e400d1b3 Mon Sep 17 00:00:00 2001 From: Gav Date: Thu, 6 Sep 2018 23:10:25 +0200 Subject: [PATCH 13/21] Fix test --- substrate/runtime-support/src/dispatch.rs | 32 +++-------------------- 1 file changed, 3 insertions(+), 29 deletions(-) diff --git a/substrate/runtime-support/src/dispatch.rs b/substrate/runtime-support/src/dispatch.rs index 5397f9ee97bf5..b1a42d8309c78 100644 --- a/substrate/runtime-support/src/dispatch.rs +++ b/substrate/runtime-support/src/dispatch.rs @@ -642,21 +642,12 @@ mod tests { decl_module! { pub struct Module; - #[derive(Serialize, Deserialize)] pub enum Call where origin: T::Origin { /// Hi, this is a comment. fn aux_0(origin) -> Result; fn aux_1(origin, data: i32) -> Result; fn aux_2(origin, data: i32, data2: String) -> Result; } - - #[derive(Serialize, Deserialize)] - pub enum PrivCall { - /// Hi, this is a comment. - /// Hi, this is a second comment. - fn priv_0(data: String) -> Result; - fn priv_1(data: String, data2: u32) -> Result; - } } const EXPECTED_METADATA: &str = concat!( @@ -674,37 +665,20 @@ mod tests { r#"{ "name": "data", "type": "i32" }, "#, r#"{ "name": "data2", "type": "String" }"#, r#" ], "description": [ ] }"#, - r#" } }, "#, - r#"{ "name": "PrivCall", "functions": { "#, - r#""0": { "name": "priv_0", "params": [ "#, - r#"{ "name": "data", "type": "String" }"#, - r#" ], "description": [ " Hi, this is a comment.", " Hi, this is a second comment." ] }, "#, - r#""0 + 1": { "name": "priv_1", "params": [ "#, - r#"{ "name": "data", "type": "String" }, "#, - r#"{ "name": "data2", "type": "u32" }"#, - r#" ], "description": [ ] }"#, r#" } }"#, r#" ] }"#, ); impl Module { - fn aux_0(_: &T::Origin) -> Result { - unreachable!() - } - - fn aux_1(_: &T::Origin, _: i32) -> Result { - unreachable!() - } - - fn aux_2(_: &T::Origin, _: i32, _: String) -> Result { + fn aux_0(_: T::Origin) -> Result { unreachable!() } - fn priv_0(_: String) -> Result { + fn aux_1(_: T::Origin, _: i32) -> Result { unreachable!() } - fn priv_1(_: String, _: u32) -> Result { + fn aux_2(_: T::Origin, _: i32, _: String) -> Result { unreachable!() } } From 76200aec1a5bb37f24df512a21627ee03c293cce Mon Sep 17 00:00:00 2001 From: Gav Date: Thu, 6 Sep 2018 23:22:28 +0200 Subject: [PATCH 14/21] Fix example --- substrate/runtime/example/src/lib.rs | 87 ++++++++++++++++------------ 1 file changed, 50 insertions(+), 37 deletions(-) diff --git a/substrate/runtime/example/src/lib.rs b/substrate/runtime/example/src/lib.rs index 0b4fad930e08a..9566a3a542a03 100644 --- a/substrate/runtime/example/src/lib.rs +++ b/substrate/runtime/example/src/lib.rs @@ -60,6 +60,7 @@ extern crate substrate_runtime_balances as balances; use runtime_primitives::traits::OnFinalise; use runtime_support::{StorageValue, dispatch::Result}; +use system::{ensure_signed, ensure_root}; /// Our module's configuration trait. All our types and consts go in here. If the /// module is dependent on specific other modules, then their configuration traits @@ -73,45 +74,47 @@ pub trait Trait: balances::Trait { // The module declaration. This states the entry points that we handle. The // macro takes care of the marshalling of arguments and dispatch. +// +// Anyone can have these functions execute by signing and submitting +// an extrinsic. Ensure that calls into each of these execute in a time, memory and +// using storage space proportional to any costs paid for by the caller or otherwise the +// difficulty of forcing the call to happen. +// +// Generally you'll want to split these into three groups: +// - Public calls that are signed by an external account. +// - Root calls that are allowed to be made only by the governance system. +// - Inherent calls that are allowed to be made only by the block authors and validators. +// +// Information about where this dispatch initiated from is provided as the first argument +// "origin". As such functions must always look like: +// +// `fn foo(origin, bar: Bar, baz: Baz) -> Result = 0;` +// +// The `Result` is required as part of the syntax (and expands to the conventional dispatch +// result of `Result<(), &'static str>`). The index after `=` must be unique within this +// enum (the `PrivCall` enum is allowed to reuse indexes). +// +// When you come to `impl` them later in the module, you must specify the full type for `origin`: +// +// `fn foo(origin: T::Origin, bar: Bar, baz: Baz) { ... }` +// +// There are three entries in the `system::Origin` enum that correspond +// to the above bullets: `::Signed(AccountId)`, `::Root` and `::Inherent`. You should always match +// against them as the first thing you do in your function. There are three convenience calls +// in system that do the matching for you and return a convenient result: `ensure_signed`, +// `ensure_root` and `ensure_inherent`. decl_module! { // Simple declaration of the `Module` type. Lets the macro know what its working on. pub struct Module; - // The unpriviledged entry points. Any account can call into these by signing and submitting - // an extrinsic. Ensure that calls into each of these execute in a time, memory and - // using storage space proportional to any costs paid for by the caller. - // - // The account that is calling this (i.e. the one that signed the extrinsic) is provided - // via the `origin` argument, always first in each function call. As such functions must - // always look like: - // - // `fn foo(origin, bar: Bar, baz: Baz) -> Result = 0;` - // - // The `Result` is required as part of the syntax (and expands to the conventional dispatch - // result of `Result<(), &'static str>`). The index after `=` must be unique within this - // enum (the `PrivCall` enum is allowed to reuse indexes). - // - // When you come to `impl` them later in the module, you must specify the full type for `origin`: - // - // `fn foo(origin: T::Origin, bar: Bar, baz: Baz) { ... }` - // - // This is your public interface. Be extremely careful. - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum Call where origin: T::Origin { - // This is just a simple example of how to interact with the module from the external - // world. + /// This is your public interface. Be extremely careful. + /// This is just a simple example of how to interact with the module from the external + /// world. fn accumulate_dummy(origin, increase_by: T::Balance) -> Result; - } - // The priviledged entry points. These are provided to allow any governance modules in - // the runtime to be able to execute common functions. Unlike for `Call` there is no - // auxilliary data to encode the sender (since there is no sender). Though still important - // to ensure that these execute in reasonable time and space, they can do what would - // otherwise be costly or unsafe operations. - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum PrivCall { - // A priviledged call; in this case it resets our dummy value to something new. - fn set_dummy(new_dummy: T::Balance) -> Result; + /// A priviledged call; in this case it resets our dummy value to something new. + fn set_dummy(origin, new_dummy: T::Balance) -> Result; } } @@ -227,7 +230,10 @@ impl Module { // no progress. // // If you don't respect these rules, it is likely that your chain will be attackable. - fn accumulate_dummy(_aux: T::Origin, increase_by: T::Balance) -> Result { + fn accumulate_dummy(origin: T::Origin, increase_by: T::Balance) -> Result { + // This is a public call, so we ensure that the origin is some signed account. + let _sender = ensure_signed(origin)?; + // Read the value of dummy from storage. let dummy = Self::dummy(); // Will also work using the `::get` on the storage item type iself: @@ -254,7 +260,10 @@ impl Module { // calls to be executed - we don't need to care why. Because it's priviledged, we can // assume it's a one-off operation and substantial processing/storage/memory can be used // without worrying about gameability or attack scenarios. - fn set_dummy(new_value: T::Balance) -> Result { + fn set_dummy(origin: T::Origin, new_value: T::Balance) -> Result { + // This is a privileged call, so we ensure that the origin is "Root". + ensure_root(origin)?; + // Put the new value into storage. >::put(new_value); @@ -323,13 +332,17 @@ mod tests { // or public keys. `u64` is used as the `AccountId` and no `Signature`s are requried. use runtime_primitives::testing::{Digest, Header}; + impl_outer_origin! { + pub enum Origin for Test {} + } + // For testing the module, we construct most of a mock runtime. This means // first constructing a configuration type (`Test`) which `impl`s each of the // configuration traits of modules we want to use. #[derive(Clone, Eq, PartialEq)] pub struct Test; impl system::Trait for Test { - type Origin = Self::AccountId; + type Origin = Origin; type Index = u64; type BlockNumber = u64; type Hash = H256; @@ -370,7 +383,7 @@ mod tests { assert_eq!(Example::dummy(), Some(42)); // Check that accumulate works when we have Some value in Dummy already. - assert_ok!(Example::accumulate_dummy(&0, 27)); + assert_ok!(Example::accumulate_dummy(Origin::signed(1), 27)); assert_eq!(Example::dummy(), Some(69)); // Check that finalising the block removes Dummy from storage. @@ -378,7 +391,7 @@ mod tests { assert_eq!(Example::dummy(), None); // Check that accumulate works when we Dummy has None in it. - assert_ok!(Example::accumulate_dummy(&0, 42)); + assert_ok!(Example::accumulate_dummy(Origin::signed(1), 42)); assert_eq!(Example::dummy(), Some(42)); }); } From 85af6e414b32f55859f6104da02769cecec2e4af Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 7 Sep 2018 09:59:48 +0200 Subject: [PATCH 15/21] Update macro to remove superfluous cruft --- substrate/runtime-support/src/dispatch.rs | 265 +++++------------- .../runtime-support/src/storage/generator.rs | 2 +- 2 files changed, 75 insertions(+), 192 deletions(-) diff --git a/substrate/runtime-support/src/dispatch.rs b/substrate/runtime-support/src/dispatch.rs index b1a42d8309c78..14b4efd9c8428 100644 --- a/substrate/runtime-support/src/dispatch.rs +++ b/substrate/runtime-support/src/dispatch.rs @@ -63,8 +63,15 @@ impl Parameter for T where T: Codec + Clone + Eq {} macro_rules! decl_module { ( $(#[$attr:meta])* - pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident>; - $($rest:tt)* + pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident> + for enum $call_type:ident where origin: $origin_type:ty {$( + $(#[doc = $doc_attr:tt])* + fn $fn_name:ident(origin + $( + , $param_name:ident : $param:ty + )* + ) -> $result:ty; + )*} ) => { // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, Copy, PartialEq, Eq)] @@ -73,140 +80,20 @@ macro_rules! decl_module { // serde-derive for when we attempt to derive `Deserialize` on these types, // in a situation where we've imported `substrate_runtime_support` as another name. #[cfg(feature = "std")] - $(#[$attr])* pub struct $mod_type<$trait_instance: $trait_name>(::std::marker::PhantomData<$trait_instance>); // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, Copy, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] #[cfg(not(feature = "std"))] - $(#[$attr])* pub struct $mod_type<$trait_instance: $trait_name>(::core::marker::PhantomData<$trait_instance>); - decl_dispatch! { - impl for $mod_type<$trait_instance: $trait_name>; - $($rest)* - } - - __impl_json_metadata! { - impl for $mod_type<$trait_instance: $trait_name>; - $($rest)* - } - } -} - -/// Implement several dispatch modules to create a pairing of a dispatch trait and enum. -#[macro_export] -macro_rules! decl_dispatch { - // WITH AUX - ( - impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; - $(#[$attr:meta])* - pub enum $call_type:ident where origin: $aux_type:ty { - $( - $(#[$fn_attr:meta])* - fn $fn_name:ident(origin - $( - , $param_name:ident : $param:ty - )* - ) -> $result:ty; - )* - } - $($rest:tt)* - ) => { - __decl_dispatch_module_with_aux! { - impl for $mod_type<$trait_instance: $trait_name>; - $(#[$attr])* - pub enum $call_type where origin: $aux_type; - $( - fn $fn_name(origin $(, $param_name: $param )*) -> $result; - )* - } - decl_dispatch! { - impl for $mod_type<$trait_instance: $trait_name>; - $($rest)* - } - }; - // BASE CASE - ( - impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; - ) => { - impl<$trait_instance: $trait_name> $mod_type<$trait_instance> { - pub fn dispatch>(d: D, origin: D::Origin) -> $crate::dispatch::Result { - d.dispatch(origin) - } - } - } -} - -#[macro_export] -#[doc(hidden)] -/// Implement a single dispatch modules to create a pairing of a dispatch trait and enum. -macro_rules! __decl_dispatch_module_with_aux { - ( - impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; - $(#[$attr:meta])* - pub enum $call_type:ident where origin: $aux_type:ty; - $( - fn $fn_name:ident(origin - $( - , $param_name:ident : $param:ty - )* - ) - -> $result:ty; - )* - ) => { - __decl_dispatch_module_common! { - impl for $mod_type<$trait_instance: $trait_name>; - $(#[$attr])* - pub enum $call_type; - $( fn $fn_name( $( $param_name : $param ),* ) -> $result; )* - } - impl<$trait_instance: $trait_name> $crate::dispatch::Dispatchable - for $call_type<$trait_instance> - { - type Trait = $trait_instance; - type Origin = $aux_type; - fn dispatch(self, origin: Self::Origin) -> $crate::dispatch::Result { - match self { - $( - $call_type::$fn_name( $( $param_name ),* ) => - <$mod_type<$trait_instance>>::$fn_name( origin $(, $param_name )* ), - )* - $call_type::__PhantomItem(_) => { panic!("__PhantomItem should never be used.") }, - } - } - } - impl<$trait_instance: $trait_name> $crate::dispatch::Callable - for $mod_type<$trait_instance> - { - type Call = $call_type<$trait_instance>; - } - }; -} - -/// Implement a single dispatch modules to create a pairing of a dispatch trait and enum. -#[macro_export] -#[doc(hidden)] -macro_rules! __decl_dispatch_module_common { - ( - impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; - $(#[$attr:meta])* - pub enum $call_type:ident; - $( - fn $fn_name:ident( - $( - $param_name:ident : $param:ty - ),* - ) - -> $result:ty; - )* - ) => { #[cfg(feature = "std")] $(#[$attr])* #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum $call_type<$trait_instance: $trait_name> { __PhantomItem(::std::marker::PhantomData<$trait_instance>), + __OtherPhantomItem(::std::marker::PhantomData<$trait_instance>), $( #[allow(non_camel_case_types)] $fn_name ( $( $param ),* ), @@ -218,6 +105,7 @@ macro_rules! __decl_dispatch_module_common { #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum $call_type<$trait_instance: $trait_name> { __PhantomItem(::core::marker::PhantomData<$trait_instance>), + __OtherPhantomItem(::core::marker::PhantomData<$trait_instance>), $( #[allow(non_camel_case_types)] $fn_name ( $( $param ),* ), @@ -235,30 +123,30 @@ macro_rules! __decl_dispatch_module_common { $call_type::$fn_name( $( ref $param_name ),* ) => $call_type::$fn_name( $( $param_name.clone() ),* ) ,)* - $call_type::__PhantomItem(_) => unreachable!(), + _ => unreachable!(), } } } impl<$trait_instance: $trait_name> $crate::dispatch::PartialEq for $call_type<$trait_instance> { - fn eq(&self, other: &Self) -> bool { + fn eq(&self, _other: &Self) -> bool { match *self { $( $call_type::$fn_name( $( ref $param_name ),* ) => { let self_params = ( $( $param_name, )* ); - if let $call_type::$fn_name( $( ref $param_name ),* ) = *other { + if let $call_type::$fn_name( $( ref $param_name ),* ) = *_other { self_params == ( $( $param_name, )* ) } else { - if let $call_type::__PhantomItem(_) = *other { - unreachable!() - } else { - false + match *_other { + $call_type::__PhantomItem(_) => unreachable!(), + $call_type::__OtherPhantomItem(_) => unreachable!(), + _ => false, } } } )* - $call_type::__PhantomItem(_) => unreachable!(), + _ => unreachable!(), } } } @@ -270,33 +158,65 @@ macro_rules! __decl_dispatch_module_common { impl<$trait_instance: $trait_name> $crate::dispatch::fmt::Debug for $call_type<$trait_instance> { - fn fmt(&self, f: &mut $crate::dispatch::fmt::Formatter) -> $crate::dispatch::result::Result<(), $crate::dispatch::fmt::Error> { + fn fmt(&self, _f: &mut $crate::dispatch::fmt::Formatter) -> $crate::dispatch::result::Result<(), $crate::dispatch::fmt::Error> { match *self { $( $call_type::$fn_name( $( ref $param_name ),* ) => - write!(f, "{}{:?}", + write!(_f, "{}{:?}", stringify!($fn_name), ( $( $param_name.clone(), )* ) ) ,)* - $call_type::__PhantomItem(_) => unreachable!(), + _ => unreachable!(), } } } impl<$trait_instance: $trait_name> $crate::dispatch::Decode for $call_type<$trait_instance> { fn decode(input: &mut I) -> Option { - let input_id = input.read_byte()?; - __impl_decode!(input; input_id; 0; $call_type; $( fn $fn_name( $( $param_name ),* ); )*) + let _input_id = input.read_byte()?; + __impl_decode!(input; _input_id; 0; $call_type; $( fn $fn_name( $( $param_name ),* ); )*) } } impl<$trait_instance: $trait_name> $crate::dispatch::Encode for $call_type<$trait_instance> { - fn encode_to(&self, dest: &mut W) { - __impl_encode!(dest; *self; 0; $call_type; $( fn $fn_name( $( $param_name ),* ); )*); + fn encode_to(&self, _dest: &mut W) { + __impl_encode!(_dest; *self; 0; $call_type; $( fn $fn_name( $( $param_name ),* ); )*); if let $call_type::__PhantomItem(_) = *self { unreachable!() } + if let $call_type::__OtherPhantomItem(_) = *self { unreachable!() } + } + } + impl<$trait_instance: $trait_name> $crate::dispatch::Dispatchable + for $call_type<$trait_instance> + { + type Trait = $trait_instance; + type Origin = $origin_type; + fn dispatch(self, _origin: Self::Origin) -> $crate::dispatch::Result { + match self { + $( + $call_type::$fn_name( $( $param_name ),* ) => + <$mod_type<$trait_instance>>::$fn_name( _origin $(, $param_name )* ), + )* + _ => { panic!("__PhantomItem should never be used.") }, + } } } + impl<$trait_instance: $trait_name> $crate::dispatch::Callable + for $mod_type<$trait_instance> + { + type Call = $call_type<$trait_instance>; + } + + impl<$trait_instance: $trait_name> $mod_type<$trait_instance> { + pub fn dispatch>(d: D, origin: D::Origin) -> $crate::dispatch::Result { + d.dispatch(origin) + } + } + + __impl_json_metadata! { + $mod_type $trait_instance $trait_name $call_type $origin_type + {$( $(#[doc = $doc_attr])* fn $fn_name(origin $(, $param_name : $param )*) -> $result; )*} + } } } @@ -448,13 +368,13 @@ macro_rules! __impl_outer_dispatch_common { #[doc(hidden)] macro_rules! __impl_json_metadata { ( - impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; + $mod_type:ident $trait_instance:ident $trait_name:ident $($rest:tt)* ) => { impl<$trait_instance: $trait_name> $mod_type<$trait_instance> { pub fn json_metadata() -> &'static str { - concat!(r#"{ "name": ""#, stringify!($mod_type), r#"", "calls": ["#, - __calls_to_json!(""; $($rest)*), " ] }") + concat!(r#"{ "name": ""#, stringify!($mod_type), r#"", "calls": [ "#, + __calls_to_json!($($rest)*), " ] }") } } } @@ -464,65 +384,30 @@ macro_rules! __impl_json_metadata { #[macro_export] #[doc(hidden)] macro_rules! __calls_to_json { - // WITHOUT AUX - ( - $prefix_str:tt; - $(#[$attr:meta])* - pub enum $call_type:ident { - $( - $(#[doc = $doc_attr:tt])* - fn $fn_name:ident( - $( - $param_name:ident : $param:ty - ),* - ) -> $result:ty; - )* - } - $($rest:tt)* - ) => { - concat!($prefix_str, " ", - r#"{ "name": ""#, stringify!($call_type), - r#"", "functions": {"#, - __functions_to_json!(""; 0; $( - fn $fn_name( $( $param_name: $param ),* ) -> $result; - __function_doc_to_json!(""; $($doc_attr)*); - )*), " } }", __calls_to_json!(","; $($rest)*) - ) - }; // WITH AUX ( - $prefix_str:tt; - $(#[$attr:meta])* - pub enum $call_type:ident where origin: $aux_type:ty { - $( + $call_type:ident $origin_type:ty + {$( $(#[doc = $doc_attr:tt])* fn $fn_name:ident(origin $( , $param_name:ident : $param:ty )* ) -> $result:ty; - )* - } - $($rest:tt)* + )*} ) => { - concat!($prefix_str, " ", + concat!( r#"{ "name": ""#, stringify!($call_type), r#"", "functions": {"#, - __functions_to_json!(""; 0; $aux_type; $( + __functions_to_json!(""; 0; $origin_type; $( fn $fn_name(origin $(, $param_name: $param )* ) -> $result; __function_doc_to_json!(""; $($doc_attr)*); - )*), " } }", __calls_to_json!(","; $($rest)*) + )*), " } }" ) }; - // BASE CASE - ( - $prefix_str:tt; - ) => { - "" - } } -/// Convert a list of function into their JSON representation, joined by ",". +/// Convert a list of functions into their JSON representation, joined by ",". #[macro_export] #[doc(hidden)] macro_rules! __functions_to_json { @@ -550,7 +435,7 @@ macro_rules! __functions_to_json { ( $prefix_str:tt; $fn_id:expr; - $aux_type:ty; + $origin_type:ty; fn $fn_name:ident(origin $( , $param_name:ident : $param:ty @@ -562,19 +447,19 @@ macro_rules! __functions_to_json { concat!($prefix_str, " ", __function_to_json!( fn $fn_name( - origin: $aux_type + origin: $origin_type $(, $param_name : $param)* ) -> $result; $fn_doc; $fn_id; - ), __functions_to_json!(","; $fn_id + 1; $aux_type; $($rest)*) + ), __functions_to_json!(","; $fn_id + 1; $origin_type; $($rest)*) ) }; // BASE CASE ( $prefix_str:tt; $fn_id:expr; - $($aux_type:ty;)* + $($origin_type:ty;)* ) => { "" } @@ -636,13 +521,11 @@ mod tests { use serde_json; pub trait Trait { - type Origin; + type Origin; } decl_module! { - pub struct Module; - - pub enum Call where origin: T::Origin { + pub struct Module for enum Call where origin: T::Origin { /// Hi, this is a comment. fn aux_0(origin) -> Result; fn aux_1(origin, data: i32) -> Result; diff --git a/substrate/runtime-support/src/storage/generator.rs b/substrate/runtime-support/src/storage/generator.rs index 919e26972aab1..bcf134fc731fe 100644 --- a/substrate/runtime-support/src/storage/generator.rs +++ b/substrate/runtime-support/src/storage/generator.rs @@ -1460,7 +1460,7 @@ mod tests { } decl_module! { - pub struct Module; + pub struct Module for enum Call where origin: T::Origin {} } decl_storage! { From e12d868306c7bdff6aeba4d5aad86865d73cd932 Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 7 Sep 2018 10:10:54 +0200 Subject: [PATCH 16/21] Make work with new macro --- demo/runtime/src/lib.rs | 9 +-------- substrate/runtime/balances/src/lib.rs | 4 +--- substrate/runtime/consensus/src/lib.rs | 4 +--- substrate/runtime/contract/src/lib.rs | 4 +--- substrate/runtime/council/src/lib.rs | 4 +--- substrate/runtime/council/src/voting.rs | 4 +--- substrate/runtime/democracy/src/lib.rs | 4 +--- substrate/runtime/example/src/lib.rs | 4 +--- substrate/runtime/session/src/lib.rs | 4 +--- substrate/runtime/staking/src/lib.rs | 4 +--- substrate/runtime/system/src/lib.rs | 2 +- substrate/runtime/timestamp/src/lib.rs | 4 +--- substrate/runtime/treasury/src/lib.rs | 4 +--- substrate/runtime/version/src/lib.rs | 15 --------------- 14 files changed, 13 insertions(+), 57 deletions(-) diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index a58b4ac58a742..4507a4d7e0f9a 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -76,13 +76,6 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { impl_version: 0, }; -/// Version module for this concrete runtime. -pub type Version = version::Module; - -impl version::Trait for Runtime { - const VERSION: RuntimeVersion = VERSION; -} - impl system::Trait for Runtime { type Origin = OuterOrigin; type Index = Index; @@ -252,7 +245,7 @@ impl_outer_config! { pub mod api { impl_stubs!( - version => |()| super::Version::version(), + version => |()| super::VERSION, authorities => |()| super::Consensus::authorities(), events => |()| super::System::events(), initialise_block => |header| super::Executive::initialise_block(&header), diff --git a/substrate/runtime/balances/src/lib.rs b/substrate/runtime/balances/src/lib.rs index 0e95c9bb1e055..71a2ba2bfe7e1 100644 --- a/substrate/runtime/balances/src/lib.rs +++ b/substrate/runtime/balances/src/lib.rs @@ -133,9 +133,7 @@ pub trait Trait: system::Trait { } decl_module! { - pub struct Module; - - pub enum Call where origin: T::Origin { + pub struct Module for enum Call where origin: T::Origin { fn transfer(origin, dest: RawAddress, value: T::Balance) -> Result; fn set_balance(origin, who: RawAddress, free: T::Balance, reserved: T::Balance) -> Result; } diff --git a/substrate/runtime/consensus/src/lib.rs b/substrate/runtime/consensus/src/lib.rs index 98ba1a921d6c0..3e0be21131bcc 100644 --- a/substrate/runtime/consensus/src/lib.rs +++ b/substrate/runtime/consensus/src/lib.rs @@ -142,9 +142,7 @@ decl_storage! { } decl_module! { - pub struct Module; - - pub enum Call where origin: T::Origin { + pub struct Module for enum Call where origin: T::Origin { fn report_misbehavior(origin, report: MisbehaviorReport) -> Result; fn note_offline(origin, offline_val_indices: Vec) -> Result; fn remark(origin, remark: Vec) -> Result; diff --git a/substrate/runtime/contract/src/lib.rs b/substrate/runtime/contract/src/lib.rs index 6d1c1e1de183a..cb5697cd89910 100644 --- a/substrate/runtime/contract/src/lib.rs +++ b/substrate/runtime/contract/src/lib.rs @@ -120,9 +120,7 @@ pub trait ContractAddressFor { decl_module! { /// Contracts module. - pub struct Module; - - pub enum Call where origin: T::Origin { + pub struct Module for enum Call where origin: T::Origin { // TODO: Change AccountId to staking::Address fn call( origin, diff --git a/substrate/runtime/council/src/lib.rs b/substrate/runtime/council/src/lib.rs index 664e1509c1df5..b4f3b6b9d1a46 100644 --- a/substrate/runtime/council/src/lib.rs +++ b/substrate/runtime/council/src/lib.rs @@ -107,9 +107,7 @@ pub type VoteIndex = u32; pub trait Trait: democracy::Trait {} decl_module! { - pub struct Module; - - pub enum Call where origin: T::Origin { + pub struct Module for enum Call where origin: T::Origin { fn set_approvals(origin, votes: Vec, index: VoteIndex) -> Result; fn reap_inactive_voter(origin, reporter_index: u32, who: Address, who_index: u32, assumed_vote_index: VoteIndex) -> Result; fn retract_voter(origin, index: u32) -> Result; diff --git a/substrate/runtime/council/src/voting.rs b/substrate/runtime/council/src/voting.rs index 6c1780374f1a2..5d14f68c9d5e1 100644 --- a/substrate/runtime/council/src/voting.rs +++ b/substrate/runtime/council/src/voting.rs @@ -27,9 +27,7 @@ use super::{Trait, Module as Council}; use system::{ensure_signed, ensure_root}; decl_module! { - pub struct Module; - - pub enum Call where origin: T::Origin { + pub struct Module for enum Call where origin: T::Origin { fn propose(origin, proposal: Box) -> Result; fn vote(origin, proposal: T::Hash, approve: bool) -> Result; fn veto(origin, proposal_hash: T::Hash) -> Result; diff --git a/substrate/runtime/democracy/src/lib.rs b/substrate/runtime/democracy/src/lib.rs index 4816c9b11eba8..ff2c3856f6ca7 100644 --- a/substrate/runtime/democracy/src/lib.rs +++ b/substrate/runtime/democracy/src/lib.rs @@ -64,9 +64,7 @@ pub trait Trait: balances::Trait + Sized { } decl_module! { - pub struct Module; - - pub enum Call where origin: T::Origin { + pub struct Module for enum Call where origin: T::Origin { fn propose(origin, proposal: Box, value: T::Balance) -> Result; fn second(origin, proposal: PropIndex) -> Result; fn vote(origin, ref_index: ReferendumIndex, approve_proposal: bool) -> Result; diff --git a/substrate/runtime/example/src/lib.rs b/substrate/runtime/example/src/lib.rs index 9566a3a542a03..59f119f0b93e0 100644 --- a/substrate/runtime/example/src/lib.rs +++ b/substrate/runtime/example/src/lib.rs @@ -105,9 +105,7 @@ pub trait Trait: balances::Trait { // `ensure_root` and `ensure_inherent`. decl_module! { // Simple declaration of the `Module` type. Lets the macro know what its working on. - pub struct Module; - - pub enum Call where origin: T::Origin { + pub struct Module for enum Call where origin: T::Origin { /// This is your public interface. Be extremely careful. /// This is just a simple example of how to interact with the module from the external /// world. diff --git a/substrate/runtime/session/src/lib.rs b/substrate/runtime/session/src/lib.rs index 3a02868b34eb2..deb138f7e3cbd 100644 --- a/substrate/runtime/session/src/lib.rs +++ b/substrate/runtime/session/src/lib.rs @@ -76,9 +76,7 @@ pub trait Trait: timestamp::Trait { pub type Event = RawEvent<::BlockNumber>; decl_module! { - pub struct Module; - - pub enum Call where origin: T::Origin { + pub struct Module for enum Call where origin: T::Origin { fn set_key(origin, key: T::SessionKey) -> Result; fn set_length(origin, new: T::BlockNumber) -> Result; diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index ee65eea084a59..9b25ecb4d9c54 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -105,10 +105,8 @@ pub trait Trait: balances::Trait + session::Trait { } decl_module! { - pub struct Module; - #[cfg_attr(feature = "std", serde(bound(deserialize = "T::Balance: ::serde::de::DeserializeOwned")))] - pub enum Call where origin: T::Origin { + pub struct Module for enum Call where origin: T::Origin { fn stake(origin) -> Result; fn unstake(origin, intentions_index: u32) -> Result; fn nominate(origin, target: Address) -> Result; diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index 2e890d7e16c89..ef8df762323eb 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -87,7 +87,7 @@ pub trait Trait: Eq + Clone { pub type DigestItemOf = <::Digest as traits::Digest>::Item; decl_module! { - pub struct Module; + pub struct Module for enum Call where origin: T::Origin {} } /// A phase of a block's execution. diff --git a/substrate/runtime/timestamp/src/lib.rs b/substrate/runtime/timestamp/src/lib.rs index eda83325442e9..b586dae19b914 100644 --- a/substrate/runtime/timestamp/src/lib.rs +++ b/substrate/runtime/timestamp/src/lib.rs @@ -51,9 +51,7 @@ pub trait Trait: consensus::Trait + system::Trait { } decl_module! { - pub struct Module; - - pub enum Call where origin: T::Origin { + pub struct Module for enum Call where origin: T::Origin { fn set(origin, now: T::Moment) -> Result; } } diff --git a/substrate/runtime/treasury/src/lib.rs b/substrate/runtime/treasury/src/lib.rs index a7efeb8c28b05..dfdad00e0a6b2 100644 --- a/substrate/runtime/treasury/src/lib.rs +++ b/substrate/runtime/treasury/src/lib.rs @@ -64,9 +64,7 @@ type ProposalIndex = u32; // macro takes care of the marshalling of arguments and dispatch. decl_module! { // Simple declaration of the `Module` type. Lets the macro know what its working on. - pub struct Module; - - pub enum Call where origin: T::Origin { + pub struct Module for enum Call where origin: T::Origin { // Put forward a suggestion for spending. A deposit proportional to the value // is reserved and slashed if the proposal is rejected. It is returned once the // proposal is awarded. diff --git a/substrate/runtime/version/src/lib.rs b/substrate/runtime/version/src/lib.rs index ab66ecc88d25d..eddc2efdfe69f 100644 --- a/substrate/runtime/version/src/lib.rs +++ b/substrate/runtime/version/src/lib.rs @@ -133,18 +133,3 @@ impl RuntimeVersion { self.spec_name == other.spec_name } } - -pub trait Trait { - const VERSION: RuntimeVersion; -} - -decl_module! { - pub struct Module; -} - -impl Module { - /// Get runtime version. - pub fn version() -> RuntimeVersion { - T::VERSION.clone() - } -} From 57ad283c4c6ff635b92d451fb1e64d950ffcb4aa Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 7 Sep 2018 10:16:42 +0200 Subject: [PATCH 17/21] Tests --- substrate/runtime/contract/Cargo.toml | 5 +++-- substrate/runtime/executive/src/lib.rs | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/substrate/runtime/contract/Cargo.toml b/substrate/runtime/contract/Cargo.toml index f72c2b490ed75..a53cb5e886c6b 100644 --- a/substrate/runtime/contract/Cargo.toml +++ b/substrate/runtime/contract/Cargo.toml @@ -7,8 +7,8 @@ authors = ["Parity Technologies "] serde = { version = "1.0", default_features = false } serde_derive = { version = "1.0", optional = true } substrate-codec = { path = "../../codec", default_features = false } -substrate-primitives = { path = "../../primitives" } -substrate-runtime-primitives = { path = "../../runtime/primitives" } +substrate-primitives = { path = "../../primitives", default_features = false } +substrate-runtime-primitives = { path = "../../runtime/primitives", default_features = false } substrate-runtime-io = { path = "../../runtime-io", default_features = false } substrate-runtime-std = { path = "../../runtime-std", default_features = false } substrate-runtime-sandbox = { path = "../../runtime-sandbox", default_features = false } @@ -28,6 +28,7 @@ std = [ "serde_derive", "serde/std", "substrate-codec/std", + "substrate-primitives/std", "substrate-runtime-primitives/std", "substrate-runtime-io/std", "substrate-runtime-std/std", diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index f66b74268721c..060e0c32e99e6 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -51,7 +51,7 @@ use rstd::prelude::*; use rstd::marker::PhantomData; use rstd::result; use primitives::traits::{self, Header, Zero, One, Checkable, Applyable, CheckEqual, OnFinalise, - MakePayment, Hash, Lookup}; + MakePayment, Hash}; use codec::{Codec, Encode}; use system::extrinsics_root; use primitives::{ApplyOutcome, ApplyError}; @@ -82,7 +82,7 @@ impl< Address, System: system::Trait, Block: traits::Block, - Lookup: Lookup, + Lookup: traits::Lookup, Payment: MakePayment, Finalisation: OnFinalise, > Executive where From 52deb5c0c32deb6300f4ce6975bfcf12dc88bb3a Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 7 Sep 2018 11:31:53 +0200 Subject: [PATCH 18/21] Fix some tests --- demo/executor/src/lib.rs | 18 ++--- demo/primitives/src/lib.rs | 2 +- demo/runtime/src/lib.rs | 64 +++++++----------- demo/runtime/wasm/Cargo.lock | 1 - .../release/demo_runtime.compact.wasm | Bin 285306 -> 305534 bytes .../release/demo_runtime.wasm | Bin 285398 -> 305618 bytes .../release/runtime_test.compact.wasm | Bin 48276 -> 48096 bytes .../release/runtime_test.wasm | Bin 48486 -> 48306 bytes substrate/runtime-support/src/dispatch.rs | 2 + substrate/runtime/council/src/lib.rs | 12 ++-- substrate/runtime/democracy/src/lib.rs | 12 ++-- substrate/runtime/version/src/lib.rs | 5 -- .../substrate_test_runtime.compact.wasm | Bin 49778 -> 49958 bytes .../release/substrate_test_runtime.wasm | Bin 49910 -> 50090 bytes 14 files changed, 47 insertions(+), 69 deletions(-) diff --git a/demo/executor/src/lib.rs b/demo/executor/src/lib.rs index 141a5ba8e8dbd..0e53cd01b9975 100644 --- a/demo/executor/src/lib.rs +++ b/demo/executor/src/lib.rs @@ -79,18 +79,18 @@ mod tests { fn sign(xt: CheckedExtrinsic) -> UncheckedExtrinsic { match xt.signed { - Some((signed, signature)) => { - let payload = (self.index, self.function); - let pair = Pair::from(Keyring::from_public(Public::from_raw(signed.clone())).unwrap()); + Some(signed) => { + let payload = (xt.index, xt.function); + let pair = Pair::from(Keyring::from_public(Public::from_raw(signed.clone().into())).unwrap()); let signature = pair.sign(&payload.encode()).into(); UncheckedExtrinsic { - signed: Some((signed, signature.into())), + signature: Some((balances::address::Address::Id(signed), signature)), index: payload.0, function: payload.1, } } None => UncheckedExtrinsic { - signed: None, + signature: None, index: xt.index, function: xt.function, }, @@ -265,7 +265,7 @@ mod tests { // Keccak hex!("508a68a0918f614b86b2ccfd0975754f6d2abe1026a34e42d6d8d5abdf4db010").into(), vec![CheckedExtrinsic { - signed: alice(), + signed: Some(alice()), index: 0, function: Call::Balances(balances::Call::transfer(bob().into(), 69)), }] @@ -282,12 +282,12 @@ mod tests { hex!("171f1b2c01c9c616e40ee2d842a699286b50a5a74874b56d826094dadedffb27").into(), vec![ CheckedExtrinsic { - signed: bob(), + signed: Some(bob()), index: 0, function: Call::Balances(balances::Call::transfer(alice().into(), 5)), }, CheckedExtrinsic { - signed: alice(), + signed: Some(alice()), index: 1, function: Call::Balances(balances::Call::transfer(bob().into(), 15)), } @@ -304,7 +304,7 @@ mod tests { // Keccak hex!("e45221804da3a3609454d4e09debe6364cc6af63c2ff067d802d1af62fea32ae").into(), vec![CheckedExtrinsic { - signed: alice(), + signed: Some(alice()), index: 0, function: Call::Consensus(consensus::Call::remark(vec![0; 60000])), }] diff --git a/demo/primitives/src/lib.rs b/demo/primitives/src/lib.rs index a435edd3696e2..858002bb98872 100644 --- a/demo/primitives/src/lib.rs +++ b/demo/primitives/src/lib.rs @@ -53,4 +53,4 @@ pub type Index = u64; pub type Hash = primitives::H256; /// Alias to 512-bit hash when used in the context of a signature on the relay chain. -pub type Signature = runtime_primitives::MaybeUnsigned; +pub type Signature = runtime_primitives::Ed25519Signature; diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index 4507a4d7e0f9a..9429c1a04e6cb 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -77,7 +77,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { }; impl system::Trait for Runtime { - type Origin = OuterOrigin; + type Origin = Origin; type Index = Index; type BlockNumber = BlockNumber; type Hash = Hash; @@ -147,7 +147,7 @@ impl staking::Trait for Runtime { pub type Staking = staking::Module; impl democracy::Trait for Runtime { - type Proposal = PrivCall; + type Proposal = Call; } /// Democracy module for this concrete runtime. @@ -177,20 +177,8 @@ impl_outer_origin! { } } -impl DigestItem for Log { - type AuthoritiesChange = consensus::AuthoritiesChange; - - fn as_authorities_change(&self) -> Option<&Self::AuthoritiesChange> { - match *self { - Log::consensus(ref item) => item.as_authorities_change(), - } - } -} - impl_outer_dispatch! { - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] - pub enum Call where origin: ::Origin { + pub enum Call where origin: Origin { Consensus, Balances, Session, @@ -200,17 +188,28 @@ impl_outer_dispatch! { Council, CouncilVoting, } +} - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] - pub enum PrivCall { - Consensus, - Balances, - Session, - Staking, - Democracy, - Council, - CouncilVoting, +impl_outer_config! { + pub struct GenesisConfig for Runtime { + ConsensusConfig => consensus, + SystemConfig => system, + BalancesConfig => balances, + SessionConfig => session, + StakingConfig => staking, + DemocracyConfig => democracy, + CouncilConfig => council, + TimestampConfig => timestamp, + } +} + +impl DigestItem for Log { + type AuthoritiesChange = consensus::AuthoritiesChange; + + fn as_authorities_change(&self) -> Option<&Self::AuthoritiesChange> { + match *self { + Log::consensus(ref item) => item.as_authorities_change(), + } } } @@ -225,24 +224,11 @@ pub type BlockId = generic::BlockId; /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Extrinsic type that has already been checked. -pub type CheckedExtrinsic = generic::Extrinsic; +pub type CheckedExtrinsic = generic::CheckedExtrinsic; /// Executive: handles dispatch to the various modules. pub type Executive = executive::Executive; -impl_outer_config! { - pub struct GenesisConfig for Runtime { - ConsensusConfig => consensus, - SystemConfig => system, - BalancesConfig => balances, - SessionConfig => session, - StakingConfig => staking, - DemocracyConfig => democracy, - CouncilConfig => council, - TimestampConfig => timestamp, - } -} - pub mod api { impl_stubs!( version => |()| super::VERSION, diff --git a/demo/runtime/wasm/Cargo.lock b/demo/runtime/wasm/Cargo.lock index 5a7006c298ada..42e7bfd91dcfb 100644 --- a/demo/runtime/wasm/Cargo.lock +++ b/demo/runtime/wasm/Cargo.lock @@ -688,7 +688,6 @@ dependencies = [ "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", - "substrate-codec-derive 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-primitives 0.1.0", "substrate-runtime-std 0.1.0", diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index 1e64ab97605378a573374e24e100d59bd6915c59..f929ca9e6968dadcb99f2c71c43ab63a68af504a 100644 GIT binary patch literal 305534 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

f7pHZhCP}rXh1co%hGaUCcG8#x?YH5{bK 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%0AJD;Wh?O!n){8{>drNNXLs{EYkX(V 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 literal 285306 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'y!<463j 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%0DBl-Elcu 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 diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm index a7ed5f219890e3a82214fbc06564906b5a520c3c..ed78742ddea361432f61d48f05ee00a6ec946f29 100755 GIT binary patch literal 305618 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�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

+B!`|xu=JSMyk3qz78nV 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 G=l=uV`&+vJ literal 285398 zcmeFa3$$IwS?9SQ=l!^M>tXv!@?)QalUy}1RuYhm%@A!3ekgW2hDkDknKibPD8yHe zAM%YGrX5QV<2DdL>4dZi21IwdZKm6U$*|VAXLZAc0Y)K#_B8bH=qyGn6NrIfMhn7f zvk0B}{lBkjpMB1~lH~^(m}$$>*}HaC?W(W7_xDxpvbPmZS#Sr_`(YCWXKRC*}MzLagx zkKFyh;K+BZ-}b&c?z-!qcO{t$dMbF&u_H&4T(>)Q`|U^8Z@Yi}o?~}>`;pu3ynFqg zq@_nIdUWLO_rLGRu{+j}y!*EGV|O08?bto{tS4`Oc)L&PIB${`c3db>#ier9IMN1$c5Dov$yFP zVEl#Oap(Q(_t*7P^=|Wi=UsOkJ@We7UjKFb{gsV*zxT*@0E_QSA590HPG{Ij`uq$! zdB30M{3e}FzfTdj2`iGeQXaQc{!6kx|K$0If=)_tzmt!b)T-0T@=n_C4DLRp+wE`voOnCR5$Bw)UYE9Z8enZMVJm$Q}3I z_Rc%*Ka!_|+irXJ9qV_1DeulRwbweY=t7J48Y^L;U*C-j{Dw}z$FFS}9)4Yy^}L_{ zlOIfncf5c7z4siubN$XE_a{G;c8)x7k`9h%2mfaLDbuTx zq&mJf&8p7L<0KBM%$B-I8_eo-lVQnBik)Rz6;xC8?1u3H3KI&mGASrYpa=BUP8N;U(*|9)9l9a3boU$VA3huMKWz&KYnA`D!E~FS=qjMPqDJQ>=fzf za*ZtyW21r3yLI#UKz5KBx07v4%VV1_Q?rS*LS-g*DE*dt)&fOyzJi2cV58P#HA^Pj z*?O{RwKGh5m%YURaaEF5sRKsc1z=3uT!oI0R^?m9OsOgZM6NE|^APC>B9vY~-sTYL zGH-*(wLpX$VA3u-4v{Vp*)E85W~1K(kz#3i6d}SCZQQ^)t!&vQc|Fc z4yy!V0L@a*V^w<%l-dn+1uYFz_|X~_>c^3}#yeXAU%^GzoaB^tI5@l0wn zYYwm;#3HUN+w7fsR=30zO0S2=3_3Ng?B5z!cFkbt(2eh{rw+mDm62dyqw7rsOX>CF z-Tum&VD-u^2zJkG-bMqg>7E8%#^t&MXsiT^()Ik(MK(j@i>$G8fV%NqhpI#m*F^H> zdSC3>DsF{5@eSY@?Jqg!OBUMNNW%-iHonAOKI{NXjOK&5@>pBWv)V~ zY;BqV16p$>XzWdr1Bt2^Dg+|&o;Jp=!+n|h69%o7n~_RqNWIqDq~%N19`zQ9X|UL2 zq=IIXrD5dAllcj>x0nF0>x;IpO%etZ2;vI0Q*EDkw{AD>Iy~AX1d;DY4LVrn*N>Aj zud?+?FNdLvjea0HZv5+90g8* z1NjUGGT}fz!-353hJON1WMv+%(&|SH1=8v-60Lk%ef^qo`(0}jF?f^DlU~^tXfp>b zl~%ND5?+kGgbAe11YpXC$AvQi+K9Em`}<;klwLpXJ4^><($F%H z=f>a~go@w_Y8u7Y1WrMqIswrK-Y=cxnghmX4H$j?mRmK?8Os7?xGStJK_` zg!?rV{0*$_TD2Xbr}byk$OcFGFrtMK&I`2Pw%DGjFbc#B1av91>eqR3>GH6+4Bm-E zE-vR6#YDf=>5pwB#T8tf{NZqM<|Ex?dEtX8)VYd*OM1 z{`VKtv^{4VM55!jR*C}}m{JTbY$0PQtfH9 znJn!d|0)E}(P?%iY&knvCN+PUX-vufY{aa-{N?=3FpRYND@jL?07F0w>q-fMwED7@ zf@nP0T|ZEl)&HH|3`L}+^rA+KFVP~BkG)({Oavsg&0*L&T4iscZA-!uupAy^R0xcL zpTnh$nkW?*Q(D9HL>mw(`ZN3prp=#*iUt_f9sIvU)!G(WfGKCX<|d`v?@ATb}5k9ktNz=@zcYa*sQzj6~X zrR1ee1nxXPkpYa11#O40&mS_$f$b+4Wh_ae|vHdAV@8MV7AnYm`XT|2=MA=iu#Vey4>(;#D7 zwX+G?SfMa!$UYA@ALEN;u!R?$t4ZLpbWqD(G}GF)z1$h>j5f>}MX6jbE&-zHbH&zj z7uQQ_u9pBQ27=>g)4=B;YfxLwG|{ap+fXNxv4wFSEy*PSK9O#z;+4DBCP}c3m_dZf zF0S1k&Vp+yEmWq}FB23`GesioW2-%M*w$jzFqB3K*hkC^5ZjviI&U$H1)TAE-gOv0 zgO`8I`m!lCaZE=1A{zKokEAQe(${Lie{3~c((hT*EwIj!!KWV)#9ajLj%;9nRwsHl zw&{A4cZ1UF@&3(Yz>cjk0E0TB=RACvM}*y`X|!vr1SK5?EWO&quv;a@OKO7<2sKRV zpw&rFe=+T5y75fi{YcPzYi+q!iO)pc_)O52o2sGgYpKOQzbH2us7p;DsUg7>rDh{> zPQH;`2rF+mv0gx}p+9)J)nCwSn&w)=$x`bzI9aZd{{;U~^r!68{l3}#s_s{3_oeR3 z*}XYwYFQu@<~i#h`$HOP5##;LKhudjbTC|d6_}(l%obIR6%e5Fher3W&VfAP5u$_vV6)q9Qn zKweUi9mrR$yj&};O}12h;v({*u!t{G^=T~Og{VGmxtE(%pQgFlSVdD=P4&q(sXk^8 zpiI4Dst=~Xg6h*WrDlGthUx>1&#C%+YLn`-6|hS;Yc!3m^~|PO6QK9PW)0m%H_3uo zgLN$&(NKa}qlIsnHFHx67R~PwrkuBE5Zyhrr0#uH_XY%2y3|eE{D&%n0g7OfK7e-# zl7&#F8h7zkM!rP~e+<%s4lZA>E`NV@{7pzvgvO1;N~FM09fg=n^WN7@LZ_;;^PHXP zwdt%ET{e3OoeKhW@$h%kG_(2H5T~hRFC5xBLPv>RVya0>FcbT+nMks$J|f$KLF(89 zlUeglQ<{K8I-rnofw)mEpww{`{5AAvM397db zwI6wc-ZWQLD}6oP7eE}6l^L~$Rf?Omh1pdB3;vGqUujOf)crtutAMP)AXmj24h31c z6WpPb0e`J!*_w>d&bo(^13660f2;x6G7h);DQQg6Qn>^Srb`hR<}I}PWw`_}cy7R0 zs<^L8fUzv5&McOyD{hX!SQaqKa@l~v_|W>6%Pz{629b&6in3SV^4e|XINp}o-n^uq z08@_SqO>{N(8?h%96bd9fo2Ibu_~X?U~d}dsxQo30+3@_xnoSwCES#Qa!Ib=$r9d% zv|Pff1wT~_dlUPyQx4QOZ?*8o5`!(5>lWbrtcO+~3J?ZgF92D4Gh`iudP_58 z?U~ckFbLldPA;LSBKMBHvVa_WBg&3wKL%}=WK=XTGj(cRj+iMIwm0sT%V6emxonuZ zTybA1E)X$OZzz|Ab0!Q5aFZ$lH$gT;QQs+H;6H&{!rRaNVlaH}#oQZ76oDj`8zfOU zNfdJ=(HAz&NMcam8cEay(;$g)x#T1RdB(Yr!7Dxh0NZ?}0bcaY{ z2iOi#@h3Hsz=;S+z-dGhsuf9Mq`uo4T57-x0~1$wdax%DhtY%GfaOL*+ytr^p|nm$ zrHzyojl{9ENF3wM#DTsly!n1<^{{Ps{Fa%x_J|)DWMWeY0SP$#R=7%Aho|j5(~eRz zAjPtCbc#*{N0yt5aDs8E$d=1CV1Y4@XbT^9u3NT%0E#{t1t3`qMlLT?;(D#PmORK+ zI+4KyAPE=hFNl`IU2sjA&Qj(_H60*})6(9lO0qgaM{OV;J1b3tlk750(o~(`%?f^7 zaeM^4fbkD=lVfcGUH?{Gt_LU&1&{m_-n4E=K9tt!5db* z_-dv((7cF^0vW{_M>vLo5tymk{02j(#fo`RZ40#+g%{Q4Pz(H?2uqmf+O!K2M?7Uo zv@#wik}@j!de%936{0=g)5_Y%Te6PM%vMCJV0I6TCMi&Aq$K2G{tRx~avtONNWymW z9w2qXy?zebf_l|beMxP&0aYliu2764XYlG12YKv14Ww$1=pHn*M_fkov`4&2%vgis zvK3otK@Pfk)~0OQGxk(=blulAIIru0u1#Yg66n|VGOMFVF}+(`TjJ9D!F=&KSr=P$ zZLhTM=v=QEYHf`y27bko_Wg?W?&&Hohw9XD&O$s1kh4}RYw@b6uX^EXRvjF2C<<+u zlwb)|9cQ=~0J(RB(WHfQC9kah;Y`*GzI1c;?hFO zH%wbWUHmbL5O&5`WK~Hi7D3aS*vbDk%3GkWX&SJT7<~89ZvIzkeX9)IQ||zS%poD7 zQpXsklH`^E4*XPXj|Z2^%0lXl$k|{bg=(mQB%w1#N_)=3N7J^5gvR$9i^;0fASPm4 zum=&eFkWV44vjaix$cZoetzT@e0VCk#udLR~ftj#;|DM4lm(P4yWI0 z&?;*VnWg*64Oy|o9GSW}WJxI-7YK+*Q<9)fC!?;GBHm5+O#_>oee#(Mnlxu1e{3S6H)k@?>Ecv@n)O@1XEQP{BD)Pg5`(-wHNCsbWgc~)@GVdWKD)r7UOChO;hWgQ zZ4-gGJtq#WzFZtyogs{^>7{E`D%xv+Xj4)B%rAyN*U7izZZWxX3V~=D8m%bQP7BU&GdPx%hGOO)utE=c>v0!lO3#fBQ#0#O%RW0v2rbEhjt&xJY%E! z!Ov_YRGCP*FQV+tsJfc%oc79&-qH`z^FCq~YV03|Kaf4Mj*cmBfqV@3PHs}EB-W4@ zGWI@JQ@2#+Sg#zK^`r!j6rH#$2CU8|16`>;1MG4&fgyFvKI{g3JWrLy~EM_>@pq&OguxD$yhR#Ciyt5!J-S0mF}Rkq~bC9Vp0?Qpfd+*XeY_`ZYp z?35vrRX;&$&_(sjcU+r14z;rNS*+*NDfq#_^o%TY zX@mS<3k6fWpGIEeshs`sYQ<*r#2)O=R`@OUXO~LNh0*NK?y6sg(i&RxW8-m)1b*r6 z(Vm11#DlY|1U%fh;X_?_k5a+iA4uS*v7@~o{skY4|5kS1)A;O_dvAu80%QKBYoZ?K z<@;j!zWH)EyVqZxFE@QeBaU1@^ly5J%4_N4{UcGlpITCRInWI=ultt}7m)8oYu8$U zvita1vDIRMMALAxRRMNYU?s3uQI1*2dok7JONQBr(NN*u2|rgQ`*4MmsssZdgfUHE z2s~S#N}C3uh|^0ZJ)ekUNN?u`yA-0=+blA#xIA5DlO$*HX;VAyE!JU{+!nlMu$7Zb3GC`@E|;{FI6hu1n6X8=BNn}KlgIWdzku5VClQ@rFCFpE^f z{o1v_Eb{8NDV8;=;@8fKA$NF~7hgFm7Hg3!LA5WP6^joILh;U7F+58HVh-_jtXZ~x zAlEt}P4NwlLaR>XIraeIFb)q|YgZ@9bt(AILL~R@&xl(JQ3>_PwTqJF&N3?O&G#L^ zN2Tyh&506*Sq=hQO3?6XZj~_Inu#TV#H?%atfcw|vaIShzl7wFHY+d^spZa;;-vaF zT#f>_O2j$K@zts2{xO) z-?D7-0nJ64ld%t&z6R6mD2r;nO@~rIvT`Vd!XHE;n$&|3On}2##DP*#ts)7_vL}~O z5Qs7G$Kws$qaF}%D3^)epctq_R0Jfx+MrUj^>j!xa<<3l4f0%S>}lD@D5Z(KjW%Xs zaA}%f8YF;j(F?Q2EiDHP`B0j|A|fQd?(Ce{3jj$M(`VxvVi(oy=FpmX!b|%flpQ^e?7q? zqo<%lMqUdZTl~Qfu9cb!Pw!?!;Mt!!eiu9oJ?d_hvvj?B%#1U41idoc4qkuvGfe9X~jMSY^M*^~}ZJ9fKZi2G@U+JqzRFJ<}ZP zk3X%udAim6Xmg8N`%JtAh9~l3ZqUNNP=zdeW~?gv)=;%%Z7W@)f}2&Z!I51YV8j^@ zQ9;;c+I44qiD#Jtgn>Lv_`OAZZ8q=z65I((TUxq<7_N zso1Srp$?XY3dA?8N~UcKDBI~(34z=6zUoAJgF;6HKowf#ElD&&s1hhDNMBd)UQl%w zR7wVmX7G>i!aJmrOJSdk*56Dl_&Dzh??$N@d9t2B$Q()WZm~P2&CoPChR4_d|EQ~s zt}1;1l}1%{)fJnTj+5f6qzP+%sjo8$2Gy67o3+j*BfAuy)z@YVN|$d2h>DE7QLA_C z+T=33>pW0haUV-c!KD?;Ear$n2TB^D4`U8QyolbuOwy;lr0(wW*xh{pqX(+x`>HeE ze@_3RDSFuc0D@32og32?c1N4}P8eh?xE%RJvY*y+(wl?mKoAArLDT?K@?`+5!IU}4 z-V88>n^PJPBcY1stM*ixsuF0=V$FK$$^xu=3f)*I!ko%6$1aoq#PE7$)Qtu6TMS1!qnu2~OrXG;9Q#HDQug z-=(Nr#k`NAD4sxR6v@FAkOmf7EqiOPO_J*8$<%_EK%-D4+zJPQtR?M;#Crre!WY>e z6_qQiAgMvLSh4~xEkV&DZilegBWBuiiTE@BYy-|i$rkbh=wipQyAq1F4Mafu=5Z$R zV#2IUEv%y-$rKjF#(EIpk6Jfjyf)!dm8m18H#KfD>4#ZT=Ci~<(wWUu{cEPeE7O#5 z?c9L6*@H_0Xne|$VjowOe{F!@{_Gmw(W>MgCIrKkQY3D*D>)h7VOP9&KXbB| zJQGlaac0xGIoLMCdXPqbi-W}HH9uYpms!7zH{68rp03ABxyJjNnme;nP86PGscJ7}0iktj^KFO3mB!l*?Kh=6?f76`kIqCu5Y*r z>-&7YzLaZyPd_nRUvXMr-z&Ltd=!rQ`f8WxzJV8b?okx3jSVS~BfP|Fnu5 zhCek7nHqosJ|I(bWtyW>D=3P%w_xbDR1!Zsf85o&Mc@B>sB6{bs6Xm$=?XU0WO=s5 ze@iM`!o>JuGD$}4NKUHHCO3@535r8X)BvfDeS4KXP<8Kr>d*=Pdp3EPt$3{NpQ=TF zSp8r6bxS-u$m?uFr4+BEI`JQg{`MY#wf_2#ZlDW-NL@Wo?{kLC>Vmm!@GUviCB?Nh z8CVxO;)QJ=9ckEuvU?a``k;CmO^KW8#~;U@nq)Z>(*SWMTH+{8=sbf4;AXII@$4S+ zpc|NLIpATRCw*&=PeVH7Vxa}Xr8hFZ>eqgpA*a=^>xXV9-JID8oEqGqT3N4F-akcO zRtBoDmYw5Ab*u;$nF5hn^}Rp2AyE35^t_MS3p~~}+vJ#4CJ)gxXB%{t-Y;sjhC$>Q zG`rG@o6uCxjOnF9lb{7o>$fnpZuM!pxZZC=j8khCtJNBUX(0m})N$Ci|CeT;rc1%!a$qegFDe^|>E-t>68` zlidBpir@U+=eSw&>;L#=t>TZL9XRX#sZYLtt=j94KK)^?2XBTwrMYpXi&c!Dzk1WEJrNiGpQ~zHZq*Ep#btz9zAUIv6cfG%) zGpYCHM`l^ozNoAt^R=YI-{t%@nI0!%0M!?<`LAA1#I!2z6Si~Bc=D>e55)kFmZ(AQ ztxPxYR*>Z@?%U!FI7mh#%faBpMuFu1GV7abz42EZ!z9*vx3%6DX%_p}L|PA!^AD~H z2DquJ?}EXhUsn&~eyadqNl!efn0xe7af=b598KP6Z_E8{N#kt?8ZXQBGJ%ShA&i9^ zdRemhWpv~(tDR!Amzg&&dhdk#?!7ZgQHRD7G!45D)xH>KUaWpD!t(MO54)ha+q(_g*O^ zWY7#lv~O2r^D8wLojLx|^Ofl~v%0c_5(U~sCI8$>7)`mY++O_W zhRo)aD7V`RY4z~ND-C+{T#9qf#Rv9MCZgfL{8<29Lp=N(HjibSf!4t|i+gR;>R$7r z;R2lpnotx^fBz@(r)kTaFiJvQ20R5?Y)H!R@PdP838L(_1@?h@aVrv<5gjK$yvP!!C`_ zN44F?W1%8gB0;h>IS=%58ig0pj*=_g@R0Xet^rC=6oVTvUMItkWr)Lw<^IcPP88;T zP$2DjBrFE#Y32@?0IU{5Hl5eNX?nYKk2B`He_>M9#!uHh?!VcnjSe^d2kQ`Jk@(i3lwRL>-&2o# z@KEwC2!p3F(`b06E2^kA{O(s1yL;B}PGoj>Cfv2`?yTP((9I)httRBi7(8$Cvl%<{ zwU+n~9Mq`J?bEz=1?GBsrJ!y;IxQbvh>t~ApdxhAFG{+_02Z^0J6f@KJW%y^%Gg;M(@C6R3-<3)LhfFRwkO-9C% zjWj4H1_C9rhB2Bz1{HUW7{~}OfOr(7M17BPG#juv%^S@3(1>!3ut1Eo0Ei>`7 zg{90@W4#PRFH0r3B%qPtK-i72 z7)lE5Ns$Oe_%PKGkYI}@+r$J3C#TqzLn8KQDh}XOhd^S`fW$CD0*eF3%+Zom5d2V5 zjk{9p(f`8m(c}z&FzA>wiEn8Ss^#V9jEGGzoE{>n|P?sWMgyQKb6_G1a{JwV-O{X&46 zg%l#QM~i49FcP$7Uy358fuSL+_-~tN5dQKw|!i ztG6NpfRq$hcLD?twCYp#NhuPnJT*9JPtB4>B$(VLa7zs(Wc-Q7=bVz*u3lgkOz5pM z-5F@H^)B7P!#uS_kRWe?o!n_u?dd74bW%W`+sk~?YFgQH8b~lF{9;>F^NElSl z(L(ynFJ9c{EV_qw^0yIcbx6j4;n5dKyM%B1xqdR*0duaso45uPbZdi4=)Gj7REiXq zFtch^c{}KX++Y}TlvqzZNykZv4)LJN%~h89jx9SXT@Y)$nvcs2UyfE(;&F7N1_pOUk_6-;JyaLNL`Zz zhFOhTqgRa%W7l*LUQ1Zq5PP`|jtFZftIZ2w-oEpNlsF%)61Le3)3brpnP#?S(~`BB zjBVBoX8?fJp8cjJe_*=ZHaGXe4%XfiTJ~E)d=*`Qwq(<>y*V#;ObT(K-ed=V?O^VA ztdUxtRF8r(7eT(_P#5!;Bb_HiaslniWE=M@0NNx^#JR10F~NcL5^roi1-oobv?8+7 zSMOpIY4!ARE%lToO3I6jIrA=d{EHcD$&i9TLsj~31%xg3Cc#fkS~K+=U~a=pL@jG9 z0kOhgX9!Crr%oV_f@}$UGrx@$>8P8Ibu*IGvnnGT0vwv-L$_$}HmY7yUd%o*oYr*9 z{=97^-tZ-Uprvgf68A?D`#|3|5r;W4#GRTmq7WLL8o!r4tRKP#~~pf9?MiuX_~Jw`1r)ir^9b$*$yFSq$mu7G_D*QaIZV^ChM zEf2eVZ`F!pWUIVFg{5cNa&?*S2jJ?``UHwSSkLO|>BSuw<}Z5o`mWa)J(gYQ^Z~CGaV6o-O#)F6UE`A=#Q4 zxQ$Q6y<}`=pD_S2t(rS*&8G%T0*k}>)DnCuhkORiGskr}dJCzrY_4?52awLE3}i5m zw~Wzs{~GwzlDY;>F5z;fd(LF0=<3++tz)%S~ukcej^o*gvf*^&rBE!d&}4@t*_agX;(oeY`P%5~Hv{=G9+k;uWm4|81>ROtqlLN# zlkSMSN=axke%kHk*a$^_v3-P4J6HtO@^dBd8tULGEHrK3W_bG9S)%<(9LfeDdrA9D z!8-jw38Dbe-&?0SOCK1^2x5iKYNq0`gk9<@2LwmZS><8%B>mls4OJ1}(Z|H8pMx_pQ?|NA84i zi`Da%dfY}D8hrhnacl7PJ>%Bk!@UyeSJ~sRhqnP$u~hiq8gJw!sPUSFz9z!RTc%L7 zgyf71|82NyUwZR4`x zgJin-cYIT4(PtYsGRU9p8w>NJ`qqn7VabUST2wL)j0wKNAALiGq~4oUDyAmOfkn~* zk3?YoJZHQ@{AqmshOmITV->ABks&|TIkdu8LJGB(#EwQ$OjY50*2Yq>Kw$;;zJcarOlsvsau>ZvG-5~hL)1W@re;G?#wToZ??lMWdA zzS+G^WwpN7R7#Gj2>T(zNtTd^?F0NC?O`ZoHi7_`#OdnSz$sSuqEyL;oY1M zSNmpBR&#@ZP|CL|Xb+;Fu#%b2q2v*WjXNH(>bvX^9Tef2)VXmoKd)rPu&`$vn?A8E z+cuY9D{~o45%i^X3%^&Ok14M;C-9WS?qb>{`Vw4d;0RhG^EO2lmWuPoPGL(KbD}Yu zxiOfyFR>|f{9!qeQ;x&4Zla^H%)2xbomQi=mE zTOJ^3NF!#R+1SWiTdFRX29ViQkU{nyEL$C)R)qOz7{F<)mh>d=-g3jcH$KM9+zmh9 zF^N>eaxB9+z-fuxxUAi_!ya|uWAnd`ZaQ#Ma^sc-A~N2V^**zew7Z}fQpktf=J{~TOaTQSEdVuXjaVHZQ63!FP*_v$*eh0UlQX-J#RUW` z53bLgJr7RiK0CuQGqHdhqoBevBrO;2#X}N}$8zAW1Z$lXCrlwBuA@LnQF+!GXj7O9 zQ77;gF+nXnVFjAGbK|+(xpCFVof}uP+_`ZzmpeDEX1R0Y%5&#HPodowIj1}1<0_#z zSh6H5dPg|OUw%hRx03r2ZjLw?2Nr`x23sUfnxgcUG-UnXGH%0ON;6;J?W)6%*GU?6 z5Oiv!UXR*&Vz^Ota^%b?q8ChC<)SH8#9f_;$2mdWa)-Q7%?vxtHp{H*wAwi;!Hzn! zZU-s|nROBoT8@DNYdF)CvFBxNCEF${gO0tZrB$oDu$&qt;Hj&+S*}FG`8p)vsR{{r z-c6>wtNAJ<;He4;cwWVJaW9uUba>_qB;d*6MQ^hNyd5?$CE(E|OVa3Z{-q?~HEWno z4-`^B2F2Iu;au10;atb`@U&Eh0si)KcoYSHf+L|Ei1W#&$xzTj@x3+U*E>Mc~_=gqKLVa_x`O0&%b|08p^M@O~EE2LFO zJO&h_QT;?jAmu@jVje!?Qi{F?_yQvi)vI*)JMC5rM|qdOwMN8Kg3yU6;OM*T`0mM{ zpbPs)NWiol!|WJEXw`g0i!w?WZ`DZuHQ!Yc5z& zD7at~Rhj)!VAh?nMBCW6W}lZGA6oW;O) z{f*rO(jY`Z`}Xn>vxfgM$5POO~0AnqAI4z`x8Z_M#Sw zcETl#FT(>l&7Y;id!Cvu3vz`)u3Z*SxQ0i#f=&!xV=OF4tOt|s z(T1?qU0SMg9GpFTtPxGpf>){vXrcd3Ai;9^VVTAFMvX6x6dK^9sZ1T<0m7)Yip7JN zau$sR58Y2iKWWKx)rGQD*EQp1G14$STTcdrre-HUYRsMnWlvZuJA_fuFNKQnzzodB z?mVIAj2!B9^o)I*&5T#3wr+#{e3tDDDBz7W3@xY00XuRmVi_$-$x!b`!u%Y1m~7w; zj(%a)X^}t*)sq=JY4p`a+zzw+0hKjWMO_b}~?Cp`BL(wD3(vu@DwtET*S`FJqXK z^BKMybp;3GFq3DqwSwKM8ZMbr;zH_|2M?}ksxpl2sk)%4+$>y0Xk!AIDJiH!*Y1QM z(j@5r)C$Z*5VviGXG2CtUY#5$`}!nDn(k&Qzdc@y2MjzryF5L+JT+c}6~{Wdvr`vw z9_5wp?BvDzt`}>n!Krav)y==OJ|mhBy$~$4Jn+1Fn&2TmC`M+HQ_b58vAu2Z)kYS* zP5uBQJg-h;X2z2b)CFM6tBqNq4n25g#F;t;<&RnusulkQcaIQtz@WV<`F;YHdfRiH zZf)%!$4ilg6BJZv%|02|CSc_96M-c*mm{ zMt(rYV}rHgtujg&*-33|;S^O)C-pfJV>zXh{ngPR!n8UuyL`SMO9kn(wjVpMKD~?= zQFxPA|AtF_u8GUv;F6a-w=C?-t6$}|4R`g){(C(PQx*iRiWU|y^We{yqxsGZuV$v# zrKc51w?S)(siWEkFHnmM8#zLOUT4U0W_J18vrAv>h+L;xhBBQnF>cZZCmC@xdb&Wx(~)50U})zYHxhS#gxGGKt|6r%%qz@jVIpBr zRataNDT3eY?KpqEciTN5UV!?Tm&5&xm|srhecH~2a`3pnhR_-QS6@cT>*aypSa-xJ zI30%>o3NM8Qw&UF>l#n*h^K3xmiXM0V^FmE`~Kh_%2E67U-_7{q@0U(Gli zCN_I=MjEGPmyVDPtT{<&EB>K}r}41}_^Jo+5j)imR+4mH@JM|7BzSRX$ARpl{93Iq zd}>2=CfqvO3!balV*_JU4YE+T)Bw?RM1U{mC&tJZYJ+#2^JOIOBb*NA#>lE@PY%ym zUQVuwoNd;9b}$TJi-W$@mF6iW(OIzET7`D5cR zfx*Y%)@JT6p(-No6{F!_7X=x!g@TMNih^e2Z?aP;RtngRdg2lMjZuF^spnAoAe4@V z*@d$oVp}SPQ=7|bM?-hp>DSWXrMtyvMsE?I;6hDfuLMh?zts$Y8ekouI>fe#7*PN_ zVn|pt02{Ll8i3`gaHW9`ULxH`$Ob+Wo``HjC6vR?PX}Fx#$Hi{K>_j}`1hI7TJc|M z%q_=(L?f3;C?+jy;>K%}4+lP7yaOE<39jQ56Vz$@slMDw!Vj?u4pjCl z2?ri-!B%Ch1h&faFiZfjTIxBCi4p zE)gHV{hXuSVxSr%gAmoV3Ug{WXfY1p3Um#-V8rkT`$Z@-V^I zsQmn_PTO`yD?ujgO=J>Qt0Km8#+iM2ic%?BU0!2e2Xb*?Z?b>wOS-Uu)C_3TvY4v0 zS{8h7l5$dW!aM!zYrCYz`l0q25j(JBo0V|1yv(UpmGrFyBSFC8urT}XKte?hpjWTe zt~HLr=gJcLn5vE|HT_1DfJei&HBNzpD+RTgpD?=ffHZM~iPTDw6Sw*)snW40Af@cZ z`T%Gw!M%A&#R}~qJIKS$NNK?SCdR{>Q-eAiI%4A%>yUr=*n&GgO6fErl2tQFSS^+U zRs?K2%3)`R8L#2qQ`#|7%z&3!ISZndY|&P+AdW`B8>OYZ5nrk@N3_S4#nsW|Z5#y( zmWredyk=o3K3JCk1{`S2H&;zI)V zChABxRLKP|Br^{iof>bZo9ZG{W?9?nXTW4`fRhMIr(kKqw*13iNf)+MDM=eFIM>I? zT5CMEZQr0&Z>{)N6l7hXCemoD50ZsrJW&xmoj81u%)fdHJ!+={%(2mt8<`5T)2n%c z=2~t(7nBcm{d}6qMT6(D^fQRSI6-roH}JL4?3p?$N5EIX+F-A>D!5_=x5ibf5hg<| z<*{`UG*Xe4G*aoE{Dpn;uQ@DvP02Q3d*Iwt?||mD^aOde6XRd}_C``o^^t~;4{{x% zWIm?A$Z8F%c|f2kt>&AH5s5?Stm?E@SH(3nbz@fUJagwuehmQ7QxtpUTO*1frEfsM z@pBCn1RK;>2+Z{pzsBY8(+3GMpvHcLCdh!wHP)j6MMt8bMFB$y7OzpHG>GLLSSM1q z899_3VkxiO$PYmUFLKzn(g12J#w45wi>(^!*~||(ckogxTUd+DzYXs+rS(cPB6C*G zATd*D0muhryGfyK!aN+HY|J%@s;s~smNaCZs*!lhR=^)dFthrvIGA4~h<(^afh%o> z5!JGzfrPH*V`PVx9f5!F7a)dZN!*u?z{2|%i@6KqTk-Kh6mfhjfxu*sth}7@{VhOK zshi)d#D$rHkQB$bL%W5QnaE4TMK0343q`xXO!sxBRHkDf#g$yzguE#65Y94>sz((p zhfTkPiOrHA^IgBc^9N~5A2PbwIs8d>Qsh@cp#NX_Lva7Q8Z>!wg zg+H6th4OFzNP1oRpx#k^B0M-j=-doCUPV_f1To7VXOo=X^cc@?7{8eoA0*@v-zZ+| zbF;!9pfgVsqwA~F2d_)dY9_7y$)D-By+8R6VP+@N1Ib_7b@d+;pZlM3e1&tEi>*y2 zC`b~1h+hM5EyxWZzT^z?WJu-%V2|=~;>S`Ll+~C?bDxMi^_URsMmxMVY^wN7CDwQs zKO2PYOabN@;)S)6=*IVIQbk@C-m-x*@ZRiTc)D3mT2GH=nY1GBK}MYr#HFPIR#J`H zs7CxnTJo=3mQ=#HFx{wKJL?|hu+>^*nzOE7J@T6yN%e95Df_qb;W$9|HZ0cOgCCgU zu71b(=IX!a8Ji0)Be(OG1tNhtxppU1H+(i!XO&OmNhFU#OHDXUC@;q%ITRD&z^9ZQ z1}Hz1O~&>?3zU|fjkV%?9`#!N;Aa@0zUV=H#t#k=F3A*<(Sl98W++~V@qwX89`WJv zZ63u_wiJm|z+_n-c}lMz?{io&%AkR?dabb9J-W&Vv+ z{>B>)V@YjyoVAUJ`yFSuH{kGZCA+r^4l_1oAgEo-!dV!NaP~BD!&(ES7JxRKJ#7Gd zdH7nn!5Q#zQyL~d9ynuk4H>e|B07e;YYj5l61huL1qrbla(DeJnuhljmHNx7;@Q9y zDZ2r=tKSo6yDIrUI~N}a7^C}9f`M*j=GCuJ(r$8;v<+Ts3!g zfq%AYN;}~%3&p=PmIUjPvnva$CX&X*c(D4%n%cN{+pSnJ@w)nH6<$=l?ZLAD_VGo) zMVq(h0gIMS=r9;@}=$+<00Z-h5 z=NO;+P(omfLL@V^?NAqsW|J<}601}e39NE=xqUoPc4C9#IT&q*(NH;EzzR9qdcG82 zONY|kbtyN26yOjkS*daX=wuO19=A#Dybq{b`0pZ)Ce)KfYKs zO*kh~kS*r#6A=DenJFnMbJ=8NrqHO&MHFQ<2E89fK{GP;rdDpbPhOj06ljAAW){vjT{aAuGFd>eZwH3pUr_*Lv&4F{ncy(6HWnKK5 zS@CN!Wj;|KlU2M-yO_{K+SM7hs*%Cty<*b=Olc?M*N(2TOXTj71!z!kbeb4cqLoq1 zxK?of^{1f{iy5Cs!FjzaIE3g9kKYj$93`363J#^$qi{&UAwzCLqQSWo95N7OZAf#~ za6dzC;Qs6^Hsh}{kd@+XQv1H9dX78rgoxVcYVj&RVnty!& zXb=Wx8ie9V8nAbNyZORn8}TE$nsuTAI;op0*8wbsLB=KwmjZV`7=3P7LG89TwMoP% zgl2)%?#YZewz(jcl3`c{vhO*NeNm&54EX)u1;_T77JJ5xCKCzI&n&OAXkwARX+*8! z7Wbu^2K#x1NWt1OSYJFw6OvpR&!G{RFTnGxp(WM(yG`(z}~UQEjS^{01)e1@RQ!)Q{!K)*sBBSUn)TLk5R2#e z43{!!=A=VMIFjz@wA6k^@N$lUSAU@)!$!^vcOGxWzAqH&d$d6u=h+_M%U`H!&)Rh2 zP@fpo_cW~3$sV$@@YY7sYSjf!UxB2W@$gH9P$Y>zGQsDz`48-avkf#_tODmm!{Q+k z*Xk2eIe5ay1Sh@fQa65@%PxD=WIGu^W9r-6vV(CUSeRPsG#BENFJ>WJ z%7}QR%SqH|*9Zht9MNszNgaCqlF+EsIZR#X+w9;bDqPe+gfnYt zAL?+p%Axd;Ne{Fy)oL7wn?txZNsS9)xUVSK7!s%?6=|}E5ek5^RS;@W1}3Q3a5+Jb z(iC0GH}WtI46Y_cYr<}19@gsDZa*`L^Q2trlT?GECB}dx<6poib(1{RsY7RQvGE-U)UFx!!Cw9wi!7>_m)tE{ zs1m)+v(1e6Vjs!bg}tfJ7+05+%TjGu$V5Z)w9{hZIHj~v!%md(GItkQ86%1_4)rd! zc%VK6%SDVN>Hv7@*n$($?(J{>W7LZ)d!f!p~SuUIQg7~dA6(U#@%267>F(l zl2Vz;=(rOViKyj=5@9cm-cArC5c0{7ZrHbmsy(3~q{GIKp4S2GlOGNhH%|Hm!~Ce0 z)4f=a&o0??^%+g#OTVIIt<$=ElDD||pwpPmBjZOGp5!Ud!CSPQF!Smejfq1GtLHx! z-dTph#Zf=|!{Nd6XxsW!QuW(mRMnI5;<5PX`8dVLLU%7X@<;8faW?X^ba&w+KOrD7 za-)Cc$KtJoR?GGcc%|w?&D^IY5+)3xuLli5=oUZL3|^VCxMqoxTIJOyq-N^SAvZ*^ z$U6-um=4;Zg|Vf`GOJ(y_Zvcmuciqq{0-v+qifIv-DvqD zrzQi!rG31FscEOJIZlZgD8&-D&5dR2K0C#u9?3H3x2TZ$c1+j_dAzK+HUxq5m>h=n zdjfY2jz;+&%+^wxywmn9erexmzdEY!e zah6%r7K0mTsP3Ym6MR+ivH4u+gk9!yMRdYxP_alXMZrV!c)-RJODvQBFx23nq;SPK z3(Zz?)({5>2|XejoIXO(LuB+AwLwDFQ*wMLt;b=-%ME$#F(8_MgHJ;O3fctMWPEp$=ai0`PBi-81W@mj{s;)(F$z|Xa&gzse>~@wCHe&() z;yAwyMZOOKTy6<2BdYr|h)2FeJ>#-Qeru=I3D3BUr$(B8(FsF5MvUSej__}tj%C&n z{vae=dh*AOvrb>9vjLZtyYM>e2N1CstJ$rbXeYk7OD6U%9bri?1U@b= zFZWyq&O{>)C1&cikhkpV*`KiqsNBV8?!xqCc-T-V^Nz(i=t<;hIv<$kjDaPT4iwSM zj(v;V1M&#TN~j*o<*wr9>XUNv%H@p{vN!=YRpJ6D8#Boy?Ru<7celH2+W*EAgQCRwqoaV~S*?Kv^?} z{UF|5(q7~qH(q1kWD#AotY6~=ET_Ftgl1uNGc{Oogm$}nuX_SS1E`6iqU|P#ynrX7 z_8LRtC_;ISEM5-Idi@68Ks7-yDsIilQ?w-ut!!m<88t<_E77PSjGmNsc!sWb?pn^Qub11CUoI) zZ6L)&g|K%3d6SyTKDVqXhs2Hui5(V1V$_=BXZMr%=OTv!Ct^zK9 ziZ%3ocD)RB2yN>Gw+Q7ipW$AsLhcndU+v0v6TkE zxHbs9474aIv=pfc+Re?AkRgQO&zg~`$VyFe%#)#k9G!Or(9K&BTwkW8NsX0zNWy;f zhMAy@W=Ry7!G=P4wqqq3z{5sw9-~%Rg?{AFaJtsNQP~NsPEemyb{c5qoZBVbR>}@& z#~Y~?S)De-|JS0p1<31b|MDrP9sj-qm?Kbq(!-6X8nPKv#(zS(<>A!IkGimZ}GTZnCk! zbVMy`0vHgx)fEp&hg{+m#Omo2?iYB4UIQE?)$LW1eM@EE4kWT8urXc_k6$k(5)aEd z^r<{6!W>VreWU%zbf6=Hcs_W7_$*51>*Z&aKinjiMy@Xe34(x8 zpHqo&cKxWY`QKr({U@#;UnNH3tN%4h90~oQgZAU0MZJgh9SuRogTrWNGPF5cqitvP z3i2$ZJ0cVLFadpATAGUwL7aONs1hgmG5krx1gK6hEN!Zv1W8}^;s->19L0lSI1k%d z6k-eJ^x<@l2W8Vb@)_eWM{4g0ad-LsO>#6vY{T%A;s6_C{WnPt5vR07{uLc@!pJIV z5n8`hf@p%Vi&z%3SZ6J35zDo4ezRt5v1PcJuNM!Xc_FTdM5B9>qJ!&q^)7vgK;t$9 zCLe_Z@XgKb1p@p`E%vgA`OPe|i1}V7*H1&)@zhg8dCi{oQfMq4M3kd4+DoaKD`N?z z-o!Fo7D^y7AkoA@WsWEXNAXN4it`SX7iMIBM`}b*4WE{^U7_tO(rS_jfAyIGFJy|AyD^)D z#)n-CIX9=~^C9SDOzkVNv=K>}jo}6VLJwMGvuw>sWc1{o%)y_b?~0(Hi2%=%To$Y| z;h2h8i_2@cnj$5S7PN{xA#^t`<0<}2wfDX?bL_`80+l(@lrP?MfTj|!N=_%dR@du{ zLnnjnB2>J~40Xw*CwSO@!cUl{nv{KxnVw$8sr=aHobN(Ytn-54iXE;D#qUA>Rf2FVky!_-C9I!KPp%G#y}Z)DRmQIJ`J+tCh0_T_9) zkE2*9Z_tj)8K&2tryTcXMz*WhZ^dyN+Nb!-`8Y1`;ziVg7BjaemgfkjTFe1VRr?LMDwpP+J37DJo;9t?$P#SKb5^Bcs#%bxc?Zs* zIMB2sy*Q}XM&cY$W>J?L#`{LE8^&-P?8r>X+9w;e`rxYtW*(Sdtxe7_@`X6mo|7QWKybset)v4P^#Ft#uC8$n;5~6kn8UqN{$B0sQ&jvgsr z^cWlZ{F50cY}0kQNB))BzaqP+to(WC}q!@m!9B!81i!Dj^TZzp~qT;?G$m> zJ3yDqNFeoZdYERfa35RT{4Lg=*{C^5GGLIc{IC4t22)V{qeOE-dZF*{p7HpoL`YYQ zRERJRN<_01o=kohthv_k+#wS+YdqJxL5_4PaF7{ElpX0k&@p1Lk=1@;)W`&k zdh7;lv^bcNKS5*@j!?V_$6XBHi2kv1O{Sz+0G{>qw^*LL#Tz@Xje1Ip^8CSlu^sZv0Ui! zm1GVx;%h+QvR`}`)8_~bmah6IpEexZtzfN-=5N)(*EMsCdk4kiHqz?P*@)0c<)~Ri z9nlm|HvYyiI~iicy+I4U6QL_ySNK=y+TGl~1m{e%ZEjt&-L#NPGbs?&jWkEY0j+Cf z&o6lfi{tX6n_v}&>>4&s>*)NIWek}qhhHf?(u&8r9(X#BBH=-L@kv6Lo3f(al`Q+& zz07=8$wX@0TqkLUDI6RN#r?cg%<{WgK;xaQ;{9BmK@g#tlV2PO+=}R4V{q=EI=rRc zWDwjVXOu?(GMq{s(;v5FN03K`Ghc7n3uiM%AcuuMOami$E_o<$g1zDdnK;2-QyOAe zj9hIj90!#AJn~+&SmnFmPVgsZ3vyq;3qmz`0S8C!_uN)y{g|{_rQ&%*v*V-w4M6rY zY(d=NAkaq?6zoH3t>&5+BkCzZJBR7VdbRl}=^NUvMw>0u<}q)(Z&n5+dD%6w%vMGN zfdv{83MD>^FffLN$3ClmlRIB6ADI<$@KY#s?OTOGv&p_m9JQ&SC@x%OONuq?doIxQhAX%T5XHxwH7YQIc(8rbgf>LN%PJPG!y*qlSVoNoxn1h0uetVj1Bm(qpso z5P65h3)+@++ss3g^T^00*xII7aDH_^c*P!`MizZgEc%Nzi&k16%7H9arR&%yBcJuB zS0Y@kP}vbaY_SCPL-JEI0f`Velhh6{FtP>{EJ{K-kBR`e(6yu_@C6CmE^wH=dR#Z0 znbX~-B>30#R^{x>#2Tn3hy~{(au)@e?FLd36lxFLfLTdN;3zg6no{>-1E~x6FwH#~ zOz=d+1Ut15w%tJTM*nsLSFl(%H^!s=Q)K1_M?avjb};%D=9pJ>zr3kgNNUm<21<-K zgdcs&?$h1@nUAC*lgY;+@y;) z$J4c7C|F2lDPbYeG6HPDLXt$-1hDg1NS+*I#A1He_IMQcaq_ZSk8AGZd`1(Q?c+4H zjDsp{Z1`l^%f(0f#1QSE3gq0?a0768;h+jiW#KD#0|Ts&+XyTIefgTM9aKRq7Gmt; z!yz^1)4UUPeHtloX~dCdf8vGvVxjWz?6ss=g6`^Bnlo1%-AnH+WcD1g&D&_y*aF$2 z3v-UMo;T&_C1isG0I}V`>llR@W{^jHE+O9;Vq1{T#bygkIF~SA9^LKEo(RWl9W|+2Qf4b*;s{agONY5kjEZVvRF|

K-{GYmlaB|~`vbV7Oi;MHr;Nr8&K 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 z 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'y!<4640yMf-34;sZ&oQ0#+iTm%BhaZQ0i;l@5 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 K2i+FyrT+(5MWM?8 diff --git a/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm b/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm index 75c6ebda9e7f2b246ef32835531bceb01c737f9a..4e4867d71e8c4c93fba50ca0e7a634a2a79b13ec 100644 GIT binary patch delta 3424 zcmZuzdyH1a6~Fg>AIsxg*t-i0OIO(s_<&`3&CI=bW-cP}16M<|MJj|^YnHipW?*^j zuDc6TiAAIWT9Lv55uv8=6RSk+xl6SMdXveS zb7tnudHl|qyZv+T%4gmyp4XUn2IUL+s+^b0RS(YRtE+QE2IXr8<@0V8-0V#n_{yf& zox)nD{7Pk>XWiTj_f4)mpMS)K_4yK<%U!6Hs`8$9WkaQ9K;mZf>49B&q{oMRQB_^- z%-Z_lrmuJZ_Q=Kupnv^pn11sGc)WfLuEUY~UG8|8J$#Bgq4MDH&s?_|+8a9a{T#op z@~4KSo;wW6jYIDqR#Pat<(yw%beg?<(e+Dx0{1(D!Y5v?-&*%)-rBKFnJgQVFFD10 z`EMIvcko;bP8*gM-J<8WRQ5OSbn#Mm)X?P023#)qUiqVJ(y!>0GfB~H#4GxhKgops zeXr=19qu{h&oVxTI;uuH-fiA(MX%X&#<=CRcMQIEuus(&*LI;6RPiOO8a3M6un~5R znxFam@u+bbH@vAmLZ2rV`;`YQEq{{ng>v4X2pcAB@qLuO?kp`1 zE>|xdGsO2RT$2aipg``3GmwFtM2&9*(t}|@2G!t6Reu{)58Dm+Yet% zTjrhxOICYxa&U!=TDvIcJK1*zX)V$Za*opv>D!*~G-nGapMzwa>o^0EZbp6*(r@

*?+6R*Q|(hlN7F_KvQVy-ptn3jM!b z%OFt5+0IU0j_AYq${)gNxm4!c}j8jq;j!69MHNOkG+iJ9F9NZcn`-% zIKKI&W8$~rNKs~RSRCCr7GR<;;>fQ3sxrI#?p$Wk)|KVK?oqh>*j;WfG_9Y7?j-B^ zFhMv?m=IBs5h|w;Ifco}(e*oWev}ff!i3p4G@6?j=51W;^FVMWDdj8{VXPRuwQ+h) zB&`TUNT^AzVgzb8E%6!EDPxI}+FHx4sywl2ufjnmCD)lroc$ zG_f(Pdipk>Nuwx z#=xYKYaXXjm_{-ttxiw-;*PeinqC+mx z9~B01LL*oQ%W6`zBII1Bi7~MQ8)O)XsEN_

1mL&iTH=0Atnzogzj}+KM3?F(T-~OT-dPFHKEk zbT`cz9qF2i6e5+E4hnOz%eh>#{Q2Dd6yLSgcA%P|l{gd&NPgc#hf;Wy8v zK9&lqWKlp=qvQUuN!UKEm^drp($zXzIB@&Uqi9LJkX%Zt^m7ol< zBWcv?EH=HcY)`2nzzK#Tr8Fiqr8bqZ!76WsTV9#~7k@RcMhK}yWJ8tElxPbrduRHH zB@7xBp*9w)Du&g2@4!YN14NsM6;?D07+l(GdAkub33V5^^`N{0%~BPx#KNWl9CTYMEG z*en)djMt}uf>DQBN<>8_Q||mF@7aR?af1I93+*|Gb7-k;p98to*iW~2p2}h5;27fu;IPl=me1}?L+~g6r!0E=3*JrTUJT;(V;+Wgv(xDQ(blUf?PaRx3 zU97u4L!~S>4Y20iFrQg`;bO$LQutJc_(q%wYOSP31%U}A_M23w@$mKOMRimP1cWBi zYLz4@neY%yIr~GXI$K{GOBHA7!H%mbkx?^DKD%rLK01jtX%Mm$y9qNBm$jAdo?n6o z&y0jO&)!;>7)dOTlb8^u6RukBLN^*<>bbFgsA7SgH^8^RVBHzmcWzB>U^%|$am*3Z zBEh!{{_c%{S+8!bqXCvab{nkQGz?85XTq^pM>pX=Rok_nsp->~FoumQ)`kZh{}Un} b&(8M19p~$OG=k_6 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 bwG+(v%Fz_bglKr!1*V#1CZ&Gm(aHY?Od9uk diff --git a/substrate/runtime-support/src/dispatch.rs b/substrate/runtime-support/src/dispatch.rs index 14b4efd9c8428..e400c4cbfa03e 100644 --- a/substrate/runtime-support/src/dispatch.rs +++ b/substrate/runtime-support/src/dispatch.rs @@ -308,6 +308,8 @@ macro_rules! impl_outer_dispatch { $( $rest:tt )* ) => { $(#[$attr])* + #[derive(Clone, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] pub enum $call_type { $( $camelcase ( $crate::dispatch::CallableCallFor<$camelcase> ) diff --git a/substrate/runtime/council/src/lib.rs b/substrate/runtime/council/src/lib.rs index b4f3b6b9d1a46..0ff41c2743f9f 100644 --- a/substrate/runtime/council/src/lib.rs +++ b/substrate/runtime/council/src/lib.rs @@ -631,19 +631,17 @@ mod tests { use primitives::testing::{Digest, Header}; use substrate_primitives::KeccakHasher; + impl_outer_origin! { + pub enum Origin for Test {} + } + impl_outer_dispatch! { - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] - pub enum Call where origin: ::Origin { + pub enum Call where origin: Origin { Balances, Democracy, } } - impl_outer_origin! { - pub enum Origin for Test {} - } - // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, Eq, PartialEq, Debug, Serialize, Deserialize)] pub struct Test; diff --git a/substrate/runtime/democracy/src/lib.rs b/substrate/runtime/democracy/src/lib.rs index ff2c3856f6ca7..28e467296429a 100644 --- a/substrate/runtime/democracy/src/lib.rs +++ b/substrate/runtime/democracy/src/lib.rs @@ -354,19 +354,17 @@ mod tests { use primitives::traits::{BlakeTwo256}; use primitives::testing::{Digest, Header}; + impl_outer_origin! { + pub enum Origin for Test {} + } + impl_outer_dispatch! { - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] - pub enum Call where origin: ::Origin { + pub enum Call where origin: Origin { Balances, Democracy, } } - impl_outer_origin! { - pub enum Origin for Test {} - } - // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, Eq, PartialEq, Debug, Serialize, Deserialize)] pub struct Test; diff --git a/substrate/runtime/version/src/lib.rs b/substrate/runtime/version/src/lib.rs index eddc2efdfe69f..c8e3b8f4a6dc1 100644 --- a/substrate/runtime/version/src/lib.rs +++ b/substrate/runtime/version/src/lib.rs @@ -29,16 +29,11 @@ extern crate serde_derive; #[macro_use] extern crate substrate_runtime_std as rstd; -#[macro_use] -extern crate substrate_runtime_support as runtime_support; - #[macro_use] extern crate substrate_codec_derive; extern crate substrate_codec as codec; -use rstd::prelude::*; - #[cfg(feature = "std")] use std::fmt; diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index 0afb7c9f184163022d9cd2ccdbad69b36b7a2c05..b9e122e56f184e93503245fe0720c54179c09fa9 100644 GIT binary patch delta 7744 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 A0{{R3 delta 7412 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 pqf{%@{r;MWEMp7kvZ*6<5*XaW!ts{|o)7RmK1S diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm index 674df04b2bdbfc7f35a9c8089214abb37d24a3a7..19ea6f6adaa8ef552b49259375e9dc6973f2aa94 100755 GIT binary patch delta 7799 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 delta 7538 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 Date: Fri, 7 Sep 2018 11:41:20 +0200 Subject: [PATCH 19/21] Tests --- demo/executor/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demo/executor/src/lib.rs b/demo/executor/src/lib.rs index 0e53cd01b9975..f0cb26cce3292 100644 --- a/demo/executor/src/lib.rs +++ b/demo/executor/src/lib.rs @@ -279,7 +279,7 @@ mod tests { // Blake // hex!("741fcb660e6fa9f625fbcd993b49f6c1cc4040f5e0cc8727afdedf11fd3c464b").into(), // Keccak - hex!("171f1b2c01c9c616e40ee2d842a699286b50a5a74874b56d826094dadedffb27").into(), + hex!("a72ec570c7642d9ad06ef0e5dd37be65fb04b71e0ab52b3927d760ed6c777a1f").into(), vec![ CheckedExtrinsic { signed: Some(bob()), @@ -306,7 +306,7 @@ mod tests { vec![CheckedExtrinsic { signed: Some(alice()), index: 0, - function: Call::Consensus(consensus::Call::remark(vec![0; 60000])), + function: Call::Consensus(consensus::Call::remark(vec![0; 60000000])), }] ) } From 1e92641b144d17461947f1bf4455f1654c78cc3a Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 7 Sep 2018 19:15:51 +0200 Subject: [PATCH 20/21] Fix grumbles --- substrate/runtime-support/src/dispatch.rs | 8 ++++---- substrate/runtime/example/src/lib.rs | 5 ++--- substrate/runtime/primitives/src/generic/block.rs | 2 +- .../primitives/src/generic/checked_extrinsic.rs | 10 ++++++---- substrate/runtime/primitives/src/generic/header.rs | 2 +- .../primitives/src/generic/unchecked_extrinsic.rs | 7 ++++--- substrate/runtime/system/src/lib.rs | 10 +++++++--- substrate/runtime/treasury/src/lib.rs | 2 +- 8 files changed, 26 insertions(+), 20 deletions(-) diff --git a/substrate/runtime-support/src/dispatch.rs b/substrate/runtime-support/src/dispatch.rs index e400c4cbfa03e..203e3a1347ffe 100644 --- a/substrate/runtime-support/src/dispatch.rs +++ b/substrate/runtime-support/src/dispatch.rs @@ -375,8 +375,8 @@ macro_rules! __impl_json_metadata { ) => { impl<$trait_instance: $trait_name> $mod_type<$trait_instance> { pub fn json_metadata() -> &'static str { - concat!(r#"{ "name": ""#, stringify!($mod_type), r#"", "calls": [ "#, - __calls_to_json!($($rest)*), " ] }") + concat!(r#"{ "name": ""#, stringify!($mod_type), r#"", "call": [ "#, + __call_to_json!($($rest)*), " ] }") } } } @@ -385,7 +385,7 @@ macro_rules! __impl_json_metadata { /// Convert the list of calls into their JSON representation, joined by ",". #[macro_export] #[doc(hidden)] -macro_rules! __calls_to_json { +macro_rules! __call_to_json { // WITH AUX ( $call_type:ident $origin_type:ty @@ -536,7 +536,7 @@ mod tests { } const EXPECTED_METADATA: &str = concat!( - r#"{ "name": "Module", "calls": [ "#, + r#"{ "name": "Module", "call": [ "#, r#"{ "name": "Call", "functions": { "#, r#""0": { "name": "aux_0", "params": [ "#, r#"{ "name": "origin", "type": "T::Origin" }"#, diff --git a/substrate/runtime/example/src/lib.rs b/substrate/runtime/example/src/lib.rs index 59f119f0b93e0..a7953074c1048 100644 --- a/substrate/runtime/example/src/lib.rs +++ b/substrate/runtime/example/src/lib.rs @@ -91,8 +91,7 @@ pub trait Trait: balances::Trait { // `fn foo(origin, bar: Bar, baz: Baz) -> Result = 0;` // // The `Result` is required as part of the syntax (and expands to the conventional dispatch -// result of `Result<(), &'static str>`). The index after `=` must be unique within this -// enum (the `PrivCall` enum is allowed to reuse indexes). +// result of `Result<(), &'static str>`). // // When you come to `impl` them later in the module, you must specify the full type for `origin`: // @@ -191,7 +190,7 @@ impl Module { >::deposit_event(::Event::from(event).into()); } - // Implement Calls/PrivCalls and add public immutables and private mutables. + // Implement Calls and add public immutables and private mutables. // Implement dispatched function `accumulate_dummy`. This just increases the value // of `Dummy` by `increase_by`. diff --git a/substrate/runtime/primitives/src/generic/block.rs b/substrate/runtime/primitives/src/generic/block.rs index 5963a11fde0b7..40538a392c3d0 100644 --- a/substrate/runtime/primitives/src/generic/block.rs +++ b/substrate/runtime/primitives/src/generic/block.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Generic implementations of Extrinsic/Header/Block. +//! Generic implementation of a block and associated items. #[cfg(feature = "std")] use std::fmt; diff --git a/substrate/runtime/primitives/src/generic/checked_extrinsic.rs b/substrate/runtime/primitives/src/generic/checked_extrinsic.rs index 6f9d9d356f33a..e5aee32a02c58 100644 --- a/substrate/runtime/primitives/src/generic/checked_extrinsic.rs +++ b/substrate/runtime/primitives/src/generic/checked_extrinsic.rs @@ -14,13 +14,15 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Generic implementations of Extrinsic/Header/Block. +//! Generic implementation of an extrinsic that has passed the verification +//! stage. use runtime_support::Dispatchable; use traits::{self, Member, SimpleArithmetic, MaybeDisplay}; -/// Definition of something that the external world might want to say; its existence implies that -/// it has been checked and is good. +/// Definition of something that the external world might want to say; its +/// existence implies that it has been checked and is good, particularly with +/// regards to the signature. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] pub struct CheckedExtrinsic { @@ -52,6 +54,6 @@ where } fn apply(self) -> Result<(), &'static str> { - self.function.dispatch(self.signed.into()) // TODO gav: remove '&'. + self.function.dispatch(self.signed.into()) } } diff --git a/substrate/runtime/primitives/src/generic/header.rs b/substrate/runtime/primitives/src/generic/header.rs index 82fbbb1185b6e..fc4b3d0842223 100644 --- a/substrate/runtime/primitives/src/generic/header.rs +++ b/substrate/runtime/primitives/src/generic/header.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Generic implementations of Extrinsic/Header/Block. +//! Generic implementation of a header and digest. #[cfg(feature = "std")] use serde::{Deserialize, Deserializer}; diff --git a/substrate/runtime/primitives/src/generic/unchecked_extrinsic.rs b/substrate/runtime/primitives/src/generic/unchecked_extrinsic.rs index 39b91084baac3..c7e3693fbf187 100644 --- a/substrate/runtime/primitives/src/generic/unchecked_extrinsic.rs +++ b/substrate/runtime/primitives/src/generic/unchecked_extrinsic.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Generic implementations of Extrinsic/Header/Block. +//! Generic implementation of an unchecked (pre-verification) extrinsic. #[cfg(feature = "std")] use std::fmt; @@ -24,11 +24,12 @@ use codec::{Decode, Encode, Input}; use traits::{self, Member, SimpleArithmetic, MaybeDisplay}; use super::CheckedExtrinsic; -/// A extrinsic right from the external world. Unchecked. +/// A extrinsic right from the external world. This is unchecked and so +/// can contain a signature. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub struct UncheckedExtrinsic { - /// The signature. + /// The signature and address, if this is a signed extrinsic. pub signature: Option<(Address, Signature)>, /// The number of extrinsics have come before from the same signer. pub index: Index, diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index ef8df762323eb..cd83ce0f09450 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -168,30 +168,34 @@ decl_storage! { } } +/// Ensure that the origin `o` represents a signed extrinsic (i.e. transaction). +/// Returns `Ok` with the account that signed the extrinsic or an `Err` otherwise. pub fn ensure_signed(o: OuterOrigin) -> Result where OuterOrigin: Into>> { match o.into() { Some(RawOrigin::Signed(t)) => Ok(t), - _ => Err("bad origin"), + _ => Err("bad origin: expected to be a signed origin"), } } +/// Ensure that the origin `o` represents the root. Returns `Ok` or an `Err` otherwise. pub fn ensure_root(o: OuterOrigin) -> Result<(), &'static str> where OuterOrigin: Into>> { match o.into() { Some(RawOrigin::Root) => Ok(()), - _ => Err("bad origin"), + _ => Err("bad origin: expected to be a root origin"), } } +/// Ensure that the origin `o` represents an unsigned extrinsic. Returns `Ok` or an `Err` otherwise. pub fn ensure_inherent(o: OuterOrigin) -> Result<(), &'static str> where OuterOrigin: Into>> { match o.into() { Some(RawOrigin::Inherent) => Ok(()), - _ => Err("bad origin"), + _ => Err("bad origin: expected to be an inherent origin"), } } diff --git a/substrate/runtime/treasury/src/lib.rs b/substrate/runtime/treasury/src/lib.rs index dfdad00e0a6b2..b0b962a7d58d5 100644 --- a/substrate/runtime/treasury/src/lib.rs +++ b/substrate/runtime/treasury/src/lib.rs @@ -173,7 +173,7 @@ impl Module { >::deposit_event(::Event::from(event).into()); } - // Implement Calls/PrivCalls and add public immutables and private mutables. + // Implement Calls and add public immutables and private mutables. fn propose_spend(origin: T::Origin, value: T::Balance, beneficiary: T::AccountId) -> Result { let proposer = ensure_signed(origin)?; From 0abbb309d0ab96a0f0f2e3a4f7d54f7f404c6111 Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 7 Sep 2018 19:25:05 +0200 Subject: [PATCH 21/21] Final grumble --- substrate/runtime/primitives/src/generic/tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/substrate/runtime/primitives/src/generic/tests.rs b/substrate/runtime/primitives/src/generic/tests.rs index 445e08beb5963..bbe5d00ed36f8 100644 --- a/substrate/runtime/primitives/src/generic/tests.rs +++ b/substrate/runtime/primitives/src/generic/tests.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Generic implementations of Extrinsic/Header/Block. +//! Tests for the generic implementations of Extrinsic/Header/Block. use codec::{Decode, Encode}; use substrate_primitives::{H256, H512};