From 2492931944e3007791070b3b27b9ccc11621969d Mon Sep 17 00:00:00 2001 From: thiolliere Date: Tue, 22 Jan 2019 14:42:13 +0100 Subject: [PATCH] compact param in calls (#1499) * impl #[codec(compact)] for param * update modules * test all and build runtime * Update srml/support/src/dispatch.rs Co-Authored-By: thiolliere * Update srml/support/src/dispatch.rs Co-Authored-By: thiolliere * delete wip comment * update param to use #[compact] instead of Cmpact<> * fmt * impl metadata * test metadata * add compact attr test * script buid * update test --- substrate/core/executor/wasm/Cargo.lock | 14 +- substrate/core/test-runtime/wasm/Cargo.lock | 48 +- .../substrate_test_runtime.compact.wasm | Bin 47298 -> 47531 bytes substrate/node/executor/src/lib.rs | 22 +- substrate/node/runtime/wasm/Cargo.lock | 48 +- .../release/node_runtime.compact.wasm | Bin 826729 -> 829083 bytes substrate/srml/assets/src/lib.rs | 51 +- substrate/srml/balances/src/lib.rs | 13 +- substrate/srml/balances/src/tests.rs | 20 +- substrate/srml/contract/src/lib.rs | 17 +- substrate/srml/contract/src/tests.rs | 24 +- substrate/srml/contract/src/wasm/mod.rs | 2 +- substrate/srml/council/src/motions.rs | 37 +- substrate/srml/council/src/seats.rs | 442 +++++++++--------- substrate/srml/council/src/voting.rs | 11 +- substrate/srml/democracy/src/lib.rs | 104 ++--- substrate/srml/example/src/lib.rs | 5 +- substrate/srml/executive/src/lib.rs | 4 +- substrate/srml/session/src/lib.rs | 13 +- substrate/srml/staking/src/lib.rs | 23 +- substrate/srml/staking/src/tests.rs | 14 +- substrate/srml/support/src/dispatch.rs | 129 ++++- substrate/srml/timestamp/src/lib.rs | 15 +- substrate/srml/treasury/src/lib.rs | 61 ++- 24 files changed, 576 insertions(+), 541 deletions(-) diff --git a/substrate/core/executor/wasm/Cargo.lock b/substrate/core/executor/wasm/Cargo.lock index 933a8fc20e..4e0341b6b9 100644 --- a/substrate/core/executor/wasm/Cargo.lock +++ b/substrate/core/executor/wasm/Cargo.lock @@ -32,12 +32,12 @@ dependencies = [ [[package]] name = "hash-db" version = "0.9.0" -source = "git+https://github.com/paritytech/trie#e61df32342920f602a9d8d71caa5117c779d3ff1" +source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" version = "0.9.0" -source = "git+https://github.com/paritytech/trie#e61df32342920f602a9d8d71caa5117c779d3ff1" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -144,7 +144,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "sr-io" version = "0.1.0" dependencies = [ - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 0.1.0", @@ -178,8 +178,8 @@ name = "substrate-primitives" version = "0.1.0" dependencies = [ "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", - "hash256-std-hasher 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "primitive-types 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -219,8 +219,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" "checksum crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c240f247c278fa08a6d4820a6a222bfc6e0d999e51ba67be94f44c905b2161f2" "checksum fixed-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a557e80084b05c32b455963ff565a9de6f2866da023d6671705c6aff6f65e01c" -"checksum hash-db 0.9.0 (git+https://github.com/paritytech/trie)" = "" -"checksum hash256-std-hasher 0.9.0 (git+https://github.com/paritytech/trie)" = "" +"checksum hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc5ec43724866bbc8337e09cab4d4b5f9fdbbe589f04bdc8bfda906a639ad338" +"checksum hash256-std-hasher 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "811bd8c26961527b7d5623b71162d865325639f8ca204d4ec90b5b87473a122d" "checksum impl-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9c88568d828291c50eed30cd7fb9f8e688ad0013620186fa3e777b9f206c79f2" "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" "checksum parity-codec 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e7b6a1290fe78aa6bbb5f3338ecede3062687a98b9e40cd1dbcaa47261d44097" diff --git a/substrate/core/test-runtime/wasm/Cargo.lock b/substrate/core/test-runtime/wasm/Cargo.lock index 127b3d0a02..d8aad89ba7 100644 --- a/substrate/core/test-runtime/wasm/Cargo.lock +++ b/substrate/core/test-runtime/wasm/Cargo.lock @@ -212,12 +212,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash-db" version = "0.9.0" -source = "git+https://github.com/paritytech/trie#2616db2a2529098949e5d39aa06dd4e502a9e5f7" +source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" version = "0.9.0" -source = "git+https://github.com/paritytech/trie#2616db2a2529098949e5d39aa06dd4e502a9e5f7" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -392,9 +392,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "memory-db" version = "0.9.0" -source = "git+https://github.com/paritytech/trie#2616db2a2529098949e5d39aa06dd4e502a9e5f7" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -897,7 +897,7 @@ name = "sr-io" version = "0.1.0" dependencies = [ "environmental 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 0.1.0", @@ -1018,7 +1018,7 @@ dependencies = [ "error-chain 0.12.0 (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.25 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", @@ -1106,8 +1106,8 @@ dependencies = [ "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", - "hash256-std-hasher 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1135,7 +1135,7 @@ dependencies = [ name = "substrate-state-machine" version = "0.1.0" dependencies = [ - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1143,8 +1143,8 @@ dependencies = [ "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", "substrate-trie 0.4.0", - "trie-db 0.9.0 (git+https://github.com/paritytech/trie)", - "trie-root 0.9.0 (git+https://github.com/paritytech/trie)", + "trie-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1193,11 +1193,11 @@ dependencies = [ name = "substrate-trie" version = "0.4.0" dependencies = [ - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", - "memory-db 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-db 0.9.0 (git+https://github.com/paritytech/trie)", - "trie-root 0.9.0 (git+https://github.com/paritytech/trie)", + "trie-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1401,10 +1401,10 @@ dependencies = [ [[package]] name = "trie-db" version = "0.9.0" -source = "git+https://github.com/paritytech/trie#2616db2a2529098949e5d39aa06dd4e502a9e5f7" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1412,9 +1412,9 @@ dependencies = [ [[package]] name = "trie-root" version = "0.9.0" -source = "git+https://github.com/paritytech/trie#2616db2a2529098949e5d39aa06dd4e502a9e5f7" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1583,8 +1583,8 @@ dependencies = [ "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b" -"checksum hash-db 0.9.0 (git+https://github.com/paritytech/trie)" = "" -"checksum hash256-std-hasher 0.9.0 (git+https://github.com/paritytech/trie)" = "" +"checksum hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc5ec43724866bbc8337e09cab4d4b5f9fdbbe589f04bdc8bfda906a639ad338" +"checksum hash256-std-hasher 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "811bd8c26961527b7d5623b71162d865325639f8ca204d4ec90b5b87473a122d" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" "checksum hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4da5f0e01bd8a71a224a4eedecaacfcabda388dbb7a80faf04d3514287572d95" "checksum hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d340b6514f232f6db1bd16db65302a5278a04fef9ce867cb932e7e5fa21130a" @@ -1608,7 +1608,7 @@ dependencies = [ "checksum mashup-impl 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "aa607bfb674b4efb310512527d64266b065de3f894fc52f84efcbf7eaa5965fb" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" -"checksum memory-db 0.9.0 (git+https://github.com/paritytech/trie)" = "" +"checksum memory-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "812321f5fb5adb04c60a872d9e45c6f060f77ed4df7a28eee49d1565cb0af47f" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" "checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" "checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40" @@ -1686,8 +1686,8 @@ dependencies = [ "checksum tokio-timer 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "4f37f0111d76cc5da132fe9bc0590b9b9cfd079bc7e75ac3846278430a299ff8" "checksum tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" "checksum tokio-uds 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "99ce87382f6c1a24b513a72c048b2c8efe66cb5161c9061d00bee510f08dc168" -"checksum trie-db 0.9.0 (git+https://github.com/paritytech/trie)" = "" -"checksum trie-root 0.9.0 (git+https://github.com/paritytech/trie)" = "" +"checksum trie-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6fce41ab9c34e9a79f3f3c149c17dfedba15d10ee273ef1ae40dd48f7d91eb0e" +"checksum trie-root 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6c08a925fd6305f1b7ebbbb663352ddbfe3033648303a91ab127b8b5b12f04" "checksum twox-hash 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "555cd4909480122bbbf21e34faac4cb08a171f324775670447ed116726c474af" "checksum uint 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "082df6964410f6aa929a61ddfafc997e4f32c62c22490e439ac351cec827f436" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" diff --git a/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index eb4ee4ac71263f2d457470de7fd5b7d9008d65a0..4cc222f4566adf48ae5a9cd51af7b58597718d05 100644 GIT binary patch delta 4107 zcmcImeQ;FO6@T~bCfQ|olSkH&kOcB}K}eJ|@B1Sl_&%&(&gh4=C-wvy3(DgcN~q4+@GLT? z@-pB{mA`@Y^U4NT%afa6y*;@E*5{Hfs5AIWaxVhXUv&o%^2w||SaD4Q*-_mNyO*o8 zx$~L=_gKve*p1gbS>930vv@a~;Uj#M>m*OizF5pE<2r+(T8Fxf*WVB8!TJqT@+eQ` zm+BFf|9j55Z%TeRmqbAF`GWpL?wUx3FX6*r(z9?Enq-CfQn>g+<2#`GM$^?01b4-1 zL}P!kWp*%d<=w@qA+Vm&oC={avPgIw4F+!r4W(f6nRW)vec`?_Cey+&iy4Lw;awTN z3?In$@TD1y2Jj2yP2*nl61mCT0_*S0KJ)@v*1C)#`T3s3bd&!TjcQ z$$SP-vl<%)f;1LRc=zrzjK)UzaH^DTNzal|}SLP%bWm2Uv%%mc~Vp^FB zP%OjYf)2_vSg^>cu&HRM4N8ET83vD`mHl`(YR`ZzqJ9t`#o0_cnqXovzLclM+6>O= z#Ssve@Ff~sLkX_PXzXRVT?BR7oKfXA zd@cv;o51st0Px93a5xo-;cN=AZSXYdJA|4<*Tc(Ua1F%>d9H_-NbXx&RXO!E!Z~p| zO2(JgXVH`;yB;1}bjplA5cnUT$uRH{Kt*!V(G=4M4ZsVyze9?18D?qS=|jW}eTX>^ zKh78R{}=iqwGPopYnC!JQ{OdOh_!$<|IzS)-PRw9|Mu=N28Vf;OXAmqKV7qtMehb` z`xOX1PP$fZfL{0P${7gAORLtf=sbyZh_JSHyoClytaD{$C+*}9qYSKE1`i_Wly2uJ zLTkyab&Y6kuxwp~9#*ZVhyL};S#b6Ih8qw%A8^-oQ_+s=n_xYBy$S1w*DnXPc^fa3 zq0XT0#)~X;=c=xgaMwpx3%S(w=iF|*a7NDC)#vX4_%e3|6T`*Z;8W))Tt)Wz8)5y_ zm%v}c%~8r~>h8^>9-2V?FhxDoEx~QUA2%ly|(%2 zUa(73@EmkmzKpi=1Xo`i3Uo}wRnq9ltK0j)k+$P2>PXu80bdmGlqdWagClv1;Cs7{ zlz{F#d*-9#!IyhXnpNeV`+ygmxqk^;m79+ObXPnGLySjtJWM)LMJ^VQ&U*kNAUhw} zlbnzvOs7L+bsgv>A3Otk?>_i06lrwd*#^iAd{rn8A8;g@nT4XA@0-@hKF>81U@nl?YfbbgjX%rHR<^D}s4JIu`H0}El@c%Tt(+;xD@zIyuS zuRVI=!+lchZ)|>Oa+}lae1>hK{|cWulMdyEW;>)6LEC_DKLyhThDZu#EA7|uoOY?@$v+PDl3j-z$+<(Tf^&xrM1&(d zW0&TIZ?Sqk^u@e&!KouHs6rEE#k5pS@-0ypL~{PA1)OJ!s&DC{YKo>HI1*VjWN?Ni zDWYtwY91nmyn+fSCJ2n z>YS;$vZfoR>l?1&`Zn2nv@xk_vZx!L?+dcz!WGq121!em49n4N$ChQu7tETj31^p+ zuBWS#qA!S^EJ%)Qs-94vY=-bKbo8i{>uc~X!R z#{2@I>7+9eAU}JGq#XB~>vXiI(R3iX~`dBiA<_nJO>-HK_d+PF(B}$TG w8@_Icwjr8sM`^Fud#g9lNvYGfeJ$xawYJKUT-gv^+2kcbG@AvnSrnT71C$Tl)c^nh delta 4016 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 OD{#Et&GFs5+Vx))?y-sh diff --git a/substrate/node/executor/src/lib.rs b/substrate/node/executor/src/lib.rs index 1785a88437..fecb895fc0 100644 --- a/substrate/node/executor/src/lib.rs +++ b/substrate/node/executor/src/lib.rs @@ -110,7 +110,7 @@ mod tests { fn xt() -> UncheckedExtrinsic { sign(CheckedExtrinsic { signed: Some((alice(), 0)), - function: Call::Balances(balances::Call::transfer::(bob().into(), 69.into())), + function: Call::Balances(balances::Call::transfer::(bob().into(), 69)), }) } @@ -378,11 +378,11 @@ mod tests { vec![ CheckedExtrinsic { signed: None, - function: Call::Timestamp(timestamp::Call::set(42.into())), + function: Call::Timestamp(timestamp::Call::set(42)), }, CheckedExtrinsic { signed: Some((alice(), 0)), - function: Call::Balances(balances::Call::transfer(bob().into(), 69.into())), + function: Call::Balances(balances::Call::transfer(bob().into(), 69)), }, ] ) @@ -403,15 +403,15 @@ mod tests { vec![ CheckedExtrinsic { signed: None, - function: Call::Timestamp(timestamp::Call::set(52.into())), + function: Call::Timestamp(timestamp::Call::set(52)), }, CheckedExtrinsic { signed: Some((bob(), 0)), - function: Call::Balances(balances::Call::transfer(alice().into(), 5.into())), + function: Call::Balances(balances::Call::transfer(alice().into(), 5)), }, CheckedExtrinsic { signed: Some((alice(), 1)), - function: Call::Balances(balances::Call::transfer(bob().into(), 15.into())), + function: Call::Balances(balances::Call::transfer(bob().into(), 15)), } ] ) @@ -426,7 +426,7 @@ mod tests { vec![ CheckedExtrinsic { signed: None, - function: Call::Timestamp(timestamp::Call::set(42.into())), + function: Call::Timestamp(timestamp::Call::set(42)), }, CheckedExtrinsic { signed: Some((alice(), 0)), @@ -697,24 +697,24 @@ mod tests { vec![ CheckedExtrinsic { signed: None, - function: Call::Timestamp(timestamp::Call::set(42.into())), + function: Call::Timestamp(timestamp::Call::set(42)), }, CheckedExtrinsic { signed: Some((charlie(), 0)), function: Call::Contract( - contract::Call::put_code::(10_000.into(), transfer_code) + contract::Call::put_code::(10_000, transfer_code) ), }, CheckedExtrinsic { signed: Some((charlie(), 1)), function: Call::Contract( - contract::Call::create::(10.into(), 10_000.into(), transfer_ch, Vec::new()) + contract::Call::create::(10, 10_000, transfer_ch, Vec::new()) ), }, CheckedExtrinsic { signed: Some((charlie(), 2)), function: Call::Contract( - contract::Call::call::(indices::address::Address::Id(addr), 10.into(), 10_000.into(), vec![0x00, 0x01, 0x02, 0x03]) + contract::Call::call::(indices::address::Address::Id(addr), 10, 10_000, vec![0x00, 0x01, 0x02, 0x03]) ), }, ] diff --git a/substrate/node/runtime/wasm/Cargo.lock b/substrate/node/runtime/wasm/Cargo.lock index a373a8d7d1..15e1a533cd 100644 --- a/substrate/node/runtime/wasm/Cargo.lock +++ b/substrate/node/runtime/wasm/Cargo.lock @@ -212,12 +212,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash-db" version = "0.9.0" -source = "git+https://github.com/paritytech/trie#2616db2a2529098949e5d39aa06dd4e502a9e5f7" +source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" version = "0.9.0" -source = "git+https://github.com/paritytech/trie#2616db2a2529098949e5d39aa06dd4e502a9e5f7" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -392,9 +392,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "memory-db" version = "0.9.0" -source = "git+https://github.com/paritytech/trie#2616db2a2529098949e5d39aa06dd4e502a9e5f7" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -978,7 +978,7 @@ name = "sr-io" version = "0.1.0" dependencies = [ "environmental 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 0.1.0", @@ -1396,7 +1396,7 @@ dependencies = [ "error-chain 0.12.0 (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.25 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", @@ -1496,8 +1496,8 @@ dependencies = [ "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", - "hash256-std-hasher 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1525,7 +1525,7 @@ dependencies = [ name = "substrate-state-machine" version = "0.1.0" dependencies = [ - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1533,8 +1533,8 @@ dependencies = [ "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", "substrate-trie 0.4.0", - "trie-db 0.9.0 (git+https://github.com/paritytech/trie)", - "trie-root 0.9.0 (git+https://github.com/paritytech/trie)", + "trie-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1555,11 +1555,11 @@ dependencies = [ name = "substrate-trie" version = "0.4.0" dependencies = [ - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", - "memory-db 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-db 0.9.0 (git+https://github.com/paritytech/trie)", - "trie-root 0.9.0 (git+https://github.com/paritytech/trie)", + "trie-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1763,10 +1763,10 @@ dependencies = [ [[package]] name = "trie-db" version = "0.9.0" -source = "git+https://github.com/paritytech/trie#2616db2a2529098949e5d39aa06dd4e502a9e5f7" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1774,9 +1774,9 @@ dependencies = [ [[package]] name = "trie-root" version = "0.9.0" -source = "git+https://github.com/paritytech/trie#2616db2a2529098949e5d39aa06dd4e502a9e5f7" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1945,8 +1945,8 @@ dependencies = [ "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b" -"checksum hash-db 0.9.0 (git+https://github.com/paritytech/trie)" = "" -"checksum hash256-std-hasher 0.9.0 (git+https://github.com/paritytech/trie)" = "" +"checksum hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc5ec43724866bbc8337e09cab4d4b5f9fdbbe589f04bdc8bfda906a639ad338" +"checksum hash256-std-hasher 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "811bd8c26961527b7d5623b71162d865325639f8ca204d4ec90b5b87473a122d" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" "checksum hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4da5f0e01bd8a71a224a4eedecaacfcabda388dbb7a80faf04d3514287572d95" "checksum hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d340b6514f232f6db1bd16db65302a5278a04fef9ce867cb932e7e5fa21130a" @@ -1970,7 +1970,7 @@ dependencies = [ "checksum mashup-impl 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "aa607bfb674b4efb310512527d64266b065de3f894fc52f84efcbf7eaa5965fb" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" -"checksum memory-db 0.9.0 (git+https://github.com/paritytech/trie)" = "" +"checksum memory-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "812321f5fb5adb04c60a872d9e45c6f060f77ed4df7a28eee49d1565cb0af47f" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" "checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" "checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40" @@ -2051,8 +2051,8 @@ dependencies = [ "checksum tokio-timer 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "4f37f0111d76cc5da132fe9bc0590b9b9cfd079bc7e75ac3846278430a299ff8" "checksum tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" "checksum tokio-uds 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "99ce87382f6c1a24b513a72c048b2c8efe66cb5161c9061d00bee510f08dc168" -"checksum trie-db 0.9.0 (git+https://github.com/paritytech/trie)" = "" -"checksum trie-root 0.9.0 (git+https://github.com/paritytech/trie)" = "" +"checksum trie-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6fce41ab9c34e9a79f3f3c149c17dfedba15d10ee273ef1ae40dd48f7d91eb0e" +"checksum trie-root 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6c08a925fd6305f1b7ebbbb663352ddbfe3033648303a91ab127b8b5b12f04" "checksum twox-hash 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "555cd4909480122bbbf21e34faac4cb08a171f324775670447ed116726c474af" "checksum uint 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "082df6964410f6aa929a61ddfafc997e4f32c62c22490e439ac351cec827f436" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" diff --git a/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm b/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm index 9a868619d4693d588ea3ba788c0d38f3865b5040..e39414434f6c8c614101f39a5771e9410bec6f1a 100644 GIT binary patch delta 165169 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 delta 164207 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

GiK;ao%{=cF3yPG)i}#tb@zQ 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 G?Ee9#lPUNB diff --git a/substrate/srml/assets/src/lib.rs b/substrate/srml/assets/src/lib.rs index 4e234c846c..01a8c13cf0 100644 --- a/substrate/srml/assets/src/lib.rs +++ b/substrate/srml/assets/src/lib.rs @@ -46,7 +46,6 @@ extern crate sr_primitives as primitives; extern crate srml_system as system; use runtime_support::{StorageValue, StorageMap, Parameter}; -use codec::{Compact, HasCompact}; use primitives::traits::{Member, SimpleArithmetic, Zero, StaticLookup}; use system::ensure_signed; @@ -67,9 +66,8 @@ decl_module! { /// Issue a new class of fungible assets. There are, and will only ever be, `total` /// such assets and they'll all belong to the `origin` initially. It will have an /// identifier `AssetId` instance: this will be specified in the `Issued` event. - fn issue(origin, total: ::Type) { + fn issue(origin, #[compact] total: T::Balance) { let origin = ensure_signed(origin)?; - let total = total.into(); let id = Self::next_asset_id(); >::mutate(|id| *id += 1); @@ -82,16 +80,14 @@ decl_module! { /// Move some assets from one holder to another. fn transfer(origin, - id: Compact, + #[compact] id: AssetId, target: ::Source, - amount: ::Type + #[compact] amount: T::Balance ) { let origin = ensure_signed(origin)?; - let id = id.into(); let origin_account = (id, origin.clone()); let origin_balance = >::get(&origin_account); let target = T::Lookup::lookup(target)?; - let amount = amount.into(); ensure!(!amount.is_zero(), "transfer amount should be non-zero"); ensure!(origin_balance >= amount, "origin account balance must be greater than or equal to the transfer amount"); @@ -101,9 +97,8 @@ decl_module! { } /// Destroy any assets of `id` owned by `origin`. - fn destroy(origin, id: Compact) { + fn destroy(origin, #[compact] id: AssetId) { let origin = ensure_signed(origin)?; - let id = id.into(); let balance = >::take((id, origin.clone())); ensure!(!balance.is_zero(), "origin balance should be non-zero"); @@ -204,7 +199,7 @@ mod tests { #[test] fn issuing_asset_units_to_issuer_should_work() { with_externalities(&mut new_test_ext(), || { - assert_ok!(Assets::issue(Origin::signed(1), 100.into())); + assert_ok!(Assets::issue(Origin::signed(1), 100)); assert_eq!(Assets::balance(0, 1), 100); }); } @@ -212,16 +207,16 @@ mod tests { #[test] fn querying_total_supply_should_work() { with_externalities(&mut new_test_ext(), || { - assert_ok!(Assets::issue(Origin::signed(1), 100.into())); + assert_ok!(Assets::issue(Origin::signed(1), 100)); assert_eq!(Assets::balance(0, 1), 100); - assert_ok!(Assets::transfer(Origin::signed(1), 0.into(), 2, 50.into())); + assert_ok!(Assets::transfer(Origin::signed(1), 0, 2, 50)); assert_eq!(Assets::balance(0, 1), 50); assert_eq!(Assets::balance(0, 2), 50); - assert_ok!(Assets::transfer(Origin::signed(2), 0.into(), 3, 31.into())); + assert_ok!(Assets::transfer(Origin::signed(2), 0, 3, 31)); assert_eq!(Assets::balance(0, 1), 50); assert_eq!(Assets::balance(0, 2), 19); assert_eq!(Assets::balance(0, 3), 31); - assert_ok!(Assets::destroy(Origin::signed(3), 0.into())); + assert_ok!(Assets::destroy(Origin::signed(3), 0)); assert_eq!(Assets::total_supply(0), 69); }); } @@ -229,9 +224,9 @@ mod tests { #[test] fn transferring_amount_above_available_balance_should_work() { with_externalities(&mut new_test_ext(), || { - assert_ok!(Assets::issue(Origin::signed(1), 100.into())); + assert_ok!(Assets::issue(Origin::signed(1), 100)); assert_eq!(Assets::balance(0, 1), 100); - assert_ok!(Assets::transfer(Origin::signed(1), 0.into(), 2, 50.into())); + assert_ok!(Assets::transfer(Origin::signed(1), 0, 2, 50)); assert_eq!(Assets::balance(0, 1), 50); assert_eq!(Assets::balance(0, 2), 50); }); @@ -240,50 +235,50 @@ mod tests { #[test] fn transferring_amount_less_than_available_balance_should_not_work() { with_externalities(&mut new_test_ext(), || { - assert_ok!(Assets::issue(Origin::signed(1), 100.into())); + assert_ok!(Assets::issue(Origin::signed(1), 100)); assert_eq!(Assets::balance(0, 1), 100); - assert_ok!(Assets::transfer(Origin::signed(1), 0.into(), 2, 50.into())); + assert_ok!(Assets::transfer(Origin::signed(1), 0, 2, 50)); assert_eq!(Assets::balance(0, 1), 50); assert_eq!(Assets::balance(0, 2), 50); - assert_ok!(Assets::destroy(Origin::signed(1), 0.into())); + assert_ok!(Assets::destroy(Origin::signed(1), 0)); assert_eq!(Assets::balance(0, 1), 0); - assert_noop!(Assets::transfer(Origin::signed(1), 0.into(), 1, 50.into()), "origin account balance must be greater than or equal to the transfer amount"); + assert_noop!(Assets::transfer(Origin::signed(1), 0, 1, 50), "origin account balance must be greater than or equal to the transfer amount"); }); } #[test] fn transferring_less_than_one_unit_should_not_work() { with_externalities(&mut new_test_ext(), || { - assert_ok!(Assets::issue(Origin::signed(1), 100.into())); + assert_ok!(Assets::issue(Origin::signed(1), 100)); assert_eq!(Assets::balance(0, 1), 100); - assert_noop!(Assets::transfer(Origin::signed(1), 0.into(), 2, 0.into()), "transfer amount should be non-zero"); + assert_noop!(Assets::transfer(Origin::signed(1), 0, 2, 0), "transfer amount should be non-zero"); }); } #[test] fn transferring_more_units_than_total_supply_should_not_work() { with_externalities(&mut new_test_ext(), || { - assert_ok!(Assets::issue(Origin::signed(1), 100.into())); + assert_ok!(Assets::issue(Origin::signed(1), 100)); assert_eq!(Assets::balance(0, 1), 100); - assert_noop!(Assets::transfer(Origin::signed(1), 0.into(), 2, 101.into()), "origin account balance must be greater than or equal to the transfer amount"); + assert_noop!(Assets::transfer(Origin::signed(1), 0, 2, 101), "origin account balance must be greater than or equal to the transfer amount"); }); } #[test] fn destroying_asset_balance_with_positive_balance_should_work() { with_externalities(&mut new_test_ext(), || { - assert_ok!(Assets::issue(Origin::signed(1), 100.into())); + assert_ok!(Assets::issue(Origin::signed(1), 100)); assert_eq!(Assets::balance(0, 1), 100); - assert_ok!(Assets::destroy(Origin::signed(1), 0.into())); + assert_ok!(Assets::destroy(Origin::signed(1), 0)); }); } #[test] fn destroying_asset_balance_with_zero_balance_should_not_work() { with_externalities(&mut new_test_ext(), || { - assert_ok!(Assets::issue(Origin::signed(1), 100.into())); + assert_ok!(Assets::issue(Origin::signed(1), 100)); assert_eq!(Assets::balance(0, 2), 0); - assert_noop!(Assets::destroy(Origin::signed(2), 0.into()), "origin balance should be non-zero"); + assert_noop!(Assets::destroy(Origin::signed(2), 0), "origin balance should be non-zero"); }); } } diff --git a/substrate/srml/balances/src/lib.rs b/substrate/srml/balances/src/lib.rs index 7dda538a61..88404cbc38 100644 --- a/substrate/srml/balances/src/lib.rs +++ b/substrate/srml/balances/src/lib.rs @@ -43,7 +43,7 @@ extern crate substrate_primitives; use rstd::prelude::*; use rstd::{cmp, result}; -use codec::{Codec, HasCompact}; +use codec::Codec; use runtime_support::{StorageValue, StorageMap, Parameter}; use runtime_support::dispatch::Result; use primitives::traits::{Zero, SimpleArithmetic, MakePayment, @@ -132,12 +132,11 @@ decl_module! { pub fn transfer( origin, dest: ::Source, - value: ::Type + #[compact] value: T::Balance ) { let transactor = ensure_signed(origin)?; let dest = T::Lookup::lookup(dest)?; - let value = value.into(); let from_balance = Self::free_balance(&transactor); let to_balance = Self::free_balance(&dest); let would_create = to_balance.is_zero(); @@ -174,12 +173,12 @@ decl_module! { /// Set the balances of a given account. fn set_balance( who: ::Source, - free: ::Type, - reserved: ::Type + #[compact] free: T::Balance, + #[compact] reserved: T::Balance ) { let who = T::Lookup::lookup(who)?; - Self::set_free_balance(&who, free.into()); - Self::set_reserved_balance(&who, reserved.into()); + Self::set_free_balance(&who, free); + Self::set_reserved_balance(&who, reserved); } } } diff --git a/substrate/srml/balances/src/tests.rs b/substrate/srml/balances/src/tests.rs index 1d0b64e447..781366bf38 100644 --- a/substrate/srml/balances/src/tests.rs +++ b/substrate/srml/balances/src/tests.rs @@ -34,7 +34,7 @@ fn default_indexing_on_new_accounts_should_not_work2() { assert_eq!(Balances::is_dead_account(&5), true); // account 5 should not exist // account 1 has 256 * 10 = 2560, account 5 is not exist, ext_deposit is 10, value is 9, not satisfies for ext_deposit assert_noop!( - Balances::transfer(Some(1).into(), 5, 9.into()), + Balances::transfer(Some(1).into(), 5, 9), "value too low to create account" ); assert_eq!(Balances::is_dead_account(&5), true); // account 5 should not exist @@ -62,7 +62,7 @@ fn reserved_balance_should_prevent_reclaim_count() { assert_eq!(Balances::is_dead_account(&2), false); assert_eq!(System::account_nonce(&2), 1); - assert_ok!(Balances::transfer(Some(4).into(), 5, (256 * 1 + 0x69).into())); // account 4 tries to take index 1 for account 5. + assert_ok!(Balances::transfer(Some(4).into(), 5, 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::is_dead_account(&5), false); @@ -71,7 +71,7 @@ fn reserved_balance_should_prevent_reclaim_count() { assert_eq!(System::account_nonce(&2), 0); // nonce zero assert_eq!(Balances::is_dead_account(&2), true); - assert_ok!(Balances::transfer(Some(4).into(), 6, (256 * 1 + 0x69).into())); // account 4 tries to take index 1 again for account 6. + assert_ok!(Balances::transfer(Some(4).into(), 6, 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::is_dead_account(&6), false); }, @@ -101,7 +101,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(Some(2).into(), 5, (256 * 10 + 1).into())); // index 1 (account 2) becomes zombie + assert_ok!(Balances::transfer(Some(2).into(), 5, 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); @@ -121,7 +121,7 @@ fn dust_account_removal_should_work2() { System::inc_account_nonce(&2); assert_eq!(System::account_nonce(&2), 1); assert_eq!(Balances::total_balance(&2), 256 * 20); - assert_ok!(Balances::transfer(Some(2).into(), 5, (256 * 10).into())); // index 1 (account 2) becomes zombie for 256*10 + 50(fee) < 256 * 10 (ext_deposit) + assert_ok!(Balances::transfer(Some(2).into(), 5, 256 * 10)); // index 1 (account 2) becomes zombie for 256*10 + 50(fee) < 256 * 10 (ext_deposit) assert_eq!(Balances::total_balance(&2), 0); assert_eq!(Balances::total_balance(&5), 256 * 10); assert_eq!(System::account_nonce(&2), 0); @@ -147,7 +147,7 @@ fn balance_transfer_works() { with_externalities(&mut ExtBuilder::default().build(), || { Balances::set_free_balance(&1, 111); Balances::increase_total_stake_by(111); - assert_ok!(Balances::transfer(Some(1).into(), 2, 69.into())); + assert_ok!(Balances::transfer(Some(1).into(), 2, 69)); assert_eq!(Balances::total_balance(&1), 42); assert_eq!(Balances::total_balance(&2), 69); }); @@ -186,7 +186,7 @@ fn balance_transfer_when_reserved_should_not_work() { with_externalities(&mut ExtBuilder::default().build(), || { Balances::set_free_balance(&1, 111); assert_ok!(Balances::reserve(&1, 69)); - assert_noop!(Balances::transfer(Some(1).into(), 2, 69.into()), "balance too low to send value"); + assert_noop!(Balances::transfer(Some(1).into(), 2, 69), "balance too low to send value"); }); } @@ -317,7 +317,7 @@ fn transferring_too_high_value_should_not_panic() { >::insert(2, 1); assert_err!( - Balances::transfer(Some(1).into(), 2, u64::max_value().into()), + Balances::transfer(Some(1).into(), 2, u64::max_value()), "destination balance too high to receive value" ); @@ -345,7 +345,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(Some(1).into(), 2, 20.into())); + assert_ok!(Balances::transfer(Some(1).into(), 2, 20)); // Verify free balance removal of account 1. assert_eq!(Balances::free_balance(&1), 0); @@ -365,7 +365,7 @@ fn transfer_overflow_isnt_exploitable() { let evil_value = u64::max_value() - 49; assert_err!( - Balances::transfer(Some(1).into(), 5, evil_value.into()), + Balances::transfer(Some(1).into(), 5, evil_value), "got overflow after adding a fee to value" ); } diff --git a/substrate/srml/contract/src/lib.rs b/substrate/srml/contract/src/lib.rs index 9ea3d5cddd..38b2aa3e75 100644 --- a/substrate/srml/contract/src/lib.rs +++ b/substrate/srml/contract/src/lib.rs @@ -102,7 +102,7 @@ use account_db::AccountDb; use rstd::prelude::*; use rstd::marker::PhantomData; -use codec::{Codec, HasCompact}; +use codec::Codec; use runtime_primitives::traits::{Hash, As, SimpleArithmetic,Bounded, StaticLookup}; use runtime_support::dispatch::{Result, Dispatchable}; use runtime_support::{Parameter, StorageMap, StorageValue, StorageDoubleMap}; @@ -198,11 +198,10 @@ decl_module! { /// Stores code in the storage. You can instantiate contracts only with stored code. fn put_code( origin, - gas_limit: ::Type, + #[compact] gas_limit: T::Gas, code: Vec ) -> Result { let origin = ensure_signed(origin)?; - let gas_limit = gas_limit.into(); let schedule = >::current_schedule(); let mut gas_meter = gas::buy_gas::(&origin, gas_limit)?; @@ -221,13 +220,11 @@ decl_module! { fn call( origin, dest: ::Source, - value: ::Type, - gas_limit: ::Type, + #[compact] value: T::Balance, + #[compact] gas_limit: T::Gas, data: Vec ) -> Result { let origin = ensure_signed(origin)?; - let value = value.into(); - let gas_limit = gas_limit.into(); let dest = T::Lookup::lookup(dest)?; // Pay for the gas upfront. @@ -277,14 +274,12 @@ decl_module! { /// upon any message received by this account. fn create( origin, - endowment: ::Type, - gas_limit: ::Type, + #[compact] endowment: T::Balance, + #[compact] gas_limit: T::Gas, code_hash: CodeHash, data: Vec ) -> Result { let origin = ensure_signed(origin)?; - let endowment = endowment.into(); - let gas_limit = gas_limit.into(); // Pay for the gas upfront. // diff --git a/substrate/srml/contract/src/tests.rs b/substrate/srml/contract/src/tests.rs index 87c99a6753..d843c993c3 100644 --- a/substrate/srml/contract/src/tests.rs +++ b/substrate/srml/contract/src/tests.rs @@ -189,8 +189,8 @@ fn refunds_unused_gas() { assert_ok!(Contract::call( Origin::signed(0), 1, - 0.into(), - 100_000.into(), + 0, + 100_000, Vec::new() )); @@ -220,7 +220,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(Origin::signed(1), 2, 20.into())); + assert_ok!(Balances::transfer(Origin::signed(1), 2, 20)); // Verify that all entries from account 1 is removed, while // entries from account 2 is in place. @@ -277,14 +277,14 @@ fn instantiate_and_call() { assert_ok!(Contract::put_code( Origin::signed(ALICE), - 100_000.into(), + 100_000, wasm, )); assert_ok!(Contract::create( Origin::signed(ALICE), - 100.into(), - 100_000.into(), + 100, + 100_000, HASH_RETURN_FROM_START_FN.into(), vec![], )); @@ -335,7 +335,7 @@ const HASH_DISPATCH_CALL: [u8; 32] = hex!("49dfdcaf9c1553be10634467e95b8e71a3bc1 fn dispatch_call() { // This test can fail due to the encoding changes. In case it becomes too annoying // let's rewrite so as we use this module controlled call or we serialize it in runtime. - let encoded = codec::Encode::encode(&Call::Balances(balances::Call::transfer(CHARLIE, 50.into()))); + let encoded = codec::Encode::encode(&Call::Balances(balances::Call::transfer(CHARLIE, 50))); assert_eq!(&encoded[..], &hex!("00000300000000000000C8")[..]); let wasm = wabt::wat2wasm(CODE_DISPATCH_CALL).unwrap(); @@ -348,7 +348,7 @@ fn dispatch_call() { assert_ok!(Contract::put_code( Origin::signed(ALICE), - 100_000.into(), + 100_000, wasm, )); @@ -363,8 +363,8 @@ fn dispatch_call() { assert_ok!(Contract::create( Origin::signed(ALICE), - 100.into(), - 100_000.into(), + 100, + 100_000, HASH_DISPATCH_CALL.into(), vec![], )); @@ -372,8 +372,8 @@ fn dispatch_call() { assert_ok!(Contract::call( Origin::signed(ALICE), BOB, // newly created account - 0.into(), - 100_000.into(), + 0, + 100_000, vec![], )); diff --git a/substrate/srml/contract/src/wasm/mod.rs b/substrate/srml/contract/src/wasm/mod.rs index 0633dc3162..4d75b8a7d1 100644 --- a/substrate/srml/contract/src/wasm/mod.rs +++ b/substrate/srml/contract/src/wasm/mod.rs @@ -984,7 +984,7 @@ mod tests { assert_eq!( &mock_ext.dispatches, &[DispatchEntry( - Call::Balances(balances::Call::set_balance(42, 1337.into(), 0.into())), + Call::Balances(balances::Call::set_balance(42, 1337, 0)), )] ); } diff --git a/substrate/srml/council/src/motions.rs b/substrate/srml/council/src/motions.rs index 8e6f94fbd5..9cf5e171a5 100644 --- a/substrate/srml/council/src/motions.rs +++ b/substrate/srml/council/src/motions.rs @@ -18,7 +18,6 @@ use rstd::prelude::*; use rstd::result; -use codec::Compact; use substrate_primitives::u32_trait::Value as U32; use primitives::traits::{Hash, EnsureOrigin}; use srml_support::dispatch::{Dispatchable, Parameter}; @@ -68,9 +67,8 @@ decl_event!( decl_module! { pub struct Module for enum Call where origin: ::Origin { fn deposit_event() = default; - fn propose(origin, threshold: Compact, proposal: Box<::Proposal>) { + fn propose(origin, #[compact] threshold: u32, proposal: Box<::Proposal>) { let who = ensure_signed(origin)?; - let threshold = threshold.into(); ensure!(Self::is_councillor(&who), "proposer not on council"); @@ -92,9 +90,8 @@ decl_module! { } } - fn vote(origin, proposal: T::Hash, index: Compact, approve: bool) { + fn vote(origin, proposal: T::Hash, #[compact] index: ProposalIndex, approve: bool) { let who = ensure_signed(origin)?; - let index = index.into(); ensure!(Self::is_councillor(&who), "voter not on council"); @@ -220,7 +217,7 @@ mod tests { } fn set_balance_proposal(value: u64) -> Call { - Call::Balances(balances::Call::set_balance(42, value.into(), 0.into())) + Call::Balances(balances::Call::set_balance(42, value.into(), 0)) } #[test] @@ -229,7 +226,7 @@ mod tests { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash = proposal.blake2_256().into(); - assert_ok!(CouncilMotions::propose(Origin::signed(1), 3.into(), Box::new(proposal.clone()))); + assert_ok!(CouncilMotions::propose(Origin::signed(1), 3, Box::new(proposal.clone()))); assert_eq!(CouncilMotions::proposals(), vec![hash]); assert_eq!(CouncilMotions::proposal_of(&hash), Some(proposal)); assert_eq!(CouncilMotions::voting(&hash), Some((0, 3, vec![1], Vec::::new()))); @@ -248,7 +245,7 @@ mod tests { with_externalities(&mut new_test_ext(true), || { System::set_block_number(1); let proposal = set_balance_proposal(42); - assert_noop!(CouncilMotions::propose(Origin::signed(42), 3.into(), Box::new(proposal.clone())), "proposer not on council"); + assert_noop!(CouncilMotions::propose(Origin::signed(42), 3, Box::new(proposal.clone())), "proposer not on council"); }); } @@ -258,8 +255,8 @@ mod tests { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash: H256 = proposal.blake2_256().into(); - assert_ok!(CouncilMotions::propose(Origin::signed(1), 3.into(), Box::new(proposal.clone()))); - assert_noop!(CouncilMotions::vote(Origin::signed(42), hash.clone(), 0.into(), true), "voter not on council"); + assert_ok!(CouncilMotions::propose(Origin::signed(1), 3, Box::new(proposal.clone()))); + assert_noop!(CouncilMotions::vote(Origin::signed(42), hash.clone(), 0, true), "voter not on council"); }); } @@ -269,8 +266,8 @@ mod tests { System::set_block_number(3); let proposal = set_balance_proposal(42); let hash: H256 = proposal.blake2_256().into(); - assert_ok!(CouncilMotions::propose(Origin::signed(1), 3.into(), Box::new(proposal.clone()))); - assert_noop!(CouncilMotions::vote(Origin::signed(2), hash.clone(), 1.into(), true), "mismatched index"); + assert_ok!(CouncilMotions::propose(Origin::signed(1), 3, Box::new(proposal.clone()))); + assert_noop!(CouncilMotions::vote(Origin::signed(2), hash.clone(), 1, true), "mismatched index"); }); } @@ -280,12 +277,12 @@ mod tests { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash: H256 = proposal.blake2_256().into(); - assert_ok!(CouncilMotions::propose(Origin::signed(1), 2.into(), Box::new(proposal.clone()))); + assert_ok!(CouncilMotions::propose(Origin::signed(1), 2, Box::new(proposal.clone()))); assert_eq!(CouncilMotions::voting(&hash), Some((0, 2, vec![1], Vec::::new()))); - assert_noop!(CouncilMotions::vote(Origin::signed(1), hash.clone(), 0.into(), true), "duplicate vote ignored"); - assert_ok!(CouncilMotions::vote(Origin::signed(1), hash.clone(), 0.into(), false)); + assert_noop!(CouncilMotions::vote(Origin::signed(1), hash.clone(), 0, true), "duplicate vote ignored"); + assert_ok!(CouncilMotions::vote(Origin::signed(1), hash.clone(), 0, false)); assert_eq!(CouncilMotions::voting(&hash), Some((0, 2, Vec::::new(), vec![1]))); - assert_noop!(CouncilMotions::vote(Origin::signed(1), hash.clone(), 0.into(), false), "duplicate vote ignored"); + assert_noop!(CouncilMotions::vote(Origin::signed(1), hash.clone(), 0, false), "duplicate vote ignored"); assert_eq!(System::events(), vec![ EventRecord { @@ -306,8 +303,8 @@ mod tests { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash: H256 = proposal.blake2_256().into(); - assert_ok!(CouncilMotions::propose(Origin::signed(1), 3.into(), Box::new(proposal.clone()))); - assert_ok!(CouncilMotions::vote(Origin::signed(2), hash.clone(), 0.into(), false)); + assert_ok!(CouncilMotions::propose(Origin::signed(1), 3, Box::new(proposal.clone()))); + assert_ok!(CouncilMotions::vote(Origin::signed(2), hash.clone(), 0, false)); assert_eq!(System::events(), vec![ EventRecord { @@ -332,8 +329,8 @@ mod tests { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash: H256 = proposal.blake2_256().into(); - assert_ok!(CouncilMotions::propose(Origin::signed(1), 2.into(), Box::new(proposal.clone()))); - assert_ok!(CouncilMotions::vote(Origin::signed(2), hash.clone(), 0.into(), true)); + assert_ok!(CouncilMotions::propose(Origin::signed(1), 2, Box::new(proposal.clone()))); + assert_ok!(CouncilMotions::vote(Origin::signed(2), hash.clone(), 0, true)); assert_eq!(System::events(), vec![ EventRecord { diff --git a/substrate/srml/council/src/seats.rs b/substrate/srml/council/src/seats.rs index 25c37b9b8e..6f2adc9bc7 100644 --- a/substrate/srml/council/src/seats.rs +++ b/substrate/srml/council/src/seats.rs @@ -17,7 +17,6 @@ //! Council system: Handles the voting in and maintenance of council members. use rstd::prelude::*; -use codec::{Compact, HasCompact}; use primitives::traits::{Zero, One, As, StaticLookup}; use runtime_io::print; use srml_support::{StorageValue, StorageMap, dispatch::Result}; @@ -91,9 +90,8 @@ decl_module! { /// Set candidate approvals. Approval slots stay valid as long as candidates in those slots /// are registered. - fn set_approvals(origin, votes: Vec, index: Compact) { + fn set_approvals(origin, votes: Vec, #[compact] index: VoteIndex) { let who = ensure_signed(origin)?; - let index: VoteIndex = index.into(); let candidates = Self::candidates(); ensure!(!Self::presentation_active(), "no approval changes during presentation period"); @@ -126,13 +124,12 @@ decl_module! { /// May be called by anyone. Returns the voter deposit to `signed`. fn reap_inactive_voter( origin, - reporter_index: Compact, + #[compact] reporter_index: u32, who: ::Source, - who_index: Compact, - assumed_vote_index: Compact + #[compact] who_index: u32, + #[compact] assumed_vote_index: VoteIndex ) { let reporter = ensure_signed(origin)?; - let assumed_vote_index: VoteIndex = assumed_vote_index.into(); let who = T::Lookup::lookup(who)?; ensure!(!Self::presentation_active(), "cannot reap during presentation period"); @@ -141,9 +138,7 @@ decl_module! { ensure!(assumed_vote_index == Self::vote_index(), "vote index not current"); ensure!(assumed_vote_index > last_active + Self::inactivity_grace_period(), "cannot reap during grace period"); let voters = Self::voters(); - let reporter_index: u32 = reporter_index.into(); let reporter_index = reporter_index as usize; - let who_index: u32 = who_index.into(); let who_index = who_index as usize; ensure!(reporter_index < voters.len() && voters[reporter_index] == reporter, "bad reporter index"); ensure!(who_index < voters.len() && voters[who_index] == who, "bad target index"); @@ -175,13 +170,12 @@ decl_module! { } /// Remove a voter. All votes are cancelled and the voter deposit is returned. - fn retract_voter(origin, index: Compact) { + fn retract_voter(origin, #[compact] index: u32) { let who = ensure_signed(origin)?; ensure!(!Self::presentation_active(), "cannot retract when presenting"); ensure!(>::exists(&who), "cannot retract non-voter"); let voters = Self::voters(); - let index: u32 = index.into(); let index = index as usize; ensure!(index < voters.len(), "retraction index invalid"); ensure!(voters[index] == who, "retraction index mismatch"); @@ -193,11 +187,10 @@ decl_module! { /// Submit oneself for candidacy. /// /// Account must have enough transferrable funds in it to pay the bond. - fn submit_candidacy(origin, slot: Compact) { + fn submit_candidacy(origin, #[compact] slot: u32) { let who = ensure_signed(origin)?; ensure!(!Self::is_a_candidate(&who), "duplicate candidate submission"); - let slot: u32 = slot.into(); let slot = slot as usize; let count = Self::candidate_count() as usize; let candidates = Self::candidates(); @@ -227,13 +220,11 @@ decl_module! { fn present_winner( origin, candidate: ::Source, - total: ::Type, - index: Compact + #[compact] total: T::Balance, + #[compact] index: VoteIndex ) -> Result { let who = ensure_signed(origin)?; - let total = total.into(); ensure!(!total.is_zero(), "stake deposited to present winner and be added to leaderboard should be non-zero"); - let index: VoteIndex = index.into(); let candidate = T::Lookup::lookup(candidate)?; ensure!(index == Self::vote_index(), "index not current"); @@ -280,8 +271,7 @@ decl_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: Compact) { - let count: u32 = count.into(); + fn set_desired_seats(#[compact] count: u32) { >::put(count); } @@ -299,14 +289,14 @@ decl_module! { /// Set the presentation duration. If there is currently a vote being presented for, will /// invoke `finalise_vote`. - fn set_presentation_duration(count: ::Type) { - >::put(count.into()); + fn set_presentation_duration(#[compact] count: T::BlockNumber) { + >::put(count); } /// Set the presentation duration. If there is current a vote being presented for, will /// invoke `finalise_vote`. - fn set_term_duration(count: ::Type) { - >::put(count.into()); + fn set_term_duration(#[compact] count: T::BlockNumber) { + >::put(count); } fn on_finalise(n: T::BlockNumber) { @@ -601,14 +591,14 @@ mod tests { assert_eq!(Council::is_a_candidate(&1), false); assert_eq!(Council::is_a_candidate(&2), false); - assert_ok!(Council::submit_candidacy(Origin::signed(1), 0.into())); + 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(Origin::signed(2), 1.into())); + 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))); @@ -635,10 +625,10 @@ mod tests { System::set_block_number(1); assert_eq!(Council::candidates(), vec![0, 0, 1]); - assert_ok!(Council::submit_candidacy(Origin::signed(2), 1.into())); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); assert_eq!(Council::candidates(), vec![0, 2, 1]); - assert_ok!(Council::submit_candidacy(Origin::signed(3), 0.into())); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 0)); assert_eq!(Council::candidates(), vec![3, 2, 1]); }); } @@ -651,10 +641,10 @@ mod tests { System::set_block_number(1); assert_eq!(Council::candidates(), vec![0, 0, 1]); - assert_ok!(Council::submit_candidacy(Origin::signed(2), 0.into())); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); assert_eq!(Council::candidates(), vec![2, 0, 1]); - assert_ok!(Council::submit_candidacy(Origin::signed(3), 1.into())); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 1)); assert_eq!(Council::candidates(), vec![2, 3, 1]); }); } @@ -663,7 +653,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(Origin::signed(4), 3.into()), "invalid candidate slot"); + assert_noop!(Council::submit_candidacy(Origin::signed(4), 3), "invalid candidate slot"); }); } @@ -672,7 +662,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(Origin::signed(1), 1.into()), "invalid candidate slot"); + assert_noop!(Council::submit_candidacy(Origin::signed(1), 1), "invalid candidate slot"); }); } @@ -681,9 +671,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(Origin::signed(1), 0.into())); + assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); assert_eq!(Council::candidates(), vec![1]); - assert_noop!(Council::submit_candidacy(Origin::signed(2), 0.into()), "invalid candidate slot"); + assert_noop!(Council::submit_candidacy(Origin::signed(2), 0), "invalid candidate slot"); }); } @@ -692,9 +682,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(Origin::signed(1), 0.into())); + assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); assert_eq!(Council::candidates(), vec![1]); - assert_noop!(Council::submit_candidacy(Origin::signed(1), 1.into()), "duplicate candidate submission"); + assert_noop!(Council::submit_candidacy(Origin::signed(1), 1), "duplicate candidate submission"); }); } @@ -703,7 +693,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(Origin::signed(7), 0.into()), "candidate has not enough funds"); + assert_noop!(Council::submit_candidacy(Origin::signed(7), 0), "candidate has not enough funds"); }); } @@ -712,20 +702,20 @@ mod tests { with_externalities(&mut new_test_ext(false), || { System::set_block_number(1); - assert_ok!(Council::submit_candidacy(Origin::signed(5), 0.into())); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); - assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![true], 0.into())); + 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(Origin::signed(2), 1.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(3), 2.into())); + 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(2), vec![false, true, true], 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, true, true], 0.into())); + 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]); @@ -743,7 +733,7 @@ mod tests { assert_eq!(Council::candidates().len(), 0); - assert_noop!(Council::set_approvals(Origin::signed(4), vec![], 0.into()), "amount of candidates to receive approval votes should be non-zero"); + assert_noop!(Council::set_approvals(Origin::signed(4), vec![], 0), "amount of candidates to receive approval votes should be non-zero"); }); } @@ -752,10 +742,10 @@ mod tests { with_externalities(&mut new_test_ext(false), || { System::set_block_number(1); - assert_ok!(Council::submit_candidacy(Origin::signed(5), 0.into())); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); assert_eq!(Council::candidates().len(), 1); - assert_noop!(Council::set_approvals(Origin::signed(4), vec![true, true], 0.into()), "amount of candidate approval votes cannot exceed amount of candidates"); + assert_noop!(Council::set_approvals(Origin::signed(4), vec![true, true], 0), "amount of candidate approval votes cannot exceed amount of candidates"); }); } @@ -764,15 +754,15 @@ mod tests { with_externalities(&mut new_test_ext(false), || { System::set_block_number(1); - assert_ok!(Council::submit_candidacy(Origin::signed(5), 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![true], 0.into())); + 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(Origin::signed(2), 1.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(3), 2.into())); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); assert_eq!(Council::candidates().len(), 3); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![true, false, true], 0.into())); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![true, false, true], 0)); assert_eq!(Council::approvals_of(4), vec![true, false, true]); }); @@ -783,15 +773,15 @@ mod tests { with_externalities(&mut new_test_ext(false), || { System::set_block_number(1); - assert_ok!(Council::submit_candidacy(Origin::signed(5), 0.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(2), 1.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(3), 2.into())); + 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_eq!(Council::candidates().len(), 3); - assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true, true], 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, true, true], 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![true, false, true], 0.into())); + 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]); @@ -799,7 +789,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(Origin::signed(1), 0.into())); + 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()); @@ -807,7 +797,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(Origin::signed(2), 1.into())); + assert_ok!(Council::retract_voter(Origin::signed(2), 1)); assert_eq!(Council::voters(), vec![4, 3]); assert_eq!(Council::approvals_of(1), Vec::::new()); @@ -815,7 +805,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(Origin::signed(3), 1.into())); + assert_ok!(Council::retract_voter(Origin::signed(3), 1)); assert_eq!(Council::voters(), vec![4]); assert_eq!(Council::approvals_of(1), Vec::::new()); @@ -829,11 +819,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(Origin::signed(3), 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0.into())); + 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(Origin::signed(1), 1.into()), "retraction index mismatch"); + assert_noop!(Council::retract_voter(Origin::signed(1), 1), "retraction index mismatch"); }); } @@ -841,9 +831,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(Origin::signed(3), 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0.into())); - assert_noop!(Council::retract_voter(Origin::signed(1), 1.into()), "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"); }); } @@ -851,9 +841,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(Origin::signed(3), 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0.into())); - assert_noop!(Council::retract_voter(Origin::signed(2), 0.into()), "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"); }); } @@ -863,10 +853,10 @@ mod tests { System::set_block_number(4); assert!(!Council::presentation_active()); - assert_ok!(Council::submit_candidacy(Origin::signed(2), 0.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(5), 1.into())); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0.into())); + 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]); @@ -874,8 +864,8 @@ mod tests { System::set_block_number(6); assert!(Council::presentation_active()); - assert_eq!(Council::present_winner(Origin::signed(4), 2, 20.into(), 0.into()), Ok(())); - assert_eq!(Council::present_winner(Origin::signed(4), 5, 50.into(), 0.into()), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(4), 2, 20, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(4), 5, 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())); @@ -895,12 +885,12 @@ mod tests { fn presentations_with_zero_staked_deposit_should_not_work() { with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); - assert_ok!(Council::submit_candidacy(Origin::signed(2), 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0.into())); + 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_noop!(Council::present_winner(Origin::signed(4), 2, 0.into(), 0.into()), "stake deposited to present winner and be added to leaderboard should be non-zero"); + assert_noop!(Council::present_winner(Origin::signed(4), 2, 0, 0), "stake deposited to present winner and be added to leaderboard should be non-zero"); }); } @@ -910,16 +900,16 @@ mod tests { assert!(Balances::can_slash(&4, 10)); System::set_block_number(4); - assert_ok!(Council::submit_candidacy(Origin::signed(2), 0.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(5), 1.into())); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0.into())); + 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(Origin::signed(4), 2, 20.into(), 0.into())); - assert_ok!(Council::present_winner(Origin::signed(4), 5, 50.into(), 0.into())); - assert_eq!(Council::present_winner(Origin::signed(4), 5, 50.into(), 0.into()), Err("duplicate presentation")); + assert_ok!(Council::present_winner(Origin::signed(4), 2, 20, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 5, 50, 0)); + assert_eq!(Council::present_winner(Origin::signed(4), 5, 50, 0), Err("duplicate presentation")); assert_ok!(Council::end_block(System::block_number())); assert_eq!(Council::active_council(), vec![(5, 11), (2, 11)]); @@ -931,27 +921,27 @@ 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(Origin::signed(2), 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0.into())); + 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(Origin::signed(4), 2, 20.into(), 0.into())); + assert_ok!(Council::present_winner(Origin::signed(4), 2, 20, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(8); - assert_ok!(Council::submit_candidacy(Origin::signed(5), 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1.into())); + 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(Origin::signed(4), 5, 50.into(), 1.into())); + assert_ok!(Council::present_winner(Origin::signed(4), 5, 50, 1)); assert_ok!(Council::end_block(System::block_number())); assert_ok!(Council::reap_inactive_voter(Origin::signed(5), (Council::voters().iter().position(|&i| i == 5).unwrap() as u32).into(), 2, (Council::voters().iter().position(|&i| i == 2).unwrap() as u32).into(), - 2.into() + 2 )); assert_eq!(Council::voters(), vec![5]); @@ -965,21 +955,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(Origin::signed(2), 0.into()), Ok(())); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0.into())); + 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(Origin::signed(4), 2, 20.into(), 0.into())); + assert_ok!(Council::present_winner(Origin::signed(4), 2, 20, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(8); - assert_eq!(Council::submit_candidacy(Origin::signed(2), 0.into()), Ok(())); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 1.into())); + 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(Origin::signed(4), 2, 20.into(), 1.into()), "candidate must not form a duplicated member if elected"); + assert_noop!(Council::present_winner(Origin::signed(4), 2, 20, 1), "candidate must not form a duplicated member if elected"); }); } @@ -987,30 +977,30 @@ 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(Origin::signed(2), 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0.into())); + 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(Origin::signed(4), 2, 20.into(), 0.into())); + assert_ok!(Council::present_winner(Origin::signed(4), 2, 20, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(8); - assert_ok!(Council::submit_candidacy(Origin::signed(5), 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1.into())); + 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(Origin::signed(4), 5, 50.into(), 1.into())); + assert_ok!(Council::present_winner(Origin::signed(4), 5, 50, 1)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(11); - assert_ok!(Council::submit_candidacy(Origin::signed(1), 0.into())); + assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); assert_ok!(Council::reap_inactive_voter(Origin::signed(5), (Council::voters().iter().position(|&i| i == 5).unwrap() as u32).into(), 2, (Council::voters().iter().position(|&i| i == 2).unwrap() as u32).into(), - 2.into() + 2 )); assert_eq!(Council::voters(), vec![5]); @@ -1024,27 +1014,27 @@ 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(Origin::signed(2), 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0.into())); + 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(Origin::signed(4), 2, 20.into(), 0.into())); + assert_ok!(Council::present_winner(Origin::signed(4), 2, 20, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(8); - assert_ok!(Council::submit_candidacy(Origin::signed(5), 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1.into())); + 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(Origin::signed(4), 5, 50.into(), 1.into())); + assert_ok!(Council::present_winner(Origin::signed(4), 5, 50, 1)); assert_ok!(Council::end_block(System::block_number())); assert_noop!(Council::reap_inactive_voter(Origin::signed(2), - 42.into(), + 42, 2, (Council::voters().iter().position(|&i| i == 2).unwrap() as u32).into(), - 2.into() + 2 ), "bad reporter index"); }); } @@ -1053,27 +1043,27 @@ 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(Origin::signed(2), 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0.into())); + 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(Origin::signed(4), 2, 20.into(), 0.into())); + assert_ok!(Council::present_winner(Origin::signed(4), 2, 20, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(8); - assert_ok!(Council::submit_candidacy(Origin::signed(5), 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1.into())); + 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(Origin::signed(4), 5, 50.into(), 1.into())); + assert_ok!(Council::present_winner(Origin::signed(4), 5, 50, 1)); assert_ok!(Council::end_block(System::block_number())); assert_noop!(Council::reap_inactive_voter(Origin::signed(2), (Council::voters().iter().position(|&i| i == 2).unwrap() as u32).into(), - 2, 42.into(), - 2.into() + 2, 42, + 2 ), "bad target index"); }); } @@ -1082,30 +1072,30 @@ 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(Origin::signed(2), 0.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(3), 1.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(4), 2.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(5), 3.into())); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false, false, false], 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, true, false, false], 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, true, false], 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, true], 0.into())); + 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(Origin::signed(4), 2, 20.into(), 0.into())); - assert_ok!(Council::present_winner(Origin::signed(4), 3, 30.into(), 0.into())); - assert_ok!(Council::present_winner(Origin::signed(4), 4, 40.into(), 0.into())); - assert_ok!(Council::present_winner(Origin::signed(4), 5, 50.into(), 0.into())); + assert_ok!(Council::present_winner(Origin::signed(4), 2, 20, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 3, 30, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 4, 40, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 5, 50, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(8); - assert_ok!(Council::set_desired_seats(3.into())); + assert_ok!(Council::set_desired_seats(3)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); - assert_ok!(Council::present_winner(Origin::signed(4), 2, 20.into(), 1.into())); - assert_ok!(Council::present_winner(Origin::signed(4), 3, 30.into(), 1.into())); + assert_ok!(Council::present_winner(Origin::signed(4), 2, 20, 1)); + assert_ok!(Council::present_winner(Origin::signed(4), 3, 30, 1)); assert_ok!(Council::end_block(System::block_number())); assert_eq!(Council::vote_index(), 2); @@ -1117,7 +1107,7 @@ mod tests { (Council::voters().iter().position(|&i| i == 4).unwrap() as u32).into(), 2, (Council::voters().iter().position(|&i| i == 2).unwrap() as u32).into(), - 2.into() + 2 )); assert_eq!(Council::voters(), vec![2, 3, 5]); @@ -1130,27 +1120,27 @@ 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(Origin::signed(2), 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0.into())); + 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(Origin::signed(4), 2, 20.into(), 0.into())); + assert_ok!(Council::present_winner(Origin::signed(4), 2, 20, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(8); - assert_ok!(Council::submit_candidacy(Origin::signed(5), 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1.into())); + 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(Origin::signed(4), 5, 50.into(), 1.into())); + assert_ok!(Council::present_winner(Origin::signed(4), 5, 50, 1)); assert_ok!(Council::end_block(System::block_number())); assert_noop!(Council::reap_inactive_voter(Origin::signed(4), - 0.into(), + 0, 2, (Council::voters().iter().position(|&i| i == 2).unwrap() as u32).into(), - 2.into() + 2 ), "reporter must be a voter"); }); } @@ -1159,23 +1149,23 @@ 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(Origin::signed(1), 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(2), 1.into())); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(3), 2.into())); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(4), 3.into())); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(5), 4.into())); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0.into())); + 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(Origin::signed(4), 1, 60.into(), 0.into())); - assert_ok!(Council::present_winner(Origin::signed(4), 3, 30.into(), 0.into())); - assert_ok!(Council::present_winner(Origin::signed(4), 4, 40.into(), 0.into())); - assert_ok!(Council::present_winner(Origin::signed(4), 5, 50.into(), 0.into())); + assert_ok!(Council::present_winner(Origin::signed(4), 1, 60, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 3, 30, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 4, 40, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 5, 50, 0)); assert_eq!(Council::leaderboard(), Some(vec![ (30, 3), @@ -1184,7 +1174,7 @@ mod tests { (60, 1) ])); - assert_noop!(Council::present_winner(Origin::signed(4), 2, 20.into(), 0.into()), "candidate not worthy of leaderboard"); + assert_noop!(Council::present_winner(Origin::signed(4), 2, 20, 0), "candidate not worthy of leaderboard"); }); } @@ -1192,24 +1182,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(Origin::signed(1), 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(2), 1.into())); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(3), 2.into())); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(4), 3.into())); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(5), 4.into())); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0.into())); + 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(Origin::signed(4), 2, 20.into(), 0.into())); - assert_ok!(Council::present_winner(Origin::signed(4), 1, 60.into(), 0.into())); - assert_ok!(Council::present_winner(Origin::signed(4), 3, 30.into(), 0.into())); - assert_ok!(Council::present_winner(Origin::signed(4), 4, 40.into(), 0.into())); - assert_ok!(Council::present_winner(Origin::signed(4), 5, 50.into(), 0.into())); + assert_ok!(Council::present_winner(Origin::signed(4), 2, 20, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 1, 60, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 3, 30, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 4, 40, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 5, 50, 0)); assert_eq!(Council::leaderboard(), Some(vec![ (30, 3), @@ -1225,7 +1215,7 @@ mod tests { with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); assert!(!Council::presentation_active()); - assert_noop!(Council::present_winner(Origin::signed(5), 5, 1.into(), 0.into()), "cannot present outside of presentation period"); + assert_noop!(Council::present_winner(Origin::signed(5), 5, 1, 0), "cannot present outside of presentation period"); }); } @@ -1233,14 +1223,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(Origin::signed(2), 0.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(5), 1.into())); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0.into())); + 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(Origin::signed(4), 2, 20.into(), 1.into()), "index not current"); + assert_noop!(Council::present_winner(Origin::signed(4), 2, 20, 1), "index not current"); }); } @@ -1250,16 +1240,16 @@ mod tests { System::set_block_number(4); assert!(!Council::presentation_active()); - assert_ok!(Council::submit_candidacy(Origin::signed(1), 0.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(5), 1.into())); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0.into())); + 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(Origin::signed(1), 1, 20.into(), 0.into()), "presenter must have sufficient slashable funds"); + assert_noop!(Council::present_winner(Origin::signed(1), 1, 20, 0), "presenter must have sufficient slashable funds"); }); } @@ -1270,14 +1260,14 @@ mod tests { assert!(!Council::presentation_active()); assert_eq!(Balances::total_balance(&4), 40); - assert_ok!(Council::submit_candidacy(Origin::signed(2), 0.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(5), 1.into())); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0.into())); + 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(Origin::signed(4), 2, 80.into(), 0.into()), "incorrect total"); + assert_err!(Council::present_winner(Origin::signed(4), 2, 80, 0), "incorrect total"); assert_eq!(Balances::total_balance(&4), 38); }); @@ -1289,22 +1279,22 @@ mod tests { System::set_block_number(4); assert!(!Council::presentation_active()); - assert_ok!(Council::submit_candidacy(Origin::signed(1), 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(2), 1.into())); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(3), 2.into())); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(4), 3.into())); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(5), 4.into())); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0.into())); + 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(Origin::signed(4), 1, 60.into(), 0.into())); + assert_ok!(Council::present_winner(Origin::signed(4), 1, 60, 0)); // leaderboard length is the empty seats plus the carry count (i.e. 5 + 2), where those // to be carried are the lowest and stored in lowest indexes assert_eq!(Council::leaderboard(), Some(vec![ @@ -1313,9 +1303,9 @@ mod tests { (0, 0), (60, 1) ])); - assert_ok!(Council::present_winner(Origin::signed(4), 3, 30.into(), 0.into())); - assert_ok!(Council::present_winner(Origin::signed(4), 4, 40.into(), 0.into())); - assert_ok!(Council::present_winner(Origin::signed(4), 5, 50.into(), 0.into())); + assert_ok!(Council::present_winner(Origin::signed(4), 3, 30, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 4, 40, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 5, 50, 0)); assert_eq!(Council::leaderboard(), Some(vec![ (30, 3), (40, 4), @@ -1348,33 +1338,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(Origin::signed(1), 0.into())); - assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(2), 1.into())); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(3), 2.into())); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(4), 3.into())); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0.into())); - assert_ok!(Council::submit_candidacy(Origin::signed(5), 4.into())); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0.into())); + 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(Origin::signed(4), 1, 60.into(), 0.into())); - assert_ok!(Council::present_winner(Origin::signed(4), 3, 30.into(), 0.into())); - assert_ok!(Council::present_winner(Origin::signed(4), 4, 40.into(), 0.into())); - assert_ok!(Council::present_winner(Origin::signed(4), 5, 50.into(), 0.into())); + assert_ok!(Council::present_winner(Origin::signed(4), 1, 60, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 3, 30, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 4, 40, 0)); + assert_ok!(Council::present_winner(Origin::signed(4), 5, 50, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(8); - assert_ok!(Council::set_approvals(Origin::signed(6), vec![false, false, true, false], 1.into())); - assert_ok!(Council::set_desired_seats(3.into())); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![false, false, true, false], 1)); + assert_ok!(Council::set_desired_seats(3)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); - assert_ok!(Council::present_winner(Origin::signed(4), 3, 90.into(), 1.into())); - assert_ok!(Council::present_winner(Origin::signed(4), 4, 40.into(), 1.into())); + assert_ok!(Council::present_winner(Origin::signed(4), 3, 90, 1)); + assert_ok!(Council::present_winner(Origin::signed(4), 4, 40, 1)); assert_ok!(Council::end_block(System::block_number())); assert!(!Council::presentation_active()); diff --git a/substrate/srml/council/src/voting.rs b/substrate/srml/council/src/voting.rs index 4a69e4f560..b1a57b90ad 100644 --- a/substrate/srml/council/src/voting.rs +++ b/substrate/srml/council/src/voting.rs @@ -18,7 +18,6 @@ use rstd::prelude::*; use rstd::borrow::Borrow; -use codec::HasCompact; use primitives::traits::{Hash, As, Zero}; use runtime_io::print; use srml_support::dispatch::Result; @@ -95,12 +94,12 @@ decl_module! { } } - fn set_cooloff_period(blocks: ::Type) { - >::put(blocks.into()); + fn set_cooloff_period(#[compact] blocks: T::BlockNumber) { + >::put(blocks); } - fn set_voting_period(blocks: ::Type) { - >::put(blocks.into()); + fn set_voting_period(#[compact] blocks: T::BlockNumber) { + >::put(blocks); } fn on_finalise(n: T::BlockNumber) { @@ -259,7 +258,7 @@ mod tests { } fn set_balance_proposal(value: u64) -> Call { - Call::Balances(balances::Call::set_balance(42, value.into(), 0.into())) + Call::Balances(balances::Call::set_balance(42, value.into(), 0)) } fn cancel_referendum_proposal(id: u32) -> Call { diff --git a/substrate/srml/democracy/src/lib.rs b/substrate/srml/democracy/src/lib.rs index 2c0a1bd888..6f9bc46306 100644 --- a/substrate/srml/democracy/src/lib.rs +++ b/substrate/srml/democracy/src/lib.rs @@ -36,7 +36,6 @@ extern crate srml_system as system; use rstd::prelude::*; use rstd::result; -use codec::{HasCompact, Compact}; use primitives::traits::{Zero, As}; use srml_support::{StorageValue, StorageMap, Parameter, Dispatchable, IsSubType}; use srml_support::dispatch::Result; @@ -93,10 +92,9 @@ decl_module! { fn propose( origin, proposal: Box, - value: ::Type + #[compact] value: T::Balance ) { let who = ensure_signed(origin)?; - let value = value.into(); ensure!(value >= Self::minimum_deposit(), "value too low"); >::reserve(&who, value) @@ -112,9 +110,8 @@ decl_module! { } /// Propose a sensitive action to be taken. - fn second(origin, proposal: Compact) { + fn second(origin, #[compact] proposal: PropIndex) { let who = ensure_signed(origin)?; - let proposal: PropIndex = proposal.into(); let mut deposit = Self::deposit_of(proposal) .ok_or("can only second an existing proposal")?; >::reserve(&who, deposit.0) @@ -125,9 +122,8 @@ decl_module! { /// Vote in a referendum. If `vote.is_aye()`, the vote is to enact the proposal; /// otherwise it is a vote to keep the status quo. - fn vote(origin, ref_index: Compact, vote: Vote) { + fn vote(origin, #[compact] ref_index: ReferendumIndex, vote: Vote) { let who = ensure_signed(origin)?; - let ref_index = ref_index.into(); ensure!(vote.multiplier() <= Self::max_lock_periods(), "vote has too great a strength"); ensure!(Self::is_active_referendum(ref_index), "vote given for invalid referendum."); ensure!(!>::total_balance(&who).is_zero(), @@ -149,14 +145,14 @@ decl_module! { } /// Remove a referendum. - fn cancel_referendum(ref_index: Compact) { - Self::clear_referendum(ref_index.into()); + fn cancel_referendum(#[compact] ref_index: ReferendumIndex) { + Self::clear_referendum(ref_index); } /// Cancel a proposal queued for enactment. - pub fn cancel_queued(when: ::Type, which: Compact) -> Result { - let which = u32::from(which) as usize; - >::mutate(when.into(), |items| if items.len() > which { items[which] = None }); + pub fn cancel_queued(#[compact] when: T::BlockNumber, #[compact] which: u32) -> Result { + let which = which as usize; + >::mutate(when, |items| if items.len() > which { items[which] = None }); Ok(()) } @@ -549,13 +545,13 @@ 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, 0).unwrap(); - assert_noop!(Democracy::vote(Origin::signed(1), r.into(), Vote::new(true, 7)), "vote has too great a strength"); - assert_noop!(Democracy::vote(Origin::signed(1), r.into(), Vote::new(false, 7)), "vote has too great a strength"); + assert_noop!(Democracy::vote(Origin::signed(1), r, Vote::new(true, 7)), "vote has too great a strength"); + assert_noop!(Democracy::vote(Origin::signed(1), r, Vote::new(false, 7)), "vote has too great a strength"); }); } fn set_balance_proposal(value: u64) -> Call { - Call::Balances(balances::Call::set_balance(42, value.into(), 0.into())) + Call::Balances(balances::Call::set_balance(42, value.into(), 0)) } fn propose_set_balance(who: u64, value: u64, locked: u64) -> super::Result { @@ -584,7 +580,7 @@ mod tests { System::set_block_number(2); let r = 0; - assert_ok!(Democracy::vote(Origin::signed(1), r.into(), AYE)); + assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); assert_eq!(Democracy::referendum_count(), 1); assert_eq!(Democracy::voters_for(r), vec![1]); @@ -602,10 +598,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(Origin::signed(2), 0.into())); - assert_ok!(Democracy::second(Origin::signed(5), 0.into())); - assert_ok!(Democracy::second(Origin::signed(5), 0.into())); - assert_ok!(Democracy::second(Origin::signed(5), 0.into())); + 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); @@ -617,10 +613,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(Origin::signed(2), 0.into())); - assert_ok!(Democracy::second(Origin::signed(5), 0.into())); - assert_ok!(Democracy::second(Origin::signed(5), 0.into())); - assert_ok!(Democracy::second(Origin::signed(5), 0.into())); + 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); @@ -649,7 +645,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(Origin::signed(1), 0.into()), "seconder\'s balance too low"); + assert_noop!(Democracy::second(Origin::signed(1), 0), "seconder\'s balance too low"); }); } @@ -663,17 +659,17 @@ mod tests { assert_eq!(Democracy::end_block(System::block_number()), Ok(())); System::set_block_number(1); - assert_ok!(Democracy::vote(Origin::signed(1), 0.into(), AYE)); + assert_ok!(Democracy::vote(Origin::signed(1), 0, AYE)); 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(Origin::signed(1), 1.into(), AYE)); + assert_ok!(Democracy::vote(Origin::signed(1), 1, AYE)); 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(Origin::signed(1), 2.into(), AYE)); + assert_ok!(Democracy::vote(Origin::signed(1), 2, AYE)); assert_eq!(Democracy::end_block(System::block_number()), Ok(())); }); } @@ -683,7 +679,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, 0).unwrap(); - assert_ok!(Democracy::vote(Origin::signed(1), r.into(), AYE)); + assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); assert_eq!(Democracy::voters_for(r), vec![1]); assert_eq!(Democracy::vote_of((r, 1)), AYE); @@ -700,7 +696,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, 0).unwrap(); - assert_ok!(Democracy::vote(Origin::signed(1), r.into(), AYE)); + assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); assert_ok!(Democracy::cancel_referendum(r.into())); assert_eq!(Democracy::end_block(System::block_number()), Ok(())); @@ -714,7 +710,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, 0).unwrap(); - assert_ok!(Democracy::vote(Origin::signed(1), r.into(), NAY)); + assert_ok!(Democracy::vote(Origin::signed(1), r, NAY)); assert_eq!(Democracy::voters_for(r), vec![1]); assert_eq!(Democracy::vote_of((r, 1)), NAY); @@ -731,12 +727,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, 0).unwrap(); - assert_ok!(Democracy::vote(Origin::signed(1), r.into(), AYE)); - assert_ok!(Democracy::vote(Origin::signed(2), r.into(), NAY)); - assert_ok!(Democracy::vote(Origin::signed(3), r.into(), NAY)); - assert_ok!(Democracy::vote(Origin::signed(4), r.into(), AYE)); - assert_ok!(Democracy::vote(Origin::signed(5), r.into(), NAY)); - assert_ok!(Democracy::vote(Origin::signed(6), r.into(), AYE)); + assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); + assert_ok!(Democracy::vote(Origin::signed(2), r, NAY)); + assert_ok!(Democracy::vote(Origin::signed(3), r, NAY)); + assert_ok!(Democracy::vote(Origin::signed(4), r, AYE)); + assert_ok!(Democracy::vote(Origin::signed(5), r, NAY)); + assert_ok!(Democracy::vote(Origin::signed(6), r, AYE)); assert_eq!(Democracy::tally(r), (110, 100, 210)); @@ -751,12 +747,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, 1).unwrap(); - assert_ok!(Democracy::vote(Origin::signed(1), r.into(), AYE)); - assert_ok!(Democracy::vote(Origin::signed(2), r.into(), AYE)); - assert_ok!(Democracy::vote(Origin::signed(3), r.into(), AYE)); - assert_ok!(Democracy::vote(Origin::signed(4), r.into(), AYE)); - assert_ok!(Democracy::vote(Origin::signed(5), r.into(), AYE)); - assert_ok!(Democracy::vote(Origin::signed(6), r.into(), AYE)); + assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); + assert_ok!(Democracy::vote(Origin::signed(2), r, AYE)); + assert_ok!(Democracy::vote(Origin::signed(3), r, AYE)); + assert_ok!(Democracy::vote(Origin::signed(4), r, AYE)); + assert_ok!(Democracy::vote(Origin::signed(5), r, AYE)); + assert_ok!(Democracy::vote(Origin::signed(6), r, AYE)); assert_eq!(Democracy::tally(r), (210, 0, 210)); @@ -775,12 +771,12 @@ mod tests { with_externalities(&mut new_test_ext_with_public_delay(1), || { System::set_block_number(1); let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); - assert_ok!(Democracy::vote(Origin::signed(1), r.into(), Vote::new(false, 6))); - assert_ok!(Democracy::vote(Origin::signed(2), r.into(), Vote::new(true, 5))); - assert_ok!(Democracy::vote(Origin::signed(3), r.into(), Vote::new(true, 4))); - assert_ok!(Democracy::vote(Origin::signed(4), r.into(), Vote::new(true, 3))); - assert_ok!(Democracy::vote(Origin::signed(5), r.into(), Vote::new(true, 2))); - assert_ok!(Democracy::vote(Origin::signed(6), r.into(), Vote::new(false, 1))); + assert_ok!(Democracy::vote(Origin::signed(1), r, Vote::new(false, 6))); + assert_ok!(Democracy::vote(Origin::signed(2), r, Vote::new(true, 5))); + assert_ok!(Democracy::vote(Origin::signed(3), r, Vote::new(true, 4))); + assert_ok!(Democracy::vote(Origin::signed(4), r, Vote::new(true, 3))); + assert_ok!(Democracy::vote(Origin::signed(5), r, Vote::new(true, 2))); + assert_ok!(Democracy::vote(Origin::signed(6), r, Vote::new(false, 1))); assert_eq!(Democracy::tally(r), (440, 120, 210)); @@ -805,8 +801,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, 0).unwrap(); - assert_ok!(Democracy::vote(Origin::signed(5), r.into(), NAY)); - assert_ok!(Democracy::vote(Origin::signed(6), r.into(), AYE)); + assert_ok!(Democracy::vote(Origin::signed(5), r, NAY)); + assert_ok!(Democracy::vote(Origin::signed(6), r, AYE)); assert_eq!(Democracy::tally(r), (60, 50, 110)); @@ -824,9 +820,9 @@ mod tests { System::set_block_number(1); let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); - assert_ok!(Democracy::vote(Origin::signed(4), r.into(), AYE)); - assert_ok!(Democracy::vote(Origin::signed(5), r.into(), NAY)); - assert_ok!(Democracy::vote(Origin::signed(6), r.into(), AYE)); + assert_ok!(Democracy::vote(Origin::signed(4), r, AYE)); + assert_ok!(Democracy::vote(Origin::signed(5), r, NAY)); + assert_ok!(Democracy::vote(Origin::signed(6), r, AYE)); assert_eq!(Democracy::tally(r), (100, 50, 150)); diff --git a/substrate/srml/example/src/lib.rs b/substrate/srml/example/src/lib.rs index 13ea7f9cdb..45c33c993f 100644 --- a/substrate/srml/example/src/lib.rs +++ b/substrate/srml/example/src/lib.rs @@ -50,7 +50,6 @@ extern crate srml_system as system; // might find it useful). extern crate srml_balances as balances; -use codec::HasCompact; use support::{StorageValue, dispatch::Result}; use system::ensure_signed; @@ -178,9 +177,9 @@ decl_module! { // without worrying about gameability or attack scenarios. // If you not specify `Result` explicitly as return value, it will be added automatically // for you and `Ok(())` will be returned. - fn set_dummy(new_value: ::Type) { + fn set_dummy(#[compact] new_value: T::Balance) { // Put the new value into storage. - >::put(new_value.into()); + >::put(new_value); } // The signature could also look like: `fn on_finalise()` diff --git a/substrate/srml/executive/src/lib.rs b/substrate/srml/executive/src/lib.rs index 35ea7c4a91..38d6ba4727 100644 --- a/substrate/srml/executive/src/lib.rs +++ b/substrate/srml/executive/src/lib.rs @@ -328,7 +328,7 @@ mod tests { transfer_fee: 0, creation_fee: 0, }.build_storage().unwrap().0); - let xt = primitives::testing::TestXt(Some(1), 0, Call::transfer(2, 69.into())); + let xt = primitives::testing::TestXt(Some(1), 0, Call::transfer(2, 69)); let mut t = runtime_io::TestExternalities::::new(t); with_externalities(&mut t, || { Executive::initialise_block(&Header::new(1, H256::default(), H256::default(), @@ -398,7 +398,7 @@ mod tests { #[test] fn bad_extrinsic_not_inserted() { let mut t = new_test_ext(); - let xt = primitives::testing::TestXt(Some(1), 42, Call::transfer(33, 69.into())); + let xt = primitives::testing::TestXt(Some(1), 42, Call::transfer(33, 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/srml/session/src/lib.rs b/substrate/srml/session/src/lib.rs index 4e0c668f63..bc316938c0 100644 --- a/substrate/srml/session/src/lib.rs +++ b/substrate/srml/session/src/lib.rs @@ -39,7 +39,6 @@ extern crate srml_timestamp as timestamp; use rstd::prelude::*; use primitives::traits::{As, Zero, One, Convert}; -use codec::HasCompact; use runtime_support::{StorageValue, StorageMap}; use runtime_support::dispatch::Result; use runtime_support::for_each_tuple; @@ -89,8 +88,8 @@ decl_module! { } /// Set a new session length. Won't kick in until the next session change (at current length). - fn set_length(new: ::Type) { - >::put(new.into()); + fn set_length(#[compact] new: T::BlockNumber) { + >::put(new); } /// Forces a new session. @@ -309,7 +308,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.into())); + assert_ok!(Session::set_length(10)); assert_eq!(Session::blocks_remaining(), 1); Session::check_rotate_session(1); @@ -344,14 +343,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.into())); + assert_ok!(Session::set_length(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.into())); + assert_ok!(Session::set_length(3)); Session::check_rotate_session(2); assert_eq!(Session::length(), 3); assert_eq!(Session::current_index(), 1); @@ -364,7 +363,7 @@ mod tests { // Block 4: Change to length 2; no visible change. System::set_block_number(4); - assert_ok!(Session::set_length(2.into())); + assert_ok!(Session::set_length(2)); Session::check_rotate_session(4); assert_eq!(Session::length(), 3); assert_eq!(Session::current_index(), 1); diff --git a/substrate/srml/staking/src/lib.rs b/substrate/srml/staking/src/lib.rs index 031083b8c6..db1405a466 100644 --- a/substrate/srml/staking/src/lib.rs +++ b/substrate/srml/staking/src/lib.rs @@ -118,9 +118,8 @@ decl_module! { /// Retract the desire to stake for the transactor. /// /// Effects will be felt at the beginning of the next era. - fn unstake(origin, intentions_index: Compact) -> Result { + fn unstake(origin, #[compact] intentions_index: u32) -> Result { let who = ensure_signed(origin)?; - let intentions_index: u32 = intentions_index.into(); // unstake fails in degenerate case of having too few existing staked parties if Self::intentions().len() <= Self::minimum_validator_count() as usize { return Err("cannot unstake when there are too few staked participants") @@ -149,9 +148,8 @@ decl_module! { /// Will panic if called when source isn't currently nominating target. /// Updates Nominating, NominatorsFor and NominationBalance. - fn unnominate(origin, target_index: Compact) { + fn unnominate(origin, #[compact] target_index: u32) { let source = ensure_signed(origin)?; - let target_index: u32 = target_index.into(); let target_index = target_index as usize; let target = >::get(&source).ok_or("Account must be nominating")?; @@ -182,11 +180,10 @@ decl_module! { /// An error (no-op) if `Self::intentions()[intentions_index] != origin`. fn register_preferences( origin, - intentions_index: Compact, + #[compact] intentions_index: u32, prefs: ValidatorPrefs ) { let who = ensure_signed(origin)?; - let intentions_index: u32 = intentions_index.into(); if Self::intentions().get(intentions_index as usize) != Some(&who) { return Err("Invalid index") @@ -196,18 +193,17 @@ decl_module! { } /// Set the number of sessions in an era. - fn set_sessions_per_era(new: ::Type) { - >::put(new.into()); + fn set_sessions_per_era(#[compact] new: T::BlockNumber) { + >::put(new); } /// The length of the bonding duration in eras. - fn set_bonding_duration(new: ::Type) { - >::put(new.into()); + fn set_bonding_duration(#[compact] new: T::BlockNumber) { + >::put(new); } /// The ideal number of validators. - fn set_validator_count(new: Compact) { - let new: u32 = new.into(); + fn set_validator_count(#[compact] new: u32) { >::put(new); } @@ -218,8 +214,7 @@ decl_module! { } /// Set the offline slash grace period. - fn set_offline_slash_grace(new: Compact) { - let new: u32 = new.into(); + fn set_offline_slash_grace(#[compact] new: u32) { >::put(new); } diff --git a/substrate/srml/staking/src/tests.rs b/substrate/srml/staking/src/tests.rs index 5601cff5f6..01a03d3124 100644 --- a/substrate/srml/staking/src/tests.rs +++ b/substrate/srml/staking/src/tests.rs @@ -90,7 +90,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.into())); + assert_ok!(Staking::set_offline_slash_grace(1)); assert_eq!(Staking::offline_slash_grace(), 1); assert_eq!(Staking::slash_count(&10), 0); @@ -145,7 +145,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(Origin::signed(10), 0.into(), 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]); @@ -251,7 +251,7 @@ fn staking_should_work() { assert_eq!(Staking::validator_count(), 2); assert_eq!(Session::validators(), vec![10, 20]); - assert_ok!(Staking::set_bonding_duration(2.into())); + assert_ok!(Staking::set_bonding_duration(2)); assert_eq!(Staking::bonding_duration(), 2); // Block 1: Add three validators. No obvious change. @@ -284,7 +284,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(Origin::signed(4), 1, 40.into())); + assert_ok!(Balances::transfer(Origin::signed(4), 1, 40)); Session::check_rotate_session(System::block_number()); // Block 6: Lowest now validator. @@ -327,7 +327,7 @@ fn nominating_and_rewards_should_work() { assert_eq!(Balances::total_balance(&4), 40); System::set_block_number(2); - assert_ok!(Staking::unnominate(Origin::signed(4), 0.into())); + 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]); @@ -460,7 +460,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.into())); + assert_ok!(Staking::set_sessions_per_era(3)); Session::check_rotate_session(System::block_number()); assert_eq!(Session::current_index(), 3); assert_eq!(Staking::sessions_per_era(), 2); @@ -506,7 +506,7 @@ 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(Origin::signed(1))); - assert_noop!(Balances::transfer(Origin::signed(1), 2, 69.into()), "cannot transfer illiquid funds"); + assert_noop!(Balances::transfer(Origin::signed(1), 2, 69), "cannot transfer illiquid funds"); }); } diff --git a/substrate/srml/support/src/dispatch.rs b/substrate/srml/support/src/dispatch.rs index 900af554b4..655f35bb90 100644 --- a/substrate/srml/support/src/dispatch.rs +++ b/substrate/srml/support/src/dispatch.rs @@ -21,7 +21,7 @@ pub use rstd::prelude::{Vec, Clone, Eq, PartialEq}; #[cfg(feature = "std")] pub use std::fmt; pub use rstd::result; -pub use codec::{Codec, Decode, Encode, Input, Output}; +pub use codec::{Codec, Decode, Encode, Input, Output, HasCompact, EncodeAsRef}; pub use srml_metadata::{ ModuleMetadata, FunctionMetadata, DecodeDifferent, CallMetadata, FunctionArgumentMetadata, OuterDispatchMetadata, OuterDispatchCall @@ -201,7 +201,7 @@ macro_rules! decl_module { [ $($t:tt)* ] $(#[doc = $doc_attr:tt])* $fn_vis:vis fn $fn_name:ident( - $origin:ident $(, $param_name:ident : $param:ty)* + $origin:ident $(, $(#[$codec_attr:ident])* $param_name:ident : $param:ty)* ) $( -> $result:ty )* { $( $impl:tt )* } $($rest:tt)* ) => { @@ -215,7 +215,7 @@ macro_rules! decl_module { $($t)* $(#[doc = $doc_attr])* $fn_vis fn $fn_name( - $origin $( , $param_name : $param )* + $origin $( , $(#[$codec_attr])* $param_name : $param )* ) $( -> $result )* { $( $impl )* } ] $($rest)* @@ -230,7 +230,7 @@ macro_rules! decl_module { [ $($t:tt)* ] $(#[doc = $doc_attr:tt])* $fn_vis:vis fn $fn_name:ident( - $origin:ident : T::Origin $(, $param_name:ident : $param:ty)* + $origin:ident : T::Origin $(, $(#[$codec_attr:ident])* $param_name:ident : $param:ty)* ) $( -> $result:ty )* { $( $impl:tt )* } $($rest:tt)* ) => { @@ -249,7 +249,7 @@ macro_rules! decl_module { [ $($t:tt)* ] $(#[doc = $doc_attr:tt])* $fn_vis:vis fn $fn_name:ident( - origin : $origin:ty $(, $param_name:ident : $param:ty)* + origin : $origin:ty $(, $(#[$codec_attr:ident])* $param_name:ident : $param:ty)* ) $( -> $result:ty )* { $( $impl:tt )* } $($rest:tt)* ) => { @@ -268,7 +268,7 @@ macro_rules! decl_module { [ $($t:tt)* ] $(#[doc = $doc_attr:tt])* $fn_vis:vis fn $fn_name:ident( - $( $param_name:ident : $param:ty),* + $( $(#[$codec_attr:ident])* $param_name:ident : $param:ty),* ) $( -> $result:ty )* { $( $impl:tt )* } $($rest:tt)* ) => { @@ -282,7 +282,7 @@ macro_rules! decl_module { $($t)* $(#[doc = $doc_attr])* $fn_vis fn $fn_name( - root $( , $param_name : $param )* + root $( , $(#[$codec_attr])* $param_name : $param )* ) $( -> $result )* { $( $impl )* } ] $($rest)* @@ -475,7 +475,7 @@ macro_rules! decl_module { $( $(#[doc = $doc_attr:tt])* $fn_vis:vis fn $fn_name:ident( - $from:ident $( , $param_name:ident : $param:ty)* + $from:ident $( , $(#[$codec_attr:ident])* $param_name:ident : $param:ty)* ) $( -> $result:ty )* { $( $impl:tt )* } )* } @@ -607,13 +607,13 @@ macro_rules! decl_module { 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 ),* ); )*) + __impl_decode!(input; _input_id; 0; $call_type; $( fn $fn_name( $( $(#[$codec_attr on type $param])* $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 ),* ); )*); + __impl_encode!(_dest; *self; 0; $call_type; $( fn $fn_name( $( $(#[$codec_attr on type $param])* $param_name ),* ); )*); if let $call_type::__PhantomItem(_) = *self { unreachable!() } if let $call_type::__OtherPhantomItem(_) = *self { unreachable!() } } @@ -651,7 +651,7 @@ macro_rules! decl_module { } __dispatch_impl_metadata! { $mod_type $trait_instance $trait_name $call_type $origin_type - {$( $(#[doc = $doc_attr])* fn $fn_name($from $(, $param_name : $param )*); )*} + {$( $(#[doc = $doc_attr])* fn $fn_name($from $(, $(#[$codec_attr])* $param_name : $param )*); )*} } } } @@ -665,14 +665,18 @@ macro_rules! __impl_decode { $fn_id:expr; $call_type:ident; fn $fn_name:ident( - $( $param_name:ident ),* + $( $(#[$codec_attr:ident on type $param:ty])* $param_name:ident ),* ); $($rest:tt)* ) => { { if $input_id == ($fn_id) { $( - let $param_name = $crate::dispatch::Decode::decode($input)?; + __impl_decode!(@decode + $(#[$codec_attr on type $param])* + $param_name; + $input; + ); )* return Some($call_type:: $fn_name( $( $param_name ),* )); } @@ -687,7 +691,31 @@ macro_rules! __impl_decode { $call_type:ident; ) => { None - } + }; + (@decode + #[compact on type $param:ty] + $param_name:ident; + $input:expr; + ) => { + let $param_name = <<$param as $crate::dispatch::HasCompact>::Type as $crate::dispatch::Decode>::decode($input)?.into(); + }; + (@decode + $param_name:ident; + $input:expr; + ) => { + let $param_name = $crate::dispatch::Decode::decode($input)?; + }; + (@decode + $(#[$codec_attr:ident on type])* + $param_name:ident; + $input:expr; + ) => { + compile_error!(concat!( + "Invalid attribute for parameter `", + stringify!($param_name), + "`, the following attributes are supported: `#[compact]`" + )) + }; } #[macro_export] @@ -699,7 +727,7 @@ macro_rules! __impl_encode { $fn_id:expr; $call_type:ident; fn $fn_name:ident( - $( $param_name:ident ),* + $( $(#[$codec_attr:ident on type $param:ty])* $param_name:ident ),* ); $($rest:tt)* ) => { @@ -711,7 +739,11 @@ macro_rules! __impl_encode { ) = $self { $dest.push_byte(($fn_id) as u8); $( - $param_name.encode_to($dest); + __impl_encode!(@encode_as + $(#[$codec_attr on type $param])* + $param_name; + $dest; + ); )* } @@ -723,7 +755,30 @@ macro_rules! __impl_encode { $self:expr; $fn_id:expr; $call_type:ident; - ) => {{}} + ) => {{}}; + (@encode_as + #[compact on type $param:ty] + $param_name:ident; + $dest:expr; + ) => { + <<$param as $crate::dispatch::HasCompact>::Type as $crate::dispatch::EncodeAsRef<$param>>::RefType::from($param_name).encode_to($dest); + }; + (@encode_as + $param_name:ident; + $dest:expr; + ) => { + $param_name.encode_to($dest); + }; + (@encode_as + $(#[$codec_attr:ident on type $param:ty])* + $param_name:ident; + $dest:expr; + ) => { + compile_error!(concat!( + "Invalid attribute for parameter `", stringify!($param_name), + "`, the following attributes are supported: `#[compact]`" + )) + }; } pub trait IsSubType { @@ -871,7 +926,7 @@ macro_rules! __call_to_metadata { $(#[doc = $doc_attr:tt])* fn $fn_name:ident($from:ident $( - , $param_name:ident : $param:ty + , $(#[$codec_attr:ident])* $param_name:ident : $param:ty )* ); )*} @@ -879,7 +934,7 @@ macro_rules! __call_to_metadata { $crate::dispatch::CallMetadata { name: $crate::dispatch::DecodeDifferent::Encode(stringify!($call_type)), functions: __functions_to_metadata!(0; $origin_type;; $( - fn $fn_name( $( $param_name: $param ),* ); + fn $fn_name( $($(#[$codec_attr])* $param_name: $param ),* ); $( $doc_attr ),*; )*), } @@ -896,7 +951,7 @@ macro_rules! __functions_to_metadata{ $( $function_metadata:expr ),*; fn $fn_name:ident( $( - $param_name:ident : $param:ty + $(#[$codec_attr:ident])* $param_name:ident : $param:ty ),* ); $( $fn_doc:expr ),*; @@ -905,7 +960,7 @@ macro_rules! __functions_to_metadata{ __functions_to_metadata!( $fn_id + 1; $origin_type; $( $function_metadata, )* __function_to_metadata!( - fn $fn_name($( $param_name : $param ),*); $( $fn_doc ),*; $fn_id; + fn $fn_name($( $(#[$codec_attr])* $param_name : $param ),*); $( $fn_doc ),*; $fn_id; ); $($rest)* ) @@ -925,7 +980,7 @@ macro_rules! __functions_to_metadata{ macro_rules! __function_to_metadata { ( fn $fn_name:ident( - $($param_name:ident : $param:ty),* + $( $(#[$codec_attr:ident])* $param_name:ident : $param:ty),* ); $( $fn_doc:expr ),*; $fn_id:expr; @@ -937,13 +992,30 @@ macro_rules! __function_to_metadata { $( $crate::dispatch::FunctionArgumentMetadata { name: $crate::dispatch::DecodeDifferent::Encode(stringify!($param_name)), - ty: $crate::dispatch::DecodeDifferent::Encode(stringify!($param)), + ty: $crate::dispatch::DecodeDifferent::Encode( + __function_to_metadata!(@stringify_expand_attr + $(#[$codec_attr])* $param_name: $param + ) + ), } ),* ]), documentation: $crate::dispatch::DecodeDifferent::Encode(&[ $( $fn_doc ),* ]), } }; + + (@stringify_expand_attr #[compact] $param_name:ident : $param:ty) => { + concat!("Compact<", stringify!($param), ">") + }; + + (@stringify_expand_attr $param_name:ident : $param:ty) => { stringify!($param) }; + + (@stringify_expand_attr $(#[codec_attr:ident])* $param_name:ident : $param:ty) => { + compile_error!(concat!( + "Invalid attribute for parameter `", stringify!($param_name), + "`, the following attributes are supported: `#[compact]`" + )) + } } #[cfg(test)] @@ -969,7 +1041,7 @@ mod tests { pub struct Module for enum Call where origin: T::Origin { /// Hi, this is a comment. fn aux_0(_origin) -> Result { unreachable!() } - fn aux_1(_origin, _data: i32) -> Result { unreachable!() } + fn aux_1(_origin, #[compact] _data: u32) -> Result { unreachable!() } fn aux_2(_origin, _data: i32, _data2: String) -> Result { unreachable!() } fn aux_3() -> Result { unreachable!() } fn aux_4(_data: i32) -> Result { unreachable!() } @@ -995,7 +1067,7 @@ mod tests { arguments: DecodeDifferent::Encode(&[ FunctionArgumentMetadata { name: DecodeDifferent::Encode("_data"), - ty: DecodeDifferent::Encode("i32"), + ty: DecodeDifferent::Encode("Compact") } ]), documentation: DecodeDifferent::Encode(&[]), @@ -1048,4 +1120,11 @@ mod tests { let metadata = Module::::metadata(); assert_eq!(EXPECTED_METADATA, metadata); } + + #[test] + fn compact_attr() { + let call: Call = Call::aux_1(0); + let encoded = call.encode(); + assert_eq!(encoded.len(), 2); + } } diff --git a/substrate/srml/timestamp/src/lib.rs b/substrate/srml/timestamp/src/lib.rs index 71bf6ebded..8f78aabefe 100644 --- a/substrate/srml/timestamp/src/lib.rs +++ b/substrate/srml/timestamp/src/lib.rs @@ -47,7 +47,6 @@ extern crate srml_system as system; extern crate srml_consensus as consensus; extern crate parity_codec as codec; -use codec::HasCompact; use runtime_support::{StorageValue, Parameter}; use runtime_primitives::CheckInherentError; use runtime_primitives::traits::{ @@ -100,10 +99,8 @@ decl_module! { /// if this call hasn't been invoked by that time. /// /// The timestamp should be greater than the previous one by the amount specified by `block_period`. - fn set(origin, now: ::Type) { + fn set(origin, #[compact] now: T::Moment) { ensure_inherent(origin)?; - let now = now.into(); - assert!(!::DidUpdate::exists(), "Timestamp must be updated only once in the block"); assert!( >::extrinsic_index() == Some(T::TIMESTAMP_SET_POSITION), @@ -175,7 +172,7 @@ impl ProvideInherent for Module { let t = match (xt.is_signed(), extract_function(&xt)) { (Some(false), Some(Call::set(ref t))) => t.clone(), _ => return Err(CheckInherentError::Other("No valid timestamp inherent in block".into())), - }.into().as_(); + }.as_(); let minimum = (Self::now() + Self::block_period()).as_(); if t > data.as_() + MAX_TIMESTAMP_DRIFT { @@ -239,7 +236,7 @@ mod tests { with_externalities(&mut TestExternalities::new(t), || { Timestamp::set_timestamp(42); - assert_ok!(Timestamp::dispatch(Call::set(69.into()), Origin::INHERENT)); + assert_ok!(Timestamp::dispatch(Call::set(69), Origin::INHERENT)); assert_eq!(Timestamp::now(), 69); }); } @@ -254,8 +251,8 @@ mod tests { with_externalities(&mut TestExternalities::new(t), || { Timestamp::set_timestamp(42); - assert_ok!(Timestamp::dispatch(Call::set(69.into()), Origin::INHERENT)); - let _ = Timestamp::dispatch(Call::set(70.into()), Origin::INHERENT); + assert_ok!(Timestamp::dispatch(Call::set(69), Origin::INHERENT)); + let _ = Timestamp::dispatch(Call::set(70), Origin::INHERENT); }); } @@ -269,7 +266,7 @@ mod tests { with_externalities(&mut TestExternalities::new(t), || { Timestamp::set_timestamp(42); - let _ = Timestamp::dispatch(Call::set(46.into()), Origin::INHERENT); + let _ = Timestamp::dispatch(Call::set(46), Origin::INHERENT); }); } } diff --git a/substrate/srml/treasury/src/lib.rs b/substrate/srml/treasury/src/lib.rs index 3cc1a3c491..6e0b2657a6 100644 --- a/substrate/srml/treasury/src/lib.rs +++ b/substrate/srml/treasury/src/lib.rs @@ -41,7 +41,6 @@ extern crate srml_balances as balances; use rstd::prelude::*; use runtime_support::{StorageValue, StorageMap}; use runtime_primitives::{Permill, traits::{Zero, EnsureOrigin, StaticLookup}}; -use codec::{HasCompact, Compact}; use balances::OnDilution; use system::ensure_signed; @@ -74,12 +73,11 @@ decl_module! { /// proposal is awarded. fn propose_spend( origin, - value: ::Type, + #[compact] value: T::Balance, beneficiary: ::Source ) { let proposer = ensure_signed(origin)?; let beneficiary = T::Lookup::lookup(beneficiary)?; - let value = value.into(); let bond = Self::calculate_bond(value); >::reserve(&proposer, bond) @@ -93,29 +91,27 @@ decl_module! { } /// Set the balance of funds available to spend. - fn set_pot(new_pot: ::Type) { + fn set_pot(#[compact] new_pot: T::Balance) { // Put the new value into storage. - >::put(new_pot.into()); + >::put(new_pot); } /// (Re-)configure this module. fn configure( proposal_bond: Permill, - proposal_bond_minimum: ::Type, - spend_period: ::Type, + #[compact] proposal_bond_minimum: T::Balance, + #[compact] spend_period: T::BlockNumber, burn: Permill ) { >::put(proposal_bond); - >::put(proposal_bond_minimum.into()); - >::put(spend_period.into()); + >::put(proposal_bond_minimum); + >::put(spend_period); >::put(burn); } /// Reject a proposed spend. The original deposit will be slashed. - fn reject_proposal(origin, proposal_id: Compact) { + fn reject_proposal(origin, #[compact] proposal_id: ProposalIndex) { T::RejectOrigin::ensure_origin(origin)?; - let proposal_id: ProposalIndex = proposal_id.into(); - let proposal = >::take(proposal_id).ok_or("No proposal at that index")?; let value = proposal.bond; @@ -124,9 +120,8 @@ decl_module! { /// 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(origin, proposal_id: Compact) { + fn approve_proposal(origin, #[compact] proposal_id: ProposalIndex) { T::ApproveOrigin::ensure_origin(origin)?; - let proposal_id = proposal_id.into(); ensure!(>::exists(proposal_id), "No proposal at that index"); @@ -353,7 +348,7 @@ mod tests { #[test] fn spend_proposal_takes_min_deposit() { with_externalities(&mut new_test_ext(), || { - assert_ok!(Treasury::propose_spend(Origin::signed(0), 1.into(), 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); }); @@ -362,7 +357,7 @@ mod tests { #[test] fn spend_proposal_takes_proportional_deposit() { with_externalities(&mut new_test_ext(), || { - assert_ok!(Treasury::propose_spend(Origin::signed(0), 100.into(), 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); }); @@ -371,7 +366,7 @@ mod tests { #[test] fn spend_proposal_fails_when_proposer_poor() { with_externalities(&mut new_test_ext(), || { - assert_noop!(Treasury::propose_spend(Origin::signed(2), 100.into(), 3), "Proposer's balance too low"); + assert_noop!(Treasury::propose_spend(Origin::signed(2), 100, 3), "Proposer's balance too low"); }); } @@ -380,8 +375,8 @@ mod tests { with_externalities(&mut new_test_ext(), || { Treasury::on_dilution(100, 100); - assert_ok!(Treasury::propose_spend(Origin::signed(0), 100.into(), 3)); - assert_ok!(Treasury::approve_proposal(Origin::ROOT, 0.into())); + 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); @@ -404,8 +399,8 @@ mod tests { with_externalities(&mut new_test_ext(), || { Treasury::on_dilution(100, 100); - assert_ok!(Treasury::propose_spend(Origin::signed(0), 100.into(), 3)); - assert_ok!(Treasury::reject_proposal(Origin::ROOT, 0.into())); + 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); @@ -418,23 +413,23 @@ mod tests { with_externalities(&mut new_test_ext(), || { Treasury::on_dilution(100, 100); - assert_ok!(Treasury::propose_spend(Origin::signed(0), 100.into(), 3)); - assert_ok!(Treasury::reject_proposal(Origin::ROOT, 0.into())); - assert_noop!(Treasury::reject_proposal(Origin::ROOT, 0.into()), "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(Origin::ROOT, 0.into()), "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(Origin::ROOT, 0.into()), "No proposal at that index"); + assert_noop!(Treasury::approve_proposal(Origin::ROOT, 0), "No proposal at that index"); }); } @@ -443,9 +438,9 @@ mod tests { with_externalities(&mut new_test_ext(), || { Treasury::on_dilution(100, 100); - assert_ok!(Treasury::propose_spend(Origin::signed(0), 100.into(), 3)); - assert_ok!(Treasury::reject_proposal(Origin::ROOT, 0.into())); - assert_noop!(Treasury::approve_proposal(Origin::ROOT, 0.into()), "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"); }); } @@ -454,8 +449,8 @@ mod tests { with_externalities(&mut new_test_ext(), || { Treasury::on_dilution(100, 100); - assert_ok!(Treasury::propose_spend(Origin::signed(0), 100.into(), 3)); - assert_ok!(Treasury::approve_proposal(Origin::ROOT, 0.into())); + 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); @@ -468,8 +463,8 @@ mod tests { with_externalities(&mut new_test_ext(), || { Treasury::on_dilution(100, 100); - assert_ok!(Treasury::propose_spend(Origin::signed(0), 150.into(), 3)); - assert_ok!(Treasury::approve_proposal(Origin::ROOT, 0.into())); + 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);