diff --git a/CHANGELOG.md b/CHANGELOG.md index b3695b06a..7110201e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,30 @@ +## Parity [v1.8.1](https://github.com/paritytech/parity/releases/tag/v1.8.1) (2017-10-20) + +Parity 1.8.1 fixes several bugs with token balances, tweaks snapshot-sync, improves the performance of nodes with huge amounts of accounts and changes the Trezor account derivation path. + +**Important Note**: The **Trezor** account derivation path was changed in this release ([#6815](https://github.com/paritytech/parity/pull/6815)) to always use the first account (`m/44'/60'/0'/0/0` instead of `m/44'/60'/0'/0`). This way we enable compatibility with other Ethereum wallets supporting Trezor hardware-wallets. However, **action is required** before upgrading, if you have funds on your Parity Trezor wallet. If you already upgraded to 1.8.1, please downgrade to 1.8.0 first to recover the funds with the following steps: + +1. Make sure you have 1.8.0-beta and your Trezor plugged in. +2. Create a new standard Parity account. Make sure you have backups of the recovery phrase and don't forget the password. +3. Move your funds from the Trezor hardware-wallet account to the freshly generated Parity account. +4. Upgrade to 1.8.1-beta and plug in your Trezor. +5. Move your funds from your Parity account to the new Trezor account. +6. Keep using Parity as normal. + +If you don't want to downgrade or move your funds off your Trezor-device, you can also use the official Trezor application or other wallets allowing to select the derivation path to access the funds. + +Full list of included changes: + +- Add ECIP1017 to Morden config ([#6845](https://github.com/paritytech/parity/pull/6845)) +- Ethstore optimizations ([#6844](https://github.com/paritytech/parity/pull/6844)) +- Bumb to v1.8.1 ([#6843](https://github.com/paritytech/parity/pull/6843)) +- Backport ([#6837](https://github.com/paritytech/parity/pull/6837)) + - Tweaked snapshot sync threshold ([#6829](https://github.com/paritytech/parity/pull/6829)) + - Change keypath derivation logic ([#6815](https://github.com/paritytech/parity/pull/6815)) +- Refresh cached tokens based on registry info & random balances ([#6824](https://github.com/paritytech/parity/pull/6824)) + - Refresh cached tokens based on registry info & random balances ([#6818](https://github.com/paritytech/parity/pull/6818)) + - Don't display errored token images + ## Parity [v1.8.0](https://github.com/paritytech/parity/releases/tag/v1.8.0) (2017-10-15) We are happy to announce our newest Parity 1.8 release. Among others, it enables the following features: diff --git a/Cargo.lock b/Cargo.lock index 935389755..4d139937f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7,7 +7,7 @@ dependencies = [ "ethcore-logger 1.9.0", "ethcore-util 1.9.0", "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-wasm 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-wasm 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)", "vm 0.1.0", "wasm-utils 0.1.0 (git+https://github.com/paritytech/wasm-utils)", ] @@ -77,20 +77,6 @@ dependencies = [ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "backtrace" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "backtrace-sys 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "dbghelp-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "backtrace" version = "0.3.3" @@ -214,11 +200,6 @@ dependencies = [ "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "byteorder" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "byteorder" version = "1.1.0" @@ -453,14 +434,6 @@ dependencies = [ "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "error-chain" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "backtrace 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "error-chain" version = "0.11.0" @@ -940,6 +913,7 @@ dependencies = [ "ethjson 0.1.0", "evm 0.1.0", "panic_hook 0.1.0", + "pretty_assertions 0.1.2 (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.15 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.15 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1750,7 +1724,7 @@ dependencies = [ "futures 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "ntp 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ntp 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-reactor 0.1.0", "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.15 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1773,13 +1747,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "ntp" -version = "0.2.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "conv 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "custom_derive 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2266,7 +2240,7 @@ dependencies = [ [[package]] name = "parity-ui-precompiled" version = "1.9.0" -source = "git+https://github.com/paritytech/js-precompiled.git#f068e601cc43df21f264445339e3682977a49e23" +source = "git+https://github.com/paritytech/js-precompiled.git#1626d64235241e75c531eece004a4923d9d4fcc6" dependencies = [ "parity-dapps-glue 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2293,7 +2267,7 @@ dependencies = [ [[package]] name = "parity-wasm" -version = "0.14.5" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3451,7 +3425,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-utils" version = "0.1.0" -source = "git+https://github.com/paritytech/wasm-utils#6a39db802eb6b67a0c4e5cf50741f965e217335a" +source = "git+https://github.com/paritytech/wasm-utils#3d59f7ca0661317bc66894a26b2a5a319fa5d229" dependencies = [ "byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.26.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3459,7 +3433,7 @@ dependencies = [ "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-wasm 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-wasm 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3538,7 +3512,6 @@ dependencies = [ "checksum arrayvec 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "699e63a93b79d717e8c3b5eb1b28b7780d0d6d9e59a72eb769291c83b0c8dc67" "checksum aster 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4ccfdf7355d9db158df68f976ed030ab0f6578af811f5a7bb6dcf221ec24e0e0" "checksum atty 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d912da0db7fa85514874458ca3651fe2cddace8d0b0505571dbdcd41ab490159" -"checksum backtrace 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "346d7644f0b5f9bc73082d3b2236b69a05fd35cce0cfa3724e184e6a5c9e2a2f" "checksum backtrace 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "99f2ce94e22b8e664d95c57fff45b98a966c2252b60691d0b7aeeccd88d70983" "checksum backtrace-sys 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "c63ea141ef8fdb10409d0f5daf30ac51f84ef43bff66f16627773d2a292cd189" "checksum base-x 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f59103b47307f76e03bef1633aec7fa9e29bfb5aa6daf5a334f94233c71f6c1" @@ -3554,7 +3527,6 @@ dependencies = [ "checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5" "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 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" "checksum byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff81738b726f5d099632ceaffe7fb65b90212e8dce59d518729e7e8634032d3d" "checksum bytes 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d828f97b58cc5de3e40c421d0cf2132d6b2da4ee0e11b8632fa838f0f9333ad6" "checksum cc 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7db2f146208d7e0fbee761b09cd65a7f51ccc38705d4e7262dad4d73b12a76b1" @@ -3582,7 +3554,6 @@ dependencies = [ "checksum elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "258ff6a9a94f648d0379dbd79110e057edbb53eb85cc237e33eadf8e5a30df85" "checksum env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3ddf21e73e016298f5cb37d6ef8e8da8e39f91f9ec8b0df44b7deb16a9f8cd5b" "checksum error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff511d5dc435d703f4971bc399647c9bc38e20cb41452e3b9feb4765419ed3f3" -"checksum error-chain 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd5c82c815138e278b8dcdeffc49f27ea6ffb528403e9dea4194f2e3dd40b143" "checksum eth-secp256k1 0.5.6 (git+https://github.com/paritytech/rust-secp256k1)" = "" "checksum ethabi 4.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c819a3adef0413a2519cbd9a19a35dd1c20c7a0110705beaba8aa4aa87eda95f" "checksum fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1ee15a7050e5580b3712877157068ea713b245b080ff302ae2ca973cfcd9baa" @@ -3655,7 +3626,7 @@ dependencies = [ "checksum net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)" = "3a80f842784ef6c9a958b68b7516bc7e35883c614004dd94959a4dca1b716c09" "checksum nodrop 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "52cd74cd09beba596430cc6e3091b74007169a56246e1262f0ba451ea95117b2" "checksum nom 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b8c256fd9471521bcb84c3cdba98921497f1a331cbc15b8030fc63b82050ce" -"checksum ntp 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d23f30ae7da76e2c6c2f5de53f298aa9a3911d3955ab2c349eb944caedceb088" +"checksum ntp 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "143149743832c6543b60a8ef2a26cd9122dfecec2b767158e852a7beecf6d7a0" "checksum num 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "a311b77ebdc5dd4cf6449d81e4135d9f0e3b153839ac90e648a8ef538f923525" "checksum num-bigint 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "8fd0f8dbb4c0960998958a796281d88c16fbe68d87b1baa6f31e2979e81fd0bd" "checksum num-complex 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "503e668405c5492d67cf662a81e05be40efe2e6bcf10f7794a07bd9865e704e6" @@ -3676,7 +3647,7 @@ dependencies = [ "checksum parity-tokio-ipc 0.1.5 (git+https://github.com/nikvolf/parity-tokio-ipc)" = "" "checksum parity-ui-old-precompiled 1.8.0 (git+https://github.com/paritytech/js-precompiled.git?branch=v1)" = "" "checksum parity-ui-precompiled 1.9.0 (git+https://github.com/paritytech/js-precompiled.git)" = "" -"checksum parity-wasm 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4502e18417d96bd8e72fca9ea4cc18f4d80288ff565582d10aefe86f18b4fc3" +"checksum parity-wasm 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)" = "95f6243c2d6fadf903b5edfd0011817efc20522ce5f360abf4648c24ea87581a" "checksum parity-wordlist 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "81451bfab101d186f8fc4a0aa13cb5539b31b02c4ed96425a0842e2a413daba6" "checksum parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "149d8f5b97f3c1133e3cfcd8886449959e856b557ff281e292b733d7c69e005e" "checksum parking_lot_core 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "4f610cb9664da38e417ea3225f23051f589851999535290e077939838ab7a595" diff --git a/README.md b/README.md index 4a1c30084..770cbca44 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![Snap Status](https://build.snapcraft.io/badge/paritytech/parity.svg)](https://build.snapcraft.io/user/paritytech/parity) [![GPLv3](https://img.shields.io/badge/license-GPL%20v3-green.svg)](https://www.gnu.org/licenses/gpl-3.0.en.html) -- [Download the latest release here.](https://github.com/paritytech/parity/releases) +- [Download the latest release here.](https://github.com/paritytech/parity/releases/latest) ### Join the chat! @@ -29,19 +29,19 @@ Parity comes with a built-in wallet. To access [Parity Wallet](http://web3.site/ - create and register your own tokens; - and much more. -By default, Parity will also run a JSONRPC server on `127.0.0.1:8545`. This is fully configurable and supports a number of RPC APIs. +By default, Parity will also run a JSONRPC server on `127.0.0.1:8545` and a websockets server on `127.0.0.1:8546`. This is fully configurable and supports a number of APIs. -If you run into an issue while using parity, feel free to file one in this repository or hop on our [gitter chat room](https://gitter.im/paritytech/parity) to ask a question. We are glad to help! +If you run into an issue while using parity, feel free to file one in this repository or hop on our [Gitter](https://gitter.im/paritytech/parity) or [Riot](https://riot.im/app/#/room/#parity-watercooler:matrix.org) chat room to ask a question. We are glad to help! -**For security-critical issues**, please refer to the security policy outlined in `SECURITY.MD`. +**For security-critical issues**, please refer to the security policy outlined in [SECURITY.MD](SECURITY.md). -Parity's current release is 1.7. You can download it at https://github.com/paritytech/parity/releases or follow the instructions below to build from source. +Parity's current release is 1.8. You can download it at https://github.com/paritytech/parity/releases or follow the instructions below to build from source. ---- ## Build dependencies -**Parity requires Rust version 1.19.0 to build** +**Parity requires Rust version 1.21.0 to build** We recommend installing Rust through [rustup](https://www.rustup.rs/). If you don't already have rustup, you can install it like this: @@ -51,19 +51,20 @@ We recommend installing Rust through [rustup](https://www.rustup.rs/). If you do ``` Parity also requires `gcc`, `g++`, `libssl-dev`/`openssl`, `libudev-dev` and `pkg-config` packages to be installed. + - OSX: ```bash $ curl https://sh.rustup.rs -sSf | sh ``` `clang` is required. It comes with Xcode command line tools or can be installed with homebrew. -- Windows - Make sure you have Visual Studio 2015 with C++ support installed. Next, download and run the rustup installer from +- Windows + Make sure you have Visual Studio 2015 with C++ support installed. Next, download and run the rustup installer from https://static.rust-lang.org/rustup/dist/x86_64-pc-windows-msvc/rustup-init.exe, start "VS2015 x64 Native Tools Command Prompt", and use the following command to install and set up the msvc toolchain: - ``` + ```bash $ rustup default stable-x86_64-pc-windows-msvc - ``` + ``` Once you have rustup, install parity or download and build from source @@ -98,6 +99,9 @@ Note: if cargo fails to parse manifest try: ```bash $ ~/.cargo/bin/cargo build --release ``` + +This will always compile the latest nightly builds. If you want to build stable or beta, do a `git checkout stable` or `git checkout beta` first. + ---- ## Simple one-line installer for Mac and Ubuntu @@ -106,9 +110,14 @@ $ ~/.cargo/bin/cargo build --release bash <(curl https://get.parity.io -Lk) ``` +The one-line installer always defaults to the latest beta release. + ## Start Parity + ### Manually + To start Parity manually, just run + ```bash $ ./target/release/parity ``` @@ -116,11 +125,9 @@ $ ./target/release/parity and Parity will begin syncing the Ethereum blockchain. ### Using systemd service file + To start Parity as a regular user using systemd init: -1. Copy `parity/scripts/parity.service` to your +1. Copy `./scripts/parity.service` to your systemd user directory (usually `~/.config/systemd/user`). -2. To pass any argument to Parity, write a `~/.parity/parity.conf` file this way: -`ARGS="ARG1 ARG2 ARG3"`. - - Example: `ARGS="ui --identity MyMachine"`. +2. To configure Parity, write a `/etc/parity/config.toml` config file, see [Configuring Parity](https://github.com/paritytech/parity/wiki/Configuring-Parity) for details. diff --git a/dapps/node-health/Cargo.toml b/dapps/node-health/Cargo.toml index ff13e8593..014d7ab27 100644 --- a/dapps/node-health/Cargo.toml +++ b/dapps/node-health/Cargo.toml @@ -9,7 +9,7 @@ authors = ["Parity Technologies "] futures = "0.1" futures-cpupool = "0.1" log = "0.3" -ntp = "0.2.0" +ntp = "0.3.0" parking_lot = "0.4" serde = "1.0" serde_derive = "1.0" diff --git a/devtools/src/http_client.rs b/devtools/src/http_client.rs index 078c33721..ab2341059 100644 --- a/devtools/src/http_client.rs +++ b/devtools/src/http_client.rs @@ -16,7 +16,7 @@ use std::thread; use std::time::Duration; -use std::io::{Read, Write}; +use std::io::{self, Read, Write}; use std::str::{self, Lines}; use std::net::{TcpStream, SocketAddr}; @@ -83,9 +83,18 @@ pub fn request(address: &SocketAddr, request: &str) -> Response { req.set_read_timeout(Some(Duration::from_secs(2))).unwrap(); req.write_all(request.as_bytes()).unwrap(); - let mut response = String::new(); - let _ = req.read_to_string(&mut response); + let mut response = Vec::new(); + loop { + let mut chunk = [0; 32 *1024]; + match req.read(&mut chunk) { + Err(ref err) if err.kind() == io::ErrorKind::WouldBlock => break, + Err(err) => panic!("Unable to read response: {:?}", err), + Ok(0) => break, + Ok(read) => response.extend_from_slice(&chunk[..read]), + } + } + let response = String::from_utf8_lossy(&response).into_owned(); let mut lines = response.lines(); let status = lines.next().expect("Expected a response").to_owned(); let headers_raw = read_block(&mut lines, false); diff --git a/ethcore/evm/src/interpreter/mod.rs b/ethcore/evm/src/interpreter/mod.rs index 0d3a64956..2042bbb1d 100644 --- a/ethcore/evm/src/interpreter/mod.rs +++ b/ethcore/evm/src/interpreter/mod.rs @@ -322,20 +322,24 @@ impl Interpreter { let init_off = stack.pop_back(); let init_size = stack.pop_back(); - let address_scheme = if instruction == instructions::CREATE { CreateContractAddress::FromSenderAndNonce } else { CreateContractAddress::FromSenderAndCodeHash }; let create_gas = provided.expect("`provided` comes through Self::exec from `Gasometer::get_gas_cost_mem`; `gas_gas_mem_cost` guarantees `Some` when instruction is `CALL`/`CALLCODE`/`DELEGATECALL`/`CREATE`; this is `CREATE`; qed"); - let contract_code = self.mem.read_slice(init_off, init_size); - let can_create = ext.balance(¶ms.address)? >= endowment && ext.depth() < ext.schedule().max_depth; + if ext.is_static() { + return Err(vm::Error::MutableCallInStaticContext); + } // clear return data buffer before creating new call frame. self.return_data = ReturnData::empty(); + let can_create = ext.balance(¶ms.address)? >= endowment && ext.depth() < ext.schedule().max_depth; if !can_create { stack.push(U256::zero()); return Ok(InstructionResult::UnusedGas(create_gas)); } + let contract_code = self.mem.read_slice(init_off, init_size); + let address_scheme = if instruction == instructions::CREATE { CreateContractAddress::FromSenderAndNonce } else { CreateContractAddress::FromSenderAndCodeHash }; + let create_result = ext.create(&create_gas.as_u256(), &endowment, contract_code, address_scheme); return match create_result { ContractCreateResult::Created(address, gas_left) => { @@ -351,9 +355,6 @@ impl Interpreter { stack.push(U256::zero()); Ok(InstructionResult::Ok) }, - ContractCreateResult::FailedInStaticCall => { - Err(vm::Error::MutableCallInStaticContext) - }, }; }, instructions::CALL | instructions::CALLCODE | instructions::DELEGATECALL | instructions::STATICCALL => { diff --git a/ethcore/evm/src/tests.rs b/ethcore/evm/src/tests.rs index 3eb10bc6a..6e85e1803 100644 --- a/ethcore/evm/src/tests.rs +++ b/ethcore/evm/src/tests.rs @@ -724,7 +724,6 @@ fn test_jumps(factory: super::Factory) { assert_eq!(gas_left, U256::from(54_117)); } - evm_test!{test_calls: test_calls_jit, test_calls_int} fn test_calls(factory: super::Factory) { let code = "600054602d57600160005560006000600060006050610998610100f160006000600060006050610998610100f25b".from_hex().unwrap(); @@ -769,6 +768,27 @@ fn test_calls(factory: super::Factory) { assert_eq!(ext.calls.len(), 2); } +evm_test!{test_create_in_staticcall: test_create_in_staticcall_jit, test_create_in_staticcall_int} +fn test_create_in_staticcall(factory: super::Factory) { + let code = "600060006064f000".from_hex().unwrap(); + + let address = Address::from(0x155); + let mut params = ActionParams::default(); + params.gas = U256::from(100_000); + params.code = Some(Arc::new(code)); + params.address = address.clone(); + let mut ext = FakeExt::new_byzantium(); + ext.is_static = true; + + let err = { + let mut vm = factory.create(params.gas); + test_finalize(vm.exec(params, &mut ext)).unwrap_err() + }; + + assert_eq!(err, vm::Error::MutableCallInStaticContext); + assert_eq!(ext.calls.len(), 0); +} + fn assert_set_contains(set: &HashSet, val: &T) { let contains = set.contains(val); if !contains { diff --git a/ethcore/src/account_provider/mod.rs b/ethcore/src/account_provider/mod.rs index 3e1d1058c..6d7ab52cb 100755 --- a/ethcore/src/account_provider/mod.rs +++ b/ethcore/src/account_provider/mod.rs @@ -516,8 +516,8 @@ impl AccountProvider { } /// Returns each hardware account along with name and meta. - pub fn is_hardware_address(&self, address: Address) -> bool { - self.hardware_store.as_ref().and_then(|s| s.wallet_info(&address)).is_some() + pub fn is_hardware_address(&self, address: &Address) -> bool { + self.hardware_store.as_ref().and_then(|s| s.wallet_info(address)).is_some() } /// Returns each account along with name and meta. @@ -589,7 +589,7 @@ impl AccountProvider { } } - if self.unlock_keep_secret && unlock != Unlock::OneTime { + if self.unlock_keep_secret && unlock == Unlock::Perm { // verify password and get the secret let secret = self.sstore.raw_secret(&account, &password)?; self.unlocked_secrets.write().insert(account.clone(), secret); @@ -639,14 +639,22 @@ impl AccountProvider { } /// Checks if given account is unlocked - pub fn is_unlocked(&self, address: Address) -> bool { + pub fn is_unlocked(&self, address: &Address) -> bool { let unlocked = self.unlocked.read(); let unlocked_secrets = self.unlocked_secrets.read(); - self.sstore.account_ref(&address) + self.sstore.account_ref(address) .map(|r| unlocked.get(&r).is_some() || unlocked_secrets.get(&r).is_some()) .unwrap_or(false) } + /// Checks if given account is unlocked permanently + pub fn is_unlocked_permanently(&self, address: &Address) -> bool { + let unlocked = self.unlocked.read(); + self.sstore.account_ref(address) + .map(|r| unlocked.get(&r).map_or(false, |account| account.unlock == Unlock::Perm)) + .unwrap_or(false) + } + /// Signs the message. If password is not provided the account must be unlocked. pub fn sign(&self, address: Address, password: Option, message: Message) -> Result { let account = self.sstore.account_ref(&address)?; diff --git a/ethcore/src/client/client.rs b/ethcore/src/client/client.rs index b65e698df..22e727ff0 100644 --- a/ethcore/src/client/client.rs +++ b/ethcore/src/client/client.rs @@ -1142,7 +1142,7 @@ impl Client { state_diff: bool, transaction: &SignedTransaction, options: TransactOptions, - ) -> Result where + ) -> Result, CallError> where T: trace::Tracer, V: trace::VMTracer, { @@ -1242,7 +1242,7 @@ impl BlockChainClient for Client { // that's just a copy of the state. let original_state = self.state_at(block).ok_or(CallError::StatePruned)?; let sender = t.sender(); - let options = || TransactOptions::with_tracing(); + let options = || TransactOptions::with_tracing().dont_check_nonce(); let cond = |gas| { let mut tx = t.as_unsigned().clone(); diff --git a/ethcore/src/client/evm_test_client.rs b/ethcore/src/client/evm_test_client.rs index 88f1c4f2c..814e119ba 100644 --- a/ethcore/src/client/evm_test_client.rs +++ b/ethcore/src/client/evm_test_client.rs @@ -197,7 +197,7 @@ impl<'a> EvmTestClient<'a> { env_info: &client::EnvInfo, transaction: transaction::SignedTransaction, vm_tracer: T, - ) -> TransactResult { + ) -> TransactResult { let initial_gas = transaction.gas; // Verify transaction let is_ok = transaction.verify_basic(true, None, env_info.number >= self.spec.engine.params().eip86_transition); @@ -218,7 +218,8 @@ impl<'a> EvmTestClient<'a> { TransactResult::Ok { state_root: *self.state.root(), gas_left: initial_gas - result.receipt.gas_used, - output: result.output + output: result.output, + vm_trace: result.vm_trace, } }, Err(error) => TransactResult::Err { @@ -230,7 +231,7 @@ impl<'a> EvmTestClient<'a> { } /// A result of applying transaction to the state. -pub enum TransactResult { +pub enum TransactResult { /// Successful execution Ok { /// State root @@ -239,6 +240,8 @@ pub enum TransactResult { gas_left: U256, /// Output output: Vec, + /// VM Traces + vm_trace: Option, }, /// Transaction failed to run Err { diff --git a/ethcore/src/executed.rs b/ethcore/src/executed.rs index 490681dfb..5035e5eb8 100644 --- a/ethcore/src/executed.rs +++ b/ethcore/src/executed.rs @@ -29,7 +29,7 @@ use std::fmt; /// Transaction execution receipt. #[derive(Debug, PartialEq, Clone)] -pub struct Executed { +pub struct Executed { /// True if the outer call/create resulted in an exceptional exit. pub exception: Option, @@ -63,9 +63,9 @@ pub struct Executed { /// Transaction output. pub output: Bytes, /// The trace of this transaction. - pub trace: Vec, + pub trace: Vec, /// The VM trace of this transaction. - pub vm_trace: Option, + pub vm_trace: Option, /// The state diff, if we traced it. pub state_diff: Option, } diff --git a/ethcore/src/executive.rs b/ethcore/src/executive.rs index 3709ea449..0f2c2398d 100644 --- a/ethcore/src/executive.rs +++ b/ethcore/src/executive.rs @@ -30,7 +30,7 @@ use evm::{CallType, Factory, Finalize, FinalizationResult}; use vm::{self, Ext, CreateContractAddress, ReturnData, CleanDustMode, ActionParams, ActionValue}; use wasm; use externalities::*; -use trace::{self, FlatTrace, VMTrace, Tracer, VMTracer}; +use trace::{self, Tracer, VMTracer}; use transaction::{Action, SignedTransaction}; use crossbeam; pub use executed::{Executed, ExecutionResult}; @@ -214,7 +214,7 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> { /// This function should be used to execute transaction. pub fn transact(&'a mut self, t: &SignedTransaction, options: TransactOptions) - -> Result where T: Tracer, V: VMTracer, + -> Result, ExecutionError> where T: Tracer, V: VMTracer, { self.transact_with_tracer(t, options.check_nonce, options.output_from_init_contract, options.tracer, options.vm_tracer) } @@ -223,7 +223,7 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> { /// This will ensure the caller has enough balance to execute the desired transaction. /// Used for extra-block executions for things like consensus contracts and RPCs pub fn transact_virtual(&'a mut self, t: &SignedTransaction, options: TransactOptions) - -> Result where T: Tracer, V: VMTracer, + -> Result, ExecutionError> where T: Tracer, V: VMTracer, { let sender = t.sender(); let balance = self.state.balance(&sender)?; @@ -244,7 +244,7 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> { output_from_create: bool, mut tracer: T, mut vm_tracer: V - ) -> Result where T: Tracer, V: VMTracer { + ) -> Result, ExecutionError> where T: Tracer, V: VMTracer { let sender = t.sender(); let nonce = self.state.nonce(&sender)?; @@ -309,6 +309,7 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> { code: Some(Arc::new(t.data.clone())), data: None, call_type: CallType::None, + params_type: vm::ParamsType::Embedded, }; let mut out = if output_from_create { Some(vec![]) } else { None }; (self.create(params, &mut substate, &mut out, &mut tracer, &mut vm_tracer), out.unwrap_or_else(Vec::new)) @@ -326,6 +327,7 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> { code_hash: Some(self.state.code_hash(address)?), data: Some(t.data.clone()), call_type: CallType::Call, + params_type: vm::ParamsType::Separate, }; let mut out = vec![]; (self.call(params, &mut substate, BytesRef::Flexible(&mut out), &mut tracer, &mut vm_tracer), out) @@ -587,15 +589,15 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> { } /// Finalizes the transaction (does refunds and suicides). - fn finalize( + fn finalize( &mut self, t: &SignedTransaction, mut substate: Substate, result: vm::Result, output: Bytes, - trace: Vec, - vm_trace: Option - ) -> ExecutionResult { + trace: Vec, + vm_trace: Option + ) -> Result, ExecutionError> { let schedule = self.machine.schedule(self.info.number); // refunds from SSTORE nonzero -> zero diff --git a/ethcore/src/externalities.rs b/ethcore/src/externalities.rs index caf14967b..ff7805299 100644 --- a/ethcore/src/externalities.rs +++ b/ethcore/src/externalities.rs @@ -171,6 +171,7 @@ impl<'a, T: 'a, V: 'a, B: 'a> Ext for Externalities<'a, T, V, B> code_hash: Some(code_hash), data: Some(H256::from(number).to_vec()), call_type: CallType::Call, + params_type: vm::ParamsType::Separate, }; let mut output = H256::new(); @@ -219,6 +220,7 @@ impl<'a, T: 'a, V: 'a, B: 'a> Ext for Externalities<'a, T, V, B> code_hash: code_hash, data: None, call_type: CallType::None, + params_type: vm::ParamsType::Embedded, }; if !self.static_flag { @@ -240,7 +242,6 @@ impl<'a, T: 'a, V: 'a, B: 'a> Ext for Externalities<'a, T, V, B> Ok(FinalizationResult{ gas_left, apply_state: false, return_data }) => { ContractCreateResult::Reverted(gas_left, return_data) }, - Err(vm::Error::MutableCallInStaticContext) => ContractCreateResult::FailedInStaticCall, _ => ContractCreateResult::Failed, } } @@ -277,6 +278,7 @@ impl<'a, T: 'a, V: 'a, B: 'a> Ext for Externalities<'a, T, V, B> code_hash: Some(code_hash), data: Some(data.to_vec()), call_type: call_type, + params_type: vm::ParamsType::Separate, }; if let Some(value) = value { diff --git a/ethcore/src/header.rs b/ethcore/src/header.rs index 3f0c0109f..71c6e6bd3 100644 --- a/ethcore/src/header.rs +++ b/ethcore/src/header.rs @@ -162,6 +162,12 @@ impl Header { pub fn difficulty(&self) -> &U256 { &self.difficulty } /// Get the seal field of the header. pub fn seal(&self) -> &[Bytes] { &self.seal } + /// Get the seal field with RLP-decoded values as bytes. + pub fn decode_seal<'a, T: ::std::iter::FromIterator<&'a [u8]>>(&'a self) -> Result { + self.seal.iter().map(|rlp| { + UntrustedRlp::new(rlp).data() + }).collect() + } // TODO: seal_at, set_seal_at &c. @@ -340,13 +346,20 @@ mod tests { // that's rlp of block header created with ethash engine. let header_rlp = "f901f9a0d405da4e66f1445d455195229624e133f5baafe72b5cf7b3c36c12c8146e98b7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a05fb2b4bfdef7b314451cb138a534d225c922fc0e5fbe25e451142732c3e25c25a088d2ec6b9860aae1a2c3b299f72b6a5d70d7f7ba4722c78f2c49ba96273c2158a007c6fdfa8eea7e86b81f5b0fc0f78f90cc19f4aa60d323151e0cac660199e9a1b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302008003832fefba82524d84568e932a80a0a0349d8c3df71f1a48a9df7d03fd5f14aeee7d91332c009ecaff0a71ead405bd88ab4e252a7e8c2a23".from_hex().unwrap(); let mix_hash = "a0a0349d8c3df71f1a48a9df7d03fd5f14aeee7d91332c009ecaff0a71ead405bd".from_hex().unwrap(); + let mix_hash_decoded = "a0349d8c3df71f1a48a9df7d03fd5f14aeee7d91332c009ecaff0a71ead405bd".from_hex().unwrap(); let nonce = "88ab4e252a7e8c2a23".from_hex().unwrap(); + let nonce_decoded = "ab4e252a7e8c2a23".from_hex().unwrap(); let header: Header = rlp::decode(&header_rlp); - let seal_fields = header.seal; + let seal_fields = header.seal.clone(); assert_eq!(seal_fields.len(), 2); assert_eq!(seal_fields[0], mix_hash); assert_eq!(seal_fields[1], nonce); + + let decoded_seal = header.decode_seal::>().unwrap(); + assert_eq!(decoded_seal.len(), 2); + assert_eq!(decoded_seal[0], &*mix_hash_decoded); + assert_eq!(decoded_seal[1], &*nonce_decoded); } #[test] diff --git a/ethcore/src/machine.rs b/ethcore/src/machine.rs index 667211c52..e583cd592 100644 --- a/ethcore/src/machine.rs +++ b/ethcore/src/machine.rs @@ -35,7 +35,7 @@ use tx_filter::TransactionFilter; use bigint::prelude::U256; use bytes::BytesRef; use util::Address; -use vm::{CallType, ActionParams, ActionValue}; +use vm::{CallType, ActionParams, ActionValue, ParamsType}; use vm::{EnvInfo, Schedule, CreateContractAddress}; /// Parity tries to round block.gas_limit to multiple of this constant @@ -149,6 +149,7 @@ impl EthereumMachine { code_hash: Some(state.code_hash(&contract_address)?), data: data, call_type: CallType::Call, + params_type: ParamsType::Separate, }; let mut ex = Executive::new(&mut state, &env_info, self); let mut substate = Substate::new(); diff --git a/ethcore/src/miner/miner.rs b/ethcore/src/miner/miner.rs index 324619273..6ef26c48b 100644 --- a/ethcore/src/miner/miner.rs +++ b/ethcore/src/miner/miner.rs @@ -123,6 +123,10 @@ pub struct MinerOptions { pub tx_queue_banning: Banning, /// Do we refuse to accept service transactions even if sender is certified. pub refuse_service_transactions: bool, + /// Create a pending block with maximal possible gas limit. + /// NOTE: Such block will contain all pending transactions but + /// will be invalid if mined. + pub infinite_pending_block: bool, } impl Default for MinerOptions { @@ -145,6 +149,7 @@ impl Default for MinerOptions { enable_resubmission: true, tx_queue_banning: Banning::Disabled, refuse_service_transactions: false, + infinite_pending_block: false, } } } @@ -374,15 +379,14 @@ impl Miner { let mut sealing_work = self.sealing_work.lock(); let last_work_hash = sealing_work.queue.peek_last_ref().map(|pb| pb.block().fields().header.hash()); let best_hash = chain_info.best_block_hash; -/* + // check to see if last ClosedBlock in would_seals is actually same parent block. // if so // duplicate, re-open and push any new transactions. // if at least one was pushed successfully, close and enqueue new ClosedBlock; // otherwise, leave everything alone. // otherwise, author a fresh block. -*/ - let open_block = match sealing_work.queue.pop_if(|b| b.block().fields().header.parent_hash() == &best_hash) { + let mut open_block = match sealing_work.queue.pop_if(|b| b.block().fields().header.parent_hash() == &best_hash) { Some(old_block) => { trace!(target: "miner", "prepare_block: Already have previous work; updating and returning"); // add transactions to old_block @@ -398,6 +402,11 @@ impl Miner { ) } }; + + if self.options.infinite_pending_block { + open_block.set_gas_limit(!U256::zero()); + } + (transactions, open_block, last_work_hash) }; @@ -1301,6 +1310,7 @@ mod tests { enable_resubmission: true, tx_queue_banning: Banning::Disabled, refuse_service_transactions: false, + infinite_pending_block: false, }, GasPricer::new_fixed(0u64.into()), &Spec::new_test(), diff --git a/ethcore/src/miner/transaction_queue.rs b/ethcore/src/miner/transaction_queue.rs index 2accbecc0..9cb835b28 100644 --- a/ethcore/src/miner/transaction_queue.rs +++ b/ethcore/src/miner/transaction_queue.rs @@ -515,10 +515,6 @@ pub struct AccountDetails { /// `new_gas_price > old_gas_price + old_gas_price >> SHIFT` const GAS_PRICE_BUMP_SHIFT: usize = 3; // 2 = 25%, 3 = 12.5%, 4 = 6.25% -/// Future queue limits are lower from current queue limits: -/// `future_limit = current_limit >> SHIFT` -const FUTURE_QUEUE_LIMITS_SHIFT: usize = 3; // 2 = 25%, 3 = 12.5%, 4 = 6.25% - /// Describes the strategy used to prioritize transactions in the queue. #[cfg_attr(feature="dev", allow(enum_variant_names))] #[derive(Debug, Copy, Clone, PartialEq, Eq)] @@ -626,9 +622,9 @@ impl TransactionQueue { by_priority: BTreeSet::new(), by_address: Table::new(), by_gas_price: Default::default(), - total_gas_limit: total_gas_limit >> FUTURE_QUEUE_LIMITS_SHIFT, - limit: limit >> FUTURE_QUEUE_LIMITS_SHIFT, - memory_limit: memory_limit >> FUTURE_QUEUE_LIMITS_SHIFT, + total_gas_limit, + limit, + memory_limit, }; TransactionQueue { @@ -649,7 +645,7 @@ impl TransactionQueue { /// Set the new limit for `current` and `future` queue. pub fn set_limit(&mut self, limit: usize) { self.current.set_limit(limit); - self.future.set_limit(limit >> FUTURE_QUEUE_LIMITS_SHIFT); + self.future.set_limit(limit); // And ensure the limits self.current.enforce_limit(&mut self.by_hash, &mut self.local_transactions); self.future.enforce_limit(&mut self.by_hash, &mut self.local_transactions); @@ -686,7 +682,7 @@ impl TransactionQueue { /// Sets new total gas limit. pub fn set_total_gas_limit(&mut self, total_gas_limit: U256) { self.current.total_gas_limit = total_gas_limit; - self.future.total_gas_limit = total_gas_limit >> FUTURE_QUEUE_LIMITS_SHIFT; + self.future.total_gas_limit = total_gas_limit; self.future.enforce_limit(&mut self.by_hash, &mut self.local_transactions); } @@ -2412,7 +2408,7 @@ pub mod test { fn should_limit_future_transactions() { let mut txq = TransactionQueue::with_limits( PrioritizationStrategy::GasPriceOnly, - 1 << FUTURE_QUEUE_LIMITS_SHIFT, + 1, usize::max_value(), !U256::zero(), !U256::zero(), @@ -2736,7 +2732,7 @@ pub mod test { // given let mut txq = TransactionQueue::with_limits( PrioritizationStrategy::GasPriceOnly, - 1 << FUTURE_QUEUE_LIMITS_SHIFT, + 1, usize::max_value(), !U256::zero(), !U256::zero() diff --git a/ethcore/src/spec/spec.rs b/ethcore/src/spec/spec.rs index 14a7ff413..6f94713ad 100644 --- a/ethcore/src/spec/spec.rs +++ b/ethcore/src/spec/spec.rs @@ -30,7 +30,7 @@ use parking_lot::RwLock; use rlp::{Rlp, RlpStream}; use rustc_hex::FromHex; use util::*; -use vm::{EnvInfo, CallType, ActionValue, ActionParams}; +use vm::{EnvInfo, CallType, ActionValue, ActionParams, ParamsType}; use super::genesis::Genesis; use super::seal::Generic as GenericSeal; @@ -504,6 +504,7 @@ impl Spec { code: Some(Arc::new(constructor.clone())), data: None, call_type: CallType::None, + params_type: ParamsType::Embedded, }; let mut substate = Substate::new(); diff --git a/ethcore/src/state/mod.rs b/ethcore/src/state/mod.rs index dfde05921..a7a5a303b 100644 --- a/ethcore/src/state/mod.rs +++ b/ethcore/src/state/mod.rs @@ -62,19 +62,19 @@ pub use self::backend::Backend; pub use self::substate::Substate; /// Used to return information about an `State::apply` operation. -pub struct ApplyOutcome { +pub struct ApplyOutcome { /// The receipt for the applied transaction. pub receipt: Receipt, /// The output of the applied transaction. pub output: Bytes, /// The trace for the applied transaction, empty if tracing was not produced. - pub trace: Vec, + pub trace: Vec, /// The VM trace for the applied transaction, None if tracing was not produced. - pub vm_trace: Option + pub vm_trace: Option } /// Result type for the execution ("application") of a transaction. -pub type ApplyResult = Result; +pub type ApplyResult = Result, Error>; /// Return type of proof validity check. #[derive(Debug, Clone)] @@ -668,7 +668,7 @@ impl State { /// Execute a given transaction, producing a receipt and an optional trace. /// This will change the state accordingly. - pub fn apply(&mut self, env_info: &EnvInfo, machine: &Machine, t: &SignedTransaction, tracing: bool) -> ApplyResult { + pub fn apply(&mut self, env_info: &EnvInfo, machine: &Machine, t: &SignedTransaction, tracing: bool) -> ApplyResult { if tracing { let options = TransactOptions::with_tracing(); self.apply_with_tracing(env_info, machine, t, options.tracer, options.vm_tracer) @@ -687,7 +687,7 @@ impl State { t: &SignedTransaction, tracer: T, vm_tracer: V, - ) -> ApplyResult where + ) -> ApplyResult where T: trace::Tracer, V: trace::VMTracer, { @@ -728,7 +728,7 @@ impl State { // `virt` signals that we are executing outside of a block set and restrictions like // gas limits and gas costs should be lifted. fn execute(&mut self, env_info: &EnvInfo, machine: &Machine, t: &SignedTransaction, options: TransactOptions, virt: bool) - -> Result where T: trace::Tracer, V: trace::VMTracer, + -> Result, ExecutionError> where T: trace::Tracer, V: trace::VMTracer, { let mut e = Executive::new(self, env_info, machine); diff --git a/ethcore/src/tests/evm.rs b/ethcore/src/tests/evm.rs index 021ab444e..830fcb5d7 100644 --- a/ethcore/src/tests/evm.rs +++ b/ethcore/src/tests/evm.rs @@ -2,7 +2,7 @@ use std::sync::Arc; use hash::keccak; -use vm::{EnvInfo, ActionParams, ActionValue, CallType}; +use vm::{EnvInfo, ActionParams, ActionValue, CallType, ParamsType}; use evm::{Factory, VMType}; use executive::Executive; use state::Substate; @@ -45,6 +45,7 @@ fn test_blockhash_eip210(factory: Factory) { code_hash: Some(blockhash_contract_code_hash), data: Some(H256::from(i - 1).to_vec()), call_type: CallType::Call, + params_type: ParamsType::Separate, }; let mut ex = Executive::new(&mut state, &env_info, &machine); let mut substate = Substate::new(); @@ -67,6 +68,7 @@ fn test_blockhash_eip210(factory: Factory) { code_hash: Some(get_prev_hash_code_hash), data: None, call_type: CallType::Call, + params_type: ParamsType::Separate, }; let mut ex = Executive::new(&mut state, &env_info, &machine); let mut substate = Substate::new(); diff --git a/ethcore/src/trace/executive_tracer.rs b/ethcore/src/trace/executive_tracer.rs index 38c134e6b..2137d679d 100644 --- a/ethcore/src/trace/executive_tracer.rs +++ b/ethcore/src/trace/executive_tracer.rs @@ -83,6 +83,8 @@ fn should_prefix_address_properly() { } impl Tracer for ExecutiveTracer { + type Output = FlatTrace; + fn prepare_trace_call(&self, params: &ActionParams) -> Option { Some(Call::from(params.clone())) } @@ -201,6 +203,8 @@ impl ExecutiveVMTracer { } impl VMTracer for ExecutiveVMTracer { + type Output = VMTrace; + fn trace_next_instruction(&mut self, _pc: usize, _instruction: u8) -> bool { true } fn trace_prepare_execute(&mut self, pc: usize, instruction: u8, gas_cost: U256) { diff --git a/ethcore/src/trace/mod.rs b/ethcore/src/trace/mod.rs index f86daf13f..991e434fc 100644 --- a/ethcore/src/trace/mod.rs +++ b/ethcore/src/trace/mod.rs @@ -48,6 +48,9 @@ use header::BlockNumber; /// This trait is used by executive to build traces. pub trait Tracer: Send { + /// Data returned when draining the Tracer. + type Output; + /// Prepares call trace for given params. Noop tracer should return None. fn prepare_trace_call(&self, params: &ActionParams) -> Option; @@ -63,7 +66,7 @@ pub trait Tracer: Send { call: Option, gas_used: U256, output: Option, - subs: Vec, + subs: Vec, ); /// Stores trace create info. @@ -73,14 +76,14 @@ pub trait Tracer: Send { gas_used: U256, code: Option, address: Address, - subs: Vec + subs: Vec ); /// Stores failed call trace. - fn trace_failed_call(&mut self, call: Option, subs: Vec, error: TraceError); + fn trace_failed_call(&mut self, call: Option, subs: Vec, error: TraceError); /// Stores failed create trace. - fn trace_failed_create(&mut self, create: Option, subs: Vec, error: TraceError); + fn trace_failed_create(&mut self, create: Option, subs: Vec, error: TraceError); /// Stores suicide info. fn trace_suicide(&mut self, address: Address, balance: U256, refund_address: Address); @@ -92,12 +95,15 @@ pub trait Tracer: Send { fn subtracer(&self) -> Self where Self: Sized; /// Consumes self and returns all traces. - fn drain(self) -> Vec; + fn drain(self) -> Vec; } /// Used by executive to build VM traces. pub trait VMTracer: Send { + /// Data returned when draining the VMTracer. + type Output; + /// Trace the progression of interpreter to next instruction. /// If tracer returns `false` it won't be called again. /// @returns true if `trace_prepare_execute` and `trace_executed` should be called. @@ -116,7 +122,7 @@ pub trait VMTracer: Send { fn done_subtrace(&mut self, sub: Self) where Self: Sized; /// Consumes self and returns the VM trace. - fn drain(self) -> Option; + fn drain(self) -> Option; } /// `DbExtras` provides an interface to query extra data which is not stored in tracesdb, diff --git a/ethcore/src/trace/noop_tracer.rs b/ethcore/src/trace/noop_tracer.rs index 6def53c6c..bff8b9d44 100644 --- a/ethcore/src/trace/noop_tracer.rs +++ b/ethcore/src/trace/noop_tracer.rs @@ -27,6 +27,8 @@ use trace::trace::{Call, Create, VMTrace, RewardType}; pub struct NoopTracer; impl Tracer for NoopTracer { + type Output = FlatTrace; + fn prepare_trace_call(&self, _: &ActionParams) -> Option { None } @@ -76,6 +78,8 @@ impl Tracer for NoopTracer { pub struct NoopVMTracer; impl VMTracer for NoopVMTracer { + type Output = VMTrace; + fn trace_next_instruction(&mut self, _pc: usize, _instruction: u8) -> bool { false } fn trace_prepare_execute(&mut self, _pc: usize, _instruction: u8, _gas_cost: U256) {} diff --git a/ethcore/src/views/header.rs b/ethcore/src/views/header.rs index d308a042d..181a73a5d 100644 --- a/ethcore/src/views/header.rs +++ b/ethcore/src/views/header.rs @@ -21,7 +21,7 @@ use bigint::prelude::U256; use bigint::hash::{H256, H2048}; use util::Address; use bytes::Bytes; -use rlp::Rlp; +use rlp::{self, Rlp}; use header::BlockNumber; /// View onto block header rlp. @@ -99,6 +99,14 @@ impl<'a> HeaderView<'a> { } seal } + + /// Returns a vector of seal fields (RLP-decoded). + pub fn decode_seal(&self) -> Result, rlp::DecoderError> { + let seal = self.seal(); + seal.into_iter() + .map(|s| rlp::UntrustedRlp::new(&s).data().map(|x| x.to_vec())) + .collect() + } } #[cfg(test)] diff --git a/ethcore/vm/src/action_params.rs b/ethcore/vm/src/action_params.rs index f87b1e558..cf914126f 100644 --- a/ethcore/vm/src/action_params.rs +++ b/ethcore/vm/src/action_params.rs @@ -35,6 +35,15 @@ pub enum ActionValue { Apparent(U256) } +/// Type of the way parameters encoded +#[derive(Clone, Debug)] +pub enum ParamsType { + /// Parameters are included in code + Embedded, + /// Parameters are passed in data section + Separate, +} + impl ActionValue { /// Returns action value as U256. pub fn value(&self) -> U256 { @@ -81,7 +90,8 @@ pub struct ActionParams { pub data: Option, /// Type of call pub call_type: CallType, - + /// Param types encoding + pub params_type: ParamsType, } impl Default for ActionParams { @@ -99,6 +109,7 @@ impl Default for ActionParams { code: None, data: None, call_type: CallType::None, + params_type: ParamsType::Separate, } } } @@ -118,6 +129,7 @@ impl From for ActionParams { gas_price: t.gas_price.into(), value: ActionValue::Transfer(t.value.into()), call_type: match address.is_zero() { true => CallType::None, false => CallType::Call }, // TODO @debris is this correct? + params_type: ParamsType::Separate, } } } diff --git a/ethcore/vm/src/ext.rs b/ethcore/vm/src/ext.rs index 574af9e82..3f5004586 100644 --- a/ethcore/vm/src/ext.rs +++ b/ethcore/vm/src/ext.rs @@ -35,9 +35,6 @@ pub enum ContractCreateResult { /// Returned when contract creation failed. /// VM doesn't have to know the reason. Failed, - /// Returned when contract creation failed. - /// VM doesn't have to know the reason. - FailedInStaticCall, /// Reverted with REVERT. Reverted(U256, ReturnData), } diff --git a/ethcore/vm/src/lib.rs b/ethcore/vm/src/lib.rs index 56a380597..1f88bf625 100644 --- a/ethcore/vm/src/lib.rs +++ b/ethcore/vm/src/lib.rs @@ -35,7 +35,7 @@ mod error; pub mod tests; -pub use action_params::{ActionParams, ActionValue}; +pub use action_params::{ActionParams, ActionValue, ParamsType}; pub use call_type::CallType; pub use env_info::{EnvInfo, LastHashes}; pub use schedule::{Schedule, CleanDustMode}; diff --git a/ethcore/vm/src/tests.rs b/ethcore/vm/src/tests.rs index 0d7ca1f82..222578afd 100644 --- a/ethcore/vm/src/tests.rs +++ b/ethcore/vm/src/tests.rs @@ -65,6 +65,7 @@ pub struct FakeExt { pub schedule: Schedule, pub balances: HashMap, pub tracing: bool, + pub is_static: bool, } // similar to the normal `finalize` function, but ignoring NeedsReturn. @@ -192,7 +193,7 @@ impl Ext for FakeExt { } fn is_static(&self) -> bool { - false + self.is_static } fn inc_sstore_clears(&mut self) { diff --git a/ethcore/wasm/Cargo.toml b/ethcore/wasm/Cargo.toml index 1b18a5c2a..380ffdfcf 100644 --- a/ethcore/wasm/Cargo.toml +++ b/ethcore/wasm/Cargo.toml @@ -8,7 +8,7 @@ byteorder = "1.0" ethcore-util = { path = "../../util" } ethcore-bigint = { path = "../../util/bigint" } log = "0.3" -parity-wasm = "0.14" +parity-wasm = "0.15" wasm-utils = { git = "https://github.com/paritytech/wasm-utils" } vm = { path = "../vm" } ethcore-logger = { path = "../../logger" } diff --git a/ethcore/wasm/src/lib.rs b/ethcore/wasm/src/lib.rs index df5a4c043..70601144d 100644 --- a/ethcore/wasm/src/lib.rs +++ b/ethcore/wasm/src/lib.rs @@ -115,7 +115,18 @@ impl vm::Vm for WasmInterpreter { &self.program, ); - let mut cursor = ::std::io::Cursor::new(&*code); + let (mut cursor, data_position) = match params.params_type { + vm::ParamsType::Embedded => { + let module_size = parity_wasm::peek_size(&*code); + ( + ::std::io::Cursor::new(&code[..module_size]), + module_size + ) + }, + vm::ParamsType::Separate => { + (::std::io::Cursor::new(&code[..]), 0) + }, + }; let contract_module = wasm_utils::inject_gas_counter( elements::Module::deserialize( @@ -134,8 +145,19 @@ impl vm::Vm for WasmInterpreter { let static_segment_cost = data_section_length * runtime.ext().schedule().wasm.static_region as u64; runtime.charge(|_| static_segment_cost).map_err(Error)?; - let d_ptr = runtime.write_descriptor(¶ms.data.unwrap_or_default()) - .map_err(Error)?; + let d_ptr = { + match params.params_type { + vm::ParamsType::Embedded => { + runtime.write_descriptor( + if data_position < code.len() { &code[data_position..] } else { &[] } + ).map_err(Error)? + }, + vm::ParamsType::Separate => { + runtime.write_descriptor(¶ms.data.unwrap_or_default()) + .map_err(Error)? + } + } + }; { let execution_params = runtime.execution_params() diff --git a/ethcore/wasm/src/runtime.rs b/ethcore/wasm/src/runtime.rs index 1f8bf428a..d26346a3e 100644 --- a/ethcore/wasm/src/runtime.rs +++ b/ethcore/wasm/src/runtime.rs @@ -221,8 +221,8 @@ impl<'a, 'b> Runtime<'a, 'b> { } /// Charge gas according to closure - pub fn charge(&mut self, f: F) -> Result<(), InterpreterError> - where F: FnOnce(&vm::Schedule) -> u64 + pub fn charge(&mut self, f: F) -> Result<(), InterpreterError> + where F: FnOnce(&vm::Schedule) -> u64 { let amount = f(self.ext.schedule()); if !self.charge_gas(amount as u64) { @@ -277,10 +277,6 @@ impl<'a, 'b> Runtime<'a, 'b> { self.gas_counter = self.gas_limit - gas_left.low_u64(); Ok(Some((-1i32).into())) }, - vm::ContractCreateResult::FailedInStaticCall => { - trace!(target: "wasm", "runtime: create contract called in static context"); - Err(interpreter::Error::Trap("CREATE in static context".to_owned())) - }, } } @@ -615,11 +611,11 @@ impl<'a, 'b> Runtime<'a, 'b> { } fn return_u256_ptr(&mut self, ptr: u32, val: U256) -> Result<(), InterpreterError> { - let value: H256 = val.into(); + let value: H256 = val.into(); self.charge(|schedule| schedule.wasm.static_u256 as u64)?; self.memory.set(ptr, &*value)?; Ok(()) - } + } fn coinbase(&mut self, context: InterpreterCallerContext) -> Result, InterpreterError> @@ -640,7 +636,7 @@ impl<'a, 'b> Runtime<'a, 'b> { context.value_stack.pop_as::()? as u32, sender, )?; - Ok(None) + Ok(None) } fn address(&mut self, context: InterpreterCallerContext) @@ -651,7 +647,7 @@ impl<'a, 'b> Runtime<'a, 'b> { context.value_stack.pop_as::()? as u32, addr, )?; - Ok(None) + Ok(None) } fn origin(&mut self, context: InterpreterCallerContext) @@ -662,7 +658,7 @@ impl<'a, 'b> Runtime<'a, 'b> { context.value_stack.pop_as::()? as u32, origin, )?; - Ok(None) + Ok(None) } fn value(&mut self, context: InterpreterCallerContext) @@ -709,7 +705,7 @@ impl<'a, 'b> Runtime<'a, 'b> { context.value_stack.pop_as::()? as u32, gas_limit, )?; - Ok(None) + Ok(None) } fn return_i64(&mut self, val: i64) -> Result, InterpreterError> { diff --git a/ethcore/wasm/src/tests.rs b/ethcore/wasm/src/tests.rs index 57b5ab6a8..c9174f288 100644 --- a/ethcore/wasm/src/tests.rs +++ b/ethcore/wasm/src/tests.rs @@ -677,3 +677,30 @@ fn externs() { assert_eq!(gas_left, U256::from(91_857)); } + +#[test] +fn embedded_keccak() { + + ::ethcore_logger::init_log(); + let mut code = load_sample!("keccak.wasm"); + code.extend_from_slice(b"something"); + + let mut params = ActionParams::default(); + params.gas = U256::from(100_000); + params.code = Some(Arc::new(code)); + params.params_type = vm::ParamsType::Embedded; + + let mut ext = FakeExt::new(); + + let (gas_left, result) = { + let mut interpreter = wasm_interpreter(); + let result = interpreter.exec(params, &mut ext).expect("Interpreter to execute without any errors"); + match result { + GasLeft::Known(_) => { panic!("keccak should return payload"); }, + GasLeft::NeedsReturn { gas_left: gas, data: result, apply_state: _apply } => (gas, result.to_vec()), + } + }; + + assert_eq!(H256::from_slice(&result), H256::from("68371d7e884c168ae2022c82bd837d51837718a7f7dfb7aa3f753074a35e1d87")); + assert_eq!(gas_left, U256::from(80_452)); +} \ No newline at end of file diff --git a/evmbin/Cargo.toml b/evmbin/Cargo.toml index efb6ba591..200e5a735 100644 --- a/evmbin/Cargo.toml +++ b/evmbin/Cargo.toml @@ -22,5 +22,8 @@ evm = { path = "../ethcore/evm" } vm = { path = "../ethcore/vm" } panic_hook = { path = "../panic_hook" } +[dev-dependencies] +pretty_assertions = "0.1" + [features] evm-debug = ["ethcore/evm-debug-tests"] diff --git a/evmbin/src/display/json.rs b/evmbin/src/display/json.rs index b36653c78..badd16d2a 100644 --- a/evmbin/src/display/json.rs +++ b/evmbin/src/display/json.rs @@ -16,11 +16,13 @@ //! JSON VM output. -use ethcore::trace; use std::collections::HashMap; -use bigint::prelude::U256; +use std::mem; + use bigint::hash::H256; +use bigint::prelude::U256; use bytes::ToPretty; +use ethcore::trace; use display; use info as vm; @@ -37,6 +39,9 @@ pub struct Informant { stack: Vec, memory: Vec, storage: HashMap, + traces: Vec, + subtraces: Vec, + unmatched: bool, } impl Informant { @@ -70,28 +75,43 @@ impl vm::Informant for Informant { self.gas_used = gas; } - fn finish(result: Result) { + fn finish(result: vm::RunResult) { match result { - Ok(success) => println!( - "{{\"output\":\"0x{output}\",\"gasUsed\":\"{gas:x}\",\"time\":{time}}}", - output = success.output.to_hex(), - gas = success.gas_used, - time = display::as_micros(&success.time), - ), - Err(failure) => println!( - "{{\"error\":\"{error}\",\"gasUsed\":\"{gas:x}\",\"time\":{time}}}", - error = failure.error, - gas = failure.gas_used, - time = display::as_micros(&failure.time), - ), + Ok(success) => { + for trace in success.traces.unwrap_or_else(Vec::new) { + println!("{}", trace); + } + + println!( + "{{\"output\":\"0x{output}\",\"gasUsed\":\"{gas:x}\",\"time\":{time}}}", + output = success.output.to_hex(), + gas = success.gas_used, + time = display::as_micros(&success.time), + ) + }, + Err(failure) => { + for trace in failure.traces.unwrap_or_else(Vec::new) { + println!("{}", trace); + } + + println!( + "{{\"error\":\"{error}\",\"gasUsed\":\"{gas:x}\",\"time\":{time}}}", + error = failure.error, + gas = failure.gas_used, + time = display::as_micros(&failure.time), + ) + }, } } } impl trace::VMTracer for Informant { + type Output = Vec; + fn trace_next_instruction(&mut self, pc: usize, instruction: u8) -> bool { self.pc = pc; self.instruction = instruction; + self.unmatched = true; true } @@ -104,19 +124,21 @@ impl trace::VMTracer for Informant { fn trace_executed(&mut self, gas_used: U256, stack_push: &[U256], mem_diff: Option<(usize, &[u8])>, store_diff: Option<(U256, U256)>) { let info = ::evm::INSTRUCTIONS[self.instruction as usize]; - println!( + let trace = format!( "{{\"pc\":{pc},\"op\":{op},\"opName\":\"{name}\",\"gas\":{gas},\"gasCost\":{gas_cost},\"memory\":{memory},\"stack\":{stack},\"storage\":{storage},\"depth\":{depth}}}", pc = self.pc, op = self.instruction, name = info.name, - gas = display::u256_as_str(&(gas_used + self.gas_cost)), + gas = display::u256_as_str(&(gas_used.saturating_add(self.gas_cost))), gas_cost = display::u256_as_str(&self.gas_cost), memory = self.memory(), stack = self.stack(), storage = self.storage(), depth = self.depth, ); + self.traces.push(trace); + self.unmatched = false; self.gas_used = gas_used; let len = self.stack.len(); @@ -133,6 +155,11 @@ impl trace::VMTracer for Informant { if let Some((pos, val)) = store_diff { self.storage.insert(pos.into(), val.into()); } + + + if !self.subtraces.is_empty() { + self.traces.extend(mem::replace(&mut self.subtraces, vec![])); + } } fn prepare_subtrace(&self, code: &[u8]) -> Self where Self: Sized { @@ -143,14 +170,21 @@ impl trace::VMTracer for Informant { vm } - fn done_subtrace(&mut self, mut sub: Self) { - if sub.depth == 1 { - // print last line with final state: - sub.gas_cost = 0.into(); - let gas_used = sub.gas_used; - trace::VMTracer::trace_executed(&mut sub, gas_used, &[], None, None); + fn done_subtrace(&mut self, sub: Self) { + if let Some(subtraces) = sub.drain() { + self.subtraces.extend(subtraces); } } - fn drain(self) -> Option { None } + fn drain(mut self) -> Option { + if self.unmatched { + // print last line with final state: + self.gas_cost = 0.into(); + let gas_used = self.gas_used; + self.trace_executed(gas_used, &[], None, None); + } else if !self.subtraces.is_empty() { + self.traces.extend(mem::replace(&mut self.subtraces, vec![])); + } + Some(self.traces) + } } diff --git a/evmbin/src/display/simple.rs b/evmbin/src/display/simple.rs index 9f6773734..6e9959a8e 100644 --- a/evmbin/src/display/simple.rs +++ b/evmbin/src/display/simple.rs @@ -31,7 +31,7 @@ impl vm::Informant for Informant { println!("Test: {} ({})", name, action); } - fn finish(result: Result) { + fn finish(result: vm::RunResult) { match result { Ok(success) => { println!("Output: 0x{}", success.output.to_hex()); @@ -47,7 +47,9 @@ impl vm::Informant for Informant { } impl trace::VMTracer for Informant { + type Output = (); + fn prepare_subtrace(&self, _code: &[u8]) -> Self where Self: Sized { Default::default() } fn done_subtrace(&mut self, _sub: Self) {} - fn drain(self) -> Option { None } + fn drain(self) -> Option<()> { None } } diff --git a/evmbin/src/info.rs b/evmbin/src/info.rs index 4af30db71..218a3c419 100644 --- a/evmbin/src/info.rs +++ b/evmbin/src/info.rs @@ -22,6 +22,7 @@ use bigint::hash::H256; use ethcore::{trace, spec, transaction, pod_state}; use ethcore::client::{self, EvmTestClient, EvmTestError, TransactResult}; use ethjson; +use vm::ActionParams; /// VM execution informant pub trait Informant: trace::VMTracer { @@ -30,27 +31,51 @@ pub trait Informant: trace::VMTracer { /// Set initial gas. fn set_gas(&mut self, _gas: U256) {} /// Display final result. - fn finish(result: Result); + fn finish(result: RunResult); } /// Execution finished correctly -pub struct Success { +#[derive(Debug)] +pub struct Success { /// Used gas pub gas_used: U256, /// Output as bytes pub output: Vec, /// Time Taken pub time: Duration, + /// Traces + pub traces: Option, } /// Execution failed -pub struct Failure { +#[derive(Debug)] +pub struct Failure { /// Used gas pub gas_used: U256, /// Internal error pub error: EvmTestError, /// Duration pub time: Duration, + /// Traces + pub traces: Option, +} + +/// EVM Execution result +pub type RunResult = Result, Failure>; + +/// Execute given `ActionParams` and return the result. +pub fn run_action( + spec: &spec::Spec, + params: ActionParams, + mut informant: T, +) -> RunResult { + informant.set_gas(params.gas); + run(spec, params.gas, None, |mut client| { + let result = client + .call(params, &mut informant) + .map(|r| (r.gas_left, r.return_data.to_vec())); + (result, informant.drain()) + }) } /// Execute given Transaction and verify resulting state root. @@ -82,19 +107,19 @@ pub fn run_transaction( let result = client.transact(env_info, transaction, informant); match result { TransactResult::Ok { state_root, .. } if state_root != post_root => { - Err(EvmTestError::PostCondition(format!( + (Err(EvmTestError::PostCondition(format!( "State root mismatch (got: {}, expected: {})", state_root, post_root, - ))) + ))), None) }, - TransactResult::Ok { gas_left, output, .. } => { - Ok((gas_left, output)) + TransactResult::Ok { gas_left, output, vm_trace, .. } => { + (Ok((gas_left, output)), vm_trace) }, TransactResult::Err { error, .. } => { - Err(EvmTestError::PostCondition(format!( + (Err(EvmTestError::PostCondition(format!( "Unexpected execution error: {:?}", error - ))) + ))), None) }, } }); @@ -103,8 +128,13 @@ pub fn run_transaction( } /// Execute VM with given `ActionParams` -pub fn run<'a, F, T>(spec: &'a spec::Spec, initial_gas: U256, pre_state: T, run: F) -> Result where - F: FnOnce(EvmTestClient) -> Result<(U256, Vec), EvmTestError>, +pub fn run<'a, F, T, X>( + spec: &'a spec::Spec, + initial_gas: U256, + pre_state: T, + run: F, +) -> RunResult where + F: FnOnce(EvmTestClient) -> (Result<(U256, Vec), EvmTestError>, Option), T: Into>, { let test_client = match pre_state.into() { @@ -113,23 +143,135 @@ pub fn run<'a, F, T>(spec: &'a spec::Spec, initial_gas: U256, pre_state: T, run: }.map_err(|error| Failure { gas_used: 0.into(), error, - time: Duration::from_secs(0) + time: Duration::from_secs(0), + traces: None, })?; let start = Instant::now(); let result = run(test_client); - let duration = start.elapsed(); + let time = start.elapsed(); match result { - Ok((gas_left, output)) => Ok(Success { + (Ok((gas_left, output)), traces) => Ok(Success { gas_used: initial_gas - gas_left, - output: output, - time: duration, + output, + time, + traces, }), - Err(e) => Err(Failure { + (Err(error), traces) => Err(Failure { gas_used: initial_gas, - error: e, - time: duration, + error, + time, + traces, }), } } + +#[cfg(test)] +mod tests { + use std::sync::Arc; + use rustc_hex::FromHex; + use super::*; + + #[test] + fn should_trace_failure() { + run_test( + "60F8d6", + 0xffff, + r#" +{"pc":0,"op":96,"opName":"PUSH1","gas":"0xffff","gasCost":"0x3","memory":"0x","stack":[],"storage":{},"depth":1} +{"pc":2,"op":214,"opName":"","gas":"0xfffc","gasCost":"0x0","memory":"0x","stack":["0xf8"],"storage":{},"depth":1} + "#, + ); + + run_test( + "F8d6", + 0xffff, + r#" +{"pc":0,"op":248,"opName":"","gas":"0xffff","gasCost":"0x0","memory":"0x","stack":[],"storage":{},"depth":1} + "#, + ); + } + + #[test] + fn should_trace_create_correctly() { + run_test( + "32343434345830f138343438323439f0", + 0xffff, + r#" +{"pc":0,"op":50,"opName":"ORIGIN","gas":"0xffff","gasCost":"0x2","memory":"0x","stack":[],"storage":{},"depth":1} +{"pc":1,"op":52,"opName":"CALLVALUE","gas":"0xfffd","gasCost":"0x2","memory":"0x","stack":["0x0"],"storage":{},"depth":1} +{"pc":2,"op":52,"opName":"CALLVALUE","gas":"0xfffb","gasCost":"0x2","memory":"0x","stack":["0x0","0x0"],"storage":{},"depth":1} +{"pc":3,"op":52,"opName":"CALLVALUE","gas":"0xfff9","gasCost":"0x2","memory":"0x","stack":["0x0","0x0","0x0"],"storage":{},"depth":1} +{"pc":4,"op":52,"opName":"CALLVALUE","gas":"0xfff7","gasCost":"0x2","memory":"0x","stack":["0x0","0x0","0x0","0x0"],"storage":{},"depth":1} +{"pc":5,"op":88,"opName":"PC","gas":"0xfff5","gasCost":"0x2","memory":"0x","stack":["0x0","0x0","0x0","0x0","0x0"],"storage":{},"depth":1} +{"pc":6,"op":48,"opName":"ADDRESS","gas":"0xfff3","gasCost":"0x2","memory":"0x","stack":["0x0","0x0","0x0","0x0","0x0","0x5"],"storage":{},"depth":1} +{"pc":7,"op":241,"opName":"CALL","gas":"0xfff1","gasCost":"0x61d0","memory":"0x","stack":["0x0","0x0","0x0","0x0","0x0","0x5","0x0"],"storage":{},"depth":1} +{"pc":8,"op":56,"opName":"CODESIZE","gas":"0x9e21","gasCost":"0x2","memory":"0x","stack":["0x1"],"storage":{},"depth":1} +{"pc":9,"op":52,"opName":"CALLVALUE","gas":"0x9e1f","gasCost":"0x2","memory":"0x","stack":["0x1","0x10"],"storage":{},"depth":1} +{"pc":10,"op":52,"opName":"CALLVALUE","gas":"0x9e1d","gasCost":"0x2","memory":"0x","stack":["0x1","0x10","0x0"],"storage":{},"depth":1} +{"pc":11,"op":56,"opName":"CODESIZE","gas":"0x9e1b","gasCost":"0x2","memory":"0x","stack":["0x1","0x10","0x0","0x0"],"storage":{},"depth":1} +{"pc":12,"op":50,"opName":"ORIGIN","gas":"0x9e19","gasCost":"0x2","memory":"0x","stack":["0x1","0x10","0x0","0x0","0x10"],"storage":{},"depth":1} +{"pc":13,"op":52,"opName":"CALLVALUE","gas":"0x9e17","gasCost":"0x2","memory":"0x","stack":["0x1","0x10","0x0","0x0","0x10","0x0"],"storage":{},"depth":1} +{"pc":14,"op":57,"opName":"CODECOPY","gas":"0x9e15","gasCost":"0x9","memory":"0x","stack":["0x1","0x10","0x0","0x0","0x10","0x0","0x0"],"storage":{},"depth":1} +{"pc":15,"op":240,"opName":"CREATE","gas":"0x9e0c","gasCost":"0x9e0c","memory":"0x32343434345830f138343438323439f0","stack":["0x1","0x10","0x0","0x0"],"storage":{},"depth":1} +{"pc":0,"op":50,"opName":"ORIGIN","gas":"0x210c","gasCost":"0x2","memory":"0x","stack":[],"storage":{},"depth":2} +{"pc":1,"op":52,"opName":"CALLVALUE","gas":"0x210a","gasCost":"0x2","memory":"0x","stack":["0x0"],"storage":{},"depth":2} +{"pc":2,"op":52,"opName":"CALLVALUE","gas":"0x2108","gasCost":"0x2","memory":"0x","stack":["0x0","0x0"],"storage":{},"depth":2} +{"pc":3,"op":52,"opName":"CALLVALUE","gas":"0x2106","gasCost":"0x2","memory":"0x","stack":["0x0","0x0","0x0"],"storage":{},"depth":2} +{"pc":4,"op":52,"opName":"CALLVALUE","gas":"0x2104","gasCost":"0x2","memory":"0x","stack":["0x0","0x0","0x0","0x0"],"storage":{},"depth":2} +{"pc":5,"op":88,"opName":"PC","gas":"0x2102","gasCost":"0x2","memory":"0x","stack":["0x0","0x0","0x0","0x0","0x0"],"storage":{},"depth":2} +{"pc":6,"op":48,"opName":"ADDRESS","gas":"0x2100","gasCost":"0x2","memory":"0x","stack":["0x0","0x0","0x0","0x0","0x0","0x5"],"storage":{},"depth":2} +{"pc":7,"op":241,"opName":"CALL","gas":"0x20fe","gasCost":"0x0","memory":"0x","stack":["0x0","0x0","0x0","0x0","0x0","0x5","0xbd770416a3345f91e4b34576cb804a576fa48eb1"],"storage":{},"depth":2} + "#, + ) + } + + fn run_test>( + code: &str, + gas: T, + expected: &str, + ) { + let mut params = ActionParams::default(); + params.code = Some(Arc::new(code.from_hex().unwrap())); + params.gas = gas.into(); + + let spec = ::ethcore::ethereum::new_foundation(&::std::env::temp_dir()); + let informant = ::display::json::Informant::default(); + let result = run_action(&spec, params, informant); + let expected = expected.split("\n") + .map(|x| x.trim()) + .map(|x| x.to_owned()) + .filter(|x| !x.is_empty()) + .collect::>(); + match result { + Ok(Success { traces, .. }) => { + assert_traces_eq(&traces.unwrap(), &expected); + }, + Err(Failure { traces, .. }) => { + assert_traces_eq(&traces.unwrap(), &expected); + }, + } + } + + fn assert_traces_eq( + a: &[String], + b: &[String], + ) { + let mut ita = a.iter(); + let mut itb = b.iter(); + + loop { + match (ita.next(), itb.next()) { + (Some(a), Some(b)) => { + assert_eq!(a, b); + println!("{}", a); + }, + (None, None) => return, + e => { + panic!("Traces mismatch: {:?}", e); + } + } + } + } +} diff --git a/evmbin/src/main.rs b/evmbin/src/main.rs index d3668037f..a32af49e0 100644 --- a/evmbin/src/main.rs +++ b/evmbin/src/main.rs @@ -32,6 +32,10 @@ extern crate vm; extern crate evm; extern crate panic_hook; +#[cfg(test)] +#[macro_use] +extern crate pretty_assertions; + use std::sync::Arc; use std::{fmt, fs}; use std::path::PathBuf; @@ -136,7 +140,7 @@ fn run_state_test(args: Args) { } } -fn run_call(args: Args, mut informant: T) { +fn run_call(args: Args, informant: T) { let from = arg(args.from(), "--from"); let to = arg(args.to(), "--to"); let code = arg(args.code(), "--code"); @@ -160,10 +164,7 @@ fn run_call(args: Args, mut informant: T) { params.code = code.map(Arc::new); params.data = data; - informant.set_gas(gas); - let result = info::run(&spec, gas, None, |mut client| { - client.call(params, &mut informant).map(|r| (r.gas_left, r.return_data.to_vec())) - }); + let result = info::run_action(&spec, params, informant); T::finish(result); } @@ -187,7 +188,7 @@ impl Args { pub fn gas(&self) -> Result { match self.flag_gas { Some(ref gas) => gas.parse().map_err(to_string), - None => Ok(!U256::zero()), + None => Ok(U256::from(u64::max_value())), } } diff --git a/js/assets/parity-logo-black.png b/js/assets/parity-logo-black.png new file mode 100644 index 000000000..924d9dd4b Binary files /dev/null and b/js/assets/parity-logo-black.png differ diff --git a/js/assets/parity-logo.png b/js/assets/parity-logo.png new file mode 100644 index 000000000..5a864134f Binary files /dev/null and b/js/assets/parity-logo.png differ diff --git a/js/package-lock.json b/js/package-lock.json index 2ba940925..cb7da8602 100644 --- a/js/package-lock.json +++ b/js/package-lock.json @@ -1,13 +1,13 @@ { "name": "Parity", - "version": "1.9.1", + "version": "1.9.5", "lockfileVersion": 1, "requires": true, "dependencies": { "@parity/abi": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@parity/abi/-/abi-2.0.13.tgz", - "integrity": "sha512-U4Um8s9G8KW94Ur8/2gUf8jo9BNGLunfpfVjOe4e5h12bY6GhasI5McXx9L7M8d9bWYqwBOz8t3TE7h/cqjnXw==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@parity/abi/-/abi-2.0.17.tgz", + "integrity": "sha512-6SMTB3x9o/7KIWCm8YHKHSxiTcchK8WXvsb/YCJirfNF5my0tlZot4QcBKZbjrbevPGmwcUv1/gDckQ1GRqT+Q==", "requires": { "bignumber.js": "3.0.1", "js-sha3": "0.5.5", @@ -15,12 +15,12 @@ } }, "@parity/api": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@parity/api/-/api-2.0.13.tgz", - "integrity": "sha512-QooftUHgrAYLujXMvW9YmzjSg3NXal10uUrycmIdjPnRL1Hpd5aH8B/LrIW78YNGAoAJFaEl63Gr9JH8JT+7hQ==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@parity/api/-/api-2.0.17.tgz", + "integrity": "sha512-zffiegquPQLfshhOV7s3ULolRizO41xUIgCTCMbOICS9e9QSxdfE789KEFbgA+Wci7xVRzUCDWRbm2xbzvHLmg==", "requires": { - "@parity/abi": "2.0.13", - "@parity/jsonrpc": "2.0.14", + "@parity/abi": "2.0.17", + "@parity/jsonrpc": "2.0.18", "@parity/wordlist": "1.1.0", "bignumber.js": "3.0.1", "blockies": "0.0.2", @@ -44,215 +44,102 @@ } }, "@parity/dapp-account": { - "version": "github:paritytech/dapp-account#ddfc58a1178adfb4f829268714ecd5dd001b22d5", + "version": "github:paritytech/dapp-account#67eec35f3ef21aab77aee5c2ca4b8ae0bf5251f0", "requires": { - "@parity/api": "2.0.13", - "@parity/dapp-accounts": "github:paritytech/dapp-accounts#40c13b7a554b300b1ba50a1c027a5c8f99c27e47", - "@parity/dapp-vaults": "github:paritytech/dapp-vaults#925990e2cfdf977b25f946c1fc2632b63f4f87c9", - "@parity/parity.js": "1.8.7", - "@parity/shapeshift": "2.0.13", - "@parity/shared": "2.0.13", - "@parity/ui": "2.0.43", - "happypack": "3.1.0", - "lodash": "4.17.2", - "oo7": "0.5.3", - "oo7-parity": "0.6.8", - "oo7-react": "0.4.5", - "parity-reactive-ui": "0.4.5", - "phoneformat.js": "1.0.3", - "react-intl": "2.1.5" - }, - "dependencies": { - "lodash": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.2.tgz", - "integrity": "sha1-NKMFW6vgTOQkZ7YH1wAHLH/2v0I=" - } + "@parity/dapp-accounts": "github:paritytech/dapp-accounts#8abec008e59c4c4df8902188371ab83c77d1d3de", + "@parity/dapp-vaults": "github:paritytech/dapp-vaults#b3c16b417e7b1cc671de91c719040924a6632806" } }, "@parity/dapp-accounts": { - "version": "github:paritytech/dapp-accounts#40c13b7a554b300b1ba50a1c027a5c8f99c27e47", + "version": "github:paritytech/dapp-accounts#8abec008e59c4c4df8902188371ab83c77d1d3de", "requires": { - "@parity/api": "2.0.13", - "@parity/dapp-vaults": "github:paritytech/dapp-vaults#925990e2cfdf977b25f946c1fc2632b63f4f87c9", - "@parity/shared": "2.0.13", - "@parity/ui": "2.0.43", - "file-saver": "1.3.3", - "react": "15.6.1", - "react-dom": "15.6.1", - "react-intl": "2.1.5", - "react-router": "3.0.0", - "react-tap-event-plugin": "2.0.1" + "@parity/dapp-vaults": "github:paritytech/dapp-vaults#b3c16b417e7b1cc671de91c719040924a6632806" } }, "@parity/dapp-address": { - "version": "github:paritytech/dapp-address#e04e5eda9c466d20024888ec1d5c94fb28d817cd", + "version": "github:paritytech/dapp-address#79d0f5300d17ec66476f9f59e62e73d62b31dadf", "requires": { - "@parity/api": "2.0.13", - "@parity/dapp-account": "github:paritytech/dapp-account#ddfc58a1178adfb4f829268714ecd5dd001b22d5", - "@parity/dapp-addresses": "github:paritytech/dapp-addresses#4a73c3029e5bc24df5a99faf2cac53cdbde13950", - "@parity/shared": "2.0.13", - "@parity/ui": "2.0.43" + "@parity/dapp-account": "github:paritytech/dapp-account#67eec35f3ef21aab77aee5c2ca4b8ae0bf5251f0", + "@parity/dapp-addresses": "github:paritytech/dapp-addresses#d884a81b072805806ac6820f8b6c83d6faa04468" } }, "@parity/dapp-addresses": { - "version": "github:paritytech/dapp-addresses#4a73c3029e5bc24df5a99faf2cac53cdbde13950", + "version": "github:paritytech/dapp-addresses#d884a81b072805806ac6820f8b6c83d6faa04468", "requires": { - "@parity/api": "2.0.13", - "@parity/dapp-accounts": "github:paritytech/dapp-accounts#40c13b7a554b300b1ba50a1c027a5c8f99c27e47", - "@parity/shared": "2.0.13", - "@parity/ui": "2.0.43" + "@parity/dapp-accounts": "github:paritytech/dapp-accounts#8abec008e59c4c4df8902188371ab83c77d1d3de" } }, "@parity/dapp-chaindeploy": { - "version": "github:paritytech/dapp-chaindeploy#8506d48dba9dcc4a86048c94f6386f3453f9236e", - "requires": { - "@parity/api": "2.0.13", - "@parity/shared": "2.0.13", - "react": "15.6.1", - "react-dom": "15.6.1" - } + "version": "github:paritytech/dapp-chaindeploy#922c728698187db94a732cd0b2c583715b9b50b8" }, "@parity/dapp-contract": { - "version": "github:paritytech/dapp-contract#b56fd8934165ba3684c8050fdf90395db163b87c", + "version": "github:paritytech/dapp-contract#f21537da25990a7dad4b6ec06dbb6aea4046a2a8", "requires": { - "@parity/api": "2.0.13", - "@parity/dapp-account": "github:paritytech/dapp-account#ddfc58a1178adfb4f829268714ecd5dd001b22d5", - "@parity/shared": "2.0.13", - "@parity/ui": "2.0.43" + "@parity/dapp-account": "github:paritytech/dapp-account#67eec35f3ef21aab77aee5c2ca4b8ae0bf5251f0" } }, "@parity/dapp-contracts": { - "version": "github:paritytech/dapp-contracts#cc380c7811500a1fae21f32bdf3a8e2b95ef1064", + "version": "github:paritytech/dapp-contracts#6da86f65d367cab14c372825d8b25553d05ad4e8", "requires": { - "@parity/api": "2.0.13", - "@parity/dapp-account": "github:paritytech/dapp-account#ddfc58a1178adfb4f829268714ecd5dd001b22d5", - "@parity/dapp-accounts": "github:paritytech/dapp-accounts#40c13b7a554b300b1ba50a1c027a5c8f99c27e47", - "@parity/shared": "2.0.13", - "@parity/ui": "2.0.43" + "@parity/dapp-account": "github:paritytech/dapp-account#67eec35f3ef21aab77aee5c2ca4b8ae0bf5251f0", + "@parity/dapp-accounts": "github:paritytech/dapp-accounts#8abec008e59c4c4df8902188371ab83c77d1d3de" } }, "@parity/dapp-dapp-accounts": { - "version": "github:paritytech/dapp-dapp-accounts#218ea4197cf81b52322827c8bc3e10d34c896a04", - "requires": { - "@parity/api": "2.0.13", - "@parity/shared": "2.0.13", - "@parity/ui": "2.0.43" - } + "version": "github:paritytech/dapp-dapp-accounts#d1692a1ed49809d4b0572e48aad0a4ed2926a10a" }, "@parity/dapp-dapp-methods": { - "version": "github:paritytech/dapp-dapp-methods#3dc5b1f81e917db1682a87664bff188ffd60064f", - "requires": { - "@parity/api": "2.0.13", - "@parity/shared": "2.0.13", - "@parity/ui": "2.0.43" - } + "version": "github:paritytech/dapp-dapp-methods#3ecabdb95ef82578d5e1da4842a078db0db82d7b" }, "@parity/dapp-dapp-visible": { - "version": "github:paritytech/dapp-dapp-visible#f2d69a5b26ccf407c34397c21f755b02a54215a8", - "requires": { - "@parity/api": "2.0.13", - "@parity/shared": "2.0.13", - "@parity/ui": "2.0.43" - } + "version": "github:paritytech/dapp-dapp-visible#337db256537c4c8195b46a1fd18fb9330d664180" }, "@parity/dapp-dappreg": { - "version": "github:paritytech/dapp-dappreg#41a0ffcef2c2b44c8c5b5a873c98f67f23370ea6", - "requires": { - "@parity/api": "2.0.13", - "@parity/shared": "2.0.13", - "@parity/ui": "2.0.43" - } + "version": "github:paritytech/dapp-dappreg#10238d9074094fb1c97236d2416709db4267b4d2" }, "@parity/dapp-develop": { - "version": "github:paritytech/dapp-develop#185db94376a61c4b7b78375f10c27416226bc4aa", + "version": "github:paritytech/dapp-develop#e7a32ecf2ff84772d2c437556b718cc1a56d656f", "requires": { - "@parity/api": "2.0.13", - "@parity/dapp-contracts": "github:paritytech/dapp-contracts#cc380c7811500a1fae21f32bdf3a8e2b95ef1064", - "@parity/parity.js": "1.8.7", - "@parity/shared": "2.0.13", - "@parity/ui": "2.0.43", - "oo7": "0.5.3", - "oo7-parity": "0.6.8", - "oo7-react": "0.4.5", - "parity-reactive-ui": "0.4.5", - "promise-worker": "1.1.1", - "serviceworker-webpack-plugin": "0.2.3", - "sw-toolbox": "3.6.0", - "worker-loader": "0.8.1" + "@parity/dapp-contracts": "github:paritytech/dapp-contracts#6da86f65d367cab14c372825d8b25553d05ad4e8" } }, "@parity/dapp-githubhint": { - "version": "github:paritytech/dapp-githubhint#91bc003fdde78d028f48cdea1730fdbc64e2f685", - "requires": { - "@parity/api": "2.0.13", - "@parity/shared": "2.0.13", - "moment": "2.17.0", - "react": "15.6.1", - "react-dom": "15.6.1", - "react-tap-event-plugin": "2.0.1" - } + "version": "github:paritytech/dapp-githubhint#76c60102473f80a240b99b9d1e7b84de3d7101c8" }, "@parity/dapp-home": { - "version": "github:paritytech/dapp-home#be2039a0ab00b953e16dea5ec05638455a08cd3e", + "version": "github:paritytech/dapp-home#3a8c6c8efcb5c92390518f5d1cfcb3408089f218", "requires": { - "@parity/api": "2.0.13", - "@parity/dapp-web": "github:paritytech/dapp-web#4223b9c246f0ec4fe0e08c183c9791d3b4a8ddfe", - "@parity/shared": "2.0.13", - "@parity/ui": "2.0.43", - "react-markdown": "2.4.4" - }, - "dependencies": { - "react-markdown": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-2.4.4.tgz", - "integrity": "sha1-JtglQ40pLnym4pL+diAeHb8s/u4=", - "requires": { - "commonmark": "0.24.0", - "commonmark-react-renderer": "4.3.3", - "in-publish": "2.0.0" - } - } + "@parity/dapp-web": "github:paritytech/dapp-web#9fc091bad5fc7c960da3c90d630732ef48d7fdf7" } }, "@parity/dapp-localtx": { - "version": "github:paritytech/dapp-localtx#5c7215ea99a7be508d6d1330220460b52df638fd", - "requires": { - "@parity/api": "2.0.13", - "@parity/shared": "2.0.13", - "@parity/ui": "2.0.43" - } + "version": "github:paritytech/dapp-localtx#a83b527d969f5f5de6ea02d6dcf1729e08b1ec02" }, "@parity/dapp-playground": { "version": "github:paritytech/dapp-playground#e136730fa64aceae2d7e0d2cd2aeea24d22b30f3", "requires": { - "@parity/api": "2.0.13", - "@parity/shared": "2.0.13", - "@parity/ui": "2.0.43" + "@parity/api": "2.0.17", + "@parity/shared": "2.0.17", + "@parity/ui": "2.0.47" } }, "@parity/dapp-registry": { "version": "github:paritytech/dapp-registry#8a3f61d10e858fe81b3731dd231b73e66a0879d9", "requires": { - "@parity/api": "2.0.13", - "@parity/shared": "2.0.13", - "@parity/ui": "2.0.43", + "@parity/api": "2.0.17", + "@parity/shared": "2.0.17", + "@parity/ui": "2.0.47", "material-ui": "0.16.5" } }, "@parity/dapp-settings": { - "version": "github:paritytech/dapp-settings#007cbcdb7888c748650b0ace8226604261b9e22d", - "requires": { - "@parity/api": "2.0.13", - "@parity/shared": "2.0.13", - "@parity/ui": "2.0.43" - } + "version": "github:paritytech/dapp-settings#90737d6b34a62fe0843f8acbbf5669427cc2530a" }, "@parity/dapp-signaturereg": { "version": "github:paritytech/dapp-signaturereg#31d70570a5c11bd5d954ccdcccc3dbb8f0e26f76", "requires": { - "@parity/api": "2.0.13", - "@parity/shared": "2.0.13", + "@parity/api": "2.0.17", + "@parity/shared": "2.0.17", "moment": "2.17.0", "react": "15.6.1", "react-dom": "15.6.1", @@ -262,72 +149,41 @@ "@parity/dapp-signer": { "version": "github:paritytech/dapp-signer#96514150d210530eb3261399de84874b80a71f60", "requires": { - "@parity/api": "2.0.13", - "@parity/shared": "2.0.13", - "@parity/ui": "2.0.43" + "@parity/api": "2.0.17", + "@parity/shared": "2.0.17", + "@parity/ui": "2.0.47" } }, "@parity/dapp-status": { - "version": "github:paritytech/dapp-status#8bab531ec5ad85c77d24c2bddcf5d62c625cbfe0", - "requires": { - "@parity/api": "2.0.13", - "@parity/shared": "2.0.13", - "@parity/ui": "2.0.43", - "bytes": "2.4.0", - "format-number": "2.0.1" - } + "version": "github:paritytech/dapp-status#4247a7885d24f7cd402264713ab37e4aab1779c0" }, "@parity/dapp-tokendeploy": { - "version": "github:paritytech/dapp-tokendeploy#cfe8000326515010dd3b1840a92d4cd90ce6bc5e", - "requires": { - "@parity/api": "2.0.13", - "@parity/shared": "2.0.13", - "@parity/ui": "2.0.43" - } + "version": "github:paritytech/dapp-tokendeploy#09931fc07684e01ef0ecaa796a2ebea51ad90d6b" }, "@parity/dapp-tokenreg": { - "version": "github:paritytech/dapp-tokenreg#d8884739726b7a789c5a3dc875e880e1b85cad3a", - "requires": { - "@parity/api": "2.0.13", - "@parity/shared": "2.0.13", - "material-ui": "0.16.5", - "react": "15.6.1", - "react-dom": "15.6.1", - "react-tap-event-plugin": "2.0.1" - } + "version": "github:paritytech/dapp-tokenreg#611f513f4c644c6513e58c4b06ea71a489a72cc7" }, "@parity/dapp-vaults": { - "version": "github:paritytech/dapp-vaults#925990e2cfdf977b25f946c1fc2632b63f4f87c9", - "requires": { - "@parity/api": "2.0.13", - "@parity/shared": "2.0.13", - "@parity/ui": "2.0.43" - } + "version": "github:paritytech/dapp-vaults#b3c16b417e7b1cc671de91c719040924a6632806" }, "@parity/dapp-wallet": { - "version": "github:paritytech/dapp-wallet#6eaba7a70e5cca074f02d3039451d45c5c8eddf1", + "version": "github:paritytech/dapp-wallet#d7fb2e40b879676f99c36b53ce21480722b99b69", "requires": { - "@parity/api": "2.0.13", - "@parity/dapp-account": "github:paritytech/dapp-account#ddfc58a1178adfb4f829268714ecd5dd001b22d5", - "@parity/shared": "2.0.13", - "@parity/ui": "2.0.43" + "@parity/dapp-account": "github:paritytech/dapp-account#67eec35f3ef21aab77aee5c2ca4b8ae0bf5251f0" } }, "@parity/dapp-web": { - "version": "github:paritytech/dapp-web#4223b9c246f0ec4fe0e08c183c9791d3b4a8ddfe", + "version": "github:paritytech/dapp-web#9fc091bad5fc7c960da3c90d630732ef48d7fdf7", "requires": { - "@parity/api": "2.0.13", - "@parity/shared": "2.0.13", - "@parity/ui": "2.0.43", "base32.js": "0.1.0" } }, "@parity/etherscan": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@parity/etherscan/-/etherscan-2.0.13.tgz", - "integrity": "sha512-AW46AfivRWki/442HtiySzbzUtZ6TGKacTNkObml5sj3vGUeT+9izavCmu11lFVVlz/vd+scUULPNHG5VLYirA==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@parity/etherscan/-/etherscan-2.0.17.tgz", + "integrity": "sha512-N5stxDCdKnfnGc54PrRCeq+zXG6Z7kJkefj5ULGaIGebERv9kN0ci0wXOL6/PK8QKVVU0wUs3n+CG3Gm7PVcjg==", "requires": { - "@parity/api": "2.0.13", + "@parity/api": "2.0.17", "bignumber.js": "3.0.1", "es6-promise": "4.1.1", "node-fetch": "1.6.3", @@ -343,64 +199,35 @@ } }, "@parity/jsonrpc": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@parity/jsonrpc/-/jsonrpc-2.0.14.tgz", - "integrity": "sha512-GBO3TRznax+BXsiaxgy7Ejy4aM2Ijf4d96TwsEWkg4B001TD6a/d/QD6dMqNQO+a8o18pYWvH2CMnYPzmUA4OQ==" + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@parity/jsonrpc/-/jsonrpc-2.0.18.tgz", + "integrity": "sha512-PlaRg/bvNRw+HoomyQpBVv0kE4BUw4S1sUUk2J/NikQ9OdmsfMAU8Slyj6p0d+QNvSMMUzZD6gYWlzVj0uhw7Q==" }, "@parity/ledger": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@parity/ledger/-/ledger-2.0.13.tgz", - "integrity": "sha512-OT3PjVfSS6ZMlDooA7kZmg7geJeAjAec6LkafBYX7tb5RBMHFr03iotOTc6N/2Mvz3RZnFSWVuzvKVELwp54Og==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@parity/ledger/-/ledger-2.0.17.tgz", + "integrity": "sha512-sE4FTJ9lWaBDqGfoMNNsPbgXx5NU0utYKnfmMzhdaWs7qhj/7psvMXmGLYLT7IbKfgVF4tlQcAh3BjkH3v5wRg==", "requires": { "u2f-api": "0.0.9", "u2f-api-polyfill": "0.4.3" } }, - "@parity/parity.js": { - "version": "1.8.7", - "resolved": "https://registry.npmjs.org/@parity/parity.js/-/parity.js-1.8.7.tgz", - "integrity": "sha1-LmriG0KoTdtoPZjETvU/JV72rZI=", - "requires": { - "bignumber.js": "2.3.0", - "js-sha3": "0.5.5", - "node-fetch": "1.6.3" - }, - "dependencies": { - "bignumber.js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.3.0.tgz", - "integrity": "sha1-WXoC15Htw9ZPF4UOIXieekCV32Y=" - } - } - }, "@parity/plugin-signer-account": { - "version": "github:paritytech/plugin-signer-account#03cd3564191f1d4dfbea9e9b2158b4a03a37daf8", - "requires": { - "@parity/ui": "2.0.43" - } + "version": "github:paritytech/plugin-signer-account#b64a252097c09bc04cb14749d1d75778e22acbb6" }, "@parity/plugin-signer-default": { - "version": "github:paritytech/plugin-signer-default#fe26dd11431482742d679c83762ead450ed26928", - "requires": { - "@parity/ui": "2.0.43" - } + "version": "github:paritytech/plugin-signer-default#c6755830a3e20156f48a9d3967c152ee6a77fd1f" }, "@parity/plugin-signer-hardware": { - "version": "github:paritytech/plugin-signer-hardware#d549d2344f034d12518c195f6e7519478b35bf15", - "requires": { - "@parity/ui": "2.0.43" - } + "version": "github:paritytech/plugin-signer-hardware#768207e21766ececac0295aa1a00b02925fd3766" }, "@parity/plugin-signer-qr": { - "version": "github:paritytech/plugin-signer-qr#c57202e6c67aa964df838d84906f6f2508fa29fe", - "requires": { - "@parity/ui": "2.0.43" - } + "version": "github:paritytech/plugin-signer-qr#eef7108f90f625a550ad3cf1a970938eebf2bddb" }, "@parity/shapeshift": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@parity/shapeshift/-/shapeshift-2.0.13.tgz", - "integrity": "sha512-mEDrT3vF7aXCuRwnif4wlJS0S2ofw2MPxgxFKTfvYlrU77Q6GxEX/iDabxKQkFihg3000BvS8HOZ/TSv/GTyWA==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@parity/shapeshift/-/shapeshift-2.0.17.tgz", + "integrity": "sha512-zgNV+fqrjT83ksDYUD6rfITDiVq4E8L0kwNyftanlJZ+5oW4EdutU3n7kBMIA0bfaiS0W/py7DX7XN8hEmCXNw==", "requires": { "es6-promise": "4.1.1", "node-fetch": "1.6.3", @@ -415,11 +242,11 @@ } }, "@parity/shared": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@parity/shared/-/shared-2.0.13.tgz", - "integrity": "sha512-vHFVcYx7XvzMauFEN444HSrPNqC+THLdgbm4LrnumGf+rdUjzt1T/0mHhbqW6Vl8mLDAvrPeujcQPseA0ClsQw==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@parity/shared/-/shared-2.0.17.tgz", + "integrity": "sha512-gChwaiVLHClSd9Qkp0d8Cw/bZfCVVLTzvQ31SYqrVK02tU7JRl7e41ABMI2UQgsHjH+K5u16jZnK08m4RmP6gw==", "requires": { - "@parity/ledger": "2.0.13", + "@parity/ledger": "2.0.17", "eventemitter3": "2.0.3", "loglevel": "1.4.1", "mobx": "2.6.4", @@ -436,13 +263,13 @@ } }, "@parity/ui": { - "version": "2.0.43", - "resolved": "https://registry.npmjs.org/@parity/ui/-/ui-2.0.43.tgz", - "integrity": "sha512-JEbn0895ystyPRd7ibsVSv3tAWDd+uY7JrMQYkpGSVUdP00yrL8SMMxOxH0BBZGsvEPkm1eUFkB5+KKOQZ322Q==", + "version": "2.0.47", + "resolved": "https://registry.npmjs.org/@parity/ui/-/ui-2.0.47.tgz", + "integrity": "sha512-iti5HmmFH2Sm909wqBML6uw+cKe3tU89EsQGqmTI7O/9W8JYMT0sc0tVupxlkLfsp6wj2C6Es2CmhOb1cU4C2g==", "requires": { - "@parity/api": "2.0.13", - "@parity/etherscan": "2.0.13", - "@parity/shared": "2.0.13", + "@parity/api": "2.0.17", + "@parity/etherscan": "2.0.17", + "@parity/shared": "2.0.17", "bignumber.js": "3.0.1", "brace": "0.9.0", "date-difference": "1.0.0", @@ -492,9 +319,9 @@ "integrity": "sha1-np7Tq3g39WM7WETmCjVenmPkJ64=" }, "@types/node": { - "version": "7.0.44", - "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.44.tgz", - "integrity": "sha512-5ZskbOk+/EIZErNRo8bgemhtw99PB+CsdOm2wM5qAgc+MwAVL6L9RZv2Hin7Y8S7FewCkPqNlw+3hTmT+PsnJA==", + "version": "7.0.46", + "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.46.tgz", + "integrity": "sha512-u+JAi1KtmaUoU/EHJkxoiuvzyo91FCE41Z9TZWWcOUU3P8oUdlDLdrGzCGWySPgbRMD17B0B+1aaJLYI9egQ6A==", "dev": true }, "JSONStream": { @@ -587,13 +414,12 @@ } }, "ajv": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.3.tgz", - "integrity": "sha1-wG9Zh3jETGsWGrr+NGa4GtGBTtI=", + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, "requires": { "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "json-schema-traverse": "0.3.1", "json-stable-stringify": "1.0.1" } }, @@ -832,9 +658,13 @@ "dev": true }, "async": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.0.tgz", - "integrity": "sha1-J5ZkJyNXOFlWVjP8YnRES+4vjOM=" + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", + "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", + "dev": true, + "requires": { + "lodash": "4.17.4" + } }, "async-each": { "version": "1.0.1", @@ -866,7 +696,7 @@ "dev": true, "requires": { "browserslist": "1.7.7", - "caniuse-db": "1.0.30000747", + "caniuse-db": "1.0.30000750", "normalize-range": "0.1.2", "num2fraction": "1.2.2", "postcss": "5.2.18", @@ -879,8 +709,8 @@ "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "dev": true, "requires": { - "caniuse-db": "1.0.30000747", - "electron-to-chromium": "1.3.26" + "caniuse-db": "1.0.30000750", + "electron-to-chromium": "1.3.27" } } } @@ -1162,19 +992,6 @@ "find-cache-dir": "1.0.0", "loader-utils": "1.1.0", "mkdirp": "0.5.1" - }, - "dependencies": { - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - } } }, "babel-messages": { @@ -2066,7 +1883,8 @@ "big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true }, "bignumber.js": { "version": "3.0.1", @@ -2245,9 +2063,9 @@ } }, "bowser": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.8.0.tgz", - "integrity": "sha512-ARpB9VfvItCA47oBk9tVA/L93fU83Q2YwE1yTjhCyr1tu6Zw74mDHdpXNWutl5/tFGYhgCOfBH83WJY4RBGA3A==" + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.8.1.tgz", + "integrity": "sha512-NMPaR8ILtdLSWzxQtEs16XbxMcY8ohWGQ5V+TZSJS3fNUt/PBAGkF6YWO9B/4qWE23bK3o0moQKq8UyFEosYkA==" }, "brace": { "version": "0.9.0", @@ -2289,9 +2107,9 @@ "dev": true }, "browserify-aes": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.0.tgz", - "integrity": "sha512-W2bIMLYoZ9oow7TyePpMJk9l9LY7O3R61a/68bVCDOtnJynnwe3ZeW2IzzSkrQnPKNdJrxVDn3ALZNisSBwb7g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", + "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", "requires": { "buffer-xor": "1.0.3", "cipher-base": "1.0.4", @@ -2307,7 +2125,7 @@ "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", "dev": true, "requires": { - "browserify-aes": "1.1.0", + "browserify-aes": "1.1.1", "browserify-des": "1.0.0", "evp_bytestokey": "1.0.3" } @@ -2363,8 +2181,8 @@ "integrity": "sha512-jAvM2ku7YDJ+leAq3bFH1DE0Ylw+F+EQDq4GkqZfgPEqpWYw9ofQH85uKSB9r3Tv7XDbfqVtE+sdvKJW7IlPJA==", "dev": true, "requires": { - "caniuse-lite": "1.0.30000747", - "electron-to-chromium": "1.3.26" + "caniuse-lite": "1.0.30000750", + "electron-to-chromium": "1.3.27" } }, "buffer": { @@ -2427,9 +2245,10 @@ "dev": true }, "bytes": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", - "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true }, "caller-path": { "version": "0.1.0", @@ -2484,7 +2303,7 @@ "dev": true, "requires": { "browserslist": "1.7.7", - "caniuse-db": "1.0.30000747", + "caniuse-db": "1.0.30000750", "lodash.memoize": "4.1.2", "lodash.uniq": "4.5.0" }, @@ -2495,22 +2314,22 @@ "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "dev": true, "requires": { - "caniuse-db": "1.0.30000747", - "electron-to-chromium": "1.3.26" + "caniuse-db": "1.0.30000750", + "electron-to-chromium": "1.3.27" } } } }, "caniuse-db": { - "version": "1.0.30000747", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000747.tgz", - "integrity": "sha1-j1vWweXmBFpNTmxqOlktGeGotRQ=", + "version": "1.0.30000750", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000750.tgz", + "integrity": "sha1-Px+FySyRNO3ac1aV42nX4XZ1K3U=", "dev": true }, "caniuse-lite": { - "version": "1.0.30000747", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000747.tgz", - "integrity": "sha1-2obnjhLQZBq+6u5uzVXYG9m9O10=", + "version": "1.0.30000750", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000750.tgz", + "integrity": "sha1-OK0ZqkxtiNo46JANNma047u2XCI=", "dev": true }, "capture-stack-trace": { @@ -2677,6 +2496,7 @@ "requires": { "anymatch": "1.3.2", "async-each": "1.0.1", + "fsevents": "1.1.2", "glob-parent": "2.0.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -2784,7 +2604,8 @@ "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true }, "coa": { "version": "1.0.4", @@ -2792,7 +2613,7 @@ "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", "dev": true, "requires": { - "q": "1.5.0" + "q": "1.5.1" } }, "code-point-at": { @@ -2945,9 +2766,9 @@ } }, "compressible": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.11.tgz", - "integrity": "sha1-FnGKdd4oPtjmBAQWJaIGRYZ5fYo=", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.12.tgz", + "integrity": "sha1-xZpcmdt2dn6YdlAOJx72OzSTvWY=", "dev": true, "requires": { "mime-db": "1.30.0" @@ -2961,19 +2782,11 @@ "requires": { "accepts": "1.3.4", "bytes": "3.0.0", - "compressible": "2.0.11", + "compressible": "2.0.12", "debug": "2.6.9", "on-headers": "1.0.1", "safe-buffer": "5.1.1", "vary": "1.1.2" - }, - "dependencies": { - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - } } }, "concat-map": { @@ -3037,9 +2850,9 @@ "dev": true }, "content-type-parser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.1.tgz", - "integrity": "sha1-w+VpiMU8ZRJ/tG1AMqOpACRv3JQ=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz", + "integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==", "dev": true }, "convert-source-map": { @@ -3077,7 +2890,7 @@ "fs-extra": "0.26.7", "glob": "6.0.4", "is-glob": "3.1.0", - "loader-utils": "0.2.16", + "loader-utils": "0.2.17", "lodash": "4.17.4", "minimatch": "3.0.4", "node-dir": "0.1.17" @@ -3110,6 +2923,18 @@ "requires": { "is-extglob": "2.1.1" } + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } } } }, @@ -3300,19 +3125,6 @@ "postcss-modules-values": "1.3.0", "postcss-value-parser": "3.3.0", "source-list-map": "0.1.8" - }, - "dependencies": { - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - } } }, "css-rule-stream": { @@ -4120,7 +3932,7 @@ "dev": true, "requires": { "browserslist": "1.7.7", - "caniuse-db": "1.0.30000747", + "caniuse-db": "1.0.30000750", "css-rule-stream": "1.1.0", "duplexer2": "0.0.2", "jsonfilter": "1.1.2", @@ -4139,8 +3951,8 @@ "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "dev": true, "requires": { - "caniuse-db": "1.0.30000747", - "electron-to-chromium": "1.3.26" + "caniuse-db": "1.0.30000750", + "electron-to-chromium": "1.3.27" } }, "camelcase": { @@ -4343,7 +4155,7 @@ "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", "requires": { - "browserify-aes": "1.1.0", + "browserify-aes": "1.1.1", "create-hash": "1.1.3", "create-hmac": "1.1.6" } @@ -4418,10 +4230,22 @@ "integrity": "sha1-aHNv3CMaSQ7fkZpkRq2dkFWlh74=", "dev": true, "requires": { - "loader-utils": "0.2.16", + "loader-utils": "0.2.17", "lodash": "3.10.1" }, "dependencies": { + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } + }, "lodash": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", @@ -4446,7 +4270,7 @@ "integrity": "sha1-BloxAr+LhxAt9QxQmF/v5sVpBFs=", "dev": true, "requires": { - "@types/node": "7.0.44", + "@types/node": "7.0.46", "electron-download": "3.3.0", "extract-zip": "1.6.5" } @@ -4490,9 +4314,9 @@ } }, "electron-to-chromium": { - "version": "1.3.26", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.26.tgz", - "integrity": "sha1-mWQnKUhhp02cfIK5Jg6jAejALWY=", + "version": "1.3.27", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz", + "integrity": "sha1-eOy4o5kGYYe7N07t412ccFZagD0=", "dev": true }, "element-resize-detector": { @@ -4520,7 +4344,8 @@ "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true }, "empty-module": { "version": "0.0.2", @@ -4795,7 +4620,7 @@ "file-entry-cache": "2.0.0", "glob": "7.1.2", "globals": "9.18.0", - "ignore": "3.3.5", + "ignore": "3.3.6", "imurmurhash": "0.1.4", "inquirer": "0.12.0", "is-my-json-valid": "2.16.1", @@ -5150,12 +4975,6 @@ "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", "dev": true }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, "qs": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.0.tgz", @@ -5193,7 +5012,21 @@ "integrity": "sha1-ocFGkVJBzEhtUpImPHVV1aoZdm4=", "dev": true, "requires": { - "loader-utils": "0.2.16" + "loader-utils": "0.2.17" + }, + "dependencies": { + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } + } } }, "extract-text-webpack-plugin": { @@ -5206,28 +5039,6 @@ "loader-utils": "1.1.0", "schema-utils": "0.3.0", "webpack-sources": "1.0.1" - }, - "dependencies": { - "async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", - "dev": true, - "requires": { - "lodash": "4.17.4" - } - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - } } }, "extract-zip": { @@ -5287,7 +5098,14 @@ "fast-deep-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true }, "fast-levenshtein": { "version": "2.0.6", @@ -5366,7 +5184,21 @@ "integrity": "sha1-u+bbdHSsksf1T9wZfPVH6YtrjhI=", "dev": true, "requires": { - "loader-utils": "0.2.16" + "loader-utils": "0.2.17" + }, + "dependencies": { + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } + } } }, "file-saver": { @@ -5414,9 +5246,9 @@ } }, "filesize": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.10.tgz", - "integrity": "sha1-/I+iPdtO+eXgq24eZPZ5okpWdh8=", + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.11.tgz", + "integrity": "sha512-ZH7loueKBoDb7yG9esn1U+fgq7BzlzW6NRi5/rMdxIZ05dj7GFD/Xc5rq2CDt5Yq86CyfSYVyx4242QQNZbx1g==", "dev": true }, "fill-range": { @@ -5480,7 +5312,7 @@ "dev": true, "requires": { "commondir": "1.0.1", - "make-dir": "1.0.0", + "make-dir": "1.1.0", "pkg-dir": "2.0.0" } }, @@ -5587,11 +5419,6 @@ "mime-types": "2.1.17" } }, - "format-number": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/format-number/-/format-number-2.0.1.tgz", - "integrity": "sha1-6SMah0PKZLR9CVVdzkApY0O+Zus=" - }, "formatio": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", @@ -5638,6 +5465,905 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", + "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.7.0", + "node-pre-gyp": "0.6.36" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.36", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -6133,12 +6859,18 @@ "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", "dev": true, "requires": { - "async": "1.5.0", + "async": "1.5.2", "optimist": "0.6.1", "source-map": "0.4.4", "uglify-js": "2.8.22" }, "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, "source-map": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", @@ -6154,12 +6886,33 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/happypack/-/happypack-3.1.0.tgz", "integrity": "sha1-i8VeNwG6z/cY04icuItQIWQcrVk=", + "dev": true, "requires": { "async": "1.5.0", "json-stringify-safe": "5.0.1", "loader-utils": "0.2.16", "mkdirp": "0.5.1", "serialize-error": "2.1.0" + }, + "dependencies": { + "async": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.0.tgz", + "integrity": "sha1-J5ZkJyNXOFlWVjP8YnRES+4vjOM=", + "dev": true + }, + "loader-utils": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.16.tgz", + "integrity": "sha1-8IYyBm7YKCg13/iN+1JwR2Wt7m0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } + } } }, "har-validator": { @@ -6326,12 +7079,12 @@ "dev": true }, "html-encoding-sniffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz", - "integrity": "sha1-eb96eF6klf5mFl5zQVPzY/9UN9o=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "dev": true, "requires": { - "whatwg-encoding": "1.0.1" + "whatwg-encoding": "1.0.2" } }, "html-entities": { @@ -6349,8 +7102,22 @@ "es6-templates": "0.2.3", "fastparse": "1.1.1", "html-minifier": "3.5.6", - "loader-utils": "0.2.16", + "loader-utils": "0.2.17", "object-assign": "4.1.1" + }, + "dependencies": { + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } + } } }, "html-minifier": { @@ -6366,7 +7133,7 @@ "ncname": "1.0.0", "param-case": "2.1.1", "relateurl": "0.2.7", - "uglify-js": "3.1.4" + "uglify-js": "3.1.5" }, "dependencies": { "source-map": { @@ -6376,9 +7143,9 @@ "dev": true }, "uglify-js": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.1.4.tgz", - "integrity": "sha512-DcbkPg11Lw2lAWpwCmQDX+qoR4JiII6ypsQmF6tscZtlxGPFAmSRUGuMoVT3/0EHqypVik/TpkH4ITiMJeQqQA==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.1.5.tgz", + "integrity": "sha512-tSqlO7/GZHAVSw6mbtJt2kz0ZcUrKUH7Xg92o52aE+gL0r6cXiASZY4dpHqQ7RVGXmoQuPA2qAkG4TkP59f8XA==", "dev": true, "requires": { "commander": "2.11.0", @@ -6401,7 +7168,7 @@ "requires": { "bluebird": "3.5.1", "html-minifier": "3.5.6", - "loader-utils": "0.2.16", + "loader-utils": "0.2.17", "lodash": "4.17.4", "pretty-error": "2.1.1", "toposort": "1.0.6" @@ -6412,6 +7179,18 @@ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } } } }, @@ -6577,9 +7356,9 @@ } }, "chalk": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.0.tgz", - "integrity": "sha512-0BMM/2hG3ZaoPfR6F+h/oWpZtsh3b/s62TjSM6MGCJWEbJDN1acqCXvyhhZsDSVFklpebUoQ5O1kKC7lOzrn9g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { "ansi-styles": "3.2.0", @@ -6599,7 +7378,7 @@ "integrity": "sha512-nHsrD1PPTMSJDfU+osVsLtPkSP9YGeoOz4FDLN4r1DW4N5vqL1J+gACzTQHsfwIiWG/0/nV4yCzjTMo1zD8U1g==", "dev": true, "requires": { - "chalk": "2.2.0", + "chalk": "2.3.0", "source-map": "0.6.1", "supports-color": "4.5.0" } @@ -6628,9 +7407,9 @@ "dev": true }, "ignore": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.5.tgz", - "integrity": "sha512-JLH93mL8amZQhh/p6mfQgVBH3M6epNq3DfsXsTSuSrInVjwyYlFE1nv2AgfRCC8PoOhM0jwQ5v8s9LgbK7yGDw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.6.tgz", + "integrity": "sha512-HrxmNxKTGZ9a3uAl/FNG66Sdt0G9L4TtMbbUQjP1WhGmSj0FOyHvSgx7623aGJvXfPOur8MwmarlHT+37jmzlw==", "dev": true }, "ignore-styles": { @@ -6652,7 +7431,7 @@ "imagemin-optipng": "5.2.1", "imagemin-pngquant": "5.0.1", "imagemin-svgo": "5.2.2", - "loader-utils": "0.2.16" + "loader-utils": "0.2.17" }, "dependencies": { "file-loader": { @@ -6661,7 +7440,19 @@ "integrity": "sha1-HS2t3UJM5tGwfP4/eXMb7TYXq0I=", "dev": true, "requires": { - "loader-utils": "0.2.16" + "loader-utils": "0.2.17" + } + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" } } } @@ -6674,7 +7465,7 @@ "requires": { "file-type": "4.4.0", "globby": "6.1.0", - "make-dir": "1.0.0", + "make-dir": "1.1.0", "p-pipe": "1.2.0", "pify": "2.3.0", "replace-ext": "1.0.0" @@ -6749,11 +7540,6 @@ "svgo": "0.7.2" } }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" - }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -6810,7 +7596,7 @@ "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-2.0.5.tgz", "integrity": "sha1-wVPH6I/YT+9cYC6VqBaLJ3BnH+c=", "requires": { - "bowser": "1.8.0", + "bowser": "1.8.1", "hyphenate-style-name": "1.0.2" } }, @@ -7152,11 +7938,6 @@ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, "is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", @@ -7309,43 +8090,42 @@ "dev": true, "requires": { "abbrev": "1.0.9", - "async": "1.5.0", - "istanbul-api": "1.1.14", + "async": "1.5.2", + "istanbul-api": "1.2.1", "js-yaml": "3.6.1", "mkdirp": "0.5.1", "nopt": "3.0.6", "which": "1.3.0", "wordwrap": "1.0.0" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } } }, "istanbul-api": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.1.14.tgz", - "integrity": "sha1-JbxXAffGgMD//5E95G42GaOm5oA=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.2.1.tgz", + "integrity": "sha512-oFCwXvd65amgaPCzqrR+a2XjanS1MvpXN6l/MlMUTv6uiA1NOgGX+I0uyq8Lg3GDxsxPsaP1049krz3hIJ5+KA==", "dev": true, "requires": { "async": "2.5.0", "fileset": "2.0.3", "istanbul-lib-coverage": "1.1.1", - "istanbul-lib-hook": "1.0.7", - "istanbul-lib-instrument": "1.8.0", - "istanbul-lib-report": "1.1.1", - "istanbul-lib-source-maps": "1.2.1", - "istanbul-reports": "1.1.2", + "istanbul-lib-hook": "1.1.0", + "istanbul-lib-instrument": "1.9.1", + "istanbul-lib-report": "1.1.2", + "istanbul-lib-source-maps": "1.2.2", + "istanbul-reports": "1.1.3", "js-yaml": "3.10.0", "mkdirp": "0.5.1", "once": "1.4.0" }, "dependencies": { - "async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", - "dev": true, - "requires": { - "lodash": "4.17.4" - } - }, "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", @@ -7371,18 +8151,18 @@ "dev": true }, "istanbul-lib-hook": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz", - "integrity": "sha512-3U2HB9y1ZV9UmFlE12Fx+nPtFqIymzrqCksrXujm3NVbAZIJg/RfYgO1XiIa0mbmxTjWpVEVlkIZJ25xVIAfkQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz", + "integrity": "sha512-U3qEgwVDUerZ0bt8cfl3dSP3S6opBoOtk3ROO5f2EfBr/SRiD9FQqzwaZBqFORu8W7O0EXpai+k7kxHK13beRg==", "dev": true, "requires": { "append-transform": "0.4.0" } }, "istanbul-lib-instrument": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.8.0.tgz", - "integrity": "sha1-ZvbJQhzJ7EcE928tsIS6kHiitTI=", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz", + "integrity": "sha512-RQmXeQ7sphar7k7O1wTNzVczF9igKpaeGQAG9qR2L+BS4DCJNTI9nytRmIVYevwO0bbq+2CXvJmYDuz0gMrywA==", "dev": true, "requires": { "babel-generator": "6.26.0", @@ -7395,9 +8175,9 @@ } }, "istanbul-lib-report": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", - "integrity": "sha512-tvF+YmCmH4thnez6JFX06ujIA19WPa9YUiwjc1uALF2cv5dmE3It8b5I8Ob7FHJ70H9Y5yF+TDkVa/mcADuw1Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.2.tgz", + "integrity": "sha512-UTv4VGx+HZivJQwAo1wnRwe1KTvFpfi/NYwN7DcsrdzMXwpRT/Yb6r4SBPoHWj4VuQPakR32g4PUUeyKkdDkBA==", "dev": true, "requires": { "istanbul-lib-coverage": "1.1.1", @@ -7418,22 +8198,33 @@ } }, "istanbul-lib-source-maps": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz", - "integrity": "sha512-mukVvSXCn9JQvdJl8wP/iPhqig0MRtuWuD4ZNKo6vB2Ik//AmhAKe3QnPN02dmkRe3lTudFk3rzoHhwU4hb94w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.2.tgz", + "integrity": "sha512-8BfdqSfEdtip7/wo1RnrvLpHVEd8zMZEDmOFEnpC6dg0vXflHt9nvoAyQUzig2uMSXfF2OBEYBV3CVjIL9JvaQ==", "dev": true, "requires": { - "debug": "2.6.9", + "debug": "3.1.0", "istanbul-lib-coverage": "1.1.1", "mkdirp": "0.5.1", "rimraf": "2.6.2", "source-map": "0.5.7" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha1-D7Lj9qqZIr085F0F2KtNXo4HvU8=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.3.tgz", + "integrity": "sha512-ZEelkHh8hrZNI5xDaKwPMFwDsUf5wIEI2bXAFGp1e6deR2mnEKBPhLJEgr4ZBt8Gi6Mj38E/C8kcy9XLggVO2Q==", "dev": true, "requires": { "handlebars": "4.0.11" @@ -7487,11 +8278,11 @@ "acorn": "4.0.13", "acorn-globals": "3.1.0", "array-equal": "1.0.0", - "content-type-parser": "1.0.1", + "content-type-parser": "1.0.2", "cssom": "0.3.2", "cssstyle": "0.2.37", "escodegen": "1.9.0", - "html-encoding-sniffer": "1.0.1", + "html-encoding-sniffer": "1.0.2", "nwmatcher": "1.4.3", "parse5": "1.5.1", "request": "2.79.0", @@ -7499,7 +8290,7 @@ "symbol-tree": "3.2.2", "tough-cookie": "2.3.3", "webidl-conversions": "4.0.2", - "whatwg-encoding": "1.0.1", + "whatwg-encoding": "1.0.2", "whatwg-url": "4.8.0", "xml-name-validator": "2.0.1" }, @@ -7532,12 +8323,14 @@ "json-schema-traverse": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true }, "json-stable-stringify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, "requires": { "jsonify": "0.0.0" } @@ -7545,7 +8338,8 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true }, "json3": { "version": "3.3.2", @@ -7624,7 +8418,8 @@ "jsonify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true }, "jsonparse": { "version": "0.0.5", @@ -7826,14 +8621,6 @@ "type-check": "0.3.2" } }, - "lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", - "requires": { - "immediate": "3.0.6" - } - }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -7853,14 +8640,14 @@ "dev": true }, "loader-utils": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.16.tgz", - "integrity": "sha1-8IYyBm7YKCg13/iN+1JwR2Wt7m0=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, "requires": { "big.js": "3.2.0", "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" + "json5": "0.5.1" } }, "locate-path": { @@ -8255,12 +9042,20 @@ "dev": true }, "make-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz", - "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", + "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", "dev": true, "requires": { - "pify": "2.3.0" + "pify": "3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } } }, "map-obj": { @@ -8274,8 +9069,22 @@ "integrity": "sha1-Qhhi04xCJP02FetkgBfqOFtWLXg=", "dev": true, "requires": { - "loader-utils": "0.2.16", + "loader-utils": "0.2.17", "marked": "0.3.6" + }, + "dependencies": { + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } + } } }, "marked": { @@ -9096,47 +9905,7 @@ "dev": true }, "oo7": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/oo7/-/oo7-0.5.3.tgz", - "integrity": "sha1-9NrJBBivXOQcTAYPRMAVX7ZDa+Q=" - }, - "oo7-parity": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/oo7-parity/-/oo7-parity-0.6.8.tgz", - "integrity": "sha1-xzluhPMzPG8L/coRO8sAG1zKhaY=", - "requires": { - "@parity/parity.js": "1.8.7", - "bignumber.js": "4.1.0", - "oo7": "0.5.6" - }, - "dependencies": { - "bignumber.js": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.1.0.tgz", - "integrity": "sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA==" - }, - "oo7": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/oo7/-/oo7-0.5.6.tgz", - "integrity": "sha1-dEPPgaX+PRA5kxTN4BHoAA6hYAM=" - } - } - }, - "oo7-react": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/oo7-react/-/oo7-react-0.4.5.tgz", - "integrity": "sha1-kn/Onjjwn2iWlhooYhFIGrdvZZ8=", - "requires": { - "oo7": "0.5.6", - "react": "15.6.1" - }, - "dependencies": { - "oo7": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/oo7/-/oo7-0.5.6.tgz", - "integrity": "sha1-dEPPgaX+PRA5kxTN4BHoAA6hYAM=" - } - } + "version": "github:paritytech/oo7#34fdb5991f4e59b2cf84260cab48cec9a57d88c0" }, "opn": { "version": "4.0.2", @@ -9311,52 +10080,6 @@ "no-case": "2.3.2" } }, - "parity-reactive-ui": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/parity-reactive-ui/-/parity-reactive-ui-0.4.5.tgz", - "integrity": "sha1-ravl0YV24B9iFSZP9LfbBUktnr8=", - "requires": { - "bignumber.js": "4.1.0", - "blockies": "0.0.2", - "oo7": "0.5.3", - "oo7-parity": "0.6.8", - "oo7-react": "0.4.5", - "prop-types": "15.5.10", - "react": "15.6.1", - "react-dom": "15.6.1", - "semantic-ui-css": "2.2.11", - "semantic-ui-react": "0.68.5" - }, - "dependencies": { - "bignumber.js": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.1.0.tgz", - "integrity": "sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA==" - }, - "semantic-ui-react": { - "version": "0.68.5", - "resolved": "https://registry.npmjs.org/semantic-ui-react/-/semantic-ui-react-0.68.5.tgz", - "integrity": "sha1-F5u4nDh/gRcCbKAfboSQ2x/Y5xM=", - "requires": { - "babel-runtime": "6.26.0", - "classnames": "2.2.5", - "debug": "2.6.9", - "lodash": "4.17.4", - "prop-types": "15.5.8" - }, - "dependencies": { - "prop-types": { - "version": "15.5.8", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.8.tgz", - "integrity": "sha1-a3suFBCDvjjIWVqlH8VXdccZk5Q=", - "requires": { - "fbjs": "0.8.16" - } - } - } - } - } - }, "parse-asn1": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", @@ -9364,7 +10087,7 @@ "dev": true, "requires": { "asn1.js": "4.9.1", - "browserify-aes": "1.1.0", + "browserify-aes": "1.1.1", "create-hash": "1.1.3", "evp_bytestokey": "1.0.3", "pbkdf2": "3.0.14" @@ -9451,19 +10174,10 @@ "dev": true }, "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", - "requires": { - "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - } - } + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true }, "path-type": { "version": "1.1.0", @@ -9499,11 +10213,6 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, - "phoneformat.js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/phoneformat.js/-/phoneformat.js-1.0.3.tgz", - "integrity": "sha1-Eb40dOdkdFQP43NMwz8aZYQdX4c=" - }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -9718,7 +10427,7 @@ "postcss": "6.0.13", "postcss-value-parser": "3.3.0", "read-cache": "1.0.0", - "resolve": "1.4.0" + "resolve": "1.5.0" }, "dependencies": { "ansi-styles": { @@ -9731,9 +10440,9 @@ } }, "chalk": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.0.tgz", - "integrity": "sha512-0BMM/2hG3ZaoPfR6F+h/oWpZtsh3b/s62TjSM6MGCJWEbJDN1acqCXvyhhZsDSVFklpebUoQ5O1kKC7lOzrn9g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { "ansi-styles": "3.2.0", @@ -9753,7 +10462,7 @@ "integrity": "sha512-nHsrD1PPTMSJDfU+osVsLtPkSP9YGeoOz4FDLN4r1DW4N5vqL1J+gACzTQHsfwIiWG/0/nV4yCzjTMo1zD8U1g==", "dev": true, "requires": { - "chalk": "2.2.0", + "chalk": "2.3.0", "source-map": "0.6.1", "supports-color": "4.5.0" } @@ -9838,9 +10547,9 @@ } }, "chalk": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.0.tgz", - "integrity": "sha512-0BMM/2hG3ZaoPfR6F+h/oWpZtsh3b/s62TjSM6MGCJWEbJDN1acqCXvyhhZsDSVFklpebUoQ5O1kKC7lOzrn9g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { "ansi-styles": "3.2.0", @@ -9854,24 +10563,13 @@ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", "dev": true }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - }, "postcss": { "version": "6.0.13", "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.13.tgz", "integrity": "sha512-nHsrD1PPTMSJDfU+osVsLtPkSP9YGeoOz4FDLN4r1DW4N5vqL1J+gACzTQHsfwIiWG/0/nV4yCzjTMo1zD8U1g==", "dev": true, "requires": { - "chalk": "2.2.0", + "chalk": "2.3.0", "source-map": "0.6.1", "supports-color": "4.5.0" } @@ -9938,8 +10636,8 @@ "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "dev": true, "requires": { - "caniuse-db": "1.0.30000747", - "electron-to-chromium": "1.3.26" + "caniuse-db": "1.0.30000750", + "electron-to-chromium": "1.3.27" } } } @@ -10014,9 +10712,9 @@ } }, "chalk": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.0.tgz", - "integrity": "sha512-0BMM/2hG3ZaoPfR6F+h/oWpZtsh3b/s62TjSM6MGCJWEbJDN1acqCXvyhhZsDSVFklpebUoQ5O1kKC7lOzrn9g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { "ansi-styles": "3.2.0", @@ -10036,7 +10734,7 @@ "integrity": "sha512-nHsrD1PPTMSJDfU+osVsLtPkSP9YGeoOz4FDLN4r1DW4N5vqL1J+gACzTQHsfwIiWG/0/nV4yCzjTMo1zD8U1g==", "dev": true, "requires": { - "chalk": "2.2.0", + "chalk": "2.3.0", "source-map": "0.6.1", "supports-color": "4.5.0" } @@ -10078,9 +10776,9 @@ } }, "chalk": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.0.tgz", - "integrity": "sha512-0BMM/2hG3ZaoPfR6F+h/oWpZtsh3b/s62TjSM6MGCJWEbJDN1acqCXvyhhZsDSVFklpebUoQ5O1kKC7lOzrn9g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { "ansi-styles": "3.2.0", @@ -10100,7 +10798,7 @@ "integrity": "sha512-nHsrD1PPTMSJDfU+osVsLtPkSP9YGeoOz4FDLN4r1DW4N5vqL1J+gACzTQHsfwIiWG/0/nV4yCzjTMo1zD8U1g==", "dev": true, "requires": { - "chalk": "2.2.0", + "chalk": "2.3.0", "source-map": "0.6.1", "supports-color": "4.5.0" } @@ -10142,9 +10840,9 @@ } }, "chalk": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.0.tgz", - "integrity": "sha512-0BMM/2hG3ZaoPfR6F+h/oWpZtsh3b/s62TjSM6MGCJWEbJDN1acqCXvyhhZsDSVFklpebUoQ5O1kKC7lOzrn9g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { "ansi-styles": "3.2.0", @@ -10164,7 +10862,7 @@ "integrity": "sha512-nHsrD1PPTMSJDfU+osVsLtPkSP9YGeoOz4FDLN4r1DW4N5vqL1J+gACzTQHsfwIiWG/0/nV4yCzjTMo1zD8U1g==", "dev": true, "requires": { - "chalk": "2.2.0", + "chalk": "2.3.0", "source-map": "0.6.1", "supports-color": "4.5.0" } @@ -10206,9 +10904,9 @@ } }, "chalk": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.0.tgz", - "integrity": "sha512-0BMM/2hG3ZaoPfR6F+h/oWpZtsh3b/s62TjSM6MGCJWEbJDN1acqCXvyhhZsDSVFklpebUoQ5O1kKC7lOzrn9g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { "ansi-styles": "3.2.0", @@ -10228,7 +10926,7 @@ "integrity": "sha512-nHsrD1PPTMSJDfU+osVsLtPkSP9YGeoOz4FDLN4r1DW4N5vqL1J+gACzTQHsfwIiWG/0/nV4yCzjTMo1zD8U1g==", "dev": true, "requires": { - "chalk": "2.2.0", + "chalk": "2.3.0", "source-map": "0.6.1", "supports-color": "4.5.0" } @@ -10270,9 +10968,9 @@ } }, "chalk": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.0.tgz", - "integrity": "sha512-0BMM/2hG3ZaoPfR6F+h/oWpZtsh3b/s62TjSM6MGCJWEbJDN1acqCXvyhhZsDSVFklpebUoQ5O1kKC7lOzrn9g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { "ansi-styles": "3.2.0", @@ -10292,7 +10990,7 @@ "integrity": "sha512-nHsrD1PPTMSJDfU+osVsLtPkSP9YGeoOz4FDLN4r1DW4N5vqL1J+gACzTQHsfwIiWG/0/nV4yCzjTMo1zD8U1g==", "dev": true, "requires": { - "chalk": "2.2.0", + "chalk": "2.3.0", "source-map": "0.6.1", "supports-color": "4.5.0" } @@ -10432,9 +11130,9 @@ } }, "chalk": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.0.tgz", - "integrity": "sha512-0BMM/2hG3ZaoPfR6F+h/oWpZtsh3b/s62TjSM6MGCJWEbJDN1acqCXvyhhZsDSVFklpebUoQ5O1kKC7lOzrn9g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { "ansi-styles": "3.2.0", @@ -10454,7 +11152,7 @@ "integrity": "sha512-nHsrD1PPTMSJDfU+osVsLtPkSP9YGeoOz4FDLN4r1DW4N5vqL1J+gACzTQHsfwIiWG/0/nV4yCzjTMo1zD8U1g==", "dev": true, "requires": { - "chalk": "2.2.0", + "chalk": "2.3.0", "source-map": "0.6.1", "supports-color": "4.5.0" } @@ -10630,15 +11328,6 @@ "asap": "2.0.6" } }, - "promise-worker": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/promise-worker/-/promise-worker-1.1.1.tgz", - "integrity": "sha1-wrddBF0kliXAImTi3/mtIuAxxps=", - "requires": { - "is-promise": "2.1.0", - "lie": "3.1.1" - } - }, "prop-types": { "version": "15.5.10", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", @@ -10710,9 +11399,9 @@ "integrity": "sha1-T606n5CEQhLiqmfQc6I9Rw4yqJE=" }, "q": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.0.tgz", - "integrity": "sha1-3QG6ydBtMObyGa7LglPunr3DCPE=", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", "dev": true }, "qrcode-generator": { @@ -11297,7 +11986,7 @@ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "resolve": "1.4.0" + "resolve": "1.5.0" } }, "recompose": { @@ -11647,9 +12336,9 @@ "dev": true }, "resolve": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", "dev": true, "requires": { "path-parse": "1.0.5" @@ -11739,8 +12428,23 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, "requires": { - "ajv": "5.2.3" + "ajv": "5.3.0" + }, + "dependencies": { + "ajv": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz", + "integrity": "sha1-RBT/dKUIecII7l/cgm4ywwNUnto=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + } } }, "scryptsy": { @@ -11902,7 +12606,8 @@ "serialize-error": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", - "integrity": "sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=" + "integrity": "sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=", + "dev": true }, "serve-index": { "version": "1.9.1", @@ -11951,19 +12656,6 @@ "send": "0.14.2" } }, - "serviceworker-cache-polyfill": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz", - "integrity": "sha1-3hnuc77yGrPAdAo3sz22JGS6ves=" - }, - "serviceworker-webpack-plugin": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/serviceworker-webpack-plugin/-/serviceworker-webpack-plugin-0.2.3.tgz", - "integrity": "sha1-GHPtb8g8hzrIJA+sRDxhXTdP7rI=", - "requires": { - "minimatch": "3.0.4" - } - }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -12602,19 +13294,6 @@ "requires": { "loader-utils": "1.1.0", "schema-utils": "0.3.0" - }, - "dependencies": { - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - } } }, "style-search": { @@ -12648,8 +13327,8 @@ "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "dev": true, "requires": { - "caniuse-db": "1.0.30000747", - "electron-to-chromium": "1.3.26" + "caniuse-db": "1.0.30000750", + "electron-to-chromium": "1.3.27" } }, "minimist": { @@ -12691,7 +13370,7 @@ "globby": "6.1.0", "globjoin": "0.1.4", "html-tags": "1.2.0", - "ignore": "3.3.5", + "ignore": "3.3.6", "imurmurhash": "0.1.4", "known-css-properties": "0.2.0", "lodash": "4.17.4", @@ -12719,6 +13398,18 @@ "table": "4.0.2" }, "dependencies": { + "ajv": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz", + "integrity": "sha1-RBT/dKUIecII7l/cgm4ywwNUnto=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, "ajv-keywords": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.0.tgz", @@ -12826,18 +13517,18 @@ "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", "dev": true, "requires": { - "ajv": "5.2.3", + "ajv": "5.3.0", "ajv-keywords": "2.1.0", - "chalk": "2.2.0", + "chalk": "2.3.0", "lodash": "4.17.4", "slice-ansi": "1.0.0", "string-width": "2.1.1" }, "dependencies": { "chalk": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.0.tgz", - "integrity": "sha512-0BMM/2hG3ZaoPfR6F+h/oWpZtsh3b/s62TjSM6MGCJWEbJDN1acqCXvyhhZsDSVFklpebUoQ5O1kKC7lOzrn9g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { "ansi-styles": "3.2.0", @@ -12921,15 +13612,6 @@ } } }, - "sw-toolbox": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/sw-toolbox/-/sw-toolbox-3.6.0.tgz", - "integrity": "sha1-Jt8dHHA0hljk3qKIQxkUm3sxg7U=", - "requires": { - "path-to-regexp": "1.7.0", - "serviceworker-cache-polyfill": "4.0.0" - } - }, "symbol-observable": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz", @@ -12972,16 +13654,6 @@ "string-width": "2.1.1" }, "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", @@ -13541,10 +14213,22 @@ "integrity": "sha1-Z+h3l1n4AA2nSZSQZoDJQ6mwkl0=", "dev": true, "requires": { - "loader-utils": "0.2.16", + "loader-utils": "0.2.17", "mime": "1.2.11" }, "dependencies": { + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } + }, "mime": { "version": "1.2.11", "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", @@ -13810,17 +14494,6 @@ "async": "2.5.0", "chokidar": "1.7.0", "graceful-fs": "4.1.11" - }, - "dependencies": { - "async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", - "dev": true, - "requires": { - "lodash": "4.17.4" - } - } } }, "wbuf": { @@ -13862,7 +14535,7 @@ "requires": { "acorn": "5.1.2", "acorn-dynamic-import": "2.0.2", - "ajv": "5.2.3", + "ajv": "5.3.0", "ajv-keywords": "2.1.0", "async": "2.5.0", "enhanced-resolve": "3.4.1", @@ -13884,6 +14557,18 @@ "yargs": "8.0.2" }, "dependencies": { + "ajv": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz", + "integrity": "sha1-RBT/dKUIecII7l/cgm4ywwNUnto=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, "ajv-keywords": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.0.tgz", @@ -13896,15 +14581,6 @@ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", - "dev": true, - "requires": { - "lodash": "4.17.4" - } - }, "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", @@ -13944,17 +14620,6 @@ "strip-bom": "3.0.0" } }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - }, "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", @@ -14075,7 +14740,7 @@ "dev": true, "requires": { "commander": "2.11.0", - "filesize": "3.5.10", + "filesize": "3.5.11", "humanize": "0.0.9" } }, @@ -14282,9 +14947,9 @@ "dev": true }, "whatwg-encoding": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz", - "integrity": "sha1-PGxFGhmO567FWx7GHQkgxngBpfQ=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.2.tgz", + "integrity": "sha512-9WQ+6BvuD7A1vaGMqMjyR5zhHnR/VXKrs2WHobV/YCfeKXKEk0SJbgwg4kjdpRRrenEQbYwZ/P9vQAVUEVAzUg==", "dev": true, "requires": { "iconv-lite": "0.4.13" @@ -14360,27 +15025,6 @@ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, - "worker-loader": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-0.8.1.tgz", - "integrity": "sha1-6OmVMx6jTfW/aCloJL+38K1XjUM=", - "requires": { - "loader-utils": "1.1.0", - "schema-utils": "0.3.0" - }, - "dependencies": { - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - } - } - }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", diff --git a/js/package.json b/js/package.json index 848d4e70c..508b328f4 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "Parity", - "version": "1.9.1", + "version": "1.9.5", "main": "src/index.parity.js", "jsnext:main": "src/index.parity.js", "author": "Parity Team ", @@ -180,6 +180,7 @@ "lodash.omitby": "4.6.0", "lodash.throttle": "4.1.1", "lodash.uniq": "4.5.0", + "oo7": "paritytech/oo7#34fdb5991f4e59b2cf84260cab48cec9a57d88c0", "prop-types": "15.5.10", "react": "15.6.1", "react-dom": "15.6.1", diff --git a/js/src/Application/application.css b/js/src/Application/application.css index 8c1e452c9..4527a9550 100644 --- a/js/src/Application/application.css +++ b/js/src/Application/application.css @@ -18,6 +18,23 @@ .application { box-sizing: border-box; margin-top: 2.75em; + + .logo { + top: 0; + right: 0; + left: 0; + bottom: 0; + opacity: 0.2; + position: fixed; + padding: 7em; + text-align: center; + z-index: 0; + + img { + display: inline-block; + margin: 0 auto; + } + } } .container { diff --git a/js/src/Application/application.js b/js/src/Application/application.js index 6c49c24a0..9dbee9b53 100644 --- a/js/src/Application/application.js +++ b/js/src/Application/application.js @@ -35,6 +35,7 @@ import Snackbar from '../Snackbar'; import Status from '../Status'; import UpgradeParity from '../UpgradeParity'; +import parityLogo from '../../assets/parity-logo-black.png'; import Store from './store'; import styles from './application.css'; @@ -132,6 +133,9 @@ class Application extends Component { return (
+
+ +
{ children }
diff --git a/js/src/Dapp/dapp.css b/js/src/Dapp/dapp.css index 7b3eae4bd..6b5be3617 100644 --- a/js/src/Dapp/dapp.css +++ b/js/src/Dapp/dapp.css @@ -18,9 +18,11 @@ .frame { background: white; border: 0; + opacity: 0; position: absolute; height: 100%; width: 100%; + z-index: 1; } .full { @@ -32,13 +34,4 @@ font-family: 'Roboto', sans-serif; font-size: 16px; font-weight: 300; - - .text { - text-align: center; - padding: 5em; - font-size: 2em; - color: #999; - overflow: hidden; - text-overflow: ellipsis; - } } diff --git a/js/src/Dapp/dapp.js b/js/src/Dapp/dapp.js index e645a9215..b97e5adac 100644 --- a/js/src/Dapp/dapp.js +++ b/js/src/Dapp/dapp.js @@ -24,6 +24,7 @@ import builtinDapps from '@parity/shared/config/dappsBuiltin.json'; import viewsDapps from '@parity/shared/config/dappsViews.json'; import DappsStore from '@parity/shared/mobx/dappsStore'; import HistoryStore from '@parity/shared/mobx/historyStore'; +// import { Bond } from 'oo7'; import styles from './dapp.css'; @@ -90,16 +91,7 @@ export default class Dapp extends Component { const { app, loading } = this.state; if (loading) { - return ( -
-
- -
-
- ); + return null; } if (!app) { @@ -157,11 +149,20 @@ export default class Dapp extends Component {