diff --git a/Cargo.lock b/Cargo.lock index 63597b890..b346a7cad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -69,13 +69,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bigint" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -86,7 +85,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -152,12 +151,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bytes" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "bytes" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -179,14 +173,6 @@ dependencies = [ "multihash 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "clippy" -version = "0.0.90" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "clippy_lints 0.0.90 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "clippy" version = "0.0.103" @@ -195,20 +181,6 @@ dependencies = [ "clippy_lints 0.0.103 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "clippy_lints" -version = "0.0.90" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "quine-mc_cluskey 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "semver 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "toml 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-normalization 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "clippy_lints" version = "0.0.103" @@ -296,12 +268,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "docopt" -version = "0.7.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "regex 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -338,7 +311,7 @@ version = "0.5.6" source = "git+https://github.com/paritytech/rust-secp256k1#b6b67055edc929057e97d64f036c78ad91f58a7f" dependencies = [ "arrayvec 0.3.20 (registry+https://github.com/rust-lang/crates.io-index)", - "gcc 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)", + "gcc 0.3.51 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", @@ -346,13 +319,13 @@ dependencies = [ [[package]] name = "ethabi" -version = "1.0.5" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-keccak 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -377,7 +350,7 @@ dependencies = [ "clippy 0.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "ethabi 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "ethabi 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethash 1.7.0", "ethcore-bloom-journal 0.1.0", "ethcore-devtools 1.7.0", @@ -406,6 +379,7 @@ dependencies = [ "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.2.0", "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", "semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "stats 0.1.0", @@ -417,11 +391,11 @@ dependencies = [ name = "ethcore-bigint" version = "0.1.3" dependencies = [ - "bigint 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bigint 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -526,8 +500,8 @@ dependencies = [ "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.2.0", - "serde 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "stats 0.1.0", "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", @@ -553,7 +527,7 @@ name = "ethcore-network" version = "1.7.0" dependencies = [ "ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "clippy 0.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore-devtools 1.7.0", "ethcore-io 1.7.0", @@ -570,6 +544,7 @@ dependencies = [ "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.2.0", "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", @@ -581,7 +556,7 @@ name = "ethcore-secretstore" version = "1.0.0" dependencies = [ "byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethabi 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "ethabi 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore 1.7.0", "ethcore-devtools 1.7.0", "ethcore-ipc 1.7.0", @@ -597,10 +572,10 @@ dependencies = [ "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "native-contracts 0.1.0", "parking_lot 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-core 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-proto 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -653,7 +628,7 @@ dependencies = [ "rlp 0.2.0", "rocksdb 0.4.5 (git+https://github.com/paritytech/rust-rocksdb)", "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "sha3 0.1.0", "table 0.1.0", @@ -682,10 +657,10 @@ version = "0.1.0" dependencies = [ "clippy 0.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore-util 1.7.0", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -698,7 +673,7 @@ dependencies = [ "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-keccak 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -706,9 +681,11 @@ dependencies = [ name = "ethkey-cli" version = "0.1.0" dependencies = [ - "docopt 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "docopt 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "ethkey 0.2.0", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -725,10 +702,10 @@ dependencies = [ "parking_lot 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", @@ -739,9 +716,11 @@ dependencies = [ name = "ethstore-cli" version = "0.1.0" dependencies = [ - "docopt 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "docopt 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "ethstore 0.1.0", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -774,10 +753,12 @@ dependencies = [ name = "evmbin" version = "0.1.0" dependencies = [ - "docopt 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "docopt 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore 1.7.0", "ethcore-util 1.7.0", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -799,13 +780,12 @@ dependencies = [ name = "fetch" version = "0.1.0" dependencies = [ - "clippy 0.0.90 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "mime 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "reqwest 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "reqwest 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -814,7 +794,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", - "miniz-sys 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz-sys 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -844,10 +824,10 @@ dependencies = [ [[package]] name = "gcc" -version = "0.3.43" +version = "0.3.51" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rayon 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -896,7 +876,7 @@ dependencies = [ "libusb 0.3.0 (git+https://github.com/paritytech/libusb-rs)", "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -920,7 +900,7 @@ name = "hidapi" version = "0.3.1" source = "git+https://github.com/paritytech/hidapi-rs#9a127c1dca7e327e4fdd428406a76c9f5ef48563" dependencies = [ - "gcc 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)", + "gcc 0.3.51 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1049,19 +1029,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "jsonrpc-core" version = "7.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#d8dae528860d7fe976a8e3ec060a792e2496573b" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#d12476f42ee672fa9d023f66fcfa5981d9aaba3a" dependencies = [ "futures 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-http-server" version = "7.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#d8dae528860d7fe976a8e3ec060a792e2496573b" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#d12476f42ee672fa9d023f66fcfa5981d9aaba3a" dependencies = [ "hyper 0.10.0-a.0 (git+https://github.com/paritytech/hyper)", "jsonrpc-core 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", @@ -1074,9 +1054,9 @@ dependencies = [ [[package]] name = "jsonrpc-ipc-server" version = "7.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#d8dae528860d7fe976a8e3ec060a792e2496573b" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#d12476f42ee672fa9d023f66fcfa5981d9aaba3a" dependencies = [ - "bytes 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", "jsonrpc-server-utils 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1087,18 +1067,19 @@ dependencies = [ [[package]] name = "jsonrpc-macros" version = "7.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#d8dae528860d7fe976a8e3ec060a792e2496573b" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#d12476f42ee672fa9d023f66fcfa5981d9aaba3a" dependencies = [ "jsonrpc-core 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", "jsonrpc-pubsub 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", - "serde 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-minihttp-server" version = "7.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#d8dae528860d7fe976a8e3ec060a792e2496573b" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#d12476f42ee672fa9d023f66fcfa5981d9aaba3a" dependencies = [ + "bytes 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", "jsonrpc-server-utils 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1111,7 +1092,7 @@ dependencies = [ [[package]] name = "jsonrpc-pubsub" version = "7.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#d8dae528860d7fe976a8e3ec060a792e2496573b" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#d12476f42ee672fa9d023f66fcfa5981d9aaba3a" dependencies = [ "jsonrpc-core 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1121,7 +1102,7 @@ dependencies = [ [[package]] name = "jsonrpc-server-utils" version = "7.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#d8dae528860d7fe976a8e3ec060a792e2496573b" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#d12476f42ee672fa9d023f66fcfa5981d9aaba3a" dependencies = [ "globset 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", @@ -1133,26 +1114,26 @@ dependencies = [ [[package]] name = "jsonrpc-tcp-server" version = "7.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#d8dae528860d7fe976a8e3ec060a792e2496573b" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#d12476f42ee672fa9d023f66fcfa5981d9aaba3a" dependencies = [ - "bytes 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", "jsonrpc-server-utils 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-ws-server" version = "7.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#d8dae528860d7fe976a8e3ec060a792e2496573b" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#d12476f42ee672fa9d023f66fcfa5981d9aaba3a" dependencies = [ "jsonrpc-core 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", "jsonrpc-server-utils 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "ws 0.6.0 (git+https://github.com/tomusdrw/ws-rs)", + "ws 0.7.1 (git+https://github.com/tomusdrw/ws-rs)", ] [[package]] @@ -1189,6 +1170,14 @@ name = "libc" version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "libflate" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "libusb" version = "0.3.0" @@ -1204,7 +1193,7 @@ name = "libusb-sys" version = "0.2.3" source = "git+https://github.com/paritytech/libusb-sys#c10b1180646c9dc3f23a9b6bb825abcd3b7487ce" dependencies = [ - "gcc 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)", + "gcc 0.3.51 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1275,10 +1264,10 @@ dependencies = [ [[package]] name = "miniz-sys" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "gcc 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)", + "gcc 0.3.51 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1383,7 +1372,7 @@ name = "nanomsg-sys" version = "0.5.0" source = "git+https://github.com/paritytech/nanomsg.rs.git?branch=parity-1.7#673b79beef6e149273899850d7692335a481a920" dependencies = [ - "gcc 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)", + "gcc 0.3.51 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1391,7 +1380,7 @@ dependencies = [ name = "native-contract-generator" version = "0.1.0" dependencies = [ - "ethabi 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "ethabi 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "heck 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1400,7 +1389,7 @@ name = "native-contracts" version = "0.1.0" dependencies = [ "byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethabi 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "ethabi 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore-util 1.7.0", "futures 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", "native-contract-generator 0.1.0", @@ -1556,7 +1545,7 @@ name = "openssl-sys" version = "0.9.13" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "gcc 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)", + "gcc 0.3.51 (registry+https://github.com/rust-lang/crates.io-index)", "gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1585,7 +1574,7 @@ dependencies = [ "clippy 0.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "ctrlc 1.1.1 (git+https://github.com/paritytech/rust-ctrlc.git)", "daemonize 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "docopt 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "docopt 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore 1.7.0", "ethcore-devtools 1.7.0", @@ -1622,13 +1611,14 @@ dependencies = [ "rlp 0.2.0", "rpassword 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "rpc-cli 1.4.0", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", - "toml 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1655,10 +1645,10 @@ dependencies = [ "parity-reactor 0.1.0", "parity-ui 1.7.0", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", "unicase 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1683,7 +1673,7 @@ dependencies = [ name = "parity-hash-fetch" version = "1.7.0" dependencies = [ - "ethabi 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "ethabi 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore-util 1.7.0", "fetch 0.1.0", "futures 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1693,7 +1683,7 @@ dependencies = [ "native-contracts 0.1.0", "parity-reactor 0.1.0", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1719,9 +1709,9 @@ dependencies = [ "ethkey 0.2.0", "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.2.0", - "serde 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1769,11 +1759,11 @@ dependencies = [ "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.2.0", "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "stats 0.1.0", "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1792,8 +1782,8 @@ dependencies = [ "matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-rpc 1.7.0", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1803,7 +1793,7 @@ name = "parity-tokio-ipc" version = "0.1.5" source = "git+https://github.com/nikvolf/parity-tokio-ipc#d6c5b3cfcc913a1b9cf0f0562a10b083ceb9fb7c" dependencies = [ - "bytes 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "mio-named-pipes 0.1.4 (git+https://github.com/alexcrichton/mio-named-pipes)", @@ -1834,7 +1824,7 @@ dependencies = [ [[package]] name = "parity-ui-precompiled" version = "1.4.0" -source = "git+https://github.com/paritytech/js-precompiled.git#7dc30d69a4e15b1fc22d3d25939a177f0979df07" +source = "git+https://github.com/paritytech/js-precompiled.git#fa572f52beb3a7b6f6473a5a5cf07518d899c4d9" dependencies = [ "parity-dapps-glue 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1843,7 +1833,7 @@ dependencies = [ name = "parity-updater" version = "1.7.0" dependencies = [ - "ethabi 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "ethabi 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore 1.7.0", "ethcore-ipc 1.7.0", "ethcore-ipc-codegen 1.7.0", @@ -2046,17 +2036,6 @@ dependencies = [ "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "rayon" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "deque 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "rayon" version = "0.7.0" @@ -2101,15 +2080,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "reqwest" -version = "0.4.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "hyper 0.10.5 (registry+https://github.com/rust-lang/crates.io-index)", "hyper-native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libflate 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_urlencoded 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_urlencoded 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2118,7 +2098,7 @@ name = "ring" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "gcc 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)", + "gcc 0.3.51 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2133,7 +2113,7 @@ dependencies = [ "elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore-bigint 0.1.3", "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2151,7 +2131,7 @@ name = "rocksdb-sys" version = "0.3.0" source = "git+https://github.com/paritytech/rust-rocksdb#4364caec4dd5da1a1d78c39276774ee65bf55c7d" dependencies = [ - "gcc 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)", + "gcc 0.3.51 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2193,7 +2173,7 @@ dependencies = [ name = "rpc-cli" version = "1.4.0" dependencies = [ - "bigint 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bigint 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore-util 1.7.0", "futures 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", "parity-rpc 1.7.0", @@ -2206,13 +2186,18 @@ name = "rust-crypto" version = "0.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "gcc 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)", + "gcc 0.3.51 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rustc-hex" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "rustc-serialize" version = "0.3.19" @@ -2310,45 +2295,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "0.9.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "serde" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "serde_codegen_internals" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "serde_derive" -version = "0.9.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.3.10 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_codegen_internals 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "serde_derive" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "quote 0.3.10 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive_internals 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive_internals 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)", "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_derive_internals" -version = "0.15.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2357,23 +2319,23 @@ dependencies = [ [[package]] name = "serde_json" -version = "0.9.5" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "dtoa 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_urlencoded" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "dtoa 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2386,7 +2348,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "sha3" version = "0.1.0" dependencies = [ - "gcc 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)", + "gcc 0.3.51 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2607,7 +2569,7 @@ name = "tokio-core" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2622,7 +2584,7 @@ name = "tokio-io" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2630,14 +2592,16 @@ dependencies = [ [[package]] name = "tokio-minihttp" version = "0.1.0" -source = "git+https://github.com/tomusdrw/tokio-minihttp#8acbafae3e77e7f7eb516b441ec84695580221dd" +source = "git+https://github.com/tomusdrw/tokio-minihttp#67a400060bd29e51beaf206c552845255b6f699f" dependencies = [ + "bytes 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.29 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-core 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-proto 0.1.0 (git+https://github.com/tomusdrw/tokio-proto)", "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2647,7 +2611,7 @@ name = "tokio-named-pipes" version = "0.1.0" source = "git+https://github.com/nikvolf/tokio-named-pipes#0b9b728eaeb0a6673c287ac7692be398fd651752" dependencies = [ - "bytes 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", "mio-named-pipes 0.1.4 (git+https://github.com/alexcrichton/mio-named-pipes)", "tokio-core 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2708,7 +2672,7 @@ name = "tokio-uds" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2729,10 +2693,10 @@ dependencies = [ [[package]] name = "toml" -version = "0.2.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2855,10 +2819,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "ws" -version = "0.6.0" -source = "git+https://github.com/tomusdrw/ws-rs#7f8e416b7f048880228005457e117128be38bf0f" +version = "0.7.1" +source = "git+https://github.com/tomusdrw/ws-rs#f8306a798b7541d64624299a83a2c934f173beed" dependencies = [ - "bytes 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2919,7 +2884,7 @@ dependencies = [ "checksum aster 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4ccfdf7355d9db158df68f976ed030ab0f6578af811f5a7bb6dcf221ec24e0e0" "checksum base-x 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f59103b47307f76e03bef1633aec7fa9e29bfb5aa6daf5a334f94233c71f6c1" "checksum base32 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1b9605ba46d61df0410d8ac686b0007add8172eba90e8e909c347856fe794d8c" -"checksum bigint 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d493e6869ed11b135750f4a4f44d574a52bf8f67e656cdc15b4085316c2098b6" +"checksum bigint 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d0673c930652d3d4d6dcd5c45b5db4fa5f8f33994d7323618c43c083b223e8c" "checksum bincode 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e103c8b299b28a9c6990458b7013dc4a8356a9b854c51b9883241f5866fac36e" "checksum bit-set 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e6e1e6fb1c9e3d6fcdec57216a74eaa03e41f52a22f13a16438251d8e88b89da" "checksum bit-set 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d9bf6104718e80d7b26a68fdbacff3481cfc05df670821affc7e9cbc1884400c" @@ -2931,14 +2896,11 @@ dependencies = [ "checksum bloomchain 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3f421095d2a76fc24cd3fb3f912b90df06be7689912b1bdb423caefae59c258d" "checksum bn 0.4.4 (git+https://github.com/paritytech/bn)" = "" "checksum byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c40977b0ee6b9885c9013cd41d9feffdd22deb3bb4dc3a71d901cc7a77de18c8" -"checksum bytes 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c129aff112dcc562970abb69e2508b40850dd24c274761bb50fb8a0067ba6c27" -"checksum bytes 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f9edb851115d67d1f18680f9326901768a91d37875b87015518357c6ce22b553" +"checksum bytes 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8b24f16593f445422331a5eed46b72f7f171f910fead4f2ea8f17e727e9c5c14" "checksum cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de1e760d7b6535af4241fca8bd8adf68e2e7edacc6b29f5d399050c5e48cf88c" "checksum cid 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "34aa7da06f10541fbca6850719cdaa8fa03060a5d2fb33840f149cf8133a00c7" "checksum clippy 0.0.103 (registry+https://github.com/rust-lang/crates.io-index)" = "5b4fabf979ddf6419a313c1c0ada4a5b95cfd2049c56e8418d622d27b4b6ff32" -"checksum clippy 0.0.90 (registry+https://github.com/rust-lang/crates.io-index)" = "d19bda68c3db98e3a780342f6101b44312fef20a5f13ce756d1202a35922b01b" "checksum clippy_lints 0.0.103 (registry+https://github.com/rust-lang/crates.io-index)" = "ce96ec05bfe018a0d5d43da115e54850ea2217981ff0f2e462780ab9d594651a" -"checksum clippy_lints 0.0.90 (registry+https://github.com/rust-lang/crates.io-index)" = "3d4ed67c69b9bb35169be2538691d290a3aa0cbfd4b9f0bfb7c221fc1d399a96" "checksum cookie 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d53b80dde876f47f03cda35303e368a79b91c70b0d65ecba5fd5280944a08591" "checksum core-foundation 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "20a6d0448d3a99d977ae4a2aa5a98d886a923e863e81ad9ff814645b6feb3bbd" "checksum core-foundation-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "05eed248dc504a5391c63794fe4fb64f46f071280afaa1b73308f3c0ce4574c5" @@ -2948,20 +2910,20 @@ dependencies = [ "checksum daemonize 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "271ec51b7e0bee92f0d04601422c73eb76ececf197026711c97ad25038a010cf" "checksum deque 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1614659040e711785ed8ea24219140654da1729f3ec8a47a9719d041112fe7bf" "checksum difference 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3304d19798a8e067e48d8e69b2c37f0b5e9b4e462504ad9e27e9f3fce02bba8" -"checksum docopt 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ab32ea6e284d87987066f21a9e809a73c14720571ef34516f0890b3d355ccfd8" +"checksum docopt 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3b5b93718f8b3e5544fcc914c43de828ca6c6ace23e0332c6080a2977b49787a" "checksum dtoa 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5edd69c67b2f8e0911629b7e6b8a34cb3956613cd7c6e6414966dee349c2db4f" "checksum either 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3d2b503c86dad62aaf414ecf2b8c527439abedb3f8d812537f0b12bfd6f32a91" "checksum elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "258ff6a9a94f648d0379dbd79110e057edbb53eb85cc237e33eadf8e5a30df85" "checksum env_logger 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e3856f1697098606fc6cb97a93de88ca3f3bc35bb878c725920e6e82ecf05e83" "checksum eth-secp256k1 0.5.6 (git+https://github.com/paritytech/rust-secp256k1)" = "" -"checksum ethabi 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "65f71b9ac0b0f8e6230d32dbf5acf7c2c61334af1148175d0a7e72b14c3d475e" +"checksum ethabi 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0c3d62319ee0f35abf20afe8859dd2668195912614346447bb2dee9fb8da7c62" "checksum fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1ee15a7050e5580b3712877157068ea713b245b080ff302ae2ca973cfcd9baa" "checksum flate2 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "3eeb481e957304178d2e782f2da1257f1434dfecbae883bafb61ada2a9fea3bb" "checksum fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6cc484842f1e2884faf56f529f960cc12ad8c71ce96cc7abba0a067c98fee344" "checksum foreign-types 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e4056b9bd47f8ac5ba12be771f77a0dae796d1bbaaf5fd0b9c2d38b69b8a29d" "checksum futures 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8e51e7f9c150ba7fd4cee9df8bf6ea3dea5b63b68955ddad19ccd35b71dcfb4d" "checksum futures-cpupool 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bb982bb25cd8fa5da6a8eb3a460354c984ff1113da82bcb4f0b0862b5795db82" -"checksum gcc 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)" = "c07c758b972368e703a562686adb39125707cc1ef3399da8c019fc6c2498a75d" +"checksum gcc 0.3.51 (registry+https://github.com/rust-lang/crates.io-index)" = "120d07f202dcc3f72859422563522b66fe6463a4c513df062874daad05f85f0a" "checksum gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0912515a8ff24ba900422ecda800b52f4016a56251922d397c576bf92c690518" "checksum getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9047cfbd08a437050b363d35ef160452c5fe8ea5187ae0a624708c91581d685" "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" @@ -2996,6 +2958,7 @@ dependencies = [ "checksum lazycell 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce12306c4739d86ee97c23139f3a34ddf0387bbf181bc7929d287025a8c3ef6b" "checksum lazycell 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ec38a5c22f1ef3e30d2642aa875620d60edeef36cef43c4739d86215ce816331" "checksum libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)" = "88ee81885f9f04bff991e306fea7c1c60a5f0f9e409e99f6b40e3311a3363135" +"checksum libflate 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "59fa4619e0f202f63fde6046eafe0e754e829369c5e892abeca0c22a12dcfec9" "checksum libusb 0.3.0 (git+https://github.com/paritytech/libusb-rs)" = "" "checksum libusb-sys 0.2.3 (git+https://github.com/paritytech/libusb-sys)" = "" "checksum linked-hash-map 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bda158e0dabeb97ee8a401f4d17e479d6b891a14de0bba79d5cc2d4d325b5e48" @@ -3007,7 +2970,7 @@ dependencies = [ "checksum memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1dbccc0e46f1ea47b9f17e6d67c5a96bd27030519c519c9c91327e31275a47b4" "checksum mime 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a74cc2587bf97c49f3f5bab62860d6abf3902ca73b66b51d9b049fbdcd727bd2" "checksum mime_guess 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5e50bf542f81754ef69e5cea856946a3819f7c09ea97b4903c8bc8a89f74e7b6" -"checksum miniz-sys 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9d1f4d337a01c32e1f2122510fed46393d53ca35a7f429cb0450abaedfa3ed54" +"checksum miniz-sys 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "28eaee17666671fa872e567547e8428e83308ebe5808cdf6a0e28397dbe2c726" "checksum mio 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c8ba718a36791275c6782c0445a5f79b5ef4e68c01a4e60ac04aae28290e4957" "checksum mio-named-pipes 0.1.4 (git+https://github.com/alexcrichton/mio-named-pipes)" = "" "checksum mio-uds 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "78437f00d9615c366932cbfe79790b5c2945706ba67cf78378ffacc0069ed9de" @@ -3063,13 +3026,12 @@ dependencies = [ "checksum quine-mc_cluskey 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6683b0e23d80813b1a535841f0048c1537d3f86d63c999e8373b39a9b0eb74a" "checksum quote 0.3.10 (registry+https://github.com/rust-lang/crates.io-index)" = "6732e32663c9c271bfc7c1823486b471f18c47a2dbf87c066897b7b51afc83be" "checksum rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "2791d88c6defac799c3f20d74f094ca33b9332612d9aef9078519c82e4fe04a5" -"checksum rayon 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "50c575b58c2b109e2fbc181820cbe177474f35610ff9e357dc75f6bac854ffbf" "checksum rayon 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8c83adcb08e5b922e804fe1918142b422602ef11f2fd670b0b52218cb5984a20" "checksum rayon-core 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "767d91bacddf07d442fe39257bf04fd95897d1c47c545d009f6beb03efd038f8" "checksum regex 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4278c17d0f6d62dfef0ab00028feb45bd7d2102843f80763474eeb1be8a10c01" "checksum regex-syntax 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "841591b1e05609a643e3b4d0045fce04f701daba7151ddcd3ad47b080693d5a9" "checksum regex-syntax 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9191b1f57603095f105d317e375d19b1c9c5c3185ea9633a99a6dcbed04457" -"checksum reqwest 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3bef9ed8fdfcc30947d6b774938dc0c3f369a474efe440df2c7f278180b2d2e6" +"checksum reqwest 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1d56dbe269dbe19d716b76ec8c3efce8ef84e974f5b7e5527463e8c0507d4e17" "checksum ring 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)" = "873ec7c2b7c9bf58024eb8f1bbc40a6499cd23c1adc59532f4af9e355f1de0f3" "checksum rocksdb 0.4.5 (git+https://github.com/paritytech/rust-rocksdb)" = "" "checksum rocksdb-sys 0.3.0 (git+https://github.com/paritytech/rust-rocksdb)" = "" @@ -3077,6 +3039,7 @@ dependencies = [ "checksum rpassword 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5d3a99497c5c544e629cc8b359ae5ede321eba5fa8e5a8078f3ced727a976c3f" "checksum rpassword 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ab6e42be826e215f30ff830904f8f4a0933c6e2ae890e1af8b408f5bae60081e" "checksum rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "f76d05d3993fd5f4af9434e8e436db163a12a9d40e1a58a726f27a01dfd12a2a" +"checksum rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0ceb8ce7a5e520de349e1fa172baeba4a9e8d5ef06c47471863530bc4972ee1e" "checksum rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "6159e4e6e559c81bd706afe9c8fd68f547d3e851ce12e76b1de7914bab61691b" "checksum rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c5f5376ea5e30ce23c03eb77cbe4962b988deead10910c372b226388b594c084" "checksum rustc_version 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1e114e275f7c9b5d50bb52b28f9aac1921209f02aa6077c8b255e21eefaf8ffa" @@ -3089,14 +3052,11 @@ dependencies = [ "checksum semver 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2d5b7638a1f03815d94e88cb3b3c08e87f0db4d683ef499d1836aaf70a45623f" "checksum semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum serde 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0ae9a3c8b07c09dbe43022486d55a18c629a0618d2241e49829aaef9b6d862f9" -"checksum serde 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "991ef6be409a3b7a46cb9ee701d86156ce851825c65dbee7f16dbd5c4e7e2d47" -"checksum serde_codegen_internals 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c3172bf2940b975c0e4f6ab42a511c0a4407d4f46ccef87a9d3615db5c26fa96" -"checksum serde_derive 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ecc6e0379ca933ece58302d2d3034443f06fbf38fd535857c1dc516195cbc3bf" -"checksum serde_derive 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9fd81eef9f0b4ec341b11095335b6a4b28ed85581b12dd27585dee1529df35e0" -"checksum serde_derive_internals 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "021c338d22c7e30f957a6ab7e388cb6098499dda9fd4ba1661ee074ca7a180d1" -"checksum serde_json 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)" = "cf37ce931677e98b4fa5e6469aaa3ab4b6228309ea33b1b22d3ec055adfc4515" -"checksum serde_urlencoded 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a81f15da4b9780e1524697f73b09076b6e42298ef673bead9ca8f848b334ef84" +"checksum serde 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6a7c6b751a2e8d5df57a5ff71b5b4fc8aaee9ee28ff1341d640dd130bb5f4f7a" +"checksum serde_derive 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "2f6ca58905ebd3c3b285a8a6d4f3ac92b92c0d7951d5649b1bdd212549c06639" +"checksum serde_derive_internals 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)" = "37aee4e0da52d801acfbc0cc219eb1eda7142112339726e427926a6f6ee65d3a" +"checksum serde_json 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "48b04779552e92037212c3615370f6bd57a40ebba7f20e554ff9f55e41a69a7b" +"checksum serde_urlencoded 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ce0fd303af908732989354c6f02e05e2e6d597152870f2c6990efb0577137480" "checksum sha1 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cc30b1e1e8c40c121ca33b86c23308a090d19974ef001b4bf6e61fd1a0fb095c" "checksum shell32-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "72f20b8f3c060374edb8046591ba28f62448c369ccbdc7b02075103fb3a9e38d" "checksum siphasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c44e42fa187b5a8782489cf7740cc27c3125806be2bf33563cf5e02e9533fcd" @@ -3135,7 +3095,7 @@ dependencies = [ "checksum tokio-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "86f33def658c14724fc13ec6289b3875a8152ee8ae767a5b1ccbded363b03db8" "checksum tokio-uds 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bd209039933255ea77c6d7a1d18abc20b997d161acb900acca6eb74cdd049f31" "checksum toml 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "fcd27a04ca509aff336ba5eb2abc58d456f52c4ff64d9724d88acb85ead560b6" -"checksum toml 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a442dfc13508e603c3f763274361db7f79d7469a0e95c411cde53662ab30fc72" +"checksum toml 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b0601da6c97135c8d330c7a13a013ca6cd4143221b01de2f8d4edc50a9e551c7" "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" "checksum transient-hashmap 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "715254c8f0811be1a79ad3ea5e6fa3c8eddec2b03d7f5ba78cf093e56d79c24f" "checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" @@ -3154,7 +3114,7 @@ dependencies = [ "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" -"checksum ws 0.6.0 (git+https://github.com/tomusdrw/ws-rs)" = "" +"checksum ws 0.7.1 (git+https://github.com/tomusdrw/ws-rs)" = "" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" "checksum xdg 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "77b831a5ba77110f438f0ac5583aafeb087f70432998ba6b7dcb1d32185db453" "checksum xml-rs 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "65e74b96bd3179209dc70a980da6df843dff09e46eee103a0376c0949257e3ef" diff --git a/Cargo.toml b/Cargo.toml index d9b3734ec..429ea0dd4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,8 +9,8 @@ build = "build.rs" [dependencies] log = "0.3" env_logger = "0.4" -rustc-serialize = "0.3" -docopt = "0.7" +rustc-hex = "1.0" +docopt = "0.8" time = "0.1" num_cpus = "1.2" number_prefix = "0.2" @@ -19,9 +19,10 @@ semver = "0.6" ansi_term = "0.9" regex = "0.2" isatty = "0.1" -toml = "0.2" -serde = "0.9" -serde_json = "0.9" +toml = "0.4" +serde = "1.0" +serde_json = "1.0" +serde_derive = "1.0" app_dirs = "1.1.1" futures = "0.1" fdlimit = "0.1" diff --git a/dapps/Cargo.toml b/dapps/Cargo.toml index 429ed01f5..f34335d2f 100644 --- a/dapps/Cargo.toml +++ b/dapps/Cargo.toml @@ -17,10 +17,10 @@ parity-dapps-glue = "1.7" mime = "0.2" mime_guess = "1.6.1" rand = "0.3" -rustc-serialize = "0.3" -serde = "0.9" -serde_derive = "0.9" -serde_json = "0.9" +rustc-hex = "1.0" +serde = "1.0" +serde_derive = "1.0" +serde_json = "1.0" time = "0.1.35" unicase = "1.3" url = "1.0" diff --git a/dapps/src/apps/fetcher/mod.rs b/dapps/src/apps/fetcher/mod.rs index e1168c8d1..c0a33fe00 100644 --- a/dapps/src/apps/fetcher/mod.rs +++ b/dapps/src/apps/fetcher/mod.rs @@ -23,7 +23,7 @@ mod installers; use std::{fs, env}; use std::path::PathBuf; use std::sync::Arc; -use rustc_serialize::hex::FromHex; +use rustc_hex::FromHex; use fetch::{Client as FetchClient, Fetch}; use hash_fetch::urlhint::{URLHintContract, URLHint, URLHintResult}; use parity_reactor::Remote; diff --git a/dapps/src/lib.rs b/dapps/src/lib.rs index 1d10cdf7b..49efcd201 100644 --- a/dapps/src/lib.rs +++ b/dapps/src/lib.rs @@ -24,7 +24,7 @@ extern crate futures; extern crate linked_hash_map; extern crate mime_guess; extern crate rand; -extern crate rustc_serialize; +extern crate rustc_hex; extern crate serde; extern crate serde_json; extern crate time; diff --git a/dapps/src/tests/fetch.rs b/dapps/src/tests/fetch.rs index 51650a963..8abc86196 100644 --- a/dapps/src/tests/fetch.rs +++ b/dapps/src/tests/fetch.rs @@ -15,7 +15,7 @@ // along with Parity. If not, see . use devtools::http_client; -use rustc_serialize::hex::FromHex; +use rustc_hex::FromHex; use tests::helpers::{ serve_with_registrar, serve_with_registrar_and_sync, serve_with_fetch, serve_with_registrar_and_fetch, serve_with_registrar_and_fetch_and_threads, diff --git a/dapps/src/tests/helpers/registrar.rs b/dapps/src/tests/helpers/registrar.rs index 58aad9886..d7890675b 100644 --- a/dapps/src/tests/helpers/registrar.rs +++ b/dapps/src/tests/helpers/registrar.rs @@ -17,7 +17,7 @@ use std::str; use std::sync::Arc; use std::collections::HashMap; -use rustc_serialize::hex::FromHex; +use rustc_hex::FromHex; use hash_fetch::urlhint::ContractClient; use util::{Bytes, Address, Mutex, H256, ToPretty}; diff --git a/ethcore/Cargo.toml b/ethcore/Cargo.toml index 168cf803c..0a2909dd2 100644 --- a/ethcore/Cargo.toml +++ b/ethcore/Cargo.toml @@ -18,7 +18,7 @@ byteorder = "1.0" clippy = { version = "0.0.103", optional = true} crossbeam = "0.2.9" env_logger = "0.4" -ethabi = "1.0" +ethabi = "2.0" ethash = { path = "../ethash" } ethcore-bloom-journal = { path = "../util/bloom" } ethcore-devtools = { path = "../devtools" } @@ -46,6 +46,7 @@ num_cpus = "1.2" rand = "0.3" rlp = { path = "../util/rlp" } rust-crypto = "0.2.34" +rustc-hex = "1.0" rustc-serialize = "0.3" semver = "0.6" stats = { path = "../util/stats" } diff --git a/ethcore/native_contracts/Cargo.toml b/ethcore/native_contracts/Cargo.toml index 6b225220f..5dc18c8f5 100644 --- a/ethcore/native_contracts/Cargo.toml +++ b/ethcore/native_contracts/Cargo.toml @@ -6,7 +6,7 @@ authors = ["Parity Technologies "] build = "build.rs" [dependencies] -ethabi = "1.0" +ethabi = "2.0" futures = "0.1" byteorder = "1.0" ethcore-util = { path = "../../util" } diff --git a/ethcore/native_contracts/generator/Cargo.toml b/ethcore/native_contracts/generator/Cargo.toml index a114420f0..a599e756e 100644 --- a/ethcore/native_contracts/generator/Cargo.toml +++ b/ethcore/native_contracts/generator/Cargo.toml @@ -5,5 +5,5 @@ version = "0.1.0" authors = ["Parity Technologies "] [dependencies] -ethabi = "1.0" +ethabi = "2.0" heck = "0.2" diff --git a/ethcore/native_contracts/generator/src/lib.rs b/ethcore/native_contracts/generator/src/lib.rs index 08ce1c97b..793ad6085 100644 --- a/ethcore/native_contracts/generator/src/lib.rs +++ b/ethcore/native_contracts/generator/src/lib.rs @@ -112,7 +112,7 @@ pub fn {snake_name}(&self, call: F, {params}) -> BoxFuture<{output_type}, U: IntoFuture, Error=String>, U::Future: Send + 'static {{ - let function = self.contract.function(r#"{abi_name}"#.to_string()) + let function = self.contract.function(r#"{abi_name}"#) .expect("function existence checked at compile-time; qed"); let call_addr = self.address; diff --git a/ethcore/src/action_params.rs b/ethcore/src/action_params.rs index 9ff86418e..96f7b1136 100644 --- a/ethcore/src/action_params.rs +++ b/ethcore/src/action_params.rs @@ -48,7 +48,7 @@ pub struct ActionParams { /// Address of currently executed code. pub code_address: Address, /// Hash of currently executed code. - pub code_hash: H256, + pub code_hash: Option, /// Receive address. Usually equal to code_address, /// except when called using CALLCODE. pub address: Address, @@ -76,7 +76,7 @@ impl Default for ActionParams { fn default() -> ActionParams { ActionParams { code_address: Address::new(), - code_hash: SHA3_EMPTY, + code_hash: Some(SHA3_EMPTY), address: Address::new(), sender: Address::new(), origin: Address::new(), @@ -95,7 +95,7 @@ impl From for ActionParams { let address: Address = t.address.into(); ActionParams { code_address: Address::new(), - code_hash: (&*t.code).sha3(), + code_hash: Some((&*t.code).sha3()), address: address, sender: t.sender.into(), origin: t.origin.into(), diff --git a/ethcore/src/blockchain/blockchain.rs b/ethcore/src/blockchain/blockchain.rs index 8f66c270d..4412df567 100644 --- a/ethcore/src/blockchain/blockchain.rs +++ b/ethcore/src/blockchain/blockchain.rs @@ -1460,7 +1460,7 @@ impl BlockChain { mod tests { #![cfg_attr(feature="dev", allow(similar_names))] use std::sync::Arc; - use rustc_serialize::hex::FromHex; + use rustc_hex::FromHex; use util::kvdb::KeyValueDB; use util::hash::*; use util::sha3::Hashable; diff --git a/ethcore/src/builtin.rs b/ethcore/src/builtin.rs index 90190ac8e..084be4666 100644 --- a/ethcore/src/builtin.rs +++ b/ethcore/src/builtin.rs @@ -500,7 +500,7 @@ mod tests { use super::{Builtin, Linear, ethereum_builtin, Pricer, Modexp}; use ethjson; use util::{U256, BytesRef}; - use rustc_serialize::hex::FromHex; + use rustc_hex::FromHex; #[test] fn identity() { @@ -524,7 +524,6 @@ mod tests { #[test] fn sha256() { - use rustc_serialize::hex::FromHex; let f = ethereum_builtin("sha256"); let i = [0u8; 0]; @@ -548,7 +547,6 @@ mod tests { #[test] fn ripemd160() { - use rustc_serialize::hex::FromHex; let f = ethereum_builtin("ripemd160"); let i = [0u8; 0]; @@ -568,7 +566,6 @@ mod tests { #[test] fn ecrecover() { - use rustc_serialize::hex::FromHex; /*let k = KeyPair::from_secret(b"test".sha3()).unwrap(); let a: Address = From::from(k.public().sha3()); println!("Address: {}", a); @@ -627,7 +624,6 @@ mod tests { #[test] fn modexp() { - use rustc_serialize::hex::FromHex; let f = Builtin { pricer: Box::new(Modexp { divisor: 20 }), @@ -714,7 +710,6 @@ mod tests { #[test] fn bn128_add() { - use rustc_serialize::hex::FromHex; let f = Builtin { pricer: Box::new(Linear { base: 0, word: 0 }), @@ -776,7 +771,6 @@ mod tests { #[test] fn bn128_mul() { - use rustc_serialize::hex::FromHex; let f = Builtin { pricer: Box::new(Linear { base: 0, word: 0 }), diff --git a/ethcore/src/client/client.rs b/ethcore/src/client/client.rs index 98cefdabd..dcb9ab9f8 100644 --- a/ethcore/src/client/client.rs +++ b/ethcore/src/client/client.rs @@ -1841,7 +1841,7 @@ fn transaction_receipt(engine: &Engine, mut tx: LocalizedTransaction, mut receip gas_used: receipt.gas_used - prior_gas_used, contract_address: match tx.action { Action::Call(_) => None, - Action::Create => Some(contract_address(engine.create_address_scheme(block_number), &sender, &tx.nonce, &tx.data.sha3())) + Action::Create => Some(contract_address(engine.create_address_scheme(block_number), &sender, &tx.nonce, &tx.data).0) }, logs: receipt.logs.into_iter().enumerate().map(|(i, log)| LocalizedLogEntry { entry: log, diff --git a/ethcore/src/client/test_client.rs b/ethcore/src/client/test_client.rs index 19fdd74c8..e656e6c42 100644 --- a/ethcore/src/client/test_client.rs +++ b/ethcore/src/client/test_client.rs @@ -17,6 +17,7 @@ //! Test client. use std::sync::atomic::{AtomicUsize, Ordering as AtomicOrder}; +use rustc_hex::FromHex; use util::*; use rlp::*; use ethkey::{Generator, Random}; diff --git a/ethcore/src/engines/mod.rs b/ethcore/src/engines/mod.rs index d24325803..632ba08c3 100644 --- a/ethcore/src/engines/mod.rs +++ b/ethcore/src/engines/mod.rs @@ -434,7 +434,7 @@ pub mod common { gas_price: 0.into(), value: ActionValue::Transfer(0.into()), code: state.code(&contract_address)?, - code_hash: state.code_hash(&contract_address)?, + code_hash: Some(state.code_hash(&contract_address)?), data: data, call_type: CallType::Call, }; diff --git a/ethcore/src/engines/tendermint/mod.rs b/ethcore/src/engines/tendermint/mod.rs index 70d4e0ced..e7d0dab86 100644 --- a/ethcore/src/engines/tendermint/mod.rs +++ b/ethcore/src/engines/tendermint/mod.rs @@ -651,6 +651,7 @@ impl Engine for Tendermint { #[cfg(test)] mod tests { + use rustc_hex::FromHex; use util::*; use block::*; use error::{Error, BlockError}; diff --git a/ethcore/src/engines/validator_set/contract.rs b/ethcore/src/engines/validator_set/contract.rs index c2d3fd064..46f5c8512 100644 --- a/ethcore/src/engines/validator_set/contract.rs +++ b/ethcore/src/engines/validator_set/contract.rs @@ -126,6 +126,7 @@ impl ValidatorSet for ValidatorContract { #[cfg(test)] mod tests { + use rustc_hex::FromHex; use util::*; use rlp::encode; use spec::Spec; diff --git a/ethcore/src/engines/validator_set/safe_contract.rs b/ethcore/src/engines/validator_set/safe_contract.rs index de8d16ddc..45c9a6912 100644 --- a/ethcore/src/engines/validator_set/safe_contract.rs +++ b/ethcore/src/engines/validator_set/safe_contract.rs @@ -200,7 +200,7 @@ impl ValidatorSafeContract { // decode log manually until the native contract generator is // good enough to do it for us. - let &(_, _, ref validators_token) = &matched_event.params[1]; + let validators_token = &matched_event[1].value; let validators = validators_token.clone().to_array() .and_then(|a| a.into_iter() @@ -420,6 +420,7 @@ impl ValidatorSet for ValidatorSafeContract { #[cfg(test)] mod tests { + use rustc_hex::FromHex; use util::*; use types::ids::BlockId; use spec::Spec; diff --git a/ethcore/src/env_info.rs b/ethcore/src/env_info.rs index cc42008d5..4f6a330b0 100644 --- a/ethcore/src/env_info.rs +++ b/ethcore/src/env_info.rs @@ -76,8 +76,6 @@ impl From for EnvInfo { #[cfg(test)] mod tests { - extern crate rustc_serialize; - use std::str::FromStr; use super::*; use util::{U256, Address}; diff --git a/ethcore/src/ethereum/ethash.rs b/ethcore/src/ethereum/ethash.rs index 78f1efde4..3b48ab321 100644 --- a/ethcore/src/ethereum/ethash.rs +++ b/ethcore/src/ethereum/ethash.rs @@ -453,11 +453,14 @@ impl Ethash { let parent_has_uncles = parent.uncles_hash() != &sha3::SHA3_EMPTY_LIST_RLP; let min_difficulty = self.ethash_params.minimum_difficulty; + let difficulty_hardfork = header.number() >= self.ethash_params.difficulty_hardfork_transition; - let difficulty_bound_divisor = match difficulty_hardfork { - true => self.ethash_params.difficulty_hardfork_bound_divisor, - false => self.ethash_params.difficulty_bound_divisor, + let difficulty_bound_divisor = if difficulty_hardfork { + self.ethash_params.difficulty_hardfork_bound_divisor + } else { + self.ethash_params.difficulty_bound_divisor }; + let duration_limit = self.ethash_params.duration_limit; let frontier_limit = self.ethash_params.homestead_transition; @@ -483,7 +486,10 @@ impl Ethash { if diff_inc <= threshold { *parent.difficulty() + *parent.difficulty() / difficulty_bound_divisor * (threshold - diff_inc).into() } else { - *parent.difficulty() - *parent.difficulty() / difficulty_bound_divisor * min(diff_inc - threshold, 99).into() + let multiplier = min(diff_inc - threshold, 99).into(); + parent.difficulty().saturating_sub( + *parent.difficulty() / difficulty_bound_divisor * multiplier + ) } }; target = max(min_difficulty, target); diff --git a/ethcore/src/evm/interpreter/mod.rs b/ethcore/src/evm/interpreter/mod.rs index 72112faed..7b0becdb7 100644 --- a/ethcore/src/evm/interpreter/mod.rs +++ b/ethcore/src/evm/interpreter/mod.rs @@ -163,7 +163,8 @@ impl evm::Evm for Interpreter { match result { InstructionResult::JumpToPosition(position) => { if valid_jump_destinations.is_none() { - valid_jump_destinations = Some(self.cache.jump_destinations(¶ms.code_hash, code)); + let code_hash = params.code_hash.clone().unwrap_or_else(|| code.sha3()); + valid_jump_destinations = Some(self.cache.jump_destinations(&code_hash, code)); } let jump_destinations = valid_jump_destinations.as_ref().expect("jump_destinations are initialized on first jump; qed"); let pos = self.verify_jump(position, jump_destinations)?; diff --git a/ethcore/src/evm/interpreter/shared_cache.rs b/ethcore/src/evm/interpreter/shared_cache.rs index ed3b59340..a93afa79a 100644 --- a/ethcore/src/evm/interpreter/shared_cache.rs +++ b/ethcore/src/evm/interpreter/shared_cache.rs @@ -92,7 +92,7 @@ impl Default for SharedCache { #[test] fn test_find_jump_destinations() { - use util::FromHex; + use rustc_hex::FromHex; // given let code = "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b01600055".from_hex().unwrap(); diff --git a/ethcore/src/evm/tests.rs b/ethcore/src/evm/tests.rs index 7f3cf0e1c..b93361392 100644 --- a/ethcore/src/evm/tests.rs +++ b/ethcore/src/evm/tests.rs @@ -14,12 +14,13 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . +use std::fmt::Debug; +use rustc_hex::FromHex; use util::*; use action_params::{ActionParams, ActionValue}; use env_info::EnvInfo; use types::executed::CallType; use evm::{self, Ext, Schedule, Factory, GasLeft, VMType, ContractCreateResult, MessageCallResult, CreateContractAddress, ReturnData}; -use std::fmt::Debug; use tests::helpers::*; use types::transaction::SYSTEM_ADDRESS; use executive::Executive; @@ -462,7 +463,7 @@ fn test_blockhash_eip210(factory: super::Factory) { gas_price: 0.into(), value: ActionValue::Transfer(0.into()), code: Some(blockhash_contract_code.clone()), - code_hash: blockhash_contract_code_hash, + code_hash: Some(blockhash_contract_code_hash), data: Some(H256::from(i - 1).to_vec()), call_type: CallType::Call, }; @@ -484,7 +485,7 @@ fn test_blockhash_eip210(factory: super::Factory) { gas_price: 0.into(), value: ActionValue::Transfer(0.into()), code: Some(get_prev_hash_code), - code_hash: get_prev_hash_code_hash, + code_hash: Some(get_prev_hash_code_hash), data: None, call_type: CallType::Call, }; diff --git a/ethcore/src/executive.rs b/ethcore/src/executive.rs index b486aa8d4..0d62831d6 100644 --- a/ethcore/src/executive.rs +++ b/ethcore/src/executive.rs @@ -35,7 +35,7 @@ pub use types::executed::{Executed, ExecutionResult}; const STACK_SIZE_PER_DEPTH: usize = 24*1024; /// Returns new address created from address, nonce, and code hash -pub fn contract_address(address_scheme: CreateContractAddress, sender: &Address, nonce: &U256, code_hash: &H256) -> Address { +pub fn contract_address(address_scheme: CreateContractAddress, sender: &Address, nonce: &U256, code: &[u8]) -> (Address, Option) { use rlp::RlpStream; match address_scheme { @@ -43,18 +43,20 @@ pub fn contract_address(address_scheme: CreateContractAddress, sender: &Address, let mut stream = RlpStream::new_list(2); stream.append(sender); stream.append(nonce); - From::from(stream.as_raw().sha3()) + (From::from(stream.as_raw().sha3()), None) }, CreateContractAddress::FromCodeHash => { + let code_hash = code.sha3(); let mut buffer = [0xffu8; 20 + 32]; &mut buffer[20..].copy_from_slice(&code_hash[..]); - From::from((&buffer[..]).sha3()) + (From::from((&buffer[..]).sha3()), Some(code_hash)) }, CreateContractAddress::FromSenderAndCodeHash => { + let code_hash = code.sha3(); let mut buffer = [0u8; 20 + 32]; &mut buffer[..20].copy_from_slice(&sender[..]); &mut buffer[20..].copy_from_slice(&code_hash[..]); - From::from((&buffer[..]).sha3()) + (From::from((&buffer[..]).sha3()), Some(code_hash)) }, } } @@ -205,8 +207,7 @@ impl<'a, B: 'a + StateBackend, E: Engine + ?Sized> Executive<'a, B, E> { let (result, output) = match t.action { Action::Create => { - let code_hash = t.data.sha3(); - let new_address = contract_address(self.engine.create_address_scheme(self.info.number), &sender, &nonce, &code_hash); + let (new_address, code_hash) = contract_address(self.engine.create_address_scheme(self.info.number), &sender, &nonce, &t.data); let params = ActionParams { code_address: new_address.clone(), code_hash: code_hash, @@ -232,7 +233,7 @@ impl<'a, B: 'a + StateBackend, E: Engine + ?Sized> Executive<'a, B, E> { gas_price: t.gas_price, value: ActionValue::Transfer(t.value), code: self.state.code(address)?, - code_hash: self.state.code_hash(address)?, + code_hash: Some(self.state.code_hash(address)?), data: Some(t.data.clone()), call_type: CallType::Call, }; @@ -578,9 +579,10 @@ impl<'a, B: 'a + StateBackend, E: Engine + ?Sized> Executive<'a, B, E> { #[allow(dead_code)] mod tests { use std::sync::Arc; + use rustc_hex::FromHex; use ethkey::{Generator, Random}; use super::*; - use util::{H256, U256, U512, Address, FromHex, FromStr}; + use util::{H256, U256, U512, Address, FromStr}; use util::bytes::BytesRef; use action_params::{ActionParams, ActionValue}; use env_info::EnvInfo; @@ -599,14 +601,14 @@ mod tests { fn test_contract_address() { let address = Address::from_str("0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6").unwrap(); let expected_address = Address::from_str("3f09c73a5ed19289fb9bdc72f1742566df146f56").unwrap(); - assert_eq!(expected_address, contract_address(CreateContractAddress::FromSenderAndNonce, &address, &U256::from(88), &H256::default())); + assert_eq!(expected_address, contract_address(CreateContractAddress::FromSenderAndNonce, &address, &U256::from(88), &[]).0); } // TODO: replace params with transactions! evm_test!{test_sender_balance: test_sender_balance_jit, test_sender_balance_int} fn test_sender_balance(factory: Factory) { let sender = Address::from_str("0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6").unwrap(); - let address = contract_address(CreateContractAddress::FromSenderAndNonce, &sender, &U256::zero(), &H256::default()); + let address = contract_address(CreateContractAddress::FromSenderAndNonce, &sender, &U256::zero(), &[]).0; let mut params = ActionParams::default(); params.address = address.clone(); params.sender = sender.clone(); @@ -661,7 +663,7 @@ mod tests { let code = "7c601080600c6000396000f3006000355415600957005b60203560003555600052601d60036017f0600055".from_hex().unwrap(); let sender = Address::from_str("cd1722f3947def4cf144679da39c4c32bdc35681").unwrap(); - let address = contract_address(CreateContractAddress::FromSenderAndNonce, &sender, &U256::zero(), &H256::default()); + let address = contract_address(CreateContractAddress::FromSenderAndNonce, &sender, &U256::zero(), &[]).0; // TODO: add tests for 'callcreate' //let next_address = contract_address(&address, &U256::zero()); let mut params = ActionParams::default(); @@ -715,7 +717,7 @@ mod tests { let code = "7c601080600c6000396000f3006000355415600957005b60203560003555600052601d60036017f0600055".from_hex().unwrap(); let sender = Address::from_str("cd1722f3947def4cf144679da39c4c32bdc35681").unwrap(); - let address = contract_address(CreateContractAddress::FromSenderAndNonce, &sender, &U256::zero(), &H256::default()); + let address = contract_address(CreateContractAddress::FromSenderAndNonce, &sender, &U256::zero(), &[]).0; // TODO: add tests for 'callcreate' //let next_address = contract_address(&address, &U256::zero()); let mut params = ActionParams::default(); @@ -826,7 +828,7 @@ mod tests { let code = "601080600c6000396000f3006000355415600957005b60203560003555".from_hex().unwrap(); let sender = Address::from_str("cd1722f3947def4cf144679da39c4c32bdc35681").unwrap(); - let address = contract_address(CreateContractAddress::FromSenderAndNonce, &sender, &U256::zero(), &H256::default()); + let address = contract_address(CreateContractAddress::FromSenderAndNonce, &sender, &U256::zero(), &[]).0; // TODO: add tests for 'callcreate' //let next_address = contract_address(&address, &U256::zero()); let mut params = ActionParams::default(); @@ -913,7 +915,7 @@ mod tests { let code = "7c601080600c6000396000f3006000355415600957005b60203560003555600052601d600360e6f0600055".from_hex().unwrap(); let sender = Address::from_str("cd1722f3947def4cf144679da39c4c32bdc35681").unwrap(); - let address = contract_address(CreateContractAddress::FromSenderAndNonce, &sender, &U256::zero(), &H256::default()); + let address = contract_address(CreateContractAddress::FromSenderAndNonce, &sender, &U256::zero(), &[]).0; // TODO: add tests for 'callcreate' //let next_address = contract_address(&address, &U256::zero()); let mut params = ActionParams::default(); @@ -965,8 +967,8 @@ mod tests { let code = "7c601080600c6000396000f3006000355415600957005b60203560003555600052601d60036017f0".from_hex().unwrap(); let sender = Address::from_str("cd1722f3947def4cf144679da39c4c32bdc35681").unwrap(); - let address = contract_address(CreateContractAddress::FromSenderAndNonce, &sender, &U256::zero(), &H256::default()); - let next_address = contract_address(CreateContractAddress::FromSenderAndNonce, &address, &U256::zero(), &H256::default()); + let address = contract_address(CreateContractAddress::FromSenderAndNonce, &sender, &U256::zero(), &[]).0; + let next_address = contract_address(CreateContractAddress::FromSenderAndNonce, &address, &U256::zero(), &[]).0; let mut params = ActionParams::default(); params.address = address.clone(); params.sender = sender.clone(); @@ -1073,7 +1075,7 @@ mod tests { // 55 - sstore let sender = Address::from_str("cd1722f3947def4cf144679da39c4c32bdc35681").unwrap(); let code = "600160005401600055600060006000600060003060e05a03f1600155".from_hex().unwrap(); - let address = contract_address(CreateContractAddress::FromSenderAndNonce, &sender, &U256::zero(), &H256::default()); + let address = contract_address(CreateContractAddress::FromSenderAndNonce, &sender, &U256::zero(), &[]).0; let mut params = ActionParams::default(); params.address = address.clone(); params.gas = U256::from(100_000); @@ -1108,7 +1110,7 @@ mod tests { nonce: U256::zero() }.sign(keypair.secret(), None); let sender = t.sender(); - let contract = contract_address(CreateContractAddress::FromSenderAndNonce, &sender, &U256::zero(), &H256::default()); + let contract = contract_address(CreateContractAddress::FromSenderAndNonce, &sender, &U256::zero(), &[]).0; let mut state = get_temp_state_with_factory(factory); state.add_balance(&sender, &U256::from(18), CleanupMode::NoEmpty).unwrap(); @@ -1237,7 +1239,7 @@ mod tests { let code = "6064640fffffffff20600055".from_hex().unwrap(); let sender = Address::from_str("0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6").unwrap(); - let address = contract_address(CreateContractAddress::FromSenderAndNonce, &sender, &U256::zero(), &H256::default()); + let address = contract_address(CreateContractAddress::FromSenderAndNonce, &sender, &U256::zero(), &[]).0; // TODO: add tests for 'callcreate' //let next_address = contract_address(&address, &U256::zero()); let mut params = ActionParams::default(); diff --git a/ethcore/src/externalities.rs b/ethcore/src/externalities.rs index 6abb6e3fa..3d30abf2a 100644 --- a/ethcore/src/externalities.rs +++ b/ethcore/src/externalities.rs @@ -157,7 +157,7 @@ impl<'a, T: 'a, V: 'a, B: 'a, E: 'a> Ext for Externalities<'a, T, V, B, E> gas: self.engine.params().eip210_contract_gas, gas_price: 0.into(), code: code, - code_hash: code_hash, + code_hash: Some(code_hash), data: Some(H256::from(number).to_vec()), call_type: CallType::Call, }; @@ -187,9 +187,8 @@ impl<'a, T: 'a, V: 'a, B: 'a, E: 'a> Ext for Externalities<'a, T, V, B, E> fn create(&mut self, gas: &U256, value: &U256, code: &[u8], address_scheme: CreateContractAddress) -> ContractCreateResult { // create new contract address - let code_hash = code.sha3(); - let address = match self.state.nonce(&self.origin_info.address) { - Ok(nonce) => contract_address(address_scheme, &self.origin_info.address, &nonce, &code_hash), + let (address, code_hash) = match self.state.nonce(&self.origin_info.address) { + Ok(nonce) => contract_address(address_scheme, &self.origin_info.address, &nonce, &code), Err(e) => { debug!(target: "ext", "Database corruption encountered: {:?}", e); return ContractCreateResult::Failed @@ -258,7 +257,7 @@ impl<'a, T: 'a, V: 'a, B: 'a, E: 'a> Ext for Externalities<'a, T, V, B, E> gas: *gas, gas_price: self.origin_info.gas_price, code: code, - code_hash: code_hash, + code_hash: Some(code_hash), data: Some(data.to_vec()), call_type: call_type, }; diff --git a/ethcore/src/header.rs b/ethcore/src/header.rs index aa114c01e..f5bf1dcfd 100644 --- a/ethcore/src/header.rs +++ b/ethcore/src/header.rs @@ -305,7 +305,7 @@ impl HeapSizeOf for Header { #[cfg(test)] mod tests { - use rustc_serialize::hex::FromHex; + use rustc_hex::FromHex; use rlp; use super::Header; diff --git a/ethcore/src/json_tests/executive.rs b/ethcore/src/json_tests/executive.rs index 7e37818f2..b7fad2787 100644 --- a/ethcore/src/json_tests/executive.rs +++ b/ethcore/src/json_tests/executive.rs @@ -123,7 +123,7 @@ impl<'a, T: 'a, V: 'a, B: 'a, E: 'a> Ext for TestExt<'a, T, V, B, E> gas_limit: *gas, value: *value }); - let contract_address = contract_address(address, &self.sender, &self.nonce, &code.sha3()); + let contract_address = contract_address(address, &self.sender, &self.nonce, &code).0; ContractCreateResult::Created(contract_address, *gas) } diff --git a/ethcore/src/lib.rs b/ethcore/src/lib.rs index 7dc49fff8..746a737bf 100644 --- a/ethcore/src/lib.rs +++ b/ethcore/src/lib.rs @@ -99,6 +99,7 @@ extern crate num_cpus; extern crate num; extern crate rand; extern crate rlp; +extern crate rustc_hex; extern crate rustc_serialize; extern crate semver; extern crate stats; diff --git a/ethcore/src/miner/banning_queue.rs b/ethcore/src/miner/banning_queue.rs index 20b46d760..46d7e7cf8 100644 --- a/ethcore/src/miner/banning_queue.rs +++ b/ethcore/src/miner/banning_queue.rs @@ -209,13 +209,14 @@ impl DerefMut for BanningTransactionQueue { #[cfg(test)] mod tests { use std::time::Duration; + use rustc_hex::FromHex; use super::{BanningTransactionQueue, Threshold}; use ethkey::{Random, Generator}; use transaction::{Transaction, SignedTransaction, Action}; use error::{Error, TransactionError}; use client::TransactionImportResult; use miner::{TransactionQueue, TransactionOrigin}; - use util::{U256, Address, FromHex, Hashable}; + use util::{U256, Address, Hashable}; use miner::transaction_queue::test::DummyTransactionDetailsProvider; fn queue() -> BanningTransactionQueue { diff --git a/ethcore/src/miner/miner.rs b/ethcore/src/miner/miner.rs index c772490ba..df28265cc 100644 --- a/ethcore/src/miner/miner.rs +++ b/ethcore/src/miner/miner.rs @@ -1051,7 +1051,7 @@ impl MinerService for Miner { Action::Call(_) => None, Action::Create => { let sender = tx.sender(); - Some(contract_address(self.engine.create_address_scheme(pending.header().number()), &sender, &tx.nonce, &tx.data.sha3())) + Some(contract_address(self.engine.create_address_scheme(pending.header().number()), &sender, &tx.nonce, &tx.data).0) } }, logs: receipt.logs.clone(), @@ -1261,10 +1261,11 @@ mod tests { use std::sync::Arc; use std::time::Duration; + use rustc_hex::FromHex; use super::super::{MinerService, PrioritizationStrategy}; use super::*; use block::IsBlock; - use util::{U256, FromHex}; + use util::U256; use ethkey::{Generator, Random}; use client::{BlockChainClient, TestBlockChainClient, EachBlockWith, TransactionImportResult}; use header::BlockNumber; diff --git a/ethcore/src/miner/transaction_queue.rs b/ethcore/src/miner/transaction_queue.rs index d833f8f6a..8da9f7150 100644 --- a/ethcore/src/miner/transaction_queue.rs +++ b/ethcore/src/miner/transaction_queue.rs @@ -27,13 +27,13 @@ //! extern crate ethcore_util as util; //! extern crate ethcore; //! extern crate ethkey; -//! extern crate rustc_serialize; +//! extern crate rustc_hex; //! //! use util::{U256, Address}; //! use ethkey::{Random, Generator}; //! use ethcore::miner::{TransactionQueue, RemovalReason, TransactionQueueDetailsProvider, AccountDetails, TransactionOrigin}; //! use ethcore::transaction::*; -//! use rustc_serialize::hex::FromHex; +//! use rustc_hex::FromHex; //! //! #[derive(Default)] //! struct DummyTransactionDetailsProvider; @@ -1422,7 +1422,7 @@ fn check_if_removed(sender: &Address, nonce: &U256, dropped: Option for PendingTransaction { #[test] fn sender_test() { - let t: UnverifiedTransaction = decode(&::rustc_serialize::hex::FromHex::from_hex("f85f800182520894095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba048b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353a0efffd310ac743f371de3b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804").unwrap()); + let t: UnverifiedTransaction = decode(&::rustc_hex::FromHex::from_hex("f85f800182520894095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba048b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353a0efffd310ac743f371de3b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804").unwrap()); assert_eq!(t.data, b""); assert_eq!(t.gas, U256::from(0x5208u64)); assert_eq!(t.gas_price, U256::from(0x01u64)); @@ -612,7 +612,7 @@ fn should_recover_from_network_specific_signing() { #[test] fn should_agree_with_vitalik() { - use rustc_serialize::hex::FromHex; + use rustc_hex::FromHex; let test_vector = |tx_data: &str, address: &'static str| { let signed = decode(&FromHex::from_hex(tx_data).unwrap()); diff --git a/ethcore/src/views/block.rs b/ethcore/src/views/block.rs index 463eb7240..f00ca548f 100644 --- a/ethcore/src/views/block.rs +++ b/ethcore/src/views/block.rs @@ -163,7 +163,7 @@ impl<'a> Hashable for BlockView<'a> { #[cfg(test)] mod tests { use std::str::FromStr; - use rustc_serialize::hex::FromHex; + use rustc_hex::FromHex; use util::H256; use super::BlockView; diff --git a/ethcore/src/views/body.rs b/ethcore/src/views/body.rs index c32796628..038e152b0 100644 --- a/ethcore/src/views/body.rs +++ b/ethcore/src/views/body.rs @@ -130,7 +130,7 @@ impl<'a> BodyView<'a> { #[cfg(test)] mod tests { - use util::*; + use rustc_hex::FromHex; use super::BodyView; use blockchain::BlockChain; diff --git a/ethcore/src/views/header.rs b/ethcore/src/views/header.rs index 618728525..4506d98ec 100644 --- a/ethcore/src/views/header.rs +++ b/ethcore/src/views/header.rs @@ -104,7 +104,7 @@ impl<'a> Hashable for HeaderView<'a> { #[cfg(test)] mod tests { use std::str::FromStr; - use rustc_serialize::hex::FromHex; + use rustc_hex::FromHex; use util::{H256, Address, H2048, U256}; use super::HeaderView; diff --git a/ethcore/src/views/transaction.rs b/ethcore/src/views/transaction.rs index 0b5b2e1ff..11c7fc2f1 100644 --- a/ethcore/src/views/transaction.rs +++ b/ethcore/src/views/transaction.rs @@ -77,7 +77,7 @@ impl<'a> Hashable for TransactionView<'a> { #[cfg(test)] mod tests { use std::str::FromStr; - use rustc_serialize::hex::FromHex; + use rustc_hex::FromHex; use util::U256; use super::TransactionView; diff --git a/ethkey/Cargo.toml b/ethkey/Cargo.toml index 7d038a7f7..342410adc 100644 --- a/ethkey/Cargo.toml +++ b/ethkey/Cargo.toml @@ -8,7 +8,7 @@ rand = "0.3.14" lazy_static = "0.2" tiny-keccak = "1.2" eth-secp256k1 = { git = "https://github.com/paritytech/rust-secp256k1" } -rustc-serialize = "0.3" +rustc-hex = "1.0" ethcore-bigint = { path = "../util/bigint" } rust-crypto = "0.2" byteorder = "1.0" diff --git a/ethkey/cli/Cargo.toml b/ethkey/cli/Cargo.toml index 01cc9849f..3ea931e25 100644 --- a/ethkey/cli/Cargo.toml +++ b/ethkey/cli/Cargo.toml @@ -5,8 +5,10 @@ authors = ["Parity Technologies "] [dependencies] ethkey = { path = "../" } -rustc-serialize = "0.3" -docopt = "0.7" +serde = "1.0" +serde_derive = "1.0" +rustc-hex = "1.0" +docopt = "0.8" [[bin]] name = "ethkey" diff --git a/ethkey/cli/src/main.rs b/ethkey/cli/src/main.rs index 757c8198f..0d96c2a89 100644 --- a/ethkey/cli/src/main.rs +++ b/ethkey/cli/src/main.rs @@ -15,13 +15,16 @@ // along with Parity. If not, see . extern crate docopt; -extern crate rustc_serialize; +extern crate rustc_hex; +extern crate serde; +#[macro_use] +extern crate serde_derive; extern crate ethkey; use std::{env, fmt, process}; use std::num::ParseIntError; use docopt::Docopt; -use rustc_serialize::hex::{FromHex, FromHexError}; +use rustc_hex::{FromHex, FromHexError}; use ethkey::{KeyPair, Random, Brain, Prefix, Error as EthkeyError, Generator, sign, verify_public, verify_address}; pub const USAGE: &'static str = r#" @@ -54,7 +57,7 @@ Commands: verify Verify signer of the signature. "#; -#[derive(Debug, RustcDecodable)] +#[derive(Debug, Deserialize)] struct Args { cmd_info: bool, cmd_generate: bool, @@ -83,6 +86,7 @@ enum Error { Ethkey(EthkeyError), FromHex(FromHexError), ParseInt(ParseIntError), + Docopt(docopt::Error), } impl From for Error { @@ -103,12 +107,19 @@ impl From for Error { } } +impl From for Error { + fn from(err: docopt::Error) -> Self { + Error::Docopt(err) + } +} + impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { match *self { Error::Ethkey(ref e) => write!(f, "{}", e), Error::FromHex(ref e) => write!(f, "{}", e), Error::ParseInt(ref e) => write!(f, "{}", e), + Error::Docopt(ref e) => write!(f, "{}", e), } } } @@ -155,8 +166,7 @@ fn display(keypair: KeyPair, mode: DisplayMode) -> String { fn execute(command: I) -> Result where I: IntoIterator, S: AsRef { let args: Args = Docopt::new(USAGE) - .and_then(|d| d.argv(command).decode()) - .unwrap_or_else(|e| e.exit()); + .and_then(|d| d.argv(command).deserialize())?; return if args.cmd_info { let display_mode = DisplayMode::new(&args); diff --git a/ethkey/src/keypair.rs b/ethkey/src/keypair.rs index 8975063d5..5a13d476b 100644 --- a/ethkey/src/keypair.rs +++ b/ethkey/src/keypair.rs @@ -16,7 +16,7 @@ use std::fmt; use secp256k1::key; -use rustc_serialize::hex::ToHex; +use rustc_hex::ToHex; use keccak::Keccak256; use super::{Secret, Public, Address, SECP256K1, Error}; diff --git a/ethkey/src/lib.rs b/ethkey/src/lib.rs index 60039b671..e87e198df 100644 --- a/ethkey/src/lib.rs +++ b/ethkey/src/lib.rs @@ -19,7 +19,7 @@ extern crate rand; extern crate lazy_static; extern crate tiny_keccak; extern crate secp256k1; -extern crate rustc_serialize; +extern crate rustc_hex; extern crate ethcore_bigint as bigint; extern crate crypto as rcrypto; extern crate byteorder; diff --git a/ethkey/src/secret.rs b/ethkey/src/secret.rs index de35d6b04..982962684 100644 --- a/ethkey/src/secret.rs +++ b/ethkey/src/secret.rs @@ -92,6 +92,15 @@ impl Secret { Ok(()) } + /// Inplace negate secret key (-scalar) + pub fn neg(&mut self) -> Result<(), Error> { + let mut key_secret = self.to_secp256k1_secret()?; + key_secret.mul_assign(&SECP256K1, &key::MINUS_ONE_KEY)?; + + *self = key_secret.into(); + Ok(()) + } + /// Inplace inverse secret key (1 / scalar) pub fn inv(&mut self) -> Result<(), Error> { let mut key_secret = self.to_secp256k1_secret()?; diff --git a/ethkey/src/signature.rs b/ethkey/src/signature.rs index 91fe3e2a3..67115c98b 100644 --- a/ethkey/src/signature.rs +++ b/ethkey/src/signature.rs @@ -21,7 +21,7 @@ use std::str::FromStr; use std::hash::{Hash, Hasher}; use secp256k1::{Message as SecpMessage, RecoverableSignature, RecoveryId, Error as SecpError}; use secp256k1::key::{SecretKey, PublicKey}; -use rustc_serialize::hex::{ToHex, FromHex}; +use rustc_hex::{ToHex, FromHex}; use bigint::hash::{H520, H256}; use {Secret, Public, SECP256K1, Error, Message, public_to_address, Address}; diff --git a/ethstore/Cargo.toml b/ethstore/Cargo.toml index a2efaf286..117332022 100755 --- a/ethstore/Cargo.toml +++ b/ethstore/Cargo.toml @@ -8,10 +8,10 @@ log = "0.3" libc = "0.2" rand = "0.3" ethkey = { path = "../ethkey" } -serde = "0.9" -serde_json = "0.9" -serde_derive = "0.9" -rustc-serialize = "0.3" +serde = "1.0" +serde_json = "1.0" +serde_derive = "1.0" +rustc-hex = "1.0" rust-crypto = "0.2.36" tiny-keccak = "1.0" time = "0.1.34" diff --git a/ethstore/cli/Cargo.toml b/ethstore/cli/Cargo.toml index 28e210cec..80d20f792 100644 --- a/ethstore/cli/Cargo.toml +++ b/ethstore/cli/Cargo.toml @@ -4,8 +4,10 @@ version = "0.1.0" authors = ["Parity Technologies "] [dependencies] -rustc-serialize = "0.3" -docopt = "0.7" +rustc-hex = "1.0" +serde = "1.0" +serde_derive = "1.0" +docopt = "0.8" ethstore = { path = "../" } [[bin]] diff --git a/ethstore/cli/src/main.rs b/ethstore/cli/src/main.rs index 3e8df3a35..06ebfcd20 100644 --- a/ethstore/cli/src/main.rs +++ b/ethstore/cli/src/main.rs @@ -14,16 +14,19 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -extern crate rustc_serialize; +extern crate rustc_hex; extern crate docopt; +extern crate serde; +#[macro_use] +extern crate serde_derive; extern crate ethstore; -use std::{env, process, fs}; +use std::{env, process, fs, fmt}; use std::io::Read; use docopt::Docopt; use ethstore::ethkey::Address; use ethstore::dir::{paths, KeyDirectory, RootDiskDirectory}; -use ethstore::{EthStore, SimpleSecretStore, SecretStore, import_accounts, Error, PresaleWallet, +use ethstore::{EthStore, SimpleSecretStore, SecretStore, import_accounts, PresaleWallet, SecretVaultRef, StoreAccountRef}; pub const USAGE: &'static str = r#" @@ -75,7 +78,7 @@ Commands: move-from-vault Move account to root directory from given vault. "#; -#[derive(Debug, RustcDecodable)] +#[derive(Debug, Deserialize)] struct Args { cmd_insert: bool, cmd_change_pwd: bool, @@ -104,6 +107,32 @@ struct Args { flag_vault_pwd: String, } +enum Error { + Ethstore(ethstore::Error), + Docopt(docopt::Error), +} + +impl From for Error { + fn from(err: ethstore::Error) -> Self { + Error::Ethstore(err) + } +} + +impl From for Error { + fn from(err: docopt::Error) -> Self { + Error::Docopt(err) + } +} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + Error::Ethstore(ref err) => fmt::Display::fmt(err, f), + Error::Docopt(ref err) => fmt::Display::fmt(err, f), + } + } +} + fn main() { match execute(env::args()) { Ok(result) => println!("{}", result), @@ -159,9 +188,9 @@ fn format_vaults(vaults: &[String]) -> String { } fn load_password(path: &str) -> Result { - let mut file = fs::File::open(path).map_err(|e| Error::Custom(format!("Error opening password file {}: {}", path, e)))?; + let mut file = fs::File::open(path).map_err(|e| ethstore::Error::Custom(format!("Error opening password file {}: {}", path, e)))?; let mut password = String::new(); - file.read_to_string(&mut password).map_err(|e| Error::Custom(format!("Error reading password file {}: {}", path, e)))?; + file.read_to_string(&mut password).map_err(|e| ethstore::Error::Custom(format!("Error reading password file {}: {}", path, e)))?; // drop EOF let _ = password.pop(); Ok(password) @@ -169,19 +198,18 @@ fn load_password(path: &str) -> Result { fn execute(command: I) -> Result where I: IntoIterator, S: AsRef { let args: Args = Docopt::new(USAGE) - .and_then(|d| d.argv(command).decode()) - .unwrap_or_else(|e| e.exit()); + .and_then(|d| d.argv(command).deserialize())?; let store = EthStore::open(key_dir(&args.flag_dir)?)?; return if args.cmd_insert { - let secret = args.arg_secret.parse().map_err(|_| Error::InvalidSecret)?; + let secret = args.arg_secret.parse().map_err(|_| ethstore::Error::InvalidSecret)?; let password = load_password(&args.arg_password)?; let vault_ref = open_args_vault(&store, &args)?; let address = store.insert_account(vault_ref, secret, &password)?; Ok(format!("0x{:?}", address)) } else if args.cmd_change_pwd { - let address = args.arg_address.parse().map_err(|_| Error::InvalidAccount)?; + let address = args.arg_address.parse().map_err(|_| ethstore::Error::InvalidAccount)?; let old_pwd = load_password(&args.arg_old_pwd)?; let new_pwd = load_password(&args.arg_new_pwd)?; let account_ref = open_args_vault_account(&store, address, &args)?; @@ -209,20 +237,20 @@ fn execute(command: I) -> Result where I: IntoIterator(command: I) -> Result where I: IntoIterator); @@ -30,9 +30,9 @@ impl ops::Deref for Bytes { } } -impl Deserialize for Bytes { +impl<'a> Deserialize<'a> for Bytes { fn deserialize(deserializer: D) -> Result - where D: Deserializer + where D: Deserializer<'a> { let s = String::deserialize(deserializer)?; let data = s.from_hex().map_err(|e| Error::custom(format!("Invalid hex value {}", e)))?; diff --git a/ethstore/src/json/cipher.rs b/ethstore/src/json/cipher.rs index 3505a3e81..33f4ec572 100644 --- a/ethstore/src/json/cipher.rs +++ b/ethstore/src/json/cipher.rs @@ -33,16 +33,16 @@ impl Serialize for CipherSer { } } -impl Deserialize for CipherSer { +impl<'a> Deserialize<'a> for CipherSer { fn deserialize(deserializer: D) -> Result - where D: Deserializer { - deserializer.deserialize(CipherSerVisitor) + where D: Deserializer<'a> { + deserializer.deserialize_any(CipherSerVisitor) } } struct CipherSerVisitor; -impl Visitor for CipherSerVisitor { +impl<'a> Visitor<'a> for CipherSerVisitor { type Value = CipherSer; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { @@ -80,9 +80,9 @@ impl Serialize for CipherSerParams { } } -impl Deserialize for CipherSerParams { +impl<'a> Deserialize<'a> for CipherSerParams { fn deserialize(deserializer: D) -> Result - where D: Deserializer { + where D: Deserializer<'a> { Aes128Ctr::deserialize(deserializer) .map(CipherSerParams::Aes128Ctr) .map_err(|_| Error::InvalidCipherParams) diff --git a/ethstore/src/json/crypto.rs b/ethstore/src/json/crypto.rs index ee1f08502..03f72e576 100644 --- a/ethstore/src/json/crypto.rs +++ b/ethstore/src/json/crypto.rs @@ -17,7 +17,7 @@ use std::{fmt, str}; use serde::{Deserialize, Deserializer, Serialize, Serializer}; use serde::ser::SerializeStruct; -use serde::de::{Visitor, MapVisitor, Error}; +use serde::de::{Visitor, MapAccess, Error}; use serde_json; use super::{Cipher, CipherSer, CipherSerParams, Kdf, KdfSer, KdfSerParams, H256, Bytes}; @@ -54,17 +54,17 @@ enum CryptoField { Mac, } -impl Deserialize for CryptoField { +impl<'a> Deserialize<'a> for CryptoField { fn deserialize(deserializer: D) -> Result - where D: Deserializer + where D: Deserializer<'a> { - deserializer.deserialize(CryptoFieldVisitor) + deserializer.deserialize_any(CryptoFieldVisitor) } } struct CryptoFieldVisitor; -impl Visitor for CryptoFieldVisitor { +impl<'a> Visitor<'a> for CryptoFieldVisitor { type Value = CryptoField; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { @@ -86,9 +86,9 @@ impl Visitor for CryptoFieldVisitor { } } -impl Deserialize for Crypto { +impl<'a> Deserialize<'a> for Crypto { fn deserialize(deserializer: D) -> Result - where D: Deserializer + where D: Deserializer<'a> { static FIELDS: &'static [&'static str] = &["id", "version", "crypto", "Crypto", "address"]; deserializer.deserialize_struct("Crypto", FIELDS, CryptoVisitor) @@ -97,7 +97,7 @@ impl Deserialize for Crypto { struct CryptoVisitor; -impl Visitor for CryptoVisitor { +impl<'a> Visitor<'a> for CryptoVisitor { type Value = Crypto; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { @@ -105,7 +105,7 @@ impl Visitor for CryptoVisitor { } fn visit_map(self, mut visitor: V) -> Result - where V: MapVisitor + where V: MapAccess<'a> { let mut cipher = None; let mut cipherparams = None; @@ -115,13 +115,13 @@ impl Visitor for CryptoVisitor { let mut mac = None; loop { - match visitor.visit_key()? { - Some(CryptoField::Cipher) => { cipher = Some(visitor.visit_value()?); } - Some(CryptoField::CipherParams) => { cipherparams = Some(visitor.visit_value()?); } - Some(CryptoField::CipherText) => { ciphertext = Some(visitor.visit_value()?); } - Some(CryptoField::Kdf) => { kdf = Some(visitor.visit_value()?); } - Some(CryptoField::KdfParams) => { kdfparams = Some(visitor.visit_value()?); } - Some(CryptoField::Mac) => { mac = Some(visitor.visit_value()?); } + match visitor.next_key()? { + Some(CryptoField::Cipher) => { cipher = Some(visitor.next_value()?); } + Some(CryptoField::CipherParams) => { cipherparams = Some(visitor.next_value()?); } + Some(CryptoField::CipherText) => { ciphertext = Some(visitor.next_value()?); } + Some(CryptoField::Kdf) => { kdf = Some(visitor.next_value()?); } + Some(CryptoField::KdfParams) => { kdfparams = Some(visitor.next_value()?); } + Some(CryptoField::Mac) => { mac = Some(visitor.next_value()?); } None => { break; } } } diff --git a/ethstore/src/json/hash.rs b/ethstore/src/json/hash.rs index 328f155c2..13564c95d 100644 --- a/ethstore/src/json/hash.rs +++ b/ethstore/src/json/hash.rs @@ -15,7 +15,7 @@ // along with Parity. If not, see . use std::{ops, fmt, str}; -use rustc_serialize::hex::{FromHex, ToHex}; +use rustc_hex::{FromHex, ToHex}; use serde::{Serialize, Serializer, Deserialize, Deserializer}; use serde::de::{Visitor, Error as SerdeError}; use super::Error; @@ -54,12 +54,12 @@ macro_rules! impl_hash { } } - impl Deserialize for $name { + impl<'a> Deserialize<'a> for $name { fn deserialize(deserializer: D) -> Result - where D: Deserializer { + where D: Deserializer<'a> { struct HashVisitor; - impl Visitor for HashVisitor { + impl<'b> Visitor<'b> for HashVisitor { type Value = $name; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { @@ -75,7 +75,7 @@ macro_rules! impl_hash { } } - deserializer.deserialize(HashVisitor) + deserializer.deserialize_any(HashVisitor) } } diff --git a/ethstore/src/json/id.rs b/ethstore/src/json/id.rs index 8dfcc3028..aa90a4d7a 100644 --- a/ethstore/src/json/id.rs +++ b/ethstore/src/json/id.rs @@ -16,7 +16,7 @@ //! Universaly unique identifier. use std::{fmt, str}; -use rustc_serialize::hex::{ToHex, FromHex}; +use rustc_hex::{ToHex, FromHex}; use serde::{Deserialize, Serialize, Deserializer, Serializer}; use serde::de::{Visitor, Error as SerdeError}; use super::Error; @@ -108,16 +108,16 @@ impl Serialize for Uuid { } } -impl Deserialize for Uuid { +impl<'a> Deserialize<'a> for Uuid { fn deserialize(deserializer: D) -> Result - where D: Deserializer { - deserializer.deserialize(UuidVisitor) + where D: Deserializer<'a> { + deserializer.deserialize_any(UuidVisitor) } } struct UuidVisitor; -impl Visitor for UuidVisitor { +impl<'a> Visitor<'a> for UuidVisitor { type Value = Uuid; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { diff --git a/ethstore/src/json/kdf.rs b/ethstore/src/json/kdf.rs index 9130fe507..6498323be 100644 --- a/ethstore/src/json/kdf.rs +++ b/ethstore/src/json/kdf.rs @@ -35,16 +35,16 @@ impl Serialize for KdfSer { } } -impl Deserialize for KdfSer { +impl<'a> Deserialize<'a> for KdfSer { fn deserialize(deserializer: D) -> Result - where D: Deserializer { - deserializer.deserialize(KdfSerVisitor) + where D: Deserializer<'a> { + deserializer.deserialize_any(KdfSerVisitor) } } struct KdfSerVisitor; -impl Visitor for KdfSerVisitor { +impl<'a> Visitor<'a> for KdfSerVisitor { type Value = KdfSer; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { @@ -78,16 +78,16 @@ impl Serialize for Prf { } } -impl Deserialize for Prf { +impl<'a> Deserialize<'a> for Prf { fn deserialize(deserializer: D) -> Result - where D: Deserializer { - deserializer.deserialize(PrfVisitor) + where D: Deserializer<'a> { + deserializer.deserialize_any(PrfVisitor) } } struct PrfVisitor; -impl Visitor for PrfVisitor { +impl<'a> Visitor<'a> for PrfVisitor { type Value = Prf; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { @@ -139,9 +139,9 @@ impl Serialize for KdfSerParams { } } -impl Deserialize for KdfSerParams { +impl<'a> Deserialize<'a> for KdfSerParams { fn deserialize(deserializer: D) -> Result - where D: Deserializer { + where D: Deserializer<'a> { use serde_json::{Value, from_value}; let v: Value = Deserialize::deserialize(deserializer)?; diff --git a/ethstore/src/json/key_file.rs b/ethstore/src/json/key_file.rs index a1c20acf2..60b34681e 100644 --- a/ethstore/src/json/key_file.rs +++ b/ethstore/src/json/key_file.rs @@ -17,7 +17,7 @@ use std::fmt; use std::io::{Read, Write}; use serde::{Serialize, Serializer, Deserialize, Deserializer}; -use serde::de::{Error, Visitor, MapVisitor}; +use serde::de::{Error, Visitor, MapAccess, DeserializeOwned}; use serde_json; use super::{Uuid, Version, Crypto, H160}; @@ -60,17 +60,17 @@ enum KeyFileField { Meta, } -impl Deserialize for KeyFileField { +impl<'a> Deserialize<'a> for KeyFileField { fn deserialize(deserializer: D) -> Result - where D: Deserializer + where D: Deserializer<'a> { - deserializer.deserialize(KeyFileFieldVisitor) + deserializer.deserialize_any(KeyFileFieldVisitor) } } struct KeyFileFieldVisitor; -impl Visitor for KeyFileFieldVisitor { +impl<'a> Visitor<'a> for KeyFileFieldVisitor { type Value = KeyFileField; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { @@ -93,9 +93,9 @@ impl Visitor for KeyFileFieldVisitor { } } -impl Deserialize for KeyFile { +impl<'a> Deserialize<'a> for KeyFile { fn deserialize(deserializer: D) -> Result - where D: Deserializer + where D: Deserializer<'a> { static FIELDS: &'static [&'static str] = &["id", "version", "crypto", "Crypto", "address"]; deserializer.deserialize_struct("KeyFile", FIELDS, KeyFileVisitor) @@ -103,8 +103,8 @@ impl Deserialize for KeyFile { } -fn none_if_empty(v: Option) -> Option where - T: Deserialize, +fn none_if_empty<'a, T>(v: Option) -> Option where + T: DeserializeOwned { v.and_then(|v| if v.is_null() { None @@ -115,7 +115,7 @@ fn none_if_empty(v: Option) -> Option where } struct KeyFileVisitor; -impl Visitor for KeyFileVisitor { +impl<'a> Visitor<'a> for KeyFileVisitor { type Value = KeyFile; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { @@ -123,7 +123,7 @@ impl Visitor for KeyFileVisitor { } fn visit_map(self, mut visitor: V) -> Result - where V: MapVisitor + where V: MapAccess<'a> { let mut id = None; let mut version = None; @@ -133,13 +133,13 @@ impl Visitor for KeyFileVisitor { let mut meta = None; loop { - match visitor.visit_key()? { - Some(KeyFileField::Id) => { id = Some(visitor.visit_value()?); } - Some(KeyFileField::Version) => { version = Some(visitor.visit_value()?); } - Some(KeyFileField::Crypto) => { crypto = Some(visitor.visit_value()?); } - Some(KeyFileField::Address) => { address = Some(visitor.visit_value()?); } - Some(KeyFileField::Name) => { name = none_if_empty(visitor.visit_value().ok()) } - Some(KeyFileField::Meta) => { meta = none_if_empty(visitor.visit_value().ok()) } + match visitor.next_key()? { + Some(KeyFileField::Id) => { id = Some(visitor.next_value()?); } + Some(KeyFileField::Version) => { version = Some(visitor.next_value()?); } + Some(KeyFileField::Crypto) => { crypto = Some(visitor.next_value()?); } + Some(KeyFileField::Address) => { address = Some(visitor.next_value()?); } + Some(KeyFileField::Name) => { name = none_if_empty(visitor.next_value().ok()) } + Some(KeyFileField::Meta) => { meta = none_if_empty(visitor.next_value().ok()) } None => { break; } } } diff --git a/ethstore/src/json/version.rs b/ethstore/src/json/version.rs index 68f0834a9..0eb8450f1 100644 --- a/ethstore/src/json/version.rs +++ b/ethstore/src/json/version.rs @@ -33,16 +33,16 @@ impl Serialize for Version { } } -impl Deserialize for Version { +impl<'a> Deserialize<'a> for Version { fn deserialize(deserializer: D) -> Result - where D: Deserializer { - deserializer.deserialize(VersionVisitor) + where D: Deserializer<'a> { + deserializer.deserialize_any(VersionVisitor) } } struct VersionVisitor; -impl Visitor for VersionVisitor { +impl<'a> Visitor<'a> for VersionVisitor { type Value = Version; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { diff --git a/ethstore/src/lib.rs b/ethstore/src/lib.rs index 06a8259de..65935f89c 100755 --- a/ethstore/src/lib.rs +++ b/ethstore/src/lib.rs @@ -23,7 +23,7 @@ extern crate itertools; extern crate libc; extern crate parking_lot; extern crate rand; -extern crate rustc_serialize; +extern crate rustc_hex; extern crate serde; extern crate serde_json; extern crate smallvec; diff --git a/evmbin/Cargo.toml b/evmbin/Cargo.toml index 55defab7b..43f3ee38f 100644 --- a/evmbin/Cargo.toml +++ b/evmbin/Cargo.toml @@ -9,8 +9,10 @@ name = "parity-evm" path = "./src/main.rs" [dependencies] -rustc-serialize = "0.3" -docopt = { version = "0.7" } +rustc-hex = "1.0" +docopt = "0.8" +serde = "1.0" +serde_derive = "1.0" ethcore = { path = "../ethcore" } ethcore-util = { path = "../util" } diff --git a/evmbin/benches/mod.rs b/evmbin/benches/mod.rs index 7ddc50681..a3017c37e 100644 --- a/evmbin/benches/mod.rs +++ b/evmbin/benches/mod.rs @@ -26,14 +26,14 @@ extern crate test; extern crate ethcore; extern crate evm; extern crate ethcore_util; -extern crate rustc_serialize; +extern crate rustc_hex; use self::test::{Bencher, black_box}; use evm::run_vm; use ethcore::action_params::ActionParams; use ethcore_util::U256; -use rustc_serialize::hex::FromHex; +use rustc_hex::FromHex; #[bench] fn simple_loop_usize(b: &mut Bencher) { diff --git a/evmbin/src/display/json.rs b/evmbin/src/display/json.rs index 38265c14c..1791640d6 100644 --- a/evmbin/src/display/json.rs +++ b/evmbin/src/display/json.rs @@ -122,7 +122,7 @@ impl trace::VMTracer for Informant { fn prepare_subtrace(&self, code: &[u8]) -> Self where Self: Sized { let mut vm = Informant::default(); vm.depth = self.depth + 1; - vm.code = code.into_vec(); + vm.code = code.to_vec(); vm.gas_used = self.gas_used; vm } diff --git a/evmbin/src/main.rs b/evmbin/src/main.rs index a7d90b90b..305b2cbd4 100644 --- a/evmbin/src/main.rs +++ b/evmbin/src/main.rs @@ -19,14 +19,18 @@ #![warn(missing_docs)] #![allow(dead_code)] extern crate ethcore; -extern crate rustc_serialize; +extern crate rustc_hex; +extern crate serde; +#[macro_use] +extern crate serde_derive; extern crate docopt; extern crate ethcore_util as util; use std::sync::Arc; use std::{fmt, fs}; use docopt::Docopt; -use util::{U256, FromHex, Bytes, Address}; +use rustc_hex::FromHex; +use util::{U256, Bytes, Address}; use ethcore::spec; use ethcore::action_params::ActionParams; @@ -58,7 +62,7 @@ General options: fn main() { - let args: Args = Docopt::new(USAGE).and_then(|d| d.decode()).unwrap_or_else(|e| e.exit()); + let args: Args = Docopt::new(USAGE).and_then(|d| d.deserialize()).unwrap_or_else(|e| e.exit()); if args.flag_json { run(args, display::json::Informant::default()) @@ -86,7 +90,7 @@ fn run(args: Args, mut informant: T) { informant.finish(result); } -#[derive(Debug, RustcDecodable)] +#[derive(Debug, Deserialize)] struct Args { cmd_stats: bool, flag_from: Option, diff --git a/hash-fetch/Cargo.toml b/hash-fetch/Cargo.toml index 600402559..17da00215 100644 --- a/hash-fetch/Cargo.toml +++ b/hash-fetch/Cargo.toml @@ -7,13 +7,13 @@ version = "1.7.0" authors = ["Parity Technologies "] [dependencies] -ethabi = "1.0" +ethabi = "2.0" futures = "0.1" log = "0.3" mime = "0.2" mime_guess = "1.6.1" rand = "0.3" -rustc-serialize = "0.3" +rustc-hex = "1.0" fetch = { path = "../util/fetch" } ethcore-util = { path = "../util" } parity-reactor = { path = "../util/reactor" } diff --git a/hash-fetch/src/lib.rs b/hash-fetch/src/lib.rs index 9019f744d..4952ecea2 100644 --- a/hash-fetch/src/lib.rs +++ b/hash-fetch/src/lib.rs @@ -30,7 +30,7 @@ extern crate mime_guess; extern crate native_contracts; extern crate parity_reactor; extern crate rand; -extern crate rustc_serialize; +extern crate rustc_hex; pub extern crate fetch; diff --git a/hash-fetch/src/urlhint.rs b/hash-fetch/src/urlhint.rs index cd7d2a2c5..bc4b63cf2 100644 --- a/hash-fetch/src/urlhint.rs +++ b/hash-fetch/src/urlhint.rs @@ -17,7 +17,7 @@ //! URLHint Contract use std::sync::Arc; -use rustc_serialize::hex::ToHex; +use rustc_hex::ToHex; use mime::Mime; use mime_guess; @@ -209,7 +209,7 @@ fn guess_mime_type(url: &str) -> Option { pub mod tests { use std::sync::Arc; use std::str::FromStr; - use rustc_serialize::hex::FromHex; + use rustc_hex::FromHex; use futures::{BoxFuture, Future, IntoFuture}; diff --git a/hw/Cargo.toml b/hw/Cargo.toml index ca236d130..261721470 100644 --- a/hw/Cargo.toml +++ b/hw/Cargo.toml @@ -15,4 +15,4 @@ ethkey = { path = "../ethkey" } ethcore-bigint = { path = "../util/bigint" } [dev-dependencies] -rustc-serialize = "0.3" +rustc-hex = "1.0" diff --git a/hw/src/ledger.rs b/hw/src/ledger.rs index 2f209afa5..0d787588d 100644 --- a/hw/src/ledger.rs +++ b/hw/src/ledger.rs @@ -340,7 +340,7 @@ impl Manager { #[test] fn smoke() { - use rustc_serialize::hex::FromHex; + use rustc_hex::FromHex; let mut manager = Manager::new().unwrap(); manager.update_devices().unwrap(); for d in &manager.devices { diff --git a/hw/src/lib.rs b/hw/src/lib.rs index a35607305..cda6c2241 100644 --- a/hw/src/lib.rs +++ b/hw/src/lib.rs @@ -22,7 +22,7 @@ extern crate libusb; extern crate ethkey; extern crate ethcore_bigint as bigint; #[macro_use] extern crate log; -#[cfg(test)] extern crate rustc_serialize; +#[cfg(test)] extern crate rustc_hex; mod ledger; diff --git a/js/package.json b/js/package.json index 36fc6754e..bc71029d9 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "parity.js", - "version": "1.7.96", + "version": "1.7.98", "main": "release/index.js", "jsnext:main": "src/index.js", "author": "Parity Team ", diff --git a/js/src/api/api.js b/js/src/api/api.js index 9a208ade9..220c3be29 100644 --- a/js/src/api/api.js +++ b/js/src/api/api.js @@ -21,6 +21,7 @@ import Contract from './contract'; import { Db, Eth, Parity, Net, Personal, Shh, Signer, Trace, Web3 } from './rpc'; import Subscriptions from './subscriptions'; +import Pubsub from './pubsub'; import util from './util'; import { isFunction } from './util/types'; @@ -46,10 +47,13 @@ export default class Api extends EventEmitter { this._trace = new Trace(transport); this._web3 = new Web3(transport); + if (isFunction(transport.subscribe)) { + this._pubsub = new Pubsub(transport); + } + if (allowSubscriptions) { this._subscriptions = new Subscriptions(this); } - // Doing a request here in test env would cause an error if (LocalAccountsMiddleware && process.env.NODE_ENV !== 'test') { const middleware = this.parity @@ -67,6 +71,13 @@ export default class Api extends EventEmitter { } } + get pubsub () { + if (!this._pubsub) { + throw Error('Pubsub is only available with a subscribing-supported transport injected!'); + } + return this._pubsub; + } + get db () { return this._db; } diff --git a/js/src/api/pubsub/eth/eth.js b/js/src/api/pubsub/eth/eth.js new file mode 100644 index 000000000..0bbc85bec --- /dev/null +++ b/js/src/api/pubsub/eth/eth.js @@ -0,0 +1,227 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . +import PubsubBase from '../pubsubBase'; + +import { inAddress, inBlockNumber, inHex, inNumber16, inOptions, inFilter } from '../../format/input'; +import { outAddress, outBlock, outNumber, outTransaction, outSyncing, outReceipt, outLog } from '../../format/output'; + +export default class Eth extends PubsubBase { + constructor (transport) { + super(transport); + this._api = 'parity'; + } + + newHeads (callback) { + return this.addListener('eth', 'newHeads', callback); + } + + logs (callback) { + throw Error('not supported yet'); + } + + // eth API + protocolVersion (callback) { + return this.addListener(this._api, 'eth_protocolVersion', callback); + } + + syncing (callback) { + return this.addListener(this._api, 'eth_syncing', (error, data) => { + error + ? callback(error) + : callback(null, outSyncing(data)); + }); + } + + hashrate (callback) { + return this.addListener(this._api, 'eth_hashrate', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }); + } + + coinbase (callback) { + return this.addListener(this._api, 'eth_coinbase', (error, data) => { + error + ? callback(error) + : callback(null, outAddress(data)); + }); + } + + mining (callback) { + return this.addListener(this._api, 'eth_mining', callback); + } + + gasPrice (callback) { + return this.addListener(this._api, 'eth_gasPrice', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }); + } + + accounts (callback) { + return this.addListener(this._api, 'eth_accounts', (error, accounts) => { + error + ? callback(error) + : callback(null, (accounts || []).map(outAddress)); + }); + } + + blockNumber (callback) { + return this.addListener(this._api, 'eth_blockNumber', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }); + } + + getBalance (callback, address, blockNumber = 'latest') { + return this.addListener(this._api, 'eth_getBalance', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }, [inAddress(address), inBlockNumber(blockNumber)]); + } + + getStorageAt (callback, address, index = 0, blockNumber = 'latest') { + return this.addListener(this._api, 'eth_getStorageAt', callback, [inAddress(address), inNumber16(index), inBlockNumber(blockNumber)]); + } + + getBlockByHash (callback, hash, full = false) { + return this.addListener(this._api, 'eth_getBlockByHash', (error, data) => { + error + ? callback(error) + : callback(null, outBlock(data)); + }, [inHex(hash), full]); + } + + getBlockByNumber (callback, blockNumber = 'latest', full = false) { + return this.addListener(this._api, 'eth_getBlockByNumber', (error, data) => { + error + ? callback(error) + : callback(null, outBlock(data)); + }, [inBlockNumber(blockNumber), full]); + } + + getTransactionCount (callback, address, blockNumber = 'latest') { + return this.addListener(this._api, 'eth_getTransactionCount', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }, [inAddress(address), inBlockNumber(blockNumber)]); + } + + getBlockTransactionCountByHash (callback, hash) { + return this.addListener(this._api, 'eth_getBlockTransactionCountByHash', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }, [inHex(hash)]); + } + + getBlockTransactionCountByNumber (callback, blockNumber = 'latest') { + return this.addListener(this._api, 'eth_getBlockTransactionCountByNumber', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }, [inBlockNumber(blockNumber)]); + } + + getUncleCountByBlockHash (callback, hash) { + return this.addListener(this._api, 'eth_getUncleCountByBlockHash', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }, [inHex(hash)]); + } + + getUncleCountByBlockNumber (callback, blockNumber = 'latest') { + return this.addListener(this._api, 'eth_getUncleCountByBlockNumber', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }, [inBlockNumber(blockNumber)]); + } + + getCode (callback, address, blockNumber = 'latest') { + return this.addListener(this._api, 'eth_getCode', callback, [inAddress(address), inBlockNumber(blockNumber)]); + } + + call (callback, options, blockNumber = 'latest') { + return this.addListener(this._api, 'eth_call', callback, [inOptions(options), inBlockNumber(blockNumber)]); + } + + estimateGas (callback, options) { + return this.addListener(this._api, 'eth_estimateGas', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }, [inOptions(options)]); + } + + getTransactionByHash (callback, hash) { + return this.addListener(this._api, 'eth_getTransactionByHash', (error, data) => { + error + ? callback(error) + : callback(null, outTransaction(data)); + }, [inHex(hash)]); + } + + getTransactionByBlockHashAndIndex (callback, hash, index = 0) { + return this.addListener(this._api, 'eth_getTransactionByBlockHashAndIndex', (error, data) => { + error + ? callback(error) + : callback(null, outTransaction(data)); + }, [inHex(hash), inNumber16(index)]); + } + + getTransactionByBlockNumberAndIndex (callback, blockNumber = 'latest', index = 0) { + return this.addListener(this._api, 'eth_getTransactionByBlockNumberAndIndex', (error, data) => { + error + ? callback(error) + : callback(null, outTransaction(data)); + }, [inBlockNumber(blockNumber), inNumber16(index)]); + } + + getTransactionReceipt (callback, txhash) { + return this.addListener(this._api, 'eth_getTransactionReceipt', (error, data) => { + error + ? callback(error) + : callback(null, outReceipt(data)); + }, [inHex(txhash)]); + } + + getUncleByBlockHashAndIndex (callback, hash, index = 0) { + return this.addListener(this._api, 'eth_getUncleByBlockHashAndIndex', callback, [inHex(hash), inNumber16(index)]); + } + + getUncleByBlockNumberAndIndex (callback, blockNumber = 'latest', index = 0) { + return this.addListener(this._api, 'eth_getUncleByBlockNumberAndIndex', callback, [inBlockNumber(blockNumber), inNumber16(index)]); + } + + getLogs (callback, options) { + return this.addListener(this._api, 'eth_getLogs', (error, logs) => { + error + ? callback(error) + : callback(null, (logs) => logs.map(outLog)); + }, [inFilter(options)]); + } + + getWork (callback) { + return this.addListener(this._api, 'eth_getWork', callback); + } +} diff --git a/js/src/api/pubsub/eth/index.js b/js/src/api/pubsub/eth/index.js new file mode 100644 index 000000000..3b8d1994c --- /dev/null +++ b/js/src/api/pubsub/eth/index.js @@ -0,0 +1,16 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . +export default from './eth'; diff --git a/js/src/api/pubsub/index.js b/js/src/api/pubsub/index.js new file mode 100644 index 000000000..bf342e1de --- /dev/null +++ b/js/src/api/pubsub/index.js @@ -0,0 +1,16 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . +export default from './pubsub'; diff --git a/js/src/api/pubsub/net/index.js b/js/src/api/pubsub/net/index.js new file mode 100644 index 000000000..6d13847c5 --- /dev/null +++ b/js/src/api/pubsub/net/index.js @@ -0,0 +1,16 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . +export default from './net'; diff --git a/js/src/api/pubsub/net/net.js b/js/src/api/pubsub/net/net.js new file mode 100644 index 000000000..e1dc3c4e1 --- /dev/null +++ b/js/src/api/pubsub/net/net.js @@ -0,0 +1,42 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . +import PubsubBase from '../pubsubBase'; + +import { outNumber } from '../../format/output'; + +export default class Net extends PubsubBase { + constructor (transport) { + super(transport); + this._api = 'parity'; + } + + // net API + version (callback) { + return this.addListener(this._api, 'net_version', callback); + } + + peerCount (callback) { + return this.addListener(this._api, 'net_peerCount', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }); + } + + listening (callback) { + return this.addListener(this._api, 'net_listening', callback); + } +} diff --git a/js/src/api/pubsub/parity/index.js b/js/src/api/pubsub/parity/index.js new file mode 100644 index 000000000..33ce7aa7f --- /dev/null +++ b/js/src/api/pubsub/parity/index.js @@ -0,0 +1,16 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . +export default from './parity'; diff --git a/js/src/api/pubsub/parity/parity.js b/js/src/api/pubsub/parity/parity.js new file mode 100644 index 000000000..bf18effa1 --- /dev/null +++ b/js/src/api/pubsub/parity/parity.js @@ -0,0 +1,355 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import PubsubBase from '../pubsubBase'; +import { inAddress, inBlockNumber, inData, inHex, inDeriveHash, inDeriveIndex } from '../../format/input'; +import { outAccountInfo, outAddress, outBlock, outChainStatus, outHistogram, outHwAccountInfo, outNodeKind, outNumber, outPeers, outTransaction, outAddresses, outRecentDapps, outVaultMeta } from '../../format/output'; + +export default class Parity extends PubsubBase { + constructor (transport) { + super(transport); + this._api = 'parity'; + } + + // parity API + accountsInfo (callback) { + return this.addListener(this._api, 'parity_accountsInfo', (error, data) => { + error + ? callback(error) + : callback(null, outAccountInfo(data)); + }); + } + + hardwareAccountsInfo (callback) { + return this.addListener(this._api, 'parity_hardwareAccountsInfo', (error, data) => { + error + ? callback(error) + : callback(null, outHwAccountInfo(data)); + }); + } + + defaultAccount (callback) { + return this.addListener(this._api, 'parity_defaultAccount', (error, data) => { + error + ? callback(error) + : callback(null, outAddress(data)); + }); + } + + transactionsLimit (callback) { + return this.addListener(this._api, 'parity_transactionsLimit', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }); + } + + extraData (callback) { + return this.addListener(this._api, 'parity_extraData', callback); + } + + gasFloorTarget (callback) { + return this.addListener(this._api, 'parity_gasFloorTarget', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }); + } + + gasCeilTarget (callback) { + return this.addListener(this._api, 'parity_gasCeilTarget', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }); + } + + minGasPrice (callback) { + return this.addListener(this._api, 'parity_minGasPrice', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }); + } + + devLogs (callback) { + return this.addListener(this._api, 'parity_devLogs', callback); + } + + devLogsLevels (callback) { + return this.addListener(this._api, 'parity_devLogsLevels', callback); + } + + netChain (callback) { + return this.addListener(this._api, 'parity_netChain', callback); + } + + netPeers (callback) { + return this.addListener(this._api, 'parity_netPeers', (error, data) => { + error + ? callback(error) + : callback(null, outPeers(data)); + }); + } + + netPort (callback) { + return this.addListener(this._api, 'parity_netPort', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }); + } + + rpcSettings (callback) { + return this.addListener(this._api, 'parity_rpcSettings', callback); + } + + nodeName (callback) { + return this.addListener(this._api, 'parity_nodeName', callback); + } + + defaultExtraData (callback) { + return this.addListener(this._api, 'parity_defaultExtraData', callback); + } + + gasPriceHistogram (callback) { + return this.addListener(this._api, 'parity_gasPriceHistogram', (error, data) => { + error + ? callback(error) + : callback(null, outHistogram(data)); + }); + } + + unsignedTransactionsCount (callback) { + return this.addListener(this._api, 'parity_unsignedTransactionsCount', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }); + } + + registryAddress (callback) { + return this.addListener(this._api, 'parity_registryAddress', (error, data) => { + error + ? callback(error) + : callback(null, outAddress(data)); + }); + } + + listAccounts (callback, count, offset = null, blockNumber = 'latest') { + return this.addListener(this._api, 'parity_listAccounts', (error, data) => { + error + ? callback(error) + : callback(null, (data) => (data || []).map(outAddress)); + }, [count, inAddress(offset), inBlockNumber(blockNumber)]); + } + + listStorageKeys (callback, address, count, hash = null, blockNumber = 'latest') { + return this.addListener(this._api, 'parity_listStorageKeys', callback, [inAddress(address), count, inHex(hash), inBlockNumber(blockNumber)]); + } + + pendingTransactions (callback) { + return this.addListener(this._api, 'parity_pendingTransactions', (error, data) => { + error + ? callback(error) + : callback(null, outTransaction(data)); + }); + } + + futureTransactions (callback) { + return this.addListener(this._api, 'parity_futureTransactions', (error, data) => { + error + ? callback(error) + : callback(null, outTransaction(data)); + }); + } + + pendingTransactionsStats (callback) { + return this.addListener(this._api, 'parity_pendingTransactionsStats', callback); + } + + localTransactions (callback) { + return this.addListener(this._api, 'parity_localTransactions', (error, transactions) => { + error + ? callback(error) + : callback(null, transactions => { + Object.values(transactions) + .filter(tx => tx.transaction) + .map(tx => { + tx.transaction = outTransaction(tx.transaction); + }); + return transactions; + }); + }); + } + + dappsUrl (callback) { + return this.addListener(this._api, 'parity_dappsUrl', callback); + } + + wsUrl (callback) { + return this.addListener(this._api, 'parity_wsUrl', callback); + } + + nextNonce (callback, account) { + return this.addListener(this._api, 'parity_nextNonce', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }, [inAddress(account)]); + } + + mode (callback) { + return this.addListener(this._api, 'parity_mode', callback); + } + + chain (callback) { + return this.addListener(this._api, 'parity_chain', callback); + } + + enode (callback) { + return this.addListener(this._api, 'parity_enode', callback); + } + + consensusCapability (callback) { + return this.addListener(this._api, 'parity_consensusCapability', callback); + } + + versionInfo (callback) { + return this.addListener(this._api, 'parity_versionInfo', callback); + } + + releasesInfo (callback) { + return this.addListener(this._api, 'parity_releasesInfo', callback); + } + + chainStatus (callback) { + return this.addListener(this._api, 'parity_chainStatus', (error, data) => { + error + ? callback(error) + : callback(null, outChainStatus(data)); + }); + } + + nodeKind (callback) { + return this.addListener(this._api, 'parity_nodeKind', (error, data) => { + error + ? callback(error) + : callback(null, outNodeKind(data)); + }); + } + + getBlockHeaderByNumber (callback, blockNumber = 'latest') { + return this.addListener(this._api, 'parity_getBlockHeaderByNumber', (error, data) => { + error + ? callback(error) + : callback(null, outBlock(data)); + }, [inBlockNumber(blockNumber)]); + } + + cidV0 (callback, data) { + return this.addListener(this._api, 'parity_cidV0', callback, [inData(data)]); + } + + // parity accounts API (only secure API or configured to be exposed) + allAccountsInfo (callback) { + return this._addListener(this._api, 'parity_allAccountsInfo', (error, data) => { + error + ? callback(error) + : callback(null, outAccountInfo(data)); + }); + } + + getDappAddresses (callback, dappId) { + return this._addListener(this._api, 'parity_getDappAddresses', (error, data) => { + error + ? callback(error) + : callback(null, outAddresses(data)); + }, [dappId]); + } + + getDappDefaultAddress (callback, dappId) { + return this._addListener(this._api, 'parity_getDappDefaultAddress', (error, data) => { + error + ? callback(error) + : callback(null, outAddress(data)); + }, [dappId]); + } + + getNewDappsAddresses (callback) { + return this._addListener(this._api, 'parity_getDappDefaultAddress', (error, addresses) => { + error + ? callback(error) + : callback(null, addresses ? addresses.map(outAddress) : null); + }); + } + + getNewDappsDefaultAddress (callback) { + return this._addListener(this._api, 'parity_getNewDappsDefaultAddress', (error, data) => { + error + ? callback(error) + : callback(null, outAddress(data)); + }); + } + + listRecentDapps (callback) { + return this._addListener(this._api, 'parity_listRecentDapps', (error, data) => { + error + ? callback(error) + : callback(null, outRecentDapps(data)); + }); + } + + listGethAccounts (callback) { + return this._addListener(this._api, 'parity_listGethAccounts', (error, data) => { + error + ? callback(error) + : callback(null, outAddresses(data)); + }); + } + + listVaults (callback) { + return this._addListener(this._api, 'parity_listVaults', callback); + } + + listOpenedVaults (callback) { + return this._addListener(this._api, 'parity_listOpenedVaults', callback); + } + + getVaultMeta (callback, vaultName) { + return this._addListener(this._api, 'parity_getVaultMeta', (error, data) => { + error + ? callback(error) + : callback(null, outVaultMeta(data)); + }, [vaultName]); + } + + deriveAddressHash (callback, address, password, hash, shouldSave) { + return this._addListener(this._api, 'parity_deriveAddressHash', (error, data) => { + error + ? callback(error) + : callback(null, outAddress(data)); + }, [inAddress(address), password, inDeriveHash(hash), !!shouldSave]); + } + + deriveAddressIndex (callback, address, password, index, shouldSave) { + return this._addListener(this._api, 'parity_deriveAddressIndex', (error, data) => { + error + ? callback(error) + : callback(null, outAddress(data)); + }, [inAddress(address), password, inDeriveIndex(index), !!shouldSave]); + } +} diff --git a/js/src/api/pubsub/pubsub.js b/js/src/api/pubsub/pubsub.js new file mode 100644 index 000000000..edbc201ae --- /dev/null +++ b/js/src/api/pubsub/pubsub.js @@ -0,0 +1,50 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import Eth from './eth'; +import Parity from './parity'; +import Net from './net'; + +import { isFunction } from '../util/types'; + +export default class Pubsub { + constructor (transport) { + if (!transport || !isFunction(transport.subscribe)) { + throw new Error('Pubsub API needs transport with subscribe() function defined. (WebSocket)'); + } + + this._eth = new Eth(transport); + this._net = new Net(transport); + this._parity = new Parity(transport); + } + + get net () { + return this._net; + } + + get eth () { + return this._eth; + } + + get parity () { + return this._parity; + } + + unsubscribe (subscriptionIds) { + // subscriptions are namespace independent. Thus we can simply removeListener from any. + return this._parity.removeListener(subscriptionIds); + } +} diff --git a/js/src/api/pubsub/pubsub.spec.js b/js/src/api/pubsub/pubsub.spec.js new file mode 100644 index 000000000..10fcd2edb --- /dev/null +++ b/js/src/api/pubsub/pubsub.spec.js @@ -0,0 +1,613 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; +import { TEST_WS_URL, mockWs } from '../../../test/mockRpc'; +import { isBigNumber } from '../../../test/types'; + +import Ws from '../transport/ws'; +import Pubsub from './pubsub'; + +describe('api/pubsub/Pubsub', () => { + let scope; + let instance; + const address = '0x63Cf90D3f0410092FC0fca41846f596223979195'; + + describe('accountsInfo', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: { + '0x63cf90d3f0410092fc0fca41846f596223979195': { + name: 'name', uuid: 'uuid', meta: '{"data":"data"}' + } + }, + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('retrieves the available account info', (done) => { + instance.parity.accountsInfo((error, result) => { + expect(error).to.be.null; + expect(result).to.deep.equal({ + '0x63Cf90D3f0410092FC0fca41846f596223979195': { + name: 'name', uuid: 'uuid', meta: { + data: 'data' + } + } + }); + done(); + }); + }); + }); + + describe('Unsubscribe', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2 }, + { method: 'parity_unsubscribe', reply: true }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('Promise gets resolved on success.', (done) => { + instance.parity.accountsInfo().then(s => { + instance.parity.unsubscribe(s).then(b => { + expect(b).to.be.true; + }); + }); + done(); + }); + }); + + describe('chainStatus', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: { + 'blockGap': [0x123, 0x456] + }, + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('retrieves the chain status', (done) => { + instance.parity.chainStatus((error, result) => { + expect(error).to.be.null; + expect(result).to.deep.equal({ + 'blockGap': [new BigNumber(0x123), new BigNumber(0x456)] + }); + done(); + }); + }); + }); + + describe('gasFloorTarget', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: '0x123456', + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('returns the gasfloor, formatted', (done) => { + instance.parity.gasFloorTarget((error, result) => { + expect(error).to.be.null; + expect(isBigNumber(result)).to.be.true; + expect(result.eq(0x123456)).to.be.true; + done(); + }); + }); + }); + + describe('transactionsLimit', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: 1024, + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('returns the tx limit, formatted', (done) => { + instance.parity.transactionsLimit((error, result) => { + expect(error).to.be.null; + expect(isBigNumber(result)).to.be.true; + expect(result.eq(1024)).to.be.true; + done(); + }); + }); + }); + + describe('minGasPrice', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: '0x123456', + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('returns the min gasprice, formatted', (done) => { + instance.parity.minGasPrice((error, result) => { + expect(error).to.be.null; + expect(isBigNumber(result)).to.be.true; + expect(result.eq(0x123456)).to.be.true; + done(); + }); + }); + }); + + describe('netPeers', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: { active: 123, connected: 456, max: 789, peers: [] }, + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('returns the peer structure, formatted', (done) => { + instance.parity.netPeers((error, peers) => { + expect(error).to.be.null; + expect(peers.active.eq(123)).to.be.true; + expect(peers.connected.eq(456)).to.be.true; + expect(peers.max.eq(789)).to.be.true; + done(); + }); + }); + }); + + describe('netPort', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: 33030, + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('returns the connected port, formatted', (done) => { + instance.parity.netPort((error, count) => { + expect(error).to.be.null; + expect(isBigNumber(count)).to.be.true; + expect(count.eq(33030)).to.be.true; + done(); + }); + }); + }); + +// Eth API + describe('accounts', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: [address.toLowerCase()], + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('returns a list of accounts, formatted', (done) => { + instance.eth.accounts((error, accounts) => { + expect(error).to.be.null; + expect(accounts).to.deep.equal([address]); + done(); + }); + }); + }); + + describe('newHeads', () => { + beforeEach(() => { + scope = mockWs([{ method: 'eth_subscribe', reply: 2, subscription: { + method: 'eth_subscription', + params: { + result: '0x123456', + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('returns newHeads for eth_subscribe', (done) => { + instance.eth.newHeads((error, blockNumber) => { + expect(error).to.be.null; + expect(blockNumber).to.equal('0x123456'); + done(); + }); + }); + }); + + describe('blockNumber', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: '0x123456', + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('returns the current blockNumber, formatted', (done) => { + instance.eth.blockNumber((error, blockNumber) => { + expect(error).to.be.null; + expect(isBigNumber(blockNumber)).to.be.true; + expect(blockNumber.toString(16)).to.equal('123456'); + done(); + }); + }); + }); + + describe('call', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: [], + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('formats the input options & blockNumber', (done) => { + instance.eth.call((error) => { + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_call', [{ data: '0x12345678' }, 'earliest']]); + done(); + }, { data: '12345678' }, 'earliest'); + }); + + it('provides a latest blockNumber when not specified', (done) => { + instance.eth.call((error) => { + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_call', [{ data: '0x12345678' }, 'latest']]); + done(); + }, { data: '12345678' }); + }); + }); + + describe('coinbase', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: address.toLowerCase(), + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('returns the coinbase, formatted', (done) => { + instance.eth.coinbase((error, account) => { + expect(error).to.be.null; + expect(account).to.deep.equal(address); + done(); + }); + }); + }); + + describe('estimateGas', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: '0x123', + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('converts the options correctly', (done) => { + instance.eth.estimateGas((error) => { + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_estimateGas', [{ gas: '0x5208' }]]); + done(); + }, { gas: 21000 }); + }); + + it('returns the gas used, formatted', (done) => { + instance.eth.estimateGas((error, gas) => { + expect(error).to.be.null; + expect(isBigNumber(gas)).to.be.true; + expect(gas.toString(16)).to.deep.equal('123'); + done(); + }); + }); + }); + + describe('gasPrice', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: '0x123', + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('returns the gas price, formatted', (done) => { + instance.eth.gasPrice((error, price) => { + expect(error).to.be.null; + expect(isBigNumber(price)).to.be.true; + expect(price.toString(16)).to.deep.equal('123'); + done(); + }); + }); + }); + + describe('getBalance', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: '0x123', + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('passes in the address (default blockNumber)', (done) => { + instance.eth.getBalance((error) => { + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getBalance', [address.toLowerCase(), 'latest']]); + done(); + }, address); + }); + + it('passes in the address & blockNumber', (done) => { + instance.eth.getBalance((error) => { + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getBalance', [address.toLowerCase(), '0x456']]); + done(); + }, address, 0x456); + }); + + it('returns the balance', (done) => { + instance.eth.getBalance((error, balance) => { + expect(error).to.be.null; + expect(isBigNumber(balance)).to.be.true; + expect(balance.toString(16)).to.deep.equal('123'); + done(); + }, address); + }); + }); + + describe('getBlockByHash', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: { miner: address.toLowerCase() }, + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('formats the input hash as a hash, default full', (done) => { + instance.eth.getBlockByHash((error) => { + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getBlockByHash', ['0x1234', false]]); + done(); + }, '1234'); + }); + + it('formats the input hash as a hash, full true', (done) => { + instance.eth.getBlockByHash((error) => { + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getBlockByHash', ['0x1234', true]]); + done(); + }, '1234', true); + }); + + it('formats the output into block', (done) => { + instance.eth.getBlockByHash((error, block) => { + expect(error).to.be.null; + expect(block.miner).to.equal(address); + done(); + }, '1234'); + }); + }); + + describe('getBlockByNumber', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: { miner: address.toLowerCase() }, + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('assumes blockNumber latest & full false', (done) => { + instance.eth.getBlockByNumber((error) => { + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getBlockByNumber', ['latest', false]]); + done(); + }); + }); + + it('uses input blockNumber & full false', (done) => { + instance.eth.getBlockByNumber((error) => { + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getBlockByNumber', ['0x1234', false]]); + done(); + }, '0x1234'); + }); + + it('formats the input blockNumber, full true', (done) => { + instance.eth.getBlockByNumber((error) => { + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getBlockByNumber', ['0x1234', true]]); + done(); + }, 0x1234, true); + }); + + it('formats the output into block', (done) => { + instance.eth.getBlockByNumber((error, block) => { + expect(error).to.be.null; + expect(block.miner).to.equal(address); + done(); + }, 0x1234); + }); + }); + + describe('getTransactionCount', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: '0x123', + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('passes in the address (default blockNumber)', (done) => { + instance.eth.getTransactionCount((error) => { + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getTransactionCount', [address.toLowerCase(), 'latest']]); + done(); + }, address); + }); + + it('passes in the address & blockNumber', (done) => { + instance.eth.getTransactionCount((error) => { + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getTransactionCount', [address.toLowerCase(), '0x456']]); + done(); + }, address, 0x456); + }); + + it('returns the count, formatted', (done) => { + instance.eth.getTransactionCount((error, count) => { + expect(error).to.be.null; + expect(isBigNumber(count)).to.be.true; + expect(count.toString(16)).to.equal('123'); + done(); + }, address, 0x456); + }); + }); +}); diff --git a/js/src/api/pubsub/pubsubBase.js b/js/src/api/pubsub/pubsubBase.js new file mode 100644 index 000000000..fcc7525d5 --- /dev/null +++ b/js/src/api/pubsub/pubsubBase.js @@ -0,0 +1,37 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default class PubsubBase { + // Provider for websocket pubsub transport + constructor (transport) { + this._transport = transport; + } + + addListener (module, eventName, callback, eventParams) { + return eventParams + ? this._transport.subscribe(module, callback, eventName, eventParams) + : this._transport.subscribe(module, callback, eventName, []); + // this._transport.subscribe(module, callback, eventName); After Patch from tomac is merged to master! => eth_subscribe does not support empty array as params + } + + removeListener (subscriptionIds) { + return this._transport.unsubscribe(subscriptionIds); + } + + unsubscribe (subscriptionIds) { + return this.removeListener(subscriptionIds); + } +} diff --git a/js/src/api/rpc/parity/parity.spec.js b/js/src/api/rpc/parity/parity.spec.js index d7eb41047..6ba7a1c83 100644 --- a/js/src/api/rpc/parity/parity.spec.js +++ b/js/src/api/rpc/parity/parity.spec.js @@ -110,7 +110,7 @@ describe('api/rpc/parity', () => { }); }); - describe('newPeers', () => { + describe('netPeers', () => { it('returns the peer structure, formatted', () => { mockHttp([{ method: 'parity_netPeers', reply: { result: { active: 123, connected: 456, max: 789, peers: [] } } }]); diff --git a/js/src/api/rpc/trace/trace.js b/js/src/api/rpc/trace/trace.js index 29494a9ae..26b19b378 100644 --- a/js/src/api/rpc/trace/trace.js +++ b/js/src/api/rpc/trace/trace.js @@ -28,9 +28,9 @@ export default class Trace { .then(outTraces); } - call (options, blockNumber = 'latest', whatTrace = ['trace']) { + call (options, whatTrace = ['trace'], blockNumber = 'latest') { return this._transport - .execute('trace_call', inOptions(options), inBlockNumber(blockNumber), inTraceType(whatTrace)) + .execute('trace_call', inOptions(options), inTraceType(whatTrace), inBlockNumber(blockNumber)) .then(outTraceReplay); } diff --git a/js/src/api/transport/ws/ws.js b/js/src/api/transport/ws/ws.js index 63cfcc5ec..3c642d5f8 100644 --- a/js/src/api/transport/ws/ws.js +++ b/js/src/api/transport/ws/ws.js @@ -22,12 +22,14 @@ import TransportError from '../error'; /* global WebSocket */ export default class Ws extends JsonRpcBase { - constructor (url, token, autoconnect = true) { + // token is optional (secure API) + constructor (url, token = null, autoconnect = true) { super(); this._url = url; this._token = token; this._messages = {}; + this._subscriptions = { 'eth_subscription': [], 'parity_subscription': [] }; this._sessionHash = null; this._connecting = false; @@ -68,10 +70,6 @@ export default class Ws extends JsonRpcBase { this._reconnectTimeoutId = null; } - const time = parseInt(new Date().getTime() / 1000, 10); - const sha3 = keccak_256(`${this._token}:${time}`); - const hash = `${sha3}_${time}`; - if (this._ws) { this._ws.onerror = null; this._ws.onopen = null; @@ -81,13 +79,23 @@ export default class Ws extends JsonRpcBase { this._ws = null; this._sessionHash = null; } - this._connecting = true; this._connected = false; this._lastError = null; - this._sessionHash = sha3; - this._ws = new WebSocket(this._url, hash); + // rpc secure API + if (this._token) { + const time = parseInt(new Date().getTime() / 1000, 10); + const sha3 = keccak_256(`${this._token}:${time}`); + const hash = `${sha3}_${time}`; + + this._sessionHash = sha3; + this._ws = new WebSocket(this._url, hash); + // non-secure API + } else { + this._ws = new WebSocket(this._url); + } + this._ws.onerror = this._onError; this._ws.onopen = this._onOpen; this._ws.onclose = this._onClose; @@ -194,13 +202,48 @@ export default class Ws extends JsonRpcBase { }, 50); } + _extract = (result) => { + const { result: res, id, method, params } = result; + const msg = this._messages[id]; + + // initial pubsub ACK + if (id && msg.subscription) { + // save subscription to map subId -> messageId + this._subscriptions[msg.subscription][res] = id; + // resolve promise with messageId because subId's can collide (eth/parity) + msg.resolve(id); + // save subId for unsubscribing later + msg.subId = res; + return msg; + } + + // normal message + if (id) { + return msg; + } + + // pubsub format + if (method.includes('subscription')) { + const messageId = this._messages[this._subscriptions[method][params.subscription]]; + + if (messageId) { + return messageId; + } else { + throw Error(`Received Subscription which is already unsubscribed ${JSON.stringify(result)}`); + } + } + + throw Error(`Unknown message format: No ID or subscription ${JSON.stringify(result)}`); + } + _onMessage = (event) => { try { const result = JSON.parse(event.data); - const { method, params, json, resolve, reject } = this._messages[result.id]; + const { method, params, json, resolve, reject, callback, subscription } = this._extract(result); Logging.send(method, params, { json, result }); + result.error = (result.params && result.params.error) || result.error; if (result.error) { this.error(event.data); @@ -211,14 +254,23 @@ export default class Ws extends JsonRpcBase { const error = new TransportError(method, result.error.code, result.error.message); - reject(error); + if (result.id) { + reject(error); + } else { + callback(error); + } delete this._messages[result.id]; return; } - resolve(result.result); - delete this._messages[result.id]; + // if not initial subscription message resolve & delete + if (result.id && !subscription) { + resolve(result.result); + delete this._messages[result.id]; + } else if (result.params) { + callback(null, result.params.result); + } } catch (e) { console.error('ws::_onMessage', event.data, e); } @@ -249,6 +301,43 @@ export default class Ws extends JsonRpcBase { }); } + _methodsFromApi (api) { + const method = `${api}_subscribe`; + const uMethod = `${api}_unsubscribe`; + const subscription = `${api}_subscription`; + + return { method, uMethod, subscription }; + } + + subscribe (api, callback, ...params) { + return new Promise((resolve, reject) => { + const id = this.id; + const { method, uMethod, subscription } = this._methodsFromApi(api); + const json = this.encode(method, params); + + this._messages[id] = { id, method, uMethod, params, json, resolve, reject, callback, subscription }; + + this._send(id); + }); + } + + unsubscribe (messageId) { + return new Promise((resolve, reject) => { + const id = this.id; + const { subId, uMethod, subscription } = this._messages[messageId]; + const params = [subId]; + const json = this.encode(uMethod, params); + const uResolve = (v) => { + delete this._messages[messageId]; + delete this._subscriptions[subscription][subId]; + resolve(v); + }; + + this._messages[id] = { id, method: uMethod, params, json, resolve: uResolve, reject }; + this._send(id); + }); + } + set url (url) { this._url = url; } diff --git a/js/src/jsonrpc/interfaces/eth.js b/js/src/jsonrpc/interfaces/eth.js index c52b9bc7a..d54c57325 100644 --- a/js/src/jsonrpc/interfaces/eth.js +++ b/js/src/jsonrpc/interfaces/eth.js @@ -545,6 +545,39 @@ The following options are possible for the \`defaultBlock\` parameter: input: { type: Data, desc: 'the data send along with the transaction.' + }, + v: { + type: Quantity, + desc: 'the standardised V field of the signature.' + }, + standard_v: { + type: Quantity, + desc: 'the standardised V field of the signature (0 or 1).' + }, + r: { + type: Quantity, + desc: 'the R field of the signature.' + }, + raw: { + type: Data, + desc: 'raw transaction data' + }, + publicKey: { + type: Hash, + desc: 'public key of the signer.' + }, + networkId: { + type: Quantity, + desc: 'the network id of the transaction, if any.' + }, + creates: { + type: Hash, + desc: 'creates contract hash' + }, + condition: { + type: Object, + optional: true, + desc: 'conditional submission, Block number in `block` or timestamp in `time` or `null`. (parity-feature)' } }, example: { @@ -1057,6 +1090,39 @@ The following options are possible for the \`defaultBlock\` parameter: input: { type: Data, desc: 'the data send along with the transaction.' + }, + v: { + type: Quantity, + desc: 'the standardised V field of the signature.' + }, + standard_v: { + type: Quantity, + desc: 'the standardised V field of the signature (0 or 1).' + }, + r: { + type: Quantity, + desc: 'the R field of the signature.' + }, + raw: { + type: Data, + desc: 'raw transaction data' + }, + publicKey: { + type: Hash, + desc: 'public key of the signer.' + }, + networkId: { + type: Quantity, + desc: 'the network id of the transaction, if any.' + }, + creates: { + type: Hash, + desc: 'creates contract hash' + }, + condition: { + type: Object, + optional: true, + desc: 'conditional submission, Block number in `block` or timestamp in `time` or `null`. (parity-feature)' } } } diff --git a/js/src/modals/FirstRun/firstRun.js b/js/src/modals/FirstRun/firstRun.js index 088d1bc6c..2db94fdb9 100644 --- a/js/src/modals/FirstRun/firstRun.js +++ b/js/src/modals/FirstRun/firstRun.js @@ -24,7 +24,7 @@ import ParityLogo from '~/../assets/images/parity-logo-black-no-text.svg'; import { createIdentityImg } from '~/api/util/identity'; import { newError } from '~/redux/actions'; import { Button, Portal } from '~/ui'; -import { CheckIcon, DoneIcon, NextIcon, PrintIcon } from '~/ui/Icons'; +import { CheckIcon, DoneIcon, NextIcon, PrintIcon, ReplayIcon } from '~/ui/Icons'; import { NewAccount, AccountDetails } from '../CreateAccount'; import print from '../CreateAccount/print'; @@ -230,7 +230,18 @@ class FirstRun extends Component { ]; case 4: - return ( + return [ +