on master help sign in
Merged
4bd2eeeChris Johnson
@@ -1,2 +1,2 @@
1−REACT_APP_INFURA_KEY='b7d2af9f01534031ba773374f766ef65'
1+REACT_APP_INFURA_ENDPOINT='b7d2af9f01534031ba773374f766ef65'
2
2
README.md+2
@@ -1,5 +1,7 @@
1# Bridge
1# Bridge
2
2
3+[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)
4+
3An application for interacting with Azimuth.
5An application for interacting with Azimuth.
4
6
5## Usage
7## Usage
package-lock.json+1030−446
@@ -1067,9 +1067,9 @@
1067 }
1067 }
1068 },
1068 },
1069 "@types/node": {
1069 "@types/node": {
1070− "version": "10.14.5",
1070+ "version": "10.14.4",
1071− "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.5.tgz",
1071+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.4.tgz",
1072− "integrity": "sha512-Ja7d4s0qyGFxjGeDq5S7Si25OFibSAHUi6i17UWnwNnpitADN7hah9q0Tl25gxuV5R1u2Bx+np6w4LHXfHyj/g=="
1072+ "integrity": "sha512-DT25xX/YgyPKiHFOpNuANIQIVvYEwCWXgK2jYYwqgaMrYE6+tq+DtmMwlD3drl6DJbUwtlIDnn0d7tIn/EbXBg=="
1073 },
1073 },
1074 "@types/q": {
1074 "@types/q": {
1075 "version": "1.5.1",
1075 "version": "1.5.1",
@@ -1264,12 +1264,12 @@
1264 "flat": "^4.1.0",
1264 "flat": "^4.1.0",
1265 "lodash": "^4.17.10",
1265 "lodash": "^4.17.10",
1266 "qr-image": "^3.2.0",
1266 "qr-image": "^3.2.0",
1267− "sigil-js": "github:urbit/sigil-js#1864796bb3f482e597fd85acfd324795e42b2465",
1267+ "sigil-js": "github:urbit/sigil-js",
1268 "urbit-ob": "^1.4.4"
1268 "urbit-ob": "^1.4.4"
1269 },
1269 },
1270 "dependencies": {
1270 "dependencies": {
1271 "sigil-js": {
1271 "sigil-js": {
1272− "version": "github:urbit/sigil-js#1864796bb3f482e597fd85acfd324795e42b2465",
1272+ "version": "github:urbit/sigil-js#03c880ff17a5816d78f659f44cb7df44e0a0c097",
1273 "from": "github:urbit/sigil-js",
1273 "from": "github:urbit/sigil-js",
1274 "requires": {
1274 "requires": {
1275 "lodash": "^4.17.10",
1275 "lodash": "^4.17.10",
@@ -1346,6 +1346,11 @@
1346 "resolved": "https://registry.npmjs.org/address/-/address-1.0.3.tgz",
1346 "resolved": "https://registry.npmjs.org/address/-/address-1.0.3.tgz",
1347 "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg=="
1347 "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg=="
1348 },
1348 },
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+ },
1349 "ajv": {
1354 "ajv": {
1350 "version": "6.6.2",
1355 "version": "6.6.2",
1351 "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz",
1356 "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz",
@@ -1439,11 +1444,6 @@
1439 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
1444 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
1440 "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
1445 "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
1441 },
1446 },
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− },
1447 "anymatch": {
1447 "anymatch": {
1448 "version": "2.0.0",
1448 "version": "2.0.0",
1449 "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
1449 "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
@@ -2617,14 +2617,6 @@
2617 "safe-buffer": "^5.1.1"
2617 "safe-buffer": "^5.1.1"
2618 }
2618 }
2619 },
2619 },
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− },
2628 "bluebird": {
2620 "bluebird": {
2629 "version": "3.5.3",
2621 "version": "3.5.3",
2630 "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz",
2622 "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz",
@@ -3639,6 +3631,11 @@
3639 "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
3631 "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
3640 "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
3632 "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
3641 },
3633 },
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+ },
3642 "copy-concurrently": {
3639 "copy-concurrently": {
3643 "version": "1.0.5",
3640 "version": "1.0.5",
3644 "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
3641 "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
@@ -5180,6 +5177,22 @@
5180 "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
5177 "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
5181 "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
5178 "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
5182 },
5179 },
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+ },
5183 "eth-lib": {
5196 "eth-lib": {
5184 "version": "0.1.27",
5197 "version": "0.1.27",
5185 "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.27.tgz",
5198 "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.27.tgz",
@@ -5230,6 +5243,60 @@
5230 "secp256k1": "^3.0.1"
5243 "secp256k1": "^3.0.1"
5231 }
5244 }
5232 },
5245 },
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+ },
5233 "ethjs-unit": {
5300 "ethjs-unit": {
5234 "version": "0.1.6",
5301 "version": "0.1.6",
5235 "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz",
5302 "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz",
@@ -5256,9 +5323,9 @@
5256 }
5323 }
5257 },
5324 },
5258 "eventemitter3": {
5325 "eventemitter3": {
5259− "version": "1.1.1",
5326+ "version": "3.1.0",
5260− "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.1.1.tgz",
5327+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz",
5261− "integrity": "sha1-R3hr2qCHyvext15zq8XH1UAVjNA="
5328+ "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA=="
5262 },
5329 },
5263 "events": {
5330 "events": {
5264 "version": "3.0.0",
5331 "version": "3.0.0",
@@ -6376,26 +6443,12 @@
6376 "rimraf": "^2.2.8"
6443 "rimraf": "^2.2.8"
6377 }
6444 }
6378 },
6445 },
6379− "fs-promise": {
6446+ "fs-minipass": {
6380− "version": "2.0.3",
6447+ "version": "1.2.5",
6381− "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-2.0.3.tgz",
6448+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz",
6382− "integrity": "sha1-9k5PhUvPaJqovdy6JokW2z20aFQ=",
6449+ "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==",
6383 "requires": {
6450 "requires": {
6384− "any-promise": "^1.3.0",
6451+ "minipass": "^2.2.1"
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− }
6399 }
6452 }
6400 },
6453 },
6401 "fs-write-stream-atomic": {
6454 "fs-write-stream-atomic": {
@@ -6431,7 +6484,8 @@
6431 },
6484 },
6432 "ansi-regex": {
6485 "ansi-regex": {
6433 "version": "2.1.1",
6486 "version": "2.1.1",
6434− "bundled": true
6487+ "bundled": true,
6488+ "optional": true
6435 },
6489 },
6436 "aproba": {
6490 "aproba": {
6437 "version": "1.2.0",
6491 "version": "1.2.0",
@@ -6449,11 +6503,13 @@
6449 },
6503 },
6450 "balanced-match": {
6504 "balanced-match": {
6451 "version": "1.0.0",
6505 "version": "1.0.0",
6452− "bundled": true
6506+ "bundled": true,
6507+ "optional": true
6453 },
6508 },
6454 "brace-expansion": {
6509 "brace-expansion": {
6455 "version": "1.1.11",
6510 "version": "1.1.11",
6456 "bundled": true,
6511 "bundled": true,
6512+ "optional": true,
6457 "requires": {
6513 "requires": {
6458 "balanced-match": "^1.0.0",
6514 "balanced-match": "^1.0.0",
6459 "concat-map": "0.0.1"
6515 "concat-map": "0.0.1"
@@ -6466,15 +6522,18 @@
6466 },
6522 },
6467 "code-point-at": {
6523 "code-point-at": {
6468 "version": "1.1.0",
6524 "version": "1.1.0",
6469− "bundled": true
6525+ "bundled": true,
6526+ "optional": true
6470 },
6527 },
6471 "concat-map": {
6528 "concat-map": {
6472 "version": "0.0.1",
6529 "version": "0.0.1",
6473− "bundled": true
6530+ "bundled": true,
6531+ "optional": true
6474 },
6532 },
6475 "console-control-strings": {
6533 "console-control-strings": {
6476 "version": "1.1.0",
6534 "version": "1.1.0",
6477− "bundled": true
6535+ "bundled": true,
6536+ "optional": true
6478 },
6537 },
6479 "core-util-is": {
6538 "core-util-is": {
6480 "version": "1.0.2",
6539 "version": "1.0.2",
@@ -6577,7 +6636,8 @@
6577 },
6636 },
6578 "inherits": {
6637 "inherits": {
6579 "version": "2.0.3",
6638 "version": "2.0.3",
6580− "bundled": true
6639+ "bundled": true,
6640+ "optional": true
6581 },
6641 },
6582 "ini": {
6642 "ini": {
6583 "version": "1.3.5",
6643 "version": "1.3.5",
@@ -6587,6 +6647,7 @@
6587 "is-fullwidth-code-point": {
6647 "is-fullwidth-code-point": {
6588 "version": "1.0.0",
6648 "version": "1.0.0",
6589 "bundled": true,
6649 "bundled": true,
6650+ "optional": true,
6590 "requires": {
6651 "requires": {
6591 "number-is-nan": "^1.0.0"
6652 "number-is-nan": "^1.0.0"
6592 }
6653 }
@@ -6599,17 +6660,20 @@
6599 "minimatch": {
6660 "minimatch": {
6600 "version": "3.0.4",
6661 "version": "3.0.4",
6601 "bundled": true,
6662 "bundled": true,
6663+ "optional": true,
6602 "requires": {
6664 "requires": {
6603 "brace-expansion": "^1.1.7"
6665 "brace-expansion": "^1.1.7"
6604 }
6666 }
6605 },
6667 },
6606 "minimist": {
6668 "minimist": {
6607 "version": "0.0.8",
6669 "version": "0.0.8",
6608− "bundled": true
6670+ "bundled": true,
6671+ "optional": true
6609 },
6672 },
6610 "minipass": {
6673 "minipass": {
6611 "version": "2.2.4",
6674 "version": "2.2.4",
6612 "bundled": true,
6675 "bundled": true,
6676+ "optional": true,
6613 "requires": {
6677 "requires": {
6614 "safe-buffer": "^5.1.1",
6678 "safe-buffer": "^5.1.1",
6615 "yallist": "^3.0.0"
6679 "yallist": "^3.0.0"
@@ -6626,6 +6690,7 @@
6626 "mkdirp": {
6690 "mkdirp": {
6627 "version": "0.5.1",
6691 "version": "0.5.1",
6628 "bundled": true,
6692 "bundled": true,
6693+ "optional": true,
6629 "requires": {
6694 "requires": {
6630 "minimist": "0.0.8"
6695 "minimist": "0.0.8"
6631 }
6696 }
@@ -6698,7 +6763,8 @@
6698 },
6763 },
6699 "number-is-nan": {
6764 "number-is-nan": {
6700 "version": "1.0.1",
6765 "version": "1.0.1",
6701− "bundled": true
6766+ "bundled": true,
6767+ "optional": true
6702 },
6768 },
6703 "object-assign": {
6769 "object-assign": {
6704 "version": "4.1.1",
6770 "version": "4.1.1",
@@ -6708,6 +6774,7 @@
6708 "once": {
6774 "once": {
6709 "version": "1.4.0",
6775 "version": "1.4.0",
6710 "bundled": true,
6776 "bundled": true,
6777+ "optional": true,
6711 "requires": {
6778 "requires": {
6712 "wrappy": "1"
6779 "wrappy": "1"
6713 }
6780 }
@@ -6783,7 +6850,8 @@
6783 },
6850 },
6784 "safe-buffer": {
6851 "safe-buffer": {
6785 "version": "5.1.1",
6852 "version": "5.1.1",
6786− "bundled": true
6853+ "bundled": true,
6854+ "optional": true
6787 },
6855 },
6788 "safer-buffer": {
6856 "safer-buffer": {
6789 "version": "2.1.2",
6857 "version": "2.1.2",
@@ -6813,6 +6881,7 @@
6813 "string-width": {
6881 "string-width": {
6814 "version": "1.0.2",
6882 "version": "1.0.2",
6815 "bundled": true,
6883 "bundled": true,
6884+ "optional": true,
6816 "requires": {
6885 "requires": {
6817 "code-point-at": "^1.0.0",
6886 "code-point-at": "^1.0.0",
6818 "is-fullwidth-code-point": "^1.0.0",
6887 "is-fullwidth-code-point": "^1.0.0",
@@ -6830,6 +6899,7 @@
6830 "strip-ansi": {
6899 "strip-ansi": {
6831 "version": "3.0.1",
6900 "version": "3.0.1",
6832 "bundled": true,
6901 "bundled": true,
6902+ "optional": true,
6833 "requires": {
6903 "requires": {
6834 "ansi-regex": "^2.0.0"
6904 "ansi-regex": "^2.0.0"
6835 }
6905 }
@@ -6868,25 +6938,16 @@
6868 },
6938 },
6869 "wrappy": {
6939 "wrappy": {
6870 "version": "1.0.2",
6940 "version": "1.0.2",
6871− "bundled": true
6941+ "bundled": true,
6942+ "optional": true
6872 },
6943 },
6873 "yallist": {
6944 "yallist": {
6874 "version": "3.0.2",
6945 "version": "3.0.2",
6875− "bundled": true
6946+ "bundled": true,
6947+ "optional": true
6876 }
6948 }
6877 }
6949 }
6878 },
6950 },
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− },
6890 "function-bind": {
6951 "function-bind": {
6891 "version": "1.1.1",
6952 "version": "1.1.1",
6892 "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
6953 "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
@@ -7868,11 +7929,6 @@
7868 "statuses": ">= 1.4.0 < 2"
7929 "statuses": ">= 1.4.0 < 2"
7869 }
7930 }
7870 },
7931 },
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− },
7876 "http-parser-js": {
7932 "http-parser-js": {
7877 "version": "0.5.0",
7933 "version": "0.5.0",
7878 "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz",
7934 "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz",
@@ -8213,6 +8269,21 @@
8213 "harmony-reflect": "^1.4.6"
8269 "harmony-reflect": "^1.4.6"
8214 }
8270 }
8215 },
8271 },
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+ },
8216 "ieee754": {
8287 "ieee754": {
8217 "version": "1.1.12",
8288 "version": "1.1.12",
8218 "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz",
8289 "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz",
@@ -10678,6 +10749,30 @@
10678 "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
10749 "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
10679 "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
10750 "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
10680 },
10751 },
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+ },
10681 "mississippi": {
10776 "mississippi": {
10682 "version": "3.0.0",
10777 "version": "3.0.0",
10683 "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
10778 "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
@@ -10798,9 +10893,9 @@
10798 }
10893 }
10799 },
10894 },
10800 "mock-fs": {
10895 "mock-fs": {
10801− "version": "4.7.0",
10896+ "version": "4.9.0",
10802− "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.7.0.tgz",
10897+ "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.9.0.tgz",
10803− "integrity": "sha512-WlQNtUlzMRpvLHf8dqeUmNqfdPjGY29KrJF50Ldb4AcL+vQeR8QH3wQcFMgrhTwb1gHjZn9xggho+84tBskLgA=="
10898+ "integrity": "sha512-aUj0qIniTNxzGqAC61Bvro7YD37tIBnMw3wpClucUVgNBS7r6YQn/M4wuoH7SGteKz4SvC1OBeDsfpG0MYC+1Q=="
10804 },
10899 },
10805 "more-entropy": {
10900 "more-entropy": {
10806 "version": "0.0.7",
10901 "version": "0.0.7",
@@ -10810,11 +10905,6 @@
10810 "iced-runtime": ">=0.0.1"
10905 "iced-runtime": ">=0.0.1"
10811 }
10906 }
10812 },
10907 },
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− },
10818 "move-concurrently": {
10908 "move-concurrently": {
10819 "version": "1.0.1",
10909 "version": "1.0.1",
10820 "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
10910 "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
@@ -10857,16 +10947,6 @@
10857 "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
10947 "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
10858 "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
10948 "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
10859 },
10949 },
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− },
10870 "nan": {
10950 "nan": {
10871 "version": "2.12.1",
10951 "version": "2.12.1",
10872 "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz",
10952 "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz",
@@ -11334,14 +11414,6 @@
11334 "has": "^1.0.1"
11414 "has": "^1.0.1"
11335 }
11415 }
11336 },
11416 },
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− },
11345 "obuf": {
11417 "obuf": {
11346 "version": "1.1.2",
11418 "version": "1.1.2",
11347 "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
11419 "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
@@ -11559,12 +11631,12 @@
11559 }
11631 }
11560 },
11632 },
11561 "parse-headers": {
11633 "parse-headers": {
11562− "version": "2.0.1",
11634+ "version": "2.0.2",
11563− "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz",
11635+ "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.2.tgz",
11564− "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=",
11636+ "integrity": "sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg==",
11565 "requires": {
11637 "requires": {
11566− "for-each": "^0.3.2",
11638+ "for-each": "^0.3.3",
11567− "trim": "0.0.1"
11639+ "string.prototype.trim": "^1.1.2"
11568 }
11640 }
11569 },
11641 },
11570 "parse-json": {
11642 "parse-json": {
@@ -17200,6 +17272,11 @@
17200 "nan": "^2.0.8"
17272 "nan": "^2.0.8"
17201 }
17273 }
17202 },
17274 },
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+ },
17203 "scrypt.js": {
17280 "scrypt.js": {
17204 "version": "0.2.0",
17281 "version": "0.2.0",
17205 "resolved": "http://registry.npmjs.org/scrypt.js/-/scrypt.js-0.2.0.tgz",
17282 "resolved": "http://registry.npmjs.org/scrypt.js/-/scrypt.js-0.2.0.tgz",
@@ -18034,6 +18111,16 @@
18034 "function-bind": "^1.0.2"
18111 "function-bind": "^1.0.2"
18035 }
18112 }
18036 },
18113 },
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+ },
18037 "string_decoder": {
18124 "string_decoder": {
18038 "version": "1.1.1",
18125 "version": "1.1.1",
18039 "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
18126 "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
@@ -18218,32 +18305,40 @@
18218 }
18305 }
18219 },
18306 },
18220 "swarm-js": {
18307 "swarm-js": {
18221− "version": "0.1.37",
18308+ "version": "0.1.39",
18222− "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.37.tgz",
18309+ "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.39.tgz",
18223− "integrity": "sha512-G8gi5fcXP/2upwiuOShJ258sIufBVztekgobr3cVgYXObZwJ5AXLqZn52AI+/ffft29pJexF9WNdUxjlkVehoQ==",
18310+ "integrity": "sha512-QLMqL2rzF6n5s50BptyD6Oi0R1aWlJC5Y17SRIVXRj6OR1DRIPM7nepvrxxkjA1zNzFz6mUOMjfeqeDaWB7OOg==",
18224 "requires": {
18311 "requires": {
18225 "bluebird": "^3.5.0",
18312 "bluebird": "^3.5.0",
18226 "buffer": "^5.0.5",
18313 "buffer": "^5.0.5",
18227 "decompress": "^4.0.0",
18314 "decompress": "^4.0.0",
18228 "eth-lib": "^0.1.26",
18315 "eth-lib": "^0.1.26",
18229− "fs-extra": "^2.1.2",
18316+ "fs-extra": "^4.0.2",
18230− "fs-promise": "^2.0.0",
18231 "got": "^7.1.0",
18317 "got": "^7.1.0",
18232 "mime-types": "^2.1.16",
18318 "mime-types": "^2.1.16",
18233 "mkdirp-promise": "^5.0.1",
18319 "mkdirp-promise": "^5.0.1",
18234 "mock-fs": "^4.1.0",
18320 "mock-fs": "^4.1.0",
18235 "setimmediate": "^1.0.5",
18321 "setimmediate": "^1.0.5",
18236− "tar.gz": "^1.0.5",
18322+ "tar": "^4.0.2",
18237 "xhr-request-promise": "^0.1.2"
18323 "xhr-request-promise": "^0.1.2"
18238 },
18324 },
18239 "dependencies": {
18325 "dependencies": {
18240 "fs-extra": {
18326 "fs-extra": {
18241− "version": "2.1.2",
18327+ "version": "4.0.3",
18242− "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz",
18328+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
18243− "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=",
18329+ "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
18244 "requires": {
18330 "requires": {
18245 "graceful-fs": "^4.1.2",
18331 "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"
18247 }
18342 }
18248 }
18343 }
18249 }
18344 }
@@ -18332,13 +18427,24 @@
18332 "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA=="
18427 "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA=="
18333 },
18428 },
18334 "tar": {
18429 "tar": {
18335− "version": "2.2.1",
18430+ "version": "4.4.8",
18336− "resolved": "http://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
18431+ "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz",
18337− "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
18432+ "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==",
18338 "requires": {
18433 "requires": {
18339− "block-stream": "*",
18434+ "chownr": "^1.1.1",
18340− "fstream": "^1.0.2",
18435+ "fs-minipass": "^1.2.5",
18341− "inherits": "2"
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+ }
18342 }
18448 }
18343 },
18449 },
18344 "tar-stream": {
18450 "tar-stream": {
@@ -18355,25 +18461,6 @@
18355 "xtend": "^4.0.0"
18461 "xtend": "^4.0.0"
18356 }
18462 }
18357 },
18463 },
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− },
18377 "term-size": {
18464 "term-size": {
18378 "version": "1.2.0",
18465 "version": "1.2.0",
18379 "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
18466 "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
@@ -18519,22 +18606,6 @@
18519 "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
18606 "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
18520 "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
18607 "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
18521 },
18608 },
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− },
18538 "throat": {
18609 "throat": {
18539 "version": "4.1.0",
18610 "version": "4.1.0",
18540 "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz",
18611 "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz",
@@ -18717,11 +18788,6 @@
18717 }
18788 }
18718 }
18789 }
18719 },
18790 },
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− },
18725 "trim-right": {
18791 "trim-right": {
18726 "version": "1.0.1",
18792 "version": "1.0.1",
18727 "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
18793 "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
@@ -18787,6 +18853,14 @@
18787 "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
18853 "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
18788 "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
18854 "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
18789 },
18855 },
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+ },
18790 "typeforce": {
18864 "typeforce": {
18791 "version": "1.18.0",
18865 "version": "1.18.0",
18792 "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz",
18866 "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz",
@@ -18925,36 +18999,14 @@
18925 "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og=="
18999 "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og=="
18926 },
19000 },
18927 "unbzip2-stream": {
19001 "unbzip2-stream": {
18928− "version": "1.3.1",
19002+ "version": "1.3.3",
18929− "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.1.tgz",
19003+ "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz",
18930− "integrity": "sha512-fIZnvdjblYs7Cru/xC6tCPVhz7JkYcVQQkePwMLyQELzYTds2Xn8QefPVnvdVhhZqubxNA1cASXEH5wcK0Bucw==",
19004+ "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==",
18931 "requires": {
19005 "requires": {
18932− "buffer": "^3.0.1",
19006+ "buffer": "^5.2.1",
18933− "through": "^2.3.6"
19007+ "through": "^2.3.8"
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− }
18951 }
19008 }
18952 },
19009 },
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− },
18958 "unicode-canonical-property-names-ecmascript": {
19010 "unicode-canonical-property-names-ecmascript": {
18959 "version": "1.0.4",
19011 "version": "1.0.4",
18960 "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
19012 "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
@@ -19368,294 +19420,802 @@
19368 }
19420 }
19369 },
19421 },
19370 "web3": {
19422 "web3": {
19371− "version": "1.0.0-beta.33",
19423+ "version": "1.0.0-beta.54",
19372− "resolved": "https://registry.npmjs.org/web3/-/web3-1.0.0-beta.33.tgz",
19424+ "resolved": "https://registry.npmjs.org/web3/-/web3-1.0.0-beta.54.tgz",
19373− "integrity": "sha1-xgIbV2mSdyY3HBhLhoRFMRsTkpU=",
19425+ "integrity": "sha512-rMQaLFwBNR3Lc8Npa9uasdkJKhsnp2FrDA0r8J814mU1VITkAG7l8NPICrlUaDLNiQn0bf6QnONTNujuds+yNg==",
19374− "requires": {
19426+ "requires": {
19427+ "@babel/runtime": "^7.3.1",
19428+ "@types/node": "^10.12.18",
19375− "web3-bzz": "1.0.0-beta.33",
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",
19376− "web3-core": "1.0.0-beta.33",
19432+ "web3-core-method": "1.0.0-beta.54",
19377− "web3-eth": "1.0.0-beta.33",
19433+ "web3-eth": "1.0.0-beta.54",
19378− "web3-eth-personal": "1.0.0-beta.33",
19434+ "web3-eth-personal": "1.0.0-beta.54",
19379− "web3-net": "1.0.0-beta.33",
19435+ "web3-net": "1.0.0-beta.54",
19436+ "web3-providers": "1.0.0-beta.54",
19380− "web3-shh": "1.0.0-beta.33",
19437+ "web3-shh": "1.0.0-beta.54",
19381− "web3-utils": "1.0.0-beta.33"
19438+ "web3-utils": "1.0.0-beta.54"
19382 },
19439 },
19383 "dependencies": {
19440 "dependencies": {
19384− "bn.js": {
19441+ "@babel/runtime": {
19385− "version": "4.11.6",
19442+ "version": "7.4.4",
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",
19443+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz",
19392− "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w="
19444+ "integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==",
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=",
19546 "requires": {
19445 "requires": {
19547− "bn.js": "4.11.6",
19446+ "regenerator-runtime": "^0.13.2"
19548− "web3-utils": "1.0.0-beta.33"
19549 }
19447 }
19550 },
19448 },
19551− "web3-eth-personal": {
19449+ "eth-lib": {
19552− "version": "1.0.0-beta.33",
19450+ "version": "0.2.8",
19553− "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.33.tgz",
19451+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
19554− "integrity": "sha1-tOSFh8xOfrAY2ib947Tzul+bmO8=",
19452+ "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
19555 "requires": {
19453 "requires": {
19556− "web3-core": "1.0.0-beta.33",
19454+ "bn.js": "^4.11.6",
19557− "web3-core-helpers": "1.0.0-beta.33",
19455+ "elliptic": "^6.4.0",
19558− "web3-core-method": "1.0.0-beta.33",
19456+ "xhr-request-promise": "^0.1.2"
19559− "web3-net": "1.0.0-beta.33",
19560− "web3-utils": "1.0.0-beta.33"
19561 }
19457 }
19562 },
19458 },
19563− "web3-net": {
19459+ "regenerator-runtime": {
19564− "version": "1.0.0-beta.33",
19460+ "version": "0.13.2",
19565− "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.0.0-beta.33.tgz",
19461+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
19566− "integrity": "sha1-tskNGg4WJuquiz2SKsFTZy/VZEU=",
19462+ "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA=="
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− }
19572 },
19463 },
19573− "web3-providers-http": {
19464+ "web3-utils": {
19574− "version": "1.0.0-beta.33",
19465+ "version": "1.0.0-beta.54",
19575− "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.0.0-beta.33.tgz",
19466+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.54.tgz",
19576− "integrity": "sha1-OzWuAO599blrSTSWKtSobypVmcE=",
19467+ "integrity": "sha512-yb/cjzjTU99P/9bEaAnb6cjqGjyMUF0OmjD7/ix89IfcDhBJ3jExSuClTAKU8Hz9Rf7IXLiXqBny9W8PdogwmQ==",
19577− "requires": {
19468+ "requires": {
19578− "web3-core-helpers": "1.0.0-beta.33",
19469+ "@babel/runtime": "^7.3.1",
19579− "xhr2": "0.1.4"
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"
19580 }
19479 }
19581− },
19480+ }
19582− "web3-providers-ipc": {
19481+ }
19482+ },
19483+ "web3-bzz": {
19583− "version": "1.0.0-beta.33",
19484+ "version": "1.0.0-beta.54",
19584− "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.33.tgz",
19485+ "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.0.0-beta.54.tgz",
19585− "integrity": "sha1-Twrcmv6dEsBm5L5cPFNvUHPLB8Y=",
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==",
19586 "requires": {
19498 "requires": {
19587− "oboe": "2.1.3",
19499+ "regenerator-runtime": "^0.13.2"
19588− "underscore": "1.8.3",
19589− "web3-core-helpers": "1.0.0-beta.33"
19590 }
19500 }
19591 },
19501 },
19592− "web3-providers-ws": {
19502+ "regenerator-runtime": {
19593− "version": "1.0.0-beta.33",
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",
19594− "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.33.tgz",
19511+ "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.0.0-beta.54.tgz",
19595− "integrity": "sha1-j93qQuGbvyUh7IeVRkV6Yjqdye8=",
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==",
19596 "requires": {
19525 "requires": {
19597− "underscore": "1.8.3",
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",
19598− "web3-core-helpers": "1.0.0-beta.33"
19675+ "web3-core-helpers": "1.0.0-beta.54",
19599− },
19676+ "web3-core-method": "1.0.0-beta.54",
19600− "dependencies": {
19677+ "web3-core-subscriptions": "1.0.0-beta.54",
19601− "websocket": {
19678+ "web3-eth-abi": "1.0.0-beta.54",
19602− "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2",
19679+ "web3-eth-accounts": "1.0.0-beta.54",
19603− "from": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2",
19680+ "web3-eth-contract": "1.0.0-beta.54",
19604− "requires": {
19681+ "web3-eth-ens": "1.0.0-beta.54",
19605− "debug": "^2.2.0",
19682+ "web3-eth-iban": "1.0.0-beta.54",
19606− "nan": "^2.3.3",
19683+ "web3-eth-personal": "1.0.0-beta.54",
19607− "typedarray-to-buffer": "^3.1.2",
19684+ "web3-net": "1.0.0-beta.54",
19608− "yaeti": "^0.0.6"
19685+ "web3-providers": "1.0.0-beta.54",
19686+ "web3-utils": "1.0.0-beta.54"
19609− },
19687+ },
19610− "dependencies": {
19688+ "dependencies": {
19611− "typedarray-to-buffer": {
19689+ "@babel/runtime": {
19612− "version": "3.1.5",
19690+ "version": "7.4.4",
19613− "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
19691+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz",
19614− "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
19692+ "integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==",
19615− "requires": {
19693+ "requires": {
19616− "is-typedarray": "^1.0.0"
19694+ "regenerator-runtime": "^0.13.2"
19617− }
19695+ }
19618− },
19696+ },
19619− "yaeti": {
19697+ "eth-lib": {
19620− "version": "0.0.6",
19698+ "version": "0.2.8",
19621− "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz",
19699+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
19622− "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc="
19700+ "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
19623− }
19701+ "requires": {
19624− }
19702+ "bn.js": "^4.11.6",
19625− }
19703+ "elliptic": "^6.4.0",
19704+ "xhr-request-promise": "^0.1.2"
19626 }
19705 }
19627 },
19706 },
19628− "web3-shh": {
19707+ "regenerator-runtime": {
19629− "version": "1.0.0-beta.33",
19708+ "version": "0.13.2",
19630− "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.0.0-beta.33.tgz",
19709+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
19631− "integrity": "sha1-+Z4mVz9uCZMhrw2fK/z+Pe01UKE=",
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==",
19632 "requires": {
19716 "requires": {
19633− "web3-core": "1.0.0-beta.33",
19717+ "tslib": "^1.9.0"
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"
19637 }
19718 }
19638 },
19719 },
19639 "web3-utils": {
19720 "web3-utils": {
19640− "version": "1.0.0-beta.33",
19721+ "version": "1.0.0-beta.54",
19641− "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.33.tgz",
19722+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.54.tgz",
19642− "integrity": "sha1-4JG3mU8JtxSwGYpAV9OtLrjL4jg=",
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==",
19643 "requires": {
19754 "requires": {
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": {
19644− "bn.js": "4.11.6",
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",
19645− "eth-lib": "0.1.27",
19782+ "eth-lib": "0.2.8",
19646− "ethjs-unit": "0.1.6",
19783+ "ethjs-unit": "^0.1.6",
19784+ "lodash": "^4.17.11",
19647 "number-to-bn": "1.7.0",
19785 "number-to-bn": "1.7.0",
19648 "randomhex": "0.1.5",
19786 "randomhex": "0.1.5",
19649− "underscore": "1.8.3",
19650 "utf8": "2.1.1"
19787 "utf8": "2.1.1"
19651 }
19788 }
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+ }
19652 },
19817 },
19653− "websocket": {
19818+ "eth-lib": {
19654− "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2",
19819+ "version": "0.2.8",
19655− "from": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2",
19820+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
19821+ "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
19656 "requires": {
19822 "requires": {
19657− "debug": "^2.2.0",
19823+ "bn.js": "^4.11.6",
19658− "nan": "^2.3.3"
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"
19659 }
20219 }
19660 }
20220 }
19661 }
20221 }
@@ -20365,6 +20925,17 @@
20365 }
20925 }
20366 }
20926 }
20367 },
20927 },
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+ },
20368 "websocket-driver": {
20939 "websocket-driver": {
20369 "version": "0.7.0",
20940 "version": "0.7.0",
20370 "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
20941 "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
@@ -20733,10 +21304,13 @@
20733 "xhr-request": "^1.0.1"
21304 "xhr-request": "^1.0.1"
20734 }
21305 }
20735 },
21306 },
20736− "xhr2": {
21307+ "xhr2-cookies": {
20737− "version": "0.1.4",
21308+ "version": "1.1.0",
20738− "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz",
21309+ "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz",
20739− "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8="
21310+ "integrity": "sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=",
21311+ "requires": {
21312+ "cookiejar": "^2.1.1"
21313+ }
20740 },
21314 },
20741 "xml-name-validator": {
21315 "xml-name-validator": {
20742 "version": "3.0.0",
21316 "version": "3.0.0",
@@ -20748,6 +21322,11 @@
20748 "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-1.3.1.tgz",
21322 "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-1.3.1.tgz",
20749 "integrity": "sha512-tGkGJkN8XqCod7OT+EvGYK5Z4SfDQGD30zAa58OcnAa0RRWgzUEK72tkXhsX1FZd+rgnhRxFtmO+ihkp8LHSkw=="
21323 "integrity": "sha512-tGkGJkN8XqCod7OT+EvGYK5Z4SfDQGD30zAa58OcnAa0RRWgzUEK72tkXhsX1FZd+rgnhRxFtmO+ihkp8LHSkw=="
20750 },
21324 },
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+ },
20751 "xregexp": {
21330 "xregexp": {
20752 "version": "4.0.0",
21331 "version": "4.0.0",
20753 "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz",
21332 "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz",
@@ -20763,6 +21342,11 @@
20763 "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
21342 "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
20764 "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
21343 "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
20765 },
21344 },
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+ },
20766 "yallist": {
21350 "yallist": {
20767 "version": "2.1.2",
21351 "version": "2.1.2",
20768 "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
21352 "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
package.json+2−2
@@ -45,7 +45,7 @@
45 "trezor-connect": "^7.0.1",
45 "trezor-connect": "^7.0.1",
46 "urbit-key-generation": "0.12.1",
46 "urbit-key-generation": "0.12.1",
47 "urbit-ob": "^3.1.0",
47 "urbit-ob": "^3.1.0",
48− "web3": "1.0.0-beta.33",
48+ "web3": "1.0.0-beta.54",
49 "web3-utils": "^1.0.0-beta.52"
49 "web3-utils": "^1.0.0-beta.52"
50 },
50 },
51 "scripts": {
51 "scripts": {
@@ -56,7 +56,7 @@
56 "checksum": "cd build && find . -exec shasum -a256 {} ';' > ../checksums.txt && cd ..",
56 "checksum": "cd build && find . -exec shasum -a256 {} ';' > ../checksums.txt && cd ..",
57 "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 ..",
57 "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 ..",
58 "release": "npm install && npm run build && npm run checksum && npm run zip",
58 "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 &",
60 "pilot:deploy": "cd node_modules/azimuth-solidity && truffle deploy",
60 "pilot:deploy": "cd node_modules/azimuth-solidity && truffle deploy",
61 "pilot:setup": "npm run pilot:ganache && npm run pilot:deploy",
61 "pilot:setup": "npm run pilot:ganache && npm run pilot:deploy",
62 "pilot": "HTTPS=true npm-run-all pilot:setup start pilot:cleanup --continue-on-error",
62 "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'
18const initWeb3 = (networkType) => {
18const initWeb3 = (networkType) => {
19 if (networkType === NETWORK_NAMES.MAINNET) {
19 if (networkType === NETWORK_NAMES.MAINNET) {
20 const endpoint =
20 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}`
22
22
23 const provider = new Web3.providers.HttpProvider(endpoint)
23 const provider = new Web3.providers.HttpProvider(endpoint)
24 const web3 = new Web3(provider)
24 const web3 = new Web3(provider)
@@ -251,9 +251,12 @@ class Bridge extends React.Component {
251 }
251 }
252
252
253 setTxnConfirmations(txnHash, txnConfirmations) {
253 setTxnConfirmations(txnHash, txnConfirmations) {
254− this.setState((prevState, _) =>
254+ this.setState((prevState, _) => {
255+ return prevState.routeCrumbs.peek() === ROUTE_NAMES.SENT_TRANSACTION
255− ({txnConfirmations: { ...prevState.txnConfirmations,
256+ ? {txnConfirmations: { ...prevState.txnConfirmations,
256− [txnHash]: txnConfirmations}}))
257+ [txnHash]: txnConfirmations}}
258+ : null
259+ })
257 }
260 }
258
261
259 render() {
262 render() {
src/bridge/components/Base.js+5
@@ -38,6 +38,9 @@ import DropdownItem from './DropdownItem';
38import DropdownDivider from './DropdownDivider';
38import DropdownDivider from './DropdownDivider';
39import InnerLabelDropdown from './InnerLabelDropdown';
39import InnerLabelDropdown from './InnerLabelDropdown';
40
40
41+// Option selectors
42+import HorizontalSelector from './HorizontalSelector';
43+
41// Path Control
44// Path Control
42import Breadcrumb from './Breadcrumb';
45import Breadcrumb from './Breadcrumb';
43import BreadcrumbItem from './BreadcrumbItem';
46import BreadcrumbItem from './BreadcrumbItem';
@@ -205,6 +208,8 @@ export {
205 DropdownDivider,
208 DropdownDivider,
206 InnerLabelDropdown,
209 InnerLabelDropdown,
207
210
211+ HorizontalSelector,
212+
208 Breadcrumb,
213 Breadcrumb,
209 BreadcrumbItem,
214 BreadcrumbItem,
210
215
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 {
62 const fullWidthClass = props.fullWidth ? 'full-width' : ''
62 const fullWidthClass = props.fullWidth ? 'full-width' : ''
63
63
64 return (
64 return (
65− <div className={`rel table ${fullWidthClass}`}>
65+ <div className={`rel table ${fullWidthClass} ${props.className}`}>
66 <div
66 <div
67 className={`fix full o-0 ${menuVisibility}`}
67 className={`fix full o-0 ${menuVisibility}`}
68 onClick={this.close}
68 onClick={this.close}
69 />
69 />
70
70
71 <button
71 <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}`}
73 onClick={this.toggle}
73 onClick={this.toggle}
74 disabled={props.disabled}>
74 disabled={props.disabled}>
75 <div className={'flex'}>
75 <div className={'flex'}>
src/bridge/components/StatelessTransaction.js+126−40
@@ -1,4 +1,5 @@
1import { Nothing, Just } from 'folktale/maybe'
1import { Nothing, Just } from 'folktale/maybe'
2+import { Ok } from 'folktale/result'
2import React from 'react'
3import React from 'react'
3
4
4import { Code, H3 } from './Base'
5import { Code, H3 } from './Base'
@@ -10,14 +11,25 @@ import { Warning } from '../components/Base'
10import { addressFromSecp256k1Public } from '../lib/wallet'
11import { addressFromSecp256k1Public } from '../lib/wallet'
11import { BRIDGE_ERROR } from '../lib/error'
12import { BRIDGE_ERROR } from '../lib/error'
12import { ROUTE_NAMES } from '../lib/router'
13import { ROUTE_NAMES } from '../lib/router'
14+import * as tank from '../lib/tank'
13
15
14import {
16import {
15 sendSignedTransaction,
17 sendSignedTransaction,
18+ waitForTransactionConfirm,
16 fromWei,
19 fromWei,
20+ toWei,
21+ hexify,
17 renderSignedTx,
22 renderSignedTx,
18 signTransaction
23 signTransaction
19 } from '../lib/txn'
24 } from '../lib/txn'
20
25
26+const SUBMISSION_STATES = {
27+ PROMPT: 'Send transaction',
28+ PREPARING: 'Preparing...',
29+ FUNDING: 'Finding transaction funding...',
30+ SENDING: 'Sending transaction...'
31+};
32+
21class StatelessTransaction extends React.Component {
33class StatelessTransaction extends React.Component {
22
34
23 constructor(props) {
35 constructor(props) {
@@ -33,11 +45,11 @@ class StatelessTransaction extends React.Component {
33 nonce: '0',
45 nonce: '0',
34 stx: Nothing(),
46 stx: Nothing(),
35 txn: Nothing(),
47 txn: Nothing(),
48+ txStatus: SUBMISSION_STATES.PROMPT,
36 txError: Nothing()
49 txError: Nothing()
37 }
50 }
38
51
39 this.createUnsignedTxn = this.createUnsignedTxn.bind(this)
52 this.createUnsignedTxn = this.createUnsignedTxn.bind(this)
40− this.submit = this.submit.bind(this)
41 this.setUserApproval = this.setUserApproval.bind(this)
53 this.setUserApproval = this.setUserApproval.bind(this)
42 this.setTxn = this.setTxn.bind(this)
54 this.setTxn = this.setTxn.bind(this)
43 this.setStx = this.setStx.bind(this)
55 this.setStx = this.setStx.bind(this)
@@ -86,32 +98,6 @@ class StatelessTransaction extends React.Component {
86 });
98 });
87 }
99 }
88
100
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−
115 handleChainUpdate(chainId) {
101 handleChainUpdate(chainId) {
116 if (chainId === "custom") {
102 if (chainId === "custom") {
117 this.setState({
103 this.setState({
@@ -194,16 +180,114 @@ class StatelessTransaction extends React.Component {
194 })
180 })
195 }
181 }
196
182
197− // TODO: Investigate
183+ async sendTxn() {
198− // setState doesn't seem to work in SetProxy/submit;
184+ const { props, state } = this;
199− // - TypeError: Cannot read property 'updater' of undefined
185+ const web3 = props.web3.value;
200− // so just modifying the DOM manually here. (https://imgur.com/a/i0Qsyq1)
201
186
202− sendTxn(e) {
187+ const stx = state.stx.matchWith({
203− e.target.setAttribute("disabled", true);
188+ Just: tx => tx.value,
204− let spinner = e.target.querySelectorAll('.btn-spinner')[0];
189+ Nothing: () => {
205− spinner.classList.remove('hide');
190+ throw BRIDGE_ERROR.MISSING_TXN;
206− this.submit()
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+ }
207 }
291 }
208
292
209 getChainTitle(chainId) {
293 getChainTitle(chainId) {
@@ -249,7 +333,7 @@ class StatelessTransaction extends React.Component {
249 const { web3, canGenerate } = this.props
333 const { web3, canGenerate } = this.props
250 const { gasPrice, gasLimit, nonce, chainId,
334 const { gasPrice, gasLimit, nonce, chainId,
251 txn, stx, userApproval, showGasDetails,
335 txn, stx, userApproval, showGasDetails,
252− customChain } = this.state
336+ customChain, txStatus } = this.state
253
337
254 const { setNonce, setChainId, setGasLimit, setGasPrice, toggleGasDetails,
338 const { setNonce, setChainId, setGasLimit, setGasPrice, toggleGasDetails,
255 setUserApproval, sendTxn, createUnsignedTxn, handleChainUpdate } = this
339 setUserApproval, sendTxn, createUnsignedTxn, handleChainUpdate } = this
@@ -439,16 +523,18 @@ class StatelessTransaction extends React.Component {
439 </div>
523 </div>
440 </CheckboxButton>
524 </CheckboxButton>
441
525
526+ const sending = (txStatus !== SUBMISSION_STATES.PROMPT);
527+ const sendTxnSpinner = sending ? '' : 'hide';
442 const sendTxnButton =
528 const sendTxnButton =
443 <Button
529 <Button
444 prop-size={ 'xl wide' }
530 prop-size={ 'xl wide' }
445 className={ 'mt-8' }
531 className={ 'mt-8' }
446− disabled={ !canSend }
532+ disabled={ !canSend || sending }
447 onClick={ sendTxn }
533 onClick={ sendTxn }
448 >
534 >
449 <span className="relative">
535 <span className="relative">
450− <span className="btn-spinner hide"></span>
536+ <span className={`btn-spinner ${sendTxnSpinner}`}></span>
451− { 'Send Transaction' }
537+ { txStatus }
452 </span>
538 </span>
453 </Button>
539 </Button>
454
540
src/bridge/lib/ledger.js+4−2
@@ -1,7 +1,8 @@
1import Transport from '@ledgerhq/hw-transport-u2f'
1import Transport from '@ledgerhq/hw-transport-u2f'
2import Eth from '@ledgerhq/hw-app-eth'
2import Eth from '@ledgerhq/hw-app-eth'
3
3
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"
5
6
6const chopHdPrefix = str =>
7const chopHdPrefix = str =>
7 str.slice(0, 2) === "m/"
8 str.slice(0, 2) === "m/"
@@ -24,6 +25,7 @@ const ledgerSignTransaction = async (txn, hdpath) => {
24}
25}
25
26
26export {
27export {
27− LEDGER_BASE_PATH,
28+ LEDGER_LIVE_PATH,
29+ LEDGER_LEGACY_PATH,
28 ledgerSignTransaction
30 ledgerSignTransaction
29}
31}
src/bridge/lib/tank.js+1
@@ -26,6 +26,7 @@ function sendRequest(where, what) {
26}
26}
27
27
28const remainingTransactions = point => {
28const remainingTransactions = point => {
29+ if (typeof point === 'string') point = Number(point);
29 return sendRequest('/point', {point:point});
30 return sendRequest('/point', {point:point});
30};
31};
31
32
src/bridge/lib/trezor.js+2−2
@@ -1,6 +1,6 @@
1import TrezorConnect from 'trezor-connect'
1import TrezorConnect from 'trezor-connect'
2
2
3−const TREZOR_BASE_PATH = "m/44'/60'/0'/0/0"
3+const TREZOR_PATH = "m/44'/60'/0'/0/x"
4
4
5const formatChainId = val =>
5const formatChainId = val =>
6 typeof val === 'number'
6 typeof val === 'number'
@@ -33,7 +33,7 @@ const trezorSignTransaction = async (txn, hdpath) => {
33}
33}
34
34
35export {
35export {
36− TREZOR_BASE_PATH,
36+ TREZOR_PATH,
37 trezorSignTransaction
37 trezorSignTransaction
38}
38}
39
39
src/bridge/lib/txn.js+38−21
@@ -137,32 +137,49 @@ const signTransaction = async config => {
137 setStx(Just(stx))
137 setStx(Just(stx))
138}
138}
139
139
140−const sendSignedTransaction = (web3, stx, confirmationCb) => {
140+const sendSignedTransaction = (web3, stx, doubtNonceError, confirmationCb) => {
141 const txn = stx.matchWith({
141 const txn = stx.matchWith({
142 Just: (tx) => tx.value,
142 Just: (tx) => tx.value,
143 Nothing: () => {
143 Nothing: () => {
144 throw BRIDGE_ERROR.MISSING_TXN
144 throw BRIDGE_ERROR.MISSING_TXN
145 }
145 }
146− })
146+ });
147−
148− const serializedTx = addHexPrefix(txn.serialize().toString('hex'))
149
147
148+ const rawTx = addHexPrefix(txn.serialize().toString('hex'));
149+
150− return new Promise((resolve, reject) => {
150+ return new Promise(async (resolve, reject) => {
151− web3.eth.sendSignedTransaction(serializedTx)
151+ web3.eth.sendSignedTransaction(rawTx)
152− .on('transactionHash', hash =>
152+ .on('transactionHash', hash => {
153− resolve(Just(Ok(hash)))
153+ resolve(hash);
154− )
155− .on('receipt', txn => {
156− resolve(Just(Ok(txn.transactionHash)))
157− })
154+ })
158− .on('confirmation', (confirmationNum, txn) => {
155+ .on('confirmation', (confirmationNum, txn) => {
159− confirmationCb(txn.transactionHash, confirmationNum + 1)
156+ confirmationCb(txn.transactionHash, confirmationNum + 1);
160− resolve(Just(Ok(txn.transactionHash)))
157+ resolve(txn.transactionHash);
161− })
158+ })
162− .on('error', err => {
159+ .on('error', err => {
163− reject(Just(Error(err.message)))
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);
164− })
180+ }
181+ });
165− })
182+ });
166}
183}
167
184
168// returns a Promise<bool>, where the bool indicates tx success/failure
185// returns a Promise<bool>, where the bool indicates tx success/failure
@@ -173,7 +190,7 @@ const waitForTransactionConfirm = (web3, txHash) => {
173 const receipt = await web3.eth.getTransactionReceipt(txHash);
190 const receipt = await web3.eth.getTransactionReceipt(txHash);
174 console.log('tried, got', receipt);
191 console.log('tried, got', receipt);
175 let confirmed = (receipt !== null);
192 let confirmed = (receipt !== null);
176− if (confirmed) resolve(receipt.status === '0x1');
193+ if (confirmed) resolve(receipt.status === true);
177 else setTimeout(checkForConfirm, 13000);
194 else setTimeout(checkForConfirm, 13000);
178 }
195 }
179 checkForConfirm();
196 checkForConfirm();
src/bridge/lib/wallet.js+1−1
@@ -72,7 +72,7 @@ const stripHexPrefix = hex =>
72const keccak256 = str =>
72const keccak256 = str =>
73 keccak('keccak256').update(str).digest()
73 keccak('keccak256').update(str).digest()
74
74
75−const isValidAddress = isAddress
75+const isValidAddress = a => (('0x0' === a) || isAddress(a))
76
76
77const toChecksumAddress = (address) => {
77const toChecksumAddress = (address) => {
78 const addr = stripHexPrefix(address).toLowerCase()
78 const addr = stripHexPrefix(address).toLowerCase()
src/bridge/views/AcceptTransfer.js+4−6
@@ -60,13 +60,11 @@ class AcceptTransfer extends React.Component {
60 }
60 }
61 })
61 })
62
62
63− const owner = props.pointCache[validPoint].owner
64−
65− return Just(azimuth.ecliptic.transferFrom(
63+ return Just(azimuth.ecliptic.transferPoint(
66 validContracts,
64 validContracts,
67− owner,
65+ validPoint,
68 state.receivingAddress,
66 state.receivingAddress,
69− validPoint
67+ true
70 ))
68 ))
71 }
69 }
72
70
@@ -125,7 +123,7 @@ class AcceptTransfer extends React.Component {
125 walletType={props.walletType}
123 walletType={props.walletType}
126 walletHdPath={props.walletHdPath}
124 walletHdPath={props.walletHdPath}
127 networkType={props.networkType}
125 networkType={props.networkType}
128− setTxnHashCursor={props.setTxnHashCursor}
126+ onSent={props.setTxnHashCursor}
129 setTxnConfirmations={props.setTxnConfirmations}
127 setTxnConfirmations={props.setTxnConfirmations}
130 popRoute={props.popRoute}
128 popRoute={props.popRoute}
131 pushRoute={props.pushRoute}
129 pushRoute={props.pushRoute}
src/bridge/views/CancelTransfer.js+1−1
@@ -86,7 +86,7 @@ class CancelTransfer extends React.Component {
86 walletType={props.walletType}
86 walletType={props.walletType}
87 walletHdPath={props.walletHdPath}
87 walletHdPath={props.walletHdPath}
88 networkType={props.networkType}
88 networkType={props.networkType}
89− setTxnHashCursor={props.setTxnHashCursor}
89+ onSent={props.setTxnHashCursor}
90 setTxnConfirmations={props.setTxnConfirmations}
90 setTxnConfirmations={props.setTxnConfirmations}
91 popRoute={props.popRoute}
91 popRoute={props.popRoute}
92 pushRoute={props.pushRoute}
92 pushRoute={props.pushRoute}
src/bridge/views/CreateGalaxy.js+1−1
@@ -211,7 +211,7 @@ class CreateGalaxy extends React.Component {
211 walletType={props.walletType}
211 walletType={props.walletType}
212 walletHdPath={props.walletHdPath}
212 walletHdPath={props.walletHdPath}
213 networkType={props.networkType}
213 networkType={props.networkType}
214− setTxnHashCursor={props.setTxnHashCursor}
214+ onSent={props.setTxnHashCursor}
215 setTxnConfirmations={props.setTxnConfirmations}
215 setTxnConfirmations={props.setTxnConfirmations}
216 popRoute={props.popRoute}
216 popRoute={props.popRoute}
217 pushRoute={props.pushRoute}
217 pushRoute={props.pushRoute}
src/bridge/views/InvitesManage.js+1−1
@@ -176,7 +176,7 @@ class InvitesManage extends React.Component {
176 walletType={this.props.walletType}
176 walletType={this.props.walletType}
177 walletHdPath={this.props.walletHdPath}
177 walletHdPath={this.props.walletHdPath}
178 networkType={this.props.networkType}
178 networkType={this.props.networkType}
179− setTxnHashCursor={this.props.setTxnHashCursor}
179+ onSent={this.props.setTxnHashCursor}
180 setTxnConfirmations={this.props.setTxnConfirmations}
180 setTxnConfirmations={this.props.setTxnConfirmations}
181 popRoute={this.props.popRoute}
181 popRoute={this.props.popRoute}
182 pushRoute={this.props.pushRoute}
182 pushRoute={this.props.pushRoute}
src/bridge/views/InvitesSend.js+1−4
@@ -32,8 +32,6 @@ class InvitesSend extends React.Component {
32 this.handleEmailInput = this.handleEmailInput.bind(this);
32 this.handleEmailInput = this.handleEmailInput.bind(this);
33 this.txnConfirmation = this.txnConfirmation.bind(this);
33 this.txnConfirmation = this.txnConfirmation.bind(this);
34 this.createUnsignedTxn = this.createUnsignedTxn.bind(this);
34 this.createUnsignedTxn = this.createUnsignedTxn.bind(this);
35−
36− this.promptText = 'The email will be sent on first confirmation. Please wait.';
37 }
35 }
38
36
39 componentDidMount() {
37 componentDidMount() {
@@ -191,12 +189,11 @@ class InvitesSend extends React.Component {
191 walletType={this.props.walletType}
189 walletType={this.props.walletType}
192 walletHdPath={this.props.walletHdPath}
190 walletHdPath={this.props.walletHdPath}
193 networkType={this.props.networkType}
191 networkType={this.props.networkType}
194− setTxnHashCursor={this.props.setTxnHashCursor}
195 setTxnConfirmations={this.txnConfirmation}
192 setTxnConfirmations={this.txnConfirmation}
193+ onSent={this.props.setTxnHashCursor}
196 popRoute={this.props.popRoute}
194 popRoute={this.props.popRoute}
197 pushRoute={this.props.pushRoute}
195 pushRoute={this.props.pushRoute}
198 // Other
196 // Other
199− promptText={this.promptText}
200 canGenerate={this.canGenerate()}
197 canGenerate={this.canGenerate()}
201 createUnsignedTxn={this.createUnsignedTxn}
198 createUnsignedTxn={this.createUnsignedTxn}
202 ref={this.statelessRef} />
199 ref={this.statelessRef} />
src/bridge/views/IssueChild.js+35−71
@@ -20,6 +20,15 @@ import {
20 eqAddr
20 eqAddr
21} from '../lib/wallet'
21} from '../lib/wallet'
22
22
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+
23class IssueChild extends React.Component {
32class IssueChild extends React.Component {
24 constructor(props) {
33 constructor(props) {
25 super(props)
34 super(props)
@@ -46,11 +55,12 @@ class IssueChild extends React.Component {
46 desiredPoint: '',
55 desiredPoint: '',
47 isAvailable: Nothing(), // use Nothing to allow attempt when offline
56 isAvailable: Nothing(), // use Nothing to allow attempt when offline
48 suggestions: suggestions,
57 suggestions: suggestions,
58+ validChildren: new Set(),
59+ autoComplete: ''
49 }
60 }
50
61
51 this.handlePointInput = this.handlePointInput.bind(this)
62 this.handlePointInput = this.handlePointInput.bind(this)
52 this.handleAddressInput = this.handleAddressInput.bind(this)
63 this.handleAddressInput = this.handleAddressInput.bind(this)
53− this.handleConfirmAvailability = this.handleConfirmAvailability.bind(this)
54 this.createUnsignedTxn = this.createUnsignedTxn.bind(this)
64 this.createUnsignedTxn = this.createUnsignedTxn.bind(this)
55 this.statelessRef = React.createRef();
65 this.statelessRef = React.createRef();
56 }
66 }
@@ -60,28 +70,11 @@ class IssueChild extends React.Component {
60 this.statelessRef.current.clearTxn()
70 this.statelessRef.current.clearTxn()
61 }
71 }
62
72
63− handlePointInput(desiredPoint) {
73+ componentWillMount() {
64− if (desiredPoint.length < 15) {
65− this.setState({
66− desiredPoint,
67− isAvailable: Nothing()
68− })
69− this.statelessRef.current.clearTxn()
70− }
71− }
72
74
73− handleConfirmAvailability() {
74− this.confirmPointAvailability().then(r => {
75− this.setState({
76− isAvailable: r,
77− })
78− })
79−
80− }
81−
82− async confirmPointAvailability() {
83 const { contracts } = this.props
75 const { contracts } = this.props
84− const { desiredPoint } = this.state
76+ const { issuingPoint } = this.state
77+
85
78
86 const validContracts = contracts.matchWith({
79 const validContracts = contracts.matchWith({
87 Just: cs => cs.value,
80 Just: cs => cs.value,
@@ -90,31 +83,28 @@ class IssueChild extends React.Component {
90 }
83 }
91 })
84 })
92
85
93− if (canDecodePatp(desiredPoint) === false) {
86+ azimuth.getUnspawnedChildren(validContracts, issuingPoint).then(ps => this.setState({ validChildren: new Set(ps.map(ob.patp)) }))
94− return Just(false)
95− }
87+ }
96
88
97− const point = ob.patp2dec(desiredPoint)
89+ handlePointInput(desiredPoint) {
98− const pointSize = azimuth.getPointSize(point)
90+ if (desiredPoint.length < 15) {
99
91
100− const prefix = azimuth.getPrefix(point)
92+ const suggestedPoint = setFind(this.state.validChildren, (e => e.startsWith(desiredPoint))) || ''
101− const prefixSize = azimuth.getPointSize(prefix)
93+ const rendered = ' '.repeat(desiredPoint.length) + suggestedPoint.substring(desiredPoint.length)
102
94
103− // NB (jtobin): this prevents galaxies from attempting to spawn planets
95+ const available = Just(this.state.validChildren.has(desiredPoint))
104− //
105− if (pointSize !== prefixSize + 1) {
106− return Just(false)
107− }
108
96
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()
110
103
111− if (eqAddr(owner, ETH_ZERO_ADDR)) {
112− return Just(true)
113 }
104 }
114−
115− return Just(false)
116 }
105 }
117
106
107+
118 createUnsignedTxn() {
108 createUnsignedTxn() {
119 const { state, props } = this
109 const { state, props } = this
120
110
@@ -140,19 +130,6 @@ class IssueChild extends React.Component {
140 return Just(txn)
130 return Just(txn)
141 }
131 }
142
132
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− }
156
133
157 validatePoint = patp => {
134 validatePoint = patp => {
158 const point = this.point
135 const point = this.point
@@ -176,16 +153,13 @@ class IssueChild extends React.Component {
176 const { props, state } = this
153 const { props, state } = this
177
154
178 const validAddress = isValidAddress(state.receivingAddress)
155 const validAddress = isValidAddress(state.receivingAddress)
179− const validPoint = canDecodePatp(state.desiredPoint)
180
156
181 const canGenerate = props.web3.matchWith({
157 const canGenerate = props.web3.matchWith({
182 Nothing: () => {
158 Nothing: () => {
183− return validAddress === true &&
159+ return validAddress === true
184− validPoint === true
185 },
160 },
186 Just: () => {
161 Just: () => {
187 return validAddress === true &&
162 return validAddress === true &&
188− validPoint === true &&
189 state.isAvailable.value === true
163 state.isAvailable.value === true
190 }
164 }
191 })
165 })
@@ -250,6 +224,11 @@ class IssueChild extends React.Component {
250 value={ state.desiredPoint }
224 value={ state.desiredPoint }
251 onChange={ this.handlePointInput }>
225 onChange={ this.handlePointInput }>
252 <InnerLabel>{ 'Point to Issue' }</InnerLabel>
226 <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>
253 <ValidatedSigil
232 <ValidatedSigil
254 className={'tr-0 mt-05 mr-0 abs'}
233 className={'tr-0 mt-05 mr-0 abs'}
255 patp={state.desiredPoint}
234 patp={state.desiredPoint}
@@ -279,21 +258,6 @@ class IssueChild extends React.Component {
279 {'View on Etherscan ↗'}
258 {'View on Etherscan ↗'}
280 </Anchor>
259 </Anchor>
281
260
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−
297 <StatelessTransaction
261 <StatelessTransaction
298 // Upper scope
262 // Upper scope
299 web3={props.web3}
263 web3={props.web3}
@@ -302,7 +266,7 @@ class IssueChild extends React.Component {
302 walletType={props.walletType}
266 walletType={props.walletType}
303 walletHdPath={props.walletHdPath}
267 walletHdPath={props.walletHdPath}
304 networkType={props.networkType}
268 networkType={props.networkType}
305− setTxnHashCursor={props.setTxnHashCursor}
269+ onSent={props.setTxnHashCursor}
306 setTxnConfirmations={props.setTxnConfirmations}
270 setTxnConfirmations={props.setTxnConfirmations}
307 popRoute={props.popRoute}
271 popRoute={props.popRoute}
308 pushRoute={props.pushRoute}
272 pushRoute={props.pushRoute}
src/bridge/views/Ledger.js+86−14
@@ -3,12 +3,12 @@ import React from 'react'
3import Maybe from 'folktale/maybe'
3import Maybe from 'folktale/maybe'
4import { Button } from '../components/Base'
4import { Button } from '../components/Base'
5import { Row, Col, H1, P, H2 } from '../components/Base'
5import { Row, Col, H1, P, H2 } from '../components/Base'
6−import { Input, InnerLabel } from '../components/Base'
6+import { Input, InnerLabel, InnerLabelDropdown } from '../components/Base'
7import Transport from '@ledgerhq/hw-transport-u2f'
7import Transport from '@ledgerhq/hw-transport-u2f'
8import Eth from '@ledgerhq/hw-app-eth'
8import Eth from '@ledgerhq/hw-app-eth'
9import * as secp256k1 from 'secp256k1'
9import * as secp256k1 from 'secp256k1'
10
10
11−import { LEDGER_BASE_PATH } from '../lib/ledger'
11+import { LEDGER_LIVE_PATH, LEDGER_LEGACY_PATH } from '../lib/ledger'
12import { ROUTE_NAMES } from '../lib/router'
12import { ROUTE_NAMES } from '../lib/router'
13
13
14const chopHdPrefix = str =>
14const chopHdPrefix = str =>
@@ -26,11 +26,32 @@ class Ledger extends React.Component {
26 super(props)
26 super(props)
27
27
28 this.state = {
28 this.state = {
29− hdpath: LEDGER_BASE_PATH
29+ basePath: LEDGER_LIVE_PATH,
30+ hdpath: LEDGER_LIVE_PATH.replace(/x/g, 0),
31+ account: 0
30 }
32 }
31
33
32 this.pollDevice = this.pollDevice.bind(this)
34 this.pollDevice = this.pollDevice.bind(this)
33 this.handleHdPathInput = this.handleHdPathInput.bind(this)
35 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 });
34 }
55 }
35
56
36 handleHdPathInput(hdpath) {
57 handleHdPathInput(hdpath) {
@@ -60,7 +81,66 @@ class Ledger extends React.Component {
60
81
61 render() {
82 render() {
62 const { pushRoute, popRoute, wallet } = this.props
83 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> );
64
144
65 return (
145 return (
66
146
@@ -99,16 +179,8 @@ class Ledger extends React.Component {
99 <li className={'mt-4'}>{'Run '}<code>{'python bridge-https.py'}</code></li>
179 <li className={'mt-4'}>{'Run '}<code>{'python bridge-https.py'}</code></li>
100 </ol>
180 </ol>
101
181
102− <Input
182+ { basePathSelection }
103− className='pt-8 mt-8 text-mono'
183+ { truePathSelection }
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>
112
184
113 <Button
185 <Button
114 prop-size={'wide lg'}
186 prop-size={'wide lg'}
src/bridge/views/Network.js+2−2
@@ -36,7 +36,7 @@ class Network extends React.Component {
36 setNetworkType(network)
36 setNetworkType(network)
37
37
38 const endpoint =
38 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}`
40
40
41 const provider = new Web3.providers.HttpProvider(endpoint)
41 const provider = new Web3.providers.HttpProvider(endpoint)
42 const web3 = new Web3(provider)
42 const web3 = new Web3(provider)
@@ -49,7 +49,7 @@ class Network extends React.Component {
49 setNetworkType(network)
49 setNetworkType(network)
50
50
51 const endpoint =
51 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}`
53
53
54 const provider = new Web3.providers.HttpProvider(endpoint)
54 const provider = new Web3.providers.HttpProvider(endpoint)
55 const web3 = new Web3(provider)
55 const web3 = new Web3(provider)
src/bridge/views/Point/Actions.js+2−2
@@ -215,7 +215,7 @@ const Actions = (props) => {
215 pushRoute(ROUTE_NAMES.SET_SPAWN_PROXY)
215 pushRoute(ROUTE_NAMES.SET_SPAWN_PROXY)
216 }}
216 }}
217 >
217 >
218− { 'Set spawn proxy' }
218+ { 'Change spawn proxy' }
219 </Button>
219 </Button>
220
220
221 <Button
221 <Button
@@ -226,7 +226,7 @@ const Actions = (props) => {
226 pushRoute(ROUTE_NAMES.SET_MANAGEMENT_PROXY)
226 pushRoute(ROUTE_NAMES.SET_MANAGEMENT_PROXY)
227 }}
227 }}
228 >
228 >
229− { 'Set management proxy' }
229+ { 'Change management proxy' }
230 </Button>
230 </Button>
231
231
232 <Button
232 <Button
src/bridge/views/SentTransaction.js−13
@@ -126,7 +126,6 @@ const SentTransaction = (props) => {
126 const { setPointCursor, pointCursor } = props
126 const { setPointCursor, pointCursor } = props
127
127
128 const promptKeyfile = props.routeData && props.routeData.promptKeyfile
128 const promptKeyfile = props.routeData && props.routeData.promptKeyfile
129− const promptText = props.routeData && props.routeData.promptText
130
129
131 const w3 = web3.matchWith({
130 const w3 = web3.matchWith({
132 Nothing: _ => { throw BRIDGE_ERROR.MISSING_WEB3 },
131 Nothing: _ => { throw BRIDGE_ERROR.MISSING_WEB3 },
@@ -148,17 +147,6 @@ const SentTransaction = (props) => {
148 />
147 />
149 })
148 })
150
149
151− let text;
152− if (promptText) {
153− text = (
154− <Row>
155− <Col>
156− <p>{promptText}</p>
157− </Col>
158− </Row>
159− )
160− }
161−
162 const ok =
150 const ok =
163 <Row>
151 <Row>
164 <Col>
152 <Col>
@@ -199,7 +187,6 @@ const SentTransaction = (props) => {
199 return (
187 return (
200 <div>
188 <div>
201 { body }
189 { body }
202− { text }
203 { ok }
190 { ok }
204 { keyfile }
191 { keyfile }
205 </div>
192 </div>
src/bridge/views/SetKeys.js+1−1
@@ -193,7 +193,7 @@ class SetKeys extends React.Component {
193 walletType={props.walletType}
193 walletType={props.walletType}
194 walletHdPath={props.walletHdPath}
194 walletHdPath={props.walletHdPath}
195 networkType={props.networkType}
195 networkType={props.networkType}
196− setTxnHashCursor={props.setTxnHashCursor}
196+ onSent={props.setTxnHashCursor}
197 setTxnConfirmations={props.setTxnConfirmations}
197 setTxnConfirmations={props.setTxnConfirmations}
198 popRoute={props.popRoute}
198 popRoute={props.popRoute}
199 pushRoute={props.pushRoute}
199 pushRoute={props.pushRoute}
src/bridge/views/SetProxy.js+59−30
@@ -1,7 +1,7 @@
1import Maybe from 'folktale/maybe'
1import Maybe from 'folktale/maybe'
2import React from 'react'
2import React from 'react'
3import * as azimuth from 'azimuth-js'
3import * 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'
5import { AddressInput } from '../components/Base'
5import { AddressInput } from '../components/Base'
6import * as ob from 'urbit-ob'
6import * as ob from 'urbit-ob'
7
7
@@ -46,13 +46,23 @@ class SetProxy extends React.Component {
46 this.state = {
46 this.state = {
47 proxyAddress: '',
47 proxyAddress: '',
48 issuingPoint: issuingPoint,
48 issuingPoint: issuingPoint,
49+ setProxy: true
49 }
50 }
50
51
51 this.statelessRef = React.createRef();
52 this.statelessRef = React.createRef();
53+ this.handleSetUnset = this.handleSetUnset.bind(this);
52 this.handleAddressInput = this.handleAddressInput.bind(this)
54 this.handleAddressInput = this.handleAddressInput.bind(this)
53 this.createUnsignedTxn = this.createUnsignedTxn.bind(this)
55 this.createUnsignedTxn = this.createUnsignedTxn.bind(this)
54 }
56 }
55
57
58+ handleSetUnset(selected) {
59+ const set = (selected === 'set');
60+ this.setState({
61+ setProxy: set,
62+ proxyAddress: set ? '' : '0x0000000000000000000000000000000000000000'
63+ });
64+ }
65+
56 handleAddressInput(proxyAddress) {
66 handleAddressInput(proxyAddress) {
57 this.setState({ proxyAddress })
67 this.setState({ proxyAddress })
58
68
@@ -116,42 +126,61 @@ class SetProxy extends React.Component {
116
126
117 const ucFirst = w => w.charAt(0).toUpperCase() + w.slice(1);
127 const ucFirst = w => w.charAt(0).toUpperCase() + w.slice(1);
118
128
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+ }
119
168
120 return (
169 return (
121 <Row>
170 <Row>
122 <Col>
171 <Col>
123 <H1>
172 <H1>
124− { `Set ${ucFirst(renderedProxyType)} Proxy For ` }
173+ { `${titleVerb} ${ucFirst(renderedProxyType)} Proxy For ` }
125 <code>{ `${ob.patp(state.issuingPoint)}` }</code>
174 <code>{ `${ob.patp(state.issuingPoint)}` }</code>
126 </H1>
175 </H1>
127
176
128− <P>
177+ <HorizontalSelector
129− {
178+ options={setUnset}
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) }>
179+ onChange={this.handleSetUnset}
143− <InnerLabel>{ 'Proxy Address' }</InnerLabel>
180+ className='mt-8'
144− <ShowBlockie className={'mt-1'} address={state.proxyAddress} />
181+ />
145− </AddressInput>
182+
146−
183+ { addressInput }
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>
155
184
156 <StatelessTransaction
185 <StatelessTransaction
157 // Upper scope
186 // Upper scope
@@ -161,7 +190,7 @@ class SetProxy extends React.Component {
161 walletType={props.walletType}
190 walletType={props.walletType}
162 walletHdPath={props.walletHdPath}
191 walletHdPath={props.walletHdPath}
163 networkType={props.networkType}
192 networkType={props.networkType}
164− setTxnHashCursor={props.setTxnHashCursor}
193+ onSent={props.setTxnHashCursor}
165 setTxnConfirmations={props.setTxnConfirmations}
194 setTxnConfirmations={props.setTxnConfirmations}
166 popRoute={props.popRoute}
195 popRoute={props.popRoute}
167 pushRoute={props.pushRoute}
196 pushRoute={props.pushRoute}
src/bridge/views/Transfer.js+1−1
@@ -131,7 +131,7 @@ class Transfer extends React.Component {
131 walletType={props.walletType}
131 walletType={props.walletType}
132 walletHdPath={props.walletHdPath}
132 walletHdPath={props.walletHdPath}
133 networkType={props.networkType}
133 networkType={props.networkType}
134− setTxnHashCursor={props.setTxnHashCursor}
134+ onSent={props.setTxnHashCursor}
135 setTxnConfirmations={props.setTxnConfirmations}
135 setTxnConfirmations={props.setTxnConfirmations}
136 popRoute={props.popRoute}
136 popRoute={props.popRoute}
137 pushRoute={props.pushRoute}
137 pushRoute={props.pushRoute}
src/bridge/views/Trezor.js+57−14
@@ -3,11 +3,11 @@ import React from 'react'
3import Maybe from 'folktale/maybe'
3import Maybe from 'folktale/maybe'
4import { Button } from '../components/Base'
4import { Button } from '../components/Base'
5import { Row, Col, H1, P } from '../components/Base'
5import { Row, Col, H1, P } from '../components/Base'
6−import { InnerLabel, Input } from '../components/Base'
6+import { InnerLabel, Input, InnerLabelDropdown } from '../components/Base'
7import TrezorConnect from 'trezor-connect'
7import TrezorConnect from 'trezor-connect'
8import * as secp256k1 from 'secp256k1'
8import * as secp256k1 from 'secp256k1'
9
9
10−import { TREZOR_BASE_PATH } from '../lib/trezor'
10+import { TREZOR_PATH } from '../lib/trezor'
11import { ROUTE_NAMES } from '../lib/router'
11import { ROUTE_NAMES } from '../lib/router'
12
12
13class Trezor extends React.Component {
13class Trezor extends React.Component {
@@ -16,13 +16,23 @@ class Trezor extends React.Component {
16 super(props)
16 super(props)
17
17
18 this.state = {
18 this.state = {
19− hdpath: TREZOR_BASE_PATH
19+ hdpath: TREZOR_PATH.replace(/x/g, 0),
20+ account: 0
20 }
21 }
21
22
23+ this.handleAccountSelection = this.handleAccountSelection.bind(this)
22 this.handleHdPathInput = this.handleHdPathInput.bind(this)
24 this.handleHdPathInput = this.handleHdPathInput.bind(this)
23 this.pollDevice = this.pollDevice.bind(this)
25 this.pollDevice = this.pollDevice.bind(this)
24 }
26 }
25
27
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+
26 handleHdPathInput(hdpath) {
36 handleHdPathInput(hdpath) {
27 this.setState({ hdpath })
37 this.setState({ hdpath })
28 }
38 }
@@ -53,7 +63,48 @@ class Trezor extends React.Component {
53
63
54 render() {
64 render() {
55 const { pushRoute, popRoute, wallet } = this.props
65 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+ );
57
108
58 return (
109 return (
59 <Row>
110 <Row>
@@ -66,16 +117,8 @@ class Trezor extends React.Component {
66 }
117 }
67 </P>
118 </P>
68
119
69− <Input
120+ { accountSelection }
70− className='pt-8 text-mono'
121+ { pathSelection }
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>
79
122
80 <Button
123 <Button
81 className={'mt-8'}
124 className={'mt-8'}