on master help sign in
Merge branch 'master' into mino-onboarding-invites
commit1c60801ce5eae06049641905fbfec9b43cce9a89 authorFang <git@fang.io> dateTue 16 Apr 2019, 22:55 (8 years ago) parent58241ec58b8e51
20 files changed+923−557
package-lock.json+521−248 package.json+4−3 src/bridge/Bridge.js+18−3 src/bridge/components/InnerLabelDropdown.js+88−45 src/bridge/components/StatelessTransaction.js+92−19 src/bridge/lib/txn.js+6−6 src/bridge/lib/wallet.js+2−2 src/bridge/style/extend.css+8 src/bridge/views/AcceptTransfer.js+1 src/bridge/views/CancelTransfer.js+1 src/bridge/views/CreateGalaxy.js+1 src/bridge/views/IssueChild.js+1 src/bridge/views/Network.js+47−99 src/bridge/views/Point/Actions.js+2−3 src/bridge/views/Points.js+5−1 src/bridge/views/SentTransaction.js+91−44 src/bridge/views/SetKeys.js+1 src/bridge/views/SetProxy.js+1 src/bridge/views/Transfer.js+1 src/bridge/views/Wallet.js+32−84
package-lock.json+521−248
@@ -1058,6 +1058,19 @@
10581058 "text-encoding": "^0.6.1"
10591059 }
10601060 },
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+ },
10611074 "@types/q": {
10621075 "version": "1.5.1",
10631076 "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.1.tgz",
@@ -1251,7 +1264,7 @@
12511264 "flat": "^4.1.0",
12521265 "lodash": "^4.17.10",
12531266 "qr-image": "^3.2.0",
1254− "sigil-js": "github:urbit/sigil-js",
1267+ "sigil-js": "github:urbit/sigil-js#1864796bb3f482e597fd85acfd324795e42b2465",
12551268 "urbit-ob": "^1.4.4"
12561269 },
12571270 "dependencies": {
@@ -1988,6 +2001,43 @@
19882001 "azimuth-solidity": "1.0.2",
19892002 "ethereumjs-util": "^5.2.0",
19902003 "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+ }
19912041 }
19922042 },
19932043 "azimuth-solidity": {
@@ -6419,8 +6469,7 @@
64196469 },
64206470 "ansi-regex": {
64216471 "version": "2.1.1",
6422− "bundled": true,
6423− "optional": true
6472+ "bundled": true
64246473 },
64256474 "aproba": {
64266475 "version": "1.2.0",
@@ -6438,13 +6487,11 @@
64386487 },
64396488 "balanced-match": {
64406489 "version": "1.0.0",
6441− "bundled": true,
6442− "optional": true
6490+ "bundled": true
64436491 },
64446492 "brace-expansion": {
64456493 "version": "1.1.11",
64466494 "bundled": true,
6447− "optional": true,
64486495 "requires": {
64496496 "balanced-match": "^1.0.0",
64506497 "concat-map": "0.0.1"
@@ -6457,18 +6504,15 @@
64576504 },
64586505 "code-point-at": {
64596506 "version": "1.1.0",
6460− "bundled": true,
6461− "optional": true
6507+ "bundled": true
64626508 },
64636509 "concat-map": {
64646510 "version": "0.0.1",
6465− "bundled": true,
6466− "optional": true
6511+ "bundled": true
64676512 },
64686513 "console-control-strings": {
64696514 "version": "1.1.0",
6470− "bundled": true,
6471− "optional": true
6515+ "bundled": true
64726516 },
64736517 "core-util-is": {
64746518 "version": "1.0.2",
@@ -6571,8 +6615,7 @@
65716615 },
65726616 "inherits": {
65736617 "version": "2.0.3",
6574− "bundled": true,
6575− "optional": true
6618+ "bundled": true
65766619 },
65776620 "ini": {
65786621 "version": "1.3.5",
@@ -6582,7 +6625,6 @@
65826625 "is-fullwidth-code-point": {
65836626 "version": "1.0.0",
65846627 "bundled": true,
6585− "optional": true,
65866628 "requires": {
65876629 "number-is-nan": "^1.0.0"
65886630 }
@@ -6595,20 +6637,17 @@
65956637 "minimatch": {
65966638 "version": "3.0.4",
65976639 "bundled": true,
6598− "optional": true,
65996640 "requires": {
66006641 "brace-expansion": "^1.1.7"
66016642 }
66026643 },
66036644 "minimist": {
66046645 "version": "0.0.8",
6605− "bundled": true,
6606− "optional": true
6646+ "bundled": true
66076647 },
66086648 "minipass": {
66096649 "version": "2.2.4",
66106650 "bundled": true,
6611− "optional": true,
66126651 "requires": {
66136652 "safe-buffer": "^5.1.1",
66146653 "yallist": "^3.0.0"
@@ -6625,7 +6664,6 @@
66256664 "mkdirp": {
66266665 "version": "0.5.1",
66276666 "bundled": true,
6628− "optional": true,
66296667 "requires": {
66306668 "minimist": "0.0.8"
66316669 }
@@ -6698,8 +6736,7 @@
66986736 },
66996737 "number-is-nan": {
67006738 "version": "1.0.1",
6701− "bundled": true,
6702− "optional": true
6739+ "bundled": true
67036740 },
67046741 "object-assign": {
67056742 "version": "4.1.1",
@@ -6709,7 +6746,6 @@
67096746 "once": {
67106747 "version": "1.4.0",
67116748 "bundled": true,
6712− "optional": true,
67136749 "requires": {
67146750 "wrappy": "1"
67156751 }
@@ -6785,8 +6821,7 @@
67856821 },
67866822 "safe-buffer": {
67876823 "version": "5.1.1",
6788− "bundled": true,
6789− "optional": true
6824+ "bundled": true
67906825 },
67916826 "safer-buffer": {
67926827 "version": "2.1.2",
@@ -6816,7 +6851,6 @@
68166851 "string-width": {
68176852 "version": "1.0.2",
68186853 "bundled": true,
6819− "optional": true,
68206854 "requires": {
68216855 "code-point-at": "^1.0.0",
68226856 "is-fullwidth-code-point": "^1.0.0",
@@ -6834,7 +6868,6 @@
68346868 "strip-ansi": {
68356869 "version": "3.0.1",
68366870 "bundled": true,
6837− "optional": true,
68386871 "requires": {
68396872 "ansi-regex": "^2.0.0"
68406873 }
@@ -6873,13 +6906,11 @@
68736906 },
68746907 "wrappy": {
68756908 "version": "1.0.2",
6876− "bundled": true,
6877− "optional": true
6909+ "bundled": true
68786910 },
68796911 "yallist": {
68806912 "version": "3.0.2",
6881− "bundled": true,
6882− "optional": true
6913+ "bundled": true
68836914 }
68846915 }
68856916 },
@@ -10805,9 +10836,9 @@
1080510836 }
1080610837 },
1080710838 "mock-fs": {
10808− "version": "4.7.0",
10809− "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.7.0.tgz",
10810− "integrity": "sha512-WlQNtUlzMRpvLHf8dqeUmNqfdPjGY29KrJF50Ldb4AcL+vQeR8QH3wQcFMgrhTwb1gHjZn9xggho+84tBskLgA=="
10839+ "version": "4.8.0",
10840+ "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.8.0.tgz",
10841+ "integrity": "sha512-Gwj4KnJOW15YeTJKO5frFd/WDO5Mc0zxXqL9oHx3+e9rBqW8EVARqQHSaIXznUdljrD6pvbNGW2ZGXKPEfYJfw=="
1081110842 },
1081210843 "more-entropy": {
1081310844 "version": "0.0.7",
@@ -11566,12 +11597,12 @@
1156611597 }
1156711598 },
1156811599 "parse-headers": {
11569− "version": "2.0.1",
11570− "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz",
11571− "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=",
11600+ "version": "2.0.2",
11601+ "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.2.tgz",
11602+ "integrity": "sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg==",
1157211603 "requires": {
11573− "for-each": "^0.3.2",
11574− "trim": "0.0.1"
11604+ "for-each": "^0.3.3",
11605+ "string.prototype.trim": "^1.1.2"
1157511606 }
1157611607 },
1157711608 "parse-json": {
@@ -18041,6 +18072,16 @@
1804118072 "function-bind": "^1.0.2"
1804218073 }
1804318074 },
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+ },
1804418085 "string_decoder": {
1804518086 "version": "1.1.1",
1804618087 "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
@@ -18724,11 +18765,6 @@
1872418765 }
1872518766 }
1872618767 },
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− },
1873218768 "trim-right": {
1873318769 "version": "1.0.1",
1873418770 "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
@@ -18940,29 +18976,12 @@
1894018976 "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og=="
1894118977 },
1894218978 "unbzip2-stream": {
18943− "version": "1.3.1",
18944− "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.1.tgz",
18945− "integrity": "sha512-fIZnvdjblYs7Cru/xC6tCPVhz7JkYcVQQkePwMLyQELzYTds2Xn8QefPVnvdVhhZqubxNA1cASXEH5wcK0Bucw==",
18979+ "version": "1.3.3",
18980+ "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz",
18981+ "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==",
1894618982 "requires": {
18947− "buffer": "^3.0.1",
18948− "through": "^2.3.6"
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− }
18983+ "buffer": "^5.2.1",
18984+ "through": "^2.3.8"
1896618985 }
1896718986 },
1896818987 "underscore": {
@@ -19401,241 +19420,413 @@
1940119420 "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
1940219421 "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU="
1940319422 },
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"
19428− }
19429− },
19430− "web3-core-helpers": {
19423+ "web3-utils": {
1943119424 "version": "1.0.0-beta.33",
19432− "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.33.tgz",
19433− "integrity": "sha1-Kvcz5QTbBefDZIwdrPV3sOwV3EM=",
19425+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.33.tgz",
19426+ "integrity": "sha1-4JG3mU8JtxSwGYpAV9OtLrjL4jg=",
1943419427 "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",
1943519433 "underscore": "1.8.3",
19436− "web3-eth-iban": "1.0.0-beta.33",
19437− "web3-utils": "1.0.0-beta.33"
19434+ "utf8": "2.1.1"
1943819435 }
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="
1943919464 },
19440− "web3-core-method": {
19465+ "web3-utils": {
1944119466 "version": "1.0.0-beta.33",
19442− "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.0.0-beta.33.tgz",
19443− "integrity": "sha1-7Y7ExK+rIdwJid41g2hEZlIrboY=",
19467+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.33.tgz",
19468+ "integrity": "sha1-4JG3mU8JtxSwGYpAV9OtLrjL4jg=",
1944419469 "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",
1944519475 "underscore": "1.8.3",
19446− "web3-core-helpers": "1.0.0-beta.33",
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"
19476+ "utf8": "2.1.1"
1945919477 }
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="
1946019495 },
19461− "web3-core-requestmanager": {
19496+ "web3-utils": {
1946219497 "version": "1.0.0-beta.33",
19463− "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.33.tgz",
19464− "integrity": "sha1-ejbEA1QALfsXnKLb22pgEsn3Ges=",
19498+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.33.tgz",
19499+ "integrity": "sha1-4JG3mU8JtxSwGYpAV9OtLrjL4jg=",
1946519500 "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",
1946619506 "underscore": "1.8.3",
19467− "web3-core-helpers": "1.0.0-beta.33",
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"
19507+ "utf8": "2.1.1"
1947119508 }
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="
1947219528 },
19473− "web3-core-subscriptions": {
19529+ "web3-utils": {
1947419530 "version": "1.0.0-beta.33",
19475− "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.33.tgz",
19476− "integrity": "sha1-YCh1yfTV9NDhYhRitfwewZs1veM=",
19531+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.33.tgz",
19532+ "integrity": "sha1-4JG3mU8JtxSwGYpAV9OtLrjL4jg=",
1947719533 "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",
1947919539 "underscore": "1.8.3",
19480− "web3-core-helpers": "1.0.0-beta.33"
19540+ "utf8": "2.1.1"
1948119541 }
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="
1948219599 },
19483− "web3-eth": {
19600+ "web3-utils": {
1948419601 "version": "1.0.0-beta.33",
19485− "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.0.0-beta.33.tgz",
19486− "integrity": "sha1-hKn5TallUnyS2DitTlcN8CWJhJ8=",
19602+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.33.tgz",
19603+ "integrity": "sha1-4JG3mU8JtxSwGYpAV9OtLrjL4jg=",
1948719604 "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",
1948819610 "underscore": "1.8.3",
19489− "web3-core": "1.0.0-beta.33",
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"
19611+ "utf8": "2.1.1"
1950019612 }
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="
1950119631 },
19502− "web3-eth-abi": {
19632+ "web3-utils": {
1950319633 "version": "1.0.0-beta.33",
19504− "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.33.tgz",
19505− "integrity": "sha1-IiH3FRZDZgAypN80D2EjSRaMgko=",
19634+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.33.tgz",
19635+ "integrity": "sha1-4JG3mU8JtxSwGYpAV9OtLrjL4jg=",
1950619636 "requires": {
1950719637 "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",
1950819642 "underscore": "1.8.3",
19509− "web3-core-helpers": "1.0.0-beta.33",
19510− "web3-utils": "1.0.0-beta.33"
19643+ "utf8": "2.1.1"
1951119644 }
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="
1951219679 },
19513− "web3-eth-accounts": {
19680+ "web3-utils": {
1951419681 "version": "1.0.0-beta.33",
19515− "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.33.tgz",
19516− "integrity": "sha1-JajX9OWOHpk7kvBpVILMzckhL5E=",
19682+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.33.tgz",
19683+ "integrity": "sha1-4JG3mU8JtxSwGYpAV9OtLrjL4jg=",
1951719684 "requires": {
19518− "any-promise": "1.3.0",
19519− "crypto-browserify": "3.12.0",
19520− "eth-lib": "0.2.7",
19521− "scrypt.js": "0.2.0",
19685+ "bn.js": "4.11.6",
19686+ "eth-lib": "0.1.27",
19687+ "ethjs-unit": "0.1.6",
19688+ "number-to-bn": "1.7.0",
19689+ "randomhex": "0.1.5",
1952219690 "underscore": "1.8.3",
19523− "uuid": "2.0.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"
19691+ "utf8": "2.1.1"
1952819692 },
1952919693 "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+ },
1953019699 "eth-lib": {
19531− "version": "0.2.7",
19532− "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz",
19533− "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=",
19700+ "version": "0.1.27",
19701+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.27.tgz",
19702+ "integrity": "sha512-B8czsfkJYzn2UIEMwjc7Mbj+Cy72V+/OXH/tb44LV8jhrjizQJJ325xMOMyk3+ETa6r6oi0jsUY14+om8mQMWA==",
1953419703 "requires": {
1953519704 "bn.js": "^4.11.6",
1953619705 "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",
1953719710 "xhr-request-promise": "^0.1.2"
1953819711 }
1953919712 }
1954019713 }
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="
1954119736 },
19542− "web3-eth-contract": {
19737+ "web3-utils": {
1954319738 "version": "1.0.0-beta.33",
19544− "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.33.tgz",
19545− "integrity": "sha1-nlkZ8pF6PGe0+2Vp1JxeMDiSW84=",
19739+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.33.tgz",
19740+ "integrity": "sha1-4JG3mU8JtxSwGYpAV9OtLrjL4jg=",
1954619741 "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",
1954719747 "underscore": "1.8.3",
19548− "web3-core": "1.0.0-beta.33",
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"
19748+ "utf8": "2.1.1"
1955519749 }
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="
1955619766 },
19557− "web3-eth-iban": {
19767+ "web3-utils": {
1955819768 "version": "1.0.0-beta.33",
19559− "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.33.tgz",
19560− "integrity": "sha1-HXPQxSiKRWWxdUp1tfs+oLd6Uy8=",
19769+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.33.tgz",
19770+ "integrity": "sha1-4JG3mU8JtxSwGYpAV9OtLrjL4jg=",
1956119771 "requires": {
1956219772 "bn.js": "4.11.6",
19563− "web3-utils": "1.0.0-beta.33"
19564− }
19565− },
19566− "web3-eth-personal": {
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",
19773+ "eth-lib": "0.1.27",
19774+ "ethjs-unit": "0.1.6",
19775+ "number-to-bn": "1.7.0",
19776+ "randomhex": "0.1.5",
1960319777 "underscore": "1.8.3",
19604− "web3-core-helpers": "1.0.0-beta.33"
19778+ "utf8": "2.1.1"
1960519779 }
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="
1960619799 },
19607− "web3-providers-ws": {
19800+ "web3-utils": {
1960819801 "version": "1.0.0-beta.33",
19609− "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.33.tgz",
19610− "integrity": "sha1-j93qQuGbvyUh7IeVRkV6Yjqdye8=",
19802+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.33.tgz",
19803+ "integrity": "sha1-4JG3mU8JtxSwGYpAV9OtLrjL4jg=",
1961119804 "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",
1961219810 "underscore": "1.8.3",
19613− "web3-core-helpers": "1.0.0-beta.33",
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"
19811+ "utf8": "2.1.1"
1963819812 }
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="
1963919830 },
1964019831 "web3-utils": {
1964119832 "version": "1.0.0-beta.33",
@@ -19650,16 +19841,88 @@
1965019841 "underscore": "1.8.3",
1965119842 "utf8": "2.1.1"
1965219843 }
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+ }
1965319911 },
19654− "websocket": {
19655− "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2",
19656− "from": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2",
19912+ "eth-lib": {
19913+ "version": "0.2.8",
19914+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
19915+ "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
1965719916 "requires": {
19658− "debug": "^2.2.0",
19659− "nan": "^2.3.3",
19660− "typedarray-to-buffer": "^3.1.2",
19661− "yaeti": "^0.0.6"
19917+ "bn.js": "^4.11.6",
19918+ "elliptic": "^6.4.0",
19919+ "xhr-request-promise": "^0.1.2"
1966219920 }
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=="
1966319926 }
1966419927 }
1966519928 },
@@ -20326,6 +20589,16 @@
2032620589 }
2032720590 }
2032820591 },
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+ },
2032920602 "websocket-driver": {
2033020603 "version": "0.7.0",
2033120604 "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
package.json+4−3
@@ -14,9 +14,10 @@
1414 "node": "11.0.0"
1515 },
1616 "dependencies": {
17− "azimuth-js": "^0.10.0",
1817 "@ledgerhq/hw-app-eth": "^4.35.0",
1918 "@ledgerhq/hw-transport-u2f": "^4.35.0",
19+ "PaperCollateralRenderer": "github:urbit/PaperCollateralRenderer",
20+ "azimuth-js": "^0.10.0",
2021 "azimuth-solidity": "1.0.2",
2122 "babel-polyfill": "^6.26.0",
2223 "bip32": "^1.0.2",
@@ -34,7 +35,6 @@
3435 "keythereum": "^1.0.4",
3536 "lodash": "^4.17.11",
3637 "more-entropy": "^0.0.7",
37− "PaperCollateralRenderer": "github:urbit/PaperCollateralRenderer",
3838 "prop-types": "^15.6.2",
3939 "react": "^16.6.0",
4040 "react-dom": "^16.6.0",
@@ -45,7 +45,8 @@
4545 "trezor-connect": "^7.0.1",
4646 "urbit-key-generation": "0.12.1",
4747 "urbit-ob": "^3.1.0",
48− "web3": "1.0.0-beta.33"
48+ "web3": "1.0.0-beta.33",
49+ "web3-utils": "^1.0.0-beta.52"
4950 },
5051 "scripts": {
5152 "start": "react-scripts start",
src/bridge/Bridge.js+18−3
@@ -25,7 +25,11 @@ const initWeb3 = (networkType) => {
2525 const contracts = azimuth.initContracts(web3, CONTRACT_ADDRESSES.MAINNET)
2626 return {web3: web3, contracts: contracts}
2727 } else if (networkType === NETWORK_NAMES.LOCAL) {
28− const endpoint = 'ws://localhost:8545'
28+ const protocol =
29+ process.env.NODE_ENV === 'development'
30+ ? 'ws'
31+ : 'wss'
32+ const endpoint = `${protocol}://localhost:8545`
2933 const provider = new Web3.providers.WebsocketProvider(endpoint)
3034 const web3 = new Web3(provider)
3135 const contracts = azimuth.initContracts(web3, CONTRACT_ADDRESSES.DEV)
@@ -80,7 +84,8 @@ class Bridge extends React.Component {
8084 pointCursor: Nothing(),
8185 pointCache: {},
8286 // txn
83− txnHashCursor: Nothing()
87+ txnHashCursor: Nothing(),
88+ txnConfirmations: {}
8489 }
8590
8691 this.pushRoute = this.pushRoute.bind(this)
@@ -95,6 +100,7 @@ class Bridge extends React.Component {
95100 this.setAuthMnemonic = this.setAuthMnemonic.bind(this)
96101 this.setPointCursor = this.setPointCursor.bind(this)
97102 this.setTxnHashCursor = this.setTxnHashCursor.bind(this)
103+ this.setTxnConfirmations = this.setTxnConfirmations.bind(this)
98104 this.setNetworkSeedCache = this.setNetworkSeedCache.bind(this)
99105 this.addToPointCache = this.addToPointCache.bind(this)
100106 }
@@ -244,6 +250,12 @@ class Bridge extends React.Component {
244250 this.setState({ txnHashCursor })
245251 }
246252
253+ setTxnConfirmations(txnHash, txnConfirmations) {
254+ this.setState((prevState, _) =>
255+ ({txnConfirmations: { ...prevState.txnConfirmations,
256+ [txnHash]: txnConfirmations}}))
257+ }
258+
247259 render() {
248260 const {
249261 routeCrumbs,
@@ -258,6 +270,7 @@ class Bridge extends React.Component {
258270 pointCursor,
259271 pointCache,
260272 txnHashCursor,
273+ txnConfirmations,
261274 web3,
262275 contracts
263276 } = this.state
@@ -310,7 +323,9 @@ class Bridge extends React.Component {
310323 setNetworkSeedCache= { this.setNetworkSeedCache }
311324 // txn
312325 setTxnHashCursor={ this.setTxnHashCursor }
313− txnHashCursor={ txnHashCursor } />
326+ txnHashCursor={ txnHashCursor }
327+ setTxnConfirmations={ this.setTxnConfirmations }
328+ txnConfirmations={ txnConfirmations } />
314329
315330 <div className={'push'} />
316331
src/bridge/components/InnerLabelDropdown.js+88−45
@@ -1,71 +1,114 @@
11import React from 'react'
22import PropTypes from 'prop-types';
33
4+import { DropdownItem, DropdownDivider } from '../components/Base'
45
5−const InnerLabelDropdown = props => {
6−
7− const menuVisibility = props.isOpen === true
8− ? 'visible'
9− : 'hidden';
10−
11− const selectedClasses = props.isOpen === true
12− ? 'br-blue'
13− : 'br-gray-50';
14−
15− return (
16− <div className={'rel table'}>
17− <div
18− className={`fix full o-0 ${menuVisibility}`}
19− onClick={props.handleClose}
20− />
21−
22− <button
23− className={`h-10 mp-0 bg-white outline-blue sans ${props.className}`}
24− onClick={props.handleToggle}
25− disabled={props.disabled}>
26− <div className={'flex'}>
27− <div className={`ph-4 flex-center-all b-2 br-0 b-solid h-10 ${selectedClasses}`}>
28− <div className={'text-400 mr-2'}>{props.title}</div>
29− <div className={'text-600'}>{props.currentSelectionTitle}</div>
6+class InnerLabelDropdown extends React.Component {
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+
54+ const menuVisibility = state.isOpen === true
55+ ? 'visible'
56+ : 'hidden';
57+
58+ const selectedClasses = state.isOpen === true
59+ ? 'br-blue'
60+ : 'br-gray-50';
61+
62+ const fullWidthClass = props.fullWidth ? 'full-width' : ''
63+
64+ return (
65+ <div className={`rel table ${fullWidthClass}`}>
66+ <div
67+ className={`fix full o-0 ${menuVisibility}`}
68+ onClick={this.close}
69+ />
70+
71+ <button
72+ className={`h-10 mp-0 bg-white outline-blue sans ${props.className} ${fullWidthClass}`}
73+ onClick={this.toggle}
74+ disabled={props.disabled}>
75+ <div className={'flex'}>
76+ <div className={`ph-4 flex align-center b-2 br-0 b-solid h-10 ${selectedClasses} ${fullWidthClass}`}>
77+ <div className={'text-400 mr-2'}>{props.title}</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>
3081 </div>
31− <div className={'white bg-blue s-10 flex-center-all text-sm'}>{'▼'}</div>
32− </div>
33− </button>
82+ </button>
3483
35− <div className={`abs flex-column bg-white t-12 l-0 w-100 ${menuVisibility}`}>
36− <div className={'pv-1 b-solid b-gray-50 b-2 bb-0'} />
84+ <div className={`abs flex-column bg-white t-12 l-0 w-100 z-1 ${menuVisibility}`}>
85+ <div className={'pv-1 b-solid b-gray-50 b-2 bb-0'} />
3786
38− { props.children }
87+ { optionElems }
3988
40− <div className={'pv-1 b-solid b-gray-50 b-2 bt-0'} />
41− </div>
89+ <div className={'pv-1 b-solid b-gray-50 b-2 bt-0'} />
90+ </div>
4291
43− </div>
44− )
92+ </div>
93+ )
94+ }
4595}
4696
4797InnerLabelDropdown.propTypes = {
4898 disabled: PropTypes.bool,
49− isOpen: PropTypes.bool,
50− handleToggle: PropTypes.func,
51− handleClose: PropTypes.func,
5299 className: PropTypes.string,
53100 title: PropTypes.string,
54− children: PropTypes.node,
55101 style: PropTypes.object,
56102 currentSelectionTitle: PropTypes.string,
103+ children: PropTypes.node,
57104};
58105
59−
60106InnerLabelDropdown.defaultProps = {
61− isOpen: false,
107+ disabled: false,
62108 className: '',
63109 title: '',
64− currentSelectionTitle: '',
65− handleToggle: () => {},
66− handleClose: () => {},
67− disabled: false,
68110 style: {},
111+ currentSelectionTitle: '',
69112};
70113
71114export default InnerLabelDropdown
src/bridge/components/StatelessTransaction.js+92−19
@@ -3,7 +3,8 @@ import React from 'react'
33
44import { Code, H3 } from './Base'
55import { Button } from './Base'
6−import { CheckboxButton, Input, InnerLabel } from './Base'
6+import { CheckboxButton, Input, InnerLabel,
7+ InnerLabelDropdown } from './Base'
78import { Warning } from '../components/Base'
89
910import { addressFromSecp256k1Public } from '../lib/wallet'
@@ -27,11 +28,12 @@ class StatelessTransaction extends React.Component {
2728 gasLimit: '600000',
2829 showGasDetails: false,
2930 userApproval: false,
30− chainId: '',
31− nonce: '',
31+ chainId: '1',
32+ customChain: false,
33+ nonce: '0',
3234 stx: Nothing(),
3335 txn: Nothing(),
34− txError: Nothing(),
36+ txError: Nothing()
3537 }
3638
3739 this.createUnsignedTxn = this.createUnsignedTxn.bind(this)
@@ -46,6 +48,7 @@ class StatelessTransaction extends React.Component {
4648 this.setGasLimit = this.setGasLimit.bind(this)
4749 this.rangeChange = this.rangeChange.bind(this)
4850 this.toggleGasDetails = this.toggleGasDetails.bind(this)
51+ this.handleChainUpdate = this.handleChainUpdate.bind(this)
4952 }
5053
5154 componentDidMount() {
@@ -85,7 +88,7 @@ class StatelessTransaction extends React.Component {
8588
8689 submit(){
8790 const { props, state } = this
88− sendSignedTransaction(props.web3.value, state.stx)
91+ sendSignedTransaction(props.web3.value, state.stx, props.setTxnConfirmations)
8992 .then(sent => {
9093 props.setTxnHashCursor(sent)
9194 props.popRoute()
@@ -106,6 +109,21 @@ class StatelessTransaction extends React.Component {
106109 })
107110 }
108111
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+
109127 setUserApproval(){
110128 const {state} = this
111129 this.setState({ userApproval: !state.userApproval })
@@ -185,13 +203,53 @@ class StatelessTransaction extends React.Component {
185203 this.submit()
186204 }
187205
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+
188245 render() {
189246 const { web3, canGenerate } = this.props
190247 const { gasPrice, gasLimit, nonce, chainId,
191− txn, stx, userApproval, showGasDetails } = this.state
248+ txn, stx, userApproval, showGasDetails,
249+ customChain } = this.state
192250
193251 const { setNonce, setChainId, setGasLimit, setGasPrice, toggleGasDetails,
194− setUserApproval, sendTxn, createUnsignedTxn } = this
252+ setUserApproval, sendTxn, createUnsignedTxn, handleChainUpdate } = this
195253
196254 const { state } = this
197255
@@ -199,6 +257,8 @@ class StatelessTransaction extends React.Component {
199257 const canApprove = Just.hasInstance(stx)
200258 const canSend = Just.hasInstance(stx) && userApproval === true
201259
260+ const chainOptions = this.getChainOptions()
261+
202262 const generateButtonColor =
203263 Nothing.hasInstance(txn)
204264 ? 'blue'
@@ -294,7 +354,7 @@ class StatelessTransaction extends React.Component {
294354
295355 const nonceDialogue =
296356 <Input
297− className={ 'mono mt-4' }
357+ className={ 'mono mt-4 mb-4' }
298358 prop-size={ 'md' }
299359 prop-format={ 'innerLabel' }
300360 value={ nonce }
@@ -305,18 +365,30 @@ class StatelessTransaction extends React.Component {
305365 </InnerLabel>
306366 </Input>
307367
368+ const chainDialogueTitle = customChain ? "Custom" : this.getChainTitle(chainId)
308369 const chainDialogue =
309− <Input
310− className={ 'mono mt-4 mb-8' }
311− prop-size={ 'md' }
312− prop-format={ 'innerLabel' }
313− value={ chainId }
314− onChange={ setChainId }
370+ <InnerLabelDropdown
371+ className={'mt-6'}
372+ fullWidth={true}
373+ title={'Chain ID'}
374+ options={chainOptions}
375+ handleUpdate={handleChainUpdate}
376+ currentSelectionTitle={chainDialogueTitle}
315377 >
316− <InnerLabel>
317− { 'Chain ID' }
318− </InnerLabel>
319− </Input>
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+ >
388+ <InnerLabel>
389+ { 'Chain ID' }
390+ </InnerLabel>
391+ </Input>
320392
321393 const onlineParamsDialogue = web3.matchWith({
322394 Just: _ => <div />,
@@ -324,6 +396,7 @@ class StatelessTransaction extends React.Component {
324396 <React.Fragment>
325397 { nonceDialogue }
326398 { chainDialogue }
399+ { customChainDialogue }
327400 </React.Fragment>
328401 })
329402
@@ -358,7 +431,7 @@ class StatelessTransaction extends React.Component {
358431 onClick={ setUserApproval }
359432 state={ userApproval }
360433 >
361− <div>
434+ <div onClick={ setUserApproval }>
362435 { `I approve this transaction and wish to send.` }
363436 </div>
364437 </CheckboxButton>
src/bridge/lib/txn.js+6−6
@@ -3,6 +3,7 @@ import { Just } from 'folktale/maybe'
33import { Ok, Error } from 'folktale/result'
44import Tx from 'ethereumjs-tx'
55import Web3 from 'web3'
6+import { toWei, fromWei, toHex } from 'web3-utils'
67
78import { BRIDGE_ERROR } from '../lib/error'
89import { NETWORK_NAMES } from '../lib/network'
@@ -137,7 +138,7 @@ const signTransaction = async config => {
137138 setStx(Just(stx))
138139}
139140
140−const sendSignedTransaction = (web3, stx) => {
141+const sendSignedTransaction = (web3, stx, confirmationCb) => {
141142 const txn = stx.matchWith({
142143 Just: (tx) => tx.value,
143144 Nothing: () => {
@@ -155,6 +156,10 @@ const sendSignedTransaction = (web3, stx) => {
155156 .on('receipt', txn => {
156157 resolve(Just(Ok(txn.transactionHash)))
157158 })
159+ .on('confirmation', (confirmationNum, txn) => {
160+ confirmationCb(txn.transactionHash, confirmationNum + 1)
161+ resolve(Just(Ok(txn.transactionHash)))
162+ })
158163 .on('error', err => {
159164 reject(Just(Error(err.message)))
160165 })
@@ -203,11 +208,6 @@ const getTxnInfo = async (web3, addr) => {
203208 }
204209}
205210
206−const dummy = new Web3()
207−const toHex = dummy.utils.toHex
208−const toWei = dummy.utils.toWei
209−const fromWei = dummy.utils.fromWei
210−
211211const canDecodePatp = p => {
212212 try {
213213 ob.patp2dec(p)
src/bridge/lib/wallet.js+2−2
@@ -6,6 +6,7 @@ import Maybe from 'folktale/maybe'
66import * as secp256k1 from 'secp256k1'
77import * as ob from 'urbit-ob'
88import * as kg from '../../../node_modules/urbit-key-generation/dist/index'
9+import { isAddress } from 'web3-utils'
910
1011const DEFAULT_HD_PATH = "m/44'/60'/0'/0/0"
1112
@@ -71,8 +72,7 @@ const stripHexPrefix = hex =>
7172const keccak256 = str =>
7273 keccak('keccak256').update(str).digest()
7374
74−const isValidAddress = (address) =>
75− /^0x[0-9a-fA-F]{40}$/.test(address)
75+const isValidAddress = isAddress
7676
7777const toChecksumAddress = (address) => {
7878 const addr = stripHexPrefix(address).toLowerCase()
src/bridge/style/extend.css+8
@@ -477,3 +477,11 @@ code {
477477 padding: 1rem 2rem;
478478 margin-bottom: 4rem;
479479}
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 {
126126 walletHdPath={props.walletHdPath}
127127 networkType={props.networkType}
128128 setTxnHashCursor={props.setTxnHashCursor}
129+ setTxnConfirmations={props.setTxnConfirmations}
129130 popRoute={props.popRoute}
130131 pushRoute={props.pushRoute}
131132 // Other
src/bridge/views/CancelTransfer.js+1
@@ -87,6 +87,7 @@ class CancelTransfer extends React.Component {
8787 walletHdPath={props.walletHdPath}
8888 networkType={props.networkType}
8989 setTxnHashCursor={props.setTxnHashCursor}
90+ setTxnConfirmations={props.setTxnConfirmations}
9091 popRoute={props.popRoute}
9192 pushRoute={props.pushRoute}
9293 // Other
src/bridge/views/CreateGalaxy.js+1
@@ -212,6 +212,7 @@ class CreateGalaxy extends React.Component {
212212 walletHdPath={props.walletHdPath}
213213 networkType={props.networkType}
214214 setTxnHashCursor={props.setTxnHashCursor}
215+ setTxnConfirmations={props.setTxnConfirmations}
215216 popRoute={props.popRoute}
216217 pushRoute={props.pushRoute}
217218 // Other
src/bridge/views/IssueChild.js+1
@@ -303,6 +303,7 @@ class IssueChild extends React.Component {
303303 walletHdPath={props.walletHdPath}
304304 networkType={props.networkType}
305305 setTxnHashCursor={props.setTxnHashCursor}
306+ setTxnConfirmations={props.setTxnConfirmations}
306307 popRoute={props.popRoute}
307308 pushRoute={props.pushRoute}
308309 // Other
src/bridge/views/Network.js+47−99
@@ -1,11 +1,7 @@
11import Maybe from 'folktale/maybe'
22import React from 'react'
33import { Button } from '../components/Base'
4−import {
5− DropdownItem,
6− InnerLabelDropdown,
7− DropdownDivider,
8−} from '../components/Base'
4+import { InnerLabelDropdown } from '../components/Base'
95import { Row, Col, H1, P } from '../components/Base'
106import * as azimuth from 'azimuth-js'
117import Web3 from 'web3'
@@ -19,21 +15,9 @@ class Network extends React.Component {
1915 constructor(props) {
2016 super(props)
2117
22− this.state = {
23− dropdownOpen: false
24− };
25−
26− this.toggle = this.toggle.bind(this);
27− this.close = this.close.bind(this);
2818 this.handleNetworkChange = this.handleNetworkChange.bind(this);
2919 }
3020
31− toggle() {
32− this.setState((state, _) => ({
33− dropdownOpen: !state.dropdownOpen
34− }))
35− }
36−
3721 handleNetworkChange(network) {
3822 const { setNetworkType, setNetwork } = this.props
3923
@@ -86,7 +70,10 @@ class Network extends React.Component {
8670 // We may want to offer the ability to select a target network for
8771 // transactions when offline.
8872
89− const web3 = new Web3()
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")
76+ const web3 = new Web3(provider)
9077
9178 const target =
9279 process.env.NODE_ENV === 'development'
@@ -99,97 +86,58 @@ class Network extends React.Component {
9986 }
10087 }
10188
102− selectClose(f) {
103− f()
104− this.setState({ dropdownOpen: false })
105− }
106−
107−
108− close () {
109− this.setState({ dropdownOpen: false })
89+ getNetworkOptions() {
90+ return [{
91+ title: 'Main Network (default)',
92+ value: NETWORK_NAMES.MAINNET
93+ }, {
94+ title: 'Local Node',
95+ value: NETWORK_NAMES.LOCAL
96+ }, {
97+ title: 'Ropsten',
98+ value: NETWORK_NAMES.ROPSTEN
99+ }, {
100+ type: 'divider'
101+ }, {
102+ title: 'Offline',
103+ value: NETWORK_NAMES.OFFLINE
104+ }]
110105 }
111106
112107 render() {
113− const { dropdownOpen } = this.state
114108 const { networkType, pushRoute } = this.props
109+ const networkOptions = this.getNetworkOptions()
115110
116111 return (
117112 <Row>
118113 <Col>
119114 <H1>{ 'Select Network' }</H1>
120115
121−
122− <P>
123− {
124− "Please select the Ethereum node you'd like to send " +
125− "transactions to. For highly valuable keys, please select " +
126− "offline mode."
127− }
128− </P>
129−
130−
131− <InnerLabelDropdown
132− className={'mt-6'}
133− handleToggle={this.toggle}
134− handleClose={this.close}
135− isOpen={dropdownOpen}
136− title={'Node:'}
137− 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>
183−
184− <Button
185− className={'mt-10'}
186− onClick={ () => pushRoute(ROUTE_NAMES.WALLET) }
187− >
188− { 'Continue →' }
189− </Button>
190−
191− </Col>
192− </Row>
116+ <P>
117+ {
118+ "Please select the Ethereum node you'd like to send " +
119+ "transactions to. For highly valuable keys, please select " +
120+ "offline mode."
121+ }
122+ </P>
123+
124+ <InnerLabelDropdown
125+ className={'mt-6'}
126+ title={'Node:'}
127+ handleUpdate={this.handleNetworkChange}
128+ options={networkOptions}
129+ currentSelectionTitle={renderNetworkType(networkType)}>
130+ </InnerLabelDropdown>
131+
132+ <Button
133+ className={'mt-10'}
134+ onClick={ () => pushRoute(ROUTE_NAMES.WALLET) }
135+ >
136+ { 'Continue →' }
137+ </Button>
138+
139+ </Col>
140+ </Row>
193141 )
194142 }
195143}
src/bridge/views/Point/Actions.js+2−3
@@ -10,7 +10,6 @@ import { Row, Col, H2, P } from '../../components/Base'
1010import { Button } from '../../components/Base'
1111import { ROUTE_NAMES } from '../../lib/router'
1212
13−
1413const isPlanet = point =>
1514 parseInt(point, 10) > 65535
1615
@@ -137,7 +136,7 @@ const Actions = (props) => {
137136 <Button
138137 prop-size={'sm'}
139138 prop-type={'link'}
140− disabled={ !canAcceptTransfer }
139+ disabled={ online && !canAcceptTransfer }
141140 onClick={ () => {
142141 pushRoute(ROUTE_NAMES.ACCEPT_TRANSFER)
143142 }}
@@ -159,7 +158,7 @@ const Actions = (props) => {
159158 <Button
160159 prop-size={'sm'}
161160 prop-type={'link'}
162− disabled={ !canGenKeyfile }
161+ disabled={ online && !canGenKeyfile }
163162 onClick={ () => {
164163 pushRoute(ROUTE_NAMES.GEN_KEYFILE)
165164 }}
src/bridge/views/Points.js+5−1
@@ -4,6 +4,7 @@ import { Button } from '../components/Base'
44import * as azimuth from 'azimuth-js'
55
66import PointList from '../components/PointList'
7+import { NETWORK_NAMES } from '../lib/network'
78import { ROUTE_NAMES } from '../lib/router'
89import {
910 ETH_ZERO_ADDR,
@@ -21,6 +22,9 @@ class Points extends React.Component {
2122 constructor(props) {
2223 super(props)
2324
25+ const { networkType } = props
26+ const loading = networkType !== NETWORK_NAMES.OFFLINE
27+
2428 this.state = {
2529 points: [],
2630 incoming: [],
@@ -28,7 +32,7 @@ class Points extends React.Component {
2832 voting: [],
2933 spawning: [],
3034 eclipticOwner: false,
31− loading: true
35+ loading: loading
3236 }
3337 }
3438
src/bridge/views/SentTransaction.js+91−44
@@ -1,3 +1,4 @@
1+import Maybe from 'folktale/maybe'
12import React from 'react'
23import { Row, Col, H1, H3, P, Warning, Anchor } from '../components/Base'
34import { Button } from '../components/Base'
@@ -6,55 +7,100 @@ import { ROUTE_NAMES } from '../lib/router'
67import { BRIDGE_ERROR, renderTxnError } from '../lib/error'
78import { NETWORK_NAMES } from '../lib/network'
89
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>
3510
36− return (
37− <Row>
38− <Col>
39− <H1>{ 'Your Transaction was Sent' }</H1>
11+class Success extends React.Component {
12+
13+ constructor(props) {
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+ : ''
4056
41− <P>
42− {
43− `We sent your transaction to the chain. It can take some time to
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+
80+ <P>
81+ {
82+ `We sent your transaction to the chain. It can take some time to
4483 execute, especially if the network is busy. ${esmessage}`
45− }
46− </P>
84+ }
85+ </P>
4786
48− <H3>{ 'Transaction Hash' }</H3>
49− <P>
50− { props.hash }
51− </P>
87+ <H3>{ 'Transaction Hash' }</H3>
88+ <P>
89+ { hash }
90+ </P>
5291
53− { esanchor }
92+ <H3>{ 'Transaction Status' }</H3>
93+ <P>
94+ { status }
95+ </P>
96+ <P>
97+ { esanchor }
98+ </P>
5499
55− </Col>
56− </Row>
57− )
100+ </Col>
101+ </Row>
102+ )
103+ }
58104}
59105
60106const Failure = (props) =>
@@ -76,7 +122,7 @@ const Failure = (props) =>
76122 </Row>
77123
78124const SentTransaction = (props) => {
79− const { web3, txnHashCursor, networkType, popRoute, pushRoute } = props
125+ const { web3, txnHashCursor, networkType, popRoute, pushRoute, txnConfirmations} = props
80126 const { setPointCursor, pointCursor } = props
81127
82128 const promptKeyfile = props.routeData && props.routeData.promptKeyfile
@@ -97,6 +143,7 @@ const SentTransaction = (props) => {
97143 <Success
98144 hash={ hash.value }
99145 networkType={ networkType }
146+ txnConfirmations={ txnConfirmations }
100147 />
101148 })
102149
src/bridge/views/SetKeys.js+1
@@ -194,6 +194,7 @@ class SetKeys extends React.Component {
194194 walletHdPath={props.walletHdPath}
195195 networkType={props.networkType}
196196 setTxnHashCursor={props.setTxnHashCursor}
197+ setTxnConfirmations={props.setTxnConfirmations}
197198 popRoute={props.popRoute}
198199 pushRoute={props.pushRoute}
199200 // Tx
src/bridge/views/SetProxy.js+1
@@ -162,6 +162,7 @@ class SetProxy extends React.Component {
162162 walletHdPath={props.walletHdPath}
163163 networkType={props.networkType}
164164 setTxnHashCursor={props.setTxnHashCursor}
165+ setTxnConfirmations={props.setTxnConfirmations}
165166 popRoute={props.popRoute}
166167 pushRoute={props.pushRoute}
167168 // Other
src/bridge/views/Transfer.js+1
@@ -132,6 +132,7 @@ class Transfer extends React.Component {
132132 walletHdPath={props.walletHdPath}
133133 networkType={props.networkType}
134134 setTxnHashCursor={props.setTxnHashCursor}
135+ setTxnConfirmations={props.setTxnConfirmations}
135136 popRoute={props.popRoute}
136137 pushRoute={props.pushRoute}
137138 // Checks
src/bridge/views/Wallet.js+32−84
@@ -1,52 +1,50 @@
11import Maybe from 'folktale/maybe'
22import React from 'react'
33import { Button, H1, P } from '../components/Base'
4−import {
5− InnerLabelDropdown,
6− DropdownItem,
7− DropdownDivider
8−} from '../components/Base'
4+import { InnerLabelDropdown } from '../components/Base'
95import { Row, Col } from '../components/Base'
106
117import { ROUTE_NAMES } from '../lib/router'
128import { WALLET_NAMES, renderWalletType } from '../lib/wallet'
139
1410class 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−
2811 componentDidMount() {
2912 const { setWallet } = this.props
3013 setWallet(Maybe.Nothing())
3114 }
3215
33− toggle() {
34− this.setState((state, _) => ({
35− dropdownOpen: !state.dropdownOpen
36− }))
37− }
38−
39− selectClose(f) {
40− f()
41− this.setState({ dropdownOpen: false })
42− }
43−
44− close () {
45− this.setState({ dropdownOpen: false })
16+ getWalletOptions() {
17+ return [{
18+ title: 'Urbit Master Ticket',
19+ value: WALLET_NAMES.TICKET
20+ }, {
21+ title: 'Urbit Master Ticket (Shards)',
22+ value: WALLET_NAMES.SHARDS
23+ }, {
24+ type: 'divider'
25+ }, {
26+ title: 'Ledger',
27+ value: WALLET_NAMES.LEDGER
28+ }, {
29+ title: 'Trezor',
30+ value: WALLET_NAMES.TREZOR
31+ }, {
32+ type: 'divider'
33+ }, {
34+ title: 'BIP39 Mnemonic',
35+ value: WALLET_NAMES.MNEMONIC
36+ }, {
37+ title: 'Ethereum Private Key',
38+ value: WALLET_NAMES.PRIVATE_KEY
39+ }, {
40+ title: 'Ethereum Keystore File',
41+ value: WALLET_NAMES.KEYSTORE
42+ }]
4643 }
4744
4845 render() {
49− const { props, state } = this
46+ const { props } = this
47+ const walletOptions = this.getWalletOptions()
5048
5149 return (
5250 <Row>
@@ -63,60 +61,10 @@ class Wallet extends React.Component {
6361
6462 <InnerLabelDropdown
6563 className={'mb-10 mt-6'}
66− handleToggle={this.toggle}
67− handleClose={this.close}
68− isOpen={state.dropdownOpen}
6964 title={'Wallet Type:'}
65+ options={walletOptions}
66+ handleUpdate={props.setWalletType}
7067 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−
12068 </InnerLabelDropdown>
12169
12270 <Button