on master help sign in
Merge branch 'master' into mino-onboarding-invites
1c60801Fang
package-lock.json+521−248
@@ -1058,6 +1058,19 @@
1058 "text-encoding": "^0.6.1"
1058 "text-encoding": "^0.6.1"
1059 }
1059 }
1060 },
1060 },
1061+ "@types/bn.js": {
1062+ "version": "4.11.5",
1063+ "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.5.tgz",
1064+ "integrity": "sha512-AEAZcIZga0JgVMHNtl1CprA/hXX7/wPt79AgR4XqaDt7jyj3QWYw6LPoOiznPtugDmlubUnAahMs2PFxGcQrng==",
1065+ "requires": {
1066+ "@types/node": "*"
1067+ }
1068+ },
1069+ "@types/node": {
1070+ "version": "10.14.4",
1071+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.4.tgz",
1072+ "integrity": "sha512-DT25xX/YgyPKiHFOpNuANIQIVvYEwCWXgK2jYYwqgaMrYE6+tq+DtmMwlD3drl6DJbUwtlIDnn0d7tIn/EbXBg=="
1073+ },
1061 "@types/q": {
1074 "@types/q": {
1062 "version": "1.5.1",
1075 "version": "1.5.1",
1063 "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.1.tgz",
1076 "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.1.tgz",
@@ -1251,7 +1264,7 @@
1251 "flat": "^4.1.0",
1264 "flat": "^4.1.0",
1252 "lodash": "^4.17.10",
1265 "lodash": "^4.17.10",
1253 "qr-image": "^3.2.0",
1266 "qr-image": "^3.2.0",
1254− "sigil-js": "github:urbit/sigil-js",
1267+ "sigil-js": "github:urbit/sigil-js#1864796bb3f482e597fd85acfd324795e42b2465",
1255 "urbit-ob": "^1.4.4"
1268 "urbit-ob": "^1.4.4"
1256 },
1269 },
1257 "dependencies": {
1270 "dependencies": {
@@ -1988,6 +2001,43 @@
1988 "azimuth-solidity": "1.0.2",
2001 "azimuth-solidity": "1.0.2",
1989 "ethereumjs-util": "^5.2.0",
2002 "ethereumjs-util": "^5.2.0",
1990 "web3": "1.0.0-beta.33"
2003 "web3": "1.0.0-beta.33"
2004+ },
2005+ "dependencies": {
2006+ "bn.js": {
2007+ "version": "4.11.6",
2008+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
2009+ "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU="
2010+ },
2011+ "web3": {
2012+ "version": "1.0.0-beta.33",
2013+ "resolved": "https://registry.npmjs.org/web3/-/web3-1.0.0-beta.33.tgz",
2014+ "integrity": "sha1-xgIbV2mSdyY3HBhLhoRFMRsTkpU=",
2015+ "requires": {
2016+ "web3-bzz": "1.0.0-beta.33",
2017+ "web3-core": "1.0.0-beta.33",
2018+ "web3-eth": "1.0.0-beta.33",
2019+ "web3-eth-personal": "1.0.0-beta.33",
2020+ "web3-net": "1.0.0-beta.33",
2021+ "web3-shh": "1.0.0-beta.33",
2022+ "web3-utils": "1.0.0-beta.33"
2023+ },
2024+ "dependencies": {
2025+ "web3-utils": {
2026+ "version": "1.0.0-beta.33",
2027+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.33.tgz",
2028+ "integrity": "sha1-4JG3mU8JtxSwGYpAV9OtLrjL4jg=",
2029+ "requires": {
2030+ "bn.js": "4.11.6",
2031+ "eth-lib": "0.1.27",
2032+ "ethjs-unit": "0.1.6",
2033+ "number-to-bn": "1.7.0",
2034+ "randomhex": "0.1.5",
2035+ "underscore": "1.8.3",
2036+ "utf8": "2.1.1"
2037+ }
2038+ }
2039+ }
2040+ }
1991 }
2041 }
1992 },
2042 },
1993 "azimuth-solidity": {
2043 "azimuth-solidity": {
@@ -6419,8 +6469,7 @@
6419 },
6469 },
6420 "ansi-regex": {
6470 "ansi-regex": {
6421 "version": "2.1.1",
6471 "version": "2.1.1",
6422− "bundled": true,
6472+ "bundled": true
6423− "optional": true
6424 },
6473 },
6425 "aproba": {
6474 "aproba": {
6426 "version": "1.2.0",
6475 "version": "1.2.0",
@@ -6438,13 +6487,11 @@
6438 },
6487 },
6439 "balanced-match": {
6488 "balanced-match": {
6440 "version": "1.0.0",
6489 "version": "1.0.0",
6441− "bundled": true,
6490+ "bundled": true
6442− "optional": true
6443 },
6491 },
6444 "brace-expansion": {
6492 "brace-expansion": {
6445 "version": "1.1.11",
6493 "version": "1.1.11",
6446 "bundled": true,
6494 "bundled": true,
6447− "optional": true,
6448 "requires": {
6495 "requires": {
6449 "balanced-match": "^1.0.0",
6496 "balanced-match": "^1.0.0",
6450 "concat-map": "0.0.1"
6497 "concat-map": "0.0.1"
@@ -6457,18 +6504,15 @@
6457 },
6504 },
6458 "code-point-at": {
6505 "code-point-at": {
6459 "version": "1.1.0",
6506 "version": "1.1.0",
6460− "bundled": true,
6507+ "bundled": true
6461− "optional": true
6462 },
6508 },
6463 "concat-map": {
6509 "concat-map": {
6464 "version": "0.0.1",
6510 "version": "0.0.1",
6465− "bundled": true,
6511+ "bundled": true
6466− "optional": true
6467 },
6512 },
6468 "console-control-strings": {
6513 "console-control-strings": {
6469 "version": "1.1.0",
6514 "version": "1.1.0",
6470− "bundled": true,
6515+ "bundled": true
6471− "optional": true
6472 },
6516 },
6473 "core-util-is": {
6517 "core-util-is": {
6474 "version": "1.0.2",
6518 "version": "1.0.2",
@@ -6571,8 +6615,7 @@
6571 },
6615 },
6572 "inherits": {
6616 "inherits": {
6573 "version": "2.0.3",
6617 "version": "2.0.3",
6574− "bundled": true,
6618+ "bundled": true
6575− "optional": true
6576 },
6619 },
6577 "ini": {
6620 "ini": {
6578 "version": "1.3.5",
6621 "version": "1.3.5",
@@ -6582,7 +6625,6 @@
6582 "is-fullwidth-code-point": {
6625 "is-fullwidth-code-point": {
6583 "version": "1.0.0",
6626 "version": "1.0.0",
6584 "bundled": true,
6627 "bundled": true,
6585− "optional": true,
6586 "requires": {
6628 "requires": {
6587 "number-is-nan": "^1.0.0"
6629 "number-is-nan": "^1.0.0"
6588 }
6630 }
@@ -6595,20 +6637,17 @@
6595 "minimatch": {
6637 "minimatch": {
6596 "version": "3.0.4",
6638 "version": "3.0.4",
6597 "bundled": true,
6639 "bundled": true,
6598− "optional": true,
6599 "requires": {
6640 "requires": {
6600 "brace-expansion": "^1.1.7"
6641 "brace-expansion": "^1.1.7"
6601 }
6642 }
6602 },
6643 },
6603 "minimist": {
6644 "minimist": {
6604 "version": "0.0.8",
6645 "version": "0.0.8",
6605− "bundled": true,
6646+ "bundled": true
6606− "optional": true
6607 },
6647 },
6608 "minipass": {
6648 "minipass": {
6609 "version": "2.2.4",
6649 "version": "2.2.4",
6610 "bundled": true,
6650 "bundled": true,
6611− "optional": true,
6612 "requires": {
6651 "requires": {
6613 "safe-buffer": "^5.1.1",
6652 "safe-buffer": "^5.1.1",
6614 "yallist": "^3.0.0"
6653 "yallist": "^3.0.0"
@@ -6625,7 +6664,6 @@
6625 "mkdirp": {
6664 "mkdirp": {
6626 "version": "0.5.1",
6665 "version": "0.5.1",
6627 "bundled": true,
6666 "bundled": true,
6628− "optional": true,
6629 "requires": {
6667 "requires": {
6630 "minimist": "0.0.8"
6668 "minimist": "0.0.8"
6631 }
6669 }
@@ -6698,8 +6736,7 @@
6698 },
6736 },
6699 "number-is-nan": {
6737 "number-is-nan": {
6700 "version": "1.0.1",
6738 "version": "1.0.1",
6701− "bundled": true,
6739+ "bundled": true
6702− "optional": true
6703 },
6740 },
6704 "object-assign": {
6741 "object-assign": {
6705 "version": "4.1.1",
6742 "version": "4.1.1",
@@ -6709,7 +6746,6 @@
6709 "once": {
6746 "once": {
6710 "version": "1.4.0",
6747 "version": "1.4.0",
6711 "bundled": true,
6748 "bundled": true,
6712− "optional": true,
6713 "requires": {
6749 "requires": {
6714 "wrappy": "1"
6750 "wrappy": "1"
6715 }
6751 }
@@ -6785,8 +6821,7 @@
6785 },
6821 },
6786 "safe-buffer": {
6822 "safe-buffer": {
6787 "version": "5.1.1",
6823 "version": "5.1.1",
6788− "bundled": true,
6824+ "bundled": true
6789− "optional": true
6790 },
6825 },
6791 "safer-buffer": {
6826 "safer-buffer": {
6792 "version": "2.1.2",
6827 "version": "2.1.2",
@@ -6816,7 +6851,6 @@
6816 "string-width": {
6851 "string-width": {
6817 "version": "1.0.2",
6852 "version": "1.0.2",
6818 "bundled": true,
6853 "bundled": true,
6819− "optional": true,
6820 "requires": {
6854 "requires": {
6821 "code-point-at": "^1.0.0",
6855 "code-point-at": "^1.0.0",
6822 "is-fullwidth-code-point": "^1.0.0",
6856 "is-fullwidth-code-point": "^1.0.0",
@@ -6834,7 +6868,6 @@
6834 "strip-ansi": {
6868 "strip-ansi": {
6835 "version": "3.0.1",
6869 "version": "3.0.1",
6836 "bundled": true,
6870 "bundled": true,
6837− "optional": true,
6838 "requires": {
6871 "requires": {
6839 "ansi-regex": "^2.0.0"
6872 "ansi-regex": "^2.0.0"
6840 }
6873 }
@@ -6873,13 +6906,11 @@
6873 },
6906 },
6874 "wrappy": {
6907 "wrappy": {
6875 "version": "1.0.2",
6908 "version": "1.0.2",
6876− "bundled": true,
6909+ "bundled": true
6877− "optional": true
6878 },
6910 },
6879 "yallist": {
6911 "yallist": {
6880 "version": "3.0.2",
6912 "version": "3.0.2",
6881− "bundled": true,
6913+ "bundled": true
6882− "optional": true
6883 }
6914 }
6884 }
6915 }
6885 },
6916 },
@@ -10805,9 +10836,9 @@
10805 }
10836 }
10806 },
10837 },
10807 "mock-fs": {
10838 "mock-fs": {
10808− "version": "4.7.0",
10839+ "version": "4.8.0",
10809− "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.7.0.tgz",
10840+ "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.8.0.tgz",
10810− "integrity": "sha512-WlQNtUlzMRpvLHf8dqeUmNqfdPjGY29KrJF50Ldb4AcL+vQeR8QH3wQcFMgrhTwb1gHjZn9xggho+84tBskLgA=="
10841+ "integrity": "sha512-Gwj4KnJOW15YeTJKO5frFd/WDO5Mc0zxXqL9oHx3+e9rBqW8EVARqQHSaIXznUdljrD6pvbNGW2ZGXKPEfYJfw=="
10811 },
10842 },
10812 "more-entropy": {
10843 "more-entropy": {
10813 "version": "0.0.7",
10844 "version": "0.0.7",
@@ -11566,12 +11597,12 @@
11566 }
11597 }
11567 },
11598 },
11568 "parse-headers": {
11599 "parse-headers": {
11569− "version": "2.0.1",
11600+ "version": "2.0.2",
11570− "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz",
11601+ "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.2.tgz",
11571− "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=",
11602+ "integrity": "sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg==",
11572 "requires": {
11603 "requires": {
11573− "for-each": "^0.3.2",
11604+ "for-each": "^0.3.3",
11574− "trim": "0.0.1"
11605+ "string.prototype.trim": "^1.1.2"
11575 }
11606 }
11576 },
11607 },
11577 "parse-json": {
11608 "parse-json": {
@@ -18041,6 +18072,16 @@
18041 "function-bind": "^1.0.2"
18072 "function-bind": "^1.0.2"
18042 }
18073 }
18043 },
18074 },
18075+ "string.prototype.trim": {
18076+ "version": "1.1.2",
18077+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz",
18078+ "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=",
18079+ "requires": {
18080+ "define-properties": "^1.1.2",
18081+ "es-abstract": "^1.5.0",
18082+ "function-bind": "^1.0.2"
18083+ }
18084+ },
18044 "string_decoder": {
18085 "string_decoder": {
18045 "version": "1.1.1",
18086 "version": "1.1.1",
18046 "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
18087 "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
@@ -18724,11 +18765,6 @@
18724 }
18765 }
18725 }
18766 }
18726 },
18767 },
18727− "trim": {
18728− "version": "0.0.1",
18729− "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
18730− "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0="
18731− },
18732 "trim-right": {
18768 "trim-right": {
18733 "version": "1.0.1",
18769 "version": "1.0.1",
18734 "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
18770 "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
@@ -18940,29 +18976,12 @@
18940 "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og=="
18976 "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og=="
18941 },
18977 },
18942 "unbzip2-stream": {
18978 "unbzip2-stream": {
18943− "version": "1.3.1",
18979+ "version": "1.3.3",
18944− "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.1.tgz",
18980+ "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz",
18945− "integrity": "sha512-fIZnvdjblYs7Cru/xC6tCPVhz7JkYcVQQkePwMLyQELzYTds2Xn8QefPVnvdVhhZqubxNA1cASXEH5wcK0Bucw==",
18981+ "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==",
18946 "requires": {
18982 "requires": {
18947− "buffer": "^3.0.1",
18983+ "buffer": "^5.2.1",
18948− "through": "^2.3.6"
18984+ "through": "^2.3.8"
18949− },
18950− "dependencies": {
18951− "base64-js": {
18952− "version": "0.0.8",
18953− "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz",
18954− "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg="
18955− },
18956− "buffer": {
18957− "version": "3.6.0",
18958− "resolved": "http://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz",
18959− "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=",
18960− "requires": {
18961− "base64-js": "0.0.8",
18962− "ieee754": "^1.1.4",
18963− "isarray": "^1.0.0"
18964− }
18965− }
18966 }
18985 }
18967 },
18986 },
18968 "underscore": {
18987 "underscore": {
@@ -19401,241 +19420,413 @@
19401 "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
19420 "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
19402 "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU="
19421 "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU="
19403 },
19422 },
19404− "uuid": {
19405− "version": "2.0.1",
19406− "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz",
19407− "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w="
19408− },
19409− "web3-bzz": {
19410− "version": "1.0.0-beta.33",
19411− "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.0.0-beta.33.tgz",
19412− "integrity": "sha1-MVAPaZt+cO31FJDFXv+0J7+7OwE=",
19413− "requires": {
19414− "got": "7.1.0",
19415− "swarm-js": "0.1.37",
19416− "underscore": "1.8.3"
19417− }
19418− },
19419− "web3-core": {
19420− "version": "1.0.0-beta.33",
19421− "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.0.0-beta.33.tgz",
19422− "integrity": "sha1-+C7VJfW2auzale7O08rSvWlfeDk=",
19423− "requires": {
19424− "web3-core-helpers": "1.0.0-beta.33",
19425− "web3-core-method": "1.0.0-beta.33",
19426− "web3-core-requestmanager": "1.0.0-beta.33",
19427− "web3-utils": "1.0.0-beta.33"
19423+ "web3-utils": {
19428− }
19429− },
19430− "web3-core-helpers": {
19431 "version": "1.0.0-beta.33",
19424 "version": "1.0.0-beta.33",
19432− "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.33.tgz",
19425+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.33.tgz",
19433− "integrity": "sha1-Kvcz5QTbBefDZIwdrPV3sOwV3EM=",
19426+ "integrity": "sha1-4JG3mU8JtxSwGYpAV9OtLrjL4jg=",
19434 "requires": {
19427 "requires": {
19428+ "bn.js": "4.11.6",
19429+ "eth-lib": "0.1.27",
19430+ "ethjs-unit": "0.1.6",
19431+ "number-to-bn": "1.7.0",
19432+ "randomhex": "0.1.5",
19435 "underscore": "1.8.3",
19433 "underscore": "1.8.3",
19436− "web3-eth-iban": "1.0.0-beta.33",
19434+ "utf8": "2.1.1"
19437− "web3-utils": "1.0.0-beta.33"
19438 }
19435 }
19436+ }
19437+ }
19438+ },
19439+ "web3-bzz": {
19440+ "version": "1.0.0-beta.33",
19441+ "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.0.0-beta.33.tgz",
19442+ "integrity": "sha1-MVAPaZt+cO31FJDFXv+0J7+7OwE=",
19443+ "requires": {
19444+ "got": "7.1.0",
19445+ "swarm-js": "0.1.37",
19446+ "underscore": "1.8.3"
19447+ }
19448+ },
19449+ "web3-core": {
19450+ "version": "1.0.0-beta.33",
19451+ "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.0.0-beta.33.tgz",
19452+ "integrity": "sha1-+C7VJfW2auzale7O08rSvWlfeDk=",
19453+ "requires": {
19454+ "web3-core-helpers": "1.0.0-beta.33",
19455+ "web3-core-method": "1.0.0-beta.33",
19456+ "web3-core-requestmanager": "1.0.0-beta.33",
19457+ "web3-utils": "1.0.0-beta.33"
19458+ },
19459+ "dependencies": {
19460+ "bn.js": {
19461+ "version": "4.11.6",
19462+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
19463+ "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU="
19439 },
19464 },
19440− "web3-core-method": {
19465+ "web3-utils": {
19441 "version": "1.0.0-beta.33",
19466 "version": "1.0.0-beta.33",
19442− "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.0.0-beta.33.tgz",
19467+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.33.tgz",
19443− "integrity": "sha1-7Y7ExK+rIdwJid41g2hEZlIrboY=",
19468+ "integrity": "sha1-4JG3mU8JtxSwGYpAV9OtLrjL4jg=",
19444 "requires": {
19469 "requires": {
19470+ "bn.js": "4.11.6",
19471+ "eth-lib": "0.1.27",
19472+ "ethjs-unit": "0.1.6",
19473+ "number-to-bn": "1.7.0",
19474+ "randomhex": "0.1.5",
19445 "underscore": "1.8.3",
19475 "underscore": "1.8.3",
19446− "web3-core-helpers": "1.0.0-beta.33",
19476+ "utf8": "2.1.1"
19447− "web3-core-promievent": "1.0.0-beta.33",
19448− "web3-core-subscriptions": "1.0.0-beta.33",
19449− "web3-utils": "1.0.0-beta.33"
19450− }
19451− },
19452− "web3-core-promievent": {
19453− "version": "1.0.0-beta.33",
19454− "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.33.tgz",
19455− "integrity": "sha1-0fXrtgFSfdSWViw2IXblWNly01g=",
19456− "requires": {
19457− "any-promise": "1.3.0",
19458− "eventemitter3": "1.1.1"
19459 }
19477 }
19478+ }
19479+ }
19480+ },
19481+ "web3-core-helpers": {
19482+ "version": "1.0.0-beta.33",
19483+ "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.33.tgz",
19484+ "integrity": "sha1-Kvcz5QTbBefDZIwdrPV3sOwV3EM=",
19485+ "requires": {
19486+ "underscore": "1.8.3",
19487+ "web3-eth-iban": "1.0.0-beta.33",
19488+ "web3-utils": "1.0.0-beta.33"
19489+ },
19490+ "dependencies": {
19491+ "bn.js": {
19492+ "version": "4.11.6",
19493+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
19494+ "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU="
19460 },
19495 },
19461− "web3-core-requestmanager": {
19496+ "web3-utils": {
19462 "version": "1.0.0-beta.33",
19497 "version": "1.0.0-beta.33",
19463− "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.33.tgz",
19498+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.33.tgz",
19464− "integrity": "sha1-ejbEA1QALfsXnKLb22pgEsn3Ges=",
19499+ "integrity": "sha1-4JG3mU8JtxSwGYpAV9OtLrjL4jg=",
19465 "requires": {
19500 "requires": {
19501+ "bn.js": "4.11.6",
19502+ "eth-lib": "0.1.27",
19503+ "ethjs-unit": "0.1.6",
19504+ "number-to-bn": "1.7.0",
19505+ "randomhex": "0.1.5",
19466 "underscore": "1.8.3",
19506 "underscore": "1.8.3",
19467− "web3-core-helpers": "1.0.0-beta.33",
19507+ "utf8": "2.1.1"
19468− "web3-providers-http": "1.0.0-beta.33",
19469− "web3-providers-ipc": "1.0.0-beta.33",
19470− "web3-providers-ws": "1.0.0-beta.33"
19471 }
19508 }
19509+ }
19510+ }
19511+ },
19512+ "web3-core-method": {
19513+ "version": "1.0.0-beta.33",
19514+ "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.0.0-beta.33.tgz",
19515+ "integrity": "sha1-7Y7ExK+rIdwJid41g2hEZlIrboY=",
19516+ "requires": {
19517+ "underscore": "1.8.3",
19518+ "web3-core-helpers": "1.0.0-beta.33",
19519+ "web3-core-promievent": "1.0.0-beta.33",
19520+ "web3-core-subscriptions": "1.0.0-beta.33",
19521+ "web3-utils": "1.0.0-beta.33"
19522+ },
19523+ "dependencies": {
19524+ "bn.js": {
19525+ "version": "4.11.6",
19526+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
19527+ "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU="
19472 },
19528 },
19473− "web3-core-subscriptions": {
19529+ "web3-utils": {
19474 "version": "1.0.0-beta.33",
19530 "version": "1.0.0-beta.33",
19475− "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.33.tgz",
19531+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.33.tgz",
19476− "integrity": "sha1-YCh1yfTV9NDhYhRitfwewZs1veM=",
19532+ "integrity": "sha1-4JG3mU8JtxSwGYpAV9OtLrjL4jg=",
19477 "requires": {
19533 "requires": {
19478− "eventemitter3": "1.1.1",
19534+ "bn.js": "4.11.6",
19535+ "eth-lib": "0.1.27",
19536+ "ethjs-unit": "0.1.6",
19537+ "number-to-bn": "1.7.0",
19538+ "randomhex": "0.1.5",
19479 "underscore": "1.8.3",
19539 "underscore": "1.8.3",
19480− "web3-core-helpers": "1.0.0-beta.33"
19540+ "utf8": "2.1.1"
19481 }
19541 }
19542+ }
19543+ }
19544+ },
19545+ "web3-core-promievent": {
19546+ "version": "1.0.0-beta.33",
19547+ "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.33.tgz",
19548+ "integrity": "sha1-0fXrtgFSfdSWViw2IXblWNly01g=",
19549+ "requires": {
19550+ "any-promise": "1.3.0",
19551+ "eventemitter3": "1.1.1"
19552+ }
19553+ },
19554+ "web3-core-requestmanager": {
19555+ "version": "1.0.0-beta.33",
19556+ "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.33.tgz",
19557+ "integrity": "sha1-ejbEA1QALfsXnKLb22pgEsn3Ges=",
19558+ "requires": {
19559+ "underscore": "1.8.3",
19560+ "web3-core-helpers": "1.0.0-beta.33",
19561+ "web3-providers-http": "1.0.0-beta.33",
19562+ "web3-providers-ipc": "1.0.0-beta.33",
19563+ "web3-providers-ws": "1.0.0-beta.33"
19564+ }
19565+ },
19566+ "web3-core-subscriptions": {
19567+ "version": "1.0.0-beta.33",
19568+ "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.33.tgz",
19569+ "integrity": "sha1-YCh1yfTV9NDhYhRitfwewZs1veM=",
19570+ "requires": {
19571+ "eventemitter3": "1.1.1",
19572+ "underscore": "1.8.3",
19573+ "web3-core-helpers": "1.0.0-beta.33"
19574+ }
19575+ },
19576+ "web3-eth": {
19577+ "version": "1.0.0-beta.33",
19578+ "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.0.0-beta.33.tgz",
19579+ "integrity": "sha1-hKn5TallUnyS2DitTlcN8CWJhJ8=",
19580+ "requires": {
19581+ "underscore": "1.8.3",
19582+ "web3-core": "1.0.0-beta.33",
19583+ "web3-core-helpers": "1.0.0-beta.33",
19584+ "web3-core-method": "1.0.0-beta.33",
19585+ "web3-core-subscriptions": "1.0.0-beta.33",
19586+ "web3-eth-abi": "1.0.0-beta.33",
19587+ "web3-eth-accounts": "1.0.0-beta.33",
19588+ "web3-eth-contract": "1.0.0-beta.33",
19589+ "web3-eth-iban": "1.0.0-beta.33",
19590+ "web3-eth-personal": "1.0.0-beta.33",
19591+ "web3-net": "1.0.0-beta.33",
19592+ "web3-utils": "1.0.0-beta.33"
19593+ },
19594+ "dependencies": {
19595+ "bn.js": {
19596+ "version": "4.11.6",
19597+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
19598+ "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU="
19482 },
19599 },
19483− "web3-eth": {
19600+ "web3-utils": {
19484 "version": "1.0.0-beta.33",
19601 "version": "1.0.0-beta.33",
19485− "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.0.0-beta.33.tgz",
19602+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.33.tgz",
19486− "integrity": "sha1-hKn5TallUnyS2DitTlcN8CWJhJ8=",
19603+ "integrity": "sha1-4JG3mU8JtxSwGYpAV9OtLrjL4jg=",
19487 "requires": {
19604 "requires": {
19605+ "bn.js": "4.11.6",
19606+ "eth-lib": "0.1.27",
19607+ "ethjs-unit": "0.1.6",
19608+ "number-to-bn": "1.7.0",
19609+ "randomhex": "0.1.5",
19488 "underscore": "1.8.3",
19610 "underscore": "1.8.3",
19489− "web3-core": "1.0.0-beta.33",
19611+ "utf8": "2.1.1"
19490− "web3-core-helpers": "1.0.0-beta.33",
19491− "web3-core-method": "1.0.0-beta.33",
19492− "web3-core-subscriptions": "1.0.0-beta.33",
19493− "web3-eth-abi": "1.0.0-beta.33",
19494− "web3-eth-accounts": "1.0.0-beta.33",
19495− "web3-eth-contract": "1.0.0-beta.33",
19496− "web3-eth-iban": "1.0.0-beta.33",
19497− "web3-eth-personal": "1.0.0-beta.33",
19498− "web3-net": "1.0.0-beta.33",
19499− "web3-utils": "1.0.0-beta.33"
19500 }
19612 }
19613+ }
19614+ }
19615+ },
19616+ "web3-eth-abi": {
19617+ "version": "1.0.0-beta.33",
19618+ "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.33.tgz",
19619+ "integrity": "sha1-IiH3FRZDZgAypN80D2EjSRaMgko=",
19620+ "requires": {
19621+ "bn.js": "4.11.6",
19622+ "underscore": "1.8.3",
19623+ "web3-core-helpers": "1.0.0-beta.33",
19624+ "web3-utils": "1.0.0-beta.33"
19625+ },
19626+ "dependencies": {
19627+ "bn.js": {
19628+ "version": "4.11.6",
19629+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
19630+ "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU="
19501 },
19631 },
19502− "web3-eth-abi": {
19632+ "web3-utils": {
19503 "version": "1.0.0-beta.33",
19633 "version": "1.0.0-beta.33",
19504− "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.33.tgz",
19634+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.33.tgz",
19505− "integrity": "sha1-IiH3FRZDZgAypN80D2EjSRaMgko=",
19635+ "integrity": "sha1-4JG3mU8JtxSwGYpAV9OtLrjL4jg=",
19506 "requires": {
19636 "requires": {
19507 "bn.js": "4.11.6",
19637 "bn.js": "4.11.6",
19638+ "eth-lib": "0.1.27",
19639+ "ethjs-unit": "0.1.6",
19640+ "number-to-bn": "1.7.0",
19641+ "randomhex": "0.1.5",
19508 "underscore": "1.8.3",
19642 "underscore": "1.8.3",
19509− "web3-core-helpers": "1.0.0-beta.33",
19643+ "utf8": "2.1.1"
19510− "web3-utils": "1.0.0-beta.33"
19511 }
19644 }
19645+ }
19646+ }
19647+ },
19648+ "web3-eth-accounts": {
19649+ "version": "1.0.0-beta.33",
19650+ "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.33.tgz",
19651+ "integrity": "sha1-JajX9OWOHpk7kvBpVILMzckhL5E=",
19652+ "requires": {
19653+ "any-promise": "1.3.0",
19654+ "crypto-browserify": "3.12.0",
19655+ "eth-lib": "0.2.7",
19656+ "scrypt.js": "0.2.0",
19657+ "underscore": "1.8.3",
19658+ "uuid": "2.0.1",
19659+ "web3-core": "1.0.0-beta.33",
19660+ "web3-core-helpers": "1.0.0-beta.33",
19661+ "web3-core-method": "1.0.0-beta.33",
19662+ "web3-utils": "1.0.0-beta.33"
19663+ },
19664+ "dependencies": {
19665+ "eth-lib": {
19666+ "version": "0.2.7",
19667+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz",
19668+ "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=",
19669+ "requires": {
19670+ "bn.js": "^4.11.6",
19671+ "elliptic": "^6.4.0",
19672+ "xhr-request-promise": "^0.1.2"
19673+ }
19674+ },
19675+ "uuid": {
19676+ "version": "2.0.1",
19677+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz",
19678+ "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w="
19512 },
19679 },
19513− "web3-eth-accounts": {
19680+ "web3-utils": {
19514 "version": "1.0.0-beta.33",
19681 "version": "1.0.0-beta.33",
19515− "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.33.tgz",
19682+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.33.tgz",
19516− "integrity": "sha1-JajX9OWOHpk7kvBpVILMzckhL5E=",
19683+ "integrity": "sha1-4JG3mU8JtxSwGYpAV9OtLrjL4jg=",
19517 "requires": {
19684 "requires": {
19518− "any-promise": "1.3.0",
19685+ "bn.js": "4.11.6",
19519− "crypto-browserify": "3.12.0",
19520− "eth-lib": "0.2.7",
19686+ "eth-lib": "0.1.27",
19521− "scrypt.js": "0.2.0",
19687+ "ethjs-unit": "0.1.6",
19688+ "number-to-bn": "1.7.0",
19689+ "randomhex": "0.1.5",
19522 "underscore": "1.8.3",
19690 "underscore": "1.8.3",
19523− "uuid": "2.0.1",
19691+ "utf8": "2.1.1"
19524− "web3-core": "1.0.0-beta.33",
19525− "web3-core-helpers": "1.0.0-beta.33",
19526− "web3-core-method": "1.0.0-beta.33",
19527− "web3-utils": "1.0.0-beta.33"
19528 },
19692 },
19529 "dependencies": {
19693 "dependencies": {
19694+ "bn.js": {
19695+ "version": "4.11.6",
19696+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
19697+ "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU="
19698+ },
19530 "eth-lib": {
19699 "eth-lib": {
19531− "version": "0.2.7",
19700+ "version": "0.1.27",
19532− "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz",
19701+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.27.tgz",
19533− "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=",
19702+ "integrity": "sha512-B8czsfkJYzn2UIEMwjc7Mbj+Cy72V+/OXH/tb44LV8jhrjizQJJ325xMOMyk3+ETa6r6oi0jsUY14+om8mQMWA==",
19534 "requires": {
19703 "requires": {
19535 "bn.js": "^4.11.6",
19704 "bn.js": "^4.11.6",
19536 "elliptic": "^6.4.0",
19705 "elliptic": "^6.4.0",
19706+ "keccakjs": "^0.2.1",
19707+ "nano-json-stream-parser": "^0.1.2",
19708+ "servify": "^0.1.12",
19709+ "ws": "^3.0.0",
19537 "xhr-request-promise": "^0.1.2"
19710 "xhr-request-promise": "^0.1.2"
19538 }
19711 }
19539 }
19712 }
19540 }
19713 }
19714+ }
19715+ }
19716+ },
19717+ "web3-eth-contract": {
19718+ "version": "1.0.0-beta.33",
19719+ "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.33.tgz",
19720+ "integrity": "sha1-nlkZ8pF6PGe0+2Vp1JxeMDiSW84=",
19721+ "requires": {
19722+ "underscore": "1.8.3",
19723+ "web3-core": "1.0.0-beta.33",
19724+ "web3-core-helpers": "1.0.0-beta.33",
19725+ "web3-core-method": "1.0.0-beta.33",
19726+ "web3-core-promievent": "1.0.0-beta.33",
19727+ "web3-core-subscriptions": "1.0.0-beta.33",
19728+ "web3-eth-abi": "1.0.0-beta.33",
19729+ "web3-utils": "1.0.0-beta.33"
19730+ },
19731+ "dependencies": {
19732+ "bn.js": {
19733+ "version": "4.11.6",
19734+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
19735+ "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU="
19541 },
19736 },
19542− "web3-eth-contract": {
19737+ "web3-utils": {
19543 "version": "1.0.0-beta.33",
19738 "version": "1.0.0-beta.33",
19544− "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.33.tgz",
19739+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.33.tgz",
19545− "integrity": "sha1-nlkZ8pF6PGe0+2Vp1JxeMDiSW84=",
19740+ "integrity": "sha1-4JG3mU8JtxSwGYpAV9OtLrjL4jg=",
19546 "requires": {
19741 "requires": {
19742+ "bn.js": "4.11.6",
19743+ "eth-lib": "0.1.27",
19744+ "ethjs-unit": "0.1.6",
19745+ "number-to-bn": "1.7.0",
19746+ "randomhex": "0.1.5",
19547 "underscore": "1.8.3",
19747 "underscore": "1.8.3",
19548− "web3-core": "1.0.0-beta.33",
19748+ "utf8": "2.1.1"
19549− "web3-core-helpers": "1.0.0-beta.33",
19550− "web3-core-method": "1.0.0-beta.33",
19551− "web3-core-promievent": "1.0.0-beta.33",
19552− "web3-core-subscriptions": "1.0.0-beta.33",
19553− "web3-eth-abi": "1.0.0-beta.33",
19554− "web3-utils": "1.0.0-beta.33"
19555 }
19749 }
19750+ }
19751+ }
19752+ },
19753+ "web3-eth-iban": {
19754+ "version": "1.0.0-beta.33",
19755+ "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.33.tgz",
19756+ "integrity": "sha1-HXPQxSiKRWWxdUp1tfs+oLd6Uy8=",
19757+ "requires": {
19758+ "bn.js": "4.11.6",
19759+ "web3-utils": "1.0.0-beta.33"
19760+ },
19761+ "dependencies": {
19762+ "bn.js": {
19763+ "version": "4.11.6",
19764+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
19765+ "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU="
19556 },
19766 },
19557− "web3-eth-iban": {
19767+ "web3-utils": {
19558 "version": "1.0.0-beta.33",
19768 "version": "1.0.0-beta.33",
19559− "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.33.tgz",
19769+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.33.tgz",
19560− "integrity": "sha1-HXPQxSiKRWWxdUp1tfs+oLd6Uy8=",
19770+ "integrity": "sha1-4JG3mU8JtxSwGYpAV9OtLrjL4jg=",
19561 "requires": {
19771 "requires": {
19562 "bn.js": "4.11.6",
19772 "bn.js": "4.11.6",
19563− "web3-utils": "1.0.0-beta.33"
19773+ "eth-lib": "0.1.27",
19564− }
19774+ "ethjs-unit": "0.1.6",
19565− },
19775+ "number-to-bn": "1.7.0",
19566− "web3-eth-personal": {
19776+ "randomhex": "0.1.5",
19567− "version": "1.0.0-beta.33",
19568− "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.33.tgz",
19569− "integrity": "sha1-tOSFh8xOfrAY2ib947Tzul+bmO8=",
19570− "requires": {
19571− "web3-core": "1.0.0-beta.33",
19572− "web3-core-helpers": "1.0.0-beta.33",
19573− "web3-core-method": "1.0.0-beta.33",
19574− "web3-net": "1.0.0-beta.33",
19575− "web3-utils": "1.0.0-beta.33"
19576− }
19577− },
19578− "web3-net": {
19579− "version": "1.0.0-beta.33",
19580− "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.0.0-beta.33.tgz",
19581− "integrity": "sha1-tskNGg4WJuquiz2SKsFTZy/VZEU=",
19582− "requires": {
19583− "web3-core": "1.0.0-beta.33",
19584− "web3-core-method": "1.0.0-beta.33",
19585− "web3-utils": "1.0.0-beta.33"
19586− }
19587− },
19588− "web3-providers-http": {
19589− "version": "1.0.0-beta.33",
19590− "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.0.0-beta.33.tgz",
19591− "integrity": "sha1-OzWuAO599blrSTSWKtSobypVmcE=",
19592− "requires": {
19593− "web3-core-helpers": "1.0.0-beta.33",
19594− "xhr2": "0.1.4"
19595− }
19596− },
19597− "web3-providers-ipc": {
19598− "version": "1.0.0-beta.33",
19599− "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.33.tgz",
19600− "integrity": "sha1-Twrcmv6dEsBm5L5cPFNvUHPLB8Y=",
19601− "requires": {
19602− "oboe": "2.1.3",
19603 "underscore": "1.8.3",
19777 "underscore": "1.8.3",
19604− "web3-core-helpers": "1.0.0-beta.33"
19778+ "utf8": "2.1.1"
19605 }
19779 }
19780+ }
19781+ }
19782+ },
19783+ "web3-eth-personal": {
19784+ "version": "1.0.0-beta.33",
19785+ "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.33.tgz",
19786+ "integrity": "sha1-tOSFh8xOfrAY2ib947Tzul+bmO8=",
19787+ "requires": {
19788+ "web3-core": "1.0.0-beta.33",
19789+ "web3-core-helpers": "1.0.0-beta.33",
19790+ "web3-core-method": "1.0.0-beta.33",
19791+ "web3-net": "1.0.0-beta.33",
19792+ "web3-utils": "1.0.0-beta.33"
19793+ },
19794+ "dependencies": {
19795+ "bn.js": {
19796+ "version": "4.11.6",
19797+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
19798+ "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU="
19606 },
19799 },
19607− "web3-providers-ws": {
19800+ "web3-utils": {
19608 "version": "1.0.0-beta.33",
19801 "version": "1.0.0-beta.33",
19609− "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.33.tgz",
19802+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.33.tgz",
19610− "integrity": "sha1-j93qQuGbvyUh7IeVRkV6Yjqdye8=",
19803+ "integrity": "sha1-4JG3mU8JtxSwGYpAV9OtLrjL4jg=",
19611 "requires": {
19804 "requires": {
19805+ "bn.js": "4.11.6",
19806+ "eth-lib": "0.1.27",
19807+ "ethjs-unit": "0.1.6",
19808+ "number-to-bn": "1.7.0",
19809+ "randomhex": "0.1.5",
19612 "underscore": "1.8.3",
19810 "underscore": "1.8.3",
19613− "web3-core-helpers": "1.0.0-beta.33",
19811+ "utf8": "2.1.1"
19614− "websocket": "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible"
19615− },
19616− "dependencies": {
19617− "websocket": {
19618− "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2",
19619− "from": "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible",
19620− "requires": {
19621− "debug": "^2.2.0",
19622− "nan": "^2.3.3",
19623− "typedarray-to-buffer": "^3.1.2",
19624− "yaeti": "^0.0.6"
19625− }
19626− }
19627− }
19628− },
19629− "web3-shh": {
19630− "version": "1.0.0-beta.33",
19631− "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.0.0-beta.33.tgz",
19632− "integrity": "sha1-+Z4mVz9uCZMhrw2fK/z+Pe01UKE=",
19633− "requires": {
19634− "web3-core": "1.0.0-beta.33",
19635− "web3-core-method": "1.0.0-beta.33",
19636− "web3-core-subscriptions": "1.0.0-beta.33",
19637− "web3-net": "1.0.0-beta.33"
19638 }
19812 }
19813+ }
19814+ }
19815+ },
19816+ "web3-net": {
19817+ "version": "1.0.0-beta.33",
19818+ "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.0.0-beta.33.tgz",
19819+ "integrity": "sha1-tskNGg4WJuquiz2SKsFTZy/VZEU=",
19820+ "requires": {
19821+ "web3-core": "1.0.0-beta.33",
19822+ "web3-core-method": "1.0.0-beta.33",
19823+ "web3-utils": "1.0.0-beta.33"
19824+ },
19825+ "dependencies": {
19826+ "bn.js": {
19827+ "version": "4.11.6",
19828+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
19829+ "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU="
19639 },
19830 },
19640 "web3-utils": {
19831 "web3-utils": {
19641 "version": "1.0.0-beta.33",
19832 "version": "1.0.0-beta.33",
@@ -19650,16 +19841,88 @@
19650 "underscore": "1.8.3",
19841 "underscore": "1.8.3",
19651 "utf8": "2.1.1"
19842 "utf8": "2.1.1"
19652 }
19843 }
19844+ }
19845+ }
19846+ },
19847+ "web3-providers-http": {
19848+ "version": "1.0.0-beta.33",
19849+ "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.0.0-beta.33.tgz",
19850+ "integrity": "sha1-OzWuAO599blrSTSWKtSobypVmcE=",
19851+ "requires": {
19852+ "web3-core-helpers": "1.0.0-beta.33",
19853+ "xhr2": "0.1.4"
19854+ }
19855+ },
19856+ "web3-providers-ipc": {
19857+ "version": "1.0.0-beta.33",
19858+ "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.33.tgz",
19859+ "integrity": "sha1-Twrcmv6dEsBm5L5cPFNvUHPLB8Y=",
19860+ "requires": {
19861+ "oboe": "2.1.3",
19862+ "underscore": "1.8.3",
19863+ "web3-core-helpers": "1.0.0-beta.33"
19864+ }
19865+ },
19866+ "web3-providers-ws": {
19867+ "version": "1.0.0-beta.33",
19868+ "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.33.tgz",
19869+ "integrity": "sha1-j93qQuGbvyUh7IeVRkV6Yjqdye8=",
19870+ "requires": {
19871+ "underscore": "1.8.3",
19872+ "web3-core-helpers": "1.0.0-beta.33",
19873+ "websocket": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2"
19874+ }
19875+ },
19876+ "web3-shh": {
19877+ "version": "1.0.0-beta.33",
19878+ "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.0.0-beta.33.tgz",
19879+ "integrity": "sha1-+Z4mVz9uCZMhrw2fK/z+Pe01UKE=",
19880+ "requires": {
19881+ "web3-core": "1.0.0-beta.33",
19882+ "web3-core-method": "1.0.0-beta.33",
19883+ "web3-core-subscriptions": "1.0.0-beta.33",
19884+ "web3-net": "1.0.0-beta.33"
19885+ }
19886+ },
19887+ "web3-utils": {
19888+ "version": "1.0.0-beta.52",
19889+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.52.tgz",
19890+ "integrity": "sha512-WdHyzPcZu/sOnNrkcOZT20QEX9FhwD9OJJXENojQNvMK2a1xo3n8JWBcC2gzAGwsa0Aah6z2B3Xwa1P//8FaoA==",
19891+ "requires": {
19892+ "@babel/runtime": "^7.3.1",
19893+ "@types/bn.js": "^4.11.4",
19894+ "@types/node": "^10.12.18",
19895+ "bn.js": "4.11.8",
19896+ "eth-lib": "0.2.8",
19897+ "ethjs-unit": "^0.1.6",
19898+ "lodash": "^4.17.11",
19899+ "number-to-bn": "1.7.0",
19900+ "randomhex": "0.1.5",
19901+ "utf8": "2.1.1"
19902+ },
19903+ "dependencies": {
19904+ "@babel/runtime": {
19905+ "version": "7.4.3",
19906+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.3.tgz",
19907+ "integrity": "sha512-9lsJwJLxDh/T3Q3SZszfWOTkk3pHbkmH+3KY+zwIDmsNlxsumuhS2TH3NIpktU4kNvfzy+k3eLT7aTJSPTo0OA==",
19908+ "requires": {
19909+ "regenerator-runtime": "^0.13.2"
19910+ }
19653 },
19911 },
19654− "websocket": {
19912+ "eth-lib": {
19655− "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2",
19913+ "version": "0.2.8",
19656− "from": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2",
19914+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
19915+ "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
19657 "requires": {
19916 "requires": {
19658− "debug": "^2.2.0",
19917+ "bn.js": "^4.11.6",
19659− "nan": "^2.3.3",
19918+ "elliptic": "^6.4.0",
19660− "typedarray-to-buffer": "^3.1.2",
19919+ "xhr-request-promise": "^0.1.2"
19661− "yaeti": "^0.0.6"
19662 }
19920 }
19921+ },
19922+ "regenerator-runtime": {
19923+ "version": "0.13.2",
19924+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
19925+ "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA=="
19663 }
19926 }
19664 }
19927 }
19665 },
19928 },
@@ -20326,6 +20589,16 @@
20326 }
20589 }
20327 }
20590 }
20328 },
20591 },
20592+ "websocket": {
20593+ "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2",
20594+ "from": "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible",
20595+ "requires": {
20596+ "debug": "^2.2.0",
20597+ "nan": "^2.3.3",
20598+ "typedarray-to-buffer": "^3.1.2",
20599+ "yaeti": "^0.0.6"
20600+ }
20601+ },
20329 "websocket-driver": {
20602 "websocket-driver": {
20330 "version": "0.7.0",
20603 "version": "0.7.0",
20331 "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
20604 "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
package.json+4−3
@@ -14,9 +14,10 @@
14 "node": "11.0.0"
14 "node": "11.0.0"
15 },
15 },
16 "dependencies": {
16 "dependencies": {
17− "azimuth-js": "^0.10.0",
18 "@ledgerhq/hw-app-eth": "^4.35.0",
17 "@ledgerhq/hw-app-eth": "^4.35.0",
19 "@ledgerhq/hw-transport-u2f": "^4.35.0",
18 "@ledgerhq/hw-transport-u2f": "^4.35.0",
19+ "PaperCollateralRenderer": "github:urbit/PaperCollateralRenderer",
20+ "azimuth-js": "^0.10.0",
20 "azimuth-solidity": "1.0.2",
21 "azimuth-solidity": "1.0.2",
21 "babel-polyfill": "^6.26.0",
22 "babel-polyfill": "^6.26.0",
22 "bip32": "^1.0.2",
23 "bip32": "^1.0.2",
@@ -34,7 +35,6 @@
34 "keythereum": "^1.0.4",
35 "keythereum": "^1.0.4",
35 "lodash": "^4.17.11",
36 "lodash": "^4.17.11",
36 "more-entropy": "^0.0.7",
37 "more-entropy": "^0.0.7",
37− "PaperCollateralRenderer": "github:urbit/PaperCollateralRenderer",
38 "prop-types": "^15.6.2",
38 "prop-types": "^15.6.2",
39 "react": "^16.6.0",
39 "react": "^16.6.0",
40 "react-dom": "^16.6.0",
40 "react-dom": "^16.6.0",
@@ -45,7 +45,8 @@
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.33",
49+ "web3-utils": "^1.0.0-beta.52"
49 },
50 },
50 "scripts": {
51 "scripts": {
51 "start": "react-scripts start",
52 "start": "react-scripts start",
src/bridge/Bridge.js+18−3
@@ -25,7 +25,11 @@ const initWeb3 = (networkType) => {
25 const contracts = azimuth.initContracts(web3, CONTRACT_ADDRESSES.MAINNET)
25 const contracts = azimuth.initContracts(web3, CONTRACT_ADDRESSES.MAINNET)
26 return {web3: web3, contracts: contracts}
26 return {web3: web3, contracts: contracts}
27 } else if (networkType === NETWORK_NAMES.LOCAL) {
27 } else if (networkType === NETWORK_NAMES.LOCAL) {
28+ const protocol =
29+ process.env.NODE_ENV === 'development'
30+ ? 'ws'
31+ : 'wss'
28− const endpoint = 'ws://localhost:8545'
32+ const endpoint = `${protocol}://localhost:8545`
29 const provider = new Web3.providers.WebsocketProvider(endpoint)
33 const provider = new Web3.providers.WebsocketProvider(endpoint)
30 const web3 = new Web3(provider)
34 const web3 = new Web3(provider)
31 const contracts = azimuth.initContracts(web3, CONTRACT_ADDRESSES.DEV)
35 const contracts = azimuth.initContracts(web3, CONTRACT_ADDRESSES.DEV)
@@ -80,7 +84,8 @@ class Bridge extends React.Component {
80 pointCursor: Nothing(),
84 pointCursor: Nothing(),
81 pointCache: {},
85 pointCache: {},
82 // txn
86 // txn
83− txnHashCursor: Nothing()
87+ txnHashCursor: Nothing(),
88+ txnConfirmations: {}
84 }
89 }
85
90
86 this.pushRoute = this.pushRoute.bind(this)
91 this.pushRoute = this.pushRoute.bind(this)
@@ -95,6 +100,7 @@ class Bridge extends React.Component {
95 this.setAuthMnemonic = this.setAuthMnemonic.bind(this)
100 this.setAuthMnemonic = this.setAuthMnemonic.bind(this)
96 this.setPointCursor = this.setPointCursor.bind(this)
101 this.setPointCursor = this.setPointCursor.bind(this)
97 this.setTxnHashCursor = this.setTxnHashCursor.bind(this)
102 this.setTxnHashCursor = this.setTxnHashCursor.bind(this)
103+ this.setTxnConfirmations = this.setTxnConfirmations.bind(this)
98 this.setNetworkSeedCache = this.setNetworkSeedCache.bind(this)
104 this.setNetworkSeedCache = this.setNetworkSeedCache.bind(this)
99 this.addToPointCache = this.addToPointCache.bind(this)
105 this.addToPointCache = this.addToPointCache.bind(this)
100 }
106 }
@@ -244,6 +250,12 @@ class Bridge extends React.Component {
244 this.setState({ txnHashCursor })
250 this.setState({ txnHashCursor })
245 }
251 }
246
252
253+ setTxnConfirmations(txnHash, txnConfirmations) {
254+ this.setState((prevState, _) =>
255+ ({txnConfirmations: { ...prevState.txnConfirmations,
256+ [txnHash]: txnConfirmations}}))
257+ }
258+
247 render() {
259 render() {
248 const {
260 const {
249 routeCrumbs,
261 routeCrumbs,
@@ -258,6 +270,7 @@ class Bridge extends React.Component {
258 pointCursor,
270 pointCursor,
259 pointCache,
271 pointCache,
260 txnHashCursor,
272 txnHashCursor,
273+ txnConfirmations,
261 web3,
274 web3,
262 contracts
275 contracts
263 } = this.state
276 } = this.state
@@ -310,7 +323,9 @@ class Bridge extends React.Component {
310 setNetworkSeedCache= { this.setNetworkSeedCache }
323 setNetworkSeedCache= { this.setNetworkSeedCache }
311 // txn
324 // txn
312 setTxnHashCursor={ this.setTxnHashCursor }
325 setTxnHashCursor={ this.setTxnHashCursor }
313− txnHashCursor={ txnHashCursor } />
326+ txnHashCursor={ txnHashCursor }
327+ setTxnConfirmations={ this.setTxnConfirmations }
328+ txnConfirmations={ txnConfirmations } />
314
329
315 <div className={'push'} />
330 <div className={'push'} />
316
331
src/bridge/components/InnerLabelDropdown.js+88−45
@@ -1,71 +1,114 @@
1import React from 'react'
1import React from 'react'
2import PropTypes from 'prop-types';
2import PropTypes from 'prop-types';
3
3
4+import { DropdownItem, DropdownDivider } from '../components/Base'
4
5
5−const InnerLabelDropdown = props => {
6+class InnerLabelDropdown extends React.Component {
6−
7+ constructor(props) {
8+ super(props)
9+
10+ this.state = {
11+ isOpen: false
12+ }
13+
14+ this.toggle = this.toggle.bind(this)
15+ this.close = this.close.bind(this)
16+ }
17+
18+ toggle() {
19+ this.setState({
20+ isOpen: !this.state.isOpen
21+ })
22+ }
23+
24+ close() {
25+ this.setState({
26+ isOpen: false
27+ })
28+ }
29+
30+ selectOption(opt) {
31+ this.close()
32+ this.props.handleUpdate(opt)
33+ }
34+
35+ getOptionElems() {
36+ return this.props.options.map(opt => {
37+ if (opt.type === "divider") {
38+ return <DropdownDivider />
39+ } else {
40+ return (
41+ <DropdownItem onClick={() => this.selectOption(opt.value)}>
42+ { opt.title }
43+ </DropdownItem>
44+ )
45+ }
46+ })
47+ }
48+
49+ render() {
50+ const { props, state } = this
51+
52+ const optionElems = this.getOptionElems()
53+
7− const menuVisibility = props.isOpen === true
54+ const menuVisibility = state.isOpen === true
8− ? 'visible'
55+ ? 'visible'
9− : 'hidden';
56+ : 'hidden';
10−
57+
11− const selectedClasses = props.isOpen === true
58+ const selectedClasses = state.isOpen === true
12− ? 'br-blue'
59+ ? 'br-blue'
13− : 'br-gray-50';
60+ : 'br-gray-50';
14−
61+
62+ const fullWidthClass = props.fullWidth ? 'full-width' : ''
63+
15− return (
64+ return (
16− <div className={'rel table'}>
65+ <div className={`rel table ${fullWidthClass}`}>
17− <div
66+ <div
18− className={`fix full o-0 ${menuVisibility}`}
67+ className={`fix full o-0 ${menuVisibility}`}
19− onClick={props.handleClose}
68+ onClick={this.close}
20− />
69+ />
21−
70+
22− <button
71+ <button
23− className={`h-10 mp-0 bg-white outline-blue sans ${props.className}`}
72+ className={`h-10 mp-0 bg-white outline-blue sans ${props.className} ${fullWidthClass}`}
24− onClick={props.handleToggle}
73+ onClick={this.toggle}
25− disabled={props.disabled}>
74+ disabled={props.disabled}>
26− <div className={'flex'}>
75+ <div className={'flex'}>
27− <div className={`ph-4 flex-center-all b-2 br-0 b-solid h-10 ${selectedClasses}`}>
76+ <div className={`ph-4 flex align-center b-2 br-0 b-solid h-10 ${selectedClasses} ${fullWidthClass}`}>
28− <div className={'text-400 mr-2'}>{props.title}</div>
77+ <div className={'text-400 mr-2'}>{props.title}</div>
29− <div className={'text-600'}>{props.currentSelectionTitle}</div>
78+ <div className={'text-600'}>{props.currentSelectionTitle}</div>
79+ </div>
80+ <div className={'white bg-blue s-10 flex-center-all text-sm'}>{'▼'}</div>
30 </div>
81 </div>
31− <div className={'white bg-blue s-10 flex-center-all text-sm'}>{'▼'}</div>
32− </div>
33− </button>
82+ </button>
34
83
35− <div className={`abs flex-column bg-white t-12 l-0 w-100 ${menuVisibility}`}>
84+ <div className={`abs flex-column bg-white t-12 l-0 w-100 z-1 ${menuVisibility}`}>
36− <div className={'pv-1 b-solid b-gray-50 b-2 bb-0'} />
85+ <div className={'pv-1 b-solid b-gray-50 b-2 bb-0'} />
37
86
38− { props.children }
87+ { optionElems }
39
88
40− <div className={'pv-1 b-solid b-gray-50 b-2 bt-0'} />
89+ <div className={'pv-1 b-solid b-gray-50 b-2 bt-0'} />
41− </div>
90+ </div>
42
91
43− </div>
92+ </div>
44− )
93+ )
94+ }
45}
95}
46
96
47InnerLabelDropdown.propTypes = {
97InnerLabelDropdown.propTypes = {
48 disabled: PropTypes.bool,
98 disabled: PropTypes.bool,
49− isOpen: PropTypes.bool,
50− handleToggle: PropTypes.func,
51− handleClose: PropTypes.func,
52 className: PropTypes.string,
99 className: PropTypes.string,
53 title: PropTypes.string,
100 title: PropTypes.string,
54− children: PropTypes.node,
55 style: PropTypes.object,
101 style: PropTypes.object,
56 currentSelectionTitle: PropTypes.string,
102 currentSelectionTitle: PropTypes.string,
103+ children: PropTypes.node,
57};
104};
58
105
59−
60InnerLabelDropdown.defaultProps = {
106InnerLabelDropdown.defaultProps = {
61− isOpen: false,
107+ disabled: false,
62 className: '',
108 className: '',
63 title: '',
109 title: '',
64− currentSelectionTitle: '',
65− handleToggle: () => {},
66− handleClose: () => {},
67− disabled: false,
68 style: {},
110 style: {},
111+ currentSelectionTitle: '',
69};
112};
70
113
71export default InnerLabelDropdown
114export default InnerLabelDropdown
src/bridge/components/StatelessTransaction.js+92−19
@@ -3,7 +3,8 @@ import React from 'react'
3
3
4import { Code, H3 } from './Base'
4import { Code, H3 } from './Base'
5import { Button } from './Base'
5import { Button } from './Base'
6−import { CheckboxButton, Input, InnerLabel } from './Base'
6+import { CheckboxButton, Input, InnerLabel,
7+ InnerLabelDropdown } from './Base'
7import { Warning } from '../components/Base'
8import { Warning } from '../components/Base'
8
9
9import { addressFromSecp256k1Public } from '../lib/wallet'
10import { addressFromSecp256k1Public } from '../lib/wallet'
@@ -27,11 +28,12 @@ class StatelessTransaction extends React.Component {
27 gasLimit: '600000',
28 gasLimit: '600000',
28 showGasDetails: false,
29 showGasDetails: false,
29 userApproval: false,
30 userApproval: false,
30− chainId: '',
31+ chainId: '1',
32+ customChain: false,
31− nonce: '',
33+ nonce: '0',
32 stx: Nothing(),
34 stx: Nothing(),
33 txn: Nothing(),
35 txn: Nothing(),
34− txError: Nothing(),
36+ txError: Nothing()
35 }
37 }
36
38
37 this.createUnsignedTxn = this.createUnsignedTxn.bind(this)
39 this.createUnsignedTxn = this.createUnsignedTxn.bind(this)
@@ -46,6 +48,7 @@ class StatelessTransaction extends React.Component {
46 this.setGasLimit = this.setGasLimit.bind(this)
48 this.setGasLimit = this.setGasLimit.bind(this)
47 this.rangeChange = this.rangeChange.bind(this)
49 this.rangeChange = this.rangeChange.bind(this)
48 this.toggleGasDetails = this.toggleGasDetails.bind(this)
50 this.toggleGasDetails = this.toggleGasDetails.bind(this)
51+ this.handleChainUpdate = this.handleChainUpdate.bind(this)
49 }
52 }
50
53
51 componentDidMount() {
54 componentDidMount() {
@@ -85,7 +88,7 @@ class StatelessTransaction extends React.Component {
85
88
86 submit(){
89 submit(){
87 const { props, state } = this
90 const { props, state } = this
88− sendSignedTransaction(props.web3.value, state.stx)
91+ sendSignedTransaction(props.web3.value, state.stx, props.setTxnConfirmations)
89 .then(sent => {
92 .then(sent => {
90 props.setTxnHashCursor(sent)
93 props.setTxnHashCursor(sent)
91 props.popRoute()
94 props.popRoute()
@@ -106,6 +109,21 @@ class StatelessTransaction extends React.Component {
106 })
109 })
107 }
110 }
108
111
112+ handleChainUpdate(chainId) {
113+ if (chainId === "custom") {
114+ this.setState({
115+ customChain: true
116+ })
117+ } else {
118+ this.setState({
119+ customChain: false,
120+ chainId
121+ })
122+ }
123+
124+ this.clearStx()
125+ }
126+
109 setUserApproval(){
127 setUserApproval(){
110 const {state} = this
128 const {state} = this
111 this.setState({ userApproval: !state.userApproval })
129 this.setState({ userApproval: !state.userApproval })
@@ -185,13 +203,53 @@ class StatelessTransaction extends React.Component {
185 this.submit()
203 this.submit()
186 }
204 }
187
205
206+ getChainTitle(chainId) {
207+ let map = {
208+ "1": "Mainnet - 1",
209+ "2": "Morden - 2",
210+ "3": "Ropsten - 3",
211+ "4": "Goerli - 4",
212+ "42": "Kovan - 42",
213+ "1337": "Geth private chains - 1337",
214+ "custom": "Custom"
215+ }
216+
217+ return map[chainId]
218+ }
219+
220+ getChainOptions() {
221+ return [{
222+ title: this.getChainTitle("1"),
223+ value: "1"
224+ }, {
225+ title: this.getChainTitle("2"),
226+ value: "2"
227+ }, {
228+ title: this.getChainTitle("3"),
229+ value: "3"
230+ }, {
231+ title: this.getChainTitle("4"),
232+ value: "4"
233+ }, {
234+ title: this.getChainTitle("42"),
235+ value: "42"
236+ }, {
237+ title: this.getChainTitle("1337"),
238+ value: "1337"
239+ }, {
240+ title: this.getChainTitle("custom"),
241+ value: "custom"
242+ }]
243+ }
244+
188 render() {
245 render() {
189 const { web3, canGenerate } = this.props
246 const { web3, canGenerate } = this.props
190 const { gasPrice, gasLimit, nonce, chainId,
247 const { gasPrice, gasLimit, nonce, chainId,
191− txn, stx, userApproval, showGasDetails } = this.state
248+ txn, stx, userApproval, showGasDetails,
249+ customChain } = this.state
192
250
193 const { setNonce, setChainId, setGasLimit, setGasPrice, toggleGasDetails,
251 const { setNonce, setChainId, setGasLimit, setGasPrice, toggleGasDetails,
194− setUserApproval, sendTxn, createUnsignedTxn } = this
252+ setUserApproval, sendTxn, createUnsignedTxn, handleChainUpdate } = this
195
253
196 const { state } = this
254 const { state } = this
197
255
@@ -199,6 +257,8 @@ class StatelessTransaction extends React.Component {
199 const canApprove = Just.hasInstance(stx)
257 const canApprove = Just.hasInstance(stx)
200 const canSend = Just.hasInstance(stx) && userApproval === true
258 const canSend = Just.hasInstance(stx) && userApproval === true
201
259
260+ const chainOptions = this.getChainOptions()
261+
202 const generateButtonColor =
262 const generateButtonColor =
203 Nothing.hasInstance(txn)
263 Nothing.hasInstance(txn)
204 ? 'blue'
264 ? 'blue'
@@ -294,7 +354,7 @@ class StatelessTransaction extends React.Component {
294
354
295 const nonceDialogue =
355 const nonceDialogue =
296 <Input
356 <Input
297− className={ 'mono mt-4' }
357+ className={ 'mono mt-4 mb-4' }
298 prop-size={ 'md' }
358 prop-size={ 'md' }
299 prop-format={ 'innerLabel' }
359 prop-format={ 'innerLabel' }
300 value={ nonce }
360 value={ nonce }
@@ -305,18 +365,30 @@ class StatelessTransaction extends React.Component {
305 </InnerLabel>
365 </InnerLabel>
306 </Input>
366 </Input>
307
367
368+ const chainDialogueTitle = customChain ? "Custom" : this.getChainTitle(chainId)
308 const chainDialogue =
369 const chainDialogue =
309− <Input
370+ <InnerLabelDropdown
310− className={ 'mono mt-4 mb-8' }
371+ className={'mt-6'}
311− prop-size={ 'md' }
372+ fullWidth={true}
312− prop-format={ 'innerLabel' }
373+ title={'Chain ID'}
313− value={ chainId }
374+ options={chainOptions}
314− onChange={ setChainId }
375+ handleUpdate={handleChainUpdate}
376+ currentSelectionTitle={chainDialogueTitle}
315 >
377 >
378+ </InnerLabelDropdown>
379+
380+ const customChainDialogue = !customChain ? null :
381+ <Input
382+ className={ 'mono mt-4 mb-8' }
383+ prop-size={ 'md' }
384+ prop-format={ 'innerLabel' }
385+ value={ chainId }
386+ onChange={ setChainId }
387+ >
316− <InnerLabel>
388+ <InnerLabel>
317− { 'Chain ID' }
389+ { 'Chain ID' }
318− </InnerLabel>
390+ </InnerLabel>
319− </Input>
391+ </Input>
320
392
321 const onlineParamsDialogue = web3.matchWith({
393 const onlineParamsDialogue = web3.matchWith({
322 Just: _ => <div />,
394 Just: _ => <div />,
@@ -324,6 +396,7 @@ class StatelessTransaction extends React.Component {
324 <React.Fragment>
396 <React.Fragment>
325 { nonceDialogue }
397 { nonceDialogue }
326 { chainDialogue }
398 { chainDialogue }
399+ { customChainDialogue }
327 </React.Fragment>
400 </React.Fragment>
328 })
401 })
329
402
@@ -358,7 +431,7 @@ class StatelessTransaction extends React.Component {
358 onClick={ setUserApproval }
431 onClick={ setUserApproval }
359 state={ userApproval }
432 state={ userApproval }
360 >
433 >
361− <div>
434+ <div onClick={ setUserApproval }>
362 { `I approve this transaction and wish to send.` }
435 { `I approve this transaction and wish to send.` }
363 </div>
436 </div>
364 </CheckboxButton>
437 </CheckboxButton>
src/bridge/lib/txn.js+6−6
@@ -3,6 +3,7 @@ import { Just } from 'folktale/maybe'
3import { Ok, Error } from 'folktale/result'
3import { Ok, Error } from 'folktale/result'
4import Tx from 'ethereumjs-tx'
4import Tx from 'ethereumjs-tx'
5import Web3 from 'web3'
5import Web3 from 'web3'
6+import { toWei, fromWei, toHex } from 'web3-utils'
6
7
7import { BRIDGE_ERROR } from '../lib/error'
8import { BRIDGE_ERROR } from '../lib/error'
8import { NETWORK_NAMES } from '../lib/network'
9import { NETWORK_NAMES } from '../lib/network'
@@ -137,7 +138,7 @@ const signTransaction = async config => {
137 setStx(Just(stx))
138 setStx(Just(stx))
138}
139}
139
140
140−const sendSignedTransaction = (web3, stx) => {
141+const sendSignedTransaction = (web3, stx, confirmationCb) => {
141 const txn = stx.matchWith({
142 const txn = stx.matchWith({
142 Just: (tx) => tx.value,
143 Just: (tx) => tx.value,
143 Nothing: () => {
144 Nothing: () => {
@@ -155,6 +156,10 @@ const sendSignedTransaction = (web3, stx) => {
155 .on('receipt', txn => {
156 .on('receipt', txn => {
156 resolve(Just(Ok(txn.transactionHash)))
157 resolve(Just(Ok(txn.transactionHash)))
157 })
158 })
159+ .on('confirmation', (confirmationNum, txn) => {
160+ confirmationCb(txn.transactionHash, confirmationNum + 1)
161+ resolve(Just(Ok(txn.transactionHash)))
162+ })
158 .on('error', err => {
163 .on('error', err => {
159 reject(Just(Error(err.message)))
164 reject(Just(Error(err.message)))
160 })
165 })
@@ -203,11 +208,6 @@ const getTxnInfo = async (web3, addr) => {
203 }
208 }
204}
209}
205
210
206−const dummy = new Web3()
207−const toHex = dummy.utils.toHex
208−const toWei = dummy.utils.toWei
209−const fromWei = dummy.utils.fromWei
210−
211const canDecodePatp = p => {
211const canDecodePatp = p => {
212 try {
212 try {
213 ob.patp2dec(p)
213 ob.patp2dec(p)
src/bridge/lib/wallet.js+2−2
@@ -6,6 +6,7 @@ import Maybe from 'folktale/maybe'
6import * as secp256k1 from 'secp256k1'
6import * as secp256k1 from 'secp256k1'
7import * as ob from 'urbit-ob'
7import * as ob from 'urbit-ob'
8import * as kg from '../../../node_modules/urbit-key-generation/dist/index'
8import * as kg from '../../../node_modules/urbit-key-generation/dist/index'
9+import { isAddress } from 'web3-utils'
9
10
10const DEFAULT_HD_PATH = "m/44'/60'/0'/0/0"
11const DEFAULT_HD_PATH = "m/44'/60'/0'/0/0"
11
12
@@ -71,8 +72,7 @@ const stripHexPrefix = hex =>
71const keccak256 = str =>
72const keccak256 = str =>
72 keccak('keccak256').update(str).digest()
73 keccak('keccak256').update(str).digest()
73
74
74−const isValidAddress = (address) =>
75+const isValidAddress = isAddress
75− /^0x[0-9a-fA-F]{40}$/.test(address)
76
76
77const toChecksumAddress = (address) => {
77const toChecksumAddress = (address) => {
78 const addr = stripHexPrefix(address).toLowerCase()
78 const addr = stripHexPrefix(address).toLowerCase()
src/bridge/style/extend.css+8
@@ -477,3 +477,11 @@ code {
477 padding: 1rem 2rem;
477 padding: 1rem 2rem;
478 margin-bottom: 4rem;
478 margin-bottom: 4rem;
479}
479}
480+
481+.full-width {
482+ width: 100%;
483+}
484+
485+.z-1 {
486+ z-index: 1
487+}
src/bridge/views/AcceptTransfer.js+1
@@ -126,6 +126,7 @@ class AcceptTransfer extends React.Component {
126 walletHdPath={props.walletHdPath}
126 walletHdPath={props.walletHdPath}
127 networkType={props.networkType}
127 networkType={props.networkType}
128 setTxnHashCursor={props.setTxnHashCursor}
128 setTxnHashCursor={props.setTxnHashCursor}
129+ setTxnConfirmations={props.setTxnConfirmations}
129 popRoute={props.popRoute}
130 popRoute={props.popRoute}
130 pushRoute={props.pushRoute}
131 pushRoute={props.pushRoute}
131 // Other
132 // Other
src/bridge/views/CancelTransfer.js+1
@@ -87,6 +87,7 @@ class CancelTransfer extends React.Component {
87 walletHdPath={props.walletHdPath}
87 walletHdPath={props.walletHdPath}
88 networkType={props.networkType}
88 networkType={props.networkType}
89 setTxnHashCursor={props.setTxnHashCursor}
89 setTxnHashCursor={props.setTxnHashCursor}
90+ setTxnConfirmations={props.setTxnConfirmations}
90 popRoute={props.popRoute}
91 popRoute={props.popRoute}
91 pushRoute={props.pushRoute}
92 pushRoute={props.pushRoute}
92 // Other
93 // Other
src/bridge/views/CreateGalaxy.js+1
@@ -212,6 +212,7 @@ class CreateGalaxy extends React.Component {
212 walletHdPath={props.walletHdPath}
212 walletHdPath={props.walletHdPath}
213 networkType={props.networkType}
213 networkType={props.networkType}
214 setTxnHashCursor={props.setTxnHashCursor}
214 setTxnHashCursor={props.setTxnHashCursor}
215+ setTxnConfirmations={props.setTxnConfirmations}
215 popRoute={props.popRoute}
216 popRoute={props.popRoute}
216 pushRoute={props.pushRoute}
217 pushRoute={props.pushRoute}
217 // Other
218 // Other
src/bridge/views/IssueChild.js+1
@@ -303,6 +303,7 @@ class IssueChild extends React.Component {
303 walletHdPath={props.walletHdPath}
303 walletHdPath={props.walletHdPath}
304 networkType={props.networkType}
304 networkType={props.networkType}
305 setTxnHashCursor={props.setTxnHashCursor}
305 setTxnHashCursor={props.setTxnHashCursor}
306+ setTxnConfirmations={props.setTxnConfirmations}
306 popRoute={props.popRoute}
307 popRoute={props.popRoute}
307 pushRoute={props.pushRoute}
308 pushRoute={props.pushRoute}
308 // Other
309 // Other
src/bridge/views/Network.js+47−99
@@ -1,11 +1,7 @@
1import Maybe from 'folktale/maybe'
1import Maybe from 'folktale/maybe'
2import React from 'react'
2import React from 'react'
3import { Button } from '../components/Base'
3import { Button } from '../components/Base'
4−import {
5− DropdownItem,
6− InnerLabelDropdown,
4+import { InnerLabelDropdown } from '../components/Base'
7− DropdownDivider,
8−} from '../components/Base'
9import { Row, Col, H1, P } from '../components/Base'
5import { Row, Col, H1, P } from '../components/Base'
10import * as azimuth from 'azimuth-js'
6import * as azimuth from 'azimuth-js'
11import Web3 from 'web3'
7import Web3 from 'web3'
@@ -19,21 +15,9 @@ class Network extends React.Component {
19 constructor(props) {
15 constructor(props) {
20 super(props)
16 super(props)
21
17
22− this.state = {
23− dropdownOpen: false
24− };
25−
26− this.toggle = this.toggle.bind(this);
27− this.close = this.close.bind(this);
28 this.handleNetworkChange = this.handleNetworkChange.bind(this);
18 this.handleNetworkChange = this.handleNetworkChange.bind(this);
29 }
19 }
30
20
31− toggle() {
32− this.setState((state, _) => ({
33− dropdownOpen: !state.dropdownOpen
34− }))
35− }
36−
37 handleNetworkChange(network) {
21 handleNetworkChange(network) {
38 const { setNetworkType, setNetwork } = this.props
22 const { setNetworkType, setNetwork } = this.props
39
23
@@ -86,7 +70,10 @@ class Network extends React.Component {
86 // We may want to offer the ability to select a target network for
70 // We may want to offer the ability to select a target network for
87 // transactions when offline.
71 // transactions when offline.
88
72
73+ // Note: localhost:3456 doesn't actually point to anything, we just need
74+ // a provider to initialize the Web3 object
75+ const provider = new Web3.providers.HttpProvider("http://localhost:3456")
89− const web3 = new Web3()
76+ const web3 = new Web3(provider)
90
77
91 const target =
78 const target =
92 process.env.NODE_ENV === 'development'
79 process.env.NODE_ENV === 'development'
@@ -99,97 +86,58 @@ class Network extends React.Component {
99 }
86 }
100 }
87 }
101
88
102− selectClose(f) {
89+ getNetworkOptions() {
103− f()
90+ return [{
104− this.setState({ dropdownOpen: false })
91+ title: 'Main Network (default)',
92+ value: NETWORK_NAMES.MAINNET
93+ }, {
94+ title: 'Local Node',
95+ value: NETWORK_NAMES.LOCAL
105− }
96+ }, {
106−
97+ title: 'Ropsten',
107−
98+ value: NETWORK_NAMES.ROPSTEN
108− close () {
99+ }, {
109− this.setState({ dropdownOpen: false })
100+ type: 'divider'
101+ }, {
102+ title: 'Offline',
103+ value: NETWORK_NAMES.OFFLINE
104+ }]
110 }
105 }
111
106
112 render() {
107 render() {
113− const { dropdownOpen } = this.state
114 const { networkType, pushRoute } = this.props
108 const { networkType, pushRoute } = this.props
109+ const networkOptions = this.getNetworkOptions()
115
110
116 return (
111 return (
117 <Row>
112 <Row>
118 <Col>
113 <Col>
119 <H1>{ 'Select Network' }</H1>
114 <H1>{ 'Select Network' }</H1>
120
115
121−
122− <P>
116+ <P>
123− {
117+ {
124− "Please select the Ethereum node you'd like to send " +
118+ "Please select the Ethereum node you'd like to send " +
125− "transactions to. For highly valuable keys, please select " +
119+ "transactions to. For highly valuable keys, please select " +
126− "offline mode."
120+ "offline mode."
127− }
121+ }
128− </P>
122+ </P>
129−
123+
130−
131− <InnerLabelDropdown
124+ <InnerLabelDropdown
132− className={'mt-6'}
125+ className={'mt-6'}
133− handleToggle={this.toggle}
134− handleClose={this.close}
135− isOpen={dropdownOpen}
136− title={'Node:'}
126+ title={'Node:'}
127+ handleUpdate={this.handleNetworkChange}
128+ options={networkOptions}
137− currentSelectionTitle={renderNetworkType(networkType)}
129+ currentSelectionTitle={renderNetworkType(networkType)}>
138− >
139−
140− <DropdownItem
141− isSelected={ false }
142− onClick={
143− () => this.selectClose(() => this.handleNetworkChange(NETWORK_NAMES.MAINNET))
144− }
145− >
146− { 'Main Network (default)' }
147− </DropdownItem>
148−
149− <DropdownItem
150− isSelected={false}
151− onClick={
152− () => this.selectClose(() => this.handleNetworkChange(NETWORK_NAMES.LOCAL))
153− }
154− >
155− { //'Ganache Node @ Port 8545 (Default)'
156− }
157− {'Local Node'}
158− </DropdownItem>
159−
160− <DropdownItem
161− // disabled={ true }
162− isSelected={ false }
163− onClick={
164− () => this.selectClose(() => this.handleNetworkChange(NETWORK_NAMES.ROPSTEN))
165− }
166− >
167− { 'Ropsten' }
168− </DropdownItem>
169−
170− <DropdownDivider />
171−
172− <DropdownItem
173− // disabled={ true }
174− isSelected={ false }
175− onClick={
176− () => this.selectClose(() => this.handleNetworkChange(NETWORK_NAMES.OFFLINE))
177− }
178− >
179− { 'Offline' }
180− </DropdownItem>
181−
182− </InnerLabelDropdown>
130+ </InnerLabelDropdown>
183−
131+
184− <Button
132+ <Button
185− className={'mt-10'}
133+ className={'mt-10'}
186− onClick={ () => pushRoute(ROUTE_NAMES.WALLET) }
134+ onClick={ () => pushRoute(ROUTE_NAMES.WALLET) }
187− >
135+ >
188− { 'Continue →' }
136+ { 'Continue →' }
189− </Button>
137+ </Button>
190−
138+
191− </Col>
139+ </Col>
192− </Row>
140+ </Row>
193 )
141 )
194 }
142 }
195}
143}
src/bridge/views/Point/Actions.js+2−3
@@ -10,7 +10,6 @@ import { Row, Col, H2, P } from '../../components/Base'
10import { Button } from '../../components/Base'
10import { Button } from '../../components/Base'
11import { ROUTE_NAMES } from '../../lib/router'
11import { ROUTE_NAMES } from '../../lib/router'
12
12
13−
14const isPlanet = point =>
13const isPlanet = point =>
15 parseInt(point, 10) > 65535
14 parseInt(point, 10) > 65535
16
15
@@ -137,7 +136,7 @@ const Actions = (props) => {
137 <Button
136 <Button
138 prop-size={'sm'}
137 prop-size={'sm'}
139 prop-type={'link'}
138 prop-type={'link'}
140− disabled={ !canAcceptTransfer }
139+ disabled={ online && !canAcceptTransfer }
141 onClick={ () => {
140 onClick={ () => {
142 pushRoute(ROUTE_NAMES.ACCEPT_TRANSFER)
141 pushRoute(ROUTE_NAMES.ACCEPT_TRANSFER)
143 }}
142 }}
@@ -159,7 +158,7 @@ const Actions = (props) => {
159 <Button
158 <Button
160 prop-size={'sm'}
159 prop-size={'sm'}
161 prop-type={'link'}
160 prop-type={'link'}
162− disabled={ !canGenKeyfile }
161+ disabled={ online && !canGenKeyfile }
163 onClick={ () => {
162 onClick={ () => {
164 pushRoute(ROUTE_NAMES.GEN_KEYFILE)
163 pushRoute(ROUTE_NAMES.GEN_KEYFILE)
165 }}
164 }}
src/bridge/views/Points.js+5−1
@@ -4,6 +4,7 @@ import { Button } from '../components/Base'
4import * as azimuth from 'azimuth-js'
4import * as azimuth from 'azimuth-js'
5
5
6import PointList from '../components/PointList'
6import PointList from '../components/PointList'
7+import { NETWORK_NAMES } from '../lib/network'
7import { ROUTE_NAMES } from '../lib/router'
8import { ROUTE_NAMES } from '../lib/router'
8import {
9import {
9 ETH_ZERO_ADDR,
10 ETH_ZERO_ADDR,
@@ -21,6 +22,9 @@ class Points extends React.Component {
21 constructor(props) {
22 constructor(props) {
22 super(props)
23 super(props)
23
24
25+ const { networkType } = props
26+ const loading = networkType !== NETWORK_NAMES.OFFLINE
27+
24 this.state = {
28 this.state = {
25 points: [],
29 points: [],
26 incoming: [],
30 incoming: [],
@@ -28,7 +32,7 @@ class Points extends React.Component {
28 voting: [],
32 voting: [],
29 spawning: [],
33 spawning: [],
30 eclipticOwner: false,
34 eclipticOwner: false,
31− loading: true
35+ loading: loading
32 }
36 }
33 }
37 }
34
38
src/bridge/views/SentTransaction.js+91−44
@@ -1,3 +1,4 @@
1+import Maybe from 'folktale/maybe'
1import React from 'react'
2import React from 'react'
2import { Row, Col, H1, H3, P, Warning, Anchor } from '../components/Base'
3import { Row, Col, H1, H3, P, Warning, Anchor } from '../components/Base'
3import { Button } from '../components/Base'
4import { Button } from '../components/Base'
@@ -6,55 +7,100 @@ import { ROUTE_NAMES } from '../lib/router'
6import { BRIDGE_ERROR, renderTxnError } from '../lib/error'
7import { BRIDGE_ERROR, renderTxnError } from '../lib/error'
7import { NETWORK_NAMES } from '../lib/network'
8import { NETWORK_NAMES } from '../lib/network'
8
9
9−const Success = (props) => {
10−
11− const esvisible =
12− props.networkType === NETWORK_NAMES.ROPSTEN ||
13− props.networkType === NETWORK_NAMES.MAINNET
14−
15− const esdomain =
16− props.networkType === NETWORK_NAMES.ROPSTEN
17− ? "ropsten.etherscan.io"
18− : "etherscan.io"
19−
20− const esmessage =
21− esvisible === true
22− ? "If you’d like to keep track of it, click the Etherscan link below."
23− : ''
24−
25− const esanchor =
26− esvisible === false
27− ? <div />
28− : <Anchor
29− className={'mb-4 mt-1'}
30− prop-size={'sm'}
31− target={'_blank'}
32− href={`https://${esdomain}/tx/${props.hash}`}>
33− {'View on Etherscan ↗'}
34− </Anchor>
35
10
36− return (
11+class Success extends React.Component {
37− <Row>
12+
38− <Col>
13+ constructor(props) {
39− <H1>{ 'Your Transaction was Sent' }</H1>
14+ super(props)
15+
16+ this.state = {
17+ pending: '.',
18+ interval: null
19+ }
20+ }
21+
22+ componentDidMount() {
23+ const nextDot = {'.': '..',
24+ '..': '...',
25+ '...': '.'}
26+
27+ const interval = setInterval(() => {
28+ this.setState(({ pending }) => ({pending: nextDot[pending]}))
29+ }, 1000)
30+ this.setState({interval: interval})
31+ }
32+
33+ componentWillUnmount() {
34+ clearInterval(this.state.interval)
35+ }
36+
37+ render() {
38+
39+ const { props, state } = this
40+ const { networkType, hash, txnConfirmations } = props
41+ const { pending } = state
42+
43+ const esvisible =
44+ networkType === NETWORK_NAMES.ROPSTEN ||
45+ networkType === NETWORK_NAMES.MAINNET
46+
47+ const esdomain =
48+ networkType === NETWORK_NAMES.ROPSTEN
49+ ? "ropsten.etherscan.io"
50+ : "etherscan.io"
51+
52+ const esmessage =
53+ esvisible === true
54+ ? "If you’d like to keep track of it, click the Etherscan link below."
55+ : ''
40
56
57+ const esanchor =
58+ esvisible === false
59+ ? null
60+ : <Anchor
61+ className={'mb-4 mt-1'}
62+ prop-size={'sm'}
63+ target={'_blank'}
64+ href={`https://${esdomain}/tx/${hash}`}>
65+ {'View on Etherscan ↗'}
66+ </Anchor>
67+
68+ const confirmations = Maybe.fromNullable(txnConfirmations[hash]).getOrElse(0)
69+
70+ const requiredConfirmations = 1
71+
72+ const status = confirmations < requiredConfirmations ?
73+ `Pending${pending}` : `Confirmed! (x${confirmations} confirmations)!`
74+
75+ return (
76+ <Row>
77+ <Col>
78+ <H1>{ 'Your Transaction was Sent' }</H1>
79+
41− <P>
80+ <P>
42− {
81+ {
43− `We sent your transaction to the chain. It can take some time to
82+ `We sent your transaction to the chain. It can take some time to
44 execute, especially if the network is busy. ${esmessage}`
83 execute, especially if the network is busy. ${esmessage}`
45− }
84+ }
46− </P>
85+ </P>
47
86
48− <H3>{ 'Transaction Hash' }</H3>
87+ <H3>{ 'Transaction Hash' }</H3>
49− <P>
88+ <P>
50− { props.hash }
89+ { hash }
51− </P>
90+ </P>
52
91
92+ <H3>{ 'Transaction Status' }</H3>
93+ <P>
94+ { status }
95+ </P>
96+ <P>
53− { esanchor }
97+ { esanchor }
98+ </P>
54
99
55− </Col>
100+ </Col>
56− </Row>
101+ </Row>
57− )
102+ )
103+ }
58}
104}
59
105
60const Failure = (props) =>
106const Failure = (props) =>
@@ -76,7 +122,7 @@ const Failure = (props) =>
76 </Row>
122 </Row>
77
123
78const SentTransaction = (props) => {
124const SentTransaction = (props) => {
79− const { web3, txnHashCursor, networkType, popRoute, pushRoute } = props
125+ const { web3, txnHashCursor, networkType, popRoute, pushRoute, txnConfirmations} = props
80 const { setPointCursor, pointCursor } = props
126 const { setPointCursor, pointCursor } = props
81
127
82 const promptKeyfile = props.routeData && props.routeData.promptKeyfile
128 const promptKeyfile = props.routeData && props.routeData.promptKeyfile
@@ -97,6 +143,7 @@ const SentTransaction = (props) => {
97 <Success
143 <Success
98 hash={ hash.value }
144 hash={ hash.value }
99 networkType={ networkType }
145 networkType={ networkType }
146+ txnConfirmations={ txnConfirmations }
100 />
147 />
101 })
148 })
102
149
src/bridge/views/SetKeys.js+1
@@ -194,6 +194,7 @@ class SetKeys extends React.Component {
194 walletHdPath={props.walletHdPath}
194 walletHdPath={props.walletHdPath}
195 networkType={props.networkType}
195 networkType={props.networkType}
196 setTxnHashCursor={props.setTxnHashCursor}
196 setTxnHashCursor={props.setTxnHashCursor}
197+ setTxnConfirmations={props.setTxnConfirmations}
197 popRoute={props.popRoute}
198 popRoute={props.popRoute}
198 pushRoute={props.pushRoute}
199 pushRoute={props.pushRoute}
199 // Tx
200 // Tx
src/bridge/views/SetProxy.js+1
@@ -162,6 +162,7 @@ class SetProxy extends React.Component {
162 walletHdPath={props.walletHdPath}
162 walletHdPath={props.walletHdPath}
163 networkType={props.networkType}
163 networkType={props.networkType}
164 setTxnHashCursor={props.setTxnHashCursor}
164 setTxnHashCursor={props.setTxnHashCursor}
165+ setTxnConfirmations={props.setTxnConfirmations}
165 popRoute={props.popRoute}
166 popRoute={props.popRoute}
166 pushRoute={props.pushRoute}
167 pushRoute={props.pushRoute}
167 // Other
168 // Other
src/bridge/views/Transfer.js+1
@@ -132,6 +132,7 @@ class Transfer extends React.Component {
132 walletHdPath={props.walletHdPath}
132 walletHdPath={props.walletHdPath}
133 networkType={props.networkType}
133 networkType={props.networkType}
134 setTxnHashCursor={props.setTxnHashCursor}
134 setTxnHashCursor={props.setTxnHashCursor}
135+ setTxnConfirmations={props.setTxnConfirmations}
135 popRoute={props.popRoute}
136 popRoute={props.popRoute}
136 pushRoute={props.pushRoute}
137 pushRoute={props.pushRoute}
137 // Checks
138 // Checks
src/bridge/views/Wallet.js+32−84
@@ -1,52 +1,50 @@
1import Maybe from 'folktale/maybe'
1import Maybe from 'folktale/maybe'
2import React from 'react'
2import React from 'react'
3import { Button, H1, P } from '../components/Base'
3import { Button, H1, P } from '../components/Base'
4−import {
5− InnerLabelDropdown,
4+import { InnerLabelDropdown } from '../components/Base'
6− DropdownItem,
7− DropdownDivider
8−} from '../components/Base'
9import { Row, Col } from '../components/Base'
5import { Row, Col } from '../components/Base'
10
6
11import { ROUTE_NAMES } from '../lib/router'
7import { ROUTE_NAMES } from '../lib/router'
12import { WALLET_NAMES, renderWalletType } from '../lib/wallet'
8import { WALLET_NAMES, renderWalletType } from '../lib/wallet'
13
9
14class Wallet extends React.Component {
10class Wallet extends React.Component {
15−
16− constructor(props) {
17− super(props)
18−
19− this.state = {
20− dropdownOpen: false
21− }
22−
23− this.toggle = this.toggle.bind(this)
24− this.close = this.close.bind(this)
25−
26− }
27−
28 componentDidMount() {
11 componentDidMount() {
29 const { setWallet } = this.props
12 const { setWallet } = this.props
30 setWallet(Maybe.Nothing())
13 setWallet(Maybe.Nothing())
31 }
14 }
32
15
33− toggle() {
16+ getWalletOptions() {
34− this.setState((state, _) => ({
17+ return [{
35− dropdownOpen: !state.dropdownOpen
18+ title: 'Urbit Master Ticket',
36− }))
19+ value: WALLET_NAMES.TICKET
20+ }, {
21+ title: 'Urbit Master Ticket (Shards)',
22+ value: WALLET_NAMES.SHARDS
23+ }, {
24+ type: 'divider'
37− }
25+ }, {
38−
26+ title: 'Ledger',
39− selectClose(f) {
27+ value: WALLET_NAMES.LEDGER
40− f()
28+ }, {
41− this.setState({ dropdownOpen: false })
29+ title: 'Trezor',
30+ value: WALLET_NAMES.TREZOR
31+ }, {
32+ type: 'divider'
42− }
33+ }, {
43−
34+ title: 'BIP39 Mnemonic',
44− close () {
35+ value: WALLET_NAMES.MNEMONIC
45− this.setState({ dropdownOpen: false })
36+ }, {
37+ title: 'Ethereum Private Key',
38+ value: WALLET_NAMES.PRIVATE_KEY
39+ }, {
40+ title: 'Ethereum Keystore File',
41+ value: WALLET_NAMES.KEYSTORE
42+ }]
46 }
43 }
47
44
48 render() {
45 render() {
49− const { props, state } = this
46+ const { props } = this
47+ const walletOptions = this.getWalletOptions()
50
48
51 return (
49 return (
52 <Row>
50 <Row>
@@ -63,60 +61,10 @@ class Wallet extends React.Component {
63
61
64 <InnerLabelDropdown
62 <InnerLabelDropdown
65 className={'mb-10 mt-6'}
63 className={'mb-10 mt-6'}
66− handleToggle={this.toggle}
67− handleClose={this.close}
68− isOpen={state.dropdownOpen}
69 title={'Wallet Type:'}
64 title={'Wallet Type:'}
65+ options={walletOptions}
66+ handleUpdate={props.setWalletType}
70 currentSelectionTitle={renderWalletType(props.walletType)}>
67 currentSelectionTitle={renderWalletType(props.walletType)}>
71−
72− <DropdownItem
73− onClick={ () => this.selectClose(() => props.setWalletType(WALLET_NAMES.TICKET)) }
74− >
75− { 'Urbit Master Ticket' }
76− </DropdownItem>
77−
78− <DropdownItem
79− onClick={ () => this.selectClose(() => props.setWalletType(WALLET_NAMES.SHARDS)) }
80− >
81− { 'Urbit Master Ticket (Shards)' }
82− </DropdownItem>
83−
84− <DropdownDivider />
85−
86− <DropdownItem
87− onClick={ () => this.selectClose(() => props.setWalletType(WALLET_NAMES.LEDGER)) }
88− >
89− { 'Ledger' }
90− </DropdownItem>
91−
92− <DropdownItem
93− onClick={ () => this.selectClose(() => props.setWalletType(WALLET_NAMES.TREZOR)) }
94− >
95− { 'Trezor' }
96− </DropdownItem>
97−
98− <DropdownDivider />
99−
100− <DropdownItem
101− onClick={ () => this.selectClose(() => props.setWalletType(WALLET_NAMES.MNEMONIC)) }
102− >
103− { 'BIP39 Mnemonic' }
104− </DropdownItem>
105−
106− <DropdownItem
107− onClick={ () => this.selectClose(() => props.setWalletType(WALLET_NAMES.PRIVATE_KEY)) }
108− >
109− { 'Ethereum Private Key' }
110− </DropdownItem>
111−
112− <DropdownItem
113− onClick={ () => this.selectClose(() => props.setWalletType(WALLET_NAMES.KEYSTORE)) }
114− >
115− { 'Ethereum Keystore File' }
116− </DropdownItem>
117−
118−
119−
120 </InnerLabelDropdown>
68 </InnerLabelDropdown>
121
69
122 <Button
70 <Button