Compare commits

...

38 Commits

Author SHA1 Message Date
GitLab Build Bot
5e6a0b4660 js-precompiled 20161107-193144
Former-commit-id: 170bd035f1099aa5e32c8f9abbb33b944697643a
2016-11-07 21:37:03 +01:00
Arkadiy Paronyan
73f94c33f7 Add secure flag back (#3246)
* Add secure flag back

* Don't run js-release for tags


Former-commit-id: e61c6c4af3c7720a74bd4093b2fa5271c389236c
2016-11-07 20:08:24 +01:00
arkpar
e73f6573d1 Removed junk files
Former-commit-id: 6c5c8eff7ce635f860723ab226d0e93480253387
2016-11-07 19:39:20 +01:00
Robert Habermeier
a19e5f5628 verify chunk hashes in cli restore (#3242)
Former-commit-id: 0afe25bef862202d74513cdb81afae1e91023d07
2016-11-07 19:34:18 +01:00
GitLab Build Bot
cfdc0d8cfb [ci skip] js-precompiled 20161107-183039
Former-commit-id: 35545a02bbdb877d419652432eab72a50b544737
2016-11-07 18:31:50 +00:00
Arkadiy Paronyan
0d20b21ee8 Backporting to beta (#3239)
* Fixed some typos (#3236)

* Add store for dapps state (#3211)

* Add mobx

* Use mobx store for dapps

* Cleanup hidden reads

* Remove (now) unused hidden.js

* _ denotes internal functions

* s/visibleApps/visible/

* AddDapps now use the mobx store as well

* Move modalOpen state to store

* Simplify

* Complete master merge

* Remove extra indirection

* Remove unneeded check

* Readability improvements

* Remove final debug info

* Load network apps manifests as contentHash (no coding) (#3235)

* Add mobx

* Use mobx store for dapps

* Cleanup hidden reads

* Remove (now) unused hidden.js

* _ denotes internal functions

* s/visibleApps/visible/

* AddDapps now use the mobx store as well

* Move modalOpen state to store

* Simplify

* Complete master merge

* Remove extra indirection

* Remove unneeded check

* Readability improvements

* Remove final debug info

* Load network manifests from the network

* Swallow manifest errors

* introduce fetchManifest

* Rename cli and config options signer->ui (#3232)

* rename options signer->ui

* rename config signer->ui


Former-commit-id: f4c4934831f80f9217ff4e6afcaa95cdd41caf45
2016-11-07 18:25:58 +01:00
Arkadiy Paronyan
2e9cde38e4 UI fixes backporting (#3234)
* Fix /parity-utils/{web3,parity}.js webpack errors (#3221)

* Don't override library builds

* Don't override libraries on build

* Enhance working blockNumber display

* Don't push empty tags to input (#3222)


Former-commit-id: d3e51d21c8fc1b7cf9105e28c4719bf3ecba14e0
2016-11-07 17:41:55 +01:00
Denis S. Soldatov aka General-Beck
b88823b51f Update gitlab-ci
remove armv6 from beta, tags
remove i686 from tags add to beta
[ci skip]

Former-commit-id: a90746a0b907703930cc059070d090f386cf3cc9
2016-11-07 23:20:06 +07:00
GitLab Build Bot
1cdb17cd24 [ci skip] js-precompiled 20161107-161215
Former-commit-id: 75ab8de321ee9553574f170352c408a45cd2cfb7
2016-11-07 16:13:21 +00:00
Denis S. Soldatov aka General-Beck
8f89235a25 Update gitlab-ci
remove $NIGHTLY from beta branch

Former-commit-id: 7c403d6c9f50e546c62507a11390c35298c61cda
2016-11-07 22:52:36 +07:00
Denis S. Soldatov aka General-Beck
3df2e3358c Update Dockerfile
add make

Former-commit-id: 368aab19954e110c8d249bfca7787c015abfe25b
2016-11-07 21:45:22 +07:00
Denis S. Soldatov aka General-Beck
78c04856e8 Update Docker file
add make

Former-commit-id: 0c8d5104f80d4e27b292c9c2ce5a9a7b2d3562a9
2016-11-07 21:44:37 +07:00
Denis S. Soldatov aka General-Beck
e49ba9d0ae Update gitlab-ci
cache optimization

Former-commit-id: 372464f556fe12bbf28fa6e0422b8e4ea64c2db5
2016-11-07 20:49:00 +07:00
Arkadiy Paronyan
043ca21863 Backporting to beta (#3229)
* Use ethcore_dappsPort when constructing URLs (#3139)

* Upon connect, retrieve the available api ports

* Update dapps to load from dappsPort

* Update dapps summary with dappsPort

* Allow proxy to use dappsPort

* Replace /api/ping with HEAD /

* Dynamic port for available apps

* Retrieve content images with dappsPort

* Fix /

* Transfer token dropdown image fix

* IdentityIcon loads images via contentHash

* Update apps fetch to cater for dev & prod

* DRY up 127.0.0.1:${dappsPort} with ${dappsUrl}

* Cleaning up polluted namespaces (#3143)

* Renaming ethcore_ to parity_

* Renaming files

* Renaming poluted EthSigning

* Tidy up the namespaces

* Renaming files to match new structure

* Splitting EthSigning into separate traits

* jsapi move ethcore.* -> parity.*

* Move jsonrpc parity definitions

* Update UI API calls for parity interfaces

* Move jsapi signer interfaces from personal to signer

* Update UI to use signer.* where applicable

* Updsate jsapi subscriptions for signer

* Fix dodgy merge.

* Update README.

* Fix some tests.

* Move parity-only personal.* to parity.*

* Update UI for personal -> parity API moves

* Update subscription APIs after personal -> parity move

* personal. generateAuthorizationToken -> parity. generateAuthorizationToken (UI)

* enode, dappsPort & signerPort (UI)

* Update subscription tests (accountsInfo)

* subscription update

* personal -> parity

* Additional error logging on method failures

* move postTransaction to parity

* Additional debug info with method failures

* Fix personal tests.

* Console wrning shows parameters, error object does not

* Include parity_ signing methods.

* Console log http transport info

* Fix failing tests

* Add RPC stubs for parity_accounts.

* Allow some secure built-in dapps

* Use parity_accounts in place of accountsInfo

* Improve error reporting

* Cleanup GHH error handling


Former-commit-id: 5a094ccb9f0596d0e07abc23504b80dc099ad584
2016-11-07 14:46:41 +01:00
Denis S. Soldatov aka General-Beck
aea995cf55 Update gitlab-ci
skip i686
skip windows and darwin test's

Former-commit-id: 441657dc5f4c9b9ebf2a12af9a2be008d44dac40
2016-11-07 20:45:16 +07:00
Denis S. Soldatov aka General-Beck
0799dbf95f Update gitlab-ci
add i686

Former-commit-id: 3333433b17828b3bb6273cfecd654c3ea5dd8984
2016-11-07 20:06:19 +07:00
GitLab Build Bot
054f0c0014 [ci skip] js-precompiled 20161107-111138
Former-commit-id: 3b480f5e8c9fd7f24afb41e114f9346809790d98
2016-11-07 11:12:47 +00:00
Administrator
47729ae199 Update .gitlab-ci.yml
Former-commit-id: 5c77f1eedeec1e62df80895e40e354aeed77ecb0
2016-11-07 12:00:01 +01:00
Arkadiy Paronyan
e086b4e94a Beta branch cleanup (#3226)
* Removed binaries

* Version string set to beta


Former-commit-id: 2a650287ceca214b23caba603571d2ed93513656
2016-11-07 11:54:23 +01:00
GitLab Build Bot
fbe02fc6b6 [ci skip] js-precompiled 20161105-151003
Former-commit-id: 15ee147168b274fe9c23385fede541d20e42a24e
2016-11-05 15:11:10 +00:00
Arkadiy Paronyan
f978b3e833 Set passive mode for first run only (#3214) (#3216)
Former-commit-id: 17f57c6b70bb2ec2bfbbb0f6721057ee4a5e349a
2016-11-05 15:51:14 +01:00
GitLab Build Bot
20d7f8a9d9 [ci skip] js-precompiled 20161105-135925
Former-commit-id: 4f44a021f7f1461dc699bc4a482c8dd1685be645
2016-11-05 14:01:16 +00:00
Arkadiy Paronyan
e727d92e0f Mode configuration backported to beta (#3213)
* Mode improvements for UI (#3109)

* `--mode=off` now works.

* Add Mode::Off as a persistent CLI option.

* "last" not "auto" as default.

* Commit accidentally unsaved file.

* Whitespace

[ci:skip]

* Mode CLI parse fix

* or offline

* Save mode when it gets changed.

* Fix Offline mode

* Fix up mode operations.

* Make passive default, but not overriding.

* Fix test

* Maybe not everyone wants to run an archive node...

* Parity configuration settings, i.e. mode (#3212)

* Add initial page

* Add parity icon

* opacity for parity icon

* Mode selector

* Actually set mode when value changes


Former-commit-id: 64386d94adfa58aa30bab2005eeb64f6343c8248
2016-11-05 14:37:45 +01:00
GitLab Build Bot
8b5a9b701a [ci skip] js-precompiled 20161104-181908
Former-commit-id: 074d230fa4c3faed52aa8c75a5bbd8d4720cad4a
2016-11-04 18:20:13 +00:00
Arkadiy Paronyan
33cc10549a Backporting (#3198)
* sendRawTransaction invalid RLP error

* Returning proper error for estimate_gas

* Exposing engine extra info in block RPC (#3169)

* Exposing extra info in RPC

* Proper serialization and client trait API

* Fixing possible race condition in ethcore_hashContent (#3191)

* Remove dapp logos (GHH points to dapp-assets) (#3192)
2016-11-04 18:59:49 +01:00
GitLab Build Bot
522401296d [ci skip] js-precompiled 20161104-162352 2016-11-04 16:25:02 +00:00
Arkadiy Paronyan
a3261d1428 EIP-155 update with Vitalik's new test vectors (#3166) (#3189)
* Vitalik's new test vectors.

* Update to latest EIP155 spec.

* Fix txs.

* Another fix.
2016-11-04 16:38:10 +01:00
Denis S. Soldatov aka General-Beck
250736a085 Update gitlab-ci
[ci skip]
skip linux-armv6 in beta, tags, stable
2016-11-04 20:59:14 +07:00
GitLab Build Bot
ce50286138 [ci skip] js-precompiled 20161104-132825 2016-11-04 13:29:29 +00:00
Arkadiy Paronyan
19d0905cbd Backporting to beta (#3176)
* Linux build case sensitivity fix (#3161)

* Make the footer a bit less ugly. (#3160)

* Make the footer a bit less ugly.

* Whitespace.

* Enabling personal RPC over IPC by default (#3165)

* Push precompiled for beta/stable, npm only master (#3163)

* Push precompiled for beta/stable, npm only master

* Release to npm before comitting updates

* Fixes #3171 (#3175)

* Remove extra cd js (#3177)

* Back to real root (#3178)
2016-11-04 14:12:15 +01:00
GitLab Build Bot
11f2b5d0ae [ci skip] js-precompiled 20161104-130524 2016-11-04 13:06:27 +00:00
GitLab Build Bot
8bd89d05be [ci skip] js-precompiled 20161104-121340 2016-11-04 12:14:46 +00:00
Arkadiy Paronyan
2b5d82c901 parity-ui-precompiled pinned to beta (#3168)
* parity-ui-precompiled pinned to beta

* Fixed test
2016-11-04 12:38:18 +01:00
GitLab Build Bot
ec99be1b28 [ci skip] js-precompiled 20161104-104904 2016-11-04 10:50:35 +00:00
Denis S. Soldatov aka General-Beck
52ce4f9bc1 Update gitlab-ci
remove darwin & winfows test
add $NIGHTLY ENV for future nightly builds
2016-11-04 17:11:25 +07:00
Denis S. Soldatov aka General-Beck
9e9157b1bd Update gitlab-ci
[ci skip]
fix for JS_FILES_MODIFIED master -> beta
2016-11-04 16:48:08 +07:00
Denis S. Soldatov aka General-Beck
576c9e7801 Update gitlab-ci
stages:
  - test
  - js-build
  - build
2016-11-04 16:17:16 +07:00
Denis S. Soldatov aka General-Beck
5d83c60b75 Update gitlab-ci
backport gitlab-ci.yml from master
2016-11-04 16:07:23 +07:00
170 changed files with 3041 additions and 2162 deletions

View File

@@ -1,4 +1,6 @@
stages: stages:
- test
- js-build
- build - build
variables: variables:
GIT_DEPTH: "3" GIT_DEPTH: "3"
@@ -7,13 +9,12 @@ variables:
RUSTFLAGS: "" RUSTFLAGS: ""
CARGOFLAGS: "" CARGOFLAGS: ""
cache: cache:
key: "$CI_BUILD_NAME/$CI_BUILD_REF_NAME" key: "CI_BUILD_STAGE/$CI_BUILD_REF_NAME"
untracked: true untracked: true
linux-stable: linux-stable:
stage: build stage: build
image: ethcore/rust:stable image: ethcore/rust:stable
only: only:
- master
- beta - beta
- tags - tags
- stable - stable
@@ -39,41 +40,10 @@ linux-stable:
paths: paths:
- target/release/parity - target/release/parity
name: "stable-x86_64-unknown-linux-gnu_parity" name: "stable-x86_64-unknown-linux-gnu_parity"
linux-stable-14.04:
stage: build
image: ethcore/rust-14.04:latest
only:
- master
- beta
- tags
- stable
script:
- cargo build --release $CARGOFLAGS
- strip target/release/parity
- md5sum target/release/parity >> parity.md5
- sh scripts/deb-build.sh amd64
- cp target/release/parity deb/usr/bin/parity
- export VER=$(grep -m 1 version Cargo.toml | awk '{print $3}' | tr -d '"' | tr -d "\n")
- dpkg-deb -b deb "parity_"$VER"_amd64.deb"
- md5sum "parity_"$VER"_amd64.deb" >> "parity_"$VER"_amd64.deb.md5"
- aws configure set aws_access_key_id $s3_key
- aws configure set aws_secret_access_key $s3_secret
- aws s3api put-object --bucket builds-parity --key $CI_BUILD_REF_NAME/x86_64-unknown-ubuntu_14_04-gnu/parity --body target/release/parity
- aws s3api put-object --bucket builds-parity --key $CI_BUILD_REF_NAME/x86_64-unknown-ubuntu_14_04-gnu/parity.md5 --body parity.md5
- aws s3api put-object --bucket builds-parity --key $CI_BUILD_REF_NAME/x86_64-unknown-ubuntu_14_04-gnu/"parity_"$VER"_amd64.deb" --body "parity_"$VER"_amd64.deb"
- aws s3api put-object --bucket builds-parity --key $CI_BUILD_REF_NAME/x86_64-unknown-ubuntu_14_04-gnu/"parity_"$VER"_amd64.deb.md5" --body "parity_"$VER"_amd64.deb.md5"
tags:
- rust
- rust-14.04
artifacts:
paths:
- target/release/parity
name: "stable-x86_64-unknown-ubuntu_14_04-gnu_parity"
linux-beta: linux-beta:
stage: build stage: build
image: ethcore/rust:beta image: ethcore/rust:beta
only: only:
- master
- beta - beta
- tags - tags
- stable - stable
@@ -92,7 +62,6 @@ linux-nightly:
stage: build stage: build
image: ethcore/rust:nightly image: ethcore/rust:nightly
only: only:
- master
- beta - beta
- tags - tags
- stable - stable
@@ -111,7 +80,6 @@ linux-centos:
stage: build stage: build
image: ethcore/rust-centos:latest image: ethcore/rust-centos:latest
only: only:
- master
- beta - beta
- tags - tags
- stable - stable
@@ -132,6 +100,39 @@ linux-centos:
paths: paths:
- target/release/parity - target/release/parity
name: "x86_64-unknown-centos-gnu_parity" name: "x86_64-unknown-centos-gnu_parity"
allow_failure: true
linux-i686:
stage: build
image: ethcore/rust-i686:latest
only:
- beta
# - tags
- stable
script:
- export HOST_CC=gcc
- export HOST_CXX=g++
- cargo build --target i686-unknown-linux-gnu --release $CARGOFLAGS
- strip target/i686-unknown-linux-gnu/release/parity
- md5sum target/i686-unknown-linux-gnu/release/parity >> parity.md5
- sh scripts/deb-build.sh i386
- cp target/i686-unknown-linux-gnu/release/parity deb/usr/bin/parity
- export VER=$(grep -m 1 version Cargo.toml | awk '{print $3}' | tr -d '"' | tr -d "\n")
- dpkg-deb -b deb "parity_"$VER"_i386.deb"
- md5sum "parity_"$VER"_i386.deb" >> "parity_"$VER"_i386.deb.md5"
- aws configure set aws_access_key_id $s3_key
- aws configure set aws_secret_access_key $s3_secret
- aws s3api put-object --bucket builds-parity --key $CI_BUILD_REF_NAME/i686-unknown-linux-gnu/parity --body target/i686-unknown-linux-gnu/release/parity
- aws s3api put-object --bucket builds-parity --key $CI_BUILD_REF_NAME/i686-unknown-linux-gnu/parity.md5 --body parity.md5
- aws s3api put-object --bucket builds-parity --key $CI_BUILD_REF_NAME/i686-unknown-linux-gnu/"parity_"$VER"_i386.deb" --body "parity_"$VER"_i386.deb"
- aws s3api put-object --bucket builds-parity --key $CI_BUILD_REF_NAME/i686-unknown-linux-gnu/"parity_"$VER"_i386.deb.md5" --body "parity_"$VER"_i386.deb.md5"
tags:
- rust
- rust-i686
artifacts:
paths:
- target/i686-unknown-linux-gnu/release/parity
name: "i686-unknown-linux-gnu"
allow_failure: true
linux-armv7: linux-armv7:
stage: build stage: build
image: ethcore/rust-armv7:latest image: ethcore/rust-armv7:latest
@@ -214,8 +215,8 @@ linux-armv6:
stage: build stage: build
image: ethcore/rust-armv6:latest image: ethcore/rust-armv6:latest
only: only:
- beta # - beta
- tags # - tags
- stable - stable
script: script:
- export CC=arm-linux-gnueabi-gcc - export CC=arm-linux-gnueabi-gcc
@@ -302,6 +303,9 @@ darwin:
- target/release/parity - target/release/parity
name: "x86_64-apple-darwin_parity" name: "x86_64-apple-darwin_parity"
windows: windows:
cache:
key: "%CI_BUILD_STAGE%/%CI_BUILD_REF_NAME%"
untracked: true
stage: build stage: build
only: only:
- beta - beta
@@ -350,49 +354,51 @@ windows:
- target/release/parity.pdb - target/release/parity.pdb
- nsis/InstallParity.exe - nsis/InstallParity.exe
name: "x86_64-pc-windows-msvc_parity" name: "x86_64-pc-windows-msvc_parity"
#test-darwin: test-darwin:
# stage: build stage: test
# before_script: only:
# - git submodule update --init --recursive # - beta
# script: # - tags
# - export RUST_BACKTRACE=1 - stable
# - ./test.sh $CARGOFLAGS --no-release
# tags:
# - osx
#test-windows:
# stage: build
# before_script:
# - git submodule update --init --recursive
# script:
# - set RUST_BACKTRACE=1
# - cargo test --features json-tests -p rlp -p ethash -p ethcore -p ethcore-bigint -p ethcore-dapps -p ethcore-rpc -p ethcore-signer -p ethcore-util -p ethcore-network -p ethcore-io -p ethkey -p ethstore -p ethsync -p ethcore-ipc -p ethcore-ipc-tests -p ethcore-ipc-nano -p parity %CARGOFLAGS% --verbose --release
# tags:
# - rust-windows
# allow_failure: true
test-linux:
stage: build
before_script: before_script:
- git submodule update --init --recursive - git submodule update --init --recursive
script: script:
- export RUST_BACKTRACE=1 - export RUST_BACKTRACE=1
- ./test.sh $CARGOFLAGS --no-release - ./test.sh $CARGOFLAGS --no-release
tags: tags:
- rust-test - osx
js-release: test-windows:
stage: build stage: test
image: ethcore/javascript:latest
only: only:
- master # - beta
# - tags
- stable
before_script: before_script:
- ./js/scripts/install-deps.sh - git submodule update --init --recursive
script: script:
- ./js/scripts/build.sh - set RUST_BACKTRACE=1
- ./js/scripts/release.sh - cargo test --features json-tests -p rlp -p ethash -p ethcore -p ethcore-bigint -p ethcore-dapps -p ethcore-rpc -p ethcore-signer -p ethcore-util -p ethcore-network -p ethcore-io -p ethkey -p ethstore -p ethsync -p ethcore-ipc -p ethcore-ipc-tests -p ethcore-ipc-nano -p parity %CARGOFLAGS% --verbose --release
tags: tags:
- javascript - rust-windows
allow_failure: true
test-rust-stable:
stage: test
image: ethcore/rust:stable
before_script:
- git submodule update --init --recursive
- export JS_FILES_MODIFIED=$(git --no-pager diff --name-only CI_BUILD_REF CI_BUILD_REF@{1} | grep \.js | wc -l)
- echo $JS_FILES_MODIFIED
- if [ -z $JS_FILES_MODIFIED ]; then echo "skip js test"; fi
script:
- export RUST_BACKTRACE=1
- echo $JS_FILES_MODIFIED
- if [ -z $JS_FILES_MODIFIED ]; then echo "skip js test"; else ./test.sh $CARGOFLAGS --no-release; fi
tags:
- rust
- rust-stable
js-tests: js-tests:
stage: build stage: test
image: ethcore/javascript:latest image: ethcore/rust:stable
before_script: before_script:
- ./js/scripts/install-deps.sh - ./js/scripts/install-deps.sh
script: script:
@@ -401,3 +407,17 @@ js-tests:
- ./js/scripts/build.sh - ./js/scripts/build.sh
tags: tags:
- javascript-test - javascript-test
js-release:
stage: js-build
only:
- master
- beta
- stable
image: ethcore/rust:stable
before_script:
- ./js/scripts/install-deps.sh
script:
- ./js/scripts/build.sh
- ./js/scripts/release.sh
tags:
- javascript

6
Cargo.lock generated
View File

@@ -1235,7 +1235,7 @@ name = "parity-ui"
version = "1.4.0" version = "1.4.0"
dependencies = [ dependencies = [
"parity-ui-dev 1.4.0", "parity-ui-dev 1.4.0",
"parity-ui-precompiled 1.4.0 (git+https://github.com/ethcore/js-precompiled.git)", "parity-ui-precompiled 1.4.0 (git+https://github.com/ethcore/js-precompiled.git?branch=beta)",
"rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
@@ -1249,7 +1249,7 @@ dependencies = [
[[package]] [[package]]
name = "parity-ui-precompiled" name = "parity-ui-precompiled"
version = "1.4.0" version = "1.4.0"
source = "git+https://github.com/ethcore/js-precompiled.git#9ba6f6a2f092a2b61b0ceec6f8c1df988ef33c60" source = "git+https://github.com/ethcore/js-precompiled.git?branch=beta#9fe5d7402be8a9ae1d4ae9ac727056023c8a8e2e"
dependencies = [ dependencies = [
"parity-dapps-glue 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-dapps-glue 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
@@ -2062,7 +2062,7 @@ dependencies = [
"checksum odds 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)" = "b28c06e81b0f789122d415d6394b5fe849bde8067469f4c2980d3cdc10c78ec1" "checksum odds 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)" = "b28c06e81b0f789122d415d6394b5fe849bde8067469f4c2980d3cdc10c78ec1"
"checksum owning_ref 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8d91377085359426407a287ab16884a0111ba473aa6844ff01d4ec20ce3d75e7" "checksum owning_ref 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8d91377085359426407a287ab16884a0111ba473aa6844ff01d4ec20ce3d75e7"
"checksum parity-dapps-glue 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "98378dec0a185da2b7180308752f0bad73aaa949c3e0a3b0528d0e067945f7ab" "checksum parity-dapps-glue 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "98378dec0a185da2b7180308752f0bad73aaa949c3e0a3b0528d0e067945f7ab"
"checksum parity-ui-precompiled 1.4.0 (git+https://github.com/ethcore/js-precompiled.git)" = "<none>" "checksum parity-ui-precompiled 1.4.0 (git+https://github.com/ethcore/js-precompiled.git?branch=beta)" = "<none>"
"checksum parking_lot 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "968f685642555d2f7e202c48b8b11de80569e9bfea817f7f12d7c61aac62d4e6" "checksum parking_lot 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "968f685642555d2f7e202c48b8b11de80569e9bfea817f7f12d7c61aac62d4e6"
"checksum parking_lot 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "dbc5847584161f273e69edc63c1a86254a22f570a0b5dd87aa6f9773f6f7d125" "checksum parking_lot 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "dbc5847584161f273e69edc63c1a86254a22f570a0b5dd87aa6f9773f6f7d125"
"checksum parking_lot_core 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fb1b97670a2ffadce7c397fb80a3d687c4f3060140b885621ef1653d0e5d5068" "checksum parking_lot_core 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fb1b97670a2ffadce7c397fb80a3d687c4f3060140b885621ef1653d0e5d5068"

View File

@@ -1,9 +1,12 @@
# [Parity](https://ethcore.io/parity.html) # [Parity](https://ethcore.io/parity.html)
### Fast, light, and robust Ethereum implementation ### Fast, light, and robust Ethereum implementation
[![Join the chat at https://gitter.im/ethcore/parity.js](https://badges.gitter.im/ethcore/parity.js.svg)](https://gitter.im/ethcore/parity.js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Build Status][travis-image]][travis-url] [![build status](https://gitlab.ethcore.io/Mirrors/ethcore-parity/badges/master/build.svg)](https://gitlab.ethcore.io/Mirrors/ethcore-parity/commits/master) [![Coverage Status][coveralls-image]][coveralls-url] [![GPLv3][license-image]][license-url]
[![Build Status][travis-image]][travis-url] [![Coverage Status][coveralls-image]][coveralls-url] [![Join the chat at https://gitter.im/ethcore/parity][gitter-image]][gitter-url] [![GPLv3][license-image]][license-url] ### Join the chat!
Parity [![Join the chat at https://gitter.im/ethcore/parity][gitter-image]][gitter-url] and
parity.js [![Join the chat at https://gitter.im/ethcore/parity.js](https://badges.gitter.im/ethcore/parity.js.svg)](https://gitter.im/ethcore/parity.js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[Internal Documentation][doc-url] [Internal Documentation][doc-url]
@@ -21,7 +24,7 @@ Be sure to check out [our wiki][wiki-url] for more information.
[doc-url]: https://ethcore.github.io/parity/ethcore/index.html [doc-url]: https://ethcore.github.io/parity/ethcore/index.html
[wiki-url]: https://github.com/ethcore/parity/wiki [wiki-url]: https://github.com/ethcore/parity/wiki
**Requires Rust version 1.12.0 to build** **Parity requires Rust version 1.12.0 to build**
---- ----
@@ -31,12 +34,15 @@ Be sure to check out [our wiki][wiki-url] for more information.
Parity's goal is to be the fastest, lightest, and most secure Ethereum client. We are developing Parity using the sophisticated and Parity's goal is to be the fastest, lightest, and most secure Ethereum client. We are developing Parity using the sophisticated and
cutting-edge Rust programming language. Parity is licensed under the GPLv3, and can be used for all your Ethereum needs. cutting-edge Rust programming language. Parity is licensed under the GPLv3, and can be used for all your Ethereum needs.
By default, Parity will run a JSONRPC server on `127.0.0.1:8545`. This is fully configurable and supports a number Parity comes with a built-in wallet. To access [Parity Wallet](http://127.0.0.1:8080/) this simply go to http://127.0.0.1:8080/. It
of RPC APIs. includes various functionality allowing you to:
- create and manage your Ethereum accounts;
- manage your Ether and any Ethereum tokens;
- create and register your own tokens;
- and much more.
Parity also runs a server for running decentralized apps, or "Dapps", on `http://127.0.0.1:8080`. By default, Parity will also run a JSONRPC server on `127.0.0.1:8545`. This is fully configurable and supports a number
This includes a few useful Dapps, including Ethereum Wallet, Maker OTC, and a node status page. of RPC APIs.
In a near-future release, it will be easy to install Dapps and use them through this web interface.
If you run into an issue while using parity, feel free to file one in this repository If you run into an issue while using parity, feel free to file one in this repository
or hop on our [gitter chat room][gitter-url] to ask a question. We are glad to help! or hop on our [gitter chat room][gitter-url] to ask a question. We are glad to help!

View File

@@ -11,7 +11,7 @@ rustc_version = "0.1"
[dependencies] [dependencies]
parity-ui-dev = { path = "../../js", optional = true } parity-ui-dev = { path = "../../js", optional = true }
parity-ui-precompiled = { git = "https://github.com/ethcore/js-precompiled.git", optional = true } parity-ui-precompiled = { git = "https://github.com/ethcore/js-precompiled.git", optional = true, branch = "beta" }
[features] [features]
no-precompiled-js = ["parity-ui-dev"] no-precompiled-js = ["parity-ui-dev"]

View File

@@ -7,7 +7,8 @@ RUN apt-get update && \
curl \ curl \
git \ git \
file \ file \
binutils binutils \
make
# install rustup # install rustup
RUN curl https://sh.rustup.rs -sSf | sh -s -- -y RUN curl https://sh.rustup.rs -sSf | sh -s -- -y

View File

@@ -7,7 +7,8 @@ RUN apt-get update && \
curl \ curl \
git \ git \
file \ file \
binutils binutils \
make
# install rustup # install rustup
RUN curl https://sh.rustup.rs -sSf | sh -s -- -y RUN curl https://sh.rustup.rs -sSf | sh -s -- -y

View File

@@ -65,7 +65,7 @@ use evm::{Factory as EvmFactory, Schedule};
use miner::{Miner, MinerService}; use miner::{Miner, MinerService};
use snapshot::{self, io as snapshot_io}; use snapshot::{self, io as snapshot_io};
use factory::Factories; use factory::Factories;
use rlp::{View, UntrustedRlp}; use rlp::{decode, View, UntrustedRlp};
use state_db::StateDB; use state_db::StateDB;
use rand::OsRng; use rand::OsRng;
@@ -147,6 +147,7 @@ pub struct Client {
factories: Factories, factories: Factories,
history: u64, history: u64,
rng: Mutex<OsRng>, rng: Mutex<OsRng>,
on_mode_change: Mutex<Option<Box<FnMut(&Mode) + 'static + Send>>>,
} }
impl Client { impl Client {
@@ -211,7 +212,7 @@ impl Client {
let panic_handler = PanicHandler::new_in_arc(); let panic_handler = PanicHandler::new_in_arc();
panic_handler.forward_from(&block_queue); panic_handler.forward_from(&block_queue);
let awake = match config.mode { Mode::Dark(..) => false, _ => true }; let awake = match config.mode { Mode::Dark(..) | Mode::Off => false, _ => true };
let factories = Factories { let factories = Factories {
vm: EvmFactory::new(config.vm_type.clone(), config.jump_table_size), vm: EvmFactory::new(config.vm_type.clone(), config.jump_table_size),
@@ -243,6 +244,7 @@ impl Client {
factories: factories, factories: factories,
history: history, history: history,
rng: Mutex::new(try!(OsRng::new().map_err(::util::UtilError::StdIo))), rng: Mutex::new(try!(OsRng::new().map_err(::util::UtilError::StdIo))),
on_mode_change: Mutex::new(None),
}; };
Ok(Arc::new(client)) Ok(Arc::new(client))
} }
@@ -260,6 +262,11 @@ impl Client {
} }
} }
/// Register an action to be done if a mode change happens.
pub fn on_mode_change<F>(&self, f: F) where F: 'static + FnMut(&Mode) + Send {
*self.on_mode_change.lock() = Some(Box::new(f));
}
/// Flush the block import queue. /// Flush the block import queue.
pub fn flush_queue(&self) { pub fn flush_queue(&self) {
self.block_queue.flush(); self.block_queue.flush();
@@ -856,18 +863,37 @@ impl BlockChainClient for Client {
} }
fn keep_alive(&self) { fn keep_alive(&self) {
let mode = self.mode.lock().clone(); let should_wake = match &*self.mode.lock() {
if mode != Mode::Active { &Mode::Dark(..) | &Mode::Passive(..) => true,
_ => false,
};
if should_wake {
self.wake_up(); self.wake_up();
(*self.sleep_state.lock()).last_activity = Some(Instant::now()); (*self.sleep_state.lock()).last_activity = Some(Instant::now());
} }
} }
fn mode(&self) -> IpcMode { self.mode.lock().clone().into() } fn mode(&self) -> IpcMode {
let r = self.mode.lock().clone().into();
trace!(target: "mode", "Asked for mode = {:?}. returning {:?}", &*self.mode.lock(), r);
r
}
fn set_mode(&self, mode: IpcMode) { fn set_mode(&self, new_mode: IpcMode) {
*self.mode.lock() = mode.clone().into(); trace!(target: "mode", "Client::set_mode({:?})", new_mode);
match mode { {
let mut mode = self.mode.lock();
*mode = new_mode.clone().into();
trace!(target: "mode", "Mode now {:?}", &*mode);
match *self.on_mode_change.lock() {
Some(ref mut f) => {
trace!(target: "mode", "Making callback...");
f(&*mode)
},
_ => {}
}
}
match new_mode {
IpcMode::Active => self.wake_up(), IpcMode::Active => self.wake_up(),
IpcMode::Off => self.sleep(), IpcMode::Off => self.sleep(),
_ => {(*self.sleep_state.lock()).last_activity = Some(Instant::now()); } _ => {(*self.sleep_state.lock()).last_activity = Some(Instant::now()); }
@@ -1187,6 +1213,18 @@ impl BlockChainClient for Client {
fn signing_network_id(&self) -> Option<u8> { fn signing_network_id(&self) -> Option<u8> {
self.engine.signing_network_id(&self.latest_env_info()) self.engine.signing_network_id(&self.latest_env_info())
} }
fn block_extra_info(&self, id: BlockID) -> Option<BTreeMap<String, String>> {
self.block_header(id)
.map(|block| decode(&block))
.map(|header| self.engine.extra_info(&header))
}
fn uncle_extra_info(&self, id: UncleID) -> Option<BTreeMap<String, String>> {
self.uncle(id)
.map(|block| BlockView::new(&block).header())
.map(|header| self.engine.extra_info(&header))
}
} }
impl MiningBlockChainClient for Client { impl MiningBlockChainClient for Client {

View File

@@ -16,6 +16,7 @@
use std::str::FromStr; use std::str::FromStr;
use std::path::Path; use std::path::Path;
use std::fmt::{Display, Formatter, Error as FmtError};
pub use std::time::Duration; pub use std::time::Duration;
pub use blockchain::Config as BlockChainConfig; pub use blockchain::Config as BlockChainConfig;
pub use trace::Config as TraceConfig; pub use trace::Config as TraceConfig;
@@ -86,6 +87,17 @@ impl Default for Mode {
} }
} }
impl Display for Mode {
fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> {
match *self {
Mode::Active => write!(f, "active"),
Mode::Passive(..) => write!(f, "passive"),
Mode::Dark(..) => write!(f, "dark"),
Mode::Off => write!(f, "offline"),
}
}
}
/// Client configuration. Includes configs for all sub-systems. /// Client configuration. Includes configs for all sub-systems.
#[derive(Debug, PartialEq, Default)] #[derive(Debug, PartialEq, Default)]
pub struct ClientConfig { pub struct ClientConfig {

View File

@@ -38,6 +38,7 @@ use evm::{Factory as EvmFactory, VMType, Schedule};
use miner::{Miner, MinerService, TransactionImportResult}; use miner::{Miner, MinerService, TransactionImportResult};
use spec::Spec; use spec::Spec;
use types::mode::Mode; use types::mode::Mode;
use views::BlockView;
use verification::queue::QueueInfo; use verification::queue::QueueInfo;
use block::{OpenBlock, SealedBlock}; use block::{OpenBlock, SealedBlock};
@@ -417,6 +418,10 @@ impl BlockChainClient for TestBlockChainClient {
None // Simple default. None // Simple default.
} }
fn uncle_extra_info(&self, _id: UncleID) -> Option<BTreeMap<String, String>> {
None
}
fn transaction_receipt(&self, id: TransactionID) -> Option<LocalizedReceipt> { fn transaction_receipt(&self, id: TransactionID) -> Option<LocalizedReceipt> {
self.receipts.read().get(&id).cloned() self.receipts.read().get(&id).cloned()
} }
@@ -459,6 +464,13 @@ impl BlockChainClient for TestBlockChainClient {
self.block_hash(id).and_then(|hash| self.blocks.read().get(&hash).cloned()) self.block_hash(id).and_then(|hash| self.blocks.read().get(&hash).cloned())
} }
fn block_extra_info(&self, id: BlockID) -> Option<BTreeMap<String, String>> {
self.block(id)
.map(|block| BlockView::new(&block).header())
.map(|header| self.spec.engine.extra_info(&header))
}
fn block_status(&self, id: BlockID) -> BlockStatus { fn block_status(&self, id: BlockID) -> BlockStatus {
match id { match id {
BlockID::Number(number) if (number as usize) < self.blocks.read().len() => BlockStatus::InChain, BlockID::Number(number) if (number as usize) < self.blocks.read().len() => BlockStatus::InChain,

View File

@@ -29,13 +29,13 @@ use error::{ImportResult, CallError};
use receipt::LocalizedReceipt; use receipt::LocalizedReceipt;
use trace::LocalizedTrace; use trace::LocalizedTrace;
use evm::{Factory as EvmFactory, Schedule}; use evm::{Factory as EvmFactory, Schedule};
use types::ids::*;
use types::trace_filter::Filter as TraceFilter;
use executive::Executed; use executive::Executed;
use env_info::LastHashes; use env_info::LastHashes;
use types::call_analytics::CallAnalytics;
use block_import_error::BlockImportError; use block_import_error::BlockImportError;
use ipc::IpcConfig; use ipc::IpcConfig;
use types::ids::*;
use types::trace_filter::Filter as TraceFilter;
use types::call_analytics::CallAnalytics;
use types::blockchain_info::BlockChainInfo; use types::blockchain_info::BlockChainInfo;
use types::block_status::BlockStatus; use types::block_status::BlockStatus;
use types::mode::Mode; use types::mode::Mode;
@@ -235,6 +235,12 @@ pub trait BlockChainClient : Sync + Send {
/// Set the mode. /// Set the mode.
fn set_mode(&self, mode: Mode); fn set_mode(&self, mode: Mode);
/// Returns engine-related extra info for `BlockID`.
fn block_extra_info(&self, id: BlockID) -> Option<BTreeMap<String, String>>;
/// Returns engine-related extra info for `UncleID`.
fn uncle_extra_info(&self, id: UncleID) -> Option<BTreeMap<String, String>>;
} }
/// Extended client interface used for mining /// Extended client interface used for mining

View File

@@ -81,7 +81,7 @@ impl Engine for BasicAuthority {
fn builtins(&self) -> &BTreeMap<Address, Builtin> { &self.builtins } fn builtins(&self) -> &BTreeMap<Address, Builtin> { &self.builtins }
/// Additional engine-specific information for the user/developer concerning `header`. /// Additional engine-specific information for the user/developer concerning `header`.
fn extra_info(&self, _header: &Header) -> HashMap<String, String> { hash_map!["signature".to_owned() => "TODO".to_owned()] } fn extra_info(&self, _header: &Header) -> BTreeMap<String, String> { map!["signature".to_owned() => "TODO".to_owned()] }
fn schedule(&self, _env_info: &EnvInfo) -> Schedule { fn schedule(&self, _env_info: &EnvInfo) -> Schedule {
Schedule::new_homestead() Schedule::new_homestead()

View File

@@ -47,7 +47,7 @@ pub trait Engine : Sync + Send {
fn seal_fields(&self) -> usize { 0 } fn seal_fields(&self) -> usize { 0 }
/// Additional engine-specific information for the user/developer concerning `header`. /// Additional engine-specific information for the user/developer concerning `header`.
fn extra_info(&self, _header: &Header) -> HashMap<String, String> { HashMap::new() } fn extra_info(&self, _header: &Header) -> BTreeMap<String, String> { BTreeMap::new() }
/// Additional information. /// Additional information.
fn additional_params(&self) -> HashMap<String, String> { HashMap::new() } fn additional_params(&self) -> HashMap<String, String> { HashMap::new() }

View File

@@ -133,8 +133,8 @@ impl Engine for Ethash {
} }
/// Additional engine-specific information for the user/developer concerning `header`. /// Additional engine-specific information for the user/developer concerning `header`.
fn extra_info(&self, header: &Header) -> HashMap<String, String> { fn extra_info(&self, header: &Header) -> BTreeMap<String, String> {
hash_map!["nonce".to_owned() => format!("0x{}", header.nonce().hex()), "mixHash".to_owned() => format!("0x{}", header.mix_hash().hex())] map!["nonce".to_owned() => format!("0x{}", header.nonce().hex()), "mixHash".to_owned() => format!("0x{}", header.mix_hash().hex())]
} }
fn schedule(&self, env_info: &EnvInfo) -> Schedule { fn schedule(&self, env_info: &EnvInfo) -> Schedule {

View File

@@ -55,7 +55,7 @@ pub struct TraceId {
} }
/// Uniquely identifies Uncle. /// Uniquely identifies Uncle.
#[derive(Debug, Binary)] #[derive(Debug, PartialEq, Eq, Copy, Clone, Binary)]
pub struct UncleID { pub struct UncleID {
/// Block id. /// Block id.
pub block: BlockID, pub block: BlockID,

View File

@@ -20,7 +20,7 @@ pub use std::time::Duration;
use client::Mode as ClientMode; use client::Mode as ClientMode;
/// IPC-capable shadow-type for client::config::Mode /// IPC-capable shadow-type for client::config::Mode
#[derive(Clone, Binary)] #[derive(Clone, Binary, Debug)]
pub enum Mode { pub enum Mode {
/// Same as ClientMode::Off. /// Same as ClientMode::Off.
Off, Off,

View File

@@ -159,7 +159,7 @@ impl Transaction {
unsigned: self, unsigned: self,
r: sig.r().into(), r: sig.r().into(),
s: sig.s().into(), s: sig.s().into(),
v: sig.v() + if let Some(n) = network_id { 1 + n * 2 } else { 27 }, v: sig.v() + if let Some(n) = network_id { 35 + n * 2 } else { 27 },
hash: Cell::new(None), hash: Cell::new(None),
sender: Cell::new(None), sender: Cell::new(None),
} }
@@ -302,13 +302,13 @@ impl SignedTransaction {
} }
/// 0 if `v` would have been 27 under "Electrum" notation, 1 if 28 or 4 if invalid. /// 0 if `v` would have been 27 under "Electrum" notation, 1 if 28 or 4 if invalid.
pub fn standard_v(&self) -> u8 { match self.v { 0 => 4, v => (v - 1) & 1, } } pub fn standard_v(&self) -> u8 { match self.v { v if v == 27 || v == 28 || v > 36 => (v - 1) % 2, _ => 4 } }
/// The network ID, or `None` if this is a global transaction. /// The network ID, or `None` if this is a global transaction.
pub fn network_id(&self) -> Option<u8> { pub fn network_id(&self) -> Option<u8> {
match self.v { match self.v {
0 | 27 | 28 => None, v if v > 36 => Some((v - 35) / 2),
v => Some((v - 1) / 2), _ => None,
} }
} }
@@ -456,21 +456,22 @@ fn should_recover_from_network_specific_signing() {
#[test] #[test]
fn should_agree_with_vitalik() { fn should_agree_with_vitalik() {
use rustc_serialize::hex::FromHex; use rustc_serialize::hex::FromHex;
use std::str::FromStr;
let test_vector = |tx_data: &str, address: &'static str| { let test_vector = |tx_data: &str, address: &'static str| {
let signed: SignedTransaction = decode(&FromHex::from_hex(tx_data).unwrap()); let signed: SignedTransaction = decode(&FromHex::from_hex(tx_data).unwrap());
assert_eq!(signed.sender().unwrap(), address.into()); signed.check_low_s().unwrap();
assert_eq!(signed.sender().unwrap(), address.into());
flushln!("networkid: {:?}", signed.network_id());
}; };
test_vector("f864808504a817c800825208943535353535353535353535353535353535353535808025a0044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116da0044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d", "0xda39a520355857fdb37ecb527fe814230fa9962c"); test_vector("f864808504a817c800825208943535353535353535353535353535353535353535808025a0044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116da0044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d", "0xf0f6f18bca1b28cd68e4357452947e021241e9ce")
test_vector("f864018504a817c80182a410943535353535353535353535353535353535353535018025a0c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc8a0c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6", "0xd240215f30eafee2aaa5184d8f051ebb41c90b19"); test_vector("f864018504a817c80182a410943535353535353535353535353535353535353535018025a0489efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bcaa0489efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6", "0x23ef145a395ea3fa3deb533b8a9e1b4c6c25d112")
test_vector("f864028504a817c80282f618943535353535353535353535353535353535353535088025a0ad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a8a0ad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5", "0x2f2822c55d894df1ba32961c43325dcb3d614ee8"); test_vector("f864028504a817c80282f618943535353535353535353535353535353535353535088025a02d7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5a02d7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5", "0x2e485e0c23b4c3c542628a5f672eeab0ad4888be")
test_vector("f865038504a817c803830148209435353535353535353535353535353535353535351b8025a02a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4e0a02a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de", "0xc21df0434ceab6e18a1300d18206e54e807b4456"); test_vector("f865038504a817c803830148209435353535353535353535353535353535353535351b8025a02a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4e0a02a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de", "0x82a88539669a3fd524d669e858935de5e5410cf0")
test_vector("f865048504a817c80483019a28943535353535353535353535353535353535353535408025a013600b294191fc92924bb3ce4b969c1e7e2bab8f4c93c3fc6d0a51733df3c063a013600b294191fc92924bb3ce4b969c1e7e2bab8f4c93c3fc6d0a51733df3c060", "0xf975cee81edae2ab5883f4e2fb2a7f2fd56f4131"); test_vector("f865048504a817c80483019a28943535353535353535353535353535353535353535408025a013600b294191fc92924bb3ce4b969c1e7e2bab8f4c93c3fc6d0a51733df3c063a013600b294191fc92924bb3ce4b969c1e7e2bab8f4c93c3fc6d0a51733df3c060", "0xf9358f2538fd5ccfeb848b64a96b743fcc930554")
test_vector("f865058504a817c8058301ec309435353535353535353535353535353535353535357d8025a0ceebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1a0ceebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1", "0xd477474c9f48dcbfde5d97f30646242ab7a17e06"); test_vector("f865058504a817c8058301ec309435353535353535353535353535353535353535357d8025a04eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1a04eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1", "0xa8f7aba377317440bc5b26198a363ad22af1f3a4")
test_vector("f866068504a817c80683023e3894353535353535353535353535353535353535353581d88025a0e455bf8ea6e7463a1046a0b52804526e119b4bf5136279614e0b1e8e296a4e2da0e455bf8ea6e7463a1046a0b52804526e119b4bf5136279614e0b1e8e296a4e2d", "0xb49948deb719ca21e38d29e3360f534b39db0e76"); test_vector("f866068504a817c80683023e3894353535353535353535353535353535353535353581d88025a06455bf8ea6e7463a1046a0b52804526e119b4bf5136279614e0b1e8e296a4e2fa06455bf8ea6e7463a1046a0b52804526e119b4bf5136279614e0b1e8e296a4e2d", "0xf1f571dc362a0e5b2696b8e775f8491d3e50de35")
test_vector("f867078504a817c807830290409435353535353535353535353535353535353535358201578025a052f1a9b320cab38e5da8a8f97989383aab0a49165fc91c737310e4f7e9821021a052f1a9b320cab38e5da8a8f97989383aab0a49165fc91c737310e4f7e9821021", "0xbddfc81a8ce87b2360837049a6eda68ab2f58999"); test_vector("f867078504a817c807830290409435353535353535353535353535353535353535358201578025a052f1a9b320cab38e5da8a8f97989383aab0a49165fc91c737310e4f7e9821021a052f1a9b320cab38e5da8a8f97989383aab0a49165fc91c737310e4f7e9821021", "0xd37922162ab7cea97c97a87551ed02c9a38b7332")
test_vector("f867088504a817c8088302e2489435353535353535353535353535353535353535358202008025a0e4b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c11a0e4b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c10", "0x8f2edcf67f329a146dd4cb1e6b3a072daff85b38"); test_vector("f867088504a817c8088302e2489435353535353535353535353535353535353535358202008025a064b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c12a064b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c10", "0x9bddad43f934d313c2b79ca28a432dd2b7281029")
test_vector("f867098504a817c809830334509435353535353535353535353535353535353535358202d98025a0d2f8f61201b2b11a78d6e866abc9c3db2ae8631fa656bfe5cb53668255367afba0d2f8f61201b2b11a78d6e866abc9c3db2ae8631fa656bfe5cb53668255367afb", "0x4ec38d4782fd4a6ff85c1cde77ccf1ae3c54472c"); test_vector("f867098504a817c809830334509435353535353535353535353535353535353535358202d98025a052f8f61201b2b11a78d6e866abc9c3db2ae8631fa656bfe5cb53668255367afba052f8f61201b2b11a78d6e866abc9c3db2ae8631fa656bfe5cb53668255367afb", "0x3c24d7329e92f84f08556ceb6df1cdb0104ca49f")
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

View File

@@ -1,6 +1,6 @@
{ {
"name": "parity.js", "name": "parity.js",
"version": "0.1.52", "version": "0.1.55",
"main": "release/index.js", "main": "release/index.js",
"jsnext:main": "src/index.js", "jsnext:main": "src/index.js",
"author": "Parity Team <admin@parity.io>", "author": "Parity Team <admin@parity.io>",
@@ -23,16 +23,16 @@
"Promise" "Promise"
], ],
"scripts": { "scripts": {
"build": "npm run build:dll && npm run build:app && npm run build:lib", "build": "npm run build:lib && npm run build:dll && npm run build:app",
"build:app": "webpack --progress", "build:app": "webpack --progress",
"build:lib": "webpack --config webpack.libraries --progress", "build:lib": "webpack --config webpack.libraries --progress",
"build:dll": "webpack --config webpack.vendor --progress", "build:dll": "webpack --config webpack.vendor --progress",
"ci:build": "npm run ci:build:dll && npm run ci:build:app && npm run ci:build:lib", "ci:build": "npm run ci:build:lib && npm run ci:build:dll && npm run ci:build:app",
"ci:build:app": "NODE_ENV=production webpack", "ci:build:app": "NODE_ENV=production webpack",
"ci:build:lib": "NODE_ENV=production webpack --config webpack.libraries", "ci:build:lib": "NODE_ENV=production webpack --config webpack.libraries",
"ci:build:dll": "NODE_ENV=production webpack --config webpack.vendor", "ci:build:dll": "NODE_ENV=production webpack --config webpack.vendor",
"ci:build:npm": "NODE_ENV=production webpack --config webpack.npm", "ci:build:npm": "NODE_ENV=production webpack --config webpack.npm",
"start": "npm install && npm run build:dll && npm run start:app", "start": "npm install && npm run build:lib && npm run build:dll && npm run start:app",
"start:app": "webpack-dev-server -d --history-api-fallback --open --hot --inline --progress --colors --port 3000", "start:app": "webpack-dev-server -d --history-api-fallback --open --hot --inline --progress --colors --port 3000",
"clean": "rm -rf ./build ./coverage", "clean": "rm -rf ./build ./coverage",
"coveralls": "npm run testCoverage && coveralls < coverage/lcov.info", "coveralls": "npm run testCoverage && coveralls < coverage/lcov.info",
@@ -44,7 +44,7 @@
"devDependencies": { "devDependencies": {
"babel-cli": "^6.10.1", "babel-cli": "^6.10.1",
"babel-core": "^6.10.4", "babel-core": "^6.10.4",
"babel-eslint": "^6.1.2", "babel-eslint": "^7.1.0",
"babel-loader": "^6.2.3", "babel-loader": "^6.2.3",
"babel-plugin-lodash": "^3.2.2", "babel-plugin-lodash": "^3.2.2",
"babel-plugin-transform-class-properties": "^6.11.5", "babel-plugin-transform-class-properties": "^6.11.5",
@@ -126,6 +126,9 @@
"marked": "^0.3.6", "marked": "^0.3.6",
"material-ui": "^0.16.1", "material-ui": "^0.16.1",
"material-ui-chip-input": "^0.8.0", "material-ui-chip-input": "^0.8.0",
"mobx": "^2.6.1",
"mobx-react": "^3.5.8",
"mobx-react-devtools": "^4.2.9",
"moment": "^2.14.1", "moment": "^2.14.1",
"qs": "^6.3.0", "qs": "^6.3.0",
"react": "^15.2.1", "react": "^15.2.1",

View File

@@ -50,32 +50,32 @@ setup_git_user
git remote set-url origin $GIT_PARITY git remote set-url origin $GIT_PARITY
git reset --hard origin/$BRANCH 2>$GITLOG git reset --hard origin/$BRANCH 2>$GITLOG
echo "*** Bumping package.json patch version" if [ "$BRANCH" == "master" ]; then
cd js cd js
npm --no-git-tag-version version echo "*** Bumping package.json patch version"
npm version patch npm --no-git-tag-version version
cd .. npm version patch
echo "*** Building packages for npmjs"
# echo -e "$NPM_USERNAME\n$NPM_PASSWORD\n$NPM_EMAIL" | npm login
echo "$NPM_TOKEN" >> ~/.npmrc
npm run ci:build:npm
echo "*** Publishing $PACKAGE to npmjs"
cd .npmjs
npm publish --access public
cd ../..
fi
echo "*** Updating cargo parity-ui-precompiled#$PRECOMPILED_HASH" echo "*** Updating cargo parity-ui-precompiled#$PRECOMPILED_HASH"
cargo update -p parity-ui-precompiled cargo update -p parity-ui-precompiled
# --precise "$PRECOMPILED_HASH" # --precise "$PRECOMPILED_HASH"
echo "*** Committing updated files" echo "*** Committing updated files"
git add Cargo.lock js/package.json git add .
git commit -m "[ci skip] js-precompiled $UTCDATE" git commit -m "[ci skip] js-precompiled $UTCDATE"
git push origin HEAD:refs/heads/$BRANCH 2>$GITLOG git push origin HEAD:refs/heads/$BRANCH 2>$GITLOG
echo "*** Building packages for npmjs"
cd js
# echo -e "$NPM_USERNAME\n$NPM_PASSWORD\n$NPM_EMAIL" | npm login
echo "$NPM_TOKEN" >> ~/.npmrc
npm run ci:build:npm
echo "*** Publishing $PACKAGE to npmjs"
cd .npmjs
npm publish --access public
cd ..
# back to root # back to root
echo "*** Release completed" echo "*** Release completed"
popd popd

View File

@@ -135,10 +135,11 @@ APIs implement the calls as exposed in the [Ethcore JSON Ethereum RPC](https://g
- [ethapi.db](https://github.com/ethcore/ethereum-rpc-json/blob/master/interfaces.md#db) - [ethapi.db](https://github.com/ethcore/ethereum-rpc-json/blob/master/interfaces.md#db)
- [ethapi.eth](https://github.com/ethcore/ethereum-rpc-json/blob/master/interfaces.md#eth) - [ethapi.eth](https://github.com/ethcore/ethereum-rpc-json/blob/master/interfaces.md#eth)
- [ethapi.ethcore](https://github.com/ethcore/ethereum-rpc-json/blob/master/interfaces.md#ethcore) - [ethapi.parity](https://github.com/ethcore/ethereum-rpc-json/blob/master/interfaces.md#parity)
- [ethapi.net](https://github.com/ethcore/ethereum-rpc-json/blob/master/interfaces.md#net) - [ethapi.net](https://github.com/ethcore/ethereum-rpc-json/blob/master/interfaces.md#net)
- [ethapi.personal](https://github.com/ethcore/ethereum-rpc-json/blob/master/interfaces.md#personal) - [ethapi.personal](https://github.com/ethcore/ethereum-rpc-json/blob/master/interfaces.md#personal)
- [ethapi.shh](https://github.com/ethcore/ethereum-rpc-json/blob/master/interfaces.md#shh) - [ethapi.shh](https://github.com/ethcore/ethereum-rpc-json/blob/master/interfaces.md#shh)
- [ethapi.signer](https://github.com/ethcore/ethereum-rpc-json/blob/master/interfaces.md#signer)
- [ethapi.trace](https://github.com/ethcore/ethereum-rpc-json/blob/master/interfaces.md#trace) - [ethapi.trace](https://github.com/ethcore/ethereum-rpc-json/blob/master/interfaces.md#trace)
- [ethapi.web3](https://github.com/ethcore/ethereum-rpc-json/blob/master/interfaces.md#web3) - [ethapi.web3](https://github.com/ethcore/ethereum-rpc-json/blob/master/interfaces.md#web3)

View File

@@ -17,7 +17,7 @@
import { Http, Ws } from './transport'; import { Http, Ws } from './transport';
import Contract from './contract'; import Contract from './contract';
import { Db, Eth, Ethcore, Net, Personal, Shh, Trace, Web3 } from './rpc'; import { Db, Eth, Parity, Net, Personal, Shh, Signer, Trace, Web3 } from './rpc';
import Subscriptions from './subscriptions'; import Subscriptions from './subscriptions';
import util from './util'; import util from './util';
import { isFunction } from './util/types'; import { isFunction } from './util/types';
@@ -32,10 +32,11 @@ export default class Api {
this._db = new Db(transport); this._db = new Db(transport);
this._eth = new Eth(transport); this._eth = new Eth(transport);
this._ethcore = new Ethcore(transport);
this._net = new Net(transport); this._net = new Net(transport);
this._parity = new Parity(transport);
this._personal = new Personal(transport); this._personal = new Personal(transport);
this._shh = new Shh(transport); this._shh = new Shh(transport);
this._signer = new Signer(transport);
this._trace = new Trace(transport); this._trace = new Trace(transport);
this._web3 = new Web3(transport); this._web3 = new Web3(transport);
@@ -50,8 +51,8 @@ export default class Api {
return this._eth; return this._eth;
} }
get ethcore () { get parity () {
return this._ethcore; return this._parity;
} }
get net () { get net () {
@@ -66,6 +67,10 @@ export default class Api {
return this._shh; return this._shh;
} }
get signer () {
return this._signer;
}
get trace () { get trace () {
return this._trace; return this._trace;
} }

View File

@@ -102,7 +102,7 @@ export default class Contract {
options.gas = gas.toFixed(0); options.gas = gas.toFixed(0);
setState({ state: 'postTransaction', gas }); setState({ state: 'postTransaction', gas });
return this._api.eth.postTransaction(this._encodeOptions(this.constructors[0], options, values)); return this._api.parity.postTransaction(this._encodeOptions(this.constructors[0], options, values));
}) })
.then((requestId) => { .then((requestId) => {
setState({ state: 'checkRequest', requestId }); setState({ state: 'checkRequest', requestId });
@@ -166,7 +166,7 @@ export default class Contract {
} }
_pollCheckRequest = (requestId) => { _pollCheckRequest = (requestId) => {
return this._api.pollMethod('eth_checkRequest', requestId); return this._api.pollMethod('parity_checkRequest', requestId);
} }
_pollTransactionReceipt = (txhash, gas) => { _pollTransactionReceipt = (txhash, gas) => {
@@ -208,7 +208,7 @@ export default class Contract {
if (!func.constant) { if (!func.constant) {
func.postTransaction = (options, values = []) => { func.postTransaction = (options, values = []) => {
return this._api.eth return this._api.parity
.postTransaction(this._encodeOptions(func, this._addOptionsTo(options), values)); .postTransaction(this._encodeOptions(func, this._addOptionsTo(options), values));
}; };

View File

@@ -249,9 +249,9 @@ describe('api/contract/Contract', () => {
before(() => { before(() => {
scope = mockHttp([ scope = mockHttp([
{ method: 'eth_estimateGas', reply: { result: 1000 } }, { method: 'eth_estimateGas', reply: { result: 1000 } },
{ method: 'eth_postTransaction', reply: { result: '0x678' } }, { method: 'parity_postTransaction', reply: { result: '0x678' } },
{ method: 'eth_checkRequest', reply: { result: null } }, { method: 'parity_checkRequest', reply: { result: null } },
{ method: 'eth_checkRequest', reply: { result: '0x890' } }, { method: 'parity_checkRequest', reply: { result: '0x890' } },
{ method: 'eth_getTransactionReceipt', reply: { result: null } }, { method: 'eth_getTransactionReceipt', reply: { result: null } },
{ method: 'eth_getTransactionReceipt', reply: { result: RECEIPT_PEND } }, { method: 'eth_getTransactionReceipt', reply: { result: RECEIPT_PEND } },
{ method: 'eth_getTransactionReceipt', reply: { result: RECEIPT_DONE } }, { method: 'eth_getTransactionReceipt', reply: { result: RECEIPT_DONE } },
@@ -266,7 +266,7 @@ describe('api/contract/Contract', () => {
}); });
it('passes the options through to postTransaction (incl. gas calculation)', () => { it('passes the options through to postTransaction (incl. gas calculation)', () => {
expect(scope.body.eth_postTransaction.params).to.deep.equal([ expect(scope.body.parity_postTransaction.params).to.deep.equal([
{ data: '0x123', gas: '0x4b0' } { data: '0x123', gas: '0x4b0' }
]); ]);
}); });
@@ -280,8 +280,8 @@ describe('api/contract/Contract', () => {
it('fails when gasUsed == gas', () => { it('fails when gasUsed == gas', () => {
mockHttp([ mockHttp([
{ method: 'eth_estimateGas', reply: { result: 1000 } }, { method: 'eth_estimateGas', reply: { result: 1000 } },
{ method: 'eth_postTransaction', reply: { result: '0x678' } }, { method: 'parity_postTransaction', reply: { result: '0x678' } },
{ method: 'eth_checkRequest', reply: { result: '0x789' } }, { method: 'parity_checkRequest', reply: { result: '0x789' } },
{ method: 'eth_getTransactionReceipt', reply: { result: RECEIPT_EXCP } } { method: 'eth_getTransactionReceipt', reply: { result: RECEIPT_EXCP } }
]); ]);
@@ -295,8 +295,8 @@ describe('api/contract/Contract', () => {
it('fails when no code was deployed', () => { it('fails when no code was deployed', () => {
mockHttp([ mockHttp([
{ method: 'eth_estimateGas', reply: { result: 1000 } }, { method: 'eth_estimateGas', reply: { result: 1000 } },
{ method: 'eth_postTransaction', reply: { result: '0x678' } }, { method: 'parity_postTransaction', reply: { result: '0x678' } },
{ method: 'eth_checkRequest', reply: { result: '0x789' } }, { method: 'parity_checkRequest', reply: { result: '0x789' } },
{ method: 'eth_getTransactionReceipt', reply: { result: RECEIPT_DONE } }, { method: 'eth_getTransactionReceipt', reply: { result: RECEIPT_DONE } },
{ method: 'eth_getCode', reply: { result: '0x' } } { method: 'eth_getCode', reply: { result: '0x' } }
]); ]);
@@ -360,15 +360,15 @@ describe('api/contract/Contract', () => {
describe('postTransaction', () => { describe('postTransaction', () => {
beforeEach(() => { beforeEach(() => {
scope = mockHttp([{ method: 'eth_postTransaction', reply: { result: ['hashId'] } }]); scope = mockHttp([{ method: 'parity_postTransaction', reply: { result: ['hashId'] } }]);
}); });
it('encodes options and mades an eth_postTransaction call', () => { it('encodes options and mades an parity_postTransaction call', () => {
return func return func
.postTransaction({ someExtras: 'foo' }, VALUES) .postTransaction({ someExtras: 'foo' }, VALUES)
.then(() => { .then(() => {
expect(scope.isDone()).to.be.true; expect(scope.isDone()).to.be.true;
expect(scope.body.eth_postTransaction.params[0]).to.deep.equal({ expect(scope.body.parity_postTransaction.params[0]).to.deep.equal({
someExtras: 'foo', someExtras: 'foo',
to: ADDR, to: ADDR,
data: ENCODED data: ENCODED

View File

@@ -39,11 +39,6 @@ export default class Eth {
.execute('eth_call', inOptions(options), inBlockNumber(blockNumber)); .execute('eth_call', inOptions(options), inBlockNumber(blockNumber));
} }
checkRequest (requestId) {
return this._transport
.execute('eth_checkRequest', inNumber16(requestId));
}
coinbase () { coinbase () {
return this._transport return this._transport
.execute('eth_coinbase') .execute('eth_coinbase')
@@ -267,11 +262,6 @@ export default class Eth {
.execute('eth_pendingTransactions'); .execute('eth_pendingTransactions');
} }
postTransaction (options) {
return this._transport
.execute('eth_postTransaction', inOptions(options));
}
protocolVersion () { protocolVersion () {
return this._transport return this._transport
.execute('eth_protocolVersion'); .execute('eth_protocolVersion');

View File

@@ -1,201 +0,0 @@
// Copyright 2015, 2016 Ethcore (UK) Ltd.
// This file is part of Parity.
// Parity is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// Parity is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
import { inAddress, inData, inNumber16 } from '../../format/input';
import { outAddress, outHistogram, outNumber, outPeers } from '../../format/output';
export default class Ethcore {
constructor (transport) {
this._transport = transport;
}
acceptNonReservedPeers () {
return this._transport
.execute('ethcore_acceptNonReservedPeers');
}
addReservedPeer (encode) {
return this._transport
.execute('ethcore_addReservedPeer', encode);
}
dappsPort () {
return this._transport
.execute('ethcore_dappsPort')
.then(outNumber);
}
defaultExtraData () {
return this._transport
.execute('ethcore_defaultExtraData');
}
devLogs () {
return this._transport
.execute('ethcore_devLogs');
}
devLogsLevels () {
return this._transport
.execute('ethcore_devLogsLevels');
}
dropNonReservedPeers () {
return this._transport
.execute('ethcore_dropNonReservedPeers');
}
enode () {
return this._transport
.execute('ethcore_enode');
}
extraData () {
return this._transport
.execute('ethcore_extraData');
}
gasFloorTarget () {
return this._transport
.execute('ethcore_gasFloorTarget')
.then(outNumber);
}
gasPriceHistogram () {
return this._transport
.execute('ethcore_gasPriceHistogram')
.then(outHistogram);
}
generateSecretPhrase () {
return this._transport
.execute('ethcore_generateSecretPhrase');
}
hashContent (url) {
return this._transport
.execute('ethcore_hashContent', url);
}
minGasPrice () {
return this._transport
.execute('ethcore_minGasPrice')
.then(outNumber);
}
mode () {
return this._transport
.execute('ethcore_mode');
}
netChain () {
return this._transport
.execute('ethcore_netChain');
}
netPeers () {
return this._transport
.execute('ethcore_netPeers')
.then(outPeers);
}
netMaxPeers () {
return this._transport
.execute('ethcore_netMaxPeers')
.then(outNumber);
}
netPort () {
return this._transport
.execute('ethcore_netPort')
.then(outNumber);
}
nodeName () {
return this._transport
.execute('ethcore_nodeName');
}
phraseToAddress (phrase) {
return this._transport
.execute('ethcore_phraseToAddress', phrase)
.then(outAddress);
}
registryAddress () {
return this._transport
.execute('ethcore_registryAddress')
.then(outAddress);
}
removeReservedPeer (encode) {
return this._transport
.execute('ethcore_removeReservedPeer', encode);
}
rpcSettings () {
return this._transport
.execute('ethcore_rpcSettings');
}
setAuthor (address) {
return this._transport
.execute('ethcore_setAuthor', inAddress(address));
}
setExtraData (data) {
return this._transport
.execute('ethcore_setExtraData', inData(data));
}
setGasFloorTarget (quantity) {
return this._transport
.execute('ethcore_setGasFloorTarget', inNumber16(quantity));
}
setMinGasPrice (quantity) {
return this._transport
.execute('ethcore_setMinGasPrice', inNumber16(quantity));
}
setMode (mode) {
return this._transport
.execute('ethcore_setMode', mode);
}
setTransactionsLimit (quantity) {
return this._transport
.execute('ethcore_setTransactionsLimit', inNumber16(quantity));
}
signerPort () {
return this._transport
.execute('ethcore_signerPort')
.then(outNumber);
}
transactionsLimit () {
return this._transport
.execute('ethcore_transactionsLimit')
.then(outNumber);
}
unsignedTransactionsCount () {
return this._transport
.execute('ethcore_unsignedTransactionsCount')
.then(outNumber);
}
}

View File

@@ -16,9 +16,10 @@
export Db from './db'; export Db from './db';
export Eth from './eth'; export Eth from './eth';
export Ethcore from './ethcore'; export Parity from './parity';
export Net from './net'; export Net from './net';
export Personal from './personal'; export Personal from './personal';
export Shh from './shh'; export Shh from './shh';
export Signer from './signer';
export Trace from './trace'; export Trace from './trace';
export Web3 from './web3'; export Web3 from './web3';

View File

@@ -14,4 +14,4 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>. // along with Parity. If not, see <http://www.gnu.org/licenses/>.
export default from './ethcore'; export default from './parity';

View File

@@ -16,12 +16,12 @@
import { createHttpApi } from '../../../../test/e2e/ethapi'; import { createHttpApi } from '../../../../test/e2e/ethapi';
describe('ethapi.ethcore', () => { describe('ethapi.parity', () => {
const ethapi = createHttpApi(); const ethapi = createHttpApi();
describe('gasFloorTarget', () => { describe('gasFloorTarget', () => {
it('returns and translates the target', () => { it('returns and translates the target', () => {
return ethapi.ethcore.gasFloorTarget().then((value) => { return ethapi.parity.gasFloorTarget().then((value) => {
expect(value.gt(0)).to.be.true; expect(value.gt(0)).to.be.true;
}); });
}); });
@@ -29,7 +29,7 @@ describe('ethapi.ethcore', () => {
describe('gasPriceHistogram', () => { describe('gasPriceHistogram', () => {
it('returns and translates the target', () => { it('returns and translates the target', () => {
return ethapi.ethcore.gasPriceHistogram().then((result) => { return ethapi.parity.gasPriceHistogram().then((result) => {
expect(Object.keys(result)).to.deep.equal(['bucketBounds', 'counts']); expect(Object.keys(result)).to.deep.equal(['bucketBounds', 'counts']);
expect(result.bucketBounds.length > 0).to.be.true; expect(result.bucketBounds.length > 0).to.be.true;
expect(result.counts.length > 0).to.be.true; expect(result.counts.length > 0).to.be.true;
@@ -39,7 +39,7 @@ describe('ethapi.ethcore', () => {
describe('netChain', () => { describe('netChain', () => {
it('returns and the chain', () => { it('returns and the chain', () => {
return ethapi.ethcore.netChain().then((value) => { return ethapi.parity.netChain().then((value) => {
expect(value).to.equal('morden'); expect(value).to.equal('morden');
}); });
}); });
@@ -47,7 +47,7 @@ describe('ethapi.ethcore', () => {
describe('netPort', () => { describe('netPort', () => {
it('returns and translates the port', () => { it('returns and translates the port', () => {
return ethapi.ethcore.netPort().then((value) => { return ethapi.parity.netPort().then((value) => {
expect(value.gt(0)).to.be.true; expect(value.gt(0)).to.be.true;
}); });
}); });
@@ -55,7 +55,7 @@ describe('ethapi.ethcore', () => {
describe('transactionsLimit', () => { describe('transactionsLimit', () => {
it('returns and translates the limit', () => { it('returns and translates the limit', () => {
return ethapi.ethcore.transactionsLimit().then((value) => { return ethapi.parity.transactionsLimit().then((value) => {
expect(value.gt(0)).to.be.true; expect(value.gt(0)).to.be.true;
}); });
}); });
@@ -63,7 +63,7 @@ describe('ethapi.ethcore', () => {
describe('rpcSettings', () => { describe('rpcSettings', () => {
it('returns and translates the settings', () => { it('returns and translates the settings', () => {
return ethapi.ethcore.rpcSettings().then((value) => { return ethapi.parity.rpcSettings().then((value) => {
expect(value).to.be.ok; expect(value).to.be.ok;
}); });
}); });

View File

@@ -0,0 +1,273 @@
// Copyright 2015, 2016 Ethcore (UK) Ltd.
// This file is part of Parity.
// Parity is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// Parity is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
import { inAddress, inData, inHex, inNumber16, inOptions } from '../../format/input';
import { outAccountInfo, outAddress, outHistogram, outNumber, outPeers } from '../../format/output';
export default class Parity {
constructor (transport) {
this._transport = transport;
}
acceptNonReservedPeers () {
return this._transport
.execute('parity_acceptNonReservedPeers');
}
accounts () {
return this._transport
.execute('parity_accounts')
.then(outAccountInfo);
}
accountsInfo () {
return this._transport
.execute('parity_accountsInfo')
.then(outAccountInfo);
}
addReservedPeer (encode) {
return this._transport
.execute('parity_addReservedPeer', encode);
}
changePassword (account, password, newPassword) {
return this._transport
.execute('parity_changePassword', inAddress(account), password, newPassword);
}
checkRequest (requestId) {
return this._transport
.execute('parity_checkRequest', inNumber16(requestId));
}
dappsPort () {
return this._transport
.execute('parity_dappsPort')
.then(outNumber);
}
defaultExtraData () {
return this._transport
.execute('parity_defaultExtraData');
}
devLogs () {
return this._transport
.execute('parity_devLogs');
}
devLogsLevels () {
return this._transport
.execute('parity_devLogsLevels');
}
dropNonReservedPeers () {
return this._transport
.execute('parity_dropNonReservedPeers');
}
enode () {
return this._transport
.execute('parity_enode');
}
extraData () {
return this._transport
.execute('parity_extraData');
}
gasFloorTarget () {
return this._transport
.execute('parity_gasFloorTarget')
.then(outNumber);
}
gasPriceHistogram () {
return this._transport
.execute('parity_gasPriceHistogram')
.then(outHistogram);
}
generateSecretPhrase () {
return this._transport
.execute('parity_generateSecretPhrase');
}
hashContent (url) {
return this._transport
.execute('parity_hashContent', url);
}
listGethAccounts () {
return this._transport
.execute('parity_listGethAccounts')
.then((accounts) => (accounts || []).map(outAddress));
}
importGethAccounts (accounts) {
return this._transport
.execute('parity_importGethAccounts', (accounts || []).map(inAddress))
.then((accounts) => (accounts || []).map(outAddress));
}
minGasPrice () {
return this._transport
.execute('parity_minGasPrice')
.then(outNumber);
}
mode () {
return this._transport
.execute('parity_mode');
}
netChain () {
return this._transport
.execute('parity_netChain');
}
netPeers () {
return this._transport
.execute('parity_netPeers')
.then(outPeers);
}
netMaxPeers () {
return this._transport
.execute('parity_netMaxPeers')
.then(outNumber);
}
netPort () {
return this._transport
.execute('parity_netPort')
.then(outNumber);
}
newAccountFromPhrase (phrase, password) {
return this._transport
.execute('parity_newAccountFromPhrase', phrase, password)
.then(outAddress);
}
newAccountFromSecret (secret, password) {
return this._transport
.execute('parity_newAccountFromSecret', inHex(secret), password)
.then(outAddress);
}
newAccountFromWallet (json, password) {
return this._transport
.execute('parity_newAccountFromWallet', json, password)
.then(outAddress);
}
nodeName () {
return this._transport
.execute('parity_nodeName');
}
phraseToAddress (phrase) {
return this._transport
.execute('parity_phraseToAddress', phrase)
.then(outAddress);
}
postTransaction (options) {
return this._transport
.execute('parity_postTransaction', inOptions(options));
}
registryAddress () {
return this._transport
.execute('parity_registryAddress')
.then(outAddress);
}
removeReservedPeer (encode) {
return this._transport
.execute('parity_removeReservedPeer', encode);
}
rpcSettings () {
return this._transport
.execute('parity_rpcSettings');
}
setAccountName (address, name) {
return this._transport
.execute('parity_setAccountName', inAddress(address), name);
}
setAccountMeta (address, meta) {
return this._transport
.execute('parity_setAccountMeta', inAddress(address), JSON.stringify(meta));
}
setAuthor (address) {
return this._transport
.execute('parity_setAuthor', inAddress(address));
}
setExtraData (data) {
return this._transport
.execute('parity_setExtraData', inData(data));
}
setGasFloorTarget (quantity) {
return this._transport
.execute('parity_setGasFloorTarget', inNumber16(quantity));
}
setMinGasPrice (quantity) {
return this._transport
.execute('parity_setMinGasPrice', inNumber16(quantity));
}
setMode (mode) {
return this._transport
.execute('parity_setMode', mode);
}
setTransactionsLimit (quantity) {
return this._transport
.execute('parity_setTransactionsLimit', inNumber16(quantity));
}
signerPort () {
return this._transport
.execute('parity_signerPort')
.then(outNumber);
}
testPassword (account, password) {
return this._transport
.execute('parity_testPassword', inAddress(account), password);
}
transactionsLimit () {
return this._transport
.execute('parity_transactionsLimit')
.then(outNumber);
}
unsignedTransactionsCount () {
return this._transport
.execute('parity_unsignedTransactionsCount')
.then(outNumber);
}
}

View File

@@ -18,14 +18,36 @@ import { TEST_HTTP_URL, mockHttp } from '../../../../test/mockRpc';
import { isBigNumber } from '../../../../test/types'; import { isBigNumber } from '../../../../test/types';
import Http from '../../transport/http'; import Http from '../../transport/http';
import Ethcore from './ethcore'; import Parity from './parity';
const instance = new Ethcore(new Http(TEST_HTTP_URL)); const instance = new Parity(new Http(TEST_HTTP_URL));
describe('api/rpc/parity', () => {
describe('accountsInfo', () => {
it('retrieves the available account info', () => {
mockHttp([{ method: 'parity_accountsInfo', reply: {
result: {
'0x63cf90d3f0410092fc0fca41846f596223979195': {
name: 'name', uuid: 'uuid', meta: '{"data":"data"}'
}
}
} }]);
return instance.accountsInfo().then((result) => {
expect(result).to.deep.equal({
'0x63Cf90D3f0410092FC0fca41846f596223979195': {
name: 'name', uuid: 'uuid', meta: {
data: 'data'
}
}
});
});
});
});
describe('api/rpc/Ethcore', () => {
describe('gasFloorTarget', () => { describe('gasFloorTarget', () => {
it('returns the gasfloor, formatted', () => { it('returns the gasfloor, formatted', () => {
mockHttp([{ method: 'ethcore_gasFloorTarget', reply: { result: '0x123456' } }]); mockHttp([{ method: 'parity_gasFloorTarget', reply: { result: '0x123456' } }]);
return instance.gasFloorTarget().then((count) => { return instance.gasFloorTarget().then((count) => {
expect(isBigNumber(count)).to.be.true; expect(isBigNumber(count)).to.be.true;
@@ -36,7 +58,7 @@ describe('api/rpc/Ethcore', () => {
describe('minGasPrice', () => { describe('minGasPrice', () => {
it('returns the min gasprice, formatted', () => { it('returns the min gasprice, formatted', () => {
mockHttp([{ method: 'ethcore_minGasPrice', reply: { result: '0x123456' } }]); mockHttp([{ method: 'parity_minGasPrice', reply: { result: '0x123456' } }]);
return instance.minGasPrice().then((count) => { return instance.minGasPrice().then((count) => {
expect(isBigNumber(count)).to.be.true; expect(isBigNumber(count)).to.be.true;
@@ -47,7 +69,7 @@ describe('api/rpc/Ethcore', () => {
describe('netMaxPeers', () => { describe('netMaxPeers', () => {
it('returns the max peers, formatted', () => { it('returns the max peers, formatted', () => {
mockHttp([{ method: 'ethcore_netMaxPeers', reply: { result: 25 } }]); mockHttp([{ method: 'parity_netMaxPeers', reply: { result: 25 } }]);
return instance.netMaxPeers().then((count) => { return instance.netMaxPeers().then((count) => {
expect(isBigNumber(count)).to.be.true; expect(isBigNumber(count)).to.be.true;
@@ -58,7 +80,7 @@ describe('api/rpc/Ethcore', () => {
describe('newPeers', () => { describe('newPeers', () => {
it('returns the peer structure, formatted', () => { it('returns the peer structure, formatted', () => {
mockHttp([{ method: 'ethcore_netPeers', reply: { result: { active: 123, connected: 456, max: 789 } } }]); mockHttp([{ method: 'parity_netPeers', reply: { result: { active: 123, connected: 456, max: 789 } } }]);
return instance.netPeers().then((peers) => { return instance.netPeers().then((peers) => {
expect(peers.active.eq(123)).to.be.true; expect(peers.active.eq(123)).to.be.true;
@@ -70,7 +92,7 @@ describe('api/rpc/Ethcore', () => {
describe('netPort', () => { describe('netPort', () => {
it('returns the connected port, formatted', () => { it('returns the connected port, formatted', () => {
mockHttp([{ method: 'ethcore_netPort', reply: { result: 33030 } }]); mockHttp([{ method: 'parity_netPort', reply: { result: 33030 } }]);
return instance.netPort().then((count) => { return instance.netPort().then((count) => {
expect(isBigNumber(count)).to.be.true; expect(isBigNumber(count)).to.be.true;
@@ -81,7 +103,7 @@ describe('api/rpc/Ethcore', () => {
describe('transactionsLimit', () => { describe('transactionsLimit', () => {
it('returns the tx limit, formatted', () => { it('returns the tx limit, formatted', () => {
mockHttp([{ method: 'ethcore_transactionsLimit', reply: { result: 1024 } }]); mockHttp([{ method: 'parity_transactionsLimit', reply: { result: 1024 } }]);
return instance.transactionsLimit().then((count) => { return instance.transactionsLimit().then((count) => {
expect(isBigNumber(count)).to.be.true; expect(isBigNumber(count)).to.be.true;

View File

@@ -14,113 +14,31 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>. // along with Parity. If not, see <http://www.gnu.org/licenses/>.
import { inAddress, inHex, inNumber10, inNumber16, inOptions } from '../../format/input'; import { inAddress, inNumber10, inOptions } from '../../format/input';
import { outAccountInfo, outAddress, outSignerRequest } from '../../format/output'; import { outAddress } from '../../format/output';
export default class Personal { export default class Personal {
constructor (transport) { constructor (transport) {
this._transport = transport; this._transport = transport;
} }
accountsInfo () {
return this._transport
.execute('personal_accountsInfo')
.then(outAccountInfo);
}
confirmRequest (requestId, options, password) {
return this._transport
.execute('personal_confirmRequest', inNumber16(requestId), options, password);
}
changePassword (account, password, newPassword) {
return this._transport
.execute('personal_changePassword', inAddress(account), password, newPassword);
}
generateAuthorizationToken () {
return this._transport
.execute('personal_generateAuthorizationToken');
}
listAccounts () { listAccounts () {
return this._transport return this._transport
.execute('personal_listAccounts') .execute('personal_listAccounts')
.then((accounts) => (accounts || []).map(outAddress)); .then((accounts) => (accounts || []).map(outAddress));
} }
listGethAccounts () {
return this._transport
.execute('personal_listGethAccounts')
.then((accounts) => (accounts || []).map(outAddress));
}
importGethAccounts (accounts) {
return this._transport
.execute('personal_importGethAccounts', (accounts || []).map(inAddress))
.then((accounts) => (accounts || []).map(outAddress));
}
newAccount (password) { newAccount (password) {
return this._transport return this._transport
.execute('personal_newAccount', password) .execute('personal_newAccount', password)
.then(outAddress); .then(outAddress);
} }
newAccountFromPhrase (phrase, password) {
return this._transport
.execute('personal_newAccountFromPhrase', phrase, password)
.then(outAddress);
}
newAccountFromSecret (secret, password) {
return this._transport
.execute('personal_newAccountFromSecret', inHex(secret), password)
.then(outAddress);
}
newAccountFromWallet (json, password) {
return this._transport
.execute('personal_newAccountFromWallet', json, password)
.then(outAddress);
}
rejectRequest (requestId) {
return this._transport
.execute('personal_rejectRequest', inNumber16(requestId));
}
requestsToConfirm () {
return this._transport
.execute('personal_requestsToConfirm')
.then((requests) => (requests || []).map(outSignerRequest));
}
setAccountName (address, name) {
return this._transport
.execute('personal_setAccountName', inAddress(address), name);
}
setAccountMeta (address, meta) {
return this._transport
.execute('personal_setAccountMeta', inAddress(address), JSON.stringify(meta));
}
signAndSendTransaction (options, password) { signAndSendTransaction (options, password) {
return this._transport return this._transport
.execute('personal_signAndSendTransaction', inOptions(options), password); .execute('personal_signAndSendTransaction', inOptions(options), password);
} }
signerEnabled () {
return this._transport
.execute('personal_signerEnabled');
}
testPassword (account, password) {
return this._transport
.execute('personal_testPassword', inAddress(account), password);
}
unlockAccount (account, password, duration = 1) { unlockAccount (account, password, duration = 1) {
return this._transport return this._transport
.execute('personal_unlockAccount', inAddress(account), password, inNumber10(duration)); .execute('personal_unlockAccount', inAddress(account), password, inNumber10(duration));

View File

@@ -26,28 +26,6 @@ describe('rpc/Personal', () => {
const checksum = '0x63Cf90D3f0410092FC0fca41846f596223979195'; const checksum = '0x63Cf90D3f0410092FC0fca41846f596223979195';
let scope; let scope;
describe('accountsInfo', () => {
it('retrieves the available account info', () => {
scope = mockHttp([{ method: 'personal_accountsInfo', reply: {
result: {
'0x63cf90d3f0410092fc0fca41846f596223979195': {
name: 'name', uuid: 'uuid', meta: '{"data":"data"}'
}
}
} }]);
return instance.accountsInfo().then((result) => {
expect(result).to.deep.equal({
'0x63Cf90D3f0410092FC0fca41846f596223979195': {
name: 'name', uuid: 'uuid', meta: {
data: 'data'
}
}
});
});
});
});
describe('listAccounts', () => { describe('listAccounts', () => {
it('retrieves a list of available accounts', () => { it('retrieves a list of available accounts', () => {
scope = mockHttp([{ method: 'personal_listAccounts', reply: { result: [account] } }]); scope = mockHttp([{ method: 'personal_listAccounts', reply: { result: [account] } }]);

View File

@@ -12,24 +12,6 @@
// GNU General Public License for more details. // GNU General Public License for more details.
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>. // along with Parity. If not, see <http://www.gnu.org/licenses/>.
const defaultHidden = []; export default from './signer';
export function readHiddenApps () {
const stored = localStorage.getItem('hiddenApps');
if (stored) {
try {
return JSON.parse(stored);
} catch (error) {
console.warn('readHiddenApps', error);
}
}
return defaultHidden;
}
export function writeHiddenApps (hidden) {
localStorage.setItem('hiddenApps', JSON.stringify(hidden));
}

View File

@@ -0,0 +1,50 @@
// Copyright 2015, 2016 Ethcore (UK) Ltd.
// This file is part of Parity.
// Parity is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// Parity is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
import { inNumber16 } from '../../format/input';
import { outSignerRequest } from '../../format/output';
export default class Signer {
constructor (transport) {
this._transport = transport;
}
confirmRequest (requestId, options, password) {
return this._transport
.execute('signer_confirmRequest', inNumber16(requestId), options, password);
}
generateAuthorizationToken () {
return this._transport
.execute('signer_generateAuthorizationToken');
}
rejectRequest (requestId) {
return this._transport
.execute('signer_rejectRequest', inNumber16(requestId));
}
requestsToConfirm () {
return this._transport
.execute('signer_requestsToConfirm')
.then((requests) => (requests || []).map(outSignerRequest));
}
signerEnabled () {
return this._transport
.execute('signer_signerEnabled');
}
}

View File

@@ -24,9 +24,9 @@ import Signer from './signer';
const events = { const events = {
'logging': { module: 'logging' }, 'logging': { module: 'logging' },
'eth_blockNumber': { module: 'eth' }, 'eth_blockNumber': { module: 'eth' },
'personal_accountsInfo': { module: 'personal' }, 'parity_accountsInfo': { module: 'personal' },
'personal_listAccounts': { module: 'personal' }, 'eth_accounts': { module: 'personal' },
'personal_requestsToConfirm': { module: 'signer' } 'signer_requestsToConfirm': { module: 'signer' }
}; };
export default class Manager { export default class Manager {

View File

@@ -37,18 +37,18 @@ export default class Personal {
} }
_listAccounts = () => { _listAccounts = () => {
return this._api.personal return this._api.eth
.listAccounts() .accounts()
.then((accounts) => { .then((accounts) => {
this._updateSubscriptions('personal_listAccounts', null, accounts); this._updateSubscriptions('eth_accounts', null, accounts);
}); });
} }
_accountsInfo = () => { _accountsInfo = () => {
return this._api.personal return this._api.parity
.accountsInfo() .accountsInfo()
.then((info) => { .then((info) => {
this._updateSubscriptions('personal_accountsInfo', null, info); this._updateSubscriptions('parity_accountsInfo', null, info);
}); });
} }
@@ -59,16 +59,16 @@ export default class Personal {
} }
switch (data.method) { switch (data.method) {
case 'personal_importGethAccounts': case 'parity_importGethAccounts':
case 'personal_newAccount': case 'personal_newAccount':
case 'personal_newAccountFromPhrase': case 'parity_newAccountFromPhrase':
case 'personal_newAccountFromWallet': case 'parity_newAccountFromWallet':
this._listAccounts(); this._listAccounts();
this._accountsInfo(); this._accountsInfo();
return; return;
case 'personal_setAccountName': case 'parity_setAccountName':
case 'personal_setAccountMeta': case 'parity_setAccountMeta':
this._accountsInfo(); this._accountsInfo();
return; return;
} }

View File

@@ -34,14 +34,15 @@ function stubApi (accounts, info) {
return { return {
_calls, _calls,
personal: { parity: {
accountsInfo: () => { accountsInfo: () => {
const stub = sinon.stub().resolves(info || TEST_INFO)(); const stub = sinon.stub().resolves(info || TEST_INFO)();
_calls.accountsInfo.push(stub); _calls.accountsInfo.push(stub);
return stub; return stub;
}, }
},
listAccounts: () => { eth: {
accounts: () => {
const stub = sinon.stub().resolves(accounts || TEST_LIST)(); const stub = sinon.stub().resolves(accounts || TEST_LIST)();
_calls.listAccounts.push(stub); _calls.listAccounts.push(stub);
return stub; return stub;
@@ -85,17 +86,17 @@ describe('api/subscriptions/personal', () => {
expect(personal.isStarted).to.be.true; expect(personal.isStarted).to.be.true;
}); });
it('calls personal_accountsInfo', () => { it('calls parity_accountsInfo', () => {
expect(api._calls.accountsInfo.length).to.be.ok; expect(api._calls.accountsInfo.length).to.be.ok;
}); });
it('calls personal_listAccounts', () => { it('calls eth_accounts', () => {
expect(api._calls.listAccounts.length).to.be.ok; expect(api._calls.listAccounts.length).to.be.ok;
}); });
it('updates subscribers', () => { it('updates subscribers', () => {
expect(cb.firstCall).to.have.been.calledWith('personal_listAccounts', null, TEST_LIST); expect(cb.firstCall).to.have.been.calledWith('eth_accounts', null, TEST_LIST);
expect(cb.secondCall).to.have.been.calledWith('personal_accountsInfo', null, TEST_INFO); expect(cb.secondCall).to.have.been.calledWith('parity_accountsInfo', null, TEST_INFO);
}); });
}); });

View File

@@ -49,10 +49,10 @@ export default class Signer {
return; return;
} }
return this._api.personal return this._api.signer
.requestsToConfirm() .requestsToConfirm()
.then((requests) => { .then((requests) => {
this._updateSubscriptions('personal_requestsToConfirm', null, requests); this._updateSubscriptions('signer_requestsToConfirm', null, requests);
nextTimeout(); nextTimeout();
}) })
.catch(nextTimeout); .catch(nextTimeout);
@@ -65,7 +65,7 @@ export default class Signer {
} }
switch (data.method) { switch (data.method) {
case 'eth_postTransaction': case 'parity_postTransaction':
case 'eth_sendTranasction': case 'eth_sendTranasction':
case 'eth_sendRawTransaction': case 'eth_sendRawTransaction':
this._listRequests(false); this._listRequests(false);

View File

@@ -56,6 +56,8 @@ export default class Http extends JsonRpcBase {
if (response.status !== 200) { if (response.status !== 200) {
this._connected = false; this._connected = false;
this.error(JSON.stringify({ status: response.status, statusText: response.statusText })); this.error(JSON.stringify({ status: response.status, statusText: response.statusText }));
console.error(`${method}(${JSON.stringify(params)}): ${response.status}: ${response.statusText}`);
throw new Error(`${response.status}: ${response.statusText}`); throw new Error(`${response.status}: ${response.statusText}`);
} }
@@ -66,7 +68,9 @@ export default class Http extends JsonRpcBase {
if (response.error) { if (response.error) {
this.error(JSON.stringify(response)); this.error(JSON.stringify(response));
throw new Error(`${response.error.code}: ${response.error.message}`); console.error(`${method}(${JSON.stringify(params)}): ${response.error.code}: ${response.error.message}`);
throw new Error(`${method}: ${response.error.code}: ${response.error.message}`);
} }
this.log(JSON.stringify(response)); this.log(JSON.stringify(response));

View File

@@ -107,7 +107,9 @@ export default class Ws extends JsonRpcBase {
if (result.error) { if (result.error) {
this.error(event.data); this.error(event.data);
reject(new Error(`${result.error.code}: ${result.error.message}`)); console.error(`${method}(${JSON.stringify(params)}): ${result.error.code}: ${result.error.message}`);
reject(new Error(`${method}: ${result.error.code}: ${result.error.message}`));
delete this._messages[result.id]; delete this._messages[result.id];
return; return;
} }

View File

@@ -57,4 +57,8 @@ export default class DappReg {
getContent (id) { getContent (id) {
return this.meta(id, 'CONTENT'); return this.meta(id, 'CONTENT');
} }
getManifest (id) {
return this.meta(id, 'MANIFEST');
}
} }

View File

@@ -32,7 +32,7 @@ export default class Registry {
return; return;
} }
this._api.ethcore this._api.parity
.registryAddress() .registryAddress()
.then((address) => { .then((address) => {
this._instance = this._api.newContract(abis.registry, address).instance; this._instance = this._api.newContract(abis.registry, address).instance;

View File

@@ -83,7 +83,7 @@ export default class Application extends Component {
Promise Promise
.all([ .all([
attachInstances(), attachInstances(),
api.personal.accountsInfo() api.parity.accounts()
]) ])
.then(([{ managerInstance, registryInstance, tokenregInstance }, accountsInfo]) => { .then(([{ managerInstance, registryInstance, tokenregInstance }, accountsInfo]) => {
accountsInfo = accountsInfo || {}; accountsInfo = accountsInfo || {};

View File

@@ -296,7 +296,7 @@ export default class Deployment extends Component {
.then((signerRequestId) => { .then((signerRequestId) => {
this.setState({ signerRequestId, deployState: 'Transaction posted, Waiting for transaction authorization' }); this.setState({ signerRequestId, deployState: 'Transaction posted, Waiting for transaction authorization' });
return api.pollMethod('eth_checkRequest', signerRequestId); return api.pollMethod('parity_checkRequest', signerRequestId);
}) })
.then((txHash) => { .then((txHash) => {
this.setState({ txHash, deployState: 'Transaction authorized, Waiting for network confirmations' }); this.setState({ txHash, deployState: 'Transaction authorized, Waiting for network confirmations' });

View File

@@ -279,7 +279,7 @@ export default class Send extends Component {
.then((signerRequestId) => { .then((signerRequestId) => {
this.setState({ signerRequestId, sendState: 'Transaction posted, Waiting for transaction authorization' }); this.setState({ signerRequestId, sendState: 'Transaction posted, Waiting for transaction authorization' });
return api.pollMethod('eth_checkRequest', signerRequestId); return api.pollMethod('parity_checkRequest', signerRequestId);
}) })
.then((txHash) => { .then((txHash) => {
this.setState({ txHash, sendState: 'Transaction authorized, Waiting for network confirmations' }); this.setState({ txHash, sendState: 'Transaction authorized, Waiting for network confirmations' });

View File

@@ -100,8 +100,8 @@ export function attachInstances () {
return Promise return Promise
.all([ .all([
api.ethcore.registryAddress(), api.parity.registryAddress(),
api.ethcore.netChain() api.parity.netChain()
]) ])
.then(([registryAddress, netChain]) => { .then(([registryAddress, netChain]) => {
const registry = api.newContract(abis.registry, registryAddress).instance; const registry = api.newContract(abis.registry, registryAddress).instance;

View File

@@ -11,7 +11,6 @@
<div id="container"></div> <div id="container"></div>
<script src="vendor.js"></script> <script src="vendor.js"></script>
<script src="commons.js"></script> <script src="commons.js"></script>
<script src="/parity-utils/parity.js"></script>
<script src="githubhint.js"></script> <script src="githubhint.js"></script>
</body> </body>
</html> </html>

View File

@@ -41,7 +41,9 @@ export default class Application extends Component {
registerBusy: false, registerBusy: false,
registerError: null, registerError: null,
registerState: '', registerState: '',
registerType: 'file' registerType: 'file',
repo: '',
repoError: null
} }
componentDidMount () { componentDidMount () {
@@ -206,47 +208,64 @@ export default class Application extends Component {
} }
onChangeCommit = (event) => { onChangeCommit = (event) => {
const commit = event.target.value; let commit = event.target.value;
const commitError = null; const commitError = null;
let hasContent = false;
// TODO: field validation this.setState({ commit, commitError, contentHashError: null }, () => {
const { repo } = this.state || '';
const parts = repo.split('/');
this.setState({ commit, commitError, contentHashError: 'hash lookup in progress' }, () => { hasContent = commit.length !== 0 && parts.length === 2 && parts[0].length !== 0 && parts[1].length !== 0;
const { repo } = this.state; if (!commitError && hasContent) {
this.lookupHash(`https://codeload.github.com/${repo}/zip/${commit}`); this.setState({ contentHashError: 'hash lookup in progress' });
this.lookupHash(`https://codeload.github.com/${repo}/zip/${commit}`);
}
}); });
} }
onChangeRepo = (event) => { onChangeRepo = (event) => {
let repo = event.target.value; let repo = event.target.value;
const repoError = null; const repoError = null;
let hasContent = false;
// TODO: field validation // TODO: field validation
if (!repoError) { if (!repoError) {
repo = repo.replace('https://github.com/', ''); repo = repo.replace('https://github.com/', '');
} }
this.setState({ repo, repoError, contentHashError: 'hash lookup in progress' }, () => { this.setState({ repo, repoError, contentHashError: null }, () => {
const { commit } = this.state; const { commit } = this.state || '';
this.lookupHash(`https://codeload.github.com/${repo}/zip/${commit}`); const parts = repo.split('/');
hasContent = commit.length !== 0 && parts.length === 2 && parts[0].length !== 0 && parts[1].length !== 0;
if (!repoError && hasContent) {
this.setState({ contentHashError: 'hash lookup in progress' });
this.lookupHash(`https://codeload.github.com/${repo}/zip/${commit}`);
}
}); });
} }
onChangeUrl = (event) => { onChangeUrl = (event) => {
let url = event.target.value; let url = event.target.value;
const urlError = null; const urlError = null;
let hasContent = false;
// TODO: field validation // TODO: field validation
if (!urlError) { if (!urlError) {
const parts = url.split('/'); const parts = url.split('/');
hasContent = parts.length !== 0;
if (parts[2] === 'github.com' || parts[2] === 'raw.githubusercontent.com') { if (parts[2] === 'github.com' || parts[2] === 'raw.githubusercontent.com') {
url = `https://raw.githubusercontent.com/${parts.slice(3).join('/')}`.replace('/blob/', '/'); url = `https://raw.githubusercontent.com/${parts.slice(3).join('/')}`.replace('/blob/', '/');
} }
} }
this.setState({ url, urlError, contentHashError: 'hash lookup in progress' }, () => { this.setState({ url, urlError, contentHashError: null }, () => {
this.lookupHash(url); if (!urlError && hasContent) {
this.setState({ contentHashError: 'hash lookup in progress' });
this.lookupHash(url);
}
}); });
} }
@@ -271,7 +290,7 @@ export default class Application extends Component {
.then((signerRequestId) => { .then((signerRequestId) => {
this.setState({ signerRequestId, registerState: 'Transaction posted, Waiting for transaction authorization' }); this.setState({ signerRequestId, registerState: 'Transaction posted, Waiting for transaction authorization' });
return api.pollMethod('eth_checkRequest', signerRequestId); return api.pollMethod('parity_checkRequest', signerRequestId);
}) })
.then((txHash) => { .then((txHash) => {
this.setState({ txHash, registerState: 'Transaction authorized, Waiting for network confirmations' }); this.setState({ txHash, registerState: 'Transaction authorized, Waiting for network confirmations' });
@@ -285,7 +304,7 @@ export default class Application extends Component {
}); });
}) })
.then((txReceipt) => { .then((txReceipt) => {
this.setState({ txReceipt, registerBusy: false, registerState: 'Network confirmed, Received transaction receipt', url: '', commit: '', commitError: null, contentHash: '', contentHashOwner: null, contentHashError: null }); this.setState({ txReceipt, registerBusy: false, registerState: 'Network confirmed, Received transaction receipt', url: '', commit: '', repo: '', commitError: null, contentHash: '', contentHashOwner: null, contentHashError: null });
}) })
.catch((error) => { .catch((error) => {
console.error('onSend', error); console.error('onSend', error);
@@ -298,7 +317,7 @@ export default class Application extends Component {
this.setState({ registerBusy: true, registerState: 'Estimating gas for the transaction' }); this.setState({ registerBusy: true, registerState: 'Estimating gas for the transaction' });
const values = [contentHash, repo, commit]; const values = [contentHash, repo, commit.substr(0, 2) === '0x' ? commit : `0x${commit}`];
const options = { from: fromAddress }; const options = { from: fromAddress };
this.trackRequest( this.trackRequest(
@@ -367,7 +386,7 @@ export default class Application extends Component {
console.log(`lookupHash ${url}`); console.log(`lookupHash ${url}`);
api.ethcore api.parity
.hashContent(url) .hashContent(url)
.then((contentHash) => { .then((contentHash) => {
console.log('lookupHash', contentHash); console.log('lookupHash', contentHash);

View File

@@ -14,7 +14,7 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>. // along with Parity. If not, see <http://www.gnu.org/licenses/>.
const { api } = window.parity; const api = window.parent.secureApi;
export { export {
api api

View File

@@ -18,7 +18,7 @@ import * as abis from '../../contracts/abi';
import { api } from './parity'; import { api } from './parity';
export function attachInterface () { export function attachInterface () {
return api.ethcore return api.parity
.registryAddress() .registryAddress()
.then((registryAddress) => { .then((registryAddress) => {
console.log(`the registry was found at ${registryAddress}`); console.log(`the registry was found at ${registryAddress}`);
@@ -29,7 +29,7 @@ export function attachInterface () {
.all([ .all([
registry.getAddress.call({}, [api.util.sha3('githubhint'), 'A']), registry.getAddress.call({}, [api.util.sha3('githubhint'), 'A']),
api.eth.accounts(), api.eth.accounts(),
api.personal.accountsInfo() api.parity.accounts()
]); ]);
}) })
.then(([address, addresses, accountsInfo]) => { .then(([address, addresses, accountsInfo]) => {

View File

@@ -29,7 +29,7 @@ export { addresses, accounts, lookup, events, names, records };
export const setContract = (contract) => ({ type: 'set contract', contract }); export const setContract = (contract) => ({ type: 'set contract', contract });
export const fetchContract = () => (dispatch) => export const fetchContract = () => (dispatch) =>
api.ethcore.registryAddress() api.parity.registryAddress()
.then((address) => { .then((address) => {
const contract = api.newContract(registryAbi, address); const contract = api.newContract(registryAbi, address);
dispatch(setContract(contract)); dispatch(setContract(contract));

View File

@@ -22,7 +22,7 @@ export const fetch = () => (dispatch) => {
return Promise return Promise
.all([ .all([
api.eth.accounts(), api.eth.accounts(),
api.personal.accountsInfo() api.parity.accounts()
]) ])
.then(([ accounts, data ]) => { .then(([ accounts, data ]) => {
data = data || {}; data = data || {};

View File

@@ -39,7 +39,7 @@ const logToEvent = (log) => {
}; };
export function attachInterface (callback) { export function attachInterface (callback) {
return api.ethcore return api.parity
.registryAddress() .registryAddress()
.then((registryAddress) => { .then((registryAddress) => {
console.log(`the registry was found at ${registryAddress}`); console.log(`the registry was found at ${registryAddress}`);
@@ -50,7 +50,7 @@ export function attachInterface (callback) {
.all([ .all([
registry.getAddress.call({}, [api.util.sha3('signaturereg'), 'A']), registry.getAddress.call({}, [api.util.sha3('signaturereg'), 'A']),
api.eth.accounts(), api.eth.accounts(),
api.personal.accountsInfo() api.parity.accounts()
]); ]);
}) })
.then(([address, addresses, accountsInfo]) => { .then(([address, addresses, accountsInfo]) => {

View File

@@ -38,7 +38,7 @@ export const loadAccounts = () => (dispatch) => {
Promise Promise
.all([ .all([
api.eth.accounts(), api.eth.accounts(),
api.personal.accountsInfo() api.parity.accounts()
]) ])
.then(([ accounts, accountsInfo ]) => { .then(([ accounts, accountsInfo ]) => {
accountsInfo = accountsInfo || {}; accountsInfo = accountsInfo || {};

View File

@@ -34,7 +34,7 @@ export const FIND_CONTRACT = 'FIND_CONTRACT';
export const loadContract = () => (dispatch) => { export const loadContract = () => (dispatch) => {
dispatch(setLoading(true)); dispatch(setLoading(true));
api.ethcore api.parity
.registryAddress() .registryAddress()
.then((registryAddress) => { .then((registryAddress) => {
console.log(`registry found at ${registryAddress}`); console.log(`registry found at ${registryAddress}`);

View File

@@ -6,8 +6,31 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<link rel="icon" href="/parity-logo-black-no-text.png" type="image/png"> <link rel="icon" href="/parity-logo-black-no-text.png" type="image/png">
<title>dev::Parity.js</title> <title>dev::Parity.js</title>
<script src="/parity-utils/parity.js"></script>
<style>
.box {
font-size: 1.5em;
text-align: center;
border-radius: 0.5em;
background: #eee;
padding: 1em;
margin: 1em;
}
</style>
</head> </head>
<body> <body>
<script src="/parity-utils/parity.js"></script> <div class="box">
best block #<span id="blockNumber">unknown</span>
</div>
<script>
window.parity.api.subscribe('eth_blockNumber', function (error, blockNumber) {
if (error) {
console.log('error', error);
return;
}
document.getElementById('blockNumber').innerHTML = blockNumber.toFormat(0);
});
</script>
</body> </body>
</html> </html>

View File

@@ -6,8 +6,33 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<link rel="icon" href="/parity-logo-black-no-text.png" type="image/png"> <link rel="icon" href="/parity-logo-black-no-text.png" type="image/png">
<title>dev::Web3</title> <title>dev::Web3</title>
<script src="/parity-utils/web3.js"></script>
<style>
.box {
font-size: 1.5em;
text-align: center;
border-radius: 0.5em;
background: #eee;
padding: 1em;
margin: 1em;
}
</style>
</head> </head>
<body> <body>
<script src="/parity-utils/web3.js"></script> <div class="box">
best block #<span id="blockNumber">unknown</span>
</div>
<script>
window.setInterval(function () {
window.web3.eth.getBlockNumber(function (error, blockNumber) {
if (error) {
console.error('error', error);
return;
}
document.getElementById('blockNumber').innerHTML = blockNumber;
});
}, 1000);
</script>
</body> </body>
</html> </html>

View File

@@ -31,7 +31,7 @@ import ContractInstances from './contracts';
import { initStore } from './redux'; import { initStore } from './redux';
import { ContextProvider, muiTheme } from './ui'; import { ContextProvider, muiTheme } from './ui';
import { Accounts, Account, Addresses, Address, Application, Contract, Contracts, Dapp, Dapps, Settings, SettingsBackground, SettingsProxy, SettingsViews, Signer, Status } from './views'; import { Accounts, Account, Addresses, Address, Application, Contract, Contracts, Dapp, Dapps, Settings, SettingsBackground, SettingsParity, SettingsProxy, SettingsViews, Signer, Status } from './views';
import { setApi } from './redux/providers/apiActions'; import { setApi } from './redux/providers/apiActions';
@@ -72,13 +72,14 @@ ReactDOM.render(
<Route path='addresses' component={ Addresses } /> <Route path='addresses' component={ Addresses } />
<Route path='address/:address' component={ Address } /> <Route path='address/:address' component={ Address } />
<Route path='apps' component={ Dapps } /> <Route path='apps' component={ Dapps } />
<Route path='app/:type/:name' component={ Dapp } /> <Route path='app/:id' component={ Dapp } />
<Route path='contracts' component={ Contracts } /> <Route path='contracts' component={ Contracts } />
<Route path='contract/:address' component={ Contract } /> <Route path='contract/:address' component={ Contract } />
<Route path='settings' component={ Settings }> <Route path='settings' component={ Settings }>
<Route path='background' component={ SettingsBackground } /> <Route path='background' component={ SettingsBackground } />
<Route path='proxy' component={ SettingsProxy } /> <Route path='proxy' component={ SettingsProxy } />
<Route path='views' component={ SettingsViews } /> <Route path='views' component={ SettingsViews } />
<Route path='parity' component={ SettingsParity } />
</Route> </Route>
<Route path='signer' component={ Signer } /> <Route path='signer' component={ Signer } />
<Route path='status' component={ Status } /> <Route path='status' component={ Status } />

View File

@@ -16,20 +16,22 @@
import db from './interfaces/db'; import db from './interfaces/db';
import eth from './interfaces/eth'; import eth from './interfaces/eth';
import ethcore from './interfaces/ethcore';
import net from './interfaces/net'; import net from './interfaces/net';
import parity from './interfaces/parity';
import personal from './interfaces/personal'; import personal from './interfaces/personal';
import shh from './interfaces/shh'; import shh from './interfaces/shh';
import signer from './interfaces/signer';
import trace from './interfaces/trace'; import trace from './interfaces/trace';
import web3 from './interfaces/web3'; import web3 from './interfaces/web3';
export default { export default {
db: db, db,
eth: eth, eth,
ethcore: ethcore, parity,
net: net, net,
personal: personal, personal,
shh: shh, shh,
trace: trace, signer,
web3: web3 trace,
web3
}; };

View File

@@ -86,20 +86,6 @@ export default {
} }
}, },
checkRequest: {
desc: 'Returns the transactionhash of the requestId (received from eth_postTransaction) if the request was confirmed',
params: [
{
type: Quantity,
desc: 'The requestId to check for'
}
],
returns: {
type: Hash,
desc: '32 Bytes - the transaction hash, or the zero hash if the transaction is not yet available'
}
},
coinbase: { coinbase: {
desc: 'Returns the client coinbase address.', desc: 'Returns the client coinbase address.',
params: [], params: [],
@@ -823,22 +809,6 @@ export default {
} }
}, },
postTransaction: {
desc: 'Posts a transaction to the Signer.',
params: [
{
type: Object,
desc: 'see [eth_sendTransaction](#eth_sendTransaction)',
format: 'inputCallFormatter'
}
],
returns: {
type: Quantity,
desc: 'The id of the actual transaction',
format: 'utils.toDecimal'
}
},
protocolVersion: { protocolVersion: {
desc: 'Returns the current ethereum protocol version.', desc: 'Returns the current ethereum protocol version.',
params: [], params: [],

View File

@@ -26,6 +26,52 @@ export default {
} }
}, },
accounts: {
desc: 'returns a map of accounts as an object',
params: [],
returns: {
type: Array,
desc: 'Account metadata',
details: {
name: {
type: String,
desc: 'Account name'
},
meta: {
type: String,
desc: 'Encoded JSON string the defines additional account metadata'
},
uuid: {
type: String,
desc: 'The account UUID, or null if not available/unknown/not applicable.'
}
}
}
},
accountsInfo: {
desc: 'returns a map of accounts as an object',
params: [],
returns: {
type: Array,
desc: 'Account metadata',
details: {
name: {
type: String,
desc: 'Account name'
},
meta: {
type: String,
desc: 'Encoded JSON string the defines additional account metadata'
},
uuid: {
type: String,
desc: 'The account UUID, or null if not available/unknown/not applicable.'
}
}
}
},
addReservedPeer: { addReservedPeer: {
desc: '?', desc: '?',
params: [ params: [
@@ -40,6 +86,20 @@ export default {
} }
}, },
checkRequest: {
desc: 'Returns the transactionhash of the requestId (received from parity_postTransaction) if the request was confirmed',
params: [
{
type: Quantity,
desc: 'The requestId to check for'
}
],
returns: {
type: Hash,
desc: '32 Bytes - the transaction hash, or the zero hash if the transaction is not yet available'
}
},
dappsPort: { dappsPort: {
desc: 'Returns the port the dapps are running on, error if not enabled', desc: 'Returns the port the dapps are running on, error if not enabled',
params: [], params: [],
@@ -155,6 +215,29 @@ export default {
} }
}, },
listGethAccounts: {
desc: 'Returns a list of the accounts available from Geth',
params: [],
returns: {
type: Array,
desc: '20 Bytes addresses owned by the client.'
}
},
importGethAccounts: {
desc: 'Imports a list of accounts from geth',
params: [
{
type: Array,
desc: 'List of the geth addresses to import'
}
],
returns: {
type: Array,
desc: 'Array of the imported addresses'
}
},
minGasPrice: { minGasPrice: {
desc: 'Returns currently set minimal gas price', desc: 'Returns currently set minimal gas price',
params: [], params: [],
@@ -166,7 +249,7 @@ export default {
}, },
mode: { mode: {
desc: 'Get the mode. Results one of: "active", "passive", "dark", "off".', desc: 'Get the mode. Results one of: "active", "passive", "dark", "offline".',
params: [], params: [],
returns: { returns: {
type: String, type: String,
@@ -210,6 +293,60 @@ export default {
} }
}, },
newAccountFromPhrase: {
desc: 'Creates a new account from a recovery passphrase',
params: [
{
type: String,
desc: 'Phrase'
},
{
type: String,
desc: 'Password'
}
],
returns: {
type: Address,
desc: 'The created address'
}
},
newAccountFromSecret: {
desc: 'Creates a new account from a private ethstore secret key',
params: [
{
type: Data,
desc: 'Secret, 32-byte hex'
},
{
type: String,
desc: 'Password'
}
],
returns: {
type: Address,
desc: 'The created address'
}
},
newAccountFromWallet: {
desc: 'Creates a new account from a JSON import',
params: [
{
type: String,
desc: 'JSON'
},
{
type: String,
desc: 'Password'
}
],
returns: {
type: Address,
desc: 'The created address'
}
},
nodeName: { nodeName: {
desc: 'Returns node name (identity)', desc: 'Returns node name (identity)',
params: [], params: [],
@@ -233,6 +370,22 @@ export default {
} }
}, },
postTransaction: {
desc: 'Posts a transaction to the Signer.',
params: [
{
type: Object,
desc: 'see [eth_sendTransaction](#eth_sendTransaction)',
format: 'inputCallFormatter'
}
],
returns: {
type: Quantity,
desc: 'The id of the actual transaction',
format: 'utils.toDecimal'
}
},
removeReservedPeer: { removeReservedPeer: {
desc: '?', desc: '?',
params: [ params: [
@@ -265,6 +418,42 @@ export default {
} }
}, },
setAccountName: {
desc: 'Sets a name for the account',
params: [
{
type: Address,
desc: 'Address'
},
{
type: String,
desc: 'Name'
}
],
returns: {
type: Object,
desc: 'Returns null in all cases'
}
},
setAccountMeta: {
desc: 'Sets metadata for the account',
params: [
{
type: Address,
desc: 'Address'
},
{
type: String,
desc: 'Metadata (JSON encoded)'
}
],
returns: {
type: Object,
desc: 'Returns null in all cases'
}
},
setAuthor: { setAuthor: {
desc: 'Changes author (coinbase) for mined blocks.', desc: 'Changes author (coinbase) for mined blocks.',
params: [ params: [
@@ -330,7 +519,7 @@ export default {
params: [ params: [
{ {
type: String, type: String,
desc: 'The mode to set, one of "active", "passive", "dark", "off"' desc: 'The mode to set, one of "active", "passive", "dark", "offline"'
} }
], ],
returns: { returns: {

View File

@@ -17,83 +17,6 @@
import { Address, Data, Quantity } from '../types'; import { Address, Data, Quantity } from '../types';
export default { export default {
accountsInfo: {
desc: 'returns a map of accounts as an object',
params: [],
returns: {
type: Array,
desc: 'Account metadata',
details: {
name: {
type: String,
desc: 'Account name'
},
meta: {
type: String,
desc: 'Encoded JSON string the defines additional account metadata'
},
uuid: {
type: String,
desc: 'The account UUID, or null if not available/unknown/not applicable.'
}
}
}
},
generateAuthorizationToken: {
desc: 'Generates a new authorization token',
params: [],
returns: {
type: String,
desc: 'The new authorization token'
}
},
requestsToConfirm: {
desc: 'Returns a list of the transactions requiring authorization',
params: [],
returns: {
type: Array,
desc: 'A list of the outstanding transactions'
}
},
confirmRequest: {
desc: 'Confirm a request in the signer queue',
params: [
{
type: Quantity,
desc: 'The request id'
},
{
type: Object,
desc: 'The request options'
},
{
type: String,
desc: 'The account password'
}
],
returns: {
type: Boolean,
desc: 'The status of the confirmation'
}
},
rejectRequest: {
desc: 'Rejects a request in the signer queue',
params: [
{
type: Quantity,
desc: 'The request id'
}
],
returns: {
type: Boolean,
desc: 'The status of the rejection'
}
},
listAccounts: { listAccounts: {
desc: 'Returns a list of addresses owned by client.', desc: 'Returns a list of addresses owned by client.',
params: [], params: [],
@@ -103,29 +26,6 @@ export default {
} }
}, },
listGethAccounts: {
desc: 'Returns a list of the accounts available from Geth',
params: [],
returns: {
type: Array,
desc: '20 Bytes addresses owned by the client.'
}
},
importGethAccounts: {
desc: 'Imports a list of accounts from geth',
params: [
{
type: Array,
desc: 'List of the geth addresses to import'
}
],
returns: {
type: Array,
desc: 'Array of the imported addresses'
}
},
newAccount: { newAccount: {
desc: 'Creates new account', desc: 'Creates new account',
params: [ params: [
@@ -140,96 +40,6 @@ export default {
} }
}, },
newAccountFromPhrase: {
desc: 'Creates a new account from a recovery passphrase',
params: [
{
type: String,
desc: 'Phrase'
},
{
type: String,
desc: 'Password'
}
],
returns: {
type: Address,
desc: 'The created address'
}
},
newAccountFromSecret: {
desc: 'Creates a new account from a private ethstore secret key',
params: [
{
type: Data,
desc: 'Secret, 32-byte hex'
},
{
type: String,
desc: 'Password'
}
],
returns: {
type: Address,
desc: 'The created address'
}
},
newAccountFromWallet: {
desc: 'Creates a new account from a JSON import',
params: [
{
type: String,
desc: 'JSON'
},
{
type: String,
desc: 'Password'
}
],
returns: {
type: Address,
desc: 'The created address'
}
},
setAccountName: {
desc: 'Sets a name for the account',
params: [
{
type: Address,
desc: 'Address'
},
{
type: String,
desc: 'Name'
}
],
returns: {
type: Object,
desc: 'Returns null in all cases'
}
},
setAccountMeta: {
desc: 'Sets metadata for the account',
params: [
{
type: Address,
desc: 'Address'
},
{
type: String,
desc: 'Metadata (JSON encoded)'
}
],
returns: {
type: Object,
desc: 'Returns null in all cases'
}
},
signAndSendTransaction: { signAndSendTransaction: {
desc: 'Sends and signs a transaction given account passphrase. Does not require the account to be unlocked nor unlocks the account for future transactions. ', desc: 'Sends and signs a transaction given account passphrase. Does not require the account to be unlocked nor unlocks the account for future transactions. ',
params: [ params: [
@@ -284,15 +94,6 @@ export default {
} }
}, },
signerEnabled: {
desc: 'Returns whether signer is enabled/disabled.',
params: [],
returns: {
type: Boolean,
desc: 'true when enabled, false when disabled'
}
},
unlockAccount: { unlockAccount: {
desc: '?', desc: '?',
params: [ params: [

View File

@@ -0,0 +1,82 @@
// Copyright 2015, 2016 Ethcore (UK) Ltd.
// This file is part of Parity.
// Parity is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// Parity is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
import { Quantity } from '../types';
export default {
generateAuthorizationToken: {
desc: 'Generates a new authorization token',
params: [],
returns: {
type: String,
desc: 'The new authorization token'
}
},
requestsToConfirm: {
desc: 'Returns a list of the transactions requiring authorization',
params: [],
returns: {
type: Array,
desc: 'A list of the outstanding transactions'
}
},
confirmRequest: {
desc: 'Confirm a request in the signer queue',
params: [
{
type: Quantity,
desc: 'The request id'
},
{
type: Object,
desc: 'The request options'
},
{
type: String,
desc: 'The account password'
}
],
returns: {
type: Boolean,
desc: 'The status of the confirmation'
}
},
rejectRequest: {
desc: 'Rejects a request in the signer queue',
params: [
{
type: Quantity,
desc: 'The request id'
}
],
returns: {
type: Boolean,
desc: 'The status of the rejection'
}
},
signerEnabled: {
desc: 'Returns whether signer is enabled/disabled.',
params: [],
returns: {
type: Boolean,
desc: 'true when enabled, false when disabled'
}
}
};

View File

@@ -133,8 +133,8 @@ export default class AddAddress extends Component {
const { address, name, description } = this.state; const { address, name, description } = this.state;
Promise.all([ Promise.all([
api.personal.setAccountName(address, name), api.parity.setAccountName(address, name),
api.personal.setAccountMeta(address, { api.parity.setAccountMeta(address, {
description, description,
timestamp: Date.now(), timestamp: Date.now(),
deleted: false deleted: false

View File

@@ -141,8 +141,8 @@ export default class AddContract extends Component {
const { abiParsed, address, name, description } = this.state; const { abiParsed, address, name, description } = this.state;
Promise.all([ Promise.all([
api.personal.setAccountName(address, name), api.parity.setAccountName(address, name),
api.personal.setAccountMeta(address, { api.parity.setAccountMeta(address, {
contract: true, contract: true,
deleted: false, deleted: false,
timestamp: Date.now(), timestamp: Date.now(),

View File

@@ -173,15 +173,15 @@ export default class CreateAccount extends Component {
Promise Promise
.all([ .all([
api.ethcore.generateSecretPhrase(), api.parity.generateSecretPhrase(),
api.ethcore.generateSecretPhrase(), api.parity.generateSecretPhrase(),
api.ethcore.generateSecretPhrase(), api.parity.generateSecretPhrase(),
api.ethcore.generateSecretPhrase(), api.parity.generateSecretPhrase(),
api.ethcore.generateSecretPhrase() api.parity.generateSecretPhrase()
]) ])
.then((phrases) => { .then((phrases) => {
return Promise return Promise
.all(phrases.map((phrase) => api.ethcore.phraseToAddress(phrase))) .all(phrases.map((phrase) => api.parity.phraseToAddress(phrase)))
.then((addresses) => { .then((addresses) => {
const accounts = {}; const accounts = {};

View File

@@ -102,7 +102,7 @@ export default class NewGeth extends Component {
const { api } = this.context; const { api } = this.context;
const { accounts } = this.props; const { accounts } = this.props;
api.personal api.parity
.listGethAccounts() .listGethAccounts()
.then((_addresses) => { .then((_addresses) => {
const addresses = (addresses || []).filter((address) => !accounts[address]); const addresses = (addresses || []).filter((address) => !accounts[address]);

View File

@@ -208,13 +208,13 @@ export default class CreateAccount extends Component {
}); });
if (createType === 'fromNew' || createType === 'fromPhrase') { if (createType === 'fromNew' || createType === 'fromPhrase') {
return api.personal return api.parity
.newAccountFromPhrase(this.state.phrase, this.state.password) .newAccountFromPhrase(this.state.phrase, this.state.password)
.then((address) => { .then((address) => {
this.setState({ address }); this.setState({ address });
return api.personal return api.parity
.setAccountName(address, this.state.name) .setAccountName(address, this.state.name)
.then(() => api.personal.setAccountMeta(address, { .then(() => api.parity.setAccountMeta(address, {
timestamp: Date.now(), timestamp: Date.now(),
passwordHint: this.state.passwordHint passwordHint: this.state.passwordHint
})); }));
@@ -233,13 +233,13 @@ export default class CreateAccount extends Component {
this.newError(error); this.newError(error);
}); });
} else if (createType === 'fromRaw') { } else if (createType === 'fromRaw') {
return api.personal return api.parity
.newAccountFromSecret(this.state.rawKey, this.state.password) .newAccountFromSecret(this.state.rawKey, this.state.password)
.then((address) => { .then((address) => {
this.setState({ address }); this.setState({ address });
return api.personal return api.parity
.setAccountName(address, this.state.name) .setAccountName(address, this.state.name)
.then(() => api.personal.setAccountMeta(address, { .then(() => api.parity.setAccountMeta(address, {
timestamp: Date.now(), timestamp: Date.now(),
passwordHint: this.state.passwordHint passwordHint: this.state.passwordHint
})); }));
@@ -258,13 +258,13 @@ export default class CreateAccount extends Component {
this.newError(error); this.newError(error);
}); });
} else if (createType === 'fromGeth') { } else if (createType === 'fromGeth') {
return api.personal return api.parity
.importGethAccounts(this.state.gethAddresses) .importGethAccounts(this.state.gethAddresses)
.then((result) => { .then((result) => {
console.log('result', result); console.log('result', result);
return Promise.all(this.state.gethAddresses.map((address) => { return Promise.all(this.state.gethAddresses.map((address) => {
return api.personal.setAccountName(address, 'Geth Import'); return api.parity.setAccountName(address, 'Geth Import');
})); }));
}) })
.then(() => { .then(() => {
@@ -282,16 +282,16 @@ export default class CreateAccount extends Component {
}); });
} }
return api.personal return api.parity
.newAccountFromWallet(this.state.json, this.state.password) .newAccountFromWallet(this.state.json, this.state.password)
.then((address) => { .then((address) => {
this.setState({ this.setState({
address: address address: address
}); });
return api.personal return api.parity
.setAccountName(address, this.state.name) .setAccountName(address, this.state.name)
.then(() => api.personal.setAccountMeta(address, { .then(() => api.parity.setAccountMeta(address, {
timestamp: Date.now(), timestamp: Date.now(),
passwordHint: this.state.passwordHint passwordHint: this.state.passwordHint
})); }));

View File

@@ -212,8 +212,8 @@ export default class DeployContract extends Component {
.deploy(options, params, this.onDeploymentState) .deploy(options, params, this.onDeploymentState)
.then((address) => { .then((address) => {
return Promise.all([ return Promise.all([
api.personal.setAccountName(address, name), api.parity.setAccountName(address, name),
api.personal.setAccountMeta(address, { api.parity.setAccountMeta(address, {
abi: abiParsed, abi: abiParsed,
contract: true, contract: true,
timestamp: Date.now(), timestamp: Date.now(),

View File

@@ -99,11 +99,10 @@ export default class EditMeta extends Component {
renderTags () { renderTags () {
const { meta } = this.state; const { meta } = this.state;
const { tags } = meta || [];
return ( return (
<InputChip <InputChip
tokens={ tags } tokens={ meta.tags || [] }
onTokensChange={ this.onTagsChange } onTokensChange={ this.onTagsChange }
label='(optional) tags' label='(optional) tags'
hint='press <Enter> to add a tag' hint='press <Enter> to add a tag'
@@ -139,8 +138,8 @@ export default class EditMeta extends Component {
Promise Promise
.all([ .all([
api.personal.setAccountName(account.address, name), api.parity.setAccountName(account.address, name),
api.personal.setAccountMeta(account.address, Object.assign({}, account.meta, meta)) api.parity.setAccountMeta(account.address, Object.assign({}, account.meta, meta))
]) ])
.then(() => this.props.onClose()) .then(() => this.props.onClose())
.catch((error) => { .catch((error) => {

View File

@@ -221,7 +221,7 @@ export default class ExecuteContract extends Component {
}) })
.then((requestId) => { .then((requestId) => {
this.setState({ busyState: 'Waiting for authorization in the Parity Signer' }); this.setState({ busyState: 'Waiting for authorization in the Parity Signer' });
return api.pollMethod('eth_checkRequest', requestId); return api.pollMethod('parity_checkRequest', requestId);
}) })
.then((txhash) => { .then((txhash) => {
this.setState({ sending: false, step: 2, txhash, busyState: 'Your transaction has been posted to the network' }); this.setState({ sending: false, step: 2, txhash, busyState: 'Your transaction has been posted to the network' });

View File

@@ -183,9 +183,9 @@ export default class FirstRun extends Component {
canCreate: false canCreate: false
}); });
return api.personal return api.parity
.newAccountFromPhrase(phrase, password) .newAccountFromPhrase(phrase, password)
.then((address) => api.personal.setAccountName(address, name)) .then((address) => api.parity.setAccountName(address, name))
.then(() => { .then(() => {
this.onNext(); this.onNext();
}) })

View File

@@ -317,7 +317,7 @@ export default class PasswordManager extends Component {
this.setState({ waiting: true, showMessage: false }); this.setState({ waiting: true, showMessage: false });
this.context this.context
.api.personal .api.parity
.testPassword(account.address, currentPass) .testPassword(account.address, currentPass)
.then(correct => { .then(correct => {
const message = correct const message = correct
@@ -343,7 +343,7 @@ export default class PasswordManager extends Component {
this.setState({ waiting: true, showMessage: false }); this.setState({ waiting: true, showMessage: false });
this.context this.context
.api.personal .api.parity
.testPassword(account.address, currentPass) .testPassword(account.address, currentPass)
.then(correct => { .then(correct => {
if (!correct) { if (!correct) {
@@ -363,11 +363,11 @@ export default class PasswordManager extends Component {
return Promise.all([ return Promise.all([
this.context this.context
.api.personal .api.parity
.setAccountMeta(account.address, meta), .setAccountMeta(account.address, meta),
this.context this.context
.api.personal .api.parity
.changePassword(account.address, currentPass, newPass) .changePassword(account.address, currentPass, newPass)
]) ])
.then(() => { .then(() => {

View File

@@ -123,7 +123,13 @@ export default class Details extends Component {
.map((balance, index) => { .map((balance, index) => {
const token = balance.token; const token = balance.token;
const isEth = index === 0; const isEth = index === 0;
const imagesrc = token.image || images[token.address] || imageUnknown; let imagesrc = token.image;
if (!imagesrc) {
imagesrc =
images[token.address]
? `${api.dappsUrl}${images[token.address]}`
: imageUnknown;
}
let value = 0; let value = 0;
if (isEth) { if (isEth) {

View File

@@ -539,7 +539,7 @@ export default class GasPriceSelector extends Component {
const gasPriceBIdx = gasPriceAIdx + 1; const gasPriceBIdx = gasPriceAIdx + 1;
if (gasPriceBIdx === N + 1) { if (gasPriceBIdx === N + 1) {
const gasPrice = gasPrices[gasPriceAIdx]; const gasPrice = gasPrices[gasPriceAIdx].round();
this.props.onChange(event, gasPrice); this.props.onChange(event, gasPrice);
return; return;
} }
@@ -548,7 +548,9 @@ export default class GasPriceSelector extends Component {
const gasPriceB = gasPrices[gasPriceBIdx]; const gasPriceB = gasPrices[gasPriceBIdx];
const mult = Math.round((sliderValue % 1) * 100) / 100; const mult = Math.round((sliderValue % 1) * 100) / 100;
const gasPrice = gasPriceA.plus(gasPriceB.minus(gasPriceA).times(mult)); const gasPrice = gasPriceA
.plus(gasPriceB.minus(gasPriceA).times(mult))
.round();
this.setSliderValue(sliderValue, gasPrice); this.setSliderValue(sliderValue, gasPrice);
this.props.onChange(event, gasPrice); this.props.onChange(event, gasPrice);

View File

@@ -411,6 +411,7 @@ export default class Transfer extends Component {
const { api } = this.context; const { api } = this.context;
const { account } = this.props; const { account } = this.props;
const { data, gas, gasPrice, recipient, value } = this.state; const { data, gas, gasPrice, recipient, value } = this.state;
const options = { const options = {
from: account.address, from: account.address,
to: recipient, to: recipient,
@@ -423,7 +424,7 @@ export default class Transfer extends Component {
options.data = data; options.data = data;
} }
return api.eth.postTransaction(options); return api.parity.postTransaction(options);
} }
_sendToken () { _sendToken () {
@@ -454,7 +455,7 @@ export default class Transfer extends Component {
: this._sendToken() : this._sendToken()
).then((requestId) => { ).then((requestId) => {
this.setState({ busyState: 'Waiting for authorization in the Parity Signer' }); this.setState({ busyState: 'Waiting for authorization in the Parity Signer' });
return api.pollMethod('eth_checkRequest', requestId); return api.pollMethod('parity_checkRequest', requestId);
}) })
.then((txhash) => { .then((txhash) => {
this.onNext(); this.onNext();
@@ -591,7 +592,7 @@ export default class Transfer extends Component {
Promise Promise
.all([ .all([
api.ethcore.gasPriceHistogram(), api.parity.gasPriceHistogram(),
api.eth.gasPrice() api.eth.gasPrice()
]) ])
.then(([gasPriceHistogram, gasPrice]) => { .then(([gasPriceHistogram, gasPrice]) => {

View File

@@ -42,7 +42,7 @@ export default class Balances {
_subscribeAccountsInfo () { _subscribeAccountsInfo () {
this._api this._api
.subscribe('personal_accountsInfo', (error, accountsInfo) => { .subscribe('parity_accountsInfo', (error, accountsInfo) => {
if (error) { if (error) {
return; return;
} }
@@ -76,7 +76,7 @@ export default class Balances {
} }
_retrieveTokens () { _retrieveTokens () {
this._api.ethcore this._api.parity
.registryAddress() .registryAddress()
.then((registryAddress) => { .then((registryAddress) => {
const registry = this._api.newContract(abis.registry, registryAddress); const registry = this._api.newContract(abis.registry, registryAddress);

View File

@@ -17,8 +17,6 @@
import { handleActions } from 'redux-actions'; import { handleActions } from 'redux-actions';
import { bytesToHex } from '../../api/util/format'; import { bytesToHex } from '../../api/util/format';
import { parityNode } from '../../environment';
const ZERO = '0x0000000000000000000000000000000000000000000000000000000000000000'; const ZERO = '0x0000000000000000000000000000000000000000000000000000000000000000';
const initialState = { const initialState = {
@@ -28,7 +26,7 @@ const initialState = {
export function hashToImageUrl (hashArray) { export function hashToImageUrl (hashArray) {
const hash = hashArray ? bytesToHex(hashArray) : ZERO; const hash = hashArray ? bytesToHex(hashArray) : ZERO;
return hash === ZERO ? null : `${parityNode}/api/content/${hash.substr(2)}`; return hash === ZERO ? null : `/api/content/${hash.substr(2)}`;
} }
export default handleActions({ export default handleActions({

View File

@@ -28,9 +28,9 @@ export default class Personal {
_subscribeAccountsInfo () { _subscribeAccountsInfo () {
this._api this._api
.subscribe('personal_accountsInfo', (error, accountsInfo) => { .subscribe('parity_accountsInfo', (error, accountsInfo) => {
if (error) { if (error) {
console.error('personal_accountsInfo', error); console.error('parity_accountsInfo', error);
return; return;
} }

View File

@@ -14,22 +14,6 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>. // along with Parity. If not, see <http://www.gnu.org/licenses/>.
// Copyright 2015, 2016 Ethcore (UK) Ltd.
// This file is part of Parity.
// Parity is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// Parity is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
import { signerRequestsToConfirm } from './signerActions'; import { signerRequestsToConfirm } from './signerActions';
export default class Signer { export default class Signer {
@@ -44,7 +28,7 @@ export default class Signer {
_subscribeRequestsToConfirm () { _subscribeRequestsToConfirm () {
this._api this._api
.subscribe('personal_requestsToConfirm', (error, pending) => { .subscribe('signer_requestsToConfirm', (error, pending) => {
if (error) { if (error) {
return; return;
} }

View File

@@ -51,7 +51,7 @@ export default class SignerMiddleware {
onConfirmStart = (store, action) => { onConfirmStart = (store, action) => {
const { id, password } = action.payload; const { id, password } = action.payload;
this._api.personal this._api.signer
.confirmRequest(id, {}, password) .confirmRequest(id, {}, password)
.then((txHash) => { .then((txHash) => {
console.log('confirmRequest', id, txHash); console.log('confirmRequest', id, txHash);
@@ -71,7 +71,7 @@ export default class SignerMiddleware {
onRejectStart = (store, action) => { onRejectStart = (store, action) => {
const id = action.payload; const id = action.payload;
this._api.personal this._api.signer
.rejectRequest(id) .rejectRequest(id)
.then(() => { .then(() => {
store.dispatch(actions.successRejectRequest({ id })); store.dispatch(actions.successRejectRequest({ id }));

View File

@@ -16,8 +16,6 @@
import { statusBlockNumber, statusCollection, statusLogs } from './statusActions'; import { statusBlockNumber, statusCollection, statusLogs } from './statusActions';
import { parityNode } from '../../environment';
export default class Status { export default class Status {
constructor (store, api) { constructor (store, api) {
this._api = api; this._api = api;
@@ -33,8 +31,8 @@ export default class Status {
} }
_fetchEnode () { _fetchEnode () {
this._api this._api.parity
.ethcore.enode() .enode()
.then((enode) => { .then((enode) => {
this._store.dispatch(statusCollection({ enode })); this._store.dispatch(statusCollection({ enode }));
}) })
@@ -65,7 +63,7 @@ export default class Status {
setTimeout(this._pollPing, timeout); setTimeout(this._pollPing, timeout);
}; };
fetch(`${parityNode}/api/ping`, { method: 'GET' }) fetch('/', { method: 'HEAD' })
.then((response) => dispatch(!!response.ok)) .then((response) => dispatch(!!response.ok))
.catch(() => dispatch(false)); .catch(() => dispatch(false));
} }
@@ -103,16 +101,16 @@ export default class Status {
.all([ .all([
this._api.web3.clientVersion(), this._api.web3.clientVersion(),
this._api.eth.coinbase(), this._api.eth.coinbase(),
this._api.ethcore.defaultExtraData(), this._api.parity.defaultExtraData(),
this._api.ethcore.extraData(), this._api.parity.extraData(),
this._api.ethcore.gasFloorTarget(), this._api.parity.gasFloorTarget(),
this._api.eth.hashrate(), this._api.eth.hashrate(),
this._api.ethcore.minGasPrice(), this._api.parity.minGasPrice(),
this._api.ethcore.netChain(), this._api.parity.netChain(),
this._api.ethcore.netPeers(), this._api.parity.netPeers(),
this._api.ethcore.netPort(), this._api.parity.netPort(),
this._api.ethcore.nodeName(), this._api.parity.nodeName(),
this._api.ethcore.rpcSettings(), this._api.parity.rpcSettings(),
this._api.eth.syncing(), this._api.eth.syncing(),
this._pollTraceMode() this._pollTraceMode()
]) ])
@@ -155,8 +153,8 @@ export default class Status {
Promise Promise
.all([ .all([
this._api.ethcore.devLogs(), this._api.parity.devLogs(),
this._api.ethcore.devLogsLevels() this._api.parity.devLogsLevels()
]) ])
.then(([devLogs, devLogsLevels]) => { .then(([devLogs, devLogsLevels]) => {
this._store.dispatch(statusLogs({ this._store.dispatch(statusLogs({

View File

@@ -25,6 +25,8 @@ export default class SecureApi extends Api {
this._isConnecting = true; this._isConnecting = true;
this._connectState = 0; this._connectState = 0;
this._needsToken = false; this._needsToken = false;
this._dappsPort = 8080;
this._signerPort = 8180;
this._followConnection(); this._followConnection();
} }
@@ -50,7 +52,7 @@ export default class SecureApi extends Api {
case 0: case 0:
if (isConnected) { if (isConnected) {
this._isConnecting = false; this._isConnecting = false;
return this.setToken(); return this.connectSuccess();
} else if (lastError) { } else if (lastError) {
this.updateToken('initial', 1); this.updateToken('initial', 1);
} }
@@ -60,7 +62,7 @@ export default class SecureApi extends Api {
case 1: case 1:
if (isConnected) { if (isConnected) {
this._connectState = 2; this._connectState = 2;
this.personal this.parity
.generateAuthorizationToken() .generateAuthorizationToken()
.then((token) => { .then((token) => {
this.updateToken(token, 2); this.updateToken(token, 2);
@@ -79,7 +81,7 @@ export default class SecureApi extends Api {
case 2: case 2:
if (isConnected) { if (isConnected) {
this._isConnecting = false; this._isConnecting = false;
return this.setToken(); return this.connectSuccess();
} else if (lastError) { } else if (lastError) {
return setManual(); return setManual();
} }
@@ -89,12 +91,38 @@ export default class SecureApi extends Api {
nextTick(); nextTick();
} }
connectSuccess () {
this.setToken();
Promise
.all([
this.parity.dappsPort(),
this.parity.signerPort()
])
.then(([dappsPort, signerPort]) => {
this._dappsPort = dappsPort.toNumber();
this._signerPort = signerPort.toNumber();
});
}
updateToken (token, connectedState = 0) { updateToken (token, connectedState = 0) {
this._connectState = connectedState; this._connectState = connectedState;
this._transport.updateToken(token.replace(/[^a-zA-Z0-9]/g, '')); this._transport.updateToken(token.replace(/[^a-zA-Z0-9]/g, ''));
this._followConnection(); this._followConnection();
} }
get dappsPort () {
return this._dappsPort;
}
get dappsUrl () {
return `http://127.0.0.1:${this._dappsPort}`;
}
get signerPort () {
return this._signerPort;
}
get isConnecting () { get isConnecting () {
return this._isConnecting; return this._isConnecting;
} }

View File

@@ -47,7 +47,13 @@ class Balance extends Component {
const value = token.format const value = token.format
? new BigNumber(balance.value).div(new BigNumber(token.format)).toFormat(3) ? new BigNumber(balance.value).div(new BigNumber(token.format)).toFormat(3)
: api.util.fromWei(balance.value).toFormat(3); : api.util.fromWei(balance.value).toFormat(3);
const imagesrc = token.image || images[token.address] || unknownImage; let imagesrc = token.image;
if (!imagesrc) {
imagesrc =
images[token.address]
? `${api.dappsUrl}${images[token.address]}`
: unknownImage;
}
return ( return (
<div <div

View File

@@ -14,4 +14,4 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>. // along with Parity. If not, see <http://www.gnu.org/licenses/>.
export default from './CopyToClipboard'; export default from './copyToClipboard';

View File

@@ -59,10 +59,9 @@ class IdentityIcon extends Component {
updateIcon (_address, images) { updateIcon (_address, images) {
const { api } = this.context; const { api } = this.context;
const { button, inline, tiny } = this.props; const { button, inline, tiny } = this.props;
const iconsrc = images[_address];
if (iconsrc) { if (images[_address]) {
this.setState({ iconsrc }); this.setState({ iconsrc: `${api.dappsUrl}${images[_address]}` });
return; return;
} }

View File

@@ -149,7 +149,7 @@ export default class Header extends Component {
const { account } = this.props; const { account } = this.props;
this.setState({ name }, () => { this.setState({ name }, () => {
api.personal api.parity
.setAccountName(account.address, name) .setAccountName(account.address, name)
.catch((error) => { .catch((error) => {
console.error(error); console.error(error);

View File

@@ -81,7 +81,7 @@ class Delete extends Component {
account.meta.deleted = true; account.meta.deleted = true;
api.personal api.parity
.setAccountMeta(account.address, account.meta) .setAccountMeta(account.address, account.meta)
.then(() => { .then(() => {
router.push(route); router.push(route);

View File

@@ -15,12 +15,10 @@
/* along with Parity. If not, see <http://www.gnu.org/licenses/>. /* along with Parity. If not, see <http://www.gnu.org/licenses/>.
*/ */
.status { .status {
padding: 1.5em; padding: 0.5em;
text-align: right; font-size: x-small;
color: #ddd; color: #ccc;
display: flex; background-color: rgba(0, 0, 0, 0.2)
flex-direction: column;
align-items: flex-end;
} }
.title { .title {
@@ -29,12 +27,13 @@
.enode { .enode {
word-wrap: break-word; word-wrap: break-word;
margin: 0.5em 0 0.25em 0; float: right;
} }
.enode > * { .enode > * {
display: inline-block; display: inline-block;
margin-left: .5em; margin: 0.25em 0.5em;
vertical-align: top;
} }
.block { .block {
@@ -43,9 +42,7 @@
.netinfo { .netinfo {
display: flex; display: flex;
align-items: center; align-items: center;
flex-direction: row; color: #ddd;
justify-content: flex-end;
margin-top: 0.25em;
} }
.netinfo > * { .netinfo > * {
@@ -73,6 +70,8 @@
} }
.version { .version {
padding: 0.25em 0.5em;
float: left;
} }
.syncing { .syncing {

View File

@@ -48,15 +48,13 @@ class Status extends Component {
</div> </div>
{ this.renderEnode() } { this.renderEnode() }
<div className={ styles.netinfo }> <div className={ styles.netinfo }>
<div> <BlockStatus />
<BlockStatus />
<div className={ styles.peers }>
{ netPeers.active.toFormat() }/{ netPeers.connected.toFormat() }/{ netPeers.max.toFormat() } peers
</div>
</div>
<div className={ netStyle }> <div className={ netStyle }>
{ isTest ? 'test' : netChain } { isTest ? 'test' : netChain }
</div> </div>
<div className={ styles.peers }>
{ netPeers.active.toFormat() }/{ netPeers.connected.toFormat() }/{ netPeers.max.toFormat() } peers
</div>
</div> </div>
</div> </div>
); );

View File

@@ -104,8 +104,8 @@ class Application extends Component {
checkAccounts () { checkAccounts () {
const { api } = this.context; const { api } = this.context;
api.personal api.eth
.listAccounts() .accounts()
.then((accounts) => { .then((accounts) => {
this.setState({ this.setState({
showFirstRun: showFirstRun || accounts.length === 0 showFirstRun: showFirstRun || accounts.length === 0

Some files were not shown because too many files have changed in this diff Show More