on master help sign in
Merged
commit4bd2eeecabcd817bc40bb98dbe2f303255eb5246 authorChris Johnson <chris@cjohnson.io> dateTue 28 May 2019, 10:14 (7 years ago) parentcb608296a8b3c1
28 files changed+1529−682
.env+1−1 README.md+2 package-lock.json+1030−446 package.json+2−2 src/bridge/Bridge.js+7−4 src/bridge/components/Base.js+5 src/bridge/components/HorizontalSelector.js+57 src/bridge/components/InnerLabelDropdown.js+2−2 src/bridge/components/StatelessTransaction.js+126−40 src/bridge/lib/ledger.js+4−2 src/bridge/lib/tank.js+1 src/bridge/lib/trezor.js+2−2 src/bridge/lib/txn.js+38−21 src/bridge/lib/wallet.js+1−1 src/bridge/views/AcceptTransfer.js+4−6 src/bridge/views/CancelTransfer.js+1−1 src/bridge/views/CreateGalaxy.js+1−1 src/bridge/views/InvitesManage.js+1−1 src/bridge/views/InvitesSend.js+1−4 src/bridge/views/IssueChild.js+35−71 src/bridge/views/Ledger.js+86−14 src/bridge/views/Network.js+2−2 src/bridge/views/Point/Actions.js+2−2 src/bridge/views/SentTransaction.js−13 src/bridge/views/SetKeys.js+1−1 src/bridge/views/SetProxy.js+59−30 src/bridge/views/Transfer.js+1−1 src/bridge/views/Trezor.js+57−14
.env+1−1
@@ -1,2 +1,2 @@
1−REACT_APP_INFURA_KEY='b7d2af9f01534031ba773374f766ef65'
1+REACT_APP_INFURA_ENDPOINT='b7d2af9f01534031ba773374f766ef65'
22
README.md+2
@@ -1,5 +1,7 @@
11# Bridge
22
3+[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)
4+
35An application for interacting with Azimuth.
46
57## Usage
package-lock.json+1030−446
@@ -1067,9 +1067,9 @@
10671067 }
10681068 },
10691069 "@types/node": {
1070− "version": "10.14.5",
1071− "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.5.tgz",
1072− "integrity": "sha512-Ja7d4s0qyGFxjGeDq5S7Si25OFibSAHUi6i17UWnwNnpitADN7hah9q0Tl25gxuV5R1u2Bx+np6w4LHXfHyj/g=="
1070+ "version": "10.14.4",
1071+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.4.tgz",
1072+ "integrity": "sha512-DT25xX/YgyPKiHFOpNuANIQIVvYEwCWXgK2jYYwqgaMrYE6+tq+DtmMwlD3drl6DJbUwtlIDnn0d7tIn/EbXBg=="
10731073 },
10741074 "@types/q": {
10751075 "version": "1.5.1",
@@ -1264,12 +1264,12 @@
12641264 "flat": "^4.1.0",
12651265 "lodash": "^4.17.10",
12661266 "qr-image": "^3.2.0",
1267− "sigil-js": "github:urbit/sigil-js#1864796bb3f482e597fd85acfd324795e42b2465",
1267+ "sigil-js": "github:urbit/sigil-js",
12681268 "urbit-ob": "^1.4.4"
12691269 },
12701270 "dependencies": {
12711271 "sigil-js": {
1272− "version": "github:urbit/sigil-js#1864796bb3f482e597fd85acfd324795e42b2465",
1272+ "version": "github:urbit/sigil-js#03c880ff17a5816d78f659f44cb7df44e0a0c097",
12731273 "from": "github:urbit/sigil-js",
12741274 "requires": {
12751275 "lodash": "^4.17.10",
@@ -1346,6 +1346,11 @@
13461346 "resolved": "https://registry.npmjs.org/address/-/address-1.0.3.tgz",
13471347 "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg=="
13481348 },
1349+ "aes-js": {
1350+ "version": "3.0.0",
1351+ "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz",
1352+ "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0="
1353+ },
13491354 "ajv": {
13501355 "version": "6.6.2",
13511356 "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz",
@@ -1439,11 +1444,6 @@
14391444 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
14401445 "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
14411446 },
1442− "any-promise": {
1443− "version": "1.3.0",
1444− "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
1445− "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8="
1446− },
14471447 "anymatch": {
14481448 "version": "2.0.0",
14491449 "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
@@ -2617,14 +2617,6 @@
26172617 "safe-buffer": "^5.1.1"
26182618 }
26192619 },
2620− "block-stream": {
2621− "version": "0.0.9",
2622− "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
2623− "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
2624− "requires": {
2625− "inherits": "~2.0.0"
2626− }
2627− },
26282620 "bluebird": {
26292621 "version": "3.5.3",
26302622 "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz",
@@ -3639,6 +3631,11 @@
36393631 "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
36403632 "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
36413633 },
3634+ "cookiejar": {
3635+ "version": "2.1.2",
3636+ "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz",
3637+ "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA=="
3638+ },
36423639 "copy-concurrently": {
36433640 "version": "1.0.5",
36443641 "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
@@ -5180,6 +5177,22 @@
51805177 "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
51815178 "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
51825179 },
5180+ "eth-ens-namehash": {
5181+ "version": "2.0.8",
5182+ "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz",
5183+ "integrity": "sha1-IprEbsqG1S4MmR58sq74P/D2i88=",
5184+ "requires": {
5185+ "idna-uts46-hx": "^2.3.1",
5186+ "js-sha3": "^0.5.7"
5187+ },
5188+ "dependencies": {
5189+ "js-sha3": {
5190+ "version": "0.5.7",
5191+ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz",
5192+ "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc="
5193+ }
5194+ }
5195+ },
51835196 "eth-lib": {
51845197 "version": "0.1.27",
51855198 "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.27.tgz",
@@ -5230,6 +5243,60 @@
52305243 "secp256k1": "^3.0.1"
52315244 }
52325245 },
5246+ "ethers": {
5247+ "version": "4.0.27",
5248+ "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.27.tgz",
5249+ "integrity": "sha512-+DXZLP/tyFnXWxqr2fXLT67KlGUfLuvDkHSOtSC9TUVG9OIj6yrG5JPeXRMYo15xkOYwnjgdMKrXp5V94rtjJA==",
5250+ "requires": {
5251+ "@types/node": "^10.3.2",
5252+ "aes-js": "3.0.0",
5253+ "bn.js": "^4.4.0",
5254+ "elliptic": "6.3.3",
5255+ "hash.js": "1.1.3",
5256+ "js-sha3": "0.5.7",
5257+ "scrypt-js": "2.0.4",
5258+ "setimmediate": "1.0.4",
5259+ "uuid": "2.0.1",
5260+ "xmlhttprequest": "1.8.0"
5261+ },
5262+ "dependencies": {
5263+ "elliptic": {
5264+ "version": "6.3.3",
5265+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.3.tgz",
5266+ "integrity": "sha1-VILZZG1UvLif19mU/J4ulWiHbj8=",
5267+ "requires": {
5268+ "bn.js": "^4.4.0",
5269+ "brorand": "^1.0.1",
5270+ "hash.js": "^1.0.0",
5271+ "inherits": "^2.0.1"
5272+ }
5273+ },
5274+ "hash.js": {
5275+ "version": "1.1.3",
5276+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz",
5277+ "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==",
5278+ "requires": {
5279+ "inherits": "^2.0.3",
5280+ "minimalistic-assert": "^1.0.0"
5281+ }
5282+ },
5283+ "js-sha3": {
5284+ "version": "0.5.7",
5285+ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz",
5286+ "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc="
5287+ },
5288+ "setimmediate": {
5289+ "version": "1.0.4",
5290+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz",
5291+ "integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48="
5292+ },
5293+ "uuid": {
5294+ "version": "2.0.1",
5295+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz",
5296+ "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w="
5297+ }
5298+ }
5299+ },
52335300 "ethjs-unit": {
52345301 "version": "0.1.6",
52355302 "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz",
@@ -5256,9 +5323,9 @@
52565323 }
52575324 },
52585325 "eventemitter3": {
5259− "version": "1.1.1",
5260− "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.1.1.tgz",
5261− "integrity": "sha1-R3hr2qCHyvext15zq8XH1UAVjNA="
5326+ "version": "3.1.0",
5327+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz",
5328+ "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA=="
52625329 },
52635330 "events": {
52645331 "version": "3.0.0",
@@ -6376,26 +6443,12 @@
63766443 "rimraf": "^2.2.8"
63776444 }
63786445 },
6379− "fs-promise": {
6380− "version": "2.0.3",
6381− "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-2.0.3.tgz",
6382− "integrity": "sha1-9k5PhUvPaJqovdy6JokW2z20aFQ=",
6446+ "fs-minipass": {
6447+ "version": "1.2.5",
6448+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz",
6449+ "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==",
63836450 "requires": {
6384− "any-promise": "^1.3.0",
6385− "fs-extra": "^2.0.0",
6386− "mz": "^2.6.0",
6387− "thenify-all": "^1.6.0"
6388− },
6389− "dependencies": {
6390− "fs-extra": {
6391− "version": "2.1.2",
6392− "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz",
6393− "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=",
6394− "requires": {
6395− "graceful-fs": "^4.1.2",
6396− "jsonfile": "^2.1.0"
6397− }
6398− }
6451+ "minipass": "^2.2.1"
63996452 }
64006453 },
64016454 "fs-write-stream-atomic": {
@@ -6431,7 +6484,8 @@
64316484 },
64326485 "ansi-regex": {
64336486 "version": "2.1.1",
6434− "bundled": true
6487+ "bundled": true,
6488+ "optional": true
64356489 },
64366490 "aproba": {
64376491 "version": "1.2.0",
@@ -6449,11 +6503,13 @@
64496503 },
64506504 "balanced-match": {
64516505 "version": "1.0.0",
6452− "bundled": true
6506+ "bundled": true,
6507+ "optional": true
64536508 },
64546509 "brace-expansion": {
64556510 "version": "1.1.11",
64566511 "bundled": true,
6512+ "optional": true,
64576513 "requires": {
64586514 "balanced-match": "^1.0.0",
64596515 "concat-map": "0.0.1"
@@ -6466,15 +6522,18 @@
64666522 },
64676523 "code-point-at": {
64686524 "version": "1.1.0",
6469− "bundled": true
6525+ "bundled": true,
6526+ "optional": true
64706527 },
64716528 "concat-map": {
64726529 "version": "0.0.1",
6473− "bundled": true
6530+ "bundled": true,
6531+ "optional": true
64746532 },
64756533 "console-control-strings": {
64766534 "version": "1.1.0",
6477− "bundled": true
6535+ "bundled": true,
6536+ "optional": true
64786537 },
64796538 "core-util-is": {
64806539 "version": "1.0.2",
@@ -6577,7 +6636,8 @@
65776636 },
65786637 "inherits": {
65796638 "version": "2.0.3",
6580− "bundled": true
6639+ "bundled": true,
6640+ "optional": true
65816641 },
65826642 "ini": {
65836643 "version": "1.3.5",
@@ -6587,6 +6647,7 @@
65876647 "is-fullwidth-code-point": {
65886648 "version": "1.0.0",
65896649 "bundled": true,
6650+ "optional": true,
65906651 "requires": {
65916652 "number-is-nan": "^1.0.0"
65926653 }
@@ -6599,17 +6660,20 @@
65996660 "minimatch": {
66006661 "version": "3.0.4",
66016662 "bundled": true,
6663+ "optional": true,
66026664 "requires": {
66036665 "brace-expansion": "^1.1.7"
66046666 }
66056667 },
66066668 "minimist": {
66076669 "version": "0.0.8",
6608− "bundled": true
6670+ "bundled": true,
6671+ "optional": true
66096672 },
66106673 "minipass": {
66116674 "version": "2.2.4",
66126675 "bundled": true,
6676+ "optional": true,
66136677 "requires": {
66146678 "safe-buffer": "^5.1.1",
66156679 "yallist": "^3.0.0"
@@ -6626,6 +6690,7 @@
66266690 "mkdirp": {
66276691 "version": "0.5.1",
66286692 "bundled": true,
6693+ "optional": true,
66296694 "requires": {
66306695 "minimist": "0.0.8"
66316696 }
@@ -6698,7 +6763,8 @@
66986763 },
66996764 "number-is-nan": {
67006765 "version": "1.0.1",
6701− "bundled": true
6766+ "bundled": true,
6767+ "optional": true
67026768 },
67036769 "object-assign": {
67046770 "version": "4.1.1",
@@ -6708,6 +6774,7 @@
67086774 "once": {
67096775 "version": "1.4.0",
67106776 "bundled": true,
6777+ "optional": true,
67116778 "requires": {
67126779 "wrappy": "1"
67136780 }
@@ -6783,7 +6850,8 @@
67836850 },
67846851 "safe-buffer": {
67856852 "version": "5.1.1",
6786− "bundled": true
6853+ "bundled": true,
6854+ "optional": true
67876855 },
67886856 "safer-buffer": {
67896857 "version": "2.1.2",
@@ -6813,6 +6881,7 @@
68136881 "string-width": {
68146882 "version": "1.0.2",
68156883 "bundled": true,
6884+ "optional": true,
68166885 "requires": {
68176886 "code-point-at": "^1.0.0",
68186887 "is-fullwidth-code-point": "^1.0.0",
@@ -6830,6 +6899,7 @@
68306899 "strip-ansi": {
68316900 "version": "3.0.1",
68326901 "bundled": true,
6902+ "optional": true,
68336903 "requires": {
68346904 "ansi-regex": "^2.0.0"
68356905 }
@@ -6868,25 +6938,16 @@
68686938 },
68696939 "wrappy": {
68706940 "version": "1.0.2",
6871− "bundled": true
6941+ "bundled": true,
6942+ "optional": true
68726943 },
68736944 "yallist": {
68746945 "version": "3.0.2",
6875− "bundled": true
6946+ "bundled": true,
6947+ "optional": true
68766948 }
68776949 }
68786950 },
6879− "fstream": {
6880− "version": "1.0.11",
6881− "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
6882− "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
6883− "requires": {
6884− "graceful-fs": "^4.1.2",
6885− "inherits": "~2.0.0",
6886− "mkdirp": ">=0.5 0",
6887− "rimraf": "2"
6888− }
6889− },
68906951 "function-bind": {
68916952 "version": "1.1.1",
68926953 "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
@@ -7868,11 +7929,6 @@
78687929 "statuses": ">= 1.4.0 < 2"
78697930 }
78707931 },
7871− "http-https": {
7872− "version": "1.0.0",
7873− "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz",
7874− "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs="
7875− },
78767932 "http-parser-js": {
78777933 "version": "0.5.0",
78787934 "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz",
@@ -8213,6 +8269,21 @@
82138269 "harmony-reflect": "^1.4.6"
82148270 }
82158271 },
8272+ "idna-uts46-hx": {
8273+ "version": "2.3.1",
8274+ "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz",
8275+ "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==",
8276+ "requires": {
8277+ "punycode": "2.1.0"
8278+ },
8279+ "dependencies": {
8280+ "punycode": {
8281+ "version": "2.1.0",
8282+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
8283+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0="
8284+ }
8285+ }
8286+ },
82168287 "ieee754": {
82178288 "version": "1.1.12",
82188289 "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz",
@@ -10678,6 +10749,30 @@
1067810749 "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
1067910750 "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
1068010751 },
10752+ "minipass": {
10753+ "version": "2.3.5",
10754+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz",
10755+ "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==",
10756+ "requires": {
10757+ "safe-buffer": "^5.1.2",
10758+ "yallist": "^3.0.0"
10759+ },
10760+ "dependencies": {
10761+ "yallist": {
10762+ "version": "3.0.3",
10763+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
10764+ "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A=="
10765+ }
10766+ }
10767+ },
10768+ "minizlib": {
10769+ "version": "1.2.1",
10770+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz",
10771+ "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==",
10772+ "requires": {
10773+ "minipass": "^2.2.1"
10774+ }
10775+ },
1068110776 "mississippi": {
1068210777 "version": "3.0.0",
1068310778 "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
@@ -10798,9 +10893,9 @@
1079810893 }
1079910894 },
1080010895 "mock-fs": {
10801− "version": "4.7.0",
10802− "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.7.0.tgz",
10803− "integrity": "sha512-WlQNtUlzMRpvLHf8dqeUmNqfdPjGY29KrJF50Ldb4AcL+vQeR8QH3wQcFMgrhTwb1gHjZn9xggho+84tBskLgA=="
10896+ "version": "4.9.0",
10897+ "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.9.0.tgz",
10898+ "integrity": "sha512-aUj0qIniTNxzGqAC61Bvro7YD37tIBnMw3wpClucUVgNBS7r6YQn/M4wuoH7SGteKz4SvC1OBeDsfpG0MYC+1Q=="
1080410899 },
1080510900 "more-entropy": {
1080610901 "version": "0.0.7",
@@ -10810,11 +10905,6 @@
1081010905 "iced-runtime": ">=0.0.1"
1081110906 }
1081210907 },
10813− "mout": {
10814− "version": "0.11.1",
10815− "resolved": "https://registry.npmjs.org/mout/-/mout-0.11.1.tgz",
10816− "integrity": "sha1-ujYR318OWx/7/QEWa48C0fX6K5k="
10817− },
1081810908 "move-concurrently": {
1081910909 "version": "1.0.1",
1082010910 "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
@@ -10857,16 +10947,6 @@
1085710947 "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
1085810948 "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
1085910949 },
10860− "mz": {
10861− "version": "2.7.0",
10862− "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
10863− "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
10864− "requires": {
10865− "any-promise": "^1.0.0",
10866− "object-assign": "^4.0.1",
10867− "thenify-all": "^1.0.0"
10868− }
10869− },
1087010950 "nan": {
1087110951 "version": "2.12.1",
1087210952 "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz",
@@ -11334,14 +11414,6 @@
1133411414 "has": "^1.0.1"
1133511415 }
1133611416 },
11337− "oboe": {
11338− "version": "2.1.3",
11339− "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.3.tgz",
11340− "integrity": "sha1-K0hl29Rr6BIlcT9Om/5Lz09oCk8=",
11341− "requires": {
11342− "http-https": "^1.0.0"
11343− }
11344− },
1134511417 "obuf": {
1134611418 "version": "1.1.2",
1134711419 "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
@@ -11559,12 +11631,12 @@
1155911631 }
1156011632 },
1156111633 "parse-headers": {
11562− "version": "2.0.1",
11563− "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz",
11564− "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=",
11634+ "version": "2.0.2",
11635+ "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.2.tgz",
11636+ "integrity": "sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg==",
1156511637 "requires": {
11566− "for-each": "^0.3.2",
11567− "trim": "0.0.1"
11638+ "for-each": "^0.3.3",
11639+ "string.prototype.trim": "^1.1.2"
1156811640 }
1156911641 },
1157011642 "parse-json": {
@@ -17200,6 +17272,11 @@
1720017272 "nan": "^2.0.8"
1720117273 }
1720217274 },
17275+ "scrypt-js": {
17276+ "version": "2.0.4",
17277+ "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz",
17278+ "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw=="
17279+ },
1720317280 "scrypt.js": {
1720417281 "version": "0.2.0",
1720517282 "resolved": "http://registry.npmjs.org/scrypt.js/-/scrypt.js-0.2.0.tgz",
@@ -18034,6 +18111,16 @@
1803418111 "function-bind": "^1.0.2"
1803518112 }
1803618113 },
18114+ "string.prototype.trim": {
18115+ "version": "1.1.2",
18116+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz",
18117+ "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=",
18118+ "requires": {
18119+ "define-properties": "^1.1.2",
18120+ "es-abstract": "^1.5.0",
18121+ "function-bind": "^1.0.2"
18122+ }
18123+ },
1803718124 "string_decoder": {
1803818125 "version": "1.1.1",
1803918126 "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
@@ -18218,32 +18305,40 @@
1821818305 }
1821918306 },
1822018307 "swarm-js": {
18221− "version": "0.1.37",
18222− "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.37.tgz",
18223− "integrity": "sha512-G8gi5fcXP/2upwiuOShJ258sIufBVztekgobr3cVgYXObZwJ5AXLqZn52AI+/ffft29pJexF9WNdUxjlkVehoQ==",
18308+ "version": "0.1.39",
18309+ "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.39.tgz",
18310+ "integrity": "sha512-QLMqL2rzF6n5s50BptyD6Oi0R1aWlJC5Y17SRIVXRj6OR1DRIPM7nepvrxxkjA1zNzFz6mUOMjfeqeDaWB7OOg==",
1822418311 "requires": {
1822518312 "bluebird": "^3.5.0",
1822618313 "buffer": "^5.0.5",
1822718314 "decompress": "^4.0.0",
1822818315 "eth-lib": "^0.1.26",
18229− "fs-extra": "^2.1.2",
18230− "fs-promise": "^2.0.0",
18316+ "fs-extra": "^4.0.2",
1823118317 "got": "^7.1.0",
1823218318 "mime-types": "^2.1.16",
1823318319 "mkdirp-promise": "^5.0.1",
1823418320 "mock-fs": "^4.1.0",
1823518321 "setimmediate": "^1.0.5",
18236− "tar.gz": "^1.0.5",
18322+ "tar": "^4.0.2",
1823718323 "xhr-request-promise": "^0.1.2"
1823818324 },
1823918325 "dependencies": {
1824018326 "fs-extra": {
18241− "version": "2.1.2",
18242− "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz",
18243− "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=",
18327+ "version": "4.0.3",
18328+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
18329+ "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
1824418330 "requires": {
1824518331 "graceful-fs": "^4.1.2",
18246− "jsonfile": "^2.1.0"
18332+ "jsonfile": "^4.0.0",
18333+ "universalify": "^0.1.0"
18334+ }
18335+ },
18336+ "jsonfile": {
18337+ "version": "4.0.0",
18338+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
18339+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
18340+ "requires": {
18341+ "graceful-fs": "^4.1.6"
1824718342 }
1824818343 }
1824918344 }
@@ -18332,13 +18427,24 @@
1833218427 "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA=="
1833318428 },
1833418429 "tar": {
18335− "version": "2.2.1",
18336− "resolved": "http://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
18337− "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
18430+ "version": "4.4.8",
18431+ "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz",
18432+ "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==",
1833818433 "requires": {
18339− "block-stream": "*",
18340− "fstream": "^1.0.2",
18341− "inherits": "2"
18434+ "chownr": "^1.1.1",
18435+ "fs-minipass": "^1.2.5",
18436+ "minipass": "^2.3.4",
18437+ "minizlib": "^1.1.1",
18438+ "mkdirp": "^0.5.0",
18439+ "safe-buffer": "^5.1.2",
18440+ "yallist": "^3.0.2"
18441+ },
18442+ "dependencies": {
18443+ "yallist": {
18444+ "version": "3.0.3",
18445+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
18446+ "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A=="
18447+ }
1834218448 }
1834318449 },
1834418450 "tar-stream": {
@@ -18355,25 +18461,6 @@
1835518461 "xtend": "^4.0.0"
1835618462 }
1835718463 },
18358− "tar.gz": {
18359− "version": "1.0.7",
18360− "resolved": "https://registry.npmjs.org/tar.gz/-/tar.gz-1.0.7.tgz",
18361− "integrity": "sha512-uhGatJvds/3diZrETqMj4RxBR779LKlIE74SsMcn5JProZsfs9j0QBwWO1RW+IWNJxS2x8Zzra1+AW6OQHWphg==",
18362− "requires": {
18363− "bluebird": "^2.9.34",
18364− "commander": "^2.8.1",
18365− "fstream": "^1.0.8",
18366− "mout": "^0.11.0",
18367− "tar": "^2.1.1"
18368− },
18369− "dependencies": {
18370− "bluebird": {
18371− "version": "2.11.0",
18372− "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz",
18373− "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE="
18374− }
18375− }
18376− },
1837718464 "term-size": {
1837818465 "version": "1.2.0",
1837918466 "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
@@ -18519,22 +18606,6 @@
1851918606 "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
1852018607 "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
1852118608 },
18522− "thenify": {
18523− "version": "3.3.0",
18524− "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz",
18525− "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=",
18526− "requires": {
18527− "any-promise": "^1.0.0"
18528− }
18529− },
18530− "thenify-all": {
18531− "version": "1.6.0",
18532− "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
18533− "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
18534− "requires": {
18535− "thenify": ">= 3.1.0 < 4"
18536− }
18537− },
1853818609 "throat": {
1853918610 "version": "4.1.0",
1854018611 "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz",
@@ -18717,11 +18788,6 @@
1871718788 }
1871818789 }
1871918790 },
18720− "trim": {
18721− "version": "0.0.1",
18722− "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
18723− "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0="
18724− },
1872518791 "trim-right": {
1872618792 "version": "1.0.1",
1872718793 "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
@@ -18787,6 +18853,14 @@
1878718853 "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
1878818854 "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
1878918855 },
18856+ "typedarray-to-buffer": {
18857+ "version": "3.1.5",
18858+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
18859+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
18860+ "requires": {
18861+ "is-typedarray": "^1.0.0"
18862+ }
18863+ },
1879018864 "typeforce": {
1879118865 "version": "1.18.0",
1879218866 "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz",
@@ -18925,36 +18999,14 @@
1892518999 "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og=="
1892619000 },
1892719001 "unbzip2-stream": {
18928− "version": "1.3.1",
18929− "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.1.tgz",
18930− "integrity": "sha512-fIZnvdjblYs7Cru/xC6tCPVhz7JkYcVQQkePwMLyQELzYTds2Xn8QefPVnvdVhhZqubxNA1cASXEH5wcK0Bucw==",
19002+ "version": "1.3.3",
19003+ "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz",
19004+ "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==",
1893119005 "requires": {
18932− "buffer": "^3.0.1",
18933− "through": "^2.3.6"
18934− },
18935− "dependencies": {
18936− "base64-js": {
18937− "version": "0.0.8",
18938− "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz",
18939− "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg="
18940− },
18941− "buffer": {
18942− "version": "3.6.0",
18943− "resolved": "http://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz",
18944− "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=",
18945− "requires": {
18946− "base64-js": "0.0.8",
18947− "ieee754": "^1.1.4",
18948− "isarray": "^1.0.0"
18949− }
18950− }
19006+ "buffer": "^5.2.1",
19007+ "through": "^2.3.8"
1895119008 }
1895219009 },
18953− "underscore": {
18954− "version": "1.8.3",
18955− "resolved": "http://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
18956− "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI="
18957− },
1895819010 "unicode-canonical-property-names-ecmascript": {
1895919011 "version": "1.0.4",
1896019012 "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
@@ -19368,294 +19420,802 @@
1936819420 }
1936919421 },
1937019422 "web3": {
19371− "version": "1.0.0-beta.33",
19372− "resolved": "https://registry.npmjs.org/web3/-/web3-1.0.0-beta.33.tgz",
19373− "integrity": "sha1-xgIbV2mSdyY3HBhLhoRFMRsTkpU=",
19374− "requires": {
19375− "web3-bzz": "1.0.0-beta.33",
19376− "web3-core": "1.0.0-beta.33",
19377− "web3-eth": "1.0.0-beta.33",
19378− "web3-eth-personal": "1.0.0-beta.33",
19379− "web3-net": "1.0.0-beta.33",
19380− "web3-shh": "1.0.0-beta.33",
19381− "web3-utils": "1.0.0-beta.33"
19423+ "version": "1.0.0-beta.54",
19424+ "resolved": "https://registry.npmjs.org/web3/-/web3-1.0.0-beta.54.tgz",
19425+ "integrity": "sha512-rMQaLFwBNR3Lc8Npa9uasdkJKhsnp2FrDA0r8J814mU1VITkAG7l8NPICrlUaDLNiQn0bf6QnONTNujuds+yNg==",
19426+ "requires": {
19427+ "@babel/runtime": "^7.3.1",
19428+ "@types/node": "^10.12.18",
19429+ "web3-bzz": "1.0.0-beta.54",
19430+ "web3-core": "1.0.0-beta.54",
19431+ "web3-core-helpers": "1.0.0-beta.54",
19432+ "web3-core-method": "1.0.0-beta.54",
19433+ "web3-eth": "1.0.0-beta.54",
19434+ "web3-eth-personal": "1.0.0-beta.54",
19435+ "web3-net": "1.0.0-beta.54",
19436+ "web3-providers": "1.0.0-beta.54",
19437+ "web3-shh": "1.0.0-beta.54",
19438+ "web3-utils": "1.0.0-beta.54"
1938219439 },
1938319440 "dependencies": {
19384− "bn.js": {
19385− "version": "4.11.6",
19386− "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
19387− "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU="
19388− },
19389− "uuid": {
19390− "version": "2.0.1",
19391− "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz",
19392− "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w="
19393− },
19394− "web3-bzz": {
19395− "version": "1.0.0-beta.33",
19396− "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.0.0-beta.33.tgz",
19397− "integrity": "sha1-MVAPaZt+cO31FJDFXv+0J7+7OwE=",
19398− "requires": {
19399− "got": "7.1.0",
19400− "swarm-js": "0.1.37",
19401− "underscore": "1.8.3"
19402− }
19403− },
19404− "web3-core": {
19405− "version": "1.0.0-beta.33",
19406− "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.0.0-beta.33.tgz",
19407− "integrity": "sha1-+C7VJfW2auzale7O08rSvWlfeDk=",
19408− "requires": {
19409− "web3-core-helpers": "1.0.0-beta.33",
19410− "web3-core-method": "1.0.0-beta.33",
19411− "web3-core-requestmanager": "1.0.0-beta.33",
19412− "web3-utils": "1.0.0-beta.33"
19413− }
19414− },
19415− "web3-core-helpers": {
19416− "version": "1.0.0-beta.33",
19417− "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.33.tgz",
19418− "integrity": "sha1-Kvcz5QTbBefDZIwdrPV3sOwV3EM=",
19419− "requires": {
19420− "underscore": "1.8.3",
19421− "web3-eth-iban": "1.0.0-beta.33",
19422− "web3-utils": "1.0.0-beta.33"
19423− }
19424− },
19425− "web3-core-method": {
19426− "version": "1.0.0-beta.33",
19427− "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.0.0-beta.33.tgz",
19428− "integrity": "sha1-7Y7ExK+rIdwJid41g2hEZlIrboY=",
19429− "requires": {
19430− "underscore": "1.8.3",
19431− "web3-core-helpers": "1.0.0-beta.33",
19432− "web3-core-promievent": "1.0.0-beta.33",
19433− "web3-core-subscriptions": "1.0.0-beta.33",
19434− "web3-utils": "1.0.0-beta.33"
19435− }
19436− },
19437− "web3-core-promievent": {
19438− "version": "1.0.0-beta.33",
19439− "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.33.tgz",
19440− "integrity": "sha1-0fXrtgFSfdSWViw2IXblWNly01g=",
19441− "requires": {
19442− "any-promise": "1.3.0",
19443− "eventemitter3": "1.1.1"
19444− }
19445− },
19446− "web3-core-requestmanager": {
19447− "version": "1.0.0-beta.33",
19448− "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.33.tgz",
19449− "integrity": "sha1-ejbEA1QALfsXnKLb22pgEsn3Ges=",
19450− "requires": {
19451− "underscore": "1.8.3",
19452− "web3-core-helpers": "1.0.0-beta.33",
19453− "web3-providers-http": "1.0.0-beta.33",
19454− "web3-providers-ipc": "1.0.0-beta.33",
19455− "web3-providers-ws": "1.0.0-beta.33"
19456− }
19457− },
19458− "web3-core-subscriptions": {
19459− "version": "1.0.0-beta.33",
19460− "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.33.tgz",
19461− "integrity": "sha1-YCh1yfTV9NDhYhRitfwewZs1veM=",
19462− "requires": {
19463− "eventemitter3": "1.1.1",
19464− "underscore": "1.8.3",
19465− "web3-core-helpers": "1.0.0-beta.33"
19466− }
19467− },
19468− "web3-eth": {
19469− "version": "1.0.0-beta.33",
19470− "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.0.0-beta.33.tgz",
19471− "integrity": "sha1-hKn5TallUnyS2DitTlcN8CWJhJ8=",
19472− "requires": {
19473− "underscore": "1.8.3",
19474− "web3-core": "1.0.0-beta.33",
19475− "web3-core-helpers": "1.0.0-beta.33",
19476− "web3-core-method": "1.0.0-beta.33",
19477− "web3-core-subscriptions": "1.0.0-beta.33",
19478− "web3-eth-abi": "1.0.0-beta.33",
19479− "web3-eth-accounts": "1.0.0-beta.33",
19480− "web3-eth-contract": "1.0.0-beta.33",
19481− "web3-eth-iban": "1.0.0-beta.33",
19482− "web3-eth-personal": "1.0.0-beta.33",
19483− "web3-net": "1.0.0-beta.33",
19484− "web3-utils": "1.0.0-beta.33"
19485− }
19486− },
19487− "web3-eth-abi": {
19488− "version": "1.0.0-beta.33",
19489− "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.33.tgz",
19490− "integrity": "sha1-IiH3FRZDZgAypN80D2EjSRaMgko=",
19491− "requires": {
19492− "bn.js": "4.11.6",
19493− "underscore": "1.8.3",
19494− "web3-core-helpers": "1.0.0-beta.33",
19495− "web3-utils": "1.0.0-beta.33"
19496− }
19497− },
19498− "web3-eth-accounts": {
19499− "version": "1.0.0-beta.33",
19500− "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.33.tgz",
19501− "integrity": "sha1-JajX9OWOHpk7kvBpVILMzckhL5E=",
19502− "requires": {
19503− "any-promise": "1.3.0",
19504− "crypto-browserify": "3.12.0",
19505− "eth-lib": "0.2.7",
19506− "scrypt.js": "0.2.0",
19507− "underscore": "1.8.3",
19508− "uuid": "2.0.1",
19509− "web3-core": "1.0.0-beta.33",
19510− "web3-core-helpers": "1.0.0-beta.33",
19511− "web3-core-method": "1.0.0-beta.33",
19512− "web3-utils": "1.0.0-beta.33"
19513− },
19514− "dependencies": {
19515− "eth-lib": {
19516− "version": "0.2.7",
19517− "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz",
19518− "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=",
19519− "requires": {
19520− "bn.js": "^4.11.6",
19521− "elliptic": "^6.4.0",
19522− "xhr-request-promise": "^0.1.2"
19523− }
19524− }
19525− }
19526− },
19527− "web3-eth-contract": {
19528− "version": "1.0.0-beta.33",
19529− "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.33.tgz",
19530− "integrity": "sha1-nlkZ8pF6PGe0+2Vp1JxeMDiSW84=",
19531− "requires": {
19532− "underscore": "1.8.3",
19533− "web3-core": "1.0.0-beta.33",
19534− "web3-core-helpers": "1.0.0-beta.33",
19535− "web3-core-method": "1.0.0-beta.33",
19536− "web3-core-promievent": "1.0.0-beta.33",
19537− "web3-core-subscriptions": "1.0.0-beta.33",
19538− "web3-eth-abi": "1.0.0-beta.33",
19539− "web3-utils": "1.0.0-beta.33"
19540− }
19541− },
19542− "web3-eth-iban": {
19543− "version": "1.0.0-beta.33",
19544− "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.33.tgz",
19545− "integrity": "sha1-HXPQxSiKRWWxdUp1tfs+oLd6Uy8=",
19441+ "@babel/runtime": {
19442+ "version": "7.4.4",
19443+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz",
19444+ "integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==",
1954619445 "requires": {
19547− "bn.js": "4.11.6",
19548− "web3-utils": "1.0.0-beta.33"
19446+ "regenerator-runtime": "^0.13.2"
1954919447 }
1955019448 },
19551− "web3-eth-personal": {
19552− "version": "1.0.0-beta.33",
19553− "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.33.tgz",
19554− "integrity": "sha1-tOSFh8xOfrAY2ib947Tzul+bmO8=",
19449+ "eth-lib": {
19450+ "version": "0.2.8",
19451+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
19452+ "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
1955519453 "requires": {
19556− "web3-core": "1.0.0-beta.33",
19557− "web3-core-helpers": "1.0.0-beta.33",
19558− "web3-core-method": "1.0.0-beta.33",
19559− "web3-net": "1.0.0-beta.33",
19560− "web3-utils": "1.0.0-beta.33"
19454+ "bn.js": "^4.11.6",
19455+ "elliptic": "^6.4.0",
19456+ "xhr-request-promise": "^0.1.2"
1956119457 }
1956219458 },
19563− "web3-net": {
19564− "version": "1.0.0-beta.33",
19565− "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.0.0-beta.33.tgz",
19566− "integrity": "sha1-tskNGg4WJuquiz2SKsFTZy/VZEU=",
19567− "requires": {
19568− "web3-core": "1.0.0-beta.33",
19569− "web3-core-method": "1.0.0-beta.33",
19570− "web3-utils": "1.0.0-beta.33"
19571− }
19459+ "regenerator-runtime": {
19460+ "version": "0.13.2",
19461+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
19462+ "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA=="
1957219463 },
19573− "web3-providers-http": {
19574− "version": "1.0.0-beta.33",
19575− "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.0.0-beta.33.tgz",
19576− "integrity": "sha1-OzWuAO599blrSTSWKtSobypVmcE=",
19577− "requires": {
19578− "web3-core-helpers": "1.0.0-beta.33",
19579− "xhr2": "0.1.4"
19464+ "web3-utils": {
19465+ "version": "1.0.0-beta.54",
19466+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.54.tgz",
19467+ "integrity": "sha512-yb/cjzjTU99P/9bEaAnb6cjqGjyMUF0OmjD7/ix89IfcDhBJ3jExSuClTAKU8Hz9Rf7IXLiXqBny9W8PdogwmQ==",
19468+ "requires": {
19469+ "@babel/runtime": "^7.3.1",
19470+ "@types/bn.js": "^4.11.4",
19471+ "@types/node": "^10.12.18",
19472+ "bn.js": "4.11.8",
19473+ "eth-lib": "0.2.8",
19474+ "ethjs-unit": "^0.1.6",
19475+ "lodash": "^4.17.11",
19476+ "number-to-bn": "1.7.0",
19477+ "randomhex": "0.1.5",
19478+ "utf8": "2.1.1"
1958019479 }
19581− },
19582− "web3-providers-ipc": {
19583− "version": "1.0.0-beta.33",
19584− "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.33.tgz",
19585− "integrity": "sha1-Twrcmv6dEsBm5L5cPFNvUHPLB8Y=",
19480+ }
19481+ }
19482+ },
19483+ "web3-bzz": {
19484+ "version": "1.0.0-beta.54",
19485+ "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.0.0-beta.54.tgz",
19486+ "integrity": "sha512-YKoYJWSAxyekk52V0v/rx/gtklqFbMpT8S2Wevox+9MjWchizt34MovJOIbAQzUEUpDhMffdoycVoebmJBcVfA==",
19487+ "requires": {
19488+ "@babel/runtime": "^7.3.1",
19489+ "@types/node": "^10.12.18",
19490+ "lodash": "^4.17.11",
19491+ "swarm-js": "^0.1.39"
19492+ },
19493+ "dependencies": {
19494+ "@babel/runtime": {
19495+ "version": "7.4.4",
19496+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz",
19497+ "integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==",
1958619498 "requires": {
19587− "oboe": "2.1.3",
19588− "underscore": "1.8.3",
19589− "web3-core-helpers": "1.0.0-beta.33"
19499+ "regenerator-runtime": "^0.13.2"
1959019500 }
1959119501 },
19592− "web3-providers-ws": {
19593− "version": "1.0.0-beta.33",
19594− "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.33.tgz",
19595− "integrity": "sha1-j93qQuGbvyUh7IeVRkV6Yjqdye8=",
19502+ "regenerator-runtime": {
19503+ "version": "0.13.2",
19504+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
19505+ "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA=="
19506+ }
19507+ }
19508+ },
19509+ "web3-core": {
19510+ "version": "1.0.0-beta.54",
19511+ "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.0.0-beta.54.tgz",
19512+ "integrity": "sha512-phgFlv0LotX1ym1H+5mchhjJY3MVFov3DdUnFg1eZQlgHxsRKNfRI/nf3+ICVkDqOJP6mdX+oSPFizIXZJqLGQ==",
19513+ "requires": {
19514+ "@babel/runtime": "^7.3.1",
19515+ "@types/bn.js": "^4.11.4",
19516+ "@types/node": "^10.12.18",
19517+ "lodash": "^4.17.11",
19518+ "web3-utils": "1.0.0-beta.54"
19519+ },
19520+ "dependencies": {
19521+ "@babel/runtime": {
19522+ "version": "7.4.4",
19523+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz",
19524+ "integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==",
1959619525 "requires": {
19597− "underscore": "1.8.3",
19598− "web3-core-helpers": "1.0.0-beta.33"
19599− },
19600− "dependencies": {
19601− "websocket": {
19602− "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2",
19603− "from": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2",
19604− "requires": {
19605− "debug": "^2.2.0",
19606− "nan": "^2.3.3",
19607− "typedarray-to-buffer": "^3.1.2",
19608− "yaeti": "^0.0.6"
19609− },
19610− "dependencies": {
19611− "typedarray-to-buffer": {
19612− "version": "3.1.5",
19613− "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
19614− "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
19615− "requires": {
19616− "is-typedarray": "^1.0.0"
19617− }
19618− },
19619− "yaeti": {
19620− "version": "0.0.6",
19621− "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz",
19622− "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc="
19623− }
19624− }
19625− }
19526+ "regenerator-runtime": "^0.13.2"
19527+ }
19528+ },
19529+ "eth-lib": {
19530+ "version": "0.2.8",
19531+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
19532+ "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
19533+ "requires": {
19534+ "bn.js": "^4.11.6",
19535+ "elliptic": "^6.4.0",
19536+ "xhr-request-promise": "^0.1.2"
19537+ }
19538+ },
19539+ "regenerator-runtime": {
19540+ "version": "0.13.2",
19541+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
19542+ "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA=="
19543+ },
19544+ "web3-utils": {
19545+ "version": "1.0.0-beta.54",
19546+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.54.tgz",
19547+ "integrity": "sha512-yb/cjzjTU99P/9bEaAnb6cjqGjyMUF0OmjD7/ix89IfcDhBJ3jExSuClTAKU8Hz9Rf7IXLiXqBny9W8PdogwmQ==",
19548+ "requires": {
19549+ "@babel/runtime": "^7.3.1",
19550+ "@types/bn.js": "^4.11.4",
19551+ "@types/node": "^10.12.18",
19552+ "bn.js": "4.11.8",
19553+ "eth-lib": "0.2.8",
19554+ "ethjs-unit": "^0.1.6",
19555+ "lodash": "^4.17.11",
19556+ "number-to-bn": "1.7.0",
19557+ "randomhex": "0.1.5",
19558+ "utf8": "2.1.1"
19559+ }
19560+ }
19561+ }
19562+ },
19563+ "web3-core-helpers": {
19564+ "version": "1.0.0-beta.54",
19565+ "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.54.tgz",
19566+ "integrity": "sha512-tASbzdfWyUd6ICbrhDAkWP8NxzSk8+t8IGrpaTBen00gR4gudz3KLPZKTJXrE7y3FB6YONRFPlpYqbim/TS6XQ==",
19567+ "requires": {
19568+ "@babel/runtime": "^7.3.1",
19569+ "lodash": "^4.17.11",
19570+ "web3-eth-iban": "1.0.0-beta.54",
19571+ "web3-utils": "1.0.0-beta.54"
19572+ },
19573+ "dependencies": {
19574+ "@babel/runtime": {
19575+ "version": "7.4.4",
19576+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz",
19577+ "integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==",
19578+ "requires": {
19579+ "regenerator-runtime": "^0.13.2"
19580+ }
19581+ },
19582+ "eth-lib": {
19583+ "version": "0.2.8",
19584+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
19585+ "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
19586+ "requires": {
19587+ "bn.js": "^4.11.6",
19588+ "elliptic": "^6.4.0",
19589+ "xhr-request-promise": "^0.1.2"
19590+ }
19591+ },
19592+ "regenerator-runtime": {
19593+ "version": "0.13.2",
19594+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
19595+ "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA=="
19596+ },
19597+ "web3-utils": {
19598+ "version": "1.0.0-beta.54",
19599+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.54.tgz",
19600+ "integrity": "sha512-yb/cjzjTU99P/9bEaAnb6cjqGjyMUF0OmjD7/ix89IfcDhBJ3jExSuClTAKU8Hz9Rf7IXLiXqBny9W8PdogwmQ==",
19601+ "requires": {
19602+ "@babel/runtime": "^7.3.1",
19603+ "@types/bn.js": "^4.11.4",
19604+ "@types/node": "^10.12.18",
19605+ "bn.js": "4.11.8",
19606+ "eth-lib": "0.2.8",
19607+ "ethjs-unit": "^0.1.6",
19608+ "lodash": "^4.17.11",
19609+ "number-to-bn": "1.7.0",
19610+ "randomhex": "0.1.5",
19611+ "utf8": "2.1.1"
19612+ }
19613+ }
19614+ }
19615+ },
19616+ "web3-core-method": {
19617+ "version": "1.0.0-beta.54",
19618+ "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.0.0-beta.54.tgz",
19619+ "integrity": "sha512-5Ar3+jj1tOdNA8+ra105QD+cYef5w9wmgmaaIyGmjsgPZGMDeCIIPLgdSdFuyOdgPhy0zKhhwJsIzr3fJXtMxw==",
19620+ "requires": {
19621+ "@babel/runtime": "^7.3.1",
19622+ "eventemitter3": "3.1.0",
19623+ "lodash": "^4.17.11"
19624+ },
19625+ "dependencies": {
19626+ "@babel/runtime": {
19627+ "version": "7.4.4",
19628+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz",
19629+ "integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==",
19630+ "requires": {
19631+ "regenerator-runtime": "^0.13.2"
19632+ }
19633+ },
19634+ "regenerator-runtime": {
19635+ "version": "0.13.2",
19636+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
19637+ "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA=="
19638+ }
19639+ }
19640+ },
19641+ "web3-core-subscriptions": {
19642+ "version": "1.0.0-beta.54",
19643+ "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.54.tgz",
19644+ "integrity": "sha512-JQK0pgdIPQU0Ff0Muv8eVNeeABRzvEa4rDkqKyEkZtHKd+JcxBFWp7Y9nlDLViAq20ahH5yh4AB/pCGh7mxIiw==",
19645+ "requires": {
19646+ "@babel/runtime": "^7.3.1",
19647+ "eventemitter3": "^3.1.0",
19648+ "lodash": "^4.17.11"
19649+ },
19650+ "dependencies": {
19651+ "@babel/runtime": {
19652+ "version": "7.4.4",
19653+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz",
19654+ "integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==",
19655+ "requires": {
19656+ "regenerator-runtime": "^0.13.2"
19657+ }
19658+ },
19659+ "regenerator-runtime": {
19660+ "version": "0.13.2",
19661+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
19662+ "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA=="
19663+ }
19664+ }
19665+ },
19666+ "web3-eth": {
19667+ "version": "1.0.0-beta.54",
19668+ "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.0.0-beta.54.tgz",
19669+ "integrity": "sha512-rXjx2I24xY2id43mz66RAH/ZyFpjporKIrIJTGRgyPO6jN+DdGjJbDcFpw7G/H6a+bRdOfVyo5tdl3eW1j6xdg==",
19670+ "requires": {
19671+ "@babel/runtime": "^7.3.1",
19672+ "ethereumjs-tx": "^1.3.7",
19673+ "rxjs": "^6.4.0",
19674+ "web3-core": "1.0.0-beta.54",
19675+ "web3-core-helpers": "1.0.0-beta.54",
19676+ "web3-core-method": "1.0.0-beta.54",
19677+ "web3-core-subscriptions": "1.0.0-beta.54",
19678+ "web3-eth-abi": "1.0.0-beta.54",
19679+ "web3-eth-accounts": "1.0.0-beta.54",
19680+ "web3-eth-contract": "1.0.0-beta.54",
19681+ "web3-eth-ens": "1.0.0-beta.54",
19682+ "web3-eth-iban": "1.0.0-beta.54",
19683+ "web3-eth-personal": "1.0.0-beta.54",
19684+ "web3-net": "1.0.0-beta.54",
19685+ "web3-providers": "1.0.0-beta.54",
19686+ "web3-utils": "1.0.0-beta.54"
19687+ },
19688+ "dependencies": {
19689+ "@babel/runtime": {
19690+ "version": "7.4.4",
19691+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz",
19692+ "integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==",
19693+ "requires": {
19694+ "regenerator-runtime": "^0.13.2"
19695+ }
19696+ },
19697+ "eth-lib": {
19698+ "version": "0.2.8",
19699+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
19700+ "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
19701+ "requires": {
19702+ "bn.js": "^4.11.6",
19703+ "elliptic": "^6.4.0",
19704+ "xhr-request-promise": "^0.1.2"
1962619705 }
1962719706 },
19628− "web3-shh": {
19629− "version": "1.0.0-beta.33",
19630− "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.0.0-beta.33.tgz",
19631− "integrity": "sha1-+Z4mVz9uCZMhrw2fK/z+Pe01UKE=",
19707+ "regenerator-runtime": {
19708+ "version": "0.13.2",
19709+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
19710+ "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA=="
19711+ },
19712+ "rxjs": {
19713+ "version": "6.5.1",
19714+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.1.tgz",
19715+ "integrity": "sha512-y0j31WJc83wPu31vS1VlAFW5JGrnGC+j+TtGAa1fRQphy48+fDYiDmX8tjGloToEsMkxnouOg/1IzXGKkJnZMg==",
1963219716 "requires": {
19633− "web3-core": "1.0.0-beta.33",
19634− "web3-core-method": "1.0.0-beta.33",
19635− "web3-core-subscriptions": "1.0.0-beta.33",
19636− "web3-net": "1.0.0-beta.33"
19717+ "tslib": "^1.9.0"
1963719718 }
1963819719 },
1963919720 "web3-utils": {
19640− "version": "1.0.0-beta.33",
19641− "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.33.tgz",
19642− "integrity": "sha1-4JG3mU8JtxSwGYpAV9OtLrjL4jg=",
19721+ "version": "1.0.0-beta.54",
19722+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.54.tgz",
19723+ "integrity": "sha512-yb/cjzjTU99P/9bEaAnb6cjqGjyMUF0OmjD7/ix89IfcDhBJ3jExSuClTAKU8Hz9Rf7IXLiXqBny9W8PdogwmQ==",
19724+ "requires": {
19725+ "@babel/runtime": "^7.3.1",
19726+ "@types/bn.js": "^4.11.4",
19727+ "@types/node": "^10.12.18",
19728+ "bn.js": "4.11.8",
19729+ "eth-lib": "0.2.8",
19730+ "ethjs-unit": "^0.1.6",
19731+ "lodash": "^4.17.11",
19732+ "number-to-bn": "1.7.0",
19733+ "randomhex": "0.1.5",
19734+ "utf8": "2.1.1"
19735+ }
19736+ }
19737+ }
19738+ },
19739+ "web3-eth-abi": {
19740+ "version": "1.0.0-beta.54",
19741+ "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.54.tgz",
19742+ "integrity": "sha512-2hePxe8VHtNvGX6i14rntPCjAuwO8Iktn95HcR/VgXW2SoqeKkqmKow+lR6ePjl/D/BQyEa/bWCaLrSpArfK9g==",
19743+ "requires": {
19744+ "@babel/runtime": "^7.3.1",
19745+ "ethers": "^4.0.27",
19746+ "lodash": "^4.17.11",
19747+ "web3-utils": "1.0.0-beta.54"
19748+ },
19749+ "dependencies": {
19750+ "@babel/runtime": {
19751+ "version": "7.4.4",
19752+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz",
19753+ "integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==",
1964319754 "requires": {
19644− "bn.js": "4.11.6",
19645− "eth-lib": "0.1.27",
19646− "ethjs-unit": "0.1.6",
19755+ "regenerator-runtime": "^0.13.2"
19756+ }
19757+ },
19758+ "eth-lib": {
19759+ "version": "0.2.8",
19760+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
19761+ "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
19762+ "requires": {
19763+ "bn.js": "^4.11.6",
19764+ "elliptic": "^6.4.0",
19765+ "xhr-request-promise": "^0.1.2"
19766+ }
19767+ },
19768+ "regenerator-runtime": {
19769+ "version": "0.13.2",
19770+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
19771+ "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA=="
19772+ },
19773+ "web3-utils": {
19774+ "version": "1.0.0-beta.54",
19775+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.54.tgz",
19776+ "integrity": "sha512-yb/cjzjTU99P/9bEaAnb6cjqGjyMUF0OmjD7/ix89IfcDhBJ3jExSuClTAKU8Hz9Rf7IXLiXqBny9W8PdogwmQ==",
19777+ "requires": {
19778+ "@babel/runtime": "^7.3.1",
19779+ "@types/bn.js": "^4.11.4",
19780+ "@types/node": "^10.12.18",
19781+ "bn.js": "4.11.8",
19782+ "eth-lib": "0.2.8",
19783+ "ethjs-unit": "^0.1.6",
19784+ "lodash": "^4.17.11",
1964719785 "number-to-bn": "1.7.0",
1964819786 "randomhex": "0.1.5",
19649− "underscore": "1.8.3",
1965019787 "utf8": "2.1.1"
1965119788 }
19789+ }
19790+ }
19791+ },
19792+ "web3-eth-accounts": {
19793+ "version": "1.0.0-beta.54",
19794+ "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.54.tgz",
19795+ "integrity": "sha512-/cIwYx4vod+W05tyQoLBcmBs2wGcnvuyvptoRk2y+krwsVNY+8OvUCu8hU4pIqhH8lt6Q++D1dshttsZsue5hw==",
19796+ "requires": {
19797+ "@babel/runtime": "^7.3.1",
19798+ "crypto-browserify": "3.12.0",
19799+ "eth-lib": "0.2.8",
19800+ "lodash": "^4.17.11",
19801+ "scrypt.js": "0.2.0",
19802+ "uuid": "3.3.2",
19803+ "web3-core": "1.0.0-beta.54",
19804+ "web3-core-helpers": "1.0.0-beta.54",
19805+ "web3-core-method": "1.0.0-beta.54",
19806+ "web3-providers": "1.0.0-beta.54",
19807+ "web3-utils": "1.0.0-beta.54"
19808+ },
19809+ "dependencies": {
19810+ "@babel/runtime": {
19811+ "version": "7.4.4",
19812+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz",
19813+ "integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==",
19814+ "requires": {
19815+ "regenerator-runtime": "^0.13.2"
19816+ }
1965219817 },
19653− "websocket": {
19654− "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2",
19655− "from": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2",
19818+ "eth-lib": {
19819+ "version": "0.2.8",
19820+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
19821+ "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
1965619822 "requires": {
19657− "debug": "^2.2.0",
19658− "nan": "^2.3.3"
19823+ "bn.js": "^4.11.6",
19824+ "elliptic": "^6.4.0",
19825+ "xhr-request-promise": "^0.1.2"
19826+ }
19827+ },
19828+ "regenerator-runtime": {
19829+ "version": "0.13.2",
19830+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
19831+ "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA=="
19832+ },
19833+ "web3-utils": {
19834+ "version": "1.0.0-beta.54",
19835+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.54.tgz",
19836+ "integrity": "sha512-yb/cjzjTU99P/9bEaAnb6cjqGjyMUF0OmjD7/ix89IfcDhBJ3jExSuClTAKU8Hz9Rf7IXLiXqBny9W8PdogwmQ==",
19837+ "requires": {
19838+ "@babel/runtime": "^7.3.1",
19839+ "@types/bn.js": "^4.11.4",
19840+ "@types/node": "^10.12.18",
19841+ "bn.js": "4.11.8",
19842+ "eth-lib": "0.2.8",
19843+ "ethjs-unit": "^0.1.6",
19844+ "lodash": "^4.17.11",
19845+ "number-to-bn": "1.7.0",
19846+ "randomhex": "0.1.5",
19847+ "utf8": "2.1.1"
19848+ }
19849+ }
19850+ }
19851+ },
19852+ "web3-eth-contract": {
19853+ "version": "1.0.0-beta.54",
19854+ "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.54.tgz",
19855+ "integrity": "sha512-on5LfhA3041VKo1wIlA16HeNIyy+JkyoM/lTLOPHMueD2b+4+USFh+x8rKE4LNrtvjq4wE8+emxLmHrRez459Q==",
19856+ "requires": {
19857+ "@babel/runtime": "^7.3.1",
19858+ "@types/bn.js": "^4.11.4",
19859+ "lodash": "^4.17.11",
19860+ "web3-core": "1.0.0-beta.54",
19861+ "web3-core-helpers": "1.0.0-beta.54",
19862+ "web3-core-method": "1.0.0-beta.54",
19863+ "web3-core-subscriptions": "1.0.0-beta.54",
19864+ "web3-eth-abi": "1.0.0-beta.54",
19865+ "web3-eth-accounts": "1.0.0-beta.54",
19866+ "web3-providers": "1.0.0-beta.54",
19867+ "web3-utils": "1.0.0-beta.54"
19868+ },
19869+ "dependencies": {
19870+ "@babel/runtime": {
19871+ "version": "7.4.4",
19872+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz",
19873+ "integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==",
19874+ "requires": {
19875+ "regenerator-runtime": "^0.13.2"
19876+ }
19877+ },
19878+ "eth-lib": {
19879+ "version": "0.2.8",
19880+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
19881+ "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
19882+ "requires": {
19883+ "bn.js": "^4.11.6",
19884+ "elliptic": "^6.4.0",
19885+ "xhr-request-promise": "^0.1.2"
19886+ }
19887+ },
19888+ "regenerator-runtime": {
19889+ "version": "0.13.2",
19890+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
19891+ "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA=="
19892+ },
19893+ "web3-utils": {
19894+ "version": "1.0.0-beta.54",
19895+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.54.tgz",
19896+ "integrity": "sha512-yb/cjzjTU99P/9bEaAnb6cjqGjyMUF0OmjD7/ix89IfcDhBJ3jExSuClTAKU8Hz9Rf7IXLiXqBny9W8PdogwmQ==",
19897+ "requires": {
19898+ "@babel/runtime": "^7.3.1",
19899+ "@types/bn.js": "^4.11.4",
19900+ "@types/node": "^10.12.18",
19901+ "bn.js": "4.11.8",
19902+ "eth-lib": "0.2.8",
19903+ "ethjs-unit": "^0.1.6",
19904+ "lodash": "^4.17.11",
19905+ "number-to-bn": "1.7.0",
19906+ "randomhex": "0.1.5",
19907+ "utf8": "2.1.1"
19908+ }
19909+ }
19910+ }
19911+ },
19912+ "web3-eth-ens": {
19913+ "version": "1.0.0-beta.54",
19914+ "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.0.0-beta.54.tgz",
19915+ "integrity": "sha512-YXdBq7qB0Hfp3+FZKwsUOkHxcM0F0mGDNSEhjVrfuJy7+S+qKA4/gXVMoUA3z+M0TbygtHr7cgY0ayz/n8s3BQ==",
19916+ "requires": {
19917+ "@babel/runtime": "^7.3.1",
19918+ "eth-ens-namehash": "2.0.8",
19919+ "lodash": "^4.17.11",
19920+ "web3-core": "1.0.0-beta.54",
19921+ "web3-core-helpers": "1.0.0-beta.54",
19922+ "web3-core-method": "1.0.0-beta.54",
19923+ "web3-eth-abi": "1.0.0-beta.54",
19924+ "web3-eth-contract": "1.0.0-beta.54",
19925+ "web3-net": "1.0.0-beta.54",
19926+ "web3-providers": "1.0.0-beta.54",
19927+ "web3-utils": "1.0.0-beta.54"
19928+ },
19929+ "dependencies": {
19930+ "@babel/runtime": {
19931+ "version": "7.4.4",
19932+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz",
19933+ "integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==",
19934+ "requires": {
19935+ "regenerator-runtime": "^0.13.2"
19936+ }
19937+ },
19938+ "eth-lib": {
19939+ "version": "0.2.8",
19940+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
19941+ "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
19942+ "requires": {
19943+ "bn.js": "^4.11.6",
19944+ "elliptic": "^6.4.0",
19945+ "xhr-request-promise": "^0.1.2"
19946+ }
19947+ },
19948+ "regenerator-runtime": {
19949+ "version": "0.13.2",
19950+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
19951+ "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA=="
19952+ },
19953+ "web3-utils": {
19954+ "version": "1.0.0-beta.54",
19955+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.54.tgz",
19956+ "integrity": "sha512-yb/cjzjTU99P/9bEaAnb6cjqGjyMUF0OmjD7/ix89IfcDhBJ3jExSuClTAKU8Hz9Rf7IXLiXqBny9W8PdogwmQ==",
19957+ "requires": {
19958+ "@babel/runtime": "^7.3.1",
19959+ "@types/bn.js": "^4.11.4",
19960+ "@types/node": "^10.12.18",
19961+ "bn.js": "4.11.8",
19962+ "eth-lib": "0.2.8",
19963+ "ethjs-unit": "^0.1.6",
19964+ "lodash": "^4.17.11",
19965+ "number-to-bn": "1.7.0",
19966+ "randomhex": "0.1.5",
19967+ "utf8": "2.1.1"
19968+ }
19969+ }
19970+ }
19971+ },
19972+ "web3-eth-iban": {
19973+ "version": "1.0.0-beta.54",
19974+ "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.54.tgz",
19975+ "integrity": "sha512-wgPP7KFb3zKOk7FAeRCcUkGryqRPvPL38eMWNlsqcwcrq3Hmj/wdVSnARYed7Xg0pcagabSyaPtEGuHnxCmtRg==",
19976+ "requires": {
19977+ "@babel/runtime": "^7.3.1",
19978+ "bn.js": "4.11.8",
19979+ "web3-utils": "1.0.0-beta.54"
19980+ },
19981+ "dependencies": {
19982+ "@babel/runtime": {
19983+ "version": "7.4.4",
19984+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz",
19985+ "integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==",
19986+ "requires": {
19987+ "regenerator-runtime": "^0.13.2"
19988+ }
19989+ },
19990+ "eth-lib": {
19991+ "version": "0.2.8",
19992+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
19993+ "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
19994+ "requires": {
19995+ "bn.js": "^4.11.6",
19996+ "elliptic": "^6.4.0",
19997+ "xhr-request-promise": "^0.1.2"
19998+ }
19999+ },
20000+ "regenerator-runtime": {
20001+ "version": "0.13.2",
20002+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
20003+ "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA=="
20004+ },
20005+ "web3-utils": {
20006+ "version": "1.0.0-beta.54",
20007+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.54.tgz",
20008+ "integrity": "sha512-yb/cjzjTU99P/9bEaAnb6cjqGjyMUF0OmjD7/ix89IfcDhBJ3jExSuClTAKU8Hz9Rf7IXLiXqBny9W8PdogwmQ==",
20009+ "requires": {
20010+ "@babel/runtime": "^7.3.1",
20011+ "@types/bn.js": "^4.11.4",
20012+ "@types/node": "^10.12.18",
20013+ "bn.js": "4.11.8",
20014+ "eth-lib": "0.2.8",
20015+ "ethjs-unit": "^0.1.6",
20016+ "lodash": "^4.17.11",
20017+ "number-to-bn": "1.7.0",
20018+ "randomhex": "0.1.5",
20019+ "utf8": "2.1.1"
20020+ }
20021+ }
20022+ }
20023+ },
20024+ "web3-eth-personal": {
20025+ "version": "1.0.0-beta.54",
20026+ "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.54.tgz",
20027+ "integrity": "sha512-bnKbNXgo5lInir8FQ0cyL/55e/vq3xWBNw//fAvUCPKLgL+PQ9eGhr6ftApJTpxapAgMIEHzpP3rjtfLC5djWQ==",
20028+ "requires": {
20029+ "@babel/runtime": "^7.3.1",
20030+ "web3-core": "1.0.0-beta.54",
20031+ "web3-core-helpers": "1.0.0-beta.54",
20032+ "web3-core-method": "1.0.0-beta.54",
20033+ "web3-eth-accounts": "1.0.0-beta.54",
20034+ "web3-net": "1.0.0-beta.54",
20035+ "web3-providers": "1.0.0-beta.54",
20036+ "web3-utils": "1.0.0-beta.54"
20037+ },
20038+ "dependencies": {
20039+ "@babel/runtime": {
20040+ "version": "7.4.4",
20041+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz",
20042+ "integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==",
20043+ "requires": {
20044+ "regenerator-runtime": "^0.13.2"
20045+ }
20046+ },
20047+ "eth-lib": {
20048+ "version": "0.2.8",
20049+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
20050+ "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
20051+ "requires": {
20052+ "bn.js": "^4.11.6",
20053+ "elliptic": "^6.4.0",
20054+ "xhr-request-promise": "^0.1.2"
20055+ }
20056+ },
20057+ "regenerator-runtime": {
20058+ "version": "0.13.2",
20059+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
20060+ "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA=="
20061+ },
20062+ "web3-utils": {
20063+ "version": "1.0.0-beta.54",
20064+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.54.tgz",
20065+ "integrity": "sha512-yb/cjzjTU99P/9bEaAnb6cjqGjyMUF0OmjD7/ix89IfcDhBJ3jExSuClTAKU8Hz9Rf7IXLiXqBny9W8PdogwmQ==",
20066+ "requires": {
20067+ "@babel/runtime": "^7.3.1",
20068+ "@types/bn.js": "^4.11.4",
20069+ "@types/node": "^10.12.18",
20070+ "bn.js": "4.11.8",
20071+ "eth-lib": "0.2.8",
20072+ "ethjs-unit": "^0.1.6",
20073+ "lodash": "^4.17.11",
20074+ "number-to-bn": "1.7.0",
20075+ "randomhex": "0.1.5",
20076+ "utf8": "2.1.1"
20077+ }
20078+ }
20079+ }
20080+ },
20081+ "web3-net": {
20082+ "version": "1.0.0-beta.54",
20083+ "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.0.0-beta.54.tgz",
20084+ "integrity": "sha512-3YjdjHvUpitGDs3b+g9HfzWQdd6fd1mpHDCLgBJQUykKgjwxgkEbb0Dm7vqQMSggLm6W37LV2xBQjIOMmYsA/Q==",
20085+ "requires": {
20086+ "@babel/runtime": "^7.3.1",
20087+ "lodash": "^4.17.11",
20088+ "web3-core": "1.0.0-beta.54",
20089+ "web3-core-helpers": "1.0.0-beta.54",
20090+ "web3-core-method": "1.0.0-beta.54",
20091+ "web3-providers": "1.0.0-beta.54",
20092+ "web3-utils": "1.0.0-beta.54"
20093+ },
20094+ "dependencies": {
20095+ "@babel/runtime": {
20096+ "version": "7.4.4",
20097+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz",
20098+ "integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==",
20099+ "requires": {
20100+ "regenerator-runtime": "^0.13.2"
20101+ }
20102+ },
20103+ "eth-lib": {
20104+ "version": "0.2.8",
20105+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
20106+ "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
20107+ "requires": {
20108+ "bn.js": "^4.11.6",
20109+ "elliptic": "^6.4.0",
20110+ "xhr-request-promise": "^0.1.2"
20111+ }
20112+ },
20113+ "regenerator-runtime": {
20114+ "version": "0.13.2",
20115+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
20116+ "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA=="
20117+ },
20118+ "web3-utils": {
20119+ "version": "1.0.0-beta.54",
20120+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.54.tgz",
20121+ "integrity": "sha512-yb/cjzjTU99P/9bEaAnb6cjqGjyMUF0OmjD7/ix89IfcDhBJ3jExSuClTAKU8Hz9Rf7IXLiXqBny9W8PdogwmQ==",
20122+ "requires": {
20123+ "@babel/runtime": "^7.3.1",
20124+ "@types/bn.js": "^4.11.4",
20125+ "@types/node": "^10.12.18",
20126+ "bn.js": "4.11.8",
20127+ "eth-lib": "0.2.8",
20128+ "ethjs-unit": "^0.1.6",
20129+ "lodash": "^4.17.11",
20130+ "number-to-bn": "1.7.0",
20131+ "randomhex": "0.1.5",
20132+ "utf8": "2.1.1"
20133+ }
20134+ }
20135+ }
20136+ },
20137+ "web3-providers": {
20138+ "version": "1.0.0-beta.54",
20139+ "resolved": "https://registry.npmjs.org/web3-providers/-/web3-providers-1.0.0-beta.54.tgz",
20140+ "integrity": "sha512-P55MQHkfU2VLt3t+3IbqRUVwOziLOMiXxKulVYXzTu9M8p9aogl1tvPjKXpRUGygCY3LsWTpt/UlJR8Aaia+CQ==",
20141+ "requires": {
20142+ "@babel/runtime": "^7.3.1",
20143+ "@types/node": "^10.12.18",
20144+ "eventemitter3": "3.1.0",
20145+ "lodash": "^4.17.11",
20146+ "url-parse": "1.4.4",
20147+ "websocket": "^1.0.28",
20148+ "xhr2-cookies": "1.1.0"
20149+ },
20150+ "dependencies": {
20151+ "@babel/runtime": {
20152+ "version": "7.4.4",
20153+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz",
20154+ "integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==",
20155+ "requires": {
20156+ "regenerator-runtime": "^0.13.2"
20157+ }
20158+ },
20159+ "regenerator-runtime": {
20160+ "version": "0.13.2",
20161+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
20162+ "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA=="
20163+ }
20164+ }
20165+ },
20166+ "web3-shh": {
20167+ "version": "1.0.0-beta.54",
20168+ "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.0.0-beta.54.tgz",
20169+ "integrity": "sha512-YO+sMZ3szof0wTZ+Lh43mkioVGSLhDH2paGzcBB7JM8PoZ9QbuLquNypiM3XWfehNusCQmEGvq0R0nVZe/Juaw==",
20170+ "requires": {
20171+ "@babel/runtime": "^7.3.1",
20172+ "web3-core": "1.0.0-beta.54",
20173+ "web3-core-helpers": "1.0.0-beta.54",
20174+ "web3-core-method": "1.0.0-beta.54",
20175+ "web3-core-subscriptions": "1.0.0-beta.54",
20176+ "web3-net": "1.0.0-beta.54",
20177+ "web3-providers": "1.0.0-beta.54",
20178+ "web3-utils": "1.0.0-beta.54"
20179+ },
20180+ "dependencies": {
20181+ "@babel/runtime": {
20182+ "version": "7.4.4",
20183+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz",
20184+ "integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==",
20185+ "requires": {
20186+ "regenerator-runtime": "^0.13.2"
20187+ }
20188+ },
20189+ "eth-lib": {
20190+ "version": "0.2.8",
20191+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
20192+ "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
20193+ "requires": {
20194+ "bn.js": "^4.11.6",
20195+ "elliptic": "^6.4.0",
20196+ "xhr-request-promise": "^0.1.2"
20197+ }
20198+ },
20199+ "regenerator-runtime": {
20200+ "version": "0.13.2",
20201+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
20202+ "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA=="
20203+ },
20204+ "web3-utils": {
20205+ "version": "1.0.0-beta.54",
20206+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.54.tgz",
20207+ "integrity": "sha512-yb/cjzjTU99P/9bEaAnb6cjqGjyMUF0OmjD7/ix89IfcDhBJ3jExSuClTAKU8Hz9Rf7IXLiXqBny9W8PdogwmQ==",
20208+ "requires": {
20209+ "@babel/runtime": "^7.3.1",
20210+ "@types/bn.js": "^4.11.4",
20211+ "@types/node": "^10.12.18",
20212+ "bn.js": "4.11.8",
20213+ "eth-lib": "0.2.8",
20214+ "ethjs-unit": "^0.1.6",
20215+ "lodash": "^4.17.11",
20216+ "number-to-bn": "1.7.0",
20217+ "randomhex": "0.1.5",
20218+ "utf8": "2.1.1"
1965920219 }
1966020220 }
1966120221 }
@@ -20365,6 +20925,17 @@
2036520925 }
2036620926 }
2036720927 },
20928+ "websocket": {
20929+ "version": "1.0.28",
20930+ "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.28.tgz",
20931+ "integrity": "sha512-00y/20/80P7H4bCYkzuuvvfDvh+dgtXi5kzDf3UcZwN6boTYaKvsrtZ5lIYm1Gsg48siMErd9M4zjSYfYFHTrA==",
20932+ "requires": {
20933+ "debug": "^2.2.0",
20934+ "nan": "^2.11.0",
20935+ "typedarray-to-buffer": "^3.1.5",
20936+ "yaeti": "^0.0.6"
20937+ }
20938+ },
2036820939 "websocket-driver": {
2036920940 "version": "0.7.0",
2037020941 "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
@@ -20733,10 +21304,13 @@
2073321304 "xhr-request": "^1.0.1"
2073421305 }
2073521306 },
20736− "xhr2": {
20737− "version": "0.1.4",
20738− "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz",
20739− "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8="
21307+ "xhr2-cookies": {
21308+ "version": "1.1.0",
21309+ "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz",
21310+ "integrity": "sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=",
21311+ "requires": {
21312+ "cookiejar": "^2.1.1"
21313+ }
2074021314 },
2074121315 "xml-name-validator": {
2074221316 "version": "3.0.0",
@@ -20748,6 +21322,11 @@
2074821322 "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-1.3.1.tgz",
2074921323 "integrity": "sha512-tGkGJkN8XqCod7OT+EvGYK5Z4SfDQGD30zAa58OcnAa0RRWgzUEK72tkXhsX1FZd+rgnhRxFtmO+ihkp8LHSkw=="
2075021324 },
21325+ "xmlhttprequest": {
21326+ "version": "1.8.0",
21327+ "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
21328+ "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw="
21329+ },
2075121330 "xregexp": {
2075221331 "version": "4.0.0",
2075321332 "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz",
@@ -20763,6 +21342,11 @@
2076321342 "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
2076421343 "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
2076521344 },
21345+ "yaeti": {
21346+ "version": "0.0.6",
21347+ "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz",
21348+ "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc="
21349+ },
2076621350 "yallist": {
2076721351 "version": "2.1.2",
2076821352 "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
package.json+2−2
@@ -45,7 +45,7 @@
4545 "trezor-connect": "^7.0.1",
4646 "urbit-key-generation": "0.12.1",
4747 "urbit-ob": "^3.1.0",
48− "web3": "1.0.0-beta.33",
48+ "web3": "1.0.0-beta.54",
4949 "web3-utils": "^1.0.0-beta.52"
5050 },
5151 "scripts": {
@@ -56,7 +56,7 @@
5656 "checksum": "cd build && find . -exec shasum -a256 {} ';' > ../checksums.txt && cd ..",
5757 "zip": "zip -ur bridge-$npm_package_version.zip README.md bridge-https.py checksums.txt && cd build && zip -ur ../bridge-$npm_package_version.zip ./* && cd ..",
5858 "release": "npm install && npm run build && npm run checksum && npm run zip",
59− "pilot:ganache": "ganache-cli --blockTime 1 -m 'benefit crew supreme gesture quantum web media hazard theory mercy wing kitten' > /dev/null &",
59+ "pilot:ganache": "ganache-cli --blockTime 1 --networkId 1 -m 'benefit crew supreme gesture quantum web media hazard theory mercy wing kitten' > /dev/null &",
6060 "pilot:deploy": "cd node_modules/azimuth-solidity && truffle deploy",
6161 "pilot:setup": "npm run pilot:ganache && npm run pilot:deploy",
6262 "pilot": "HTTPS=true npm-run-all pilot:setup start pilot:cleanup --continue-on-error",
src/bridge/Bridge.js+7−4
@@ -18,7 +18,7 @@ import { BRIDGE_ERROR } from './lib/error'
1818const initWeb3 = (networkType) => {
1919 if (networkType === NETWORK_NAMES.MAINNET) {
2020 const endpoint =
21− `https://mainnet.infura.io/v3/${process.env.REACT_APP_INFURA_KEY}`
21+ `https://mainnet.infura.io/v3/${process.env.REACT_APP_INFURA_ENDPOINT}`
2222
2323 const provider = new Web3.providers.HttpProvider(endpoint)
2424 const web3 = new Web3(provider)
@@ -251,9 +251,12 @@ class Bridge extends React.Component {
251251 }
252252
253253 setTxnConfirmations(txnHash, txnConfirmations) {
254− this.setState((prevState, _) =>
255− ({txnConfirmations: { ...prevState.txnConfirmations,
256− [txnHash]: txnConfirmations}}))
254+ this.setState((prevState, _) => {
255+ return prevState.routeCrumbs.peek() === ROUTE_NAMES.SENT_TRANSACTION
256+ ? {txnConfirmations: { ...prevState.txnConfirmations,
257+ [txnHash]: txnConfirmations}}
258+ : null
259+ })
257260 }
258261
259262 render() {
src/bridge/components/Base.js+5
@@ -38,6 +38,9 @@ import DropdownItem from './DropdownItem';
3838import DropdownDivider from './DropdownDivider';
3939import InnerLabelDropdown from './InnerLabelDropdown';
4040
41+// Option selectors
42+import HorizontalSelector from './HorizontalSelector';
43+
4144// Path Control
4245import Breadcrumb from './Breadcrumb';
4346import BreadcrumbItem from './BreadcrumbItem';
@@ -205,6 +208,8 @@ export {
205208 DropdownDivider,
206209 InnerLabelDropdown,
207210
211+ HorizontalSelector,
212+
208213 Breadcrumb,
209214 BreadcrumbItem,
210215
src/bridge/components/HorizontalSelector.jsnew file+57
@@ -0,0 +1,57 @@
1+import React from 'react'
2+import PropTypes from 'prop-types';
3+
4+class HorizontalSelector extends React.Component {
5+ constructor(props) {
6+ super(props);
7+
8+ this.state = {
9+ option: this.props.options[0].value
10+ };
11+
12+ this.selectOption = this.selectOption.bind(this);
13+ }
14+
15+ selectOption(opt) {
16+ this.props.onChange(opt);
17+ this.setState({option: opt});
18+ }
19+
20+ getOptionElems() {
21+ return this.props.options.map(opt => {
22+ let active = (opt.value === this.state.option)
23+ ? 'btn-primary active'
24+ : '';
25+ return (
26+ <button
27+ className={`btn ${active} h-10 ph-4 flex sans ${this.props.className}`}
28+ value={opt.value}
29+ onClick={() => this.selectOption(opt.value)}>
30+ { opt.title }
31+ </button>
32+ )
33+ })
34+ }
35+
36+ render() {
37+ const optionElems = this.getOptionElems();
38+
39+ return (
40+ <div className='btn-group'>
41+ { optionElems }
42+ </div>
43+ )
44+ }
45+}
46+
47+HorizontalSelector.propTypes = {
48+ className: PropTypes.string,
49+ options: PropTypes.array
50+};
51+
52+HorizontalSelector.defaultProps = {
53+ className: '',
54+ options: []
55+};
56+
57+export default HorizontalSelector
src/bridge/components/InnerLabelDropdown.js+2−2
@@ -62,14 +62,14 @@ class InnerLabelDropdown extends React.Component {
6262 const fullWidthClass = props.fullWidth ? 'full-width' : ''
6363
6464 return (
65− <div className={`rel table ${fullWidthClass}`}>
65+ <div className={`rel table ${fullWidthClass} ${props.className}`}>
6666 <div
6767 className={`fix full o-0 ${menuVisibility}`}
6868 onClick={this.close}
6969 />
7070
7171 <button
72− className={`h-10 mp-0 bg-white outline-blue sans ${props.className} ${fullWidthClass}`}
72+ className={`h-10 mp-0 bg-white outline-blue sans ${fullWidthClass}`}
7373 onClick={this.toggle}
7474 disabled={props.disabled}>
7575 <div className={'flex'}>
src/bridge/components/StatelessTransaction.js+126−40
@@ -1,4 +1,5 @@
11import { Nothing, Just } from 'folktale/maybe'
2+import { Ok } from 'folktale/result'
23import React from 'react'
34
45import { Code, H3 } from './Base'
@@ -10,14 +11,25 @@ import { Warning } from '../components/Base'
1011import { addressFromSecp256k1Public } from '../lib/wallet'
1112import { BRIDGE_ERROR } from '../lib/error'
1213import { ROUTE_NAMES } from '../lib/router'
14+import * as tank from '../lib/tank'
1315
1416import {
1517 sendSignedTransaction,
18+ waitForTransactionConfirm,
1619 fromWei,
20+ toWei,
21+ hexify,
1722 renderSignedTx,
1823 signTransaction
1924 } from '../lib/txn'
2025
26+const SUBMISSION_STATES = {
27+ PROMPT: 'Send transaction',
28+ PREPARING: 'Preparing...',
29+ FUNDING: 'Finding transaction funding...',
30+ SENDING: 'Sending transaction...'
31+};
32+
2133class StatelessTransaction extends React.Component {
2234
2335 constructor(props) {
@@ -33,11 +45,11 @@ class StatelessTransaction extends React.Component {
3345 nonce: '0',
3446 stx: Nothing(),
3547 txn: Nothing(),
48+ txStatus: SUBMISSION_STATES.PROMPT,
3649 txError: Nothing()
3750 }
3851
3952 this.createUnsignedTxn = this.createUnsignedTxn.bind(this)
40− this.submit = this.submit.bind(this)
4153 this.setUserApproval = this.setUserApproval.bind(this)
4254 this.setTxn = this.setTxn.bind(this)
4355 this.setStx = this.setStx.bind(this)
@@ -86,32 +98,6 @@ class StatelessTransaction extends React.Component {
8698 });
8799 }
88100
89− submit(){
90− const { props, state } = this
91− sendSignedTransaction(props.web3.value, state.stx, props.setTxnConfirmations)
92− .then(sent => {
93− props.setTxnHashCursor(sent)
94− props.popRoute()
95−
96− let routeData = {};
97− if (props.networkSeed) {
98− props.setNetworkSeedCache(props.networkSeed);
99− routeData.promptKeyfile = true;
100− }
101− if (props.promptText) {
102− routeData.promptText = props.promptText;
103− }
104− props.pushRoute(ROUTE_NAMES.SENT_TRANSACTION, routeData);
105− })
106− .catch(err => {
107− if (err.map) {
108− this.setState({ txError: err.map(val => val.merge()) })
109− } else {
110− this.setState({ txError: err })
111− }
112− })
113− }
114−
115101 handleChainUpdate(chainId) {
116102 if (chainId === "custom") {
117103 this.setState({
@@ -194,16 +180,114 @@ class StatelessTransaction extends React.Component {
194180 })
195181 }
196182
197− // TODO: Investigate
198− // setState doesn't seem to work in SetProxy/submit;
199− // - TypeError: Cannot read property 'updater' of undefined
200− // so just modifying the DOM manually here. (https://imgur.com/a/i0Qsyq1)
183+ async sendTxn() {
184+ const { props, state } = this;
185+ const web3 = props.web3.value;
201186
202− sendTxn(e) {
203− e.target.setAttribute("disabled", true);
204− let spinner = e.target.querySelectorAll('.btn-spinner')[0];
205− spinner.classList.remove('hide');
206− this.submit()
187+ const stx = state.stx.matchWith({
188+ Just: tx => tx.value,
189+ Nothing: () => {
190+ throw BRIDGE_ERROR.MISSING_TXN;
191+ }
192+ });
193+
194+ if (props.beforeSend) {
195+ try {
196+ this.setState({ txStatus: SUBMISSION_STATES.PREPARING });
197+ const res = await props.beforeSend(stx);
198+ if (res === false) throw 'beforeSend disallowed sending';
199+ } catch (e) {
200+ console.log('beforeSend error', e);
201+ this.setState({
202+ txStatus: SUBMISSION_STATES.PROMPT,
203+ txError: Just('Something went wrong!')
204+ });
205+ return;
206+ }
207+ }
208+
209+ this.setState({ txStatus: SUBMISSION_STATES.FUNDING });
210+
211+ const rawTx = hexify(stx.serialize());
212+ const cost = (state.gasLimit * toWei(state.gasPrice, 'gwei'));
213+
214+ //TODO need a lib function or something for address=, it's everywhere
215+ const address = props.wallet.matchWith({
216+ Just: wal => addressFromSecp256k1Public(wal.value.publicKey),
217+ Nothing: () => {
218+ throw BRIDGE_ERROR.MISSING_WALLET
219+ }
220+ });
221+ let balance = await web3.eth.getBalance(address);
222+ let hasBalance = (balance >= cost);
223+
224+ let usedTank = false;
225+ // if we need to, try and fund the transaction
226+ if (!hasBalance) {
227+ hasBalance = await this.ensureFundsFor(web3, address, cost, [rawTx]);
228+ usedTank = hasBalance;
229+ }
230+
231+ // if we still don't have sufficient balance, fail and tell the user
232+ if (!hasBalance) {
233+ this.setState({
234+ txStatus: SUBMISSION_STATES.PROMPT,
235+ txError: Just(`Insufficient funds.
236+ Address ${address} needs at least ${fromWei(cost.toString())} ETH,
237+ currently has ${fromWei(balance.toString())} ETH.`
238+ )
239+ });
240+
241+ // if we have the balance, proceed with submission
242+ } else {
243+ this.setState({ txStatus: SUBMISSION_STATES.SENDING });
244+
245+ sendSignedTransaction(
246+ web3,
247+ state.stx,
248+ usedTank,
249+ props.setTxnConfirmations
250+ )
251+ .then(txHash => {
252+ props.onSent(Just(Ok(txHash)), state.stx.value);
253+ props.popRoute();
254+
255+ let routeData = {};
256+ if (props.networkSeed) {
257+ props.setNetworkSeedCache(props.networkSeed);
258+ routeData.promptKeyfile = true;
259+ }
260+ props.pushRoute(ROUTE_NAMES.SENT_TRANSACTION, routeData);
261+ })
262+ .catch(err => {
263+ this.setState({
264+ txStatus: SUBMISSION_STATES.PROMPT,
265+ txError: Just(err)
266+ });
267+ });
268+ }
269+ }
270+
271+ //TODO partially copied from InviteTransactions, try to move into tank lib
272+ async ensureFundsFor(web3, address, cost, signedTxs) {
273+ let balance = await web3.eth.getBalance(address);
274+ if (cost > balance) {
275+ try {
276+
277+ const res = await tank.fundTransactions(signedTxs);
278+ if (!res.success) {
279+ return false;
280+ } else {
281+ await waitForTransactionConfirm(web3, res.txHash);
282+ return true;
283+ }
284+
285+ } catch (e) {
286+ return false;
287+ }
288+ } else {
289+ return true;
290+ }
207291 }
208292
209293 getChainTitle(chainId) {
@@ -249,7 +333,7 @@ class StatelessTransaction extends React.Component {
249333 const { web3, canGenerate } = this.props
250334 const { gasPrice, gasLimit, nonce, chainId,
251335 txn, stx, userApproval, showGasDetails,
252− customChain } = this.state
336+ customChain, txStatus } = this.state
253337
254338 const { setNonce, setChainId, setGasLimit, setGasPrice, toggleGasDetails,
255339 setUserApproval, sendTxn, createUnsignedTxn, handleChainUpdate } = this
@@ -439,16 +523,18 @@ class StatelessTransaction extends React.Component {
439523 </div>
440524 </CheckboxButton>
441525
526+ const sending = (txStatus !== SUBMISSION_STATES.PROMPT);
527+ const sendTxnSpinner = sending ? '' : 'hide';
442528 const sendTxnButton =
443529 <Button
444530 prop-size={ 'xl wide' }
445531 className={ 'mt-8' }
446− disabled={ !canSend }
532+ disabled={ !canSend || sending }
447533 onClick={ sendTxn }
448534 >
449535 <span className="relative">
450− <span className="btn-spinner hide"></span>
451− { 'Send Transaction' }
536+ <span className={`btn-spinner ${sendTxnSpinner}`}></span>
537+ { txStatus }
452538 </span>
453539 </Button>
454540
src/bridge/lib/ledger.js+4−2
@@ -1,7 +1,8 @@
11import Transport from '@ledgerhq/hw-transport-u2f'
22import Eth from '@ledgerhq/hw-app-eth'
33
4−const LEDGER_BASE_PATH = "44'/60'/0'/0/0"
4+const LEDGER_LEGACY_PATH = "m/44'/60'/0'/x"
5+const LEDGER_LIVE_PATH = "m/44'/60'/x'/0/0"
56
67const chopHdPrefix = str =>
78 str.slice(0, 2) === "m/"
@@ -24,6 +25,7 @@ const ledgerSignTransaction = async (txn, hdpath) => {
2425}
2526
2627export {
27− LEDGER_BASE_PATH,
28+ LEDGER_LIVE_PATH,
29+ LEDGER_LEGACY_PATH,
2830 ledgerSignTransaction
2931}
src/bridge/lib/tank.js+1
@@ -26,6 +26,7 @@ function sendRequest(where, what) {
2626}
2727
2828const remainingTransactions = point => {
29+ if (typeof point === 'string') point = Number(point);
2930 return sendRequest('/point', {point:point});
3031};
3132
src/bridge/lib/trezor.js+2−2
@@ -1,6 +1,6 @@
11import TrezorConnect from 'trezor-connect'
22
3−const TREZOR_BASE_PATH = "m/44'/60'/0'/0/0"
3+const TREZOR_PATH = "m/44'/60'/0'/0/x"
44
55const formatChainId = val =>
66 typeof val === 'number'
@@ -33,7 +33,7 @@ const trezorSignTransaction = async (txn, hdpath) => {
3333}
3434
3535export {
36− TREZOR_BASE_PATH,
36+ TREZOR_PATH,
3737 trezorSignTransaction
3838}
3939
src/bridge/lib/txn.js+38−21
@@ -137,32 +137,49 @@ const signTransaction = async config => {
137137 setStx(Just(stx))
138138}
139139
140−const sendSignedTransaction = (web3, stx, confirmationCb) => {
140+const sendSignedTransaction = (web3, stx, doubtNonceError, confirmationCb) => {
141141 const txn = stx.matchWith({
142142 Just: (tx) => tx.value,
143143 Nothing: () => {
144144 throw BRIDGE_ERROR.MISSING_TXN
145145 }
146− })
147−
148− const serializedTx = addHexPrefix(txn.serialize().toString('hex'))
146+ });
149147
150− return new Promise((resolve, reject) => {
151− web3.eth.sendSignedTransaction(serializedTx)
152− .on('transactionHash', hash =>
153− resolve(Just(Ok(hash)))
154− )
155− .on('receipt', txn => {
156− resolve(Just(Ok(txn.transactionHash)))
157− })
158− .on('confirmation', (confirmationNum, txn) => {
159− confirmationCb(txn.transactionHash, confirmationNum + 1)
160− resolve(Just(Ok(txn.transactionHash)))
161− })
162− .on('error', err => {
163− reject(Just(Error(err.message)))
164− })
165− })
148+ const rawTx = addHexPrefix(txn.serialize().toString('hex'));
149+
150+ return new Promise(async (resolve, reject) => {
151+ web3.eth.sendSignedTransaction(rawTx)
152+ .on('transactionHash', hash => {
153+ resolve(hash);
154+ })
155+ .on('confirmation', (confirmationNum, txn) => {
156+ confirmationCb(txn.transactionHash, confirmationNum + 1);
157+ resolve(txn.transactionHash);
158+ })
159+ .on('error', err => {
160+ // if there's a nonce error, but we used the gas tank, it's likely
161+ // that it's because the tank already submitted our transaction.
162+ // we just wait for first confirmation here.
163+ if (doubtNonceError &&
164+ err.message.includes("the tx doesn't have the correct nonce.")) {
165+ console.log('nonce error, likely from gas tank submission, ignoring');
166+ const txHash = web3.utils.keccak256(rawTx);
167+ //TODO can we do does-exists check first?
168+ //TODO max wait time before assume fail?
169+ waitForTransactionConfirm(web3, txHash)
170+ .then(res => {
171+ if (res) {
172+ resolve(txHash);
173+ confirmationCb(txHash, 1);
174+ } else {
175+ reject('Unexpected tx failure');
176+ }
177+ });
178+ } else {
179+ reject(err.message);
180+ }
181+ });
182+ });
166183}
167184
168185// returns a Promise<bool>, where the bool indicates tx success/failure
@@ -173,7 +190,7 @@ const waitForTransactionConfirm = (web3, txHash) => {
173190 const receipt = await web3.eth.getTransactionReceipt(txHash);
174191 console.log('tried, got', receipt);
175192 let confirmed = (receipt !== null);
176− if (confirmed) resolve(receipt.status === '0x1');
193+ if (confirmed) resolve(receipt.status === true);
177194 else setTimeout(checkForConfirm, 13000);
178195 }
179196 checkForConfirm();
src/bridge/lib/wallet.js+1−1
@@ -72,7 +72,7 @@ const stripHexPrefix = hex =>
7272const keccak256 = str =>
7373 keccak('keccak256').update(str).digest()
7474
75−const isValidAddress = isAddress
75+const isValidAddress = a => (('0x0' === a) || isAddress(a))
7676
7777const toChecksumAddress = (address) => {
7878 const addr = stripHexPrefix(address).toLowerCase()
src/bridge/views/AcceptTransfer.js+4−6
@@ -60,13 +60,11 @@ class AcceptTransfer extends React.Component {
6060 }
6161 })
6262
63− const owner = props.pointCache[validPoint].owner
64−
65− return Just(azimuth.ecliptic.transferFrom(
63+ return Just(azimuth.ecliptic.transferPoint(
6664 validContracts,
67− owner,
65+ validPoint,
6866 state.receivingAddress,
69− validPoint
67+ true
7068 ))
7169 }
7270
@@ -125,7 +123,7 @@ class AcceptTransfer extends React.Component {
125123 walletType={props.walletType}
126124 walletHdPath={props.walletHdPath}
127125 networkType={props.networkType}
128− setTxnHashCursor={props.setTxnHashCursor}
126+ onSent={props.setTxnHashCursor}
129127 setTxnConfirmations={props.setTxnConfirmations}
130128 popRoute={props.popRoute}
131129 pushRoute={props.pushRoute}
src/bridge/views/CancelTransfer.js+1−1
@@ -86,7 +86,7 @@ class CancelTransfer extends React.Component {
8686 walletType={props.walletType}
8787 walletHdPath={props.walletHdPath}
8888 networkType={props.networkType}
89− setTxnHashCursor={props.setTxnHashCursor}
89+ onSent={props.setTxnHashCursor}
9090 setTxnConfirmations={props.setTxnConfirmations}
9191 popRoute={props.popRoute}
9292 pushRoute={props.pushRoute}
src/bridge/views/CreateGalaxy.js+1−1
@@ -211,7 +211,7 @@ class CreateGalaxy extends React.Component {
211211 walletType={props.walletType}
212212 walletHdPath={props.walletHdPath}
213213 networkType={props.networkType}
214− setTxnHashCursor={props.setTxnHashCursor}
214+ onSent={props.setTxnHashCursor}
215215 setTxnConfirmations={props.setTxnConfirmations}
216216 popRoute={props.popRoute}
217217 pushRoute={props.pushRoute}
src/bridge/views/InvitesManage.js+1−1
@@ -176,7 +176,7 @@ class InvitesManage extends React.Component {
176176 walletType={this.props.walletType}
177177 walletHdPath={this.props.walletHdPath}
178178 networkType={this.props.networkType}
179− setTxnHashCursor={this.props.setTxnHashCursor}
179+ onSent={this.props.setTxnHashCursor}
180180 setTxnConfirmations={this.props.setTxnConfirmations}
181181 popRoute={this.props.popRoute}
182182 pushRoute={this.props.pushRoute}
src/bridge/views/InvitesSend.js+1−4
@@ -32,8 +32,6 @@ class InvitesSend extends React.Component {
3232 this.handleEmailInput = this.handleEmailInput.bind(this);
3333 this.txnConfirmation = this.txnConfirmation.bind(this);
3434 this.createUnsignedTxn = this.createUnsignedTxn.bind(this);
35−
36− this.promptText = 'The email will be sent on first confirmation. Please wait.';
3735 }
3836
3937 componentDidMount() {
@@ -191,12 +189,11 @@ class InvitesSend extends React.Component {
191189 walletType={this.props.walletType}
192190 walletHdPath={this.props.walletHdPath}
193191 networkType={this.props.networkType}
194− setTxnHashCursor={this.props.setTxnHashCursor}
195192 setTxnConfirmations={this.txnConfirmation}
193+ onSent={this.props.setTxnHashCursor}
196194 popRoute={this.props.popRoute}
197195 pushRoute={this.props.pushRoute}
198196 // Other
199− promptText={this.promptText}
200197 canGenerate={this.canGenerate()}
201198 createUnsignedTxn={this.createUnsignedTxn}
202199 ref={this.statelessRef} />
src/bridge/views/IssueChild.js+35−71
@@ -20,6 +20,15 @@ import {
2020 eqAddr
2121} from '../lib/wallet'
2222
23+const setFind = (set, pred) => {
24+ for (const e of set) {
25+ if (pred(e)) {
26+ return e
27+ }
28+ }
29+ return undefined
30+}
31+
2332class IssueChild extends React.Component {
2433 constructor(props) {
2534 super(props)
@@ -46,11 +55,12 @@ class IssueChild extends React.Component {
4655 desiredPoint: '',
4756 isAvailable: Nothing(), // use Nothing to allow attempt when offline
4857 suggestions: suggestions,
58+ validChildren: new Set(),
59+ autoComplete: ''
4960 }
5061
5162 this.handlePointInput = this.handlePointInput.bind(this)
5263 this.handleAddressInput = this.handleAddressInput.bind(this)
53− this.handleConfirmAvailability = this.handleConfirmAvailability.bind(this)
5464 this.createUnsignedTxn = this.createUnsignedTxn.bind(this)
5565 this.statelessRef = React.createRef();
5666 }
@@ -60,28 +70,11 @@ class IssueChild extends React.Component {
6070 this.statelessRef.current.clearTxn()
6171 }
6272
63− handlePointInput(desiredPoint) {
64− if (desiredPoint.length < 15) {
65− this.setState({
66− desiredPoint,
67− isAvailable: Nothing()
68− })
69− this.statelessRef.current.clearTxn()
70− }
71− }
73+ componentWillMount() {
7274
73− handleConfirmAvailability() {
74− this.confirmPointAvailability().then(r => {
75− this.setState({
76− isAvailable: r,
77− })
78− })
79−
80− }
81−
82− async confirmPointAvailability() {
8375 const { contracts } = this.props
84− const { desiredPoint } = this.state
76+ const { issuingPoint } = this.state
77+
8578
8679 const validContracts = contracts.matchWith({
8780 Just: cs => cs.value,
@@ -90,31 +83,28 @@ class IssueChild extends React.Component {
9083 }
9184 })
9285
93− if (canDecodePatp(desiredPoint) === false) {
94− return Just(false)
95− }
86+ azimuth.getUnspawnedChildren(validContracts, issuingPoint).then(ps => this.setState({ validChildren: new Set(ps.map(ob.patp)) }))
87+ }
9688
97− const point = ob.patp2dec(desiredPoint)
98− const pointSize = azimuth.getPointSize(point)
89+ handlePointInput(desiredPoint) {
90+ if (desiredPoint.length < 15) {
9991
100− const prefix = azimuth.getPrefix(point)
101− const prefixSize = azimuth.getPointSize(prefix)
92+ const suggestedPoint = setFind(this.state.validChildren, (e => e.startsWith(desiredPoint))) || ''
93+ const rendered = ' '.repeat(desiredPoint.length) + suggestedPoint.substring(desiredPoint.length)
10294
103− // NB (jtobin): this prevents galaxies from attempting to spawn planets
104− //
105− if (pointSize !== prefixSize + 1) {
106− return Just(false)
107− }
95+ const available = Just(this.state.validChildren.has(desiredPoint))
10896
109− const owner = await azimuth.getOwner(validContracts, point)
97+ this.setState({
98+ desiredPoint,
99+ isAvailable: available,
100+ autoComplete: rendered
101+ })
102+ this.statelessRef.current.clearTxn()
110103
111− if (eqAddr(owner, ETH_ZERO_ADDR)) {
112− return Just(true)
113104 }
114−
115− return Just(false)
116105 }
117106
107+
118108 createUnsignedTxn() {
119109 const { state, props } = this
120110
@@ -140,19 +130,6 @@ class IssueChild extends React.Component {
140130 return Just(txn)
141131 }
142132
143− buttonTriState() {
144− const a = this.state.isAvailable
145− if (Nothing.hasInstance(a)) return 'blue'
146− if (a.value === false) return 'yellow'
147− if (a.value === true) return 'green'
148− }
149−
150− buttonTriStateText() {
151− const a = this.state.isAvailable
152− if (Nothing.hasInstance(a)) return 'Confirm Availablility'
153− if (a.value === false) return 'Point is Not Available'
154− if (a.value === true) return 'Available'
155− }
156133
157134 validatePoint = patp => {
158135 const point = this.point
@@ -176,16 +153,13 @@ class IssueChild extends React.Component {
176153 const { props, state } = this
177154
178155 const validAddress = isValidAddress(state.receivingAddress)
179− const validPoint = canDecodePatp(state.desiredPoint)
180156
181157 const canGenerate = props.web3.matchWith({
182158 Nothing: () => {
183− return validAddress === true &&
184− validPoint === true
159+ return validAddress === true
185160 },
186161 Just: () => {
187162 return validAddress === true &&
188− validPoint === true &&
189163 state.isAvailable.value === true
190164 }
191165 })
@@ -250,6 +224,11 @@ class IssueChild extends React.Component {
250224 value={ state.desiredPoint }
251225 onChange={ this.handlePointInput }>
252226 <InnerLabel>{ 'Point to Issue' }</InnerLabel>
227+ <div
228+ style={{marginTop: '8.8rem', marginLeft: '4.6rem', fontSize: '5rem', color: '#757575', whiteSpace: 'pre-wrap'}}
229+ className='abs tl-0 mono'>
230+ { state.autoComplete }
231+ </div>
253232 <ValidatedSigil
254233 className={'tr-0 mt-05 mr-0 abs'}
255234 patp={state.desiredPoint}
@@ -279,21 +258,6 @@ class IssueChild extends React.Component {
279258 {'View on Etherscan ↗'}
280259 </Anchor>
281260
282− {
283− props.web3.matchWith({
284− Nothing: _ => <div />,
285− Just: _ =>
286− <Button
287− prop-size='lg wide'
288− prop-color={this.buttonTriState()}
289− className={'mt-8'}
290− disabled={!validPoint}
291− onClick={this.handleConfirmAvailability}>
292− {this.buttonTriStateText()}
293− </Button>
294− })
295− }
296−
297261 <StatelessTransaction
298262 // Upper scope
299263 web3={props.web3}
@@ -302,7 +266,7 @@ class IssueChild extends React.Component {
302266 walletType={props.walletType}
303267 walletHdPath={props.walletHdPath}
304268 networkType={props.networkType}
305− setTxnHashCursor={props.setTxnHashCursor}
269+ onSent={props.setTxnHashCursor}
306270 setTxnConfirmations={props.setTxnConfirmations}
307271 popRoute={props.popRoute}
308272 pushRoute={props.pushRoute}
src/bridge/views/Ledger.js+86−14
@@ -3,12 +3,12 @@ import React from 'react'
33import Maybe from 'folktale/maybe'
44import { Button } from '../components/Base'
55import { Row, Col, H1, P, H2 } from '../components/Base'
6−import { Input, InnerLabel } from '../components/Base'
6+import { Input, InnerLabel, InnerLabelDropdown } from '../components/Base'
77import Transport from '@ledgerhq/hw-transport-u2f'
88import Eth from '@ledgerhq/hw-app-eth'
99import * as secp256k1 from 'secp256k1'
1010
11−import { LEDGER_BASE_PATH } from '../lib/ledger'
11+import { LEDGER_LIVE_PATH, LEDGER_LEGACY_PATH } from '../lib/ledger'
1212import { ROUTE_NAMES } from '../lib/router'
1313
1414const chopHdPrefix = str =>
@@ -26,11 +26,32 @@ class Ledger extends React.Component {
2626 super(props)
2727
2828 this.state = {
29− hdpath: LEDGER_BASE_PATH
29+ basePath: LEDGER_LIVE_PATH,
30+ hdpath: LEDGER_LIVE_PATH.replace(/x/g, 0),
31+ account: 0
3032 }
3133
3234 this.pollDevice = this.pollDevice.bind(this)
3335 this.handleHdPathInput = this.handleHdPathInput.bind(this)
36+ this.handlePathSelection = this.handlePathSelection.bind(this);
37+ this.handleAccountSelection = this.handleAccountSelection.bind(this);
38+ this.updateHdPath = this.updateHdPath.bind(this);
39+ }
40+
41+ handlePathSelection(basePath) {
42+ this.updateHdPath(basePath, this.state.account);
43+ }
44+
45+ handleAccountSelection(account) {
46+ this.updateHdPath(this.state.basePath, account);
47+ }
48+
49+ updateHdPath(basePath, account) {
50+ let hdpath = this.state.hdpath;
51+ if (basePath !== 'custom') {
52+ hdpath = basePath.replace(/x/g, account);
53+ }
54+ this.setState({ basePath, account, hdpath });
3455 }
3556
3657 handleHdPathInput(hdpath) {
@@ -60,7 +81,66 @@ class Ledger extends React.Component {
6081
6182 render() {
6283 const { pushRoute, popRoute, wallet } = this.props
63− const { hdpath } = this.state
84+ const { basePath, hdpath, account } = this.state;
85+ const { handlePathSelection, handleAccountSelection } = this;
86+
87+ const pathOptions = [
88+ { title: 'Ledger Live',
89+ value: LEDGER_LIVE_PATH
90+ },
91+ { title: 'Ledger Legacy',
92+ value: LEDGER_LEGACY_PATH
93+ },
94+ {
95+ title: 'Custom path',
96+ value: 'custom'
97+ }
98+ ];
99+ let basePathTitle = pathOptions.find(o => (o.value === basePath)).title;
100+
101+ let accountOptions = [];
102+ for (let i = 0; i < 20; i++) {
103+ accountOptions.push({
104+ title: 'Account #' + (i+1),
105+ value: i
106+ });
107+ }
108+ let accountTitle = accountOptions.find(o => (o.value === account)).title;
109+
110+ const basePathSelection = (
111+ <InnerLabelDropdown
112+ className='mt-8'
113+ options={pathOptions}
114+ handleUpdate={handlePathSelection}
115+ title={'Derivation path'}
116+ currentSelectionTitle={basePathTitle}
117+ fullWidth={true}
118+ >
119+ </InnerLabelDropdown>
120+ );
121+
122+ const truePathSelection = (basePath === 'custom')
123+ ? ( <Input
124+ className='pt-8 mt-4 text-mono'
125+ prop-size='md'
126+ prop-format='innerLabel'
127+ name='hdpath'
128+ value={ addHdPrefix(hdpath) }
129+ autocomplete='off'
130+ onChange={ this.handleHdPathInput }>
131+ <InnerLabel>{'HD Path'}</InnerLabel>
132+ </Input> )
133+ : ( <InnerLabelDropdown
134+ className='mt-4'
135+ prop-size='md'
136+ prop-format='innerLabel'
137+ options={accountOptions}
138+ handleUpdate={handleAccountSelection}
139+ title={'Account'}
140+ currentSelectionTitle={accountTitle}
141+ fullWidth={true}
142+ >
143+ </InnerLabelDropdown> );
64144
65145 return (
66146
@@ -99,16 +179,8 @@ class Ledger extends React.Component {
99179 <li className={'mt-4'}>{'Run '}<code>{'python bridge-https.py'}</code></li>
100180 </ol>
101181
102− <Input
103− className='pt-8 mt-8 text-mono'
104− prop-size='md'
105− prop-format='innerLabel'
106− name='hdpath'
107− value={ addHdPrefix(hdpath) }
108− autocomplete='off'
109− onChange={ this.handleHdPathInput }>
110− <InnerLabel>{'HD Path'}</InnerLabel>
111− </Input>
182+ { basePathSelection }
183+ { truePathSelection }
112184
113185 <Button
114186 prop-size={'wide lg'}
src/bridge/views/Network.js+2−2
@@ -36,7 +36,7 @@ class Network extends React.Component {
3636 setNetworkType(network)
3737
3838 const endpoint =
39− `https://ropsten.infura.io/v3/${process.env.REACT_APP_INFURA_KEY}`
39+ `https://ropsten.infura.io/v3/${process.env.REACT_APP_INFURA_ENDPOINT}`
4040
4141 const provider = new Web3.providers.HttpProvider(endpoint)
4242 const web3 = new Web3(provider)
@@ -49,7 +49,7 @@ class Network extends React.Component {
4949 setNetworkType(network)
5050
5151 const endpoint =
52− `https://mainnet.infura.io/v3/${process.env.REACT_APP_INFURA_KEY}`
52+ `https://mainnet.infura.io/v3/${process.env.REACT_APP_INFURA_ENDPOINT}`
5353
5454 const provider = new Web3.providers.HttpProvider(endpoint)
5555 const web3 = new Web3(provider)
src/bridge/views/Point/Actions.js+2−2
@@ -215,7 +215,7 @@ const Actions = (props) => {
215215 pushRoute(ROUTE_NAMES.SET_SPAWN_PROXY)
216216 }}
217217 >
218− { 'Set spawn proxy' }
218+ { 'Change spawn proxy' }
219219 </Button>
220220
221221 <Button
@@ -226,7 +226,7 @@ const Actions = (props) => {
226226 pushRoute(ROUTE_NAMES.SET_MANAGEMENT_PROXY)
227227 }}
228228 >
229− { 'Set management proxy' }
229+ { 'Change management proxy' }
230230 </Button>
231231
232232 <Button
src/bridge/views/SentTransaction.js−13
@@ -126,7 +126,6 @@ const SentTransaction = (props) => {
126126 const { setPointCursor, pointCursor } = props
127127
128128 const promptKeyfile = props.routeData && props.routeData.promptKeyfile
129− const promptText = props.routeData && props.routeData.promptText
130129
131130 const w3 = web3.matchWith({
132131 Nothing: _ => { throw BRIDGE_ERROR.MISSING_WEB3 },
@@ -148,17 +147,6 @@ const SentTransaction = (props) => {
148147 />
149148 })
150149
151− let text;
152− if (promptText) {
153− text = (
154− <Row>
155− <Col>
156− <p>{promptText}</p>
157− </Col>
158− </Row>
159− )
160− }
161−
162150 const ok =
163151 <Row>
164152 <Col>
@@ -199,7 +187,6 @@ const SentTransaction = (props) => {
199187 return (
200188 <div>
201189 { body }
202− { text }
203190 { ok }
204191 { keyfile }
205192 </div>
src/bridge/views/SetKeys.js+1−1
@@ -193,7 +193,7 @@ class SetKeys extends React.Component {
193193 walletType={props.walletType}
194194 walletHdPath={props.walletHdPath}
195195 networkType={props.networkType}
196− setTxnHashCursor={props.setTxnHashCursor}
196+ onSent={props.setTxnHashCursor}
197197 setTxnConfirmations={props.setTxnConfirmations}
198198 popRoute={props.popRoute}
199199 pushRoute={props.pushRoute}
src/bridge/views/SetProxy.js+59−30
@@ -1,7 +1,7 @@
11import Maybe from 'folktale/maybe'
22import React from 'react'
33import * as azimuth from 'azimuth-js'
4−import { Row, Col, H1, P, InnerLabel, ShowBlockie, Anchor } from '../components/Base'
4+import { Row, Col, H1, P, InnerLabel, ShowBlockie, Anchor, HorizontalSelector } from '../components/Base'
55import { AddressInput } from '../components/Base'
66import * as ob from 'urbit-ob'
77
@@ -46,13 +46,23 @@ class SetProxy extends React.Component {
4646 this.state = {
4747 proxyAddress: '',
4848 issuingPoint: issuingPoint,
49+ setProxy: true
4950 }
5051
5152 this.statelessRef = React.createRef();
53+ this.handleSetUnset = this.handleSetUnset.bind(this);
5254 this.handleAddressInput = this.handleAddressInput.bind(this)
5355 this.createUnsignedTxn = this.createUnsignedTxn.bind(this)
5456 }
5557
58+ handleSetUnset(selected) {
59+ const set = (selected === 'set');
60+ this.setState({
61+ setProxy: set,
62+ proxyAddress: set ? '' : '0x0000000000000000000000000000000000000000'
63+ });
64+ }
65+
5666 handleAddressInput(proxyAddress) {
5767 this.setState({ proxyAddress })
5868
@@ -116,42 +126,61 @@ class SetProxy extends React.Component {
116126
117127 const ucFirst = w => w.charAt(0).toUpperCase() + w.slice(1);
118128
129+ const setUnset = [
130+ { title: 'Set', value: 'set' },
131+ { title: 'Unset', value: 'unset' }
132+ ];
133+
134+ const titleVerb = this.state.setProxy ? 'Set' : 'Unset';
135+
136+ let addressInput = null;
137+ if (this.state.setProxy) {
138+ addressInput = (<>
139+ <P className='mt-8'>
140+ {
141+ 'Please provide an Ethereum address to act as the ' +
142+ `${renderedProxyType} proxy. You can also use Wallet ` +
143+ 'Generator to generate a keypair.'
144+ }
145+ </P>
146+
147+ <AddressInput
148+ className='mono mt-8'
149+ prop-size='lg'
150+ prop-format='innerLabel'
151+ placeholder={ `e.g. 0x84295d5e054d8cff5a22428b195f5a1615bd644f` }
152+ value={ state.proxyAddress }
153+ onChange={ v => this.handleAddressInput(v) }>
154+ <InnerLabel>{ 'Proxy Address' }</InnerLabel>
155+ <ShowBlockie className={'mt-1'} address={state.proxyAddress} />
156+ </AddressInput>
157+
158+ <Anchor
159+ className={'mt-1'}
160+ prop-size={'sm'}
161+ prop-disabled={!isValidAddress(state.proxyAddress) || !esvisible}
162+ target={'_blank'}
163+ href={`https://${esdomain}/address/${state.proxyAddress}`}>
164+ {'View on Etherscan ↗'}
165+ </Anchor>
166+ </>)
167+ }
119168
120169 return (
121170 <Row>
122171 <Col>
123172 <H1>
124− { `Set ${ucFirst(renderedProxyType)} Proxy For ` }
173+ { `${titleVerb} ${ucFirst(renderedProxyType)} Proxy For ` }
125174 <code>{ `${ob.patp(state.issuingPoint)}` }</code>
126175 </H1>
127176
128− <P>
129− {
130− 'Please provide an Ethereum address to act as the ' +
131− `${renderedProxyType} proxy. You can also use Wallet ` +
132− 'Generator to generate a keypair.'
133− }
134− </P>
135−
136− <AddressInput
137− className='mono mt-8'
138− prop-size='lg'
139− prop-format='innerLabel'
140− placeholder={ `e.g. 0x84295d5e054d8cff5a22428b195f5a1615bd644f` }
141− value={ state.proxyAddress }
142− onChange={ v => this.handleAddressInput(v) }>
143− <InnerLabel>{ 'Proxy Address' }</InnerLabel>
144− <ShowBlockie className={'mt-1'} address={state.proxyAddress} />
145− </AddressInput>
146−
147− <Anchor
148− className={'mt-1'}
149− prop-size={'sm'}
150− prop-disabled={!isValidAddress(state.proxyAddress) || !esvisible}
151− target={'_blank'}
152− href={`https://${esdomain}/address/${state.proxyAddress}`}>
153− {'View on Etherscan ↗'}
154− </Anchor>
177+ <HorizontalSelector
178+ options={setUnset}
179+ onChange={this.handleSetUnset}
180+ className='mt-8'
181+ />
182+
183+ { addressInput }
155184
156185 <StatelessTransaction
157186 // Upper scope
@@ -161,7 +190,7 @@ class SetProxy extends React.Component {
161190 walletType={props.walletType}
162191 walletHdPath={props.walletHdPath}
163192 networkType={props.networkType}
164− setTxnHashCursor={props.setTxnHashCursor}
193+ onSent={props.setTxnHashCursor}
165194 setTxnConfirmations={props.setTxnConfirmations}
166195 popRoute={props.popRoute}
167196 pushRoute={props.pushRoute}
src/bridge/views/Transfer.js+1−1
@@ -131,7 +131,7 @@ class Transfer extends React.Component {
131131 walletType={props.walletType}
132132 walletHdPath={props.walletHdPath}
133133 networkType={props.networkType}
134− setTxnHashCursor={props.setTxnHashCursor}
134+ onSent={props.setTxnHashCursor}
135135 setTxnConfirmations={props.setTxnConfirmations}
136136 popRoute={props.popRoute}
137137 pushRoute={props.pushRoute}
src/bridge/views/Trezor.js+57−14
@@ -3,11 +3,11 @@ import React from 'react'
33import Maybe from 'folktale/maybe'
44import { Button } from '../components/Base'
55import { Row, Col, H1, P } from '../components/Base'
6−import { InnerLabel, Input } from '../components/Base'
6+import { InnerLabel, Input, InnerLabelDropdown } from '../components/Base'
77import TrezorConnect from 'trezor-connect'
88import * as secp256k1 from 'secp256k1'
99
10−import { TREZOR_BASE_PATH } from '../lib/trezor'
10+import { TREZOR_PATH } from '../lib/trezor'
1111import { ROUTE_NAMES } from '../lib/router'
1212
1313class Trezor extends React.Component {
@@ -16,13 +16,23 @@ class Trezor extends React.Component {
1616 super(props)
1717
1818 this.state = {
19− hdpath: TREZOR_BASE_PATH
19+ hdpath: TREZOR_PATH.replace(/x/g, 0),
20+ account: 0
2021 }
2122
23+ this.handleAccountSelection = this.handleAccountSelection.bind(this)
2224 this.handleHdPathInput = this.handleHdPathInput.bind(this)
2325 this.pollDevice = this.pollDevice.bind(this)
2426 }
2527
28+ handleAccountSelection(account) {
29+ let hdpath = this.state.hdpath;
30+ if (account !== 'custom') {
31+ hdpath = TREZOR_PATH.replace(/x/g, account);
32+ }
33+ this.setState({ account, hdpath });
34+ }
35+
2636 handleHdPathInput(hdpath) {
2737 this.setState({ hdpath })
2838 }
@@ -53,7 +63,48 @@ class Trezor extends React.Component {
5363
5464 render() {
5565 const { pushRoute, popRoute, wallet } = this.props
56− const { hdpath } = this.state
66+ const { hdpath, account } = this.state
67+ const { handleAccountSelection } = this;
68+
69+ let accountOptions = [{
70+ title: 'Custom path',
71+ value: 'custom'
72+ }];
73+ for (let i = 0; i < 20; i++) {
74+ accountOptions.push({
75+ title: 'Account #' + (i+1),
76+ value: i
77+ });
78+ }
79+ let accountTitle = accountOptions.find(o => (o.value === account)).title;
80+
81+ const accountSelection = (
82+ <InnerLabelDropdown
83+ className='mt-8'
84+ prop-size='md'
85+ prop-format='innerLabel'
86+ options={accountOptions}
87+ handleUpdate={handleAccountSelection}
88+ title={'Account'}
89+ currentSelectionTitle={accountTitle}
90+ fullWidth={true}
91+ >
92+ </InnerLabelDropdown>
93+ );
94+
95+ const pathSelection = (account !== 'custom') ? null :
96+ (
97+ <Input
98+ className='mt-8 pt-8 text-mono'
99+ prop-size='md'
100+ prop-format='innerLabel'
101+ name='hdpath'
102+ value={ hdpath }
103+ autocomplete='off'
104+ onChange={ this.handleHdPathInput }>
105+ <InnerLabel>{'HD Path'}</InnerLabel>
106+ </Input>
107+ );
57108
58109 return (
59110 <Row>
@@ -66,16 +117,8 @@ class Trezor extends React.Component {
66117 }
67118 </P>
68119
69− <Input
70− className='pt-8 text-mono'
71− prop-size='md'
72− prop-format='innerLabel'
73− name='hdpath'
74− value={ hdpath }
75− autocomplete='off'
76− onChange={ this.handleHdPathInput }>
77− <InnerLabel>{'HD Path'}</InnerLabel>
78− </Input>
120+ { accountSelection }
121+ { pathSelection }
79122
80123 <Button
81124 className={'mt-8'}