From be3340d00e0a91fc1de2d948c30bc95308c73a9f Mon Sep 17 00:00:00 2001 From: Fabian Vogelsteller Date: Wed, 12 Jul 2017 12:34:53 +0200 Subject: [PATCH 001/150] fixes batch requests on isolated preloaders --- modules/preloader/browser.js | 59 +++- .../preloader/injected/EthereumProvider.js | 2 +- package.json | 1 + yarn.lock | 326 ++++++++++-------- 4 files changed, 219 insertions(+), 169 deletions(-) diff --git a/modules/preloader/browser.js b/modules/preloader/browser.js index 9974e5ca9..39f02cb36 100644 --- a/modules/preloader/browser.js +++ b/modules/preloader/browser.js @@ -1,6 +1,7 @@ /** @module preloader browser */ +const _ = require('underscore'); require('./include/common')('browser'); const { ipcRenderer, webFrame, remote } = require('electron'); const mist = require('./include/mistAPI.js'); @@ -19,9 +20,29 @@ Object.defineProperty(navigator, 'language', { // notifiy the tab to store the webview id ipcRenderer.sendToHost('setWebviewId'); +const isValidJsonRpc = function (message) { + return !!(Object.prototype.hasOwnProperty.call(message, 'method') || + Object.prototype.hasOwnProperty.call(message, 'id') || + Object.prototype.hasOwnProperty.call(message, 'params') || + Object.prototype.hasOwnProperty.call(message, 'jsonrpc')); +}; + +const sanatizeJsonRpc = function (message) { + // sanitize + return { + jsonrpc: message.jsonrpc, + id: message.id, + method: message.method, + params: message.params + }; +}; + // Wait for post messages window.addEventListener('message', function message(event) { - var data; + + + + let data; try { data = JSON.parse(event.data); } catch(e){ @@ -29,31 +50,39 @@ window.addEventListener('message', function message(event) { } + if (typeof data !== 'object') { return; } + // EthereumProvider: connect if (data.type === 'create') { ipcRenderer.send('ipcProvider-create'); // EthereumProvider: write } else if (data.type === 'write') { + let messageIsArray = _.isArray(data.message); + // only accept valid JSON rpc requests - if(!Object.prototype.hasOwnProperty.call(data.message, 'method') || - !Object.prototype.hasOwnProperty.call(data.message, 'id') || - !Object.prototype.hasOwnProperty.call(data.message, 'params') || - !Object.prototype.hasOwnProperty.call(data.message, 'jsonrpc')) { - return; + if (messageIsArray) { + for (let i = 0; i < data.message.length; i++) { + if (isValidJsonRpc(data.message[i])) { + data.message[i] = sanatizeJsonRpc(data.message[i]); + } else { + return; + } + } + } else { + if (isValidJsonRpc(data.message)) { + data.message = sanatizeJsonRpc(data.message); + } else { + return; + } } // make sure we only send allowed properties - ipcRenderer.send('ipcProvider-write', JSON.stringify({ - jsonrpc: data.message.jsonrpc, - id: data.message.id, - method: data.message.method, - params: data.message.params - })); + ipcRenderer.send('ipcProvider-write', JSON.stringify(data.message)); // mistAPI } else if (/^mistAPI_[a-z]/i.test(data.type)) { @@ -64,12 +93,10 @@ window.addEventListener('message', function message(event) { ipcRenderer.sendToHost(data.type, data.message); } } - - }); -var postMessage = function(payload) { - if(typeof payload === 'object') { +const postMessage = function (payload) { + if (typeof payload === 'object') { payload = JSON.stringify(payload); } diff --git a/modules/preloader/injected/EthereumProvider.js b/modules/preloader/injected/EthereumProvider.js index 826ed66be..a1f87f101 100644 --- a/modules/preloader/injected/EthereumProvider.js +++ b/modules/preloader/injected/EthereumProvider.js @@ -36,7 +36,7 @@ } - if(typeof data !== 'object' || (data.message && !Object.prototype.hasOwnProperty.call(data.message, 'jsonrpc'))) { + if(typeof data !== 'object' || (data.message && (!Object.prototype.hasOwnProperty.call(data.message, 'jsonrpc') && !Object.prototype.hasOwnProperty.call(data.message[0], 'jsonrpc')))) { return; } diff --git a/package.json b/package.json index ff2c72228..b04b6cda7 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "ethereum-client-binaries": "^1.6.1", "ethereum-keyfile-recognizer": "^1.0.2", "ethereumjs-abi": "^0.6.3", + "global": "^4.3.2", "got": "^6.7.1", "i18next": "^7.1.3", "lodash": "^4.17.4", diff --git a/yarn.lock b/yarn.lock index a08d3db0a..f0bbde03e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,5 +1,7 @@ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # yarn lockfile v1 + + "7zip-bin-linux@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/7zip-bin-linux/-/7zip-bin-linux-1.1.0.tgz#2ca309fd6a2102e18bd81e3a5d91b39db9adab71" @@ -187,32 +189,32 @@ asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + assert-plus@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" -assert-plus@^1.0.0, assert-plus@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - assertion-error@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" -async@^0.9.0: - version "0.9.2" - resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" - -async@^1.4.0, async@1.x: +async@1.x, async@^1.4.0: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" -async@^2.0.0, async@>=0.1.0: +async@>=0.1.0, async@^2.0.0: version "2.5.0" resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" dependencies: lodash "^4.14.0" +async@^0.9.0: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -565,7 +567,7 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" -commander@^2.9.0, commander@2.9.0: +commander@2.9.0, commander@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" dependencies: @@ -588,7 +590,7 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -concat-stream@^1.5.2, concat-stream@1.6.0: +concat-stream@1.6.0, concat-stream@^1.5.2: version "1.6.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" dependencies: @@ -626,10 +628,6 @@ core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" -crc@^3.4.4: - version "3.4.4" - resolved "https://registry.yarnpkg.com/crc/-/crc-3.4.4.tgz#9da1e980e3bd44fc5c93bf5ab3da3378d85e466b" - crc32-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-2.0.0.tgz#e3cdd3b4df3168dd74e3de3fbbcb7b297fe908f4" @@ -637,6 +635,10 @@ crc32-stream@^2.0.0: crc "^3.4.4" readable-stream "^2.0.0" +crc@^3.4.4: + version "3.4.4" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.4.4.tgz#9da1e980e3bd44fc5c93bf5ab3da3378d85e466b" + create-error-class@^3.0.0, create-error-class@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" @@ -729,16 +731,6 @@ dateformat@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17" -debug@^0.7.2: - version "0.7.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" - -debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.6.0, debug@^2.6.8: - version "2.6.8" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" - dependencies: - ms "2.0.0" - debug@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" @@ -751,6 +743,16 @@ debug@2.6.0: dependencies: ms "0.7.2" +debug@^0.7.2: + version "0.7.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" + +debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.6.0, debug@^2.6.8: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + dependencies: + ms "2.0.0" + decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -821,20 +823,24 @@ diff@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" -doctrine@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" dependencies: esutils "^2.0.2" isarray "^1.0.0" -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" +doctrine@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" dependencies: esutils "^2.0.2" isarray "^1.0.0" +dom-walk@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" + dot-prop@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" @@ -849,18 +855,18 @@ drbg.js@^1.0.1: create-hash "^1.1.2" create-hmac "^1.1.4" -duplexer2@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - dependencies: - readable-stream "^2.0.2" - duplexer2@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" dependencies: readable-stream "~1.1.9" +duplexer2@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + dependencies: + readable-stream "^2.0.2" + duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -888,7 +894,7 @@ electron-builder-core@11.2.1: version "11.2.1" resolved "https://registry.yarnpkg.com/electron-builder-core/-/electron-builder-core-11.2.1.tgz#1dca8c1a1cee8b51750b7708a04913aeffacf8a8" -electron-builder-http@~12.3.0, electron-builder-http@12.3.0: +electron-builder-http@12.3.0, electron-builder-http@~12.3.0: version "12.3.0" resolved "https://registry.yarnpkg.com/electron-builder-http/-/electron-builder-http-12.3.0.tgz#5a75e3683e4c1a8ef093f353d3298342c875d2c0" dependencies: @@ -1040,7 +1046,7 @@ es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14: es6-iterator "2" es6-symbol "~3.1" -es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@2: +es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512" dependencies: @@ -1073,7 +1079,7 @@ es6-set@~0.1.5: es6-symbol "3.1.1" event-emitter "~0.3.5" -es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1, es6-symbol@3.1.1: +es6-symbol@3.1.1, es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" dependencies: @@ -1089,7 +1095,7 @@ es6-weak-map@^2.0.1: es6-iterator "^2.0.1" es6-symbol "^3.1.1" -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5, escape-string-regexp@1.0.5: +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -1193,7 +1199,7 @@ espree@^3.4.0: acorn "^5.0.1" acorn-jsx "^3.0.0" -esprima@^2.7.1, esprima@2.7.x: +esprima@2.7.x, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" @@ -1632,6 +1638,23 @@ glob-watcher@^0.0.6: dependencies: gaze "^0.5.1" +glob2base@^0.0.12: + version "0.0.12" + resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" + dependencies: + find-index "^0.1.1" + +glob@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@^4.3.1: version "4.5.3" resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" @@ -1670,23 +1693,6 @@ glob@~3.1.21: inherits "1" minimatch "~0.2.11" -glob@7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.2" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob2base@^0.0.12: - version "0.0.12" - resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" - dependencies: - find-index "^0.1.1" - global-modules@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" @@ -1703,6 +1709,13 @@ global-prefix@^0.1.4: is-windows "^0.2.0" which "^1.2.12" +global@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" + dependencies: + min-document "^2.19.0" + process "~0.5.1" + globals@^9.14.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -1993,14 +2006,14 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3, inherits@2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - inherits@1: version "1.0.2" resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + ini@^1.3.4, ini@~1.3.0: version "1.3.4" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" @@ -2229,14 +2242,14 @@ is-windows@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" -isarray@^1.0.0, isarray@~1.0.0, isarray@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + isbinaryfile@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" @@ -2286,7 +2299,7 @@ js-tokens@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" -js-yaml@^3.5.1, js-yaml@^3.7.0, js-yaml@3.x: +js-yaml@3.x, js-yaml@^3.5.1, js-yaml@^3.7.0: version "3.8.4" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.4.tgz#520b4564f86573ba96662af85a8cafa7b4b5a6f6" dependencies: @@ -2315,7 +2328,7 @@ json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" -json-structure-diff@^0.0.2, json-structure-diff@0.0.2: +json-structure-diff@0.0.2, json-structure-diff@^0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/json-structure-diff/-/json-structure-diff-0.0.2.tgz#838277f5c0a9562981b9a2af86fe5e90c131b0b3" @@ -2617,6 +2630,10 @@ lowercase-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" +lru-cache@2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + lru-cache@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" @@ -2624,10 +2641,6 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" -lru-cache@2: - version "2.7.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" - macaddress@^0.2.7: version "0.2.8" resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" @@ -2708,6 +2721,12 @@ mimic-fn@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + dependencies: + dom-walk "^0.1.0" + minimalistic-assert@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" @@ -2716,18 +2735,18 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" +"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + minimatch@^2.0.1: version "2.0.10" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" dependencies: brace-expansion "^1.0.0" -minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2, "minimatch@2 || 3": - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - dependencies: - brace-expansion "^1.1.7" - minimatch@~0.2.11: version "0.2.14" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" @@ -2735,6 +2754,10 @@ minimatch@~0.2.11: lru-cache "2" sigmund "~1.0.0" +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -2743,10 +2766,6 @@ minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - minimongo-standalone@^1.1.0-3: version "1.1.0-3" resolved "https://registry.yarnpkg.com/minimongo-standalone/-/minimongo-standalone-1.1.0-3.tgz#cfdb3d0136811bab7fb92f6c13e0c74bd64dd5bd" @@ -2754,7 +2773,7 @@ minimongo-standalone@^1.1.0-3: async ">=0.1.0" underscore ">=1.0.0" -mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1, mkdirp@0.5, mkdirp@0.5.1, mkdirp@0.5.x: +mkdirp@0.5, mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: @@ -2947,7 +2966,7 @@ oboe@^2.1.3: dependencies: http-https "^1.0.0" -once@^1.3.0, once@^1.3.1, once@^1.4.0, once@1.x: +once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: @@ -3212,6 +3231,10 @@ process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" +process@~0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" + progress-stream@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/progress-stream/-/progress-stream-1.2.0.tgz#2cd3cfea33ba3a89c9c121ec3347abe9ab125f77" @@ -3250,14 +3273,14 @@ pump@^1.0.0, pump@^1.0.1: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + q@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" @@ -3323,6 +3346,15 @@ read-pkg@^2.0.0: normalize-package-data "^2.3.2" path-type "^2.0.0" +"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.0, readable-stream@~1.0.31: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + readable-stream@^1.1.7, readable-stream@~1.1.9: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" @@ -3344,15 +3376,6 @@ readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable string_decoder "~1.0.3" util-deprecate "~1.0.1" -"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.0, readable-stream@~1.0.31: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - readline2@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" @@ -3485,16 +3508,16 @@ resolve-url@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" +resolve@1.1.x: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + resolve@^1.1.6, resolve@^1.1.7, resolve@^1.2.0: version "1.3.3" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" dependencies: path-parse "^1.0.5" -resolve@1.1.x: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - restore-cursor@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" @@ -3519,7 +3542,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@^2.2.8, rimraf@2: +rimraf@2, rimraf@^2.2.8: version "2.6.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" dependencies: @@ -3605,14 +3628,14 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + semver@^4.1.0: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" -semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, "semver@2 || 3 || 4 || 5": - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - sequencify@~0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" @@ -3819,16 +3842,6 @@ streamroller@^0.4.0: mkdirp "^0.5.1" readable-stream "^1.1.7" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - -string_decoder@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" - dependencies: - safe-buffer "~5.1.0" - string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -3848,6 +3861,16 @@ string.prototype.codepointat@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/string.prototype.codepointat/-/string.prototype.codepointat-0.2.0.tgz#6b26e9bd3afcaa7be3b4269b526de1b82000ac78" +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + stringstream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -3904,6 +3927,12 @@ sumchecker@^2.0.1: dependencies: debug "^2.2.0" +supports-color@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" + dependencies: + has-flag "^1.0.0" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -3914,12 +3943,6 @@ supports-color@^3.1.0, supports-color@~3.2.3: dependencies: has-flag "^1.0.0" -supports-color@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" - dependencies: - has-flag "^1.0.0" - table@^3.7.8: version "3.8.3" resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" @@ -3957,10 +3980,6 @@ throttleit@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf" -through@^2.3.6, through@~2.3.4, through@2: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - through2@^0.6.1: version "0.6.5" resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" @@ -3982,6 +4001,10 @@ through2@~0.2.3: readable-stream "~1.1.9" xtend "~2.1.1" +through@2, through@^2.3.6, through@~2.3.4: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + tildify@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" @@ -4000,12 +4023,6 @@ timed-out@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" -tmp@^0.0.31: - version "0.0.31" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" - dependencies: - os-tmpdir "~1.0.1" - tmp@0.0.28: version "0.0.28" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" @@ -4018,6 +4035,12 @@ tmp@0.0.29: dependencies: os-tmpdir "~1.0.1" +tmp@^0.0.31: + version "0.0.31" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" + dependencies: + os-tmpdir "~1.0.1" + tough-cookie@~2.3.0: version "2.3.2" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" @@ -4062,14 +4085,14 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" - type-detect@0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" +type-detect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -4099,7 +4122,7 @@ underscore-deep-extend@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/underscore-deep-extend/-/underscore-deep-extend-1.1.5.tgz#962ba1f8b3bb2e2afd182ed86f2e5275543c52bd" -underscore@^1.8.3, underscore@>=1.0.0: +underscore@>=1.0.0, underscore@^1.8.3: version "1.8.3" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" @@ -4311,13 +4334,17 @@ widest-line@^1.0.0: dependencies: string-width "^1.0.1" +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + window-size@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" wordwrap@^1.0.0, wordwrap@~1.0.0: version "1.0.0" @@ -4327,10 +4354,6 @@ wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -4373,16 +4396,16 @@ xml2js@^0.4.17: sax ">=0.6.0" xmlbuilder "^4.1.0" +xmlbuilder@8.2.2: + version "8.2.2" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773" + xmlbuilder@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-4.2.1.tgz#aa58a3041a066f90eaa16c2f5389ff19f3f461a5" dependencies: lodash "^4.0.0" -xmlbuilder@8.2.2: - version "8.2.2" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773" - xmldom@0.1.x: version "0.1.27" resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" @@ -4391,7 +4414,7 @@ xmlhttprequest@*: version "1.8.0" resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" -xtend@^4.0.0, "xtend@>=4.0.0 <4.1.0-0", xtend@~4.0.1, xtend@4.0.1: +xtend@4.0.1, "xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" @@ -4506,4 +4529,3 @@ zip-stream@^1.1.0: compress-commons "^1.2.0" lodash "^4.8.0" readable-stream "^2.0.0" - From 1ef44a7c312e11e604805c362238ac6feb5790df Mon Sep 17 00:00:00 2001 From: Fabian Vogelsteller Date: Sun, 16 Jul 2017 12:20:08 +0200 Subject: [PATCH 002/150] trigger travis --- modules/preloader/walletMain.js | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/preloader/walletMain.js b/modules/preloader/walletMain.js index a1b571c27..51e2affe0 100644 --- a/modules/preloader/walletMain.js +++ b/modules/preloader/walletMain.js @@ -13,6 +13,7 @@ const web3Admin = require('../web3Admin.js'); webFrame.executeJavaScript("window.mistMode = 'wallet';"); + // add admin later setTimeout(() => { web3Admin.extend(window.web3); From 280cdd993289e498b859902f32a1b81e52d30757 Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Fri, 15 Sep 2017 10:33:42 -0600 Subject: [PATCH 003/150] Introduces Redux store --- main.js | 27 ++- modules/core/rootReducer.js | 6 + modules/core/store.js | 16 ++ modules/core/ui/actions.js | 7 + modules/core/ui/reducer.js | 32 +++ package.json | 6 +- yarn.lock | 374 ++++++++++++++++++++++++------------ 7 files changed, 339 insertions(+), 129 deletions(-) create mode 100644 modules/core/rootReducer.js create mode 100644 modules/core/store.js create mode 100644 modules/core/ui/actions.js create mode 100644 modules/core/ui/reducer.js diff --git a/main.js b/main.js index 095c952c0..2ada9cc58 100644 --- a/main.js +++ b/main.js @@ -12,6 +12,11 @@ const Settings = require('./modules/settings'); const Q = require('bluebird'); const windowStateKeeper = require('electron-window-state'); + +import configureReduxStore from './modules/core/store'; +import { createSplashWindow, quitApp } from './modules/core/ui/actions'; + + Q.config({ cancellation: true, }); @@ -96,13 +101,13 @@ if (Settings.uiMode === 'wallet') { // prevent crashed and close gracefully process.on('uncaughtException', (error) => { log.error('UNCAUGHT EXCEPTION', error); - app.quit(); + store.dispatch(quitApp()); }); // Quit when all windows are closed. app.on('window-all-closed', () => { - app.quit(); + store.dispatch(quitApp()); }); // Listen to custom protocole incoming messages, needs registering of URL schemes @@ -132,7 +137,7 @@ app.on('before-quit', (event) => { killedSocketsAndNodes = true; await db.close(); - app.quit(); + store.dispatch(quitApp()); }, 500); } else { log.info('About to quit...'); @@ -147,7 +152,9 @@ let startMainWindow; // This method will be called when Electron has done everything // initialization and ready for creating browser windows. -app.on('ready', () => { +app.on('ready', async () => { + global.store = await configureReduxStore(); + // if using HTTP RPC then inform user if (Settings.rpcMode === 'http') { dialog.showErrorBox('Insecure RPC connection', ` @@ -162,7 +169,7 @@ Only do this if you have secured your HTTP connection or you know what you are d // initialise the db global.db.init().then(onReady).catch((err) => { log.error(err); - app.quit(); + store.dispatch(quitApp()); }); }); @@ -252,6 +259,10 @@ onReady = () => { defaultWindow.manage(mainWindow.window); if (!Settings.inAutoTestMode) { + + // TODO: SPLASH_WINDOW::CREATE + store.dispatch(createSplashWindow(Settings.uiMode)); + splashWindow = Windows.create('splash', { primary: true, url: `${global.interfacePopupsUrl}#splashScreen_${Settings.uiMode}`, @@ -365,7 +376,7 @@ onReady = () => { detail: global.i18n.t('mist.errors.legacyChain.description') }, () => { shell.openExternal('https://github.com/ethereum/mist/releases'); - app.quit(); + store.dispatch(quitApp()); }); throw new Error('Cant start client due to legacy non-Fork setting.'); @@ -413,7 +424,7 @@ onReady = () => { }); onboardingWindow.on('closed', () => { - app.quit(); + store.dispatch(quitApp()); }); // change network types (mainnet, testnet) @@ -502,7 +513,7 @@ startMainWindow = () => { // close app, when the main window is closed mainWindow.on('closed', () => { - app.quit(); + store.dispatch(quitApp()); }); // observe Tabs for changes and refresh menu diff --git a/modules/core/rootReducer.js b/modules/core/rootReducer.js new file mode 100644 index 000000000..19d89e757 --- /dev/null +++ b/modules/core/rootReducer.js @@ -0,0 +1,6 @@ +import { combineReducers } from 'redux'; +import ui from './ui/reducer'; + +export default combineReducers({ + ui, +}); diff --git a/modules/core/store.js b/modules/core/store.js new file mode 100644 index 000000000..1ddc5e469 --- /dev/null +++ b/modules/core/store.js @@ -0,0 +1,16 @@ +import { createStore } from 'redux'; +import { app } from 'electron'; +import devToolsEnhancer from 'remote-redux-devtools'; +import rootReducer from './rootReducer'; + +export default async function configureReduxStore() { + const store = createStore(rootReducer, devToolsEnhancer()); + + store.subscribe(() => { + const state = store.getState(); + + if (state.ui.appQuit) return app.quit(); + }); + + return store; +} diff --git a/modules/core/ui/actions.js b/modules/core/ui/actions.js new file mode 100644 index 000000000..b128d0c01 --- /dev/null +++ b/modules/core/ui/actions.js @@ -0,0 +1,7 @@ +export function createSplashWindow(uiMode) { + return { type: 'SPLASH_WINDOW::CREATE', payload: { uiMode } }; +} + +export function quitApp() { + return { type: 'APP::QUIT' }; +} diff --git a/modules/core/ui/reducer.js b/modules/core/ui/reducer.js new file mode 100644 index 000000000..821defd98 --- /dev/null +++ b/modules/core/ui/reducer.js @@ -0,0 +1,32 @@ +const initialState = { + appQuit: false, + splashWindowCreated: false, + splashWindowVisible: false, + uiMode: '', +}; + +const ui = (state = initialState, action) => { + switch (action.type) { + case 'SPLASH_WINDOW::CREATE': + return Object.assign({}, state, { + created: true, + uiMode: action.payload.uiMode + }); + case 'SPLASH_WINDOW::SHOW': + return Object.assign({}, state, { + splashWindowVisible: true + }); + case 'SPLASH_WINDOW::HIDE': + return Object.assign({}, state, { + splashWindowVisible: true + }); + case 'APP::QUIT': + return Object.assign({}, state, { + appQuit: true + }); + default: + return state; + } +} + +export default ui; diff --git a/package.json b/package.json index 93406aa0c..987b75e3a 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "scripts": { "postinstall": "cd interface && yarn", "dev:electron": "electron -r babel-register main.js", - "dev:meteor": "cd interface && meteor --no-release-check" + "dev:meteor": "cd interface && meteor --no-release-check", + "dev:tools": "open http://remotedev.io/local/" }, "main": "main.js", "dependencies": { @@ -33,6 +34,7 @@ "numeral": "^2.0.6", "oboe": "^2.1.3", "os-timesync": "^1.0.7", + "redux": "^3.7.2", "semver": "^5.1.0", "solc": "^0.4.15", "swarm-js": "^0.1.21", @@ -65,6 +67,8 @@ "json-structure-diff": "^0.0.2", "minimist": "^1.2.0", "mocha": "^3.2.0", + "redux-devtools-extension": "^2.13.2", + "remote-redux-devtools": "^0.5.12", "require-dir": "^0.3.2", "run-sequence": "^1.2.1", "semver-compare": "^1.0.0", diff --git a/yarn.lock b/yarn.lock index 8c49e7ce9..6523c2b40 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,17 +10,17 @@ version "1.0.1" resolved "https://registry.yarnpkg.com/7zip-bin-mac/-/7zip-bin-mac-1.0.1.tgz#3e68778bbf0926adc68159427074505d47555c02" -"7zip-bin-win@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/7zip-bin-win/-/7zip-bin-win-2.1.0.tgz#ce632da797ec282c5d2a8d07b60e8df7ca7f164d" +"7zip-bin-win@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/7zip-bin-win/-/7zip-bin-win-2.1.1.tgz#8acfc28bb34e53a9476b46ae85a97418e6035c20" "7zip-bin@^2.0.4": - version "2.2.3" - resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-2.2.3.tgz#a249cad6c22f8289495741f5d9ea22368af1e078" + version "2.2.4" + resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-2.2.4.tgz#5d0a7da759258b7fa59121fddcec7cb65938a85c" optionalDependencies: "7zip-bin-linux" "^1.1.0" "7zip-bin-mac" "^1.0.1" - "7zip-bin-win" "^2.1.0" + "7zip-bin-win" "^2.1.1" "@types/node@^7.0.18": version "7.0.43" @@ -59,8 +59,8 @@ ajv@^4.7.0, ajv@^4.9.1: json-stable-stringify "^1.0.1" ajv@^5.1.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.2.tgz#47c68d69e86f5d953103b0074a9430dc63da5e39" + version "5.2.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.3.tgz#c06f598778c44c6b161abafe3466b81ad1814ed2" dependencies: co "^4.6.0" fast-deep-equal "^1.0.0" @@ -104,8 +104,8 @@ any-promise@^1.0.0, any-promise@^1.3.0: resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" aproba@^1.0.3: - version "1.1.2" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" archiver-utils@^1.3.0: version "1.3.0" @@ -223,6 +223,10 @@ assertion-error@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + async@>=0.1.0, async@^2.0.0: version "2.5.0" resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" @@ -514,6 +518,10 @@ balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" +base-64@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" + base64-js@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978" @@ -537,8 +545,8 @@ beeper@^1.0.0: resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" bignumber.js@^4.0.1: - version "4.0.4" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-4.0.4.tgz#7c40f5abcd2d6623ab7b99682ee7db81b11889a4" + version "4.1.0" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-4.1.0.tgz#db6f14067c140bd46624815a7916c92d9b6c24b1" "bignumber.js@git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2": version "2.0.7" @@ -592,12 +600,12 @@ bn.js@^4.10.0, bn.js@^4.11.3, bn.js@^4.11.6, bn.js@^4.4.0, bn.js@^4.8.0: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" body-parser@^1.16.0: - version "1.18.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.1.tgz#9c1629370bcfd42917f30641a2dcbe2ec50d4c26" + version "1.18.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" dependencies: bytes "3.0.0" content-type "~1.0.4" - debug "2.6.8" + debug "2.6.9" depd "~1.1.1" http-errors "~1.6.2" iconv-lite "0.4.19" @@ -859,6 +867,10 @@ clone-stats@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" +clone@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" + clone@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" @@ -922,6 +934,10 @@ compare-version@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" +component-emitter@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.0.tgz#ccd113a86388d06482d03de3fc7df98526ba8efe" + compress-commons@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.2.0.tgz#58587092ef20d37cb58baf000112c9278ff73b9f" @@ -1008,8 +1024,8 @@ crc32-stream@^2.0.0: readable-stream "^2.0.0" crc@^3.4.4: - version "3.4.4" - resolved "https://registry.yarnpkg.com/crc/-/crc-3.4.4.tgz#9da1e980e3bd44fc5c93bf5ab3da3378d85e466b" + version "3.5.0" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.5.0.tgz#98b8ba7d489665ba3979f59b21381374101a1964" create-error-class@^3.0.0, create-error-class@^3.0.1: version "3.0.2" @@ -1106,8 +1122,8 @@ date-format@^0.0.0: resolved "https://registry.yarnpkg.com/date-format/-/date-format-0.0.0.tgz#09206863ab070eb459acea5542cbd856b11966b3" dateformat@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17" + version "2.2.0" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" debug@2.2.0: version "2.2.0" @@ -1121,12 +1137,18 @@ debug@2.6.0: dependencies: ms "0.7.2" -debug@2.6.8, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.6.0, debug@^2.6.8: +debug@2.6.8: version "2.6.8" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" dependencies: ms "2.0.0" +debug@2.6.9, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.6.0, debug@^2.6.8: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + debug@^0.7.2: version "0.7.4" resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" @@ -1673,8 +1695,8 @@ eslint@^3.14.1: user-home "^2.0.0" espree@^3.4.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.0.tgz#98358625bdd055861ea27e2867ea729faf463d8d" + version "3.5.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.1.tgz#0c988b8ab46db53100a1954ae4ba995ddd27d87e" dependencies: acorn "^5.1.1" acorn-jsx "^3.0.0" @@ -1704,7 +1726,7 @@ esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" -etag@~1.8.0: +etag@~1.8.0, etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" @@ -1804,8 +1826,8 @@ expand-tilde@^2.0.2: homedir-polyfill "^1.0.1" express@^4.14.0, express@^4.15.3: - version "4.15.4" - resolved "https://registry.yarnpkg.com/express/-/express-4.15.4.tgz#032e2253489cf8fce02666beca3d11ed7a2daed1" + version "4.15.5" + resolved "https://registry.yarnpkg.com/express/-/express-4.15.5.tgz#670235ca9598890a5ae8170b83db722b842ed927" dependencies: accepts "~1.3.3" array-flatten "1.1.1" @@ -1813,13 +1835,13 @@ express@^4.14.0, express@^4.15.3: content-type "~1.0.2" cookie "0.3.1" cookie-signature "1.0.6" - debug "2.6.8" + debug "2.6.9" depd "~1.1.1" encodeurl "~1.0.1" escape-html "~1.0.3" etag "~1.8.0" - finalhandler "~1.0.4" - fresh "0.5.0" + finalhandler "~1.0.6" + fresh "0.5.2" merge-descriptors "1.0.1" methods "~1.1.2" on-finished "~2.3.0" @@ -1828,8 +1850,8 @@ express@^4.14.0, express@^4.15.3: proxy-addr "~1.1.5" qs "6.5.0" range-parser "~1.2.0" - send "0.15.4" - serve-static "1.12.4" + send "0.15.6" + serve-static "1.12.6" setprototypeof "1.0.3" statuses "~1.3.1" type-is "~1.6.15" @@ -1841,12 +1863,12 @@ extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" external-editor@^2.0.1: - version "2.0.4" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972" + version "2.0.5" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.5.tgz#52c249a3981b9ba187c7cacf5beb50bf1d91a6bc" dependencies: iconv-lite "^0.4.17" jschardet "^1.4.2" - tmp "^0.0.31" + tmp "^0.0.33" extglob@^0.3.1: version "0.3.2" @@ -1917,8 +1939,8 @@ file-type@^5.2.0: resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6" file-type@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.1.0.tgz#5a7dba98138fa0abec7afc43e5a9a0b2aac729f1" + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919" filename-regex@^2.0.0: version "2.0.1" @@ -1938,15 +1960,15 @@ filled-array@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/filled-array/-/filled-array-1.1.0.tgz#c3c4f6c663b923459a9aa29912d2d031f1507f84" -finalhandler@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.4.tgz#18574f2e7c4b98b8ae3b230c21f201f31bdb3fb7" +finalhandler@~1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.6.tgz#007aea33d1a4d3e42017f624848ad58d212f814f" dependencies: - debug "2.6.8" + debug "2.6.9" encodeurl "~1.0.1" escape-html "~1.0.3" on-finished "~2.3.0" - parseurl "~1.3.1" + parseurl "~1.3.2" statuses "~1.3.1" unpipe "~1.0.0" @@ -1995,8 +2017,8 @@ flagged-respawn@^0.3.2: resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5" flat-cache@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" + version "1.3.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" dependencies: circular-json "^0.3.1" del "^2.0.2" @@ -2046,12 +2068,12 @@ form-data@~2.3.1: mime-types "^2.1.12" forwarded@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.1.tgz#8a4e30c640b05395399a3549c730257728048961" + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" -fresh@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" fs-exists-sync@^0.1.0: version "0.1.0" @@ -2159,6 +2181,10 @@ get-caller-file@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" +get-params@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/get-params/-/get-params-0.1.2.tgz#bae0dfaba588a0c60d7834c0d8dc2ff60eeef2fe" + get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" @@ -2740,8 +2766,8 @@ inquirer@~3.0.6: through "^2.3.6" interpret@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90" + version "1.0.4" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.4.tgz#820cdd588b868ffb191a809506d6c9c8f212b1b0" invariant@^2.2.2: version "2.2.2" @@ -3005,6 +3031,10 @@ js-yaml@^3.5.1, js-yaml@^3.7.0: argparse "^1.0.7" esprima "^4.0.0" +jsan@^3.1.0, jsan@^3.1.5: + version "3.1.9" + resolved "https://registry.yarnpkg.com/jsan/-/jsan-3.1.9.tgz#2705676c1058f0a7d9ac266ad036a5769cfa7c96" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -3142,6 +3172,10 @@ liftoff@^2.1.0: rechoir "^0.6.2" resolve "^1.1.7" +linked-list@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/linked-list/-/linked-list-0.1.0.tgz#798b0ff97d1b92a4fd08480f55aea4e9d49d37bf" + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -3168,6 +3202,10 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" +lodash-es@^4.2.1: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.4.tgz#dcc1d7552e150a0640073ba9cb31d70f032950e7" + lodash._baseassign@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" @@ -3306,7 +3344,7 @@ lodash.values@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" -lodash@^4.0.0, lodash@^4.11.1, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.8.0, lodash@~4.17.4: +lodash@^4.0.0, lodash@^4.11.1, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.8.0, lodash@~4.17.4: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -3330,7 +3368,7 @@ lokijs@^1.4.3: version "1.5.0" resolved "https://registry.yarnpkg.com/lokijs/-/lokijs-1.5.0.tgz#99e403d6a89e47e11ed0c5d499fb55a0603d5efc" -loose-envify@^1.0.0: +loose-envify@^1.0.0, loose-envify@^1.1.0: version "1.3.1" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" dependencies: @@ -3454,8 +3492,8 @@ mime@1.3.4: resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" mime@^1.2.11, mime@^1.3.4: - version "1.4.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.0.tgz#69e9e0db51d44f2a3b56e48b7817d7d137f1a343" + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" mimic-fn@^1.0.0: version "1.1.0" @@ -3594,8 +3632,8 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" mz@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.6.0.tgz#c8b8521d958df0a4f2768025db69c719ee4ef1ce" + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" dependencies: any-promise "^1.0.0" object-assign "^4.0.1" @@ -3818,7 +3856,7 @@ os-timesync@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/os-timesync/-/os-timesync-1.0.7.tgz#fc7ea7e6de1fc88742880cd08ff284327678e20d" -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -3906,7 +3944,7 @@ parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" -parseurl@~1.3.1: +parseurl@~1.3.1, parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" @@ -4133,7 +4171,7 @@ query-string@^2.4.0: dependencies: strict-uri-encode "^1.0.0" -querystring@0.2.0: +querystring@0.2.0, querystring@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" @@ -4254,9 +4292,29 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" +redux-devtools-extension@^2.13.2: + version "2.13.2" + resolved "https://registry.yarnpkg.com/redux-devtools-extension/-/redux-devtools-extension-2.13.2.tgz#e0f9a8e8dfca7c17be92c7124958a3b94eb2911d" + +redux-devtools-instrument@^1.3.3: + version "1.8.2" + resolved "https://registry.yarnpkg.com/redux-devtools-instrument/-/redux-devtools-instrument-1.8.2.tgz#5e91cfe402e790dae3fd2f0d235f7b7d84b09ffe" + dependencies: + lodash "^4.2.0" + symbol-observable "^1.0.2" + +redux@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b" + dependencies: + lodash "^4.2.1" + lodash-es "^4.2.1" + loose-envify "^1.1.0" + symbol-observable "^1.0.3" + regenerate@^1.2.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" + version "1.3.3" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" regenerator-runtime@^0.10.0: version "0.10.5" @@ -4303,6 +4361,33 @@ regjsparser@^0.1.4: dependencies: jsesc "~0.5.0" +remote-redux-devtools@^0.5.12: + version "0.5.12" + resolved "https://registry.yarnpkg.com/remote-redux-devtools/-/remote-redux-devtools-0.5.12.tgz#42cb95dfa9e54c1d9671317c5e7bba41e68caec2" + dependencies: + jsan "^3.1.5" + querystring "^0.2.0" + redux-devtools-instrument "^1.3.3" + remotedev-utils "^0.1.1" + rn-host-detect "^1.0.1" + socketcluster-client "^5.3.1" + +remotedev-serialize@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/remotedev-serialize/-/remotedev-serialize-0.1.0.tgz#074768e98cb7aa806f45994eeb0c8af95120ee32" + dependencies: + jsan "^3.1.0" + +remotedev-utils@^0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/remotedev-utils/-/remotedev-utils-0.1.4.tgz#643700819a943678073c75eb185e81d96620b348" + dependencies: + get-params "^0.1.2" + jsan "^3.1.5" + lodash "^4.0.0" + remotedev-serialize "^0.1.0" + shortid "^2.2.6" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -4325,34 +4410,7 @@ replace-ext@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" -request@^2.45.0, request@^2.55.0, request@^2.79.0, request@~2.81.0: - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "^0.6.0" - uuid "^3.0.0" - -request@^2.81.0: +request@^2.45.0, request@^2.55.0, request@^2.79.0, request@^2.81.0: version "2.82.0" resolved "https://registry.yarnpkg.com/request/-/request-2.82.0.tgz#2ba8a92cd7ac45660ea2b10a53ae67cd247516ea" dependencies: @@ -4379,6 +4437,33 @@ request@^2.81.0: tunnel-agent "^0.6.0" uuid "^3.1.0" +request@~2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + require-dir@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/require-dir/-/require-dir-0.3.2.tgz#c1d5c75e9fbffde9f2e6b33e383db4f594b5a6a9" @@ -4464,6 +4549,10 @@ rlp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.0.0.tgz#9db384ff4b89a8f61563d92395d8625b18f3afb0" +rn-host-detect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/rn-host-detect/-/rn-host-detect-1.1.3.tgz#242d76e2fa485c48d751416e65b7cce596969e91" + run-async@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" @@ -4509,6 +4598,26 @@ sax@>=0.6.0: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" +sc-channel@~1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/sc-channel/-/sc-channel-1.0.6.tgz#b38bd47a993e78290fbc53467867f6b2a0a08639" + dependencies: + sc-emitter "1.x.x" + +sc-emitter@1.x.x, sc-emitter@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/sc-emitter/-/sc-emitter-1.1.0.tgz#ef119d4222f4c64f887b486964ef11116cdd0e75" + dependencies: + component-emitter "1.2.0" + +sc-errors@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/sc-errors/-/sc-errors-1.3.3.tgz#c00bc4c766a970cc8d5937d08cd58e931d7dae05" + +sc-formatter@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/sc-formatter/-/sc-formatter-3.0.0.tgz#c91b1fe56c260abd5a6a2e6af98c724bc7998a38" + secp256k1@^3.0.1: version "3.3.0" resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.3.0.tgz#50ec9b201ba401403dd13ccbf21d31eeb3ff43cf" @@ -4547,17 +4656,17 @@ semver@^4.1.0: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" -send@0.15.4: - version "0.15.4" - resolved "https://registry.yarnpkg.com/send/-/send-0.15.4.tgz#985faa3e284b0273c793364a35c6737bd93905b9" +send@0.15.6: + version "0.15.6" + resolved "https://registry.yarnpkg.com/send/-/send-0.15.6.tgz#20f23a9c925b762ab82705fe2f9db252ace47e34" dependencies: - debug "2.6.8" + debug "2.6.9" depd "~1.1.1" destroy "~1.0.4" encodeurl "~1.0.1" escape-html "~1.0.3" - etag "~1.8.0" - fresh "0.5.0" + etag "~1.8.1" + fresh "0.5.2" http-errors "~1.6.2" mime "1.3.4" ms "2.0.0" @@ -4569,14 +4678,14 @@ sequencify@~0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" -serve-static@1.12.4: - version "1.12.4" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.4.tgz#9b6aa98eeb7253c4eedc4c1f6fdbca609901a961" +serve-static@1.12.6: + version "1.12.6" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.6.tgz#b973773f63449934da54e5beba5e31d9f4211577" dependencies: encodeurl "~1.0.1" escape-html "~1.0.3" - parseurl "~1.3.1" - send "0.15.4" + parseurl "~1.3.2" + send "0.15.6" servify@^0.1.12: version "0.1.12" @@ -4601,10 +4710,11 @@ setprototypeof@1.0.3: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.8" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.8.tgz#37068c2c476b6baf402d14a49c67f597921f634f" + version "2.4.9" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.9.tgz#98f64880474b74f4a38b8da9d3c0f2d104633e7d" dependencies: inherits "^2.0.1" + safe-buffer "^5.0.1" sha3@^1.1.0: version "1.2.0" @@ -4624,6 +4734,10 @@ shelljs@^0.7.5, shelljs@^0.7.7: interpret "^1.0.0" rechoir "^0.6.2" +shortid@^2.2.6: + version "2.2.8" + resolved "https://registry.yarnpkg.com/shortid/-/shortid-2.2.8.tgz#033b117d6a2e975804f6f0969dbe7d3d0b355131" + sigmund@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" @@ -4676,9 +4790,23 @@ sntp@2.x.x: dependencies: hoek "4.x.x" +socketcluster-client@^5.3.1: + version "5.5.2" + resolved "https://registry.yarnpkg.com/socketcluster-client/-/socketcluster-client-5.5.2.tgz#9d4369e0e722ff7e55e5422c2d44f5afe1aff128" + dependencies: + base-64 "0.1.0" + clone "2.1.1" + linked-list "0.1.0" + querystring "0.2.0" + sc-channel "~1.0.6" + sc-emitter "~1.1.0" + sc-errors "~1.3.0" + sc-formatter "~3.0.0" + ws "3.0.0" + solc@^0.4.15: - version "0.4.16" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.16.tgz#809a5b1257c7c200e11a841b377eaec274698539" + version "0.4.17" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.17.tgz#75f93da6bc190becb89f6663076ab943ff95cd2f" dependencies: fs-extra "^0.30.0" memorystream "^0.3.1" @@ -4927,6 +5055,10 @@ swarm-js@^0.1.21: tar.gz "^1.0.5" xhr-request-promise "^0.1.2" +symbol-observable@^1.0.2, symbol-observable@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" + table@^3.7.8: version "3.8.3" resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" @@ -5065,23 +5197,17 @@ tmp@0.0.29: dependencies: os-tmpdir "~1.0.1" -tmp@^0.0.31: - version "0.0.31" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" dependencies: - os-tmpdir "~1.0.1" + os-tmpdir "~1.0.2" to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" -tough-cookie@~2.3.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" - dependencies: - punycode "^1.4.1" - -tough-cookie@~2.3.2: +tough-cookie@~2.3.0, tough-cookie@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" dependencies: @@ -5153,8 +5279,8 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" typescript@^2.2.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.5.2.tgz#038a95f7d9bbb420b1bf35ba31d4c5c1dd3ffe34" + version "2.5.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.5.3.tgz#df3dcdc38f3beb800d4bc322646b04a3f6ca7f0d" ultron@~1.1.0: version "1.1.0" @@ -5299,8 +5425,8 @@ validator@~7.0.0: resolved "https://registry.yarnpkg.com/validator/-/validator-7.0.0.tgz#c74deb8063512fac35547938e6f0b1504a282fd2" vary@^1, vary@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37" + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" verror@1.10.0: version "1.10.0" @@ -5452,10 +5578,18 @@ write@^0.2.1: dependencies: mkdirp "^0.5.1" +ws@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-3.0.0.tgz#98ddb00056c8390cb751e7788788497f99103b6c" + dependencies: + safe-buffer "~5.0.1" + ultron "~1.1.0" + ws@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-3.1.0.tgz#8afafecdeab46d572e5397ee880739367aa2f41c" + version "3.2.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-3.2.0.tgz#d5d3d6b11aff71e73f808f40cc69d52bb6d4a185" dependencies: + async-limiter "~1.0.0" safe-buffer "~5.1.0" ultron "~1.1.0" From c1f28c85a8515fc16d2ba71d40daeb33a7a6007e Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Fri, 15 Sep 2017 18:41:21 -0600 Subject: [PATCH 004/150] Introduces init script --- main.js | 858 ++++++++++++++++--------------- modules/core/rootReducer.js | 2 + modules/core/settings/reducer.js | 61 +++ modules/core/store.js | 12 +- modules/core/ui/actions.js | 4 - modules/core/ui/reducer.js | 43 +- modules/menuItems.js | 1 + modules/windows.js | 2 +- package.json | 4 +- yarn.lock | 8 +- 10 files changed, 554 insertions(+), 441 deletions(-) create mode 100644 modules/core/settings/reducer.js diff --git a/main.js b/main.js index 2ada9cc58..2e14bdc0a 100644 --- a/main.js +++ b/main.js @@ -14,527 +14,565 @@ const windowStateKeeper = require('electron-window-state'); import configureReduxStore from './modules/core/store'; -import { createSplashWindow, quitApp } from './modules/core/ui/actions'; - +import { quitApp } from './modules/core/ui/actions'; Q.config({ cancellation: true, }); - // logging setup const log = logger.create('main'); +init(); -Settings.init(); +async function init() { + global.store = await configureReduxStore(); -if (Settings.cli.version) { - log.info(Settings.appVersion); + Settings.init(); + store.dispatch({ type: 'SETTINGS::INIT_FINISH' }); - process.exit(0); -} + if (Settings.cli.version) { + log.info(Settings.appVersion); -if (Settings.cli.ignoreGpuBlacklist) { - app.commandLine.appendSwitch('ignore-gpu-blacklist', 'true'); -} + process.exit(0); + } + store.dispatch({ type: 'SETTINGS_APP_VERSION::SET', payload: { appVersion: Settings.appVersion } }); -if (Settings.inAutoTestMode) { - log.info('AUTOMATED TESTING'); -} + if (Settings.cli.ignoreGpuBlacklist) { + app.commandLine.appendSwitch('ignore-gpu-blacklist', 'true'); + store.dispatch({ type: 'SETTINGS_GPU_BLACKLIST::SET' }); + } -log.info(`Running in production mode: ${Settings.inProductionMode}`); + if (Settings.inAutoTestMode) { + log.info('AUTOMATED TESTING'); + store.dispatch({ type: 'SETTINGS_AUTO_TEST_MODE::SET' }); + } -if (Settings.rpcMode === 'http') { - log.warn('Connecting to a node via HTTP instead of ipcMain. This is less secure!!!!'.toUpperCase()); -} + log.info(`Running in production mode: ${Settings.inProductionMode}`); + store.dispatch({ type: 'SETTINGS_PRODUCTION_MODE::SET', payload: { productionMode: Settings.inProductionMode } }); -// db -const db = global.db = require('./modules/db'); + if (Settings.rpcMode === 'http') { + log.warn('Connecting to a node via HTTP instead of ipcMain. This is less secure!!!!'.toUpperCase()); + } + store.dispatch({ type: 'SETTINGS_RPC_MODE::SET', payload: { rpcMode: Settings.rpcMode } }); + // db + const db = global.db = require('./modules/db'); -require('./modules/ipcCommunicator.js'); -const appMenu = require('./modules/menuItems'); -const ipcProviderBackend = require('./modules/ipc/ipcProviderBackend.js'); -const ethereumNode = require('./modules/ethereumNode.js'); -const swarmNode = require('./modules/swarmNode.js'); -const nodeSync = require('./modules/nodeSync.js'); -global.webviews = []; + require('./modules/ipcCommunicator.js'); + const appMenu = require('./modules/menuItems'); + const ipcProviderBackend = require('./modules/ipc/ipcProviderBackend.js'); + const ethereumNode = require('./modules/ethereumNode.js'); + const swarmNode = require('./modules/swarmNode.js'); + const nodeSync = require('./modules/nodeSync.js'); -global.mining = false; + global.webviews = []; -global.icon = `${__dirname}/icons/${Settings.uiMode}/icon.png`; -global.mode = Settings.uiMode; -global.dirname = __dirname; + global.mining = false; + store.dispatch({ type: 'SETTINGS_MINING::SET', payload: { mining: false } }); -global.i18n = i18n; + global.icon = `${__dirname}/icons/${Settings.uiMode}/icon.png`; + global.mode = Settings.uiMode; + store.dispatch({ type: 'SETTINGS_UI_MODE::SET', payload: { uiMode: Settings.uiMode } }); -// INTERFACE PATHS -// - WALLET -if (Settings.uiMode === 'wallet') { - log.info('Starting in Wallet mode'); + global.dirname = __dirname; + store.dispatch({ type: 'SETTINGS_DIRNAME::SET', payload: { dirname: __dirname } }); - global.interfaceAppUrl = (Settings.inProductionMode) - ? `file://${__dirname}/interface/wallet/index.html` - : 'http://localhost:3050'; - global.interfacePopupsUrl = (Settings.inProductionMode) - ? `file://${__dirname}/interface/index.html` - : 'http://localhost:3000'; + global.i18n = i18n; + + // INTERFACE PATHS + // - WALLET + if (Settings.uiMode === 'wallet') { + log.info('Starting in Wallet mode'); -// - MIST -} else { - log.info('Starting in Mist mode'); + global.interfaceAppUrl = (Settings.inProductionMode) + ? `file://${__dirname}/interface/wallet/index.html` + : 'http://localhost:3050'; + global.interfacePopupsUrl = (Settings.inProductionMode) + ? `file://${__dirname}/interface/index.html` + : 'http://localhost:3000'; - let url = (Settings.inProductionMode) - ? `file://${__dirname}/interface/index.html` - : 'http://localhost:3000'; + // - MIST + } else { + log.info('Starting in Mist mode'); - if (Settings.cli.resetTabs) { - url += '?reset-tabs=true'; - } + let url = (Settings.inProductionMode) + ? `file://${__dirname}/interface/index.html` + : 'http://localhost:3000'; - global.interfaceAppUrl = global.interfacePopupsUrl = url; -} + if (Settings.cli.resetTabs) { + url += '?reset-tabs=true'; + } + global.interfaceAppUrl = global.interfacePopupsUrl = url; + } -// prevent crashed and close gracefully -process.on('uncaughtException', (error) => { - log.error('UNCAUGHT EXCEPTION', error); - store.dispatch(quitApp()); -}); + // prevent crashes and close gracefully + process.on('uncaughtException', (error) => { + log.error('UNCAUGHT EXCEPTION', error); + store.dispatch(quitApp()); + }); -// Quit when all windows are closed. -app.on('window-all-closed', () => { - store.dispatch(quitApp()); -}); -// Listen to custom protocole incoming messages, needs registering of URL schemes -app.on('open-url', (e, url) => { - log.info('Open URL', url); -}); + // Quit when all windows are closed. + app.on('window-all-closed', () => { + store.dispatch(quitApp()); + }); + + // Listen to custom protocol incoming messages, needs registering of URL schemes + app.on('open-url', (e, url) => { + log.info('Open URL', url); + }); -let killedSocketsAndNodes = false; + let killedSocketsAndNodes = false; -app.on('before-quit', (event) => { - if (!killedSocketsAndNodes) { - log.info('Defer quitting until sockets and node are shut down'); + app.on('before-quit', async (event) => { + if (!killedSocketsAndNodes) { + log.info('Defer quitting until sockets and node are shut down'); - event.preventDefault(); + event.preventDefault(); - // sockets manager - Sockets.destroyAll() - .catch(() => { + // sockets manager + try { + await Sockets.destroyAll(); + store.dispatch({ type: 'SOCKETS::DESTROY_ALL' }); + } catch (e) { log.error('Error shutting down sockets'); - }); + } - // delay quit, so the sockets can close - setTimeout(async () => { - await ethereumNode.stop() + // delay quit, so the sockets can close + setTimeout(async () => { + await ethereumNode.stop(); + store.dispatch({ type: 'ETH_NODE::STOP' }); - killedSocketsAndNodes = true; - await db.close(); + killedSocketsAndNodes = true; + await db.close(); + store.dispatch({ type: 'DB::CLOSE' }); - store.dispatch(quitApp()); - }, 500); - } else { - log.info('About to quit...'); - } -}); + store.dispatch(quitApp()); + }, 500); + } else { + log.info('About to quit...'); + } + }); -let mainWindow; -let splashWindow; -let onReady; -let startMainWindow; + let mainWindow; + let splashWindow; + let onReady; + let startMainWindow; -// This method will be called when Electron has done everything -// initialization and ready for creating browser windows. -app.on('ready', async () => { - global.store = await configureReduxStore(); - - // if using HTTP RPC then inform user - if (Settings.rpcMode === 'http') { - dialog.showErrorBox('Insecure RPC connection', ` -WARNING: You are connecting to an Ethereum node via: ${Settings.rpcHttpPath} + // This method will be called when Electron has done everything + // initialization and ready for creating browser windows. + app.on('ready', async () => { + // if using HTTP RPC then inform user + if (Settings.rpcMode === 'http') { + dialog.showErrorBox('Insecure RPC connection', ` + WARNING: You are connecting to an Ethereum node via: ${Settings.rpcHttpPath} -This is less secure than using local IPC - your passwords will be sent over the wire in plaintext. + This is less secure than using local IPC - your passwords will be sent over the wire in plaintext. -Only do this if you have secured your HTTP connection or you know what you are doing. -`); - } + Only do this if you have secured your HTTP connection or you know what you are doing. + `); + } - // initialise the db - global.db.init().then(onReady).catch((err) => { - log.error(err); - store.dispatch(quitApp()); + // initialise the db + try { + await global.db.init(); + store.dispatch({ type: 'DB::INIT' }); + onReady(); + } catch (e) { + log.error(e); + store.dispatch(quitApp()); + } }); -}); -// Allows the Swarm protocol to behave like http -protocol.registerStandardSchemes(['bzz']); + // Allows the Swarm protocol to behave like http + protocol.registerStandardSchemes(['bzz']); -onReady = () => { - global.config = db.getCollection('SYS_config'); + onReady = () => { + global.config = db.getCollection('SYS_config'); - // setup DB sync to backend - dbSync.backendSyncInit(); + // setup DB sync to backend + dbSync.backendSyncInit(); + store.dispatch({ type: 'DB::SYNC_TO_BACKEND' }); - // Initialise window mgr - Windows.init(); + // Initialise window mgr + Windows.init(); + store.dispatch({ type: 'WINDOWS::INIT_FINISH' }); - // Enable the Swarm protocol - protocol.registerHttpProtocol('bzz', (request, callback) => { - const redirectPath = `${Settings.swarmURL}/${request.url.replace('bzz:/', 'bzz://')}`; - callback({ method: request.method, referrer: request.referrer, url: redirectPath }); - }, (error) => { - if (error) { - log.error(error); - } - }); - - // check for update - if (!Settings.inAutoTestMode) UpdateChecker.run(); + // Enable the Swarm protocol + protocol.registerHttpProtocol('bzz', (request, callback) => { + const redirectPath = `${Settings.swarmURL}/${request.url.replace('bzz:/', 'bzz://')}`; + callback({ method: request.method, referrer: request.referrer, url: redirectPath }); + store.dispatch({ type: 'PROTOCOL::REGISTER', payload: { protocol: 'bzz' } }); + }, (error) => { + if (error) { + log.error(error); + } + }); - // initialize the web3 IPC provider backend - ipcProviderBackend.init(); + // check for update + if (!Settings.inAutoTestMode) UpdateChecker.run(); + store.dispatch({ type: 'UPDATE_CHECKER::RUN' }); - // instantiate custom protocols - // require('./customProtocols.js'); + // initialize the web3 IPC provider backend + ipcProviderBackend.init(); + store.dispatch({ type: 'IPC_PROVIDER_BACKEND::INIT' }); - // change to user language now that global.config object is ready - i18n.changeLanguage(Settings.language); + // instantiate custom protocols + // require('./customProtocols.js'); - // add menu already here, so we have copy and past functionality - appMenu(); + // change to user language now that global.config object is ready + i18n.changeLanguage(Settings.language); + store.dispatch({ type: 'SETTINGS_I18N::SET', payload: { i18n: Settings.language } }); - // Create the browser window. + // add menu already here, so we have copy and paste functionality + appMenu(); - const defaultWindow = windowStateKeeper({ - defaultWidth: 1024 + 208, - defaultHeight: 720 - }); + // Create the browser window. - // MIST - if (Settings.uiMode === 'mist') { - mainWindow = Windows.create('main', { - primary: true, - electronOptions: { - width: Math.max(defaultWindow.width, 500), - height: Math.max(defaultWindow.height, 440), - x: defaultWindow.x, - y: defaultWindow.y, - webPreferences: { - nodeIntegration: true, /* necessary for webviews; - require will be removed through preloader */ - preload: `${__dirname}/modules/preloader/mistUI.js`, - 'overlay-fullscreen-video': true, - 'overlay-scrollbars': true, - experimentalFeatures: true, - }, - }, + const defaultWindow = windowStateKeeper({ + defaultWidth: 1024 + 208, + defaultHeight: 720 }); - // WALLET - } else { - mainWindow = Windows.create('main', { - primary: true, - electronOptions: { - width: Math.max(defaultWindow.width, 500), - height: Math.max(defaultWindow.height, 440), - x: defaultWindow.x, - y: defaultWindow.y, - webPreferences: { - preload: `${__dirname}/modules/preloader/walletMain.js`, - 'overlay-fullscreen-video': true, - 'overlay-scrollbars': true, + store.dispatch({ type: 'MAIN_WINDOW::CREATE_START' }); + + // MIST + if (Settings.uiMode === 'mist') { + mainWindow = Windows.create('main', { + primary: true, + electronOptions: { + width: Math.max(defaultWindow.width, 500), + height: Math.max(defaultWindow.height, 440), + x: defaultWindow.x, + y: defaultWindow.y, + webPreferences: { + nodeIntegration: true, /* necessary for webviews; + require will be removed through preloader */ + preload: `${__dirname}/modules/preloader/mistUI.js`, + 'overlay-fullscreen-video': true, + 'overlay-scrollbars': true, + experimentalFeatures: true, + }, }, - }, - }); - } - - // Delegating events to save window bounds on windowStateKeeper - defaultWindow.manage(mainWindow.window); - - if (!Settings.inAutoTestMode) { - - // TODO: SPLASH_WINDOW::CREATE - store.dispatch(createSplashWindow(Settings.uiMode)); - - splashWindow = Windows.create('splash', { - primary: true, - url: `${global.interfacePopupsUrl}#splashScreen_${Settings.uiMode}`, - show: true, - electronOptions: { - width: 400, - height: 230, - resizable: false, - backgroundColor: '#F6F6F6', - useContentSize: true, - frame: false, - webPreferences: { - preload: `${__dirname}/modules/preloader/splashScreen.js`, + }); + store.dispatch({ type: 'MAIN_WINDOW::CREATE_SUCCESS' }); + + // WALLET + } else { + mainWindow = Windows.create('main', { + primary: true, + electronOptions: { + width: Math.max(defaultWindow.width, 500), + height: Math.max(defaultWindow.height, 440), + x: defaultWindow.x, + y: defaultWindow.y, + webPreferences: { + preload: `${__dirname}/modules/preloader/walletMain.js`, + 'overlay-fullscreen-video': true, + 'overlay-scrollbars': true, + }, }, - }, - }); - } - - // check time sync - // var ntpClient = require('ntp-client'); - // ntpClient.getNetworkTime("pool.ntp.org", 123, function(err, date) { - timesync.checkEnabled((err, enabled) => { - if (err) { - log.error('Couldn\'t get time from NTP time sync server.', err); - return; + }); + store.dispatch({ type: 'MAIN_WINDOW::CREATE_SUCCESS' }); } - if (!enabled) { - dialog.showMessageBox({ - type: 'warning', - buttons: ['OK'], - message: global.i18n.t('mist.errors.timeSync.title'), - detail: `${global.i18n.t('mist.errors.timeSync.description')}\n\n${global.i18n.t(`mist.errors.timeSync.${process.platform}`)}`, - }, () => { + // Delegating events to save window bounds on windowStateKeeper + defaultWindow.manage(mainWindow.window); + + if (!Settings.inAutoTestMode) { + store.dispatch({ type: 'SPLASH_WINDOW::CREATE_START' }); + + splashWindow = Windows.create('splash', { + primary: true, + url: `${global.interfacePopupsUrl}#splashScreen_${Settings.uiMode}`, + show: true, + electronOptions: { + width: 400, + height: 230, + resizable: false, + backgroundColor: '#F6F6F6', + useContentSize: true, + frame: false, + webPreferences: { + preload: `${__dirname}/modules/preloader/splashScreen.js`, + }, + }, }); - } - }); + store.dispatch({ type: 'SPLASH_WINDOW::CREATE_SUCCESS' }); + } - const kickStart = () => { - // client binary stuff - ClientBinaryManager.on('status', (status, data) => { - Windows.broadcast('uiAction_clientBinaryStatus', status, data); - }); + // check time sync + // var ntpClient = require('ntp-client'); + // ntpClient.getNetworkTime("pool.ntp.org", 123, function(err, date) { + timesync.checkEnabled((err, enabled) => { + if (err) { + log.error('Couldn\'t get time from NTP time sync server.', err); + return; + } - // node connection stuff - ethereumNode.on('nodeConnectionTimeout', () => { - Windows.broadcast('uiAction_nodeStatus', 'connectionTimeout'); + if (!enabled) { + dialog.showMessageBox({ + type: 'warning', + buttons: ['OK'], + message: global.i18n.t('mist.errors.timeSync.title'), + detail: `${global.i18n.t('mist.errors.timeSync.description')}\n\n${global.i18n.t(`mist.errors.timeSync.${process.platform}`)}`, + }, () => { + }); + } }); - ethereumNode.on('nodeLog', (data) => { - Windows.broadcast('uiAction_nodeLogText', data.replace(/^.*[0-9]]/, '')); - }); - // state change - ethereumNode.on('state', (state, stateAsText) => { - Windows.broadcast('uiAction_nodeStatus', stateAsText, - ethereumNode.STATES.ERROR === state ? ethereumNode.lastError : null - ); - }); + const kickStart = () => { + // client binary stuff + ClientBinaryManager.on('status', (status, data) => { + Windows.broadcast('uiAction_clientBinaryStatus', status, data); + }); - // starting swarm - swarmNode.on('starting', () => { - Windows.broadcast('uiAction_swarmStatus', 'starting'); - }); + // node connection stuff + ethereumNode.on('nodeConnectionTimeout', () => { + Windows.broadcast('uiAction_nodeStatus', 'connectionTimeout'); + }); - // swarm download progress - swarmNode.on('downloadProgress', (progress) => { - Windows.broadcast('uiAction_swarmStatus', 'downloadProgress', progress); - }); + ethereumNode.on('nodeLog', (data) => { + Windows.broadcast('uiAction_nodeLogText', data.replace(/^.*[0-9]]/, '')); + }); - // started swarm - swarmNode.on('started', (isLocal) => { - Windows.broadcast('uiAction_swarmStatus', 'started', isLocal); - }); + // state change + ethereumNode.on('state', (state, stateAsText) => { + Windows.broadcast('uiAction_nodeStatus', stateAsText, + ethereumNode.STATES.ERROR === state ? ethereumNode.lastError : null + ); + }); + // starting swarm + swarmNode.on('starting', () => { + Windows.broadcast('uiAction_swarmStatus', 'starting'); + store.dispatch({ type: 'SWARM::INIT_START' }); + }); - // capture sync results - const syncResultPromise = new Q((resolve, reject) => { - nodeSync.on('nodeSyncing', (result) => { - Windows.broadcast('uiAction_nodeSyncStatus', 'inProgress', result); + // swarm download progress + swarmNode.on('downloadProgress', (progress) => { + Windows.broadcast('uiAction_swarmStatus', 'downloadProgress', progress); }); - nodeSync.on('stopped', () => { - Windows.broadcast('uiAction_nodeSyncStatus', 'stopped'); + // started swarm + swarmNode.on('started', (isLocal) => { + Windows.broadcast('uiAction_swarmStatus', 'started', isLocal); + store.dispatch({ type: 'SWARM::INIT_FINISH' }); }); - nodeSync.on('error', (err) => { - log.error('Error syncing node', err); - reject(err); - }); + // capture sync results + const syncResultPromise = new Q((resolve, reject) => { + nodeSync.on('nodeSyncing', (result) => { + Windows.broadcast('uiAction_nodeSyncStatus', 'inProgress', result); + }); - nodeSync.on('finished', () => { - nodeSync.removeAllListeners('error'); - nodeSync.removeAllListeners('finished'); + nodeSync.on('stopped', () => { + Windows.broadcast('uiAction_nodeSyncStatus', 'stopped'); + }); - resolve(); - }); - }); + nodeSync.on('error', (err) => { + log.error('Error syncing node', err); - // check legacy chain - // CHECK for legacy chain (FORK RELATED) - Q.try(() => { - // open the legacy chain message - if ((Settings.loadUserData('daoFork') || '').trim() === 'false') { - dialog.showMessageBox({ - type: 'warning', - buttons: ['OK'], - message: global.i18n.t('mist.errors.legacyChain.title'), - detail: global.i18n.t('mist.errors.legacyChain.description') - }, () => { - shell.openExternal('https://github.com/ethereum/mist/releases'); - store.dispatch(quitApp()); + reject(err); }); - throw new Error('Cant start client due to legacy non-Fork setting.'); - } - }) - .then(() => { - return ClientBinaryManager.init(); - }) - .then(() => { - return ethereumNode.init(); - }) - .then(() => { - // Wallet shouldn't start Swarm - if (Settings.uiMode === 'wallet') { - return Promise.resolve(); - } - return swarmNode.init(); - }) - .then(function sanityCheck() { - if (!ethereumNode.isIpcConnected) { - throw new Error('Either the node didn\'t start or IPC socket failed to connect.'); - } + nodeSync.on('finished', () => { + nodeSync.removeAllListeners('error'); + nodeSync.removeAllListeners('finished'); - /* At this point Geth is running and the socket is connected. */ - log.info('Connected via IPC to node.'); - - // update menu, to show node switching possibilities - appMenu(); - }) - .then(function getAccounts() { - return ethereumNode.send('eth_accounts', []); - }) - .then(function onboarding(resultData) { - - if (ethereumNode.isGeth && (resultData.result === null || (_.isArray(resultData.result) && resultData.result.length === 0))) { - log.info('No accounts setup yet, lets do onboarding first.'); - - return new Q((resolve, reject) => { - const onboardingWindow = Windows.createPopup('onboardingScreen', { - primary: true, - electronOptions: { - width: 576, - height: 442, - }, - }); + resolve(); + }); + }); - onboardingWindow.on('closed', () => { + // check legacy chain + // CHECK for legacy chain (FORK RELATED) + Q.try(() => { + // open the legacy chain message + if ((Settings.loadUserData('daoFork') || '').trim() === 'false') { + dialog.showMessageBox({ + type: 'warning', + buttons: ['OK'], + message: global.i18n.t('mist.errors.legacyChain.title'), + detail: global.i18n.t('mist.errors.legacyChain.description') + }, () => { + shell.openExternal('https://github.com/ethereum/mist/releases'); store.dispatch(quitApp()); }); - // change network types (mainnet, testnet) - ipcMain.on('onBoarding_changeNet', (e, testnet) => { - const newType = ethereumNode.type; - const newNetwork = testnet ? 'rinkeby' : 'main'; - - log.debug('Onboarding change network', newType, newNetwork); - - ethereumNode.restart(newType, newNetwork) - .then(function nodeRestarted() { - appMenu(); - }) - .catch((err) => { - log.error('Error restarting node', err); - - reject(err); - }); + throw new Error('Cant start client due to legacy non-Fork setting.'); + } + }) + .then(() => { + return ClientBinaryManager.init(); + }) + .then(() => { + return ethereumNode.init(); + }) + .then(() => { + // Wallet shouldn't start Swarm + if (Settings.uiMode === 'wallet') { + return Promise.resolve(); + } + return swarmNode.init(); + }) + .then(function sanityCheck() { + if (!ethereumNode.isIpcConnected) { + throw new Error('Either the node didn\'t start or IPC socket failed to connect.'); + } + + /* At this point Geth is running and the socket is connected. */ + log.info('Connected via IPC to node.'); + + // update menu, to show node switching possibilities + appMenu(); + }) + .then(function getAccounts() { + return ethereumNode.send('eth_accounts', []); + }) + .then(function onboarding(resultData) { + + if (ethereumNode.isGeth && (resultData.result === null || (_.isArray(resultData.result) && resultData.result.length === 0))) { + log.info('No accounts setup yet, lets do onboarding first.'); + + return new Q((resolve, reject) => { + store.dispatch({ type: 'ONBOARDING_WINDOW::CREATE_START' }); + const onboardingWindow = Windows.createPopup('onboardingScreen', { + primary: true, + electronOptions: { + width: 576, + height: 442, + }, + }); + store.dispatch({ type: 'ONBOARDING_WINDOW::CREATE_SUCCESS' }); + + onboardingWindow.on('closed', () => { + store.dispatch({ type: 'ONBOARDING_WINDOW::CLOSE' }); + store.dispatch(quitApp()); + }); + + // change network types (mainnet, testnet) + ipcMain.on('onBoarding_changeNet', (e, testnet) => { + const newType = ethereumNode.type; + const newNetwork = testnet ? 'rinkeby' : 'main'; + + log.debug('Onboarding change network', newType, newNetwork); + + ethereumNode.restart(newType, newNetwork) + .then(function nodeRestarted() { + appMenu(); + }) + .catch((err) => { + log.error('Error restarting node', err); + + reject(err); + }); + }); + + // launch app + ipcMain.on('onBoarding_launchApp', () => { + // prevent that it closes the app + onboardingWindow.removeAllListeners('closed'); + onboardingWindow.close(); + store.dispatch({ type: 'ONBOARDING_WINDOW::CLOSE' }); + + ipcMain.removeAllListeners('onBoarding_changeNet'); + ipcMain.removeAllListeners('onBoarding_launchApp'); + + resolve(); + }); + + if (splashWindow) { + splashWindow.hide(); + } }); + } + + return; + }) + .then(function doSync() { + // we're going to do the sync - so show splash + if (splashWindow) { + splashWindow.show(); + } + + if (!Settings.inAutoTestMode) { + return syncResultPromise; + } + + return; + }) + .then(function allDone() { + startMainWindow(); + }) + .catch((err) => { + log.error('Error starting up node and/or syncing', err); + }); /* socket connected to geth */ + }; /* kick start */ - // launch app - ipcMain.on('onBoarding_launchApp', () => { - // prevent that it closes the app - onboardingWindow.removeAllListeners('closed'); - onboardingWindow.close(); + if (splashWindow) { + splashWindow.on('ready', kickStart); + } else { + kickStart(); + } + }; /* onReady() */ - ipcMain.removeAllListeners('onBoarding_changeNet'); - ipcMain.removeAllListeners('onBoarding_launchApp'); - resolve(); - }); + /** + Start the main window and all its processes - if (splashWindow) { - splashWindow.hide(); - } - }); - } + @method startMainWindow + */ + startMainWindow = () => { + log.info(`Loading Interface at ${global.interfaceAppUrl}`); - return; - }) - .then(function doSync() { - // we're going to do the sync - so show splash + mainWindow.on('ready', () => { if (splashWindow) { - splashWindow.show(); + splashWindow.close(); + store.dispatch({ type: 'SPLASH_WINDOW::CLOSE' }); } - if (!Settings.inAutoTestMode) { - return syncResultPromise; - } - - return; - }) - .then(function allDone() { - startMainWindow(); - }) - .catch((err) => { - log.error('Error starting up node and/or syncing', err); - }); /* socket connected to geth */ - }; /* kick start */ - - if (splashWindow) { - splashWindow.on('ready', kickStart); - } else { - kickStart(); - } -}; /* onReady() */ - - -/** -Start the main window and all its processes - -@method startMainWindow -*/ -startMainWindow = () => { - log.info(`Loading Interface at ${global.interfaceAppUrl}`); + mainWindow.show(); + store.dispatch({ type: 'MAIN_WINDOW::SHOW' }); + }); - mainWindow.on('ready', () => { - if (splashWindow) { - splashWindow.close(); - } + mainWindow.load(global.interfaceAppUrl); - mainWindow.show(); - }); + // close app, when the main window is closed + mainWindow.on('closed', () => { + store.dispatch(quitApp()); + }); - mainWindow.load(global.interfaceAppUrl); + // observe Tabs for changes and refresh menu + const Tabs = global.db.getCollection('UI_tabs'); - // close app, when the main window is closed - mainWindow.on('closed', () => { - store.dispatch(quitApp()); - }); + const sortedTabs = Tabs.addDynamicView('sorted_tabs'); + sortedTabs.applySimpleSort('position', false); - // observe Tabs for changes and refresh menu - const Tabs = global.db.getCollection('UI_tabs'); + const refreshMenu = () => { + clearTimeout(global._refreshMenuFromTabsTimer); - const sortedTabs = Tabs.addDynamicView('sorted_tabs'); - sortedTabs.applySimpleSort('position', false); + global._refreshMenuFromTabsTimer = setTimeout(() => { + log.debug('Refresh menu with tabs'); - const refreshMenu = () => { - clearTimeout(global._refreshMenuFromTabsTimer); + global.webviews = sortedTabs.data(); - global._refreshMenuFromTabsTimer = setTimeout(() => { - log.debug('Refresh menu with tabs'); + appMenu(global.webviews); + store.dispatch({ type: 'MENU::REFRESH' }); + }, 1000); + }; - global.webviews = sortedTabs.data(); - - appMenu(global.webviews); - }, 1000); + Tabs.on('insert', refreshMenu); + Tabs.on('update', refreshMenu); + Tabs.on('delete', refreshMenu); }; - - Tabs.on('insert', refreshMenu); - Tabs.on('update', refreshMenu); - Tabs.on('delete', refreshMenu); -}; +} diff --git a/modules/core/rootReducer.js b/modules/core/rootReducer.js index 19d89e757..7d7ad8a61 100644 --- a/modules/core/rootReducer.js +++ b/modules/core/rootReducer.js @@ -1,6 +1,8 @@ import { combineReducers } from 'redux'; +import settings from './settings/reducer'; import ui from './ui/reducer'; export default combineReducers({ + settings, ui, }); diff --git a/modules/core/settings/reducer.js b/modules/core/settings/reducer.js new file mode 100644 index 000000000..e747d6184 --- /dev/null +++ b/modules/core/settings/reducer.js @@ -0,0 +1,61 @@ +const initialState = { + appVersion: '', + autoTestMode: false, + dbInit: false, + dbSync: false, + dirname: '', + gpuBlacklist: false, + i18n: '', + ipcProviderBackendInit: false, + mining: false, + productionMode: null, + protocols: [], + rpcMode: '', + settingsInit: false, + swarmInit: false, + uiMode: '', + updateCheckerRan: false, +}; + +const settings = (state = initialState, action) => { + switch (action.type) { + case 'DB::INIT': + return Object.assign({}, state, { dbInit: true }); + case 'DB::SYNC_TO_BACKEND': + return Object.assign({}, state, { dbSync: true }); + case 'PROTOCOL::REGISTER': + return Object.assign({}, state, { + protocols: state.protocols.concat(action.payload.protocol) + }); + case 'SETTINGS::INIT_FINISH': + return Object.assign({}, state, { settingsInit: true }); + case 'SETTINGS_APP_VERSION::SET': + return Object.assign({}, state, { appVersion: action.payload.appVersion }); + case 'SETTINGS_GPU_BLACKLIST::SET': + return Object.assign({}, state, { gpuBlacklist: true }); + case 'SETTINGS_AUTO_TEST_MODE::SET': + return Object.assign({}, state, { autoTestMode: true }); + case 'SETTINGS_PRODUCTION_MODE::SET': + return Object.assign({}, state, { productionMode: action.payload.productionMode }); + case 'SETTINGS_RPC_MODE::SET': + return Object.assign({}, state, { rpcMode: action.payload.rpcMode }); + case 'SETTINGS_MINING::SET': + return Object.assign({}, state, { mining: action.payload.mining }); + case 'SETTINGS_UI_MODE::SET': + return Object.assign({}, state, { uiMode: action.payload.uiMode }); + case 'SETTINGS_DIRNAME::SET': + return Object.assign({}, state, { dirname: action.payload.dirname }); + case 'SETTINGS_I18N::SET': + return Object.assign({}, state, { i18n: action.payload.i18n }); + case 'SWARM::INIT_FINISH': + return Object.assign({}, state, { swarmInit: true }); + case 'UPDATE_CHECKER::FINISH': + return Object.assign({}, state, { updateCheckerRan: true }); + case 'IPC_PROVIDER_BACKEND::FINISH': + return Object.assign({}, state, { ipcProviderBackendInit: true }); + default: + return state; + } +} + +export default settings; diff --git a/modules/core/store.js b/modules/core/store.js index 1ddc5e469..fe6032185 100644 --- a/modules/core/store.js +++ b/modules/core/store.js @@ -1,10 +1,14 @@ -import { createStore } from 'redux'; +import { createStore, applyMiddleware } from 'redux'; import { app } from 'electron'; -import devToolsEnhancer from 'remote-redux-devtools'; +import { composeWithDevTools } from 'remote-redux-devtools'; import rootReducer from './rootReducer'; +import thunk from 'redux-thunk'; -export default async function configureReduxStore() { - const store = createStore(rootReducer, devToolsEnhancer()); +export default function configureReduxStore() { + const store = createStore( + rootReducer, + composeWithDevTools(applyMiddleware(thunk)) + ); store.subscribe(() => { const state = store.getState(); diff --git a/modules/core/ui/actions.js b/modules/core/ui/actions.js index b128d0c01..c208335d8 100644 --- a/modules/core/ui/actions.js +++ b/modules/core/ui/actions.js @@ -1,7 +1,3 @@ -export function createSplashWindow(uiMode) { - return { type: 'SPLASH_WINDOW::CREATE', payload: { uiMode } }; -} - export function quitApp() { return { type: 'APP::QUIT' }; } diff --git a/modules/core/ui/reducer.js b/modules/core/ui/reducer.js index 821defd98..f47c42ccc 100644 --- a/modules/core/ui/reducer.js +++ b/modules/core/ui/reducer.js @@ -1,29 +1,40 @@ const initialState = { appQuit: false, + mainWindowCreated: false, + mainWindowVisible: false, + onboardingWindowCreated: false, + onboardingWindowVisible: false, splashWindowCreated: false, splashWindowVisible: false, - uiMode: '', + windowsInit: false, }; const ui = (state = initialState, action) => { switch (action.type) { - case 'SPLASH_WINDOW::CREATE': - return Object.assign({}, state, { - created: true, - uiMode: action.payload.uiMode - }); + case 'APP::QUIT': + return Object.assign({}, state, { appQuit: true }); + case 'MAIN_WINDOW::CLOSE': + return Object.assign({}, state, { mainWindowVisible: false }); + case 'MAIN_WINDOW::CREATE_SUCCESS': + return Object.assign({}, state, { mainWindowCreated: true }); + case 'MAIN_WINDOW::SHOW': + return Object.assign({}, state, { mainWindowVisible: true }); + case 'MAIN_WINDOW::HIDE': + return Object.assign({}, state, { mainWindowVisible: false }); + case 'ONBOARDING_WINDOW::CLOSE': + return Object.assign({}, state, { onboardingWindowVisible: false }); + case 'ONBOARDING_WINDOW::CREATE_SUCCESS': + return Object.assign({}, state, { onboardingWindowCreated: true, onboardingWindowVisible: true }); + case 'SPLASH_WINDOW::CLOSE': + return Object.assign({}, state, { splashWindowVisible: false }); + case 'SPLASH_WINDOW::CREATE_SUCCESS': + return Object.assign({}, state, { splashWindowCreated: true }); case 'SPLASH_WINDOW::SHOW': - return Object.assign({}, state, { - splashWindowVisible: true - }); + return Object.assign({}, state, { splashWindowVisible: true }); case 'SPLASH_WINDOW::HIDE': - return Object.assign({}, state, { - splashWindowVisible: true - }); - case 'APP::QUIT': - return Object.assign({}, state, { - appQuit: true - }); + return Object.assign({}, state, { splashWindowVisible: false }); + case 'WINDOWS::INIT_FINISH': + return Object.assign({}, state, { windowsInit: true }); default: return state; } diff --git a/modules/menuItems.js b/modules/menuItems.js index 56d21738c..4d8b573e4 100644 --- a/modules/menuItems.js +++ b/modules/menuItems.js @@ -316,6 +316,7 @@ let menuTempl = function (webviews) { browserWindow.webContents.executeJavaScript( `TAPi18n.setLanguage("${langCode}");` ); + store.dispatch({ type: 'SETTINGS_I18N::SET', payload: { i18n: langCode } }); // set Accept_Language header const session = browserWindow.webContents.session; diff --git a/modules/windows.js b/modules/windows.js index 2670b6a50..e44d410a9 100644 --- a/modules/windows.js +++ b/modules/windows.js @@ -1,4 +1,3 @@ -const _ = global._; const { app, BrowserWindow, ipcMain: ipc } = require('electron'); const Settings = require('./settings'); const log = require('./utils/logger').create('Windows'); @@ -220,6 +219,7 @@ class Windows { create(type, options, callback) { + log.info(`Creating window: ${type}`); options = options || {}; const existing = this.getByType(type); diff --git a/package.json b/package.json index 987b75e3a..0a62282fd 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,8 @@ "oboe": "^2.1.3", "os-timesync": "^1.0.7", "redux": "^3.7.2", + "redux-thunk": "^2.2.0", + "remote-redux-devtools": "^0.5.12", "semver": "^5.1.0", "solc": "^0.4.15", "swarm-js": "^0.1.21", @@ -67,8 +69,6 @@ "json-structure-diff": "^0.0.2", "minimist": "^1.2.0", "mocha": "^3.2.0", - "redux-devtools-extension": "^2.13.2", - "remote-redux-devtools": "^0.5.12", "require-dir": "^0.3.2", "run-sequence": "^1.2.1", "semver-compare": "^1.0.0", diff --git a/yarn.lock b/yarn.lock index 6523c2b40..07b84fde1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4292,10 +4292,6 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" -redux-devtools-extension@^2.13.2: - version "2.13.2" - resolved "https://registry.yarnpkg.com/redux-devtools-extension/-/redux-devtools-extension-2.13.2.tgz#e0f9a8e8dfca7c17be92c7124958a3b94eb2911d" - redux-devtools-instrument@^1.3.3: version "1.8.2" resolved "https://registry.yarnpkg.com/redux-devtools-instrument/-/redux-devtools-instrument-1.8.2.tgz#5e91cfe402e790dae3fd2f0d235f7b7d84b09ffe" @@ -4303,6 +4299,10 @@ redux-devtools-instrument@^1.3.3: lodash "^4.2.0" symbol-observable "^1.0.2" +redux-thunk@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.2.0.tgz#e615a16e16b47a19a515766133d1e3e99b7852e5" + redux@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b" From 1475ddf15647177b395fb6fe729de802225946cd Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Tue, 3 Oct 2017 11:25:00 -0600 Subject: [PATCH 005/150] Redux electron store (#3082) * Introduces Redux store * Introduces cient-side Redux store * Refacators initial i18n language setting * Fully refactors i18n Redux workflow * Stores CLI flags in Redux * Refactors some setup into Settings init * Adds settings reducer tests * tests settings actions creators * Generalizes build sync actions --- interface/client/actions.js | 12 + interface/client/appStart.js | 6 +- main.js | 59 +- modules/core/settings/actions.js | 90 + modules/core/settings/reducer.js | 32 +- modules/core/store.js | 9 +- modules/ipcCommunicator.js | 15 +- modules/menuItems.js | 31 +- modules/preloader/mistUI.js | 16 + modules/preloader/splashScreen.js | 2 +- modules/settings.js | 33 +- package.json | 6 +- tests/unit/core/settings/actions.test.js | 96 + tests/unit/core/settings/reducer.test.js | 63 + yarn.lock | 5768 ---------------------- 15 files changed, 352 insertions(+), 5886 deletions(-) create mode 100644 interface/client/actions.js create mode 100644 modules/core/settings/actions.js create mode 100644 tests/unit/core/settings/actions.test.js create mode 100644 tests/unit/core/settings/reducer.test.js delete mode 100644 yarn.lock diff --git a/interface/client/actions.js b/interface/client/actions.js new file mode 100644 index 000000000..7f100cb24 --- /dev/null +++ b/interface/client/actions.js @@ -0,0 +1,12 @@ +exports.getLanguage = function getLanguage() { + return function (dispatch) { + dispatch({ type: '[CLIENT]:GET_LANGUAGE:START' }); + try { + const lang = ipc.sendSync('backendAction_getLanguage'); + TAPi18n.setLanguage(lang); + dispatch({ type: '[CLIENT]:GET_LANGUAGE:SUCCESS', payload: { i18n: lang } }); + } catch (error) { + dispatch({ type: '[CLIENT]:GET_LANGUAGE:FAILURE', error }); + } + } +} diff --git a/interface/client/appStart.js b/interface/client/appStart.js index 459fc08c3..2236d1533 100644 --- a/interface/client/appStart.js +++ b/interface/client/appStart.js @@ -1,3 +1,5 @@ +const { getLanguage } = require('./actions.js'); + /** The init function of Mist @@ -65,9 +67,7 @@ Meteor.startup(function () { mistInit(); } - console.debug('Setting language'); - - TAPi18n.setLanguage(ipc.sendSync('backendAction_getLanguage')); + store.dispatch(getLanguage()); // change moment and numeral language, when language changes Tracker.autorun(function () { diff --git a/main.js b/main.js index 2e14bdc0a..03dd11a61 100644 --- a/main.js +++ b/main.js @@ -11,17 +11,16 @@ const UpdateChecker = require('./modules/updateChecker'); const Settings = require('./modules/settings'); const Q = require('bluebird'); const windowStateKeeper = require('electron-window-state'); - +const log = logger.create('main'); import configureReduxStore from './modules/core/store'; import { quitApp } from './modules/core/ui/actions'; +import { setLanguageOnMain } from './modules/core/settings/actions'; Q.config({ cancellation: true, }); -// logging setup -const log = logger.create('main'); init(); @@ -29,37 +28,9 @@ async function init() { global.store = await configureReduxStore(); Settings.init(); - store.dispatch({ type: 'SETTINGS::INIT_FINISH' }); - - if (Settings.cli.version) { - log.info(Settings.appVersion); - - process.exit(0); - } - store.dispatch({ type: 'SETTINGS_APP_VERSION::SET', payload: { appVersion: Settings.appVersion } }); - - if (Settings.cli.ignoreGpuBlacklist) { - app.commandLine.appendSwitch('ignore-gpu-blacklist', 'true'); - store.dispatch({ type: 'SETTINGS_GPU_BLACKLIST::SET' }); - } - - if (Settings.inAutoTestMode) { - log.info('AUTOMATED TESTING'); - store.dispatch({ type: 'SETTINGS_AUTO_TEST_MODE::SET' }); - } - - log.info(`Running in production mode: ${Settings.inProductionMode}`); - store.dispatch({ type: 'SETTINGS_PRODUCTION_MODE::SET', payload: { productionMode: Settings.inProductionMode } }); - if (Settings.rpcMode === 'http') { - log.warn('Connecting to a node via HTTP instead of ipcMain. This is less secure!!!!'.toUpperCase()); - } - store.dispatch({ type: 'SETTINGS_RPC_MODE::SET', payload: { rpcMode: Settings.rpcMode } }); - - // db const db = global.db = require('./modules/db'); - require('./modules/ipcCommunicator.js'); const appMenu = require('./modules/menuItems'); const ipcProviderBackend = require('./modules/ipc/ipcProviderBackend.js'); @@ -67,24 +38,17 @@ async function init() { const swarmNode = require('./modules/swarmNode.js'); const nodeSync = require('./modules/nodeSync.js'); + // Define global vars; The preloader makes some globals available to the client. global.webviews = []; - global.mining = false; - store.dispatch({ type: 'SETTINGS_MINING::SET', payload: { mining: false } }); - - global.icon = `${__dirname}/icons/${Settings.uiMode}/icon.png`; - - global.mode = Settings.uiMode; - store.dispatch({ type: 'SETTINGS_UI_MODE::SET', payload: { uiMode: Settings.uiMode } }); - + global.mode = store.getState().settings.uiMode; + global.icon = `${__dirname}/icons/${global.mode}/icon.png`; global.dirname = __dirname; - store.dispatch({ type: 'SETTINGS_DIRNAME::SET', payload: { dirname: __dirname } }); - global.i18n = i18n; // INTERFACE PATHS // - WALLET - if (Settings.uiMode === 'wallet') { + if (global.mode === 'wallet') { log.info('Starting in Wallet mode'); global.interfaceAppUrl = (Settings.inProductionMode) @@ -109,14 +73,12 @@ async function init() { global.interfaceAppUrl = global.interfacePopupsUrl = url; } - // prevent crashes and close gracefully process.on('uncaughtException', (error) => { log.error('UNCAUGHT EXCEPTION', error); store.dispatch(quitApp()); }); - // Quit when all windows are closed. app.on('window-all-closed', () => { store.dispatch(quitApp()); @@ -228,8 +190,7 @@ async function init() { // require('./customProtocols.js'); // change to user language now that global.config object is ready - i18n.changeLanguage(Settings.language); - store.dispatch({ type: 'SETTINGS_I18N::SET', payload: { i18n: Settings.language } }); + store.dispatch(setLanguageOnMain(Settings.language)); // add menu already here, so we have copy and paste functionality appMenu(); @@ -244,7 +205,7 @@ async function init() { store.dispatch({ type: 'MAIN_WINDOW::CREATE_START' }); // MIST - if (Settings.uiMode === 'mist') { + if (global.mode === 'mist') { mainWindow = Windows.create('main', { primary: true, electronOptions: { @@ -291,7 +252,7 @@ async function init() { splashWindow = Windows.create('splash', { primary: true, - url: `${global.interfacePopupsUrl}#splashScreen_${Settings.uiMode}`, + url: `${global.interfacePopupsUrl}#splashScreen_${global.mode}`, show: true, electronOptions: { width: 400, @@ -420,7 +381,7 @@ async function init() { }) .then(() => { // Wallet shouldn't start Swarm - if (Settings.uiMode === 'wallet') { + if (global.mode === 'wallet') { return Promise.resolve(); } return swarmNode.init(); diff --git a/modules/core/settings/actions.js b/modules/core/settings/actions.js new file mode 100644 index 000000000..4746d1baa --- /dev/null +++ b/modules/core/settings/actions.js @@ -0,0 +1,90 @@ +export function syncFlags(argv) { + return { type: '[MAIN]:CLI_FLAGS:SYNC', payload: { cliFlags: argv } }; +} + +export function syncBuildConfig(key, value) { + return { + type: '[MAIN]:BUILD_CONFIG:SYNC', + payload: { [key]: value } + }; +} + +export function setLanguage(lang, browserWindow) { + return dispatch => { + dispatch({ type: '[MAIN]:SET_LANGUAGE:START' }); + dispatch(setLanguageOnMain(lang)); + dispatch(setLanguageOnClient(lang, browserWindow)); + dispatch(setAcceptLanguageHeader(lang, browserWindow)); + dispatch(resetMenu(lang)); + dispatch({ type: '[MAIN]:SET_LANGUAGE:FINISH' }); + } +} + +export function setLanguageOnMain(lang) { + return dispatch => { + dispatch({ type: '[MAIN]:SET_LANGUAGE_ON_MAIN:START' }); + try { + i18n.changeLanguage(lang.substr(0, 5)); + dispatch({ type: '[MAIN]:SET_LANGUAGE_ON_MAIN:SUCCESS', payload: { i18n: lang } }); + } catch (error) { + dispatch({ type: '[MAIN]:SET_LANGUAGE_ON_MAIN:FAILURE', error }); + } + } +} + +export function setLanguageOnClient(lang, browserWindow) { + return dispatch => { + dispatch({ type: '[MAIN]:SET_LANGUAGE_ON_CLIENT:START' }); + try { + browserWindow.webContents.executeJavaScript( + `TAPi18n.setLanguage("${lang}");` + ); + dispatch({ type: '[MAIN]:SET_LANGUAGE_ON_CLIENT:SUCCESS', payload: { i18n: lang } }); + } catch (error) { + dispatch({ type: '[MAIN]:SET_LANGUAGE_ON_CLIENT:FAILURE', error }); + } + } +} + +export function setAcceptLanguageHeader(lang, browserWindow) { + return dispatch => { + dispatch({ type: '[MAIN]:SET_ACCEPT_LANGUAGE_HEADER:START' }); + try { + const session = browserWindow.webContents.session; + session.setUserAgent(session.getUserAgent(), lang); + dispatch({ type: '[MAIN]:SET_ACCEPT_LANGUAGE_HEADER:SUCCESS' }); + } catch (error) { + dispatch({ type: '[MAIN]:SET_ACCEPT_LANGUAGE_HEADER:FAILURE', error }); + } + } +} + +export function resetMenu(lang) { + return dispatch => { + dispatch({ type: '[MAIN]:RESET_MENU:START' }); + try { + const Settings = require('../../settings'); + Settings.language = lang; + + const appMenu = require('../../menuItems'); + appMenu(global.webviews); + + dispatch({ type: '[MAIN]:RESET_MENU:SUCCESS' }); + } catch (error) { + dispatch({ type: '[MAIN]:RESET_MENU:FAILURE', error }); + } + } +} + +export function getLanguage(event) { + return (dispatch, getState) => { + dispatch({ type: '[MAIN]:GET_LANGUAGE:START' }); + try { + const i18n = getState().settings.i18n; + event.returnValue = i18n; + dispatch({ type: '[MAIN]:GET_LANGUAGE:SUCCESS', payload: { i18n } }); + } catch (error) { + dispatch({ type: '[MAIN]:GET_LANGUAGE:FAILURE', error }); + } + } +} diff --git a/modules/core/settings/reducer.js b/modules/core/settings/reducer.js index e747d6184..ddc12da03 100644 --- a/modules/core/settings/reducer.js +++ b/modules/core/settings/reducer.js @@ -1,20 +1,19 @@ -const initialState = { +export const initialState = { appVersion: '', autoTestMode: false, dbInit: false, dbSync: false, - dirname: '', - gpuBlacklist: false, + ignoreGpuBlacklist: false, i18n: '', ipcProviderBackendInit: false, mining: false, productionMode: null, protocols: [], rpcMode: '', - settingsInit: false, swarmInit: false, uiMode: '', updateCheckerRan: false, + cliFlags: {} }; const settings = (state = initialState, action) => { @@ -27,25 +26,18 @@ const settings = (state = initialState, action) => { return Object.assign({}, state, { protocols: state.protocols.concat(action.payload.protocol) }); - case 'SETTINGS::INIT_FINISH': - return Object.assign({}, state, { settingsInit: true }); - case 'SETTINGS_APP_VERSION::SET': - return Object.assign({}, state, { appVersion: action.payload.appVersion }); - case 'SETTINGS_GPU_BLACKLIST::SET': - return Object.assign({}, state, { gpuBlacklist: true }); - case 'SETTINGS_AUTO_TEST_MODE::SET': + case '[MAIN]:BUILD_CONFIG:SYNC': + const key = Object.keys(action.payload)[0]; + return Object.assign({}, state, { [key]: action.payload[key] }); + case '[MAIN]:IGNORE_GPU_BLACKLIST:SET': + return Object.assign({}, state, { ignoreGpuBlacklist: true }); + case '[MAIN]:TEST_MODE:SET': return Object.assign({}, state, { autoTestMode: true }); - case 'SETTINGS_PRODUCTION_MODE::SET': - return Object.assign({}, state, { productionMode: action.payload.productionMode }); - case 'SETTINGS_RPC_MODE::SET': - return Object.assign({}, state, { rpcMode: action.payload.rpcMode }); case 'SETTINGS_MINING::SET': return Object.assign({}, state, { mining: action.payload.mining }); - case 'SETTINGS_UI_MODE::SET': - return Object.assign({}, state, { uiMode: action.payload.uiMode }); - case 'SETTINGS_DIRNAME::SET': - return Object.assign({}, state, { dirname: action.payload.dirname }); - case 'SETTINGS_I18N::SET': + case '[MAIN]:CLI_FLAGS:SYNC': + return Object.assign({}, state, { cliFlags: action.payload.cliFlags }); + case '[MAIN]:SET_LANGUAGE_ON_MAIN:SUCCESS': return Object.assign({}, state, { i18n: action.payload.i18n }); case 'SWARM::INIT_FINISH': return Object.assign({}, state, { swarmInit: true }); diff --git a/modules/core/store.js b/modules/core/store.js index fe6032185..2df2bf83f 100644 --- a/modules/core/store.js +++ b/modules/core/store.js @@ -1,13 +1,16 @@ import { createStore, applyMiddleware } from 'redux'; -import { app } from 'electron'; +import { electronEnhancer } from 'redux-electron-store'; import { composeWithDevTools } from 'remote-redux-devtools'; -import rootReducer from './rootReducer'; import thunk from 'redux-thunk'; +import { app } from 'electron'; +import rootReducer from './rootReducer'; export default function configureReduxStore() { const store = createStore( rootReducer, - composeWithDevTools(applyMiddleware(thunk)) + composeWithDevTools(applyMiddleware(thunk), electronEnhancer({ + dispatchProxy: a => store.dispatch(a) + })) ); store.subscribe(() => { diff --git a/modules/ipcCommunicator.js b/modules/ipcCommunicator.js index 915520489..3a6892fed 100644 --- a/modules/ipcCommunicator.js +++ b/modules/ipcCommunicator.js @@ -14,6 +14,8 @@ const Settings = require('./settings'); const ethereumNode = require('./ethereumNode.js'); const keyfileRecognizer = require('ethereum-keyfile-recognizer'); +import { getLanguage } from './core/settings/actions'; + const log = logger.create('ipcCommunicator'); require('./abi.js'); @@ -90,18 +92,7 @@ ipc.on('backendAction_windowMessageToOwner', (e, error, value) => { } }); -ipc.on('backendAction_setLanguage', (e) => { - global.i18n.changeLanguage(Settings.language.substr(0, 5), (err) => { - if (!err) { - log.info('Backend language set to: ', global.i18n.language); - appMenu(global.webviews); - } - }); -}); - -ipc.on('backendAction_getLanguage', (e) => { - e.returnValue = Settings.language; -}); +ipc.on('backendAction_getLanguage', (e) => { store.dispatch(getLanguage(e)); }); ipc.on('backendAction_stopWebviewNavigation', (e, id) => { console.log('webcontent ID', id); diff --git a/modules/menuItems.js b/modules/menuItems.js index 4d8b573e4..3ebd5e826 100644 --- a/modules/menuItems.js +++ b/modules/menuItems.js @@ -9,6 +9,8 @@ const ethereumNode = require('./ethereumNode.js'); const swarmNode = require('./swarmNode.js'); const ClientBinaryManager = require('./clientBinaryManager'); +import { setLanguage } from './core/settings/actions'; + // Make easier to return values for specific systems const switchForSystem = function (options) { @@ -310,33 +312,8 @@ let menuTempl = function (webviews) { }); // LANGUAGE (VIEW) - const switchLang = langCode => function (menuItem, browserWindow) { - try { - // update i18next instance in browserWindow (Mist meteor interface) - browserWindow.webContents.executeJavaScript( - `TAPi18n.setLanguage("${langCode}");` - ); - store.dispatch({ type: 'SETTINGS_I18N::SET', payload: { i18n: langCode } }); - - // set Accept_Language header - const session = browserWindow.webContents.session; - session.setUserAgent(session.getUserAgent(), langCode); - - // set navigator.language (dev console only) - // browserWindow.webContents.executeJavaScript( - // `Object.defineProperty(navigator, 'language, { - // get() { return ${langCode}; } - // });` - // ); - - // reload browserWindow to apply language change - // browserWindow.webContents.reload(); - } catch (err) { - log.error(err); - } finally { - Settings.language = langCode; - ipc.emit('backendAction_setLanguage'); - } + const switchLang = langCode => (menuItem, browserWindow) => { + store.dispatch(setLanguage(langCode, browserWindow)); }; const currentLanguage = Settings.language; diff --git a/modules/preloader/mistUI.js b/modules/preloader/mistUI.js index e44e297b0..ee2a1ae89 100644 --- a/modules/preloader/mistUI.js +++ b/modules/preloader/mistUI.js @@ -2,6 +2,22 @@ @module preloader MistUI */ +// Create the client-side Redux store. This store's only purpose +// is to receive actions and keep them in sync with the main store. +const { createStore, compose, applyMiddleware } = require('redux'); +const { electronEnhancer } = require('redux-electron-store'); +const thunk = require('redux-thunk').default; + +window.store = createStore( + () => {}, + compose( + applyMiddleware(thunk), + electronEnhancer({ + dispatchProxy: a => store.dispatch(a) + }) + ) +); + require('./include/common')('mist'); require('./include/web3CurrentProvider.js'); const { ipcRenderer, remote, webFrame } = require('electron'); // eslint-disable-line import/newline-after-import diff --git a/modules/preloader/splashScreen.js b/modules/preloader/splashScreen.js index 1eda72307..98308dfbb 100644 --- a/modules/preloader/splashScreen.js +++ b/modules/preloader/splashScreen.js @@ -7,7 +7,7 @@ require('./include/openExternal.js'); require('./include/setBasePath')('interface'); // set appmenu language -ipcRenderer.send('backendAction_setLanguage'); +ipcRenderer.send('backendAction_getLanguage'); // disable pinch zoom webFrame.setZoomLevelLimits(1, 1); diff --git a/modules/settings.js b/modules/settings.js index b09f77afa..e96886d04 100644 --- a/modules/settings.js +++ b/modules/settings.js @@ -6,6 +6,7 @@ const packageJson = require('../package.json'); const _ = require('./utils/underscore'); const lodash = require('lodash'); +import { syncBuildConfig, syncFlags } from './core/settings/actions'; // try loading in config file const defaultConfig = { @@ -166,12 +167,40 @@ if (argv.nodeOptions && argv.nodeOptions.syncmode) { class Settings { init() { logger.setup(argv); - this._log = logger.create('Settings'); + store.dispatch(syncFlags(argv)); + + // If -v flag provided, log the Mist version and exit + if (argv.version) { + this._log.info(`Mist v${this.appVersion}`); + process.exit(0); + } + + // Some Linux installations require this setting: + if (argv.ignoreGpuBlacklist) { + app.commandLine.appendSwitch('ignore-gpu-blacklist', 'true'); + store.dispatch({ type: '[MAIN]:IGNORE_GPU_BLACKLIST:SET' }); + } + + if (this.inAutoTestMode) { + this._log.info('AUTOMATED TESTING'); + store.dispatch({ type: '[MAIN]:TEST_MODE:SET' }); + } + + this._log.info(`Running in production mode: ${this.inProductionMode}`); + + if (this.rpcMode === 'http') { + this._log.warn('Connecting to a node via HTTP instead of ipcMain. This is less secure!!!!'.toUpperCase()); + } + + store.dispatch(syncBuildConfig('appVersion', packageJson.version)); + store.dispatch(syncBuildConfig('rpcMode', this.rpcMode)); + store.dispatch(syncBuildConfig('productionMode', this.inProductionMode)); + store.dispatch(syncBuildConfig('uiMode', this.uiMode)); } get userDataPath() { - // Application Aupport/Mist + // Application Support/Mist return app.getPath('userData'); } diff --git a/package.json b/package.json index 0a62282fd..03a8c505b 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,9 @@ "postinstall": "cd interface && yarn", "dev:electron": "electron -r babel-register main.js", "dev:meteor": "cd interface && meteor --no-release-check", - "dev:tools": "open http://remotedev.io/local/" + "dev:tools": "open http://remotedev.io/local/", + "test:unit": "mocha --compilers babel-register tests/unit/**/* --watch", + "test:unit:once": "mocha --compilers babel-register tests/unit/**/*" }, "main": "main.js", "dependencies": { @@ -35,6 +37,7 @@ "oboe": "^2.1.3", "os-timesync": "^1.0.7", "redux": "^3.7.2", + "redux-electron-store": "^0.4.1", "redux-thunk": "^2.2.0", "remote-redux-devtools": "^0.5.12", "semver": "^5.1.0", @@ -69,6 +72,7 @@ "json-structure-diff": "^0.0.2", "minimist": "^1.2.0", "mocha": "^3.2.0", + "redux-mock-store": "^1.3.0", "require-dir": "^0.3.2", "run-sequence": "^1.2.1", "semver-compare": "^1.0.0", diff --git a/tests/unit/core/settings/actions.test.js b/tests/unit/core/settings/actions.test.js new file mode 100644 index 000000000..754cb1292 --- /dev/null +++ b/tests/unit/core/settings/actions.test.js @@ -0,0 +1,96 @@ +import { assert } from 'chai'; +import configureMockStore from 'redux-mock-store'; +import thunk from 'redux-thunk'; +import { initialState } from '../../../../modules/core/settings/reducer'; +import rootReducer from '../../../../modules/core/rootReducer'; +import { + getLanguage, + resetMenu, + setAcceptLanguageHeader, + setLanguage, + setLanguageOnClient, + setLanguageOnMain, + syncBuildConfig, + syncFlags, +} from '../../../../modules/core/settings/actions'; + +describe('settings actions:', () => { + describe('synchronous action creators', () => { + it('should handle #syncFlags', () => { + const argv = { mode: 'mist', rpcMode: 'ipc', productionMode: true }; + const action = { + type: '[MAIN]:CLI_FLAGS:SYNC', + payload: { cliFlags: argv } + }; + + assert.deepEqual(syncFlags(argv), action); + }); + + it('should handle #syncBuildConfig', () => { + const appVersion = '1.0.0'; + const action = { + type: '[MAIN]:BUILD_CONFIG:SYNC', + payload: { appVersion } + }; + + assert.deepEqual(syncBuildConfig('appVersion', appVersion), action); + }); + }); + + describe('asynchronous action creators', () => { + const middlewares = [thunk]; + const initMockStore = configureMockStore(middlewares); + const store = initMockStore({ settings: initialState }); + + afterEach(() => store.clearActions()); + + it('should handle #setLanguage', async () => { + await store.dispatch(setLanguage('en', {})); + const actions = store.getActions(); + + assert.equal(actions.length, 10); + assert.equal(actions[0].type, '[MAIN]:SET_LANGUAGE:START'); + assert.equal(actions.slice(-1)[0].type, '[MAIN]:SET_LANGUAGE:FINISH'); + }); + + it('should handle #setLanguageOnMain', async () => { + await store.dispatch(setLanguageOnMain('en')); + const actions = store.getActions(); + + assert.equal(actions.length, 2); + assert.equal(actions[0].type, '[MAIN]:SET_LANGUAGE_ON_MAIN:START'); + }); + + it('should handle #setLanguageOnClient', async () => { + await store.dispatch(setLanguageOnClient('en', {})); + const actions = store.getActions(); + + assert.equal(actions.length, 2); + assert.equal(actions[0].type, '[MAIN]:SET_LANGUAGE_ON_CLIENT:START'); + }); + + it('should handle #setAcceptLanguageHeader', async () => { + await store.dispatch(setAcceptLanguageHeader('en', {})); + const actions = store.getActions(); + + assert.equal(actions.length, 2); + assert.equal(actions[0].type, '[MAIN]:SET_ACCEPT_LANGUAGE_HEADER:START'); + }); + + it('should handle #resetMenu', async () => { + await store.dispatch(resetMenu('en')); + const actions = store.getActions(); + + assert.equal(actions.length, 2); + assert.equal(actions[0].type, '[MAIN]:RESET_MENU:START'); + }); + + it('should handle #getLanguage', async () => { + await store.dispatch(getLanguage({})); + const actions = store.getActions(); + + assert.equal(actions.length, 2); + assert.equal(actions[0].type, '[MAIN]:GET_LANGUAGE:START'); + }); + }); +}); diff --git a/tests/unit/core/settings/reducer.test.js b/tests/unit/core/settings/reducer.test.js new file mode 100644 index 000000000..7ed05c83c --- /dev/null +++ b/tests/unit/core/settings/reducer.test.js @@ -0,0 +1,63 @@ +import { assert } from 'chai'; +import reducer, { initialState } from '../../../../modules/core/settings/reducer'; + +describe('the settings reducer', () => { + it('should return a default initial state', () => { + assert.deepEqual(reducer(undefined, {}), initialState); + }); + + it('should handle the "[MAIN]:BUILD_CONFIG:SYNC" action', () => { + const action = { + type: '[MAIN]:BUILD_CONFIG:SYNC', + payload: { appVersion: '1.0.0' } + }; + const expectedState = Object.assign({}, initialState, { + appVersion: '1.0.0', + }); + + assert.deepEqual(reducer(initialState, action), expectedState); + }); + + it('should handle the "[MAIN]:IGNORE_GPU_BLACKLIST:SET" action', () => { + const action = { type: '[MAIN]:IGNORE_GPU_BLACKLIST:SET' }; + const expectedState = Object.assign({}, initialState, { + ignoreGpuBlacklist: true + }); + + assert.deepEqual(reducer(initialState, action), expectedState); + }); + + it('should handle the "[MAIN]:CLI_FLAGS:SYNC" action', () => { + const action = { + type: '[MAIN]:CLI_FLAGS:SYNC', + payload: { + cliFlags: { + mode: 'mist', + syncmode: 'light', + swarmurl: 'http://localhost:8585' + } + } + }; + const expectedState = Object.assign({}, initialState, { + cliFlags: { + mode: 'mist', + syncmode: 'light', + swarmurl: 'http://localhost:8585' + } + }); + + assert.deepEqual(reducer(initialState, action), expectedState); + }); + + it('should handle the "[MAIN]:SET_LANGUAGE_ON_MAIN:SUCCESS" action', () => { + const action = { + type: '[MAIN]:SET_LANGUAGE_ON_MAIN:SUCCESS', + payload: { i18n: 'de' } + }; + const expectedState = Object.assign({}, initialState, { + i18n: 'de' + }); + + assert.deepEqual(reducer(initialState, action), expectedState); + }); +}); diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 07b84fde1..000000000 --- a/yarn.lock +++ /dev/null @@ -1,5768 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"7zip-bin-linux@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/7zip-bin-linux/-/7zip-bin-linux-1.1.0.tgz#2ca309fd6a2102e18bd81e3a5d91b39db9adab71" - -"7zip-bin-mac@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/7zip-bin-mac/-/7zip-bin-mac-1.0.1.tgz#3e68778bbf0926adc68159427074505d47555c02" - -"7zip-bin-win@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/7zip-bin-win/-/7zip-bin-win-2.1.1.tgz#8acfc28bb34e53a9476b46ae85a97418e6035c20" - -"7zip-bin@^2.0.4": - version "2.2.4" - resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-2.2.4.tgz#5d0a7da759258b7fa59121fddcec7cb65938a85c" - optionalDependencies: - "7zip-bin-linux" "^1.1.0" - "7zip-bin-mac" "^1.0.1" - "7zip-bin-win" "^2.1.1" - -"@types/node@^7.0.18": - version "7.0.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.43.tgz#a187e08495a075f200ca946079c914e1a5fe962c" - -accepts@~1.3.3: - version "1.3.4" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" - dependencies: - mime-types "~2.1.16" - negotiator "0.6.1" - -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" - dependencies: - acorn "^3.0.4" - -acorn@^3.0.4: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - -acorn@^5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.2.tgz#911cb53e036807cf0fa778dc5d370fbd864246d7" - -ajv-keywords@^1.0.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" - -ajv@^4.7.0, ajv@^4.9.1: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" - -ajv@^5.1.0: - version "5.2.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.3.tgz#c06f598778c44c6b161abafe3466b81ad1814ed2" - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - json-schema-traverse "^0.3.0" - json-stable-stringify "^1.0.1" - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - -ansi-align@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-1.1.0.tgz#2f0c1658829739add5ebb15e6b0c6e3423f016ba" - dependencies: - string-width "^1.0.1" - -ansi-escapes@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - -ansi-styles@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" - dependencies: - color-convert "^1.9.0" - -any-promise@^1.0.0, any-promise@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - -archiver-utils@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-1.3.0.tgz#e50b4c09c70bf3d680e32ff1b7994e9f9d895174" - dependencies: - glob "^7.0.0" - graceful-fs "^4.1.0" - lazystream "^1.0.0" - lodash "^4.8.0" - normalize-path "^2.0.0" - readable-stream "^2.0.0" - -archiver@~1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/archiver/-/archiver-1.3.0.tgz#4f2194d6d8f99df3f531e6881f14f15d55faaf22" - dependencies: - archiver-utils "^1.3.0" - async "^2.0.0" - buffer-crc32 "^0.2.1" - glob "^7.0.0" - lodash "^4.8.0" - readable-stream "^2.0.0" - tar-stream "^1.5.0" - walkdir "^0.0.11" - zip-stream "^1.1.0" - -archy@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - -are-we-there-yet@~1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -argparse@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" - dependencies: - sprintf-js "~1.0.2" - -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - dependencies: - arr-flatten "^1.0.1" - -arr-flatten@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - -array-differ@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" - -array-each@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" - -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - -array-slice@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.0.0.tgz#e73034f00dcc1f40876008fd20feae77bd4b7c2f" - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1, array-uniq@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - -asar-electron-builder@^0.13.5: - version "0.13.5" - resolved "https://registry.yarnpkg.com/asar-electron-builder/-/asar-electron-builder-0.13.5.tgz#4ccd4d11fd7c9d3b3cffc782fde3deed9ef91af6" - dependencies: - chromium-pickle-js "^0.2.0" - commander "^2.9.0" - cuint "^0.2.1" - minimatch "^3.0.2" - mkdirp "^0.5.1" - -asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" - -assertion-error@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" - -async-limiter@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" - -async@>=0.1.0, async@^2.0.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" - dependencies: - lodash "^4.14.0" - -async@^0.9.0: - version "0.9.2" - resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - -atob@~1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/atob/-/atob-1.1.3.tgz#95f13629b12c3a51a5d215abdce2aa9f32f80773" - -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - -aws4@^1.2.1, aws4@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" - -babel-code-frame@^6.16.0, babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.0" - debug "^2.6.8" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.7" - slash "^1.0.0" - source-map "^0.5.6" - -babel-generator@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.6" - trim-right "^1.0.1" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-syntax-async-functions@^6.1.4, babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - -babel-plugin-syntax-async-generators@^6.1.4: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" - -babel-plugin-transform-async-to-generator@^6.1.4: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-destructuring@^6.0.2: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-commonjs@^6.0.12: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-parameters@^6.0.2: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.1.4: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.0.2: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-unicode-regex@^6.0.2: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-preset-es2016-node5@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/babel-preset-es2016-node5/-/babel-preset-es2016-node5-1.1.2.tgz#5ec43d2d8bf41d5315804740cc38f0ddeab26986" - dependencies: - babel-plugin-syntax-async-functions "^6.1.4" - babel-plugin-syntax-async-generators "^6.1.4" - babel-plugin-transform-async-to-generator "^6.1.4" - babel-plugin-transform-es2015-destructuring "^6.0.2" - babel-plugin-transform-es2015-modules-commonjs "^6.0.12" - babel-plugin-transform-es2015-parameters "^6.0.2" - babel-plugin-transform-es2015-spread "^6.1.4" - babel-plugin-transform-es2015-sticky-regex "^6.0.2" - babel-plugin-transform-es2015-unicode-regex "^6.0.2" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.22.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-runtime@~6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.10.0" - -babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - -base-64@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" - -base64-js@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978" - -base64-js@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" - -base64-js@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" - -bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" - dependencies: - tweetnacl "^0.14.3" - -beeper@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" - -bignumber.js@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-4.1.0.tgz#db6f14067c140bd46624815a7916c92d9b6c24b1" - -"bignumber.js@git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2": - version "2.0.7" - resolved "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2" - -binary@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" - dependencies: - buffers "~0.1.1" - chainsaw "~0.1.0" - -bindings@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7" - -bip66@^1.1.3: - version "1.1.5" - resolved "https://registry.yarnpkg.com/bip66/-/bip66-1.1.5.tgz#01fa8748785ca70955d5011217d1b3139969ca22" - dependencies: - safe-buffer "^5.0.1" - -bl@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e" - dependencies: - readable-stream "^2.0.5" - -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - dependencies: - inherits "~2.0.0" - -bluebird-lst-c@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/bluebird-lst-c/-/bluebird-lst-c-1.0.6.tgz#81f881d13f9df700f67d577f13480bc32d84bba9" - dependencies: - bluebird "^3.4.7" - -bluebird@^2.9.34: - version "2.11.0" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" - -bluebird@^3.3.4, bluebird@^3.4.7, bluebird@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" - -bn.js@^4.10.0, bn.js@^4.11.3, bn.js@^4.11.6, bn.js@^4.4.0, bn.js@^4.8.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - -body-parser@^1.16.0: - version "1.18.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" - dependencies: - bytes "3.0.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.1" - http-errors "~1.6.2" - iconv-lite "0.4.19" - on-finished "~2.3.0" - qs "6.5.1" - raw-body "2.3.2" - type-is "~1.6.15" - -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - dependencies: - hoek "2.x.x" - -boom@4.x.x: - version "4.3.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" - dependencies: - hoek "4.x.x" - -boom@5.x.x: - version "5.2.0" - resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" - dependencies: - hoek "4.x.x" - -boxen@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-0.6.0.tgz#8364d4248ac34ff0ef1b2f2bf49a6c60ce0d81b6" - dependencies: - ansi-align "^1.1.0" - camelcase "^2.1.0" - chalk "^1.1.1" - cli-boxes "^1.0.0" - filled-array "^1.0.0" - object-assign "^4.0.1" - repeating "^2.0.0" - string-width "^1.0.1" - widest-line "^1.0.0" - -brace-expansion@^1.0.0, brace-expansion@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -brorand@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - -browser-stdout@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" - -browserify-aes@^1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.8.tgz#c8fa3b1b7585bb7ba77c5560b60996ddec6d5309" - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-sha3@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/browserify-sha3/-/browserify-sha3-0.0.1.tgz#3ff34a3006ef15c0fb3567e541b91a2340123d11" - dependencies: - js-sha3 "^0.3.1" - -buffer-crc32@^0.2.1, buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - -buffer-to-arraybuffer@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.2.tgz#d0d80564dc31866a1976515487b3ab620db7c849" - dependencies: - tape "^3.0.3" - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - -buffer@^3.0.1: - version "3.6.0" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-3.6.0.tgz#a72c936f77b96bf52f5f7e7b467180628551defb" - dependencies: - base64-js "0.0.8" - ieee754 "^1.1.4" - isarray "^1.0.0" - -buffer@^5.0.5: - version "5.0.7" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.0.7.tgz#570a290b625cf2603290c1149223d27ccf04db97" - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - -buffered-spawn@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/buffered-spawn/-/buffered-spawn-3.3.2.tgz#97b9846c4e446aa23320b4a94c5209edd32dacbb" - dependencies: - cross-spawn "^4.0.0" - -buffers@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" - -builtin-modules@^1.0.0, builtin-modules@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - dependencies: - callsites "^0.2.0" - -callsites@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase@^2.0.0, camelcase@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" - -capture-stack-trace@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - -chai-as-promised@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-6.0.0.tgz#1a02a433a6f24dafac63b9c96fa1684db1aa8da6" - dependencies: - check-error "^1.0.2" - -chai-string@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/chai-string/-/chai-string-1.4.0.tgz#359140c051d36a4e4b1a5fc6b910152f438a8d49" - -chai@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" - dependencies: - assertion-error "^1.0.1" - deep-eql "^0.1.3" - type-detect "^1.0.0" - -chainsaw@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" - dependencies: - traverse ">=0.3.0 <0.4" - -chalk@*: - version "2.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" - dependencies: - ansi-styles "^3.1.0" - escape-string-regexp "^1.0.5" - supports-color "^4.0.0" - -chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - -chownr@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" - -chromium-pickle-js@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" - -ci-info@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.1.tgz#47b44df118c48d2597b56d342e7e25791060171a" - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -circular-json@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - -cli-boxes@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" - -cli-cursor@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" - dependencies: - restore-cursor "^1.0.1" - -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - dependencies: - restore-cursor "^2.0.0" - -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - -clone-stats@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" - -clone@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" - -clone@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" - -clone@^1.0.0, clone@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" - -co-mocha@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/co-mocha/-/co-mocha-1.2.0.tgz#d9be35a2a2d16f4b1b0e83f6973401ca4b6660af" - dependencies: - co "^4.0.0" - is-generator "^1.0.1" - -co@^4.0.0, co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - -color-convert@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" - dependencies: - color-name "^1.1.1" - -color-convert@~0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-0.5.3.tgz#bdb6c69ce660fadffe0b0007cc447e1b9f7282bd" - -color-name@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" - dependencies: - delayed-stream "~1.0.0" - -commander@2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" - dependencies: - graceful-readlink ">= 1.0.0" - -commander@^2.8.1, commander@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" - -commander@~2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" - dependencies: - graceful-readlink ">= 1.0.0" - -compare-version@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" - -component-emitter@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.0.tgz#ccd113a86388d06482d03de3fc7df98526ba8efe" - -compress-commons@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.2.0.tgz#58587092ef20d37cb58baf000112c9278ff73b9f" - dependencies: - buffer-crc32 "^0.2.1" - crc32-stream "^2.0.0" - normalize-path "^2.0.0" - readable-stream "^2.0.0" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -concat-stream@1.6.0, concat-stream@^1.5.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" - dependencies: - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -configstore@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-2.1.0.tgz#737a3a7036e9886102aa6099e47bb33ab1aba1a1" - dependencies: - dot-prop "^3.0.0" - graceful-fs "^4.1.2" - mkdirp "^0.5.0" - object-assign "^4.0.1" - os-tmpdir "^1.0.0" - osenv "^0.1.0" - uuid "^2.0.1" - write-file-atomic "^1.1.2" - xdg-basedir "^2.0.0" - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - -content-disposition@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" - -content-type@~1.0.2, content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - -convert-source-map@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - -cookie@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" - -core-js@^2.4.0, core-js@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" - -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - -cors@^2.8.1: - version "2.8.4" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.4.tgz#2bd381f2eb201020105cd50ea59da63090694686" - dependencies: - object-assign "^4" - vary "^1" - -crc32-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-2.0.0.tgz#e3cdd3b4df3168dd74e3de3fbbcb7b297fe908f4" - dependencies: - crc "^3.4.4" - readable-stream "^2.0.0" - -crc@^3.4.4: - version "3.5.0" - resolved "https://registry.yarnpkg.com/crc/-/crc-3.5.0.tgz#98b8ba7d489665ba3979f59b21381374101a1964" - -create-error-class@^3.0.0, create-error-class@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" - dependencies: - capture-stack-trace "^1.0.0" - -create-hash@^1.1.0, create-hash@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - ripemd160 "^2.0.0" - sha.js "^2.4.0" - -create-hmac@^1.1.4: - version "1.1.6" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-spawn@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" - dependencies: - lru-cache "^4.0.1" - which "^1.2.9" - -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - dependencies: - boom "2.x.x" - -cryptiles@3.x.x: - version "3.1.2" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" - dependencies: - boom "5.x.x" - -crypto-js@^3.1.4: - version "3.1.8" - resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.1.8.tgz#715f070bf6014f2ae992a98b3929258b713f08d5" - -css-parse@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-2.0.0.tgz#a468ee667c16d81ccf05c58c38d2a97c780dbfd4" - dependencies: - css "^2.0.0" - -css-value@~0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/css-value/-/css-value-0.0.1.tgz#5efd6c2eea5ea1fd6b6ac57ec0427b18452424ea" - -css@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/css/-/css-2.2.1.tgz#73a4c81de85db664d4ee674f7d47085e3b2d55dc" - dependencies: - inherits "^2.0.1" - source-map "^0.1.38" - source-map-resolve "^0.3.0" - urix "^0.1.0" - -cuint@^0.2.1, cuint@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - dependencies: - array-find-index "^1.0.1" - -d@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" - dependencies: - es5-ext "^0.10.9" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - dependencies: - assert-plus "^1.0.0" - -date-format@^0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-0.0.0.tgz#09206863ab070eb459acea5542cbd856b11966b3" - -dateformat@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" - -debug@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" - dependencies: - ms "0.7.1" - -debug@2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" - dependencies: - ms "0.7.2" - -debug@2.6.8: - version "2.6.8" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" - dependencies: - ms "2.0.0" - -debug@2.6.9, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.6.0, debug@^2.6.8: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - dependencies: - ms "2.0.0" - -debug@^0.7.2: - version "0.7.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" - -decamelize@^1.1.1, decamelize@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - -decompress-response@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - dependencies: - mimic-response "^1.0.0" - -decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1" - dependencies: - file-type "^5.2.0" - is-stream "^1.1.0" - tar-stream "^1.5.2" - -decompress-tarbz2@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b" - dependencies: - decompress-tar "^4.1.0" - file-type "^6.1.0" - is-stream "^1.1.0" - seek-bzip "^1.0.5" - unbzip2-stream "^1.0.9" - -decompress-targz@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee" - dependencies: - decompress-tar "^4.1.1" - file-type "^5.2.0" - is-stream "^1.1.0" - -decompress-unzip@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69" - dependencies: - file-type "^3.8.0" - get-stream "^2.2.0" - pify "^2.3.0" - yauzl "^2.4.2" - -decompress@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.0.tgz#7aedd85427e5a92dacfe55674a7c505e96d01f9d" - dependencies: - decompress-tar "^4.0.0" - decompress-tarbz2 "^4.0.0" - decompress-targz "^4.0.0" - decompress-unzip "^4.0.1" - graceful-fs "^4.1.10" - make-dir "^1.0.0" - pify "^2.3.0" - strip-dirs "^2.0.0" - -deep-eql@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" - dependencies: - type-detect "0.1.1" - -deep-equal@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" - -deep-equal@~0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.2.2.tgz#84b745896f34c684e98f2ce0e42abaf43bba017d" - -deep-extend@~0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - -deepmerge@~1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.3.2.tgz#1663691629d4dbfe364fa12a2a4f0aa86aa3a050" - -defaults@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - dependencies: - clone "^1.0.2" - -defined@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-0.0.0.tgz#f35eea7d705e933baf13b2f03b3f83d921403b3e" - -del@^2.0.2, del@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" - dependencies: - globby "^5.0.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - rimraf "^2.2.8" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - -depd@1.1.1, depd@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" - -deprecated@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - -detect-file@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" - dependencies: - fs-exists-sync "^0.1.0" - -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - dependencies: - repeating "^2.0.0" - -dev-null@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/dev-null/-/dev-null-0.1.1.tgz#5a205ce3c2b2ef77b6238d6ba179eb74c6a0e818" - -diff@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" - -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -doctrine@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -dom-walk@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" - -dot-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" - dependencies: - is-obj "^1.0.0" - -drbg.js@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b" - dependencies: - browserify-aes "^1.0.6" - create-hash "^1.1.2" - create-hmac "^1.1.4" - -duplexer2@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" - dependencies: - readable-stream "~1.1.9" - -duplexer2@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - dependencies: - readable-stream "^2.0.2" - -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - -ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" - dependencies: - jsbn "~0.1.0" - -ecstatic@^2.1.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ecstatic/-/ecstatic-2.2.1.tgz#b5087fad439dd9dd49d31e18131454817fe87769" - dependencies: - he "^1.1.1" - mime "^1.2.11" - minimist "^1.1.0" - url-join "^2.0.2" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - -ejs@~2.5.6: - version "2.5.7" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.7.tgz#cc872c168880ae3c7189762fd5ffc00896c9518a" - -electron-builder-core@11.2.1: - version "11.2.1" - resolved "https://registry.yarnpkg.com/electron-builder-core/-/electron-builder-core-11.2.1.tgz#1dca8c1a1cee8b51750b7708a04913aeffacf8a8" - -electron-builder-http@12.3.0, electron-builder-http@~12.3.0: - version "12.3.0" - resolved "https://registry.yarnpkg.com/electron-builder-http/-/electron-builder-http-12.3.0.tgz#5a75e3683e4c1a8ef093f353d3298342c875d2c0" - dependencies: - debug "2.6.0" - fs-extra-p "^3.1.0" - -electron-builder-util@12.3.0: - version "12.3.0" - resolved "https://registry.yarnpkg.com/electron-builder-util/-/electron-builder-util-12.3.0.tgz#50c54d1c8c415a0cb1d2722edaa836312535d59d" - dependencies: - "7zip-bin" "^2.0.4" - bluebird-lst-c "^1.0.6" - chalk "^1.1.3" - debug "2.6.0" - electron-builder-http "~12.3.0" - fs-extra-p "^3.1.0" - is-ci "^1.0.10" - node-emoji "^1.5.1" - source-map-support "^0.4.11" - stat-mode "^0.2.2" - -electron-builder@^12.2.2: - version "12.3.1" - resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-12.3.1.tgz#db82b8c1830e6a121a98046bc8d26c315b4890a2" - dependencies: - "7zip-bin" "^2.0.4" - asar-electron-builder "^0.13.5" - bluebird-lst-c "^1.0.6" - chalk "^1.1.3" - chromium-pickle-js "^0.2.0" - cuint "^0.2.2" - electron-builder-core "11.2.1" - electron-builder-http "12.3.0" - electron-builder-util "12.3.0" - electron-download-tf "3.2.0" - electron-macos-sign "~1.5.0" - fs-extra-p "^3.1.0" - hosted-git-info "^2.1.5" - ini "^1.3.4" - is-ci "^1.0.10" - isbinaryfile "^3.0.2" - js-yaml "^3.7.0" - mime "^1.3.4" - minimatch "^3.0.3" - normalize-package-data "^2.3.5" - parse-color "^1.0.0" - plist "^2.0.1" - progress "^1.1.8" - sanitize-filename "^1.6.1" - semver "^5.3.0" - tunnel-agent "^0.4.3" - update-notifier "^1.0.3" - uuid-1345 "^0.99.6" - yargs "^6.6.0" - -electron-chromedriver@~1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/electron-chromedriver/-/electron-chromedriver-1.7.1.tgz#008c97976007aa4eb18491ee095e94d17ee47610" - dependencies: - electron-download "^4.1.0" - extract-zip "^1.6.5" - -electron-download-tf@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/electron-download-tf/-/electron-download-tf-3.2.0.tgz#690443d2e7d068f000358f86b9d504303711ad10" - dependencies: - debug "^2.6.0" - fs-extra "^2.0.0" - minimist "^1.2.0" - nugget "^2.0.1" - path-exists "^3.0.0" - rc "^1.1.6" - semver "^5.3.0" - sumchecker "^2.0.1" - -electron-download@^3.0.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/electron-download/-/electron-download-3.3.0.tgz#2cfd54d6966c019c4d49ad65fbe65cc9cdef68c8" - dependencies: - debug "^2.2.0" - fs-extra "^0.30.0" - home-path "^1.0.1" - minimist "^1.2.0" - nugget "^2.0.0" - path-exists "^2.1.0" - rc "^1.1.2" - semver "^5.3.0" - sumchecker "^1.2.0" - -electron-download@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/electron-download/-/electron-download-4.1.0.tgz#bf932c746f2f87ffcc09d1dd472f2ff6b9187845" - dependencies: - debug "^2.2.0" - env-paths "^1.0.0" - fs-extra "^2.0.0" - minimist "^1.2.0" - nugget "^2.0.0" - path-exists "^3.0.0" - rc "^1.1.2" - semver "^5.3.0" - sumchecker "^2.0.1" - -electron-macos-sign@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/electron-macos-sign/-/electron-macos-sign-1.5.0.tgz#fe3a8acb755b5f568f1fe144e9e66cee44019448" - dependencies: - bluebird "^3.4.7" - compare-version "^0.1.2" - debug "^2.6.0" - isbinaryfile "^3.0.2" - plist "^2.0.1" - -electron-window-state@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/electron-window-state/-/electron-window-state-4.1.1.tgz#6b34fdc31b38514dfec8b7c8f7b5d4addb67632d" - dependencies: - deep-equal "^1.0.1" - jsonfile "^2.2.3" - mkdirp "^0.5.1" - -electron@1.7.8: - version "1.7.8" - resolved "https://registry.yarnpkg.com/electron/-/electron-1.7.8.tgz#27b791a6895171a7d52991b99442cdbd10a3539d" - dependencies: - "@types/node" "^7.0.18" - electron-download "^3.0.1" - extract-zip "^1.0.3" - -elliptic@^6.2.3, elliptic@^6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" - -encodeurl@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" - -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" - dependencies: - once "^1.4.0" - -end-of-stream@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" - dependencies: - once "~1.3.0" - -env-paths@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0" - -error-ex@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" - dependencies: - is-arrayish "^0.2.1" - -es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.30" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.30.tgz#7141a16836697dbabfaaaeee41495ce29f52c939" - dependencies: - es6-iterator "2" - es6-symbol "~3.1" - -es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512" - dependencies: - d "1" - es5-ext "^0.10.14" - es6-symbol "^3.1" - -es6-map@^0.1.3: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-set "~0.1.5" - es6-symbol "~3.1.1" - event-emitter "~0.3.5" - -es6-promise@^4.0.5: - version "4.1.1" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.1.1.tgz#8811e90915d9a0dba36274f0b242dbda78f9c92a" - -es6-set@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-symbol "3.1.1" - event-emitter "~0.3.5" - -es6-symbol@3.1.1, es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" - dependencies: - d "1" - es5-ext "~0.10.14" - -es6-weak-map@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" - dependencies: - d "1" - es5-ext "^0.10.14" - es6-iterator "^2.0.1" - es6-symbol "^3.1.1" - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - -escope@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" - dependencies: - es6-map "^0.1.3" - es6-weak-map "^2.0.1" - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-config-airbnb-base@^11.0.1: - version "11.3.2" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-11.3.2.tgz#8703b11abe3c88ac7ec2b745b7fdf52e00ae680a" - dependencies: - eslint-restricted-globals "^0.1.1" - -eslint-import-resolver-node@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.1.tgz#4422574cde66a9a7b099938ee4d508a199e0e3cc" - dependencies: - debug "^2.6.8" - resolve "^1.2.0" - -eslint-module-utils@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz#abaec824177613b8a95b299639e1b6facf473449" - dependencies: - debug "^2.6.8" - pkg-dir "^1.0.0" - -eslint-plugin-import@^2.2.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.7.0.tgz#21de33380b9efb55f5ef6d2e210ec0e07e7fa69f" - dependencies: - builtin-modules "^1.1.1" - contains-path "^0.1.0" - debug "^2.6.8" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.1" - eslint-module-utils "^2.1.1" - has "^1.0.1" - lodash.cond "^4.3.0" - minimatch "^3.0.3" - read-pkg-up "^2.0.0" - -eslint-restricted-globals@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz#35f0d5cbc64c2e3ed62e93b4b1a7af05ba7ed4d7" - -eslint@^3.14.1: - version "3.19.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc" - dependencies: - babel-code-frame "^6.16.0" - chalk "^1.1.3" - concat-stream "^1.5.2" - debug "^2.1.1" - doctrine "^2.0.0" - escope "^3.6.0" - espree "^3.4.0" - esquery "^1.0.0" - estraverse "^4.2.0" - esutils "^2.0.2" - file-entry-cache "^2.0.0" - glob "^7.0.3" - globals "^9.14.0" - ignore "^3.2.0" - imurmurhash "^0.1.4" - inquirer "^0.12.0" - is-my-json-valid "^2.10.0" - is-resolvable "^1.0.0" - js-yaml "^3.5.1" - json-stable-stringify "^1.0.0" - levn "^0.3.0" - lodash "^4.0.0" - mkdirp "^0.5.0" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.1" - pluralize "^1.2.1" - progress "^1.1.8" - require-uncached "^1.0.2" - shelljs "^0.7.5" - strip-bom "^3.0.0" - strip-json-comments "~2.0.1" - table "^3.7.8" - text-table "~0.2.0" - user-home "^2.0.0" - -espree@^3.4.0: - version "3.5.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.1.tgz#0c988b8ab46db53100a1954ae4ba995ddd27d87e" - dependencies: - acorn "^5.1.1" - acorn-jsx "^3.0.0" - -esprima@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" - -esquery@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" - dependencies: - estraverse "^4.0.0" - -esrecurse@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" - dependencies: - estraverse "^4.1.0" - object-assign "^4.0.1" - -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - -esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - -etag@~1.8.0, etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - -eth-lib@^0.1.26: - version "0.1.27" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.27.tgz#f0b0fd144f865d2d6bf8257a40004f2e75ca1dd6" - dependencies: - bn.js "^4.11.6" - elliptic "^6.4.0" - keccakjs "^0.2.1" - nano-json-stream-parser "^0.1.2" - servify "^0.1.12" - ws "^3.0.0" - xhr-request-promise "^0.1.2" - -ethereum-client-binaries@^1.6.1: - version "1.6.2" - resolved "https://registry.yarnpkg.com/ethereum-client-binaries/-/ethereum-client-binaries-1.6.2.tgz#7fa65f655f870643ef5e202ee9901e4179d3a13d" - dependencies: - buffered-spawn "^3.3.2" - got "^6.5.0" - lodash.get "^4.4.2" - lodash.isempty "^4.4.0" - lodash.values "^4.3.0" - mkdirp "^0.5.1" - node-unzip-2 "^0.2.1" - tmp "0.0.29" - -ethereum-keyfile-recognizer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ethereum-keyfile-recognizer/-/ethereum-keyfile-recognizer-1.0.2.tgz#c0315f91c77e076621e9f6b5f8099fd370f7a11d" - dependencies: - json-structure-diff "0.0.2" - underscore "^1.8.3" - -ethereumjs-abi@^0.6.3: - version "0.6.4" - resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.4.tgz#9ba1bb056492d00c27279f6eccd4d58275912c1a" - dependencies: - bn.js "^4.10.0" - ethereumjs-util "^4.3.0" - -ethereumjs-util@^4.3.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz#3e9428b317eebda3d7260d854fddda954b1f1bc6" - dependencies: - bn.js "^4.8.0" - create-hash "^1.1.2" - keccakjs "^0.2.0" - rlp "^2.0.0" - secp256k1 "^3.0.1" - -event-emitter@~0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - dependencies: - d "1" - es5-ext "~0.10.14" - -evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -exit-hook@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" - -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - dependencies: - is-posix-bracket "^0.1.0" - -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - dependencies: - fill-range "^2.1.0" - -expand-template@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-1.1.0.tgz#e09efba977bf98f9ee0ed25abd0c692e02aec3fc" - -expand-tilde@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" - dependencies: - os-homedir "^1.0.1" - -expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - dependencies: - homedir-polyfill "^1.0.1" - -express@^4.14.0, express@^4.15.3: - version "4.15.5" - resolved "https://registry.yarnpkg.com/express/-/express-4.15.5.tgz#670235ca9598890a5ae8170b83db722b842ed927" - dependencies: - accepts "~1.3.3" - array-flatten "1.1.1" - content-disposition "0.5.2" - content-type "~1.0.2" - cookie "0.3.1" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.1" - encodeurl "~1.0.1" - escape-html "~1.0.3" - etag "~1.8.0" - finalhandler "~1.0.6" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.1" - path-to-regexp "0.1.7" - proxy-addr "~1.1.5" - qs "6.5.0" - range-parser "~1.2.0" - send "0.15.6" - serve-static "1.12.6" - setprototypeof "1.0.3" - statuses "~1.3.1" - type-is "~1.6.15" - utils-merge "1.0.0" - vary "~1.1.1" - -extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" - -external-editor@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.5.tgz#52c249a3981b9ba187c7cacf5beb50bf1d91a6bc" - dependencies: - iconv-lite "^0.4.17" - jschardet "^1.4.2" - tmp "^0.0.33" - -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - dependencies: - is-extglob "^1.0.0" - -extract-zip@^1.0.3, extract-zip@^1.6.5: - version "1.6.5" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.5.tgz#99a06735b6ea20ea9b705d779acffcc87cff0440" - dependencies: - concat-stream "1.6.0" - debug "2.2.0" - mkdirp "0.5.0" - yauzl "2.4.1" - -extsprintf@1.3.0, extsprintf@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - -fancy-log@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948" - dependencies: - chalk "^1.1.1" - time-stamp "^1.0.0" - -fast-deep-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" - -fast-levenshtein@~2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - -fd-slicer@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" - dependencies: - pend "~1.2.0" - -figures@^1.3.5: - version "1.7.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" - dependencies: - escape-string-regexp "^1.0.5" - object-assign "^4.1.0" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" - dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" - -file-type@^3.8.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" - -file-type@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6" - -file-type@^6.1.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919" - -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - -fill-range@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^1.1.3" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - -filled-array@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/filled-array/-/filled-array-1.1.0.tgz#c3c4f6c663b923459a9aa29912d2d031f1507f84" - -finalhandler@~1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.6.tgz#007aea33d1a4d3e42017f624848ad58d212f814f" - dependencies: - debug "2.6.9" - encodeurl "~1.0.1" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.2" - statuses "~1.3.1" - unpipe "~1.0.0" - -find-index@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - dependencies: - locate-path "^2.0.0" - -findup-sync@^0.4.2: - version "0.4.3" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" - dependencies: - detect-file "^0.1.0" - is-glob "^2.0.1" - micromatch "^2.3.7" - resolve-dir "^0.1.0" - -fined@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.0.tgz#b37dc844b76a2f5e7081e884f7c0ae344f153476" - dependencies: - expand-tilde "^2.0.2" - is-plain-object "^2.0.3" - object.defaults "^1.1.0" - object.pick "^1.2.0" - parse-filepath "^1.0.1" - -first-chunk-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" - -flagged-respawn@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5" - -flat-cache@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" - dependencies: - circular-json "^0.3.1" - del "^2.0.2" - graceful-fs "^4.1.2" - write "^0.2.1" - -for-each@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4" - dependencies: - is-function "~1.0.0" - -for-in@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - dependencies: - for-in "^1.0.1" - -for-own@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" - dependencies: - for-in "^1.0.1" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - -form-data@~2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" - -form-data@~2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" - -forwarded@~0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - -fs-exists-sync@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" - -fs-extra-p@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/fs-extra-p/-/fs-extra-p-3.1.0.tgz#eddf7bb8d9385d79014decb21f45b1d0c57900d3" - dependencies: - bluebird-lst-c "^1.0.6" - fs-extra "^2.0.0" - -fs-extra@^0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - -fs-extra@^2.0.0, fs-extra@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz#046c70163cef9aad46b0e4a7fa467fb22d71de35" - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - -fs-promise@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/fs-promise/-/fs-promise-2.0.3.tgz#f64e4f854bcf689aa8bddcba268916db3db46854" - dependencies: - any-promise "^1.3.0" - fs-extra "^2.0.0" - mz "^2.6.0" - thenify-all "^1.6.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - -fstream@^1.0.2, fstream@^1.0.8: - version "1.0.11" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - -fstream@~0.1.21: - version "0.1.31" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-0.1.31.tgz#7337f058fbbbbefa8c9f561a28cab0849202c988" - dependencies: - graceful-fs "~3.0.2" - inherits "~2.0.0" - mkdirp "0.5" - rimraf "2" - -function-bind@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -gaze@^0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" - dependencies: - globule "~0.1.0" - -gaze@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105" - dependencies: - globule "^1.0.0" - -generate-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" - -generate-object-property@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" - dependencies: - is-property "^1.0.0" - -genomatic@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/genomatic/-/genomatic-1.0.0.tgz#6884edca1e4652adff3baa89356728308aa9aa0f" - -get-caller-file@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" - -get-params@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/get-params/-/get-params-0.1.2.tgz#bae0dfaba588a0c60d7834c0d8dc2ff60eeef2fe" - -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - -get-stream@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" - dependencies: - object-assign "^4.0.1" - pinkie-promise "^2.0.0" - -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - -geth-private@^1.3.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/geth-private/-/geth-private-1.7.0.tgz#326eae709fe12cf3545d0bcda7a3fa2c43adc7c8" - dependencies: - bluebird "^3.3.4" - chalk "^1.1.3" - shelljs "^0.6.0" - tmp "0.0.28" - which "^1.2.4" - yargs "^4.3.2" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - dependencies: - assert-plus "^1.0.0" - -gh-release-assets@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/gh-release-assets/-/gh-release-assets-1.1.1.tgz#1cb91c8d2d58cee76661cd54fd9c2639e4a7401a" - dependencies: - async "^0.9.0" - mime "^1.3.4" - progress-stream "^2.0.0" - request "^2.55.0" - util-extend "^1.0.1" - -github-from-package@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" - -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - dependencies: - is-glob "^2.0.0" - -glob-stream@^3.1.5: - version "3.1.18" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" - dependencies: - glob "^4.3.1" - glob2base "^0.0.12" - minimatch "^2.0.1" - ordered-read-streams "^0.1.0" - through2 "^0.6.1" - unique-stream "^1.0.0" - -glob-watcher@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" - dependencies: - gaze "^0.5.1" - -glob2base@^0.0.12: - version "0.0.12" - resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" - dependencies: - find-index "^0.1.1" - -glob@7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.2" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^4.3.1: - version "4.5.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "^2.0.1" - once "^1.3.0" - -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@~7.1.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@~3.1.21: - version "3.1.21" - resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" - dependencies: - graceful-fs "~1.2.0" - inherits "1" - minimatch "~0.2.11" - -glob@~3.2.9: - version "3.2.11" - resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" - dependencies: - inherits "2" - minimatch "0.3" - -global-modules@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" - dependencies: - global-prefix "^0.1.4" - is-windows "^0.2.0" - -global-prefix@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" - dependencies: - homedir-polyfill "^1.0.0" - ini "^1.3.4" - is-windows "^0.2.0" - which "^1.2.12" - -global@~4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" - dependencies: - min-document "^2.19.0" - process "~0.5.1" - -globals@^9.14.0, globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" - dependencies: - array-union "^1.0.1" - arrify "^1.0.0" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -globule@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.0.tgz#1dc49c6822dd9e8a2fa00ba2a295006e8664bd09" - dependencies: - glob "~7.1.1" - lodash "~4.17.4" - minimatch "~3.0.2" - -globule@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" - dependencies: - glob "~3.1.21" - lodash "~1.0.1" - minimatch "~0.2.11" - -glogg@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5" - dependencies: - sparkles "^1.0.0" - -got@^5.0.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35" - dependencies: - create-error-class "^3.0.1" - duplexer2 "^0.1.4" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - node-status-codes "^1.0.0" - object-assign "^4.0.1" - parse-json "^2.1.0" - pinkie-promise "^2.0.0" - read-all-stream "^3.0.0" - readable-stream "^2.0.5" - timed-out "^3.0.0" - unzip-response "^1.0.2" - url-parse-lax "^1.0.0" - -got@^6.5.0, got@^6.7.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" - dependencies: - create-error-class "^3.0.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - unzip-response "^2.0.1" - url-parse-lax "^1.0.0" - -got@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" - dependencies: - decompress-response "^3.2.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-plain-obj "^1.1.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - p-cancelable "^0.3.0" - p-timeout "^1.1.1" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - url-parse-lax "^1.0.0" - url-to-options "^1.0.1" - -graceful-fs@^3.0.0, graceful-fs@~3.0.2: - version "3.0.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" - dependencies: - natives "^1.1.0" - -graceful-fs@^4.1.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - -graceful-fs@~1.2.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" - -"graceful-readlink@>= 1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" - -growl@1.9.2: - version "1.9.2" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" - -gulp-babel@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/gulp-babel/-/gulp-babel-7.0.0.tgz#7b93c975159f7a0553e4263b4a55100ccc239b28" - dependencies: - gulp-util "^3.0.0" - replace-ext "0.0.1" - through2 "^2.0.0" - vinyl-sourcemaps-apply "^0.2.0" - -gulp-spawn-mocha@^3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/gulp-spawn-mocha/-/gulp-spawn-mocha-3.3.1.tgz#a830221b55503a2fceba196fcfac08c6df3a01b0" - dependencies: - gulp-util "~3.0.7" - lodash "^4.11.1" - through "~2.3.4" - -gulp-util@*, gulp-util@^3.0.0, gulp-util@~3.0.7: - version "3.0.8" - resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" - dependencies: - array-differ "^1.0.0" - array-uniq "^1.0.2" - beeper "^1.0.0" - chalk "^1.0.0" - dateformat "^2.0.0" - fancy-log "^1.1.0" - gulplog "^1.0.0" - has-gulplog "^0.1.0" - lodash._reescape "^3.0.0" - lodash._reevaluate "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.template "^3.0.0" - minimist "^1.1.0" - multipipe "^0.1.2" - object-assign "^3.0.0" - replace-ext "0.0.1" - through2 "^2.0.0" - vinyl "^0.5.0" - -gulp@^3.9.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" - dependencies: - archy "^1.0.0" - chalk "^1.0.0" - deprecated "^0.0.1" - gulp-util "^3.0.0" - interpret "^1.0.0" - liftoff "^2.1.0" - minimist "^1.1.0" - orchestrator "^0.3.0" - pretty-hrtime "^1.0.0" - semver "^4.1.0" - tildify "^1.0.0" - v8flags "^2.0.2" - vinyl-fs "^0.3.0" - -gulplog@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" - dependencies: - glogg "^1.0.0" - -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - -har-validator@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" - dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" - -har-validator@~5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" - dependencies: - ajv "^5.1.0" - har-schema "^2.0.0" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - dependencies: - ansi-regex "^2.0.0" - -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - -has-gulplog@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" - dependencies: - sparkles "^1.0.0" - -has-symbol-support-x@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.1.tgz#66ec2e377e0c7d7ccedb07a3a84d77510ff1bc4c" - -has-to-string-tag-x@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" - dependencies: - has-symbol-support-x "^1.4.1" - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - -has@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" - dependencies: - function-bind "^1.0.2" - -hash-base@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" - dependencies: - inherits "^2.0.1" - -hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.0" - -hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" - -hawk@~6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" - dependencies: - boom "4.x.x" - cryptiles "3.x.x" - hoek "4.x.x" - sntp "2.x.x" - -he@1.1.1, he@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" - -hmac-drbg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - -hoek@4.x.x: - version "4.2.0" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" - -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - -home-path@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/home-path/-/home-path-1.0.5.tgz#788b29815b12d53bacf575648476e6f9041d133f" - -homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" - dependencies: - parse-passwd "^1.0.0" - -hosted-git-info@^2.1.4, hosted-git-info@^2.1.5: - version "2.5.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" - -http-errors@1.6.2, http-errors@~1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" - dependencies: - depd "1.1.1" - inherits "2.0.3" - setprototypeof "1.0.3" - statuses ">= 1.3.1 < 2" - -http-https@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" - -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" - dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -i18next@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-7.2.3.tgz#a6c220ac1c8240ff1078aa9bc997fd449e052dc7" - -iconv-lite@0.4.19, iconv-lite@^0.4.17: - version "0.4.19" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" - -ieee754@^1.1.4: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" - -ignore@^3.2.0: - version "3.3.5" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.5.tgz#c4e715455f6073a8d7e5dae72d2fc9d71663dba6" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - dependencies: - repeating "^2.0.0" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" - -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -ini@^1.3.4, ini@~1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" - -inquirer@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" - dependencies: - ansi-escapes "^1.1.0" - ansi-regex "^2.0.0" - chalk "^1.0.0" - cli-cursor "^1.0.1" - cli-width "^2.0.0" - figures "^1.3.5" - lodash "^4.3.0" - readline2 "^1.0.1" - run-async "^0.1.0" - rx-lite "^3.1.2" - string-width "^1.0.1" - strip-ansi "^3.0.0" - through "^2.3.6" - -inquirer@~3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.0.6.tgz#e04aaa9d05b7a3cb9b0f407d04375f0447190347" - dependencies: - ansi-escapes "^1.1.0" - chalk "^1.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.0.1" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rx "^4.1.0" - string-width "^2.0.0" - strip-ansi "^3.0.0" - through "^2.3.6" - -interpret@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.4.tgz#820cdd588b868ffb191a809506d6c9c8f212b1b0" - -invariant@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" - dependencies: - loose-envify "^1.0.0" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - -ipaddr.js@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.4.0.tgz#296aca878a821816e5b85d0a285a99bcff4582f0" - -is-absolute@^0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb" - dependencies: - is-relative "^0.2.1" - is-windows "^0.2.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - -is-buffer@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" - -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - dependencies: - builtin-modules "^1.0.0" - -is-ci@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" - dependencies: - ci-info "^1.0.0" - -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - dependencies: - is-primitive "^2.0.0" - -is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - -is-function@^1.0.1, is-function@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" - -is-generator@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-generator/-/is-generator-1.0.3.tgz#c14c21057ed36e328db80347966c693f886389f3" - -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - dependencies: - is-extglob "^1.0.0" - -is-my-json-valid@^2.10.0: - version "2.16.1" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz#5a846777e2c2620d1e69104e5d3a03b1f6088f11" - dependencies: - generate-function "^2.0.0" - generate-object-property "^1.1.0" - jsonpointer "^4.0.0" - xtend "^4.0.0" - -is-natural-number@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" - -is-npm@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" - -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - dependencies: - kind-of "^3.0.2" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - dependencies: - kind-of "^3.0.2" - -is-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - -is-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" - -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - -is-path-in-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" - dependencies: - is-path-inside "^1.0.0" - -is-path-inside@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" - dependencies: - path-is-inside "^1.0.1" - -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - -is-plain-object@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - dependencies: - isobject "^3.0.1" - -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - -is-property@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" - -is-redirect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" - -is-relative@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5" - dependencies: - is-unc-path "^0.1.1" - -is-resolvable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" - dependencies: - tryit "^1.0.1" - -is-retry-allowed@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" - -is-stream@^1.0.0, is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - -is-unc-path@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-0.1.2.tgz#6ab053a72573c10250ff416a3814c35178af39b9" - dependencies: - unc-path-regex "^0.1.0" - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - -is-windows@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - -isbinaryfile@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - -isurl@^1.0.0-alpha5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" - dependencies: - has-to-string-tag-x "^1.2.0" - is-object "^1.0.1" - -js-sha3@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.3.1.tgz#86122802142f0828502a0d1dee1d95e253bb0243" - -js-tokens@^3.0.0, js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - -js-yaml@^3.5.1, js-yaml@^3.7.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsan@^3.1.0, jsan@^3.1.5: - version "3.1.9" - resolved "https://registry.yarnpkg.com/jsan/-/jsan-3.1.9.tgz#2705676c1058f0a7d9ac266ad036a5769cfa7c96" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - -jschardet@^1.4.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.5.1.tgz#c519f629f86b3a5bedba58a88d311309eec097f9" - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - -json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - -json-structure-diff@0.0.2, json-structure-diff@^0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/json-structure-diff/-/json-structure-diff-0.0.2.tgz#838277f5c0a9562981b9a2af86fe5e90c131b0b3" - -json3@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" - -json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - -jsonfile@^2.1.0, jsonfile@^2.2.3: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - -jsonpointer@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -keccakjs@^0.2.0, keccakjs@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/keccakjs/-/keccakjs-0.2.1.tgz#1d633af907ef305bbf9f2fa616d56c44561dfa4d" - dependencies: - browserify-sha3 "^0.0.1" - sha3 "^1.1.0" - -kind-of@^3.0.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - dependencies: - is-buffer "^1.1.5" - -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - optionalDependencies: - graceful-fs "^4.1.9" - -latest-version@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-2.0.0.tgz#56f8d6139620847b8017f8f1f4d78e211324168b" - dependencies: - package-json "^2.0.0" - -lazy-req@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-1.1.0.tgz#bdaebead30f8d824039ce0ce149d4daa07ba1fac" - -lazystream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" - dependencies: - readable-stream "^2.0.5" - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - dependencies: - invert-kv "^1.0.0" - -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -liftoff@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.3.0.tgz#a98f2ff67183d8ba7cfaca10548bd7ff0550b385" - dependencies: - extend "^3.0.0" - findup-sync "^0.4.2" - fined "^1.0.1" - flagged-respawn "^0.3.2" - lodash.isplainobject "^4.0.4" - lodash.isstring "^4.0.1" - lodash.mapvalues "^4.4.0" - rechoir "^0.6.2" - resolve "^1.1.7" - -linked-list@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/linked-list/-/linked-list-0.1.0.tgz#798b0ff97d1b92a4fd08480f55aea4e9d49d37bf" - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -lodash-es@^4.2.1: - version "4.17.4" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.4.tgz#dcc1d7552e150a0640073ba9cb31d70f032950e7" - -lodash._baseassign@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" - dependencies: - lodash._basecopy "^3.0.0" - lodash.keys "^3.0.0" - -lodash._basecopy@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" - -lodash._basecreate@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" - -lodash._basetostring@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" - -lodash._basevalues@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" - -lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - -lodash._isiterateecall@^3.0.0: - version "3.0.9" - resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" - -lodash._reescape@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" - -lodash._reevaluate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" - -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - -lodash._root@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" - -lodash.assign@^4.0.3, lodash.assign@^4.0.6: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - -lodash.cond@^4.3.0: - version "4.5.2" - resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" - -lodash.create@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" - dependencies: - lodash._baseassign "^3.0.0" - lodash._basecreate "^3.0.0" - lodash._isiterateecall "^3.0.0" - -lodash.escape@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" - dependencies: - lodash._root "^3.0.0" - -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - -lodash.isarguments@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" - -lodash.isarray@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" - -lodash.isempty@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" - -lodash.isplainobject@^4.0.4: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - -lodash.keys@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" - dependencies: - lodash._getnative "^3.0.0" - lodash.isarguments "^3.0.0" - lodash.isarray "^3.0.0" - -lodash.mapvalues@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" - -lodash.restparam@^3.0.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - -lodash.template@^3.0.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" - dependencies: - lodash._basecopy "^3.0.0" - lodash._basetostring "^3.0.0" - lodash._basevalues "^3.0.0" - lodash._isiterateecall "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - lodash.keys "^3.0.0" - lodash.restparam "^3.0.0" - lodash.templatesettings "^3.0.0" - -lodash.templatesettings@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - -lodash.toarray@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" - -lodash.values@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" - -lodash@^4.0.0, lodash@^4.11.1, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.8.0, lodash@~4.17.4: - version "4.17.4" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" - -lodash@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" - -log-rotate@^0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/log-rotate/-/log-rotate-0.2.7.tgz#aadb64259eea49e5668842342c864d0b142e8c2d" - -log4js@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-1.1.1.tgz#c21d29c7604089e4f255833e7f94b3461de1ff43" - dependencies: - debug "^2.2.0" - semver "^5.3.0" - streamroller "^0.4.0" - -lokijs@^1.4.3: - version "1.5.0" - resolved "https://registry.yarnpkg.com/lokijs/-/lokijs-1.5.0.tgz#99e403d6a89e47e11ed0c5d499fb55a0603d5efc" - -loose-envify@^1.0.0, loose-envify@^1.1.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" - dependencies: - js-tokens "^3.0.0" - -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -lowercase-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" - -lru-cache@2: - version "2.7.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" - -lru-cache@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -macaddress@^0.2.7: - version "0.2.8" - resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" - -make-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978" - dependencies: - pify "^2.3.0" - -map-cache@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - -match-stream@~0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/match-stream/-/match-stream-0.0.2.tgz#99eb050093b34dffade421b9ac0b410a9cfa17cf" - dependencies: - buffers "~0.1.1" - readable-stream "~1.0.0" - -md5.js@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - -memorystream@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" - -meow@^3.1.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - -micromatch@^2.3.7: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -mime-db@~1.30.0: - version "1.30.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" - -mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7: - version "2.1.17" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" - dependencies: - mime-db "~1.30.0" - -mime@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" - -mime@^1.2.11, mime@^1.3.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" - -mimic-fn@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" - -mimic-response@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.0.tgz#df3d3652a73fded6b9b0b24146e6fd052353458e" - -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - dependencies: - dom-walk "^0.1.0" - -minimalistic-assert@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" - -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - -minimatch@0.3: - version "0.3.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" - dependencies: - lru-cache "2" - sigmund "~1.0.0" - -minimatch@^2.0.1: - version "2.0.10" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" - dependencies: - brace-expansion "^1.0.0" - -minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - dependencies: - brace-expansion "^1.1.7" - -minimatch@~0.2.11: - version "0.2.14" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" - dependencies: - lru-cache "2" - sigmund "~1.0.0" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - -minimongo-standalone@^1.1.0-3: - version "1.1.0-3" - resolved "https://registry.yarnpkg.com/minimongo-standalone/-/minimongo-standalone-1.1.0-3.tgz#cfdb3d0136811bab7fb92f6c13e0c74bd64dd5bd" - dependencies: - async ">=0.1.0" - underscore ">=1.0.0" - -mkdirp-promise@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" - dependencies: - mkdirp "*" - -mkdirp@*, mkdirp@0.5, mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - -mkdirp@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" - dependencies: - minimist "0.0.8" - -mocha@^3.2.0: - version "3.5.3" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.5.3.tgz#1e0480fe36d2da5858d1eb6acc38418b26eaa20d" - dependencies: - browser-stdout "1.3.0" - commander "2.9.0" - debug "2.6.8" - diff "3.2.0" - escape-string-regexp "1.0.5" - glob "7.1.1" - growl "1.9.2" - he "1.1.1" - json3 "3.3.2" - lodash.create "3.1.1" - mkdirp "0.5.1" - supports-color "3.1.2" - -mock-fs@^4.1.0: - version "4.4.1" - resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.4.1.tgz#f285fa025b42a4031faf75b66f632b21e7056683" - -mout@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/mout/-/mout-0.11.1.tgz#ba3611df5f0e5b1ffbfd01166b8f02d1f5fa2b99" - -ms@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" - -ms@0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - -multipipe@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" - dependencies: - duplexer2 "0.0.2" - -mute-stream@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" - -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - -mz@^2.6.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -nan@^2.0.5, nan@^2.2.1: - version "2.7.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" - -nano-json-stream-parser@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" - -natives@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - -negotiator@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" - -node-abi@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.1.1.tgz#c9cda256ec8aa99bcab2f6446db38af143338b2a" - -node-emoji@^1.5.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.8.1.tgz#6eec6bfb07421e2148c75c6bba72421f8530a826" - dependencies: - lodash.toarray "^4.4.0" - -node-status-codes@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f" - -node-unzip-2@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/node-unzip-2/-/node-unzip-2-0.2.1.tgz#8e4a0e5a68f7b03d33b8dc52b83a93d1d003cdd8" - dependencies: - binary "~0.3.0" - fstream "~0.1.21" - match-stream "~0.0.2" - pullstream "~0.4.0" - readable-stream "~1.0.0" - setimmediate "~1.0.1" - -noop-logger@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" - -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" - dependencies: - hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.0.0, normalize-path@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - dependencies: - remove-trailing-separator "^1.0.1" - -npm-install-package@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/npm-install-package/-/npm-install-package-2.1.0.tgz#d7efe3cfcd7ab00614b896ea53119dc9ab259125" - -npmlog@^4.0.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -nugget@^2.0.0, nugget@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/nugget/-/nugget-2.0.1.tgz#201095a487e1ad36081b3432fa3cada4f8d071b0" - dependencies: - debug "^2.1.3" - minimist "^1.1.0" - pretty-bytes "^1.0.2" - progress-stream "^1.1.0" - request "^2.45.0" - single-line-log "^1.1.2" - throttleit "0.0.2" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -numeral@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/numeral/-/numeral-2.0.6.tgz#4ad080936d443c2561aed9f2197efffe25f4e506" - -oauth-sign@~0.8.1, oauth-sign@~0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - -object-assign@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" - -object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - -object-inspect@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-0.4.0.tgz#f5157c116c1455b243b06ee97703392c5ad89fec" - -object-keys@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" - -object.defaults@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" - dependencies: - array-each "^1.0.1" - array-slice "^1.0.0" - for-own "^1.0.0" - isobject "^3.0.0" - -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - -object.pick@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - dependencies: - isobject "^3.0.1" - -oboe@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.3.tgz#2b4865dbd46be81225713f4e9bfe4bcf4f680a4f" - dependencies: - http-https "^1.0.0" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - dependencies: - ee-first "1.1.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - dependencies: - wrappy "1" - -once@~1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" - dependencies: - wrappy "1" - -onetime@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" - -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - dependencies: - mimic-fn "^1.0.0" - -optimist@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - -optionator@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.4" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - wordwrap "~1.0.0" - -orchestrator@^0.3.0: - version "0.3.8" - resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" - dependencies: - end-of-stream "~0.1.5" - sequencify "~0.0.7" - stream-consume "~0.1.0" - -ordered-read-streams@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" - -os-homedir@^1.0.0, os-homedir@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - dependencies: - lcid "^1.0.0" - -os-timesync@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/os-timesync/-/os-timesync-1.0.7.tgz#fc7ea7e6de1fc88742880cd08ff284327678e20d" - -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - -osenv@^0.1.0: - version "0.1.4" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -"over@>= 0.0.5 < 1": - version "0.0.5" - resolved "https://registry.yarnpkg.com/over/-/over-0.0.5.tgz#f29852e70fd7e25f360e013a8ec44c82aedb5708" - -p-cancelable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - -p-limit@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - dependencies: - p-limit "^1.1.0" - -p-timeout@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.0.tgz#9820f99434c5817868b4f34809ee5291660d5b6c" - dependencies: - p-finally "^1.0.0" - -package-json@^2.0.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-2.4.0.tgz#0d15bd67d1cbbddbb2ca222ff2edb86bcb31a8bb" - dependencies: - got "^5.0.0" - registry-auth-token "^3.0.1" - registry-url "^3.0.3" - semver "^5.1.0" - -parse-color@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-color/-/parse-color-1.0.0.tgz#7b748b95a83f03f16a94f535e52d7f3d94658619" - dependencies: - color-convert "~0.5.0" - -parse-filepath@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.1.tgz#159d6155d43904d16c10ef698911da1e91969b73" - dependencies: - is-absolute "^0.2.3" - map-cache "^0.2.0" - path-root "^0.1.1" - -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - -parse-headers@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.1.tgz#6ae83a7aa25a9d9b700acc28698cd1f1ed7e9536" - dependencies: - for-each "^0.3.2" - trim "0.0.1" - -parse-json@^2.1.0, parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - dependencies: - error-ex "^1.2.0" - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - -parseurl@~1.3.1, parseurl@~1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" - -path-exists@^2.0.0, path-exists@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - dependencies: - pinkie-promise "^2.0.0" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - -path-is-inside@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - -path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" - -path-root-regex@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" - -path-root@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" - dependencies: - path-root-regex "^0.1.0" - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - dependencies: - pify "^2.0.0" - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - -pify@^2.0.0, pify@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - -pkg-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" - dependencies: - find-up "^1.0.0" - -plist@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/plist/-/plist-2.1.0.tgz#57ccdb7a0821df21831217a3cad54e3e146a1025" - dependencies: - base64-js "1.2.0" - xmlbuilder "8.2.2" - xmldom "0.1.x" - -pluralize@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" - -prebuild-install@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-2.2.2.tgz#dd47c4d61f3754fb17bbf601759e5922e16e0671" - dependencies: - expand-template "^1.0.2" - github-from-package "0.0.0" - minimist "^1.2.0" - mkdirp "^0.5.1" - node-abi "^2.0.0" - noop-logger "^0.1.1" - npmlog "^4.0.1" - os-homedir "^1.0.1" - pump "^1.0.1" - rc "^1.1.6" - simple-get "^1.4.2" - tar-fs "^1.13.0" - tunnel-agent "^0.6.0" - xtend "4.0.1" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - -prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - -pretty-bytes@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-1.0.4.tgz#0a22e8210609ad35542f8c8d5d2159aff0751c84" - dependencies: - get-stdin "^4.0.1" - meow "^3.1.0" - -pretty-hrtime@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" - -private@^0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" - -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - -process@~0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" - -progress-stream@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/progress-stream/-/progress-stream-1.2.0.tgz#2cd3cfea33ba3a89c9c121ec3347abe9ab125f77" - dependencies: - speedometer "~0.1.2" - through2 "~0.2.3" - -progress-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/progress-stream/-/progress-stream-2.0.0.tgz#fac63a0b3d11deacbb0969abcc93b214bce19ed5" - dependencies: - speedometer "~1.0.0" - through2 "~2.0.3" - -progress@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" - -proxy-addr@~1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.5.tgz#71c0ee3b102de3f202f3b64f608d173fcba1a918" - dependencies: - forwarded "~0.1.0" - ipaddr.js "1.4.0" - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - -pullstream@~0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/pullstream/-/pullstream-0.4.1.tgz#d6fb3bf5aed697e831150eb1002c25a3f8ae1314" - dependencies: - over ">= 0.0.5 < 1" - readable-stream "~1.0.31" - setimmediate ">= 1.0.2 < 2" - slice-stream ">= 1.0.0 < 2" - -pump@^1.0.0, pump@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.2.tgz#3b3ee6512f94f0e575538c17995f9f16990a5d51" - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - -q@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" - -qs@6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.0.tgz#8d04954d364def3efc55b5a0793e1e2c8b1e6e49" - -qs@6.5.1, qs@~6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" - -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" - -query-string@^2.4.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-2.4.2.tgz#7db0666420804baa92ae9f268962855a76143dfb" - dependencies: - strict-uri-encode "^1.0.0" - -querystring@0.2.0, querystring@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - -randomatic@^1.1.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -range-parser@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - -raw-body@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" - dependencies: - bytes "3.0.0" - http-errors "1.6.2" - iconv-lite "0.4.19" - unpipe "1.0.0" - -rc@^1.0.1, rc@^1.1.2, rc@^1.1.6: - version "1.2.1" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" - dependencies: - deep-extend "~0.4.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -read-all-stream@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" - dependencies: - pinkie-promise "^2.0.0" - readable-stream "^2.0.0" - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - -"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.0, readable-stream@~1.0.31: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^1.1.7, readable-stream@~1.1.9: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - safe-buffer "~5.1.1" - string_decoder "~1.0.3" - util-deprecate "~1.0.1" - -readline2@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - mute-stream "0.0.5" - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - dependencies: - resolve "^1.1.6" - -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - -redux-devtools-instrument@^1.3.3: - version "1.8.2" - resolved "https://registry.yarnpkg.com/redux-devtools-instrument/-/redux-devtools-instrument-1.8.2.tgz#5e91cfe402e790dae3fd2f0d235f7b7d84b09ffe" - dependencies: - lodash "^4.2.0" - symbol-observable "^1.0.2" - -redux-thunk@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.2.0.tgz#e615a16e16b47a19a515766133d1e3e99b7852e5" - -redux@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b" - dependencies: - lodash "^4.2.1" - lodash-es "^4.2.1" - loose-envify "^1.1.0" - symbol-observable "^1.0.3" - -regenerate@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" - -regenerator-runtime@^0.10.0: - version "0.10.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" - -regenerator-runtime@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" - -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - dependencies: - is-equal-shallow "^0.1.3" - -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -registry-auth-token@^3.0.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006" - dependencies: - rc "^1.1.6" - safe-buffer "^5.0.1" - -registry-url@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" - dependencies: - rc "^1.0.1" - -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - dependencies: - jsesc "~0.5.0" - -remote-redux-devtools@^0.5.12: - version "0.5.12" - resolved "https://registry.yarnpkg.com/remote-redux-devtools/-/remote-redux-devtools-0.5.12.tgz#42cb95dfa9e54c1d9671317c5e7bba41e68caec2" - dependencies: - jsan "^3.1.5" - querystring "^0.2.0" - redux-devtools-instrument "^1.3.3" - remotedev-utils "^0.1.1" - rn-host-detect "^1.0.1" - socketcluster-client "^5.3.1" - -remotedev-serialize@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/remotedev-serialize/-/remotedev-serialize-0.1.0.tgz#074768e98cb7aa806f45994eeb0c8af95120ee32" - dependencies: - jsan "^3.1.0" - -remotedev-utils@^0.1.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/remotedev-utils/-/remotedev-utils-0.1.4.tgz#643700819a943678073c75eb185e81d96620b348" - dependencies: - get-params "^0.1.2" - jsan "^3.1.5" - lodash "^4.0.0" - remotedev-serialize "^0.1.0" - shortid "^2.2.6" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - -repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" - -repeat-string@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - dependencies: - is-finite "^1.0.0" - -replace-ext@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" - -request@^2.45.0, request@^2.55.0, request@^2.79.0, request@^2.81.0: - version "2.82.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.82.0.tgz#2ba8a92cd7ac45660ea2b10a53ae67cd247516ea" - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.6.0" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" - forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" - hawk "~6.0.2" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" - performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - stringstream "~0.0.5" - tough-cookie "~2.3.2" - tunnel-agent "^0.6.0" - uuid "^3.1.0" - -request@~2.81.0: - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "^0.6.0" - uuid "^3.0.0" - -require-dir@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/require-dir/-/require-dir-0.3.2.tgz#c1d5c75e9fbffde9f2e6b33e383db4f594b5a6a9" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - -require-from-string@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - -require-uncached@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - dependencies: - caller-path "^0.1.0" - resolve-from "^1.0.0" - -resolve-dir@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" - dependencies: - expand-tilde "^1.2.2" - global-modules "^0.2.3" - -resolve-from@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - -resolve-url@~0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86" - dependencies: - path-parse "^1.0.5" - -restore-cursor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" - dependencies: - exit-hook "^1.0.0" - onetime "^1.0.0" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -resumer@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" - dependencies: - through "~2.3.4" - -rgb2hex@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/rgb2hex/-/rgb2hex-0.1.0.tgz#ccd55f860ae0c5c4ea37504b958e442d8d12325b" - -rimraf@2, rimraf@^2.2.8: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - dependencies: - glob "^7.0.5" - -ripemd160@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" - dependencies: - hash-base "^2.0.0" - inherits "^2.0.1" - -rlp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.0.0.tgz#9db384ff4b89a8f61563d92395d8625b18f3afb0" - -rn-host-detect@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/rn-host-detect/-/rn-host-detect-1.1.3.tgz#242d76e2fa485c48d751416e65b7cce596969e91" - -run-async@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" - dependencies: - once "^1.3.0" - -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - dependencies: - is-promise "^2.1.0" - -run-sequence@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/run-sequence/-/run-sequence-1.2.2.tgz#5095a0bebe98733b0140bd08dd80ec030ddacdeb" - dependencies: - chalk "*" - gulp-util "*" - -rx-lite@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" - -rx@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" - -safe-buffer@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" - -sanitize-filename@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.1.tgz#612da1c96473fa02dccda92dcd5b4ab164a6772a" - dependencies: - truncate-utf8-bytes "^1.0.0" - -sax@>=0.6.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - -sc-channel@~1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/sc-channel/-/sc-channel-1.0.6.tgz#b38bd47a993e78290fbc53467867f6b2a0a08639" - dependencies: - sc-emitter "1.x.x" - -sc-emitter@1.x.x, sc-emitter@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/sc-emitter/-/sc-emitter-1.1.0.tgz#ef119d4222f4c64f887b486964ef11116cdd0e75" - dependencies: - component-emitter "1.2.0" - -sc-errors@~1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/sc-errors/-/sc-errors-1.3.3.tgz#c00bc4c766a970cc8d5937d08cd58e931d7dae05" - -sc-formatter@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/sc-formatter/-/sc-formatter-3.0.0.tgz#c91b1fe56c260abd5a6a2e6af98c724bc7998a38" - -secp256k1@^3.0.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.3.0.tgz#50ec9b201ba401403dd13ccbf21d31eeb3ff43cf" - dependencies: - bindings "^1.2.1" - bip66 "^1.1.3" - bn.js "^4.11.3" - create-hash "^1.1.2" - drbg.js "^1.0.1" - elliptic "^6.2.3" - nan "^2.2.1" - prebuild-install "^2.0.0" - safe-buffer "^5.1.0" - -seek-bzip@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc" - dependencies: - commander "~2.8.1" - -semver-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" - -semver-diff@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" - dependencies: - semver "^5.0.3" - -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" - -semver@^4.1.0: - version "4.3.6" - resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" - -send@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/send/-/send-0.15.6.tgz#20f23a9c925b762ab82705fe2f9db252ace47e34" - dependencies: - debug "2.6.9" - depd "~1.1.1" - destroy "~1.0.4" - encodeurl "~1.0.1" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.6.2" - mime "1.3.4" - ms "2.0.0" - on-finished "~2.3.0" - range-parser "~1.2.0" - statuses "~1.3.1" - -sequencify@~0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" - -serve-static@1.12.6: - version "1.12.6" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.6.tgz#b973773f63449934da54e5beba5e31d9f4211577" - dependencies: - encodeurl "~1.0.1" - escape-html "~1.0.3" - parseurl "~1.3.2" - send "0.15.6" - -servify@^0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95" - dependencies: - body-parser "^1.16.0" - cors "^2.8.1" - express "^4.14.0" - request "^2.79.0" - xhr "^2.3.3" - -set-blocking@^2.0.0, set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - -"setimmediate@>= 1.0.2 < 2", setimmediate@^1.0.5, setimmediate@~1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - -setprototypeof@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.9" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.9.tgz#98f64880474b74f4a38b8da9d3c0f2d104633e7d" - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -sha3@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/sha3/-/sha3-1.2.0.tgz#6989f1b70a498705876a373e2c62ace96aa9399a" - dependencies: - nan "^2.0.5" - -shelljs@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.6.1.tgz#ec6211bed1920442088fe0f70b2837232ed2c8a8" - -shelljs@^0.7.5, shelljs@^0.7.7: - version "0.7.8" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -shortid@^2.2.6: - version "2.2.8" - resolved "https://registry.yarnpkg.com/shortid/-/shortid-2.2.8.tgz#033b117d6a2e975804f6f0969dbe7d3d0b355131" - -sigmund@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - -simple-get@^1.4.2, simple-get@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-1.4.3.tgz#e9755eda407e96da40c5e5158c9ea37b33becbeb" - dependencies: - once "^1.3.1" - unzip-response "^1.0.0" - xtend "^4.0.0" - -single-line-log@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/single-line-log/-/single-line-log-1.1.2.tgz#c2f83f273a3e1a16edb0995661da0ed5ef033364" - dependencies: - string-width "^1.0.1" - -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - -slice-ansi@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" - -"slice-stream@>= 1.0.0 < 2": - version "1.0.0" - resolved "https://registry.yarnpkg.com/slice-stream/-/slice-stream-1.0.0.tgz#5b33bd66f013b1a7f86460b03d463dec39ad3ea0" - dependencies: - readable-stream "~1.0.31" - -slide@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - dependencies: - hoek "2.x.x" - -sntp@2.x.x: - version "2.0.2" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.0.2.tgz#5064110f0af85f7cfdb7d6b67a40028ce52b4b2b" - dependencies: - hoek "4.x.x" - -socketcluster-client@^5.3.1: - version "5.5.2" - resolved "https://registry.yarnpkg.com/socketcluster-client/-/socketcluster-client-5.5.2.tgz#9d4369e0e722ff7e55e5422c2d44f5afe1aff128" - dependencies: - base-64 "0.1.0" - clone "2.1.1" - linked-list "0.1.0" - querystring "0.2.0" - sc-channel "~1.0.6" - sc-emitter "~1.1.0" - sc-errors "~1.3.0" - sc-formatter "~3.0.0" - ws "3.0.0" - -solc@^0.4.15: - version "0.4.17" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.17.tgz#75f93da6bc190becb89f6663076ab943ff95cd2f" - dependencies: - fs-extra "^0.30.0" - memorystream "^0.3.1" - require-from-string "^1.1.0" - semver "^5.3.0" - yargs "^4.7.1" - -source-map-resolve@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.3.1.tgz#610f6122a445b8dd51535a2a71b783dfc1248761" - dependencies: - atob "~1.1.0" - resolve-url "~0.2.1" - source-map-url "~0.3.0" - urix "~0.1.0" - -source-map-support@^0.4.11, source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - dependencies: - source-map "^0.5.6" - -source-map-url@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" - -source-map@^0.1.38: - version "0.1.43" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" - dependencies: - amdefine ">=0.0.4" - -source-map@^0.5.1, source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - -sparkles@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" - -spdx-correct@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" - dependencies: - spdx-license-ids "^1.0.2" - -spdx-expression-parse@~1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" - -spdx-license-ids@^1.0.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" - -spectron@3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/spectron/-/spectron-3.7.2.tgz#86f41306a9b70ed6ee1500f7f7d3adc389afb446" - dependencies: - dev-null "^0.1.1" - electron-chromedriver "~1.7.1" - request "^2.81.0" - split "^1.0.0" - webdriverio "^4.8.0" - -speedometer@~0.1.2: - version "0.1.4" - resolved "https://registry.yarnpkg.com/speedometer/-/speedometer-0.1.4.tgz#9876dbd2a169d3115402d48e6ea6329c8816a50d" - -speedometer@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/speedometer/-/speedometer-1.0.0.tgz#cd671cb06752c22bca3370e2f334440be4fc62e2" - -split@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" - dependencies: - through "2" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - -sshpk@^1.7.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - optionalDependencies: - bcrypt-pbkdf "^1.0.0" - ecc-jsbn "~0.1.1" - jsbn "~0.1.0" - tweetnacl "~0.14.0" - -stat-mode@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" - -"statuses@>= 1.3.1 < 2", statuses@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" - -stream-consume@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f" - -streamroller@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-0.4.1.tgz#d435bd5974373abd9bd9068359513085106cc05f" - dependencies: - date-format "^0.0.0" - debug "^0.7.2" - mkdirp "^0.5.1" - readable-stream "^1.1.7" - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - -string-width@^1.0.1, string-width@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string-width@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - -string_decoder@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" - dependencies: - safe-buffer "~5.1.0" - -stringstream@~0.0.4, stringstream@~0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - dependencies: - ansi-regex "^3.0.0" - -strip-bom@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" - dependencies: - first-chunk-stream "^1.0.0" - is-utf8 "^0.2.0" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - dependencies: - is-utf8 "^0.2.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - -strip-dirs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.0.0.tgz#610cdb2928200da0004f41dcb90fc95cd919a0b6" - dependencies: - is-natural-number "^4.0.1" - -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - dependencies: - get-stdin "^4.0.1" - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - -sumchecker@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-1.3.1.tgz#79bb3b4456dd04f18ebdbc0d703a1d1daec5105d" - dependencies: - debug "^2.2.0" - es6-promise "^4.0.5" - -sumchecker@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-2.0.2.tgz#0f42c10e5d05da5d42eea3e56c3399a37d6c5b3e" - dependencies: - debug "^2.2.0" - -supports-color@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" - dependencies: - has-flag "^1.0.0" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - -supports-color@^4.0.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" - dependencies: - has-flag "^2.0.0" - -supports-color@~3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - dependencies: - has-flag "^1.0.0" - -swarm-js@^0.1.21: - version "0.1.36" - resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.36.tgz#9271be5004fa28900020bcc9a0f7cf23cc50b1a0" - dependencies: - bluebird "^3.5.0" - buffer "^5.0.5" - decompress "^4.0.0" - eth-lib "^0.1.26" - fs-extra "^2.1.2" - fs-promise "^2.0.0" - got "^7.1.0" - mime-types "^2.1.16" - mkdirp-promise "^5.0.1" - mock-fs "^4.1.0" - setimmediate "^1.0.5" - tar.gz "^1.0.5" - xhr-request-promise "^0.1.2" - -symbol-observable@^1.0.2, symbol-observable@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" - -table@^3.7.8: - version "3.8.3" - resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" - dependencies: - ajv "^4.7.0" - ajv-keywords "^1.0.0" - chalk "^1.1.1" - lodash "^4.0.0" - slice-ansi "0.0.4" - string-width "^2.0.0" - -tape@^3.0.3: - version "3.6.1" - resolved "https://registry.yarnpkg.com/tape/-/tape-3.6.1.tgz#4893dd53e280a5f58c0ceb30c2c0ebb3bcd51e1f" - dependencies: - deep-equal "~0.2.0" - defined "~0.0.0" - glob "~3.2.9" - inherits "~2.0.1" - object-inspect "~0.4.0" - resumer "~0.0.0" - through "~2.3.4" - -tar-fs@^1.13.0: - version "1.15.3" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.15.3.tgz#eccf935e941493d8151028e636e51ce4c3ca7f20" - dependencies: - chownr "^1.0.1" - mkdirp "^0.5.1" - pump "^1.0.0" - tar-stream "^1.1.2" - -tar-stream@^1.1.2, tar-stream@^1.5.0, tar-stream@^1.5.2: - version "1.5.4" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.4.tgz#36549cf04ed1aee9b2a30c0143252238daf94016" - dependencies: - bl "^1.0.0" - end-of-stream "^1.0.0" - readable-stream "^2.0.0" - xtend "^4.0.0" - -tar.gz@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tar.gz/-/tar.gz-1.0.5.tgz#e1ada7e45ef2241b4b1ee58123c8f40b5d3c1bc4" - dependencies: - bluebird "^2.9.34" - commander "^2.8.1" - fstream "^1.0.8" - mout "^0.11.0" - tar "^2.1.1" - -tar@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" - dependencies: - block-stream "*" - fstream "^1.0.2" - inherits "2" - -text-table@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - -thenify-all@^1.0.0, thenify-all@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.0" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" - dependencies: - any-promise "^1.0.0" - -throttleit@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf" - -through2@^0.6.1: - version "0.6.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" - dependencies: - readable-stream ">=1.0.33-1 <1.1.0-0" - xtend ">=4.0.0 <4.1.0-0" - -through2@^2.0.0, through2@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" - dependencies: - readable-stream "^2.1.5" - xtend "~4.0.1" - -through2@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.2.3.tgz#eb3284da4ea311b6cc8ace3653748a52abf25a3f" - dependencies: - readable-stream "~1.1.9" - xtend "~2.1.1" - -through@2, through@^2.3.6, through@~2.3.4: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - -tildify@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" - dependencies: - os-homedir "^1.0.0" - -time-stamp@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" - -timed-out@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-2.0.0.tgz#f38b0ae81d3747d628001f41dafc652ace671c0a" - -timed-out@^3.0.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217" - -timed-out@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - -tmp@0.0.28: - version "0.0.28" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" - dependencies: - os-tmpdir "~1.0.1" - -tmp@0.0.29: - version "0.0.29" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" - dependencies: - os-tmpdir "~1.0.1" - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - dependencies: - os-tmpdir "~1.0.2" - -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - -tough-cookie@~2.3.0, tough-cookie@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" - dependencies: - punycode "^1.4.1" - -"traverse@>=0.3.0 <0.4": - version "0.3.9" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" - -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - -trim@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" - -truncate-utf8-bytes@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" - dependencies: - utf8-byte-length "^1.0.1" - -tryit@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" - -tunnel-agent@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - dependencies: - prelude-ls "~1.1.2" - -type-detect@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" - -type-detect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" - -type-is@~1.6.15: - version "1.6.15" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" - dependencies: - media-typer "0.3.0" - mime-types "~2.1.15" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - -typescript@^2.2.2: - version "2.5.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.5.3.tgz#df3dcdc38f3beb800d4bc322646b04a3f6ca7f0d" - -ultron@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.0.tgz#b07a2e6a541a815fc6a34ccd4533baec307ca864" - -unbzip2-stream@^1.0.9: - version "1.2.5" - resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz#73a033a567bbbde59654b193c44d48a7e4f43c47" - dependencies: - buffer "^3.0.1" - through "^2.3.6" - -unc-path-regex@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" - -underscore-deep-extend@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/underscore-deep-extend/-/underscore-deep-extend-1.1.5.tgz#962ba1f8b3bb2e2afd182ed86f2e5275543c52bd" - -underscore@>=1.0.0, underscore@^1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" - -unique-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - -unzip-response@^1.0.0, unzip-response@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" - -unzip-response@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" - -update-notifier@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-1.0.3.tgz#8f92c515482bd6831b7c93013e70f87552c7cf5a" - dependencies: - boxen "^0.6.0" - chalk "^1.0.0" - configstore "^2.0.0" - is-npm "^1.0.0" - latest-version "^2.0.0" - lazy-req "^1.1.0" - semver-diff "^2.0.0" - xdg-basedir "^2.0.0" - -urix@^0.1.0, urix@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - -url-join@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/url-join/-/url-join-2.0.2.tgz#c072756967ad24b8b59e5741551caac78f50b8b7" - -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - dependencies: - prepend-http "^1.0.1" - -url-set-query@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" - -url-to-options@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" - -url@~0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - -user-home@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" - dependencies: - os-homedir "^1.0.0" - -utf8-byte-length@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" - -utf8@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.2.tgz#1fa0d9270e9be850d9b05027f63519bf46457d96" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - -util-extend@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" - -utils-merge@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" - -uuid-1345@^0.99.6: - version "0.99.6" - resolved "https://registry.yarnpkg.com/uuid-1345/-/uuid-1345-0.99.6.tgz#b1270ae015a7721c7adec6c46ec169c6098aed40" - dependencies: - macaddress "^0.2.7" - -uuid@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" - -uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" - -v8flags@^2.0.2: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" - dependencies: - user-home "^1.1.1" - -validate-npm-package-license@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" - dependencies: - spdx-correct "~1.0.0" - spdx-expression-parse "~1.0.0" - -validator@~7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-7.0.0.tgz#c74deb8063512fac35547938e6f0b1504a282fd2" - -vary@^1, vary@~1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -vinyl-fs@^0.3.0: - version "0.3.14" - resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" - dependencies: - defaults "^1.0.0" - glob-stream "^3.1.5" - glob-watcher "^0.0.6" - graceful-fs "^3.0.0" - mkdirp "^0.5.0" - strip-bom "^1.0.0" - through2 "^0.6.1" - vinyl "^0.4.0" - -vinyl-sourcemaps-apply@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" - dependencies: - source-map "^0.5.1" - -vinyl@^0.4.0: - version "0.4.6" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" - dependencies: - clone "^0.2.0" - clone-stats "^0.0.1" - -vinyl@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" - dependencies: - clone "^1.0.0" - clone-stats "^0.0.1" - replace-ext "0.0.1" - -walkdir@^0.0.11: - version "0.0.11" - resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.0.11.tgz#a16d025eb931bd03b52f308caed0f40fcebe9532" - -wdio-dot-reporter@~0.0.8: - version "0.0.9" - resolved "https://registry.yarnpkg.com/wdio-dot-reporter/-/wdio-dot-reporter-0.0.9.tgz#929b2adafd49d6b0534fda068e87319b47e38fe5" - -web3@^0.18.4: - version "0.18.4" - resolved "https://registry.yarnpkg.com/web3/-/web3-0.18.4.tgz#81ec1784145491f2eaa8955b31c06049e07c5e7d" - dependencies: - bignumber.js "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2" - crypto-js "^3.1.4" - utf8 "^2.1.1" - xhr2 "*" - xmlhttprequest "*" - -webdriverio@^4.8.0: - version "4.8.0" - resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-4.8.0.tgz#d52929b749080f89967f6e1614051cbc8172d132" - dependencies: - archiver "~1.3.0" - babel-runtime "~6.23.0" - css-parse "~2.0.0" - css-value "~0.0.1" - deepmerge "~1.3.2" - ejs "~2.5.6" - gaze "~1.1.2" - glob "~7.1.1" - inquirer "~3.0.6" - json-stringify-safe "~5.0.1" - mkdirp "~0.5.1" - npm-install-package "~2.1.0" - optimist "~0.6.1" - q "~1.5.0" - request "~2.81.0" - rgb2hex "~0.1.0" - safe-buffer "~5.0.1" - supports-color "~3.2.3" - url "~0.11.0" - validator "~7.0.0" - wdio-dot-reporter "~0.0.8" - wgxpath "~1.0.0" - -wgxpath@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wgxpath/-/wgxpath-1.0.0.tgz#eef8a4b9d558cc495ad3a9a2b751597ecd9af690" - -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - -which@^1.2.12, which@^1.2.4, which@^1.2.9: - version "1.3.0" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" - dependencies: - isexe "^2.0.0" - -wide-align@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" - dependencies: - string-width "^1.0.2" - -widest-line@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" - dependencies: - string-width "^1.0.1" - -window-size@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" - -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - -write-file-atomic@^1.1.2: - version "1.3.4" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - slide "^1.1.5" - -write@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" - dependencies: - mkdirp "^0.5.1" - -ws@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-3.0.0.tgz#98ddb00056c8390cb751e7788788497f99103b6c" - dependencies: - safe-buffer "~5.0.1" - ultron "~1.1.0" - -ws@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-3.2.0.tgz#d5d3d6b11aff71e73f808f40cc69d52bb6d4a185" - dependencies: - async-limiter "~1.0.0" - safe-buffer "~5.1.0" - ultron "~1.1.0" - -xdg-basedir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" - dependencies: - os-homedir "^1.0.0" - -xhr-request-promise@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz#343c44d1ee7726b8648069682d0f840c83b4261d" - dependencies: - xhr-request "^1.0.1" - -xhr-request@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.0.1.tgz#83f08a4b20beec67a8c1c728e8102f4c9eecbdda" - dependencies: - buffer-to-arraybuffer "0.0.2" - object-assign "^3.0.0" - query-string "^2.4.0" - simple-get "^1.4.3" - timed-out "^2.0.0" - url-set-query "^1.0.0" - xhr "^2.0.4" - -xhr2@*: - version "0.1.4" - resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.1.4.tgz#7f87658847716db5026323812f818cadab387a5f" - -xhr@^2.0.4, xhr@^2.3.3: - version "2.4.0" - resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.4.0.tgz#e16e66a45f869861eeefab416d5eff722dc40993" - dependencies: - global "~4.3.0" - is-function "^1.0.1" - parse-headers "^2.0.0" - xtend "^4.0.0" - -xml2js@^0.4.17: - version "0.4.19" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" - dependencies: - sax ">=0.6.0" - xmlbuilder "~9.0.1" - -xmlbuilder@8.2.2: - version "8.2.2" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773" - -xmlbuilder@~9.0.1: - version "9.0.4" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.4.tgz#519cb4ca686d005a8420d3496f3f0caeecca580f" - -xmldom@0.1.x: - version "0.1.27" - resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" - -xmlhttprequest@*: - version "1.8.0" - resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" - -xtend@4.0.1, "xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - -xtend@~2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" - dependencies: - object-keys "~0.4.0" - -y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - -yargs-parser@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" - dependencies: - camelcase "^3.0.0" - lodash.assign "^4.0.6" - -yargs-parser@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" - dependencies: - camelcase "^3.0.0" - -yargs-parser@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" - dependencies: - camelcase "^3.0.0" - -yargs@^4.3.2, yargs@^4.7.1: - version "4.8.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" - dependencies: - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - lodash.assign "^4.0.3" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.1" - which-module "^1.0.0" - window-size "^0.2.0" - y18n "^3.2.1" - yargs-parser "^2.4.1" - -yargs@^6.6.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" - dependencies: - camelcase "^3.0.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.2" - which-module "^1.0.0" - y18n "^3.2.1" - yargs-parser "^4.2.0" - -yargs@^7.0.2: - version "7.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" - dependencies: - camelcase "^3.0.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.2" - which-module "^1.0.0" - y18n "^3.2.1" - yargs-parser "^5.0.0" - -yauzl@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" - dependencies: - fd-slicer "~1.0.1" - -yauzl@^2.4.2: - version "2.8.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.8.0.tgz#79450aff22b2a9c5a41ef54e02db907ccfbf9ee2" - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.0.1" - -zip-stream@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.2.0.tgz#a8bc45f4c1b49699c6b90198baacaacdbcd4ba04" - dependencies: - archiver-utils "^1.3.0" - compress-commons "^1.2.0" - lodash "^4.8.0" - readable-stream "^2.0.0" From 7b6b9370023aaf225ce91d43ddbba78586db462a Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Thu, 5 Oct 2017 11:40:11 -0600 Subject: [PATCH 006/150] Refactors window logic/state into module --- .../client/templates/popupWindows/about.html | 2 +- main.js | 83 +------- modules/clientBinaryManager.js | 13 +- modules/core/ui/reducer.js | 27 ++- modules/ipc/methods/eth_sendTransaction.js | 11 +- modules/ipcCommunicator.js | 20 +- modules/menuItems.js | 40 +--- modules/updateChecker.js | 11 +- modules/windows.js | 189 +++++++++++++++--- tests/unit/core/ui/reducer.test.js | 20 ++ 10 files changed, 219 insertions(+), 197 deletions(-) create mode 100644 tests/unit/core/ui/reducer.test.js diff --git a/interface/client/templates/popupWindows/about.html b/interface/client/templates/popupWindows/about.html index a8618e4ec..e93a70ae8 100644 --- a/interface/client/templates/popupWindows/about.html +++ b/interface/client/templates/popupWindows/about.html @@ -10,7 +10,7 @@

{{appName}}

License {{mist.license}}
GitHub github.com/ethereum/mist

- Copyright 2016 Ethereum Foundation + Copyright 2017 Ethereum Foundation \ No newline at end of file diff --git a/main.js b/main.js index 14d94a305..0caa765b3 100644 --- a/main.js +++ b/main.js @@ -165,7 +165,6 @@ async function init() { // Initialise window mgr Windows.init(); - store.dispatch({ type: 'WINDOWS::INIT_FINISH' }); // Enable the Swarm protocol protocol.registerHttpProtocol('bzz', (request, callback) => { @@ -195,78 +194,16 @@ async function init() { // add menu already here, so we have copy and paste functionality appMenu(); - // Create the browser window. - - const defaultWindow = windowStateKeeper({ - defaultWidth: 1024 + 208, - defaultHeight: 720 - }); + global.defaultWindow = windowStateKeeper({ defaultWidth: 1024 + 208, defaultHeight: 720 }); - store.dispatch({ type: 'MAIN_WINDOW::CREATE_START' }); - - // MIST - if (global.mode === 'mist') { - mainWindow = Windows.create('main', { - primary: true, - electronOptions: { - width: Math.max(defaultWindow.width, 500), - height: Math.max(defaultWindow.height, 440), - x: defaultWindow.x, - y: defaultWindow.y, - webPreferences: { - nodeIntegration: true, /* necessary for webviews; - require will be removed through preloader */ - preload: `${__dirname}/modules/preloader/mistUI.js`, - 'overlay-fullscreen-video': true, - 'overlay-scrollbars': true, - experimentalFeatures: true, - }, - }, - }); - store.dispatch({ type: 'MAIN_WINDOW::CREATE_SUCCESS' }); - - // WALLET - } else { - mainWindow = Windows.create('main', { - primary: true, - electronOptions: { - width: Math.max(defaultWindow.width, 500), - height: Math.max(defaultWindow.height, 440), - x: defaultWindow.x, - y: defaultWindow.y, - webPreferences: { - preload: `${__dirname}/modules/preloader/walletMain.js`, - 'overlay-fullscreen-video': true, - 'overlay-scrollbars': true, - }, - }, - }); - store.dispatch({ type: 'MAIN_WINDOW::CREATE_SUCCESS' }); - } + // Create the browser window. + mainWindow = Windows.create('main'); // Delegating events to save window bounds on windowStateKeeper - defaultWindow.manage(mainWindow.window); + global.defaultWindow.manage(mainWindow.window); if (!Settings.inAutoTestMode) { - store.dispatch({ type: 'SPLASH_WINDOW::CREATE_START' }); - - splashWindow = Windows.create('splash', { - primary: true, - url: `${global.interfacePopupsUrl}#splashScreen_${global.mode}`, - show: true, - electronOptions: { - width: 400, - height: 230, - resizable: false, - backgroundColor: '#F6F6F6', - useContentSize: true, - frame: false, - webPreferences: { - preload: `${__dirname}/modules/preloader/splashScreen.js`, - }, - }, - }); - store.dispatch({ type: 'SPLASH_WINDOW::CREATE_SUCCESS' }); + splashWindow = Windows.create('splash'); } // Checks time sync @@ -405,15 +342,7 @@ async function init() { log.info('No accounts setup yet, lets do onboarding first.'); return new Q((resolve, reject) => { - store.dispatch({ type: 'ONBOARDING_WINDOW::CREATE_START' }); - const onboardingWindow = Windows.createPopup('onboardingScreen', { - primary: true, - electronOptions: { - width: 576, - height: 442, - }, - }); - store.dispatch({ type: 'ONBOARDING_WINDOW::CREATE_SUCCESS' }); + const onboardingWindow = Windows.createPopup('onboardingScreen'); onboardingWindow.on('closed', () => { store.dispatch({ type: 'ONBOARDING_WINDOW::CLOSE' }); diff --git a/modules/clientBinaryManager.js b/modules/clientBinaryManager.js index a741423f8..c3c535483 100644 --- a/modules/clientBinaryManager.js +++ b/modules/clientBinaryManager.js @@ -128,16 +128,7 @@ class Manager extends EventEmitter { log.debug('New client binaries config found, asking user if they wish to update...'); - const wnd = Windows.createPopup('clientUpdateAvailable', _.extend({ - useWeb3: false, - electronOptions: { - width: 600, - height: 340, - alwaysOnTop: false, - resizable: false, - maximizable: false, - }, - }, { + const wnd = Windows.createPopup('clientUpdateAvailable', { sendData: { uiAction_sendData: { name: nodeType, @@ -147,7 +138,7 @@ class Manager extends EventEmitter { restart, }, }, - }), (update) => { + }, (update) => { // update if (update === 'update') { this._writeLocalConfig(latestConfig); diff --git a/modules/core/ui/reducer.js b/modules/core/ui/reducer.js index f47c42ccc..18275a5b3 100644 --- a/modules/core/ui/reducer.js +++ b/modules/core/ui/reducer.js @@ -1,11 +1,20 @@ -const initialState = { +export const initialState = { + aboutWindowCreated: false, appQuit: false, + clientUpdateAvailableWindowCreated: false, + connectAccountWindowCreated: false, + importAccountWindowCreated: false, + loadingWindowCreated: false, mainWindowCreated: false, mainWindowVisible: false, - onboardingWindowCreated: false, - onboardingWindowVisible: false, + onboardingScreenWindowCreated: false, + onboardingScreenWindowVisible: false, + remixWindowCreated: false, + requestAccountWindowCreated: false, + sendTransactionConfirmationWindowCreated: false, splashWindowCreated: false, splashWindowVisible: false, + updateAvailableWindowCreated: false, windowsInit: false, }; @@ -15,25 +24,21 @@ const ui = (state = initialState, action) => { return Object.assign({}, state, { appQuit: true }); case 'MAIN_WINDOW::CLOSE': return Object.assign({}, state, { mainWindowVisible: false }); - case 'MAIN_WINDOW::CREATE_SUCCESS': - return Object.assign({}, state, { mainWindowCreated: true }); + case '[MAIN]:WINDOW:CREATE_FINISH': + return Object.assign({}, state, { [`${action.payload.type}WindowCreated`]: true }); case 'MAIN_WINDOW::SHOW': return Object.assign({}, state, { mainWindowVisible: true }); case 'MAIN_WINDOW::HIDE': return Object.assign({}, state, { mainWindowVisible: false }); case 'ONBOARDING_WINDOW::CLOSE': - return Object.assign({}, state, { onboardingWindowVisible: false }); - case 'ONBOARDING_WINDOW::CREATE_SUCCESS': - return Object.assign({}, state, { onboardingWindowCreated: true, onboardingWindowVisible: true }); + return Object.assign({}, state, { onboardingScreenWindowVisible: false }); case 'SPLASH_WINDOW::CLOSE': return Object.assign({}, state, { splashWindowVisible: false }); - case 'SPLASH_WINDOW::CREATE_SUCCESS': - return Object.assign({}, state, { splashWindowCreated: true }); case 'SPLASH_WINDOW::SHOW': return Object.assign({}, state, { splashWindowVisible: true }); case 'SPLASH_WINDOW::HIDE': return Object.assign({}, state, { splashWindowVisible: false }); - case 'WINDOWS::INIT_FINISH': + case '[MAIN]:WINDOWS:INIT_FINISH': return Object.assign({}, state, { windowsInit: true }); default: return state; diff --git a/modules/ipc/methods/eth_sendTransaction.js b/modules/ipc/methods/eth_sendTransaction.js index 9904cfc5c..11baf5c67 100644 --- a/modules/ipc/methods/eth_sendTransaction.js +++ b/modules/ipc/methods/eth_sendTransaction.js @@ -54,16 +54,7 @@ module.exports = class extends BaseProcessor { } const modalWindow = Windows.createPopup('sendTransactionConfirmation', { - sendData: { - uiAction_sendData: payload.params[0], - }, - electronOptions: { - width: 580, - height: 550, - alwaysOnTop: true, - enableLargerThanScreen: false, - resizable: true - }, + sendData: { uiAction_sendData: payload.params[0] } }); BlurOverlay.enable(); diff --git a/modules/ipcCommunicator.js b/modules/ipcCommunicator.js index 3a6892fed..72ba18a38 100644 --- a/modules/ipcCommunicator.js +++ b/modules/ipcCommunicator.js @@ -219,14 +219,7 @@ ipc.on('backendAction_importWalletFile', (e, path, pw) => { const createAccountPopup = (e) => { - Windows.createPopup('requestAccount', { - ownerId: e.sender.id, - electronOptions: { - width: 400, - height: 230, - alwaysOnTop: true, - }, - }); + Windows.createPopup('requestAccount', { ownerId: e.sender.id }); }; // MIST API @@ -236,16 +229,7 @@ ipc.on('mistAPI_requestAccount', (e) => { if (global.mode === 'wallet') { createAccountPopup(e); } else { // Mist - Windows.createPopup('connectAccount', { - ownerId: e.sender.id, - electronOptions: { - width: 460, - height: 520, - maximizable: false, - minimizable: false, - alwaysOnTop: true, - }, - }); + Windows.createPopup('connectAccount', { ownerId: e.sender.id }); } }); diff --git a/modules/menuItems.js b/modules/menuItems.js index 3ebd5e826..696295fc2 100644 --- a/modules/menuItems.js +++ b/modules/menuItems.js @@ -96,13 +96,7 @@ let menuTempl = function (webviews) { { label: i18n.t('mist.applicationMenu.app.about', { app: Settings.appName }), click() { - Windows.createPopup('about', { - electronOptions: { - width: 420, - height: 230, - alwaysOnTop: true, - }, - }); + Windows.createPopup('about'); }, }, { @@ -172,11 +166,7 @@ let menuTempl = function (webviews) { label: i18n.t('mist.applicationMenu.file.newAccount'), accelerator: 'CommandOrControl+N', click() { - Windows.createPopup('requestAccount', { - electronOptions: { - width: 420, height: 230, alwaysOnTop: true, - }, - }); + Windows.createPopup('requestAccount'); }, }, { @@ -184,11 +174,7 @@ let menuTempl = function (webviews) { accelerator: 'CommandOrControl+I', enabled: ethereumNode.isMainNetwork, click() { - Windows.createPopup('importAccount', { - electronOptions: { - width: 600, height: 370, alwaysOnTop: true, - }, - }); + Windows.createPopup('importAccount'); }, }, { @@ -415,17 +401,7 @@ let menuTempl = function (webviews) { label: i18n.t('mist.applicationMenu.develop.openRemix'), enabled: true, click() { - Windows.createPopup('remix', { - url: 'https://remix.ethereum.org', - electronOptions: { - width: 1024, - height: 720, - center: true, - frame: true, - resizable: true, - titleBarStyle: 'default', - } - }); + Windows.createPopup('remix'); }, }); } @@ -610,13 +586,7 @@ let menuTempl = function (webviews) { { label: i18n.t('mist.applicationMenu.app.about', { app: Settings.appName }), click() { - Windows.createPopup('about', { - electronOptions: { - width: 420, - height: 230, - alwaysOnTop: true, - }, - }); + Windows.createPopup('about'); }, }, { diff --git a/modules/updateChecker.js b/modules/updateChecker.js index f150a6003..95b6918b3 100644 --- a/modules/updateChecker.js +++ b/modules/updateChecker.js @@ -65,16 +65,7 @@ const check = exports.check = () => { function showWindow(options) { log.debug('Show update checker window'); - return Windows.createPopup('updateAvailable', _.extend({ - useWeb3: false, - electronOptions: { - width: 580, - height: 250, - alwaysOnTop: true, - resizable: false, - maximizable: false, - }, - }, options)); + return Windows.createPopup('updateAvailable', options); } diff --git a/modules/windows.js b/modules/windows.js index e44d410a9..a6532166b 100644 --- a/modules/windows.js +++ b/modules/windows.js @@ -177,22 +177,7 @@ class Windows { init() { log.info('Creating commonly-used windows'); - this.loading = this.create('loading', { - show: false, - url: `${global.interfacePopupsUrl}#loadingWindow`, - electronOptions: { - title: '', - alwaysOnTop: true, - resizable: false, - width: 100, - height: 80, - center: true, - frame: false, - useContentSize: true, - titleBarStyle: '', // hidden-inset: more space - skipTaskbar: true, - }, - }); + this.loading = this.create('loading'); this.loading.on('show', () => { this.loading.window.center(); @@ -215,12 +200,15 @@ class Windows { wnd.id = id; } }); + + store.dispatch({ type: '[MAIN]:WINDOWS:INIT_FINISH' }); } - create(type, options, callback) { - log.info(`Creating window: ${type}`); - options = options || {}; + create(type, opts, callback) { + global.store.dispatch({ type: '[MAIN]:WINDOW:CREATE_START', payload: { type } }); + + const options = _.deepExtend(this.getDefaultOptionsForType(type), opts || {}); const existing = this.getByType(type); @@ -241,14 +229,167 @@ class Windows { wnd.callback = callback; } + global.store.dispatch({ type: '[MAIN]:WINDOW:CREATE_FINISH', payload: { type } }); + return wnd; } - createPopup(type, options, callback) { - options = options || {}; + getDefaultOptionsForType(type) { + const mainWebPreferences = { + mist: { + nodeIntegration: true, /* necessary for webviews; + require will be removed through preloader */ + preload: `${__dirname}/preloader/mistUI.js`, + 'overlay-fullscreen-video': true, + 'overlay-scrollbars': true, + experimentalFeatures: true, + }, + wallet: { + preload: `${__dirname}/preloader/walletMain.js`, + 'overlay-fullscreen-video': true, + 'overlay-scrollbars': true, + } + } - let opts = { + switch (type) { + case 'main': + return { + primary: true, + electronOptions: { + width: Math.max(global.defaultWindow.width, 500), + height: Math.max(global.defaultWindow.height, 440), + x: global.defaultWindow.x, + y: global.defaultWindow.y, + webPreferences: mainWebPreferences[global.mode], + }, + } + case 'splash': + return { + primary: true, + url: `${global.interfacePopupsUrl}#splashScreen_${global.mode}`, + show: true, + electronOptions: { + width: 400, + height: 230, + resizable: false, + backgroundColor: '#F6F6F6', + useContentSize: true, + frame: false, + webPreferences: { + preload: `${__dirname}/preloader/splashScreen.js`, + }, + }, + } + case 'loading': + return { + show: false, + url: `${global.interfacePopupsUrl}#loadingWindow`, + electronOptions: { + title: '', + alwaysOnTop: true, + resizable: false, + width: 100, + height: 80, + center: true, + frame: false, + useContentSize: true, + titleBarStyle: '', // hidden-inset: more space + skipTaskbar: true, + }, + } + case 'onboardingScreen': + return { + primary: true, + electronOptions: { + width: 576, + height: 442, + }, + } + case 'about': + return { + electronOptions: { + width: 420, + height: 230, + alwaysOnTop: true, + }, + } + case 'remix': + return { + url: 'https://remix.ethereum.org', + electronOptions: { + width: 1024, + height: 720, + center: true, + frame: true, + resizable: true, + titleBarStyle: 'default', + } + } + case 'importAccount': + return { + electronOptions: { + width: 600, + height: 370, + alwaysOnTop: true, + }, + } + case 'requestAccount': + return { + electronOptions: { + width: 420, + height: 230, + alwaysOnTop: true, + }, + } + case 'connectAccount': + return { + electronOptions: { + width: 460, + height: 520, + maximizable: false, + minimizable: false, + alwaysOnTop: true, + }, + } + case 'sendTransactionConfirmation': + return { + electronOptions: { + width: 580, + height: 550, + alwaysOnTop: true, + enableLargerThanScreen: false, + resizable: true + }, + } + case 'updateAvailable': + return { + useWeb3: false, + electronOptions: { + width: 580, + height: 250, + alwaysOnTop: true, + resizable: false, + maximizable: false, + }, + } + case 'clientUpdateAvailable': + return { + useWeb3: false, + electronOptions: { + width: 600, + height: 340, + alwaysOnTop: false, + resizable: false, + maximizable: false, + }, + } + } + } + + + createPopup(type, options, callback) { + const defaultPopupOpts = { url: `${global.interfacePopupsUrl}#${type}`, show: true, ownerId: null, @@ -268,6 +409,8 @@ class Windows { } }; + let opts = _.deepExtend(defaultPopupOpts, this.getDefaultOptionsForType(type), options || {}); + // always show on top of main window const parent = _.find(this._windows, (w) => { return w.type === 'main'; @@ -278,8 +421,6 @@ class Windows { } - opts = _.deepExtend(opts, options); - // mark it as a pop-up window opts.isPopup = true; diff --git a/tests/unit/core/ui/reducer.test.js b/tests/unit/core/ui/reducer.test.js new file mode 100644 index 000000000..77e0419a2 --- /dev/null +++ b/tests/unit/core/ui/reducer.test.js @@ -0,0 +1,20 @@ +import { assert } from 'chai'; +import reducer, { initialState } from '../../../../modules/core/ui/reducer'; + +describe('the ui reducer', () => { + it('should return a default initial state', () => { + assert.deepEqual(reducer(undefined, {}), initialState); + }); + + it('should handle the "[MAIN]:WINDOW:CREATE_FINISH" action', () => { + const action = { + type: '[MAIN]:WINDOW:CREATE_FINISH', + payload: { type: 'about' } + }; + const expectedState = Object.assign({}, initialState, { + aboutWindowCreated: true, + }); + + assert.deepEqual(reducer(initialState, action), expectedState); + }); +}); From 51444e1ca121d01bc05933d8c805312b0850883e Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Mon, 16 Oct 2017 13:51:56 -0600 Subject: [PATCH 007/150] Removes premature optimization --- main.js | 718 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 357 insertions(+), 361 deletions(-) diff --git a/main.js b/main.js index 0caa765b3..1639d9f06 100644 --- a/main.js +++ b/main.js @@ -22,446 +22,442 @@ Q.config({ }); -init(); - -async function init() { - global.store = await configureReduxStore(); - - Settings.init(); - - const db = global.db = require('./modules/db'); - - require('./modules/ipcCommunicator.js'); - const appMenu = require('./modules/menuItems'); - const ipcProviderBackend = require('./modules/ipc/ipcProviderBackend.js'); - const ethereumNode = require('./modules/ethereumNode.js'); - const swarmNode = require('./modules/swarmNode.js'); - const nodeSync = require('./modules/nodeSync.js'); - - // Define global vars; The preloader makes some globals available to the client. - global.webviews = []; - global.mining = false; - global.mode = store.getState().settings.uiMode; - global.icon = `${__dirname}/icons/${global.mode}/icon.png`; - global.dirname = __dirname; - global.i18n = i18n; - - // INTERFACE PATHS - // - WALLET - if (global.mode === 'wallet') { - log.info('Starting in Wallet mode'); - - global.interfaceAppUrl = (Settings.inProductionMode) - ? `file://${__dirname}/interface/wallet/index.html` - : 'http://localhost:3050'; - global.interfacePopupsUrl = (Settings.inProductionMode) - ? `file://${__dirname}/interface/index.html` - : 'http://localhost:3000'; - - // - MIST - } else { - log.info('Starting in Mist mode'); +global.store = configureReduxStore(); + +Settings.init(); + +const db = global.db = require('./modules/db'); + +require('./modules/ipcCommunicator.js'); +const appMenu = require('./modules/menuItems'); +const ipcProviderBackend = require('./modules/ipc/ipcProviderBackend.js'); +const ethereumNode = require('./modules/ethereumNode.js'); +const swarmNode = require('./modules/swarmNode.js'); +const nodeSync = require('./modules/nodeSync.js'); + +// Define global vars; The preloader makes some globals available to the client. +global.webviews = []; +global.mining = false; +global.mode = store.getState().settings.uiMode; +global.icon = `${__dirname}/icons/${global.mode}/icon.png`; +global.dirname = __dirname; +global.i18n = i18n; + +// INTERFACE PATHS +// - WALLET +if (global.mode === 'wallet') { + log.info('Starting in Wallet mode'); + + global.interfaceAppUrl = (Settings.inProductionMode) + ? `file://${__dirname}/interface/wallet/index.html` + : 'http://localhost:3050'; + global.interfacePopupsUrl = (Settings.inProductionMode) + ? `file://${__dirname}/interface/index.html` + : 'http://localhost:3000'; + +// - MIST +} else { + log.info('Starting in Mist mode'); + + let url = (Settings.inProductionMode) + ? `file://${__dirname}/interface/index.html` + : 'http://localhost:3000'; + + if (Settings.cli.resetTabs) { + url += '?reset-tabs=true'; + } + + global.interfaceAppUrl = global.interfacePopupsUrl = url; +} + +// prevent crashes and close gracefully +process.on('uncaughtException', (error) => { + log.error('UNCAUGHT EXCEPTION', error); + store.dispatch(quitApp()); +}); + +// Quit when all windows are closed. +app.on('window-all-closed', () => { + store.dispatch(quitApp()); +}); + +// Listen to custom protocol incoming messages, needs registering of URL schemes +app.on('open-url', (e, url) => { + log.info('Open URL', url); +}); + + +let killedSocketsAndNodes = false; - let url = (Settings.inProductionMode) - ? `file://${__dirname}/interface/index.html` - : 'http://localhost:3000'; +app.on('before-quit', async (event) => { + if (!killedSocketsAndNodes) { + log.info('Defer quitting until sockets and node are shut down'); - if (Settings.cli.resetTabs) { - url += '?reset-tabs=true'; + event.preventDefault(); + + // sockets manager + try { + await Sockets.destroyAll(); + store.dispatch({ type: 'SOCKETS::DESTROY_ALL' }); + } catch (e) { + log.error('Error shutting down sockets'); } - global.interfaceAppUrl = global.interfacePopupsUrl = url; + // delay quit, so the sockets can close + setTimeout(async () => { + await ethereumNode.stop(); + store.dispatch({ type: 'ETH_NODE::STOP' }); + + killedSocketsAndNodes = true; + await db.close(); + store.dispatch({ type: 'DB::CLOSE' }); + + store.dispatch(quitApp()); + }, 500); + } else { + log.info('About to quit...'); } +}); - // prevent crashes and close gracefully - process.on('uncaughtException', (error) => { - log.error('UNCAUGHT EXCEPTION', error); - store.dispatch(quitApp()); - }); - // Quit when all windows are closed. - app.on('window-all-closed', () => { - store.dispatch(quitApp()); - }); +let mainWindow; +let splashWindow; +let onReady; +let startMainWindow; - // Listen to custom protocol incoming messages, needs registering of URL schemes - app.on('open-url', (e, url) => { - log.info('Open URL', url); - }); +// This method will be called when Electron has done everything +// initialization and ready for creating browser windows. +app.on('ready', async () => { + // if using HTTP RPC then inform user + if (Settings.rpcMode === 'http') { + dialog.showErrorBox('Insecure RPC connection', ` +WARNING: You are connecting to an Ethereum node via: ${Settings.rpcHttpPath} +This is less secure than using local IPC - your passwords will be sent over the wire in plaintext. - let killedSocketsAndNodes = false; +Only do this if you have secured your HTTP connection or you know what you are doing. +`); + } - app.on('before-quit', async (event) => { - if (!killedSocketsAndNodes) { - log.info('Defer quitting until sockets and node are shut down'); + // initialise the db + try { + await global.db.init(); + store.dispatch({ type: 'DB::INIT' }); + onReady(); + } catch (e) { + log.error(e); + store.dispatch(quitApp()); + } +}); - event.preventDefault(); +// Allows the Swarm protocol to behave like http +protocol.registerStandardSchemes(['bzz']); - // sockets manager - try { - await Sockets.destroyAll(); - store.dispatch({ type: 'SOCKETS::DESTROY_ALL' }); - } catch (e) { - log.error('Error shutting down sockets'); - } +onReady = () => { + global.config = db.getCollection('SYS_config'); - // delay quit, so the sockets can close - setTimeout(async () => { - await ethereumNode.stop(); - store.dispatch({ type: 'ETH_NODE::STOP' }); + // setup DB sync to backend + dbSync.backendSyncInit(); + store.dispatch({ type: 'DB::SYNC_TO_BACKEND' }); - killedSocketsAndNodes = true; - await db.close(); - store.dispatch({ type: 'DB::CLOSE' }); + // Initialise window mgr + Windows.init(); - store.dispatch(quitApp()); - }, 500); - } else { - log.info('About to quit...'); + // Enable the Swarm protocol + protocol.registerHttpProtocol('bzz', (request, callback) => { + const redirectPath = `${Settings.swarmURL}/${request.url.replace('bzz:/', 'bzz://')}`; + callback({ method: request.method, referrer: request.referrer, url: redirectPath }); + store.dispatch({ type: 'PROTOCOL::REGISTER', payload: { protocol: 'bzz' } }); + }, (error) => { + if (error) { + log.error(error); } }); + // check for update + if (!Settings.inAutoTestMode) UpdateChecker.run(); + store.dispatch({ type: 'UPDATE_CHECKER::RUN' }); - let mainWindow; - let splashWindow; - let onReady; - let startMainWindow; + // initialize the web3 IPC provider backend + ipcProviderBackend.init(); + store.dispatch({ type: 'IPC_PROVIDER_BACKEND::INIT' }); - // This method will be called when Electron has done everything - // initialization and ready for creating browser windows. - app.on('ready', async () => { - // if using HTTP RPC then inform user - if (Settings.rpcMode === 'http') { - dialog.showErrorBox('Insecure RPC connection', ` - WARNING: You are connecting to an Ethereum node via: ${Settings.rpcHttpPath} + // instantiate custom protocols + // require('./customProtocols.js'); - This is less secure than using local IPC - your passwords will be sent over the wire in plaintext. + // change to user language now that global.config object is ready + store.dispatch(setLanguageOnMain(Settings.language)); - Only do this if you have secured your HTTP connection or you know what you are doing. - `); - } + // add menu already here, so we have copy and paste functionality + appMenu(); - // initialise the db - try { - await global.db.init(); - store.dispatch({ type: 'DB::INIT' }); - onReady(); - } catch (e) { - log.error(e); - store.dispatch(quitApp()); - } - }); + global.defaultWindow = windowStateKeeper({ defaultWidth: 1024 + 208, defaultHeight: 720 }); - // Allows the Swarm protocol to behave like http - protocol.registerStandardSchemes(['bzz']); + // Create the browser window. + mainWindow = Windows.create('main'); - onReady = () => { - global.config = db.getCollection('SYS_config'); + // Delegating events to save window bounds on windowStateKeeper + global.defaultWindow.manage(mainWindow.window); - // setup DB sync to backend - dbSync.backendSyncInit(); - store.dispatch({ type: 'DB::SYNC_TO_BACKEND' }); + if (!Settings.inAutoTestMode) { + splashWindow = Windows.create('splash'); + } - // Initialise window mgr - Windows.init(); + // Checks time sync + if (!Settings.skiptimesynccheck) { + timesync.checkEnabled((err, enabled) => { + if (err) { + log.error('Couldn\'t infer if computer automatically syncs time.', err); + return; + } - // Enable the Swarm protocol - protocol.registerHttpProtocol('bzz', (request, callback) => { - const redirectPath = `${Settings.swarmURL}/${request.url.replace('bzz:/', 'bzz://')}`; - callback({ method: request.method, referrer: request.referrer, url: redirectPath }); - store.dispatch({ type: 'PROTOCOL::REGISTER', payload: { protocol: 'bzz' } }); - }, (error) => { - if (error) { - log.error(error); + if (!enabled) { + dialog.showMessageBox({ + type: 'warning', + buttons: ['OK'], + message: global.i18n.t('mist.errors.timeSync.title'), + detail: `${global.i18n.t('mist.errors.timeSync.description')}\n\n${global.i18n.t(`mist.errors.timeSync.${process.platform}`)}`, + }, () => { + }); } }); + } - // check for update - if (!Settings.inAutoTestMode) UpdateChecker.run(); - store.dispatch({ type: 'UPDATE_CHECKER::RUN' }); - - // initialize the web3 IPC provider backend - ipcProviderBackend.init(); - store.dispatch({ type: 'IPC_PROVIDER_BACKEND::INIT' }); - - // instantiate custom protocols - // require('./customProtocols.js'); - - // change to user language now that global.config object is ready - store.dispatch(setLanguageOnMain(Settings.language)); - // add menu already here, so we have copy and paste functionality - appMenu(); + const kickStart = () => { + // client binary stuff + ClientBinaryManager.on('status', (status, data) => { + Windows.broadcast('uiAction_clientBinaryStatus', status, data); + }); - global.defaultWindow = windowStateKeeper({ defaultWidth: 1024 + 208, defaultHeight: 720 }); + // node connection stuff + ethereumNode.on('nodeConnectionTimeout', () => { + Windows.broadcast('uiAction_nodeStatus', 'connectionTimeout'); + }); - // Create the browser window. - mainWindow = Windows.create('main'); + ethereumNode.on('nodeLog', (data) => { + Windows.broadcast('uiAction_nodeLogText', data.replace(/^.*[0-9]]/, '')); + }); - // Delegating events to save window bounds on windowStateKeeper - global.defaultWindow.manage(mainWindow.window); + // state change + ethereumNode.on('state', (state, stateAsText) => { + Windows.broadcast('uiAction_nodeStatus', stateAsText, + ethereumNode.STATES.ERROR === state ? ethereumNode.lastError : null + ); + }); - if (!Settings.inAutoTestMode) { - splashWindow = Windows.create('splash'); - } + // starting swarm + swarmNode.on('starting', () => { + Windows.broadcast('uiAction_swarmStatus', 'starting'); + store.dispatch({ type: 'SWARM::INIT_START' }); + }); - // Checks time sync - if (!Settings.skiptimesynccheck) { - timesync.checkEnabled((err, enabled) => { - if (err) { - log.error('Couldn\'t infer if computer automatically syncs time.', err); - return; - } - - if (!enabled) { - dialog.showMessageBox({ - type: 'warning', - buttons: ['OK'], - message: global.i18n.t('mist.errors.timeSync.title'), - detail: `${global.i18n.t('mist.errors.timeSync.description')}\n\n${global.i18n.t(`mist.errors.timeSync.${process.platform}`)}`, - }, () => { - }); - } - }); - } + // swarm download progress + swarmNode.on('downloadProgress', (progress) => { + Windows.broadcast('uiAction_swarmStatus', 'downloadProgress', progress); + }); + // started swarm + swarmNode.on('started', (isLocal) => { + Windows.broadcast('uiAction_swarmStatus', 'started', isLocal); + store.dispatch({ type: 'SWARM::INIT_FINISH' }); + }); - const kickStart = () => { - // client binary stuff - ClientBinaryManager.on('status', (status, data) => { - Windows.broadcast('uiAction_clientBinaryStatus', status, data); - }); - // node connection stuff - ethereumNode.on('nodeConnectionTimeout', () => { - Windows.broadcast('uiAction_nodeStatus', 'connectionTimeout'); + // capture sync results + const syncResultPromise = new Q((resolve, reject) => { + nodeSync.on('nodeSyncing', (result) => { + Windows.broadcast('uiAction_nodeSyncStatus', 'inProgress', result); }); - ethereumNode.on('nodeLog', (data) => { - Windows.broadcast('uiAction_nodeLogText', data.replace(/^.*[0-9]]/, '')); + nodeSync.on('stopped', () => { + Windows.broadcast('uiAction_nodeSyncStatus', 'stopped'); }); - // state change - ethereumNode.on('state', (state, stateAsText) => { - Windows.broadcast('uiAction_nodeStatus', stateAsText, - ethereumNode.STATES.ERROR === state ? ethereumNode.lastError : null - ); - }); + nodeSync.on('error', (err) => { + log.error('Error syncing node', err); - // starting swarm - swarmNode.on('starting', () => { - Windows.broadcast('uiAction_swarmStatus', 'starting'); - store.dispatch({ type: 'SWARM::INIT_START' }); + reject(err); }); - // swarm download progress - swarmNode.on('downloadProgress', (progress) => { - Windows.broadcast('uiAction_swarmStatus', 'downloadProgress', progress); - }); + nodeSync.on('finished', () => { + nodeSync.removeAllListeners('error'); + nodeSync.removeAllListeners('finished'); - // started swarm - swarmNode.on('started', (isLocal) => { - Windows.broadcast('uiAction_swarmStatus', 'started', isLocal); - store.dispatch({ type: 'SWARM::INIT_FINISH' }); + resolve(); }); + }); - - // capture sync results - const syncResultPromise = new Q((resolve, reject) => { - nodeSync.on('nodeSyncing', (result) => { - Windows.broadcast('uiAction_nodeSyncStatus', 'inProgress', result); + // check legacy chain + // CHECK for legacy chain (FORK RELATED) + Q.try(() => { + // open the legacy chain message + if ((Settings.loadUserData('daoFork') || '').trim() === 'false') { + dialog.showMessageBox({ + type: 'warning', + buttons: ['OK'], + message: global.i18n.t('mist.errors.legacyChain.title'), + detail: global.i18n.t('mist.errors.legacyChain.description') + }, () => { + shell.openExternal('https://github.com/ethereum/mist/releases'); + store.dispatch(quitApp()); }); - nodeSync.on('stopped', () => { - Windows.broadcast('uiAction_nodeSyncStatus', 'stopped'); - }); + throw new Error('Cant start client due to legacy non-Fork setting.'); + } + }) + .then(() => { + return ClientBinaryManager.init(); + }) + .then(() => { + return ethereumNode.init(); + }) + .then(() => { + // Wallet shouldn't start Swarm + if (global.mode === 'wallet') { + return Promise.resolve(); + } + return swarmNode.init(); + }) + .then(function sanityCheck() { + if (!ethereumNode.isIpcConnected) { + throw new Error('Either the node didn\'t start or IPC socket failed to connect.'); + } - nodeSync.on('error', (err) => { - log.error('Error syncing node', err); + /* At this point Geth is running and the socket is connected. */ + log.info('Connected via IPC to node.'); - reject(err); - }); + // update menu, to show node switching possibilities + appMenu(); + }) + .then(function getAccounts() { + return ethereumNode.send('eth_accounts', []); + }) + .then(function onboarding(resultData) { - nodeSync.on('finished', () => { - nodeSync.removeAllListeners('error'); - nodeSync.removeAllListeners('finished'); + if (ethereumNode.isGeth && (resultData.result === null || (_.isArray(resultData.result) && resultData.result.length === 0))) { + log.info('No accounts setup yet, lets do onboarding first.'); - resolve(); - }); - }); + return new Q((resolve, reject) => { + const onboardingWindow = Windows.createPopup('onboardingScreen'); - // check legacy chain - // CHECK for legacy chain (FORK RELATED) - Q.try(() => { - // open the legacy chain message - if ((Settings.loadUserData('daoFork') || '').trim() === 'false') { - dialog.showMessageBox({ - type: 'warning', - buttons: ['OK'], - message: global.i18n.t('mist.errors.legacyChain.title'), - detail: global.i18n.t('mist.errors.legacyChain.description') - }, () => { - shell.openExternal('https://github.com/ethereum/mist/releases'); + onboardingWindow.on('closed', () => { + store.dispatch({ type: 'ONBOARDING_WINDOW::CLOSE' }); store.dispatch(quitApp()); }); - throw new Error('Cant start client due to legacy non-Fork setting.'); - } - }) - .then(() => { - return ClientBinaryManager.init(); - }) - .then(() => { - return ethereumNode.init(); - }) - .then(() => { - // Wallet shouldn't start Swarm - if (global.mode === 'wallet') { - return Promise.resolve(); - } - return swarmNode.init(); - }) - .then(function sanityCheck() { - if (!ethereumNode.isIpcConnected) { - throw new Error('Either the node didn\'t start or IPC socket failed to connect.'); - } - - /* At this point Geth is running and the socket is connected. */ - log.info('Connected via IPC to node.'); - - // update menu, to show node switching possibilities - appMenu(); - }) - .then(function getAccounts() { - return ethereumNode.send('eth_accounts', []); - }) - .then(function onboarding(resultData) { - - if (ethereumNode.isGeth && (resultData.result === null || (_.isArray(resultData.result) && resultData.result.length === 0))) { - log.info('No accounts setup yet, lets do onboarding first.'); - - return new Q((resolve, reject) => { - const onboardingWindow = Windows.createPopup('onboardingScreen'); - - onboardingWindow.on('closed', () => { - store.dispatch({ type: 'ONBOARDING_WINDOW::CLOSE' }); - store.dispatch(quitApp()); - }); - - // change network types (mainnet, testnet) - ipcMain.on('onBoarding_changeNet', (e, testnet) => { - const newType = ethereumNode.type; - const newNetwork = testnet ? 'rinkeby' : 'main'; - - log.debug('Onboarding change network', newType, newNetwork); - - ethereumNode.restart(newType, newNetwork) - .then(function nodeRestarted() { - appMenu(); - }) - .catch((err) => { - log.error('Error restarting node', err); - - reject(err); - }); - }); - - // launch app - ipcMain.on('onBoarding_launchApp', () => { - // prevent that it closes the app - onboardingWindow.removeAllListeners('closed'); - onboardingWindow.close(); - store.dispatch({ type: 'ONBOARDING_WINDOW::CLOSE' }); - - ipcMain.removeAllListeners('onBoarding_changeNet'); - ipcMain.removeAllListeners('onBoarding_launchApp'); - - resolve(); - }); - - if (splashWindow) { - splashWindow.hide(); - } - }); - } + // change network types (mainnet, testnet) + ipcMain.on('onBoarding_changeNet', (e, testnet) => { + const newType = ethereumNode.type; + const newNetwork = testnet ? 'rinkeby' : 'main'; - return; - }) - .then(function doSync() { - // we're going to do the sync - so show splash - if (splashWindow) { - splashWindow.show(); - } + log.debug('Onboarding change network', newType, newNetwork); - if (!Settings.inAutoTestMode) { - return syncResultPromise; - } + ethereumNode.restart(newType, newNetwork) + .then(function nodeRestarted() { + appMenu(); + }) + .catch((err) => { + log.error('Error restarting node', err); - return; - }) - .then(function allDone() { - startMainWindow(); - }) - .catch((err) => { - log.error('Error starting up node and/or syncing', err); - }); /* socket connected to geth */ - }; /* kick start */ + reject(err); + }); + }); - if (splashWindow) { - splashWindow.on('ready', kickStart); - } else { - kickStart(); - } - }; /* onReady() */ + // launch app + ipcMain.on('onBoarding_launchApp', () => { + // prevent that it closes the app + onboardingWindow.removeAllListeners('closed'); + onboardingWindow.close(); + store.dispatch({ type: 'ONBOARDING_WINDOW::CLOSE' }); + ipcMain.removeAllListeners('onBoarding_changeNet'); + ipcMain.removeAllListeners('onBoarding_launchApp'); - /** - Start the main window and all its processes + resolve(); + }); - @method startMainWindow - */ - startMainWindow = () => { - log.info(`Loading Interface at ${global.interfaceAppUrl}`); + if (splashWindow) { + splashWindow.hide(); + } + }); + } - mainWindow.on('ready', () => { + return; + }) + .then(function doSync() { + // we're going to do the sync - so show splash if (splashWindow) { - splashWindow.close(); - store.dispatch({ type: 'SPLASH_WINDOW::CLOSE' }); + splashWindow.show(); } - mainWindow.show(); - store.dispatch({ type: 'MAIN_WINDOW::SHOW' }); - }); + if (!Settings.inAutoTestMode) { + return syncResultPromise; + } - mainWindow.load(global.interfaceAppUrl); + return; + }) + .then(function allDone() { + startMainWindow(); + }) + .catch((err) => { + log.error('Error starting up node and/or syncing', err); + }); /* socket connected to geth */ + }; /* kick start */ + + if (splashWindow) { + splashWindow.on('ready', kickStart); + } else { + kickStart(); + } +}; /* onReady() */ - // close app, when the main window is closed - mainWindow.on('closed', () => { - store.dispatch(quitApp()); - }); - // observe Tabs for changes and refresh menu - const Tabs = global.db.getCollection('UI_tabs'); +/** +Start the main window and all its processes - const sortedTabs = Tabs.addDynamicView('sorted_tabs'); - sortedTabs.applySimpleSort('position', false); +@method startMainWindow +*/ +startMainWindow = () => { + log.info(`Loading Interface at ${global.interfaceAppUrl}`); - const refreshMenu = () => { - clearTimeout(global._refreshMenuFromTabsTimer); + mainWindow.on('ready', () => { + if (splashWindow) { + splashWindow.close(); + store.dispatch({ type: 'SPLASH_WINDOW::CLOSE' }); + } + + mainWindow.show(); + store.dispatch({ type: 'MAIN_WINDOW::SHOW' }); + }); - global._refreshMenuFromTabsTimer = setTimeout(() => { - log.debug('Refresh menu with tabs'); + mainWindow.load(global.interfaceAppUrl); + + // close app, when the main window is closed + mainWindow.on('closed', () => { + store.dispatch(quitApp()); + }); - global.webviews = sortedTabs.data(); + // observe Tabs for changes and refresh menu + const Tabs = global.db.getCollection('UI_tabs'); - appMenu(global.webviews); - store.dispatch({ type: 'MENU::REFRESH' }); - }, 1000); - }; + const sortedTabs = Tabs.addDynamicView('sorted_tabs'); + sortedTabs.applySimpleSort('position', false); - Tabs.on('insert', refreshMenu); - Tabs.on('update', refreshMenu); - Tabs.on('delete', refreshMenu); + const refreshMenu = () => { + clearTimeout(global._refreshMenuFromTabsTimer); + + global._refreshMenuFromTabsTimer = setTimeout(() => { + log.debug('Refresh menu with tabs'); + + global.webviews = sortedTabs.data(); + + appMenu(global.webviews); + store.dispatch({ type: 'MENU::REFRESH' }); + }, 1000); }; -} + + Tabs.on('insert', refreshMenu); + Tabs.on('update', refreshMenu); + Tabs.on('delete', refreshMenu); +}; From 8ace13ebac7d53f8fc2e969a49a6daa761709184 Mon Sep 17 00:00:00 2001 From: WJ Cloud Date: Mon, 23 Oct 2017 19:49:20 +0900 Subject: [PATCH 008/150] Fix encoding error(KOR) --- scripts/zipdll.nsh | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/scripts/zipdll.nsh b/scripts/zipdll.nsh index 32e8b7c88..9571f2801 100755 --- a/scripts/zipdll.nsh +++ b/scripts/zipdll.nsh @@ -288,20 +288,20 @@ !ifdef "LANG_KOREAN" strcmp $LANGUAGE ${LANG_KOREAN} 0 +10 - Push " ¿À·ù : %s" - Push "È­ÀÏ ¼Ó¼ºÀ» ¾ò¾î¿Ã ¼ö ¾ø½À´Ï´Ù." - Push "¿À·ù: È­ÀÏ ¼Ó¼ºÀ» ¾ò¾î¿Ã ¼ö ¾ø½À´Ï´Ù." - Push "%sÀ»(¸¦) Ç® ¼ö ¾ø½À´Ï´Ù." - Push " ¿À·ù: %sÀ»(¸¦) Ç® ¼ö ¾ø½À´Ï´Ù." + Push " 오류 : %s" + Push "파일 속성을 얻어올 수 없습니다." + Push "오류: 파일 속성을 얻어올 수 없습니다." + Push "%s을(를) 풀 수 없습니다." + Push " 오류: %s을(를) 풀 수 없습니다." !ifdef FILE_ - Push " Ç®±â : %s" - Push " %d°³ÀÇ ÆÄÀÏ°ú Æú´õ¸¦ Ǫ´Â Áß" - Push "%sÀÇ ³»¿ëÀ» %s¿¡ Ǫ´Â Áß" + Push " 풀기 : %s" + Push " %d개의 파일과 폴더를 푸는 중" + Push "%s의 내용을 %s에 푸는 중" !else - Push "ÁöÁ¤µÈ ÆÄÀÏÀÌ ¾ÐÃà ÆÄÀÏ ¾È¿¡ ¾ø½À´Ï´Ù." - Push "¿À·ù: ÁöÁ¤µÈ ÆÄÀÏÀÌ ¾ÐÃà ÆÄÀÏ ¾È¿¡ ¾ø½À´Ï´Ù." - Push "%s ÆÄÀÏÀ» %s¿¡¼­ %s·Î Ǫ´Â Áß" + Push "지정된 파일이 압축 파일 안에 없습니다." + Push "오류: 지정된 파일이 압축 파일 안에 없습니다." + Push "%s 파일을 %s에서 %s로 푸는 중" !endif Push "/TRANSLATE" From 43c28f4041de6c8924226728c2336f0baa7730d1 Mon Sep 17 00:00:00 2001 From: WJ Cloud Date: Mon, 23 Oct 2017 20:40:36 +0900 Subject: [PATCH 009/150] Update zipdll.nsh --- scripts/zipdll.nsh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/zipdll.nsh b/scripts/zipdll.nsh index 9571f2801..f35cdbd91 100755 --- a/scripts/zipdll.nsh +++ b/scripts/zipdll.nsh @@ -287,7 +287,9 @@ !endif !ifdef "LANG_KOREAN" + strcmp $LANGUAGE ${LANG_KOREAN} 0 +10 + Push " 오류 : %s" Push "파일 속성을 얻어올 수 없습니다." Push "오류: 파일 속성을 얻어올 수 없습니다." From 3d1433f7fd5a4e993f9f4e678c02ccc166b4a3f7 Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Thu, 26 Oct 2017 17:03:36 -0600 Subject: [PATCH 010/150] Refactors app quit through Redux --- modules/core/store.js | 10 +--------- modules/core/ui/actions.js | 12 +++++++++++- modules/core/ui/reducer.js | 2 +- tests/unit/core/settings/actions.test.js | 1 - tests/unit/core/ui/actions.test.js | 23 +++++++++++++++++++++++ tests/unit/core/ui/reducer.test.js | 9 +++++++++ 6 files changed, 45 insertions(+), 12 deletions(-) create mode 100644 tests/unit/core/ui/actions.test.js diff --git a/modules/core/store.js b/modules/core/store.js index 2df2bf83f..9e4baa5f5 100644 --- a/modules/core/store.js +++ b/modules/core/store.js @@ -6,18 +6,10 @@ import { app } from 'electron'; import rootReducer from './rootReducer'; export default function configureReduxStore() { - const store = createStore( + return createStore( rootReducer, composeWithDevTools(applyMiddleware(thunk), electronEnhancer({ dispatchProxy: a => store.dispatch(a) })) ); - - store.subscribe(() => { - const state = store.getState(); - - if (state.ui.appQuit) return app.quit(); - }); - - return store; } diff --git a/modules/core/ui/actions.js b/modules/core/ui/actions.js index c208335d8..38ef8fcb6 100644 --- a/modules/core/ui/actions.js +++ b/modules/core/ui/actions.js @@ -1,3 +1,13 @@ +import { app } from 'electron'; + export function quitApp() { - return { type: 'APP::QUIT' }; + return dispatch => { + dispatch({ type: '[MAIN]:APP_QUIT:START' }); + try { + app.quit(); + dispatch({ type: '[MAIN]:APP_QUIT:SUCCESS' }); + } catch (error) { + dispatch({ type: '[MAIN]:APP_QUIT:FAILURE', error }); + } + } } diff --git a/modules/core/ui/reducer.js b/modules/core/ui/reducer.js index 18275a5b3..d918dc356 100644 --- a/modules/core/ui/reducer.js +++ b/modules/core/ui/reducer.js @@ -20,7 +20,7 @@ export const initialState = { const ui = (state = initialState, action) => { switch (action.type) { - case 'APP::QUIT': + case '[MAIN]:APP_QUIT:SUCCESS': return Object.assign({}, state, { appQuit: true }); case 'MAIN_WINDOW::CLOSE': return Object.assign({}, state, { mainWindowVisible: false }); diff --git a/tests/unit/core/settings/actions.test.js b/tests/unit/core/settings/actions.test.js index 754cb1292..1e4df4fee 100644 --- a/tests/unit/core/settings/actions.test.js +++ b/tests/unit/core/settings/actions.test.js @@ -2,7 +2,6 @@ import { assert } from 'chai'; import configureMockStore from 'redux-mock-store'; import thunk from 'redux-thunk'; import { initialState } from '../../../../modules/core/settings/reducer'; -import rootReducer from '../../../../modules/core/rootReducer'; import { getLanguage, resetMenu, diff --git a/tests/unit/core/ui/actions.test.js b/tests/unit/core/ui/actions.test.js new file mode 100644 index 000000000..3d05837bc --- /dev/null +++ b/tests/unit/core/ui/actions.test.js @@ -0,0 +1,23 @@ +import { assert } from 'chai'; +import configureMockStore from 'redux-mock-store'; +import thunk from 'redux-thunk'; +import { initialState } from '../../../../modules/core/ui/reducer'; +import { quitApp } from '../../../../modules/core/ui/actions'; + +describe('ui actions:', () => { + describe('asynchronous action creators', () => { + const middlewares = [thunk]; + const initMockStore = configureMockStore(middlewares); + const store = initMockStore({ ui: initialState }); + + afterEach(() => store.clearActions()); + + it('should handle #quitApp', async () => { + await store.dispatch(quitApp()); + const actions = store.getActions(); + + assert.equal(actions.length, 2); + assert.equal(actions[0].type, '[MAIN]:APP_QUIT:START'); + }); + }); +}); diff --git a/tests/unit/core/ui/reducer.test.js b/tests/unit/core/ui/reducer.test.js index 77e0419a2..6337f2078 100644 --- a/tests/unit/core/ui/reducer.test.js +++ b/tests/unit/core/ui/reducer.test.js @@ -17,4 +17,13 @@ describe('the ui reducer', () => { assert.deepEqual(reducer(initialState, action), expectedState); }); + + it('should handle the "[MAIN]:APP_QUIT:SUCCESS" action', () => { + const action = { type: '[MAIN]:APP_QUIT:SUCCESS' }; + const expectedState = Object.assign({}, initialState, { + appQuit: true + }); + + assert.deepEqual(reducer(initialState, action), expectedState); + }); }); From 0ef3395fec2880fb8146acd190f297800f6585d4 Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Fri, 10 Nov 2017 16:22:25 -0500 Subject: [PATCH 011/150] Standardizes language --- main.js | 26 +++--- modules/core/settings/reducer.js | 15 ++-- package.json | 1 + yarn.lock | 144 ++++++++++++++++++++++++++++++- 4 files changed, 162 insertions(+), 24 deletions(-) diff --git a/main.js b/main.js index 1639d9f06..ec8eb2f69 100644 --- a/main.js +++ b/main.js @@ -98,7 +98,7 @@ app.on('before-quit', async (event) => { // sockets manager try { await Sockets.destroyAll(); - store.dispatch({ type: 'SOCKETS::DESTROY_ALL' }); + store.dispatch({ type: '[MAIN]:SOCKETS:DESTROY' }); } catch (e) { log.error('Error shutting down sockets'); } @@ -106,11 +106,11 @@ app.on('before-quit', async (event) => { // delay quit, so the sockets can close setTimeout(async () => { await ethereumNode.stop(); - store.dispatch({ type: 'ETH_NODE::STOP' }); + store.dispatch({ type: '[MAIN]:ETH_NODE:STOP' }); killedSocketsAndNodes = true; await db.close(); - store.dispatch({ type: 'DB::CLOSE' }); + store.dispatch({ type: '[MAIN]:DB:CLOSE' }); store.dispatch(quitApp()); }, 500); @@ -142,7 +142,7 @@ Only do this if you have secured your HTTP connection or you know what you are d // initialise the db try { await global.db.init(); - store.dispatch({ type: 'DB::INIT' }); + store.dispatch({ type: '[MAIN]:DB:INIT' }); onReady(); } catch (e) { log.error(e); @@ -158,7 +158,7 @@ onReady = () => { // setup DB sync to backend dbSync.backendSyncInit(); - store.dispatch({ type: 'DB::SYNC_TO_BACKEND' }); + store.dispatch({ type: '[MAIN]:DB:SYNC_TO_BACKEND' }); // Initialise window mgr Windows.init(); @@ -167,7 +167,7 @@ onReady = () => { protocol.registerHttpProtocol('bzz', (request, callback) => { const redirectPath = `${Settings.swarmURL}/${request.url.replace('bzz:/', 'bzz://')}`; callback({ method: request.method, referrer: request.referrer, url: redirectPath }); - store.dispatch({ type: 'PROTOCOL::REGISTER', payload: { protocol: 'bzz' } }); + store.dispatch({ type: '[MAIN]:PROTOCOL:REGISTER', payload: { protocol: 'bzz' } }); }, (error) => { if (error) { log.error(error); @@ -175,12 +175,14 @@ onReady = () => { }); // check for update - if (!Settings.inAutoTestMode) UpdateChecker.run(); - store.dispatch({ type: 'UPDATE_CHECKER::RUN' }); + if (!Settings.inAutoTestMode) { + UpdateChecker.run(); + store.dispatch({ type: '[MAIN]:UPDATE_CHECKER:FINISHED' }); + } // initialize the web3 IPC provider backend ipcProviderBackend.init(); - store.dispatch({ type: 'IPC_PROVIDER_BACKEND::INIT' }); + store.dispatch({ type: '[MAIN]:IPC_PROVIDER_BACKEND:INIT' }); // instantiate custom protocols // require('./customProtocols.js'); @@ -249,7 +251,7 @@ onReady = () => { // starting swarm swarmNode.on('starting', () => { Windows.broadcast('uiAction_swarmStatus', 'starting'); - store.dispatch({ type: 'SWARM::INIT_START' }); + store.dispatch({ type: '[MAIN]:SWARM:INIT_START' }); }); // swarm download progress @@ -260,7 +262,7 @@ onReady = () => { // started swarm swarmNode.on('started', (isLocal) => { Windows.broadcast('uiAction_swarmStatus', 'started', isLocal); - store.dispatch({ type: 'SWARM::INIT_FINISH' }); + store.dispatch({ type: '[MAIN]:SWARM:INIT_FINISH' }); }); @@ -453,7 +455,7 @@ startMainWindow = () => { global.webviews = sortedTabs.data(); appMenu(global.webviews); - store.dispatch({ type: 'MENU::REFRESH' }); + store.dispatch({ type: '[MAIN]:MENU:REFRESH' }); }, 1000); }; diff --git a/modules/core/settings/reducer.js b/modules/core/settings/reducer.js index ddc12da03..3fec145ce 100644 --- a/modules/core/settings/reducer.js +++ b/modules/core/settings/reducer.js @@ -6,7 +6,6 @@ export const initialState = { ignoreGpuBlacklist: false, i18n: '', ipcProviderBackendInit: false, - mining: false, productionMode: null, protocols: [], rpcMode: '', @@ -18,11 +17,11 @@ export const initialState = { const settings = (state = initialState, action) => { switch (action.type) { - case 'DB::INIT': + case '[MAIN]:DB:INIT': return Object.assign({}, state, { dbInit: true }); - case 'DB::SYNC_TO_BACKEND': + case '[MAIN]:DB:SYNC_TO_BACKEND': return Object.assign({}, state, { dbSync: true }); - case 'PROTOCOL::REGISTER': + case '[MAIN]:PROTOCOL:REGISTER': return Object.assign({}, state, { protocols: state.protocols.concat(action.payload.protocol) }); @@ -33,17 +32,15 @@ const settings = (state = initialState, action) => { return Object.assign({}, state, { ignoreGpuBlacklist: true }); case '[MAIN]:TEST_MODE:SET': return Object.assign({}, state, { autoTestMode: true }); - case 'SETTINGS_MINING::SET': - return Object.assign({}, state, { mining: action.payload.mining }); case '[MAIN]:CLI_FLAGS:SYNC': return Object.assign({}, state, { cliFlags: action.payload.cliFlags }); case '[MAIN]:SET_LANGUAGE_ON_MAIN:SUCCESS': return Object.assign({}, state, { i18n: action.payload.i18n }); - case 'SWARM::INIT_FINISH': + case '[MAIN]:SWARM:INIT_FINISH': return Object.assign({}, state, { swarmInit: true }); - case 'UPDATE_CHECKER::FINISH': + case '[MAIN]:UPDATE_CHECKER:FINISH': return Object.assign({}, state, { updateCheckerRan: true }); - case 'IPC_PROVIDER_BACKEND::FINISH': + case '[MAIN]:IPC_PROVIDER_BACKEND:FINISH': return Object.assign({}, state, { ipcProviderBackendInit: true }); default: return state; diff --git a/package.json b/package.json index 1462f37b2..3d720265e 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "dev:electron": "electron -r babel-register main.js", "dev:meteor": "cd interface && meteor --no-release-check", "dev:tools": "open http://remotedev.io/local/", + "test:basic": "gulp test --test=basic", "test:unit": "mocha --compilers babel-register tests/unit/**/* --watch", "test:unit:once": "mocha --compilers babel-register tests/unit/**/*" }, diff --git a/yarn.lock b/yarn.lock index 67cf1416b..1b7ec022e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -514,6 +514,10 @@ balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" +base-64@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" + base64-js@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978" @@ -859,6 +863,10 @@ clone-stats@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" +clone@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" + clone@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" @@ -922,6 +930,10 @@ compare-version@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" +component-emitter@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.0.tgz#ccd113a86388d06482d03de3fc7df98526ba8efe" + compress-commons@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.2.0.tgz#58587092ef20d37cb58baf000112c9278ff73b9f" @@ -2159,6 +2171,10 @@ get-caller-file@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" +get-params@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/get-params/-/get-params-0.1.2.tgz#bae0dfaba588a0c60d7834c0d8dc2ff60eeef2fe" + get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" @@ -3005,6 +3021,10 @@ js-yaml@^3.5.1, js-yaml@^3.7.0: argparse "^1.0.7" esprima "^4.0.0" +jsan@^3.1.0, jsan@^3.1.5: + version "3.1.9" + resolved "https://registry.yarnpkg.com/jsan/-/jsan-3.1.9.tgz#2705676c1058f0a7d9ac266ad036a5769cfa7c96" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -3142,6 +3162,10 @@ liftoff@^2.1.0: rechoir "^0.6.2" resolve "^1.1.7" +linked-list@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/linked-list/-/linked-list-0.1.0.tgz#798b0ff97d1b92a4fd08480f55aea4e9d49d37bf" + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -3168,6 +3192,10 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" +lodash-es@^4.2.1: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.4.tgz#dcc1d7552e150a0640073ba9cb31d70f032950e7" + lodash._baseassign@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" @@ -3306,7 +3334,7 @@ lodash.values@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" -lodash@^4.0.0, lodash@^4.11.1, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.8.0, lodash@~4.17.4: +lodash@^4.0.0, lodash@^4.11.1, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.8.0, lodash@~4.17.4: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -3330,7 +3358,7 @@ lokijs@^1.4.3: version "1.5.0" resolved "https://registry.yarnpkg.com/lokijs/-/lokijs-1.5.0.tgz#99e403d6a89e47e11ed0c5d499fb55a0603d5efc" -loose-envify@^1.0.0: +loose-envify@^1.0.0, loose-envify@^1.1.0: version "1.3.1" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" dependencies: @@ -4133,7 +4161,7 @@ query-string@^2.4.0: dependencies: strict-uri-encode "^1.0.0" -querystring@0.2.0: +querystring@0.2.0, querystring@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" @@ -4254,6 +4282,36 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" +redux-devtools-instrument@^1.3.3: + version "1.8.2" + resolved "https://registry.yarnpkg.com/redux-devtools-instrument/-/redux-devtools-instrument-1.8.2.tgz#5e91cfe402e790dae3fd2f0d235f7b7d84b09ffe" + dependencies: + lodash "^4.2.0" + symbol-observable "^1.0.2" + +redux-electron-store@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/redux-electron-store/-/redux-electron-store-0.4.1.tgz#b9f92b4299be97b0a5920f03c899a7f9285c3e1c" + dependencies: + lodash "^4.13.1" + +redux-mock-store@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/redux-mock-store/-/redux-mock-store-1.3.0.tgz#6edfef0d2332f20576381069d6d889a6d0a4451c" + +redux-thunk@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.2.0.tgz#e615a16e16b47a19a515766133d1e3e99b7852e5" + +redux@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b" + dependencies: + lodash "^4.2.1" + lodash-es "^4.2.1" + loose-envify "^1.1.0" + symbol-observable "^1.0.3" + regenerate@^1.2.1: version "1.3.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" @@ -4303,6 +4361,33 @@ regjsparser@^0.1.4: dependencies: jsesc "~0.5.0" +remote-redux-devtools@^0.5.12: + version "0.5.12" + resolved "https://registry.yarnpkg.com/remote-redux-devtools/-/remote-redux-devtools-0.5.12.tgz#42cb95dfa9e54c1d9671317c5e7bba41e68caec2" + dependencies: + jsan "^3.1.5" + querystring "^0.2.0" + redux-devtools-instrument "^1.3.3" + remotedev-utils "^0.1.1" + rn-host-detect "^1.0.1" + socketcluster-client "^5.3.1" + +remotedev-serialize@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/remotedev-serialize/-/remotedev-serialize-0.1.0.tgz#074768e98cb7aa806f45994eeb0c8af95120ee32" + dependencies: + jsan "^3.1.0" + +remotedev-utils@^0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/remotedev-utils/-/remotedev-utils-0.1.4.tgz#643700819a943678073c75eb185e81d96620b348" + dependencies: + get-params "^0.1.2" + jsan "^3.1.5" + lodash "^4.0.0" + remotedev-serialize "^0.1.0" + shortid "^2.2.6" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -4464,6 +4549,10 @@ rlp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.0.0.tgz#9db384ff4b89a8f61563d92395d8625b18f3afb0" +rn-host-detect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/rn-host-detect/-/rn-host-detect-1.1.3.tgz#242d76e2fa485c48d751416e65b7cce596969e91" + run-async@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" @@ -4509,6 +4598,26 @@ sax@>=0.6.0: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" +sc-channel@~1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/sc-channel/-/sc-channel-1.0.6.tgz#b38bd47a993e78290fbc53467867f6b2a0a08639" + dependencies: + sc-emitter "1.x.x" + +sc-emitter@1.x.x, sc-emitter@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/sc-emitter/-/sc-emitter-1.1.0.tgz#ef119d4222f4c64f887b486964ef11116cdd0e75" + dependencies: + component-emitter "1.2.0" + +sc-errors@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/sc-errors/-/sc-errors-1.3.3.tgz#c00bc4c766a970cc8d5937d08cd58e931d7dae05" + +sc-formatter@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/sc-formatter/-/sc-formatter-3.0.1.tgz#c8b3fec0eea51b883dbc22ddfeacb46cd0e8db6c" + secp256k1@^3.0.1: version "3.3.0" resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.3.0.tgz#50ec9b201ba401403dd13ccbf21d31eeb3ff43cf" @@ -4624,6 +4733,10 @@ shelljs@^0.7.5, shelljs@^0.7.7: interpret "^1.0.0" rechoir "^0.6.2" +shortid@^2.2.6: + version "2.2.8" + resolved "https://registry.yarnpkg.com/shortid/-/shortid-2.2.8.tgz#033b117d6a2e975804f6f0969dbe7d3d0b355131" + sigmund@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" @@ -4676,6 +4789,20 @@ sntp@2.x.x: dependencies: hoek "4.x.x" +socketcluster-client@^5.3.1: + version "5.5.2" + resolved "https://registry.yarnpkg.com/socketcluster-client/-/socketcluster-client-5.5.2.tgz#9d4369e0e722ff7e55e5422c2d44f5afe1aff128" + dependencies: + base-64 "0.1.0" + clone "2.1.1" + linked-list "0.1.0" + querystring "0.2.0" + sc-channel "~1.0.6" + sc-emitter "~1.1.0" + sc-errors "~1.3.0" + sc-formatter "~3.0.0" + ws "3.0.0" + solc@^0.4.15: version "0.4.16" resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.16.tgz#809a5b1257c7c200e11a841b377eaec274698539" @@ -4927,6 +5054,10 @@ swarm-js@^0.1.21: tar.gz "^1.0.5" xhr-request-promise "^0.1.2" +symbol-observable@^1.0.2, symbol-observable@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" + table@^3.7.8: version "3.8.3" resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" @@ -5452,6 +5583,13 @@ write@^0.2.1: dependencies: mkdirp "^0.5.1" +ws@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-3.0.0.tgz#98ddb00056c8390cb751e7788788497f99103b6c" + dependencies: + safe-buffer "~5.0.1" + ultron "~1.1.0" + ws@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/ws/-/ws-3.1.0.tgz#8afafecdeab46d572e5397ee880739367aa2f41c" From 7a1c23595fe65a42f5c80e0eb54dfbacf98081b8 Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Wed, 18 Oct 2017 00:08:59 -0600 Subject: [PATCH 012/150] Introduces a reusable window --- interface/client/templates/index.html | 1 + interface/client/templates/index.js | 11 +- .../templates/popupWindows/generic.html | 4 + .../client/templates/popupWindows/generic.js | 17 ++ modules/ipc/methods/eth_sendTransaction.js | 5 +- modules/ipcCommunicator.js | 7 +- modules/preloader/mistUI.js | 6 +- modules/windows.js | 163 ++++++++++++++++++ 8 files changed, 203 insertions(+), 11 deletions(-) create mode 100644 interface/client/templates/popupWindows/generic.html create mode 100644 interface/client/templates/popupWindows/generic.js diff --git a/interface/client/templates/index.html b/interface/client/templates/index.html index 8015cb19b..3e65800b1 100644 --- a/interface/client/templates/index.html +++ b/interface/client/templates/index.html @@ -12,6 +12,7 @@ {{> GlobalNotifications}} +
diff --git a/interface/client/templates/index.js b/interface/client/templates/index.js index 1c92d6c21..254ab523d 100644 --- a/interface/client/templates/index.js +++ b/interface/client/templates/index.js @@ -4,13 +4,18 @@ Template Controllers @module Templates */ -/** +/**a The body template @class [template] body @constructor */ +// Generic windows reuse windows by switching the template +ipc.on('uiAction_switchTemplate', (e, templateName) => { + TemplateVar.setTo('#dapp-form-helper-iframe', 'MainRenderTemplate', `popupWindows_${templateName}`); +}); + Template.body.helpers({ /** Chooses the view to render at start @@ -18,6 +23,10 @@ Template.body.helpers({ @method renderApp */ 'renderApp': function () { + // Generic windows return the TemplateVar if set in the ipc call above + const template = TemplateVar.get('MainRenderTemplate'); + if (template) { return template; } + if (_.isEmpty(location.hash)) { $('title').text('Mist'); return 'layout_main'; diff --git a/interface/client/templates/popupWindows/generic.html b/interface/client/templates/popupWindows/generic.html new file mode 100644 index 000000000..715524272 --- /dev/null +++ b/interface/client/templates/popupWindows/generic.html @@ -0,0 +1,4 @@ + diff --git a/interface/client/templates/popupWindows/generic.js b/interface/client/templates/popupWindows/generic.js new file mode 100644 index 000000000..164e15b1b --- /dev/null +++ b/interface/client/templates/popupWindows/generic.js @@ -0,0 +1,17 @@ +/** +Template Controllers + +@module Templates +*/ + + +/** +The about template + +@class [template] popupWindows_about +@constructor +*/ +Template['popupWindows_generic'].onCreated(function () { + +}); + diff --git a/modules/ipc/methods/eth_sendTransaction.js b/modules/ipc/methods/eth_sendTransaction.js index 11baf5c67..da6c7acf1 100644 --- a/modules/ipc/methods/eth_sendTransaction.js +++ b/modules/ipc/methods/eth_sendTransaction.js @@ -59,7 +59,7 @@ module.exports = class extends BaseProcessor { BlurOverlay.enable(); - modalWindow.on('closed', () => { + modalWindow.on('hidden', () => { BlurOverlay.disable(); // user cancelled? @@ -69,8 +69,7 @@ module.exports = class extends BaseProcessor { }); ipc.once('backendAction_unlockedAccountAndSentTransaction', (ev, err, result) => { - if (Windows.getById(ev.sender.id) === modalWindow - && !modalWindow.isClosed) { + if (Windows.getById(ev.sender.id) === modalWindow && !modalWindow.isClosed) { if (err || !result) { this._log.debug('Confirmation error', err); diff --git a/modules/ipcCommunicator.js b/modules/ipcCommunicator.js index 72ba18a38..05c9d2c0d 100644 --- a/modules/ipcCommunicator.js +++ b/modules/ipcCommunicator.js @@ -77,17 +77,20 @@ ipc.on('backendAction_windowMessageToOwner', (e, error, value) => { const windowId = e.sender.id; const senderWindow = Windows.getById(windowId); + // If msg is from a generic window, use the "actingType" instead of type + const senderWindowType = senderWindow.actingType || senderWindow.type; + if (senderWindow.ownerId) { const ownerWindow = Windows.getById(senderWindow.ownerId); const mainWindow = Windows.getByType('main'); if (ownerWindow) { - ownerWindow.send('uiAction_windowMessage', senderWindow.type, error, value); + ownerWindow.send('uiAction_windowMessage', senderWindowType, error, value); } // send through the mainWindow to the webviews if (mainWindow) { - mainWindow.send('uiAction_windowMessage', senderWindow.type, senderWindow.ownerId, error, value); + mainWindow.send('uiAction_windowMessage', senderWindowType, senderWindow.ownerId, error, value); } } }); diff --git a/modules/preloader/mistUI.js b/modules/preloader/mistUI.js index ee2a1ae89..fa772e78e 100644 --- a/modules/preloader/mistUI.js +++ b/modules/preloader/mistUI.js @@ -58,11 +58,8 @@ delete window.require; // A message coming from other window, to be passed to a webview ipcRenderer.on('uiAction_windowMessage', (e, type, id, error, value) => { - console.log(type, id, error, value); if ((type === 'requestAccount') || (type === 'connectAccount') && !error) { - Tabs.update({ webviewId: id }, { $addToSet: { - 'permissions.accounts': value, - } }); + Tabs.update({ webviewId: id }, { $addToSet: { 'permissions.accounts': value } }); } // forward to the webview (TODO: remove and manage in the ipcCommunicator?) @@ -73,7 +70,6 @@ ipcRenderer.on('uiAction_windowMessage', (e, type, id, error, value) => { webview.send('uiAction_windowMessage', type, error, value); } } - }); ipcRenderer.on('uiAction_enableBlurOverlay', (e, value) => { diff --git a/modules/windows.js b/modules/windows.js index a6532166b..eabf96524 100644 --- a/modules/windows.js +++ b/modules/windows.js @@ -3,6 +3,156 @@ const Settings = require('./settings'); const log = require('./utils/logger').create('Windows'); const EventEmitter = require('events').EventEmitter; +class GenericWindow extends EventEmitter { + constructor(mgr) { + super(); + + this._mgr = mgr; + this._log = log.create('generic'); + this.isPrimary = false; + this.type = 'generic'; + this.isPopup = true; + this.ownerId = null; + this.isAvailable = true; + this.actingType = null; + + let electronOptions = { + title: Settings.appName, + show: false, + icon: global.icon, + titleBarStyle: 'hidden-inset', // hidden-inset: more space + backgroundColor: '#F6F6F6', + acceptFirstMouse: true, + darkTheme: true, + webPreferences: { + preload: `${__dirname}/preloader/popupWindows.js`, + nodeIntegration: false, + webaudio: true, + webgl: false, + webSecurity: false, // necessary to make routing work on file:// protocol for assets in windows and popups. Not webviews! + textAreasAreResizable: true, + }, + }; + + // electronOptions = _.deepExtend(electronOptions, opts.electronOptions); + + this._log.debug('Creating generic window'); + this.window = new BrowserWindow(electronOptions); + + // set Accept_Language header + this.session = this.window.webContents.session; + this.session.setUserAgent(this.session.getUserAgent(), Settings.language); + + this.webContents = this.window.webContents; + this.webContents.once('did-finish-load', () => { + this.isContentReady = true; + this._log.debug(`Content loaded, id: ${this.id}`); + + // if (opts.sendData) { + // if (_.isString(opts.sendData)) { + // this.send(opts.sendData); + // } else if (_.isObject(opts.sendData)) { + // for (const key in opts.sendData) { + // if ({}.hasOwnProperty.call(opts.sendData, key)) { + // this.send(key, opts.sendData[key]); + // } + // } + // } + // } + + // if (opts.show) { this.show(); } + this.emit('ready'); + }); + + + // prevent dropping files + this.webContents.on('will-navigate', e => e.preventDefault()); + + + this.window.once('closed', () => { + this._log.debug('Closed'); + + this.isShown = false; + this.isClosed = true; + this.isContentReady = false; + + this.emit('closed'); + }); + + this.window.on('close', (e) => { + // Preserve window unless quitting Mist + if (store.getState().ui.appQuit) { + return this.emit('close', e); + } + + e.preventDefault(); + this.hide(); + }); + + this.window.on('show', e => this.emit('show', e)); + + this.window.on('hide', e => this.emit('hide', e)); + + this.load(`${global.interfacePopupsUrl}#generic`); + } + + load(url) { + if (this.isClosed) { return; } + this._log.debug(`Load URL: ${url}`); + this.window.loadURL(url); + } + + send() { + if (this.isClosed || !this.isContentReady) { return; } + this._log.trace('Sending data', arguments); + this.webContents.send.apply(this.webContents, arguments); + } + + hide() { + if (this.isClosed) { return; } + this._log.debug('Hide'); + this.window.hide(); + this.send('uiAction_switchTemplate', 'generic'); + this.actingType = null; + this.isShown = false; + this.isAvailable = true; + this.emit('hidden'); + } + + show() { + if (this.isClosed) { return; } + this._log.debug('Show'); + this.window.show(); + this.isShown = true; + } + + close() { + if (this.isClosed) { return; } + this._log.debug('Avoiding close of generic window'); + this.hide(); + } + + reuse(type, options, callback) { + this.isAvailable = false; + this.actingType = type; + if (callback) { this.callback = callback; } + if (options.ownerId) { this.ownerId = options.ownerId; } + if (options.sendData) { + if (_.isString(options.sendData)) { + this.send(options.sendData); + } else if (_.isObject(options.sendData)) { + for (const key in options.sendData) { + if ({}.hasOwnProperty.call(options.sendData, key)) { + this.send(key, options.sendData[key]); + } + } + } + } + this.window.setSize(options.electronOptions.width, options.electronOptions.height); + this.send('uiAction_switchTemplate', type); + this.show(); + } +} class Window extends EventEmitter { constructor(mgr, type, opts) { @@ -178,6 +328,7 @@ class Windows { log.info('Creating commonly-used windows'); this.loading = this.create('loading'); + this.generic = this.createGenericWindow(); this.loading.on('show', () => { this.loading.window.center(); @@ -204,6 +355,10 @@ class Windows { store.dispatch({ type: '[MAIN]:WINDOWS:INIT_FINISH' }); } + createGenericWindow() { + const wnd = this._windows.generic = new GenericWindow(this); + return wnd; + } create(type, opts, callback) { global.store.dispatch({ type: '[MAIN]:WINDOW:CREATE_START', payload: { type } }); @@ -308,6 +463,7 @@ class Windows { } case 'about': return { + // url: `${global.interfacePopupsUrl}#about`, electronOptions: { width: 420, height: 230, @@ -430,6 +586,13 @@ class Windows { opts.electronOptions.webPreferences.preload = `${__dirname}/preloader/popupWindowsNoWeb3.js`; } + // If generic window is available, recycle it + const genericWindow = this.getByType('generic'); + if (genericWindow && genericWindow.isAvailable) { + genericWindow.reuse(type, opts, callback); + return genericWindow; + } + this.loading.show(); log.info(`Create popup window: ${type}`); From e11fc753e7b9fbea4f14390720b3010611dda417 Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Thu, 19 Oct 2017 13:54:03 -0600 Subject: [PATCH 013/150] Handles generic windows in tests --- interface/client/appStart.js | 2 +- tests/_base.js | 31 +++++++++++++++---------------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/interface/client/appStart.js b/interface/client/appStart.js index 031144eec..1bf10a1fa 100644 --- a/interface/client/appStart.js +++ b/interface/client/appStart.js @@ -74,7 +74,7 @@ Meteor.startup(function () { mistInit(); } - store.dispatch(getLanguage()); + if (store) { store.dispatch(getLanguage()); } // change moment and numeral language, when language changes Tracker.autorun(function () { diff --git a/tests/_base.js b/tests/_base.js index e6bf7f3b1..459d47d21 100644 --- a/tests/_base.js +++ b/tests/_base.js @@ -261,23 +261,22 @@ const Utils = { return elem.value; }, - * openAndFocusNewWindow(fnPromise) { - const client = this.client; - - const existingHandles = (yield client.windowHandles()).value; - + * openAndFocusNewWindow(type, fnPromise) { yield fnPromise(); + const handle = yield this.selectWindowHandleByType(type); + yield this.client.window(handle); + }, + * selectWindowHandleByType(type) { + const client = this.client; + const windowHandles = (yield client.windowHandles()).value; - yield this.waitUntil('new window visible', function checkForAddWindow() { - return client.windowHandles().then((handles) => { - return handles.value.length === existingHandles.length + 1; - }); - }); - - const newHandles = (yield client.windowHandles()).value; - - // focus on new window - yield client.window(newHandles.pop()); + for (let handle in windowHandles) { + yield client.window(windowHandles[handle]); + const windowUrl = yield client.getUrl(); + if (new RegExp(type).test(windowUrl)) { + return windowHandles[handle]; + } + } }, * execElemsMethod(clientElementIdMethod, selector) { const elems = yield this.client.elements(selector); @@ -389,7 +388,7 @@ const Utils = { * pinCurrentTab() { const client = this.client; - yield this.openAndFocusNewWindow(() => { + yield this.openAndFocusNewWindow('generic', () => { return client.click('span.connect-button'); }); yield client.click('.dapp-primary-button'); From 0eaa6495aa9062e63b0348cc620bf3adf48441d0 Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Fri, 20 Oct 2017 09:17:29 -0600 Subject: [PATCH 014/150] Prevents duplicate popups --- modules/windows.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/windows.js b/modules/windows.js index eabf96524..9b859c8bd 100644 --- a/modules/windows.js +++ b/modules/windows.js @@ -591,6 +591,12 @@ class Windows { if (genericWindow && genericWindow.isAvailable) { genericWindow.reuse(type, opts, callback); return genericWindow; + } else if (genericWindow) { + // If a generic window exists of the same actingType, focus that window + if (genericWindow.actingType === type) { + genericWindow.webContents.focus(); + return genericWindow; + } } this.loading.show(); From 628e79e17ea7314734bcbc9d2206366788ebe75e Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Fri, 20 Oct 2017 11:17:56 -0600 Subject: [PATCH 015/150] Refactors; loading + remix bug fixes --- interface/client/appStart.js | 2 +- interface/client/templates/index.html | 2 +- interface/client/templates/index.js | 4 +- .../client/templates/popupWindows/generic.js | 2 +- modules/windows.js | 106 +++++++----------- 5 files changed, 43 insertions(+), 73 deletions(-) diff --git a/interface/client/appStart.js b/interface/client/appStart.js index 1bf10a1fa..031144eec 100644 --- a/interface/client/appStart.js +++ b/interface/client/appStart.js @@ -74,7 +74,7 @@ Meteor.startup(function () { mistInit(); } - if (store) { store.dispatch(getLanguage()); } + store.dispatch(getLanguage()); // change moment and numeral language, when language changes Tracker.autorun(function () { diff --git a/interface/client/templates/index.html b/interface/client/templates/index.html index 3e65800b1..82d1d5356 100644 --- a/interface/client/templates/index.html +++ b/interface/client/templates/index.html @@ -12,7 +12,7 @@ {{> GlobalNotifications}} -
+
diff --git a/interface/client/templates/index.js b/interface/client/templates/index.js index 254ab523d..ce04c55d3 100644 --- a/interface/client/templates/index.js +++ b/interface/client/templates/index.js @@ -4,7 +4,7 @@ Template Controllers @module Templates */ -/**a +/** The body template @class [template] body @@ -13,7 +13,7 @@ The body template // Generic windows reuse windows by switching the template ipc.on('uiAction_switchTemplate', (e, templateName) => { - TemplateVar.setTo('#dapp-form-helper-iframe', 'MainRenderTemplate', `popupWindows_${templateName}`); + TemplateVar.setTo('#generic-body', 'MainRenderTemplate', `popupWindows_${templateName}`); }); Template.body.helpers({ diff --git a/interface/client/templates/popupWindows/generic.js b/interface/client/templates/popupWindows/generic.js index 164e15b1b..9731d1956 100644 --- a/interface/client/templates/popupWindows/generic.js +++ b/interface/client/templates/popupWindows/generic.js @@ -8,7 +8,7 @@ Template Controllers /** The about template -@class [template] popupWindows_about +@class [template] popupWindows_generic @constructor */ Template['popupWindows_generic'].onCreated(function () { diff --git a/modules/windows.js b/modules/windows.js index 9b859c8bd..66f201d70 100644 --- a/modules/windows.js +++ b/modules/windows.js @@ -16,27 +16,8 @@ class GenericWindow extends EventEmitter { this.isAvailable = true; this.actingType = null; - let electronOptions = { - title: Settings.appName, - show: false, - icon: global.icon, - titleBarStyle: 'hidden-inset', // hidden-inset: more space - backgroundColor: '#F6F6F6', - acceptFirstMouse: true, - darkTheme: true, - webPreferences: { - preload: `${__dirname}/preloader/popupWindows.js`, - nodeIntegration: false, - webaudio: true, - webgl: false, - webSecurity: false, // necessary to make routing work on file:// protocol for assets in windows and popups. Not webviews! - textAreasAreResizable: true, - }, - }; - - // electronOptions = _.deepExtend(electronOptions, opts.electronOptions); - this._log.debug('Creating generic window'); + let electronOptions = this._mgr.getDefaultOptionsForType('generic'); this.window = new BrowserWindow(electronOptions); // set Accept_Language header @@ -45,46 +26,21 @@ class GenericWindow extends EventEmitter { this.webContents = this.window.webContents; this.webContents.once('did-finish-load', () => { - this.isContentReady = true; this._log.debug(`Content loaded, id: ${this.id}`); - - // if (opts.sendData) { - // if (_.isString(opts.sendData)) { - // this.send(opts.sendData); - // } else if (_.isObject(opts.sendData)) { - // for (const key in opts.sendData) { - // if ({}.hasOwnProperty.call(opts.sendData, key)) { - // this.send(key, opts.sendData[key]); - // } - // } - // } - // } - - // if (opts.show) { this.show(); } this.emit('ready'); }); - // prevent dropping files this.webContents.on('will-navigate', e => e.preventDefault()); - this.window.once('closed', () => { this._log.debug('Closed'); - - this.isShown = false; - this.isClosed = true; - this.isContentReady = false; - this.emit('closed'); }); this.window.on('close', (e) => { // Preserve window unless quitting Mist - if (store.getState().ui.appQuit) { - return this.emit('close', e); - } - + if (store.getState().ui.appQuit) { return this.emit('close', e); } e.preventDefault(); this.hide(); }); @@ -97,37 +53,30 @@ class GenericWindow extends EventEmitter { } load(url) { - if (this.isClosed) { return; } this._log.debug(`Load URL: ${url}`); this.window.loadURL(url); } send() { - if (this.isClosed || !this.isContentReady) { return; } this._log.trace('Sending data', arguments); this.webContents.send.apply(this.webContents, arguments); } hide() { - if (this.isClosed) { return; } this._log.debug('Hide'); this.window.hide(); this.send('uiAction_switchTemplate', 'generic'); this.actingType = null; - this.isShown = false; this.isAvailable = true; this.emit('hidden'); } show() { - if (this.isClosed) { return; } this._log.debug('Show'); this.window.show(); - this.isShown = true; } close() { - if (this.isClosed) { return; } this._log.debug('Avoiding close of generic window'); this.hide(); } @@ -418,7 +367,7 @@ class Windows { y: global.defaultWindow.y, webPreferences: mainWebPreferences[global.mode], }, - } + }; case 'splash': return { primary: true, @@ -435,7 +384,7 @@ class Windows { preload: `${__dirname}/preloader/splashScreen.js`, }, }, - } + }; case 'loading': return { show: false, @@ -451,8 +400,11 @@ class Windows { useContentSize: true, titleBarStyle: '', // hidden-inset: more space skipTaskbar: true, + webPreferences: { + preload: `${__dirname}/preloader/popupWindowsNoWeb3.js`, + }, }, - } + }; case 'onboardingScreen': return { primary: true, @@ -460,16 +412,16 @@ class Windows { width: 576, height: 442, }, - } + }; case 'about': return { - // url: `${global.interfacePopupsUrl}#about`, + url: `${global.interfacePopupsUrl}#about`, electronOptions: { width: 420, height: 230, alwaysOnTop: true, }, - } + }; case 'remix': return { url: 'https://remix.ethereum.org', @@ -481,7 +433,7 @@ class Windows { resizable: true, titleBarStyle: 'default', } - } + }; case 'importAccount': return { electronOptions: { @@ -489,7 +441,7 @@ class Windows { height: 370, alwaysOnTop: true, }, - } + }; case 'requestAccount': return { electronOptions: { @@ -497,7 +449,7 @@ class Windows { height: 230, alwaysOnTop: true, }, - } + }; case 'connectAccount': return { electronOptions: { @@ -507,7 +459,7 @@ class Windows { minimizable: false, alwaysOnTop: true, }, - } + }; case 'sendTransactionConfirmation': return { electronOptions: { @@ -517,7 +469,7 @@ class Windows { enableLargerThanScreen: false, resizable: true }, - } + }; case 'updateAvailable': return { useWeb3: false, @@ -528,7 +480,7 @@ class Windows { resizable: false, maximizable: false, }, - } + }; case 'clientUpdateAvailable': return { useWeb3: false, @@ -539,7 +491,25 @@ class Windows { resizable: false, maximizable: false, }, - } + }; + case 'generic': + return { + title: Settings.appName, + show: false, + icon: global.icon, + titleBarStyle: 'hidden-inset', // hidden-inset: more space + backgroundColor: '#F6F6F6', + acceptFirstMouse: true, + darkTheme: true, + webPreferences: { + preload: `${__dirname}/preloader/popupWindows.js`, + nodeIntegration: false, + webaudio: true, + webgl: false, + webSecurity: false, // necessary to make routing work on file:// protocol for assets in windows and popups. Not webviews! + textAreasAreResizable: true, + }, + }; } } @@ -586,9 +556,9 @@ class Windows { opts.electronOptions.webPreferences.preload = `${__dirname}/preloader/popupWindowsNoWeb3.js`; } - // If generic window is available, recycle it + // If generic window is available, recycle it (unless opening remix) const genericWindow = this.getByType('generic'); - if (genericWindow && genericWindow.isAvailable) { + if (type !== 'remix' && genericWindow && genericWindow.isAvailable) { genericWindow.reuse(type, opts, callback); return genericWindow; } else if (genericWindow) { From 80c152d6c885905f761bc184436c030ea8e2b2db Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Sun, 12 Nov 2017 21:03:42 -0500 Subject: [PATCH 016/150] Simplifies window state --- main.js | 32 +++++------------- modules/core/ui/actions.js | 16 +++++++++ modules/core/ui/reducer.js | 54 +++++++++++++----------------- modules/windows.js | 7 ++-- tests/unit/core/ui/reducer.test.js | 51 ++++++++++++++++++++++++++++ 5 files changed, 104 insertions(+), 56 deletions(-) diff --git a/main.js b/main.js index 3e331be50..0c8973ce3 100644 --- a/main.js +++ b/main.js @@ -14,7 +14,7 @@ const windowStateKeeper = require('electron-window-state'); const log = logger.create('main'); import configureReduxStore from './modules/core/store'; -import { quitApp } from './modules/core/ui/actions'; +import { closeWindow, openWindow, quitApp } from './modules/core/ui/actions'; import { setLanguageOnMain } from './modules/core/settings/actions'; Q.config({ @@ -201,9 +201,7 @@ onReady = () => { // Delegating events to save window bounds on windowStateKeeper global.defaultWindow.manage(mainWindow.window); - if (!Settings.inAutoTestMode) { - splashWindow = Windows.create('splash'); - } + if (!Settings.inAutoTestMode) { splashWindow = Windows.create('splash'); } // Checks time sync if (!Settings.skiptimesynccheck) { @@ -227,12 +225,10 @@ onReady = () => { const kickStart = () => { - // client binary stuff ClientBinaryManager.on('status', (status, data) => { Windows.broadcast('uiAction_clientBinaryStatus', status, data); }); - // node connection stuff ethereumNode.on('nodeConnectionTimeout', () => { Windows.broadcast('uiAction_nodeStatus', 'connectionTimeout'); }); @@ -241,32 +237,27 @@ onReady = () => { Windows.broadcast('uiAction_nodeLogText', data.replace(/^.*[0-9]]/, '')); }); - // state change ethereumNode.on('state', (state, stateAsText) => { Windows.broadcast('uiAction_nodeStatus', stateAsText, ethereumNode.STATES.ERROR === state ? ethereumNode.lastError : null ); }); - // starting swarm swarmNode.on('starting', () => { Windows.broadcast('uiAction_swarmStatus', 'starting'); store.dispatch({ type: '[MAIN]:SWARM:INIT_START' }); }); - // swarm download progress swarmNode.on('downloadProgress', (progress) => { Windows.broadcast('uiAction_swarmStatus', 'downloadProgress', progress); }); - // started swarm swarmNode.on('started', (isLocal) => { Windows.broadcast('uiAction_swarmStatus', 'started', isLocal); store.dispatch({ type: '[MAIN]:SWARM:INIT_FINISH' }); }); - // capture sync results const syncResultPromise = new Q((resolve, reject) => { nodeSync.on('nodeSyncing', (result) => { Windows.broadcast('uiAction_nodeSyncStatus', 'inProgress', result); @@ -344,7 +335,7 @@ onReady = () => { const onboardingWindow = Windows.createPopup('onboardingScreen'); onboardingWindow.on('closed', () => { - store.dispatch({ type: 'ONBOARDING_WINDOW::CLOSE' }); + store.dispatch(closeWindow('onboarding')); store.dispatch(quitApp()); }); @@ -371,7 +362,7 @@ onReady = () => { // prevent that it closes the app onboardingWindow.removeAllListeners('closed'); onboardingWindow.close(); - store.dispatch({ type: 'ONBOARDING_WINDOW::CLOSE' }); + store.dispatch(closeWindow('onboarding')); ipcMain.removeAllListeners('onBoarding_changeNet'); ipcMain.removeAllListeners('onBoarding_launchApp'); @@ -388,15 +379,8 @@ onReady = () => { return; }) .then(function doSync() { - // we're going to do the sync - so show splash - if (splashWindow) { - splashWindow.show(); - } - - if (!Settings.inAutoTestMode) { - return syncResultPromise; - } - + if (splashWindow) { splashWindow.show(); } + if (!Settings.inAutoTestMode) { return syncResultPromise; } return; }) .then(function allDone() { @@ -426,11 +410,11 @@ startMainWindow = () => { mainWindow.on('ready', () => { if (splashWindow) { splashWindow.close(); - store.dispatch({ type: 'SPLASH_WINDOW::CLOSE' }); + store.dispatch(closeWindow('splash')); } mainWindow.show(); - store.dispatch({ type: 'MAIN_WINDOW::SHOW' }); + store.dispatch(openWindow('main')); }); mainWindow.load(global.interfaceAppUrl); diff --git a/modules/core/ui/actions.js b/modules/core/ui/actions.js index 38ef8fcb6..1121306a3 100644 --- a/modules/core/ui/actions.js +++ b/modules/core/ui/actions.js @@ -11,3 +11,19 @@ export function quitApp() { } } } + +export function openWindow(windowType) { + return { type: '[MAIN]:WINDOW:OPEN', payload: { windowType } }; +} + +export function closeWindow(windowType) { + return { type: '[MAIN]:WINDOW:CLOSE', payload: { windowType } }; +} + +export function reuseGenericWindow(actingType) { + return { type: '[MAIN]:GENERIC_WINDOW:REUSE', payload: { actingType } }; +} + +export function resetGenericWindow(actingType) { + return { type: '[MAIN]:GENERIC_WINDOW:RESET' }; +} diff --git a/modules/core/ui/reducer.js b/modules/core/ui/reducer.js index d918dc356..dccaba481 100644 --- a/modules/core/ui/reducer.js +++ b/modules/core/ui/reducer.js @@ -1,45 +1,39 @@ export const initialState = { - aboutWindowCreated: false, appQuit: false, - clientUpdateAvailableWindowCreated: false, - connectAccountWindowCreated: false, - importAccountWindowCreated: false, - loadingWindowCreated: false, - mainWindowCreated: false, - mainWindowVisible: false, - onboardingScreenWindowCreated: false, - onboardingScreenWindowVisible: false, - remixWindowCreated: false, - requestAccountWindowCreated: false, - sendTransactionConfirmationWindowCreated: false, - splashWindowCreated: false, - splashWindowVisible: false, - updateAvailableWindowCreated: false, + genericWindowActingType: '', windowsInit: false, + windowsOpen: [], }; const ui = (state = initialState, action) => { switch (action.type) { case '[MAIN]:APP_QUIT:SUCCESS': return Object.assign({}, state, { appQuit: true }); - case 'MAIN_WINDOW::CLOSE': - return Object.assign({}, state, { mainWindowVisible: false }); + case '[MAIN]:WINDOW:OPEN': + // TODO: make this list unique + return Object.assign({}, state, { + windowsOpen: state.windowsOpen.concat(action.payload.windowType) + }); + case '[MAIN]:WINDOW:CLOSE': + return Object.assign({}, state, { + windowsOpen: state.windowsOpen.filter(w => { + return w !== action.payload.windowType; + }) + }); case '[MAIN]:WINDOW:CREATE_FINISH': - return Object.assign({}, state, { [`${action.payload.type}WindowCreated`]: true }); - case 'MAIN_WINDOW::SHOW': - return Object.assign({}, state, { mainWindowVisible: true }); - case 'MAIN_WINDOW::HIDE': - return Object.assign({}, state, { mainWindowVisible: false }); - case 'ONBOARDING_WINDOW::CLOSE': - return Object.assign({}, state, { onboardingScreenWindowVisible: false }); - case 'SPLASH_WINDOW::CLOSE': - return Object.assign({}, state, { splashWindowVisible: false }); - case 'SPLASH_WINDOW::SHOW': - return Object.assign({}, state, { splashWindowVisible: true }); - case 'SPLASH_WINDOW::HIDE': - return Object.assign({}, state, { splashWindowVisible: false }); + return Object.assign({}, state, { + [`${action.payload.type}WindowCreated`]: true + }); case '[MAIN]:WINDOWS:INIT_FINISH': return Object.assign({}, state, { windowsInit: true }); + case '[MAIN]:GENERIC_WINDOW:REUSE': + return Object.assign({}, state, { + genericWindowActingType: action.payload.actingType, + }); + case '[MAIN]:GENERIC_WINDOW:RESET': + return Object.assign({}, state, { + genericWindowActingType: '', + }); default: return state; } diff --git a/modules/windows.js b/modules/windows.js index 66f201d70..9aa3ecd22 100644 --- a/modules/windows.js +++ b/modules/windows.js @@ -2,6 +2,7 @@ const { app, BrowserWindow, ipcMain: ipc } = require('electron'); const Settings = require('./settings'); const log = require('./utils/logger').create('Windows'); const EventEmitter = require('events').EventEmitter; +import { resetGenericWindow, reuseGenericWindow } from './core/ui/actions'; class GenericWindow extends EventEmitter { constructor(mgr) { @@ -69,6 +70,7 @@ class GenericWindow extends EventEmitter { this.actingType = null; this.isAvailable = true; this.emit('hidden'); + store.dispatch(resetGenericWindow()); } show() { @@ -100,6 +102,7 @@ class GenericWindow extends EventEmitter { this.window.setSize(options.electronOptions.width, options.electronOptions.height); this.send('uiAction_switchTemplate', type); this.show(); + store.dispatch(reuseGenericWindow(type)); } } @@ -310,7 +313,7 @@ class Windows { } create(type, opts, callback) { - global.store.dispatch({ type: '[MAIN]:WINDOW:CREATE_START', payload: { type } }); + store.dispatch({ type: '[MAIN]:WINDOW:CREATE_START', payload: { type } }); const options = _.deepExtend(this.getDefaultOptionsForType(type), opts || {}); @@ -333,7 +336,7 @@ class Windows { wnd.callback = callback; } - global.store.dispatch({ type: '[MAIN]:WINDOW:CREATE_FINISH', payload: { type } }); + store.dispatch({ type: '[MAIN]:WINDOW:CREATE_FINISH', payload: { type } }); return wnd; } diff --git a/tests/unit/core/ui/reducer.test.js b/tests/unit/core/ui/reducer.test.js index 6337f2078..cfb424cac 100644 --- a/tests/unit/core/ui/reducer.test.js +++ b/tests/unit/core/ui/reducer.test.js @@ -26,4 +26,55 @@ describe('the ui reducer', () => { assert.deepEqual(reducer(initialState, action), expectedState); }); + + it('should handle the "[MAIN]:WINDOW:OPEN" action', () => { + const state = Object.assign({}, initialState, { + windowsOpen: ['about'] + }); + const action = { + type: '[MAIN]:WINDOW:OPEN', + payload: { windowType: 'onboarding' }, + }; + const expectedState = Object.assign({}, state, { + windowsOpen: ['about', 'onboarding'] + }); + + assert.deepEqual(reducer(state, action), expectedState); + }); + + it('should handle the "[MAIN]:WINDOW:CLOSE" action', () => { + const state = Object.assign({}, initialState, { + windowsOpen: ['about', 'onboarding'] + }); + const action = { + type: '[MAIN]:WINDOW:CLOSE', + payload: { windowType: 'onboarding' }, + }; + const expectedState = Object.assign({}, state, { + windowsOpen: ['about'] + }); + + assert.deepEqual(reducer(state, action), expectedState); + }); + + it('should handle the "[MAIN]:GENERIC_WINDOW:REUSE" action', () => { + const action = { + type: '[MAIN]:GENERIC_WINDOW:REUSE', + payload: { actingType: 'about' }, + }; + const expectedState = Object.assign({}, initialState, { + genericWindowActingType: 'about' + }); + + assert.deepEqual(reducer(initialState, action), expectedState); + }); + + it('should handle the "[MAIN]:GENERIC_WINDOW:RESET" action', () => { + const state = Object.assign({}, initialState, { + genericWindowActingType: 'about', + }); + const action = { type: '[MAIN]:GENERIC_WINDOW:RESET' }; + + assert.deepEqual(reducer(state, action), initialState); + }); }); From 914c5407c911a479055681801c09dd03c021e244 Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Tue, 14 Nov 2017 09:36:39 -0700 Subject: [PATCH 017/150] Simplifies window tracking + refactors --- main.js | 28 ++++++---------------------- modules/core/ui/actions.js | 2 +- modules/core/ui/reducer.js | 13 ++++++------- modules/windows.js | 15 ++++++++++++++- tests/unit/core/ui/reducer.test.js | 21 +++++++-------------- 5 files changed, 34 insertions(+), 45 deletions(-) diff --git a/main.js b/main.js index 0c8973ce3..7996c3de4 100644 --- a/main.js +++ b/main.js @@ -14,7 +14,7 @@ const windowStateKeeper = require('electron-window-state'); const log = logger.create('main'); import configureReduxStore from './modules/core/store'; -import { closeWindow, openWindow, quitApp } from './modules/core/ui/actions'; +import { quitApp } from './modules/core/ui/actions'; import { setLanguageOnMain } from './modules/core/settings/actions'; Q.config({ @@ -77,14 +77,10 @@ process.on('uncaughtException', (error) => { }); // Quit when all windows are closed. -app.on('window-all-closed', () => { - store.dispatch(quitApp()); -}); +app.on('window-all-closed', () => store.dispatch(quitApp())); // Listen to custom protocol incoming messages, needs registering of URL schemes -app.on('open-url', (e, url) => { - log.info('Open URL', url); -}); +app.on('open-url', (e, url) => log.info('Open URL', url)); let killedSocketsAndNodes = false; @@ -334,10 +330,7 @@ onReady = () => { return new Q((resolve, reject) => { const onboardingWindow = Windows.createPopup('onboardingScreen'); - onboardingWindow.on('closed', () => { - store.dispatch(closeWindow('onboarding')); - store.dispatch(quitApp()); - }); + onboardingWindow.on('closed', () => store.dispatch(quitApp())); // change network types (mainnet, testnet) ipcMain.on('onBoarding_changeNet', (e, testnet) => { @@ -362,7 +355,6 @@ onReady = () => { // prevent that it closes the app onboardingWindow.removeAllListeners('closed'); onboardingWindow.close(); - store.dispatch(closeWindow('onboarding')); ipcMain.removeAllListeners('onBoarding_changeNet'); ipcMain.removeAllListeners('onBoarding_launchApp'); @@ -408,21 +400,13 @@ startMainWindow = () => { log.info(`Loading Interface at ${global.interfaceAppUrl}`); mainWindow.on('ready', () => { - if (splashWindow) { - splashWindow.close(); - store.dispatch(closeWindow('splash')); - } - + if (splashWindow) { splashWindow.close(); } mainWindow.show(); - store.dispatch(openWindow('main')); }); mainWindow.load(global.interfaceAppUrl); - // close app, when the main window is closed - mainWindow.on('closed', () => { - store.dispatch(quitApp()); - }); + mainWindow.on('closed', () => store.dispatch(quitApp())); // observe Tabs for changes and refresh menu const Tabs = global.db.getCollection('UI_tabs'); diff --git a/modules/core/ui/actions.js b/modules/core/ui/actions.js index 1121306a3..3d33b3e06 100644 --- a/modules/core/ui/actions.js +++ b/modules/core/ui/actions.js @@ -24,6 +24,6 @@ export function reuseGenericWindow(actingType) { return { type: '[MAIN]:GENERIC_WINDOW:REUSE', payload: { actingType } }; } -export function resetGenericWindow(actingType) { +export function resetGenericWindow() { return { type: '[MAIN]:GENERIC_WINDOW:RESET' }; } diff --git a/modules/core/ui/reducer.js b/modules/core/ui/reducer.js index dccaba481..1e327eefe 100644 --- a/modules/core/ui/reducer.js +++ b/modules/core/ui/reducer.js @@ -1,3 +1,5 @@ +import uniq from 'lodash/uniq'; + export const initialState = { appQuit: false, genericWindowActingType: '', @@ -10,29 +12,26 @@ const ui = (state = initialState, action) => { case '[MAIN]:APP_QUIT:SUCCESS': return Object.assign({}, state, { appQuit: true }); case '[MAIN]:WINDOW:OPEN': - // TODO: make this list unique return Object.assign({}, state, { - windowsOpen: state.windowsOpen.concat(action.payload.windowType) + windowsOpen: uniq(state.windowsOpen.concat(action.payload.windowType)), }); case '[MAIN]:WINDOW:CLOSE': return Object.assign({}, state, { windowsOpen: state.windowsOpen.filter(w => { return w !== action.payload.windowType; - }) - }); - case '[MAIN]:WINDOW:CREATE_FINISH': - return Object.assign({}, state, { - [`${action.payload.type}WindowCreated`]: true + }), }); case '[MAIN]:WINDOWS:INIT_FINISH': return Object.assign({}, state, { windowsInit: true }); case '[MAIN]:GENERIC_WINDOW:REUSE': return Object.assign({}, state, { genericWindowActingType: action.payload.actingType, + windowsOpen: state.windowsOpen.concat('generic'), }); case '[MAIN]:GENERIC_WINDOW:RESET': return Object.assign({}, state, { genericWindowActingType: '', + windowsOpen: state.windowsOpen.filter(i => i !== 'generic'), }); default: return state; diff --git a/modules/windows.js b/modules/windows.js index 9aa3ecd22..644513481 100644 --- a/modules/windows.js +++ b/modules/windows.js @@ -2,7 +2,12 @@ const { app, BrowserWindow, ipcMain: ipc } = require('electron'); const Settings = require('./settings'); const log = require('./utils/logger').create('Windows'); const EventEmitter = require('events').EventEmitter; -import { resetGenericWindow, reuseGenericWindow } from './core/ui/actions'; +import { + closeWindow, + openWindow, + resetGenericWindow, + reuseGenericWindow, +} from './core/ui/actions'; class GenericWindow extends EventEmitter { constructor(mgr) { @@ -189,6 +194,7 @@ class Window extends EventEmitter { this.isContentReady = false; this.emit('closed'); + store.dispatch(closeWindow(this.type)); }); this.window.once('close', (e) => { @@ -255,6 +261,8 @@ class Window extends EventEmitter { this.window.show(); this.isShown = true; + + store.dispatch(openWindow(this.type)); } @@ -284,6 +292,11 @@ class Windows { this.loading.on('show', () => { this.loading.window.center(); + store.dispatch(openWindow('loading')); + }); + + this.loading.on('hide', () => { + store.dispatch(closeWindow('loading')); }); // when a window gets initalized it will send us its id diff --git a/tests/unit/core/ui/reducer.test.js b/tests/unit/core/ui/reducer.test.js index cfb424cac..62532ced8 100644 --- a/tests/unit/core/ui/reducer.test.js +++ b/tests/unit/core/ui/reducer.test.js @@ -6,18 +6,6 @@ describe('the ui reducer', () => { assert.deepEqual(reducer(undefined, {}), initialState); }); - it('should handle the "[MAIN]:WINDOW:CREATE_FINISH" action', () => { - const action = { - type: '[MAIN]:WINDOW:CREATE_FINISH', - payload: { type: 'about' } - }; - const expectedState = Object.assign({}, initialState, { - aboutWindowCreated: true, - }); - - assert.deepEqual(reducer(initialState, action), expectedState); - }); - it('should handle the "[MAIN]:APP_QUIT:SUCCESS" action', () => { const action = { type: '[MAIN]:APP_QUIT:SUCCESS' }; const expectedState = Object.assign({}, initialState, { @@ -63,7 +51,8 @@ describe('the ui reducer', () => { payload: { actingType: 'about' }, }; const expectedState = Object.assign({}, initialState, { - genericWindowActingType: 'about' + genericWindowActingType: 'about', + windowsOpen: ['generic'], }); assert.deepEqual(reducer(initialState, action), expectedState); @@ -72,9 +61,13 @@ describe('the ui reducer', () => { it('should handle the "[MAIN]:GENERIC_WINDOW:RESET" action', () => { const state = Object.assign({}, initialState, { genericWindowActingType: 'about', + windowsOpen: ['generic', 'main'], }); const action = { type: '[MAIN]:GENERIC_WINDOW:RESET' }; + const expectedState = Object.assign({}, initialState, { + windowsOpen: ['main'], + }); - assert.deepEqual(reducer(state, action), initialState); + assert.deepEqual(reducer(state, action), expectedState); }); }); From 2c9f6d739a3cfb01f34cbfa26c56eb1327e750f6 Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Mon, 20 Nov 2017 13:36:34 -0700 Subject: [PATCH 018/150] Stub out store in splash screen --- modules/preloader/splashScreen.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/preloader/splashScreen.js b/modules/preloader/splashScreen.js index 98308dfbb..6174998df 100644 --- a/modules/preloader/splashScreen.js +++ b/modules/preloader/splashScreen.js @@ -16,3 +16,6 @@ window.ipc = ipcRenderer; window.mist = mist(); window.mistMode = remote.getGlobal('mode'); window.dirname = remote.getGlobal('dirname'); + +// Stub out the Redux store +window.store = { dispatch: () => {} }; From b1dc2e32dab1c5266b4bc1cfffccf1259b226947 Mon Sep 17 00:00:00 2001 From: Everton Fraga Date: Tue, 21 Nov 2017 10:29:06 -0500 Subject: [PATCH 019/150] Updating geth to 1.7.3 --- clientBinaries.json | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/clientBinaries.json b/clientBinaries.json index bd0402368..badf46cea 100644 --- a/clientBinaries.json +++ b/clientBinaries.json @@ -1,15 +1,15 @@ { "clients": { "Geth": { - "version": "1.7.2", + "version": "1.7.3", "platforms": { "linux": { "x64": { "download": { - "url": "https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.7.2-1db4ecdc.tar.gz", + "url": "https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.7.3-4bb3c89d.tar.gz", "type": "tar", - "md5": "cc4a666fd21ae3627ee8ae974650b2f7", - "bin": "geth-linux-amd64-1.7.2-1db4ecdc/geth" + "md5": "66e1fa9514b410a71273e56a9fe6a5ab", + "bin": "geth-linux-amd64-1.7.3-4bb3c89d/geth" }, "bin": "geth", "commands": { @@ -19,17 +19,17 @@ ], "output": [ "Geth", - "1.7.2" + "1.7.3" ] } } }, "ia32": { "download": { - "url": "https://gethstore.blob.core.windows.net/builds/geth-linux-386-1.7.2-1db4ecdc.tar.gz", + "url": "https://gethstore.blob.core.windows.net/builds/geth-linux-386-1.7.3-4bb3c89d.tar.gz", "type": "tar", - "md5": "84b3a2d491db6f79fd84daa242da9ec6", - "bin": "geth-linux-386-1.7.2-1db4ecdc/geth" + "md5": "ff14dbd15f510df5acbe2ce09ed30369", + "bin": "geth-linux-386-1.7.3-4bb3c89d/geth" }, "bin": "geth", "commands": { @@ -39,7 +39,7 @@ ], "output": [ "Geth", - "1.7.2" + "1.7.3" ] } } @@ -48,10 +48,10 @@ "mac": { "x64": { "download": { - "url": "https://gethstore.blob.core.windows.net/builds/geth-darwin-amd64-1.7.2-1db4ecdc.tar.gz", + "url": "https://gethstore.blob.core.windows.net/builds/geth-darwin-amd64-1.7.3-4bb3c89d.tar.gz", "type": "tar", - "md5": "1220015825ee8772aada37353aa3f7ef", - "bin": "geth-darwin-amd64-1.7.2-1db4ecdc/geth" + "md5": "37a9a03fb4af21b7c1adc40fbf3e7a31", + "bin": "geth-darwin-amd64-1.7.3-4bb3c89d/geth" }, "bin": "geth", "commands": { @@ -61,7 +61,7 @@ ], "output": [ "Geth", - "1.7.2" + "1.7.3" ] } } @@ -70,10 +70,10 @@ "win": { "x64": { "download": { - "url": "https://gethstore.blob.core.windows.net/builds/geth-windows-amd64-1.7.2-1db4ecdc.zip", + "url": "https://gethstore.blob.core.windows.net/builds/geth-windows-amd64-1.7.3-4bb3c89d.zip", "type": "zip", - "md5": "b34d22226c2d8c6729b4c01a2f25f818", - "bin": "geth-windows-amd64-1.7.2-1db4ecdc\\geth.exe" + "md5": "0023f50d01cf15f175004fc2023fb998", + "bin": "geth-windows-amd64-1.7.3-4bb3c89d\\geth.exe" }, "bin": "geth.exe", "commands": { @@ -83,17 +83,17 @@ ], "output": [ "Geth", - "1.7.2" + "1.7.3" ] } } }, "ia32": { "download": { - "url": "https://gethstore.blob.core.windows.net/builds/geth-windows-386-1.7.2-1db4ecdc.zip", + "url": "https://gethstore.blob.core.windows.net/builds/geth-windows-386-1.7.3-4bb3c89d.zip", "type": "zip", - "md5": "50b353bf3639a502b06e0098c751df67", - "bin": "geth-windows-386-1.7.2-1db4ecdc\\geth.exe" + "md5": "5ed32e9d12d4d0594930f1bd5e7dd610", + "bin": "geth-windows-386-1.7.3-4bb3c89d\\geth.exe" }, "bin": "geth.exe", "commands": { @@ -103,7 +103,7 @@ ], "output": [ "Geth", - "1.7.2" + "1.7.3" ] } } From 4c1d9cae28d51282cdc3f84d4222885acb81b614 Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Tue, 21 Nov 2017 10:44:25 -0700 Subject: [PATCH 020/150] Adds logging to tests --- .travis.yml | 11 ++++++++--- tests/_base.js | 11 ++++++++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index ff38caf1b..009bc0945 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,7 @@ matrix: # WINDOWS cross-built from linux - os: linux dist: trusty - node_js: 6 + node_js: 8 env: - GULP_PLATFORM=win addons: @@ -33,7 +33,7 @@ matrix: # LINUX - os: linux dist: trusty - node_js: 6 + node_js: 8 env: - GULP_PLATFORM=linux addons: @@ -48,7 +48,7 @@ matrix: # MAC - os: osx osx_image: xcode8 # currently xcode8.1+ doesn't support electron-builder macOS code-signing (https://github.com/electron-userland/electron-builder/issues/820#issuecomment-267777060) - node_js: 6 + node_js: 8 env: - GULP_PLATFORM=mac before_install: @@ -85,6 +85,11 @@ script: after_success: - if [[ $TRAVIS_BRANCH == "master" ]]; then gulp uploadQueue --$GULP_PLATFORM && gulp uploadQueue --wallet --$GULP_PLATFORM; fi +after_failure: + - pwd + - ls + - cat /home/travis/build/ethereum/mist/tests/mist.log + notifications: webhooks: urls: diff --git a/tests/_base.js b/tests/_base.js index 459d47d21..27854498d 100644 --- a/tests/_base.js +++ b/tests/_base.js @@ -62,6 +62,7 @@ const startGeth = function* () { }; const startFixtureServer = function (serverPort) { + log.info('Starting fixture server...'); const app = express(); app.use(express.static(path.join(__dirname, 'fixtures'))); @@ -70,6 +71,7 @@ const startFixtureServer = function (serverPort) { res.redirect(302, req.query.to); }); app.listen(serverPort); + log.info('Fixture server started'); return app; }; @@ -100,6 +102,7 @@ exports.mocha = (_module, options) => { const appFileName = (options.app === 'wallet') ? 'Ethereum Wallet' : 'Mist'; const platformArch = `${process.platform}-${process.arch}`; + log.info(`${appFileName} :: ${platformArch}`); let appPath; const ipcProviderPath = path.join(this.geth.dataDir, 'geth.ipc'); @@ -116,6 +119,7 @@ exports.mocha = (_module, options) => { default: throw new Error(`Cannot run tests on ${platformArch}, please run on: darwin-x64, linux-x64`); } + log.info(`appPath: ${appPath}`); // check that appPath exists if (!shell.test('-f', appPath)) { @@ -130,7 +134,7 @@ exports.mocha = (_module, options) => { quitTimeout: 10000, path: appPath, args: [ - '--loglevel', 'debug', + '--loglevel', 'trace', '--logfile', mistLogFile, '--node-datadir', this.geth.dataDir, '--rpc', ipcProviderPath, @@ -139,7 +143,9 @@ exports.mocha = (_module, options) => { chromeDriverLogPath: chromeLogFile, }); + log.info('Starting app...'); yield this.app.start(); + log.info('App started'); this.client = this.app.client; @@ -182,9 +188,12 @@ exports.mocha = (_module, options) => { }; const mainWindowSearch = (options.app === 'wallet') ? /^file:\/\/\/$/ : /interface\/index\.html$/; + console.log('∆∆∆ mainWindowSearch', mainWindowSearch); yield selectMainWindow(mainWindowSearch); + console.log('Main window selected'); this.mainWindowHandle = (yield this.client.windowHandle()).value; + console.log(`mainWindowHandle: ${this.mainWindowHandle}`); }, * beforeEach() { From 299ab7bcf0e76cacea12d184891a262a5f65a305 Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Tue, 21 Nov 2017 10:44:25 -0700 Subject: [PATCH 021/150] Adds logging to tests --- .travis.yml | 12 +++++++++--- tests/_base.js | 22 +++++++++++++++++----- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index ff38caf1b..8a3502735 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,7 @@ matrix: # WINDOWS cross-built from linux - os: linux dist: trusty - node_js: 6 + node_js: 8 env: - GULP_PLATFORM=win addons: @@ -33,7 +33,7 @@ matrix: # LINUX - os: linux dist: trusty - node_js: 6 + node_js: 8 env: - GULP_PLATFORM=linux addons: @@ -48,7 +48,7 @@ matrix: # MAC - os: osx osx_image: xcode8 # currently xcode8.1+ doesn't support electron-builder macOS code-signing (https://github.com/electron-userland/electron-builder/issues/820#issuecomment-267777060) - node_js: 6 + node_js: 8 env: - GULP_PLATFORM=mac before_install: @@ -85,6 +85,12 @@ script: after_success: - if [[ $TRAVIS_BRANCH == "master" ]]; then gulp uploadQueue --$GULP_PLATFORM && gulp uploadQueue --wallet --$GULP_PLATFORM; fi +after_failure: + - echo "after_failure..." + - pwd + - ls + - cat /home/travis/build/ethereum/mist/tests/mist.log + notifications: webhooks: urls: diff --git a/tests/_base.js b/tests/_base.js index 459d47d21..a81583fec 100644 --- a/tests/_base.js +++ b/tests/_base.js @@ -62,6 +62,7 @@ const startGeth = function* () { }; const startFixtureServer = function (serverPort) { + log.info('Starting fixture server...'); const app = express(); app.use(express.static(path.join(__dirname, 'fixtures'))); @@ -70,6 +71,7 @@ const startFixtureServer = function (serverPort) { res.redirect(302, req.query.to); }); app.listen(serverPort); + log.info('Fixture server started'); return app; }; @@ -100,6 +102,7 @@ exports.mocha = (_module, options) => { const appFileName = (options.app === 'wallet') ? 'Ethereum Wallet' : 'Mist'; const platformArch = `${process.platform}-${process.arch}`; + log.info(`${appFileName} :: ${platformArch}`); let appPath; const ipcProviderPath = path.join(this.geth.dataDir, 'geth.ipc'); @@ -116,6 +119,7 @@ exports.mocha = (_module, options) => { default: throw new Error(`Cannot run tests on ${platformArch}, please run on: darwin-x64, linux-x64`); } + log.info(`appPath: ${appPath}`); // check that appPath exists if (!shell.test('-f', appPath)) { @@ -130,7 +134,7 @@ exports.mocha = (_module, options) => { quitTimeout: 10000, path: appPath, args: [ - '--loglevel', 'debug', + '--loglevel', 'trace', '--logfile', mistLogFile, '--node-datadir', this.geth.dataDir, '--rpc', ipcProviderPath, @@ -139,7 +143,9 @@ exports.mocha = (_module, options) => { chromeDriverLogPath: chromeLogFile, }); + log.info('Starting app...'); yield this.app.start(); + log.info('App started'); this.client = this.app.client; @@ -166,7 +172,8 @@ exports.mocha = (_module, options) => { // Loop over windows trying to select Main Window const app = this; - const selectMainWindow = function* (mainWindowSearch) { + const selectMainWindow = function* (mainWindowSearch, retries = 20) { + console.log(`∆∆∆ retries remaining: ${retries}`); let windowHandles = (yield app.client.windowHandles()).value; for (let handle in windowHandles) { @@ -176,15 +183,20 @@ exports.mocha = (_module, options) => { if (isMainWindow) return true; } - // not main window. try again after 1 second. - yield Q.delay(1000); - yield selectMainWindow(mainWindowSearch); + if (retries === 0) throw new Error('Failed to select main window'); + + // not main window. try again after 2 seconds. + yield Q.delay(2000); + yield selectMainWindow(mainWindowSearch, --retries); }; const mainWindowSearch = (options.app === 'wallet') ? /^file:\/\/\/$/ : /interface\/index\.html$/; + console.log('∆∆∆ mainWindowSearch', mainWindowSearch); yield selectMainWindow(mainWindowSearch); + console.log('Main window selected'); this.mainWindowHandle = (yield this.client.windowHandle()).value; + console.log(`mainWindowHandle: ${this.mainWindowHandle}`); }, * beforeEach() { From 31f438ad3f4d6258f480500e7f42896de000576a Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Mon, 27 Nov 2017 11:12:33 -0500 Subject: [PATCH 022/150] Disables Swarm in tests --- main.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.js b/main.js index 7996c3de4..e417c7f89 100644 --- a/main.js +++ b/main.js @@ -302,8 +302,8 @@ onReady = () => { return ethereumNode.init(); }) .then(() => { - // Wallet shouldn't start Swarm - if (global.mode === 'wallet') { + // Wallet shouldn't start Swarm || TODO: TravisCI failing to download Swarm + if (global.mode === 'wallet' || Settings.inAutoTestMode) { return Promise.resolve(); } return swarmNode.init(); From 2ff572dd9794ca11a3a97fd233915d8575627e1c Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Mon, 27 Nov 2017 17:09:18 -0500 Subject: [PATCH 023/150] Upgrades to electron-redux --- modules/core/store.js | 12 ++++++---- modules/preloader/mistUI.js | 17 ++----------- modules/preloader/popupWindows.js | 3 +++ modules/preloader/popupWindowsNoWeb3.js | 3 +++ modules/preloader/rendererStore.js | 20 ++++++++++++++++ modules/preloader/splashScreen.js | 4 ++-- package.json | 2 +- yarn.lock | 32 ++++++++++++++----------- 8 files changed, 56 insertions(+), 37 deletions(-) create mode 100644 modules/preloader/rendererStore.js diff --git a/modules/core/store.js b/modules/core/store.js index 9e4baa5f5..dc6487c6f 100644 --- a/modules/core/store.js +++ b/modules/core/store.js @@ -1,15 +1,17 @@ import { createStore, applyMiddleware } from 'redux'; -import { electronEnhancer } from 'redux-electron-store'; +import { forwardToRenderer, replayActionMain } from 'electron-redux'; import { composeWithDevTools } from 'remote-redux-devtools'; import thunk from 'redux-thunk'; import { app } from 'electron'; import rootReducer from './rootReducer'; export default function configureReduxStore() { - return createStore( + const store = createStore( rootReducer, - composeWithDevTools(applyMiddleware(thunk), electronEnhancer({ - dispatchProxy: a => store.dispatch(a) - })) + composeWithDevTools(applyMiddleware(thunk, forwardToRenderer)), ); + + replayActionMain(store); + + return store; } diff --git a/modules/preloader/mistUI.js b/modules/preloader/mistUI.js index fa772e78e..1f567b29d 100644 --- a/modules/preloader/mistUI.js +++ b/modules/preloader/mistUI.js @@ -2,21 +2,8 @@ @module preloader MistUI */ -// Create the client-side Redux store. This store's only purpose -// is to receive actions and keep them in sync with the main store. -const { createStore, compose, applyMiddleware } = require('redux'); -const { electronEnhancer } = require('redux-electron-store'); -const thunk = require('redux-thunk').default; - -window.store = createStore( - () => {}, - compose( - applyMiddleware(thunk), - electronEnhancer({ - dispatchProxy: a => store.dispatch(a) - }) - ) -); +// Initialise the Redux store +window.store = require('./rendererStore'); require('./include/common')('mist'); require('./include/web3CurrentProvider.js'); diff --git a/modules/preloader/popupWindows.js b/modules/preloader/popupWindows.js index 31f874e57..de67ba03a 100644 --- a/modules/preloader/popupWindows.js +++ b/modules/preloader/popupWindows.js @@ -17,3 +17,6 @@ web3Admin.extend(window.web3); // make variables globally accessable window.Q = Q; window.https = https; + +// Initialise the Redux store +window.store = require('./rendererStore'); diff --git a/modules/preloader/popupWindowsNoWeb3.js b/modules/preloader/popupWindowsNoWeb3.js index b96cebe2f..f52583c1a 100644 --- a/modules/preloader/popupWindowsNoWeb3.js +++ b/modules/preloader/popupWindowsNoWeb3.js @@ -20,3 +20,6 @@ window.mistMode = remote.getGlobal('mode'); window.dirname = remote.getGlobal('dirname'); window.dbSync = dbSync; window.ipc = ipcRenderer; + +// Initialise the Redux store +window.store = require('./rendererStore'); diff --git a/modules/preloader/rendererStore.js b/modules/preloader/rendererStore.js new file mode 100644 index 000000000..7b55086f8 --- /dev/null +++ b/modules/preloader/rendererStore.js @@ -0,0 +1,20 @@ +// Create the client-side Redux store. +// This store's only purpose is to sync with the main store. +const { createStore, applyMiddleware } = require('redux'); +const { + forwardToMain, + getInitialStateRenderer, + replayActionRenderer, +} = require('electron-redux'); +const thunk = require('redux-thunk').default; +const initialState = getInitialStateRenderer(); + +const store = createStore( + () => {}, + initialState, + applyMiddleware(forwardToMain, thunk), +); + +replayActionRenderer(store); + +module.exports = store; diff --git a/modules/preloader/splashScreen.js b/modules/preloader/splashScreen.js index 6174998df..fada1bb9c 100644 --- a/modules/preloader/splashScreen.js +++ b/modules/preloader/splashScreen.js @@ -17,5 +17,5 @@ window.mist = mist(); window.mistMode = remote.getGlobal('mode'); window.dirname = remote.getGlobal('dirname'); -// Stub out the Redux store -window.store = { dispatch: () => {} }; +// Initialise the Redux store +window.store = require('./rendererStore'); diff --git a/package.json b/package.json index ec2046580..a49b9da9b 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "bluebird": "^3.5.0", "chai-as-promised": "^6.0.0", "chai-string": "^1.3.0", + "electron-redux": "^1.3.1", "electron-window-state": "^4.0.1", "ethereum-client-binaries": "^1.6.1", "ethereum-keyfile-recognizer": "^1.0.2", @@ -39,7 +40,6 @@ "oboe": "^2.1.3", "os-timesync": "^1.0.8", "redux": "^3.7.2", - "redux-electron-store": "^0.4.1", "redux-thunk": "^2.2.0", "remote-redux-devtools": "^0.5.12", "semver": "^5.1.0", diff --git a/yarn.lock b/yarn.lock index 3c0f3bddb..76aed1965 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1308,7 +1308,7 @@ debug@2.6.8: dependencies: ms "2.0.0" -debug@2.6.9, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.6.0, debug@^2.6.8: +debug@2.6.9, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: @@ -1653,6 +1653,14 @@ electron-macos-sign@~1.5.0: isbinaryfile "^3.0.2" plist "^2.0.1" +electron-redux@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/electron-redux/-/electron-redux-1.3.1.tgz#650a76cdeb12358f57b5c7db744224d08999ae08" + dependencies: + debug "^2.3.3" + flux-standard-action "^1.0.0" + redux "^3.4.0" + electron-window-state@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/electron-window-state/-/electron-window-state-4.1.1.tgz#6b34fdc31b38514dfec8b7c8f7b5d4addb67632d" @@ -2216,6 +2224,12 @@ flat-cache@^1.2.1: graceful-fs "^4.1.2" write "^0.2.1" +flux-standard-action@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/flux-standard-action/-/flux-standard-action-1.2.0.tgz#d2d41612dde4cebddd11a76cfead8e84fc69ebdc" + dependencies: + lodash "^4.0.0" + for-each@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4" @@ -3510,7 +3524,7 @@ lodash.values@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" -lodash@^4.0.0, lodash@^4.11.1, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.8.0, lodash@~4.17.4: +lodash@^4.0.0, lodash@^4.11.1, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.8.0, lodash@~4.17.4: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -4244,11 +4258,7 @@ pretty-hrtime@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" -private@^0.1.6: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - -private@^0.1.7: +private@^0.1.6, private@^0.1.7: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -4455,12 +4465,6 @@ redux-devtools-instrument@^1.3.3: lodash "^4.2.0" symbol-observable "^1.0.2" -redux-electron-store@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/redux-electron-store/-/redux-electron-store-0.4.1.tgz#b9f92b4299be97b0a5920f03c899a7f9285c3e1c" - dependencies: - lodash "^4.13.1" - redux-mock-store@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/redux-mock-store/-/redux-mock-store-1.3.0.tgz#6edfef0d2332f20576381069d6d889a6d0a4451c" @@ -4469,7 +4473,7 @@ redux-thunk@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.2.0.tgz#e615a16e16b47a19a515766133d1e3e99b7852e5" -redux@^3.7.2: +redux@^3.4.0, redux@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b" dependencies: From a57d99e8f30f3fb330e9b923e4d9e6b86f3c5433 Mon Sep 17 00:00:00 2001 From: Everton Fraga Date: Tue, 28 Nov 2017 11:57:58 -0500 Subject: [PATCH 024/150] Checking property before accessing it --- modules/ipc/methods/eth_getTransactionReceipt.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ipc/methods/eth_getTransactionReceipt.js b/modules/ipc/methods/eth_getTransactionReceipt.js index 46b4f8549..1301d0fdd 100644 --- a/modules/ipc/methods/eth_getTransactionReceipt.js +++ b/modules/ipc/methods/eth_getTransactionReceipt.js @@ -21,7 +21,7 @@ module.exports = class extends BaseProcessor { }); // If that contains a contractAddress already, fine. - if (ret.result.result.contractAddress != null) { + if (ret.result && ret.result.result.contractAddress != null) { return ret.result; } From 40c6b15e1abf135cbc3f405d20325c0a67b4896f Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Tue, 28 Nov 2017 14:08:25 -0500 Subject: [PATCH 025/150] Blacklists updateAvailable window --- modules/windows.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/windows.js b/modules/windows.js index 644513481..629fc6325 100644 --- a/modules/windows.js +++ b/modules/windows.js @@ -574,7 +574,7 @@ class Windows { // If generic window is available, recycle it (unless opening remix) const genericWindow = this.getByType('generic'); - if (type !== 'remix' && genericWindow && genericWindow.isAvailable) { + if (type !== 'remix' && type !== 'updateAvailable' && genericWindow && genericWindow.isAvailable) { genericWindow.reuse(type, opts, callback); return genericWindow; } else if (genericWindow) { From fc2f04e738349cff1591bed15de73bc399979cf7 Mon Sep 17 00:00:00 2001 From: Everton Fraga Date: Tue, 28 Nov 2017 14:08:42 -0500 Subject: [PATCH 026/150] Travis updated configs --- .travis.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index ff38caf1b..7d0fa47ed 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,11 @@ language: node_js +node_js: '8' +cache: + yarn: true + directories: + - node_modules + - 'interface/.meteor' + sudo: required branches: @@ -8,11 +15,9 @@ branches: matrix: include: - # WINDOWS cross-built from linux - os: linux dist: trusty - node_js: 6 env: - GULP_PLATFORM=win addons: @@ -29,11 +34,9 @@ matrix: - sudo apt-get update -q - sudo apt-get install --no-install-recommends -y mono-devel ca-certificates-mono wine1.8 - # LINUX - os: linux dist: trusty - node_js: 6 env: - GULP_PLATFORM=linux addons: @@ -47,8 +50,7 @@ matrix: # MAC - os: osx - osx_image: xcode8 # currently xcode8.1+ doesn't support electron-builder macOS code-signing (https://github.com/electron-userland/electron-builder/issues/820#issuecomment-267777060) - node_js: 6 + osx_image: xcode8.3 # currently xcode8.1+ doesn't support electron-builder macOS code-signing (https://github.com/electron-userland/electron-builder/issues/820#issuecomment-267777060) env: - GULP_PLATFORM=mac before_install: @@ -59,8 +61,6 @@ matrix: fast_finish: true -cache: - yarn: true install: - echo $PATH From 06717f63bd863d583761ed56cfbafd790498d4a9 Mon Sep 17 00:00:00 2001 From: Everton Fraga Date: Tue, 28 Nov 2017 15:10:43 -0500 Subject: [PATCH 027/150] Returns original result as fallback --- .../ipc/methods/eth_getTransactionReceipt.js | 70 ++++++++++--------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/modules/ipc/methods/eth_getTransactionReceipt.js b/modules/ipc/methods/eth_getTransactionReceipt.js index 1301d0fdd..0eae6f2cd 100644 --- a/modules/ipc/methods/eth_getTransactionReceipt.js +++ b/modules/ipc/methods/eth_getTransactionReceipt.js @@ -4,6 +4,8 @@ const eth = require('ethereumjs-util'); /** * Process method: eth_getTransactionReceipt + * Due to a geth's light client v1 bug, it does not return + * contractAddress value on the receipts. Let's fix that. */ module.exports = class extends BaseProcessor { @@ -20,41 +22,43 @@ module.exports = class extends BaseProcessor { fullResult: true }); - // If that contains a contractAddress already, fine. - if (ret.result && ret.result.result.contractAddress != null) { - return ret.result; - } + try { + // If that contains a contractAddress already, fine. + if (ret.result.result && ret.result.result.contractAddress != null) { + return ret.result; + } + + // 1. GET TRANSACTION from AND nonce VALUES + const transactionInfo = await conn.socket.send({ + jsonrpc: '2.0', + id: _.uuid(), + method: 'eth_getTransactionByHash', + params: [txHash] + }, { fullResult: true }); + + const fromAddress = transactionInfo.result.result.from; + const nonce = parseInt(transactionInfo.result.result.nonce, 16); + const possibleContractAddress = `0x${eth.generateAddress(fromAddress, nonce).toString('hex')}`; - // Due to a geth's light client v1 bug, it does not return - // contractAddress value on the receipts. Let's fix that. - // 1. GET TRANSACTION from AND nonce VALUES - const transactionInfo = await conn.socket.send({ - jsonrpc: '2.0', - id: _.uuid(), - method: 'eth_getTransactionByHash', - params: [txHash] - }, { fullResult: true }); - - - const fromAddress = transactionInfo.result.result.from; - const nonce = parseInt(transactionInfo.result.result.nonce, 16); - const possibleContractAddress = `0x${eth.generateAddress(fromAddress, nonce).toString('hex')}`; - - - // 2. GET CODE FROM ADDRESS - const contractCode = await conn.socket.send({ - jsonrpc: '2.0', - id: _.uuid(), - method: 'eth_getCode', - params: [possibleContractAddress, 'latest'] - }, { fullResult: true }); - const contractCodeResult = contractCode.result.result; - - // 3. IF IT EXISTS, ASSIGN TO RETURN VALUE - if (contractCodeResult && contractCodeResult.length > 2) { - ret.result.result.contractAddress = possibleContractAddress; - } + // 2. GET CODE FROM ADDRESS + const contractCode = await conn.socket.send({ + jsonrpc: '2.0', + id: _.uuid(), + method: 'eth_getCode', + params: [possibleContractAddress, 'latest'] + }, { fullResult: true }); + + const contractCodeResult = contractCode.result.result; + + // 3. IF IT EXISTS, ASSIGN TO RETURN VALUE + if (contractCodeResult && contractCodeResult.length > 2) { + ret.result.result.contractAddress = possibleContractAddress; + } + } catch (e) { + console.warn('[WARN]', txHash, e); + return ret.result; + } return ret.result; } }; From d1b2edd6e9e3bf4ebe1b3527099ba1c98a75b17a Mon Sep 17 00:00:00 2001 From: Everton Fraga Date: Tue, 28 Nov 2017 15:29:35 -0500 Subject: [PATCH 028/150] Debugging test helper --- tests/_base.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/_base.js b/tests/_base.js index a81583fec..0674e3014 100644 --- a/tests/_base.js +++ b/tests/_base.js @@ -405,8 +405,11 @@ const Utils = { }); yield client.click('.dapp-primary-button'); + console.log(`∆∆∆ pinCurrentTab: ${this.mainWindowHandle}`); + const windowHandles = (yield client.windowHandles()).value; + console.log(`∆∆∆ windowHandles ${windowHandles}`); yield client.window(this.mainWindowHandle); // selects main window again - yield Q.delay(500); + yield Q.delay(1000); const pinnedWebview = (yield client.windowHandles()).value.pop(); return pinnedWebview; From b9202d2acf704c60b0774774095bf316fae2f328 Mon Sep 17 00:00:00 2001 From: Everton Fraga Date: Wed, 29 Nov 2017 18:59:10 -0500 Subject: [PATCH 029/150] Adding downloads badge [ci skip] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3cb69dca0..1615b2791 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # Mist Browser +[![Github All Releases](https://img.shields.io/github/downloads/atom/atom/total.svg)]() [![Join the chat at https://gitter.im/ethereum/mist](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/ethereum/mist?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Build Status develop branch](https://travis-ci.org/ethereum/mist.svg?branch=develop)](https://travis-ci.org/ethereum/mist) [![Code Climate](https://codeclimate.com/github/ethereum/mist/badges/gpa.svg)](https://codeclimate.com/github/ethereum/mist) From 7dadcc38c2648a992d8572ee43949143294dc143 Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Tue, 28 Nov 2017 17:18:27 -0500 Subject: [PATCH 030/150] Tables connectAccount bug --- .travis.yml | 3 --- modules/windows.js | 5 +++-- tests/_base.js | 16 +++++++++------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index 05dc3f012..36fd4c379 100644 --- a/.travis.yml +++ b/.travis.yml @@ -86,9 +86,6 @@ after_success: - if [[ $TRAVIS_BRANCH == "master" ]]; then gulp uploadQueue --$GULP_PLATFORM && gulp uploadQueue --wallet --$GULP_PLATFORM; fi after_failure: - - echo "after_failure..." - - pwd - - ls - cat /home/travis/build/ethereum/mist/tests/mist.log notifications: diff --git a/modules/windows.js b/modules/windows.js index 629fc6325..42241ff3b 100644 --- a/modules/windows.js +++ b/modules/windows.js @@ -572,9 +572,10 @@ class Windows { opts.electronOptions.webPreferences.preload = `${__dirname}/preloader/popupWindowsNoWeb3.js`; } - // If generic window is available, recycle it (unless opening remix) + // If generic window is available, recycle it (unless on blacklist) const genericWindow = this.getByType('generic'); - if (type !== 'remix' && type !== 'updateAvailable' && genericWindow && genericWindow.isAvailable) { + const genericWindowBlacklist = ['remix', 'updateAvailable', 'connectAccount']; + if (!genericWindowBlacklist.includes(type) && genericWindow && genericWindow.isAvailable) { genericWindow.reuse(type, opts, callback); return genericWindow; } else if (genericWindow) { diff --git a/tests/_base.js b/tests/_base.js index 0674e3014..e8c6960b5 100644 --- a/tests/_base.js +++ b/tests/_base.js @@ -399,21 +399,23 @@ const Utils = { * pinCurrentTab() { const client = this.client; - - yield this.openAndFocusNewWindow('generic', () => { + yield this.openAndFocusNewWindow('connectAccount', () => { return client.click('span.connect-button'); }); yield client.click('.dapp-primary-button'); - - console.log(`∆∆∆ pinCurrentTab: ${this.mainWindowHandle}`); - const windowHandles = (yield client.windowHandles()).value; - console.log(`∆∆∆ windowHandles ${windowHandles}`); + yield this.delay(500); yield client.window(this.mainWindowHandle); // selects main window again - yield Q.delay(1000); const pinnedWebview = (yield client.windowHandles()).value.pop(); return pinnedWebview; }, + + * delay(ms) { + yield this.waitUntil('delay', async () => { + return new Promise(resolve => setTimeout(() => resolve(true), ms)); + }); + }, + * navigateTo(url) { const client = this.client; yield client.setValue('#url-input', url); From b22e819c039080e2d668c3416217de637d8e8bf8 Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Thu, 30 Nov 2017 12:56:34 -0700 Subject: [PATCH 031/150] Corrects window position and cleans up logs --- modules/windows.js | 1 + tests/_base.js | 6 ++---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/windows.js b/modules/windows.js index 42241ff3b..5e2dea033 100644 --- a/modules/windows.js +++ b/modules/windows.js @@ -105,6 +105,7 @@ class GenericWindow extends EventEmitter { } } this.window.setSize(options.electronOptions.width, options.electronOptions.height); + this.window.setAlwaysOnTop(true, 'floating', 1); this.send('uiAction_switchTemplate', type); this.show(); store.dispatch(reuseGenericWindow(type)); diff --git a/tests/_base.js b/tests/_base.js index e8c6960b5..d5e754db1 100644 --- a/tests/_base.js +++ b/tests/_base.js @@ -134,7 +134,7 @@ exports.mocha = (_module, options) => { quitTimeout: 10000, path: appPath, args: [ - '--loglevel', 'trace', + '--loglevel', 'debug', '--logfile', mistLogFile, '--node-datadir', this.geth.dataDir, '--rpc', ipcProviderPath, @@ -173,7 +173,7 @@ exports.mocha = (_module, options) => { // Loop over windows trying to select Main Window const app = this; const selectMainWindow = function* (mainWindowSearch, retries = 20) { - console.log(`∆∆∆ retries remaining: ${retries}`); + console.log(`selectMainWindow retries remaining: ${retries}`); let windowHandles = (yield app.client.windowHandles()).value; for (let handle in windowHandles) { @@ -191,12 +191,10 @@ exports.mocha = (_module, options) => { }; const mainWindowSearch = (options.app === 'wallet') ? /^file:\/\/\/$/ : /interface\/index\.html$/; - console.log('∆∆∆ mainWindowSearch', mainWindowSearch); yield selectMainWindow(mainWindowSearch); console.log('Main window selected'); this.mainWindowHandle = (yield this.client.windowHandle()).value; - console.log(`mainWindowHandle: ${this.mainWindowHandle}`); }, * beforeEach() { From bcfa82951566b63525bd3ac39952099a459990eb Mon Sep 17 00:00:00 2001 From: Tobi Vogler Date: Fri, 8 Dec 2017 14:38:30 +0100 Subject: [PATCH 032/150] Make individual text selectable Make individual text selectable in the popup-window, for example to copy the checksum of an update. --- interface/client/styles/popupWindows.import.less | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/client/styles/popupWindows.import.less b/interface/client/styles/popupWindows.import.less index f2685de8f..f71fb28ad 100644 --- a/interface/client/styles/popupWindows.import.less +++ b/interface/client/styles/popupWindows.import.less @@ -76,7 +76,8 @@ } &.update-available { - -webkit-user-select: all; + -webkit-user-select: auto; + user-select: auto; .text { text-align: left; From aa32ba05be0afb6698265fbdd05df36c92f978f5 Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Tue, 12 Dec 2017 09:31:41 -0800 Subject: [PATCH 033/150] Upgrade electron-builder to 19.49.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 340e89b71..4e0cede8f 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "del": "^2.2.2", "ecstatic": "^2.1.0", "electron": "1.7.9", - "electron-builder": "^12.2.2", + "electron-builder": "^19.49.0", "eslint": "^3.14.1", "eslint-config-airbnb-base": "^11.0.1", "eslint-plugin-import": "^2.2.0", From 9cb3989555d8b66014030d8cad456f471fde4764 Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Tue, 12 Dec 2017 09:47:22 -0800 Subject: [PATCH 034/150] Upgrade del to 3.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 340e89b71..9f4a68d7f 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "babel-register": "^6.26.0", "chai": "^3.5.0", "co-mocha": "^1.2.0", - "del": "^2.2.2", + "del": "^3.0.0", "ecstatic": "^2.1.0", "electron": "1.7.9", "electron-builder": "^12.2.2", From 8d9e68cc5a0f5d27bc31f2e65705968918e99c7b Mon Sep 17 00:00:00 2001 From: Luis Enrique Espinoza Severino Date: Tue, 12 Dec 2017 17:29:27 -0300 Subject: [PATCH 035/150] Fix for mist.es.i18n.json Fixed spanish translation of File from Arquivo to Archivo. --- interface/i18n/mist.es.i18n.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/i18n/mist.es.i18n.json b/interface/i18n/mist.es.i18n.json index a1e504aba..c606ec903 100644 --- a/interface/i18n/mist.es.i18n.json +++ b/interface/i18n/mist.es.i18n.json @@ -27,7 +27,7 @@ "default": "Default" }, "file": { - "label": "Arquivo", + "label": "Archivo", "importPresale": "Importar Cuentas", "newAccount": "Nueva cuenta", "backup": "Copia de seguridad", From b82a0f05cb864287258a0a4fb53dcf912cc357ac Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Tue, 12 Dec 2017 14:57:34 -0800 Subject: [PATCH 036/150] Travis breaking due to newly released image Trusty. Giving this a try via https://github.com/travis-ci/travis-ci/issues/8890 --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 36fd4c379..a01913d73 100644 --- a/.travis.yml +++ b/.travis.yml @@ -65,6 +65,7 @@ matrix: install: - echo $PATH - PATH=$PATH:$HOME/.meteor && curl -L https://raw.githubusercontent.com/arunoda/travis-ci-meteor-packages/1390e0f96162d0d70fc1e60a6b0f4f891a0e8f42/configure.sh | /bin/sh + - export PATH=$PATH:`yarn global bin` - yarn global add gulp-cli meteor-build-client - yarn From 1d6063cb9ec4920d419f5681d59a60b245184509 Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Tue, 12 Dec 2017 20:03:55 -0800 Subject: [PATCH 037/150] Add `g++-multilib` to fix travis build error: `fatal error: sys/cdefs.h: No such file or directory` --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index a01913d73..c932268e8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,6 +27,7 @@ matrix: - graphicsmagick - xz-utils - nsis + - g++-multilib sources: - mono before_install: From 9a4c679243f7a94b061d737374f79e2893af038a Mon Sep 17 00:00:00 2001 From: Everton Fraga Date: Wed, 13 Dec 2017 09:26:19 -0200 Subject: [PATCH 038/150] Adding yarn global to Travis --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 36fd4c379..a01913d73 100644 --- a/.travis.yml +++ b/.travis.yml @@ -65,6 +65,7 @@ matrix: install: - echo $PATH - PATH=$PATH:$HOME/.meteor && curl -L https://raw.githubusercontent.com/arunoda/travis-ci-meteor-packages/1390e0f96162d0d70fc1e60a6b0f4f891a0e8f42/configure.sh | /bin/sh + - export PATH=$PATH:`yarn global bin` - yarn global add gulp-cli meteor-build-client - yarn From c6e5e7279dbd2fac91467a40500af3358f79273a Mon Sep 17 00:00:00 2001 From: trevor Date: Sun, 15 Oct 2017 09:16:56 -0400 Subject: [PATCH 039/150] Add "Retry Connection" to wallet splash screen If ethereumNode fails to connect, a "Retry Connection" button will be shown with the error message on the splash screen. Clicking the button calls `kickStart()`. --- interface/client/styles/splashScreen.import.less | 11 +++++++---- .../client/templates/popupWindows/splashScreen.html | 6 +++++- .../client/templates/popupWindows/splashScreen.js | 8 ++++++++ interface/i18n/mist.en.i18n.json | 1 + main.js | 6 ++++++ 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/interface/client/styles/splashScreen.import.less b/interface/client/styles/splashScreen.import.less index 105a9b06d..52206abb4 100644 --- a/interface/client/styles/splashScreen.import.less +++ b/interface/client/styles/splashScreen.import.less @@ -26,7 +26,8 @@ h1 { color: #fff; } - button.start-app { + button.start-app, + button.retry-connection { color: #BCD3E6; &:hover { color: darken(#BCD3E6, 5%); @@ -88,7 +89,8 @@ color: rgba(255,255,255, 0.8); } /* start app button */ - button.start-app { + button.start-app, + button.retry-connection { bottom: 10px; right: 0; left: 0; @@ -102,7 +104,8 @@ font-size: 1em; font-weight: bold; } - button.start-app:hover { + button.start-app:hover, + button.retry-connection:hover { color: #2A6ED0; } @@ -176,4 +179,4 @@ progress.state[value]::-webkit-progress-bar { background: transparent; } -} \ No newline at end of file +} diff --git a/interface/client/templates/popupWindows/splashScreen.html b/interface/client/templates/popupWindows/splashScreen.html index 9aa9fcfbd..12d6921f3 100644 --- a/interface/client/templates/popupWindows/splashScreen.html +++ b/interface/client/templates/popupWindows/splashScreen.html @@ -8,6 +8,10 @@ {{/if}} + {{#if TemplateVar.get "showRetryConnectionButton"}} + + {{/if}} +

{{{TemplateVar.get "text"}}} @@ -28,4 +32,4 @@

{{/if}} {{/if}} - \ No newline at end of file + diff --git a/interface/client/templates/popupWindows/splashScreen.js b/interface/client/templates/popupWindows/splashScreen.js index e28ee3096..20b5f4ec7 100644 --- a/interface/client/templates/popupWindows/splashScreen.js +++ b/interface/client/templates/popupWindows/splashScreen.js @@ -39,6 +39,7 @@ Template['popupWindows_splashScreen'].onCreated(function () { TemplateVar.set(template, 'showNetworkIndicator', status === 'done'); TemplateVar.set(template, 'showProgressBar', false); TemplateVar.set(template, 'showStartAppButton', false); + TemplateVar.set(template, 'showRetryConnectionButton', false); TemplateVar.set(template, 'logText', null); }); @@ -51,6 +52,7 @@ Template['popupWindows_splashScreen'].onCreated(function () { TemplateVar.set(template, 'logText', null); TemplateVar.set(template, 'showProgressBar', false); TemplateVar.set(template, 'showStartAppButton', false); + TemplateVar.set(template, 'showRetryConnectionButton', false); break; case 'started': @@ -80,6 +82,8 @@ Template['popupWindows_splashScreen'].onCreated(function () { errorTag = 'mist.startScreen.' + (errorTag || 'nodeError'); TemplateVar.set(template, 'text', TAPi18n.__(errorTag)); + TemplateVar.set(template, 'showRetryConnectionButton', true); + TemplateVar.set(template, 'retryConnectionButtonText', TAPi18n.__('mist.startScreen.retryConnection')); break; } }); @@ -254,5 +258,9 @@ Template['popupWindows_splashScreen'].helpers({ Template['popupWindows_splashScreen'].events({ 'click .start-app': function () { ipc.send('backendAction_skipSync'); + }, + + 'click .retry-connection': function () { + ipc.send('retryConnection'); } }); diff --git a/interface/i18n/mist.en.i18n.json b/interface/i18n/mist.en.i18n.json index 9b97efbc6..6fc790e56 100644 --- a/interface/i18n/mist.en.i18n.json +++ b/interface/i18n/mist.en.i18n.json @@ -163,6 +163,7 @@ "nodeSyncFoundPeers": "Connecting to __peers__ peers...", "peerSearchTimeout": "Skip peer search", "launchApp": "Launch Application", + "retryConnection": "Retry Connection", "clientBinaries": { "scanning": "Checking for node update...", "downloading": "Downloading new node...", diff --git a/main.js b/main.js index e417c7f89..20a6cedc7 100644 --- a/main.js +++ b/main.js @@ -221,6 +221,12 @@ onReady = () => { const kickStart = () => { + // connection failed; retry + ipcMain.on('retryConnection', () => { + kickStart(); + }); + + // client binary stuff ClientBinaryManager.on('status', (status, data) => { Windows.broadcast('uiAction_clientBinaryStatus', status, data); }); From 547ff0797f33b4ad62c883ba93ebf0072f542ee1 Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Tue, 12 Dec 2017 16:52:42 -0700 Subject: [PATCH 040/150] Prevents duplicate splashWindow buttons --- interface/client/templates/popupWindows/splashScreen.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/interface/client/templates/popupWindows/splashScreen.html b/interface/client/templates/popupWindows/splashScreen.html index 12d6921f3..3c9bd1926 100644 --- a/interface/client/templates/popupWindows/splashScreen.html +++ b/interface/client/templates/popupWindows/splashScreen.html @@ -6,10 +6,10 @@ {{#if TemplateVar.get "showStartAppButton"}} - {{/if}} - - {{#if TemplateVar.get "showRetryConnectionButton"}} - + {{else}} + {{#if TemplateVar.get "showRetryConnectionButton"}} + + {{/if}} {{/if}} From 250aebf25843c7666d90f4f2bbf35e5df5f2c006 Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Wed, 13 Dec 2017 16:33:14 -0800 Subject: [PATCH 041/150] Remove swarm from init. Closes #3424 --- interface/i18n/mist.en.i18n.json | 6 ++- main.js | 32 +++++--------- modules/core/settings/actions.js | 76 +++++++++++++++++++++++++++++++- modules/core/settings/reducer.js | 13 ++++-- modules/menuItems.js | 25 ++++++++--- modules/settings.js | 22 +++++++++ modules/swarmNode.js | 11 ++++- 7 files changed, 152 insertions(+), 33 deletions(-) diff --git a/interface/i18n/mist.en.i18n.json b/interface/i18n/mist.en.i18n.json index 9b97efbc6..8c748341b 100644 --- a/interface/i18n/mist.en.i18n.json +++ b/interface/i18n/mist.en.i18n.json @@ -71,7 +71,8 @@ "fullNode": "Store full blockchain", "lightNode": "Use light Node (experimental!)", "startMining": "⛏ Start mining", - "stopMining": "⛏ Stop mining" + "stopMining": "⛏ Stop mining", + "enableSwarm": "Enable Swarm" }, "window": { "label": "Window", @@ -103,6 +104,9 @@ "legacyChain": { "title": "Legacy chain detected", "description": "Your node is currently on the unsupported Ethereum Classic chain. To use this chain, use tools provided by the ethereum classic project at\nhttps://ethereumclassic.github.io.\n\nTo revert to the main ethereum chain follow the tutorial here:\nhttps://github.com/ethereum/mist/releases/0.8.2" + }, + "swarm": { + "notEnabled": "Swarm is not enabled. Please enable it in the menu under Develop > Enable Swarm." } }, "rightClick": { diff --git a/main.js b/main.js index e417c7f89..3fb79f625 100644 --- a/main.js +++ b/main.js @@ -15,7 +15,7 @@ const log = logger.create('main'); import configureReduxStore from './modules/core/store'; import { quitApp } from './modules/core/ui/actions'; -import { setLanguageOnMain } from './modules/core/settings/actions'; +import { setLanguageOnMain, toggleSwarm } from './modules/core/settings/actions'; Q.config({ cancellation: true, @@ -32,7 +32,6 @@ require('./modules/ipcCommunicator.js'); const appMenu = require('./modules/menuItems'); const ipcProviderBackend = require('./modules/ipc/ipcProviderBackend.js'); const ethereumNode = require('./modules/ethereumNode.js'); -const swarmNode = require('./modules/swarmNode.js'); const nodeSync = require('./modules/nodeSync.js'); // Define global vars; The preloader makes some globals available to the client. @@ -161,6 +160,14 @@ onReady = () => { // Enable the Swarm protocol protocol.registerHttpProtocol('bzz', (request, callback) => { + if (!store.getState().settings.swarmEnabled) { + let error = global.i18n.t('mist.errors.swarm.notEnabled'); + dialog.showErrorBox('Error', error); + callback({ error: error }); + store.dispatch({ type: '[MAIN]:PROTOCOL:ERROR', payload: { protocol: 'bzz', error: error } }); + return; + } + const redirectPath = `${Settings.swarmURL}/${request.url.replace('bzz:/', 'bzz://')}`; callback({ method: request.method, referrer: request.referrer, url: redirectPath }); store.dispatch({ type: '[MAIN]:PROTOCOL:REGISTER', payload: { protocol: 'bzz' } }); @@ -239,21 +246,6 @@ onReady = () => { ); }); - swarmNode.on('starting', () => { - Windows.broadcast('uiAction_swarmStatus', 'starting'); - store.dispatch({ type: '[MAIN]:SWARM:INIT_START' }); - }); - - swarmNode.on('downloadProgress', (progress) => { - Windows.broadcast('uiAction_swarmStatus', 'downloadProgress', progress); - }); - - swarmNode.on('started', (isLocal) => { - Windows.broadcast('uiAction_swarmStatus', 'started', isLocal); - store.dispatch({ type: '[MAIN]:SWARM:INIT_FINISH' }); - }); - - const syncResultPromise = new Q((resolve, reject) => { nodeSync.on('nodeSyncing', (result) => { Windows.broadcast('uiAction_nodeSyncStatus', 'inProgress', result); @@ -302,11 +294,9 @@ onReady = () => { return ethereumNode.init(); }) .then(() => { - // Wallet shouldn't start Swarm || TODO: TravisCI failing to download Swarm - if (global.mode === 'wallet' || Settings.inAutoTestMode) { - return Promise.resolve(); + if (Settings.enableSwarmOnStart) { + store.dispatch(toggleSwarm()); } - return swarmNode.init(); }) .then(function sanityCheck() { if (!ethereumNode.isIpcConnected) { diff --git a/modules/core/settings/actions.js b/modules/core/settings/actions.js index 4746d1baa..9ea292c9b 100644 --- a/modules/core/settings/actions.js +++ b/modules/core/settings/actions.js @@ -1,3 +1,9 @@ +const logger = require('../../utils/logger'); +const swarmLog = logger.create('swarm'); + +import Settings from '../../settings'; +import swarmNode from '../../swarmNode.js'; + export function syncFlags(argv) { return { type: '[MAIN]:CLI_FLAGS:SYNC', payload: { cliFlags: argv } }; } @@ -63,8 +69,9 @@ export function resetMenu(lang) { return dispatch => { dispatch({ type: '[MAIN]:RESET_MENU:START' }); try { - const Settings = require('../../settings'); - Settings.language = lang; + if (lang) { + Settings.language = lang; + } const appMenu = require('../../menuItems'); appMenu(global.webviews); @@ -88,3 +95,68 @@ export function getLanguage(event) { } } } + +export function toggleSwarm(event) { + return (dispatch, getState) => { + if (getState().settings.swarmEnabled) { + dispatch({ type: '[MAIN]:SWARM:STOP' }); + + try { + swarmNode.on('stopping', () => { + swarmLog.info('Stopping Swarm'); + dispatch({ type: '[MAIN]:SWARM:DISABLING' }); + }); + + swarmNode.on('stopped', () => { + swarmLog.info('Swarm stopped'); + dispatch({ type: '[MAIN]:SWARM:DISABLED' }); + dispatch(resetMenu()); + }); + + swarmNode.stop(); + + } catch (error) { + dispatch({ type: '[MAIN]:SWARM:FAILURE', error }); + swarmLog.error(error); + } + + } else { + dispatch({ type: '[MAIN]:SWARM:START' }); + + try { + swarmNode.on('starting', () => { + swarmLog.info('Starting Swarm'); + dispatch({ type: '[MAIN]:SWARM:ENABLING' }); + }); + + swarmNode.on('downloadProgress', (progress) => { + swarmLog.info(progress); + }); + + swarmNode.on('started', () => { + swarmLog.info('Swarm started'); + dispatch({ type: '[MAIN]:SWARM:ENABLED' }); + dispatch(resetMenu()); + }); + + swarmNode.init(); + + } catch (error) { + dispatch({ type: '[MAIN]:SWARM:FAILURE', error }); + swarmLog.error(error); + } + } + } +} + +export function toggleSwarmOnStart(event) { + return (dispatch, getState) => { + if (getState().settings.swarmEnableOnStart) { + Settings.enableSwarmOnStart = false; + dispatch({ type: '[MAIN]:SWARM:DISABLE_ON_START' }); + } else { + Settings.enableSwarmOnStart = true; + dispatch({ type: '[MAIN]:SWARM:ENABLE_ON_START' }); + } + } +} diff --git a/modules/core/settings/reducer.js b/modules/core/settings/reducer.js index 3fec145ce..0c3b1ce3c 100644 --- a/modules/core/settings/reducer.js +++ b/modules/core/settings/reducer.js @@ -9,7 +9,8 @@ export const initialState = { productionMode: null, protocols: [], rpcMode: '', - swarmInit: false, + swarmEnabled: false, + swarmEnableOnStart: false, uiMode: '', updateCheckerRan: false, cliFlags: {} @@ -36,8 +37,14 @@ const settings = (state = initialState, action) => { return Object.assign({}, state, { cliFlags: action.payload.cliFlags }); case '[MAIN]:SET_LANGUAGE_ON_MAIN:SUCCESS': return Object.assign({}, state, { i18n: action.payload.i18n }); - case '[MAIN]:SWARM:INIT_FINISH': - return Object.assign({}, state, { swarmInit: true }); + case '[MAIN]:SWARM:ENABLED': + return Object.assign({}, state, { swarmEnabled: true }); + case '[MAIN]:SWARM:DISABLED': + return Object.assign({}, state, { swarmEnabled: false }); + case '[MAIN]:SWARM:ENABLE_ON_START': + return Object.assign({}, state, { swarmEnableOnStart: true }); + case '[MAIN]:SWARM:DISABLE_ON_START': + return Object.assign({}, state, { swarmEnableOnStart: false }); case '[MAIN]:UPDATE_CHECKER:FINISH': return Object.assign({}, state, { updateCheckerRan: true }); case '[MAIN]:IPC_PROVIDER_BACKEND:FINISH': diff --git a/modules/menuItems.js b/modules/menuItems.js index 696295fc2..6a7491eea 100644 --- a/modules/menuItems.js +++ b/modules/menuItems.js @@ -4,13 +4,13 @@ const path = require('path'); const Windows = require('./windows'); const Settings = require('./settings'); const log = require('./utils/logger').create('menuItems'); +const swarmLog = require('./utils/logger').create('swarm'); const updateChecker = require('./updateChecker'); const ethereumNode = require('./ethereumNode.js'); -const swarmNode = require('./swarmNode.js'); const ClientBinaryManager = require('./clientBinaryManager'); -import { setLanguage } from './core/settings/actions'; - +import { setLanguage, toggleSwarm, toggleSwarmOnStart } from './core/settings/actions'; +import swarmNode from './swarmNode.js'; // Make easier to return values for specific systems const switchForSystem = function (options) { @@ -229,6 +229,7 @@ let menuTempl = function (webviews) { { label: i18n.t('mist.applicationMenu.file.swarmUpload'), accelerator: 'Shift+CommandOrControl+U', + enabled: store.getState().settings.swarmEnabled, click() { const focusedWindow = BrowserWindow.getFocusedWindow(); const paths = dialog.showOpenDialog(focusedWindow, { @@ -250,8 +251,8 @@ let menuTempl = function (webviews) { }}); LocalStore.set('selectedTab', 'browser'); `); - console.log('Hash uploaded:', hash); - }).catch(e => console.log(e)); + swarmLog.info('Hash uploaded:', hash); + }).catch(e => swarmLog.error(e)); } } }] @@ -531,6 +532,20 @@ let menuTempl = function (webviews) { }); } + devToolsMenu.push({ + type: 'separator' + }, + { + label: i18n.t('mist.applicationMenu.develop.enableSwarm'), + enabled: true, + checked: global.store.getState().settings.swarmEnabled, + type: 'checkbox', + click() { + store.dispatch(toggleSwarm()); + store.dispatch(toggleSwarmOnStart()); + } + }); + // Enables mining menu: only in Solo mode and Ropsten network (testnet) if (ethereumNode.isOwnNode && (ethereumNode.isTestNetwork || ethereumNode.isDevNetwork)) { devToolsMenu.push({ diff --git a/modules/settings.js b/modules/settings.js index bb54af682..4f50dab4e 100644 --- a/modules/settings.js +++ b/modules/settings.js @@ -58,6 +58,13 @@ const argv = require('yargs') type: 'string', group: 'Mist options:', }, + swarm: { + describe: 'Enable Swarm on start.', + requiresArg: false, + nargs: 0, + type: 'boolean', + group: 'Mist options:', + }, swarmurl: { demand: false, default: 'http://localhost:8500', @@ -340,6 +347,18 @@ class Settings { this.saveConfig('ui.i18n', langCode); } + get enableSwarmOnStart() { + if (argv.swarm) { + return true; + } + + return this.loadConfig('swarm.enableOnStart'); + } + + set enableSwarmOnStart(bool) { + this.saveConfig('swarm.enableOnStart', bool); + } + get skiptimesynccheck() { return argv.skiptimesynccheck; } @@ -348,6 +367,9 @@ class Settings { global.config.insert({ ui: { i18n: i18n.getBestMatchedLangCode(app.getLocale()) + }, + swarm: { + enableOnStart: argv.swarm } }); } diff --git a/modules/swarmNode.js b/modules/swarmNode.js index f8f176c32..22c318820 100644 --- a/modules/swarmNode.js +++ b/modules/swarmNode.js @@ -86,6 +86,16 @@ class SwarmNode extends EventEmitter { return this.startUsingGateway(); } + stop() { + if (!this._swarm) { + return Q.reject(new Error('Swarm not initialized. Have you called swarmNode.init()?')); + } + + this.emit('stopping'); + this._stop(); + this.emit('stopped'); + } + upload(arg) { if (!this._swarm) { return Q.reject(new Error('Swarm not initialized. Have you called swarmNode.init()?')); @@ -93,7 +103,6 @@ class SwarmNode extends EventEmitter { return this._swarm.upload(arg); } - } module.exports = new SwarmNode(); From e25ce95f5fd2366867d05391d76865a64af8276b Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Wed, 13 Dec 2017 16:46:39 -0800 Subject: [PATCH 042/150] Re-order enable swarm menu item --- modules/menuItems.js | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/modules/menuItems.js b/modules/menuItems.js index 6a7491eea..46ca274ac 100644 --- a/modules/menuItems.js +++ b/modules/menuItems.js @@ -532,20 +532,6 @@ let menuTempl = function (webviews) { }); } - devToolsMenu.push({ - type: 'separator' - }, - { - label: i18n.t('mist.applicationMenu.develop.enableSwarm'), - enabled: true, - checked: global.store.getState().settings.swarmEnabled, - type: 'checkbox', - click() { - store.dispatch(toggleSwarm()); - store.dispatch(toggleSwarmOnStart()); - } - }); - // Enables mining menu: only in Solo mode and Ropsten network (testnet) if (ethereumNode.isOwnNode && (ethereumNode.isTestNetwork || ethereumNode.isDevNetwork)) { devToolsMenu.push({ @@ -562,6 +548,20 @@ let menuTempl = function (webviews) { }); } + devToolsMenu.push({ + type: 'separator' + }, + { + label: i18n.t('mist.applicationMenu.develop.enableSwarm'), + enabled: true, + checked: global.store.getState().settings.swarmEnabled, + type: 'checkbox', + click() { + store.dispatch(toggleSwarm()); + store.dispatch(toggleSwarmOnStart()); + } + }); + menu.push({ label: ((global.mining) ? '⛏ ' : '') + i18n.t('mist.applicationMenu.develop.label'), submenu: devToolsMenu, From dcb263ecfd55d45e9ae77ce7bcfa4dd0c6ec5f23 Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Thu, 14 Dec 2017 10:09:26 -0800 Subject: [PATCH 043/150] In ES6 you can reduce identical object key/value pairs to just the key. Thx @marcgarreau --- main.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.js b/main.js index 3fb79f625..9cca76c1b 100644 --- a/main.js +++ b/main.js @@ -163,8 +163,8 @@ onReady = () => { if (!store.getState().settings.swarmEnabled) { let error = global.i18n.t('mist.errors.swarm.notEnabled'); dialog.showErrorBox('Error', error); - callback({ error: error }); - store.dispatch({ type: '[MAIN]:PROTOCOL:ERROR', payload: { protocol: 'bzz', error: error } }); + callback({ error }); + store.dispatch({ type: '[MAIN]:PROTOCOL:ERROR', payload: { protocol: 'bzz', error } }); return; } From 04e11270a93d3322ec189c26a3ef84805983ae8b Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Thu, 14 Dec 2017 10:11:12 -0800 Subject: [PATCH 044/150] Better error msgs --- modules/swarmNode.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/swarmNode.js b/modules/swarmNode.js index 22c318820..b0efb358c 100644 --- a/modules/swarmNode.js +++ b/modules/swarmNode.js @@ -88,7 +88,7 @@ class SwarmNode extends EventEmitter { stop() { if (!this._swarm) { - return Q.reject(new Error('Swarm not initialized. Have you called swarmNode.init()?')); + return Q.reject(new Error('Swarm not initialized, unable to stop.')); } this.emit('stopping'); @@ -98,7 +98,7 @@ class SwarmNode extends EventEmitter { upload(arg) { if (!this._swarm) { - return Q.reject(new Error('Swarm not initialized. Have you called swarmNode.init()?')); + return Q.reject(new Error('Swarm not initialized, unable to upload.')); } return this._swarm.upload(arg); From 53258a25500284eb377d8696d479abe8bb32a6c6 Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Thu, 14 Dec 2017 12:32:25 -0800 Subject: [PATCH 045/150] Improve logging --- interface/i18n/mist.en.i18n.json | 3 +- modules/menuItems.js | 10 +++--- modules/settings.js | 14 +++----- modules/utils/logger.js | 56 +++++++++++++++++--------------- package.json | 2 +- 5 files changed, 41 insertions(+), 44 deletions(-) diff --git a/interface/i18n/mist.en.i18n.json b/interface/i18n/mist.en.i18n.json index 9b97efbc6..5a02f3f05 100644 --- a/interface/i18n/mist.en.i18n.json +++ b/interface/i18n/mist.en.i18n.json @@ -61,9 +61,8 @@ "devToolsWalletUI": "Wallet UI", "devToolsWebview": "__webview__", "runTests": "Run tests", - "logFiles": "Show log file", + "logFiles": "Show log files", "openRemix": "Open Remix IDE", - "externalNode": "using external node", "ethereumNode": "Ethereum Node", "network": "Network", "mainNetwork": "Main Network", diff --git a/modules/menuItems.js b/modules/menuItems.js index 696295fc2..d06f3f6b1 100644 --- a/modules/menuItems.js +++ b/modules/menuItems.js @@ -390,7 +390,6 @@ let menuTempl = function (webviews) { }]; } - const externalNodeMsg = (ethereumNode.isOwnNode) ? '' : ` (${i18n.t('mist.applicationMenu.develop.externalNode')})`; devToolsMenu.push({ label: i18n.t('mist.applicationMenu.develop.devTools'), submenu: devtToolsSubMenu, @@ -415,13 +414,12 @@ let menuTempl = function (webviews) { }); devToolsMenu.push({ - label: i18n.t('mist.applicationMenu.develop.logFiles') + externalNodeMsg, - enabled: ethereumNode.isOwnNode, + label: i18n.t('mist.applicationMenu.develop.logFiles'), click() { try { - shell.showItemInFolder(`${Settings.userDataPath}/node.log`); - } catch (e) { - log.info(e); + shell.showItemInFolder(`${Settings.appDataPath}/Mist/logs/all.log`); + } catch (error) { + log.error(error); } }, }); diff --git a/modules/settings.js b/modules/settings.js index bb54af682..2e28b21d4 100644 --- a/modules/settings.js +++ b/modules/settings.js @@ -99,14 +99,6 @@ const argv = require('yargs') type: 'boolean', group: 'Mist options:', }, - logfile: { - demand: false, - describe: 'Logs will be written to this file in addition to the console.', - requiresArg: true, - nargs: 1, - type: 'string', - group: 'Mist options:', - }, loglevel: { demand: false, default: 'info', @@ -173,8 +165,12 @@ if (argv.nodeOptions && argv.nodeOptions.syncmode) { class Settings { init() { - logger.setup(argv); + const logLevel = {logLevel: argv.loglevel}; + const logFolder = {logFolder: `${this.appDataPath}/Mist/logs`}; + const loggerOptions = Object.assign(argv, logLevel, logFolder); + logger.setup(loggerOptions); this._log = logger.create('Settings'); + store.dispatch(syncFlags(argv)); // If -v flag provided, log the Mist version and exit diff --git a/modules/utils/logger.js b/modules/utils/logger.js index 5168d50e4..676d9534a 100644 --- a/modules/utils/logger.js +++ b/modules/utils/logger.js @@ -1,41 +1,45 @@ const _ = require('./underscore'); -const log4js = require('log4js'); - +import log4js from 'log4js'; /** * Setup logging system. * @param {Object} [options] - * @param {String} [options.loglevel] Minimum logging threshold (default: info). - * @param {String} [options.logfile] File to write logs to (default: no file logging). + * @param {String} [options.logLevel] Minimum logging threshold (default: info). + * @param {String} [options.logFolder] Log folder to write logs to. */ exports.setup = function (options) { - options = _.extend({ - logfile: null, - loglevel: null, - }, options); - - // logging - const log4jsOptions = { - appenders: [ - { - type: 'console', + const logFolder = options.logFolder + const level = options.logLevel || 'info'; + + const config = { + appenders: { + out: { type: 'console' }, + all: { + type: 'file', + filename: `${logFolder}/all.log`, }, - ], - levels: { - '[all]': (options.loglevel || 'info').toUpperCase(), - }, - }; + main: { + type: 'file', + filename: `${logFolder}/category/main.log`, - if (options.logfile) { - log4jsOptions.appenders.push( - { + }, + EthereumNode: { + type: 'file', + filename: `${logFolder}/category/ethereum_node.log` + }, + swarm: { type: 'file', - filename: options.logfile, + filename: `${logFolder}/category/swarm.log` } - ); - } + }, + categories: { + default: { appenders: [ 'out', 'all', 'main' ], level }, + EthereumNode: { appenders: [ 'out', 'all', 'EthereumNode' ], level }, + swarm: { appenders: [ 'out', 'all', 'swarm' ], level } + } + }; - log4js.configure(log4jsOptions); + log4js.configure(config); }; diff --git a/package.json b/package.json index 340e89b71..1a9b9e4e8 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "i18next": "^7.1.3", "lodash": "^4.17.4", "log-rotate": "^0.2.7", - "log4js": "^1.1.1", + "log4js": "^2.4.1", "lokijs": "^1.4.3", "minimongo-standalone": "^1.1.0-3", "numeral": "^2.0.6", From dbefc13d27c33886da5ac3b6159d3baf3dbd6890 Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Thu, 14 Dec 2017 16:00:31 -0800 Subject: [PATCH 046/150] Better swarm state --- modules/core/settings/actions.js | 3 ++- modules/core/settings/reducer.js | 20 +++++++++++++++++--- modules/menuItems.js | 5 +++-- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/modules/core/settings/actions.js b/modules/core/settings/actions.js index 9ea292c9b..255bb2b4f 100644 --- a/modules/core/settings/actions.js +++ b/modules/core/settings/actions.js @@ -3,6 +3,7 @@ const swarmLog = logger.create('swarm'); import Settings from '../../settings'; import swarmNode from '../../swarmNode.js'; +import { SwarmState } from './reducer.js'; export function syncFlags(argv) { return { type: '[MAIN]:CLI_FLAGS:SYNC', payload: { cliFlags: argv } }; @@ -98,7 +99,7 @@ export function getLanguage(event) { export function toggleSwarm(event) { return (dispatch, getState) => { - if (getState().settings.swarmEnabled) { + if ([SwarmState.Enabled, SwarmState.Enabling].indexOf(getState().settings.swarmState) > -1) { dispatch({ type: '[MAIN]:SWARM:STOP' }); try { diff --git a/modules/core/settings/reducer.js b/modules/core/settings/reducer.js index 0c3b1ce3c..7dced1909 100644 --- a/modules/core/settings/reducer.js +++ b/modules/core/settings/reducer.js @@ -1,3 +1,11 @@ +export const SwarmState = { + Enabled: 'Enabled', + Enabling: 'Enabling', + Disabling: 'Disabling', + Disabled: 'Disabled', + Error: 'Error' +} + export const initialState = { appVersion: '', autoTestMode: false, @@ -9,7 +17,7 @@ export const initialState = { productionMode: null, protocols: [], rpcMode: '', - swarmEnabled: false, + swarmState: SwarmState.Disabled, swarmEnableOnStart: false, uiMode: '', updateCheckerRan: false, @@ -37,10 +45,16 @@ const settings = (state = initialState, action) => { return Object.assign({}, state, { cliFlags: action.payload.cliFlags }); case '[MAIN]:SET_LANGUAGE_ON_MAIN:SUCCESS': return Object.assign({}, state, { i18n: action.payload.i18n }); + case '[MAIN]:SWARM:ENABLING': + return Object.assign({}, state, { swarmState: SwarmState.Enabling }); case '[MAIN]:SWARM:ENABLED': - return Object.assign({}, state, { swarmEnabled: true }); + return Object.assign({}, state, { swarmState: SwarmState.Enabled }); + case '[MAIN]:SWARM:DISABLING': + return Object.assign({}, state, { swarmState: SwarmState.Disabling }); case '[MAIN]:SWARM:DISABLED': - return Object.assign({}, state, { swarmEnabled: false }); + return Object.assign({}, state, { swarmState: SwarmState.Disabled }); + case '[MAIN]:SWARM:FAILURE': + return Object.assign({}, state, { swarmState: SwarmState.Error }); case '[MAIN]:SWARM:ENABLE_ON_START': return Object.assign({}, state, { swarmEnableOnStart: true }); case '[MAIN]:SWARM:DISABLE_ON_START': diff --git a/modules/menuItems.js b/modules/menuItems.js index 46ca274ac..3fc91c858 100644 --- a/modules/menuItems.js +++ b/modules/menuItems.js @@ -10,6 +10,7 @@ const ethereumNode = require('./ethereumNode.js'); const ClientBinaryManager = require('./clientBinaryManager'); import { setLanguage, toggleSwarm, toggleSwarmOnStart } from './core/settings/actions'; +import { SwarmState } from './core/settings/reducer'; import swarmNode from './swarmNode.js'; // Make easier to return values for specific systems @@ -229,7 +230,7 @@ let menuTempl = function (webviews) { { label: i18n.t('mist.applicationMenu.file.swarmUpload'), accelerator: 'Shift+CommandOrControl+U', - enabled: store.getState().settings.swarmEnabled, + enabled: store.getState().settings.SwarmState == SwarmState.Enabled, click() { const focusedWindow = BrowserWindow.getFocusedWindow(); const paths = dialog.showOpenDialog(focusedWindow, { @@ -554,7 +555,7 @@ let menuTempl = function (webviews) { { label: i18n.t('mist.applicationMenu.develop.enableSwarm'), enabled: true, - checked: global.store.getState().settings.swarmEnabled, + checked: [SwarmState.Enabling, SwarmState.Enabled].indexOf(global.store.getState().settings.swarmState) > -1, type: 'checkbox', click() { store.dispatch(toggleSwarm()); From 35ca6db8e370865441e795148989be2dd90c1b0e Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Thu, 14 Dec 2017 16:06:02 -0800 Subject: [PATCH 047/150] sync swarmEnableOnStart to redux for toggle functionality --- modules/core/settings/actions.js | 6 ++++++ modules/settings.js | 11 +++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/modules/core/settings/actions.js b/modules/core/settings/actions.js index 255bb2b4f..60acd0220 100644 --- a/modules/core/settings/actions.js +++ b/modules/core/settings/actions.js @@ -161,3 +161,9 @@ export function toggleSwarmOnStart(event) { } } } + +export function setSwarmEnableOnStart() { + return (dispatch, getState) => { + dispatch({ type: '[MAIN]:SWARM:ENABLE_ON_START' }); + } +} \ No newline at end of file diff --git a/modules/settings.js b/modules/settings.js index 4f50dab4e..d14705806 100644 --- a/modules/settings.js +++ b/modules/settings.js @@ -6,7 +6,7 @@ const packageJson = require('../package.json'); const _ = require('./utils/underscore'); const lodash = require('lodash'); -import { syncBuildConfig, syncFlags } from './core/settings/actions'; +import { syncBuildConfig, syncFlags, setSwarmEnableOnStart } from './core/settings/actions'; // try loading in config file const defaultConfig = { @@ -352,7 +352,14 @@ class Settings { return true; } - return this.loadConfig('swarm.enableOnStart'); + const enableOnStart = this.loadConfig('swarm.enableOnStart'); + + // Sync to redux + if (enableOnStart) { + store.dispatch(setSwarmEnableOnStart()); + } + + return enableOnStart; } set enableSwarmOnStart(bool) { From 6d073e4ff6778e3d3277ce2a9378d3490502fa04 Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Thu, 14 Dec 2017 16:25:23 -0800 Subject: [PATCH 048/150] Pass babel compiler into mocha module --- gulpTasks/testing.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gulpTasks/testing.js b/gulpTasks/testing.js index 39efa8c99..88029277b 100644 --- a/gulpTasks/testing.js +++ b/gulpTasks/testing.js @@ -9,6 +9,9 @@ gulp.task('test', () => { ]).pipe(mocha({ timeout: 60000, ui: 'exports', - reporter: 'spec' + reporter: 'spec', + compilers: [ + 'js:babel-core/register', + ] })); }); From b90edc687c8f6361afa6c9dc5b3bfae83ad5e8df Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Thu, 14 Dec 2017 16:44:28 -0800 Subject: [PATCH 049/150] Fix --- main.js | 3 ++- modules/menuItems.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/main.js b/main.js index 9cca76c1b..75cd300b4 100644 --- a/main.js +++ b/main.js @@ -16,6 +16,7 @@ const log = logger.create('main'); import configureReduxStore from './modules/core/store'; import { quitApp } from './modules/core/ui/actions'; import { setLanguageOnMain, toggleSwarm } from './modules/core/settings/actions'; +import { SwarmStatus } from './modules/core/settings/reducer'; Q.config({ cancellation: true, @@ -160,7 +161,7 @@ onReady = () => { // Enable the Swarm protocol protocol.registerHttpProtocol('bzz', (request, callback) => { - if (!store.getState().settings.swarmEnabled) { + if (store.getState().settings.swarmStatus !== SwarmStatus.Enabled) { let error = global.i18n.t('mist.errors.swarm.notEnabled'); dialog.showErrorBox('Error', error); callback({ error }); diff --git a/modules/menuItems.js b/modules/menuItems.js index 3fc91c858..35ce72722 100644 --- a/modules/menuItems.js +++ b/modules/menuItems.js @@ -230,7 +230,7 @@ let menuTempl = function (webviews) { { label: i18n.t('mist.applicationMenu.file.swarmUpload'), accelerator: 'Shift+CommandOrControl+U', - enabled: store.getState().settings.SwarmState == SwarmState.Enabled, + enabled: store.getState().settings.swarmState == SwarmState.Enabled, click() { const focusedWindow = BrowserWindow.getFocusedWindow(); const paths = dialog.showOpenDialog(focusedWindow, { From a57e36ec81020681e3c3251ed40dcfc7db85da0c Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Fri, 15 Dec 2017 11:22:49 -0800 Subject: [PATCH 050/150] syntax --- modules/core/settings/actions.js | 6 ++---- modules/menuItems.js | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/modules/core/settings/actions.js b/modules/core/settings/actions.js index 60acd0220..68fd70a2a 100644 --- a/modules/core/settings/actions.js +++ b/modules/core/settings/actions.js @@ -99,7 +99,7 @@ export function getLanguage(event) { export function toggleSwarm(event) { return (dispatch, getState) => { - if ([SwarmState.Enabled, SwarmState.Enabling].indexOf(getState().settings.swarmState) > -1) { + if ([SwarmState.Enabled, SwarmState.Enabling].includes(getState().settings.swarmState)) { dispatch({ type: '[MAIN]:SWARM:STOP' }); try { @@ -163,7 +163,5 @@ export function toggleSwarmOnStart(event) { } export function setSwarmEnableOnStart() { - return (dispatch, getState) => { - dispatch({ type: '[MAIN]:SWARM:ENABLE_ON_START' }); - } + return { type: '[MAIN]:SWARM:ENABLE_ON_START' }; } \ No newline at end of file diff --git a/modules/menuItems.js b/modules/menuItems.js index 35ce72722..ba8036a40 100644 --- a/modules/menuItems.js +++ b/modules/menuItems.js @@ -555,7 +555,7 @@ let menuTempl = function (webviews) { { label: i18n.t('mist.applicationMenu.develop.enableSwarm'), enabled: true, - checked: [SwarmState.Enabling, SwarmState.Enabled].indexOf(global.store.getState().settings.swarmState) > -1, + checked: [SwarmState.Enabling, SwarmState.Enabled].includes(global.store.getState().settings.swarmState), type: 'checkbox', click() { store.dispatch(toggleSwarm()); From 24c8a7358a7cf993b48e8811ab9b2da305234ac8 Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Fri, 15 Dec 2017 11:37:21 -0800 Subject: [PATCH 051/150] Better swarmEnableOnStart logic --- modules/core/settings/actions.js | 22 ++++++++++------------ modules/menuItems.js | 1 - 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/modules/core/settings/actions.js b/modules/core/settings/actions.js index 68fd70a2a..8abdf1923 100644 --- a/modules/core/settings/actions.js +++ b/modules/core/settings/actions.js @@ -116,6 +116,11 @@ export function toggleSwarm(event) { swarmNode.stop(); + if (getState().settings.swarmEnableOnStart) { + Settings.enableSwarmOnStart = false; + dispatch({ type: '[MAIN]:SWARM:DISABLE_ON_START' }); + } + } catch (error) { dispatch({ type: '[MAIN]:SWARM:FAILURE', error }); swarmLog.error(error); @@ -142,6 +147,11 @@ export function toggleSwarm(event) { swarmNode.init(); + if (!getState().settings.swarmEnableOnStart) { + Settings.enableSwarmOnStart = true; + dispatch({ type: '[MAIN]:SWARM:ENABLE_ON_START' }); + } + } catch (error) { dispatch({ type: '[MAIN]:SWARM:FAILURE', error }); swarmLog.error(error); @@ -150,18 +160,6 @@ export function toggleSwarm(event) { } } -export function toggleSwarmOnStart(event) { - return (dispatch, getState) => { - if (getState().settings.swarmEnableOnStart) { - Settings.enableSwarmOnStart = false; - dispatch({ type: '[MAIN]:SWARM:DISABLE_ON_START' }); - } else { - Settings.enableSwarmOnStart = true; - dispatch({ type: '[MAIN]:SWARM:ENABLE_ON_START' }); - } - } -} - export function setSwarmEnableOnStart() { return { type: '[MAIN]:SWARM:ENABLE_ON_START' }; } \ No newline at end of file diff --git a/modules/menuItems.js b/modules/menuItems.js index ba8036a40..c0187c1ae 100644 --- a/modules/menuItems.js +++ b/modules/menuItems.js @@ -559,7 +559,6 @@ let menuTempl = function (webviews) { type: 'checkbox', click() { store.dispatch(toggleSwarm()); - store.dispatch(toggleSwarmOnStart()); } }); From fa0de511d281d5354bd9cdd90a55aab0e26836b6 Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Fri, 15 Dec 2017 11:38:43 -0800 Subject: [PATCH 052/150] Fix --- main.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.js b/main.js index 75cd300b4..2637c88d6 100644 --- a/main.js +++ b/main.js @@ -16,7 +16,7 @@ const log = logger.create('main'); import configureReduxStore from './modules/core/store'; import { quitApp } from './modules/core/ui/actions'; import { setLanguageOnMain, toggleSwarm } from './modules/core/settings/actions'; -import { SwarmStatus } from './modules/core/settings/reducer'; +import { SwarmState } from './modules/core/settings/reducer'; Q.config({ cancellation: true, @@ -161,7 +161,7 @@ onReady = () => { // Enable the Swarm protocol protocol.registerHttpProtocol('bzz', (request, callback) => { - if (store.getState().settings.swarmStatus !== SwarmStatus.Enabled) { + if (store.getState().settings.swarmState !== SwarmState.Enabled) { let error = global.i18n.t('mist.errors.swarm.notEnabled'); dialog.showErrorBox('Error', error); callback({ error }); From 5b5b5e2671a5494a4e03fdc9a0df51647e687236 Mon Sep 17 00:00:00 2001 From: Ev Date: Fri, 15 Dec 2017 19:01:04 -0200 Subject: [PATCH 053/150] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1615b2791..4d4ac18b4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Mist Browser -[![Github All Releases](https://img.shields.io/github/downloads/atom/atom/total.svg)]() +[![Github All Releases](https://img.shields.io/github/downloads/ethereum/mist/total.svg)]() [![Join the chat at https://gitter.im/ethereum/mist](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/ethereum/mist?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Build Status develop branch](https://travis-ci.org/ethereum/mist.svg?branch=develop)](https://travis-ci.org/ethereum/mist) [![Code Climate](https://codeclimate.com/github/ethereum/mist/badges/gpa.svg)](https://codeclimate.com/github/ethereum/mist) From d484ed0d102c59bb2398047f0a5783459d310234 Mon Sep 17 00:00:00 2001 From: Ev Date: Fri, 15 Dec 2017 19:02:21 -0200 Subject: [PATCH 054/150] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4d4ac18b4..700e7a891 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Mist Browser +# Mist Browserbeta [![Github All Releases](https://img.shields.io/github/downloads/ethereum/mist/total.svg)]() [![Join the chat at https://gitter.im/ethereum/mist](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/ethereum/mist?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) From 218e0b2620e905b8f1ba1fcaf1d9734ac8af6029 Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Mon, 4 Dec 2017 12:50:40 -0700 Subject: [PATCH 055/150] Refactors promises --- main.js | 169 ++++++++++++++++++++++++-------------------------------- 1 file changed, 73 insertions(+), 96 deletions(-) diff --git a/main.js b/main.js index 20a6cedc7..3ffc5dc08 100644 --- a/main.js +++ b/main.js @@ -220,13 +220,11 @@ onReady = () => { } - const kickStart = () => { - // connection failed; retry + const kickStart = async () => { ipcMain.on('retryConnection', () => { kickStart(); }); - // client binary stuff ClientBinaryManager.on('status', (status, data) => { Windows.broadcast('uiAction_clientBinaryStatus', status, data); }); @@ -283,117 +281,96 @@ onReady = () => { }); }); - // check legacy chain - // CHECK for legacy chain (FORK RELATED) - Q.try(() => { - // open the legacy chain message - if ((Settings.loadUserData('daoFork') || '').trim() === 'false') { - dialog.showMessageBox({ - type: 'warning', - buttons: ['OK'], - message: global.i18n.t('mist.errors.legacyChain.title'), - detail: global.i18n.t('mist.errors.legacyChain.description') - }, () => { - shell.openExternal('https://github.com/ethereum/mist/releases'); - store.dispatch(quitApp()); - }); + // Check legacy chain + if ((Settings.loadUserData('daoFork') || '').trim() === 'false') { + dialog.showMessageBox({ + type: 'warning', + buttons: ['OK'], + message: global.i18n.t('mist.errors.legacyChain.title'), + detail: global.i18n.t('mist.errors.legacyChain.description') + }, () => { + shell.openExternal('https://github.com/ethereum/mist/releases'); + store.dispatch(quitApp()); + }); - throw new Error('Cant start client due to legacy non-Fork setting.'); - } - }) - .then(() => { - return ClientBinaryManager.init(); - }) - .then(() => { - return ethereumNode.init(); - }) - .then(() => { - // Wallet shouldn't start Swarm || TODO: TravisCI failing to download Swarm - if (global.mode === 'wallet' || Settings.inAutoTestMode) { - return Promise.resolve(); - } - return swarmNode.init(); - }) - .then(function sanityCheck() { - if (!ethereumNode.isIpcConnected) { - throw new Error('Either the node didn\'t start or IPC socket failed to connect.'); - } + throw new Error('Cant start client due to legacy non-Fork setting.'); + } - /* At this point Geth is running and the socket is connected. */ - log.info('Connected via IPC to node.'); + await ClientBinaryManager.init(); + await ethereumNode.init(); - // update menu, to show node switching possibilities - appMenu(); - }) - .then(function getAccounts() { - return ethereumNode.send('eth_accounts', []); - }) - .then(function onboarding(resultData) { + // Wallet shouldn't start Swarm || TODO: TravisCI failing to download Swarm + if (global.mode === 'wallet' || Settings.inAutoTestMode) { + log.info('skipping Swarm'); + } else { + await swarmNode.init(); + } - if (ethereumNode.isGeth && (resultData.result === null || (_.isArray(resultData.result) && resultData.result.length === 0))) { - log.info('No accounts setup yet, lets do onboarding first.'); + // Sanity check function + if (!ethereumNode.isIpcConnected) { + throw new Error('Either the node didn\'t start or IPC socket failed to connect.'); + } - return new Q((resolve, reject) => { - const onboardingWindow = Windows.createPopup('onboardingScreen'); + // At this point Geth is running and the socket is connected. + log.info('Connected via IPC to node.'); - onboardingWindow.on('closed', () => store.dispatch(quitApp())); + // update menu, to show node switching possibilities + appMenu(); - // change network types (mainnet, testnet) - ipcMain.on('onBoarding_changeNet', (e, testnet) => { - const newType = ethereumNode.type; - const newNetwork = testnet ? 'rinkeby' : 'main'; + // #getAccounts + const resultData = await ethereumNode.send('eth_accounts', []); - log.debug('Onboarding change network', newType, newNetwork); + // #onboarding + if (ethereumNode.isGeth && (resultData.result === null || (_.isArray(resultData.result) && resultData.result.length === 0))) { + log.info('No accounts setup yet, lets do onboarding first.'); - ethereumNode.restart(newType, newNetwork) - .then(function nodeRestarted() { - appMenu(); - }) - .catch((err) => { - log.error('Error restarting node', err); + await new Q((resolve, reject) => { + const onboardingWindow = Windows.createPopup('onboardingScreen'); - reject(err); - }); - }); + onboardingWindow.on('closed', () => store.dispatch(quitApp())); - // launch app - ipcMain.on('onBoarding_launchApp', () => { - // prevent that it closes the app - onboardingWindow.removeAllListeners('closed'); - onboardingWindow.close(); + // change network types (mainnet, testnet) + ipcMain.on('onBoarding_changeNet', (e, testnet) => { + const newType = ethereumNode.type; + const newNetwork = testnet ? 'rinkeby' : 'main'; - ipcMain.removeAllListeners('onBoarding_changeNet'); - ipcMain.removeAllListeners('onBoarding_launchApp'); + log.debug('Onboarding change network', newType, newNetwork); - resolve(); - }); + ethereumNode.restart(newType, newNetwork) + .then(function nodeRestarted() { + appMenu(); + }) + .catch((err) => { + log.error('Error restarting node', err); - if (splashWindow) { - splashWindow.hide(); - } + reject(err); + }); }); - } - return; - }) - .then(function doSync() { - if (splashWindow) { splashWindow.show(); } - if (!Settings.inAutoTestMode) { return syncResultPromise; } - return; - }) - .then(function allDone() { - startMainWindow(); - }) - .catch((err) => { - log.error('Error starting up node and/or syncing', err); - }); /* socket connected to geth */ + // launch app + ipcMain.on('onBoarding_launchApp', () => { + // prevent that it closes the app + onboardingWindow.removeAllListeners('closed'); + onboardingWindow.close(); + + ipcMain.removeAllListeners('onBoarding_changeNet'); + ipcMain.removeAllListeners('onBoarding_launchApp'); + + resolve(); + }); + + if (splashWindow) { splashWindow.hide(); } + }); + } + + // #doSync + if (splashWindow) { splashWindow.show(); } + if (!Settings.inAutoTestMode) { await syncResultPromise; } + + await startMainWindow(); }; /* kick start */ - if (splashWindow) { - splashWindow.on('ready', kickStart); - } else { - kickStart(); - } + splashWindow ? splashWindow.on('ready', kickStart) : kickStart(); }; /* onReady() */ From 54ca37ea0d4bbbd34ca63c2996c514df92157571 Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Wed, 6 Dec 2017 18:24:44 -0700 Subject: [PATCH 056/150] Refactors kickStart method --- main.js | 253 +++++++++++++++++++++++++++----------------------------- 1 file changed, 122 insertions(+), 131 deletions(-) diff --git a/main.js b/main.js index 3ffc5dc08..a8c3bd271 100644 --- a/main.js +++ b/main.js @@ -119,7 +119,6 @@ app.on('before-quit', async (event) => { let mainWindow; let splashWindow; let onReady; -let startMainWindow; // This method will be called when Electron has done everything // initialization and ready for creating browser windows. @@ -219,169 +218,162 @@ onReady = () => { }); } + splashWindow ? splashWindow.on('ready', kickStart) : kickStart(); +}; /* onReady() */ - const kickStart = async () => { - ipcMain.on('retryConnection', () => { - kickStart(); - }); +async function kickStart() { + initializeKickStartListeners(); + checkForLegacyChain(); + await ClientBinaryManager.init(); + await ethereumNode.init(); - ClientBinaryManager.on('status', (status, data) => { - Windows.broadcast('uiAction_clientBinaryStatus', status, data); - }); + // Wallet shouldn't start Swarm || TODO: TravisCI failing to download Swarm + if (global.mode === 'wallet' || Settings.inAutoTestMode) { + log.info('skipping Swarm'); + } else { + await swarmNode.init(); + } - ethereumNode.on('nodeConnectionTimeout', () => { - Windows.broadcast('uiAction_nodeStatus', 'connectionTimeout'); - }); + if (!ethereumNode.isIpcConnected) { throw new Error('Either the node didn\'t start or IPC socket failed to connect.'); } + log.info('Connected via IPC to node.'); - ethereumNode.on('nodeLog', (data) => { - Windows.broadcast('uiAction_nodeLogText', data.replace(/^.*[0-9]]/, '')); - }); + // Update menu, to show node switching possibilities + appMenu(); - ethereumNode.on('state', (state, stateAsText) => { - Windows.broadcast('uiAction_nodeStatus', stateAsText, - ethereumNode.STATES.ERROR === state ? ethereumNode.lastError : null - ); - }); + await handleOnboarding(); - swarmNode.on('starting', () => { - Windows.broadcast('uiAction_swarmStatus', 'starting'); - store.dispatch({ type: '[MAIN]:SWARM:INIT_START' }); - }); + if (splashWindow) { splashWindow.show(); } + if (!Settings.inAutoTestMode) { await handleNodeSync(); } - swarmNode.on('downloadProgress', (progress) => { - Windows.broadcast('uiAction_swarmStatus', 'downloadProgress', progress); - }); + await startMainWindow(); +} - swarmNode.on('started', (isLocal) => { - Windows.broadcast('uiAction_swarmStatus', 'started', isLocal); - store.dispatch({ type: '[MAIN]:SWARM:INIT_FINISH' }); +function checkForLegacyChain() { + if ((Settings.loadUserData('daoFork') || '').trim() === 'false') { + dialog.showMessageBox({ + type: 'warning', + buttons: ['OK'], + message: global.i18n.t('mist.errors.legacyChain.title'), + detail: global.i18n.t('mist.errors.legacyChain.description') + }, () => { + shell.openExternal('https://github.com/ethereum/mist/releases'); + store.dispatch(quitApp()); }); + throw new Error('Cant start client due to legacy non-Fork setting.'); + } +} - const syncResultPromise = new Q((resolve, reject) => { - nodeSync.on('nodeSyncing', (result) => { - Windows.broadcast('uiAction_nodeSyncStatus', 'inProgress', result); - }); - - nodeSync.on('stopped', () => { - Windows.broadcast('uiAction_nodeSyncStatus', 'stopped'); - }); - - nodeSync.on('error', (err) => { - log.error('Error syncing node', err); - - reject(err); - }); - - nodeSync.on('finished', () => { - nodeSync.removeAllListeners('error'); - nodeSync.removeAllListeners('finished'); - - resolve(); - }); - }); - - // Check legacy chain - if ((Settings.loadUserData('daoFork') || '').trim() === 'false') { - dialog.showMessageBox({ - type: 'warning', - buttons: ['OK'], - message: global.i18n.t('mist.errors.legacyChain.title'), - detail: global.i18n.t('mist.errors.legacyChain.description') - }, () => { - shell.openExternal('https://github.com/ethereum/mist/releases'); - store.dispatch(quitApp()); - }); +function initializeKickStartListeners() { + ClientBinaryManager.on('status', (status, data) => { + Windows.broadcast('uiAction_clientBinaryStatus', status, data); + }); - throw new Error('Cant start client due to legacy non-Fork setting.'); - } + ethereumNode.on('nodeConnectionTimeout', () => { + Windows.broadcast('uiAction_nodeStatus', 'connectionTimeout'); + }); - await ClientBinaryManager.init(); - await ethereumNode.init(); + ethereumNode.on('nodeLog', (data) => { + Windows.broadcast('uiAction_nodeLogText', data.replace(/^.*[0-9]]/, '')); + }); - // Wallet shouldn't start Swarm || TODO: TravisCI failing to download Swarm - if (global.mode === 'wallet' || Settings.inAutoTestMode) { - log.info('skipping Swarm'); - } else { - await swarmNode.init(); - } + ethereumNode.on('state', (state, stateAsText) => { + Windows.broadcast('uiAction_nodeStatus', stateAsText, + ethereumNode.STATES.ERROR === state ? ethereumNode.lastError : null + ); + }); - // Sanity check function - if (!ethereumNode.isIpcConnected) { - throw new Error('Either the node didn\'t start or IPC socket failed to connect.'); - } + swarmNode.on('starting', () => { + Windows.broadcast('uiAction_swarmStatus', 'starting'); + store.dispatch({ type: '[MAIN]:SWARM:INIT_START' }); + }); - // At this point Geth is running and the socket is connected. - log.info('Connected via IPC to node.'); + swarmNode.on('downloadProgress', (progress) => { + Windows.broadcast('uiAction_swarmStatus', 'downloadProgress', progress); + }); - // update menu, to show node switching possibilities - appMenu(); + swarmNode.on('started', (isLocal) => { + Windows.broadcast('uiAction_swarmStatus', 'started', isLocal); + store.dispatch({ type: '[MAIN]:SWARM:INIT_FINISH' }); + }); +} - // #getAccounts - const resultData = await ethereumNode.send('eth_accounts', []); +async function handleOnboarding() { + // Fetch accounts; if none, show the onboarding process + const resultData = await ethereumNode.send('eth_accounts', []); - // #onboarding - if (ethereumNode.isGeth && (resultData.result === null || (_.isArray(resultData.result) && resultData.result.length === 0))) { - log.info('No accounts setup yet, lets do onboarding first.'); + if (ethereumNode.isGeth && (resultData.result === null || (_.isArray(resultData.result) && resultData.result.length === 0))) { + log.info('No accounts setup yet, lets do onboarding first.'); - await new Q((resolve, reject) => { - const onboardingWindow = Windows.createPopup('onboardingScreen'); + await new Q((resolve, reject) => { + const onboardingWindow = Windows.createPopup('onboardingScreen'); - onboardingWindow.on('closed', () => store.dispatch(quitApp())); + onboardingWindow.on('closed', () => store.dispatch(quitApp())); - // change network types (mainnet, testnet) - ipcMain.on('onBoarding_changeNet', (e, testnet) => { - const newType = ethereumNode.type; - const newNetwork = testnet ? 'rinkeby' : 'main'; + // Handle changing network types (mainnet, testnet) + ipcMain.on('onBoarding_changeNet', (e, testnet) => { + const newType = ethereumNode.type; + const newNetwork = testnet ? 'rinkeby' : 'main'; - log.debug('Onboarding change network', newType, newNetwork); + log.debug('Onboarding change network', newType, newNetwork); - ethereumNode.restart(newType, newNetwork) - .then(function nodeRestarted() { - appMenu(); - }) - .catch((err) => { - log.error('Error restarting node', err); + ethereumNode.restart(newType, newNetwork) + .then(function nodeRestarted() { + appMenu(); + }) + .catch((err) => { + log.error('Error restarting node', err); + reject(err); + }); + }); - reject(err); - }); - }); + ipcMain.on('onBoarding_launchApp', () => { + onboardingWindow.removeAllListeners('closed'); + onboardingWindow.close(); - // launch app - ipcMain.on('onBoarding_launchApp', () => { - // prevent that it closes the app - onboardingWindow.removeAllListeners('closed'); - onboardingWindow.close(); + ipcMain.removeAllListeners('onBoarding_changeNet'); + ipcMain.removeAllListeners('onBoarding_launchApp'); - ipcMain.removeAllListeners('onBoarding_changeNet'); - ipcMain.removeAllListeners('onBoarding_launchApp'); + resolve(); + }); - resolve(); - }); + if (splashWindow) { splashWindow.hide(); } + }); + } +} - if (splashWindow) { splashWindow.hide(); } - }); - } +function handleNodeSync() { + return new Q((resolve, reject) => { + nodeSync.on('nodeSyncing', (result) => { + Windows.broadcast('uiAction_nodeSyncStatus', 'inProgress', result); + }); - // #doSync - if (splashWindow) { splashWindow.show(); } - if (!Settings.inAutoTestMode) { await syncResultPromise; } + nodeSync.on('stopped', () => { + Windows.broadcast('uiAction_nodeSyncStatus', 'stopped'); + }); - await startMainWindow(); - }; /* kick start */ + nodeSync.on('error', (err) => { + log.error('Error syncing node', err); - splashWindow ? splashWindow.on('ready', kickStart) : kickStart(); -}; /* onReady() */ + reject(err); + }); + nodeSync.on('finished', () => { + nodeSync.removeAllListeners('error'); + nodeSync.removeAllListeners('finished'); -/** -Start the main window and all its processes + resolve(); + }); + }); +} -@method startMainWindow -*/ -startMainWindow = () => { +function startMainWindow() { log.info(`Loading Interface at ${global.interfaceAppUrl}`); + initializeMainWindowListeners(); + initializeTabs(); +} +function initializeMainWindowListeners() { mainWindow.on('ready', () => { if (splashWindow) { splashWindow.close(); } mainWindow.show(); @@ -390,8 +382,9 @@ startMainWindow = () => { mainWindow.load(global.interfaceAppUrl); mainWindow.on('closed', () => store.dispatch(quitApp())); +} - // observe Tabs for changes and refresh menu +function initializeTabs() { const Tabs = global.db.getCollection('UI_tabs'); const sortedTabs = Tabs.getDynamicView('sorted_tabs') || Tabs.addDynamicView('sorted_tabs'); sortedTabs.applySimpleSort('position', false); @@ -401,9 +394,7 @@ startMainWindow = () => { global._refreshMenuFromTabsTimer = setTimeout(() => { log.debug('Refresh menu with tabs'); - global.webviews = sortedTabs.data(); - appMenu(global.webviews); store.dispatch({ type: '[MAIN]:MENU:REFRESH' }); }, 1000); @@ -412,4 +403,4 @@ startMainWindow = () => { Tabs.on('insert', refreshMenu); Tabs.on('update', refreshMenu); Tabs.on('delete', refreshMenu); -}; +} From e6cabf54e8111a73f2cfee8997e595e1f0b88b99 Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Tue, 12 Dec 2017 14:26:36 -0700 Subject: [PATCH 057/150] Refactors onReady function --- main.js | 56 ++++++++++++++----------------- modules/dbSync.js | 2 +- modules/ipc/ipcProviderBackend.js | 2 ++ modules/updateChecker.js | 1 + 4 files changed, 30 insertions(+), 31 deletions(-) diff --git a/main.js b/main.js index a8c3bd271..59eeaa0dc 100644 --- a/main.js +++ b/main.js @@ -118,7 +118,6 @@ app.on('before-quit', async (event) => { let mainWindow; let splashWindow; -let onReady; // This method will be called when Electron has done everything // initialization and ready for creating browser windows. @@ -148,17 +147,32 @@ Only do this if you have secured your HTTP connection or you know what you are d // Allows the Swarm protocol to behave like http protocol.registerStandardSchemes(['bzz']); -onReady = () => { +async function onReady() { global.config = db.getCollection('SYS_config'); - // setup DB sync to backend - dbSync.backendSyncInit(); - store.dispatch({ type: '[MAIN]:DB:SYNC_TO_BACKEND' }); + dbSync.initializeListeners(); - // Initialise window mgr Windows.init(); - // Enable the Swarm protocol + enableSwarmProtocol(); + + if (!Settings.inAutoTestMode) { await UpdateChecker.run(); } + + ipcProviderBackend.init(); + + // TODO: Settings.language relies on global.config object being set + store.dispatch(setLanguageOnMain(Settings.language)); + + appMenu(); + + createCoreWindows(); + + checkTimeSync(); + + splashWindow ? splashWindow.on('ready', kickStart) : kickStart(); +} + +function enableSwarmProtocol() { protocol.registerHttpProtocol('bzz', (request, callback) => { const redirectPath = `${Settings.swarmURL}/${request.url.replace('bzz:/', 'bzz://')}`; callback({ method: request.method, referrer: request.referrer, url: redirectPath }); @@ -168,26 +182,9 @@ onReady = () => { log.error(error); } }); +} - // check for update - if (!Settings.inAutoTestMode) { - UpdateChecker.run(); - store.dispatch({ type: '[MAIN]:UPDATE_CHECKER:FINISHED' }); - } - - // initialize the web3 IPC provider backend - ipcProviderBackend.init(); - store.dispatch({ type: '[MAIN]:IPC_PROVIDER_BACKEND:INIT' }); - - // instantiate custom protocols - // require('./customProtocols.js'); - - // change to user language now that global.config object is ready - store.dispatch(setLanguageOnMain(Settings.language)); - - // add menu already here, so we have copy and paste functionality - appMenu(); - +function createCoreWindows() { global.defaultWindow = windowStateKeeper({ defaultWidth: 1024 + 208, defaultHeight: 720 }); // Create the browser window. @@ -197,8 +194,9 @@ onReady = () => { global.defaultWindow.manage(mainWindow.window); if (!Settings.inAutoTestMode) { splashWindow = Windows.create('splash'); } +} - // Checks time sync +function checkTimeSync() { if (!Settings.skiptimesynccheck) { timesync.checkEnabled((err, enabled) => { if (err) { @@ -217,9 +215,7 @@ onReady = () => { } }); } - - splashWindow ? splashWindow.on('ready', kickStart) : kickStart(); -}; /* onReady() */ +} async function kickStart() { initializeKickStartListeners(); diff --git a/modules/dbSync.js b/modules/dbSync.js index b21f9b22d..40d052ff3 100644 --- a/modules/dbSync.js +++ b/modules/dbSync.js @@ -7,7 +7,7 @@ const { ipcMain, ipcRenderer } = require('electron'); * Sync IPC calls received from given window into given db table. * @param {Object} coll Db collection to save to. */ -exports.backendSyncInit = function () { +exports.initializeListeners = function () { let log = require('./utils/logger').create('dbSync'), db = require('./db'), ipc = ipcMain; diff --git a/modules/ipc/ipcProviderBackend.js b/modules/ipc/ipcProviderBackend.js index 0b76b8748..99626849e 100644 --- a/modules/ipc/ipcProviderBackend.js +++ b/modules/ipc/ipcProviderBackend.js @@ -60,6 +60,8 @@ class IpcProviderBackend { }); log.trace('Loaded processors', _.keys(this._processors)); + + store.dispatch({ type: '[MAIN]:IPC_PROVIDER_BACKEND:INIT' }); } diff --git a/modules/updateChecker.js b/modules/updateChecker.js index 95b6918b3..5c45fdd1f 100644 --- a/modules/updateChecker.js +++ b/modules/updateChecker.js @@ -78,6 +78,7 @@ exports.run = () => { }, }); } + store.dispatch({ type: '[MAIN]:UPDATE_CHECKER:FINISHED' }); }).catch((err) => { log.error(err); }); From c1b90bf0941ceadf03702d7fc1b31dd830f84590 Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Fri, 15 Dec 2017 17:29:00 -0700 Subject: [PATCH 058/150] Reverts changes to main.js for merging --- main.js | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/main.js b/main.js index 2637c88d6..e417c7f89 100644 --- a/main.js +++ b/main.js @@ -15,8 +15,7 @@ const log = logger.create('main'); import configureReduxStore from './modules/core/store'; import { quitApp } from './modules/core/ui/actions'; -import { setLanguageOnMain, toggleSwarm } from './modules/core/settings/actions'; -import { SwarmState } from './modules/core/settings/reducer'; +import { setLanguageOnMain } from './modules/core/settings/actions'; Q.config({ cancellation: true, @@ -33,6 +32,7 @@ require('./modules/ipcCommunicator.js'); const appMenu = require('./modules/menuItems'); const ipcProviderBackend = require('./modules/ipc/ipcProviderBackend.js'); const ethereumNode = require('./modules/ethereumNode.js'); +const swarmNode = require('./modules/swarmNode.js'); const nodeSync = require('./modules/nodeSync.js'); // Define global vars; The preloader makes some globals available to the client. @@ -161,14 +161,6 @@ onReady = () => { // Enable the Swarm protocol protocol.registerHttpProtocol('bzz', (request, callback) => { - if (store.getState().settings.swarmState !== SwarmState.Enabled) { - let error = global.i18n.t('mist.errors.swarm.notEnabled'); - dialog.showErrorBox('Error', error); - callback({ error }); - store.dispatch({ type: '[MAIN]:PROTOCOL:ERROR', payload: { protocol: 'bzz', error } }); - return; - } - const redirectPath = `${Settings.swarmURL}/${request.url.replace('bzz:/', 'bzz://')}`; callback({ method: request.method, referrer: request.referrer, url: redirectPath }); store.dispatch({ type: '[MAIN]:PROTOCOL:REGISTER', payload: { protocol: 'bzz' } }); @@ -247,6 +239,21 @@ onReady = () => { ); }); + swarmNode.on('starting', () => { + Windows.broadcast('uiAction_swarmStatus', 'starting'); + store.dispatch({ type: '[MAIN]:SWARM:INIT_START' }); + }); + + swarmNode.on('downloadProgress', (progress) => { + Windows.broadcast('uiAction_swarmStatus', 'downloadProgress', progress); + }); + + swarmNode.on('started', (isLocal) => { + Windows.broadcast('uiAction_swarmStatus', 'started', isLocal); + store.dispatch({ type: '[MAIN]:SWARM:INIT_FINISH' }); + }); + + const syncResultPromise = new Q((resolve, reject) => { nodeSync.on('nodeSyncing', (result) => { Windows.broadcast('uiAction_nodeSyncStatus', 'inProgress', result); @@ -295,9 +302,11 @@ onReady = () => { return ethereumNode.init(); }) .then(() => { - if (Settings.enableSwarmOnStart) { - store.dispatch(toggleSwarm()); + // Wallet shouldn't start Swarm || TODO: TravisCI failing to download Swarm + if (global.mode === 'wallet' || Settings.inAutoTestMode) { + return Promise.resolve(); } + return swarmNode.init(); }) .then(function sanityCheck() { if (!ethereumNode.isIpcConnected) { From a5e536edaac5f799503ae60089588469d92480a0 Mon Sep 17 00:00:00 2001 From: Marc Garreau Date: Fri, 15 Dec 2017 17:44:37 -0700 Subject: [PATCH 059/150] Applies main.js changes again --- main.js | 33 +++++++++++---------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/main.js b/main.js index 59eeaa0dc..1b6b82842 100644 --- a/main.js +++ b/main.js @@ -15,7 +15,8 @@ const log = logger.create('main'); import configureReduxStore from './modules/core/store'; import { quitApp } from './modules/core/ui/actions'; -import { setLanguageOnMain } from './modules/core/settings/actions'; +import { setLanguageOnMain, toggleSwarm } from './modules/core/settings/actions'; +import { SwarmState } from './modules/core/settings/reducer'; Q.config({ cancellation: true, @@ -32,7 +33,6 @@ require('./modules/ipcCommunicator.js'); const appMenu = require('./modules/menuItems'); const ipcProviderBackend = require('./modules/ipc/ipcProviderBackend.js'); const ethereumNode = require('./modules/ethereumNode.js'); -const swarmNode = require('./modules/swarmNode.js'); const nodeSync = require('./modules/nodeSync.js'); // Define global vars; The preloader makes some globals available to the client. @@ -174,6 +174,14 @@ async function onReady() { function enableSwarmProtocol() { protocol.registerHttpProtocol('bzz', (request, callback) => { + if (store.getState().settings.swarmState !== SwarmState.Enabled) { + const error = global.i18n.t('mist.errors.swarm.notEnabled'); + dialog.showErrorBox('Error', error); + callback({ error }); + store.dispatch({ type: '[MAIN]:PROTOCOL:ERROR', payload: { protocol: 'bzz', error } }); + return; + } + const redirectPath = `${Settings.swarmURL}/${request.url.replace('bzz:/', 'bzz://')}`; callback({ method: request.method, referrer: request.referrer, url: redirectPath }); store.dispatch({ type: '[MAIN]:PROTOCOL:REGISTER', payload: { protocol: 'bzz' } }); @@ -223,12 +231,7 @@ async function kickStart() { await ClientBinaryManager.init(); await ethereumNode.init(); - // Wallet shouldn't start Swarm || TODO: TravisCI failing to download Swarm - if (global.mode === 'wallet' || Settings.inAutoTestMode) { - log.info('skipping Swarm'); - } else { - await swarmNode.init(); - } + if (Settings.enableSwarmOnStart) { store.dispatch(toggleSwarm()); } if (!ethereumNode.isIpcConnected) { throw new Error('Either the node didn\'t start or IPC socket failed to connect.'); } log.info('Connected via IPC to node.'); @@ -278,20 +281,6 @@ function initializeKickStartListeners() { ethereumNode.STATES.ERROR === state ? ethereumNode.lastError : null ); }); - - swarmNode.on('starting', () => { - Windows.broadcast('uiAction_swarmStatus', 'starting'); - store.dispatch({ type: '[MAIN]:SWARM:INIT_START' }); - }); - - swarmNode.on('downloadProgress', (progress) => { - Windows.broadcast('uiAction_swarmStatus', 'downloadProgress', progress); - }); - - swarmNode.on('started', (isLocal) => { - Windows.broadcast('uiAction_swarmStatus', 'started', isLocal); - store.dispatch({ type: '[MAIN]:SWARM:INIT_FINISH' }); - }); } async function handleOnboarding() { From f1b05743834d75a6a4683699a7ce78f1dcead1c0 Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Fri, 15 Dec 2017 18:22:19 -0800 Subject: [PATCH 060/150] Clean up --- .../templates/popupWindows/splashScreen.js | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/interface/client/templates/popupWindows/splashScreen.js b/interface/client/templates/popupWindows/splashScreen.js index 20b5f4ec7..ef62312a5 100644 --- a/interface/client/templates/popupWindows/splashScreen.js +++ b/interface/client/templates/popupWindows/splashScreen.js @@ -88,26 +88,6 @@ Template['popupWindows_splashScreen'].onCreated(function () { } }); - ipc.on('uiAction_swarmStatus', function (e, status, data) { - switch (status) { - case 'starting': - TemplateVar.set(template, 'text', 'Starting Swarm'); - TemplateVar.set(template, 'showProgressBar', false); - break; - - case 'downloadProgress': - TemplateVar.set(template, 'text', `Downloading Swarm binary: ${(data * 100).toFixed(0)}%`); - TemplateVar.set(template, 'showProgressBar', true); - TemplateVar.set(template, 'progress', data * 100); - break; - - case 'started': - TemplateVar.set(template, 'text', 'Started Swarm'); - TemplateVar.set(template, 'showProgressBar', false); - break; - } - }); - ipc.on('uiAction_nodeSyncStatus', function (e, status, data) { console.trace('Node sync status', status, data); From 42ac518b51e493978e84a9ad3a83d6d7447215ae Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Fri, 15 Dec 2017 18:22:42 -0800 Subject: [PATCH 061/150] Better clarity on log statement --- modules/core/settings/actions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/settings/actions.js b/modules/core/settings/actions.js index 8abdf1923..367cbcbb3 100644 --- a/modules/core/settings/actions.js +++ b/modules/core/settings/actions.js @@ -136,7 +136,7 @@ export function toggleSwarm(event) { }); swarmNode.on('downloadProgress', (progress) => { - swarmLog.info(progress); + swarmLog.info(`Downloading Swarm binary: ${(progress * 100).toFixed(0)}%`); }); swarmNode.on('started', () => { From 5f132b63de7ef2b4c5fe698f1b4413e8079e3197 Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Fri, 15 Dec 2017 18:29:43 -0800 Subject: [PATCH 062/150] Better precision --- modules/core/settings/actions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/settings/actions.js b/modules/core/settings/actions.js index 367cbcbb3..9cf5fa0f4 100644 --- a/modules/core/settings/actions.js +++ b/modules/core/settings/actions.js @@ -136,7 +136,7 @@ export function toggleSwarm(event) { }); swarmNode.on('downloadProgress', (progress) => { - swarmLog.info(`Downloading Swarm binary: ${(progress * 100).toFixed(0)}%`); + swarmLog.info(`Downloading Swarm binary: ${(progress * 100).toFixed(1)}%`); }); swarmNode.on('started', () => { From 633875b92715b8fa7d741764613f98d564acebc6 Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Fri, 15 Dec 2017 19:17:44 -0800 Subject: [PATCH 063/150] Don't show swarm menu items in wallet mode, return false in enableSwarmOnStart in wallet mode --- modules/menuItems.js | 133 +++++++++++++++++++++++-------------------- modules/settings.js | 4 ++ 2 files changed, 76 insertions(+), 61 deletions(-) diff --git a/modules/menuItems.js b/modules/menuItems.js index c0187c1ae..d5f70e60a 100644 --- a/modules/menuItems.js +++ b/modules/menuItems.js @@ -98,27 +98,29 @@ let menuTempl = function (webviews) { label: i18n.t('mist.applicationMenu.app.about', { app: Settings.appName }), click() { Windows.createPopup('about'); - }, + } }, { label: i18n.t('mist.applicationMenu.app.checkForUpdates'), click() { updateChecker.runVisibly(); - }, - }, { + } + }, + { label: i18n.t('mist.applicationMenu.app.checkForNodeUpdates'), click() { // remove skipVersion fs.writeFileSync( path.join(Settings.userDataPath, 'skippedNodeVersion.json'), '' // write no version - ); + ); // true = will restart after updating and user consent ClientBinaryManager.init(true); - }, - }, { - type: 'separator', + } + }, + { + type: 'separator', }, { label: i18n.t('mist.applicationMenu.app.services', { app: Settings.appName }), @@ -147,19 +149,57 @@ let menuTempl = function (webviews) { } ); } - fileMenu.push( - { label: i18n.t('mist.applicationMenu.app.quit', { app: Settings.appName }), - accelerator: 'CommandOrControl+Q', - click() { - app.quit(); - }, - }); + + fileMenu.push({ + label: i18n.t('mist.applicationMenu.app.quit', { app: Settings.appName }), + accelerator: 'CommandOrControl+Q', + click() { + app.quit(); + }, + }); + menu.push({ label: i18n.t('mist.applicationMenu.app.label', { app: Settings.appName }), submenu: fileMenu, }); - // ACCOUNTS + let swarmUpload = []; + if (global.mode !== 'wallet') { + swarmUpload.push({ + type: 'separator', + }, + { + label: i18n.t('mist.applicationMenu.file.swarmUpload'), + accelerator: 'Shift+CommandOrControl+U', + enabled: store.getState().settings.swarmState == SwarmState.Enabled, + click() { + const focusedWindow = BrowserWindow.getFocusedWindow(); + const paths = dialog.showOpenDialog(focusedWindow, { + properties: ['openFile', 'openDirectory'] + }); + if (paths && paths.length === 1) { + const isDir = fs.lstatSync(paths[0]).isDirectory(); + const defaultPath = path.join(paths[0], 'index.html'); + const uploadConfig = { + path: paths[0], + kind: isDir ? 'directory' : 'file', + defaultFile: fs.existsSync(defaultPath) ? '/index.html' : null + }; + swarmNode.upload(uploadConfig).then((hash) => { + focusedWindow.webContents.executeJavaScript(` + Tabs.update('browser', {$set: { + url: 'bzz://${hash}', + redirect: 'bzz://${hash}' + }}); + LocalStore.set('selectedTab', 'browser'); + `); + swarmLog.info('Hash uploaded:', hash); + }).catch(e => swarmLog.error(e)); + } + } + }); + } + menu.push({ label: i18n.t('mist.applicationMenu.file.label'), submenu: [ @@ -224,40 +264,9 @@ let menuTempl = function (webviews) { }, ], }, - { - type: 'separator', - }, - { - label: i18n.t('mist.applicationMenu.file.swarmUpload'), - accelerator: 'Shift+CommandOrControl+U', - enabled: store.getState().settings.swarmState == SwarmState.Enabled, - click() { - const focusedWindow = BrowserWindow.getFocusedWindow(); - const paths = dialog.showOpenDialog(focusedWindow, { - properties: ['openFile', 'openDirectory'] - }); - if (paths && paths.length === 1) { - const isDir = fs.lstatSync(paths[0]).isDirectory(); - const defaultPath = path.join(paths[0], 'index.html'); - const uploadConfig = { - path: paths[0], - kind: isDir ? 'directory' : 'file', - defaultFile: fs.existsSync(defaultPath) ? '/index.html' : null - }; - swarmNode.upload(uploadConfig).then((hash) => { - focusedWindow.webContents.executeJavaScript(` - Tabs.update('browser', {$set: { - url: 'bzz://${hash}', - redirect: 'bzz://${hash}' - }}); - LocalStore.set('selectedTab', 'browser'); - `); - swarmLog.info('Hash uploaded:', hash); - }).catch(e => swarmLog.error(e)); - } - } - }] - }); + ...swarmUpload + ] + }); // EDIT menu.push({ @@ -549,18 +558,20 @@ let menuTempl = function (webviews) { }); } - devToolsMenu.push({ - type: 'separator' - }, - { - label: i18n.t('mist.applicationMenu.develop.enableSwarm'), - enabled: true, - checked: [SwarmState.Enabling, SwarmState.Enabled].includes(global.store.getState().settings.swarmState), - type: 'checkbox', - click() { - store.dispatch(toggleSwarm()); - } - }); + if (global.mode !== 'wallet') { + devToolsMenu.push({ + type: 'separator' + }, + { + label: i18n.t('mist.applicationMenu.develop.enableSwarm'), + enabled: true, + checked: [SwarmState.Enabling, SwarmState.Enabled].includes(global.store.getState().settings.swarmState), + type: 'checkbox', + click() { + store.dispatch(toggleSwarm()); + } + }); + } menu.push({ label: ((global.mining) ? '⛏ ' : '') + i18n.t('mist.applicationMenu.develop.label'), diff --git a/modules/settings.js b/modules/settings.js index d14705806..ba70da82c 100644 --- a/modules/settings.js +++ b/modules/settings.js @@ -348,6 +348,10 @@ class Settings { } get enableSwarmOnStart() { + if (global.mode === 'wallet') { + return false; + } + if (argv.swarm) { return true; } From 27f3feb8eedacaa7b28dd43c4dbd51e880d6c241 Mon Sep 17 00:00:00 2001 From: Everton Fraga Date: Sat, 16 Dec 2017 12:13:03 -0200 Subject: [PATCH 064/150] Fixing Mist/Electron app paths --- modules/menuItems.js | 2 +- modules/settings.js | 6 +- yarn.lock | 642 +++++++++++++++++++++++++++++++++++++++---- 3 files changed, 601 insertions(+), 49 deletions(-) diff --git a/modules/menuItems.js b/modules/menuItems.js index 4bda6b219..d82451222 100644 --- a/modules/menuItems.js +++ b/modules/menuItems.js @@ -428,7 +428,7 @@ let menuTempl = function (webviews) { label: i18n.t('mist.applicationMenu.develop.logFiles'), click() { try { - shell.showItemInFolder(`${Settings.appDataPath}/Mist/logs/all.log`); + shell.showItemInFolder(path.join(Settings.userDataPath, 'logs', 'all.log')); } catch (error) { log.error(error); } diff --git a/modules/settings.js b/modules/settings.js index f14e6a7f0..c4e5b3cb1 100644 --- a/modules/settings.js +++ b/modules/settings.js @@ -173,7 +173,7 @@ if (argv.nodeOptions && argv.nodeOptions.syncmode) { class Settings { init() { const logLevel = {logLevel: argv.loglevel}; - const logFolder = {logFolder: `${this.appDataPath}/Mist/logs`}; + const logFolder = {logFolder: path.join(this.userDataPath, 'logs')}; const loggerOptions = Object.assign(argv, logLevel, logFolder); logger.setup(loggerOptions); this._log = logger.create('Settings'); @@ -209,8 +209,10 @@ class Settings { store.dispatch(syncBuildConfig('uiMode', this.uiMode)); } + + // @returns "Application Support/Mist" in production mode + // @returns "Application Support/Electron" in development mode get userDataPath() { - // Application Support/Mist return app.getPath('userData'); } diff --git a/yarn.lock b/yarn.lock index 76aed1965..c2b5ed8ce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -47,6 +47,17 @@ acorn@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7" +addressparser@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/addressparser/-/addressparser-1.0.1.tgz#47afbe1a2a9262191db6838e4fd1d39b40821746" + +agent-base@2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.1.1.tgz#d6de10d5af6132d5bd692427d46fc538539094c7" + dependencies: + extend "~3.0.0" + semver "~5.0.1" + ajv-keywords@^1.0.0: version "1.5.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" @@ -218,10 +229,18 @@ assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + assertion-error@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" +ast-types@0.x.x: + version "0.10.1" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.10.1.tgz#f52fca9715579a14f841d67d7f8d25432ab6a3dd" + async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" @@ -236,6 +255,12 @@ async@^0.9.0: version "0.9.2" resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" +async@~2.1.2: + version "2.1.5" + resolved "https://registry.yarnpkg.com/async/-/async-2.1.5.tgz#e587c68580994ac67fc56ff86d3ac56bdbe810bc" + dependencies: + lodash "^4.14.0" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -244,14 +269,24 @@ atob@~1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/atob/-/atob-1.1.3.tgz#95f13629b12c3a51a5d215abdce2aa9f32f80773" +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" -aws4@^1.6.0: +aws4@^1.2.1, aws4@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" +axios@^0.15.3: + version "0.15.3" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.15.3.tgz#2c9d638b2e191a08ea1d6cc988eadd6ba5bdc053" + dependencies: + follow-redirects "1.0.0" + babel-code-frame@^6.16.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -758,6 +793,12 @@ bl@^1.0.0: dependencies: readable-stream "^2.0.5" +bl@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" + dependencies: + readable-stream "~2.0.5" + block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" @@ -797,6 +838,12 @@ body-parser@1.18.2, body-parser@^1.16.0: raw-body "2.3.2" type-is "~1.6.15" +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + boom@4.x.x: version "4.3.1" resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" @@ -902,6 +949,18 @@ buffers@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" +buildmail@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/buildmail/-/buildmail-4.0.1.tgz#877f7738b78729871c9a105e3b837d2be11a7a72" + dependencies: + addressparser "1.0.1" + libbase64 "0.1.0" + libmime "3.0.0" + libqp "1.1.0" + nodemailer-fetch "1.6.0" + nodemailer-shared "1.1.0" + punycode "1.4.1" + builtin-modules@^1.0.0, builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -939,6 +998,10 @@ capture-stack-trace@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" +caseless@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -1012,6 +1075,10 @@ circular-json@^0.3.1: version "0.3.3" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" +circular-json@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.4.0.tgz#c448ea998b7fe31ecf472ec29c6b608e2e2a62fd" + cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" @@ -1067,6 +1134,10 @@ co@^4.0.0, co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" +co@~3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/co/-/co-3.0.6.tgz#1445f226c5eb956138e68c9ac30167ea7d2e6bda" + code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" @@ -1237,6 +1308,12 @@ cross-spawn@^4.0.0: lru-cache "^4.0.1" which "^1.2.9" +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + cryptiles@3.x.x: version "3.1.2" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" @@ -1288,14 +1365,24 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -date-format@^0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-0.0.0.tgz#09206863ab070eb459acea5542cbd856b11966b3" +data-uri-to-buffer@1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz#77163ea9c20d8641b4707e8f18abdf9a78f34835" + +date-format@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-1.2.0.tgz#615e828e233dd1ab9bb9ae0950e0ceccfa6ecad8" dateformat@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" +debug@2, debug@2.6.9, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + debug@2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" @@ -1308,15 +1395,17 @@ debug@2.6.8: dependencies: ms "2.0.0" -debug@2.6.9, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" +debug@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" dependencies: ms "2.0.0" -debug@^0.7.2: - version "0.7.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" +debug@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" @@ -1412,6 +1501,14 @@ defined@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-0.0.0.tgz#f35eea7d705e933baf13b2f03b3f83d921403b3e" +degenerator@~1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-1.0.4.tgz#fcf490a37ece266464d9cc431ab98c5819ced095" + dependencies: + ast-types "0.x.x" + escodegen "1.x.x" + esprima "3.x.x" + del@^2.0.2, del@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" @@ -1488,6 +1585,10 @@ dot-prop@^3.0.0: dependencies: is-obj "^1.0.0" +double-ended-queue@^2.1.0-0: + version "2.1.0-0" + resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c" + drbg.js@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b" @@ -1779,6 +1880,17 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" +escodegen@1.x.x: + version "1.9.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852" + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.5.6" + escope@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" @@ -1874,6 +1986,10 @@ espree@^3.4.0: acorn "^5.2.1" acorn-jsx "^3.0.0" +esprima@3.x.x, esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + esprima@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" @@ -2053,7 +2169,7 @@ express@^4.14.0, express@^4.15.3: utils-merge "1.0.1" vary "~1.1.2" -extend@^3.0.0, extend@~3.0.1: +extend@3, extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" @@ -2141,6 +2257,10 @@ file-type@^6.1.0: version "6.2.0" resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919" +file-uri-to-path@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" @@ -2230,6 +2350,12 @@ flux-standard-action@^1.0.0: dependencies: lodash "^4.0.0" +follow-redirects@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.0.0.tgz#8e34298cbd2e176f254effec75a1c78cc849fd37" + dependencies: + debug "^2.2.0" + for-each@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4" @@ -2256,6 +2382,22 @@ forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" +form-data@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.0.0.tgz#6f0aebadcc5da16c13e1ecc11137d85f9b883b25" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.11" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + form-data@~2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" @@ -2331,6 +2473,13 @@ fstream@~0.1.21: mkdirp "0.5" rimraf "2" +ftp@~0.3.10: + version "0.3.10" + resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d" + dependencies: + readable-stream "1.1.x" + xregexp "2.0.0" + function-bind@^1.0.2: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -2397,6 +2546,17 @@ get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" +get-uri@2: + version "2.0.1" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-2.0.1.tgz#dbdcacacd8c608a38316869368117697a1631c59" + dependencies: + data-uri-to-buffer "1" + debug "2" + extend "3" + file-uri-to-path "1" + ftp "~0.3.10" + readable-stream "2" + geth-private@^1.3.0: version "1.7.0" resolved "https://registry.yarnpkg.com/geth-private/-/geth-private-1.7.0.tgz#326eae709fe12cf3545d0bcda7a3fa2c43adc7c8" @@ -2715,6 +2875,15 @@ har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" +har-validator@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" + dependencies: + chalk "^1.1.1" + commander "^2.9.0" + is-my-json-valid "^2.12.4" + pinkie-promise "^2.0.0" + har-validator@~5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" @@ -2782,6 +2951,15 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.0" +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + hawk@~6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" @@ -2795,6 +2973,13 @@ he@1.1.1, he@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" +hipchat-notifier@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hipchat-notifier/-/hipchat-notifier-1.1.0.tgz#b6d249755437c191082367799d3ba9a0f23b231e" + dependencies: + lodash "^4.0.0" + request "^2.0.0" + hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -2803,6 +2988,10 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + hoek@4.x.x: version "4.2.0" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" @@ -2841,6 +3030,22 @@ http-https@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" +http-proxy-agent@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-1.0.0.tgz#cc1ce38e453bf984a0f7702d2dd59c73d081284a" + dependencies: + agent-base "2" + debug "2" + extend "3" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -2849,10 +3054,33 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" +httpntlm@1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/httpntlm/-/httpntlm-1.6.1.tgz#ad01527143a2e8773cfae6a96f58656bb52a34b2" + dependencies: + httpreq ">=0.4.22" + underscore "~1.7.0" + +httpreq@>=0.4.22: + version "0.4.24" + resolved "https://registry.yarnpkg.com/httpreq/-/httpreq-0.4.24.tgz#4335ffd82cd969668a39465c929ac61d6393627f" + +https-proxy-agent@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6" + dependencies: + agent-base "2" + debug "2" + extend "3" + i18next@^7.1.3: version "7.2.3" resolved "https://registry.yarnpkg.com/i18next/-/i18next-7.2.3.tgz#a6c220ac1c8240ff1078aa9bc997fd449e052dc7" +iconv-lite@0.4.15: + version "0.4.15" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" + iconv-lite@0.4.19, iconv-lite@^0.4.17: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" @@ -2875,6 +3103,14 @@ indent-string@^2.1.0: dependencies: repeating "^2.0.0" +inflection@~1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.10.0.tgz#5bffcb1197ad3e81050f8e17e21668087ee9eb2f" + +inflection@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.3.8.tgz#cbd160da9f75b14c3cc63578d4f396784bf3014e" + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -2945,6 +3181,14 @@ invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" +ip@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.0.1.tgz#c7e356cdea225ae71b36d70f2e71a92ba4e42590" + +ip@^1.1.2, ip@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + ipaddr.js@1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" @@ -3028,7 +3272,7 @@ is-hex-prefixed@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" -is-my-json-valid@^2.10.0: +is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: version "2.16.1" resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz#5a846777e2c2620d1e69104e5d3a03b1f6088f11" dependencies: @@ -3235,7 +3479,7 @@ json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: dependencies: jsonify "~0.0.0" -json-stringify-safe@~5.0.1: +json-stringify-safe@5.0.x, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -3338,6 +3582,22 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +libbase64@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/libbase64/-/libbase64-0.1.0.tgz#62351a839563ac5ff5bd26f12f60e9830bb751e6" + +libmime@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/libmime/-/libmime-3.0.0.tgz#51a1a9e7448ecbd32cda54421675bb21bc093da6" + dependencies: + iconv-lite "0.4.15" + libbase64 "0.1.0" + libqp "1.1.0" + +libqp@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/libqp/-/libqp-1.1.0.tgz#f5e6e06ad74b794fb5b5b66988bf728ef1dedbe8" + liftoff@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.3.0.tgz#a98f2ff67183d8ba7cfaca10548bd7ff0550b385" @@ -3524,7 +3784,7 @@ lodash.values@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" -lodash@^4.0.0, lodash@^4.11.1, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.8.0, lodash@~4.17.4: +lodash@^4.0.0, lodash@^4.11.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.8.0, lodash@~4.17.4: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -3536,13 +3796,31 @@ log-rotate@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/log-rotate/-/log-rotate-0.2.7.tgz#aadb64259eea49e5668842342c864d0b142e8c2d" -log4js@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-1.1.1.tgz#c21d29c7604089e4f255833e7f94b3461de1ff43" +log4js@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-2.4.1.tgz#b0c4e88133e0e3056afdc6f91f7f377576158778" dependencies: - debug "^2.2.0" + circular-json "^0.4.0" + date-format "^1.2.0" + debug "^3.1.0" semver "^5.3.0" - streamroller "^0.4.0" + streamroller "^0.7.0" + optionalDependencies: + axios "^0.15.3" + hipchat-notifier "^1.1.0" + loggly "^1.1.0" + mailgun-js "^0.7.0" + nodemailer "^2.5.0" + redis "^2.7.1" + slack-node "~0.2.0" + +loggly@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/loggly/-/loggly-1.1.1.tgz#0a0fc1d3fa3a5ec44fdc7b897beba2a4695cebee" + dependencies: + json-stringify-safe "5.0.x" + request "2.75.x" + timespan "2.3.x" lokijs@^1.4.3: version "1.5.1" @@ -3576,10 +3854,35 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@~2.6.5: + version "2.6.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.6.5.tgz#e56d6354148ede8d7707b58d143220fd08df0fd5" + macaddress@^0.2.7: version "0.2.8" resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" +mailcomposer@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/mailcomposer/-/mailcomposer-4.0.1.tgz#0e1c44b2a07cf740ee17dc149ba009f19cadfeb4" + dependencies: + buildmail "4.0.1" + libmime "3.0.0" + +mailgun-js@^0.7.0: + version "0.7.15" + resolved "https://registry.yarnpkg.com/mailgun-js/-/mailgun-js-0.7.15.tgz#ee366a20dac64c3c15c03d6c1b3e0ed795252abb" + dependencies: + async "~2.1.2" + debug "~2.2.0" + form-data "~2.1.1" + inflection "~1.10.0" + is-stream "^1.1.0" + path-proxy "~1.0.0" + proxy-agent "~2.0.0" + q "~1.4.0" + tsscmp "~1.0.0" + make-dir@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51" @@ -3661,7 +3964,7 @@ mime-db@~1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" -mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17: +mime-types@^2.1.11, mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7: version "2.1.17" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" dependencies: @@ -3781,6 +4084,10 @@ mout@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/mout/-/mout-0.11.1.tgz#ba3611df5f0e5b1ffbfd01166b8f02d1f5fa2b99" +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + ms@0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" @@ -3831,6 +4138,10 @@ negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" +netmask@~1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35" + node-abi@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.1.2.tgz#4da6caceb6685fcd31e7dd1994ef6bb7d0a9c0b2" @@ -3858,6 +4169,59 @@ node-unzip-2@^0.2.1: readable-stream "~1.0.0" setimmediate "~1.0.1" +node-uuid@~1.4.7: + version "1.4.8" + resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" + +nodemailer-direct-transport@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/nodemailer-direct-transport/-/nodemailer-direct-transport-3.3.2.tgz#e96fafb90358560947e569017d97e60738a50a86" + dependencies: + nodemailer-shared "1.1.0" + smtp-connection "2.12.0" + +nodemailer-fetch@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz#79c4908a1c0f5f375b73fe888da9828f6dc963a4" + +nodemailer-shared@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz#cf5994e2fd268d00f5cf0fa767a08169edb07ec0" + dependencies: + nodemailer-fetch "1.6.0" + +nodemailer-smtp-pool@2.8.2: + version "2.8.2" + resolved "https://registry.yarnpkg.com/nodemailer-smtp-pool/-/nodemailer-smtp-pool-2.8.2.tgz#2eb94d6cf85780b1b4725ce853b9cbd5e8da8c72" + dependencies: + nodemailer-shared "1.1.0" + nodemailer-wellknown "0.1.10" + smtp-connection "2.12.0" + +nodemailer-smtp-transport@2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.7.2.tgz#03d71c76314f14ac7dbc7bf033a6a6d16d67fb77" + dependencies: + nodemailer-shared "1.1.0" + nodemailer-wellknown "0.1.10" + smtp-connection "2.12.0" + +nodemailer-wellknown@0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz#586db8101db30cb4438eb546737a41aad0cf13d5" + +nodemailer@^2.5.0: + version "2.7.2" + resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-2.7.2.tgz#f242e649aeeae39b6c7ed740ef7b061c404d30f9" + dependencies: + libmime "3.0.0" + mailcomposer "4.0.1" + nodemailer-direct-transport "3.3.2" + nodemailer-shared "1.1.0" + nodemailer-smtp-pool "2.8.2" + nodemailer-smtp-transport "2.7.2" + socks "1.1.9" + noop-logger@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" @@ -3910,7 +4274,7 @@ numeral@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/numeral/-/numeral-2.0.6.tgz#4ad080936d443c2561aed9f2197efffe25f4e506" -oauth-sign@~0.8.2: +oauth-sign@~0.8.1, oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" @@ -3993,7 +4357,7 @@ optimist@~0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" -optionator@^0.8.2: +optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" dependencies: @@ -4069,6 +4433,30 @@ p-timeout@^1.1.1: dependencies: p-finally "^1.0.0" +pac-proxy-agent@1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-1.1.0.tgz#34a385dfdf61d2f0ecace08858c745d3e791fd4d" + dependencies: + agent-base "2" + debug "2" + extend "3" + get-uri "2" + http-proxy-agent "1" + https-proxy-agent "1" + pac-resolver "~2.0.0" + raw-body "2" + socks-proxy-agent "2" + +pac-resolver@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-2.0.0.tgz#99b88d2f193fbdeefc1c9a529c1f3260ab5277cd" + dependencies: + co "~3.0.6" + degenerator "~1.0.2" + ip "1.0.1" + netmask "~1.0.4" + thunkify "~2.1.1" + package-json@^2.0.0: version "2.4.0" resolved "https://registry.yarnpkg.com/package-json/-/package-json-2.4.0.tgz#0d15bd67d1cbbddbb2ca222ff2edb86bcb31a8bb" @@ -4144,6 +4532,12 @@ path-parse@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" +path-proxy@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/path-proxy/-/path-proxy-1.0.0.tgz#18e8a36859fc9d2f1a53b48dee138543c020de5e" + dependencies: + inflection "~1.3.0" + path-root-regex@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" @@ -4295,6 +4689,19 @@ proxy-addr@~2.0.2: forwarded "~0.1.2" ipaddr.js "1.5.2" +proxy-agent@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-2.0.0.tgz#57eb5347aa805d74ec681cb25649dba39c933499" + dependencies: + agent-base "2" + debug "2" + extend "3" + http-proxy-agent "1" + https-proxy-agent "1" + lru-cache "~2.6.5" + pac-proxy-agent "1" + socks-proxy-agent "2" + pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -4319,10 +4726,14 @@ punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" -punycode@^1.4.1: +punycode@1.4.1, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" +q@~1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" + q@~1.5.0: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -4331,6 +4742,10 @@ qs@6.5.1, qs@~6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" +qs@~6.2.0: + version "6.2.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe" + query-string@^2.4.0: version "2.4.2" resolved "https://registry.yarnpkg.com/query-string/-/query-string-2.4.2.tgz#7db0666420804baa92ae9f268962855a76143dfb" @@ -4352,7 +4767,7 @@ range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" -raw-body@2.3.2: +raw-body@2, raw-body@2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" dependencies: @@ -4407,16 +4822,7 @@ read-pkg@^2.0.0: normalize-package-data "^2.3.2" path-type "^2.0.0" -"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.0, readable-stream@~1.0.31: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^1.1.7, readable-stream@~1.1.9: +readable-stream@1.1.x, readable-stream@~1.1.9: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" dependencies: @@ -4425,7 +4831,7 @@ readable-stream@^1.1.7, readable-stream@~1.1.9: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2: +readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" dependencies: @@ -4437,6 +4843,26 @@ readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable string_decoder "~1.0.3" util-deprecate "~1.0.1" +"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.0, readable-stream@~1.0.31: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + readline2@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" @@ -4458,6 +4884,22 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" +redis-commands@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.3.1.tgz#81d826f45fa9c8b2011f4cd7a0fe597d241d442b" + +redis-parser@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-2.6.0.tgz#52ed09dacac108f1a631c07e9b69941e7a19504b" + +redis@^2.7.1: + version "2.8.0" + resolved "https://registry.yarnpkg.com/redis/-/redis-2.8.0.tgz#202288e3f58c49f6079d97af7a10e1303ae14b02" + dependencies: + double-ended-queue "^2.1.0-0" + redis-commands "^1.2.0" + redis-parser "^2.6.0" + redux-devtools-instrument@^1.3.3: version "1.8.2" resolved "https://registry.yarnpkg.com/redux-devtools-instrument/-/redux-devtools-instrument-1.8.2.tgz#5e91cfe402e790dae3fd2f0d235f7b7d84b09ffe" @@ -4584,7 +5026,33 @@ replace-ext@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" -request@^2.45.0, request@^2.55.0, request@^2.79.0, request@^2.81.0, request@~2.83.0: +request@2.75.x: + version "2.75.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.75.0.tgz#d2b8268a286da13eaa5d01adf5d18cc90f657d93" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + bl "~1.1.2" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.0.0" + har-validator "~2.0.6" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + node-uuid "~1.4.7" + oauth-sign "~0.8.1" + qs "~6.2.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + +request@^2.0.0, request@^2.45.0, request@^2.55.0, request@^2.74.0, request@^2.79.0, request@^2.81.0, request@~2.83.0: version "2.83.0" resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" dependencies: @@ -4611,6 +5079,15 @@ request@^2.45.0, request@^2.55.0, request@^2.79.0, request@^2.81.0, request@~2.8 tunnel-agent "^0.6.0" uuid "^3.1.0" +requestretry@^1.2.2: + version "1.12.2" + resolved "https://registry.yarnpkg.com/requestretry/-/requestretry-1.12.2.tgz#13ce38a4ce4e809f3c9ec6d4ca3b7b9ba4acf26c" + dependencies: + extend "^3.0.0" + lodash "^4.15.0" + request "^2.74.0" + when "^3.7.7" + require-dir@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/require-dir/-/require-dir-0.3.2.tgz#c1d5c75e9fbffde9f2e6b33e383db4f594b5a6a9" @@ -4809,6 +5286,10 @@ semver@^4.1.0: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" +semver@~5.0.1: + version "5.0.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a" + send@0.16.1: version "0.16.1" resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" @@ -4917,6 +5398,12 @@ single-line-log@^1.1.2: dependencies: string-width "^1.0.1" +slack-node@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/slack-node/-/slack-node-0.2.0.tgz#de4b8dddaa8b793f61dbd2938104fdabf37dfa30" + dependencies: + requestretry "^1.2.2" + slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" @@ -4935,6 +5422,23 @@ slide@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" +smart-buffer@^1.0.13, smart-buffer@^1.0.4: + version "1.1.15" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16" + +smtp-connection@2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/smtp-connection/-/smtp-connection-2.12.0.tgz#d76ef9127cb23c2259edb1e8349c2e8d5e2d74c1" + dependencies: + httpntlm "1.6.1" + nodemailer-shared "1.1.0" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + sntp@2.x.x: version "2.1.0" resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" @@ -4955,6 +5459,28 @@ socketcluster-client@^5.3.1: sc-formatter "~3.0.0" ws "3.0.0" +socks-proxy-agent@2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-2.1.1.tgz#86ebb07193258637870e13b7bd99f26c663df3d3" + dependencies: + agent-base "2" + extend "3" + socks "~1.1.5" + +socks@1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/socks/-/socks-1.1.9.tgz#628d7e4d04912435445ac0b6e459376cb3e6d691" + dependencies: + ip "^1.1.2" + smart-buffer "^1.0.4" + +socks@~1.1.5: + version "1.1.10" + resolved "https://registry.yarnpkg.com/socks/-/socks-1.1.10.tgz#5b8b7fc7c8f341c53ed056e929b7bf4de8ba7b5a" + dependencies: + ip "^1.1.4" + smart-buffer "^1.0.13" + solc@^0.4.18: version "0.4.18" resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.18.tgz#83ac6d871dd16a9710e67dbb76dad7f614100702" @@ -4990,7 +5516,7 @@ source-map@^0.1.38: dependencies: amdefine ">=0.0.4" -source-map@^0.5.1, source-map@^0.5.6: +source-map@^0.5.1, source-map@^0.5.6, source-map@~0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -5070,14 +5596,14 @@ stream-consume@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f" -streamroller@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-0.4.1.tgz#d435bd5974373abd9bd9068359513085106cc05f" +streamroller@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-0.7.0.tgz#a1d1b7cf83d39afb0d63049a5acbf93493bdf64b" dependencies: - date-format "^0.0.0" - debug "^0.7.2" + date-format "^1.2.0" + debug "^3.1.0" mkdirp "^0.5.1" - readable-stream "^1.1.7" + readable-stream "^2.3.0" strict-uri-encode@^1.0.0: version "1.1.0" @@ -5108,7 +5634,7 @@ string_decoder@~1.0.3: dependencies: safe-buffer "~5.1.0" -stringstream@~0.0.5: +stringstream@~0.0.4, stringstream@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -5324,6 +5850,10 @@ through@2, through@^2.3.6, through@~2.3.4: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" +thunkify@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/thunkify/-/thunkify-2.1.2.tgz#faa0e9d230c51acc95ca13a361ac05ca7e04553d" + tildify@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" @@ -5346,6 +5876,10 @@ timed-out@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" +timespan@2.3.x: + version "2.3.0" + resolved "https://registry.yarnpkg.com/timespan/-/timespan-2.3.0.tgz#4902ce040bd13d845c8f59b27e9d59bad6f39929" + tmp@0.0.28: version "0.0.28" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" @@ -5368,7 +5902,7 @@ to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" -tough-cookie@~2.3.3: +tough-cookie@~2.3.0, tough-cookie@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" dependencies: @@ -5400,7 +5934,11 @@ tryit@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" -tunnel-agent@^0.4.3: +tsscmp@~1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.5.tgz#7dc4a33af71581ab4337da91d85ca5427ebd9a97" + +tunnel-agent@^0.4.3, tunnel-agent@~0.4.1: version "0.4.3" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" @@ -5466,6 +6004,10 @@ underscore@>=1.0.0, underscore@^1.8.3: version "1.8.3" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" +underscore@~1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209" + unique-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" @@ -5676,6 +6218,10 @@ wgxpath@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wgxpath/-/wgxpath-1.0.0.tgz#eef8a4b9d558cc495ad3a9a2b751597ecd9af690" +when@^3.7.7: + version "3.7.8" + resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82" + which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" @@ -5810,6 +6356,10 @@ xmlhttprequest@*: version "1.8.0" resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" +xregexp@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" + xtend@4.0.1, "xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" From 0619f7d04df0679bb65f51e96e40251a23e8161f Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Sat, 16 Dec 2017 11:14:02 -0800 Subject: [PATCH 065/150] registerHttpProtocol gets called on every request, update redux accordingly --- main.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/main.js b/main.js index 1b6b82842..0054c3e58 100644 --- a/main.js +++ b/main.js @@ -144,9 +144,6 @@ Only do this if you have secured your HTTP connection or you know what you are d } }); -// Allows the Swarm protocol to behave like http -protocol.registerStandardSchemes(['bzz']); - async function onReady() { global.config = db.getCollection('SYS_config'); @@ -173,6 +170,9 @@ async function onReady() { } function enableSwarmProtocol() { + protocol.registerStandardSchemes(['bzz']); + store.dispatch({ type: '[MAIN]:PROTOCOL:REGISTER', payload: { protocol: 'bzz' } }); + protocol.registerHttpProtocol('bzz', (request, callback) => { if (store.getState().settings.swarmState !== SwarmState.Enabled) { const error = global.i18n.t('mist.errors.swarm.notEnabled'); @@ -184,7 +184,9 @@ function enableSwarmProtocol() { const redirectPath = `${Settings.swarmURL}/${request.url.replace('bzz:/', 'bzz://')}`; callback({ method: request.method, referrer: request.referrer, url: redirectPath }); - store.dispatch({ type: '[MAIN]:PROTOCOL:REGISTER', payload: { protocol: 'bzz' } }); + + store.dispatch({ type: '[MAIN]:PROTOCOL:REQUEST', payload: { protocol: 'bzz' } }); + }, (error) => { if (error) { log.error(error); From df1b2e75a30c2826a7bd4abe57a9309108189713 Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Sat, 16 Dec 2017 11:40:09 -0800 Subject: [PATCH 066/150] Add space to console.log --- interface/client/templates/layout/browserBar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/client/templates/layout/browserBar.js b/interface/client/templates/layout/browserBar.js index b4f1110ee..b8db40c62 100644 --- a/interface/client/templates/layout/browserBar.js +++ b/interface/client/templates/layout/browserBar.js @@ -157,7 +157,7 @@ Template['layout_browserBar'].events({ var url = Helpers.sanitizeUrl(url); var tabId = Helpers.getTabIdByUrl(url); - console.log('Submitted new URL:' + url); + console.log('Submitted new URL: ' + url); // update current tab url Tabs.update(tabId, { $set: { From 51ec295ce8ee2f5420c1fed72190fbc265c7190b Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Sat, 16 Dec 2017 11:55:36 -0800 Subject: [PATCH 067/150] Fix, needs to be registered before --- main.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/main.js b/main.js index 0054c3e58..7c95d1b42 100644 --- a/main.js +++ b/main.js @@ -144,6 +144,9 @@ Only do this if you have secured your HTTP connection or you know what you are d } }); +protocol.registerStandardSchemes(['bzz']); +store.dispatch({ type: '[MAIN]:PROTOCOL:REGISTER', payload: { protocol: 'bzz' } }); + async function onReady() { global.config = db.getCollection('SYS_config'); @@ -166,13 +169,11 @@ async function onReady() { checkTimeSync(); + splashWindow ? splashWindow.on('ready', kickStart) : kickStart(); } function enableSwarmProtocol() { - protocol.registerStandardSchemes(['bzz']); - store.dispatch({ type: '[MAIN]:PROTOCOL:REGISTER', payload: { protocol: 'bzz' } }); - protocol.registerHttpProtocol('bzz', (request, callback) => { if (store.getState().settings.swarmState !== SwarmState.Enabled) { const error = global.i18n.t('mist.errors.swarm.notEnabled'); From 0840b5f2b992d1a7d47b4a7dbc35662dcb006bb2 Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Sat, 16 Dec 2017 12:40:17 -0800 Subject: [PATCH 068/150] Better protocol handling of swarm in `Enabling` state --- main.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/main.js b/main.js index 7c95d1b42..6d93f1acb 100644 --- a/main.js +++ b/main.js @@ -17,6 +17,7 @@ import configureReduxStore from './modules/core/store'; import { quitApp } from './modules/core/ui/actions'; import { setLanguageOnMain, toggleSwarm } from './modules/core/settings/actions'; import { SwarmState } from './modules/core/settings/reducer'; +import swarmNode from './modules/swarmNode.js'; Q.config({ cancellation: true, @@ -175,16 +176,23 @@ async function onReady() { function enableSwarmProtocol() { protocol.registerHttpProtocol('bzz', (request, callback) => { - if (store.getState().settings.swarmState !== SwarmState.Enabled) { + if ([SwarmState.Disabling, SwarmState.Disabled].includes(store.getState().settings.swarmState)) { const error = global.i18n.t('mist.errors.swarm.notEnabled'); - dialog.showErrorBox('Error', error); + dialog.showErrorBox('Note', error); callback({ error }); store.dispatch({ type: '[MAIN]:PROTOCOL:ERROR', payload: { protocol: 'bzz', error } }); return; } const redirectPath = `${Settings.swarmURL}/${request.url.replace('bzz:/', 'bzz://')}`; - callback({ method: request.method, referrer: request.referrer, url: redirectPath }); + + if (store.getState().settings.swarmState === SwarmState.Enabling) { + swarmNode.on('started', () => { + callback({ method: request.method, referrer: request.referrer, url: redirectPath }); + }); + } else { // Swarm enabled + callback({ method: request.method, referrer: request.referrer, url: redirectPath }); + } store.dispatch({ type: '[MAIN]:PROTOCOL:REQUEST', payload: { protocol: 'bzz' } }); From 1a148444928f874d5317d8b04275bd0e6b9fa97c Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Sat, 16 Dec 2017 12:42:31 -0800 Subject: [PATCH 069/150] Modify swarmNode into singleton --- modules/swarmNode.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/swarmNode.js b/modules/swarmNode.js index b0efb358c..50db318f0 100644 --- a/modules/swarmNode.js +++ b/modules/swarmNode.js @@ -7,13 +7,21 @@ const fs = require('fs'); const os = require('os'); const clientBinaries = require('./../clientBinaries.json'); +let instance = null; + class SwarmNode extends EventEmitter { constructor() { super(); + if (!instance) { + instance = this; + } + this._swarm = null; this._stop = null; this._accountPassword = 'SAP'; + + return instance; } getKeyPath() { From c0cf2b6c0958665fe1c832febf9ac36ce5fdfc0e Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Sat, 16 Dec 2017 12:59:44 -0800 Subject: [PATCH 070/150] Modify settings into singleton --- main.js | 3 +-- modules/settings.js | 54 +++++++++++++++++++++++++++------------------ 2 files changed, 34 insertions(+), 23 deletions(-) diff --git a/main.js b/main.js index 6d93f1acb..6e0dc8a4b 100644 --- a/main.js +++ b/main.js @@ -8,11 +8,11 @@ const Sockets = require('./modules/socketManager'); const Windows = require('./modules/windows'); const ClientBinaryManager = require('./modules/clientBinaryManager'); const UpdateChecker = require('./modules/updateChecker'); -const Settings = require('./modules/settings'); const Q = require('bluebird'); const windowStateKeeper = require('electron-window-state'); const log = logger.create('main'); +import Settings from './modules/settings'; import configureReduxStore from './modules/core/store'; import { quitApp } from './modules/core/ui/actions'; import { setLanguageOnMain, toggleSwarm } from './modules/core/settings/actions'; @@ -23,7 +23,6 @@ Q.config({ cancellation: true, }); - global.store = configureReduxStore(); Settings.init(); diff --git a/modules/settings.js b/modules/settings.js index c4e5b3cb1..fd6e0315c 100644 --- a/modules/settings.js +++ b/modules/settings.js @@ -1,24 +1,27 @@ const { app } = require('electron'); const path = require('path'); const fs = require('fs'); -const logger = require('./utils/logger'); const packageJson = require('../package.json'); const _ = require('./utils/underscore'); const lodash = require('lodash'); import { syncBuildConfig, syncFlags, setSwarmEnableOnStart } from './core/settings/actions'; +import logger from './utils/logger'; -// try loading in config file +const settingsLog = logger.create('Settings'); + +// Load config file const defaultConfig = { mode: 'mist', production: false, }; + try { _.extend(defaultConfig, require('../config.json')); -} catch (err) { +} catch (error) { + settingsLog.error(error); } - const argv = require('yargs') .usage('Usage: $0 [Mist options] [Node options]') .option({ @@ -170,19 +173,28 @@ if (argv.nodeOptions && argv.nodeOptions.syncmode) { argv.push('--syncmode', argv.nodeOptions.syncmode); } +let instance = null; + class Settings { + constructor() { + if (!instance) { + instance = this; + } + + return instance; + } + init() { const logLevel = {logLevel: argv.loglevel}; const logFolder = {logFolder: path.join(this.userDataPath, 'logs')}; const loggerOptions = Object.assign(argv, logLevel, logFolder); logger.setup(loggerOptions); - this._log = logger.create('Settings'); store.dispatch(syncFlags(argv)); // If -v flag provided, log the Mist version and exit if (argv.version) { - this._log.info(`Mist v${this.appVersion}`); + settingsLog.info(`Mist v${this.appVersion}`); process.exit(0); } @@ -193,14 +205,14 @@ class Settings { } if (this.inAutoTestMode) { - this._log.info('AUTOMATED TESTING'); + settingsLog.info('AUTOMATED TESTING'); store.dispatch({ type: '[MAIN]:TEST_MODE:SET' }); } - this._log.info(`Running in production mode: ${this.inProductionMode}`); + settingsLog.info(`Running in production mode: ${this.inProductionMode}`); if (this.rpcMode === 'http') { - this._log.warn('Connecting to a node via HTTP instead of ipcMain. This is less secure!!!!'.toUpperCase()); + settingsLog.warn('Connecting to a node via HTTP instead of ipcMain. This is less secure!!!!'.toUpperCase()); } store.dispatch(syncBuildConfig('appVersion', packageJson.version)); @@ -274,7 +286,7 @@ class Settings { if (argv.rpc && argv.rpc.indexOf('http') === 0) return 'http'; if (argv.rpc && argv.rpc.indexOf('ws:') === 0) { - this._log.warn('Websockets are not yet supported by Mist, using default IPC connection'); + settingsLog.warn('Websockets are not yet supported by Mist, using default IPC connection'); argv.rpc = null; return 'ipc'; } else @@ -309,14 +321,14 @@ class Settings { if (process.platform === 'darwin') { ipcPath += '/Library/Ethereum/geth.ipc'; } else if (process.platform === 'freebsd' || - process.platform === 'linux' || - process.platform === 'sunos') { + process.platform === 'linux' || + process.platform === 'sunos') { ipcPath += '/.ethereum/geth.ipc'; } else if (process.platform === 'win32') { ipcPath = '\\\\.\\pipe\\geth.ipc'; } - this._log.debug(`IPC path: ${ipcPath}`); + settingsLog.debug(`IPC path: ${ipcPath}`); return ipcPath; } @@ -395,8 +407,8 @@ class Settings { lodash.set(obj, key, value); global.config.update(obj); - this._log.debug(`Settings: saveConfig('${key}', '${value}')`); - this._log.trace(global.config.data); + settingsLog.debug(`Settings: saveConfig('${key}', '${value}')`); + settingsLog.trace(global.config.data); } } @@ -408,7 +420,7 @@ class Settings { return this.loadConfig(key); } - this._log.trace(`Settings: loadConfig('${key}') = '${lodash.get(obj, key)}'`); + settingsLog.trace(`Settings: loadConfig('${key}') = '${lodash.get(obj, key)}'`); return lodash.get(obj, key); } @@ -416,7 +428,7 @@ class Settings { loadUserData(path2) { const fullPath = this.constructUserDataPath(path2); - this._log.trace('Load user data', fullPath); + settingsLog.trace('Load user data', fullPath); // check if the file exists try { @@ -428,10 +440,10 @@ class Settings { // try to read it try { const data = fs.readFileSync(fullPath, { encoding: 'utf8' }); - this._log.debug(`Reading "${data}" from ${fullPath}`); + settingsLog.debug(`Reading "${data}" from ${fullPath}`); return data; } catch (err) { - this._log.warn(`File not readable: ${fullPath}`, err); + settingsLog.warn(`File not readable: ${fullPath}`, err); } return null; @@ -444,10 +456,10 @@ class Settings { const fullPath = this.constructUserDataPath(path2); try { - this._log.debug(`Saving "${data}" to ${fullPath}`); + settingsLog.debug(`Saving "${data}" to ${fullPath}`); fs.writeFileSync(fullPath, data, { encoding: 'utf8' }); } catch (err) { - this._log.warn(`Unable to write to ${fullPath}`, err); + settingsLog.warn(`Unable to write to ${fullPath}`, err); } } From 774c85d7fc29db403a35f7629941954b27dc0bd9 Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Sat, 16 Dec 2017 13:00:12 -0800 Subject: [PATCH 071/150] `require` to `import` --- modules/core/settings/actions.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/core/settings/actions.js b/modules/core/settings/actions.js index 9cf5fa0f4..253f2e9ef 100644 --- a/modules/core/settings/actions.js +++ b/modules/core/settings/actions.js @@ -1,9 +1,9 @@ -const logger = require('../../utils/logger'); -const swarmLog = logger.create('swarm'); - +import logger from '../../utils/logger'; import Settings from '../../settings'; -import swarmNode from '../../swarmNode.js'; -import { SwarmState } from './reducer.js'; +import swarmNode from '../../swarmNode'; +import { SwarmState } from './reducer'; + +const swarmLog = logger.create('swarm'); export function syncFlags(argv) { return { type: '[MAIN]:CLI_FLAGS:SYNC', payload: { cliFlags: argv } }; From 257819fa175679336353d0a14c1cb1cdea79739b Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Sat, 16 Dec 2017 13:12:44 -0800 Subject: [PATCH 072/150] Re-order/organize settings.js --- modules/settings.js | 332 ++++++++++++++++++++++---------------------- 1 file changed, 168 insertions(+), 164 deletions(-) diff --git a/modules/settings.js b/modules/settings.js index fd6e0315c..6caa9945a 100644 --- a/modules/settings.js +++ b/modules/settings.js @@ -10,169 +10,6 @@ import logger from './utils/logger'; const settingsLog = logger.create('Settings'); -// Load config file -const defaultConfig = { - mode: 'mist', - production: false, -}; - -try { - _.extend(defaultConfig, require('../config.json')); -} catch (error) { - settingsLog.error(error); -} - -const argv = require('yargs') - .usage('Usage: $0 [Mist options] [Node options]') - .option({ - mode: { - alias: 'm', - demand: false, - default: defaultConfig.mode, - describe: 'App UI mode: wallet, mist.', - requiresArg: true, - nargs: 1, - type: 'string', - group: 'Mist options:', - }, - node: { - demand: false, - default: null, - describe: 'Node to use: geth, eth', - requiresArg: true, - nargs: 1, - type: 'string', - group: 'Mist options:', - }, - network: { - demand: false, - default: null, - describe: 'Network to connect to: main, test', - requiresArg: true, - nargs: 1, - type: 'string', - group: 'Mist options:', - }, - rpc: { - demand: false, - describe: 'Path to node IPC socket file OR HTTP RPC hostport (if IPC socket file then --node-ipcpath will be set with this value).', - requiresArg: true, - nargs: 1, - type: 'string', - group: 'Mist options:', - }, - swarm: { - describe: 'Enable Swarm on start.', - requiresArg: false, - nargs: 0, - type: 'boolean', - group: 'Mist options:', - }, - swarmurl: { - demand: false, - default: 'http://localhost:8500', - describe: 'URL serving the Swarm HTTP API. If null, Mist will open a local node.', - requiresArg: true, - nargs: 1, - type: 'string', - group: 'Mist options:', - }, - gethpath: { - demand: false, - describe: 'Path to Geth executable to use instead of default.', - requiresArg: true, - nargs: 1, - type: 'string', - group: 'Mist options:', - }, - ethpath: { - demand: false, - describe: 'Path to Eth executable to use instead of default.', - requiresArg: true, - nargs: 1, - type: 'string', - group: 'Mist options:', - }, - 'ignore-gpu-blacklist': { - demand: false, - describe: 'Ignores GPU blacklist (needed for some Linux installations).', - requiresArg: false, - nargs: 0, - type: 'boolean', - group: 'Mist options:', - }, - 'reset-tabs': { - demand: false, - describe: 'Reset Mist tabs to their default settings.', - requiresArg: false, - nargs: 0, - type: 'boolean', - group: 'Mist options:', - }, - loglevel: { - demand: false, - default: 'info', - describe: 'Minimum logging threshold: info, debug, error, trace (shows all logs, including possible passwords over IPC!).', - requiresArg: true, - nargs: 1, - type: 'string', - group: 'Mist options:', - }, - syncmode: { - demand: false, - requiresArg: true, - describe: 'Geth synchronization mode: [fast|light|full]', - nargs: 1, - type: 'string', - group: 'Mist options:', - }, - version: { - alias: 'v', - demand: false, - requiresArg: false, - nargs: 0, - describe: 'Display Mist version.', - group: 'Mist options:', - type: 'boolean', - }, - skiptimesynccheck: { - demand: false, - requiresArg: false, - nargs: 0, - describe: 'Disable checks for the presence of automatic time sync on your OS.', - group: 'Mist options:', - type: 'boolean', - }, - '': { - describe: 'To pass options to the underlying node (e.g. Geth) use the --node- prefix, e.g. --node-datadir', - group: 'Node options:', - }, - }) - .help('h') - .alias('h', 'help') - .parse(process.argv.slice(1)); - -argv.nodeOptions = []; - -for (const optIdx in argv) { - if (optIdx.indexOf('node-') === 0) { - argv.nodeOptions.push(`--${optIdx.substr(5)}`); - - if (argv[optIdx] !== true) { - argv.nodeOptions.push(argv[optIdx]); - } - } -} - -// some options are shared -if (argv.ipcpath) { - argv.nodeOptions.push('--ipcpath', argv.ipcpath); -} - -if (argv.nodeOptions && argv.nodeOptions.syncmode) { - argv.push('--syncmode', argv.nodeOptions.syncmode); -} - let instance = null; class Settings { @@ -467,7 +304,174 @@ class Settings { constructUserDataPath(filePath) { return path.join(this.userDataPath, filePath); } - } module.exports = new Settings(); + +/* ========================== +Command line argument parsing +============================= */ + +// Load config +const defaultConfig = { + mode: 'mist', + production: false, +}; + +try { + _.extend(defaultConfig, require('../config.json')); +} catch (error) { + settingsLog.error(error); +} + +const argv = require('yargs') + .usage('Usage: $0 [Mist options] [Node options]') + .option({ + mode: { + alias: 'm', + demand: false, + default: defaultConfig.mode, + describe: 'App UI mode: wallet, mist.', + requiresArg: true, + nargs: 1, + type: 'string', + group: 'Mist options:', + }, + node: { + demand: false, + default: null, + describe: 'Node to use: geth, eth', + requiresArg: true, + nargs: 1, + type: 'string', + group: 'Mist options:', + }, + network: { + demand: false, + default: null, + describe: 'Network to connect to: main, test', + requiresArg: true, + nargs: 1, + type: 'string', + group: 'Mist options:', + }, + rpc: { + demand: false, + describe: 'Path to node IPC socket file OR HTTP RPC hostport (if IPC socket file then --node-ipcpath will be set with this value).', + requiresArg: true, + nargs: 1, + type: 'string', + group: 'Mist options:', + }, + swarm: { + describe: 'Enable Swarm on start.', + requiresArg: false, + nargs: 0, + type: 'boolean', + group: 'Mist options:', + }, + swarmurl: { + demand: false, + default: 'http://localhost:8500', + describe: 'URL serving the Swarm HTTP API. If null, Mist will open a local node.', + requiresArg: true, + nargs: 1, + type: 'string', + group: 'Mist options:', + }, + gethpath: { + demand: false, + describe: 'Path to Geth executable to use instead of default.', + requiresArg: true, + nargs: 1, + type: 'string', + group: 'Mist options:', + }, + ethpath: { + demand: false, + describe: 'Path to Eth executable to use instead of default.', + requiresArg: true, + nargs: 1, + type: 'string', + group: 'Mist options:', + }, + 'ignore-gpu-blacklist': { + demand: false, + describe: 'Ignores GPU blacklist (needed for some Linux installations).', + requiresArg: false, + nargs: 0, + type: 'boolean', + group: 'Mist options:', + }, + 'reset-tabs': { + demand: false, + describe: 'Reset Mist tabs to their default settings.', + requiresArg: false, + nargs: 0, + type: 'boolean', + group: 'Mist options:', + }, + loglevel: { + demand: false, + default: 'info', + describe: 'Minimum logging threshold: info, debug, error, trace (shows all logs, including possible passwords over IPC!).', + requiresArg: true, + nargs: 1, + type: 'string', + group: 'Mist options:', + }, + syncmode: { + demand: false, + requiresArg: true, + describe: 'Geth synchronization mode: [fast|light|full]', + nargs: 1, + type: 'string', + group: 'Mist options:', + }, + version: { + alias: 'v', + demand: false, + requiresArg: false, + nargs: 0, + describe: 'Display Mist version.', + group: 'Mist options:', + type: 'boolean', + }, + skiptimesynccheck: { + demand: false, + requiresArg: false, + nargs: 0, + describe: 'Disable checks for the presence of automatic time sync on your OS.', + group: 'Mist options:', + type: 'boolean', + }, + '': { + describe: 'To pass options to the underlying node (e.g. Geth) use the --node- prefix, e.g. --node-datadir', + group: 'Node options:', + }, + }) + .help('h') + .alias('h', 'help') + .parse(process.argv.slice(1)); + +argv.nodeOptions = []; + +for (const optIdx in argv) { + if (optIdx.indexOf('node-') === 0) { + argv.nodeOptions.push(`--${optIdx.substr(5)}`); + + if (argv[optIdx] !== true) { + argv.nodeOptions.push(argv[optIdx]); + } + } +} + +// some options are shared +if (argv.ipcpath) { + argv.nodeOptions.push('--ipcpath', argv.ipcpath); +} + +if (argv.nodeOptions && argv.nodeOptions.syncmode) { + argv.push('--syncmode', argv.nodeOptions.syncmode); +} + From 48c3b9e257fef81182063525c8fbf4c69671ed62 Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Sat, 16 Dec 2017 13:53:23 -0800 Subject: [PATCH 073/150] Logging fixes + updates --- .github/ISSUE_TEMPLATE.md | 4 +- modules/ethereumNode.js | 83 +++++++++++++++++++-------------------- 2 files changed, 43 insertions(+), 44 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 47f58045c..d50f09820 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -31,7 +31,7 @@ When creating this issue, if possible add the following to your report: - Screenshots - Check the console, of Mist (`CTRL/CMD + ALT + i`) and take a screenshot - Log files - - go to `menu -> accounts -> backup -> application data` - - zip and upload `node.log` and all other `node.log.X` files + - Go to the menu `Develop -> Show log files` + - Zip and upload `all.log` and any other appropriate `category/*.log` files --> diff --git a/modules/ethereumNode.js b/modules/ethereumNode.js index f3f8b49c0..5fc9a41f6 100644 --- a/modules/ethereumNode.js +++ b/modules/ethereumNode.js @@ -5,12 +5,15 @@ const spawn = require('child_process').spawn; const { dialog } = require('electron'); const Windows = require('./windows.js'); const Settings = require('./settings'); -const log = require('./utils/logger').create('EthereumNode'); const logRotate = require('log-rotate'); +const path = require('path'); const EventEmitter = require('events').EventEmitter; const Sockets = require('./socketManager'); const ClientBinaryManager = require('./clientBinaryManager'); +import logger from './utils/logger'; +const ethereumNodeLog = logger.create('EthereumNode'); + const DEFAULT_NODE_TYPE = 'geth'; const DEFAULT_NETWORK = 'main'; const DEFAULT_SYNCMODE = 'fast'; @@ -149,16 +152,16 @@ class EthereumNode extends EventEmitter { this.emit('runningNodeFound'); }) .catch(() => { - log.warn('Failed to connect to node. Maybe it\'s not running so let\'s start our own...'); + ethereumNodeLog.warn('Failed to connect to node. Maybe it\'s not running so let\'s start our own...'); - log.info(`Node type: ${this.defaultNodeType}`); - log.info(`Network: ${this.defaultNetwork}`); - log.info(`SyncMode: ${this.defaultSyncMode}`); + ethereumNodeLog.info(`Node type: ${this.defaultNodeType}`); + ethereumNodeLog.info(`Network: ${this.defaultNetwork}`); + ethereumNodeLog.info(`SyncMode: ${this.defaultSyncMode}`); // if not, start node yourself return this._start(this.defaultNodeType, this.defaultNetwork, this.defaultSyncMode) .catch((err) => { - log.error('Failed to start node', err); + ethereumNodeLog.error('Failed to start node', err); throw err; }); }); @@ -171,7 +174,7 @@ class EthereumNode extends EventEmitter { throw new Error('Cannot restart node since it was started externally'); } - log.info('Restart node', newType, newNetwork); + ethereumNodeLog.info('Restart node', newType, newNetwork); return this.stop() .then(() => Windows.loading.show()) @@ -182,7 +185,7 @@ class EthereumNode extends EventEmitter { )) .then(() => Windows.loading.hide()) .catch((err) => { - log.error('Error restarting node', err); + ethereumNodeLog.error('Error restarting node', err); throw err; }); }); @@ -203,7 +206,7 @@ class EthereumNode extends EventEmitter { this.state = STATES.STOPPING; - log.info(`Stopping existing node: ${this._type} ${this._network}`); + ethereumNodeLog.info(`Stopping existing node: ${this._type} ${this._network}`); this._node.stderr.removeAllListeners('data'); this._node.stdout.removeAllListeners('data'); @@ -233,14 +236,10 @@ class EthereumNode extends EventEmitter { this._stopPromise = null; }); } - log.debug('Disconnection already in progress, returning Promise.'); + ethereumNodeLog.debug('Disconnection already in progress, returning Promise.'); return this._stopPromise; } - getLog() { - return Settings.loadUserData('node.log'); - } - /** * Send Web3 command to socket. * @param {String} method Method name @@ -262,19 +261,19 @@ class EthereumNode extends EventEmitter { * @return {Promise} */ _start(nodeType, network, syncMode) { - log.info(`Start node: ${nodeType} ${network} ${syncMode}`); + ethereumNodeLog.info(`Start node: ${nodeType} ${network} ${syncMode}`); const isTestNet = (network === 'test'); if (isTestNet) { - log.debug('Node will connect to the test network'); + ethereumNodeLog.debug('Node will connect to the test network'); } return this.stop() .then(() => { return this.__startNode(nodeType, network, syncMode) .catch((err) => { - log.error('Failed to start node', err); + ethereumNodeLog.error('Failed to start node', err); this._showNodeErrorDialog(nodeType, network); @@ -282,7 +281,7 @@ class EthereumNode extends EventEmitter { }); }) .then((proc) => { - log.info(`Started node successfully: ${nodeType} ${network} ${syncMode}`); + ethereumNodeLog.info(`Started node successfully: ${nodeType} ${network} ${syncMode}`); this._node = proc; this.state = STATES.STARTED; @@ -298,7 +297,7 @@ class EthereumNode extends EventEmitter { this.state = STATES.CONNECTED; }) .catch((err) => { - log.error('Failed to connect to node', err); + ethereumNodeLog.error('Failed to connect to node', err); if (err.toString().indexOf('timeout') >= 0) { this.emit('nodeConnectionTimeout'); @@ -344,7 +343,7 @@ class EthereumNode extends EventEmitter { throw new Error(`Node "${nodeType}" binPath is not available.`); } - log.info(`Start node using ${binPath}`); + ethereumNodeLog.info(`Start node using ${binPath}`); return new Q((resolve, reject) => { this.__startProcess(nodeType, network, binPath, syncMode) @@ -363,12 +362,12 @@ class EthereumNode extends EventEmitter { } return new Q((resolve, reject) => { - log.trace('Rotate log file'); + ethereumNodeLog.trace('Rotate log file'); // rotate the log file - logRotate(Settings.constructUserDataPath('node.log'), { count: 5 }, (err) => { + logRotate(path.join(Settings.userDataPath, 'logs', 'all.log'), { count: 5 }, (err) => { if (err) { - log.error('Log rotation problems', err); + ethereumNodeLog.error('Log rotation problems', err); return reject(err); } @@ -419,12 +418,12 @@ class EthereumNode extends EventEmitter { const nodeOptions = Settings.nodeOptions; if (nodeOptions && nodeOptions.length) { - log.debug('Custom node options', nodeOptions); + ethereumNodeLog.debug('Custom node options', nodeOptions); args = args.concat(nodeOptions); } - log.trace('Spawn', binPath, args); + ethereumNodeLog.trace('Spawn', binPath, args); const proc = spawn(binPath, args); @@ -433,7 +432,7 @@ class EthereumNode extends EventEmitter { if (STATES.STARTING === this.state) { this.state = STATES.ERROR; - log.info('Node startup error'); + ethereumNodeLog.info('Node startup error'); // TODO: detect this properly // this.emit('nodeBinaryNotFound'); @@ -444,12 +443,12 @@ class EthereumNode extends EventEmitter { // we need to read the buff to prevent node from not working proc.stderr.pipe( - fs.createWriteStream(Settings.constructUserDataPath('node.log'), { flags: 'a' }) + fs.createWriteStream(path.join(Settings.userDataPath, 'logs', 'all.log'), { flags: 'a' }) ); // when proc outputs data proc.stdout.on('data', (data) => { - log.trace('Got stdout data'); + ethereumNodeLog.trace('Got stdout data'); this.emit('data', data); @@ -465,7 +464,7 @@ class EthereumNode extends EventEmitter { error.tag = UNABLE_TO_BIND_PORT_ERROR; } - log.debug(error); + ethereumNodeLog.debug(error); return reject(error); } @@ -475,7 +474,7 @@ class EthereumNode extends EventEmitter { // when proc outputs data in stderr proc.stderr.on('data', (data) => { - log.trace('Got stderr data'); + ethereumNodeLog.trace('Got stderr data'); this.emit('data', data); }); @@ -492,7 +491,7 @@ class EthereumNode extends EventEmitter { */ setTimeout(() => { if (STATES.STARTING === this.state) { - log.info(`${NODE_START_WAIT_MS}ms elapsed, assuming node started up successfully`); + ethereumNodeLog.info(`${NODE_START_WAIT_MS}ms elapsed, assuming node started up successfully`); resolve(proc); } @@ -504,25 +503,25 @@ class EthereumNode extends EventEmitter { _showNodeErrorDialog(nodeType, network) { - let nodelog = this.getLog(); + let log = path.join(Settings.userDataPath, 'logs', 'all.log'); - if (nodelog) { - nodelog = `...${nodelog.slice(-1000)}`; + if (log) { + log = `...${log.slice(-1000)}`; } else { - nodelog = global.i18n.t('mist.errors.nodeStartup'); + log = global.i18n.t('mist.errors.nodeStartup'); } // add node type - nodelog = `Node type: ${nodeType}\n` + + log = `Node type: ${nodeType}\n` + `Network: ${network}\n` + `Platform: ${process.platform} (Architecture ${process.arch})\n\n${ - nodelog}`; + log}`; dialog.showMessageBox({ type: 'error', buttons: ['OK'], message: global.i18n.t('mist.errors.nodeConnect'), - detail: nodelog, + detail: log, }, () => {}); } @@ -531,7 +530,7 @@ class EthereumNode extends EventEmitter { const cleanData = data.toString().replace(/[\r\n]+/, ''); const nodeType = (this.type || 'node').toUpperCase(); - log.trace(`${nodeType}: ${cleanData}`); + ethereumNodeLog.trace(`${nodeType}: ${cleanData}`); if (!/^-*$/.test(cleanData) && !_.isEmpty(cleanData)) { this.emit('nodeLog', cleanData); @@ -540,14 +539,14 @@ class EthereumNode extends EventEmitter { _loadDefaults() { - log.trace('Load defaults'); + ethereumNodeLog.trace('Load defaults'); this.defaultNodeType = Settings.nodeType || Settings.loadUserData('node') || DEFAULT_NODE_TYPE; this.defaultNetwork = Settings.network || Settings.loadUserData('network') || DEFAULT_NETWORK; this.defaultSyncMode = Settings.syncmode || Settings.loadUserData('syncmode') || DEFAULT_SYNCMODE; - log.info(Settings.syncmode, Settings.loadUserData('syncmode'), DEFAULT_SYNCMODE); - log.info(`Defaults loaded: ${this.defaultNodeType} ${this.defaultNetwork} ${this.defaultSyncMode}`); + ethereumNodeLog.info(Settings.syncmode, Settings.loadUserData('syncmode'), DEFAULT_SYNCMODE); + ethereumNodeLog.info(`Defaults loaded: ${this.defaultNodeType} ${this.defaultNetwork} ${this.defaultSyncMode}`); } } From 67a531b447ded7e80e9e164e44d43d7227d15180 Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Sat, 16 Dec 2017 13:53:36 -0800 Subject: [PATCH 074/150] Whitespace --- main.js | 1 - modules/settings.js | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/main.js b/main.js index 6e0dc8a4b..e8af6d4f9 100644 --- a/main.js +++ b/main.js @@ -169,7 +169,6 @@ async function onReady() { checkTimeSync(); - splashWindow ? splashWindow.on('ready', kickStart) : kickStart(); } diff --git a/modules/settings.js b/modules/settings.js index 6caa9945a..2d7716c6b 100644 --- a/modules/settings.js +++ b/modules/settings.js @@ -473,5 +473,4 @@ if (argv.ipcpath) { if (argv.nodeOptions && argv.nodeOptions.syncmode) { argv.push('--syncmode', argv.nodeOptions.syncmode); -} - +} \ No newline at end of file From 41a15c7da80f5ef024bec3bb9a61a8912c30af15 Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Sat, 16 Dec 2017 13:55:50 -0800 Subject: [PATCH 075/150] Unneeded values --- modules/swarmNode.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/modules/swarmNode.js b/modules/swarmNode.js index 50db318f0..0d189b13d 100644 --- a/modules/swarmNode.js +++ b/modules/swarmNode.js @@ -17,10 +17,6 @@ class SwarmNode extends EventEmitter { instance = this; } - this._swarm = null; - this._stop = null; - this._accountPassword = 'SAP'; - return instance; } From 5a20980946636da2299a6d1cf871e18b816c2881 Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Sat, 16 Dec 2017 13:56:00 -0800 Subject: [PATCH 076/150] Re-order --- modules/swarmNode.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/swarmNode.js b/modules/swarmNode.js index 0d189b13d..994fa0b2d 100644 --- a/modules/swarmNode.js +++ b/modules/swarmNode.js @@ -1,12 +1,13 @@ const EventEmitter = require('events').EventEmitter; const Q = require('bluebird'); -const Settings = require('./settings.js'); -const Swarm = require('swarm-js'); const path = require('path'); const fs = require('fs'); const os = require('os'); const clientBinaries = require('./../clientBinaries.json'); +import Settings from './settings'; +import Swarm from 'swarm-js'; + let instance = null; class SwarmNode extends EventEmitter { From c434f5016fd9ecac3edc9513409127a58bac955c Mon Sep 17 00:00:00 2001 From: Ryan Ghods Date: Sat, 16 Dec 2017 14:31:32 -0800 Subject: [PATCH 077/150] Fix imports to require --- main.js | 2 +- modules/core/settings/actions.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/main.js b/main.js index e8af6d4f9..12e9322e4 100644 --- a/main.js +++ b/main.js @@ -11,8 +11,8 @@ const UpdateChecker = require('./modules/updateChecker'); const Q = require('bluebird'); const windowStateKeeper = require('electron-window-state'); const log = logger.create('main'); +const Settings = require('./modules/settings'); -import Settings from './modules/settings'; import configureReduxStore from './modules/core/store'; import { quitApp } from './modules/core/ui/actions'; import { setLanguageOnMain, toggleSwarm } from './modules/core/settings/actions'; diff --git a/modules/core/settings/actions.js b/modules/core/settings/actions.js index 253f2e9ef..2612e422b 100644 --- a/modules/core/settings/actions.js +++ b/modules/core/settings/actions.js @@ -1,5 +1,6 @@ +const Settings = require('../../settings'); + import logger from '../../utils/logger'; -import Settings from '../../settings'; import swarmNode from '../../swarmNode'; import { SwarmState } from './reducer'; From a161cf6e911997cea347d08d344545e750bb1fa6 Mon Sep 17 00:00:00 2001 From: Everton Fraga Date: Fri, 22 Dec 2017 21:06:35 -0200 Subject: [PATCH 078/150] Remove tab reload from onSyncing event --- interface/client/templates/elements/nodeInfo.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/interface/client/templates/elements/nodeInfo.js b/interface/client/templates/elements/nodeInfo.js index ab7467559..ceedbddef 100644 --- a/interface/client/templates/elements/nodeInfo.js +++ b/interface/client/templates/elements/nodeInfo.js @@ -73,9 +73,6 @@ Template['elements_nodeInfo'].onCreated(function(){ console.log('Restart app operation again'); TemplateVar.set(template, 'syncing', false); - - // re-gain app operation - mistInit(); } } }); From a1cc379008ddfadf204d539168244e7a07d7edaf Mon Sep 17 00:00:00 2001 From: Everton Fraga Date: Fri, 5 Jan 2018 20:24:24 -0200 Subject: [PATCH 079/150] Adding Probot/Move config file --- .github/move.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/move.yml diff --git a/.github/move.yml b/.github/move.yml new file mode 100644 index 000000000..854ef90ab --- /dev/null +++ b/.github/move.yml @@ -0,0 +1,17 @@ +# Configuration for move-issues - https://github.com/dessant/move-issues + +# Delete the command comment. Ignored when the comment also contains other content +deleteCommand: true + +# Close the source issue after moving +closeSourceIssue: true + +# Lock the source issue after moving +lockSourceIssue: false + +# Set custom aliases for targets +aliases: + wallet: ethereum/meteor-dapp-wallet + geth: ethereum/go-ethereum + parity: paritytech/parity + From 29b6b61d185fee8305ee5e24c303e348bbfeecf9 Mon Sep 17 00:00:00 2001 From: Everton Fraga Date: Tue, 9 Jan 2018 11:11:59 -0200 Subject: [PATCH 080/150] Updating OS-timesync package. --- package.json | 2 +- yarn.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 1a9b9e4e8..3b0f67bc8 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "minimongo-standalone": "^1.1.0-3", "numeral": "^2.0.6", "oboe": "^2.1.3", - "os-timesync": "^1.0.8", + "os-timesync": "^1.0.9", "redux": "^3.7.2", "redux-thunk": "^2.2.0", "remote-redux-devtools": "^0.5.12", diff --git a/yarn.lock b/yarn.lock index c2b5ed8ce..abc132ab0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4390,9 +4390,9 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" -os-timesync@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/os-timesync/-/os-timesync-1.0.8.tgz#390ae8832e20183ea3fc1b97ea90bcbc97c0178f" +os-timesync@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/os-timesync/-/os-timesync-1.0.9.tgz#5e7235f08d618658ae83793a8f7650a390073614" os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" From a125f88743053e936f20e621d135eab4144f0698 Mon Sep 17 00:00:00 2001 From: DongGu Kang Date: Thu, 11 Jan 2018 11:24:02 +0900 Subject: [PATCH 081/150] Update app.ko.i18n.json Replaced by the correct Korean word for the situation. --- interface/i18n/app.ko.i18n.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/interface/i18n/app.ko.i18n.json b/interface/i18n/app.ko.i18n.json index c9d56dd1c..d8e3d6754 100644 --- a/interface/i18n/app.ko.i18n.json +++ b/interface/i18n/app.ko.i18n.json @@ -1,7 +1,7 @@ { "app": { - "loading": "로딩 중...", - "offline": "연결실패, 오프라인입니까?", + "loading": "불러오는 중...", + "offline": "연결실패, 인터넷 연결을 확인하세요.", "logginIn": "로그인 중..." }, "error": { @@ -18,7 +18,7 @@ "back": "뒤로", "skip": "건너뛰기", "sending": "보내는 중...", - "create": "만들기", + "create": "생성", "tryToReconnect": "재연결 시도", "stayAnonymous": "Stay anonymous", "authorize": "권한 인증" @@ -33,4 +33,4 @@ "on": "위에", "per": "당" } -} \ No newline at end of file +} From 475175189108bdc8f3a73cc2eb3a387e7542a654 Mon Sep 17 00:00:00 2001 From: Everton Fraga Date: Fri, 19 Jan 2018 15:30:52 -0200 Subject: [PATCH 082/150] Bot configuration --- .github/config.yml | 3 +++ .github/triage.yml | 2 ++ 2 files changed, 5 insertions(+) create mode 100644 .github/config.yml create mode 100644 .github/triage.yml diff --git a/.github/config.yml b/.github/config.yml new file mode 100644 index 000000000..00f1c04a2 --- /dev/null +++ b/.github/config.yml @@ -0,0 +1,3 @@ +maintainers: + - evertonfraga + - mist-bot diff --git a/.github/triage.yml b/.github/triage.yml new file mode 100644 index 000000000..1012c9306 --- /dev/null +++ b/.github/triage.yml @@ -0,0 +1,2 @@ +initLabels: + - "Status: Triage" From 9e8a9c8e42b4b6d15e5873d563fc3a1f2f28033b Mon Sep 17 00:00:00 2001 From: Ev Date: Fri, 19 Jan 2018 15:33:24 -0200 Subject: [PATCH 083/150] Adding maintainers to the list --- .github/config.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/config.yml b/.github/config.yml index 00f1c04a2..eb4ce9702 100644 --- a/.github/config.yml +++ b/.github/config.yml @@ -1,3 +1,4 @@ maintainers: - evertonfraga - - mist-bot + - ryanio + - marcgarreau From 8d7213355b2996eec9372d77629dc6119ffd6d59 Mon Sep 17 00:00:00 2001 From: Alex Van de Sande Date: Fri, 19 Jan 2018 16:51:29 -0200 Subject: [PATCH 084/150] Update config.yml --- .github/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/config.yml b/.github/config.yml index eb4ce9702..5d97c7fce 100644 --- a/.github/config.yml +++ b/.github/config.yml @@ -2,3 +2,4 @@ maintainers: - evertonfraga - ryanio - marcgarreau + - alexvandesande From d0cd94df0bcddff6abe14a8c0b9328b350aa3d1f Mon Sep 17 00:00:00 2001 From: Ryo Shibayama Date: Sun, 7 Jan 2018 14:56:22 +0900 Subject: [PATCH 085/150] Improve ja translation --- interface/i18n/app.ja.i18n.json | 18 +-- interface/i18n/mist.ja.i18n.json | 220 +++++++++++++++---------------- 2 files changed, 119 insertions(+), 119 deletions(-) diff --git a/interface/i18n/app.ja.i18n.json b/interface/i18n/app.ja.i18n.json index b26cbd34e..cbe3222ac 100644 --- a/interface/i18n/app.ja.i18n.json +++ b/interface/i18n/app.ja.i18n.json @@ -20,17 +20,17 @@ "sending": "送信中...", "create": "作成中", "tryToReconnect": "再接続しています。", - "stayAnonymous": "Stay anonymous", - "authorize": "Authorize" + "stayAnonymous": "匿名を保つ", + "authorize": "認証" }, "commonWords": { - "you": "You", + "you": "あなた", "send": "送る", "or": "または", - "of": "of", - "with": "with", - "and": "and", - "on": "on", - "per": "per" + "of": "の", + "with": "と", + "and": "と", + "on": "の上に", + "per": "ごとに" } -} \ No newline at end of file +} diff --git a/interface/i18n/mist.ja.i18n.json b/interface/i18n/mist.ja.i18n.json index a443e016e..faa40cad3 100644 --- a/interface/i18n/mist.ja.i18n.json +++ b/interface/i18n/mist.ja.i18n.json @@ -5,17 +5,17 @@ "label": "__app__", "about": "__app__ について", "checkForUpdates": "アップデートの確認...", - "checkForNodeUpdates": "Check for Ethereum node updates...", + "checkForNodeUpdates": "Ethereum ノードのアップデートの確認...", "services": "サービス", "hide": "__app__ を隠す", "hideOthers": "ほかを隠す", "showAll": "すべてを表示", - "quit": " __app__ を中止する" + "quit": " __app__ を終了する" }, "edit": { "label": "編集", - "undo": "Undo", - "redo": "Redo", + "undo": "元に戻す", + "redo": "やり直す", "cut": "カット", "copy": "コピー", "paste": "ペースト", @@ -23,46 +23,46 @@ }, "view": { "label": "ビュー", - "fullscreen": "フルスクリーンをトグルする", - "default": "Default" + "fullscreen": "フルスクリーン", + "default": "デフォルト" }, "file": { "label": "アカウント", "importPresale": "アカウントを読み込む", "newAccount": "新規アカウント", - "backup": "バックアップ", + "backup": "バックアップを取る", "backupKeyStore": "アカウント", "backupMist": "アプリケーションデータ" }, "develop": { - "uploadToSwarm": "Swarmにアップロード", - "label": "Develop", - "devTools": "開発者用ツールをトグルする", + "uploadToSwarm": "Swarm にアップロード", + "label": "開発", + "devTools": "開発者用ツール", "devToolsMistUI": "Mist UI", "devToolsWalletUI": "Wallet UI", "devToolsWebview": "__webview__", - "runTests": "テストを走らせる", + "runTests": "テストを実行する", "logFiles": "ログファイルを表示する", "ethereumNode": "Ethereum ノード", "network": "ネットワーク", "mainNetwork": "メインネットワーク", "startMining": "⛏ マイニングを始める", "stopMining": "⛏ マイニングを中止する", - "externalNode": "using external node", - "openRemix": "Open Remix IDE", - "nodeMode": "Chain download", - "fullNode": "Store full blockchain", - "lightNode": "Use light Node (experimental!)" + "externalNode": "外部のノードを使用する", + "openRemix": "Remix IDE を開く", + "nodeMode": "チェーンダウンロード", + "fullNode": "フルノードを保存する", + "lightNode": "ライトノードを使う (実験的なものです!)" }, "window": { - "label": "Window", - "minimize": "最小化する", + "label": "ウィンドウ", + "minimize": "最小化", "close": "閉じる", - "toFront": "全てを全面に持ってくる" + "toFront": "前面に表示" }, "help": { "label": "ヘルプ", - "reportBug": "Report an issue on Github" + "reportBug": "バグレポート" } }, "errors": { @@ -72,16 +72,16 @@ "title": "コンピューターのクロックが未だ同期されていません.", "description": "Ethereum のネットワークと同期を成功させるためには、時間を同期させるサーバーとあなたのコンピューターを同期させる必要があります。", "win32": "システム設定を開き、「インターネットの時間設定」を開いてチェックボックスにチェックを入れて下さい。詳しくはこちらのガイドをご覧下さい: http://www.guidingtech.com/3119/windows-clock-sync/", - "linux": "時間を同期させるサーバーを使うためには、 \"ntp\" を \"apt-get install ntp\" をコマンドラインから入力してインストールする必要があります。", - "darwin": "時間を同期するためには、時間設定を開き \"時間と日にちを同期自動で同期\" にチェックすることが必要です." + "linux": "時間を同期させるサーバーを使うためには、 \"ntp\" を \"apt-get install ntp\" をコマンドラインから入力してインストールする必要があります。", + "darwin": "時間を同期するためには、時間設定を開き \"時間と日付を自動で同期\" にチェックすることが必要です." }, "nodeChecksumMismatch": { - "title": "Checksum mismatch in downloaded node!", - "description": "__algorithm__: __hash__\n\nPlease install the __type__ node version __version__ manually." + "title": "ダウンロードしたノードのチェックサムの照合に失敗しました!", + "description": "__algorithm__: __hash__\n\nノード __type__ バージョン __version__ を手動でインストールしてください." }, "legacyChain": { - "title": "Legacy chain detected", - "description": "Your node is currently on the unsupported Ethereum Classic chain. To use this chain use tools provided by the ethereum classic project at\nhttps://ethereumclassic.github.io.\n\nTo revert to the main ethereum chain follow the tutorial here:\nhttps://github.com/ethereum/mist/releases/0.8.2" + "title": "レガシーチェーンを検出しました", + "description": "あなたのノードは現在サポートされていません. Ethereum のクラシックプロジェクトによって提供されるこのチェーン使用ツールを使用するには \nhttps://ethereumclassic.github.io.\n\nメイン Ethereum チェーンに戻す方法のチュートリアルはこちら:\nhttps://github.com/ethereum/mist/releases/0.8.2" } }, "rightClick": { @@ -94,15 +94,15 @@ "blockReceived": "新しいブロックを受け取りました", "timeSinceBlock": "最後のブロックから", "peers": "ピアー", - "blockNumber": "Your latest block number", - "checkingWhichNetwork": "Checking network...", - "mainNetwork": "Main-net", - "testNetwork": "Test-net", - "privateNetwork": "Private-net", - "mainnetExplain": "You are on the main Ethereum global network", - "testnetExplain": "You are on the testnet, DO NOT SEND any real ether to these addresses", - "privatenetExplain": "You are on a private net, DO NOT SEND any real ether to these addresses", - "unknownnetExplain": "Unable to determine which network you are on" + "blockNumber": "ブロック番号", + "checkingWhichNetwork": "ネットワークをチェックしています...", + "mainNetwork": "メインネット", + "testNetwork": "テストネット", + "privateNetwork": "プライベートネット", + "mainnetExplain": "ここは Ethereum のメインネットです", + "testnetExplain": "ここはテストネットです。絶対に本物の ehter を送らないでください", + "privatenetExplain": "ここはプライベートっとです。絶対に本物の ether を送らないでください", + "unknownnetExplain": "どこのネットワークにいるか判定できませんでした" }, "sidebar": { "buttons": { @@ -112,37 +112,37 @@ "browserBar": { "buttons": { "noAccounts": "アカウントがセットされていません", - "connect": "Connect" + "connect": "接続" } }, "startScreen": { - "runningNodeFound": "走っているEthereum nodeを見つけました!", + "runningNodeFound": "起動している Ethereum ノードを見つけました!", "startingNode": "Ethereum ノードを開始しています。", - "startedNode": "アプリケーションを開始しています...", - "nodeConnectionTimeout": "Ethereum nodeをスタート出来ませんでした!
もしGethをインストールしているならば,このコマンドを使ってみてください:
geth --ipcpath __path__

もしくは問題を報告して下さい。 ", - "nodeBinaryNotFound": "Ethereum node バイナリーが見つかりませんでした。
手動でスタートして下さい。 ", - "nodeSyncing": "Ethereum node は同期中です...", - "nodeSyncInfo": "blockをダウンロードしています。 __displayBlock__ of __highestBlock__.", + "startedNode": "Ethereum ノードは開始されました...", + "nodeConnectionTimeout": "Ethereum ノードをスタート出来ませんでした!
もしGethをインストールしているならば,このコマンドを使ってみてください:
geth --ipcpath __path__

もしくは問題を報告して下さい。 ", + "nodeBinaryNotFound": "Ethereum ノードバイナリーが見つかりませんでした。
手動でスタートして下さい。 ", + "nodeSyncing": "Ethereum ノードは同期中です...", + "nodeSyncInfo": "ブロックをダウンロードしています。 __displayBlock__ / __highestBlock__.", "nodeSyncConnecting": "ピアーを探しています。...", "peerSearchTimeout": "ピアーの検索を中止しています", - "stoppingNode": "Stopping Ethereum node...", - "nodeStarting": "Ethereum node starting up...", - "nodeStarted": "Ethereum node started", - "nodeConnected": "Ethereum node connected", - "nodeStopping": "Ethereum node stopping...", - "nodeStopped": "Ethereum node stopped", - "nodeError": "Ethereum node connection error :'(", - "unableToBindPort": "Ethereum node cannot run. Is another instance already running?", - "nodeSyncInfoStates": "Downloading block __displayBlock__ of __highestBlock__,
Downloading chain structure __displayState__ of __displayKnownStates__", - "nodeSyncFoundPeers": "Connecting to __peers__ peers...", - "launchApp": "Launch Application", + "stoppingNode": "ノードを終了しています...", + "nodeStarting": "ノードを起動しています...", + "nodeStarted": "ノードは起動されました", + "nodeConnected": "ノードは接続されました", + "nodeStopping": "ノードを終了しています...", + "nodeStopped": "ノードは終了しました", + "nodeError": "ノード接続エラー :'(", + "unableToBindPort": "Ethereum ノードが実行できません。既に他のインスタンスが立ち上がっていませんか?", + "nodeSyncInfoStates": "ブロック __displayBlock__ / __highestBlock__ ダウンロード中,
チェーン構造 __displayState__ / __displayKnownStates__ ダウンロード中", + "nodeSyncFoundPeers": "ピアー __peers__ に接続中...", + "launchApp": "アプリケーションを起動", "clientBinaries": { - "scanning": "Checking for node update...", - "downloading": "Downloading new node...", - "loadConfig": "Loading client config...", - "filtering": "Filtering client binaries...", - "done": "Ethereum node up-to-date...", - "error": "Error running downloaded binary." + "scanning": "ノードのアップデートを確認中...", + "downloading": "新たなノードをダウンロード中...", + "loadConfig": "クライアントの設定を読み込み中...", + "filtering": "クライアントのバイナリをフィルタリング中...", + "done": "Ethereum ノードは最新です", + "error": "ダウンロードしたバイナリでエラーが発生." } }, "popupWindows": { @@ -152,8 +152,8 @@ "repeatPassword": "パスワードを繰り返し入力する", "creating": "アカウントを生成しています...", "errors": { - "passwordMismatch": "あなたのパスワードはあっていません", - "passwordTooShort": "Make a longer password" + "passwordMismatch": "パスワードが正しくありません", + "passwordTooShort": "もっと長いパスワードにしてください" } }, "unlockMasterPassword": { @@ -167,7 +167,7 @@ "sendTransactionConfirmation": { "title": { "sendTransaction": "トランザクションを送信する", - "contractExecution": "コントラクト実効する", + "contractExecution": "コントラクトを実行する", "createContract": "コントラクトを作成する" }, "contractExecutionInfo": "コントラクトの関数を実行しようとしています。これはバリューの移転を含むことがあります。", @@ -176,10 +176,10 @@ "unlocking": "承認しています...", "createContract": "コントラクトを作成する", "estimatedFee": "推定されるトランザクションフィーの消費", - "estimatedGasError": "データが実行できませんでした、そのため全てのgas が消費されます。", - "gasPrice": "ガスプライス", - "perMillionGas": "百万gas ごとのEther", - "gasLimit": "最大のフィーを提供", + "estimatedGasError": "データが実行できませんでした、そのため全ての GAS が消費されます。", + "gasPrice": "GAS 価格", + "perMillionGas": "100 万 GAS ごとの Ether", + "gasLimit": "GAS リミット", "data": "データ", "buttons": { "sendTransaction": "トランザクションを送信" @@ -187,46 +187,46 @@ "errors": { "connectionTimeout": "ノードにつなげませんでした、バックグラウンドで落ちていますか?", "wrongPassword": "パスワードが間違っています", - "multipleKeysMatchAddress": "Multiple keys match address, please remove duplicates from keystore (menu -> accounts -> backup -> accounts)", - "insufficientFundsForGas": "Insufficient funds in main account (etherbase) to pay for gas", - "sameAccount": "Can't send to itself" + "multipleKeysMatchAddress": "複数のキーが一致する場合は、キーストアから重複を削除してください (menu -> accounts -> backup -> accounts)", + "insufficientFundsForGas": "GAS を支払うためにメインアカウント(etherbase)に不十分な資金", + "sameAccount": "同一アカウントには送信できません" }, - "transactionThrow": "The contract won't allow this transaction to be executed", - "noEstimate": "We couldn't estimate the gas.", - "parameters": "Parameters", - "showRawBytecode": "show raw data", - "showDecodedParameters": "show decoded parameters", - "lookupData": "Try to decode data", - "lookupDataExplainer": "Look this up on the internet", - "overBlockGasLimit": "The gas required for this execution could exceed the block gas limit.", - "notEnoughGas": "Gas might not be enough to successfully finish this transaction.
Click here to increase the gas amount." + "transactionThrow": "契約により、この取引は実行されません", + "noEstimate": "GAS を見積もることができませんでした", + "parameters": "パラメータ", + "showRawBytecode": "生データを見る", + "showDecodedParameters": "デコードされたパラメータを見る", + "lookupData": "データをデコードする", + "lookupDataExplainer": "インターネットでこれを確認してください", + "overBlockGasLimit": "この実行に必要な GAS は、ブロック GAS の限界を超える可能性があります", + "notEnoughGas": "GAS が不足してトランザクションが正常に終了できませんでした.
ここをクリックして GAS を増やしてください." }, "onboarding": { "description": "Ethereum は分散型のプラットフォームで、ブロックチェーン上でアプリケーションを作成することが出来ます。価値を転送することが出来、永続的に稼働するセキュリティの高いソフトウェアを作ることが出来ます。", "goToTestnet": "テストネットワークを使用する (Rinkeby)", - "goToTestnetDescription": "サンドボックスのテストネットで、テクノロジーを自由に使う。本当のEtherを使うことなく.", + "goToTestnetDescription": "本物の Ether を使わず、サンドボックスのテストネットで、テクノロジーを自由に使う。", "gotoMainnet": "メインネットワークを使用する", - "gotoMainnetDescription": "コントラクトを作成して実行するためにいくらかのEtherが必要となるでしょう。心配することはありません、手に入れるためにこちらの方法があります。...", + "gotoMainnetDescription": "コントラクトを作成して実行するためにいくらかの Ether が必要となるでしょう。心配することはありません、手に入れるためにこちらの方法があります。...", "doYouHaveAWalletFile": "ウォレットファイルを持っていますか?", - "walletFileDescription": "

もし2014年のプリセールに参加していたら、 ethereum_wallet_backup.jsonという名前のファイルを持っているはずです。プリセールのあとにダウンロードしているか、もしくはEmailにて受け取っているはずです。

", + "walletFileDescription": "

もし2014年のプリセールに参加していたら、 ethereum_wallet_backup.jsonという名前のファイルを持っているはずです。プリセールのあとにダウンロードしているか、もしくは Email にて受け取っているはずです。

", "dropFilesHere": "プリセールファイルを削除する", "creating": "作成しています...", - "importing": "...", + "importing": "インポート中です...", "skip": "このステップをスキップする", "next": "次へ", "protectTitle": "アカウントを守る", - "protectDescription": "新しいアカウントのためにパスワードを作成する. 必ず強いキーにしてください!", + "protectDescription": "新しいアカウントのためにパスワードを作成する. 必ず強いパスワードにしてください!", "accountTitle": "もっとダウンロードする!", "accountTitleTestnet": "マイニングを行う!", - "etherDescription": "The ethereum network “Ether”. Ethereum networkで何かを行うためには必ず必要となります。", - "loadItDescription": "既にもし Bitcoinを持っているか, もしくは他の暗号通貨を持っている場合には簡単にShapeshiftから変換する事ができます。

私たちは 0.25 to 1 etherを変換することをおすすめします.", - "mineItDescription": "テストネットでは自分自身でマイニングを行うか、 Develop メニューから マイニングを始めるを選んで.
絶対にこのアドレスにはEtherを送らないでください ", + "etherDescription": "Ethereum ネットワークは“Ether と呼ばれるトークンに基づき成り立っています. Ethereumネットワークで何かを行うためには必ず必要となります。", + "loadItDescription": "既にもし Bitcoin を持っているか, もしくは他の暗号通貨を持っている場合には簡単に Shapeshift で変換する事ができます。

私たちは 0.25 から 1 ether の間で変換することをおすすめします.", + "mineItDescription": "テストネットでは自分自身でマイニングを行うか、 Develop メニューから マイニングを始めるを選んでください.
絶対にこのアドレスには Ether を送らないでください ", "you": "あなた", "etherbase": "メインアカウント(etherbase)", - "depositBitcoin": "Bitcoinをデポジットする", - "learnIt": "待っている間にEthereumWalletのことを学ぶ", + "depositBitcoin": "Bitcoin をデポジットする", + "learnIt": "待っている間に EthereumWallet のことを学ぶ", "downloadingBlocks": "ブロックをダウンロードする", - "tutorial1Description": "

全て終わり、後はダウンロードが終了するのは待つだけです。ここにいくつかのサジェスチョンがあります。:

あなたのお金を発行する

暗号通貨を一定の供給と共に作成することが出来、トークンを現実世界のアセットと関連付ける事ができます。

", + "tutorial1Description": "

全て終わり、後はダウンロードが終了するのは待つだけです。いくつか次の提案があります。:

あなたのお金を発行する

暗号通貨を一定の供給と共に作成することが出来、トークンを現実世界のアセットと関連付ける事ができます。

", "tutorial2Description": "

クラウドセールを作成する

第三者の介入無く共通のゴールを目指して一緒に進みましょう. 従来のファンディングシステムではとは異なり、ブロックチェーンを用いてダイレクトに資金を集める事ができます。

", "tutorial3Description": "

ブロックチェーン組織

どのようにして資金を使うのか、そして誰が決定するのかについて破ることが出来ないルールを持った自律的な組織を作成しましょう。そして、あなたの支援者に、どのように資金が使われるのかをアクティブに考え、行動してもらうことが出来ます。

", "buttons": { @@ -236,33 +236,33 @@ "learnReceipt": "このレシピを学ぶ" }, "errors": { - "nodeNotStartedYet": "ノードが開始して再度起動する迄もう少し待つ", - "unknownFile": "ファイルが認識できませんでした.", - "wrongPassword": "passwordが間違っています", + "nodeNotStartedYet": "ノードが起動するまでもう少し待ってください", + "unknownFile": "ファイルを認識できませんでした.", + "wrongPassword": "パスワードが間違っています", "importFailed": "ファイルが読み込めませんでした: __error__のエラーです" }, - "viaShapeshift": "Instant conversion via Shapeshift", - "syncMessage": "Block __displayBlock__ of __highestBlockString__", - "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)", - "startingSync": "Getting ready to sync.." + "viaShapeshift": "Shapeshift で簡単にコインを変換", + "syncMessage": "ブロック __displayBlock__ / __highestBlockString__", + "syncMessageWithStates": "ブロック __displayBlock__ / __highestBlockString__ (チェーン構造 __statesPercent__%)", + "startingSync": "動機を開始しています..." }, "updateAvailable": { - "newVersionAvailable": "New __name__ version available", - "version": "Version", - "downloadURL": "Download URL", - "checksum": "Checksum", - "downloadAndRestart": "Update and Restart", - "download": "Download new version", - "skipUpdate": "Skip Update", - "notNow": "Ask me later", - "checking": "Checking for updates to __name__...", - "noUpdateFound": "No update found. You are running the latest version of __name__." + "newVersionAvailable": "新しバージョン __name__ が利用可能です", + "version": "バージョン", + "downloadURL": "ダウンロード URL", + "checksum": "チェックサム", + "downloadAndRestart": "アップデートして再起動", + "download": "新しいバージョンをダウンロード", + "skipUpdate": "アップデートをスキップ", + "notNow": "今はしない", + "checking": "__name__ のバージョンにアップデートがないか確認しています...", + "noUpdateFound": "新しいバージョンは見つかりませんでした. あなたの __name__ は最新バージョンです." }, "connectAccount": { - "chooseAccountTitle": "Choose account", - "createAccount": "Create new account", - "pinToSidebar": "Pin app to the sidebar", - "connectAccountDescription": "You are sharing your identity with __dappName__. This allows the app to see any public information of your accounts, including balances connected to it." + "chooseAccountTitle": "アカウントを選ぶ", + "createAccount": "アカウントを新規作成", + "pinToSidebar": "サイドバーにピンする", + "connectAccountDescription": "__dappName__ であなたの身元を共有しています。これにより、アプリはアカウントに接続された残高を含むアカウントの公開情報をすべて表示することができます。" } } }, From de56a5f39ad64d40fbf05d14a9a12fc12e11e261 Mon Sep 17 00:00:00 2001 From: Ev Date: Mon, 22 Jan 2018 15:48:57 -0200 Subject: [PATCH 086/150] CodeTriage badge and contribution information --- README.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 700e7a891..c9bf47e20 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,10 @@ # Mist Browserbeta [![Github All Releases](https://img.shields.io/github/downloads/ethereum/mist/total.svg)]() -[![Join the chat at https://gitter.im/ethereum/mist](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/ethereum/mist?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Build Status develop branch](https://travis-ci.org/ethereum/mist.svg?branch=develop)](https://travis-ci.org/ethereum/mist) -[![Code Climate](https://codeclimate.com/github/ethereum/mist/badges/gpa.svg)](https://codeclimate.com/github/ethereum/mist) +[![Join the chat at https://gitter.im/ethereum/mist](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/ethereum/mist) +[![Code Triagers Badge](https://www.codetriage.com/ethereum/mist/badges/users.svg)](https://www.codetriage.com/ethereum/mist) + The Mist browser is the tool of choice to browse and use Ðapps. @@ -17,6 +18,12 @@ Please check the [Mist troubleshooting guide](https://github.com/ethereum/mist/w Or the [Gitter Channel](https://gitter.im/ethereum/mist), to connect with the community for instant help. +## How to contribute + +Contributions via Pull Requests are so welcome. You can see where to help looking for issues with the [Enhancement](https://github.com/ethereum/mist/issues?q=is%3Aopen+is%3Aissue+label%3A%22Type%3A+Enhancement%22) or [Bug](https://github.com/ethereum/mist/issues?q=is%3Aopen+is%3Aissue+label%3A%22Type%3A+Bug%22) labels. We can help guiding you towards the solution. + +You can also help by [responding to issues](https://github.com/ethereum/mist/issues?q=is%3Aissue+is%3Aopen+label%3A%22Status%3A+Triage%22). Sign up on [CodeTriage](https://www.codetriage.com/ethereum/mist) and it'll send you gentle notifications with a configurable frequency. It is a nice way to help while learning + ## Installation If you want to install the app from a pre-built version on the [release page](https://github.com/ethereum/mist/releases), From c615fa0988d448a2f88d0d56477a2d0663d86d55 Mon Sep 17 00:00:00 2001 From: Ev Date: Mon, 22 Jan 2018 15:52:46 -0200 Subject: [PATCH 087/150] Help and troubleshooting section update --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c9bf47e20..3284a8ca8 100644 --- a/README.md +++ b/README.md @@ -14,9 +14,12 @@ Please note that this repository is the Electron host for the Meteor based walle ## Help and troubleshooting -Please check the [Mist troubleshooting guide](https://github.com/ethereum/mist/wiki). +In order to get help regarding Mist or Ethereum Wallet, please follow: -Or the [Gitter Channel](https://gitter.im/ethereum/mist), to connect with the community for instant help. +1. Please check the [Mist troubleshooting guide](https://github.com/ethereum/mist/wiki). +1. Go to the [Gitter Channel](https://gitter.im/ethereum/mist) to connect with the community for instant help. +1. Search for [similar issues](https://github.com/ethereum/mist/issues?q=is%3Aopen+is%3Aissue+label%3A%22Type%3A+Canonical%22) and potential help. +1. Or create a [new issue](https://github.com/ethereum/mist/issues). ## How to contribute From 39d1736a242a90b019e7db59e8a3f10e90d5efbe Mon Sep 17 00:00:00 2001 From: Ev Date: Mon, 22 Jan 2018 15:54:48 -0200 Subject: [PATCH 088/150] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3284a8ca8..663e712dc 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ In order to get help regarding Mist or Ethereum Wallet, please follow: Contributions via Pull Requests are so welcome. You can see where to help looking for issues with the [Enhancement](https://github.com/ethereum/mist/issues?q=is%3Aopen+is%3Aissue+label%3A%22Type%3A+Enhancement%22) or [Bug](https://github.com/ethereum/mist/issues?q=is%3Aopen+is%3Aissue+label%3A%22Type%3A+Bug%22) labels. We can help guiding you towards the solution. -You can also help by [responding to issues](https://github.com/ethereum/mist/issues?q=is%3Aissue+is%3Aopen+label%3A%22Status%3A+Triage%22). Sign up on [CodeTriage](https://www.codetriage.com/ethereum/mist) and it'll send you gentle notifications with a configurable frequency. It is a nice way to help while learning +You can also help by [responding to issues](https://github.com/ethereum/mist/issues?q=is%3Aissue+is%3Aopen+label%3A%22Status%3A+Triage%22). Sign up on [CodeTriage](https://www.codetriage.com/ethereum/mist) and it'll send you gentle notifications with a configurable frequency. It is a nice way to help while learning. ## Installation From 9c5d4edaee63abd0c53596fcabc17ed9ea8f9997 Mon Sep 17 00:00:00 2001 From: Ev Date: Fri, 26 Jan 2018 13:50:29 -0200 Subject: [PATCH 089/150] Minor text change --- .github/ISSUE_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index d50f09820..7df1bfe66 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -11,7 +11,7 @@ Number of blocks synchronized: 0 + ``` Version: `0.0.0` OS & Version: windows/linux/osx -Node version: `geth 0.0.0` +Node version: `geth 0.0.0` Number of blocks synchronized: 0 ``` diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000..d8d945527 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +interface/.meteor +tests/mocha-in-browser/lib diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 000000000..337354d4d --- /dev/null +++ b/.prettierrc @@ -0,0 +1 @@ +singleQuote: true \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 0fba6705f..14c032193 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -20,28 +20,28 @@ If you see someone who is making an extra effort to ensure our community is welc The following behaviors are expected and requested of all community members: -* Participate in an authentic and active way. In doing so, you contribute to the health and longevity of this community. -* Exercise consideration and respect in your speech and actions. -* Attempt collaboration before conflict. -* Refrain from demeaning, discriminatory, or harassing behavior and speech. -* Be mindful of your surroundings and of your fellow participants. Alert community leaders if you notice a dangerous situation, someone in distress, or violations of this Code of Conduct, even if they seem inconsequential. -* Remember that community event venues may be shared with members of the public; please be respectful to all patrons of these locations. +* Participate in an authentic and active way. In doing so, you contribute to the health and longevity of this community. +* Exercise consideration and respect in your speech and actions. +* Attempt collaboration before conflict. +* Refrain from demeaning, discriminatory, or harassing behavior and speech. +* Be mindful of your surroundings and of your fellow participants. Alert community leaders if you notice a dangerous situation, someone in distress, or violations of this Code of Conduct, even if they seem inconsequential. +* Remember that community event venues may be shared with members of the public; please be respectful to all patrons of these locations. ## 4. Unacceptable Behavior The following behaviors are considered harassment and are unacceptable within our community: -* Violence, threats of violence or violent language directed against another person. -* Sexist, racist, homophobic, transphobic, ableist or otherwise discriminatory jokes and language. -* Posting or displaying sexually explicit or violent material. -* Posting or threatening to post other people’s personally identifying information ("doxing"). -* Personal insults, particularly those related to gender, sexual orientation, race, religion, or disability. -* Inappropriate photography or recording. -* Inappropriate physical contact. You should have someone’s consent before touching them. -* Unwelcome sexual attention. This includes, sexualized comments or jokes; inappropriate touching, groping, and unwelcomed sexual advances. -* Deliberate intimidation, stalking or following (online or in person). -* Advocating for, or encouraging, any of the above behavior. -* Sustained disruption of community events, including talks and presentations. +* Violence, threats of violence or violent language directed against another person. +* Sexist, racist, homophobic, transphobic, ableist or otherwise discriminatory jokes and language. +* Posting or displaying sexually explicit or violent material. +* Posting or threatening to post other people’s personally identifying information ("doxing"). +* Personal insults, particularly those related to gender, sexual orientation, race, religion, or disability. +* Inappropriate photography or recording. +* Inappropriate physical contact. You should have someone’s consent before touching them. +* Unwelcome sexual attention. This includes, sexualized comments or jokes; inappropriate touching, groping, and unwelcomed sexual advances. +* Deliberate intimidation, stalking or following (online or in person). +* Advocating for, or encouraging, any of the above behavior. +* Sustained disruption of community events, including talks and presentations. ## 5. Consequences of Unacceptable Behavior @@ -55,16 +55,12 @@ If a community member engages in unacceptable behavior, the community organizers If you are subject to or witness unacceptable behavior, or have any other concerns, please notify a community organizer as soon as possible. ev@ethereum.org. - - Additionally, community organizers are available to help community members engage with local law enforcement or to otherwise help those experiencing unacceptable behavior feel safe. In the context of in-person events, organizers will also provide escorts as desired by the person experiencing distress. ## 7. Addressing Grievances If you feel you have been falsely or unfairly accused of violating this Code of Conduct, you should notify the Mist team with a concise description of your grievance. Your grievance will be handled in accordance with our existing governing policies. - - ## 8. Scope We expect all community participants (contributors, paid or otherwise; sponsors; and other guests) to abide by this Code of Conduct in all community venues–online and in-person–as well as in all one-on-one communications pertaining to community business. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 492934425..2ba332997 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,21 +6,20 @@ To help improve Mist (_Ethereum Wallet_), please include the following: -- What do you run? (_Binary version from [releases](https://github.com/ethereum/mist/releases) or a development version from the [commandline](https://github.com/ethereum/mist#run-mist)_) -- Which version do you use? (_Check the `VERSION` file in the Mist folder_) -- What OS you're on? +* What do you run? (_Binary version from [releases](https://github.com/ethereum/mist/releases) or a development version from the [commandline](https://github.com/ethereum/mist#run-mist)_) +* Which version do you use? (_Check the `VERSION` file in the Mist folder_) +* What OS you're on? If applicable: -- Log file (Linux: `~/.config/Mist/*.log`, Windows: `%APPDATA%/Roaming/Mist/*.log`, MacOSX: `~/Library/Application Support/Mist/*.log`) -- Screenshot (for GUI related issues) - +* Log file (Linux: `~/.config/Mist/logs/all.log`, Windows: `%APPDATA%/Roaming/Mist/logs/all.log`, MacOSX: `~/Library/Application Support/Mist/logs/all.log`) +* Screenshot (for GUI related issues) ## Pull Requests If you want to make a PR please make sure you add a understandable description of what it is you're adding/changing/fixing. -For formatting we use 4 *spaces* as indentation. +For formatting we use 2 _spaces_ as indentation. If you add any modules or files, please give them a module description and or a class description: @@ -40,4 +39,3 @@ Provides an API for all dapps, which specifically targets features from the Mist @constructor */ ``` - diff --git a/MISTAPI.md b/MISTAPI.md index c14105747..695417c0a 100644 --- a/MISTAPI.md +++ b/MISTAPI.md @@ -16,47 +16,42 @@ You have three different possibilities to use `web3`: ```js // 1. simply use it: web3 comes already defined -web3 +web3; // 2. optionally use web3 from Mist or load if outside of Mist -if(typeof web3 === 'undefined') - web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); +if (typeof web3 === 'undefined') + web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545')); // 3. always use web3 provided by the dapp ("Web3" won't be supplied by Mist), but the provider from Mist -if(typeof web3 !== 'undefined') - web3 = new Web3(web3.currentProvider); -else - web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); +if (typeof web3 !== 'undefined') web3 = new Web3(web3.currentProvider); +else web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545')); ``` ## API - -- [mist.platform](#mistplatform) -- [mist.requestAccount](#mistrequestaccountcallback)(callback) -- [mist.menu](#mistmenu) -- [mist.menu.add](#mistmenuaddid-options-callback)([id,] options, callback) -- [mist.menu.clear](#mistmenuclear)() -- [mist.menu.remove](#mistmenuremoveid)(id) -- [mist.menu.select](#mistmenuselectid)(text) -- [mist.menu.setBadge](#mistmenusetbadgetext)(text) -- [mist.menu.update](#mistmenuupdateid--options--callback)(id [, options] [, callback]) -- [mist.sounds](#mistsounds) -- [mist.sounds.bip](#mistsoundsbip)() -- [mist.sounds.bloop](#mistsoundsbloop)() -- [mist.sounds.invite](#mistsoundsinvite)() - +* [mist.platform](#mistplatform) +* [mist.requestAccount](#mistrequestaccountcallback)(callback) +* [mist.menu](#mistmenu) +* [mist.menu.add](#mistmenuaddid-options-callback)([id,] options, callback) +* [mist.menu.clear](#mistmenuclear)() +* [mist.menu.remove](#mistmenuremoveid)(id) +* [mist.menu.select](#mistmenuselectid)(text) +* [mist.menu.setBadge](#mistmenusetbadgetext)(text) +* [mist.menu.update](#mistmenuupdateid--options--callback)(id [, options][, callback]) +* [mist.sounds](#mistsounds) +* [mist.sounds.bip](#mistsoundsbip)() +* [mist.sounds.bloop](#mistsoundsbloop)() +* [mist.sounds.invite](#mistsoundsinvite)() ### mist.platform Returns the current platform, mist is running on: -- `darwin` (Mac OSX) -- `win32` (Windows) -- `linux` (Linux) +* `darwin` (Mac OSX) +* `win32` (Windows) +* `linux` (Linux) - -*** +--- ### mist.requestAccount(callback) @@ -64,23 +59,23 @@ Asks the user to provide, or create a new account. #### Parameters -1. `Function` The callback to be called with the new address as the second parameter. +1. `Function` The callback to be called with the new address as the second parameter. #### Example ```js -mist.requestAccount(function(e, address){ - console.log('Added new account', address); +mist.requestAccount(function(e, address) { + console.log('Added new account', address); }); ``` -*** +--- ### mist.menu Provides functionality to control the sub menu of your dapp, when its added to the sidebar. -*** +--- ### mist.menu.add([id,] options, callback) @@ -88,39 +83,43 @@ Adds/Updates a sub menu entry, which is placed below you dapp button in the side #### Parameters -1. `String` **optional** and id string to identify your sub menu entry when updating. -2. `Object` The menu options: - - `name` (`String`): The name of the sub menu button. - - `badge` (`String|null`) **optional**: The badge text for the sub menu button, e.g. `50`. - - `position` (`Number`) **optional**: The position of the submenu button, `1` is on the top. - - `selected` (`Boolean`) **optional**: Whether or not this sub menu entry is currently selected. -3. `Function` **optional**: The callback to be called when the sub menu entry is clicked. +1. `String` **optional** and id string to identify your sub menu entry when updating. +2. `Object` The menu options: + * `name` (`String`): The name of the sub menu button. + * `badge` (`String|null`) **optional**: The badge text for the sub menu button, e.g. `50`. + * `position` (`Number`) **optional**: The position of the submenu button, `1` is on the top. + * `selected` (`Boolean`) **optional**: Whether or not this sub menu entry is currently selected. +3. `Function` **optional**: The callback to be called when the sub menu entry is clicked. #### Minimal example ```js -mist.menu.add({name: 'My account'}); +mist.menu.add({ name: 'My account' }); ``` #### Full example ```js -mist.menu.add('tkrzU', { +mist.menu.add( + 'tkrzU', + { name: 'My Meny Entry', badge: 50, position: 1, selected: true -}, function(){ + }, + function() { // Redirect window.location = 'http://domain.com/send'; // Using history pushstate history.pushState(null, null, '/my-entry'); // In Meteor iron:router Router.go('/send'); -}) + } +); ``` -*** +--- ### mist.menu.clear() @@ -131,7 +130,7 @@ to clear up incorrect menu entries, which might have been lost since the last se None -*** +--- ### mist.menu.remove(id) @@ -139,9 +138,9 @@ Removes a sub menu entry. #### Parameters -1. `String` and id string to identify your sub menu. +1. `String` and id string to identify your sub menu. -*** +--- ### mist.menu.select(id) @@ -149,9 +148,9 @@ Selects the respective sub menu entry. #### Parameters -1. `String` the sub menu entry identifier. +1. `String` the sub menu entry identifier. -*** +--- ### mist.menu.setBadge(text) @@ -159,40 +158,40 @@ Sets the main badge of your dapp, right below your dapps menu button. #### Parameters -1. `String` the string used as the badge text. +1. `String` the string used as the badge text. -*** +--- -### mist.menu.update(id, [, options] [, callback]) +### mist.menu.update(id, [, options][, callback]) Works like `mist.menu.add()`, but only the `id` parameter is required. #### Parameters -1. `String` and id string to identify your sub menu entry. -2. `Object` The menu options: - - `name` (`String`): (optional) The name of the sub menu button. - - `badge` (`String|null`): (optional) The badge text for the sub menu button, e.g. `50`. - - `position` (`Number`): (optional) The position of the submenu button, `1` is on the top. - - `selected` (`Boolean`): (optional) Whether or not this sub menu entry is currently selected. -3. `Function` (optional) The callback to be called when the sub menu entry is clicked. +1. `String` and id string to identify your sub menu entry. +2. `Object` The menu options: + * `name` (`String`): (optional) The name of the sub menu button. + * `badge` (`String|null`): (optional) The badge text for the sub menu button, e.g. `50`. + * `position` (`Number`): (optional) The position of the submenu button, `1` is on the top. + * `selected` (`Boolean`): (optional) Whether or not this sub menu entry is currently selected. +3. `Function` (optional) The callback to be called when the sub menu entry is clicked. #### Example ```js mist.menu.update('tkrzU', { - badge: 50, - position: 2, -}) + badge: 50, + position: 2 +}); ``` -*** +--- ### mist.sounds Provides a list of sounds. -*** +--- ### mist.sounds.bip() @@ -202,8 +201,7 @@ Makes a bip sound. None -*** - +--- ### mist.sounds.bloop() @@ -213,7 +211,7 @@ Makes a bloop sound. None -*** +--- ### mist.sounds.invite() @@ -223,6 +221,4 @@ Makes an invite sound. None -*** - - +--- diff --git a/README.md b/README.md index 5210e8491..7cbe183f4 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,6 @@ [![Join the chat at https://gitter.im/ethereum/mist](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/ethereum/mist) [![Code Triagers Badge](https://www.codetriage.com/ethereum/mist/badges/users.svg)](https://www.codetriage.com/ethereum/mist) - The Mist browser is the tool of choice to browse and use Ðapps. For the Mist API see the [MISTAPI.md](MISTAPI.md). @@ -16,10 +15,10 @@ Please note that this repository is the Electron host for the Meteor based walle In order to get help regarding Mist or Ethereum Wallet, please follow: -1. Please check the [Mist troubleshooting guide](https://github.com/ethereum/mist/wiki). -1. Go to the [Gitter Channel](https://gitter.im/ethereum/mist) to connect with the community for instant help. -1. Search for [similar issues](https://github.com/ethereum/mist/issues?q=is%3Aopen+is%3Aissue+label%3A%22Type%3A+Canonical%22) and potential help. -1. Or create a [new issue](https://github.com/ethereum/mist/issues). +1. Please check the [Mist troubleshooting guide](https://github.com/ethereum/mist/wiki). +1. Go to the [Gitter Channel](https://gitter.im/ethereum/mist) to connect with the community for instant help. +1. Search for [similar issues](https://github.com/ethereum/mist/issues?q=is%3Aopen+is%3Aissue+label%3A%22Type%3A+Canonical%22) and potential help. +1. Or create a [new issue](https://github.com/ethereum/mist/issues). ## How to contribute @@ -43,12 +42,12 @@ apt-get install libgconf2-4 ``` ### Config folder -The data folder for Mist is stored in other places: -- Windows `%APPDATA%\Mist` -- macOS `~/Library/Application\ Support/Mist` -- Linux `~/.config/Mist` +The data folder for Mist is stored in other places: +* Windows `%APPDATA%\Mist` +* macOS `~/Library/Application\ Support/Mist` +* Linux `~/.config/Mist` ## Development @@ -59,11 +58,11 @@ Once a Mist version is released the Meteor frontend part is bundled using the `m To run mist in development you need: -- [Node.js](https://nodejs.org) `v7.x` (use the prefered installation method for your OS) -- [Meteor](https://www.meteor.com/install) javascript app framework -- [Yarn](https://yarnpkg.com/) package manager -- [Electron](http://electron.atom.io/) `v1.7.11` cross platform desktop app framework -- [Gulp](http://gulpjs.com/) build and automation system +* [Node.js](https://nodejs.org) `v7.x` (use the prefered installation method for your OS) +* [Meteor](https://www.meteor.com/install) javascript app framework +* [Yarn](https://yarnpkg.com/) package manager +* [Electron](http://electron.atom.io/) `v1.7.11` cross platform desktop app framework +* [Gulp](http://gulpjs.com/) build and automation system Install the latter ones via: @@ -95,7 +94,7 @@ $ yarn ### Run Mist For development we start the interface with a Meteor server for autoreload etc. -*Start the interface in a separate terminal window:* +_Start the interface in a separate terminal window:_ ```bash $ cd mist/interface && meteor --no-release-check @@ -108,13 +107,13 @@ $ cd mist $ yarn dev:electron ``` -*NOTE: client-binaries (e.g. [geth](https://github.com/ethereum/go-ethereum)) specified in [clientBinaries.json](https://github.com/ethereum/mist/blob/master/clientBinaries.json) will be checked during every startup and downloaded if out-of-date, binaries are stored in the [config folder](#config-folder)* +_NOTE: client-binaries (e.g. [geth](https://github.com/ethereum/go-ethereum)) specified in [clientBinaries.json](https://github.com/ethereum/mist/blob/master/clientBinaries.json) will be checked during every startup and downloaded if out-of-date, binaries are stored in the [config folder](#config-folder)_ -*NOTE: use `--help` to display available options, e.g. `--loglevel debug` (or `trace`) for verbose output* +_NOTE: use `--help` to display available options, e.g. `--loglevel debug` (or `trace`) for verbose output_ ### Run the Wallet -Start the wallet app for development, *in a separate terminal window:* +Start the wallet app for development, _in a separate terminal window:_ ```bash $ cd mist/interface && meteor --no-release-check @@ -142,7 +141,6 @@ it's less secure than using the default IPC method. $ yarn dev:electron --rpc http://localhost:8545 ``` - ### Passing options to Geth You can pass command-line options directly to Geth by prefixing them with `--node-` in @@ -161,7 +159,6 @@ $ yarn dev:electron --rpc /my/geth.ipc ...is the same as doing... - ```bash $ yarn dev:electron --rpc /my/geth.ipc --node-ipcpath /my/geth.ipc ``` @@ -171,7 +168,6 @@ $ yarn dev:electron --rpc /my/geth.ipc --node-ipcpath /my/geth.ipc See this guide to quickly set up a local private network on your computer: https://gist.github.com/evertonfraga/9d65a9f3ea399ac138b3e40641accf23 - ### Using Mist with a privatenet To run a private network you will need to set the IPC path, network id and data @@ -187,7 +183,6 @@ _NOTE: since `ipcpath` is also a Mist option you do not need to also include a You can also launch `geth` separately with the same options prior starting Mist. - ### Deployment Our build system relies on [gulp](http://gulpjs.com/) and [electron-builder](https://github.com/electron-userland/electron-builder/). @@ -202,13 +197,14 @@ $ npm install -g meteor-build-client Furthermore cross-platform builds require additional [`electron-builder` dependencies](https://github.com/electron-userland/electron-builder/wiki/Multi-Platform-Build#linux). On macOS those are: - Windows deps: + ```bash $ brew install wine --without-x11 mono makensis ``` Linux deps: + ```bash $ brew install gnu-tar libicns graphicsmagick xz ``` @@ -249,11 +245,11 @@ With the `walletSource` you can specify the Wallet branch to use, default is `ma Options are: -- `master` -- `develop` -- `local` Will try to build the wallet from [mist/]../meteor-dapp-wallet/app +* `master` +* `develop` +* `local` Will try to build the wallet from [mist/]../meteor-dapp-wallet/app -*Note: applicable only when combined with `--wallet`* +_Note: applicable only when combined with `--wallet`_ ##### skipTasks @@ -275,19 +271,19 @@ $ gulp checksums [--wallet] #### Cutting a release -1. Install [release](https://github.com/zeit/release) globally: +1. Install [release](https://github.com/zeit/release) globally: ```bash $ yarn global add release ``` -2. Create a git tag and a GitHub release: +2. Create a git tag and a GitHub release: ```bash $ release ``` -3. A generated release draft will open in the default browser. Edit the information and add assets as necessary. +3. A generated release draft will open in the default browser. Edit the information and add assets as necessary. ## Testing @@ -305,4 +301,4 @@ Then run the tests: $ gulp test ``` -*Note: Integration tests are not yet supported on Windows.* +_Note: Integration tests are not yet supported on Windows._ diff --git a/Wallet-README.txt b/Wallet-README.txt index d5f0731f5..27a1e6b99 100644 --- a/Wallet-README.txt +++ b/Wallet-README.txt @@ -15,8 +15,6 @@ Example: $ geth --datadir /my/chain/ --networkid 23 --ipcpath ~/Library/Ethereum/geth.ipc - - ### Original contract Once you start the app while running a testnet, the wallet need to deploy an original contract, @@ -27,39 +25,35 @@ as not the full code has to be deployed for every wallet. You need to make sure that the account displayed for the original wallet creation is unlocked and has at least 1 ether. - ## Paths The paths which store your wallets database and node are different: The wallet (Mist) stores its data at: -- Mac: ~/Library/Application Support/Mist -- Windows: %APPDATA%\Roaming\Mist -- Linux: ~/.config/Mist + +* Mac: ~/Library/Application Support/Mist +* Windows: %APPDATA%\Roaming\Mist +* Linux: ~/.config/Mist The nodes data is stored at: -- Mac: ~/Library/Ethereum -- Windows: %APPDATA%\Roaming\Ethereum -- Linux: ~/.ethereum +* Mac: ~/Library/Ethereum +* Windows: %APPDATA%\Roaming\Ethereum +* Linux: ~/.ethereum ## Issues If you find issues or have suggestion, please report them at https://github.com/ethereum/meteor-dapp-wallet/issues - - ## Repository -The wallet code can be found at +The wallet code can be found at https://github.com/ethereum/meteor-dapp-wallet -And the binary application code, which wraps the wallet app can be found at +And the binary application code, which wraps the wallet app can be found at https://github.com/ethereum/mist/tree/wallet - - ## Bundling the wallet To bundle the binaries yourself follow the instructions on the mist#wallet readme diff --git a/customProtocols.js b/customProtocols.js index 05fd52ef0..5416a92cf 100644 --- a/customProtocols.js +++ b/customProtocols.js @@ -1,27 +1,36 @@ const { protocol } = require('electron'); - -protocol.registerHttpProtocol('mist', (request, callback) => { +protocol.registerHttpProtocol( + 'mist', + (request, callback) => { // callback({mimeType: 'text/html', data: new Buffer('
Response
')}); - console.log((request.url.indexOf('mist://interface') !== -1) ? global.interfaceAppUrl + request.url.replace('mist://interface', '') : ''); + console.log( + request.url.indexOf('mist://interface') !== -1 + ? global.interfaceAppUrl + request.url.replace('mist://interface', '') + : '' + ); const call = { - url: (request.url.indexOf('mist://interface') !== -1) ? global.interfaceAppUrl + request.url.replace('mist://interface', '') : '', // 'http://localhost:3050/' + request.url.replace('mist://',''), - method: request.method, - referrer: request.referrer, + url: + request.url.indexOf('mist://interface') !== -1 + ? global.interfaceAppUrl + request.url.replace('mist://interface', '') + : '', // 'http://localhost:3050/' + request.url.replace('mist://',''), + method: request.method, + referrer: request.referrer }; console.log(call); // console.log(call); callback(call); -}, (error) => { + }, + error => { if (error) { - console.error('Failed to register protocol'); + console.error('Failed to register protocol'); } -}); - + } +); // protocol.registerProtocol('eth', function(request) { // var url = request.url.substr(7) @@ -33,5 +42,4 @@ protocol.registerHttpProtocol('mist', (request, callback) => { // return new protocol.RequestStringJob({data: 'Hello'}); // }); - // protocol.registerStandardSchemes(['mist','eth', 'bzz']); //'eth', 'bzz' diff --git a/gulpTasks/building.js b/gulpTasks/building.js index cf40b8474..212030a82 100644 --- a/gulpTasks/building.js +++ b/gulpTasks/building.js @@ -11,21 +11,17 @@ const Q = require('bluebird'); const shell = require('shelljs'); const version = require('../package.json').version; - const type = options.type; -const applicationName = (options.wallet) ? 'Ethereum Wallet' : 'Mist'; - +const applicationName = options.wallet ? 'Ethereum Wallet' : 'Mist'; -gulp.task('clean-dist', (cb) => { - return del([ - `./dist_${type}`, - './meteor-dapp-wallet' - ], cb); +gulp.task('clean-dist', cb => { + return del([`./dist_${type}`, './meteor-dapp-wallet'], cb); }); - gulp.task('copy-app-source-files', () => { - return gulp.src([ + return gulp + .src( + [ 'node_modules/**/*', './clientBinaries.json', './tests/**/*.*', @@ -37,227 +33,262 @@ gulp.task('copy-app-source-files', () => { '!node_modules/electron/**/*', '!./tests/wallet/*', '!./tests/mist/*', - '!./tests/unit/*', - ], { + '!./tests/unit/*' + ], + { base: './' - }) + } + ) .pipe(gulp.dest(`./dist_${type}/app`)); - }); - gulp.task('transpile-main', () => { - return gulp.src('./main.js') - .pipe(babel({ presets: ['es2016-node5'] })) - .pipe(gulp.dest(`./dist_${type}/app`)); + return gulp + .src('./main.js') + .pipe(babel({ presets: ['es2016-node5'] })) + .pipe(gulp.dest(`./dist_${type}/app`)); }); - gulp.task('transpile-modules', () => { - return gulp.src('./modules/**') - .pipe(babel({ presets: ['es2016-node5'] })) - .pipe(gulp.dest(`./dist_${type}/app/modules`)); + return gulp + .src('./modules/**') + .pipe(babel({ presets: ['es2016-node5'] })) + .pipe(gulp.dest(`./dist_${type}/app/modules`)); }); - gulp.task('copy-build-folder-files', () => { - return gulp.src([ - `./icons/${type}/*`, - './interface/public/images/dmg-background.jpg' - ]) + return gulp + .src([`./icons/${type}/*`, './interface/public/images/dmg-background.jpg']) .pipe(gulp.dest(`./dist_${type}/build`)); }); - -gulp.task('switch-production', (cb) => { - fs.writeFile(`./dist_${type}/app/config.json`, JSON.stringify({ - production: true, - mode: type - }), cb); +gulp.task('switch-production', cb => { + fs.writeFile( + `./dist_${type}/app/config.json`, + JSON.stringify({ + production: true, + mode: type + }), + cb + ); }); - -gulp.task('bundling-interface', (cb) => { - const bundle = (additionalCommands) => { - exec(`cd interface \ - && meteor-build-client ${path.join('..', `dist_${type}`, 'app', 'interface')} -p "" \ +gulp.task('bundling-interface', cb => { + const bundle = additionalCommands => { + exec( + `cd interface \ + && meteor-build-client ${path.join( + '..', + `dist_${type}`, + 'app', + 'interface' + )} -p "" \ ${additionalCommands}`, - (err, stdout) => { - console.log(stdout); - cb(err); - }); - }; + (err, stdout) => { + console.log(stdout); + cb(err); + } + ); + }; - if (type === 'wallet') { - if (options.walletSource === 'local') { - console.log('Use local wallet at ../meteor-dapp-wallet/app'); - bundle(`&& cd ../../meteor-dapp-wallet/app \ + if (type === 'wallet') { + if (options.walletSource === 'local') { + console.log('Use local wallet at ../meteor-dapp-wallet/app'); + bundle(`&& cd ../../meteor-dapp-wallet/app \ && meteor-build-client ../../mist/dist_${type}/app/interface/wallet -p ""`); - } else { - console.log(`Pulling https://github.com/ethereum/meteor-dapp-wallet/tree/${options.walletSource} "${options.walletSource}" branch...`); - bundle(`&& cd ../dist_${type} \ + } else { + console.log( + `Pulling https://github.com/ethereum/meteor-dapp-wallet/tree/${ + options.walletSource + } "${options.walletSource}" branch...` + ); + bundle(`&& cd ../dist_${type} \ && git clone --depth 1 https://github.com/ethereum/meteor-dapp-wallet.git \ && cd meteor-dapp-wallet/app \ && meteor-build-client ../../app/interface/wallet -p "" \ && cd ../../ \ && rm -rf meteor-dapp-wallet`); - } - } else { - bundle(); } + } else { + bundle(); + } }); - gulp.task('copy-i18n', () => { - return gulp.src([ - './interface/i18n/*.*', - './interface/project-tap.i18n' - ], { - base: './' + return gulp + .src(['./interface/i18n/*.*', './interface/project-tap.i18n'], { + base: './' }) .pipe(gulp.dest(`./dist_${type}/app`)); }); - -gulp.task('build-dist', (cb) => { - const appPackageJson = _.extend({}, require('../package.json'), { // eslint-disable-line global-require - name: applicationName.replace(/\s/, ''), - productName: applicationName, - description: applicationName, - homepage: 'https://github.com/ethereum/mist', - build: { - appId: `org.ethereum.${type}`, - asar: true, - directories: { - buildResources: '../build', - output: '../dist' - }, - linux: { - category: 'WebBrowser', - icon: `./app/${type}/icons`, - target: [ - 'zip' - ] - }, - win: { - target: [ - 'zip' - ] - }, - mac: { - category: 'public.app-category.productivity', - }, - dmg: { - background: '../build/dmg-background.jpg', - iconSize: 128, - contents: [ - { - x: 441, - y: 448, - type: 'link', - path: '/Applications' - }, - { - x: 441, - y: 142, - type: 'file' - } - ] - } - } - }); - - fs.writeFileSync( - path.join(__dirname, `../dist_${type}`, 'app', 'package.json'), - JSON.stringify(appPackageJson, null, 2), 'utf-8' - ); - - const targets = []; - if (options.mac) targets.push(builder.Platform.MAC); - if (options.win) targets.push(builder.Platform.WINDOWS); - if (options.linux) targets.push(builder.Platform.LINUX); - - builder.build({ - targets: builder.createTargets(targets, null, 'all'), - projectDir: path.join(__dirname, `../dist_${type}`, 'app'), - publish: 'never', - config: { - afterPack(params) { - return Q.try(() => { - shell.cp( - [ - path.join(__dirname, '..', 'LICENSE'), - path.join(__dirname, '..', 'README.md'), - path.join(__dirname, '..', 'AUTHORS') - ], - params.appOutDir - ); - }); - } +gulp.task('build-dist', cb => { + const appPackageJson = _.extend({}, require('../package.json'), { + // eslint-disable-line global-require + name: applicationName.replace(/\s/, ''), + productName: applicationName, + description: applicationName, + homepage: 'https://github.com/ethereum/mist', + build: { + appId: `org.ethereum.${type}`, + asar: true, + directories: { + buildResources: '../build', + output: '../dist' + }, + linux: { + category: 'WebBrowser', + icon: `./app/${type}/icons`, + target: ['zip'] + }, + win: { + target: ['zip'] + }, + mac: { + category: 'public.app-category.productivity' + }, + dmg: { + background: '../build/dmg-background.jpg', + iconSize: 128, + contents: [ + { + x: 441, + y: 448, + type: 'link', + path: '/Applications' + }, + { + x: 441, + y: 142, + type: 'file' + } + ] + } + } + }); + + fs.writeFileSync( + path.join(__dirname, `../dist_${type}`, 'app', 'package.json'), + JSON.stringify(appPackageJson, null, 2), + 'utf-8' + ); + + const targets = []; + if (options.mac) targets.push(builder.Platform.MAC); + if (options.win) targets.push(builder.Platform.WINDOWS); + if (options.linux) targets.push(builder.Platform.LINUX); + + builder + .build({ + targets: builder.createTargets(targets, null, 'all'), + projectDir: path.join(__dirname, `../dist_${type}`, 'app'), + publish: 'never', + config: { + afterPack(params) { + return Q.try(() => { + shell.cp( + [ + path.join(__dirname, '..', 'LICENSE'), + path.join(__dirname, '..', 'README.md'), + path.join(__dirname, '..', 'AUTHORS') + ], + params.appOutDir + ); + }); } + } }) - .catch((err) => { - throw new Error(err); + .catch(err => { + throw new Error(err); }) .finally(() => { - cb(); + cb(); }); }); +gulp.task('release-dist', done => { + const distPath = path.join(__dirname, `../dist_${type}`, 'dist'); + const releasePath = path.join(__dirname, `../dist_${type}`, 'release'); -gulp.task('release-dist', (done) => { - const distPath = path.join(__dirname, `../dist_${type}`, 'dist'); - const releasePath = path.join(__dirname, `../dist_${type}`, 'release'); - - shell.rm('-rf', releasePath); - shell.mkdir('-p', releasePath); + shell.rm('-rf', releasePath); + shell.mkdir('-p', releasePath); - const appNameHypen = applicationName.replace(/\s/, '-'); - const appNameNoSpace = applicationName.replace(/\s/, ''); - const versionDashed = version.replace(/\./g, '-'); + const appNameHypen = applicationName.replace(/\s/, '-'); + const appNameNoSpace = applicationName.replace(/\s/, ''); + const versionDashed = version.replace(/\./g, '-'); - const cp = (inputPath, outputPath) => { - console.info(`Copying from ${path.join(distPath, inputPath)} to ${path.join(releasePath, outputPath)}`); - shell.cp(path.join(distPath, inputPath), path.join(releasePath, outputPath)); - }; - - _.each(options.activePlatforms, (platform) => { - switch (platform) { // eslint-disable-line default-case - case 'win': - cp(`${applicationName}-${version}-ia32-win.zip`, `${appNameHypen}-win32-${versionDashed}.zip`); - cp(`${applicationName}-${version}-win.zip`, `${appNameHypen}-win64-${versionDashed}.zip`); - break; - case 'mac': - cp(`${applicationName}-${version}.dmg`, `${appNameHypen}-macosx-${versionDashed}.dmg`); - break; - case 'linux': - // .deb have underscore separators - cp(`${appNameNoSpace}_${version}_i386.deb`, `${appNameHypen}-linux32-${versionDashed}.deb`); - cp(`${appNameNoSpace}_${version}_amd64.deb`, `${appNameHypen}-linux64-${versionDashed}.deb`); - - // .zip have dash separators - cp(`${appNameNoSpace}-${version}-ia32.zip`, `${appNameHypen}-linux32-${versionDashed}.zip`); - cp(`${appNameNoSpace}-${version}.zip`, `${appNameHypen}-linux64-${versionDashed}.zip`); - break; - } - }); + const cp = (inputPath, outputPath) => { + console.info( + `Copying from ${path.join(distPath, inputPath)} to ${path.join( + releasePath, + outputPath + )}` + ); + shell.cp( + path.join(distPath, inputPath), + path.join(releasePath, outputPath) + ); + }; + + _.each(options.activePlatforms, platform => { + switch (platform) { // eslint-disable-line default-case + case 'win': + cp( + `${applicationName}-${version}-ia32-win.zip`, + `${appNameHypen}-win32-${versionDashed}.zip` + ); + cp( + `${applicationName}-${version}-win.zip`, + `${appNameHypen}-win64-${versionDashed}.zip` + ); + break; + case 'mac': + cp( + `${applicationName}-${version}.dmg`, + `${appNameHypen}-macosx-${versionDashed}.dmg` + ); + break; + case 'linux': + // .deb have underscore separators + cp( + `${appNameNoSpace}_${version}_i386.deb`, + `${appNameHypen}-linux32-${versionDashed}.deb` + ); + cp( + `${appNameNoSpace}_${version}_amd64.deb`, + `${appNameHypen}-linux64-${versionDashed}.deb` + ); + + // .zip have dash separators + cp( + `${appNameNoSpace}-${version}-ia32.zip`, + `${appNameHypen}-linux32-${versionDashed}.zip` + ); + cp( + `${appNameNoSpace}-${version}.zip`, + `${appNameHypen}-linux64-${versionDashed}.zip` + ); + break; + } + }); - console.info('∆∆∆ Listing release files ***'); - console.info(shell.ls('-l', releasePath).map(e => e.name)); + console.info('∆∆∆ Listing release files ***'); + console.info(shell.ls('-l', releasePath).map(e => e.name)); - done(); + done(); }); +gulp.task('build-nsis', done => { + if (!options.win) return done(); -gulp.task('build-nsis', (done) => { - if (!options.win) return done(); - - const typeString = `-DTYPE=${type}`; - const appNameString = `-DAPPNAME=${applicationName.replace(/\s/, '-')}`; - const versionParts = version.split('.'); - const versionString = `-DVERSIONMAJOR=${versionParts[0]} -DVERSIONMINOR=${versionParts[1]} -DVERSIONBUILD=${versionParts[2]}`; + const typeString = `-DTYPE=${type}`; + const appNameString = `-DAPPNAME=${applicationName.replace(/\s/, '-')}`; + const versionParts = version.split('.'); + const versionString = `-DVERSIONMAJOR=${versionParts[0]} -DVERSIONMINOR=${ + versionParts[1] + } -DVERSIONBUILD=${versionParts[2]}`; - const cmdString = `makensis ${versionString} ${typeString} ${appNameString} scripts/windows-installer.nsi`; + const cmdString = `makensis ${versionString} ${typeString} ${appNameString} scripts/windows-installer.nsi`; - exec(cmdString, done); + exec(cmdString, done); }); diff --git a/gulpTasks/maintenance.js b/gulpTasks/maintenance.js index a8ed790e1..136f53024 100644 --- a/gulpTasks/maintenance.js +++ b/gulpTasks/maintenance.js @@ -11,162 +11,214 @@ const gulp = require('gulp'); const parseJson = require('xml2js').parseString; const clientBinaries = require('../clientBinaries.json'); - -gulp.task('update-nodes', (cb) => { - const clientBinariesGeth = clientBinaries.clients.Geth; - const localGethVersion = clientBinariesGeth.version; - const newJson = clientBinaries; - const geth = newJson.clients.Geth; - - // Query latest geth version - got('https://api.github.com/repos/ethereum/go-ethereum/releases/latest', { json: true }) - .then((response) => { - return response.body.tag_name; +gulp.task('update-nodes', cb => { + const clientBinariesGeth = clientBinaries.clients.Geth; + const localGethVersion = clientBinariesGeth.version; + const newJson = clientBinaries; + const geth = newJson.clients.Geth; + + // Query latest geth version + got('https://api.github.com/repos/ethereum/go-ethereum/releases/latest', { + json: true + }) + .then(response => { + return response.body.tag_name; }) // Return tag name (e.g. 'v1.5.0') - .then((tagName) => { - const latestGethVersion = tagName.match(/\d+\.\d+\.\d+/)[0]; - - // Compare to current geth version in clientBinaries.json - if (cmp(latestGethVersion, localGethVersion)) { - geth.version = latestGethVersion; - - // Query commit hash (first 8 characters) - got(`https://api.github.com/repos/ethereum/go-ethereum/commits/${tagName}`, { json: true }) - .then((response) => { - return String(response.body.sha).substr(0, 8); - }) - .then((hash) => { - let blobs; // azure blobs - - // Query Azure assets for md5 hashes - got('https://gethstore.blob.core.windows.net/builds?restype=container&comp=list', { xml: true }) - .then((response) => { - parseJson(response.body, (err, data) => { // eslint-disable-line - if (err) return cb(err); - - blobs = data.EnumerationResults.Blobs[0].Blob; - }); + .then(tagName => { + const latestGethVersion = tagName.match(/\d+\.\d+\.\d+/)[0]; + + // Compare to current geth version in clientBinaries.json + if (cmp(latestGethVersion, localGethVersion)) { + geth.version = latestGethVersion; + + // Query commit hash (first 8 characters) + got( + `https://api.github.com/repos/ethereum/go-ethereum/commits/${tagName}`, + { json: true } + ) + .then(response => { + return String(response.body.sha).substr(0, 8); + }) + .then(hash => { + let blobs; // azure blobs + + // Query Azure assets for md5 hashes + got( + 'https://gethstore.blob.core.windows.net/builds?restype=container&comp=list', + { xml: true } + ) + .then(response => { + parseJson(response.body, (err, data) => { + // eslint-disable-line + if (err) return cb(err); + + blobs = data.EnumerationResults.Blobs[0].Blob; + }); - // For each platform/arch in clientBinaries.json - _.keys(geth.platforms).forEach((platform) => { - _.keys(geth.platforms[platform]).forEach((arch) => { - // Update URL - let url = geth.platforms[platform][arch].download.url; - url = url.replace(/\d+\.\d+\.\d+-[a-z0-9]{8}/, `${latestGethVersion}-${hash}`); - geth.platforms[platform][arch].download.url = url; - - // Update bin name (path in archive) - let bin = geth.platforms[platform][arch].download.bin; - bin = bin.replace(/\d+\.\d+\.\d+-[a-z0-9]{8}/, `${latestGethVersion}-${hash}`); - geth.platforms[platform][arch].download.bin = bin; - - // Update expected sanity-command version output - geth.platforms[platform][arch].commands.sanity.output[1] = - String(latestGethVersion); - - // Update md5 checksum - blobs.forEach((blob) => { - if (String(blob.Name) === _.last(geth.platforms[platform][arch].download.url.split('/'))) { - const sum = new Buffer(blob.Properties[0]['Content-MD5'][0], 'base64'); - - geth.platforms[platform][arch].download.md5 = sum.toString('hex'); - } - }); - }); + // For each platform/arch in clientBinaries.json + _.keys(geth.platforms).forEach(platform => { + _.keys(geth.platforms[platform]).forEach(arch => { + // Update URL + let url = geth.platforms[platform][arch].download.url; + url = url.replace( + /\d+\.\d+\.\d+-[a-z0-9]{8}/, + `${latestGethVersion}-${hash}` + ); + geth.platforms[platform][arch].download.url = url; + + // Update bin name (path in archive) + let bin = geth.platforms[platform][arch].download.bin; + bin = bin.replace( + /\d+\.\d+\.\d+-[a-z0-9]{8}/, + `${latestGethVersion}-${hash}` + ); + geth.platforms[platform][arch].download.bin = bin; + + // Update expected sanity-command version output + geth.platforms[platform][ + arch + ].commands.sanity.output[1] = String(latestGethVersion); + + // Update md5 checksum + blobs.forEach(blob => { + if ( + String(blob.Name) === + _.last( + geth.platforms[platform][arch].download.url.split('/') + ) + ) { + const sum = new Buffer( + blob.Properties[0]['Content-MD5'][0], + 'base64' + ); + + geth.platforms[platform][ + arch + ].download.md5 = sum.toString('hex'); + } }); - }) - // Update clientBinares.json - .then(() => { - fs.writeFile('./clientBinaries.json', JSON.stringify(newJson, null, 4)); - cb(); + }); }); - }); - } else return cb(); // Already up-to-date + }) + // Update clientBinares.json + .then(() => { + fs.writeFile( + './clientBinaries.json', + JSON.stringify(newJson, null, 4) + ); + cb(); + }); + }); + } else return cb(); // Already up-to-date }) .catch(cb); }); +gulp.task('download-signatures', cb => { + got( + 'https://www.4byte.directory/api/v1/signatures/?page_size=20000&ordering=created_at', + { + json: true + } + ) + .then(res => { + if (res.statusCode !== 200) { + throw new Error(res.statusText); + } -gulp.task('download-signatures', (cb) => { - got('https://www.4byte.directory/api/v1/signatures/?page_size=20000&ordering=created_at', { - json: true - }) - .then((res) => { - if (res.statusCode !== 200) { - throw new Error(res.statusText); - } - - const signatures = {}; + const signatures = {}; - _.each(res.body.results, (e) => { - signatures[e.hex_signature] = signatures[e.hex_signature] || []; - signatures[e.hex_signature].push(e.text_signature); - }); + _.each(res.body.results, e => { + signatures[e.hex_signature] = signatures[e.hex_signature] || []; + signatures[e.hex_signature].push(e.text_signature); + }); - fs.writeFileSync('interface/client/lib/signatures.js', `window.SIGNATURES = ${JSON.stringify(signatures, null, 4)};`); + fs.writeFileSync( + 'interface/client/lib/signatures.js', + `window.SIGNATURES = ${JSON.stringify(signatures, null, 4)};` + ); - cb(); + cb(); }) .catch(cb); }); - -gulp.task('update-i18n', (cb) => { - /** - * This script will update Mist's i18n files - * - adds missing english strings to all translations - * - removes obsolet keys from translations - */ - - const mistEN = require('../interface/i18n/mist.en.i18n.json'); // eslint-disable-line no-unused-vars - const appEN = require('../interface/i18n/app.en.i18n.json'); // eslint-disable-line no-unused-vars - - try { - ['mist', 'app'].forEach((mode) => { - const en = { - parent: 'en', - content: eval(`${mode}EN`) // eslint-disable-line no-eval - }; - - const files = fs.readdirSync('./interface/i18n'); - - files.forEach((file) => { - if (file.indexOf(`${mode}`) !== -1 && file.indexOf(`${mode}.en`) === -1) { - const langJson = require(`../interface/i18n/${file}`); // eslint-disable-line import/no-dynamic-require - const lang = { - parent: 'lang', - content: langJson - }; - let error; - - // remove unnecessary keys - error = compare([lang, en]); - if (error) { - error.forEach((diff) => { - if (diff.typeOfComparedParent === 'undefined') { - eval(`delete lang.content.${diff.parent.slice(diff.parent.indexOf('.') + 1)}`); // eslint-disable-line no-eval - } - }); - } - - // add missing keys - error = compare([en, lang]); - if (error) { - error.forEach((diff) => { - if (diff.typeOfComparedParent !== diff.typeOfParent && diff.parent !== 'en.mist.applicationMenu.view.languages' && diff.parent !== 'en.mist.applicationMenu.view.langCodes') { - eval(`lang.content.${diff.comparedParent.slice(diff.comparedParent.indexOf('.') + 1)} = en.content.${diff.parent.slice(diff.parent.indexOf('.') + 1)}`); // eslint-disable-line no-eval - } - }); - } - - fs.writeFileSync(`./interface/i18n/${file}`, JSON.stringify(lang.content, null, 4)); - } +gulp.task('update-i18n', cb => { + /** + * This script will update Mist's i18n files + * - adds missing english strings to all translations + * - removes obsolet keys from translations + */ + + const mistEN = require('../interface/i18n/mist.en.i18n.json'); // eslint-disable-line no-unused-vars + const appEN = require('../interface/i18n/app.en.i18n.json'); // eslint-disable-line no-unused-vars + + try { + ['mist', 'app'].forEach(mode => { + const en = { + parent: 'en', + content: eval(`${mode}EN`) // eslint-disable-line no-eval + }; + + const files = fs.readdirSync('./interface/i18n'); + + files.forEach(file => { + if ( + file.indexOf(`${mode}`) !== -1 && + file.indexOf(`${mode}.en`) === -1 + ) { + const langJson = require(`../interface/i18n/${file}`); // eslint-disable-line import/no-dynamic-require + const lang = { + parent: 'lang', + content: langJson + }; + let error; + + // remove unnecessary keys + error = compare([lang, en]); + if (error) { + error.forEach(diff => { + if (diff.typeOfComparedParent === 'undefined') { + eval( + `delete lang.content.${diff.parent.slice( + diff.parent.indexOf('.') + 1 + )}` + ); // eslint-disable-line no-eval + } }); - }); - } catch (e) { - console.log(e); - } finally { - cb(); // eslint-disable-line callback-return - } + } + + // add missing keys + error = compare([en, lang]); + if (error) { + error.forEach(diff => { + if ( + diff.typeOfComparedParent !== diff.typeOfParent && + diff.parent !== 'en.mist.applicationMenu.view.languages' && + diff.parent !== 'en.mist.applicationMenu.view.langCodes' + ) { + eval( + `lang.content.${diff.comparedParent.slice( + diff.comparedParent.indexOf('.') + 1 + )} = en.content.${diff.parent.slice( + diff.parent.indexOf('.') + 1 + )}` + ); // eslint-disable-line no-eval + } + }); + } + + fs.writeFileSync( + `./interface/i18n/${file}`, + JSON.stringify(lang.content, null, 4) + ); + } + }); + }); + } catch (e) { + console.log(e); + } finally { + cb(); // eslint-disable-line callback-return + } }); diff --git a/gulpTasks/publishing.js b/gulpTasks/publishing.js index aac33420d..41bb6833d 100644 --- a/gulpTasks/publishing.js +++ b/gulpTasks/publishing.js @@ -9,106 +9,140 @@ const path = require('path'); const shell = require('shelljs'); const version = require('../package.json').version; - const checksums = []; const type = options.type; +gulp.task('checksums', cb => { + const releasePath = `./dist_${type}/release`; + const files = fs.readdirSync(releasePath); -gulp.task('checksums', (cb) => { - const releasePath = `./dist_${type}/release`; - const files = fs.readdirSync(releasePath); + let command; + let argument = ''; - let command; - let argument = ''; + if (process.platform === 'win32') { + command = 'certUtil -hashfile'; + argument = 'SHA256'; + } else { + command = 'shasum -a 256'; + } - if (process.platform === 'win32') { - command = 'certUtil -hashfile'; - argument = 'SHA256'; - } else { - command = 'shasum -a 256'; - } + files.forEach(file => { + const sum = shell.exec(`${command} "${file}" ${argument}`, { + cwd: releasePath + }); - files.forEach((file) => { - const sum = shell.exec(`${command} "${file}" ${argument}`, { - cwd: releasePath - }); + if (sum.code !== 0) { + Error(`Error executing shasum: ${sum.stderr}`); + } - if (sum.code !== 0) { - Error(`Error executing shasum: ${sum.stderr}`); - } + // store checksums for 'upload-binaries' task + checksums.push(sum.stdout); + }); - // store checksums for 'upload-binaries' task - checksums.push(sum.stdout); - }); - - cb(); + cb(); }); +gulp.task('upload-binaries', cb => { + // if CI detected only upload if on master branch + if (process.env.CI && process.env.TRAVIS_BRANCH !== 'master') return; -gulp.task('upload-binaries', (cb) => { - // if CI detected only upload if on master branch - if (process.env.CI && process.env.TRAVIS_BRANCH !== 'master') return; - - // personal access token (public_repo) must be set using travis' ENVs - const GITHUB_TOKEN = process.env.GITHUB_TOKEN; + // personal access token (public_repo) must be set using travis' ENVs + const GITHUB_TOKEN = process.env.GITHUB_TOKEN; - console.info('Checking Github releases...'); + console.info('Checking Github releases...'); - // query github releases - got(`https://api.github.com/repos/ethereum/mist/releases?access_token=${GITHUB_TOKEN}`, { json: true }) + // query github releases + got( + `https://api.github.com/repos/ethereum/mist/releases?access_token=${GITHUB_TOKEN}`, + { json: true } + ) // filter draft with current version's tag - .then((res) => { - const draft = res.body[_.indexOf(_.pluck(res.body, 'tag_name'), `v${version}`)]; + .then(res => { + const draft = + res.body[_.indexOf(_.pluck(res.body, 'tag_name'), `v${version}`)]; - if (draft === undefined) throw new Error(`Couldn't find github release draft for v${version} release tag`); + if (draft === undefined) + throw new Error( + `Couldn't find github release draft for v${version} release tag` + ); - return draft; + return draft; }) // upload binaries from release folders if in draft mode - .then((draft) => { // eslint-disable-line consistent-return - if (draft.draft === true) { - const dir = `dist_${type}/release`; - const files = fs.readdirSync(dir); - const filePaths = _.map(files, (file) => { return path.join(dir, file); }); - console.log('Upload files: ', filePaths); - // check if draft already contains target binaries - // note: github replaces spaces in filenames with dots - const existingAssets = _.intersection(files.map((file) => { return file.replace(/\s/g, '.'); }), _.pluck(draft.assets, 'name')); - if (!_.isEmpty(existingAssets)) throw new Error(`Github release draft already contains assets (${existingAssets}); will not upload, please remove and trigger rebuild`); - - return githubUpload({ - url: `https://uploads.github.com/repos/ethereum/mist/releases/${draft.id}/assets{?name}`, - token: [GITHUB_TOKEN], - assets: filePaths - }).then((res) => { - console.log(`Successfully uploaded ${res} to v${version} release draft.`); + .then(draft => { + // eslint-disable-line consistent-return + if (draft.draft === true) { + const dir = `dist_${type}/release`; + const files = fs.readdirSync(dir); + const filePaths = _.map(files, file => { + return path.join(dir, file); + }); + console.log('Upload files: ', filePaths); + // check if draft already contains target binaries + // note: github replaces spaces in filenames with dots + const existingAssets = _.intersection( + files.map(file => { + return file.replace(/\s/g, '.'); + }), + _.pluck(draft.assets, 'name') + ); + if (!_.isEmpty(existingAssets)) + throw new Error( + `Github release draft already contains assets (${existingAssets}); will not upload, please remove and trigger rebuild` + ); + + return ( + githubUpload({ + url: `https://uploads.github.com/repos/ethereum/mist/releases/${ + draft.id + }/assets{?name}`, + token: [GITHUB_TOKEN], + assets: filePaths + }) + .then(res => { + console.log( + `Successfully uploaded ${res} to v${version} release draft.` + ); }) // append checksums to draft text .then(() => { - console.info('Appending checksums to release notes...', checksums); - if (draft.body && checksums) { - const checksumRows = checksums.map((e) => { - const line = e.replace('\n', '').split(' '); - return `${line[1]} | \`${line[0]}\``; - }).join('\n'); - got.patch(`https://api.github.com/repos/ethereum/mist/releases/${draft.id}?access_token=${GITHUB_TOKEN}`, { - body: JSON.stringify({ - tag_name: `v${version}`, - // String manipulation to create a checksums table - body: `${draft.body}\n\nFile | Checksum (SHA256)\n-- | -- \n${checksumRows}` - }) - }); - } + console.info( + 'Appending checksums to release notes...', + checksums + ); + if (draft.body && checksums) { + const checksumRows = checksums + .map(e => { + const line = e.replace('\n', '').split(' '); + return `${line[1]} | \`${line[0]}\``; + }) + .join('\n'); + got.patch( + `https://api.github.com/repos/ethereum/mist/releases/${ + draft.id + }?access_token=${GITHUB_TOKEN}`, + { + body: JSON.stringify({ + tag_name: `v${version}`, + // String manipulation to create a checksums table + body: `${ + draft.body + }\n\nFile | Checksum (SHA256)\n-- | -- \n${checksumRows}` + }) + } + ); + } + }) + .catch(err => { + console.log(err); }) - .catch((err) => { - console.log(err); - }); - } + ); + } }) - .catch((err) => { - console.log(err); + .catch(err => { + console.log(err); }) .then(() => { - cb(); + cb(); }); }); diff --git a/gulpTasks/testing.js b/gulpTasks/testing.js index 88029277b..0e90de99f 100644 --- a/gulpTasks/testing.js +++ b/gulpTasks/testing.js @@ -2,16 +2,13 @@ const gulp = require('gulp'); const mocha = require('gulp-spawn-mocha'); const options = require('../gulpfile.js').options; - gulp.task('test', () => { - return gulp.src([ - `./tests/${options.type}/${options.test}.test.js` - ]).pipe(mocha({ - timeout: 60000, - ui: 'exports', - reporter: 'spec', - compilers: [ - 'js:babel-core/register', - ] - })); + return gulp.src([`./tests/${options.type}/${options.test}.test.js`]).pipe( + mocha({ + timeout: 60000, + ui: 'exports', + reporter: 'spec', + compilers: ['js:babel-core/register'] + }) + ); }); diff --git a/gulpfile.js b/gulpfile.js index 0d9245f4d..c37652df2 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -9,82 +9,85 @@ const gulp = require('gulp'); const minimist = require('minimist'); const runSeq = require('run-sequence'); - // available crossplatform builds let platforms; if (process.platform === 'darwin') { - platforms = ['mac', 'linux', 'win']; + platforms = ['mac', 'linux', 'win']; } else if (process.platform === 'win32') { - platforms = ['win']; + platforms = ['win']; } else { - platforms = ['linux', 'win']; + platforms = ['linux', 'win']; } // parse commandline arguments const args = process.argv.slice(2); const options = minimist(args, { - string: ['walletSource', 'test', 'skipTasks'], - boolean: _.flatten(['wallet', platforms]), - default: { - wallet: false, - walletSource: 'master', - test: 'basic', - skipTasks: '', - }, + string: ['walletSource', 'test', 'skipTasks'], + boolean: _.flatten(['wallet', platforms]), + default: { + wallet: false, + walletSource: 'master', + test: 'basic', + skipTasks: '' + } }); - // echo version info and usage hints console.log('Mist version:', require('./package.json').version); console.log('Electron version:', require('electron/package.json').version); if (_.isEmpty(_.intersection(args, ['--wallet']))) { - console.log('Many gulp tasks can be run in wallet mode using: --wallet'); + console.log('Many gulp tasks can be run in wallet mode using: --wallet'); } -const platformFlags = platforms.map((platform) => { return `--${platform}`; }); +const platformFlags = platforms.map(platform => { + return `--${platform}`; +}); if (_.isEmpty(_.intersection(args, platformFlags))) { - console.log(`To specify a platform (default: all) use: ${platformFlags.join(' ')}`); - _.each(platforms, (platform) => { options[platform] = true; }); // activate all platform flags + console.log( + `To specify a platform (default: all) use: ${platformFlags.join(' ')}` + ); + _.each(platforms, platform => { + options[platform] = true; + }); // activate all platform flags } - // prepare global variables (shared with other gulp task files) -options.type = (options.wallet) ? 'wallet' : 'mist'; +options.type = options.wallet ? 'wallet' : 'mist'; options.platforms = platforms; -options.activePlatforms = _.keys(_.pick(_.pick(options, platforms), (key) => { return key; })); +options.activePlatforms = _.keys( + _.pick(_.pick(options, platforms), key => { + return key; + }) +); exports.options = options; - // import gulp tasks require('require-dir')('./gulpTasks'); +gulp.task('uploadQueue', cb => { + const tasks = []; + tasks.push('checksums'); + tasks.push('upload-binaries'); - -gulp.task('uploadQueue', (cb) => { - const tasks = []; - - tasks.push('checksums'); - tasks.push('upload-binaries'); - - runSeq.apply(null, _.flatten([tasks, cb])); + runSeq.apply(null, _.flatten([tasks, cb])); }); -const skipTasks = options.skipTasks.replace(/\s/g,'').split(','); +const skipTasks = options.skipTasks.replace(/\s/g, '').split(','); const tasks = [ - 'clean-dist', - 'copy-app-source-files', - 'transpile-main', - 'transpile-modules', - 'copy-build-folder-files', - 'switch-production', - 'bundling-interface', - 'copy-i18n', - 'build-dist', - 'release-dist', - 'build-nsis' + 'clean-dist', + 'copy-app-source-files', + 'transpile-main', + 'transpile-modules', + 'copy-build-folder-files', + 'switch-production', + 'bundling-interface', + 'copy-i18n', + 'build-dist', + 'release-dist', + 'build-nsis' ].filter(task => !skipTasks.includes(task)); gulp.task('default', gulp.series(tasks)); diff --git a/interface/client/actions.js b/interface/client/actions.js index 7f100cb24..deb5a678c 100644 --- a/interface/client/actions.js +++ b/interface/client/actions.js @@ -1,12 +1,15 @@ exports.getLanguage = function getLanguage() { - return function (dispatch) { - dispatch({ type: '[CLIENT]:GET_LANGUAGE:START' }); - try { - const lang = ipc.sendSync('backendAction_getLanguage'); - TAPi18n.setLanguage(lang); - dispatch({ type: '[CLIENT]:GET_LANGUAGE:SUCCESS', payload: { i18n: lang } }); - } catch (error) { - dispatch({ type: '[CLIENT]:GET_LANGUAGE:FAILURE', error }); - } + return function(dispatch) { + dispatch({ type: '[CLIENT]:GET_LANGUAGE:START' }); + try { + const lang = ipc.sendSync('backendAction_getLanguage'); + TAPi18n.setLanguage(lang); + dispatch({ + type: '[CLIENT]:GET_LANGUAGE:SUCCESS', + payload: { i18n: lang } + }); + } catch (error) { + dispatch({ type: '[CLIENT]:GET_LANGUAGE:FAILURE', error }); } -} + }; +}; diff --git a/interface/client/appStart.js b/interface/client/appStart.js index aae424da0..65a0c6bd1 100644 --- a/interface/client/appStart.js +++ b/interface/client/appStart.js @@ -5,86 +5,92 @@ The init function of Mist @method mistInit */ -mistInit = function () { - console.info('Initialise Mist Interface'); +mistInit = function() { + console.info('Initialise Mist Interface'); - EthBlocks.init(); - const ethBlocksInterval = setInterval(() => { - if (_.isEmpty(EthBlocks.latest)) { - EthBlocks.init(); - } else { - clearInterval(ethBlocksInterval); - } - }, 500); + EthBlocks.init(); + const ethBlocksInterval = setInterval(() => { + if (_.isEmpty(EthBlocks.latest)) { + EthBlocks.init(); + } else { + clearInterval(ethBlocksInterval); + } + }, 500); - Tabs.onceSynced.then(function () { - if (location.search.indexOf('reset-tabs') >= 0) { - console.info('Resetting UI tabs'); + Tabs.onceSynced.then(function() { + if (location.search.indexOf('reset-tabs') >= 0) { + console.info('Resetting UI tabs'); - Tabs.remove({}); - } + Tabs.remove({}); + } - if (!Tabs.findOne('browser')) { - console.debug('Insert tabs'); + if (!Tabs.findOne('browser')) { + console.debug('Insert tabs'); - Tabs.insert({ - _id: 'browser', - url: 'https://ethereum.org', - redirect: 'https://ethereum.org', - position: 0 - }); - } else { - Tabs.upsert( - { _id: 'browser' }, - { - $set: { position: 0 } - } - ); + Tabs.insert({ + _id: 'browser', + url: 'https://ethereum.org', + redirect: 'https://ethereum.org', + position: 0 + }); + } else { + Tabs.upsert( + { _id: 'browser' }, + { + $set: { position: 0 } } + ); + } - // overwrite wallet on start again, but use $set to preserve account titles - Tabs.upsert( - { _id: 'wallet' }, - { - $set: { - url: 'https://wallet.ethereum.org', - redirect: 'https://wallet.ethereum.org', - position: 1, - permissions: { - admin: true - } - } - }); - - // on first use of Mist, show the wallet to nudge the user to create an account - if (!LocalStore.get('selectedTab') || !Tabs.findOne(LocalStore.get('selectedTab'))) { - LocalStore.set('selectedTab', 'wallet'); + // overwrite wallet on start again, but use $set to preserve account titles + Tabs.upsert( + { _id: 'wallet' }, + { + $set: { + url: 'https://wallet.ethereum.org', + redirect: 'https://wallet.ethereum.org', + position: 1, + permissions: { + admin: true + } } - }); -}; + } + ); + // on first use of Mist, show the wallet to nudge the user to create an account + if ( + !LocalStore.get('selectedTab') || + !Tabs.findOne(LocalStore.get('selectedTab')) + ) { + LocalStore.set('selectedTab', 'wallet'); + } + }); +}; -Meteor.startup(function () { - console.info('Meteor starting up...'); +Meteor.startup(function() { + console.info('Meteor starting up...'); - if (!location.hash) { // Main window - EthAccounts.init(); - mistInit(); - } + if (!location.hash) { + // Main window + EthAccounts.init(); + mistInit(); + } - store.dispatch(getLanguage()); + store.dispatch(getLanguage()); - // change moment and numeral language, when language changes - Tracker.autorun(function () { - if (_.isString(TAPi18n.getLanguage())) { - const lang = TAPi18n.getLanguage().substr(0, 2); - moment.locale(lang); - try { - numeral.language(lang); - } catch (err) { - console.warn(`numeral.js couldn't set number formating: ${err.message}`); - } - EthTools.setLocale(lang); - } - }); + // change moment and numeral language, when language changes + Tracker.autorun(function() { + if (_.isString(TAPi18n.getLanguage())) { + const lang = TAPi18n.getLanguage().substr(0, 2); + moment.locale(lang); + try { + numeral.language(lang); + } catch (err) { + console.warn( + `numeral.js couldn't set number formating: ${err.message}` + ); + } + EthTools.setLocale(lang); + } + }); }); diff --git a/interface/client/collections.js b/interface/client/collections.js index a58ed19e9..2451f6e30 100644 --- a/interface/client/collections.js +++ b/interface/client/collections.js @@ -3,21 +3,21 @@ @module Collections */ - // BROWSER RELATED // Contains the accounts Tabs = new Mongo.Collection('tabs', { connection: null }); -LastVisitedPages = new Mongo.Collection('last-visted-pages', { connection: null }); +LastVisitedPages = new Mongo.Collection('last-visted-pages', { + connection: null +}); History = new Mongo.Collection('history', { connection: null }); // Sync collection from and to the backend loki.js if (typeof window.dbSync !== 'undefined') { - Tabs = window.dbSync.frontendSyncInit(Tabs); - LastVisitedPages = window.dbSync.frontendSyncInit(LastVisitedPages); - History = window.dbSync.frontendSyncInit(History); + Tabs = window.dbSync.frontendSyncInit(Tabs); + LastVisitedPages = window.dbSync.frontendSyncInit(LastVisitedPages); + History = window.dbSync.frontendSyncInit(History); } - // ETHEREUM RELATED // Accounts collection is add by the ethereum:accounts package diff --git a/interface/client/lib/ethereum/1_web3js_init.js b/interface/client/lib/ethereum/1_web3js_init.js index 270935e4b..bee60f5f4 100644 --- a/interface/client/lib/ethereum/1_web3js_init.js +++ b/interface/client/lib/ethereum/1_web3js_init.js @@ -1,10 +1,10 @@ // set providor if (typeof web3 !== 'undefined') { - console.info('Web3 already initialized, re-using provider.'); + console.info('Web3 already initialized, re-using provider.'); - web3 = new Web3(web3.currentProvider); + web3 = new Web3(web3.currentProvider); } else { - console.info('Web3 not yet initialized, doing so now with HttpProvider.'); + console.info('Web3 not yet initialized, doing so now with HttpProvider.'); - web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545')); + web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545')); } diff --git a/interface/client/lib/helpers/helperFunctions.js b/interface/client/lib/helpers/helperFunctions.js index 59af00f0d..eb2904133 100644 --- a/interface/client/lib/helpers/helperFunctions.js +++ b/interface/client/lib/helpers/helperFunctions.js @@ -19,7 +19,6 @@ The preloader dirname **/ Helpers.preloaderDirname = window.dirname + '/modules/preloader'; - /** Reruns functions reactively, based on an interval. Use it like so: @@ -29,8 +28,8 @@ Reruns functions reactively, based on an interval. Use it like so: @method rerun **/ Helpers.rerun = { - '10s': new ReactiveTimer(10), - '1s': new ReactiveTimer(1) + '10s': new ReactiveTimer(10), + '1s': new ReactiveTimer(1) }; /** @@ -39,8 +38,8 @@ Get the webview from either and ID, or the string "browser" @method getWebview @param {String} id The Id of a tab or the string "browser" */ -Helpers.getWebview = function (id) { - return $('webview[data-id="' + id + '"]')[0]; +Helpers.getWebview = function(id) { + return $('webview[data-id="' + id + '"]')[0]; }; /** @@ -50,26 +49,26 @@ Get tab by url and return the id @param {String} url @return {String} id */ -Helpers.getTabIdByUrl = function (url, returnEmpty) { - var tabs = Tabs.find().fetch(); - url = Helpers.sanitizeUrl(url); - - var foundTab = _.find(tabs, function (tab) { - if (tab._id === 'browser' || !tab.url) { - return false; - } - var tabOrigin = new URL(tab.url).origin; - return (url && new URL(url).origin.indexOf(tabOrigin) === 0); - }); +Helpers.getTabIdByUrl = function(url, returnEmpty) { + var tabs = Tabs.find().fetch(); + url = Helpers.sanitizeUrl(url); - // switch tab to browser - if (foundTab) { - foundTab = foundTab._id; - } else { - foundTab = 'browser'; + var foundTab = _.find(tabs, function(tab) { + if (tab._id === 'browser' || !tab.url) { + return false; } - - return foundTab; + var tabOrigin = new URL(tab.url).origin; + return url && new URL(url).origin.indexOf(tabOrigin) === 0; + }); + + // switch tab to browser + if (foundTab) { + foundTab = foundTab._id; + } else { + foundTab = 'browser'; + } + + return foundTab; }; /** @@ -78,25 +77,25 @@ Format Urls, e.g add a default protocol if on is missing. @method formatUrl @param {String} url **/ -Helpers.formatUrl = function (url) { - if (!url) return; - - // add http:// if no protocol is present - if (url.length === 64 && !!url.match(/^[0-9a-f]+$/)) { - // if the url looks like a hash, add bzz - url = 'bzz://' + url; - } else if (!!url.match(/^([a-z]*:\/\/)?[^/]*\.eth(\/.*)?$/i)) { - // if uses .eth as a TLD - url = 'bzz://' + url.replace(/^([a-z]*:\/\/)?/i, ''); - } else if (!!url.match(/^[^\.\/]*$/i)) { - // doesn't have a protocol nor a TLD - url = 'bzz://' + url + '.eth'; - } else if (url.indexOf('://') === -1) { - // if it doesn't have a protocol - url = 'http://' + url; - } - - return url; +Helpers.formatUrl = function(url) { + if (!url) return; + + // add http:// if no protocol is present + if (url.length === 64 && !!url.match(/^[0-9a-f]+$/)) { + // if the url looks like a hash, add bzz + url = 'bzz://' + url; + } else if (!!url.match(/^([a-z]*:\/\/)?[^/]*\.eth(\/.*)?$/i)) { + // if uses .eth as a TLD + url = 'bzz://' + url.replace(/^([a-z]*:\/\/)?/i, ''); + } else if (!!url.match(/^[^\.\/]*$/i)) { + // doesn't have a protocol nor a TLD + url = 'bzz://' + url + '.eth'; + } else if (url.indexOf('://') === -1) { + // if it doesn't have a protocol + url = 'http://' + url; + } + + return url; }; /** @@ -105,17 +104,17 @@ Sanatizes URLs to prevent phishing and XSS attacks @method sanitizeUrl @param {String} url **/ -Helpers.sanitizeUrl = function (url, returnEmptyURL) { - url = String(url); +Helpers.sanitizeUrl = function(url, returnEmptyURL) { + url = String(url); - url = url.replace(/[\t\n\r\s]+/g, ''); - url = url.replace(/^[:\/]{1,3}/i, 'http://'); + url = url.replace(/[\t\n\r\s]+/g, ''); + url = url.replace(/^[:\/]{1,3}/i, 'http://'); - if (returnEmptyURL && /^(?:file|javascript|data):/i.test(url)) { - url = false; - } + if (returnEmptyURL && /^(?:file|javascript|data):/i.test(url)) { + url = false; + } - return url; + return url; }; /** @@ -124,26 +123,35 @@ Takes an URL and creates a breadcrumb out of it. @method generateBreadcrumb @return Spacebars.SafeString **/ -Helpers.generateBreadcrumb = function (url) { - var filteredUrl; - var pathname; - - filteredUrl = { - protocol: Blaze._escape(url.protocol), - host: Blaze._escape(url.host), - pathname: Blaze._escape(url.pathname), - search: Blaze._escape(url.search), - hash: Blaze._escape(url.hash) - }; - - filteredUrl.pathname += filteredUrl.search.replace(/\?/g, '/'); - filteredUrl.pathname += filteredUrl.hash.replace(/#/g, '/'); - - pathname = _.reject(filteredUrl.pathname.replace(/\/$/g, '').split('/'), function (el) { - return el === ''; - }); - - return new Spacebars.SafeString(filteredUrl.protocol + '//' + _.flatten(['' + filteredUrl.host + ' ', pathname]).join(' ▸ ')); +Helpers.generateBreadcrumb = function(url) { + var filteredUrl; + var pathname; + + filteredUrl = { + protocol: Blaze._escape(url.protocol), + host: Blaze._escape(url.host), + pathname: Blaze._escape(url.pathname), + search: Blaze._escape(url.search), + hash: Blaze._escape(url.hash) + }; + + filteredUrl.pathname += filteredUrl.search.replace(/\?/g, '/'); + filteredUrl.pathname += filteredUrl.hash.replace(/#/g, '/'); + + pathname = _.reject( + filteredUrl.pathname.replace(/\/$/g, '').split('/'), + function(el) { + return el === ''; + } + ); + + return new Spacebars.SafeString( + filteredUrl.protocol + + '//' + + _.flatten(['' + filteredUrl.host + ' ', pathname]).join( + ' ▸ ' + ) + ); }; /** @@ -151,16 +159,15 @@ Clear localStorage @method getLocalStorageSize **/ -Helpers.getLocalStorageSize = function () { - - var size = 0; - if (localStorage) { - _.each(Object.keys(localStorage), function (key) { - size += localStorage[key].length * 2 / 1024 / 1024; - }); - } +Helpers.getLocalStorageSize = function() { + var size = 0; + if (localStorage) { + _.each(Object.keys(localStorage), function(key) { + size += localStorage[key].length * 2 / 1024 / 1024; + }); + } - return size; + return size; }; /** @@ -169,11 +176,14 @@ Makes tab with index active @method selecTabWithIndex @param {Integer} index */ -Helpers.selectTabWithIndex = function (index) { - var tabList = Tabs.find({}, { sort: { position: 1 }, fields: { _id: 1 } }).fetch(); - if (index < tabList.length) { - LocalStore.set('selectedTab', tabList[index]._id); - } +Helpers.selectTabWithIndex = function(index) { + var tabList = Tabs.find( + {}, + { sort: { position: 1 }, fields: { _id: 1 } } + ).fetch(); + if (index < tabList.length) { + LocalStore.set('selectedTab', tabList[index]._id); + } }; /** @@ -181,9 +191,12 @@ Makes last tab active @method selecLastTab */ -Helpers.selectLastTab = function () { - var lastTab = Tabs.findOne({}, { sort: { position: -1 }, fields: { _id: 1 }, limit: 1 }); - LocalStore.set('selectedTab', lastTab._id); +Helpers.selectLastTab = function() { + var lastTab = Tabs.findOne( + {}, + { sort: { position: -1 }, fields: { _id: 1 }, limit: 1 } + ); + LocalStore.set('selectedTab', lastTab._id); }; /** @@ -191,23 +204,26 @@ Selects previous or next tab (offset +1 or -1) @method selectTabWithOffset */ -Helpers.selectTabWithOffset = function (offset) { - var tabList; - var currentTabIndex; - var newTabIndex; - - if (Math.abs(offset) !== 1) { - return; - } - tabList = _.pluck(Tabs.find({}, { sort: { position: 1 }, fields: { _id: 1 } }).fetch(), '_id'); - currentTabIndex = tabList.indexOf(LocalStore.get('selectedTab')); - - newTabIndex = (currentTabIndex + offset) % tabList.length; - if (newTabIndex < 0) { - newTabIndex = tabList.length - 1; - } - - LocalStore.set('selectedTab', tabList[newTabIndex]); +Helpers.selectTabWithOffset = function(offset) { + var tabList; + var currentTabIndex; + var newTabIndex; + + if (Math.abs(offset) !== 1) { + return; + } + tabList = _.pluck( + Tabs.find({}, { sort: { position: 1 }, fields: { _id: 1 } }).fetch(), + '_id' + ); + currentTabIndex = tabList.indexOf(LocalStore.get('selectedTab')); + + newTabIndex = (currentTabIndex + offset) % tabList.length; + if (newTabIndex < 0) { + newTabIndex = tabList.length - 1; + } + + LocalStore.set('selectedTab', tabList[newTabIndex]); }; /** @@ -215,41 +231,41 @@ Detect Network @method detectNetwork **/ -Helpers.detectNetwork = function (hash) { - var network = {}; +Helpers.detectNetwork = function(hash) { + var network = {}; - switch (hash) { + switch (hash) { case '0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3': - console.log('Network is mainnet'); - network.type = 'mainnet'; - network.name = 'Main'; - break; + console.log('Network is mainnet'); + network.type = 'mainnet'; + network.name = 'Main'; + break; case '0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d': - console.log('Network is Testnet #3 (Ropsten)'); - network.type = 'testnet'; - network.name = 'Ropsten'; - break; + console.log('Network is Testnet #3 (Ropsten)'); + network.type = 'testnet'; + network.name = 'Ropsten'; + break; case '0x6341fd3daf94b748c72ced5a5b26028f2474f5f00d824504e4fa37a75767e177': - console.log('Network is Testnet #4 (Rinkeby)'); - network.type = 'testnet'; - network.name = 'Rinkeby'; - break; + console.log('Network is Testnet #4 (Rinkeby)'); + network.type = 'testnet'; + network.name = 'Rinkeby'; + break; case '0x0cd786a2425d16f152c658316c423e6ce1181e15c3295826d7c9904cba9ce303': - console.log('Network is Testnet #2 (Morden)'); - network.type = 'testnet'; - network.name = 'Morden'; - break; + console.log('Network is Testnet #2 (Morden)'); + network.type = 'testnet'; + network.name = 'Morden'; + break; default: - console.log('Network is privatenet'); - network.type = 'privatenet'; - network.name = 'Private'; - } + console.log('Network is privatenet'); + network.type = 'privatenet'; + network.name = 'Private'; + } - return network; + return network; }; /** @@ -297,7 +313,6 @@ Displays an error as global notification // return false; // }; - /** Get form values and build a parameters object out of it. @@ -337,7 +352,6 @@ Get form values and build a parameters object out of it. // return parameters; // }; - /** Reactive wrapper for the moment package. @@ -357,7 +371,6 @@ Reactive wrapper for the moment package. // }; - /** Formats a timestamp to any format given. @@ -394,7 +407,6 @@ Formats a timestamp to any format given. // return ''; // }; - /** Formats a given number @@ -421,7 +433,6 @@ Formats a given number // return numeral(number).format(format); // }; - /** Formats a given number toa unit balance diff --git a/interface/client/lib/helpers/templateHelpers.js b/interface/client/lib/helpers/templateHelpers.js index 149c62822..cf56b0735 100644 --- a/interface/client/lib/helpers/templateHelpers.js +++ b/interface/client/lib/helpers/templateHelpers.js @@ -16,8 +16,8 @@ A simple template helper to log objects in the console. @method (debug) **/ -Template.registerHelper('debug', function (object) { - console.log(object); +Template.registerHelper('debug', function(object) { + console.log(object); }); /** @@ -25,18 +25,17 @@ Returns the current block @method (CurrentBlock) **/ -Template.registerHelper('CurrentBlock', function () { - return EthBlocks.latest; +Template.registerHelper('CurrentBlock', function() { + return EthBlocks.latest; }); - /** Return the dirname. @method (dirname) **/ -Template.registerHelper('dirname', function () { - return window.dirname; +Template.registerHelper('dirname', function() { + return window.dirname; }); /** @@ -44,18 +43,17 @@ Return the Mist API. @method (mist) **/ -Template.registerHelper('mist', function () { - return window.mist; +Template.registerHelper('mist', function() { + return window.mist; }); - /** Return the app mode. @method (mode) **/ -Template.registerHelper('mode', function () { - return window.mistMode; +Template.registerHelper('mode', function() { + return window.mistMode; }); /** @@ -63,8 +61,8 @@ Return the friendly app name. @method (appName) **/ -Template.registerHelper('appName', function () { - return window.mistMode === 'mist' ? 'Mist' : 'Ethereum Wallet'; +Template.registerHelper('appName', function() { + return window.mistMode === 'mist' ? 'Mist' : 'Ethereum Wallet'; }); /** @@ -72,8 +70,10 @@ Return the app icon path. @method (iconPath) **/ -Template.registerHelper('appIconPath', function () { - return 'file://' + window.dirname + '/icons/' + window.mistMode + '/icon2x.png'; +Template.registerHelper('appIconPath', function() { + return ( + 'file://' + window.dirname + '/icons/' + window.mistMode + '/icon2x.png' + ); }); /** @@ -81,8 +81,8 @@ Get all accounts @method (accounts) **/ -Template.registerHelper('accounts', function (identity) { - return EthAccounts.find({}, { sort: { name: 1 } }); +Template.registerHelper('accounts', function(identity) { + return EthAccounts.find({}, { sort: { name: 1 } }); }); /** @@ -98,36 +98,35 @@ Return the right wallet icon @method (walletIcon) **/ -Template.registerHelper('walletIcon', function () { - var icon = ''; - - if (this.type === 'wallet') { - if (Helpers.isWatchOnly(this._id)) { - icon = ''; - } else { - icon = ''; - } - } else if (this.type === 'account') { - icon = ''; +Template.registerHelper('walletIcon', function() { + var icon = ''; + + if (this.type === 'wallet') { + if (Helpers.isWatchOnly(this._id)) { + icon = ''; + } else { + icon = ''; } + } else if (this.type === 'account') { + icon = ''; + } - return new Spacebars.SafeString(icon); + return new Spacebars.SafeString(icon); }); - /** Get the account name or display the address @method (accountNameOrAddress) @param {String} address */ -Template.registerHelper('accountNameOrAddress', function (address) { - var account = EthAccounts.findOne({ address: address }); - if (account) { - return account.name; - } else { - return address; - } +Template.registerHelper('accountNameOrAddress', function(address) { + var account = EthAccounts.findOne({ address: address }); + if (account) { + return account.name; + } else { + return address; + } }); /** @@ -143,7 +142,6 @@ Formats a timestamp to any format given. **/ Template.registerHelper('formatTime', Helpers.formatTime); - /** Formats a number. @@ -156,7 +154,6 @@ Formats a number. **/ Template.registerHelper('formatNumber', Helpers.formatNumber); - /** Formats a number. diff --git a/interface/client/lib/signatures.js b/interface/client/lib/signatures.js index 695c6df57..de0705a97 100644 --- a/interface/client/lib/signatures.js +++ b/interface/client/lib/signatures.js @@ -1,18692 +1,6462 @@ window.SIGNATURES = { - "0x063925c8": [ - "scheduleCall(bytes,uint256,uint256)" - ], - "0x523ccfa8": [ - "isKnownCall(address)" - ], - "0x0a16697a": [ - "targetBlock()" - ], - "0xea8a1af0": [ - "cancel()" - ], - "0xae45850b": [ - "schedulerAddress()" - ], - "0x3f4be889": [ - "callContractAddress()" - ], - "0x62986e27": [ - "Canary(address,uint16)" - ], - "0x8129fc1c": [ - "initialize()" - ], - "0x4a420138": [ - "scheduleHeartbeat()" - ], - "0x3defb962": [ - "heartbeat()" - ], - "0x4136aa35": [ - "isAlive()" - ], - "0xac9873c7": [ - "CanaryV7()" - ], - "0x334dc700": [ - "CanaryV7Testnet()" - ], - "0x0b9e9817": [ - "CanaryV7FastTestnet()" - ], - "0xecf6eb22": [ - "setConfigAddress(bytes,address)" - ], - "0x6099af40": [ - "setConfigBool(bytes,bool)" - ], - "0x0baaaed9": [ - "setConfigBytes(bytes,bytes)" - ], - "0xa288fb1f": [ - "setConfigUint(int256,bytes,uint256)" - ], - "0x9e997121": [ - "getConfigAddress(bytes)" - ], - "0x087e055a": [ - "getConfigBool(bytes)" - ], - "0xb38415f3": [ - "getConfigBytes(bytes)" - ], - "0x015e4f3a": [ - "getConfigUint(int256,bytes)" - ], - "0x70480275": [ - "addAdmin(address)" - ], - "0x1785f53c": [ - "removeAdmin(address)" - ], - "0x43e6125d": [ - "Badge(address)" - ], - "0x4e30a66c": [ - "safeToAdd(uint256,uint256)" - ], - "0xc74c251f": [ - "addSafely(uint256,uint256)" - ], - "0xe74b9d11": [ - "safeToSubtract(uint256,uint256)" - ], - "0x3416f9d4": [ - "subtractSafely(uint256,uint256)" - ], - "0x70a08231": [ - "balanceOf(address)" - ], - "0xa9059cbb": [ - "transfer(address,uint256)" - ], - "0x23b872dd": [ - "transferFrom(address,address,uint256)" - ], - "0x095ea7b3": [ - "approve(address,uint256)" - ], - "0xdd62ed3e": [ - "allowance(address,address)" - ], - "0xd35f4a99": [ - "mint(int256,address,uint256)" - ], - "0x13af4035": [ - "setOwner(address)" - ], - "0x26070774": [ - "Token(address)" - ], - "0x80a23ddf": [ - "mintBadge(int256,address,uint256)" - ], - "0x2b297f9e": [ - "registerDao(address)" - ], - "0x6637b882": [ - "setDao(address)" - ], - "0x3f2965f0": [ - "registerSeller(address)" - ], - "0xac900c2d": [ - "unregisterSeller(address)" - ], - "0x18160ddd": [ - "totalSupply()" - ], - "0xdfcbb794": [ - "TrustFund(address,uint256,address)" - ], - "0x69d89575": [ - "releaseFunds()" - ], - "0xdd2ad311": [ - "scheduleCall(bytes,uint256)" - ], - "0x7f497550": [ - "scheduleTransfer(address,uint256,uint256)" - ], - "0x1e39499d": [ - "scheduleCall(address,bytes,uint256)" - ], - "0x075fe877": [ - "scheduleCall(address,bytes,uint256,uint256)" - ], - "0x6b069710": [ - "scheduleCall(address,bytes,uint256,uint256,uint8)" - ], - "0xb7aec6a5": [ - "scheduleCall(address,bytes,uint256,uint256,uint8,uint256)" - ], - "0xf37b437b": [ - "scheduleCall(address,bytes,uint256,uint256,uint8,uint256,uint256)" - ], - "0xd826f88f": [ - "reset()" - ], - "0x638560cf": [ - "registerBool(address,bool)" - ], - "0x9872a20a": [ - "registerUInt(address,uint256)" - ], - "0x1fb291cb": [ - "registerInt(address,int256)" - ], - "0x9aa26f06": [ - "registerBytes32(address,bytes)" - ], - "0x5dcbac7a": [ - "registerBytes(address,bytes)" - ], - "0x31b0795c": [ - "registerAddress(address,address)" - ], - "0x9c1500f0": [ - "registerMany(address,uint256,int256,uint256,bytes,address,bytes)" - ], - "0x5bfdc700": [ - "registerData(address,int256,bytes,address)" - ], - "0x5dfc2e4a": [ - "noop()" - ], - "0x5629c6d9": [ - "doExecution(address)" - ], - "0x1db71ffb": [ - "doLoops(uint256)" - ], - "0x6558488a": [ - "scheduleSetBool(address,uint256,bool)" - ], - "0x6f374a12": [ - "setBool()" - ], - "0xa71f94c8": [ - "scheduleSetUInt(address,uint256,uint256)" - ], - "0x54fd4d50": [ - "version()" - ], - "0x9378a9e2": [ - "setUInt(uint256)" - ], - "0x747586b8": [ - "setInt(int256)" - ], - "0xe30081a0": [ - "setAddress(address)" - ], - "0x46d667db": [ - "setBytes32(bytes)" - ], - "0xda359dc8": [ - "setBytes(bytes)" - ], - "0xbadbaa3c": [ - "setCallData()" - ], - "0x999a9965": [ - "setMany(uint256,int256,uint256,bytes,address,bytes)" - ], - "0xf46c50dc": [ - "doFail()" - ], - "0x3809c0bf": [ - "doInfinite()" - ], - "0x9941e3d0": [ - "setCallAddress(address)" - ], - "0xac1b14ff": [ - "proxyCall(uint256)" - ], - "0x21835af6": [ - "__dig(uint256)" - ], - "0x2e9c5e77": [ - "doStackExtension(uint256)" - ], - "0x971c803f": [ - "getMinimumStackCheck()" - ], - "0x586a69fa": [ - "getMaximumStackCheck()" - ], - "0x98e00e54": [ - "getCallWindowSize()" - ], - "0xc0f68859": [ - "getMinimumGracePeriod()" - ], - "0x8e46afa9": [ - "getDefaultGracePeriod()" - ], - "0x98c9cdf4": [ - "getMinimumCallGas()" - ], - "0x26a7985a": [ - "getMaximumCallGas()" - ], - "0x96cff3df": [ - "getMinimumCallCost(uint256,uint256)" - ], - "0xb152f19e": [ - "getFirstSchedulableBlock()" - ], - "0xea27a881": [ - "getMinimumEndowment(uint256,uint256,uint256,uint256)" - ], - "0x5548c837": [ - "Deposit(address,address,uint256)" - ], - "0x7fcf532c": [ - "Withdrawal(address,uint256)" - ], - "0x5c54305e": [ - "InsufficientFunds(address,uint256,uint256)" - ], - "0x12c82bcc": [ - "sendRobust(address,uint256)" - ], - "0xc6ab4514": [ - "sendRobust(address,uint256,uint256)" - ], - "0x6d5433e6": [ - "max(uint256,uint256)" - ], - "0xc5699d68": [ - "_compare(int256,bytes,int256)" - ], - "0x45fe6e2a": [ - "Scheduler()" - ], - "0x3017fe24": [ - "callAPIVersion()" - ], - "0xe6470fbe": [ - "updateDefaultPayment()" - ], - "0xbbc6eb1f": [ - "getDefaultDonation()" - ], - "0x1e74a2d3": [ - "getMinimumEndowment()" - ], - "0xaff21c65": [ - "getMinimumEndowment(uint256)" - ], - "0xf158458c": [ - "getMinimumEndowment(uint256,uint256)" - ], - "0x7c73f846": [ - "getMinimumEndowment(uint256,uint256,uint256)" - ], - "0x1b4fa6ab": [ - "getDefaultStackCheck()" - ], - "0xdbfef710": [ - "getDefaultRequiredGas()" - ], - "0xc3a2c0c3": [ - "scheduleCall()" - ], - "0x112e39a8": [ - "scheduleCall(uint256)" - ], - "0x67beaccb": [ - "scheduleCall(bytes)" - ], - "0xf4bbfd6a": [ - "scheduleCall(bytes,bytes)" - ], - "0x04509918": [ - "scheduleCall(address)" - ], - "0xa045fdff": [ - "scheduleCall(address,bytes)" - ], - "0x4b63e601": [ - "scheduleCall(address,uint256,bytes)" - ], - "0xa6cb9e64": [ - "scheduleCall(address,bytes,bytes)" - ], - "0x3fbb539d": [ - "scheduleCall(address,bytes,uint256,bytes)" - ], - "0xa00aede9": [ - "scheduleCall(uint256,address)" - ], - "0xb5b33eda": [ - "scheduleCall(address,uint256)" - ], - "0xd8e5c048": [ - "scheduleCall(address,uint256,uint256)" - ], - "0x75f45878": [ - "scheduleCall(bytes,bytes,uint256)" - ], - "0x349501b7": [ - "checkDepth(uint256)" - ], - "0xa0bd3c0f": [ - "scheduleCall(address,bytes,bytes,uint256)" - ], - "0xc17e6817": [ - "sendSafe(address,uint256)" - ], - "0x76ca0c77": [ - "scheduleCall(address,bytes,uint256,bytes,uint256)" - ], - "0xb5d0f16e": [ - "getGasScalar(uint256,uint256)" - ], - "0x49942ccb": [ - "scheduleCall(bytes,bytes,uint256,uint256)" - ], - "0xf5562753": [ - "getClaimAmountForBlock(uint256)" - ], - "0x64bd87d6": [ - "scheduleCall(address,bytes,bytes,uint256,uint256)" - ], - "0xa9d2293d": [ - "lastClaimBlock()" - ], - "0x0e554bd8": [ - "scheduleCall(bytes,uint256,uint256,uint8)" - ], - "0xcc3471af": [ - "maxClaimBlock()" - ], - "0xaa497b9d": [ - "scheduleCall(address,uint256,bytes,uint256,uint256,uint8)" - ], - "0x0fd1f94e": [ - "firstClaimBlock()" - ], - "0x67a59d91": [ - "scheduleCall(address,bytes,bytes,uint256,uint256,uint8)" - ], - "0x4571d4c4": [ - "FutureCall(address,uint256,uint16,address,bytes,bytes,uint256,uint256,uint256)" - ], - "0xc6236a5c": [ - "scheduleCall(bytes,uint256,uint256,uint8,uint256)" - ], - "0xc19d93fb": [ - "state()" - ], - "0x40953102": [ - "scheduleCall(address,uint256,bytes,uint256,uint256,uint8,uint256)" - ], - "0x7d298ee3": [ - "beforeExecute(address,uint256)" - ], - "0xe7329e71": [ - "scheduleCall(bytes,bytes,uint256,uint256,uint8,uint256)" - ], - "0x09b30ed5": [ - "afterExecute(address)" - ], - "0xd6eafd08": [ - "scheduleCall(address,bytes,bytes,uint8,uint256[4])" - ], - "0x67ce940d": [ - "getOverhead()" - ], - "0x991ffd4e": [ - "scheduleCall(address,bytes,bytes,uint256,uint256,uint8,uint256)" - ], - "0x137c638b": [ - "getExtraGas()" - ], - "0xd13d1ace": [ - "scheduleCall(bytes,bytes,uint16,uint8,uint256,uint256,uint256,uint256,uint256)" - ], - "0xf6b4dfb4": [ - "contractAddress()" - ], - "0x38eee93e": [ - "scheduleCall(address,bytes,bytes,uint16,uint8,uint256[5])" - ], - "0xca94692d": [ - "abiSignature()" - ], - "0x9f927be7": [ - "getNextCall(uint256)" - ], - "0x48107843": [ - "getNextCallSibling(address)" - ], - "0x4e417a98": [ - "callData()" - ], - "0xd62457f6": [ - "callValue()" - ], - "0x37f4c00e": [ - "anchorGasPrice()" - ], - "0x974654f4": [ - "requiredGas()" - ], - "0x2f95b833": [ - "requiredStackDepth()" - ], - "0xd379be23": [ - "claimer()" - ], - "0x830953ab": [ - "claimAmount()" - ], - "0x3233c686": [ - "claimerDeposit()" - ], - "0x09241200": [ - "wasSuccessful()" - ], - "0xc6803622": [ - "wasCalled()" - ], - "0x95ee1221": [ - "isCancelled()" - ], - "0x4f059a43": [ - "getClaimAmountForBlock()" - ], - "0xb0f07e44": [ - "registerData()" - ], - "0x4e71d92d": [ - "claim()" - ], - "0x24032866": [ - "checkExecutionAuthorization(address,uint256)" - ], - "0x61461954": [ - "execute()" - ], - "0x0cb749b6": [ - "FutureBlockCall(address,uint256,uint8,address,bytes,bytes,uint256,uint256,uint16,uint256,uint256)" - ], - "0x4500054f": [ - "isCancellable()" - ], - "0xa3912ec8": [ - "receiveEther()" - ], - "0x612e45a3": [ - "newProposal(address,uint256,string,bytes,uint256,bool)" - ], - "0xeceb2945": [ - "checkProposalCode(uint256,address,uint256,bytes)" - ], - "0xc9d27afe": [ - "vote(uint256,bool)" - ], - "0x237e9492": [ - "executeProposal(uint256,bytes)" - ], - "0x82661dc4": [ - "splitDAO(uint256,address)" - ], - "0x6837ff1e": [ - "newContract(address)" - ], - "0x749f9889": [ - "changeAllowedRecipients(address,bool)" - ], - "0xe33734fd": [ - "changeProposalDeposit(uint256)" - ], - "0xa1da2fb9": [ - "retrieveDAOReward(bool)" - ], - "0xcc9ae3f6": [ - "getMyReward()" - ], - "0x8a00a82f": [ - "withdrawRewardFor(address)" - ], - "0x4e10c3ee": [ - "transferWithoutReward(address,uint256)" - ], - "0xdbde1988": [ - "transferFromWithoutReward(address,address,uint256)" - ], - "0x78524b2e": [ - "halveMinQuorum()" - ], - "0x8d7af473": [ - "numberOfProposals()" - ], - "0xbe7c29c1": [ - "getNewDAOAddress(uint256)" - ], - "0xfbac3951": [ - "isBlocked(address)" - ], - "0x2632bf20": [ - "unblockMe()" - ], - "0x0386a016": [ - "closeProposal(uint256)" - ], - "0x48027610": [ - "transferPaidOut(address,address,uint256)" - ], - "0x8400c307": [ - "isRecipientAllowed(address)" - ], - "0x39d1f908": [ - "actualBalance()" - ], - "0xf42ac1de": [ - "minQuorum(uint256)" - ], - "0xd21b84ac": [ - "createNewDAO(address)" - ], - "0xd92ebe46": [ - "createDAO(address,uint256,uint256,uint256,string,string,uint8)" - ], - "0xebae35a6": [ - "DAOTokenCreationProxyTransferer(address,address)" - ], - "0xbe2430fe": [ - "sendValues()" - ], - "0x013cf08b": [ - "proposals(uint256)" - ], - "0x8bfc2f33": [ - "delegateDAOTokens(uint256)" - ], - "0xe417291b": [ - "undelegateDAOTokens(uint256)" - ], - "0x4da74ee6": [ - "setVoteIntention(uint256,bool,bool,string)" - ], - "0xf98a4eca": [ - "executeVote(uint256)" - ], - "0xe49dcee9": [ - "fixTokens()" - ], - "0xde0ff7c5": [ - "getEther()" - ], - "0xd9fe60f3": [ - "DTHPool(address,address,uint256,string,string,string)" - ], - "0xdaa283c8": [ - "__callback(bytes,string)" - ], - "0x0221038a": [ - "payOut(address,uint256)" - ], - "0x1fd96b69": [ - "ManagedAccount(address,bool)" - ], - "0x1adf2d1a": [ - "Offer(address,address,bytes,uint256,uint256,uint128,uint256)" - ], - "0x1bcad37a": [ - "getTotalCost()" - ], - "0x60213b88": [ - "getInitialWithdrawal()" - ], - "0x42d16748": [ - "getMinDailyWithdrawalLimit()" - ], - "0xd6b4ec12": [ - "getDailyWithdrawalLimit()" - ], - "0x262c0b72": [ - "getPayoutFreezePeriod()" - ], - "0xb6cb405b": [ - "getContractor()" - ], - "0x43bf718e": [ - "getHashOfTheProposalDocument()" - ], - "0x0c0662a8": [ - "getLastWithdrawal()" - ], - "0xb29ae23f": [ - "getDateOfSignature()" - ], - "0x59dc735c": [ - "getClient()" - ], - "0x72b75585": [ - "getOriginalClient()" - ], - "0xa00ce377": [ - "getIsContractValid()" - ], - "0xd44f2d3d": [ - "getInitialWithdrawalDone()" - ], - "0x1f7b8622": [ - "getVotingDeadline()" - ], - "0x2ca15122": [ - "sign()" - ], - "0xedfbf7b6": [ - "setVotingDeadline(uint256)" - ], - "0x6a7fc8b7": [ - "setDailyWithdrawLimit(uint128)" - ], - "0x0c08bf88": [ - "terminate()" - ], - "0x3ccfd60b": [ - "withdraw()" - ], - "0x14918f5e": [ - "performInitialWithdrawal()" - ], - "0xb6ed9f15": [ - "PFOffer(address,address,bytes,uint256,uint256,uint128)" - ], - "0x350d141e": [ - "getWasApprovedBeforeDeadline()" - ], - "0x20768ee8": [ - "getProposalID()" - ], - "0xffb7bfba": [ - "watchProposal(uint256)" - ], - "0xe45ebe93": [ - "checkVoteStatus()" - ], - "0x5d268629": [ - "Refund()" - ], - "0x29f1bff4": [ - "withdrawFromChildDAO(uint256)" - ], - "0x943b0747": [ - "RewardOffer(address,address,bytes,uint256,uint256,uint128,uint256)" - ], - "0x1632070c": [ - "setRewardDivisor(uint256)" - ], - "0xe32e9f22": [ - "setDeploymentReward(uint256)" - ], - "0xe9540395": [ - "getRewardDivisor()" - ], - "0x525b25b1": [ - "getDeploymentReward()" - ], - "0x51cff8d9": [ - "withdraw(address)" - ], - "0xbaac5300": [ - "createTokenProxy(address)" - ], - "0x590e1ae3": [ - "refund()" - ], - "0x1f2dc5ef": [ - "divisor()" - ], - "0x69431ab6": [ - "TokenCreation(uint256,uint256,address,string,string,uint8)" - ], - "0x36dfe260": [ - "payOneTimeReward()" - ], - "0x7842a3a4": [ - "payReward()" - ], - "0xadf59f99": [ - "query(uint256,string,string)" - ], - "0xc51be90f": [ - "query_withGasLimit(uint256,string,string,uint256)" - ], - "0x77228659": [ - "query2(uint256,string,string,string)" - ], - "0x85dee34c": [ - "query2_withGasLimit(uint256,string,string,string,uint256)" - ], - "0x524f3889": [ - "getPrice(string)" - ], - "0x2ef3accc": [ - "getPrice(string,uint256)" - ], - "0x60f66701": [ - "useCoupon(string)" - ], - "0x688dcfd7": [ - "setProofType(bytes1)" - ], - "0x38cc4831": [ - "getAddress()" - ], - "0x6b3fdc5a": [ - "oraclize_setNetwork(uint8)" - ], - "0x489306eb": [ - "oraclize_query(string,string)" - ], - "0x7975c56e": [ - "oraclize_query(uint256,string,string)" - ], - "0x056e1059": [ - "oraclize_query(uint256,string,string,uint256)" - ], - "0xae152cf4": [ - "oraclize_query(string,string,uint256)" - ], - "0x346b306a": [ - "oraclize_query(string,string,string)" - ], - "0x5731f357": [ - "oraclize_query(uint256,string,string,string)" - ], - "0x65a4dfb3": [ - "oraclize_query(uint256,string,string,string,uint256)" - ], - "0x2c85f8e0": [ - "oraclize_query(string,string,string,uint256)" - ], - "0xbcf175c8": [ - "oraclize_cbAddress()" - ], - "0xd7c26adb": [ - "oraclize_setProof(bytes1)" - ], - "0xa6823189": [ - "parseAddr(string)" - ], - "0xe8641652": [ - "strCompare(string,string)" - ], - "0x8a0807b7": [ - "indexOf(string,string)" - ], - "0xff74927b": [ - "strConcat(string,string)" - ], - "0x42346c5e": [ - "parseInt(string)" - ], - "0xbf4d89b5": [ - "parseInt(string,uint256)" - ], - "0xac996e7e": [ - "resolvePledging()" - ], - "0x45a3b0bf": [ - "resolveFailPledge()" - ], - "0x299e7318": [ - "resolveVoting()" - ], - "0x921f98bb": [ - "resolveFailVote()" - ], - "0x1afccfa5": [ - "Proposal(address,address,address,bytes,bool)" - ], - "0xaed8f3da": [ - "partsPerBillion(uint256,uint256)" - ], - "0x1ba326c4": [ - "calcShare(uint256,uint256,uint256)" - ], - "0xd630bd53": [ - "pledgeApprove(uint256)" - ], - "0x40b31937": [ - "pledgeDecline(uint256)" - ], - "0xdacaeb07": [ - "pledge(bool,uint256)" - ], - "0x5a9b0b89": [ - "getInfo()" - ], - "0x4e69d560": [ - "getStatus()" - ], - "0x6386c1c7": [ - "getUserInfo(address)" - ], - "0x7daa10ce": [ - "getMyInfo()" - ], - "0xd78c20ff": [ - "voteApprove(uint256)" - ], - "0x27a5c7c6": [ - "voteDecline(uint256)" - ], - "0x10e6e06c": [ - "vote(bool,uint256)" - ], - "0x052b81c7": [ - "releaseBadges()" - ], - "0xa96f8668": [ - "releaseTokens()" - ], - "0xed01bf29": [ - "budget()" - ], - "0xdcc0ccf3": [ - "Dao(address)" - ], - "0x8a3bc2bc": [ - "iPropose(bytes,uint256,bool)" - ], - "0xbade6033": [ - "propose(bytes,uint256)" - ], - "0xd205ad7d": [ - "proposeDissolve(bytes)" - ], - "0xc7f758a8": [ - "getProposal(uint256)" - ], - "0xc89f2ce4": [ - "funds()" - ], - "0xc4254c7b": [ - "CoreWallet()" - ], - "0xb69ef8a8": [ - "balance()" - ], - "0x67c2a360": [ - "authorizeUser(address)" - ], - "0x478aa69e": [ - "unauthorizeUser(address)" - ], - "0x267c8507": [ - "authorizeManager(address)" - ], - "0x17623e5b": [ - "unauthorizeManager(address)" - ], - "0xf3fef3a3": [ - "withdraw(address,uint256)" - ], - "0xc8c01a55": [ - "request(address,uint256)" - ], - "0xb759f954": [ - "approve(uint256)" - ], - "0xa0355f4e": [ - "decline(uint256)" - ], - "0xfedfd535": [ - "Config()" - ], - "0xf697a0ed": [ - "ppb(uint256,uint256)" - ], - "0xab519020": [ - "calcShare(uint256,uint256)" - ], - "0x6d568c43": [ - "weiToCents(uint256)" - ], - "0x4a5dddd2": [ - "proxyPurchase(address)" - ], - "0x8de93222": [ - "purchase(address,uint256)" - ], - "0x1959a002": [ - "userInfo(address)" - ], - "0x85b31d7b": [ - "myInfo()" - ], - "0x4551b1d7": [ - "ProxyPayment(address,address)" - ], - "0x6d98e9fc": [ - "totalWei()" - ], - "0xf0e959f9": [ - "TokenSales(address)" - ], - "0xbc126ba1": [ - "totalCents()" - ], - "0xdb83694c": [ - "getSaleInfo()" - ], - "0xddeae033": [ - "claimFor(address)" - ], - "0x0c77a697": [ - "claimFounders()" - ], - "0x7d3d6522": [ - "goalReached()" - ], - "0x1ed24195": [ - "getPeriod()" - ], - "0x0b97bc86": [ - "startDate()" - ], - "0x3f5b7675": [ - "periodTwo()" - ], - "0xbb7859b5": [ - "periodThree()" - ], - "0xc24a0f8b": [ - "endDate()" - ], - "0xa4fd6f56": [ - "isEnded()" - ], - "0x8d68cf59": [ - "sendFunds()" - ], - "0x5bd74490": [ - "regProxy(address,address)" - ], - "0x8c0e2a31": [ - "regProxy(address)" - ], - "0xb7fba4d3": [ - "getProxy(address)" - ], - "0x8006745b": [ - "getPayout(address)" - ], - "0xa69df4b5": [ - "unlock()" - ], - "0x8c3c4b34": [ - "getSaleStatus()" - ], - "0xcea943ee": [ - "getSaleConfig()" - ], - "0x034187fd": [ - "setEthToCents(uint256)" - ], - "0xb1adc241": [ - "BalanceDB()" - ], - "0x6c9c2faf": [ - "getSupply()" - ], - "0xf8b2cb4f": [ - "getBalance(address)" - ], - "0xe30443bc": [ - "setBalance(address,uint256)" - ], - "0x21e5383a": [ - "addBalance(address,uint256)" - ], - "0xcf8eeb7e": [ - "subBalance(address,uint256)" - ], - "0xd70cf105": [ - "moveBalance(address,address,uint256)" - ], - "0xf2371fb3": [ - "grantGiveableKudos(address,uint256)" - ], - "0xce79add1": [ - "givableBalanceOf(address)" - ], - "0x2b25a7e4": [ - "giveKudos(address,uint256)" - ], - "0x1dbf3bc7": [ - "spend(uint256)" - ], - "0xda1441cd": [ - "KudosBank(uint256)" - ], - "0xf009347d": [ - "KudosProxy(address)" - ], - "0xf2fde38b": [ - "transferOwnership(address)" - ], - "0xdf32754b": [ - "owned()" - ], - "0xb2aac51f": [ - "lookupUser(string)" - ], - "0x0e54b872": [ - "registerUser(string,address)" - ], - "0xd40a71fb": [ - "step1()" - ], - "0x8f4ed333": [ - "step2()" - ], - "0xdf4ec249": [ - "step3()" - ], - "0xfb5d7376": [ - "step4()" - ], - "0x4fb4bcec": [ - "step5()" - ], - "0xeb7c6f72": [ - "step6()" - ], - "0xbddd3a6b": [ - "step7()" - ], - "0xa3221c8e": [ - "step8()" - ], - "0x0a9254e4": [ - "setUp()" - ], - "0x775c300c": [ - "deploy()" - ], - "0x845051d3": [ - "testContractsNotNull()" - ], - "0x354b2735": [ - "testDeploy()" - ], - "0x9380b8e7": [ - "testFailAddingMembers()" - ], - "0xd83a8d11": [ - "testProposing()" - ], - "0xc1257bad": [ - "testPassingAProposal()" - ], - "0x524e4e61": [ - "testDistribution()" - ], - "0xb0166b04": [ - "testTransferringMkr()" - ], - "0x867904b4": [ - "issue(address,uint256)" - ], - "0x1de38038": [ - "makercoin(uint256)" - ], - "0x775a8f5e": [ - "toBytes(uint256)" - ], - "0xc490a266": [ - "toUInt(bytes)" - ], - "0x1f8947c1": [ - "extractUint(int256,bytes,uint256,uint256)" - ], - "0x0761a004": [ - "step(uint256,bytes)" - ], - "0x7b352962": [ - "isFinished()" - ], - "0xcf31e9fe": [ - "getOutputHash()" - ], - "0x3c9a4baa": [ - "requestOutput(bytes)" - ], - "0xfd735602": [ - "executeN()" - ], - "0xc64e8bc0": [ - "executeN(uint256)" - ], - "0x665beae7": [ - "ExecutableBase(bytes)" - ], - "0xc58343ef": [ - "getRequest(uint256)" - ], - "0x7a479160": [ - "getRequestArgs(uint256)" - ], - "0x5944427b": [ - "getRequestResult(uint256)" - ], - "0xf95b5a58": [ - "getInitialAnswer(uint256)" - ], - "0xcaaf2dd7": [ - "getInitialAnswerResult(uint256)" - ], - "0xafc24e3d": [ - "getChallengeAnswer(uint256)" - ], - "0x0411bca8": [ - "getChallengeAnswerResult(uint256)" - ], - "0x13a396d8": [ - "getRequiredDeposit(bytes)" - ], - "0x5023d124": [ - "TestFactory()" - ], - "0x9bee757b": [ - "requestExecution(bytes,uint256)" - ], - "0x3015394c": [ - "cancelRequest(uint256)" - ], - "0x5ea187c9": [ - "BuildByteArray(bytes)" - ], - "0xc70d169d": [ - "answerRequest(uint256,bytes)" - ], - "0xe10e5dce": [ - "_build(bytes)" - ], - "0xa8978434": [ - "softResolveAnswer(uint256)" - ], - "0x8143f8a8": [ - "totalGas(bytes)" - ], - "0xfcce2622": [ - "challengeAnswer(uint256,bytes)" - ], - "0x8e3d4e5e": [ - "Fibonacci(bytes)" - ], - "0x7b0383b2": [ - "initializeDispute(uint256)" - ], - "0x6dc3edcf": [ - "executeExecutable(uint256,uint256)" - ], - "0x05261aea": [ - "finalize(uint256)" - ], - "0x96e438a1": [ - "reclaimDeposit(uint256)" - ], - "0x29d28aad": [ - "Broker(address)" - ], - "0x5d3c1d4c": [ - "_getRequest(uint256)" - ], - "0xa6b1caa3": [ - "gasScalar(uint256)" - ], - "0xaf29e720": [ - "remainingGasFund(uint256)" - ], - "0x6835f32c": [ - "build(bytes)" - ], - "0x7ae2b5c7": [ - "min(uint256,uint256)" - ], - "0x53770f9a": [ - "isStateless()" - ], - "0x9c5d7030": [ - "reimburseGas(uint256,address,uint256,uint256)" - ], - "0x5d8227e6": [ - "FactoryBase(string,string,string)" - ], - "0xd8f012c6": [ - "StatelessFactory(string,string,string)" - ], - "0x03427656": [ - "getDefaultSoftResolutionBlocks()" - ], - "0x4f223fe3": [ - "StatefulFactory(string,string,string)" - ], - "0xf1448e10": [ - "requestExecution(bytes)" - ], - "0x4c0e207a": [ - "__outputCallback(uint256)" - ], - "0xd6c19fe0": [ - "build(bytes,uint256,uint256,address)" - ], - "0xe59d843a": [ - "Replicator(bytes,uint256,uint256,address)" - ], - "0x50c42921": [ - "replicate()" - ], - "0xb0604a26": [ - "schedule()" - ], - "0xdda3342b": [ - "ReplicatorFactory()" - ], - "0xa6b197aa": [ - "Order(address,uint256)" - ], - "0x67b830ad": [ - "fillOrder(uint256)" - ], - "0x9c7264d7": [ - "fillOrder(address,uint256)" - ], - "0xafd8c8c4": [ - "GasProxy(address,address)" - ], - "0x16f3cb5e": [ - "__kill()" - ], - "0x4d536fe3": [ - "doit()" - ], - "0x881be8f7": [ - "undo()" - ], - "0x60fe47b1": [ - "set(uint256)" - ], - "0x5bec9e67": [ - "infinite()" - ], - "0xce869a64": [ - "fails()" - ], - "0x1aca00fd": [ - "variable(uint256)" - ], - "0xd81ab0c1": [ - "invoke(uint256,address,address,bytes)" - ], - "0xf666323e": [ - "UUIDProvider()" - ], - "0x60585358": [ - "getByte()" - ], - "0x4b0bbf84": [ - "addEntropy()" - ], - "0x5404bbf7": [ - "getEntropy()" - ], - "0x31757f2e": [ - "collisionCount()" - ], - "0x352d2790": [ - "UUID4()" - ], - "0xd69450d5": [ - "setUUID4Bytes(bytes)" - ], - "0x3ae01f84": [ - "USDOracle()" - ], - "0x104d5fdd": [ - "getPriceProxy()" - ], - "0x531b97d7": [ - "oneCentOfWei()" - ], - "0xb845c9a2": [ - "WEI()" - ], - "0x1bf6c21b": [ - "USD()" - ], - "0x943a32bc": [ - "Relay(address)" - ], - "0x6edbd134": [ - "hasHash()" - ], - "0xb00140aa": [ - "getHash(bytes)" - ], - "0x54ed7b6e": [ - "addHash(bytes)" - ], - "0xe1041d86": [ - "__throw()" - ], - "0x25495998": [ - "getMinimumConsumerDeposit()" - ], - "0xf1076703": [ - "getVerificationId(address,bytes,bytes)" - ], - "0x8e2c6f4d": [ - "initiateVerification(address,bytes,bytes)" - ], - "0x5714f6a1": [ - "getTotalAvailableRelays()" - ], - "0xd2fb8787": [ - "recordExists(bytes)" - ], - "0x8e52cb51": [ - "getRecordKey(bytes,bytes,bytes)" - ], - "0x9ee035c9": [ - "lookupCanonicalFormat(bytes)" - ], - "0x50ea1932": [ - "lookupISO3116_1_alpha_2(bytes)" - ], - "0xfa68b4ce": [ - "lookupISO3116_1_alpha_3(bytes)" - ], - "0xd98d011d": [ - "getCandidateKey(bytes,bytes,bytes,bytes)" - ], - "0x70b1d9d4": [ - "requestCanonicalFormat(bytes)" - ], - "0x27bc39c0": [ - "submitCanonicalCandidate(bytes,bytes,bytes,bytes)" - ], - "0xe9dc0614": [ - "vote(bytes)" - ], - "0xa553a597": [ - "configure(uint256,uint256,uint8,address)" - ], - "0x2852b71c": [ - "accept()" - ], - "0x4dc415de": [ - "reject()" - ], - "0xc631b292": [ - "closeVoting()" - ], - "0x378a2178": [ - "tallyVotes()" - ], - "0xbc5d0f65": [ - "beginExecution()" - ], - "0x8124bb0f": [ - "continueExecution()" - ], - "0xcabd27de": [ - "Motion(address)" - ], - "0xcc2c2bcf": [ - "MotionFactory(string,string,string)" - ], - "0x6ad2a0b3": [ - "buildContract(address)" - ], - "0x0a3b0a4f": [ - "add(address)" - ], - "0x29092d0e": [ - "remove(address)" - ], - "0xf6a3d24e": [ - "exists(address)" - ], - "0xefc81a8c": [ - "create()" - ], - "0x207c64fb": [ - "validate(address)" - ], - "0x5bb47808": [ - "setFactory(address)" - ], - "0x1327d3d8": [ - "setValidator(address)" - ], - "0x68f5aa0f": [ - "setShareholderDB(address)" - ], - "0x8f99ea43": [ - "setDividendDB(address)" - ], - "0x62e05175": [ - "setMotionDB(address)" - ], - "0x611f69de": [ - "__proxy_motion(address,uint256,uint256,bytes)" - ], - "0x144fa6d7": [ - "setToken(address)" - ], - "0x13827950": [ - "getShareholderDB()" - ], - "0x299a7bcc": [ - "setOwner(address,address)" - ], - "0xf340fa01": [ - "deposit(address)" - ], - "0x9555a942": [ - "withdrawFrom(address,address,uint256)" - ], - "0x3b8e6f2e": [ - "balanceAt(address,uint256)" - ], - "0x3397ca17": [ - "numBalanceRecords(address)" - ], - "0xcbf1304d": [ - "balances(address,uint256)" - ], - "0x9a97043b": [ - "depositIdx(address)" - ], - "0xb9f28076": [ - "historyIdx(address)" - ], - "0xa0afd731": [ - "dividendBalance(address)" - ], - "0xbbd4e8c9": [ - "numDeposits()" - ], - "0xb6b55f25": [ - "deposit(uint256)" - ], - "0x311d5a2a": [ - "recordBalance(address)" - ], - "0x5437b39b": [ - "hasUnprocessedDividends(address)" - ], - "0x57f4d5ec": [ - "processDividends(address,uint256)" - ], - "0xe7334156": [ - "processNextDeposit(address)" - ], - "0x7f480f9d": [ - "processDividends(address)" - ], - "0xb89a73cb": [ - "isShareholder(address)" - ], - "0x08933d11": [ - "getJoinBlock(address)" - ], - "0xa200dc73": [ - "getNextShareholder(address)" - ], - "0xb722a9ef": [ - "getPreviousShareholder(address)" - ], - "0xc45aa04c": [ - "queryShareholders(bytes,uint256)" - ], - "0xdb29fe12": [ - "addShareholder(address)" - ], - "0x9babdad6": [ - "removeShareholder(address)" - ], - "0x8e2a6470": [ - "allocateShares(address,uint256)" - ], - "0x4d47feaa": [ - "ShareholderDB(uint256)" - ], - "0xa4898fd5": [ - "deployContract(address)" - ], - "0x96c52fc3": [ - "____forward(address,uint256,uint256,bytes)" - ], - "0x567dbf18": [ - "__forward(address,uint256,uint256,bytes)" - ], - "0xfd782de5": [ - "Proxy()" - ], - "0xb36df681": [ - "ExecutableBase()" - ], - "0x6f698fb5": [ - "setMinimumQuorum(uint256)" - ], - "0xa140e79c": [ - "setMinimumDebatePeriod(uint256)" - ], - "0x00e46700": [ - "setMinimumPassPercentage(uint8)" - ], - "0xb7c93330": [ - "ResourcePoolTester()" - ], - "0xf59f99ee": [ - "createNextGeneration()" - ], - "0x0bebd0f9": [ - "addAddressToGeneration(address,uint256)" - ], - "0xf8b11853": [ - "getGenerationStartAt(uint256)" - ], - "0x306b031d": [ - "getGenerationEndAt(uint256)" - ], - "0x67854643": [ - "getGenerationMemberLength(uint256)" - ], - "0x38fff2d0": [ - "getPoolId()" - ], - "0xc831391d": [ - "getPoolOverlapSize()" - ], - "0x61649472": [ - "getPoolFreezePeriod()" - ], - "0xed2b8e0b": [ - "getPoolRotationDelay()" - ], - "0xc630f92b": [ - "canEnterPool()" - ], - "0x8dd5e298": [ - "canEnterPool(address)" - ], - "0x50a3bd39": [ - "enterPool()" - ], - "0xffd10e07": [ - "enterPool(address)" - ], - "0x5a5383ac": [ - "canExitPool()" - ], - "0xb010d94a": [ - "canExitPool(address)" - ], - "0x29917954": [ - "exitPool()" - ], - "0xba5a2d33": [ - "exitPool(address)" - ], - "0xb0171fa4": [ - "getCurrentGenerationId()" - ], - "0xa502aae8": [ - "getNextGenerationId()" - ], - "0x7772a380": [ - "isInGeneration(address,uint256)" - ], - "0x7c47965e": [ - "isInCurrentGeneration()" - ], - "0x400aae08": [ - "isInCurrentGeneration(address)" - ], - "0x125b8f06": [ - "isInNextGeneration()" - ], - "0xd1734eac": [ - "isInNextGeneration(address)" - ], - "0x1ae460e5": [ - "isInPool()" - ], - "0x8baced64": [ - "isInPool(address)" - ], - "0x23306ed6": [ - "getMinimumBond()" - ], - "0x3cbfed74": [ - "getBondBalance()" - ], - "0x33613cbe": [ - "getBondBalance(address)" - ], - "0x741b3c39": [ - "depositBond()" - ], - "0xae6c0b03": [ - "canWithdrawBond(uint256)" - ], - "0x157ad5a1": [ - "canWithdrawBond(address,uint256)" - ], - "0xc3daab96": [ - "withdrawBond(uint256)" - ], - "0xeb947f19": [ - "ExampleResourcePool()" - ], - "0x2e817963": [ - "set_sdl(address)" - ], - "0x8757a2cd": [ - "test_depth(uint256,uint256)" - ], - "0x4afce471": [ - "test_requires_depth(uint16)" - ], - "0x135217e7": [ - "requires_depth()" - ], - "0x05d2f92a": [ - "check_depth(address,uint256)" - ], - "0x8e9ccd04": [ - "computeIndexId(address,bytes)" - ], - "0xfa80918b": [ - "computeNodeId(bytes,bytes)" - ], - "0x996a4be3": [ - "uintToBytes(uint256,uint256)" - ], - "0xcc8af0fe": [ - "bytesToUInt(bytes,bytes)" - ], - "0xa6f0e577": [ - "isLeapYear(uint16)" - ], - "0xb1999937": [ - "leapYearsBefore(uint256)" - ], - "0xb238ad0e": [ - "getDaysInMonth(uint8,uint16)" - ], - "0xf97d0591": [ - "parseTimestamp(uint256)" - ], - "0x92d66313": [ - "getYear(uint256)" - ], - "0xa324ad24": [ - "getMonth(uint256)" - ], - "0x65c72840": [ - "getDay(uint256)" - ], - "0x3e239e1a": [ - "getHour(uint256)" - ], - "0xfa93f883": [ - "getMinute(uint256)" - ], - "0x8aa001fc": [ - "getSecond(uint256)" - ], - "0x4ac1ad78": [ - "getWeekday(uint256)" - ], - "0x8c8d98a0": [ - "toTimestamp(uint16,uint8,uint8)" - ], - "0x7f791833": [ - "toTimestamp(uint16,uint8,uint8,uint8)" - ], - "0x62ba9687": [ - "toTimestamp(uint16,uint8,uint8,uint8,uint8)" - ], - "0x9054bdec": [ - "toTimestamp(uint16,uint8,uint8,uint8,uint8,uint8)" - ], - "0x136af582": [ - "next(bytes,bytes,bytes,bytes,bytes,bytes,bytes)" - ], - "0xa3ec5616": [ - "next(bytes,bytes,bytes,bytes,bytes,bytes,bytes,uint256)" - ], - "0x96f0aa8f": [ - "findNextSecond(uint256,bytes)" - ], - "0xc60ce271": [ - "findNextMinute(uint256,bytes)" - ], - "0x2f7f3ecf": [ - "findNextHour(uint256,bytes)" - ], - "0xdcaa5620": [ - "findNextWeekday(uint256,bytes)" - ], - "0x54d9d6f8": [ - "findNextDay(uint256,bytes)" - ], - "0xb245fc92": [ - "findNextMonth(uint256,bytes)" - ], - "0x8e280dce": [ - "findNextYear(uint256,bytes)" - ], - "0x7dc5cd32": [ - "_patternToNumber(bytes)" - ], - "0x7fc90182": [ - "Pool(uint256)" - ], - "0x96ff7e97": [ - "requestIdentity()" - ], - "0x998446a8": [ - "acceptRequest(uint256,bytes)" - ], - "0x2d7788db": [ - "rejectRequest(uint256)" - ], - "0x58e29e17": [ - "initiateProof()" - ], - "0x14cabddb": [ - "joinProof(uint256)" - ], - "0xae169a50": [ - "claimReward(uint256)" - ], - "0xc944a38e": [ - "CharlyLifeLog(string,int256)" - ], - "0xb60e72cc": [ - "log(string,uint256)" - ], - "0x09a399a7": [ - "personAdd(string,int256,int256,string)" - ], - "0x0af658ca": [ - "personUpdateActivity(uint256,bool)" - ], - "0x4a9b3f95": [ - "personUpdateName(uint256,string)" - ], - "0x0ce3151c": [ - "personUpdateRelation(uint256,string)" - ], - "0x61591a7c": [ - "personUpdateDOB(uint256,int256)" - ], - "0x98866c1a": [ - "personUpdateDOD(uint256,int256)" - ], - "0x524fa7b9": [ - "whitelistAdd(address)" - ], - "0xa932ed0d": [ - "whitelistRemove(address)" - ], - "0x2e1a7d4d": [ - "withdraw(uint256)" - ], - "0xed88c68e": [ - "donate()" - ], - "0x33298e25": [ - "invoke(uint256,uint256)" - ], - "0x2b30d2b8": [ - "invoke(uint256)" - ], - "0xc258ff74": [ - "List()" - ], - "0x959ac484": [ - "push(uint256)" - ], - "0x2b16b56a": [ - "setIndex(uint256,uint256)" - ], - "0x1f7b6d32": [ - "length()" - ], - "0x8e7cb6e1": [ - "getIndex(uint256)" - ], - "0x57dc9760": [ - "DaoChallenge()" - ], - "0x083b2732": [ - "callback()" - ], - "0x6d4ce63c": [ - "get()" - ], - "0xd09de08a": [ - "increment()" - ], - "0xc3ee6311": [ - "lockAndCall(string)" - ], - "0xe94acf0e": [ - "TinyRouter(address)" - ], - "0x39e525f9": [ - "resolveCallback(uint256)" - ], - "0x302d350e": [ - "firstChainedCallback(uint256)" - ], - "0x539e2bfb": [ - "secondChainedCallback(uint256)" - ], - "0x4f896d4f": [ - "resolve(uint256)" - ], - "0x9935935f": [ - "setResolveHandler(bytes,address)" - ], - "0x5dc77e26": [ - "andThen(string,address)" - ], - "0x7c45ef6c": [ - "stringToSig(string,string)" - ], - "0xbf8783e0": [ - "callAndGetReturn(address,bytes,uint256)" - ], - "0x9ed93318": [ - "create(address)" - ], - "0xd7bb99ba": [ - "contribute()" - ], - "0xc98165b6": [ - "createTarget()" - ], - "0x6493d7fc": [ - "CircuitBreaker(address,address,uint256,uint256)" - ], - "0xb7760c8f": [ - "transfer(uint256,address)" - ], - "0xa83627de": [ - "updatePeriod()" - ], - "0x8e5d97a2": [ - "releasePendingTransfer(uint256)" - ], - "0x66e5cb50": [ - "stopTransfer(uint256)" - ], - "0x75862df4": [ - "TokenWithEStop(address)" - ], - "0x63a599a4": [ - "emergencyStop()" - ], - "0xd0e30db0": [ - "deposit()" - ], - "0xe2faf044": [ - "createDAO(address,uint256,uint256,uint256)" - ], - "0xcc25decd": [ - "SampleOffer(address,bytes,uint256,uint256,uint256,uint256,uint256)" - ], - "0x3535cd52": [ - "setDailyCosts(uint256)" - ], - "0xd4065763": [ - "returnRemainingMoney()" - ], - "0x9b29cb23": [ - "getDailyPayment()" - ], - "0xd002462b": [ - "setDeploymentFee(uint256)" - ], - "0xea25f24a": [ - "TokenCreation(uint256,uint256,address)" - ], - "0x704b6c02": [ - "setAdmin(address)" - ], - "0x29090202": [ - "Resolver(address)" - ], - "0xd393c871": [ - "register(string,address,uint256)" - ], - "0x18b31f94": [ - "registerLengthFunction(string,string,address)" - ], - "0x32b12eac": [ - "setFallback(address)" - ], - "0xc3b2556d": [ - "lookup(bytes)" - ], - "0xdc3f65d3": [ - "createdByMe()" - ], - "0x05215b2f": [ - "createStandardToken(uint256)" - ], - "0x7102c138": [ - "Standard_Token(uint256)" - ], - "0xfe01f1ff": [ - "TokenTester()" - ], - "0xa30b5c69": [ - "AttributeModel()" - ], - "0xc27d7721": [ - "create(uint256[101][])" - ], - "0x67f12ecf": [ - "validate(address,uint256,uint256[101][])" - ], - "0x63e38ff3": [ - "id_for_nym(uint256)" - ], - "0xcabfb934": [ - "replace(address)" - ], - "0xbd119967": [ - "add_rating(uint256,uint256)" - ], - "0x8f70009d": [ - "id_for_address(address,address)" - ], - "0x3b107682": [ - "DualIndex()" - ], - "0x43b0e8df": [ - "set(uint256,uint256,uint256)" - ], - "0xf0350c04": [ - "transfer_ownership(address)" - ], - "0xb4b9d1f1": [ - "lookup(uint256,uint256)" - ], - "0x272cda88": [ - "EternalDB()" - ], - "0x06661abd": [ - "count()" - ], - "0xcccf7a8e": [ - "has(uint256)" - ], - "0x9c851ebc": [ - "new_entry()" - ], - "0x505fb46c": [ - "add(uint256,uint256,uint256)" - ], - "0x25010816": [ - "get_length(uint256,uint256)" - ], - "0x58e59c32": [ - "get_entry(uint256,uint256,uint256)" - ], - "0x89029d8c": [ - "get_all(uint256,uint256)" - ], - "0x41ee903e": [ - "clear(uint256,uint256)" - ], - "0x1a10cfc3": [ - "delete_entry(uint256,uint256,uint256)" - ], - "0xf739ed4c": [ - "id_for_user_version(uint256,uint256)" - ], - "0x23cd7cd5": [ - "Model()" - ], - "0x3fda1281": [ - "get_keys()" - ], - "0x41d31feb": [ - "get_read_only_keys()" - ], - "0x582ca57b": [ - "get_associations()" - ], - "0x8ee21b8e": [ - "get_default_keys()" - ], - "0xeb121e2f": [ - "update(uint256,uint256[101][])" - ], - "0x595da94d": [ - "has_owners(uint256)" - ], - "0xd716222c": [ - "is_owner(uint256,address)" - ], - "0xb56b2627": [ - "add_owner(uint256,address)" - ], - "0x9d118770": [ - "destroy(uint256)" - ], - "0xdb6fcf01": [ - "is_destroyed(uint256)" - ], - "0xebd83378": [ - "get_blocks_for(uint256)" - ], - "0x49fb2dc5": [ - "add_to_association(uint256,uint256,uint256)" - ], - "0xe2deaa81": [ - "set_reference(uint256,uint256,uint256)" - ], - "0xf99ff4df": [ - "paged(uint256,uint256)" - ], - "0xa60bbcd3": [ - "ModelCoordinator()" - ], - "0x702fc7da": [ - "ReviewModel()" - ], - "0xe299beb3": [ - "SimpleIndex()" - ], - "0x1ab06ee5": [ - "set(uint256,uint256)" - ], - "0x0a874df6": [ - "lookup(uint256)" - ], - "0x39246d75": [ - "VersionModel()" - ], - "0x5c8a1053": [ - "extend(string)" - ], - "0x43d726d6": [ - "close()" - ], - "0x00ce2057": [ - "triggerPayment()" - ], - "0x4a3b0eec": [ - "authorizeOpen(uint256,bool,string)" - ], - "0xfdc4b338": [ - "authorizeExtension(uint256,bool,string)" - ], - "0x59d96db5": [ - "terminate(uint256,string)" - ], - "0x8ae475a9": [ - "notorize(string)" - ], - "0xb5d1990d": [ - "numRecords()" - ], - "0x4fb2e45d": [ - "transferOwner(address)" - ], - "0x29c08ba2": [ - "payPremium()" - ], - "0x0220a5b4": [ - "terminate(string)" - ], - "0x83f95f13": [ - "openClaim(string)" - ], - "0x1c1b8772": [ - "update(address)" - ], - "0xe6cb9013": [ - "safeAdd(uint256,uint256)" - ], - "0xa293d1e8": [ - "safeSub(uint256,uint256)" - ], - "0x6241bfd1": [ - "Token(uint256)" - ], - "0x0aa7881a": [ - "MintableToken(int256,uint256)" - ], - "0x27e056a5": [ - "addMinter(int256,address)" - ], - "0xad2fea7c": [ - "removeMinter(int256,address)" - ], - "0x1f3a3a53": [ - "mint(int256,uint256)" - ], - "0x2c7c4549": [ - "PurchasableToken(uint256)" - ], - "0x6a61e5fc": [ - "setTokenPrice(uint256)" - ], - "0xefef39a1": [ - "purchase(uint256)" - ], - "0x2f30283e": [ - "testSomething()" - ], - "0x3e5087cc": [ - "testBasicThing()" - ], - "0x4bbb216c": [ - "_target(address)" - ], - "0xa163a624": [ - "Test()" - ], - "0xa9cc4718": [ - "fail()" - ], - "0x0c9fd581": [ - "assertTrue(bool)" - ], - "0x5eb3f639": [ - "assertTrue(bool,bytes)" - ], - "0xa5982885": [ - "assertFalse(bool)" - ], - "0x16cb9a01": [ - "assertFalse(bool,bytes)" - ], - "0xf578fd85": [ - "assertEq0(bytes,bytes)" - ], - "0x7fa22001": [ - "assertEq0(bytes,bytes,bytes)" - ], - "0xd1af8a5a": [ - "LinkerExample()" - ], - "0x8af784dc": [ - "expectEventsExact(address)" - ], - "0xd38159b8": [ - "testPass()" - ], - "0x04d91c6a": [ - "testFail()" - ], - "0xc813c30e": [ - "testThrowSomething()" - ], - "0xfac34ff6": [ - "throwFoo()" - ], - "0x7fcf3a2f": [ - "throwFooBar()" - ], - "0x0db73c72": [ - "noevent()" - ], - "0x4f9d719e": [ - "testEvent()" - ], - "0x8bbb5af7": [ - "test1Fails()" - ], - "0x88a1e895": [ - "test2Fails()" - ], - "0xfdc193a4": [ - "test3Fails()" - ], - "0xdbecc372": [ - "Example(uint256)" - ], - "0x934bc29d": [ - "exampleFunction(uint256)" - ], - "0x3c67c51e": [ - "testLogs()" - ], - "0xe44d3084": [ - "testFailure()" - ], - "0x94bcdb4c": [ - "Example2()" - ], - "0xa677fbd9": [ - "example2Func()" - ], - "0x773c84ee": [ - "exec(address,bytes,uint256,uint256)" - ], - "0xf3541901": [ - "execute(address,bytes,uint256,uint256)" - ], - "0x1b437d0c": [ - "compareLastCalldata(bytes)" - ], - "0xdcfa9cc0": [ - "testProxyCall()" - ], - "0x2d2c44f2": [ - "Vault()" - ], - "0x0b6142fc": [ - "breach()" - ], - "0x6c050eae": [ - "look()" - ], - "0x04a2b2c2": [ - "testOwnerCanBreach()" - ], - "0x94a1710d": [ - "testNonOwnerCantBreach()" - ], - "0xb4c4e005": [ - "testTransferToAcceptAuthority()" - ], - "0xe17e1274": [ - "testTransferToRejectAuthority()" - ], - "0x2b1071c9": [ - "testTransferToNullAuthority()" - ], - "0xf0f967e8": [ - "canCall(address,address,bytes)" - ], - "0xe6d95eb8": [ - "DSAuthorized()" - ], - "0x57e6c2f4": [ - "isAuthorized()" - ], - "0xe2b178a0": [ - "getAuthority()" - ], - "0x6cd22eaf": [ - "updateAuthority(address,bool)" - ], - "0xfe9fbb80": [ - "isAuthorized(address)" - ], - "0x3c716e08": [ - "updateAuthority(address)" - ], - "0xed62cf1f": [ - "setCanCall(address,address,bytes,bool)" - ], - "0xc37e8cb2": [ - "testExportAuthorized()" - ], - "0xb870ecbb": [ - "testNormalWhitelistAdd()" - ], - "0x19f02ceb": [ - "set(address,address,uint256)" - ], - "0xd81e8423": [ - "get(address,address)" - ], - "0xf639365d": [ - "testSetGet()" - ], - "0x8b95ec0c": [ - "testAddBalance()" - ], - "0x6dbe31eb": [ - "testSubBalance()" - ], - "0x65f27bea": [ - "testSubBalanceFailsBelowZero()" - ], - "0xce220ecf": [ - "testAddBalanceFailsAboveOverflow()" - ], - "0x1bf20668": [ - "testAdminTransfer()" - ], - "0xd6d7d525": [ - "get(bytes)" - ], - "0xa18c751e": [ - "set(bytes,bytes)" - ], - "0x73e1743a": [ - "buildDSBasicAuthority()" - ], - "0x7d4cf602": [ - "buildDSBalanceDB()" - ], - "0xacf4280c": [ - "buildDSApprovalDB()" - ], - "0x089e0ad0": [ - "buildDSMap()" - ], - "0x2bed55b0": [ - "buildDSEasyMultisig(uint256,uint256,uint256)" - ], - "0x3647b87a": [ - "buildFactory()" - ], - "0x9e2262f5": [ - "testCreateCostData()" - ], - "0x386fcda8": [ - "testCreateCostToken()" - ], - "0x4e6ba0a9": [ - "testCreateCostMultisig()" - ], - "0x7c05caf3": [ - "testCreateCostAuth()" - ], - "0x5b067cce": [ - "testCreateCostMain()" - ], - "0xb06eb03f": [ - "DSEasyMultisig(uint256,uint256,uint256)" - ], - "0xca6d56dc": [ - "addMember(address)" - ], - "0xa230c524": [ - "isMember(address)" - ], - "0xf6d5959b": [ - "getActionStatus(uint256)" - ], - "0xff1b4341": [ - "easyPropose(address,uint256,uint256)" - ], - "0x268bb78e": [ - "propose(address,bytes,uint256,uint256)" - ], - "0xba0179b5": [ - "confirm(uint256)" - ], - "0xed684cc6": [ - "trigger(uint256)" - ], - "0xa6b206bf": [ - "doSomething(uint256)" - ], - "0xbca86986": [ - "testSetup()" - ], - "0x11d12402": [ - "testEasyPropose()" - ], - "0x246c02e6": [ - "check_depth(uint16)" - ], - "0x44602a7d": [ - "testFallbackReturn()" - ], - "0xbe45fd62": [ - "transfer(address,uint256,bytes)" - ], - "0x1b00fe51": [ - "testHypothesis()" - ], - "0xf06186c7": [ - "testReality()" - ], - "0xb09bc3bf": [ - "try_to_get()" - ], - "0xdabf7ec4": [ - "helper(uint256)" - ], - "0x8040cac4": [ - "testOverflow()" - ], - "0x828d671c": [ - "dyn_sig()" - ], - "0xe2f8feb2": [ - "internal_tester(int256)" - ], - "0xe0ad411d": [ - "assets(bytes)" - ], - "0x18178358": [ - "poke()" - ], - "0x6b1feeeb": [ - "get_my_sig()" - ], - "0xd57a12f5": [ - "testCheckSigs()" - ], - "0x60b431a4": [ - "testGetSig()" - ], - "0x189c94ae": [ - "testFallbackStaticSig()" - ], - "0x22017c5f": [ - "DSTokenBase(uint256)" - ], - "0xbeabacc8": [ - "transfer(address,address,uint256)" - ], - "0x15dacbea": [ - "transferFrom(address,address,address,uint256)" - ], - "0xe1f21c67": [ - "approve(address,address,uint256)" - ], - "0x003074ff": [ - "getFrontend()" - ], - "0xc971442c": [ - "getDBs()" - ], - "0x4956eaf0": [ - "deploy(address,uint256)" - ], - "0xf6c5c80d": [ - "cleanUp()" - ], - "0xb17b94c1": [ - "testSystem()" - ], - "0xe23941bc": [ - "testDepositWithdraw()" - ], - "0x1334a5e2": [ - "eventCallback(uint8,address,address,uint256)" - ], - "0x3018205f": [ - "getController()" - ], - "0x7fe1dc7e": [ - "getToken(bytes)" - ], - "0xef3a6031": [ - "testBaseToken()" - ], - "0xb085b9a5": [ - "Example()" - ], - "0x55241077": [ - "setValue(uint256)" - ], - "0x20965255": [ - "getValue()" - ], - "0x29d017b5": [ - "TestWithConstructor(address,uint256[])" - ], - "0x4b64e492": [ - "execute(address)" - ], - "0xf4b103d4": [ - "SimpleStorage(uint256)" - ], - "0xfc0c546a": [ - "token()" - ], - "0x90b98a11": [ - "sendCoin(address,uint256)" - ], - "0x01cb3b20": [ - "checkGoalReached()" - ], - "0xc0d2834b": [ - "DataSource()" - ], - "0x4b0697e4": [ - "Manager(address)" - ], - "0x044215c6": [ - "token(uint256)" - ], - "0x299e6b07": [ - "Wallet(address)" - ], - "0x93423e9c": [ - "getAccountBalance(address)" - ], - "0xbe999705": [ - "addFunds(uint256)" - ], - "0xbc4b3365": [ - "addFunds(address,uint256)" - ], - "0xa1a66e56": [ - "deductFunds(uint256)" - ], - "0x8d72a473": [ - "deductFunds(address,uint256)" - ], - "0x08aba5aa": [ - "setAccountBalance(uint256)" - ], - "0x46ddb7db": [ - "setAccountBalance(address,uint256)" - ], - "0xdb4cacec": [ - "Other()" - ], - "0x84a7b223": [ - "Canary(address)" - ], - "0x5c634241": [ - "CanaryV6()" - ], - "0xb5d3a379": [ - "CanaryTestnet()" - ], - "0x41868769": [ - "CallAborted(address,bytes)" - ], - "0x6560a307": [ - "suggestedGas()" - ], - "0xeec2b628": [ - "beforeExecute(address)" - ], - "0x980e8c81": [ - "FutureBlockCall(address,uint256,uint8,address,bytes,uint256,uint256,uint256)" - ], - "0x08f235ec": [ - "getDefaultPayment()" - ], - "0x21bacf28": [ - "getDefaultFee()" - ], - "0x75c589a0": [ - "getMinimumCallCost()" - ], - "0x6822abae": [ - "getMinimumCallCost(uint256)" - ], - "0x2635f4de": [ - "registerLibrary(bytes,address)" - ], - "0xc5ae6e0e": [ - "Kernal()" - ], - "0x2030f721": [ - "num_objects()" - ], - "0xc4bd8ebc": [ - "num_monsters()" - ], - "0xc13afa91": [ - "object_locations(uint256)" - ], - "0x1d5a9f3f": [ - "object_types(uint256)" - ], - "0xc0576b73": [ - "monsters(uint256)" - ], - "0xc368109c": [ - "monster_hp(uint256)" - ], - "0xa01bc729": [ - "monster_attack(uint256)" - ], - "0x75160a20": [ - "pay_royalties()" - ], - "0x26121ff0": [ - "f()" - ], - "0xaef99eef": [ - "Game()" - ], - "0xe604cf9f": [ - "get_all_squares()" - ], - "0xbe600276": [ - "move(uint16)" - ], - "0xf651bf44": [ - "move_to(uint16)" - ], - "0xa5f3c23b": [ - "add(int256,int256)" - ], - "0x37c390e3": [ - "allow_move(uint16)" - ], - "0xdcf537b1": [ - "multiply7(int256)" - ], - "0x16216f39": [ - "return13()" - ], - "0x6ed7c013": [ - "move_monsters()" - ], - "0xcec7260b": [ - "move_monster(uint16,uint16)" - ], - "0xecb98714": [ - "random_damage(uint256)" - ], - "0x2d8c1c35": [ - "level_up()" - ], - "0xf504e0da": [ - "load_level(uint16)" - ], - "0x99753de7": [ - "clear_level()" - ], - "0xde5d953a": [ - "logSingleIndex(bytes,bytes,uint256)" - ], - "0xb409da05": [ - "logDoubleIndex(bytes,bytes,bytes,uint256)" - ], - "0xb29a0308": [ - "logAnonymous(bytes,bytes,bytes,uint256)" - ], - "0x5f515226": [ - "checkBalance(address)" - ], - "0x7eaef50c": [ - "over()" - ], - "0x12c8052f": [ - "won()" - ], - "0x21970c0c": [ - "pay_royalty()" - ], - "0x4c1b2446": [ - "transmitInteger(address,bytes,bytes,uint256,uint16)" - ], - "0x42909a9e": [ - "create_game()" - ], - "0xe54d4051": [ - "receiveInteger(bytes,uint256,uint16)" - ], - "0x8365172c": [ - "num_levels()" - ], - "0x3ced842b": [ - "make_offer()" - ], - "0x48db5f89": [ - "player()" - ], - "0x6896fabf": [ - "getAccountBalance()" - ], - "0x5b86914d": [ - "bet_value()" - ], - "0x6e8dad74": [ - "retrieveAccountBalance(bytes,bytes)" - ], - "0x6d705ebb": [ - "register(address,uint256)" - ], - "0x46b5e202": [ - "set_num_levels(uint256,uint256)" - ], - "0xbfad16f4": [ - "new_offer(uint256,uint256)" - ], - "0x97d47a60": [ - "registerAccountant(bytes,address)" - ], - "0x19b05f49": [ - "accept(uint256)" - ], - "0xdf3c8620": [ - "num_challenges()" - ], - "0xc3d0a564": [ - "getAccountBalance(bytes)" - ], - "0xf249cf19": [ - "get_all_challenges()" - ], - "0x340f5e4e": [ - "get_all_num_levels()" - ], - "0x407cfe5e": [ - "get_all_players()" - ], - "0xd1a8d447": [ - "get_all_bet_values()" - ], - "0x7140bdf3": [ - "get_all_best_offers()" - ], - "0x6677febe": [ - "get_all_accepted()" - ], - "0x5718b994": [ - "checkEvent(address,bytes,bytes,uint256)" - ], - "0xf51cbc72": [ - "Level()" - ], - "0x7cb97b2b": [ - "set_owner(address)" - ], - "0x7212b67e": [ - "add_potion(uint16)" - ], - "0xdd729530": [ - "add_shield(uint16)" - ], - "0xcc2c5453": [ - "add_sword(uint16)" - ], - "0xf3c37bd5": [ - "Verifier(address,uint256,uint8)" - ], - "0xf262de8c": [ - "add_staircase(uint16)" - ], - "0x62c335c1": [ - "checkCallback(address,uint256,bytes,bytes)" - ], - "0xe97b2190": [ - "add_wall(uint16)" - ], - "0x37a6b9f8": [ - "recordCallback(address,uint256,bytes,bytes)" - ], - "0x79216f5f": [ - "add_monster(uint16,uint16,uint16)" - ], - "0x52efea6e": [ - "clear()" - ], - "0x4bb278f3": [ - "finalize()" - ], - "0xb651cbaf": [ - "add_level(address,bytes)" - ], - "0xc985c221": [ - "get_all_levels()" - ], - "0x309424fe": [ - "get_all_names()" - ], - "0x7365870b": [ - "bet(uint256)" - ], - "0xdf25ee23": [ - "getIndexId(address,bytes)" - ], - "0x8963dab4": [ - "getNodeId(bytes,bytes)" - ], - "0x0c5c2ca3": [ - "getIndexName(bytes)" - ], - "0x337c1e28": [ - "getIndexRoot(bytes)" - ], - "0xf64fca2e": [ - "getNodeId(bytes)" - ], - "0xaa272d4b": [ - "getNodeIndexId(bytes)" - ], - "0x5ca1c5a0": [ - "getNodeValue(bytes)" - ], - "0x662dbe96": [ - "getNodeHeight(bytes)" - ], - "0x3517a740": [ - "getNodeParent(bytes)" - ], - "0xc1b056b0": [ - "getNodeLeftChild(bytes)" - ], - "0x4296a9cb": [ - "getNodeRightChild(bytes)" - ], - "0xb0aab296": [ - "getNextNode(bytes)" - ], - "0x1b370abb": [ - "getPreviousNode(bytes)" - ], - "0x3943807b": [ - "insert(bytes,bytes,int256)" - ], - "0xbea124a6": [ - "query(bytes,bytes,int256)" - ], - "0xb7bae9b7": [ - "exists(bytes,bytes)" - ], - "0x69573648": [ - "remove(bytes,bytes)" - ], - "0xb7e24979": [ - "addThing(bytes)" - ], - "0xe51ff1fc": [ - "iterateOverThings()" - ], - "0x69307c80": [ - "rotateBits(bytes,int256)" - ], - "0x6506b623": [ - "rotateBitsLeft(bytes,uint256)" - ], - "0x109df68e": [ - "rotateBitsRight(bytes,uint256)" - ], - "0xc02f081a": [ - "shiftBits(bytes,int256)" - ], - "0x5e07f240": [ - "shiftBitsLeft(bytes,uint256)" - ], - "0xff27c476": [ - "shiftBitsRight(bytes,uint256)" - ], - "0x15e33901": [ - "digest(bytes,uint256)" - ], - "0x41c0e1b5": [ - "kill()" - ], - "0x780900dc": [ - "create(uint256)" - ], - "0xa1e4d3c2": [ - "MembershipRoster()" - ], - "0x76d690bb": [ - "BountyList()" - ], - "0x0b1ca49a": [ - "removeMember(address)" - ], - "0xee2af3fb": [ - "set_factory(address)" - ], - "0x5fb64fd6": [ - "checkMembership(address)" - ], - "0x10c4e8b0": [ - "all()" - ], - "0x85654c9c": [ - "setMembershipRoster(address)" - ], - "0xeb95b7d5": [ - "Bounty(address,address)" - ], - "0x0b7e9c44": [ - "payout(address)" - ], - "0x92e9fd5e": [ - "ColdWallet(address,address)" - ], - "0x8a4fb16a": [ - "getWithdrawal(uint256)" - ], - "0xd845a4b3": [ - "request(uint256)" - ], - "0xfe0d94c1": [ - "execute(uint256)" - ], - "0xf3b50c04": [ - "rescind()" - ], - "0x49c15bd9": [ - "Purchase()" - ], - "0x35a063b4": [ - "abort()" - ], - "0xd6960697": [ - "confirmPurchase()" - ], - "0x73fac6f0": [ - "confirmReceived()" - ], - "0xda0774ad": [ - "getCallFeeScalar(uint256,uint256)" - ], - "0x4c33fe94": [ - "cancel(address)" - ], - "0xc032dc30": [ - "execute(uint256,address)" - ], - "0x6a704d7b": [ - "AddedToGeneration(address,uint256)" - ], - "0xf1173928": [ - "RemovedFromGeneration(address,uint256)" - ], - "0x345006b6": [ - "getGenerationForCall(address)" - ], - "0xb3559460": [ - "getGenerationSize(uint256)" - ], - "0xa6c01cfd": [ - "isInGeneration(uint256)" - ], - "0x04dd69fa": [ - "getGenerationIdForCall(address)" - ], - "0x5a8dd79f": [ - "getDesignatedCaller(address,uint256)" - ], - "0xdc75f2db": [ - "multiowned(address[],uint256)" - ], - "0x0b467b9b": [ - "revoke(bytes)" - ], - "0xf00d4b5d": [ - "changeOwner(address,address)" - ], - "0x7065cb48": [ - "addOwner(address)" - ], - "0x173825d9": [ - "removeOwner(address)" - ], - "0xba51a6df": [ - "changeRequirement(uint256)" - ], - "0x2f54bf6e": [ - "isOwner(address)" - ], - "0x3b49a77b": [ - "hasConfirmed(bytes,address)" - ], - "0xe88b8ac6": [ - "confirmAndCheck(bytes)" - ], - "0xc1812b15": [ - "reorganizeOwners()" - ], - "0x5f6a1301": [ - "clearPending()" - ], - "0xae99847b": [ - "daylimit(uint256)" - ], - "0xb20d30a9": [ - "setDailyLimit(uint256)" - ], - "0x5c52c2f5": [ - "resetSpentToday()" - ], - "0x180aadb7": [ - "underLimit(uint256)" - ], - "0xb74e452b": [ - "today()" - ], - "0xb61d27f6": [ - "execute(address,uint256,bytes)" - ], - "0xf2ddc772": [ - "confirm(bytes)" - ], - "0xc4ff3614": [ - "Wallet(address[],uint256,uint256)" - ], - "0xcbf0b0c0": [ - "kill(address)" - ], - "0xe854dfb4": [ - "Order(address,uint256,uint256)" - ], - "0x4c0bcfe5": [ - "getTransferableBalance(address)" - ], - "0x8f367001": [ - "numTokensAbleToPurchase()" - ], - "0x370ec1c5": [ - "_fillOrder(address,uint256)" - ], - "0xd9feeeb6": [ - "fillMyOrder(uint256)" - ], - "0xfcc6b5d5": [ - "fillTheirOrder(address)" - ], - "0x39f4debc": [ - "fillOrderAuto()" - ], - "0x9a1b420b": [ - "OraclizeAddrResolver()" - ], - "0xd1d80fdf": [ - "setAddr(address)" - ], - "0x0e1ca8a5": [ - "Oraclize()" - ], - "0xa2ec191a": [ - "addDSource(string,uint256)" - ], - "0x62b3b833": [ - "createCoupon(string)" - ], - "0xa8239d0b": [ - "getPrice(string,address)" - ], - "0xbf1fe420": [ - "setGasPrice(uint256)" - ], - "0x8579cbde": [ - "getPrice(string,uint256,address)" - ], - "0xde4b3262": [ - "setBasePrice(uint256)" - ], - "0x7d242ae5": [ - "setBasePrice(uint256,bytes)" - ], - "0x81ade307": [ - "query(string,string)" - ], - "0x45362978": [ - "query1(string,string)" - ], - "0xe839e65e": [ - "query2(string,string,string)" - ], - "0x23dc42e7": [ - "query1(uint256,string,string)" - ], - "0xae815843": [ - "query(uint256,string,string,uint256)" - ], - "0x5c242c59": [ - "query1(uint256,string,string,uint256)" - ], - "0x7e1c4205": [ - "query2(uint256,string,string,string,uint256)" - ], - "0x75700437": [ - "query1_withGasLimit(uint256,string,string,uint256)" - ], - "0xb303dcbd": [ - "Owned()" - ], - "0x32e7c5bf": [ - "B()" - ], - "0xc6888fa1": [ - "multiply(uint256)" - ], - "0xf8a8fd6d": [ - "test()" - ], - "0x78710d37": [ - "seven()" - ], - "0xe1bedf2a": [ - "AlarmTester(address)" - ], - "0xb29f0835": [ - "doIt()" - ], - "0x185061da": [ - "undoIt()" - ], - "0xdd012a15": [ - "setIt(uint256)" - ], - "0x22beb9b9": [ - "scheduleDoIt(uint256)" - ], - "0xd6b44859": [ - "scheduleUndoIt(uint256)" - ], - "0x245a03ec": [ - "scheduleSetIt(uint256,uint256)" - ], - "0x7429c086": [ - "repeat()" - ], - "0x553cc48d": [ - "Player(string)" - ], - "0x37b7bf11": [ - "Tile(int256,int256)" - ], - "0x2d67bb91": [ - "World()" - ], - "0xead710c4": [ - "greet(string)" - ], - "0x0f4cf692": [ - "numMessages()" - ], - "0xc633084f": [ - "sendGreeting(address,string)" - ], - "0xc6e1c178": [ - "TheLuckyOne(bytes)" - ], - "0xf18d20be": [ - "adminWithdraw()" - ], - "0x4faa2d54": [ - "getTimeElapsed()" - ], - "0xe8223468": [ - "sha3clone(bytes)" - ], - "0xa59d6986": [ - "recoverLostFunds()" - ], - "0xc535165f": [ - "revealAndPayout(bytes,bytes)" - ], - "0xf1eae25c": [ - "mortal()" - ], - "0xfaf27bca": [ - "greeter(string)" - ], - "0xcfae3217": [ - "greet()" - ], - "0xb51c4f96": [ - "getCodeSize(address)" - ], - "0x95978868": [ - "strConcat(string,string,string,string,string)" - ], - "0x45e965cd": [ - "strConcat(string,string,string,string)" - ], - "0x4112987c": [ - "strConcat(string,string,string)" - ], - "0xf5c98aff": [ - "GreeterB(bytes)" - ], - "0x3bc5de30": [ - "getData()" - ], - "0x9c1193ea": [ - "GreeterA(bytes)" - ], - "0x905e6e42": [ - "JSON_Test()" - ], - "0x1e26fd33": [ - "setBool(bool)" - ], - "0x9a19a953": [ - "setInt8(int8)" - ], - "0x4dfd1b02": [ - "setUint8(int8,uint8)" - ], - "0xa53b1c1e": [ - "setInt256(int256)" - ], - "0xec21a913": [ - "setUint256(int256,uint256)" - ], - "0x6cc5fdaa": [ - "setBytes32(bytes,bytes)" - ], - "0x12a7b914": [ - "getBool()" - ], - "0x57cb2fc4": [ - "getInt8()" - ], - "0x4a41e045": [ - "getUint8(int8)" - ], - "0xf5b53e17": [ - "getInt256()" - ], - "0xed180443": [ - "getUint256(int256)" - ], - "0x1f903037": [ - "getBytes32()" - ], - "0x65538c73": [ - "fireEventLog0()" - ], - "0xa6780857": [ - "fireEventLog0Anonym()" - ], - "0xb61c0503": [ - "fireEventLog1()" - ], - "0x4e7ad367": [ - "fireEventLog1Anonym()" - ], - "0x102accc1": [ - "fireEventLog2()" - ], - "0x76bc21d9": [ - "fireEventLog2Anonym()" - ], - "0xf38b0600": [ - "fireEventLog3()" - ], - "0xe8beef5b": [ - "fireEventLog3Anonym()" - ], - "0xfd408767": [ - "fireEventLog4()" - ], - "0x9dc2c8f5": [ - "fireEventLog4Anonym()" - ], - "0x2839e928": [ - "ackermann(uint256,uint256)" - ], - "0x61047ff4": [ - "fibonacci(uint256)" - ], - "0xdbbdf083": [ - "register(uint256,address)" - ], - "0xa02b161e": [ - "unregister(uint256)" - ], - "0x5fd4b08a": [ - "getName(address)" - ], - "0x1c4e6cd0": [ - "NameReg()" - ], - "0xe79a198f": [ - "unregister()" - ], - "0xf5c57382": [ - "nameOf(address)" - ], - "0xc47cf5de": [ - "getAddress(bytes)" - ], - "0x82fbdc9c": [ - "register(bytes)" - ], - "0x034cb28e": [ - "addressOf(address,bytes)" - ], - "0xf004b12b": [ - "CrowdFund(uint256,uint256,address)" - ], - "0x9bb01b5f": [ - "ElcoinDb(address)" - ], - "0x893d20e8": [ - "getOwner()" - ], - "0xab470f05": [ - "getCaller()" - ], - "0xbeb92f55": [ - "setCaller(address)" - ], - "0xf3125a1f": [ - "deposit(address,uint256,bytes,uint256)" - ], - "0x9483e91a": [ - "withdraw(address,uint256,bytes,uint256)" - ], - "0x3b343a13": [ - "getNodeAddress(bytes)" - ], - "0x7bfaad96": [ - "addNode(bytes,address)" - ], - "0xca3b5c91": [ - "hasRelation(bytes,bytes,address)" - ], - "0xba45b0b8": [ - "transfer(address,address)" - ], - "0xf8b71c64": [ - "rewardTo(address,uint256)" - ], - "0xfbf1f78a": [ - "unapprove(address)" - ], - "0x5184ffc9": [ - "setAmbiAddress(address,bytes)" - ], - "0xa7f43779": [ - "remove()" - ], - "0x444dd6f3": [ - "Elcoin()" - ], - "0x4a606c53": [ - "_db()" - ], - "0x9b9d0364": [ - "_setFeeStructure(uint256,uint256,uint256)" - ], - "0x99a5d747": [ - "calculateFee(uint256)" - ], - "0x63f80de3": [ - "issueCoin(address,uint256,uint256)" - ], - "0x88d695b2": [ - "batchTransfer(address[],uint256[])" - ], - "0xaa64c43b": [ - "transferPool(address,address,uint256)" - ], - "0xc71cbcf3": [ - "recoverAccount(address,address)" - ], - "0xb2855b4f": [ - "setFeeAddr(address)" - ], - "0x5b65b9ab": [ - "setFee(uint256,uint256,uint256)" - ], - "0x3f2f1596": [ - "setupTreasury(address,uint256)" - ], - "0x24c65f35": [ - "updateRefundGas()" - ], - "0x8f0c724c": [ - "setOperationsCallGas(uint256)" - ], - "0x23df9df5": [ - "_refund(uint256)" - ], - "0xd449ce7c": [ - "Administered()" - ], - "0xa925d85e": [ - "Exchange(address,address)" - ], - "0xf34c7010": [ - "commitSecurity(address,uint256,uint256)" - ], - "0x6d09e2ec": [ - "commitCurrency(address,uint256,uint256)" - ], - "0x144267e0": [ - "refundSecurity(address,uint256,uint256)" - ], - "0xc9cfac55": [ - "refundCurrency(address,uint256,uint256)" - ], - "0xa5b1e13d": [ - "settle(address,address,uint256,uint256)" - ], - "0x1d8ae626": [ - "Security(string,string)" - ], - "0xc74e907b": [ - "commit(address,uint256,uint256)" - ], - "0x60708ae3": [ - "issueAndCommit(address,address,uint256,uint256)" - ], - "0x68f2ab8e": [ - "Currency(string,string)" - ], - "0xb21bce4c": [ - "vote(bytes,bool)" - ], - "0x3b143184": [ - "Congress(uint256,uint256,int256,address)" - ], - "0x9644fcbd": [ - "changeMembership(address,bool,string)" - ], - "0xbcca1fd3": [ - "changeVotingRules(uint256,uint256,int256)" - ], - "0xb1050da5": [ - "newProposal(address,uint256,string,bytes)" - ], - "0xd3c0715b": [ - "vote(uint256,bool,string)" - ], - "0xbcc6092a": [ - "MyEtherBank()" - ], - "0xd917deb5": [ - "Donate()" - ], - "0xb774d3d7": [ - "BankOwner_GetDonationsBalance()" - ], - "0x07718a3b": [ - "BankOwner_WithdrawDonations()" - ], - "0x2dae9878": [ - "BankOwner_EnableConnectBankAccountToNewOwnerAddress()" - ], - "0x9be1fcee": [ - "BankOwner_DisableConnectBankAccountToNewOwnerAddress()" - ], - "0x32829a23": [ - "OpenBankAccount()" - ], - "0x25f3da52": [ - "GetBankAccountNumber()" - ], - "0xcf2e3efc": [ - "GetBankAccountBalance()" - ], - "0x9a9c9c53": [ - "DepositToBankAccount()" - ], - "0x62b24189": [ - "DepositToBankAccountFromDifferentAddress(uint32)" - ], - "0x13651124": [ - "WithdrawAmountFromBankAccount(uint256)" - ], - "0x85c7a953": [ - "WithdrawFullBalanceFromBankAccount()" - ], - "0x19663f7f": [ - "TransferAmountFromBankAccountToAddress(uint256,address)" - ], - "0xaf27c7b3": [ - "Security_HasPasswordSha3HashBeenAddedToBankAccount()" - ], - "0xb45c48dc": [ - "Security_AddPasswordSha3HashToBankAccount(bytes)" - ], - "0x766a3f2e": [ - "Security_ConnectBankAccountToNewOwnerAddress(uint32,string)" - ], - "0xf6232556": [ - "Security_GetNumberOfAttemptsToConnectBankAccountToANewOwnerAddress()" - ], - "0x671fa0a0": [ - "Inscription(string)" - ], - "0xd6af9411": [ - "Rouleth()" - ], - "0x31119b4d": [ - "changeDeveloper(address)" - ], - "0xc87b36ed": [ - "disableBetting()" - ], - "0x5fa21f1f": [ - "enableBetting()" - ], - "0x63a8dac2": [ - "changeSettings(uint256,uint256,uint256,uint8,uint256,uint256,uint8,uint8)" - ], - "0x2888f9d0": [ - "updateMaxBet()" - ], - "0x53f818d6": [ - "checkBetValue()" - ], - "0xb8cf14e7": [ - "updateStatusPlayer()" - ], - "0xb400d149": [ - "betOnNumber(uint8)" - ], - "0x5b7d47a9": [ - "betOnColor(bool,bool)" - ], - "0xadf54e0c": [ - "betOnLowHigh(bool,bool)" - ], - "0xb738169c": [ - "betOnOddEven(bool,bool)" - ], - "0xbfe8c107": [ - "betOnDozen(bool,bool,bool)" - ], - "0xe548cf13": [ - "betOnColumn(bool,bool,bool)" - ], - "0xd02bf162": [ - "spinTheWheel()" - ], - "0x403abbc7": [ - "updateFirstActiveGamble()" - ], - "0x021c309a": [ - "solveBet(address,uint8,bool,uint8)" - ], - "0x86269a88": [ - "checkBetNumber(uint8)" - ], - "0x57006864": [ - "checkBetParity(uint8)" - ], - "0xf80b3cfa": [ - "checkBetLowhigh(uint8)" - ], - "0xc1ae4044": [ - "checkBetColor(uint8)" - ], - "0xc124e2ea": [ - "checkBetDozen(uint8)" - ], - "0x06c1df7b": [ - "checkBetColumn(uint8)" - ], - "0xe8b5e51f": [ - "invest()" - ], - "0x2037fcbf": [ - "withdrawInvestment(uint256)" - ], - "0xb18c6847": [ - "manualUpdateBalances()" - ], - "0x6f3fe404": [ - "updateBalances()" - ], - "0x2c6b2c92": [ - "checkProfitLossSinceInvestorChange()" - ], - "0xf7ae9421": [ - "checkInvestorBalance(address)" - ], - "0x6ed43eb0": [ - "getInvestorList(uint256)" - ], - "0xf9e27106": [ - "investmentEntryCost()" - ], - "0x85b4bb53": [ - "getSettings()" - ], - "0xa0e2abf7": [ - "getFirstActiveGamble()" - ], - "0x942385eb": [ - "getPayroll()" - ], - "0x6e1b6bcc": [ - "checkMyBet(address)" - ], - "0xbcb3b5d2": [ - "getGamblesList(uint256)" - ], - "0x4e71e0c8": [ - "claimOwnership()" - ], - "0xb4d9cc3a": [ - "profitDisperser()" - ], - "0xc127c247": [ - "addMember(address,string)" - ], - "0x63deb2c5": [ - "changeMemberAddress(address)" - ], - "0x1c02708d": [ - "killContract()" - ], - "0xaacc5a17": [ - "getRandom()" - ], - "0x6103d915": [ - "Winners(uint256)" - ], - "0xd743ca38": [ - "newWinner(uint256,address,uint256,uint256,uint256)" - ], - "0x3e5fd9b5": [ - "dEthereumlotteryNet(address,address,bool,address)" - ], - "0x149c5066": [ - "ChanceOfWinning(uint256)" - ], - "0x860e9960": [ - "BetPriceLimit()" - ], - "0xe8930efd": [ - "Investors(address)" - ], - "0xc0819961": [ - "Invest()" - ], - "0xf9983a12": [ - "GetMyInvestmentBalance()" - ], - "0x7dee2cad": [ - "CancelMyInvestment()" - ], - "0x4247f52d": [ - "DoRoll()" - ], - "0x25209260": [ - "PrepareRoll(uint256)" - ], - "0x54738157": [ - "OwnerCloseContract()" - ], - "0xe9b93569": [ - "OwnerGetFee()" - ], - "0xe97db66e": [ - "setJackpot()" - ], - "0x9a7a7c11": [ - "makeRoll(uint256)" - ], - "0x414ceac0": [ - "investorAddFee(uint256)" - ], - "0x2f1927cb": [ - "prepareRoll(uint256,uint256,uint256)" - ], - "0x57764094": [ - "getRate(uint256)" - ], - "0x1dea0c57": [ - "getRealBet(uint256)" - ], - "0x3e0dfbdf": [ - "getInvestorByAddress(address)" - ], - "0xe5a27038": [ - "Pluton(uint256,string,uint8,string)" - ], - "0xcae9ca51": [ - "approveAndCall(address,uint256,bytes)" - ], - "0xc2412676": [ - "Token()" - ], - "0x3ccb7dc9": [ - "CrowdFund(uint256,uint256)" - ], - "0xe5225381": [ - "collect()" - ], - "0x3059ac30": [ - "Escrow(address,address)" - ], - "0x924c28c1": [ - "ContractInterface(address,address,address)" - ], - "0xdabc706e": [ - "getProposalCost()" - ], - "0x0380e2f3": [ - "getHashOfTheSignedDocument()" - ], - "0xd02a9889": [ - "getDateOfFirstPayment()" - ], - "0x938199a5": [ - "getDateOfLastPayment()" - ], - "0x708f29a6": [ - "getTotalPayments()" - ], - "0x270cfee1": [ - "getTokenAccount()" - ], - "0x00faf4dd": [ - "getTokenDivisor()" - ], - "0x8b863095": [ - "setContractorProposal(uint256,bytes)" - ], - "0x3e0d4f4a": [ - "ApproveContractorProposal()" - ], - "0xb7538f3e": [ - "ChangeClient(address)" - ], - "0x9ae4e388": [ - "ChangeClientTokenAccount(address,bool)" - ], - "0x9462eae5": [ - "ChangeContractor(address)" - ], - "0xea4af029": [ - "ConferenceCertification()" - ], - "0xd1f7a4e4": [ - "createCertificate(bytes)" - ], - "0x89eedf00": [ - "setPdfHash(bytes,bytes)" - ], - "0xbb3b8dca": [ - "getCertificateHash(bytes)" - ], - "0xc2def3b9": [ - "getOrganizer()" - ], - "0xb81e43fc": [ - "getEventName()" - ], - "0xe5dd90a5": [ - "HumanStandardToken(uint256,string,uint8,string)" - ], - "0x5d5bc4cb": [ - "BetOnRed()" - ], - "0x29d6f899": [ - "BetOnBlue()" - ], - "0xd0821b0e": [ - "bet(uint8)" - ], - "0x354d7e40": [ - "Payout()" - ], - "0x72c7c85a": [ - "minority()" - ], - "0x8f4ffcb1": [ - "receiveApproval(address,uint256,address,bytes)" - ], - "0x8a323b38": [ - "Contract(uint256,string,uint8,string)" - ], - "0x26745909": [ - "PRNG_Challenge()" - ], - "0xd2ef7398": [ - "challenge()" - ], - "0x76da5667": [ - "admin_kill()" - ], - "0xc2985578": [ - "foo()" - ], - "0x63bfe3d8": [ - "SkillBeatsLuck()" - ], - "0x478ae93c": [ - "playToWin(uint256)" - ], - "0x6a9d2afd": [ - "playToWinTest(uint256)" - ], - "0x793cd71e": [ - "cashOut()" - ], - "0x2530c905": [ - "rand(uint256)" - ], - "0x17db59a4": [ - "dEthereumlotteryNet(address,address,address)" - ], - "0xa0f029fc": [ - "ContractorInterface(address,address,address)" - ], - "0xf765088f": [ - "UpdateClientAddress(address)" - ], - "0x64e24f4b": [ - "UpdateClientTokenAccount(address)" - ], - "0xa36c8ec2": [ - "UpdateContractorAddress(address)" - ], - "0x84dac46e": [ - "Fucksign()" - ], - "0xfc1f2a70": [ - "Add(uint256,string,string)" - ], - "0xa87d942c": [ - "getCount()" - ], - "0xe3914699": [ - "dEthereumlotteryNetWinners(address)" - ], - "0x477bddaa": [ - "setContractAddress(address)" - ], - "0xc6ae3b57": [ - "dEthereumlotteryNet(address,address)" - ], - "0xe1376da2": [ - "updateFirstActiveGamble(uint256)" - ], - "0xd499555b": [ - "getFirstActiveDuel()" - ], - "0xf99fc046": [ - "dEthereumlotteryNet()" - ], - "0xc494f71a": [ - "LedgerFund(uint32,uint32,uint64,uint64)" - ], - "0xcdb6753b": [ - "setNav(uint32)" - ], - "0xc8691b2a": [ - "getHistory(uint256)" - ], - "0xbe1c766b": [ - "getLength()" - ], - "0x7cef6047": [ - "getNavHistory(uint256)" - ], - "0x9287c877": [ - "getNavLength()" - ], - "0xdd67a360": [ - "OrderLifeCycle()" - ], - "0x712ca0f8": [ - "getOrder(string)" - ], - "0xe3280126": [ - "addOrder(string,bool)" - ], - "0x1d8b70da": [ - "order_received(string)" - ], - "0x64265b1a": [ - "share_transfered(string)" - ], - "0x96ef7aa0": [ - "cash_transfered(string)" - ], - "0x13b2663b": [ - "cash_received(string)" - ], - "0xd052fbf6": [ - "getHistory(string,uint256)" - ], - "0x6981b5f4": [ - "getLength(string)" - ], - "0xbc9147a4": [ - "Foundation()" - ], - "0x6389654e": [ - "changeDailyWithdrawalLimit(uint256)" - ], - "0x12d00c2e": [ - "soloWithdraw(uint256)" - ], - "0xa4699cad": [ - "resetWithdrawls()" - ], - "0x3e476053": [ - "moveFunds(address,uint256)" - ], - "0xf5c8d71b": [ - "forceMove(address,address,uint256)" - ], - "0xfbae5e7d": [ - "Investors(uint256)" - ], - "0x1ceea715": [ - "GetMyInvestFee()" - ], - "0x1d2dbb22": [ - "CancelMyInvest()" - ], - "0xfee35ff8": [ - "newInvest(uint256,address,uint256)" - ], - "0x0ff0a4df": [ - "reFund()" - ], - "0x932db761": [ - "profitsFromBitnationDebitCard()" - ], - "0x79baa8a9": [ - "BasicIncome_CoFund()" - ], - "0x983ef725": [ - "getDifficulty(uint256)" - ], - "0xf00acc47": [ - "prepareRoll(uint256,uint256)" - ], - "0xf3c7d275": [ - "prenup(string,string,string,string,string,address,address)" - ], - "0x86a5ff97": [ - "changeStatus(string)" - ], - "0xffcce369": [ - "changeIPFSHash(string)" - ], - "0xb47d89ad": [ - "Details()" - ], - "0x24c9bf5e": [ - "Prizes()" - ], - "0xcee6ee38": [ - "aEthereumlotteryNet()" - ], - "0x91d8b14e": [ - "BuyTickets()" - ], - "0xd224118f": [ - "PrepareDraw()" - ], - "0xd4e78272": [ - "Draw()" - ], - "0xacc5a0dc": [ - "GetPrize()" - ], - "0xfea2920e": [ - "createNewDraw()" - ], - "0x350fbe2e": [ - "calcNextDrawTime()" - ], - "0x82f0d875": [ - "makeHash()" - ], - "0x206a44f3": [ - "getNum(bytes,uint256)" - ], - "0x5ed84aa6": [ - "getNymCenterAPIURL()" - ], - "0x4cdb48e4": [ - "isValidNym(address)" - ], - "0xf1320af2": [ - "exempt(address)" - ], - "0xf9e84395": [ - "unexempt(address)" - ], - "0xcc872b66": [ - "issue(uint256)" - ], - "0xdb006a75": [ - "redeem(uint256)" - ], - "0x879d46fd": [ - "DAOTrust(address,address,bytes,uint256,uint256,uint128)" - ], - "0xf7b89a3e": [ - "getTotalCosts()" - ], - "0x550538f6": [ - "getOneTimeCosts()" - ], - "0x0acc4382": [ - "getMinDailyWithdrawLimit()" - ], - "0xc988d70f": [ - "getDailyWithdrawLimit()" - ], - "0xd7ccc2c3": [ - "getLastPayment()" - ], - "0x7648c929": [ - "returnRemainingEther()" - ], - "0x6b256f57": [ - "DAOSecurity(address,address,bytes,uint256,uint256,uint128)" - ], - "0x293ffca3": [ - "AddressReg()" - ], - "0x63a9c3d7": [ - "verify(address)" - ], - "0x0d368fee": [ - "deverify(address)" - ], - "0xd173707d": [ - "hasPhysicalAddress(address)" - ], - "0x5f2e686d": [ - "Ethereum_eight_bagger()" - ], - "0x1437f9a3": [ - "Set_your_game_number(uint16)" - ], - "0xc3d23e10": [ - "checkBet()" - ], - "0xfd68a422": [ - "returnmoneycreator(uint8,uint128)" - ], - "0x6673ce2b": [ - "Results_of_the_last_round()" - ], - "0x2c329e99": [ - "Last_block_number_and_bloctime_used()" - ], - "0xdb641ab4": [ - "Game_balance_in_Ethers()" - ], - "0xd6f42038": [ - "PhoneToAddress()" - ], - "0x4636a159": [ - "newPhoneToAddr(address,uint256)" - ], - "0xe3ffc9a3": [ - "sendEtherToOwner()" - ], - "0xb958a5e1": [ - "getPhoneByAddress(address)" - ], - "0x1f83f440": [ - "getPaymentByAddress(address)" - ], - "0xa02b9aac": [ - "getPaymentDataByAddress(address)" - ], - "0xfe97ee88": [ - "hasPhone(address)" - ], - "0x11103599": [ - "Token_Offer(address,address,uint16)" - ], - "0x7824407f": [ - "tokenSupply()" - ], - "0xd0febe4c": [ - "buyTokens()" - ], - "0x0e662cf0": [ - "buyTokens(uint16)" - ], - "0x8ed67a44": [ - "setPrice(uint16)" - ], - "0xdc52696f": [ - "tokenSupplyChanged()" - ], - "0xf29d2f28": [ - "setTokenHolder(address)" - ], - "0x7b1a4909": [ - "transferETH(address,uint256)" - ], - "0x19901f1d": [ - "TokenSale(uint256,uint256)" - ], - "0x13d4bc24": [ - "buyTokenProxy(address)" - ], - "0xe8038e25": [ - "TokenSale(uint256,uint256,address)" - ], - "0x3fc6bc94": [ - "payDAO()" - ], - "0x81788e2b": [ - "addAllowedAddress(address)" - ], - "0x0b6d8d52": [ - "createDAO(address,uint256,uint256)" - ], - "0x656d2f63": [ - "ManagedAccount(address)" - ], - "0xb2e85b67": [ - "getPlayerStatus(address,uint256)" - ], - "0x1ce624d6": [ - "Crypted_RPS()" - ], - "0xb50954b6": [ - "cancelWaitingForOpponent()" - ], - "0xa28ecf0b": [ - "sendCryptedHand(bytes)" - ], - "0x3f2f46b4": [ - "revealRock(string)" - ], - "0xe7740cf9": [ - "revealPaper(string)" - ], - "0x953307d8": [ - "revealScissors(string)" - ], - "0xe1bc3003": [ - "reveal(bytes,string)" - ], - "0xf91a792e": [ - "decryptHand(string,uint256,uint256,uint256)" - ], - "0x0cf45ba5": [ - "updateFirstDuel2(uint256)" - ], - "0x2d0104a5": [ - "updateFirstDuel1(uint256)" - ], - "0x528fd7b0": [ - "manualPayExpiredDuel()" - ], - "0x6f52167d": [ - "payDuel(address,string,address,string)" - ], - "0xb1418cf4": [ - "payHouse()" - ], - "0x717fedf0": [ - "getFirstActiveDuel1()" - ], - "0xcb10e0c5": [ - "getLastDuel1()" - ], - "0x8dc45377": [ - "getDuel1(uint256)" - ], - "0xb782fc9b": [ - "getFirstActiveDuel2()" - ], - "0x67bd69a6": [ - "getLastDuel2()" - ], - "0x96f7807a": [ - "getDuel2(uint256)" - ], - "0xdd10d97e": [ - "getPlayerWaiting()" - ], - "0x92093dd6": [ - "getLastResult()" - ], - "0x81a60c0d": [ - "getResults(uint256)" - ], - "0xb5bfdd73": [ - "addDSource(string,bytes1,uint256)" - ], - "0x0f825673": [ - "deleteCoupon(string)" - ], - "0xdb37e42f": [ - "multisetProofType(uint256[],address[])" - ], - "0xd9597016": [ - "multisetCustomGasPrice(uint256[],address[])" - ], - "0x68742da6": [ - "withdrawFunds(address)" - ], - "0xca6ad1e4": [ - "setCustomGasPrice(uint256)" - ], - "0xa6f9dae1": [ - "changeOwner(address)" - ], - "0x64aabe92": [ - "tryExec(address,bytes,uint256)" - ], - "0xad8d5f48": [ - "exec(address,bytes,uint256)" - ], - "0xa6a20ff6": [ - "DSEasyMultisig(uint256,uint256,uint256,uint256)" - ], - "0xc9030ea0": [ - "addMember(address,bool)" - ], - "0xc7d6faf1": [ - "easyPropose(address,uint256)" - ], - "0x31c2bd0b": [ - "propose(address,bytes,uint256)" - ], - "0x1555e337": [ - "ConferenceCertificate()" - ], - "0x9844347b": [ - "createCertificate(bytes,bytes,uint256,bytes)" - ], - "0x682d3bb0": [ - "pdfCertificateProof(bytes)" - ], - "0x73e30e49": [ - "majorEventFunc(uint256,bytes,bytes)" - ], - "0x53850db3": [ - "getParticipantById(uint256)" - ], - "0xad605729": [ - "getParticipantCount()" - ], - "0x28f90e4b": [ - "Etheramid2()" - ], - "0xe67cdfb7": [ - "moveOldUser(uint256)" - ], - "0xe837ab59": [ - "getParticipantByAddress(address)" - ], - "0x9c7e8a03": [ - "addParticipant(address,address,uint256)" - ], - "0xd014c01f": [ - "enter(address)" - ], - "0xb3ea3924": [ - "PointlessCoin(int256,uint256,string,uint8,string,address)" - ], - "0xe724529c": [ - "freezeAccount(address,bool)" - ], - "0xf7c9f74a": [ - "insert_contribution(address,uint256)" - ], - "0x3f19d043": [ - "getContributions(address)" - ], - "0x0a2282ae": [ - "JackPot()" - ], - "0xc431f885": [ - "addToContribution()" - ], - "0x1f1f5e76": [ - "addValueToContribution(uint256)" - ], - "0x6e2cde85": [ - "drawPot(string,string)" - ], - "0x8afa08bd": [ - "setDrawDate(uint256)" - ], - "0xea3d2827": [ - "selectWinner(string)" - ], - "0x744d8b4f": [ - "recordWin(uint256,uint256)" - ], - "0x83197ef0": [ - "destroy()" - ], - "0x06005754": [ - "nameRegAddress()" - ], - "0xf9a7a2ef": [ - "named(bytes)" - ], - "0xb028ee13": [ - "s2b(string)" - ], - "0x2f570a23": [ - "test(bytes)" - ], - "0xcd50d44f": [ - "CheckRepresentment()" - ], - "0xa23744f0": [ - "tryCreateCheckRecord(bytes)" - ], - "0xfa8dc33a": [ - "checkRecordExists(bytes)" - ], - "0x4ac6b2be": [ - "getCheckRecordCreator(bytes)" - ], - "0x46e44f63": [ - "getCheckRecordTS(bytes)" - ], - "0xa352f1a8": [ - "calcSHA3(bytes)" - ], - "0x1eb5ea2e": [ - "returnFunds()" - ], - "0x4fa99dd0": [ - "Matching_Ethers()" - ], - "0x1a1df394": [ - "Play(bool)" - ], - "0xde14bbf7": [ - "randomGen(uint256,uint256)" - ], - "0x7f98444f": [ - "randomEnd()" - ], - "0x749aa2d9": [ - "endRound()" - ], - "0x60f8af90": [ - "refundRound()" - ], - "0x51b42b00": [ - "deactivate()" - ], - "0xd18611d6": [ - "reactivate()" - ], - "0xcbd08c8c": [ - "config(uint256,uint256,uint256,uint256)" - ], - "0xd68199dc": [ - "gameStats()" - ], - "0xb7297cf3": [ - "gameSettings()" - ], - "0xdfc765dc": [ - "getMatchers_by_index(uint256)" - ], - "0x3855dcd6": [ - "getContrarians_by_index(uint256)" - ], - "0x477801b1": [ - "getLastRoundResults_by_index(uint256)" - ], - "0x1c5d9faa": [ - "setNickname(string)" - ], - "0xadaccd74": [ - "getNickname(address)" - ], - "0xac5e81a9": [ - "historyPayout(address)" - ], - "0xd7c23572": [ - "historyTimesPlayed(address)" - ], - "0xf4b2dfea": [ - "Matching_Finneys()" - ], - "0x7df23b6a": [ - "ReleaseOracle(address[])" - ], - "0x46f0975a": [ - "signers()" - ], - "0xbf8ecf9c": [ - "authProposals()" - ], - "0x64ed31fe": [ - "authVotes(address)" - ], - "0x9d888e86": [ - "currentVersion()" - ], - "0x26db7648": [ - "proposedVersion()" - ], - "0xd0e0813a": [ - "promote(address)" - ], - "0x5c3d005d": [ - "demote(address)" - ], - "0x01b869f1": [ - "release(uint32,uint32,uint32,bytes)" - ], - "0xbc8fbbf8": [ - "nuke()" - ], - "0xf460590b": [ - "updateSigner(address,bool)" - ], - "0x5bc7e259": [ - "updateRelease(uint32,uint32,uint32,bytes,bool)" - ], - "0x60eb2826": [ - "Badge()" - ], - "0xee95feaf": [ - "isSeller(address)" - ], - "0x64ac2c4a": [ - "WavesPresale()" - ], - "0x09957e69": [ - "newSale(bytes,uint256,uint256)" - ], - "0x779beca0": [ - "getNumOfSalesWithSameId(bytes)" - ], - "0xe2b05077": [ - "getSaleDate(bytes,uint256)" - ], - "0x67eae672": [ - "sendCoinFrom(address,uint256,address)" - ], - "0xc86a90fe": [ - "sendCoin(uint256,address)" - ], - "0xd26c8a8a": [ - "coinBalance()" - ], - "0xbbd39ac0": [ - "coinBalanceOf(address)" - ], - "0xdaea85c5": [ - "approve(address)" - ], - "0x673448dd": [ - "isApproved(address)" - ], - "0x1fa03a2b": [ - "isApprovedFor(address,address)" - ], - "0x1c14179a": [ - "GavCoin()" - ], - "0x99f4b251": [ - "mine()" - ], - "0x58150c8b": [ - "GameRegistry()" - ], - "0x3c21db0a": [ - "theGames(uint256)" - ], - "0xe06174e4": [ - "settings()" - ], - "0xe37aa618": [ - "distributeValue()" - ], - "0x0d7af726": [ - "addGame(address,string,string)" - ], - "0x30945443": [ - "update(address,string,string)" - ], - "0xc3c5a547": [ - "isRegistered(address)" - ], - "0x617fba04": [ - "getRecord(address)" - ], - "0xfa544161": [ - "getOwner(address)" - ], - "0x4b70cec4": [ - "getTime(address)" - ], - "0x644998ae": [ - "maintain(int256,uint256,uint256)" - ], - "0x0aeacb5e": [ - "getTotalRecords()" - ], - "0x990c8f79": [ - "returnValue()" - ], - "0xea2d4cf8": [ - "__DeployerFunctions(address,address,uint256)" - ], - "0x3ac5cb73": [ - "GeometricPonzi()" - ], - "0x1b55ba3a": [ - "Start()" - ], - "0xe59f611f": [ - "InputLimit(uint256)" - ], - "0xcec1365a": [ - "ShortLimit(uint256)" - ], - "0xde640e19": [ - "Investment(uint256)" - ], - "0xb3dfcdc3": [ - "Contribution(uint256)" - ], - "0xa7eeea37": [ - "NewContributor(uint256)" - ], - "0x28f03554": [ - "ProcessDividend()" - ], - "0xc0b6f0c2": [ - "NextRoundAndEvents()" - ], - "0x5afeb106": [ - "Sqrt()" - ], - "0x0a4d564c": [ - "TieUpLooseEnds()" - ], - "0xdabf7dc8": [ - "PayoutDividendEarly(uint256,bool)" - ], - "0x9f9eac67": [ - "ChangeName(string)" - ], - "0x68f65f02": [ - "ChangeShownDenomination(bool,bool,bool,bool)" - ], - "0x29f27577": [ - "InvestorList(uint256)" - ], - "0x8c88752a": [ - "ContributorList(uint256)" - ], - "0x979b6f6f": [ - "RoundInfo()" - ], - "0x17e875e3": [ - "Transparancy()" - ], - "0xc08dd1dc": [ - "IOU(string,string,uint8)" - ], - "0xc2a95cc9": [ - "updateTrustSettings(address,uint256)" - ], - "0x7682e6ff": [ - "getTrustSetting(address)" - ], - "0x4889ca88": [ - "receiveApproval(address,uint256,address)" - ], - "0x3177029f": [ - "approveAndCall(address,uint256)" - ], - "0xd30fbd0d": [ - "safeSubtract(uint256,uint256)" - ], - "0xbe040fb0": [ - "redeem()" - ], - "0x4ff13571": [ - "x2()" - ], - "0xe97dcb62": [ - "enter()" - ], - "0xc8796572": [ - "collectFees()" - ], - "0xb6509c12": [ - "Ethereum_twelve_bagger()" - ], - "0x421aeda6": [ - "Set_your_game_number(string)" - ], - "0x00873367": [ - "comparisonchr(string)" - ], - "0x43e332c5": [ - "Last_block_number_and_blockhash_used()" - ], - "0xdd36e18b": [ - "ContractStatus()" - ], - "0x269975d0": [ - "GameDetails(uint256)" - ], - "0x068c966b": [ - "DrawDetails(uint256)" - ], - "0x86e4e178": [ - "CheckTickets(address,uint256,uint256)" - ], - "0x9bb5239a": [ - "CheckPrize(address,uint256)" - ], - "0x83b23b40": [ - "cEthereumlotteryNet()" - ], - "0xe56b9dce": [ - "GetPrize(uint256)" - ], - "0xd7e11e9d": [ - "AddTicket(bytes)" - ], - "0x3fbd40fd": [ - "ProcessDraw()" - ], - "0x9d3e069c": [ - "StartDraw()" - ], - "0x3211bb90": [ - "OwnerAddFunds()" - ], - "0xcc131be1": [ - "CreateNewDraw(uint256)" - ], - "0xd1d1c8ae": [ - "ConvertNumbers(bytes)" - ], - "0x7154ae61": [ - "CheckNumbers(uint8[5])" - ], - "0x05433a26": [ - "GetNumbersFromHash(bytes)" - ], - "0x090637a1": [ - "GetPart(bytes,uint256)" - ], - "0xe3da41b5": [ - "sortWinningNumbers(uint8[5])" - ], - "0x244c23ee": [ - "Token(uint256,string,uint8,string)" - ], - "0xe0429b6c": [ - "ShinySquirrels()" - ], - "0xc038a38e": [ - "totals()" - ], - "0xc8e4acef": [ - "playerByAddress(address)" - ], - "0xe46164c5": [ - "waitingForPayout()" - ], - "0x030d406b": [ - "entryPayout(uint256)" - ], - "0xfd35e71b": [ - "entryPayoutDue(uint256)" - ], - "0xb95594e5": [ - "lineOfPlayers(uint256)" - ], - "0x93e84cd9": [ - "play()" - ], - "0x99c724ef": [ - "skipInLine(uint256,uint256)" - ], - "0x67f809e9": [ - "DynamicPyramid()" - ], - "0x1da0fb1b": [ - "updateSettings(uint256,uint256,uint256,uint256,uint256,bool)" - ], - "0x60689557": [ - "Rock()" - ], - "0xaf769eff": [ - "Paper()" - ], - "0x25ea269e": [ - "Scissors()" - ], - "0x00c721ab": [ - "setHand(uint256)" - ], - "0xd2b8035a": [ - "draw(uint256,uint256)" - ], - "0x2ad95786": [ - "winner(address)" - ], - "0x6a0e605f": [ - "MyToken(uint256,string,uint8,string,address)" - ], - "0x1b5ee6ae": [ - "mintToken(int256,address,uint256)" - ], - "0x2a64fb63": [ - "getSaleDate(bytes)" - ], - "0xd8e5ae6a": [ - "Etheramid()" - ], - "0xd35ada32": [ - "addParticipant(address,address)" - ], - "0x67dd74ca": [ - "buyTicket(uint256)" - ], - "0x48d9614d": [ - "GetFee()" - ], - "0x2675c123": [ - "CloseContract()" - ], - "0x501e8428": [ - "getPart(bytes,uint256)" - ], - "0x420a8ac8": [ - "NanoPyramid()" - ], - "0xa26dbf26": [ - "totalParticipants()" - ], - "0x64d905c0": [ - "awaitingParticipants()" - ], - "0x3133f2a7": [ - "outstandingBalance()" - ], - "0x6ec3af26": [ - "addTrustedIssuer(address,bytes)" - ], - "0x249b4d0b": [ - "removeTrustedIssuer(address,bytes)" - ], - "0xd3437fe0": [ - "assertFact(uint256,bytes)" - ], - "0x4c4766e8": [ - "KittenRegistry()" - ], - "0x3ead67b5": [ - "changeContractOwner(address)" - ], - "0x1043dcdf": [ - "LastIsMe(uint256,uint256)" - ], - "0xa5f8cdbb": [ - "buyTicket(address)" - ], - "0x313b7b19": [ - "finance()" - ], - "0xb974b0a3": [ - "allData()" - ], - "0x3b355af6": [ - "baseData()" - ], - "0x2f29d8c5": [ - "elapsed()" - ], - "0x55234ec0": [ - "remaining()" - ], - "0xbcc941b6": [ - "totalWinners()" - ], - "0x1e2ca0f3": [ - "updateLeftLottery(address)" - ], - "0xb2353d69": [ - "updateRightLottery(address)" - ], - "0x4a67fa7d": [ - "setLotteryFee(uint256)" - ], - "0x5a09f2f4": [ - "setHouseFee(uint256)" - ], - "0x5af77fff": [ - "Contract()" - ], - "0x315e2f1b": [ - "setTestString(string)" - ], - "0xd8c90762": [ - "addTrustedIssuer(address,string)" - ], - "0xf24b5779": [ - "removeTrustedIssuer(address,string)" - ], - "0xfe05e8b1": [ - "assertFact(uint256,string)" - ], - "0x5fb3e119": [ - "Auction()" - ], - "0xfe777bcd": [ - "etherForSale()" - ], - "0x78e97925": [ - "startTime()" - ], - "0x3197cbb6": [ - "endTime()" - ], - "0xe6d9bb0f": [ - "secondsUntilEnd()" - ], - "0x44691f7e": [ - "hasStarted()" - ], - "0xecb70fb7": [ - "hasEnded()" - ], - "0x5dd672ec": [ - "latestBid()" - ], - "0x63bd1d4a": [ - "payout()" - ], - "0xd98b9bb5": [ - "placeBid(address,uint256)" - ], - "0x90c3a370": [ - "AuctionMaster()" - ], - "0xd5563f31": [ - "createAuction(uint256)" - ], - "0xe6690fb1": [ - "nextAuction(uint256)" - ], - "0xf2b26d8f": [ - "nextEtherForSale()" - ], - "0x7a791524": [ - "setNextFeePercentage(uint8)" - ], - "0x5d068051": [ - "sendFees(address)" - ], - "0xb40a5627": [ - "bidCount()" - ], - "0x2da0d1ea": [ - "etherSold()" - ], - "0xdeb6930c": [ - "PriceTicker()" - ], - "0xa2e62045": [ - "update()" - ], - "0x7bc25372": [ - "UserCheckBalance(address)" - ], - "0x53b7b2e9": [ - "cEthereumlotteryNet(bytes)" - ], - "0x78e80b39": [ - "UserGetPrize()" - ], - "0x2b291eb6": [ - "UserAddTicket(bytes)" - ], - "0x3e0663e0": [ - "AdminDrawProcess()" - ], - "0xd96de4ce": [ - "AdminDrawError()" - ], - "0xe26c8434": [ - "AdminStartDraw(string,bytes)" - ], - "0x370b6939": [ - "AdminSetDrawer(address)" - ], - "0x0acf473b": [ - "AdminCloseContract()" - ], - "0x3fa6497f": [ - "AdminAddFunds()" - ], - "0xb6294bde": [ - "AdminGetFee()" - ], - "0xc1e5304a": [ - "CreateNewDraw(uint256,bytes)" - ], - "0xbf32bf97": [ - "FailGuyTax()" - ], - "0x24a852c6": [ - "unset(bytes)" - ], - "0x804ba97a": [ - "tryGet(bytes)" - ], - "0x2a0d79ef": [ - "totalSupply(bytes)" - ], - "0x8606f905": [ - "balanceOf(address,bytes)" - ], - "0x5fd9dff6": [ - "allowance(address,address,bytes)" - ], - "0xab67aa58": [ - "transferFrom(address,address,uint256,bytes)" - ], - "0x5c17f9f4": [ - "approve(address,uint256,bytes)" - ], - "0x669dafe8": [ - "toWei(uint256)" - ], - "0xe4fc6b6d": [ - "distribute()" - ], - "0xb78b52df": [ - "allocate(address,uint256)" - ], - "0x6617e11a": [ - "NiceGuyTax()" - ], - "0x0a7493b4": [ - "Etheropt(uint256,string,uint256,uint256,bytes,address,int256[])" - ], - "0x7c7c7695": [ - "getAccountID(address)" - ], - "0xce88b145": [ - "getAccount(uint256)" - ], - "0xa26759cb": [ - "addFunds()" - ], - "0x155dd5ee": [ - "withdrawFunds(uint256)" - ], - "0x5c665f89": [ - "getFunds(address,bool)" - ], - "0xd5544f94": [ - "getFundsAndAvailable(address)" - ], - "0x502414e4": [ - "marketMaker(string)" - ], - "0x2043285d": [ - "getMarketMakers()" - ], - "0x0e1087c3": [ - "getMarketMakerFunds()" - ], - "0x756fb8c9": [ - "getOptionChain()" - ], - "0xd4dfadbf": [ - "getMarket(address)" - ], - "0xc398f030": [ - "expire(uint256,uint8,bytes,bytes,bytes)" - ], - "0xec0b4153": [ - "getMoneyness(int256,uint256,uint256)" - ], - "0xc6cb7a96": [ - "orderMatchTest(uint256,uint256,int256,uint256,uint256,address,address,uint256,int256)" - ], - "0x6663bbec": [ - "orderMatch(uint256,uint256,int256,uint256,uint256,address,uint8,bytes,bytes,int256)" - ], - "0x17c65aa7": [ - "getMaxLossAfterTrade(address,uint256,int256,int256)" - ], - "0x209a5b8a": [ - "moneySumAtSettlement(address,uint256,int256,uint256)" - ], - "0x7d619d9b": [ - "holdCoin(address,address)" - ], - "0xa66f7ad6": [ - "signRelease(uint256)" - ], - "0xbff0fbb8": [ - "calculateMeat(uint256)" - ], - "0xb8d3bfe3": [ - "MeatGrindersAssociation(address,address,uint256,uint256,uint256,address)" - ], - "0x5938748e": [ - "changeVotingRules(address,address,uint256,uint256,uint256)" - ], - "0xeb08b304": [ - "changeMeatProvider(address)" - ], - "0x677342ce": [ - "sqrt(uint256)" - ], - "0x4ae85627": [ - "grindUnicorns(uint256)" - ], - "0x9a92b7e7": [ - "EthVenturesFinal()" - ], - "0x1097e579": [ - "Enter()" - ], - "0x3edd90e7": [ - "NewOwner(address)" - ], - "0x6b1781b6": [ - "Emergency()" - ], - "0x611daa7e": [ - "EmergencyBalanceReset(uint256)" - ], - "0x476e04c7": [ - "NewMessage(string)" - ], - "0x4cd11943": [ - "NewManualInvestor(address,uint256)" - ], - "0x112c7075": [ - "ManualDeposit()" - ], - "0x9f7f760c": [ - "SimpleDice()" - ], - "0x8fcc9cfb": [ - "setMinDeposit(uint256)" - ], - "0x45596e2e": [ - "setFeeRate(uint256)" - ], - "0x4b09ebb2": [ - "e_exp(uint256)" - ], - "0x24d4e90a": [ - "ln(uint256)" - ], - "0x084d72f4": [ - "getWinningOutcome(uint256)" - ], - "0xabebb7f3": [ - "MarketsContract()" - ], - "0x74580e2f": [ - "changeCreator(address)" - ], - "0x5a58cd4c": [ - "deleteContract()" - ], - "0xcdd13701": [ - "getEventHashes(uint256[256])" - ], - "0xb2c652f3": [ - "getMarkets(uint256[128])" - ], - "0x90e3c278": [ - "getShares(uint256[128])" - ], - "0x76abc03b": [ - "getShareDistribution(uint256)" - ], - "0xff49b26e": [ - "createEvent(uint256,uint256,uint8,uint32,address,uint256,uint8)" - ], - "0x7a29332d": [ - "buyAllOutcomes(uint256,uint256)" - ], - "0x4757f1d2": [ - "redeemAllOutcomes(uint256,uint256)" - ], - "0x154af6b1": [ - "sendShares(uint256,uint8,uint256,address)" - ], - "0xd7ed7453": [ - "redeemWinnings(uint256)" - ], - "0x1335ff36": [ - "createEventAndMarketMaker(uint256,uint256,uint8,uint32,address,uint256,uint8,uint16,uint256)" - ], - "0x968908a3": [ - "createMarketMaker(uint256,uint16,uint256)" - ], - "0xc7489441": [ - "closeMarketMaker(uint256)" - ], - "0x3f887fad": [ - "buyShares(uint256,uint8,uint256,uint256)" - ], - "0x590528a9": [ - "sellShares(uint256,uint8,uint256,uint256)" - ], - "0x7ef1925b": [ - "getShareRange(uint256,uint8)" - ], - "0x550dd006": [ - "calcCostsBuying(uint256,uint8,uint8,uint256)" - ], - "0x6111dd02": [ - "calcCostsSelling(uint256,uint8,uint8,uint256)" - ], - "0x8112821f": [ - "EthVentures()" - ], - "0xa20495d3": [ - "Managed()" - ], - "0xb3a2a6c0": [ - "setOfficialWebsite(string)" - ], - "0xa49d53a1": [ - "SmartRevshare()" - ], - "0x3d750b28": [ - "found()" - ], - "0x14ba5c09": [ - "getDay()" - ], - "0xcde99727": [ - "calculateROI()" - ], - "0x791b51f1": [ - "Consulting(address,address)" - ], - "0x51a5f2f2": [ - "ConsultingHalf(address,address)" - ], - "0x06900c41": [ - "ZeroPonzi()" - ], - "0x61472fd4": [ - "CSGOBets()" - ], - "0x940c154b": [ - "lockBet(uint256)" - ], - "0xe1152343": [ - "payout(uint256)" - ], - "0x85b1423e": [ - "returnAll()" - ], - "0xd7a58658": [ - "changeHouseedge(uint8)" - ], - "0x41fa4876": [ - "multiBlockRandomGen(uint256,uint256)" - ], - "0x340ddda6": [ - "MeatConversionCalculator(uint256,uint256)" - ], - "0x6fa8de90": [ - "changeMeatParameters(uint256,uint256)" - ], - "0xa80d4e9a": [ - "EtherAuction(uint256)" - ], - "0xe1c7392a": [ - "init()" - ], - "0x1998aeef": [ - "bid()" - ], - "0xfe67a54b": [ - "endAuction()" - ], - "0x547eeac1": [ - "acceptTransfer()" - ], - "0xed54746e": [ - "lastAuction()" - ], - "0xec93cfae": [ - "FountainOfWealth()" - ], - "0x2a745971": [ - "BlockKing()" - ], - "0x2431f164": [ - "process_payment()" - ], - "0x8e035ac1": [ - "BetOnHashV82()" - ], - "0x547916ea": [ - "finishRound()" - ], - "0xb688a363": [ - "join()" - ], - "0x6bf8f85a": [ - "forceFinish()" - ], - "0x9eded57a": [ - "paybackLast()" - ], - "0x72388610": [ - "paybackAll()" - ], - "0x758b5172": [ - "setPlayersPerRound(uint256)" - ], - "0x07da68f5": [ - "stop()" - ], - "0xa77b2e37": [ - "Coin()" - ], - "0xd0679d34": [ - "send(address,uint256)" - ], - "0x37ae43a3": [ - "BetOnHashV81()" - ], - "0xd850288b": [ - "etherlist_top()" - ], - "0x4789aaef": [ - "EthereumDice()" - ], - "0xc2e9fab3": [ - "SubUser()" - ], - "0x6d853ab6": [ - "isSubUser(address)" - ], - "0x018f5472": [ - "isAUser(address)" - ], - "0xc5d5997c": [ - "changeSubUser(address,address)" - ], - "0x0870607b": [ - "addSubUser(address)" - ], - "0x7ccfd45a": [ - "removeSubUser(address)" - ], - "0xbaf00f76": [ - "removeAllSubUsers()" - ], - "0x1a93fa4b": [ - "reorganizeSubUsers()" - ], - "0x8b9e5385": [ - "MeterSlock(uint256,uint256,address)" - ], - "0xf5bade66": [ - "setDeposit(uint256)" - ], - "0x91b7f5ed": [ - "setPrice(uint256)" - ], - "0xb29b5366": [ - "setRentable(bool)" - ], - "0xbe9a6555": [ - "start()" - ], - "0x6299f8cf": [ - "stop(uint256)" - ], - "0xd12c1e28": [ - "badgesOf(address)" - ], - "0x70844f7a": [ - "sendBadge(address,uint256)" - ], - "0x615664ba": [ - "Market()" - ], - "0x177766e6": [ - "getOptionChain(uint256)" - ], - "0x5025b9ae": [ - "expire(uint256,uint256,uint8,bytes,bytes,bytes)" - ], - "0x0448f79f": [ - "addOptionChain(uint256,string,uint256,uint256,bytes,address,int256[])" - ], - "0x42bf4431": [ - "orderMatchTest(uint256,uint256,uint256,int256,uint256,uint256,address,address,int256)" - ], - "0xb3760c80": [ - "orderMatch(uint256,uint256,uint256,int256,uint256,uint256,address,uint8,bytes,bytes,int256)" - ], - "0xfe4667e9": [ - "getMaxLossAfterTrade(address,uint256,uint256,int256,int256)" - ], - "0x69d79ad5": [ - "moneySumAtSettlement(address,uint256,uint256,int256,uint256,uint256)" - ], - "0xabcf1328": [ - "InterestBank()" - ], - "0x6fc9d5e4": [ - "changeCompareTo(uint256)" - ], - "0x315fdea3": [ - "TreasureChest()" - ], - "0xeebf9808": [ - "PiggyBank()" - ], - "0xf9391d24": [ - "AllPayAuction()" - ], - "0xecfc7ecc": [ - "placeBid()" - ], - "0x6b64c769": [ - "startAuction()" - ], - "0xf449619e": [ - "collectPrize(uint256)" - ], - "0x003b9d88": [ - "setLowerFeePercentage(uint8)" - ], - "0x164e68de": [ - "withdrawFees(address)" - ], - "0xdd467064": [ - "lock(uint256)" - ], - "0x1aa3a008": [ - "register()" - ], - "0x362e2565": [ - "returnDeposits()" - ], - "0xcc8b34ab": [ - "CrowdCoin()" - ], - "0x9a777d5d": [ - "buyCoins()" - ], - "0x84054d3d": [ - "cashout()" - ], - "0xa3053236": [ - "SafeInvestments()" - ], - "0xc31d0031": [ - "CrowdFundDAO(string,uint8,string)" - ], - "0x45755dd6": [ - "returnFunds(uint256)" - ], - "0x9b5fde7d": [ - "payOut(uint256,string)" - ], - "0x51d38d5f": [ - "addDeveloper(address,string)" - ], - "0xd9d73887": [ - "Diana()" - ], - "0x8691162a": [ - "TlcCoin()" - ], - "0x4b8e1ba8": [ - "isMinter(int256,address)" - ], - "0x4594d06a": [ - "delMinter(int256,address)" - ], - "0xc478fc37": [ - "EtherWheel(uint256,uint256,uint8)" - ], - "0x8f03850b": [ - "numContributors()" - ], - "0x8b7bcc86": [ - "numWinners()" - ], - "0xe3083fb5": [ - "removeFromContribution(uint256)" - ], - "0x88017e05": [ - "setContribution(uint256)" - ], - "0x33a99e04": [ - "selectWinner()" - ], - "0x739b47ca": [ - "recordWin(address)" - ], - "0x6e940a29": [ - "changeHost(address)" - ], - "0x4cdc6a73": [ - "Marriage()" - ], - "0xce60f78d": [ - "createMarriage(bytes,bytes,uint256,bytes,bytes)" - ], - "0xaf408d89": [ - "setStatus(bytes)" - ], - "0x26826bf8": [ - "setImage(bytes)" - ], - "0xe771066f": [ - "marriageProof(bytes)" - ], - "0x6f3a7561": [ - "SimpleAuction(address)" - ], - "0x2a24f46c": [ - "auctionEnd()" - ], - "0x824dbc9a": [ - "changeMembership(address,uint256,bool,string)" - ], - "0x522103fa": [ - "changeUnicorn(uint256,address)" - ], - "0x83876bc9": [ - "newProposalInWei(address,uint256,string,bytes)" - ], - "0xb9f256cd": [ - "newProposalInEther(address,uint256,string,bytes)" - ], - "0x0358d965": [ - "addPayout(uint256)" - ], - "0x686f2c90": [ - "collectAllFees()" - ], - "0xb4022950": [ - "collectFeesInEther(uint256)" - ], - "0x4229616d": [ - "collectPercentOfFees(uint256)" - ], - "0xced92670": [ - "changeMultiplier(uint256)" - ], - "0xfae14192": [ - "changeFeePercentage(uint256)" - ], - "0x6fbaaa1e": [ - "currentMultiplier()" - ], - "0x8a5fb3ca": [ - "currentFeePercentage()" - ], - "0x09dfdc71": [ - "currentPyramidBalanceApproximately()" - ], - "0x57d4021b": [ - "nextPayoutWhenPyramidBalanceTotalsApproximately()" - ], - "0x253459e3": [ - "feesSeperateFromBalanceApproximately()" - ], - "0xd11f13df": [ - "numberOfParticipantsWaitingForPayout()" - ], - "0x9dbc4f9b": [ - "participantDetails(uint256)" - ], - "0xea851885": [ - "buyStake(bool)" - ], - "0x7c3064f1": [ - "refundStake()" - ], - "0x20909fa0": [ - "communityCurrency()" - ], - "0x7817a60f": [ - "acceptMember(address,string)" - ], - "0xd9e947f3": [ - "kickOutMember(address)" - ], - "0xa5ea11da": [ - "getParameters()" - ], - "0xa5ebf389": [ - "getMoneyTotals()" - ], - "0xac4b2bae": [ - "newParameters(int256,uint256,int256,uint256)" - ], - "0x8da4d776": [ - "newCommune(address)" - ], - "0x9718b524": [ - "newTreasury(address)" - ], - "0x127714c7": [ - "getBudget()" - ], - "0x69c4113d": [ - "setNewBudget(uint256,uint256,uint256,uint256)" - ], - "0x69433e12": [ - "setExchange(uint256)" - ], - "0x70ab8ba8": [ - "creditUpdate()" - ], - "0xddb1bdc8": [ - "credit(address,uint256,uint256)" - ], - "0x1bad1d2e": [ - "monitorWallet(address)" - ], - "0x1b9f9647": [ - "accessMyWallet(address)" - ], - "0x85f8c16d": [ - "claimHours(int256)" - ], - "0x6a357465": [ - "payHours(address,uint256)" - ], - "0xea5ea470": [ - "payFunding(uint256)" - ], - "0x4f20f35a": [ - "payExpenses(address,uint256)" - ], - "0xc81caae7": [ - "acceptMember(address,string,string)" - ], - "0x80aed05f": [ - "LooneyDice()" - ], - "0xef7507c8": [ - "testWinner(uint256)" - ], - "0xcd5e3c5d": [ - "roll()" - ], - "0x699b328a": [ - "randomize()" - ], - "0x5601eaea": [ - "execute(uint256,uint256)" - ], - "0x4aa16737": [ - "enter(uint8)" - ], - "0x33f707d1": [ - "ownerWithdraw(uint256)" - ], - "0x37ab8f20": [ - "notifyPlayer(uint256,uint256,uint256,uint256)" - ], - "0xc2fb8f36": [ - "TinyHuman(address,address,address)" - ], - "0xad5c613d": [ - "purchase(bytes)" - ], - "0xd50495f4": [ - "addTransaction(bytes)" - ], - "0xb7f2f33c": [ - "transferRightIfApproved(address,bytes)" - ], - "0xed3058e0": [ - "transferRight(address,bytes)" - ], - "0xeba36dbd": [ - "setAddr(uint256,address)" - ], - "0x0790e880": [ - "setBlockappsAddr(address)" - ], - "0x8eec99c8": [ - "setNewAdmin(address)" - ], - "0x3d6a3664": [ - "setNewOracle(address)" - ], - "0x7ba38916": [ - "changeAdminFromBoard(address)" - ], - "0x279e0912": [ - "getDownloadPrice()" - ], - "0xb83069c5": [ - "getStemPrice()" - ], - "0xa33d4968": [ - "Tripler()" - ], - "0xe977992d": [ - "Doubler()" - ], - "0xa88c5ef7": [ - "NextPayout()" - ], - "0x8cf4dbfb": [ - "collectBalance()" - ], - "0x3169ff3e": [ - "LooneyLottery()" - ], - "0x4311de8f": [ - "ownerWithdraw()" - ], - "0x5d495aea": [ - "pickWinner()" - ], - "0xb94e962a": [ - "allocateTickets(uint256)" - ], - "0x1b83b823": [ - "notifyPlayer(uint256)" - ], - "0xc0a963c9": [ - "notifyWinner(address,uint256)" - ], - "0x5d3278f0": [ - "LooneyFifty()" - ], - "0x7bc49a95": [ - "play(uint256,uint256)" - ], - "0x2262cd94": [ - "wroom()" - ], - "0xd1738b72": [ - "wroomWroom()" - ], - "0x6d7da0b1": [ - "MyContract()" - ], - "0x7bb6a4c6": [ - "uno(uint256)" - ], - "0xa5468081": [ - "Pyramid(address)" - ], - "0x54ba7daa": [ - "enter(bytes,bytes)" - ], - "0xc80c28a2": [ - "getNumberOfParticipants()" - ], - "0xa480ca79": [ - "collectFees(address)" - ], - "0x483ba09e": [ - "setBitcoinBridge(address)" - ], - "0x02dc2e1d": [ - "queuePayment(bytes)" - ], - "0x27d6c032": [ - "unregister(bytes)" - ], - "0x6b4dd158": [ - "getPrice(bytes)" - ], - "0x7a6e9df7": [ - "getTimestamp(bytes)" - ], - "0x08b7fa31": [ - "PriceFeed()" - ], - "0xd249a52e": [ - "update(bytes,uint256[],uint256[])" - ], - "0x43d24a5e": [ - "addUpdater(address)" - ], - "0x04b07a5e": [ - "removeUpdater(address)" - ], - "0x76999896": [ - "KingOfTheEtherThrone()" - ], - "0xc8fdc891": [ - "numberOfMonarchs()" - ], - "0xb66a323c": [ - "claimThrone(string)" - ], - "0x0eb3f5a0": [ - "sweepCommission(uint256)" - ], - "0x55cc4e57": [ - "setIssuer(address)" - ], - "0x566735d8": [ - "PreVNK(uint256,string,string,uint8)" - ], - "0xb5d03751": [ - "YoutubeViews()" - ], - "0xaacf5328": [ - "setVideoID(string,uint256)" - ], - "0x788e26e7": [ - "sponsorDeposit()" - ], - "0x2a228fc2": [ - "processWithdrawals()" - ], - "0x01518d76": [ - "sendQuery(uint256)" - ], - "0x23145ca0": [ - "forceCheck()" - ], - "0x918f1bb5": [ - "ProjectKudos()" - ], - "0xd56b2889": [ - "finish()" - ], - "0x72929b56": [ - "getKudosPerProject(address)" - ], - "0x505ff574": [ - "register(address,uint256,bool)" - ], - "0xec3af4a9": [ - "getProjectKudos(address)" - ], - "0x94f60a63": [ - "getKudosLeft(address)" - ], - "0xe116b17e": [ - "getKudosLeftForProject(address,address)" - ], - "0xf4a81d08": [ - "getKudosGiven(address)" - ], - "0xda82a035": [ - "sweepCommission()" - ], - "0x2004dff6": [ - "Basics()" - ], - "0xc0aa18e7": [ - "History()" - ], - "0x84ebde52": [ - "Under_the_Hood()" - ], - "0xa9f6def0": [ - "HonestDice()" - ], - "0xaa9669c1": [ - "roll(uint256,bytes)" - ], - "0xa48566ba": [ - "serverSeed(address,bytes)" - ], - "0x59dac714": [ - "hashTo256(bytes)" - ], - "0xaa1e84de": [ - "hash(bytes)" - ], - "0xa094a031": [ - "isReady()" - ], - "0x2fac1d36": [ - "isReadyFor(address)" - ], - "0xef4592fb": [ - "getResult(bytes)" - ], - "0xf93589ce": [ - "didWin(bytes)" - ], - "0x06b5f02d": [ - "calcWinnings(uint256,uint256)" - ], - "0x2d9a37d3": [ - "getMaxPayout()" - ], - "0xc63ff8dd": [ - "claim(bytes)" - ], - "0xc7cf28fe": [ - "canClaimTimeout()" - ], - "0x0e1da6c3": [ - "claimTimeout()" - ], - "0x839930ba": [ - "getMinimumBet()" - ], - "0x0d1fce42": [ - "getBankroll()" - ], - "0x021991e7": [ - "getBetsLocked()" - ], - "0x55b775ea": [ - "setFeed(address)" - ], - "0x46b305d6": [ - "lockBetsForWithdraw()" - ], - "0xa1b9af31": [ - "unlockBets()" - ], - "0xc47bc007": [ - "add_funds()" - ], - "0xcce81927": [ - "EtherDice(address,address)" - ], - "0x89ef40e7": [ - "numberOfHealthyGenerations()" - ], - "0x918359c6": [ - "needsBirth()" - ], - "0x97950740": [ - "roomForBirth()" - ], - "0x32cea83e": [ - "birth(bytes)" - ], - "0xb3c1a588": [ - "parseMsgData(bytes)" - ], - "0x827ef325": [ - "_parseMsgData(bytes)" - ], - "0x83e78b31": [ - "bet(uint8,bool,uint8)" - ], - "0x21520c5f": [ - "calculatePayout(uint8,bool,uint256)" - ], - "0x2df8e00d": [ - "becomeMortal(uint256)" - ], - "0xe94a4db1": [ - "isSuitableGen(uint256,uint256)" - ], - "0x640f244b": [ - "findSuitableGen()" - ], - "0x62770252": [ - "needsFuneral(uint256)" - ], - "0xfed4614b": [ - "funeral(bytes,int256)" - ], - "0xf004073a": [ - "performAction(uint256)" - ], - "0x0fa9ced4": [ - "emergencyFuneral()" - ], - "0x99bb875c": [ - "funeralAndBirth(bytes,int256,bytes)" - ], - "0x44dd4b3b": [ - "lookupGeneration(uint256)" - ], - "0x784813e0": [ - "lookupBet(uint256,uint256)" - ], - "0xd5a4a3c6": [ - "findRecentBet(address)" - ], - "0xfe72e717": [ - "toDie(bytes)" - ], - "0x69bdfd3a": [ - "toContractDie(bytes,bytes,uint256)" - ], - "0x61886014": [ - "combineDice(uint8,uint8)" - ], - "0xe0457884": [ - "betResolution(uint8,uint8,uint8,bool)" - ], - "0x67acd805": [ - "lowerMinWager(uint256)" - ], - "0x03bda14e": [ - "raiseMaxNumBets(uint256)" - ], - "0xe87508be": [ - "investorDeposit()" - ], - "0xe6febc9b": [ - "investorWithdraw(uint256)" - ], - "0xd7206124": [ - "setInvestorLock(bool)" - ], - "0x0c1fad51": [ - "setSeedSourceA(address)" - ], - "0x6615dd83": [ - "setSeedSourceB(address)" - ], - "0xcd591822": [ - "CanaryV7Fast()" - ], - "0x21a49ec2": [ - "LCoin()" - ], - "0x02ba8742": [ - "sendCoins(address,uint256)" - ], - "0x3288eb0b": [ - "ChineseCookies()" - ], - "0x47b47102": [ - "bakeCookie(string)" - ], - "0xb78bd4a5": [ - "breakCookie(string)" - ], - "0xfce59d0c": [ - "MangoRepo()" - ], - "0xceebe28d": [ - "repoInterfaceVersion()" - ], - "0x80d9eaa6": [ - "refCount()" - ], - "0x8c79a24d": [ - "refName(uint256)" - ], - "0x9d170c5d": [ - "getRef(string)" - ], - "0x7d89ae63": [ - "__findRef(string)" - ], - "0x8bb0faee": [ - "setRef(string,string)" - ], - "0x5ae5df8f": [ - "deleteRef(string)" - ], - "0xadd82871": [ - "strEqual(string,string)" - ], - "0x098ab6a1": [ - "snapshotCount()" - ], - "0x76f10ad0": [ - "getSnapshot(uint256)" - ], - "0xfee6d28c": [ - "addSnapshot(string)" - ], - "0x8ac6a869": [ - "isObsolete()" - ], - "0x5cac8b27": [ - "amazing()" - ], - "0x04106c8b": [ - "startGeneration()" - ], - "0x434cb64c": [ - "startNextGeneration()" - ], - "0x11149ada": [ - "getProof(uint256)" - ], - "0x34c1b4ba": [ - "sha(bytes)" - ], - "0xf34ed4e6": [ - "RanDAOPlus(address)" - ], - "0x696bda86": [ - "submitProposal(uint256,bytes)" - ], - "0x141c4e60": [ - "challenge(uint256,address)" - ], - "0xd2756e11": [ - "finalizeNumber(uint256)" - ], - "0x28472c6c": [ - "claimComputation(bytes,bytes)" - ], - "0x287418e7": [ - "query(uint256,uint16)" - ], - "0xc3169ef2": [ - "respond(uint256,uint256[4])" - ], - "0xa068e8d3": [ - "convict(uint256,uint256,uint256,uint256)" - ], - "0x3f5e268f": [ - "convictInitial(uint256,uint256)" - ], - "0x89495172": [ - "convictFinal(uint256,uint256)" - ], - "0x87393bc6": [ - "verifyFirstHalf(uint256[4],uint256[4])" - ], - "0x6bc3e0f0": [ - "verifySecondHalf(uint256[4],uint256[4],uint256[4])" - ], - "0x00b5b223": [ - "computeResponse(uint256,uint16)" - ], - "0x990f3f53": [ - "computeResponseSecondHalf(uint256,uint16)" - ], - "0xe6e8c692": [ - "computeResponseFirstHalf(uint256,uint16)" - ], - "0x3b996f40": [ - "quarter(uint32,uint32,uint32,uint32)" - ], - "0x669e48aa": [ - "get(uint256,uint256)" - ], - "0x541aea0f": [ - "put(uint256,uint256)" - ], - "0xf2b445ad": [ - "rowround(uint256,uint256)" - ], - "0x6189be15": [ - "columnround(uint256,uint256)" - ], - "0x75ee85bd": [ - "salsa20_8(uint256,uint256)" - ], - "0x692ad3a9": [ - "round(uint256,uint256,uint256,uint256)" - ], - "0x19c32e0b": [ - "hmacsha256(bytes,bytes)" - ], - "0x15c91115": [ - "pbkdf2(bytes,bytes,uint256)" - ], - "0x7c7a52bf": [ - "newChallenge(uint256,address)" - ], - "0xbbdb31cb": [ - "challenge(uint256,address,bool)" - ], - "0x9af8c4ba": [ - "respond(uint256,address,bytes)" - ], - "0x18968a03": [ - "finalize(uint256,address,address)" - ], - "0xd500dd6a": [ - "challengeTimeout(uint256,bool,address)" - ], - "0x0ee07836": [ - "adjustDifficulty(uint256)" - ], - "0x60b1e173": [ - "getProof(uint256,address,address)" - ], - "0x98d5fdca": [ - "getPrice()" - ], - "0xd4871517": [ - "BTCLotto(address,uint256)" - ], - "0xc5b1d9aa": [ - "newRound()" - ], - "0xda333ca6": [ - "payOut(uint256)" - ], - "0x8f1327c0": [ - "getRound(uint256)" - ], - "0x0699d07d": [ - "updateMaxVal()" - ], - "0x1f794436": [ - "getBlockHeader(int256)" - ], - "0x02394872": [ - "getLastBlockHeight()" - ], - "0x09dd0e81": [ - "getBlockchainHead()" - ], - "0x0aece23c": [ - "getFeeAmount(int256)" - ], - "0x44d03ac6": [ - "BlockhashFetch(address)" - ], - "0x32254992": [ - "getPrevHash(int256)" - ], - "0x2cce81aa": [ - "getBlockHash(int256)" - ], - "0x66772438": [ - "computeResponse(uint16)" - ], - "0x2776a859": [ - "computeResponseSecondHalf(uint16)" - ], - "0xfe13a823": [ - "computeResponseFirstHalf(uint16)" - ], - "0x954ab4b2": [ - "say()" - ], - "0xd6d22fa4": [ - "MetaCoin()" - ], - "0x7bd703e8": [ - "getBalanceInEth(address)" - ], - "0x87def081": [ - "getFeeRecipient(int256)" - ], - "0xa0f61310": [ - "FakeRelay(bytes)" - ], - "0x96e4ee3d": [ - "convert(uint256,uint256)" - ], - "0xfa2acd87": [ - "G(uint64[16],uint256,uint256,uint256,uint256,uint64,uint64)" - ], - "0x33232609": [ - "blake2b(uint64[],uint64[],uint64)" - ], - "0x217311ac": [ - "getWords(uint64)" - ], - "0xfb72d24e": [ - "shift_right(uint64,uint256)" - ], - "0xbf187478": [ - "shift_left(uint64,uint256)" - ], - "0x0e47c76f": [ - "rotate(uint64,uint256)" - ], - "0x10142785": [ - "assign(bytes,uint256,bytes1)" - ], - "0xd985f122": [ - "RelayToolsTest()" - ], - "0xa54a2b8b": [ - "testBlockHashFetch()" - ], - "0x72c87075": [ - "testBlockHeaderFetch()" - ], - "0xedede601": [ - "testBalance()" - ], - "0x9a79f4a8": [ - "testFailHeaderInsufficientFee()" - ], - "0xfb95adeb": [ - "testFailBlockhashInsuffiecientFee()" - ], - "0xad82dcac": [ - "testBlockhashCorrectFee()" - ], - "0x70c9edb7": [ - "BTCRelayTools(address)" - ], - "0x4016535a": [ - "parseBlock(bytes,uint256)" - ], - "0xee82ac5e": [ - "getBlockHash(uint256)" - ], - "0xae6215d8": [ - "getBlockHeight(bytes)" - ], - "0x19c47214": [ - "getBlockVersion(bytes)" - ], - "0x726ab4ef": [ - "getParentHash(bytes)" - ], - "0xd9c67404": [ - "getMerkleRoot(bytes)" - ], - "0xf74100e3": [ - "getBits(bytes)" - ], - "0x51d6e547": [ - "getNonce(bytes)" - ], - "0x66aa6f26": [ - "payFee(bytes)" - ], - "0xde39acea": [ - "get32(bytes,uint256)" - ], - "0xdf5cc291": [ - "get4(bytes,uint256)" - ], - "0x745a8be2": [ - "flip32(bytes)" - ], - "0x26c7edaa": [ - "flip4(bytes)" - ], - "0x0b74edc6": [ - "testFinalHash()" - ], - "0x2f597e71": [ - "testLongInput()" - ], - "0xa7e25683": [ - "testShortOutput()" - ], - "0x6af2da2f": [ - "testKeyedHash()" - ], - "0xd299dac0": [ - "blake2b(bytes,bytes,uint64)" - ], - "0xd063f55f": [ - "toLittleEndian(uint64)" - ], - "0xd18dfdc9": [ - "parrot(uint256)" - ], - "0x5168afa4": [ - "getPackageHash(bytes,uint8,uint8,uint8)" - ], - "0x027a5e3f": [ - "getLastVersion(bytes)" - ], - "0xa587da29": [ - "setPackage(bytes,uint8,uint8,uint8,bytes)" - ], - "0x3cc8daf7": [ - "setNameOwner(bytes,address)" - ], - "0x44dfdce0": [ - "getNameOwner(bytes)" - ], - "0x4112b7f1": [ - "tryGetNameOwner(bytes)" - ], - "0x03da8902": [ - "transfearDBOwner(address)" - ], - "0x992c870d": [ - "transferName(bytes,address)" - ], - "0x8efc777f": [ - "isBeta(bytes)" - ], - "0xd1d3bb92": [ - "testSetPkg()" - ], - "0x8bab8791": [ - "testPkgUpdate()" - ], - "0xb5784f6f": [ - "testMultiplePackages()" - ], - "0x96013c9c": [ - "testLatestPkgGetter()" - ], - "0x74d89c47": [ - "testUpdateNameDb()" - ], - "0x408938d0": [ - "testUpdatePackageDb()" - ], - "0x930a80b4": [ - "testAuthorizedSetPackage()" - ], - "0x70be4ffa": [ - "testErrorUnauthorizedSetPackage()" - ], - "0xb9a904f9": [ - "testUnauthorizedSetBetaPackage()" - ], - "0x8a341c83": [ - "testErrorRootAuthorityChangeUnownedPackage()" - ], - "0x88a49164": [ - "testErrorUnauthorizedTransfer()" - ], - "0x337b5988": [ - "testSimpleNameRegister()" - ], - "0xeca5c793": [ - "testErrorUnauthorizedNameRegister()" - ], - "0x3e4565d2": [ - "testErrorUnauthorizedNameRegister2()" - ], - "0x36344022": [ - "testAuthorizedTransfer()" - ], - "0xb189ad2a": [ - "testErrorUnauthorizedAfterTransfer()" - ], - "0x0f5381f1": [ - "testUserCanIncreaseVersionNumber()" - ], - "0x5babb758": [ - "testSetUp()" - ], - "0xaf6fe8e2": [ - "testGetToken()" - ], - "0xec2ec781": [ - "testFailGetUnsetToken()" - ], - "0xad447a19": [ - "getBalanceDB()" - ], - "0xec727000": [ - "getApprovalDB()" - ], - "0x9cbf9e36": [ - "createToken()" - ], - "0xe6c3b4ab": [ - "testBalanceAuth()" - ], - "0x07b6f631": [ - "testTestHarnessAuth()" - ], - "0xc89f8f08": [ - "testGetController()" - ], - "0x0fe234ed": [ - "testSetController()" - ], - "0x4fab2ca4": [ - "testGetFrontend()" - ], - "0x9131d803": [ - "testSetFrontend()" - ], - "0x7353f62b": [ - "testGetApprovalDb()" - ], - "0x4df53a0f": [ - "testSetApprovalDb()" - ], - "0xea7a7184": [ - "testGetBalanceDb()" - ], - "0xd0bff051": [ - "testSetBalanceDb()" - ], - "0x2977b1b1": [ - "testAllowanceStartsAtZero()" - ], - "0xf3e3c629": [ - "testBalanceOfStartsAtZero()" - ], - "0xfb09b1ac": [ - "testBalanceOfReflectsTransfer()" - ], - "0xeb7492d1": [ - "testTotalSupply()" - ], - "0x730720b8": [ - "testControllerValidTransfers()" - ], - "0x0d8b5fa2": [ - "testControllerValidTransferFrom()" - ], - "0x1f2e886c": [ - "testControllerTransferTriggersEvent()" - ], - "0x2f5d3916": [ - "testControllerApproveTriggersEvent()" - ], - "0xa32f0f41": [ - "testFailControllerUnapprovedTransferFrom()" - ], - "0x6f4812e2": [ - "testFailControllerInsufficientFundsTransfer()" - ], - "0x296ed88f": [ - "testFailControllerInsufficientFundsTransferFrom()" - ], - "0xe50dce71": [ - "testControllerApproveSetsAllowance()" - ], - "0xf712d7ff": [ - "testFailControllerTransferFromWithoutApproval()" - ], - "0x821e9169": [ - "testFailControllerChargeMoreThanApproved()" - ], - "0x7f924c4e": [ - "testDeposit()" - ], - "0xd509b16c": [ - "testWithdraw()" - ], - "0x23de6651": [ - "emitTransfer(address,address,uint256)" - ], - "0x5687f2b8": [ - "emitApproval(address,address,uint256)" - ], - "0x2b4a3b31": [ - "doTransferFrom(address,address,uint256)" - ], - "0x0f24f5c8": [ - "doTransfer(address,uint256)" - ], - "0xa8484938": [ - "doApprove(address,uint256)" - ], - "0xfa566ddd": [ - "doAllowance(address,address)" - ], - "0xbc2a4dd6": [ - "doBalanceOf(address)" - ], - "0x0994a0a0": [ - "DSTokenTest()" - ], - "0x6632a507": [ - "testSetupPrecondition()" - ], - "0x10922cc1": [ - "testTransferCost()" - ], - "0xe13dc28b": [ - "testValidTransfers()" - ], - "0x61e539da": [ - "testFailWrongAccountTransfers()" - ], - "0xe7faecec": [ - "testFailInsufficientFundsTransfers()" - ], - "0x833b4596": [ - "testApproveSetsAllowance()" - ], - "0xb9a0a708": [ - "testChargesAmountApproved()" - ], - "0x5fe22c8b": [ - "testFailTransferWithoutApproval()" - ], - "0xbfc3cd2f": [ - "testFailChargeMoreThanApproved()" - ], - "0xc1829a14": [ - "testFailTooFewConfirms()" - ], - "0x77e4fb04": [ - "testFailNotEnoughValue()" - ], - "0xdf3a6b10": [ - "testMemberAddedEvent()" - ], - "0x0caf9d39": [ - "testFailTooManyMembers()" - ], - "0xa04a0908": [ - "execute(address,bytes,uint256)" - ], - "0x039a21b8": [ - "tryExecute(address,bytes,uint256)" - ], - "0x28a45038": [ - "testTryProxyCall()" - ], - "0x60a60fd8": [ - "testProxyCallWithValue()" - ], - "0xdd5244b4": [ - "testTryProxyCallWithValue()" - ], - "0x3358d2d3": [ - "buildDSTokenFrontend()" - ], - "0xa7c5052e": [ - "buildDSTokenRegistry()" - ], - "0xb8d94b95": [ - "buildDSNullMap()" - ], - "0x510f44cb": [ - "TestFactoryUser()" - ], - "0xd3ea3322": [ - "testBuildTokenSystemCost()" - ], - "0x2c60a055": [ - "MapTest()" - ], - "0x0e757a2e": [ - "testSetAndGet()" - ], - "0x2f0b15f6": [ - "testGetUnset()" - ], - "0x1dda5c7d": [ - "testFailSubBalanceBelowZero()" - ], - "0x9bac8602": [ - "testFailAddBalanceAboveOverflow()" - ], - "0x953a7fab": [ - "testMoveBalance()" - ], - "0xd930a90b": [ - "testFailMoveBalanceDueToInsufficientFunds()" - ], - "0x0cee22e9": [ - "testSetBalanceSetsSupply()" - ], - "0xcd9380d5": [ - "testSetBalanceSetsSupplyCumulatively()" - ], - "0x6f4dd69c": [ - "testSetBalanceUpdatesSupply()" - ], - "0x0c9fcec9": [ - "setApproval(address,address,uint256)" - ], - "0x89fcd099": [ - "getApproval(address,address)" - ], - "0xa005b87b": [ - "NullMapTest()" - ], - "0x4bd70ea3": [ - "testFailGetUnset()" - ], - "0x7d287697": [ - "testTryGetUnset()" - ], - "0x4464aec7": [ - "testTryGet()" - ], - "0x62a0b56b": [ - "testUnset()" - ], - "0x013d64bd": [ - "setCanCall(address,address,string,bool)" - ], - "0x2a714078": [ - "triggerAuth()" - ], - "0x6cb3d30a": [ - "triggerTryAuth()" - ], - "0x31db4b95": [ - "doTriggerAuth()" - ], - "0xd42bf301": [ - "doTriggerTryAuth()" - ], - "0xfe6f0d82": [ - "testConstructorEvent()" - ], - "0x9e920587": [ - "testOwnedAuth()" - ], - "0x7ac91cc2": [ - "testFailOwnedAuth()" - ], - "0xd3aa831f": [ - "testOwnedTryAuth()" - ], - "0xcae523c1": [ - "testOwnedTryAuthUnauthorized()" - ], - "0xaa7dcd84": [ - "testUpdateAuthorityEvent()" - ], - "0x9205fbc2": [ - "testAuthorityAuth()" - ], - "0x8fd28bcf": [ - "testFailAuthorityAuth()" - ], - "0x31ab4066": [ - "testAuthorityTryAuth()" - ], - "0xfd339d18": [ - "testAuthorityTryAuthUnauthorized()" - ], - "0x5858ef10": [ - "testErrorNonOwnerCantBreach()" - ], - "0x138cc941": [ - "testErrorTransferToRejectAuthority()" - ], - "0xda6b31b9": [ - "testErrorTransferToNullAuthority()" - ], - "0x4e209678": [ - "testFailBreach()" - ], - "0x399fdb86": [ - "testFailNormalWhitelistReset()" - ], - "0x5dcdddd1": [ - "testSafeToAddFix()" - ], - "0xc1c0e9c4": [ - "exec()" - ], - "0x3f74fecb": [ - "DSTrueFallbackTest()" - ], - "0x8a46bf6d": [ - "testFallback()" - ], - "0x92c8eb96": [ - "DSFalseFallbackTest()" - ], - "0x01bb85a4": [ - "__startBlock(string)" - ], - "0xc7102df7": [ - "__stopBlock()" - ], - "0x661e3605": [ - "ConstructorContract(uint256)" - ], - "0x1d57bcf7": [ - "ProofLibInterface()" - ], - "0x1f4e996b": [ - "challenge(bool)" - ], - "0xa991cb0e": [ - "respond(uint256)" - ], - "0x5c5d625e": [ - "getProof()" - ], - "0x92d0d153": [ - "t()" - ], - "0x11f72496": [ - "testT()" - ], - "0xd992bd5b": [ - "testResultNotZero()" - ], - "0xea2ea847": [ - "testChallengeFinalize()" - ], - "0x4b729aff": [ - "buyNumber(uint256)" - ], - "0x9dafbc13": [ - "initBlock(uint256)" - ], - "0xe2bbb158": [ - "deposit(uint256,uint256)" - ], - "0x201dcd7a": [ - "newChallenge(uint256,uint256)" - ], - "0x43114842": [ - "acceptChallenge(uint256,uint256,uint256)" - ], - "0x3c0870ae": [ - "challenge(uint256,uint256,uint256,bool)" - ], - "0xab09ee80": [ - "respond(uint256,uint256,uint256,uint256)" - ], - "0xb6013cef": [ - "finalize(uint256,uint256)" - ], - "0xf869b11a": [ - "declareVictor(uint256,uint256)" - ], - "0x9f489e4e": [ - "getDeposit(uint256,address)" - ], - "0xa0befa94": [ - "getStake(uint256,uint256)" - ], - "0x33637d5a": [ - "getPendingBlock(uint256)" - ], - "0x28cc413a": [ - "getProof(uint256,uint256,uint256)" - ], - "0xc37ff3d9": [ - "sha(uint256,uint256)" - ], - "0xf77a0923": [ - "BitcoinProcessor(address)" - ], - "0x1c0b6367": [ - "processTransaction(bytes,uint256)" - ], - "0x2b861629": [ - "storeBlockHeader(bytes)" - ], - "0xcef887b0": [ - "storeBlockWithFee(bytes,int256)" - ], - "0x6ebf10fe": [ - "storeHeader(bytes,address)" - ], - "0x540cafe0": [ - "storeHeaderWithFee(bytes,int256,address)" - ], - "0x7cc48875": [ - "Slots()" - ], - "0x3b84edbd": [ - "setRNG(address)" - ], - "0xd65ab5f2": [ - "startGame()" - ], - "0xeec3cb41": [ - "placeBet(bool[],uint256,uint256)" - ], - "0xac6bc853": [ - "startSpin()" - ], - "0x934354e7": [ - "finishSpin()" - ], - "0x93c94acb": [ - "calculateRewards(uint256[3][3])" - ], - "0x00100a18": [ - "NewPoll(string,string,uint256,uint256)" - ], - "0x1277e24f": [ - "payOneTimeFee()" - ], - "0xfc36e15b": [ - "vote(string)" - ], - "0x9a36f932": [ - "feeDivisor()" - ], - "0x8d99b2eb": [ - "endPoll()" - ], - "0x224993c2": [ - "setTimeBlock(uint256)" - ], - "0xfcfff16f": [ - "open()" - ], - "0x776d62f6": [ - "costs()" - ], - "0x82996d9f": [ - "rent()" - ], - "0x5ca8bc52": [ - "returnIt()" - ], - "0x8ecc0950": [ - "returnToOwner()" - ], - "0xfb5d5729": [ - "getPongvalTransactional()" - ], - "0x3af94817": [ - "getPongvalRemote()" - ], - "0x40193d17": [ - "getPongvalConstant()" - ], - "0xf4d94699": [ - "EndowmentRetriever()" - ], - "0xfab43cb1": [ - "getPongAddress()" - ], - "0xf00aac7f": [ - "ArrayRR()" - ], - "0x6c6f1d93": [ - "getContractCreationValue()" - ], - "0xa311dd70": [ - "setArray(uint8[10])" - ], - "0xf239e528": [ - "sendOneEtherHome()" - ], - "0xb8c86aa6": [ - "getArraySettingResult()" - ], - "0xd504ea1d": [ - "getArray()" - ], - "0x80db79d9": [ - "StructAndFor()" - ], - "0x181be00d": [ - "getValue(uint8)" - ], - "0x4166c1fd": [ - "getElevation(uint8,uint8)" - ], - "0xa3747fef": [ - "register(bytes,bytes)" - ], - "0x5460ef10": [ - "sendWithExtraGas(address,uint256,uint256)" - ], - "0x5dac1601": [ - "SimpleStablecoin()" - ], - "0xbe7cddf8": [ - "TwoD()" - ], - "0x1ebe5c0f": [ - "sendWithAllOurGasExcept(address,uint256,uint256)" - ], - "0x557ed1ba": [ - "getTime()" - ], - "0x0e13b9af": [ - "getValue(uint8,uint8)" - ], - "0x3ab1e703": [ - "roundMoneyDown3SF(uint256)" - ], - "0x880cdc31": [ - "updateOwner(address)" - ], - "0xd4088e33": [ - "setPrice(uint256,uint256,uint64)" - ], - "0x992ae976": [ - "isSafePunctuation(bytes1)" - ], - "0x6f8b44b0": [ - "setMaxSupply(uint256)" - ], - "0xdb2a0cb7": [ - "HumanStandardTokenFactory()" - ], - "0xbe592488": [ - "validateName(bytes)" - ], - "0x64edfbf0": [ - "purchase()" - ], - "0xa2f3ede2": [ - "computeNameHash(bytes)" - ], - "0xfc94dd18": [ - "verifyHumanStandardToken(address)" - ], - "0xfe757fb5": [ - "lastClaimPrice()" - ], - "0xd35b9d83": [ - "codeAt(address)" - ], - "0x64325ddb": [ - "currentClaimPrice()" - ], - "0x08216c0f": [ - "createHumanStandardToken(uint256,string,uint8,string)" - ], - "0x4f8e624e": [ - "Greeter(string)" - ], - "0x5fbddcf3": [ - "isLivingMonarch()" - ], - "0x42cbb15c": [ - "getBlockNumber()" - ], - "0x2ea459b8": [ - "claimThrone(bytes)" - ], - "0xa15afb48": [ - "Replicator()" - ], - "0xd6d902c4": [ - "claimThroneFor(bytes,address)" - ], - "0xa4136862": [ - "setGreeting(string)" - ], - "0x70961774": [ - "getBlockCreatedOn()" - ], - "0x59a547b0": [ - "recordCommission(uint256)" - ], - "0x715ef4ff": [ - "resendFailedPayment(uint256)" - ], - "0x19a278b9": [ - "getBAddress()" - ], - "0xe6e91cfc": [ - "voidFailedPayment(uint256)" - ], - "0xcb553ac9": [ - "sweepWizardCommission(uint256)" - ], - "0xd96aee49": [ - "MultipleConstructorTest()" - ], - "0x2d116186": [ - "deityBalance()" - ], - "0xa819819b": [ - "sweepDeityCommission(uint256)" - ], - "0x705eeb90": [ - "MultipleConstructorTest(bool)" - ], - "0xedb27f4e": [ - "switchWizard(address)" - ], - "0x1e223143": [ - "getFirst()" - ], - "0xa70a9ad7": [ - "switchDeity(address)" - ], - "0xdce4a447": [ - "at(address)" - ], - "0x1b03316f": [ - "getSecond()" - ], - "0xc1c723f4": [ - "validateProposedMonarchName(bytes)" - ], - "0x6d1f00a6": [ - "ThroneMaker(uint256)" - ], - "0xf2080ba6": [ - "Pong(int8)" - ], - "0x273bc3c9": [ - "numberOfThrones()" - ], - "0x1a092541": [ - "getDescription()" - ], - "0x23a1c271": [ - "setPongval(int8)" - ], - "0x931df75f": [ - "validateProposedThroneName(bytes)" - ], - "0x694e0d5b": [ - "StringPasser(uint8[])" - ], - "0xa396541e": [ - "getPongvalTxRetrievalAttempted()" - ], - "0x01df7f30": [ - "validateProposedThroneConfig(uint256,uint256,uint256,uint256)" - ], - "0x16870257": [ - "getTileDescription(uint8,uint8)" - ], - "0x5581004d": [ - "createThrone(bytes,uint256,uint256,uint256,uint256)" - ], - "0x044f9ac8": [ - "findThroneCalled(bytes)" - ], - "0xd8589be3": [ - "CoinFlipper()" - ], - "0xb3a0b1ef": [ - "basicInfoGetter()" - ], - "0xf4e36afd": [ - "findThroneByNameHash(uint256)" - ], - "0x5acce36b": [ - "getEndowmentBalance()" - ], - "0x4ca8b0d0": [ - "registerExistingThrone(bytes,address,uint256,uint256)" - ], - "0xf8f46b5f": [ - "getCurrentMinerAddress()" - ], - "0xf9e05ed9": [ - "sha(uint128)" - ], - "0x2f4ee5d4": [ - "registerThrone(bytes,uint256,address,uint256,uint256)" - ], - "0x25d8dcf2": [ - "betAndFlip()" - ], - "0xa1188e56": [ - "getCurrentDifficulty()" - ], - "0x58ea80e5": [ - "setThroneCreationPrice(uint256)" - ], - "0x34dbe44d": [ - "getLastBlockNumberUsed()" - ], - "0x92b7d5b9": [ - "getCurrentGaslimit()" - ], - "0x94c3fa2e": [ - "getLastBlockHashUsed()" - ], - "0xee6d2641": [ - "sendWithExtraGasExt(address,uint256,uint256)" - ], - "0x6fd902e1": [ - "getCurrentBlockNumber()" - ], - "0xcee6f93c": [ - "getResultOfLastFlip()" - ], - "0x5294157f": [ - "sendWithAllOurGasExceptExt(address,uint256,uint256)" - ], - "0x796b89b9": [ - "getBlockTimestamp()" - ], - "0x0efafd01": [ - "getPlayerGainLossOnLastFlip()" - ], - "0x4b5dc8cb": [ - "roundMoneyDown3SFExt(uint256)" - ], - "0xc8e7ca2e": [ - "getMsgData()" - ], - "0x4d536f9f": [ - "validateNameExt(bytes)" - ], - "0x7a6ce2e1": [ - "getMsgSender()" - ], - "0x635cfda2": [ - "Incrementer()" - ], - "0x7fd8ee68": [ - "computeNameHashExt(bytes)" - ], - "0xa17042cc": [ - "getMsgValue()" - ], - "0xfc2c3e08": [ - "getIteration()" - ], - "0x9d5c6061": [ - "getMsgGas()" - ], - "0x77e5bf84": [ - "getTxGasprice()" - ], - "0xb8077e28": [ - "getTxOrigin()" - ], - "0xe31bfa00": [ - "next_id()" - ], - "0x32a2c5d0": [ - "getContractAddress()" - ], - "0x26066ad5": [ - "offer(uint256,bytes,uint256,bytes)" - ], - "0xc3da42b8": [ - "c()" - ], - "0x6f9fb98a": [ - "getContractBalance()" - ], - "0xb742398b": [ - "trade(address,uint256,bytes,address,uint256,bytes)" - ], - "0x67cb61b6": [ - "getChoice()" - ], - "0xd96a094a": [ - "buy(uint256)" - ], - "0x29161820": [ - "Base(uint256)" - ], - "0xa5d0bab1": [ - "buyPartial(uint256,uint256)" - ], - "0x20bf0c52": [ - "Derived(uint256)" - ], - "0x40e58ee5": [ - "cancel(uint256)" - ], - "0x13d1aa2e": [ - "f(uint256,uint256)" - ], - "0x4579268a": [ - "getOffer(uint256)" - ], - "0xe420264a": [ - "g(uint256)" - ], - "0x57e871e7": [ - "blockNumber()" - ], - "0x4848b1a5": [ - "setData(uint256,uint256)" - ], - "0x83324e8c": [ - "numGroups()" - ], - "0x0178fe3f": [ - "getData(uint256)" - ], - "0x3807ba1b": [ - "poi()" - ], - "0x9928811b": [ - "testBroken()" - ], - "0x75949c13": [ - "sendHalf(address)" - ], - "0x3c7a3aff": [ - "commit()" - ], - "0x90b5561d": [ - "insert(uint256)" - ], - "0x27121069": [ - "verify(bytes,uint8,bytes,bytes)" - ], - "0x3e2729bf": [ - "isRevocated(bytes)" - ], - "0x853255cc": [ - "sum()" - ], - "0x8cfd8901": [ - "_incBlock()" - ], - "0x2feda2fa": [ - "POI()" - ], - "0x6a4a6b6e": [ - "_myAddressHelper()" - ], - "0x100c8ada": [ - "setCAmodulus(bytes)" - ], - "0x5bbfe9b6": [ - "_myGroupHelper()" - ], - "0x114d69b2": [ - "setCRLaddr(address)" - ], - "0xfd747c0b": [ - "rsaVerify(bytes,bytes,uint256,bytes)" - ], - "0x8ac4e1d8": [ - "TemperatureOracle()" - ], - "0xfaee13b9": [ - "set(int8)" - ], - "0x84734476": [ - "copyBytes(bytes,uint256,uint256,bytes,uint256)" - ], - "0x9507d39a": [ - "get(uint256)" - ], - "0x9209b3c0": [ - "getCrtDetails(bytes)" - ], - "0x17ff0caa": [ - "WeatherBet(uint256,address,address,address)" - ], - "0x4664b235": [ - "bytes32_to_bytes(bytes,bytes,bytes)" - ], - "0x71dd8862": [ - "IndexOf()" - ], - "0xfc687311": [ - "betOn(int8)" - ], - "0xa87e7552": [ - "isValid(bytes,bytes)" - ], - "0x264c8e9a": [ - "whatWasTheVal()" - ], - "0x0b7623ba": [ - "abs(int8)" - ], - "0xb4787dc5": [ - "linkEID(bytes,bytes)" - ], - "0xbe71248a": [ - "payWinner()" - ], - "0x2a095fbe": [ - "unlinkEID(bytes,bytes,address)" - ], - "0x511b1df9": [ - "addr(string)" - ], - "0x2d077ad0": [ - "Latch()" - ], - "0x01984892": [ - "name(address)" - ], - "0x616fca9b": [ - "adopt(address)" - ], - "0xdf55b41a": [ - "owner(string)" - ], - "0x2125b65b": [ - "transfer(uint32,address,uint224)" - ], - "0x7f445c24": [ - "subRegistrar(string)" - ], - "0xf509b627": [ - "confirm(address,uint224,uint32,address)" - ], - "0xdd54a62f": [ - "content(string)" - ], - "0xa79f26dc": [ - "force()" - ], - "0x20620f37": [ - "onAuctionEnd(string)" - ], - "0x89cc5ea8": [ - "bid(string,address,uint256)" - ], - "0xb9f37c86": [ - "Registrar()" - ], - "0xae999ece": [ - "reserve(string)" - ], - "0xff1f7046": [ - "requiresAuction(string)" - ], - "0x092b25e9": [ - "setOwner(string,address)" - ], - "0x01bd4051": [ - "disown(string)" - ], - "0xc47f0027": [ - "setName(string)" - ], - "0x9b2ea4bd": [ - "setAddress(string,address)" - ], - "0xccf4f413": [ - "setSubRegistrar(string,address)" - ], - "0x8bbda7e3": [ - "setContent(string,bytes)" - ], - "0x98b1e06a": [ - "deposit(bytes)" - ], - "0x1bcf5758": [ - "getOccupies(uint8)" - ], - "0xfde9ba41": [ - "transfer(bytes,address,uint256)" - ], - "0x0878bc51": [ - "getAttachesto(uint8)" - ], - "0x922dd59a": [ - "icapTransfer(bytes,address,bytes,uint256)" - ], - "0x4d9e4e22": [ - "Etheria()" - ], - "0xe039e4a1": [ - "getOwner(uint8,uint8)" - ], - "0xdd34e129": [ - "PriceTest()" - ], - "0x7d5fec5a": [ - "setOwner(uint8,uint8,address)" - ], - "0xd2d4bd72": [ - "getCrossRate(bytes,bytes)" - ], - "0xa55cab95": [ - "getName(uint8,uint8)" - ], - "0x93eec1fb": [ - "setName(uint8,uint8,string)" - ], - "0xd39eb301": [ - "getStatus(uint8,uint8)" - ], - "0x54385526": [ - "setStatus(uint8,uint8,string)" - ], - "0x8435be4b": [ - "getLastFarm(uint8,uint8)" - ], - "0x90fd53ec": [ - "farmTile(uint8,uint8,int8)" - ], - "0x8cae1374": [ - "editBlock(uint8,uint8,uint256,int8[5])" - ], - "0xfa93019c": [ - "getBlocks(uint8,uint8)" - ], - "0x4ca168cf": [ - "register(bytes,uint256,address,string,uint256)" - ], - "0x2ef761d3": [ - "buyTile(uint8,uint8)" - ], - "0x6cf9cc58": [ - "registerResource(bytes,uint256,bytes,string)" - ], - "0x46c52b1a": [ - "blockHexCoordsValid(int8,int8)" - ], - "0xfae9d06d": [ - "calculateTxFee(uint256,address)" - ], - "0xbb963c8a": [ - "transferLibOwnership(bytes,address)" - ], - "0x8d7108e5": [ - "isValidLocation(uint8,uint8,int8[5],int8[24])" - ], - "0xfe029156": [ - "swap(address,address,uint256,uint256)" - ], - "0x081bf263": [ - "isOOB(uint8,uint8)" - ], - "0x4dd49ab4": [ - "get(bytes,uint256)" - ], - "0x9cc9299e": [ - "killSwap()" - ], - "0x182db370": [ - "getWhatHappened()" - ], - "0x6e353a1d": [ - "emergencyWithdrawal(address)" - ], - "0xdf98ef33": [ - "getResource(bytes,uint256,bytes)" - ], - "0xf2a75fe4": [ - "empty()" - ], - "0xc913b552": [ - "getVersions(bytes)" - ], - "0x10c1952f": [ - "setLocked()" - ], - "0x0f7d6673": [ - "Channel()" - ], - "0x763a738c": [ - "allNames()" - ], - "0x2d49ffcd": [ - "getLocked()" - ], - "0x423d4ef2": [ - "createChannel()" - ], - "0xcb14d93b": [ - "getHash(bytes,address,uint256)" - ], - "0x4d1f8c31": [ - "owner(uint64)" - ], - "0xadf5e565": [ - "verify(bytes,address,uint256,uint8,bytes,bytes)" - ], - "0xe86afde0": [ - "description(uint64)" - ], - "0x60c6b3a5": [ - "claim(bytes,address,uint256,uint8,bytes,bytes)" - ], - "0x0fdb468f": [ - "fee(uint64)" - ], - "0xcebce72d": [ - "token(uint64)" - ], - "0xf1c30ec0": [ - "reclaim(bytes)" - ], - "0xc0171112": [ - "timestamp(uint64)" - ], - "0x7b1cbb13": [ - "getChannelValue(bytes)" - ], - "0x1216e771": [ - "expiration(uint64)" - ], - "0x29e94503": [ - "VersionedBlob()" - ], - "0x5322f0c5": [ - "getChannelOwner(bytes)" - ], - "0x1c2f38ff": [ - "paid(uint64)" - ], - "0x4c488dac": [ - "getChannelValidUntil(bytes)" - ], - "0x9eab5253": [ - "getMembers()" - ], - "0x7c79ebce": [ - "expired(uint64)" - ], - "0x01da73ff": [ - "isValidChannel(bytes)" - ], - "0x541d920c": [ - "commit(bytes,string)" - ], - "0x9e66cd38": [ - "free(uint64)" - ], - "0x6dd6e87b": [ - "checkOut(int256)" - ], - "0x1fb6e99d": [ - "paymentNeeded(uint64)" - ], - "0xbb4d7cd1": [ - "tag(uint256,string)" - ], - "0x268eb055": [ - "setDescription(uint64,bytes)" - ], - "0x856deacf": [ - "findTag(string)" - ], - "0x21b36a08": [ - "setFee(uint64,uint256)" - ], - "0x86bb7121": [ - "getBlocksPerRound()" - ], - "0xb0de1cb7": [ - "publish(uint64,bytes,uint64)" - ], - "0x35d129f6": [ - "untag(string)" - ], - "0x7ef09476": [ - "transfer(uint64,address)" - ], - "0x87bb7ae0": [ - "getTicketPrice()" - ], - "0x4c6d1d9e": [ - "checkOutTag(string)" - ], - "0x89b8b492": [ - "read(uint64)" - ], - "0x67af1c81": [ - "getRoundIndex()" - ], - "0x49cbe338": [ - "tryRead(uint64)" - ], - "0x358d5dc2": [ - "getIsCashed(uint256,uint256)" - ], - "0xb1d51d31": [ - "pay(uint64,address)" - ], - "0x6572ae13": [ - "calculateWinner(uint256,uint256)" - ], - "0x452fbc41": [ - "USN(address,address,bytes,uint256,uint256,uint128)" - ], - "0xdf2f0a4a": [ - "getDecisionBlockNumber(uint256,uint256)" - ], - "0x46a2679a": [ - "getSubpotsCount(uint256)" - ], - "0x93dafba2": [ - "getSubpot(uint256)" - ], - "0x1e62be25": [ - "Bytes32Passer()" - ], - "0x930ed251": [ - "getSavedVar()" - ], - "0xce5566c5": [ - "cash(uint256,uint256)" - ], - "0x6df3edef": [ - "getSavedBytes()" - ], - "0x8089d001": [ - "getHashOfBlock(uint256)" - ], - "0x812cddf2": [ - "getSavedString()" - ], - "0x459f93f7": [ - "getBuyers(uint256,address)" - ], - "0x305a762a": [ - "getTicketsCountByBuyer(uint256,address)" - ], - "0x28d3ad3f": [ - "getPot(uint256)" - ], - "0xbcd3d8ca": [ - "Collector(address,address,uint256)" - ], - "0xaf93afdd": [ - "Shipment(bytes,bytes,bytes,bytes,string,bytes,uint256,uint256,bytes,bytes,uint256,uint256,string,bytes,bytes,bytes)" - ], - "0x7e3faec1": [ - "GoldTxFeePool(address,address,bytes)" - ], - "0x7b789b3d": [ - "agreement(bytes,bytes,bytes)" - ], - "0xd7f31eb9": [ - "forward(address,uint256,bytes)" - ], - "0x5e11544b": [ - "newPeriod()" - ], - "0xe2fdcc17": [ - "escrow()" - ], - "0x45d27edf": [ - "forward_method(bytes,address,uint256,bytes)" - ], - "0x8d227fc0": [ - "getPeriodInfo()" - ], - "0xd116c8c4": [ - "releasePayment()" - ], - "0x97daa043": [ - "register(bytes,address,address,uint256,bytes)" - ], - "0x11e99c22": [ - "arrival()" - ], - "0xa7dfc874": [ - "unregister(bytes,address,uint256,bytes)" - ], - "0x412664ae": [ - "sendToken(address,uint256)" - ], - "0x86c57fcc": [ - "b32ToBytes(bytes)" - ], - "0x8c4dd5cd": [ - "Democracy()" - ], - "0x66d38203": [ - "setup(address)" - ], - "0xe8a1c08f": [ - "nibbleToChar(uint256)" - ], - "0x86a50535": [ - "voteFor(uint256)" - ], - "0xdbc45228": [ - "newProposal(address,uint256,bytes,bytes)" - ], - "0xa99e7e29": [ - "register(bytes,address)" - ], - "0x5e44daf3": [ - "vote(uint256,int256)" - ], - "0x750e443a": [ - "voteAgainst(uint256)" - ], - "0x0d61b519": [ - "executeProposal(uint256)" - ], - "0x798974dd": [ - "getNumProposals()" - ], - "0x4245b0f7": [ - "Lottery()" - ], - "0x11610c25": [ - "bet()" - ], - "0x837e7cc6": [ - "rollDice()" - ], - "0x714064f3": [ - "BreakableBond(address,address,uint256)" - ], - "0x74389991": [ - "breakit()" - ], - "0x4cedf74e": [ - "get_party1()" - ], - "0xd81a91e9": [ - "get_party2()" - ], - "0xa89a4f09": [ - "creatorBalanceChecker()" - ], - "0xb9e6f1d9": [ - "get_amount()" - ], - "0xa4325485": [ - "getCreatorBalance()" - ], - "0xe9a9c1b4": [ - "get_party1_balance()" - ], - "0xf363441f": [ - "getCreatorDotBalance()" - ], - "0xb8017221": [ - "get_party2_balance()" - ], - "0x0109f22e": [ - "CrowdSale()" - ], - "0x39aaba25": [ - "get_status()" - ], - "0x670c884e": [ - "setup(address,uint256,uint256,uint256,address)" - ], - "0x639d57f2": [ - "testGetBitSuccess()" - ], - "0x4f76cb02": [ - "testGetBitFailIndexOOB()" - ], - "0xfadf87b1": [ - "testGetBitsSuccess()" - ], - "0x5a353193": [ - "KrakenPriceTicker()" - ], - "0xf24a534e": [ - "Oracle()" - ], - "0xc8bb73ef": [ - "testGetBitsFailIndexOOB()" - ], - "0x4894e37f": [ - "__callback(bytes,string,bytes)" - ], - "0x98596726": [ - "note(uint224)" - ], - "0x68e4bd99": [ - "testSetBitSuccess()" - ], - "0x69f18967": [ - "testSetBitFailIndexOOB()" - ], - "0x2212dbc3": [ - "get_timestamp()" - ], - "0x8ba9f354": [ - "testClearBitSuccess()" - ], - "0x7057c20d": [ - "CFD(address)" - ], - "0x0aa46c12": [ - "testClearBitFailIndexOOB()" - ], - "0xd7ef1356": [ - "best_adjustment(bool)" - ], - "0xe706918c": [ - "testToggleBitSuccess()" - ], - "0x7af30442": [ - "testToggleBitFailIndexOOB()" - ], - "0x414053be": [ - "best_adjustment_for(bool,uint128)" - ], - "0xdaa21e0e": [ - "testBitSetSuccess()" - ], - "0xeef547d7": [ - "deal_details(uint32)" - ], - "0x254c91b3": [ - "testBitNotSetSuccess()" - ], - "0xb144adfb": [ - "balance_of(address)" - ], - "0x2145e36c": [ - "testBitSetFailIndexOOB()" - ], - "0xfc63d4fb": [ - "order(bool,uint32,uint128)" - ], - "0x6d052f56": [ - "testBitsSetSuccess()" - ], - "0xf1cff4b5": [ - "testBitsNotSetSuccess()" - ], - "0x1381e400": [ - "cancel(uint32)" - ], - "0xf85aefba": [ - "testBitsSetFailIndexOOB()" - ], - "0xf41017fc": [ - "finalize(uint24)" - ], - "0x42a745cb": [ - "testBitEqualSuccess()" - ], - "0x4e6ab570": [ - "insert_order(address,bool,uint32,uint128)" - ], - "0xf362d78f": [ - "testBitNotEqualSuccess()" - ], - "0xb2d37e95": [ - "remove_order(uint32)" - ], - "0x8a120dc9": [ - "testBitEqualFailIndexOOB()" - ], - "0x64a4a5d7": [ - "testBitsEqualSuccess()" - ], - "0x6f36ce79": [ - "insert_deal(address,address,uint64,uint128,uint32)" - ], - "0x74087040": [ - "testBitsNotEqualSuccess()" - ], - "0x10e89b22": [ - "remove_deal(uint32)" - ], - "0xfbffb355": [ - "testBitsEqualFailIndexOOB()" - ], - "0x1e44c112": [ - "find_strike(uint64,uint32,uint32)" - ], - "0x2b785960": [ - "testBitAndSuccess()" - ], - "0xc388cca6": [ - "testBitAndFailIndexOOB()" - ], - "0xbac1e2e0": [ - "testBitsAndSuccess()" - ], - "0xd588acc4": [ - "claimMiningReward()" - ], - "0xda2b7416": [ - "testBitsAndFailIndexOOB()" - ], - "0xa1616429": [ - "testBitOrSuccess()" - ], - "0xfd83f3e3": [ - "QueueUserMayBeDeliveryDroneCotnrol()" - ], - "0x91e8d3dc": [ - "testBitOrFailIndexOOB()" - ], - "0x4ca1fad8": [ - "addRequest(uint256)" - ], - "0xec0f1025": [ - "testBitsOrSuccess()" - ], - "0xe4690a0b": [ - "popRequest()" - ], - "0x2581c674": [ - "testBitsOrFailIndexOOB()" - ], - "0xab91c7b0": [ - "queueLength()" - ], - "0x31be6985": [ - "testBitXorSuccess()" - ], - "0xa268b332": [ - "testBitXorFailIndexOOB()" - ], - "0xe044c2de": [ - "newLoan(bytes,address,uint256,uint256,uint256,uint256,uint256,uint256)" - ], - "0x622e88cb": [ - "testBitsXorSuccess()" - ], - "0x8e46fbb2": [ - "testBitsXorFailIndexOOB()" - ], - "0xc1cbbca7": [ - "contribute(uint256)" - ], - "0x278ecde1": [ - "refund(uint256)" - ], - "0xe2f8a017": [ - "payInstallment(uint256)" - ], - "0xbb510a77": [ - "createChannel(address,uint256)" - ], - "0xacf8bf2a": [ - "channelCount()" - ], - "0xd7bc23af": [ - "newParameters(int256,uint256,uint256,uint256)" - ], - "0x1b855044": [ - "getHash(uint256,uint256)" - ], - "0x65093661": [ - "newCommunity(address)" - ], - "0xe22b0c46": [ - "verify(uint256,uint256,uint8,bytes,bytes)" - ], - "0x5f1231ea": [ - "getMemberInfo(address)" - ], - "0x23add736": [ - "claim(uint256,uint256,uint8,bytes,bytes)" - ], - "0x3dd7c1b9": [ - "newProduct(string,string,uint256,uint256)" - ], - "0x79a85e6c": [ - "getProductInfo(uint256)" - ], - "0x2dabbeed": [ - "reclaim(uint256)" - ], - "0xa0440426": [ - "purchaseProduct(uint256,uint256)" - ], - "0xb7a97a2b": [ - "isValidChannel(uint256)" - ], - "0xe7d50e5c": [ - "FarmShare()" - ], - "0x3e0a51b4": [ - "TweetAccount()" - ], - "0xb6db75a0": [ - "isAdmin()" - ], - "0x4a23dc52": [ - "FileStore()" - ], - "0xfb46d4c5": [ - "tweet(string)" - ], - "0x5aebfd14": [ - "createFile(bytes)" - ], - "0xc3ad5ecb": [ - "getTweet(uint256)" - ], - "0xc5958bda": [ - "removeFile(bytes)" - ], - "0xae978f08": [ - "getLatestTweet()" - ], - "0x3d8e2947": [ - "getFileAddress(bytes)" - ], - "0xe4c2db06": [ - "getPreviousFile(bytes)" - ], - "0x0c4f65bd": [ - "getOwnerAddress()" - ], - "0xca77ab8a": [ - "getNextFile(bytes)" - ], - "0xca7dc5b1": [ - "getNumberOfTweets()" - ], - "0xdc63a62c": [ - "getFileListHead()" - ], - "0x95671958": [ - "getFileListTail()" - ], - "0x5c3e426c": [ - "adminRetrieveDonations(address)" - ], - "0x7d60e343": [ - "getFileListSize()" - ], - "0x3e450fff": [ - "adminDeleteAccount()" - ], - "0xe4360fc8": [ - "getFileListElement(bytes)" - ], - "0x492b67ea": [ - "Etherdoc()" - ], - "0x3f77b560": [ - "newDocument(bytes)" - ], - "0x3448c7d6": [ - "createHistory(bytes,address,address)" - ], - "0x0b80f8d3": [ - "invmod(uint256,uint256)" - ], - "0x2f6ae467": [ - "transferDocument(bytes,address)" - ], - "0x783ce458": [ - "expmod(uint256,uint256,uint256)" - ], - "0xe4547f98": [ - "documentExists(bytes)" - ], - "0xeccb15bc": [ - "SatPosition(int256,int256)" - ], - "0xf6458c6a": [ - "toZ1(uint256[3],uint256)" - ], - "0x3f9b250a": [ - "getDocument(uint256)" - ], - "0xafc4a982": [ - "PathCost(uint16,uint32)" - ], - "0xc36af460": [ - "getLatest()" - ], - "0x306df22d": [ - "GPSDestination(int256,int256,uint256)" - ], - "0xd44aadf7": [ - "initROS()" - ], - "0x54ae8492": [ - "CustodialForward()" - ], - "0x4a00a522": [ - "homebase(int256,int256)" - ], - "0x677913e9": [ - "setAmount(int32)" - ], - "0x418cf199": [ - "setEstimateCost(uint256,uint256)" - ], - "0x739f888c": [ - "setNewEstimate(int256,int256)" - ], - "0xc028df06": [ - "offer()" - ], - "0xe816a515": [ - "takeFlight()" - ], - "0xa6f2ae3a": [ - "buy()" - ], - "0xd810f298": [ - "computeSettlementAmount()" - ], - "0x48a0d754": [ - "available()" - ], - "0xb595181f": [ - "ShapeshiftBot()" - ], - "0xf27197ab": [ - "getIsAvailable()" - ], - "0xcb2b9031": [ - "addressToBytes(address,address)" - ], - "0x883ba26b": [ - "getIsSettled()" - ], - "0x504ac982": [ - "transfer(string,string)" - ], - "0x60e519c0": [ - "computeMarginAmount()" - ], - "0x8a9ffb90": [ - "transfer(string,string,bool)" - ], - "0x468f02d2": [ - "getUnderlyingPrice()" - ], - "0x2facc4e8": [ - "depositGovernance(uint256,address)" - ], - "0xf29617da": [ - "registrationDeposit(address)" - ], - "0x1d834a1b": [ - "insert(uint256,uint256)" - ], - "0x9a863892": [ - "NewProposal(uint256)" - ], - "0xe2233ada": [ - "smartDoor(address[])" - ], - "0x3106fea0": [ - "voteOnProposal(uint256,bool,uint256)" - ], - "0x22ebb3ac": [ - "DieselPricePeg()" - ], - "0xdb0e127a": [ - "openDoor()" - ], - "0x0965bf7d": [ - "processProposals()" - ], - "0x82ab890a": [ - "update(uint256)" - ], - "0xa05e822a": [ - "howManyOwners()" - ], - "0xa0e67e2b": [ - "getOwners()" - ], - "0x67546967": [ - "EthBtcEscrow()" - ], - "0x63052d82": [ - "getOwnersIndex(address)" - ], - "0x6cf761d4": [ - "getMinConfirmationsByAddr(address)" - ], - "0x97297467": [ - "checkAndVerify(bytes)" - ], - "0x9c43d950": [ - "registration(uint256,uint256,uint256)" - ], - "0xe68d3ae3": [ - "escrow(uint256,string,address,uint256)" - ], - "0xeece1e1f": [ - "scheduleShuffling()" - ], - "0x35ee2783": [ - "Alarm()" - ], - "0x48519189": [ - "MonedaAlcala(string,string)" - ], - "0xbd9335c0": [ - "scheduleHangouts()" - ], - "0x7143059f": [ - "getParticipant(address)" - ], - "0x65b1fdf4": [ - "scheduleIssuePOIs()" - ], - "0xb3c25835": [ - "addUser(address,string,string,uint256)" - ], - "0xb37217a4": [ - "getRandomNumber(uint256)" - ], - "0x47274dbe": [ - "disableUser(address,address)" - ], - "0xdcf73856": [ - "generateGroups()" - ], - "0x2090cf8b": [ - "consultBalance(address)" - ], - "0xc3d345c4": [ - "getHangoutAddress()" - ], - "0x9f8a13d7": [ - "isActive(address)" - ], - "0x4e23a144": [ - "fundUser(address,uint256)" - ], - "0x34e8980f": [ - "bootUpHangouts()" - ], - "0xfc89aff6": [ - "submitVerifiedUsers(address[])" - ], - "0x96ed10a4": [ - "issuePOIs()" - ], - "0x92b4bb50": [ - "rps()" - ], - "0x8e7ea5b2": [ - "getWinner()" - ], - "0x718e6302": [ - "play(string)" - ], - "0x4c738909": [ - "getMyBalance()" - ], - "0x79b0797c": [ - "AmIPlayer1()" - ], - "0x805210b7": [ - "AmIPlayer2()" - ], - "0x452d44dc": [ - "checkBothNotNull()" - ], - "0x4162169f": [ - "dao()" - ], - "0xce8b7151": [ - "isHF()" - ], - "0x8cdfb1e6": [ - "transferIfHF(address)" - ], - "0xc3b8bfe5": [ - "transferIfNoHF(address)" - ], - "0x82afd23b": [ - "isActive(uint256)" - ], - "0xc41a360a": [ - "getOwner(uint256)" - ], - "0xd05c78da": [ - "safeMul(uint256,uint256)" - ], - "0xd6febde8": [ - "buy(uint256,uint256)" - ], - "0x598647f8": [ - "bid(uint256,uint256)" - ], - "0x379607f5": [ - "claim(uint256)" - ], - "0x2ac9bf09": [ - "bid(uint256,uint256,uint256)" - ], - "0x1df47aad": [ - "ReplayProtection()" - ], - "0xc42cd8cf": [ - "etherSplit(address,address)" - ], - "0x9f5f7c7f": [ - "tokenSplit(address,address,address,uint256)" - ], - "0x2c215998": [ - "updateStatus(string)" - ], - "0x30ccebb5": [ - "getStatus(address)" - ], - "0xb46300ec": [ - "send()" - ], - "0x92d282c1": [ - "Send()" - ], - "0x5323c6cf": [ - "calcCostsBuying(bytes,uint256,uint256[],uint8,uint256)" - ], - "0x532e7e6a": [ - "calcEarningsSelling(bytes,uint256,uint256[],uint8,uint256)" - ], - "0x46a1d95f": [ - "closeMarket(bytes)" - ], - "0x4b031d0f": [ - "shortSellShares(bytes,uint8,uint256,uint256)" - ], - "0x45c41478": [ - "getMarkets(bytes,address)" - ], - "0x1c879c47": [ - "getMarketHashes(bytes)" - ], - "0x9948e493": [ - "calcMarketFee(bytes,uint256)" - ], - "0xf7a0fa0a": [ - "getShareDistribution(bytes)" - ], - "0xd0315658": [ - "getShareDistributionWithTimestamp(bytes)" - ], - "0xef04fdb7": [ - "buyShares(bytes,uint8,uint256,uint256)" - ], - "0x86723215": [ - "createMarket(bytes,uint256,uint256,address)" - ], - "0x55ba343f": [ - "getMarket(bytes)" - ], - "0x4401ff5c": [ - "sellShares(bytes,uint8,uint256,uint256)" - ], - "0xdf6c13c3": [ - "getMinFunding()" - ], - "0x9431f5f0": [ - "withdrawFees(bytes)" - ], - "0x43703b0e": [ - "getEventData(bytes)" - ], - "0x632f0ba6": [ - "descriptionHashes(bytes)" - ], - "0x5e58f141": [ - "shares(address,bytes,int256)" - ], - "0xdb5b4183": [ - "oracleOutcomes(bytes,address)" - ], - "0x3d69b403": [ - "isOutcomeSet(bytes)" - ], - "0xea4ba8eb": [ - "getOutcome(bytes)" - ], - "0xbbd8b602": [ - "getOracleOutcomes(bytes,address[])" - ], - "0x9ec32d45": [ - "challengeWinningOutcome(bytes,uint16)" - ], - "0x41095b60": [ - "voteForUltimateOutcome(bytes,uint16)" - ], - "0x8f6f988c": [ - "setUltimateOutcome(bytes)" - ], - "0x0968f264": [ - "withdraw(bytes)" - ], - "0x1397fdbd": [ - "getShares(address,bytes,int256[])" - ], - "0x45ee49b9": [ - "getUltimateOutcomes(bytes)" - ], - "0xc90d080a": [ - "registerEvent(bytes)" - ], - "0xc0ae6a3a": [ - "ultimateOutcomes(bytes)" - ], - "0xc2038560": [ - "setOutcome(bytes,bytes)" - ], - "0x8204ecdd": [ - "getFee(bytes)" - ], - "0xffcf21a9": [ - "eventOracles(bytes,uint256)" - ], - "0x08bf2d0d": [ - "getOrderBook(uint256,uint256)" - ], - "0x0e0f55d0": [ - "RewardOrder(uint256,uint256)" - ], - "0x0e97cfdf": [ - "placeOrder(uint256,uint256,uint256)" - ], - "0x29ef56b1": [ - "getAskOrderBookStats()" - ], - "0x3bed33ce": [ - "withdrawEther(uint256)" - ], - "0x50baa622": [ - "withdrawToken(uint256)" - ], - "0x512f1e64": [ - "orderBookLength()" - ], - "0x8ea98117": [ - "setCoordinator(address)" - ], - "0x9824425a": [ - "takeOrder(uint256,uint256,uint256,uint256)" - ], - "0x98ea5fca": [ - "depositEther()" - ], - "0xa2f16d80": [ - "dexWithdrawCollectedFees()" - ], - "0xb6ed0632": [ - "cancelOrder(uint256,uint256)" - ], - "0xe71264fa": [ - "addNewTokens(uint256)" - ], - "0xf1e4a540": [ - "unsetCoordinator()" - ], - "0xfe992c98": [ - "balanceOfAll(address)" - ], - "0x069d6d1c": [ - "closeOrder(uint256)" - ], - "0x070a888f": [ - "updateRewardDuration(uint256)" - ], - "0x09405164": [ - "getOpenCandidates()" - ], - "0x09a69f57": [ - "getRewardAmount()" - ], - "0x27cca148": [ - "lastClaimedBlock()" - ], - "0x942b90d3": [ - "getRewardTable()" - ], - "0xa9eed530": [ - "reduceOrderQty(uint256,uint256)" - ], - "0xc67d376d": [ - "getClosedCandidates()" - ], - "0xd3f297d6": [ - "claimLiquidityReward()" - ], - "0xfcc11241": [ - "addOrder(uint256,uint256,uint256,uint256,uint256,uint8)" - ], - "0x5829d310": [ - "entries(int256)" - ], - "0x8f9df278": [ - "newEntry(int256,bool,uint256,int256,string,bytes32,address,uint256[])" - ], - "0x031d973e": [ - "closeMarket(bytes32)" - ], - "0x16181bb7": [ - "shortSellShares(bytes32,uint8,uint256,uint256)" - ], - "0x5aa97eeb": [ - "getMarkets(bytes32[],address)" - ], - "0x674cc1f5": [ - "getMarketHashes(bytes32[])" - ], - "0x6da84ec0": [ - "calcMarketFee(bytes32,uint256)" - ], - "0x929e626e": [ - "getShareDistribution(bytes32)" - ], - "0xa0bde7e8": [ - "getShareDistributionWithTimestamp(bytes32)" - ], - "0xbbd4f854": [ - "buyShares(bytes32,uint8,uint256,uint256)" - ], - "0xc1fd4339": [ - "createMarket(bytes32,uint256,uint256,address)" - ], - "0xc3c95c7b": [ - "getMarket(bytes32)" - ], - "0xdb833e3a": [ - "sellShares(bytes32,uint8,uint256,uint256)" - ], - "0xebb71194": [ - "withdrawFees(bytes32)" - ], - "0x07d5b826": [ - "buyAllOutcomes(bytes32,uint256)" - ], - "0x15e812ad": [ - "getBaseFee()" - ], - "0x1934d55a": [ - "isPermanentlyApproved(address,address)" - ], - "0x1d007f5f": [ - "changeDAO(address)" - ], - "0x1f0c1e0c": [ - "getEventTokenAddress(bytes32,uint256)" - ], - "0x3983d5c4": [ - "calcBaseFee(uint256)" - ], - "0x4025b293": [ - "redeemAllOutcomes(bytes32,uint256)" - ], - "0x428d64bd": [ - "getShares(address,bytes32[])" - ], - "0x481b659d": [ - "permitPermanentApproval(address)" - ], - "0x57bcccb6": [ - "revokePermanentApproval(address)" - ], - "0x8c172fa2": [ - "getEvent(bytes32)" - ], - "0x9ba5b4e9": [ - "getEventHashes(bytes32[])" - ], - "0xa4a7cf5c": [ - "redeemWinnings(bytes32)" - ], - "0xb11e3b82": [ - "createEvent(bytes32,bool,int256,int256,uint8,address,address,bytes32[])" - ], - "0xc10dd4c6": [ - "getEvents(bytes32[],address)" - ], - "0xc51cf179": [ - "calcBaseFeeForShares(uint256)" - ], - "0xeff6be2f": [ - "changeBaseFee(uint256)" - ], - "0x13fc6ac2": [ - "getEventData(bytes32)" - ], - "0x51017702": [ - "isOutcomeSet(bytes32)" - ], - "0x5d1a3b82": [ - "getOutcome(bytes32)" - ], - "0xc1b06513": [ - "registerEvent(bytes32[])" - ], - "0xc91d7e9c": [ - "getFee(bytes32[])" - ], - "0x3ced516c": [ - "descriptionHashes(bytes32)" - ], - "0x488b3538": [ - "shares(address,bytes32,int256)" - ], - "0x4ad07b0e": [ - "oracleOutcomes(bytes32,address)" - ], - "0x659fb968": [ - "getOracleOutcomes(bytes32[],address[])" - ], - "0x6b1e564a": [ - "challengeWinningOutcome(bytes32,uint16)" - ], - "0x7b395487": [ - "voteForUltimateOutcome(bytes32,uint16)" - ], - "0x8aa6f1b1": [ - "setUltimateOutcome(bytes32)" - ], - "0x8e19899e": [ - "withdraw(bytes32)" - ], - "0x98f3b81a": [ - "getShares(address,bytes32[],int256[])" - ], - "0xa0ec4e09": [ - "getUltimateOutcomes(bytes32[])" - ], - "0xc25e6908": [ - "ultimateOutcomes(bytes32)" - ], - "0xc71e48d6": [ - "setOutcome(bytes32,bytes32[])" - ], - "0xfcf0f55b": [ - "eventOracles(bytes32,uint256)" - ], - "0x01991313": [ - "scheduleCall(address,bytes4,uint256)" - ], - "0x480b70bd": [ - "scheduleCall(address,bytes4,uint256,uint256)" - ], - "0x049ae734": [ - "scheduleCall(address,bytes4,uint256,uint256,uint8)" - ], - "0x68402460": [ - "scheduleCall(address,bytes4,uint256,uint256,uint8,uint256)" - ], - "0x8b676ae8": [ - "scheduleCall(address,bytes4,uint256,uint256,uint8,uint256,uint256)" - ], - "0x30fd300f": [ - "registerBytes32(address,bytes32)" - ], - "0x741e2345": [ - "registerMany(address,uint256,int256,uint256,bytes20,address,bytes)" - ], - "0x73b55eaf": [ - "registerData(address,int256,bytes32,address)" - ], - "0xc2b12a73": [ - "setBytes32(bytes32)" - ], - "0xf2da67db": [ - "setMany(uint256,int256,uint256,bytes20,address,bytes)" - ], - "0x0e850239": [ - "scheduleCall(bytes4,bytes)" - ], - "0x4db3da83": [ - "scheduleCall(bytes4)" - ], - "0x373a1bc3": [ - "scheduleCall(address,bytes4)" - ], - "0x3c2c21a0": [ - "scheduleCall(address,uint256,bytes4)" - ], - "0xa1c0539d": [ - "scheduleCall(address,bytes4,bytes)" - ], - "0x795b9a6f": [ - "scheduleCall(address,bytes4,uint256,bytes)" - ], - "0xc43d0575": [ - "scheduleCall(bytes4,uint256)" - ], - "0x3d9ce89b": [ - "scheduleCall(bytes4,bytes,uint256)" - ], - "0x48f05187": [ - "scheduleCall(address,bytes4,bytes,uint256)" - ], - "0x346cabbc": [ - "scheduleCall(address,bytes4,uint256,bytes,uint256)" - ], - "0x8c0e156d": [ - "scheduleCall(bytes4,uint256,uint256)" - ], - "0x5a9f2def": [ - "scheduleCall(bytes4,bytes,uint256,uint256)" - ], - "0x9772c982": [ - "scheduleCall(address,bytes4,bytes,uint256,uint256)" - ], - "0x3a9e7433": [ - "scheduleCall(bytes4,uint256,uint256,uint8)" - ], - "0x64ee49fe": [ - "scheduleCall(address,uint256,bytes4,uint256,uint256,uint8)" - ], - "0xee77fe86": [ - "scheduleCall(address,bytes4,bytes,uint256,uint256,uint8)" - ], - "0xe29fb547": [ - "scheduleCall(bytes4,uint256,uint256,uint8,uint256)" - ], - "0x03d22885": [ - "scheduleCall(address,uint256,bytes4,uint256,uint256,uint8,uint256)" - ], - "0xb549793d": [ - "scheduleCall(bytes4,bytes,uint256,uint256,uint8,uint256)" - ], - "0x7b55c8b5": [ - "scheduleCall(address,bytes4,bytes,uint8,uint256[4])" - ], - "0x4c471cde": [ - "scheduleCall(address,bytes4,bytes,uint256,uint256,uint8,uint256)" - ], - "0x938c4307": [ - "scheduleCall(bytes4,bytes,uint16,uint8,uint256,uint256,uint256,uint256,uint256)" - ], - "0x0ce46c43": [ - "scheduleCall(address,bytes4,bytes,uint16,uint8,uint256[5])" - ], - "0x528eedcb": [ - "sendSafe(address,address,uint256)" - ], - "0x2812f8b8": [ - "FutureCall(address,uint256,uint16,address,bytes4,bytes,uint256,uint256,uint256)" - ], - "0xcdda62ad": [ - "FutureBlockCall(address,uint256,uint8,address,bytes4,bytes,uint256,uint256,uint16,uint256,uint256)" - ], - "0xc976bbbb": [ - "_compare(int256,bytes2,int256)" - ], - "0x9f2ce678": [ - "vote(bytes32,bool)" - ], - "0x318a3fee": [ - "relayTx(bytes,int256,int256[],int256,int256)" - ], - "0xa06db7dc": [ - "gracePeriod()" - ], - "0xc6502da8": [ - "basePayment()" - ], - "0x625cc465": [ - "baseDonation()" - ], - "0x938b5f32": [ - "origin()" - ], - "0xeaa37394": [ - "create(bytes,bytes32,bool,bool,bool,bool,bool)" - ], - "0xf6469342": [ - "_setPackedBlockNumber(bytes32,uint256)" - ], - "0xf3e84cf3": [ - "createNewRevision(bytes32,bytes)" - ], - "0xf0cb556c": [ - "updateLatestRevision(bytes32,bytes)" - ], - "0x37664643": [ - "retractLatestRevision(bytes32)" - ], - "0x9b619d3b": [ - "_deleteAllPackedRevisionBlockNumbers(bytes32)" - ], - "0x2bf1f9da": [ - "restart(bytes32,bytes)" - ], - "0x117b4705": [ - "retract(bytes32)" - ], - "0x0eb8ed07": [ - "transferEnable(bytes32)" - ], - "0xaaac50bd": [ - "transferDisable(bytes32)" - ], - "0x79ce9fac": [ - "transfer(bytes32,address)" - ], - "0xd93e7573": [ - "disown(bytes32)" - ], - "0x89ced196": [ - "setNotUpdatable(bytes32)" - ], - "0xfe8b6642": [ - "setEnforceRevisions(bytes32)" - ], - "0x0d244d68": [ - "setNotRetractable(bytes32)" - ], - "0xb7d454a4": [ - "setNotTransferable(bytes32)" - ], - "0x4788cabf": [ - "getContractId()" - ], - "0x737c8ea1": [ - "_getRevisionBlockNumber(bytes32,uint256)" - ], - "0x9070b18d": [ - "_getAllRevisionBlockNumbers(bytes32)" - ], - "0x7a02dc06": [ - "getInfo(bytes32)" - ], - "0xdeb931a2": [ - "getOwner(bytes32)" - ], - "0x64228857": [ - "getRevisionCount(bytes32)" - ], - "0xa95d017d": [ - "getRevisionBlockNumber(bytes32,uint256)" - ], - "0xb7dd1d17": [ - "getAllRevisionBlockNumbers(bytes32)" - ], - "0x49437210": [ - "getUpdatable(bytes32)" - ], - "0x0b6fcdb0": [ - "getEnforceRevisions(bytes32)" - ], - "0x331a72d1": [ - "getRetractable(bytes32)" - ], - "0xf0da84f8": [ - "getTransferable(bytes32)" - ], - "0x1d82e9c7": [ - "EXTRA_GAS()" - ], - "0x964c836c": [ - "receiveExecutionNotification()" - ], - "0xc262df45": [ - "isKnownRequest(address,address)" - ], - "0x7fee4ecb": [ - "GAS_PER_DEPTH()" - ], - "0x07ad9ecb": [ - "safeSend(address,uint256)" - ], - "0xeacc5b3b": [ - "safeSend(address,uint256,uint256)" - ], - "0x1a26ed1c": [ - "validateReservedWindowSize(uint256,uint256)" - ], - "0x2e898ddc": [ - "validateTemporalUnit(uint256)" - ], - "0xb3aaa277": [ - "validate(address[4],address,uint256[11],uint256,bytes,uint256)" - ], - "0xc45b415e": [ - "createRequest(address[4],address,uint256[11],uint256,bytes)" - ], - "0xf00e8651": [ - "createRequest(address[2],address,uint256[11],uint256,bytes)" - ], - "0x17a601b5": [ - "MAX_STACK_DEPTH_REQUIREMENT()" - ], - "0x3121369d": [ - "validateRequiredStackDepth(uint256)" - ], - "0xb5f5962a": [ - "CALL_GAS_CEILING(uint256)" - ], - "0xf4c5ab7c": [ - "validateCallGas(uint256,uint256)" - ], - "0xd7504385": [ - "validateToAddress(address)" - ], - "0x610d5de8": [ - "validateEndowment(uint256,uint256,uint256,uint256,uint256)" - ], - "0xcd9a3c98": [ - "any(bool[7])" - ], - "0xf1fe42b8": [ - "TransactionRequest(address[3],address,uint256[11],uint256,bytes)" - ], - "0x00a676f9": [ - "getExists(bytes32)" - ], - "0xf42aa287": [ - "getBlobStore(bytes12)" - ], - "0x8f420866": [ - "DEFAULT_SEND_GAS()" - ], - "0xa126c5df": [ - "GAS_TO_AUTHORIZE_EXECUTION()" - ], - "0xbd35d570": [ - "GAS_TO_COMPLETE_EXECUTION()" - ], - "0xf6bd5893": [ - "getGas(uint256)" - ], - "0x606deecd": [ - "requestData()" - ], - "0xf9909915": [ - "bulkStoreHeader(bytes,int256,bytes,int256)" - ], - "0x129484b6": [ - "changeFeeRecipient(int256,int256,int256,int256,int256,int256)" - ], - "0xca0c1e62": [ - "computeMerkle(int256,int256,int256[],int256,int256,int256[])" - ], - "0x752d349c": [ - "depthCheck(int256,int256)" - ], - "0x157f8f51": [ - "feePaid(int256,int256,int256,int256)" - ], - "0x7ca823d5": [ - "getAverageChainWork()" - ], - "0x9a15f4f3": [ - "getBlockHeader(int256,int256)" - ], - "0x2c181929": [ - "getChainWork()" - ], - "0xfa14df6b": [ - "getChangeRecipientFee()" - ], - "0xc018d0e6": [ - "getFeeAmount(int256,int256)" - ], - "0x16e27349": [ - "getFeeRecipient(int256,int256)" - ], - "0xace51abc": [ - "helperVerifyHash__(uint256,int256,int256[],int256,uint256,int256,int256[],int256)" - ], - "0x11400d8e": [ - "priv_fastGetBlockHash__(int256,int256)" - ], - "0x3c2e7d54": [ - "priv_inMainChain__(int256,int256)" - ], - "0xecb0256b": [ - "relayTx(bytes,int256,int256[],int256,int256,bytes,int256,int256[],int256,int256)" - ], - "0xfae8f9a2": [ - "setInitialParent(int256,int256,int256,int256,int256,int256)" - ], - "0x6e173a7f": [ - "storeBlockHeader(bytes,bytes)" - ], - "0x3af75ee1": [ - "storeBlockWithFee(bytes,int256,bytes,int256)" - ], - "0xfad9bf9e": [ - "storeBlockWithFeeAndRecipient(bytes,int256,int256,bytes,int256,int256)" - ], - "0x05a5b8c6": [ - "verifyTx(bytes,int256,int256[],int256,bytes,int256,int256[],int256)" - ], - "0x9a89ad65": [ - "within6Confirms(int256,int256)" - ], - "0x362af076": [ - "createRequest(address[3],address,uint256[11],uint256,bytes)" - ], - "0x09861b81": [ - "flooredSub(uint256,uint256)" - ], - "0x3dd297da": [ - "safeMultiply(uint256,uint256)" - ], - "0x88102583": [ - "safeCastSigned(uint256)" - ], - "0x592685d5": [ - "getWindowStart(address,address)" - ], - "0xbf2e694f": [ - "getPreviousRequest(address,address)" - ], - "0x1acb2719": [ - "getNextRequest(address,address)" - ], - "0x09d33f1d": [ - "addRequest(address,uint256)" - ], - "0xac8d6030": [ - "removeRequest(address)" - ], - "0xb15dcc25": [ - "query(address,bytes2,uint256)" - ], - "0x17e1b09b": [ - "minimumDeposit(uint256)" - ], - "0x8fbc3ecd": [ - "BUFFER()" - ], - "0x3f0ec70b": [ - "RequestFactory(address)" - ], - "0xfb87d5ea": [ - "TransactionRequest(address[4],address,uint256[11],uint256,bytes)" - ], - "0xb311ee0c": [ - "refundClaimDeposit()" - ], - "0x8dd8596c": [ - "sendDonation()" - ], - "0x6720ceb1": [ - "sendPayment()" - ], - "0x6949a058": [ - "sendOwnerEther()" - ], - "0x66671c71": [ - "BaseScheduler(address,address)" - ], - "0xbf8c50ff": [ - "scheduleTransaction()" - ], - "0x93c166ec": [ - "computeEndowment(uint256,uint256,uint256,uint256)" - ], - "0xfff78f9c": [ - "doThrow()" - ], - "0xf0586f0d": [ - "doThrow(bool)" - ], - "0x2667f407": [ - "__proxy(address,bytes)" - ], - "0xc3fa5f93": [ - "BlockScheduler(address,address)" - ], - "0xb0bcc610": [ - "scheduleTransaction(address)" - ], - "0xb8f71f26": [ - "scheduleTransaction(uint256,address)" - ], - "0x30c0f8d6": [ - "scheduleTransaction(address,bytes)" - ], - "0xc0eb2325": [ - "scheduleTransaction(address,bytes,uint256)" - ], - "0x4d5b080c": [ - "scheduleTransaction(uint256,address,uint256)" - ], - "0xb03260be": [ - "scheduleTransaction(uint256,address,bytes)" - ], - "0xcf4a1612": [ - "scheduleTransaction(uint256,address,bytes,uint256)" - ], - "0xed4b1d0d": [ - "scheduleTransaction(uint256)" - ], - "0x57e2880d": [ - "scheduleTransaction(uint256,uint256)" - ], - "0xcf158fe9": [ - "scheduleTransaction(uint256,uint256,uint256)" - ], - "0xf0a78538": [ - "scheduleTransaction(uint256,bytes)" - ], - "0xe33c7ae2": [ - "scheduleTransaction(uint256,uint256,bytes)" - ], - "0x1099d3ec": [ - "scheduleTransaction(uint256,uint256,uint256,bytes)" - ], - "0x447cd682": [ - "scheduleTransaction(address,uint256)" - ], - "0x02e8d8c0": [ - "scheduleTransaction(address,uint256,uint256)" - ], - "0xd0549602": [ - "scheduleTransaction(address,uint256,uint256,uint256)" - ], - "0x44dd4b5e": [ - "scheduleTransaction(address,uint256,bytes)" - ], - "0xb67fabdf": [ - "scheduleTransaction(address,uint256,uint256,bytes)" - ], - "0xc9296d14": [ - "scheduleTransaction(address,uint256,uint256,uint256,bytes)" - ], - "0x314e0fb6": [ - "scheduleTransaction(address,bytes,uint256[3],uint256)" - ], - "0xceba30b5": [ - "scheduleTransaction(address,bytes,uint256[4],uint256)" - ], - "0xd4c2b6b1": [ - "scheduleTransaction(address,bytes,uint256[5],uint256)" - ], - "0xa42e36c6": [ - "scheduleTransaction(address,bytes,uint8,uint256[5],uint256)" - ], - "0x3c894475": [ - "scheduleTransaction(address,bytes,uint8,uint256[6],uint256)" - ], - "0x4ed4831a": [ - "all(bool[7])" - ], - "0xc5f310c0": [ - "register(bytes12)" - ], - "0x266710ca": [ - "manualUpdateBalances_only_Dev()" - ], - "0x2e0ef395": [ - "voteOnNewEntryFees_only_VIP(uint8)" - ], - "0x33ce7787": [ - "transferInvestorAccount(address,address)" - ], - "0x402e6230": [ - "getTotalGambles()" - ], - "0x580bdf3c": [ - "disableBetting_only_Dev()" - ], - "0x6ad50ed4": [ - "investmentEntryInfos()" - ], - "0x750cae6a": [ - "enableBetting_only_Dev()" - ], - "0x7c9cd7df": [ - "changeDeveloper_only_Dev(address)" - ], - "0xbb84d362": [ - "splitProfitVIP_only_Dev()" - ], - "0xc7144269": [ - "changeSettings_only_Dev(uint256,uint256,uint256,uint256,uint16,uint256,uint256,uint256,uint8,uint8)" - ], - "0xe56c8552": [ - "spinTheWheel(address)" - ], - "0x433836dc": [ - "scheduleTransaction(address,bytes,uint8,uint256[3],uint256)" - ], - "0x9341231c": [ - "sendOrThrow(address,uint256)" - ], - "0x1d49e081": [ - "EXECUTE_EXTRA_GAS()" - ], - "0xd2531590": [ - "CANCEL_EXTRA_GAS()" - ], - "0xad8ed335": [ - "__proxy(address)" - ], - "0x9af605cb": [ - "__proxy(address,bytes,uint256)" - ], - "0xf10ae2ab": [ - "__dig_then_proxy(uint256,address,bytes)" - ], - "0x9a35f886": [ - "__dig_then_proxy(uint256)" - ], - "0x7cbcc254": [ - "__reset__()" - ], - "0x6aaba012": [ - "ErrorGenerator()" - ], - "0x40a3d246": [ - "toggle()" - ], - "0x51582ef3": [ - "sendProxyTransaction(address,uint256,uint256,bytes)" - ], - "0x7b632c41": [ - "TimestampScheduler(address,address)" - ], - "0xb69c0896": [ - "BaseScheduler(address,address,uint256)" - ], - "0x30aceb89": [ - "validateRequestParams(address[3],address,uint256[11],uint256,bytes,uint256)" - ], - "0x15abc160": [ - "createValidatedRequest(address[3],address,uint256[11],uint256,bytes)" - ], - "0x316b08a0": [ - "scheduleTransaction(address,bytes,uint256[7],uint256)" - ], - "0xd96d7ea2": [ - "PRE_EXECUTION_GAS()" - ], - "0x45104b16": [ - "EXECUTION_GAS_OVERHEAD()" - ], - "0xc7e67360": [ - "GAS_BUFFER()" - ], - "0x5ee345e4": [ - "computeEndowment(uint256,uint256,uint256,uint256,uint256,uint256)" - ], - "0x27960c5f": [ - "validateEndowment(uint256,uint256,uint256,uint256,uint256,uint256,uint256)" - ], - "0x81baf820": [ - "BlockScheduler(address)" - ], - "0xba8661a2": [ - "TimestampScheduler(address)" - ], - "0x6b9b1006": [ - "TransactionRecorder()" - ], - "0x043753ba": [ - "makeDecision(uint256,bool)" - ], - "0xcd2cdd5b": [ - "claimOwnershi()" - ], - "0x1ac61e8c": [ - "testBlobCreate()" - ], - "0x741273d6": [ - "testThrowRegisterContractAgain()" - ], - "0x59e2d30e": [ - "testThrowBlobStoreNotRegistered()" - ], - "0xfa3f1e99": [ - "testBlobStoreRegistered()" - ], - "0x29e30910": [ - "testThrowCreateExistingNonce()" - ], - "0xd62d3115": [ - "testCreate()" - ], - "0xa5dfee67": [ - "testThrowsCreateNewRevisionNotUpdatable()" - ], - "0x85b73d3c": [ - "testCreateNewRevision()" - ], - "0x5f0edfb8": [ - "create(bytes,bytes32,bytes1)" - ], - "0x2551858e": [ - "getFlags(bytes32)" - ], - "0x8d375da2": [ - "testMakeItFail()" - ], - "0xe597f402": [ - "create(bytes1,bytes32,bytes)" - ], - "0x7fefde53": [ - "WillRegistry()" - ], - "0x337b1cf9": [ - "setIpfsHash(bytes)" - ], - "0xd0b52156": [ - "getIpfsHash(address,address)" - ], - "0x5b37e150": [ - "create(bytes32,bytes)" - ], - "0x338a1379": [ - "_setPackedBlockNumber(bytes20,uint256)" - ], - "0xa84c5330": [ - "createNewRevision(bytes20,bytes)" - ], - "0x9e65c7e5": [ - "updateLatestRevision(bytes20,bytes)" - ], - "0xa7e93e87": [ - "retractLatestRevision(bytes20)" - ], - "0x5ccd2f9b": [ - "_deleteAllPackedRevisionBlockNumbers(bytes20)" - ], - "0xe0a70811": [ - "restart(bytes20,bytes)" - ], - "0xcf7315c6": [ - "retract(bytes20)" - ], - "0x12511c14": [ - "transferEnable(bytes20)" - ], - "0x47bdb7f4": [ - "transferDisable(bytes20)" - ], - "0xb06df18e": [ - "transfer(bytes20,address)" - ], - "0xd6ca8ccb": [ - "disown(bytes20)" - ], - "0xd0c24e93": [ - "setNotUpdatable(bytes20)" - ], - "0x9243e088": [ - "setEnforceRevisions(bytes20)" - ], - "0x976b01c0": [ - "setNotRetractable(bytes20)" - ], - "0xb971b4e5": [ - "setNotTransferable(bytes20)" - ], - "0x08b7c13b": [ - "getExists(bytes20)" - ], - "0xfb47a067": [ - "_getRevisionBlockNumber(bytes20,uint256)" - ], - "0xec035393": [ - "_getAllRevisionBlockNumbers(bytes20)" - ], - "0xba15e52e": [ - "getInfo(bytes20)" - ], - "0x01fd89a4": [ - "getFlags(bytes20)" - ], - "0x3df91162": [ - "getUpdatable(bytes20)" - ], - "0xdba1ac3d": [ - "getEnforceRevisions(bytes20)" - ], - "0x3c335b0e": [ - "getRetractable(bytes20)" - ], - "0xaa5d4719": [ - "getTransferable(bytes20)" - ], - "0xe487eb58": [ - "getOwner(bytes20)" - ], - "0x3ef87414": [ - "getRevisionCount(bytes20)" - ], - "0x74f8d96e": [ - "getRevisionBlockNumber(bytes20,uint256)" - ], - "0x22057bc7": [ - "getAllRevisionBlockNumbers(bytes20)" - ], - "0x13137731": [ - "testThrowsUpdateLatestRevisionNotUpdatable()" - ], - "0x2eb5c61f": [ - "testThrowsUpdateLatestRevisionEnforceRevisions()" - ], - "0x1fb2f2a0": [ - "testUpdateLatestRevision()" - ], - "0xe82f7dd4": [ - "testThrowsRetractLatestRevisionNotUpdatable()" - ], - "0x8e1ffb19": [ - "testThrowsRetractLatestRevisionEnforceRevisions()" - ], - "0xe0cfc05c": [ - "testThrowsRetractLatestRevisionDoesntHaveAdditionalRevisions()" - ], - "0x40695625": [ - "testRetractLatestRevision()" - ], - "0x1b769e74": [ - "testThrowsRestartNotUpdatable()" - ], - "0x5292c1a9": [ - "testThrowsRestartEnforceRevisions()" - ], - "0x465e759b": [ - "testRestart()" - ], - "0xcaab0acc": [ - "testThrowCreateRetracted()" - ], - "0xd96e5565": [ - "testThrowsRetractNotRetractable()" - ], - "0x0af4626d": [ - "testRetract()" - ], - "0x804e11dc": [ - "testThrowsDisownNotTransferable()" - ], - "0xda5c0a7c": [ - "testDisown()" - ], - "0xad544dcb": [ - "testSetNotUpdatable()" - ], - "0xee0dc478": [ - "testSetEnforceRevisions()" - ], - "0xac3e6b2f": [ - "testSetNotRetractable()" - ], - "0xa039e3c7": [ - "testSetNotTransferable()" - ], - "0x30a24abd": [ - "create(bytes4,bytes)" - ], - "0x446fbcd1": [ - "CredSign()" - ], - "0x2e06c756": [ - "post(string,string,string,uint256,uint256,address)" - ], - "0xd5f37f95": [ - "sign(uint256,uint256,address)" - ], - "0xccbda1af": [ - "getChannelByName(string)" - ], - "0x738ddabe": [ - "getContentIndexedAccountCred(uint256,address,address)" - ], - "0x60dccd89": [ - "getContentAccount(uint256)" - ], - "0x05de4f07": [ - "getContentParent(uint256)" - ], - "0x9ea1b79d": [ - "getContentChannel(uint256)" - ], - "0xa5b9e922": [ - "getContentTimetamp(uint256)" - ], - "0x7e904a48": [ - "getNumContents(uint256)" - ], - "0xd644e356": [ - "index(uint256,address,uint256,uint256)" - ], - "0x0a4caed0": [ - "getChannelByRank(address,uint256)" - ], - "0x66099706": [ - "getChannelCred(address,uint256)" - ], - "0x5a1cc358": [ - "getChannelRank(address,uint256)" - ], - "0xffe34512": [ - "getNumChannels(address)" - ], - "0x771ad635": [ - "getContentCred(address,uint256)" - ], - "0x1d7e1f68": [ - "getContentRank(address,uint256)" - ], - "0xc01706dd": [ - "getContentByRank(address,uint256,uint256)" - ], - "0x2ae87a70": [ - "getNumContents(address,uint256)" - ], - "0x3b9901cc": [ - "getChannelsByRanks(address,uint256,uint256)" - ], - "0x9919b1cc": [ - "getContentsByRanks(address,uint256,uint256,uint256)" - ], - "0xf4dbeb9d": [ - "getCredRanksByContents(address,uint256[])" - ], - "0x6d1da953": [ - "createWithNonce(bytes32,bytes)" - ], - "0x67387d6b": [ - "testThrowCreateWithNonceExistingNonce()" - ], - "0x2aee19c7": [ - "testCreateWithNonce()" - ], - "0x81ebdeea": [ - "testThrowCreateWithNonceRetracted()" - ], - "0x089d5c4a": [ - "repr()" - ], - "0xaa237e21": [ - "set(bool,uint256)" - ], - "0xd1b1a22b": [ - "set(string,uint256[],uint256[],uint256[],bool[],uint256[])" - ], - "0x22bc3b8e": [ - "getArgument(uint256)" - ], - "0x0f3a1412": [ - "getArrlist(uint256,uint256)" - ], - "0xbb5d40eb": [ - "isValid()" - ], - "0x18921de4": [ - "addSignature(string,uint256[],uint256[],uint256[],bool[],uint256[])" - ], - "0xd8c34127": [ - "isKnownSignature(string)" - ], - "0x6ba0b4f2": [ - "isKnownSelector(bytes4)" - ], - "0xa6cbcdd5": [ - "numSignatures(bytes4)" - ], - "0xe02426c1": [ - "getSignatureHash(bytes4,uint256)" - ], - "0x2324c67c": [ - "getAllSignatureHashes(bytes4)" - ], - "0xc4b14e0b": [ - "getSignature(bytes32)" - ], - "0x1baaeb91": [ - "getSignature(bytes4,uint256)" - ], - "0x0194db8e": [ - "sum(uint256[])" - ], - "0xcabb3a3a": [ - "isAlphaNumeric(string)" - ], - "0x7fdc8290": [ - "isUnderscore(bytes1)" - ], - "0x2973e372": [ - "isAlphaUpper(bytes1)" - ], - "0x9a571d9f": [ - "isAlphaLower(bytes1)" - ], - "0x342454c7": [ - "isDigit(bytes1)" - ], - "0xfadc51cf": [ - "isAlpha(bytes1)" - ], - "0xfd958695": [ - "isAlphaNumeric(bytes1)" - ], - "0xea3d508a": [ - "selector()" - ], - "0x4ed3885e": [ - "set(string)" - ], - "0x83d51a38": [ - "concatString(string)" - ], - "0x69d01268": [ - "concatUInt(uint256)" - ], - "0x364ea9e7": [ - "set(uint256,uint256,bool[],uint256[])" - ], - "0xcde0a4f8": [ - "setRegulator(address)" - ], - "0x483a83df": [ - "setKYC(address)" - ], - "0x5c7c9aa4": [ - "checkAccountState(address)" - ], - "0xbaccc92b": [ - "RegulatorIfc(address)" - ], - "0xbe3945e4": [ - "getFee(address,address,uint256)" - ], - "0x3395dc70": [ - "acceptTransfer(address,address,uint256)" - ], - "0x07b2779f": [ - "BasicRegulator(address,uint256,uint256)" - ], - "0x14cbdb54": [ - "EspCoin()" - ], - "0x1995333b": [ - "burnFunds(uint256)" - ], - "0x0ae5e739": [ - "grantAccess(address)" - ], - "0x85e68531": [ - "revokeAccess(address)" - ], - "0x95a078e8": [ - "hasAccess(address)" - ], - "0x56b8c724": [ - "transfer(address,uint256,string)" - ], - "0x1af716ba": [ - "transferFrom(address,address,uint256,string)" - ], - "0x24c93343": [ - "error(string)" - ], - "0x652f1f16": [ - "addSignature(string)" - ], - "0x560bb612": [ - "SignatureValidator(address)" - ], - "0x35b28153": [ - "addAuthorization(address)" - ], - "0x94f3f81d": [ - "removeAuthorization(address)" - ], - "0x7620a65b": [ - "Publisher()" - ], - "0xcc70bb1a": [ - "publish(string,string,string,address)" - ], - "0x8023ffbd": [ - "getOverallSize()" - ], - "0xebb741cb": [ - "getChannelSize(uint256)" - ], - "0xbbed7177": [ - "getContentTimestamp(uint256)" - ], - "0x8eaa1e29": [ - "getContentByData(address,uint256,string,string)" - ], - "0x69b144eb": [ - "testThrowsCreateNewRevisionNotOwner()" - ], - "0x334ef224": [ - "testThrowsUpdateLatestRevisionNotOwner()" - ], - "0xa6e16ba2": [ - "testThrowsRetractLatestRevisionNotOwner()" - ], - "0x6b6a53fa": [ - "testThrowsRestartNotOwner()" - ], - "0x869b3f6a": [ - "testThrowsRetractNotOwner()" - ], - "0xbc0e7adb": [ - "testThrowsDisownNotOwner()" - ], - "0xce19419b": [ - "testThrowsSetNotUpdatableNotOwner()" - ], - "0x67080f6e": [ - "testThrowsSetEnforceRevisionsNotOwner()" - ], - "0xe1569f6b": [ - "testThrowsSetNotRetractableNotOwner()" - ], - "0xb463bcde": [ - "testThrowsSetNotTransferableNotOwner()" - ], - "0x1da6822c": [ - "testThrowsTransferEnableNotTransferable()" - ], - "0x98024f18": [ - "testThrowsTransferDisableNotEnabled()" - ], - "0x06459119": [ - "testThrowsTransferNotTransferable()" - ], - "0xd3d6a975": [ - "testThrowsTransferNotEnabled()" - ], - "0xd4b1d19f": [ - "testThrowsTransferDisabled()" - ], - "0xd591221f": [ - "testTransfer()" - ], - "0x15a0df43": [ - "testThrowCreateNewRevisionNotOwner()" - ], - "0xe3a199d6": [ - "testThrowCreateNewRevisionNotUpdatable()" - ], - "0x42ce0f30": [ - "testThrowUpdateLatestRevisionNotOwner()" - ], - "0x835b42fc": [ - "testThrowUpdateLatestRevisionNotUpdatable()" - ], - "0x550bcd8d": [ - "testThrowUpdateLatestRevisionEnforceRevisions()" - ], - "0x46c3166f": [ - "testThrowRetractLatestRevisionNotOwner()" - ], - "0x2432eb23": [ - "testThrowRetractLatestRevisionNotUpdatable()" - ], - "0x531d1974": [ - "testThrowRetractLatestRevisionEnforceRevisions()" - ], - "0x6edb4cf6": [ - "testThrowRetractLatestRevisionDoesntHaveAdditionalRevisions()" - ], - "0xfaf0952b": [ - "testThrowRestartNotOwner()" - ], - "0x85fe0448": [ - "testThrowRestartNotUpdatable()" - ], - "0xbb6a1427": [ - "testThrowRestartEnforceRevisions()" - ], - "0x23647398": [ - "testThrowRetractNotOwner()" - ], - "0x75a6a332": [ - "testThrowRetractNotRetractable()" - ], - "0x78205f67": [ - "testThrowTransferEnableNotTransferable()" - ], - "0xe5c7e509": [ - "testThrowTransferDisableNotEnabled()" - ], - "0x966acb38": [ - "testThrowTransferNotTransferable()" - ], - "0xd9ec0508": [ - "testThrowTransferNotEnabled()" - ], - "0x837a7ba5": [ - "testThrowTransferDisabled()" - ], - "0x7b48ba20": [ - "testThrowDisownNotOwner()" - ], - "0x938ae4cc": [ - "testThrowDisownNotTransferable()" - ], - "0x53caf582": [ - "testThrowSetNotUpdatableNotOwner()" - ], - "0xef41e06f": [ - "testThrowSetEnforceRevisionsNotOwner()" - ], - "0x20130753": [ - "testThrowSetNotRetractableNotOwner()" - ], - "0x5e1936d4": [ - "testThrowSetNotTransferableNotOwner()" - ], - "0x4123cb6b": [ - "m_numOwners()" - ], - "0x52375093": [ - "m_lastDay()" - ], - "0x659010e7": [ - "m_spentToday()" - ], - "0x746c9171": [ - "m_required()" - ], - "0x797af627": [ - "confirm(bytes32)" - ], - "0xb75c7dc6": [ - "revoke(bytes32)" - ], - "0xc2cf7326": [ - "hasConfirmed(bytes32,address)" - ], - "0xf1736d86": [ - "m_dailyLimit()" - ], - "0x96286cc9": [ - "isTokenOwner(address)" - ], - "0x69c8b344": [ - "ownedToken(address)" - ], - "0xe8580dd4": [ - "Survey(address,uint256,string,bytes32[])" - ], - "0x71c59097": [ - "MainnetSurvey(uint256,string,bytes32[])" - ], - "0x6e2edf30": [ - "ETCSurvey(address)" - ], - "0x58cb7323": [ - "MainnetETCSurvey()" - ], - "0x76d66f5d": [ - "_Transfer(address,address,bytes32)" - ], - "0x62c99e84": [ - "_Approval(address,address,bytes32)" - ], - "0x5fcc2edb": [ - "IndividualityTokenRoot(address)" - ], - "0xf3d91708": [ - "isEligibleForUpgrade(address)" - ], - "0x1a695230": [ - "transfer(address)" - ], - "0x103f9251": [ - "transferFrom(address,address)" - ], - "0x7dd56411": [ - "ownerOf(bytes32)" - ], - "0x7ca31724": [ - "tokenId(address)" - ], - "0xd55ec697": [ - "upgrade()" - ], - "0x216ef940": [ - "proxyUpgrade(address,address,bytes)" - ], - "0xc4128b6d": [ - "upgradeCount()" - ], - "0x09fc8f6d": [ - "isTokenUpgraded(bytes32)" - ], - "0x19a9c2f1": [ - "generateId(string)" - ], - "0xafb95eed": [ - "logApproval(address,address,bytes32)" - ], - "0x85d5c971": [ - "logTransfer(address,address,bytes32)" - ], - "0xbbba3333": [ - "safer_ecrecover(bytes32,uint8,bytes32,bytes32)" - ], - "0x77d32e94": [ - "ecrecovery(bytes32,bytes)" - ], - "0x39cdde32": [ - "ecverify(bytes32,bytes,address)" - ], - "0x72c3015c": [ - "mint(int256,address,string)" - ], - "0x6e0bd282": [ - "destroy(bytes32)" - ], - "0x983b2d56": [ - "addMinter(address)" - ], - "0x3092afd5": [ - "removeMinter(address)" - ], - "0x7d32e7bd": [ - "transfer(address,bytes32)" - ], - "0xb3c06f50": [ - "transferFrom(address,address,bytes32)" - ], - "0x5cd2f4d3": [ - "approve(address,bytes32)" - ], - "0x4fc9c91a": [ - "identityOf(bytes32)" - ], - "0x34b7ac9b": [ - "END_MINTING()" - ], - "0x899942b8": [ - "Devcon2Token()" - ], - "0x7993e5c2": [ - "Devcon2TokenForTesting()" - ], - "0x724121ae": [ - "contentExists(uint256)" - ], - "0x1003e2d2": [ - "add(uint256)" - ], - "0xa501e88d": [ - "Content()" - ], - "0x8570153e": [ - "publish(string,string,bytes,address[])" - ], - "0x76f30ca1": [ - "toContentID(address,uint256,string,bytes)" - ], - "0xee725d44": [ - "toChannelID(string)" - ], - "0x969cb7c3": [ - "getPublisher(uint256)" - ], - "0x110df916": [ - "getChannelID(uint256)" - ], - "0xb633620c": [ - "getTimestamp(uint256)" - ], - "0x4378a6e3": [ - "getAttributes(uint256)" - ], - "0x124eaee6": [ - "Identity()" - ], - "0xf207564e": [ - "register(uint256)" - ], - "0x4d207d9a": [ - "identify(address)" - ], - "0x54ea4000": [ - "identify(address[])" - ], - "0xeb782d8c": [ - "ContentSeries(address)" - ], - "0xde8fa431": [ - "getSize()" - ], - "0x21958a50": [ - "AddressSeries(address)" - ], - "0x504f1671": [ - "getSize(address)" - ], - "0xeb045789": [ - "ChannelSeries(address)" - ], - "0x023c23db": [ - "getSize(uint256)" - ], - "0x2fea7b81": [ - "getIdentity(address)" - ], - "0x043bb5e7": [ - "getIdentities(address[])" - ], - "0x27dc297e": [ - "__callback(bytes32,string)" - ], - "0x38bbfa50": [ - "__callback(bytes32,string,bytes)" - ], - "0xbc08afd9": [ - "WebOfTrustToken(address,uint256)" - ], - "0xa5bfa9a9": [ - "claimToken(bytes32)" - ], - "0x5669c94f": [ - "issueToken(address,string)" - ], - "0xcdcd77c0": [ - "baz(uint32,bool)" - ], - "0x0b811cb6": [ - "executeProposal(uint256,bytes32)" - ], - "0x1f5d0b4c": [ - "address(address,address,uint256)" - ], - "0x8ac0ca36": [ - "buyViaJohan()" - ], - "0xc1246d39": [ - "simulatePathwayFromBeneficiary()" - ], - "0x59e148fc": [ - "getLastOfferId()" - ], - "0x152583de": [ - "getAttributes()" - ], - "0x446d5aa4": [ - "getAttributes(address)" - ], - "0x88782386": [ - "UnicornMilk()" - ], - "0x13df7091": [ - "mintAll(int256)" - ], - "0xfa9acb05": [ - "addressInArray(address,address)" - ], - "0xb76e4890": [ - "Tester()" - ], - "0x0d2560ee": [ - "addMe()" - ], - "0x8894dd2b": [ - "addEther()" - ], - "0x1e9ea66a": [ - "balanceEther10000000(uint256)" - ], - "0xe5bf93b9": [ - "balanceEther(uint256)" - ], - "0xcd9f05b8": [ - "balanceEtherAddress(address)" - ], - "0xfd7ac203": [ - "TestToken()" - ], - "0x35b09a6e": [ - "someFunction()" - ], - "0x8f2c44a2": [ - "UnicornMilker()" - ], - "0xc26aa3c9": [ - "lockUnicorn(uint256)" - ], - "0xff556ecb": [ - "releaseUnicorn(uint256)" - ], - "0x27e8c2d8": [ - "burnUnicornShares()" - ], - "0xfff3c457": [ - "readMessages(uint256)" - ], - "0x6a226a49": [ - "addMessage(string)" - ], - "0x200ebe34": [ - "addTokensToGive(address)" - ], - "0x7a427d98": [ - "forceReturn()" - ], - "0xe53e04a5": [ - "refillGas()" - ], - "0x323082d7": [ - "Vote(string)" - ], - "0x90cf581c": [ - "voteYes()" - ], - "0x41c12a70": [ - "voteNo()" - ], - "0x49aa4ee2": [ - "removeVote()" - ], - "0xa48bdb7c": [ - "results()" - ], - "0x9832ee65": [ - "resultsWeightedByTokens()" - ], - "0x9dcb5c65": [ - "resultsWeightedByEther()" - ], - "0x49407a44": [ - "claimEther(uint256)" - ], - "0x509f8633": [ - "create_account()" - ], - "0x32fefb4c": [ - "add_account(address,address)" - ], - "0x9b5adea2": [ - "setMinter()" - ], - "0x0ecaea73": [ - "create(address,uint256)" - ], - "0xa24835d1": [ - "destroy(address,uint256)" - ], - "0x36f66528": [ - "EtherDelta(address,uint256,uint256)" - ], - "0x338b5dea": [ - "depositToken(address,uint256)" - ], - "0x9e281a98": [ - "withdrawToken(address,uint256)" - ], - "0xf7888aec": [ - "balanceOf(address,address)" - ], - "0x93f0bb51": [ - "order(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)" - ], - "0x0a19b14a": [ - "trade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256)" - ], - "0x6c86888b": [ - "testTrade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,address)" - ], - "0xfb6e155f": [ - "availableVolume(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)" - ], - "0xbb8be064": [ - "HardwareToken()" - ], - "0x57a373a1": [ - "uintInArray(uint256,uint256,int256,uint256[],uint256)" - ], - "0x32afa2f9": [ - "claimEtherOwner(uint256)" - ], - "0xa2a8336f": [ - "claimEtherSigner(uint256)" - ], - "0x4e077f2a": [ - "addGasEther()" - ], - "0x24804cef": [ - "Deed()" - ], - "0xfaab9d39": [ - "setRegistrar(address)" - ], - "0xfb1669ca": [ - "setBalance(uint256)" - ], - "0xbbe42771": [ - "closeDeed(uint256)" - ], - "0x0b5ab3d5": [ - "destroyDeed()" - ], - "0xa06cab79": [ - "Registrar(address,bytes32)" - ], - "0x367bbd78": [ - "strlen(string)" - ], - "0x03985426": [ - "getMode(bytes32)" - ], - "0xede8acdb": [ - "startAuction(bytes32)" - ], - "0xe27fe50f": [ - "startAuctions(bytes32[])" - ], - "0x22ec1244": [ - "shaBid(bytes32,address,uint256,bytes32)" - ], - "0xce92dced": [ - "newBid(bytes32)" - ], - "0xaefc8c72": [ - "unsealBid(bytes32,address,uint256,bytes32)" - ], - "0xdf7cec28": [ - "cancelBid(bytes32)" - ], - "0x983b94fb": [ - "finalizeAuction(bytes32)" - ], - "0x0230a07c": [ - "releaseDeed(bytes32)" - ], - "0x15f73331": [ - "invalidateName(string)" - ], - "0x5ddae283": [ - "transferRegistrars(bytes32)" - ], - "0xebb045fa": [ - "PublicResolver(address)" - ], - "0x41b9dc2b": [ - "has(bytes32,bytes32)" - ], - "0x01ffc9a7": [ - "supportsInterface(bytes4)" - ], - "0x3b3b57de": [ - "addr(bytes32)" - ], - "0xd5fa2b00": [ - "setAddr(bytes32,address)" - ], - "0x2dff6941": [ - "content(bytes32)" - ], - "0xc3d014d6": [ - "setContent(bytes32,bytes32)" - ], - "0x1d2e2cc4": [ - "ENS()" - ], - "0x02571be3": [ - "owner(bytes32)" - ], - "0x0178b8bf": [ - "resolver(bytes32)" - ], - "0x16a25cbd": [ - "ttl(bytes32)" - ], - "0x5b0fc9c3": [ - "setOwner(bytes32,address)" - ], - "0x06ab5923": [ - "setSubnodeOwner(bytes32,bytes32,address)" - ], - "0x1896f70a": [ - "setResolver(bytes32,address)" - ], - "0x14ab9038": [ - "setTTL(bytes32,uint64)" - ], - "0x9d063ed8": [ - "FIFSRegistrar(address,bytes32)" - ], - "0xd22057a9": [ - "register(bytes32,address)" - ], - "0xe8efc1a0": [ - "updatedValue(bytes32)" - ], - "0x3dfb4843": [ - "renewDeed(bytes32)" - ], - "0xd8389dc5": [ - "hash(bytes32)" - ], - "0xd7fa1007": [ - "setHash(bytes32,bytes32)" - ], - "0x003538c5": [ - "TestRegistrar(address,bytes32)" - ], - "0x267b6922": [ - "entries(bytes32)" - ], - "0x3f15457f": [ - "ens()" - ], - "0x61584936": [ - "sealedBids(bytes32)" - ], - "0xb88eef53": [ - "registryCreated()" - ], - "0xfaff50a8": [ - "rootNode()" - ], - "0x8b859409": [ - "setRelease(bytes32,bytes32,string)" - ], - "0x244fcd03": [ - "removeRelease(bytes32,string)" - ], - "0x89859b50": [ - "updateLatestTree(bytes32)" - ], - "0xa10889fa": [ - "setVersion(uint32,uint32,uint32,string,string)" - ], - "0x0ccec396": [ - "getNumReleases()" - ], - "0x57b07cd9": [ - "getReleaseHash(uint256)" - ], - "0x173cb7de": [ - "getNumReleasesForNameHash(bytes32)" - ], - "0x0c26e42e": [ - "getReleaseHashForNameHash(bytes32,uint256)" - ], - "0x3f415772": [ - "releaseExists(bytes32)" - ], - "0xbb814e9e": [ - "versionExists(bytes32)" - ], - "0x4c4aea87": [ - "getReleaseData(bytes32)" - ], - "0x0c4326a0": [ - "getMajorMinorPatch(bytes32)" - ], - "0xfac5bb92": [ - "getPreRelease(bytes32)" - ], - "0x8ca4eef6": [ - "getBuild(bytes32)" - ], - "0x2ffb8631": [ - "getReleaseLockfileURI(bytes32)" - ], - "0x0e5ffb3c": [ - "hashVersion(uint32,uint32,uint32,string,string)" - ], - "0x93d79105": [ - "hashRelease(bytes32,bytes32)" - ], - "0x3ae9b510": [ - "getLatestMajorTree(bytes32)" - ], - "0xf2f254c7": [ - "getLatestMinorTree(bytes32,uint32)" - ], - "0x5263ba87": [ - "getLatestPatchTree(bytes32,uint32,uint32)" - ], - "0xdea9c72b": [ - "getLatestPreReleaseTree(bytes32,uint32,uint32,uint32)" - ], - "0xd7cc8362": [ - "isLatestMajorTree(bytes32,bytes32)" - ], - "0xd1f59db9": [ - "isLatestMinorTree(bytes32,bytes32)" - ], - "0xc233e870": [ - "isLatestPatchTree(bytes32,bytes32)" - ], - "0x02de2cf3": [ - "isLatestPreReleaseTree(bytes32,bytes32)" - ], - "0x02556de3": [ - "updateMajorTree(bytes32)" - ], - "0x44d75fa9": [ - "updateMinorTree(bytes32)" - ], - "0xb6ac24df": [ - "updatePatchTree(bytes32)" - ], - "0x900d85fa": [ - "updatePreReleaseTree(bytes32)" - ], - "0xbed34bba": [ - "compareStrings(string,string)" - ], - "0x15398afe": [ - "compareNumericStrings(string,string)" - ], - "0xdd79e33e": [ - "splitIdentifiers(string)" - ], - "0x2fc0aad3": [ - "isNumericString(string)" - ], - "0x55ff440a": [ - "castStringToUInt(string)" - ], - "0xb7009613": [ - "canCall(address,address,bytes4)" - ], - "0xeacfc0ae": [ - "Authorized()" - ], - "0x87045369": [ - "setCanCall(address,address,bytes4,bool)" - ], - "0x02acdb44": [ - "setAnyoneCanCall(address,bytes4,bool)" - ], - "0x20d9822e": [ - "setAnyoneCanCall(address,string,bool)" - ], - "0x083ae1fe": [ - "setPackage(string)" - ], - "0x001f8d11": [ - "removePackage(bytes32,string)" - ], - "0x2406cedb": [ - "setPackageOwner(bytes32,address)" - ], - "0xa9b35240": [ - "packageExists(bytes32)" - ], - "0x7370a38d": [ - "getNumPackages()" - ], - "0x95f0684b": [ - "getPackageNameHash(uint256)" - ], - "0xb4d6d4c7": [ - "getPackageData(bytes32)" - ], - "0x06fe1fd7": [ - "getPackageName(bytes32)" - ], - "0xaf9a3f9b": [ - "hashName(string)" - ], - "0x34c0d654": [ - "setPackageDb(address)" - ], - "0xf314bf46": [ - "setReleaseDb(address)" - ], - "0x10ae4ce2": [ - "setReleaseValidator(address)" - ], - "0x5fcb568c": [ - "release(string,uint32,uint32,uint32,string,string,string)" - ], - "0x0f3d7c3e": [ - "release(string,uint32[3],string,string,string)" - ], - "0x4f197ee7": [ - "transferPackageOwner(string,address)" - ], - "0x83ea0620": [ - "packageExists(string)" - ], - "0x4188d79c": [ - "releaseExists(string,uint32,uint32,uint32,string,string)" - ], - "0xcfe9a7b8": [ - "getPackageName(uint256)" - ], - "0xc2ba5b40": [ - "getPackageData(string)" - ], - "0xcec95aa1": [ - "getReleaseHashForPackage(string,uint256)" - ], - "0xc392f5a0": [ - "getAllPackageReleaseHashes(string)" - ], - "0x12cc08f2": [ - "getPackageReleaseHashes(string,uint256,uint256)" - ], - "0x4cb71b9b": [ - "getAllReleaseHashes()" - ], - "0x79cce1c5": [ - "getReleaseHashes(uint256,uint256)" - ], - "0x1f6b0a9d": [ - "getReleaseLockfileURI(string,uint32,uint32,uint32,string,string)" - ], - "0x79c3ddc1": [ - "isPackageOwner(string,address,address)" - ], - "0x91060168": [ - "fetchString(address,bytes4,bytes32)" - ], - "0xfa28ba0d": [ - "validateReleaseLockfileURI(string)" - ], - "0xf4ea95b9": [ - "validateReleaseVersion(uint32[3])" - ], - "0x6f0cfab6": [ - "DNSResolver()" - ], - "0x126a710e": [ - "dnsrr(bytes32)" - ], - "0x76196c88": [ - "setDnsrr(bytes32,bytes)" - ], - "0x61d585da": [ - "state(bytes32)" - ], - "0xe571c35e": [ - "ReverseRegistrar(address,bytes32)" - ], - "0x1e83409a": [ - "claim(address)" - ], - "0xbffbe61c": [ - "node(address)" - ], - "0x27b752b8": [ - "sha3HexAddress(address)" - ], - "0xe1fa8e84": [ - "register(bytes32)" - ], - "0xa31d5580": [ - "Registrar(address,bytes32,address)" - ], - "0x3ea3f6c5": [ - "activateRegistrar()" - ], - "0x271cd760": [ - "getPackageDb()" - ], - "0xfb3a1fb2": [ - "getReleaseDb()" - ], - "0x4961b40c": [ - "getReleaseValidator()" - ], - "0x2d34ba79": [ - "setup(address,address)" - ], - "0x30b9af98": [ - "withdrawFunding()" - ], - "0x92a781d8": [ - "changeBaseValue(uint256)" - ], - "0xb60d4288": [ - "fund()" - ], - "0xc062f578": [ - "updateStage()" - ], - "0xf3a44fe1": [ - "withdrawForWorkshop()" - ], - "0x99e0021f": [ - "mergencyCall()" - ], - "0x299ed37a": [ - "emergencyCall()" - ], - "0x0b7abf77": [ - "TOTAL_TOKENS()" - ], - "0x17f5de95": [ - "MAX_TOKENS_SOLD()" - ], - "0x39f64b52": [ - "calcTokenPrice()" - ], - "0x48c54b9d": [ - "claimTokens()" - ], - "0x48cd4cb1": [ - "startBlock()" - ], - "0x521eb273": [ - "wallet()" - ], - "0x60fd902c": [ - "gnosisToken()" - ], - "0x62ea82db": [ - "bids(address)" - ], - "0x6f85c7e4": [ - "WAITING_PERIOD()" - ], - "0x8da5cb5b": [ - "owner()" - ], - "0xa3c2c462": [ - "totalReceived()" - ], - "0xa6b513ee": [ - "finalPrice()" - ], - "0xc040e6b8": [ - "stage()" - ], - "0xc51bf934": [ - "CEILING()" - ], - "0xd9f8a4e2": [ - "calcCurrentTokenPrice()" - ], - "0xdd9dd688": [ - "calcStopPrice()" - ], - "0xde78e78a": [ - "tokenLaunched()" - ], - "0x4c6b25b1": [ - "results(bytes32)" - ], - "0x69347990": [ - "ownerWithdrawl()" - ], - "0x7b1aa45f": [ - "ownerDeposit()" - ], - "0x996a8046": [ - "__callback(bytes32,string,bool)" - ], - "0xb964608d": [ - "get_return_by_level(uint256)" - ], - "0xcddbe729": [ - "game(uint256)" - ], - "0x0674763c": [ - "assert(bool)" - ], - "0xe21608be": [ - "ReserveToken()" - ], - "0x1cbd0519": [ - "accountLevel(address)" - ], - "0x8abadb6b": [ - "setAccountLevel(address,uint256)" - ], - "0x4c7f74df": [ - "EtherDelta(address,address,address,uint256,uint256,uint256)" - ], - "0x8f283970": [ - "changeAdmin(address)" - ], - "0xe8f6bc2e": [ - "changeAccountLevelsAddr(address)" - ], - "0x71ffcb16": [ - "changeFeeAccount(address)" - ], - "0x54d03b5c": [ - "changeFeeMake(uint256)" - ], - "0x8823a9c0": [ - "changeFeeTake(uint256)" - ], - "0x5e1d7ae4": [ - "changeFeeRebate(uint256)" - ], - "0x0b927666": [ - "order(address,uint256,address,uint256,uint256,uint256)" - ], - "0x05888fcd": [ - "tradeBalances(address,uint256,address,uint256,address,uint256)" - ], - "0x46be96c3": [ - "amountFilled(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)" - ], - "0x278b8c0e": [ - "cancelOrder(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)" - ], - "0x60116397": [ - "Registrar(address,bytes32,uint256)" - ], - "0xf4dc2d21": [ - "Deed(uint256)" - ], - "0x06fdde03": [ - "name()" - ], - "0x313ce567": [ - "decimals()" - ], - "0x40275f85": [ - "getPersonalDepositAddress(address)" - ], - "0x5a3b7e42": [ - "standard()" - ], - "0x89d59ee5": [ - "createPersonalDepositAddress()" - ], - "0x8c546f81": [ - "GNT()" - ], - "0x8f70bfa0": [ - "processDeposit()" - ], - "0x95d89b41": [ - "symbol()" - ], - "0xb414d4b6": [ - "frozenAccount(address)" - ], - "0xdc3080f2": [ - "spentAllowance(address,address)" - ], - "0x366a68dc": [ - "setBlockLock(uint256)" - ], - "0xa39a45b7": [ - "replaceOwner(address)" - ], - "0xa4e2d634": [ - "isLocked()" - ], - "0xd8162db7": [ - "lockedUntilBlock()" - ], - "0x1593a8c7": [ - "endLottery()" - ], - "0x53aab434": [ - "buyIn()" - ], - "0x5ec01e4d": [ - "random()" - ], - "0x6939864b": [ - "lotteryState()" - ], - "0xd366fbab": [ - "startLottery(bytes32,uint256,uint256,uint256,uint256,bool)" - ], - "0xfd7c460d": [ - "ciberLottery()" - ], - "0x2525f5c1": [ - "cancelBid(address,bytes32)" - ], - "0xc01a8c84": [ - "confirmTransaction(uint256)" - ], - "0x1209b1f6": [ - "ticketPrice()" - ], - "0x50b44712": [ - "tickets(uint256)" - ], - "0x5c3f9765": [ - "endDateClose()" - ], - "0x984ac378": [ - "lotteryTitle()" - ], - "0xb8851fea": [ - "endDateStart()" - ], - "0xc179520c": [ - "ManageAccount()" - ], - "0x12494160": [ - "isHolder()" - ], - "0x42ce1488": [ - "upload(string)" - ], - "0x3c925f16": [ - "getAccountHolder()" - ], - "0x83f7b8e1": [ - "getNumberOfPhotos()" - ], - "0xe2a71f12": [ - "accountDelete()" - ], - "0x009b9369": [ - "getVoteNumber(uint256)" - ], - "0x0ee79fb3": [ - "closeReferendums()" - ], - "0x291e6777": [ - "sendVote(uint256,uint256)" - ], - "0x32d2fb9f": [ - "getRefRemainingTime(uint256)" - ], - "0x3b0506f7": [ - "getVoteByAddress(address,uint256)" - ], - "0x62fb09b2": [ - "getRefDescr(uint256)" - ], - "0x77a7e6be": [ - "getRefTotal(uint256)" - ], - "0x80dcaf27": [ - "getRefNumber()" - ], - "0x8736fd16": [ - "getRefStatus(uint256)" - ], - "0xace523c4": [ - "createReferendum(string,string,uint256,uint256)" - ], - "0xb29d7914": [ - "getRefResults(uint256)" - ], - "0xc0df77d0": [ - "getRefName(uint256)" - ], - "0x94d9cf8f": [ - "CreateProxyWithControllerAndRecovery(address,address[],uint256,uint256)" - ], - "0x4a3a87e2": [ - "CreateProxyWithControllerAndRecoveryKey(address,address,uint256,uint256)" - ], - "0x4fcf8210": [ - "eraseRecord(bytes32)" - ], - "0xde10f04b": [ - "eraseNode(bytes32[])" - ], - "0x3a76abff": [ - "_eraseNode(uint256,bytes32[],bytes32)" - ], - "0x1cda37f2": [ - "eraseRecords(bytes32)" - ], - "0x00e43ee9": [ - "setMigrationStatus(uint256,address)" - ], - "0x984413b8": [ - "_eraseNode(bytes32)" - ], - "0xb0c80972": [ - "setBalance(uint256,bool)" - ], - "0xfebefd61": [ - "startAuctionsAndBid(bytes32[],bytes32)" - ], - "0x77bc222c": [ - "_eraseSingleNode(bytes32)" - ], - "0x57aee888": [ - "_eraseNodeHierarchy(uint256,bytes32[],bytes32)" - ], - "0xdce293a7": [ - "minLength(uint256)" - ], - "0xaf92a693": [ - "addRegistrar(address)" - ], - "0xba904eed": [ - "removeRegistrar(address)" - ], - "0x081780f4": [ - "clearRecord(bytes32)" - ], - "0xb0349184": [ - "clearRecords(bytes32[])" - ], - "0xf62cce34": [ - "_clearRecordHierarchy(uint256,bytes32[],bytes32)" - ], - "0x36b81feb": [ - "Deed(address)" - ], - "0x4a617faa": [ - "shaBid(bytes32,uint256,bytes32)" - ], - "0x47872b42": [ - "unsealBid(bytes32,uint256,bytes32)" - ], - "0x93503337": [ - "isAllowed(bytes32,uint256)" - ], - "0x8a4068dd": [ - "transfer()" - ], - "0x13c89a8f": [ - "getAllowedTime(bytes32)" - ], - "0xa360b26f": [ - "Migrations()" - ], - "0xfdacd576": [ - "setCompleted(uint256)" - ], - "0x99a88ec4": [ - "upgrade(address,address)" - ], - "0x8e7fd292": [ - "trySetSubnodeOwner(bytes32,address)" - ], - "0x29cd5777": [ - "_tryEraseSingleNode(bytes32)" - ], - "0x5e431709": [ - "sealedBids(address,bytes32)" - ], - "0x9c67f06f": [ - "registryStarted()" - ], - "0xea9e107a": [ - "acceptRegistrarTransfer(bytes32,address,uint256)" - ], - "0x05b34410": [ - "creationDate()" - ], - "0x2b20e397": [ - "registrar()" - ], - "0x3fa4f245": [ - "value()" - ], - "0x674f220f": [ - "previousOwner()" - ], - "0x2203ab56": [ - "ABI(bytes32,uint256)" - ], - "0x623195b0": [ - "setABI(bytes32,uint256,bytes)" - ], - "0xc8690233": [ - "pubkey(bytes32)" - ], - "0x29cd62ea": [ - "setPubkey(bytes32,bytes32,bytes32)" - ], - "0x691f3431": [ - "name(bytes32)" - ], - "0x77372213": [ - "setName(bytes32,string)" - ], - "0x20d8741f": [ - "Feed()" - ], - "0xdd114c22": [ - "publish(address,uint256,address,uint256)" - ], - "0xfb279ef3": [ - "tip(uint256,address,uint256)" - ], - "0x96c824a8": [ - "createAccountFundContract()" - ], - "0x33397816": [ - "withdrawAccountBalance(address)" - ], - "0x6ebbe863": [ - "updatePublishContract(address)" - ], - "0xfad4b99a": [ - "updateChannelMinimum(address,uint256)" - ], - "0x0b7ad54c": [ - "getContent(uint256)" - ], - "0xda9c6a46": [ - "getReplyCount(uint256)" - ], - "0x47372325": [ - "getChannelSize(address)" - ], - "0x2ca6d2c0": [ - "getAccountSize(address)" - ], - "0x73f93a48": [ - "getAccountContentTip(address,uint256)" - ], - "0x0a7f4239": [ - "getAccountFundContract(address)" - ], - "0x0fcda174": [ - "getAccountTokenBalance(address,address)" - ], - "0x79be02af": [ - "Read(address)" - ], - "0x27fbcac5": [ - "getChannelFeed(address,uint256,uint256)" - ], - "0xdd90c403": [ - "getAccountFeed(address,uint256,uint256)" - ], - "0xbff974e8": [ - "getContentReplies(uint256)" - ], - "0xb3822da8": [ - "getContents(uint256[])" - ], - "0x2a45a39a": [ - "Post(address)" - ], - "0xe3579ea5": [ - "publish(string,string,address,uint256)" - ], - "0x4c8cc20b": [ - "toContentID(address,string,string,address,uint256)" - ], - "0x6ce1417e": [ - "Fund()" - ], - "0xea46193e": [ - "getEtherBalance()" - ], - "0x55291dbd": [ - "claimEther()" - ], - "0xe9e99d81": [ - "getChannelFeed(address,uint256,uint256,uint256)" - ], - "0x05a17fc6": [ - "getAccountFeed(address,uint256,uint256,uint256)" - ], - "0xd90a88cd": [ - "getContentReplies(uint256,uint256)" - ], - "0x49e347ae": [ - "getContents(uint256[],uint256)" - ], - "0xbac1e9f6": [ - "getChannelSize(address,uint256)" - ], - "0x048e2e94": [ - "getAccountSize(address,uint256)" - ], - "0x9f181b5e": [ - "tokenCount()" - ], - "0xf446c1d0": [ - "A()" - ], - "0x314e99a2": [ - "abdicate()" - ], - "0x9b0b9c07": [ - "acceptBankDraft()" - ], - "0xbdfdb519": [ - "accept(string,uint256,uint16)" - ], - "0x8f5e9ca7": [ - "acceptTOS(address,bool)" - ], - "0xa79deb4f": [ - "acceptTradeDeal()" - ], - "0x5a28340a": [ - "accessOperatingBudget(uint256)" - ], - "0xa8b60b93": [ - "ackMsg(uint256,string)" - ], - "0x7ec0f30d": [ - "ack(string)" - ], - "0x82a62137": [ - "activateAccount(address)" - ], - "0x1e9fcc77": [ - "activateAllowance(address,address)" - ], - "0x6bd92f7c": [ - "activateAllowanceRecord(address,address)" - ], - "0x0651844e": [ - "activateBalance(address)" - ], - "0xc8e49707": [ - "activateExportFee(address)" - ], - "0x2cd78450": [ - "activateExportFeeChargeRecord(address)" - ], - "0xd532e481": [ - "activateFrozenAccount(address)" - ], - "0x1d2b7155": [ - "activateImportFeeChargeRecord(address)" - ], - "0xcf03f5f4": [ - "activateMasterKey(address)" - ], - "0x1917ab5c": [ - "activate(string)" - ], - "0x0b2acb3f": [ - "add(address,bytes)" - ], - "0xec97cff7": [ - "addCertificationDocument(address,bytes32)" - ], - "0xa0d605c6": [ - "addCertificationDocumentInternal(address,bytes32)" - ], - "0xe80bd3e5": [ - "addCertificationDocumentToSelf(bytes32)" - ], - "0x2b198366": [ - "addCertifier(address)" - ], - "0xac3e7d24": [ - "addChainyData(string)" - ], - "0x9450b1c8": [ - "addCharityFundation(string,string,string)" - ], - "0x6ac6205c": [ - "addDataPoint(int256,uint256,bool,string)" - ], - "0x4094ef5e": [ - "addDataRequest(string)" - ], - "0xd3118a5a": [ - "addDoc(string,string)" - ], - "0x20339891": [ - "addGridMember(address)" - ], - "0x61bffe01": [ - "addIdentities(bytes32[],bytes32[])" - ], - "0x17b3a34b": [ - "_addIdentities(uint256,bytes32[])" - ], - "0x17e1bfb7": [ - "addInstitution(address,string)" - ], - "0xf824384a": [ - "addInvestorAtID(uint256)" - ], - "0x202d6eaf": [ - "addInvestorsValue(uint256)" - ], - "0x2fe9541f": [ - "addIssueBounty(string,uint256)" - ], - "0x2d06177a": [ - "addManager(address)" - ], - "0x2ba0b09f": [ - "AddNewCategory(bytes4,uint8,uint8,address)" - ], - "0x29dfdded": [ - "addNewDonkey(address)" - ], - "0x74bfb965": [ - "addNewProxy(address)" - ], - "0x755f99c2": [ - "AddNewSmallContract(address)" - ], - "0xc1d5e84f": [ - "addNewUser(address)" - ], - "0x76849376": [ - "addNode(bytes32,address)" - ], - "0x7d380265": [ - "addOptionChain(uint256,string,uint256,uint256,bytes32,address,int256[])" - ], - "0x227f9633": [ - "addOption(string,address,uint256)" - ], - "0xdf5dd1a5": [ - "addOracle(address)" - ], - "0x3c0dde1c": [ - "_addPools(address,address)" - ], - "0x3d90d44d": [ - "addPowerSource(address,uint256,uint256)" - ], - "0x49bf66d3": [ - "addRegistryIntoNameIndex(address)" - ], - "0xb796a339": [ - "addRegistryIntoOwnerIndex(address,address)" - ], - "0x7cdbae63": [ - "addRegistryIntoTagsIndex(address)" - ], - "0x3e82055a": [ - "addSignature(uint256,bytes16,bytes)" - ], - "0xd1feca67": [ - "addSpendingRequest(address)" - ], - "0xdab80d6f": [ - "addSponsor(address)" - ], - "0xb0c8f9dc": [ - "add(string)" - ], - "0x8396392d": [ - "add(string,string,string,address)" - ], - "0x36555b85": [ - "add(string,uint256)" - ], - "0xd2dc0869": [ - "add(string,uint256,string,string,address)" - ], - "0x0f3eb785": [ - "add(string,uint256,uint256,uint256)" - ], - "0x38178fbe": [ - "addString(string,string)" - ], - "0x45590ec8": [ - "addTag(uint256,string)" - ], - "0x0e1d88fc": [ - "addTender(uint256,uint256,address,uint256)" - ], - "0x7f0899f2": [ - "AddTicket(bytes5[])" - ], - "0xd48bfca7": [ - "addToken(address)" - ], - "0x75c4aaa6": [ - "addUnderDog(uint256)" - ], - "0x213ac932": [ - "addUser(address,uint256,uint8,bytes32,bytes32)" - ], - "0x9da680f3": [ - "adjustRegistrationFee(uint256)" - ], - "0x5b6a54bc": [ - "adjustTransactionFee(uint256)" - ], - "0x40fdef80": [ - "administration(uint256,string,uint256,uint256,address)" - ], - "0xbc21ce9d": [ - "Aggregation()" - ], - "0x98688a95": [ - "Ai()" - ], - "0xbd3f0965": [ - "AiraEtherFunds(string,string)" - ], - "0xe1efda6d": [ - "airaSend(address,address,uint256)" - ], - "0x6d2cb794": [ - "airaTransfer(address,address,uint256)" - ], - "0xa9f8ec6c": [ - "AlarmClockTipFaucet()" - ], - "0x4a8b5389": [ - "allocateBountyAndEcosystemTokens()" - ], - "0xbcfcb03e": [ - "allocateFounderTokens()" - ], - "0xd526b9bd": [ - "_allow()" - ], - "0x1c8d5d38": [ - "allowance(address,address,bytes32)" - ], - "0xeb06e65e": [ - "allowanceFromProxy(address,address,address)" - ], - "0x9c0a4bbc": [ - "AlwaysFail()" - ], - "0x3b591ea7": [ - "AmountToForgeTheNextBlock()" - ], - "0x6056969b": [ - "announce(bytes32)" - ], - "0x3ef8ec78": [ - "announce_numbers(uint8,uint8,uint8,uint8,uint32,bytes32)" - ], - "0xea0a5237": [ - "announce(string)" - ], - "0xac04f5a7": [ - "append(address)" - ], - "0x94ed9b77": [ - "append(address,address)" - ], - "0x9aaf442c": [ - "applyCensorship(uint256)" - ], - "0x691d58e7": [ - "_applyRefund(uint256)" - ], - "0x7b7d7225": [ - "_approve(address,uint256)" - ], - "0x6d1669e1": [ - "approveAndCall(address,address,uint256,bytes)" - ], - "0xf11c4482": [ - "approveFromProxy(address,address,uint256)" - ], - "0x7df52ba8": [ - "Arbitrate(uint32,uint32,bool)" - ], - "0x99154b49": [ - "ARK()" - ], - "0x014e5fde": [ - "ARKController_1_00()" - ], - "0xfb32f4f5": [ - "ARK_FLAGGER_1_00()" - ], - "0x2be6d43c": [ - "ARKTagger_1_00()" - ], - "0xae30d35d": [ - "ARK_TROGLOg_1_00()" - ], - "0x97709cde": [ - "ARK_VOTER_1_00(uint256,uint256,uint256,uint256,uint256,uint256)" - ], - "0xdba21657": [ - "askForEther(uint256)" - ], - "0x8a3e44d4": [ - "assetMoveInformation(address,address)" - ], - "0x0399c357": [ - "assignFreeReadings(address,uint8)" - ], - "0x7fe0518a": [ - "asyncSend(address,uint256)" - ], - "0xa843c97f": [ - "attack(uint256,uint256,uint256[])" - ], - "0xe0886f90": [ - "at(uint256)" - ], - "0x373c98a2": [ - "authCall(address,bytes32)" - ], - "0x39b35753": [ - "authCancel(address)" - ], - "0x4a5db3b5": [ - "authorizeAddress(address)" - ], - "0x2db89533": [ - "Auth(uint8,address)" - ], - "0x10cf5d47": [ - "awaitingPayout()" - ], - "0x3d79d1c8": [ - "bal()" - ], - "0x0a6be0e7": [ - "BalancedPonzi()" - ], - "0x4d30b6be": [ - "balanceOf(address,bytes32)" - ], - "0x61a00f6d": [ - "Ballot(bytes32[])" - ], - "0x940f851c": [ - "Ballot(uint8)" - ], - "0x97c3ccd8": [ - "ban(address)" - ], - "0xb5deeca7": [ - "BaseRegistry()" - ], - "0xcbe9ef39": [ - "BasicCoin(uint256,address)" - ], - "0xd767aee0": [ - "bbb()" - ], - "0x738486bd": [ - "BeerCoin(uint256)" - ], - "0xf79b22e0": [ - "betOnATeam(uint256)" - ], - "0xd30a512e": [ - "betOnColumnOrDozen(bool,bool,bool)" - ], - "0x86314af9": [ - "BetOnHashV84()" - ], - "0x3adb2de7": [ - "bet_this_spin()" - ], - "0x416c8701": [ - "beyond()" - ], - "0x934db458": [ - "Big()" - ], - "0x71dd99fe": [ - "BigRisk()" - ], - "0xf67a1d37": [ - "BlockChainChallenge()" - ], - "0x8a519fb9": [ - "BlockChainEnterprise()" - ], - "0x9ad4f98e": [ - "BlocksureInfo()" - ], - "0x48d9a374": [ - "blockTransfer(address,uint256)" - ], - "0x00601d6c": [ - "board(uint256,uint8,uint8)" - ], - "0xd1100691": [ - "BookCafe()" - ], - "0xbb00fc55": [ - "bookEarnings()" - ], - "0x9eee85fe": [ - "bookEarnings(address,uint256)" - ], - "0xdba7ef7d": [ - "Bookie(address,address)" - ], - "0x60913244": [ - "botOnSale(uint256,uint256)" - ], - "0x4cb85356": [ - "BranchSender(uint256,bytes32)" - ], - "0x0ad95b44": [ - "bribery()" - ], - "0xb0ad38c4": [ - "buildCity(string,uint256[2],uint256[2])" - ], - "0xdad99989": [ - "burnCoins(address)" - ], - "0x5fc5d48b": [ - "burnUnsoldCoins(address)" - ], - "0x3824d8ee": [ - "buy100DaoFor1Eth()" - ], - "0x561a4873": [ - "buyAd(string,string,string,uint256,uint8,address)" - ], - "0x5f8f0483": [ - "buyBankerAgreementFromImporterBank()" - ], - "0x29274fe1": [ - "buyBOTx(uint256,string,string,address,uint256)" - ], - "0xe75528cc": [ - "buyBuilding(uint256,uint256)" - ], - "0xe7e2aa0e": [ - "buyer_cancel()" - ], - "0xd04bfc9c": [ - "buyer_pay()" - ], - "0x29cbdc86": [ - "buyin(address,uint256)" - ], - "0x4ea66c38": [ - "buyinInternal(address,uint256)" - ], - "0xd24ddcfe": [ - "buyKissBTC()" - ], - "0x854f4817": [ - "buyKissBTCWithCallback(address,uint256)" - ], - "0xdda44b10": [ - "buyRecipient(address,uint8,bytes32,bytes32)" - ], - "0xcef8d343": [ - "buyShare(uint256,bool)" - ], - "0x90cb04e1": [ - "buy(string,uint256,uint16)" - ], - "0xedca914c": [ - "buyTicket()" - ], - "0x920c94df": [ - "BuyTicketForOther(address,uint8,uint8,uint8)" - ], - "0x378c0605": [ - "buyTickets(address)" - ], - "0x46f7a883": [ - "BuyTicket(uint8,uint8,uint8)" - ], - "0xaaf9d13e": [ - "buyTopDog(uint256,uint256)" - ], - "0xe5fe4f31": [ - "buy(uint8,bytes32,bytes32)" - ], - "0x4b8772c1": [ - "buyUnit(uint256,uint256)" - ], - "0xb412d4d6": [ - "CafeDelivered()" - ], - "0x4dda1764": [ - "CafeMaker()" - ], - "0x4dc3141b": [ - "CalcAll()" - ], - "0xea295ec2": [ - "calcRevenue(address)" - ], - "0xc1cc0775": [ - "calculateFeeDynamic(uint256,uint256)" - ], - "0xc03e382f": [ - "calculateShare()" - ], - "0x671dacdc": [ - "CalculateSqrt(uint256)" - ], - "0xdcf8113e": [ - "campaignEndedSuccessfully()" - ], - "0x74e60a48": [ - "cancelOrder(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)" - ], - "0xdc419fd8": [ - "cancelOrder(bool,uint256)" - ], - "0x3fb0b2c9": [ - "CancelRoundAndRefundAll()" - ], - "0x9d1bbd7e": [ - "CancelRoundAndRefundAll(uint256)" - ], - "0x6618b008": [ - "cancelSellOrder(address)" - ], - "0x39b50688": [ - "cancelSellOrder()" - ], - "0x06909f69": [ - "cancel(string,uint256)" - ], - "0x1d3390a1": [ - "carefulSendWithFixedGas(address,uint256,uint256)" - ], - "0x5cff876b": [ - "carrotsCaught()" - ], - "0x4bb4b260": [ - "cashAllOut()" - ], - "0xe2861c8d": [ - "cashOutProfit()" - ], - "0x4a30f976": [ - "censorship(uint256,bool,bool)" - ], - "0x05b2b03a": [ - "CertificationCentre(address)" - ], - "0x35d79fad": [ - "CertificationDb(address,uint256,address)" - ], - "0xf72457af": [ - "CertifierDb()" - ], - "0x5103a5a3": [ - "certify(address,bytes32)" - ], - "0x0f096163": [ - "Chainy()" - ], - "0xdabdc1f2": [ - "ChangeActiveDigger(address)" - ], - "0x839849c0": [ - "changeBaseMultiplier(uint256)" - ], - "0x1ed6f423": [ - "changeDescription(address,string)" - ], - "0x75090ebf": [ - "changeDomain(uint256,uint256,uint256,address)" - ], - "0x3fd94686": [ - "changeEligibleDonkeys(uint256)" - ], - "0x6a1db1bf": [ - "changeFee(uint256)" - ], - "0x93c32e06": [ - "changeFounder(address)" - ], - "0xd21d7950": [ - "changeGasLimitOfSafeSend(uint256)" - ], - "0x62ee6d29": [ - "changeHashtoLowOrHigh(uint256)" - ], - "0x1efb17ee": [ - "changeHouseAddress(address)" - ], - "0xeb1ff845": [ - "changeId(uint256,uint256,uint256)" - ], - "0x07a9574a": [ - "changeLeaderMessage(string)" - ], - "0x53fefd7d": [ - "changeMaxDeposit(uint256)" - ], - "0xa51aea2d": [ - "changeMaxMultiplier(uint256)" - ], - "0x45ca25ed": [ - "changeName(address,string)" - ], - "0x85eac05f": [ - "changeOwnerAddress(address)" - ], - "0x244ded7a": [ - "ChangeOwnership(address)" - ], - "0xc0b92612": [ - "changePig(address)" - ], - "0x0fffbb54": [ - "changeRankingSize(uint256)" - ], - "0x1982ed58": [ - "ChangeReuseCashInHarware(bool,uint16,uint16)" - ], - "0xcdcb7c8f": [ - "chase()" - ], - "0x919840ad": [ - "check()" - ], - "0xc23697a8": [ - "check(address)" - ], - "0xede8ebf3": [ - "checkApprove(address,uint256)" - ], - "0x20e647e1": [ - "checkBetColor(uint8,address,bytes32,bytes32)" - ], - "0xf2b904c3": [ - "checkBetColumn(uint8,address,bytes32,bytes32)" - ], - "0x74388347": [ - "checkBetDozen(uint8,address,bytes32,bytes32)" - ], - "0x75830463": [ - "checkBetLowhigh(uint8,address,bytes32,bytes32)" - ], - "0x40c0bcb9": [ - "checkBetNumber(uint8,address,bytes32,bytes32)" - ], - "0xe9c31315": [ - "checkBetParity(uint8,address,bytes32,bytes32)" - ], - "0x1e5330ca": [ - "checkBetResult(uint8,address,bytes32,bytes32)" - ], - "0x90a85119": [ - "checkBetResult(uint8)" - ], - "0xc67146a5": [ - "check_bet(uint256,address,uint8)" - ], - "0xf062e26b": [ - "check_darkdao()" - ], - "0x1a9360dd": [ - "checkDate()" - ], - "0x32921690": [ - "checkDepth(address,uint256)" - ], - "0xdc3ab866": [ - "checkEarnings(address)" - ], - "0x51fdaf92": [ - "checkExpiredfunds()" - ], - "0x46b207b8": [ - "checkExpiry()" - ], - "0xe95bee59": [ - "checkFormat(string)" - ], - "0x119aa5c8": [ - "checkForward(bytes)" - ], - "0x19483cd1": [ - "checkHash()" - ], - "0x0382c254": [ - "CheckHash(uint8,uint8,uint8,uint8,bytes32)" - ], - "0x255016c8": [ - "checkIfExploded()" - ], - "0x0343dfa0": [ - "checkInvariants()" - ], - "0x4c7a2254": [ - "checkMyWithdraw()" - ], - "0x33893071": [ - "checkMyWithdraw(address)" - ], - "0xb2bfd948": [ - "checkNumbers(uint8[3])" - ], - "0xbed411a0": [ - "CheckPrize(address)" - ], - "0xb623f5e5": [ - "checkSetCosignerAddress(address)" - ], - "0xef19c332": [ - "_checkSigned(bytes32,uint256,uint8,bytes32,bytes32)" - ], - "0x3c959aca": [ - "CheckTickets()" - ], - "0xe0c6190d": [ - "checkTime()" - ], - "0x5329c681": [ - "checkTimeout(uint256)" - ], - "0x88e072b2": [ - "checkTransfer(address,uint256)" - ], - "0xc5575ef0": [ - "checkTransferFrom(address,address,uint256)" - ], - "0x00a7d6b3": [ - "checkTransferFromToICAP(address,bytes32,uint256)" - ], - "0xbd8c1d33": [ - "checkTransferFromToICAPWithReference(address,bytes32,uint256,string)" - ], - "0xc6e0c908": [ - "checkTransferFromWithReference(address,address,uint256,string)" - ], - "0x8e4afa51": [ - "checkTransferToICAP(bytes32,uint256)" - ], - "0x058026d0": [ - "checkTransferToICAPWithReference(bytes32,uint256,string)" - ], - "0xcbcaacab": [ - "checkTransferWithReference(address,uint256,string)" - ], - "0x5f72f450": [ - "check(uint256)" - ], - "0x22d8cf5b": [ - "CheckUserVote(uint8,uint8)" - ], - "0xefdecd9b": [ - "check_withdrawdao()" - ], - "0xbd66528a": [ - "claim(bytes32)" - ], - "0x008a745d": [ - "claimDividendShare(uint256)" - ], - "0x0b3ed536": [ - "claimDonations(uint256)" - ], - "0xb88a802f": [ - "claimReward()" - ], - "0x3b751f7f": [ - "claimThroneRP(string)" - ], - "0xe6e7237f": [ - "claim_time_victory(uint256)" - ], - "0x4a1aa767": [ - "claim_victory(uint256,uint8,uint8,uint8)" - ], - "0x4e05ded6": [ - "ClassicCheck()" - ], - "0x565a2ecf": [ - "classicTransfer(address)" - ], - "0x2526d960": [ - "clawback()" - ], - "0x01775f23": [ - "_closeBooks()" - ], - "0xee1b4828": [ - "closeBooks()" - ], - "0x31a3a506": [ - "closeFunding()" - ], - "0xc71b583b": [ - "closeRequest()" - ], - "0x203c03fa": [ - "Coinflip()" - ], - "0x7879e19e": [ - "CollectAllFees()" - ], - "0xaf8b7525": [ - "CollectAndReduceFees(uint256)" - ], - "0xc27b2c2d": [ - "collectEarnings()" - ], - "0xd4d5d32a": [ - "collectFee()" - ], - "0xb17acdcd": [ - "collectFees(uint256)" - ], - "0xeeb57139": [ - "CollectMoney(uint256)" - ], - "0x4a71d469": [ - "collectRev()" - ], - "0xd9fcb31f": [ - "comm_channel()" - ], - "0xf14fcbc8": [ - "commit(bytes32)" - ], - "0xf3bb9741": [ - "commitmentCampaign(uint256,bytes32)" - ], - "0x355474d2": [ - "commitReading(address)" - ], - "0xbe4054b9": [ - "commitReading(address,uint256,uint256,string)" - ], - "0xf2f03877": [ - "commit(uint256,bytes32)" - ], - "0x3da0ac79": [ - "compare()" - ], - "0x3a96fdd7": [ - "compare(string,string)" - ], - "0x4f139314": [ - "compensateLatestMonarch(uint256)" - ], - "0xbfbc793c": [ - "computeNameFuzzyHash(string)" - ], - "0x5aa94a68": [ - "computeResultVoteExtraInvestFeesRate()" - ], - "0x6bdbf8e6": [ - "concat()" - ], - "0x89c19ddb": [ - "concat(string,string)" - ], - "0xc8f8d75d": [ - "Config(uint8,address)" - ], - "0x75cb2672": [ - "configure(address)" - ], - "0x305b73d9": [ - "configure(address,address,uint256,uint8,bytes32,bytes32)" - ], - "0x3773930e": [ - "ConfigureFunction(address,uint256,uint16,uint16,uint16)" - ], - "0x47f3d794": [ - "configure(uint256,uint8,uint256,uint256,uint256,uint256)" - ], - "0x4746cef8": [ - "_confirmAndCheck(address,bytes32)" - ], - "0xffb4c857": [ - "_confirmAndCheck(bytes32)" - ], - "0x0ae08793": [ - "confirmAndCheck(bytes32)" - ], - "0x3f3935d1": [ - "confirmReverse(string)" - ], - "0x0afa9fb9": [ - "contains(int256,address)" - ], - "0x5dbe47e8": [ - "contains(address)" - ], - "0xda4b5e29": [ - "contains()" - ], - "0x1747dfd4": [ - "ContractPlay()" - ], - "0x7e7a2fbf": [ - "contribute_toTheGame()" - ], - "0x1aadcc34": [ - "convertGreyGreen(uint8,uint8)" - ], - "0xc618d15f": [ - "ConvertNumbers(bytes5)" - ], - "0x11cd98ed": [ - "convertToAllTable(uint256,string)" - ], - "0x5020dcf4": [ - "convertToEach(uint256,string,uint256)" - ], - "0xbed1b8b9": [ - "convertToInt(string)" - ], - "0x3733ffca": [ - "convertTo(uint256,string,string)" - ], - "0x90f2c86d": [ - "convertToWei(uint256,string)" - ], - "0x276b94e1": [ - "copypaste()" - ], - "0x60726abb": [ - "copy()" - ], - "0x061ea8cc": [ - "countByOwner(address)" - ], - "0x135128c2": [ - "CounterPartyDeposit()" - ], - "0x1840f0ca": [ - "countVotes(uint256)" - ], - "0xe10e274a": [ - "CrazyEarning()" - ], - "0x4a82534b": [ - "create(address,address,address,uint256,uint8,uint8,uint256)" - ], - "0x66e98c31": [ - "createCoin(string,uint256,uint256,string,string,address)" - ], - "0x0eb0afa6": [ - "createDebt(address,address,uint256)" - ], - "0xf463edd1": [ - "createDocument(uint256)" - ], - "0xe9794dc1": [ - "CreateHash(uint8,string)" - ], - "0x5fe27ab0": [ - "createHKG(address)" - ], - "0xc88961da": [ - "createKingdom(string,address,address,address)" - ], - "0xeac116c4": [ - "createKingdom(string,address,address,address,address)" - ], - "0xa21931ea": [ - "CreateProposal(string,string,string,uint32,string,string,string,uint32,uint32)" - ], - "0xa753d6f2": [ - "CreateProposal(string,string,string,string,string,string,uint32,uint32)" - ], - "0x35cc59a9": [ - "createSchema(bytes)" - ], - "0x4156fdb7": [ - "createSwap(uint256)" - ], - "0x16d960b5": [ - "createThing(bytes32[],bytes32[],uint88)" - ], - "0x8ea822d8": [ - "createThings(bytes32[],uint16[],bytes32[],uint16[],uint88)" - ], - "0x72479140": [ - "CreateTicket(address,uint8,uint8,uint8)" - ], - "0x3d6a32bd": [ - "createTradeContract(address,uint256,uint256,uint256,bool,bool)" - ], - "0x6f9a5eab": [ - "createTx(uint256,address,uint256)" - ], - "0xe1c66292": [ - "Create(uint32,address)" - ], - "0x77863b61": [ - "CrossWhitehatWithdraw(uint256,address)" - ], - "0x26a4861c": [ - "CROWDFUNDING_PERIOD()" - ], - "0xec5c9036": [ - "Crowdsale(address,uint256,uint256)" - ], - "0xe42def21": [ - "CryptoHill()" - ], - "0xeccf1b29": [ - "CrystalDoubler()" - ], - "0xbfc3d84b": [ - "CT()" - ], - "0xce845d1d": [ - "currentBalance()" - ], - "0x80c951bf": [ - "currentClaimPriceInFinney()" - ], - "0x85528394": [ - "currentClaimPriceWei()" - ], - "0xbab2f552": [ - "currentCycle()" - ], - "0x0295d71b": [ - "currentDepositLimit()" - ], - "0xda3c300d": [ - "currentFee()" - ], - "0xb8aca90b": [ - "CurrentGame()" - ], - "0xac4bd53a": [ - "currentLeader()" - ], - "0x499af77c": [ - "current_spin_number()" - ], - "0x06961560": [ - "DAO(address,uint256,uint256,uint256,address)" - ], - "0xcaed4f9f": [ - "DataService()" - ], - "0xd8915fc5": [ - "DCAssetBackend(bytes32,bytes32)" - ], - "0x306387a4": [ - "dealStatus(uint256)" - ], - "0x95669952": [ - "debtor(address,uint256)" - ], - "0xaa6be303": [ - "debtors(address)" - ], - "0x54107401": [ - "declareLove(string,string)" - ], - "0x5c19a95c": [ - "delegate(address)" - ], - "0x928a00d2": [ - "deleteCoin(uint256)" - ], - "0xe4dedc7f": [ - "DeleteContract()" - ], - "0xc0f5a9cb": [ - "deleteThing(bytes32[])" - ], - "0x07ef99a0": [ - "demintTokens(int256,address,uint8)" - ], - "0x4abb9d39": [ - "depletable()" - ], - "0xacfdfd1c": [ - "deploy(uint256,string,string,address)" - ], - "0xec2ac54e": [ - "deposit(address,uint256,bytes32,uint256)" - ], - "0xb7482509": [ - "deposit(address,string)" - ], - "0x47e7ef24": [ - "deposit(address,uint256)" - ], - "0xc5b1a53c": [ - "deposit(bytes16[],uint64)" - ], - "0xaa67c919": [ - "depositFor(address)" - ], - "0xbb3ce7fe": [ - "DepositHolder()" - ], - "0xb47fa7e0": [ - "DepositLimit(uint256)" - ], - "0x44e43cb8": [ - "depositRevenue()" - ], - "0xe241c1d9": [ - "deriveKey(uint256,uint256,uint256)" - ], - "0x9b1ad792": [ - "destroyToken(address,uint256)" - ], - "0x67fbd289": [ - "destroyTokens(uint256)" - ], - "0x2b68b9c6": [ - "destruct()" - ], - "0x41395efa": [ - "dgxBalance()" - ], - "0x56105a08": [ - "DgxSwap()" - ], - "0x594151e0": [ - "Dice()" - ], - "0x5e855f14": [ - "Dice(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)" - ], - "0x6545bed3": [ - "Dice(uint256,uint256,uint256,uint256,uint256,uint256,uint256)" - ], - "0x0f06670a": [ - "didWin(bytes32)" - ], - "0x91b4a0e7": [ - "Difficulty()" - ], - "0x1b3a8e6f": [ - "directionCount(int256,int256,int256,int256)" - ], - "0x0d17bc2e": [ - "_disallow()" - ], - "0x7f3bd56e": [ - "disburse(address,uint256)" - ], - "0x1f0f711f": [ - "discontinue()" - ], - "0x423e7e79": [ - "_dispatchEarnings()" - ], - "0xf240f7c3": [ - "dispute()" - ], - "0x44691f2b": [ - "Dispute()" - ], - "0x4ecd73e2": [ - "DistributeDividends(uint256)" - ], - "0x76577eae": [ - "distributeEarnings()" - ], - "0x2ef875fb": [ - "div10(uint256,uint8)" - ], - "0x058aace1": [ - "divest()" - ], - "0x11af3c68": [ - "divest(address)" - ], - "0xbb504317": [ - "divest(address,uint256)" - ], - "0x8ca17995": [ - "divest(uint256)" - ], - "0x8df554b3": [ - "Dividend()" - ], - "0x4a2b0c38": [ - "DividendProfit()" - ], - "0x0d48e8d0": [ - "doBalance()" - ], - "0xe916d0f0": [ - "doBalance(address)" - ], - "0x33fd066d": [ - "doBalanceFor(address)" - ], - "0xdfdb5f17": [ - "doBurn(address,uint256)" - ], - "0x60c311fd": [ - "doBurnFromContract(address,uint256)" - ], - "0xf1bca7a4": [ - "doCall(uint256)" - ], - "0x7fd238ba": [ - "doCoinage(address[],uint256[],uint256,uint256,uint256)" - ], - "0x8ac78c80": [ - "Docsign()" - ], - "0xddf187b0": [ - "dogFight()" - ], - "0x7997b997": [ - "doMelt(uint256,uint256)" - ], - "0xad1ef61e": [ - "donkeyInvested(address)" - ], - "0xc9bbc8c0": [ - "donkeyName(address)" - ], - "0x26161670": [ - "donkeyRanking(uint256)" - ], - "0x23509e69": [ - "donkeysEligibleForFees()" - ], - "0x37751b35": [ - "doTransfer(address,address,uint256)" - ], - "0x13220305": [ - "doTransferOther(address,address,address,uint256)" - ], - "0xdc583801": [ - "doubleyour5()" - ], - "0x4974bc27": [ - "download()" - ], - "0x9890220b": [ - "drain()" - ], - "0x0eecae21": [ - "draw()" - ], - "0x89d8ca67": [ - "drawPot(bytes32,bytes32)" - ], - "0x18433bb7": [ - "DrawPrepare()" - ], - "0xe436bdf3": [ - "Draws(uint256)" - ], - "0x4f39ca59": [ - "drop(bytes32)" - ], - "0x200538c6": [ - "DTE()" - ], - "0x5e0e2957": [ - "dumpOut()" - ], - "0xef5daf01": [ - "_dumpToCompany()" - ], - "0xaca66aec": [ - "DVIP()" - ], - "0xf245b9e4": [ - "DVIP(address)" - ], - "0xe570be18": [ - "DVIPBackend(address,address)" - ], - "0xa08b3367": [ - "EC()" - ], - "0xdb318833": [ - "_ecAdd(uint256,uint256,uint256,uint256,uint256,uint256)" - ], - "0xf47289e1": [ - "_ecDouble(uint256,uint256,uint256)" - ], - "0x913f424c": [ - "_ecMul(uint256,uint256,uint256,uint256)" - ], - "0x0c7de59d": [ - "edit(address,bytes,bool)" - ], - "0xf63da25b": [ - "Emailer()" - ], - "0x23385089": [ - "emitApprove(address,address,uint256)" - ], - "0xe3a9b508": [ - "EnableDisableTokenProxy()" - ], - "0x2c46d8d5": [ - "EndRound(uint256)" - ], - "0xacbf98a7": [ - "endsWith()" - ], - "0xf67abd87": [ - "entryDetails(uint256)" - ], - "0xd4625a3a": [ - "equals()" - ], - "0x46bdca9a": [ - "equal(string,string)" - ], - "0xfc72c1ef": [ - "ERC20Base(uint256)" - ], - "0x0bd2ae1c": [ - "ERW()" - ], - "0x22f607f6": [ - "Escrow()" - ], - "0x0bad342a": [ - "EscrowContract(address,address,address,address,uint256,uint256,uint256,uint256)" - ], - "0x8383bfc8": [ - "EscrowFoundry()" - ], - "0x1768b436": [ - "ETCSurvey()" - ], - "0xdbf45aa3": [ - "EthBank()" - ], - "0x838445e8": [ - "EtherAds(address,address,address)" - ], - "0x1df5e755": [ - "Etherandom()" - ], - "0x384e5018": [ - "etherandomCallbackAddress()" - ], - "0xd216d55d": [ - "etherandomExec(bytes32,bytes32,uint256)" - ], - "0x1f201e39": [ - "etherandomExecWithGasLimit(bytes32,bytes32,uint256,uint256)" - ], - "0xa715ff59": [ - "EtherandomProxy()" - ], - "0x36f9f49c": [ - "etherandomSeed()" - ], - "0x70e71ea3": [ - "etherandomSeedWithGasLimit(uint256)" - ], - "0x4d561721": [ - "etherandomSetNetwork()" - ], - "0x7ca55e00": [ - "etherandomVerify(bytes32,bytes32,bytes32,uint256,uint256)" - ], - "0x29bed3bf": [ - "EthereumRoulette()" - ], - "0xd81f53fd": [ - "EtherId()" - ], - "0x50e06b57": [ - "Etherization()" - ], - "0xd409ddda": [ - "EtherizationUtils()" - ], - "0xff7f5f2a": [ - "EtherizationUtils2()" - ], - "0xf9a794ad": [ - "EtherLovers()" - ], - "0x1558ae4d": [ - "Etheroll()" - ], - "0xa08d3f83": [ - "Etheropt(uint256,string,uint256,uint256,bytes32,address,int256[])" - ], - "0xadd43c59": [ - "EtherTopDog()" - ], - "0x356594ab": [ - "EtherTransfer()" - ], - "0x0da3e613": [ - "EthFactory()" - ], - "0xf5f6ea26": [ - "EthOne()" - ], - "0x3023d0c4": [ - "Ethstick()" - ], - "0x6f13e01b": [ - "EthVenturePlugin()" - ], - "0x4054f5de": [ - "EthVentures3()" - ], - "0x9c172f87": [ - "EthVentures4()" - ], - "0xd5171523": [ - "euroteambet()" - ], - "0x9f87acd0": [ - "exec(bytes32,bytes32,uint256)" - ], - "0xf4993bbd": [ - "executeEmergencyWithdrawal()" - ], - "0x38557648": [ - "executeSellOrder(address)" - ], - "0x4d782cbc": [ - "executeSellOrder()" - ], - "0x140b4465": [ - "executeSpendingRequests()" - ], - "0x3462f32d": [ - "execWithGasLimit(bytes32,bytes32,uint256,uint256)" - ], - "0xd4649fde": [ - "expire(uint256,uint8,bytes32,bytes32,bytes32)" - ], - "0x03cf4fd6": [ - "expire(uint256,uint256,uint8,bytes32,bytes32,bytes32)" - ], - "0x419945f8": [ - "ExpiringMarket(uint256)" - ], - "0x37930615": [ - "extend(bytes16[],uint64)" - ], - "0x6a6d31db": [ - "externalEnter()" - ], - "0xf55b23c0": [ - "externalLeave()" - ], - "0xe2056c46": [ - "ExtraBalToken()" - ], - "0x7ef95c6f": [ - "extractAccountAllowanceRecordLength(address)" - ], - "0x4de162e4": [ - "extractAccountLength()" - ], - "0x727089f1": [ - "extractAllowanceLength()" - ], - "0x8f731077": [ - "extractAllowanceRecordLength(address)" - ], - "0xc8117b5b": [ - "extractBalanceOfLength()" - ], - "0x1cf43b63": [ - "extractExportFeeChargeLength()" - ], - "0xa056469a": [ - "extractFeeLength()" - ], - "0xb5a6c525": [ - "extractFrozenAccountLength()" - ], - "0xd1da09ee": [ - "extractImportFeeChargeLength()" - ], - "0x2885b593": [ - "extractMasterKeyIndexLength()" - ], - "0x981a60f5": [ - "extractNameFromData(bytes)" - ], - "0xb764e273": [ - "failSend()" - ], - "0xc57a050e": [ - "fairandeasy()" - ], - "0xa5e62f02": [ - "fallbackRP()" - ], - "0x93e02d13": [ - "FallenLeaders()" - ], - "0xd3732642": [ - "FastRealisticPyramid()" - ], - "0xc5096a69": [ - "feeFor(address,address,uint256)" - ], - "0x6860fd58": [ - "Fees(uint256)" - ], - "0x5b151fd2": [ - "fifty_fifty()" - ], - "0x75438e49": [ - "fillGas()" - ], - "0x884b5dc2": [ - "fill(uint256[])" - ], - "0x7ff729fc": [ - "fillUpProject(uint256,uint256)" - ], - "0xbf12165e": [ - "fillUpSlot(uint256,uint256)" - ], - "0x5fa513d5": [ - "findPtr(uint256,uint256,uint256,uint256)" - ], - "0x70d53be5": [ - "find()" - ], - "0xc9bd2893": [ - "fines()" - ], - "0x2cce4abe": [ - "_finishNoCallback()" - ], - "0x113e6b66": [ - "fipsAddToLedger(bytes20,address)" - ], - "0xaa8dea8c": [ - "fipsAddToLedger(bytes20,address,bytes)" - ], - "0xa289673b": [ - "fipsChangeOwner(bytes20,address,address)" - ], - "0x1dcb304b": [ - "fipsGenerate()" - ], - "0x7910085d": [ - "fipsIsRegistered(bytes20)" - ], - "0x3ae7cdfa": [ - "fipsLegacyRegister(bytes20[],address)" - ], - "0xdfce8ac3": [ - "fipsLegacyRegister(bytes20,address,bytes)" - ], - "0x5cb18a6d": [ - "fipsLegacyRegisterMulti(bytes20[],address,bytes)" - ], - "0x3def449b": [ - "FipsNotary()" - ], - "0x7620f4bb": [ - "fipsNotaryLegacy68b4()" - ], - "0x5084da18": [ - "fipsOwner(bytes20)" - ], - "0x3df76482": [ - "fipsPublishData(bytes20,bytes)" - ], - "0xfba06849": [ - "fipsPublishDataMulti(bytes20[],bytes)" - ], - "0x74d4ab27": [ - "fipsRegister()" - ], - "0x419ffa03": [ - "fipsRegister(address)" - ], - "0xb16562fe": [ - "fipsRegister(address,bytes)" - ], - "0x1531c267": [ - "fipsRegisterMulti(uint256,address,bytes)" - ], - "0x3dc02266": [ - "fipsRegister(uint256)" - ], - "0x2f62a6ff": [ - "fipsRegister(uint256,address,bytes)" - ], - "0xc12af1ce": [ - "fipsRegister(uint256,bytes)" - ], - "0x2fa00e58": [ - "fipsTransfer(bytes20,address)" - ], - "0x42402c2c": [ - "fipsTransferMulti(bytes20[],address)" - ], - "0x9e9d3aa4": [ - "FirstBloodToken(address,address,uint256,uint256)" - ], - "0x3df4ddf4": [ - "first()" - ], - "0xe87df70e": [ - "fivetimes()" - ], - "0x912de8de": [ - "fixBalance()" - ], - "0xf1c760ae": [ - "fixBalanceInternal(address)" - ], - "0x3369dace": [ - "flipTheCoinAndWin()" - ], - "0x6b9f96ea": [ - "flush()" - ], - "0x446a7974": [ - "Fokitol()" - ], - "0x6a5da6e5": [ - "followCampaign(uint256)" - ], - "0x384b1393": [ - "follow(uint256)" - ], - "0x7cf0ffcb": [ - "forceDivestAll()" - ], - "0x29e206bd": [ - "forceDivestAll(bool)" - ], - "0x232523e8": [ - "forceDivestOfAllInvestors()" - ], - "0x51404cbe": [ - "forceDivestOfOneInvestor(address)" - ], - "0x93feb13b": [ - "ForceSendHelper(address)" - ], - "0x11b9fee8": [ - "ForkChecker(uint256,bytes32)" - ], - "0x16c72721": [ - "forked()" - ], - "0xd264e05e": [ - "forward()" - ], - "0xa4d575ce": [ - "_forward(address,bytes)" - ], - "0xac562666": [ - "freezeCoin()" - ], - "0xb466b76f": [ - "fresh()" - ], - "0xb72e717d": [ - "fromAddress(address)" - ], - "0x891de9ed": [ - "fromTLA(string)" - ], - "0x3c067945": [ - "fundBalance()" - ], - "0x43243797": [ - "fundsOf(address)" - ], - "0xca708230": [ - "funnel()" - ], - "0xfc108f70": [ - "GamblerPerAddress(address)" - ], - "0xefa7e56b": [ - "GameEnds()" - ], - "0x2143da91": [ - "GameOfThrones()" - ], - "0xa10edc55": [ - "GeneralPurposeProfitSplitter()" - ], - "0x4d70d1d7": [ - "generateId(uint256)" - ], - "0x6f6c0244": [ - "generateShortLink()" - ], - "0x419db07b": [ - "generousFee()" - ], - "0xfa7d68f1": [ - "getAccountInfo(uint256,uint256)" - ], - "0x10082bff": [ - "getActorBillXdetail(address,uint256,bool)" - ], - "0x04fc11d5": [ - "getActual()" - ], - "0x21f8a721": [ - "getAddress(bytes32)" - ], - "0x6795dbcd": [ - "getAddress(bytes32,string)" - ], - "0x42c69566": [ - "get_address(address,string)" - ], - "0xe7b48f74": [ - "get(int256,address)" - ], - "0x579cdf17": [ - "getAdminName(address)" - ], - "0xc8edf65e": [ - "GetAndReduceFeesByFraction(uint256)" - ], - "0xc6ed8e1b": [ - "getApprovedProxys()" - ], - "0xf9cc0605": [ - "getAvailable()" - ], - "0x12065fe0": [ - "getBalance()" - ], - "0x1177892f": [ - "getBalanceByAdress(address)" - ], - "0x565a2e2c": [ - "getBeneficiary()" - ], - "0xa6afd5fd": [ - "getBets()" - ], - "0x061e494f": [ - "getBet(uint256)" - ], - "0x8c98117c": [ - "getBill(uint256,uint256)" - ], - "0xe422ebe9": [ - "getBot()" - ], - "0x618fa9ce": [ - "getBotBillingIndex(uint256,uint256)" - ], - "0x4ae9af61": [ - "getBotStats(uint256,uint256)" - ], - "0x5f70d9ac": [ - "getBot(uint256)" - ], - "0xc06c4474": [ - "get_burned(bytes32)" - ], - "0xc00ca383": [ - "getByOwner(address,uint256)" - ], - "0x8eaa6ac0": [ - "get(bytes32)" - ], - "0xd120a284": [ - "getBytesFromNumbers(uint8[3])" - ], - "0x1f6e5117": [ - "getCallbackAddress()" - ], - "0x769dc523": [ - "GetCategoryNumber(bytes4)" - ], - "0x7281854d": [ - "GetCategoryValue(uint8)" - ], - "0xc88cc6ac": [ - "getCertification(address)" - ], - "0x777feff5": [ - "getCertificationDbAtIndex(uint256)" - ], - "0x808ab1d6": [ - "getCertificationDbCount()" - ], - "0xfd260dfc": [ - "getCertificationDbStatus(address)" - ], - "0xde629235": [ - "getCertificationDocumentAtIndex(address,uint256)" - ], - "0xd5582205": [ - "getCertifiedStudentAtIndex(uint256)" - ], - "0x038461ea": [ - "getCertifiedStudentsCount()" - ], - "0x2f695053": [ - "getCertifierAtIndex(uint256)" - ], - "0x56d73ad1": [ - "getCertifierDb()" - ], - "0x6e63015c": [ - "getCertifiersCount()" - ], - "0x05b765ea": [ - "getCertifierStatus(address)" - ], - "0x045236b4": [ - "getChainyData(string)" - ], - "0x919edc7c": [ - "getChainySender(string)" - ], - "0xe8b13c44": [ - "getChainyTimestamp(string)" - ], - "0x233120aa": [ - "getChainyURL()" - ], - "0xd7130651": [ - "getCity(uint256)" - ], - "0xd0068f80": [ - "getClient(uint256)" - ], - "0x3aa94b1d": [ - "getCoinStats(uint256)" - ], - "0xda311588": [ - "getCoin(uint256)" - ], - "0xe65d6b49": [ - "getCommission()" - ], - "0x69bcdb7d": [ - "getCommitment(uint256)" - ], - "0xf896503a": [ - "getConfigAddress(bytes32)" - ], - "0xea3ebae6": [ - "getConfigBool(bytes32)" - ], - "0x62c7855b": [ - "getConfigBytes(bytes32)" - ], - "0xb44bd51d": [ - "getConfig(string)" - ], - "0x5c1b3ca1": [ - "getConfigUint(int256,bytes32)" - ], - "0xd408746a": [ - "GetContractAddr()" - ], - "0xd3edcb5b": [ - "getCreditorAddresses()" - ], - "0x81064e2d": [ - "getCreditorAmounts()" - ], - "0x77c78df9": [ - "getCurrentLevel()" - ], - "0x2bf4e53d": [ - "getCurrentShareholders()" - ], - "0x329bfc33": [ - "getCurrentWinner()" - ], - "0x152cf9db": [ - "getDataPoint(int256,uint256,uint256)" - ], - "0xcf69df28": [ - "getDataRequestLength()" - ], - "0x88f53db1": [ - "getDataRequest(uint256)" - ], - "0xd2b0d554": [ - "getDisclaimer()" - ], - "0x80ede329": [ - "getDocumentDetails(uint256)" - ], - "0x16e55626": [ - "getDogName(address)" - ], - "0x1a7a98e2": [ - "getDomain(uint256)" - ], - "0xbe6307c8": [ - "getDraw(uint256)" - ], - "0x2fa7cbfb": [ - "getExecCost(uint256)" - ], - "0x752bacce": [ - "getExecPrice()" - ], - "0xba1162d7": [ - "getFmLength()" - ], - "0xd63547e6": [ - "GetFreeCnt()" - ], - "0x4a7e049e": [ - "getFullCompany(address,uint256)" - ], - "0x3e853128": [ - "getGasForXau(address)" - ], - "0x455259cb": [ - "getGasPrice()" - ], - "0x75608264": [ - "get_hash(uint8,bytes32)" - ], - "0xbba91ea7": [ - "getHomeadvIndex(uint256)" - ], - "0x24fc65ed": [ - "getId(uint256,uint256)" - ], - "0xb7de47d3": [ - "getIndex(uint256,uint256)" - ], - "0x2b98222e": [ - "getInstitutionByAddress(address)" - ], - "0x6da1833c": [ - "getInstitutionByName(string)" - ], - "0x728af7ec": [ - "getInterest(uint256,uint256)" - ], - "0x0a80ef45": [ - "getIsClosed()" - ], - "0x0ed21029": [ - "getIssueAssignee(uint256,bytes32)" - ], - "0x706dfe54": [ - "getIssueState(uint256,bytes32)" - ], - "0xc5bf339c": [ - "getLastNonPublished()" - ], - "0x65fa2f7f": [ - "getLastPrice(uint256)" - ], - "0x89f4ed7a": [ - "getLastTag(uint256)" - ], - "0x29a065bd": [ - "getLOg(uint256)" - ], - "0xe0e3ba5a": [ - "getLosesShare(address)" - ], - "0x550ed1f0": [ - "getMaxBetAmount()" - ], - "0x82a5285d": [ - "getMinBetAmount()" - ], - "0x5af73f3f": [ - "getMinimalBalance(uint256,address)" - ], - "0x90daaf67": [ - "getMinimalDeposit()" - ], - "0xf909d60d": [ - "getMinimumGasLimit()" - ], - "0x724ae9d0": [ - "getMinInvestment()" - ], - "0xa538d287": [ - "getMinMax()" - ], - "0x686e8aaa": [ - "GetMoney()" - ], - "0x3cc86b80": [ - "GetMoney(uint256,address)" - ], - "0x50ab6f7f": [ - "getMsgs()" - ], - "0xc1d4f708": [ - "getMwLength()" - ], - "0xcfb3a493": [ - "getMyBounty(uint256)" - ], - "0xb484e532": [ - "getMyMsg()" - ], - "0xc003b082": [ - "getMyPlayerID()" - ], - "0x36ffa905": [ - "getMyProposals()" - ], - "0x0645b5d5": [ - "getMyShareholderID()" - ], - "0x3e83fe36": [ - "getMyShares()" - ], - "0xea1bf386": [ - "getNextSellerBOTdata(uint256)" - ], - "0x2ade6c36": [ - "getNodeAddress(bytes32)" - ], - "0xbbe4fd50": [ - "getNow()" - ], - "0x1c895915": [ - "getNumberOfPayments(uint256)" - ], - "0x5819dde2": [ - "getNumbersFromBytes(bytes3)" - ], - "0x017972af": [ - "getNumbersFromHash(bytes32)" - ], - "0x06638e92": [ - "GetNumbersFromHash(bytes32)" - ], - "0x57ee24af": [ - "getNum(bytes32,uint256)" - ], - "0xb39a64cd": [ - "getNumCalled()" - ], - "0x52200a13": [ - "getNumHolders(uint256)" - ], - "0x72ea4b8c": [ - "getNumInvestors()" - ], - "0xa8893a6e": [ - "getNumOfSalesWithSameId(bytes16)" - ], - "0x531c1b33": [ - "getOperatingBudget()" - ], - "0x09574810": [ - "getOperationsNumber()" - ], - "0x202e3924": [ - "getOperation(uint256)" - ], - "0xfaa1a8ff": [ - "getOwnedBot(address,uint256)" - ], - "0x0ae50a39": [ - "GetOwner()" - ], - "0xe74ffbd5": [ - "getPart(bytes32,uint256)" - ], - "0xd085e66e": [ - "GetPart(bytes32,uint256)" - ], - "0xe42d5be0": [ - "getPaymentOf(address)" - ], - "0x5a825cbb": [ - "getPayment(uint256,uint256)" - ], - "0xe56556a9": [ - "getPlayerID(address)" - ], - "0x953aa435": [ - "GetPrice(uint8)" - ], - "0x116c6eab": [ - "getProfitShare(address)" - ], - "0x7486a8e3": [ - "get_publisher(bytes32)" - ], - "0x6a28db13": [ - "getQrLength()" - ], - "0x163aba3c": [ - "getQueryFee()" - ], - "0xf1b3f968": [ - "getRaceEndBlock()" - ], - "0xcd4b6914": [ - "getRandom(uint256)" - ], - "0x7bcd7fad": [ - "getRecordAtIndex(uint256)" - ], - "0xb719d1d0": [ - "getRegInfo(address)" - ], - "0x052b2aa7": [ - "getRegistrants()" - ], - "0xadd4c784": [ - "getResult(bytes32)" - ], - "0x7332b520": [ - "getRewardsCount(uint256)" - ], - "0x85dd2148": [ - "getSaleDate(bytes16)" - ], - "0xac92fdb5": [ - "getSaleDate(bytes16,uint256)" - ], - "0xd239ea8b": [ - "getSchemasLenght()" - ], - "0x288c6ed2": [ - "getSeedCost(uint256)" - ], - "0x9183fd01": [ - "getSeedPrice()" - ], - "0x347632e8": [ - "getShareholderAdressByID(uint256)" - ], - "0x308d6613": [ - "getSignData(uint256,uint8)" - ], - "0xb36a0b15": [ - "getSignDetails(uint256,uint8)" - ], - "0x28dcfdac": [ - "getSignsCount(uint256)" - ], - "0x842bc37b": [ - "GetSmallCotractIndex(address)" - ], - "0xafa293d4": [ - "getSource()" - ], - "0xe9e7a667": [ - "get_stake(bytes32)" - ], - "0x22b0f6ee": [ - "getStatusOfPayout(uint256)" - ], - "0x9a0af2ec": [ - "getStLength()" - ], - "0x693ec85e": [ - "get(string)" - ], - "0x4a0d89ba": [ - "getSwap(uint256)" - ], - "0x7ac26aeb": [ - "getTag(string,uint256)" - ], - "0xdf300b46": [ - "getThing(bytes32[])" - ], - "0x55b62dcf": [ - "getThresold(uint256)" - ], - "0x002a5cc9": [ - "getTicketHolders(uint256)" - ], - "0x9f0e3107": [ - "get_timestamp(bytes32)" - ], - "0x82b2e257": [ - "getTokenBalance()" - ], - "0xacab021c": [ - "getTOS(address)" - ], - "0x12b58349": [ - "getTotalBalance()" - ], - "0xc4e41b22": [ - "getTotalSupply()" - ], - "0xcaa648b4": [ - "getTotalValue()" - ], - "0xf709dd51": [ - "getTrademark()" - ], - "0x9bb0e4df": [ - "getUint(int256,bytes32,string)" - ], - "0x74e4435f": [ - "getUserAddress(uint256,bytes32)" - ], - "0xa2bb5d48": [ - "get_username(address)" - ], - "0x6de00927": [ - "GetUserRank(uint8,address)" - ], - "0xff981099": [ - "getVotes(uint256)" - ], - "0xffb1a6cb": [ - "getWins(address)" - ], - "0x4ae8c55f": [ - "getWwLength()" - ], - "0xfb9a4595": [ - "GitHubBounty()" - ], - "0x0b7373d6": [ - "giveAllBack()" - ], - "0x04706fdf": [ - "giveContributionsBackProfitBugged()" - ], - "0xb5299ca6": [ - "giveMeat()" - ], - "0x9e7b8d61": [ - "giveRightToVote(address)" - ], - "0x35ae41c9": [ - "godAutomaticCollectFee()" - ], - "0x691bfc89": [ - "goods(uint16,uint256)" - ], - "0x7c25f260": [ - "Government()" - ], - "0xbb6a0853": [ - "GreedPit()" - ], - "0x92ba4ba6": [ - "GridMember(string,uint256,bool,address,address)" - ], - "0x3cc7790a": [ - "GSI()" - ], - "0xa1c95ac2": [ - "GSIToken(uint256,string,uint8,string,address)" - ], - "0x75f96ead": [ - "Guess(uint256)" - ], - "0xdf143fb7": [ - "HackerGold(address)" - ], - "0x5ed7ca5b": [ - "halt()" - ], - "0x4f28af6a": [ - "handleBet(uint256)" - ], - "0xcb96012e": [ - "hashTo256(bytes32)" - ], - "0x650955d4": [ - "HashToken()" - ], - "0xa1add510": [ - "hasRelation(bytes32,bytes32,address)" - ], - "0x06f36cc9": [ - "helpBlue()" - ], - "0x353928d8": [ - "helpRed()" - ], - "0xce373b95": [ - "heroOfThePit()" - ], - "0xaeeb96af": [ - "Highlander()" - ], - "0x7eb69ba1": [ - "hint(int256,bytes32,string,bytes20)" - ], - "0xc98031be": [ - "hintURL(int256,bytes32,string)" - ], - "0xef4ffee2": [ - "Honestgamble()" - ], - "0xa6027d53": [ - "IconomiTokenTest(uint256,string,uint8,string,uint256)" - ], - "0xb98fdc36": [ - "IconomiToken(uint256,string,uint8,string,uint256)" - ], - "0xdaf22f4d": [ - "identify(bytes32)" - ], - "0xaf640d0f": [ - "id()" - ], - "0xf7c3ee7a": [ - "immortality()" - ], - "0x602acca1": [ - "InchainICO(address[],uint256)" - ], - "0xa4beffa7": [ - "increaseInvestment()" - ], - "0xcab5c0f1": [ - "_incrementState()" - ], - "0x1e8c72b4": [ - "incrUserAvailBal(address,uint256,bool)" - ], - "0x3d5db1c2": [ - "incrUserOnholdBal(address,uint256,bool)" - ], - "0x22686250": [ - "index(int256,uint256)" - ], - "0x1f13de92": [ - "inEther(uint256)" - ], - "0x9334ab61": [ - "Infos()" - ], - "0x4a1f0bf6": [ - "inheritToNextGeneration(address)" - ], - "0x2cc0b254": [ - "init(address,bytes32)" - ], - "0x87ebd76c": [ - "initContract(string,string,uint256,uint256)" - ], - "0x23584a21": [ - "initStats(string,address,uint256)" - ], - "0x98eaca94": [ - "inKissBTC(uint256)" - ], - "0xa0469b02": [ - "inputToDigit(uint256)" - ], - "0xfeaa29d8": [ - "insertProfitHere()" - ], - "0x46af23f5": [ - "InstantLottery(address,address,bool,address)" - ], - "0xf83d96c1": [ - "InsuranceAgent()" - ], - "0x8cecf66e": [ - "_inverse(uint256)" - ], - "0xadfe6b80": [ - "InvestAdd()" - ], - "0x391f2e96": [ - "InvestCancel()" - ], - "0x4f013184": [ - "investInTheSystem()" - ], - "0xc4321adb": [ - "investInTheSystem(uint256)" - ], - "0x2afb21bc": [ - "InvestWithdraw()" - ], - "0x76285b5b": [ - "_is360thDay()" - ], - "0x74eb9b68": [ - "isAccountLocked(address)" - ], - "0x1cf52f2b": [ - "isActiveRegistrant(address)" - ], - "0x24d7806c": [ - "isAdmin(address)" - ], - "0xfc1f7652": [ - "_isBoardMember(address)" - ], - "0xda7d0082": [ - "isCertification(address,bytes32)" - ], - "0x5afa5036": [ - "isCertified(address)" - ], - "0x1c2353e1": [ - "isCertifier(address)" - ], - "0x37b0574a": [ - "isClassic()" - ], - "0xc2b6b58c": [ - "isClosed()" - ], - "0x57eaeddf": [ - "_isContract()" - ], - "0x2f553d31": [ - "isCreated(bytes32)" - ], - "0x5445e38c": [ - "_isCycleValid(uint256)" - ], - "0x88eb7af7": [ - "_isHuman()" - ], - "0xaa51793c": [ - "isLosingBet(uint256)" - ], - "0x42f6e389": [ - "isModule(address)" - ], - "0x6534b4e2": [ - "IsPayoutReady__InfoFunction(bytes32)" - ], - "0x245a6f74": [ - "isProxyLegit(address)" - ], - "0x3e5cee05": [ - "issueIOU(string,uint256,address)" - ], - "0x05d87fe2": [ - "issueLetterOfCredit(uint256,uint256,uint256)" - ], - "0x40fdf515": [ - "issuetender(address,uint256,uint256)" - ], - "0x475a9fa9": [ - "issueTokens(address,uint256)" - ], - "0x4adcbd19": [ - "isThisHardforkedVersion()" - ], - "0xaf5610dd": [ - "isThisPreforkVersion()" - ], - "0x7c4c27c8": [ - "isThisPuritanicalVersion()" - ], - "0x4209fff1": [ - "isUser(address)" - ], - "0x04d10f1c": [ - "isValidChainyJson(string)" - ], - "0x6662e4be": [ - "isWinningBet(uint256)" - ], - "0x99aeade3": [ - "iterateTable(uint256,uint256)" - ], - "0x3b46a7df": [ - "ivote(bool)" - ], - "0x0138e31b": [ - "_jAdd(uint256,uint256,uint256,uint256)" - ], - "0xed64bea4": [ - "JamCoin()" - ], - "0x5f972df8": [ - "_jDiv(uint256,uint256,uint256,uint256)" - ], - "0x9743dfc1": [ - "jesterAutomaticCollectFee()" - ], - "0x5b764811": [ - "_jMul(uint256,uint256,uint256,uint256)" - ], - "0x4a7b26ec": [ - "join_game(uint256)" - ], - "0x1ecfe64d": [ - "_jSub(uint256,uint256,uint256,uint256)" - ], - "0x691fb8ea": [ - "jumpIn()" - ], - "0xc53ad76f": [ - "Kardashian()" - ], - "0x775dec49": [ - "keccak()" - ], - "0xbe26733c": [ - "Kill()" - ], - "0x73abecbb": [ - "kill1()" - ], - "0x2bb685bc": [ - "kill2()" - ], - "0x179b73da": [ - "killBoardProposal(uint256,address)" - ], - "0xb0c7f709": [ - "kingAutomaticCollectFee()" - ], - "0x7e81b6aa": [ - "KingdomFactory()" - ], - "0x5e68ac2c": [ - "Kingdom(string,address,address,address,uint256,uint256,uint256,uint256,uint256)" - ], - "0x31ae0019": [ - "KissBTC()" - ], - "0x07e00bcb": [ - "kissBTCCallback(uint256,uint256)" - ], - "0x47799da8": [ - "last()" - ], - "0x7075b1d8": [ - "latestMonarchInternal()" - ], - "0xfa6d373c": [ - "LeaderHash()" - ], - "0x9fb25d9e": [ - "LeaderMessage()" - ], - "0x166c4b85": [ - "len(bytes32)" - ], - "0xd95a2d42": [ - "lendGovernmentMoney(address)" - ], - "0x56d88e27": [ - "len()" - ], - "0xfe71aec5": [ - "LittleCactus()" - ], - "0x7b647652": [ - "LittleEthereumDoubler()" - ], - "0xf83d08ba": [ - "lock()" - ], - "0xe8d1e961": [ - "lockAccount(uint256)" - ], - "0x3a7d280c": [ - "login(string)" - ], - "0x4cbee813": [ - "logout(string)" - ], - "0x41304fac": [ - "log(string)" - ], - "0x71e2d919": [ - "lol()" - ], - "0x3fd1f232": [ - "LookAtAllTheseTastyFees()" - ], - "0xf7bd2361": [ - "LookAtBalance()" - ], - "0x25d4bdeb": [ - "LookAtCollectedFees()" - ], - "0x7ee65635": [ - "LookAtDepositsToPlay()" - ], - "0xb0ecca8f": [ - "LookAtLastTimePerZone(uint256)" - ], - "0xb1c6517a": [ - "LookAtNumberOfPlayers()" - ], - "0xdfca2f53": [ - "LookAtPrizes()" - ], - "0xa9fbc614": [ - "lookupTicketHolder(uint256)" - ], - "0xba13a572": [ - "lottery()" - ], - "0x21bb79fe": [ - "luckyDogInfo()" - ], - "0xb74bc710": [ - "LuckyDoubler()" - ], - "0x5a2ee019": [ - "m()" - ], - "0x8af49ab7": [ - "maintain(uint256,uint256)" - ], - "0x561e91a1": [ - "makeBet()" - ], - "0x1077f06c": [ - "makeClaim(uint256)" - ], - "0x059a500c": [ - "makeDeposit(uint256)" - ], - "0x3df16377": [ - "make_move_and_claim_victory(uint256,uint8,uint8,uint8,uint8,uint8,uint8,uint8)" - ], - "0xa35cfa22": [ - "make_move(uint256,uint8,uint8,uint8,uint8)" - ], - "0x2f1e4968": [ - "makeNewProposal(string,uint256)" - ], - "0x8b543b80": [ - "maximumCredit(address)" - ], - "0x11fe773d": [ - "memcpy(uint256,uint256,uint256)" - ], - "0x62be3172": [ - "Message(address,address,address,string)" - ], - "0x0257c48c": [ - "meta(bytes32,bytes32)" - ], - "0x7958533a": [ - "meta(uint256,bytes32)" - ], - "0x8f8bde82": [ - "MicroDAO()" - ], - "0x1e701780": [ - "MICRODAO(address,uint256,uint256,uint256,address)" - ], - "0x026993e0": [ - "Midas(address,address)" - ], - "0xfa968eea": [ - "minBetAmount()" - ], - "0xd10e99fe": [ - "mint(int256,bytes32)" - ], - "0x3a7fb796": [ - "mintGreen(int256,address,uint256)" - ], - "0x77ceded8": [ - "mintGrey(int256,address,uint256)" - ], - "0xf41bfa9e": [ - "mint(int256,uint256,string)" - ], - "0x411c4e72": [ - "ModifyFeeFraction(uint256)" - ], - "0xa20c404f": [ - "ModifySettings(uint256,uint256,uint256,uint256,uint256,uint256,uint256)" - ], - "0x689b3e2d": [ - "Moonraker(address,address)" - ], - "0x5837e083": [ - "move_history(uint256)" - ], - "0xd8a8e03a": [ - "move(uint256,address)" - ], - "0x231944e2": [ - "moveUnits(uint256,uint256,uint256[])" - ], - "0x33f472b9": [ - "MPO()" - ], - "0xf714de9c": [ - "MultiAccess()" - ], - "0x4f60f334": [ - "multiAccessAddOwner(address)" - ], - "0x092a2e37": [ - "multiAccessAddOwnerD(address,address)" - ], - "0x69a5e902": [ - "multiAccessCall(address,uint256,bytes)" - ], - "0x8b9726c1": [ - "multiAccessCallD(address,uint256,bytes,address)" - ], - "0x9bd99195": [ - "multiAccessChangeOwner(address,address)" - ], - "0x6c494843": [ - "multiAccessChangeOwnerD(address,address,address)" - ], - "0x6d522b19": [ - "multiAccessChangeRequirementD(uint256,address)" - ], - "0x62891b5d": [ - "multiAccessChangeRequirement(uint256)" - ], - "0x446294ad": [ - "multiAccessGetOwners()" - ], - "0xeb7402f5": [ - "multiAccessHasConfirmed(bytes32,address)" - ], - "0xe419f189": [ - "multiAccessIsOwner(address)" - ], - "0x73f310df": [ - "multiAccessRemoveOwner(address)" - ], - "0x5a74dee5": [ - "multiAccessRemoveOwnerD(address,address)" - ], - "0x7ed19af9": [ - "multiAccessRevoke(bytes32)" - ], - "0xd1b4ff7e": [ - "multiAccessRevokeD(bytes32,address)" - ], - "0xd1cf113e": [ - "multiAccessSetRecipient(address)" - ], - "0x7429f1eb": [ - "multiAccessSetRecipientD(address,address)" - ], - "0x30677b83": [ - "multiplierFactor()" - ], - "0x9d7d6667": [ - "multipliers()" - ], - "0xfbeaebc6": [ - "murder()" - ], - "0x98391c94": [ - "muteMe(bool)" - ], - "0x0bd089ab": [ - "MyAdvancedToken(uint256,string,uint8,string,address)" - ], - "0xc95e81cb": [ - "MyBet(uint8,address)" - ], - "0x6e658fbe": [ - "myFundsExpireIn(uint256)" - ], - "0x089327de": [ - "MyToken()" - ], - "0x041d0c0b": [ - "MyTokenLoad(uint256,string,uint8,string,address)" - ], - "0x1d2bca17": [ - "MyToken(uint256,string,uint8,string)" - ], - "0x2e52d606": [ - "n()" - ], - "0x19350aea": [ - "nameFor(address)" - ], - "0x3bcf7d22": [ - "newBribedCitizen(address)" - ], - "0xba487e62": [ - "newCampaign(uint32,uint96,uint16,uint16)" - ], - "0x927ed13a": [ - "newClient(uint256,address)" - ], - "0x1df473bc": [ - "newContract(bytes)" - ], - "0xf3dd3d8a": [ - "newCurrency(string,string,uint8)" - ], - "0x78ae88d1": [ - "newDeal(uint256,uint256,uint256,uint256,uint256)" - ], - "0x7c69b5d1": [ - "NewDeposit(uint256)" - ], - "0xc853c03d": [ - "newDraw(uint256,uint8[3],uint256,uint256,uint256,uint256)" - ], - "0xdcff5581": [ - "NewFeeAddress(address)" - ], - "0x66ad484c": [ - "newfirst_player(address)" - ], - "0x7d03f5f3": [ - "newGame()" - ], - "0xd9e7ee1c": [ - "new_game(uint256,uint256)" - ], - "0x1d71a1cd": [ - "newIncome(string)" - ], - "0xfb099c84": [ - "newInvestor()" - ], - "0x4316abbb": [ - "newJester(address)" - ], - "0x9a8f09bd": [ - "newKing(address)" - ], - "0x9229c504": [ - "new_mainPlayer(address)" - ], - "0x2fac1a54": [ - "newOrder(bool,uint256,uint256,uint256,uint256)" - ], - "0x85952454": [ - "newOwner(address)" - ], - "0x3baf4e1e": [ - "newPayment(uint256,uint256)" - ], - "0x71589d6b": [ - "newponzi()" - ], - "0x4f24186a": [ - "newProposal(string)" - ], - "0xa07daa65": [ - "newRequest(uint256)" - ], - "0x025bbbe5": [ - "newSale(bytes16,uint256,uint256)" - ], - "0x97bb2a63": [ - "newvow(uint256,address)" - ], - "0xf28386bf": [ - "Nexium()" - ], - "0xab73e316": [ - "next(address)" - ], - "0x727b1cd6": [ - "next_draw(bytes32,uint256,uint256,uint256,uint256,uint256)" - ], - "0x332f93a9": [ - "nextPayoutGoal()" - ], - "0x47e40553": [ - "nextRound()" - ], - "0xd1bf9aba": [ - "nextRune()" - ], - "0xb3cb8885": [ - "nextUnderdogPayout()" - ], - "0xb3a2a999": [ - "nextWithdrawal(bytes16)" - ], - "0xa668d7c9": [ - "NiceGuyPonzi()" - ], - "0x0908178f": [ - "NoFeePonzi()" - ], - "0xac20902e": [ - "NormalizeMoney()" - ], - "0x305075db": [ - "NormalizeRanks()" - ], - "0xecb4136e": [ - "NotAnotherPonzi()" - ], - "0x58d3b617": [ - "Notifier(string)" - ], - "0xfa4e5e5a": [ - "notify(uint8,string,string)" - ], - "0xdea06188": [ - "NumberOfBlockAlreadyMined()" - ], - "0x892c0214": [ - "NumberOfCurrentBlockMiners()" - ], - "0x85233869": [ - "NumberOfMiners()" - ], - "0xdf811d7d": [ - "numberOfPlayersInCurrentRound()" - ], - "0xdf06f906": [ - "numBets()" - ], - "0xca35271c": [ - "numDebtors(address)" - ], - "0x902e64e5": [ - "Oath()" - ], - "0xa1920586": [ - "offer(uint256,uint256)" - ], - "0x901717d1": [ - "one()" - ], - "0xe671f510": [ - "onEtherandomExec(bytes32,bytes32,uint256)" - ], - "0x041fe13d": [ - "onEtherandomSeed(bytes32,bytes32)" - ], - "0xa5eb7a4e": [ - "operated()" - ], - "0x9549355e": [ - "oracalizeReading(uint256)" - ], - "0x9a828a71": [ - "oracalizeReading(uint256,string)" - ], - "0x053c351b": [ - "oraclize_getPrice(string)" - ], - "0xabe9f569": [ - "oraclize_getPrice(string,uint256)" - ], - "0xc8e55708": [ - "oraclize_query(string,string[1])" - ], - "0x871113c3": [ - "oraclize_query(string,string[1],uint256)" - ], - "0x044d0b06": [ - "oraclize_query(string,string[2])" - ], - "0xa6bf3df0": [ - "oraclize_query(string,string[2],uint256)" - ], - "0x9b9ba572": [ - "oraclize_query(string,string[3])" - ], - "0xae404996": [ - "oraclize_query(string,string[3],uint256)" - ], - "0x16d9356f": [ - "oraclize_query(string,string[4])" - ], - "0xbc5ff5e1": [ - "oraclize_query(string,string[4],uint256)" - ], - "0xbd9a5673": [ - "oraclize_query(string,string[5])" - ], - "0xb6ce5581": [ - "oraclize_query(string,string[5],uint256)" - ], - "0x14167bf0": [ - "oraclize_query(string,string[])" - ], - "0xe50a3bb1": [ - "oraclize_query(string,string[],uint256)" - ], - "0x0ff4f160": [ - "oraclize_query(uint256,string,string[1])" - ], - "0x77ac3da5": [ - "oraclize_query(uint256,string,string[1],uint256)" - ], - "0xa8c3ec48": [ - "oraclize_query(uint256,string,string[2])" - ], - "0x29a6f31b": [ - "oraclize_query(uint256,string,string[2],uint256)" - ], - "0xec6afc22": [ - "oraclize_query(uint256,string,string[3])" - ], - "0xfb114f57": [ - "oraclize_query(uint256,string,string[3],uint256)" - ], - "0x2ff92323": [ - "oraclize_query(uint256,string,string[4])" - ], - "0x0494630f": [ - "oraclize_query(uint256,string,string[4],uint256)" - ], - "0x6510ef4d": [ - "oraclize_query(uint256,string,string[5])" - ], - "0x00a94b6e": [ - "oraclize_query(uint256,string,string[5],uint256)" - ], - "0xdc206e5f": [ - "oraclize_query(uint256,string,string[])" - ], - "0xa2b5591c": [ - "oraclize_query(uint256,string,string[],uint256)" - ], - "0x83a51ad0": [ - "oraclize_setConfig(bytes32)" - ], - "0x01095962": [ - "oraclize_setCustomGasPrice(uint256)" - ], - "0x6b1cb549": [ - "orderMatch(uint256,uint256,uint256,int256,uint256,uint256,address,uint8,bytes32,bytes32,int256)" - ], - "0xbd858288": [ - "orderMatch(uint256,uint256,int256,uint256,uint256,address,uint8,bytes32,bytes32,int256)" - ], - "0x17961d0f": [ - "ord()" - ], - "0x16bac350": [ - "overthrow(string)" - ], - "0xe2894a8a": [ - "OwnerAnnounce(string)" - ], - "0x4f44728d": [ - "ownerChangeOwner(address)" - ], - "0xad04592e": [ - "owner_deposit()" - ], - "0xd6e0bf29": [ - "OwnerDeposit()" - ], - "0xd263b7eb": [ - "ownerkill()" - ], - "0x6eacd48a": [ - "ownerPauseGame(bool)" - ], - "0x4b7fcee7": [ - "ownerPausePayouts(bool)" - ], - "0xcf832ce2": [ - "ownerRefundPlayer(bytes32,address,uint256,uint256)" - ], - "0xa27c672a": [ - "owner_reveal_and_commit(uint8,bytes32,bytes32)" - ], - "0x392327b5": [ - "owner_set_fraction(uint256)" - ], - "0x268d50fe": [ - "ownerSetHouseEdge(uint256)" - ], - "0x5e968a49": [ - "ownerSetMaxProfitAsPercentOfHouse(uint256)" - ], - "0x6cdf4c90": [ - "ownerSetMinBet(uint256)" - ], - "0xd207e757": [ - "ownerSetOraclizeSafeGas(uint32)" - ], - "0x8b64d70e": [ - "owner_set_time_limit(uint256)" - ], - "0x31375242": [ - "ownerSetTreasury(address)" - ], - "0xf738e5ca": [ - "ownerTakeProfit()" - ], - "0x758971e8": [ - "ownerTakeProfit(bool)" - ], - "0x7ac37d58": [ - "ownerTransferEther(address,uint256)" - ], - "0x150ad2a8": [ - "owner_transfer_ownership(address)" - ], - "0x26da8e17": [ - "ownerUpdateCostToCallOraclize(uint256)" - ], - "0xb33926cb": [ - "owner_withdraw(uint256)" - ], - "0xf7bc39bf": [ - "owns(address)" - ], - "0x88c3ba85": [ - "ParallelGambling()" - ], - "0xf65c4d42": [ - "Participate(uint256)" - ], - "0x1b9265b8": [ - "pay()" - ], - "0x18b749c4": [ - "payEther(uint256)" - ], - "0x4d268ddd": [ - "payImporterBankForGoodsBought()" - ], - "0xff08d2b0": [ - "PayMiners()" - ], - "0x85db2dda": [ - "PayoutQueueSize()" - ], - "0xe0fe075e": [ - "payoutReady()" - ], - "0x081e806d": [ - "PayOut(uint256)" - ], - "0xb2310cc5": [ - "payRequstedSum(uint256,uint256)" - ], - "0xb821f815": [ - "pay_winner(uint256)" - ], - "0xabf74a93": [ - "pitFee()" - ], - "0x43046844": [ - "placeBet(uint8)" - ], - "0xa4406bcd": [ - "placeSellOrder(uint256,uint256)" - ], - "0xb1cc4348": [ - "placeWager()" - ], - "0x71b6663e": [ - "play1(address,uint256)" - ], - "0x2ddbc04a": [ - "play2(address,uint256)" - ], - "0xdb18c972": [ - "play4(address,uint256)" - ], - "0xf0e10c0d": [ - "play(address,uint256)" - ], - "0xc7a1865b": [ - "play(bytes32)" - ], - "0x3e4c0c82": [ - "player_1(uint256)" - ], - "0x1ef0625b": [ - "player_2(uint256)" - ], - "0xc068eae0": [ - "player_collect_winnings(uint256)" - ], - "0xa4fde8bc": [ - "player_declare_taking_too_long()" - ], - "0x3c314a91": [ - "playerGetPendingTxByAddress(address)" - ], - "0x46b04e53": [ - "PlayerInfoPerZone(uint256,uint256)" - ], - "0x63aea3e0": [ - "PlayerInfo(uint256)" - ], - "0xeace4827": [ - "player_make_bet(uint8)" - ], - "0xdc6dd152": [ - "playerRollDice(uint256)" - ], - "0x24fb563f": [ - "PlayerTickets(address,uint256,uint256)" - ], - "0xa5f4af33": [ - "playerWithdrawPendingTransactions()" - ], - "0x39b333d9": [ - "Play(uint8,uint8,uint8,uint8)" - ], - "0x4c0eceb5": [ - "plusOnePonzi()" - ], - "0xe6cbcba9": [ - "PlusOnePonzi()" - ], - "0xd1f0bb2d": [ - "populateAllowedFreeExchanges()" - ], - "0x3570c2ee": [ - "PosRewards()" - ], - "0xb45105b2": [ - "post(string,address,string)" - ], - "0xc6a17d2b": [ - "pow10(uint256,uint8)" - ], - "0x2c02d622": [ - "precalculate()" - ], - "0x13bd4e2c": [ - "_prepareAndSendReward()" - ], - "0xf81d087d": [ - "prepareLottery()" - ], - "0xe6c1beb4": [ - "prepend(address)" - ], - "0xf8018a79": [ - "prepend(address,address)" - ], - "0x6bae05cf": [ - "preRegister(address)" - ], - "0x45788ce2": [ - "prev(address)" - ], - "0xa035b1fe": [ - "price()" - ], - "0x1288c42a": [ - "Prism()" - ], - "0x22dc36e2": [ - "processed(uint64)" - ], - "0x61aa8d93": [ - "processFee()" - ], - "0x5c52e51e": [ - "processPayout()" - ], - "0x80acaafb": [ - "profitDistribution()" - ], - "0xe1f5ebc5": [ - "_projectAddNew(address,uint256)" - ], - "0x6a3c1198": [ - "_projectCancelNew()" - ], - "0xa055fe64": [ - "_projectCommitNew(address)" - ], - "0x87914c6f": [ - "prolongateContract()" - ], - "0x9801cb8e": [ - "ProofOfExistence()" - ], - "0x4671e65e": [ - "proposeEmergencyWithdrawal(address)" - ], - "0xac4e73f9": [ - "proposeReverse(string,address)" - ], - "0x1fdf6e0c": [ - "protectKingdom()" - ], - "0xa9b8f7b8": [ - "ProtectTheCastle()" - ], - "0x4f09eba7": [ - "proxyApprove(address,uint256,bytes32)" - ], - "0xe82b7cb2": [ - "proxySetCosignerAddress(address,bytes32)" - ], - "0xea98e540": [ - "proxyTransferFromToICAPWithReference(address,bytes32,uint256,string)" - ], - "0xf0cbe059": [ - "proxyTransferFromWithReference(address,address,uint256,bytes32,string)" - ], - "0xc5487661": [ - "proxyTransferToICAPWithReference(bytes32,uint256,string)" - ], - "0x64ef212e": [ - "proxyTransferWithReference(address,uint256,bytes32,string)" - ], - "0xd94073d4": [ - "PT()" - ], - "0x8940aebe": [ - "publicKey(uint256)" - ], - "0x8b2e6dcf": [ - "publish(bytes32)" - ], - "0x57e25a79": [ - "PullPaymentCapable()" - ], - "0x0eb495c2": [ - "pushCity()" - ], - "0x4616caa9": [ - "pushCoin(uint256,address,string)" - ], - "0xacc8cb18": [ - "pushTerm(string)" - ], - "0xafd09bab": [ - "quadrupler()" - ], - "0x4306cc3f": [ - "queryEarnings(address)" - ], - "0x83eed3d5": [ - "queryN(uint256,string,bytes)" - ], - "0xc55c1cb6": [ - "queryN_withGasLimit(uint256,string,bytes,uint256)" - ], - "0xfdd3a879": [ - "quick()" - ], - "0xf28a7912": [ - "quick2()" - ], - "0xe0c7c117": [ - "Randao()" - ], - "0x0b15650b": [ - "randInt(uint256,uint256)" - ], - "0x8e3957d9": [ - "RandomNumber()" - ], - "0x7741b4ec": [ - "RandomNumberFromSeed(uint256)" - ], - "0xb863bd37": [ - "random(uint256)" - ], - "0xeb7cdb56": [ - "rankDown(uint256,uint256)" - ], - "0x74fbbc86": [ - "rate(uint256,uint256,string)" - ], - "0xba344743": [ - "_rawTransfer(address,address,uint256)" - ], - "0x2d2800f1": [ - "react()" - ], - "0xb7213bd4": [ - "readLog(uint256)" - ], - "0x7d7c2a1c": [ - "rebalance()" - ], - "0x248582b0": [ - "receivePaymentForGoodsSoldEarly()" - ], - "0x743e0c9b": [ - "receiveTokens(uint256)" - ], - "0x49d55d9d": [ - "receiveTransfer(uint256)" - ], - "0xc864e760": [ - "recordCommissionEarned(uint256)" - ], - "0xe51ace16": [ - "record(string)" - ], - "0xf06d335e": [ - "_recoverAccount(address,address)" - ], - "0x648bf774": [ - "recover(address,address)" - ], - "0x0cd865ec": [ - "recover(address)" - ], - "0x0ca35682": [ - "recover(uint256)" - ], - "0xf32efd3c": [ - "recoverUser(address,address,uint256,uint8,bytes32,bytes32)" - ], - "0xe20bbd8d": [ - "RecoveryWithTenant()" - ], - "0x0f23cbaa": [ - "recycle()" - ], - "0x578bcc20": [ - "reduceDebt(address,address,uint256)" - ], - "0x538e0759": [ - "refill()" - ], - "0x58b1f29c": [ - "refundBounty(uint256)" - ], - "0x847f8a10": [ - "Refund(uint32)" - ], - "0x5af36e3e": [ - "refund(uint256,uint256)" - ], - "0x66b42dcb": [ - "register(address,string,uint256,string)" - ], - "0xeeda149c": [ - "Register(address)" - ], - "0x4420e486": [ - "register(address)" - ], - "0x8d59cc02": [ - "register(address,string,string)" - ], - "0x8b7f0ddd": [ - "register(address,address,string,string,bytes32[],uint256,string)" - ], - "0x7b1a547c": [ - "registerAs(address,string,uint256,string,address)" - ], - "0x3facd57c": [ - "registerBill(uint256,address,address,uint256,uint256,uint256)" - ], - "0x84c344fe": [ - "_register(bytes4,string)" - ], - "0xb0fd935b": [ - "registerCertificationDb(address)" - ], - "0x4cd995da": [ - "registerCompany(address,string)" - ], - "0x669ee827": [ - "RegisterDevice()" - ], - "0xfe63300a": [ - "registerExternalBill(uint256,address,address,uint256,uint256,uint256)" - ], - "0x68af4971": [ - "registerListening()" - ], - "0x00e7d289": [ - "registerListening(address)" - ], - "0x7f6d8955": [ - "RegisterOne(uint32,address,address)" - ], - "0xf2c298be": [ - "register(string)" - ], - "0x3ffbd47f": [ - "register(string,string)" - ], - "0xaeb4f0d3": [ - "RegisterTwo(address,address)" - ], - "0x8ae986cf": [ - "registrantApprove(address)" - ], - "0xe9fe799e": [ - "registrantRemove(address)" - ], - "0x7db9743b": [ - "Registry()" - ], - "0x6d15f208": [ - "reject(string,uint256,uint16,address,uint256)" - ], - "0xc76a4bfb": [ - "relayReceiveApproval(address,address,uint256,bytes)" - ], - "0xd67cbec9": [ - "release(uint32,uint32,uint32,bytes20)" - ], - "0xa7b2d4cb": [ - "remove(int256,address)" - ], - "0xf3ee6305": [ - "removeCertificationDocument(address,bytes32)" - ], - "0x9c30936f": [ - "removeCertificationDocumentFromSelf(bytes32)" - ], - "0xba4c206e": [ - "removeCertificationDocumentInternal(address,bytes32)" - ], - "0x0066753e": [ - "removeCertifier(address)" - ], - "0xd5df7559": [ - "removeDocument(uint256)" - ], - "0xac18de43": [ - "removeManager(address)" - ], - "0xba7dc45f": [ - "_removeOperation(bytes32)" - ], - "0x2c4cb4be": [ - "removeRegistryFromNameIndex(address)" - ], - "0x669459a7": [ - "removeRegistryFromOwnerIndex(address)" - ], - "0xaf55bba0": [ - "removeRegistryFromTagsIndex(address)" - ], - "0xf25eb5c1": [ - "removeReverse()" - ], - "0x80599e4b": [ - "remove(string)" - ], - "0x7e32a592": [ - "repairTheCastle()" - ], - "0x631de4d6": [ - "replace(address,address)" - ], - "0x9fd4f7d1": [ - "replaceWizard(address)" - ], - "0xce87f626": [ - "replaceWizardRP(address)" - ], - "0xeaa1f9fe": [ - "reqisterListening(address)" - ], - "0x27f06fff": [ - "requestFillUp(uint256)" - ], - "0x2e5d1042": [ - "requestPayout(uint256,uint256,bytes32,uint256,uint256)" - ], - "0xe9c63b9c": [ - "requestPeerBalance()" - ], - "0x4c9ed763": [ - "requestTokensBack()" - ], - "0x0ac28725": [ - "requestTradeDeal(uint256,uint256,string)" - ], - "0xf802075f": [ - "requiredEndowment()" - ], - "0x432ced04": [ - "reserve(bytes32)" - ], - "0x92698814": [ - "reserved(bytes32)" - ], - "0x6676871d": [ - "reserved_funds()" - ], - "0x6423db34": [ - "Reset()" - ], - "0x478e25bf": [ - "resetAction(bytes32)" - ], - "0x769796fe": [ - "resetAction(uint256)" - ], - "0xb181a8fc": [ - "resetContract()" - ], - "0xf50d3914": [ - "resetFoundationtList()" - ], - "0xd337616e": [ - "resetLottery()" - ], - "0x5cfd8c24": [ - "ResetPonzi()" - ], - "0x433d4aab": [ - "resolve(uint8,uint8)" - ], - "0xa6403636": [ - "resolve(uint8,bytes32,bytes32,bytes32)" - ], - "0x1ef3755d": [ - "restart()" - ], - "0xa987d654": [ - "restoreItem(uint256)" - ], - "0xc4bc5da5": [ - "resumeContract()" - ], - "0x61b20d8c": [ - "retrieveFunds()" - ], - "0x85c78fac": [ - "retryOraclizeRequest(uint256)" - ], - "0x5cbc85d0": [ - "returnBounty(uint256)" - ], - "0xcff2fa42": [ - "_returnFee(address,uint256)" - ], - "0x0ca7395f": [ - "returnFund(address,uint256)" - ], - "0xec81e22e": [ - "returnmoneycreator(uint8,uint256)" - ], - "0x7ac4b05e": [ - "returnMyMoney(uint256)" - ], - "0x9ec35352": [ - "returnRandom()" - ], - "0xebaf7f2f": [ - "returnReward(uint256)" - ], - "0x66d8c463": [ - "reveal(bytes32,string)" - ], - "0x32d5fe98": [ - "revealCampaign(uint256,uint256)" - ], - "0x9348cef7": [ - "reveal(uint256,uint256)" - ], - "0x84ad6ff3": [ - "ReversibleDemo()" - ], - "0x05f8b6f5": [ - "_rewireIdentities(bytes32[],uint256,uint256,uint32)" - ], - "0x8390b02a": [ - "rfindPtr(uint256,uint256,uint256,uint256)" - ], - "0xe1108706": [ - "rfind()" - ], - "0xf7149220": [ - "RNG()" - ], - "0x4e1053cc": [ - "RobinHoodPonzi()" - ], - "0xd2602930": [ - "RockPaperScissors()" - ], - "0x8d216186": [ - "roll(uint256,bytes32)" - ], - "0x5a7a8850": [ - "rollWithSeed(bytes32)" - ], - "0xb73405a9": [ - "roundMoneyDownNicely(uint256)" - ], - "0x5ccc3eaa": [ - "roundMoneyUpToWholeFinney(uint256)" - ], - "0x96d02099": [ - "rsplit()" - ], - "0xdd727ea6": [ - "runJackpot()" - ], - "0x5674a3ed": [ - "runLottery()" - ], - "0x4d366398": [ - "runPeerBalance()" - ], - "0x677cee54": [ - "SafeConditionalHFTransfer()" - ], - "0x2baf4f22": [ - "_safeFalse()" - ], - "0x4401a6e4": [ - "safeSend(address)" - ], - "0x4269d8ef": [ - "_safeSend(address,uint256)" - ], - "0xa97ffd5e": [ - "safeToSell(uint256)" - ], - "0x38e48f06": [ - "save(string)" - ], - "0x3fb27b85": [ - "seal()" - ], - "0xddbbc35c": [ - "searchByName(string)" - ], - "0x42cf0e72": [ - "searchByOwner(address)" - ], - "0xc82aac47": [ - "searchByTag(bytes32)" - ], - "0x40a49a96": [ - "searchSmallestInvestor()" - ], - "0xf7c2b38c": [ - "seconds_left()" - ], - "0xcf1cd249": [ - "secureSend(address)" - ], - "0x85e5bb3a": [ - "Security_AddPasswordSha3HashToBankAccount(bytes32)" - ], - "0x7d94792a": [ - "seed()" - ], - "0xe4cc1161": [ - "seedWithGasLimit(uint256)" - ], - "0x88b9e10e": [ - "seizeTokens(address,uint256)" - ], - "0x6be505f5": [ - "selectWinner(bytes32)" - ], - "0x9cb8a26a": [ - "selfDestruct()" - ], - "0x2aa3177a": [ - "self_store()" - ], - "0x514dcfe3": [ - "seller_accept()" - ], - "0x2d592a34": [ - "sellKissBTC(uint256)" - ], - "0x41524433": [ - "sellKissBTCWithCallback(uint256,address,uint256)" - ], - "0xddb5b3ac": [ - "SellTokens()" - ], - "0xe4849b32": [ - "sell(uint256)" - ], - "0x227185d6": [ - "Send1Get2()" - ], - "0xd6006e88": [ - "send(address[],uint256[],uint256)" - ], - "0x3e58c58c": [ - "send(address)" - ], - "0x35d13969": [ - "SendAllMoney()" - ], - "0x3d21aa42": [ - "sendApproval(address,uint256,address)" - ], - "0xd1e15045": [ - "sendBack()" - ], - "0x5292af1f": [ - "sendBalance(address)" - ], - "0xeb455dc6": [ - "sendBitcoin(string,uint256)" - ], - "0xb938bf42": [ - "sendBounty(bytes32)" - ], - "0x9894221a": [ - "SendCashForHardwareReturn()" - ], - "0x010731c0": [ - "sendCryptedHand(bytes32)" - ], - "0x78ec81a0": [ - "sendEarnings(address)" - ], - "0xb1d05422": [ - "SendEmail(string,string)" - ], - "0xbb6b4619": [ - "SendETC(address)" - ], - "0x3a314b24": [ - "SendETH(address)" - ], - "0x9c6034a7": [ - "sendIfNotForked()" - ], - "0x7b02b2c9": [ - "sendMsg(address,string)" - ], - "0x76d438b0": [ - "sendReward(uint256,uint256)" - ], - "0xbf8fc670": [ - "sendToAggregation(uint256)" - ], - "0x6620a935": [ - "sendToOwner()" - ], - "0x03750d94": [ - "serverSeed(address,bytes32)" - ], - "0x7eff1465": [ - "setAccountAllowance(address,address,uint256)" - ], - "0x5e03d393": [ - "setAccountFrozenStatus(address,bool)" - ], - "0xf6d339e4": [ - "setAddress(bytes32,string,address)" - ], - "0x3c84f868": [ - "set(int256,address,uint256)" - ], - "0x213b9eb8": [ - "setAddr(string,address)" - ], - "0x5d96ec65": [ - "setAdministrator(address,string,bool)" - ], - "0xf8af9e6f": [ - "setAdv(uint256,string,string)" - ], - "0x058d7433": [ - "setAlliesContract(address)" - ], - "0x7a837213": [ - "setAllowedAccount(address)" - ], - "0xf8ec4bf2": [ - "setAllowTransactions(bool)" - ], - "0x7948f523": [ - "setAmbiAddress(address,bytes32)" - ], - "0x9fa5e5d5": [ - "setARKowner(address)" - ], - "0xd0d552dd": [ - "setAsset(address)" - ], - "0x9f203255": [ - "setAuditor(address)" - ], - "0xda7fc24f": [ - "setBackend(address)" - ], - "0x754dea40": [ - "setBackendOwner(address)" - ], - "0x5c89c10d": [ - "setBannedCycles(uint256[])" - ], - "0x1c31f710": [ - "setBeneficiary(address)" - ], - "0xcf09e6e1": [ - "SetBigContract(address)" - ], - "0xc1441172": [ - "setBlackFlagRequest(uint256,uint256)" - ], - "0x2ffda1e0": [ - "setBlackflag(uint256,bool)" - ], - "0x6b5caec4": [ - "setBot(address)" - ], - "0x23e9c216": [ - "setBounty(address,string,uint256)" - ], - "0x16ce8a69": [ - "setBuilding(uint256,uint256)" - ], - "0x47448e8a": [ - "set(bytes32,string,bytes32)" - ], - "0x37881810": [ - "setCallbackAddress(address)" - ], - "0x8702735c": [ - "setCapitol(uint256,uint256)" - ], - "0x951b01c5": [ - "setCertifierDb(address)" - ], - "0xeef8e35f": [ - "setChainyURL(string)" - ], - "0xf8bd526e": [ - "setCoinageContract(address)" - ], - "0xa510f776": [ - "setCompany()" - ], - "0x4c2d71b3": [ - "setConfigAddress(bytes32,address)" - ], - "0x1e0c7ed4": [ - "setConfigBool(bytes32,bool)" - ], - "0xe8a5282d": [ - "setConfig(bytes32)" - ], - "0x810a882f": [ - "setConfigBytes(bytes32,bytes32)" - ], - "0x3e8f5b90": [ - "setConfig(string,uint256)" - ], - "0xbc45d789": [ - "setConfigUint(int256,bytes32,uint256)" - ], - "0xfd6f5430": [ - "setContent(string,bytes32)" - ], - "0x92eefe9b": [ - "setController(address)" - ], - "0x5e6ad49d": [ - "_setCosignerAddress(address)" - ], - "0x82fc49b8": [ - "setCosignerAddress(address)" - ], - "0x986dcd4d": [ - "setCycleLimit(uint256)" - ], - "0xe73a914c": [ - "setDAO(address)" - ], - "0xc52bd836": [ - "setDappOwner(bytes32,address)" - ], - "0x03959bb7": [ - "setDataContract(address)" - ], - "0x4a994eef": [ - "setDelegate(address,bool)" - ], - "0x90c3f38f": [ - "setDescription(string)" - ], - "0x172d8a30": [ - "setDirectorLock(uint256,uint256)" - ], - "0xa1b7ae62": [ - "setdirectorName(string)" - ], - "0x38eaf913": [ - "setDirectorNode(string)" - ], - "0x423e1298": [ - "setDoNotAutoRefundTo(bool)" - ], - "0x6716a692": [ - "setDVIP(address)" - ], - "0x74331be7": [ - "sete(address)" - ], - "0xb56e1bca": [ - "setExchangeToken()" - ], - "0xfe4a3ac9": [ - "setExecPrice(uint256)" - ], - "0x01cceb38": [ - "setExpiry(uint256)" - ], - "0xb35893f3": [ - "setExporter()" - ], - "0x87cc1e1c": [ - "setExporterBank()" - ], - "0xa4502cb8": [ - "setExportFee(address,uint256)" - ], - "0xe5782fd5": [ - "setFeeStructure(uint256,uint256,uint256)" - ], - "0x69fe0e2d": [ - "setFee(uint256)" - ], - "0x02aa274b": [ - "setForward(bytes4,address)" - ], - "0x69569a51": [ - "setFrontend(address)" - ], - "0x576eac66": [ - "setFundingGoal(uint256)" - ], - "0x711953ef": [ - "setGameAddress(address)" - ], - "0x2187a833": [ - "setGreenToken()" - ], - "0x78f0161a": [ - "setGreyGreenPrice(uint8)" - ], - "0xad9ec17e": [ - "setGreyToken()" - ], - "0xd148288f": [ - "setHoldingPeriod(uint256)" - ], - "0xa37fd390": [ - "setHomeAdv(uint256,string)" - ], - "0x9fb755d7": [ - "setHotWallet(address)" - ], - "0x0a3b1cd2": [ - "setHotwallet(address)" - ], - "0x1bd9c46e": [ - "setImporter()" - ], - "0xae2df7b3": [ - "setImporterBank()" - ], - "0xe2c61114": [ - "setImportFee(address,uint256)" - ], - "0xa8659216": [ - "setInitialLockinDays(uint256)" - ], - "0x26b916b4": [ - "Set_Interest_Rate(uint256)" - ], - "0x9fcbc738": [ - "setIntermediate(address)" - ], - "0x18f303a1": [ - "SetInternalValues(uint8,uint256)" - ], - "0x7f0c949c": [ - "setJurisdication(string)" - ], - "0x74f519db": [ - "setLastTimestamp(uint256,uint256)" - ], - "0x27ea6f2b": [ - "setLimit(uint256)" - ], - "0x9cb31079": [ - "setLowLimit(uint256)" - ], - "0x73ffd969": [ - "setMap(uint256,uint256,uint256)" - ], - "0x457dd8b3": [ - "setMasterKey(address)" - ], - "0x5e404de3": [ - "setMaximumCredit(uint256)" - ], - "0xee8ff562": [ - "setMaxProfit()" - ], - "0x3b91ceef": [ - "setMax(uint256,uint256)" - ], - "0x1ca60aeb": [ - "setMeltingContract(address)" - ], - "0x50944a8f": [ - "setMembership(address)" - ], - "0x91cd242d": [ - "setMeta(bytes32,bytes32,bytes32)" - ], - "0xdd93890b": [ - "setMeta(uint256,bytes32,bytes32)" - ], - "0x35930e13": [ - "setMinimalRewardedBalance(uint256)" - ], - "0xb0414a2d": [ - "setMinimumGasLimit(uint256)" - ], - "0x03251a08": [ - "setMin(uint256,uint256)" - ], - "0xb1662d58": [ - "setModule(address,bool)" - ], - "0x29de91db": [ - "setMsg(address,uint256)" - ], - "0x8aa33776": [ - "setMsgPrice(uint256)" - ], - "0x5ac801fe": [ - "setName(bytes32)" - ], - "0xfe55932a": [ - "setName(uint256,string)" - ], - "0x4b3b6168": [ - "SetNewBigContract(address)" - ], - "0xc4d9102f": [ - "setNextID(uint256,int256)" - ], - "0xfc9e53df": [ - "setNextRegistrar(address)" - ], - "0x8389f353": [ - "setNumCities(uint256)" - ], - "0x8173b813": [ - "setNumCities(uint256,uint256)" - ], - "0x755b5b75": [ - "setNumUnits(uint256,uint256)" - ], - "0x65228934": [ - "setOperationsCallGas(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)" - ], - "0x7adbf973": [ - "setOracle(address)" - ], - "0xc7e22ac4": [ - "setOracleGas(uint256)" - ], - "0x89ed0b30": [ - "setOraclizeGas(uint32)" - ], - "0x18f3fae1": [ - "setOversight(address)" - ], - "0xd62b255b": [ - "setOwner(address,string)" - ], - "0x167d3e9c": [ - "SetOwner(address)" - ], - "0x7acbfb65": [ - "setOwner(uint256,uint256)" - ], - "0xffe302d1": [ - "setPlz(string)" - ], - "0x2e3be78d": [ - "setPrecisionDirect(uint8)" - ], - "0x3f9f5b68": [ - "setPreviousID(uint256,int256)" - ], - "0x36f7cd70": [ - "setPricePerStake(uint256)" - ], - "0x5e983d08": [ - "setPrices()" - ], - "0x05fefda7": [ - "setPrices(uint256,uint256)" - ], - "0xf7d97577": [ - "setPrice(uint256,uint256)" - ], - "0x53d97e65": [ - "setPrizes(uint32[])" - ], - "0x6e0d98fe": [ - "setProbabilities(uint32[])" - ], - "0x7137ed47": [ - "setProxyContract(address)" - ], - "0x8e25071a": [ - "setProxyCurrator(address)" - ], - "0xc24924d6": [ - "setQueryFee(uint256)" - ], - "0xe50d0473": [ - "SetRank(uint8,address,uint16)" - ], - "0x50b7b7a2": [ - "setRating(bytes32,uint256)" - ], - "0x50f07cf9": [ - "setReadingDelay(uint256)" - ], - "0x8279c7db": [ - "setReceiverAddress(address)" - ], - "0xa0a2f629": [ - "setReferralId(uint256,address)" - ], - "0xe0117441": [ - "setRegistrationPrice(uint256)" - ], - "0x718bd6dd": [ - "setRequestUntil(uint8)" - ], - "0xaf030d2c": [ - "setResult(uint256,uint256,bytes32)" - ], - "0x0381cb3b": [ - "setRowcol(uint256,uint256[2])" - ], - "0xe1a9109d": [ - "setSeedPrice(uint256)" - ], - "0x09d2d0b9": [ - "setServiceAccount(address,bool)" - ], - "0xa8026912": [ - "setSource(address)" - ], - "0x81183633": [ - "setStandard(bytes32)" - ], - "0x3e0a322d": [ - "setStartTime(uint256)" - ], - "0x49e65440": [ - "setSymbol(bytes32)" - ], - "0xb1233451": [ - "setTerm(uint256,string)" - ], - "0xb950556a": [ - "setThingValid(bytes32[],bool)" - ], - "0xce592586": [ - "setThresold(uint256,uint256)" - ], - "0xaee84f6b": [ - "setTime(address,uint256)" - ], - "0x9a9c29f6": [ - "settle(uint256,uint256)" - ], - "0xb33a8a11": [ - "setTokenReference(address)" - ], - "0x55db4092": [ - "setTOS(address,bool)" - ], - "0x506e106c": [ - "setToS(string)" - ], - "0xf7ea7a3d": [ - "setTotalSupply(uint256)" - ], - "0xa33dd801": [ - "setTreasuryBalance(uint256)" - ], - "0x4dc43eaf": [ - "setTreasury(uint256,uint256)" - ], - "0xdd57d5c5": [ - "setTrust(address)" - ], - "0xacb6c69b": [ - "setTrustedClient(address)" - ], - "0x1d7b5baf": [ - "setUint(int256,bytes32,string,uint256)" - ], - "0x2f30c6f6": [ - "set(uint256,address)" - ], - "0x468129a5": [ - "setUnit(uint256,uint256,uint256)" - ], - "0x7bc0ff20": [ - "setupExportFee(address,uint256)" - ], - "0x26881518": [ - "setupFee(address)" - ], - "0x92d8c8cf": [ - "setupImportFee(address,uint256)" - ], - "0x294f3d4d": [ - "setUpLimit(uint256)" - ], - "0xce8d054e": [ - "_setupNoCallback()" - ], - "0x12ab7242": [ - "setupStackDepthLib(address)" - ], - "0x1d124fe4": [ - "setUtils2(address)" - ], - "0x69953501": [ - "setUtils(address)" - ], - "0x4bc2a657": [ - "setVoter(address)" - ], - "0x7318b453": [ - "setVotetUntil(uint8)" - ], - "0x4173b181": [ - "setWeiPrice(uint256)" - ], - "0x0df71602": [ - "setWinner(uint256)" - ], - "0x12819817": [ - "setXauForGasCurrator(address)" - ], - "0xef4bdfdd": [ - "Set_your_game_number_between_1_15(string)" - ], - "0xb3ade772": [ - "shipProducts(string,string)" - ], - "0x83d852d9": [ - "shutdownTransactions()" - ], - "0x95d5a1be": [ - "SignatureReg()" - ], - "0x76cd7cbc": [ - "sign(bytes)" - ], - "0x5f68804e": [ - "SimpleLotto()" - ], - "0x152fb125": [ - "SimpleMixer()" - ], - "0x4ac7becf": [ - "SimpleSign()" - ], - "0xc83be888": [ - "single_move(uint256,uint8,uint8)" - ], - "0x70d084c0": [ - "SingularDTVCrowdfunding()" - ], - "0x0ab58ead": [ - "SingularDTVFund()" - ], - "0x0b590c6b": [ - "SingularDTVToken()" - ], - "0x1ff13086": [ - "size(int256)" - ], - "0x9c4baf27": [ - "Skywalker(address,address)" - ], - "0x1a88bc66": [ - "slot()" - ], - "0x853552d7": [ - "_slotAddNew(address)" - ], - "0xee564544": [ - "_slotCancelNew()" - ], - "0x16f9ce49": [ - "_slotCommitNew(address)" - ], - "0x6fe665e9": [ - "SlotMachine()" - ], - "0x22593300": [ - "Small(address)" - ], - "0x5503a659": [ - "smallponzi()" - ], - "0xe3b26a8c": [ - "SocialNetwork()" - ], - "0x5d0be9de": [ - "softWithdrawRevenueFor(address)" - ], - "0xd5dbb1ad": [ - "solveBet(address,uint8,bool,uint8,bytes32,bytes32)" - ], - "0xb2f2588b": [ - "sortNumbers(uint8[3])" - ], - "0xface030b": [ - "SpinTheWheel(address)" - ], - "0x56fa47f0": [ - "split(address)" - ], - "0x0f2c9329": [ - "split(address,address)" - ], - "0x9c709343": [ - "split(bool,address)" - ], - "0xf7654176": [ - "split()" - ], - "0xd9d2d058": [ - "Splitter()" - ], - "0x2672b3e2": [ - "SplitterEtcToEth()" - ], - "0x8946d33f": [ - "SplitterEthToEtc()" - ], - "0xb7266456": [ - "StandardToken()" - ], - "0x70983e91": [ - "startBoardProposal(uint256,address)" - ], - "0x9f35d3b2": [ - "start(string,string,uint256,uint256,uint256,uint256)" - ], - "0x0fbf7151": [ - "startsWith()" - ], - "0xa1cb31b7": [ - "_state()" - ], - "0x12253a6c": [ - "stopContract()" - ], - "0x975057e7": [ - "store()" - ], - "0xdda9939c": [ - "Store(address[])" - ], - "0x877653f0": [ - "_storeBalanceRecord(address)" - ], - "0xf60381a1": [ - "stra2cbor(string[])" - ], - "0x2fcb6628": [ - "_stringGas(string,string)" - ], - "0xfc01abbe": [ - "stringToBytes32(string,string)" - ], - "0x9077dcfd": [ - "submitCoding(string,uint256)" - ], - "0x2da8f764": [ - "submitVideo(string,string)" - ], - "0xb71c47a2": [ - "surrender()" - ], - "0xcd57a448": [ - "SwapContract(address,uint256)" - ], - "0x6b76484e": [ - "swap(address,address)" - ], - "0xd60dcb5d": [ - "Switch()" - ], - "0xb660d77c": [ - "switchMPO(address,address)" - ], - "0xd422e4e0": [ - "takeFee(address,uint256,string)" - ], - "0x4f073130": [ - "takeOrder(bool,uint256,uint256)" - ], - "0xbf55486b": [ - "Tanya()" - ], - "0xe2ee9941": [ - "tap(bytes20)" - ], - "0x420ef2b3": [ - "TargetHash()" - ], - "0x922fc84b": [ - "taskProcessedNoCosting(uint256)" - ], - "0x36e6b92e": [ - "taskProcessedWithCosting(uint256,uint256)" - ], - "0x93cc9162": [ - "taskRejected(uint256,uint256)" - ], - "0x4dc7cc55": [ - "terminateAlt()" - ], - "0x08714bfa": [ - "TestContract()" - ], - "0x1465aa97": [ - "testingContract()" - ], - "0x2af7ceff": [ - "testPrice(uint256)" - ], - "0xbab86ea8": [ - "test(string,string)" - ], - "0x4cad42d3": [ - "testWager()" - ], - "0xc96593a0": [ - "The10ETHPyramid()" - ], - "0x83d8a90f": [ - "theDonkeyKing()" - ], - "0x87fd0421": [ - "TheEthereumLottery()" - ], - "0x0e3f732a": [ - "TheGame()" - ], - "0xafbec8df": [ - "TheGrid()" - ], - "0x7399646a": [ - "theRun()" - ], - "0x83c51a38": [ - "thesimplegame()" - ], - "0x6f9a023c": [ - "theultimatepyramid()" - ], - "0x3c6e03d7": [ - "thewhalegame()" - ], - "0x18489f50": [ - "thingExist(bytes32[])" - ], - "0xe3848e5b": [ - "thing(string,string,string)" - ], - "0xda25c0cd": [ - "ThisExternalAssembly()" - ], - "0x857d4c07": [ - "throwScraps(uint256)" - ], - "0x18253234": [ - "ticketsAvailable()" - ], - "0xd7f746ce": [ - "tickingBomb()" - ], - "0x5f17114e": [ - "TimeDeposit()" - ], - "0x2f5a5c5b": [ - "timegame()" - ], - "0xcfed9199": [ - "timePassed(uint256)" - ], - "0xdd137b5d": [ - "toBase58(uint256,uint8)" - ], - "0xb05e390a": [ - "TokenEther(string,string)" - ], - "0x7ff9b596": [ - "tokenPrice()" - ], - "0x31380c89": [ - "TokenSale()" - ], - "0x4da47ba0": [ - "TokenSale(address,uint256)" - ], - "0xd5089396": [ - "Token(string,string,uint8,uint256)" - ], - "0x6c1a5b8c": [ - "TOKEN_TARGET()" - ], - "0xb29c2493": [ - "token(uint256,string,uint8,string)" - ], - "0xf2022905": [ - "toldYouItWouldWork()" - ], - "0x283a4576": [ - "Tomeka()" - ], - "0x51560da9": [ - "topDogInfo()" - ], - "0x43ec3f38": [ - "toSliceB32(bytes32)" - ], - "0xafed762b": [ - "toSlice(string)" - ], - "0x15a03930": [ - "TossMyCoin()" - ], - "0x47e46806": [ - "toString()" - ], - "0xfc7b9c18": [ - "totalDebt()" - ], - "0x1ff517ff": [ - "totalDebt(address)" - ], - "0x7fef036e": [ - "totalEntries()" - ], - "0x5216aeec": [ - "totalInvested()" - ], - "0xdc19266f": [ - "Total_of_Players()" - ], - "0x6831c169": [ - "totalPayedOut()" - ], - "0x6a8c2437": [ - "totalRescues()" - ], - "0xb524abcf": [ - "totalSupply(bytes32)" - ], - "0xbff1f9e1": [ - "totalUsers()" - ], - "0x8caaaae6": [ - "totalWeiPrice()" - ], - "0x637e86eb": [ - "totBOTs()" - ], - "0xbb39a960": [ - "trade(address,uint256,address,uint256)" - ], - "0x04bb754c": [ - "TradeFinancing()" - ], - "0x4847a79c": [ - "_transfer(address,uint256)" - ], - "0x57cfeeee": [ - "transfer(address,uint256,bytes32)" - ], - "0xdeb80111": [ - "transfer_asset(address,uint256)" - ], - "0x22e803c2": [ - "transferBounty()" - ], - "0x60063887": [ - "transferDebt(address,address,address,uint256)" - ], - "0xddd41ef6": [ - "transferDirector(address)" - ], - "0x30e0789e": [ - "_transfer(address,address,uint256)" - ], - "0x63334c58": [ - "transferETC(address)" - ], - "0xd50f6bf0": [ - "transferETH(address)" - ], - "0x97fcb54e": [ - "transfer_eth(address,uint256)" - ], - "0xa0eda9f2": [ - "_transferFee(address,uint256,string)" - ], - "0xcb712535": [ - "_transferFrom(address,address,uint256)" - ], - "0xc204f9f1": [ - "_transferFromToICAP(address,bytes32,uint256)" - ], - "0xa525f42c": [ - "transferFromToICAP(address,bytes32,uint256)" - ], - "0xcac77df7": [ - "__transferFromToICAPWithReference(address,bytes32,uint256,string)" - ], - "0x0b1e400a": [ - "_transferFromToICAPWithReference(address,bytes32,uint256,string)" - ], - "0xa48a663c": [ - "transferFromToICAPWithReference(address,bytes32,uint256,string)" - ], - "0x48a490fb": [ - "transferFromTreasury(address,uint256)" - ], - "0xcacc24eb": [ - "transferFromViaProxy(address,address,address,uint256)" - ], - "0x31c6c4cf": [ - "transferFromWithReference(address,address,uint256,bytes32,string)" - ], - "0x3de9e4c6": [ - "__transferFromWithReference(address,address,uint256,string)" - ], - "0xa10bee85": [ - "_transferFromWithReference(address,address,uint256,string)" - ], - "0x6461fe39": [ - "transferFromWithReference(address,address,uint256,string)" - ], - "0x752a3df6": [ - "transferIfHardForked(address)" - ], - "0xd6a619e3": [ - "transferIfPuritanical(address)" - ], - "0x29605e77": [ - "transferOperator(address)" - ], - "0x235c002d": [ - "transferOther(address,address,uint256)" - ], - "0x67af26fb": [ - "transferOtherFrom(address,address,address,uint256)" - ], - "0x1301ee02": [ - "transferringETC(address)" - ], - "0xd4245e5b": [ - "transferringETH(address)" - ], - "0xfbf58b3e": [ - "transfer(string,address)" - ], - "0xd3aa22c7": [ - "transferTLA(string,address)" - ], - "0xa25057de": [ - "_transferToICAP(bytes32,uint256)" - ], - "0x733480b7": [ - "transferToICAP(bytes32,uint256)" - ], - "0x3bf2313d": [ - "__transferToICAPWithReference(bytes32,uint256,string)" - ], - "0x078c3fa4": [ - "_transferToICAPWithReference(bytes32,uint256,string)" - ], - "0x77fe38a4": [ - "transferToICAPWithReference(bytes32,uint256,string)" - ], - "0xe7dafdb6": [ - "transfer_token(address,address,uint256)" - ], - "0x12514bba": [ - "transfer(uint256)" - ], - "0x240ecad5": [ - "transferViaProxy(address,address,uint256)" - ], - "0x6d16f79c": [ - "__transferWithReference(address,uint256,string)" - ], - "0x51b3d7b9": [ - "_transferWithReference(address,uint256,string)" - ], - "0xac35caee": [ - "transferWithReference(address,uint256,string)" - ], - "0x1d065dde": [ - "_transferWithReward(address,address,uint256)" - ], - "0xe99543aa": [ - "Trash(uint256)" - ], - "0x8fe58eb9": [ - "Triger()" - ], - "0x54204ad4": [ - "triple()" - ], - "0x432c685f": [ - "trustClient(address)" - ], - "0x464f37c9": [ - "trustedChildRefund()" - ], - "0x866f6736": [ - "trustedChildWithdraw()" - ], - "0x2e6e504a": [ - "trusteeWithdraw()" - ], - "0x65343fcb": [ - "TrustEth()" - ], - "0x5fdf05d7": [ - "two()" - ], - "0x0d0c2008": [ - "TwoAndAHalfPonzi()" - ], - "0x49cc954b": [ - "twoYearsPassed()" - ], - "0x4dd850fb": [ - "UfoPonzi()" - ], - "0xf76f950e": [ - "uint2str(uint256)" - ], - "0x9e1e6528": [ - "uncertify(address)" - ], - "0x734d8287": [ - "unclaimedFees()" - ], - "0xf0d474f9": [ - "underdogCount()" - ], - "0x6eb7b4c2": [ - "underdogInfo(uint256)" - ], - "0x75f40f40": [ - "underdogPayoutFund()" - ], - "0x2880ebe7": [ - "underdogPayoutMarkup()" - ], - "0xcb3e64fd": [ - "unhalt()" - ], - "0xff81fb91": [ - "unhint(int256,bytes32)" - ], - "0xd4859dbc": [ - "UniversalFunctionSecure(uint8,bytes32,bytes32,bytes32,bytes32,bytes32)" - ], - "0x579badf6": [ - "UniversalFunction(uint8,bytes32,bytes32,bytes32,bytes32,bytes32)" - ], - "0x2ec2c246": [ - "unregister(address)" - ], - "0x1a0919dc": [ - "unregister(bytes32)" - ], - "0x4e116eb8": [ - "unRegisterCertificationDb(address)" - ], - "0xf1a00a53": [ - "unregisterListening(address)" - ], - "0xf295206f": [ - "_unsafeSend(address,uint256)" - ], - "0x9447fd0a": [ - "until()" - ], - "0x63def590": [ - "untrustClient(address)" - ], - "0x6a4b6aa5": [ - "untrustedChildWithdraw()" - ], - "0x0e38901a": [ - "unvault(uint256)" - ], - "0xe0b1cccb": [ - "updateBalance(address,uint256)" - ], - "0xfd8055d2": [ - "updateBOTBillingInfo(uint256,string,address,string,string,uint256)" - ], - "0xb4a5ef58": [ - "updateDefaultTimeoutPeriod(uint256)" - ], - "0x2ffb9e64": [ - "updateGasForXaurData(uint256,uint256)" - ], - "0x4f10acc1": [ - "updateGoldFeeData(uint256)" - ], - "0x7c582304": [ - "updateInvestmentTotal(address,uint256)" - ], - "0xf2016a4f": [ - "updateMinEthPerNotification(uint256)" - ], - "0x10f41715": [ - "updateMintingData(uint256,uint256)" - ], - "0xb3485dca": [ - "UpdatePrice(uint8,uint32)" - ], - "0x482961e1": [ - "updateReading(uint256,uint256)" - ], - "0x9dc35799": [ - "updateReading(uint256)" - ], - "0x71e11354": [ - "updateRegistration(string,string)" - ], - "0x645dce72": [ - "updateRelease(uint32,uint32,uint32,bytes20,bool)" - ], - "0x5dddea66": [ - "updateState(uint256,uint8,uint256)" - ], - "0xbc058968": [ - "updateThingData(bytes32[],bytes32[],uint88)" - ], - "0x4ca7fbd0": [ - "updateTokenPriceWeekTwo()" - ], - "0x1d4b0796": [ - "updateTxStats()" - ], - "0x5a6c787e": [ - "updateWithMPO()" - ], - "0x1aa86370": [ - "updateXIPFSPublicKey(string)" - ], - "0xac7ffae3": [ - "updt(uint256,string,uint256,uint256,string,string,address)" - ], - "0x0900f010": [ - "upgrade(address)" - ], - "0xf597a499": [ - "UserDatabase(uint256)" - ], - "0x376fe102": [ - "userId(address)" - ], - "0xe6b972f5": [ - "userName(address)" - ], - "0x7b12df39": [ - "userProfits()" - ], - "0xe28fed1e": [ - "userRescues(address)" - ], - "0x8a65d874": [ - "userStats(address)" - ], - "0xed498fa8": [ - "userTokens(address)" - ], - "0xccf1ab9b": [ - "usurpation()" - ], - "0x83f6d9a4": [ - "validateNameInternal(string)" - ], - "0xb8d4efb5": [ - "validate_percent(uint8)" - ], - "0x67fc1c6a": [ - "validateProposedMonarchName(string)" - ], - "0xd22c391a": [ - "validateProposedThroneRules(uint256,uint256,uint256,uint256,uint256)" - ], - "0x8f7fe231": [ - "ValidetherOracle()" - ], - "0xc0a239e3": [ - "valuePerShare()" - ], - "0xcc189d00": [ - "Vault(address,uint256)" - ], - "0xe820a32f": [ - "vetoPayout(uint256,uint256)" - ], - "0x4228974c": [ - "Videos()" - ], - "0x226685ee": [ - "Visit()" - ], - "0x6bf52ffa": [ - "Vote()" - ], - "0x5f09952e": [ - "voteAllowTransactions(bool)" - ], - "0x52a554a1": [ - "voteBoardProposal(uint256,address,bool)" - ], - "0x187a62d5": [ - "voteEmergencyWithdrawal(bool)" - ], - "0x045c6ce0": [ - "voteForProposal(uint256)" - ], - "0x58ae8bcf": [ - "voteInMasterKey(address)" - ], - "0x901d7775": [ - "voteOutMasterKey(address)" - ], - "0x23637e60": [ - "votePrice(uint256,bool)" - ], - "0x76e4ca0d": [ - "voteQuorum(uint256,bool)" - ], - "0xf2561a43": [ - "voteSuicide(address)" - ], - "0x0bf75567": [ - "voteSuperQuorum(uint256,bool)" - ], - "0xb3f98adc": [ - "vote(uint8)" - ], - "0xe2cdd42a": [ - "vote(uint256,address,bool)" - ], - "0x0121b93f": [ - "vote(uint256)" - ], - "0x655388be": [ - "walkTowardsBlock()" - ], - "0x5d5483b3": [ - "WatchAppliedFeePercentage()" - ], - "0xd628e0a6": [ - "WatchBalance()" - ], - "0xe0834ea4": [ - "WatchBalanceInEther()" - ], - "0x252786e4": [ - "WatchBlockSizeInEther()" - ], - "0xcf6b3822": [ - "WatchCollectedFeesInSzabo()" - ], - "0x82381c96": [ - "WatchCurrentMultiplier()" - ], - "0x20bfec70": [ - "WatchFees()" - ], - "0xc9734ebd": [ - "WatchLastPayout()" - ], - "0x61ba3377": [ - "WatchLastTime()" - ], - "0xfb34fc6f": [ - "WatchNextBlockReward()" - ], - "0x4ef5710a": [ - "WatchNumberOfPlayerInCurrentRound()" - ], - "0x6b3a87d2": [ - "WatchWinningPot()" - ], - "0xbe0638e4": [ - "WealthShare()" - ], - "0x05459f42": [ - "WeeklyLotteryB(address)" - ], - "0x836d6d66": [ - "WeeklyLotteryB(address,uint256)" - ], - "0x856f3080": [ - "WhatWasMyHash(bytes32)" - ], - "0x06e53f47": [ - "whichChainIsThis()" - ], - "0x9b19251a": [ - "whitelist(address)" - ], - "0xd6d02c51": [ - "whois(string)" - ], - "0x609ff1bd": [ - "winningProposal()" - ], - "0x95ceb4b3": [ - "winningProtocal()" - ], - "0x5ca3400c": [ - "WithBeneficiary(address)" - ], - "0x31e3e2fe": [ - "WithDraw()" - ], - "0x07bc6fad": [ - "withdraw(address,uint256,bytes32,uint256)" - ], - "0x8d92fdf3": [ - "withdrawAsset(uint256)" - ], - "0x5f52e9fd": [ - "WithdrawCashForHardwareReturn(uint256)" - ], - "0x1dd4914b": [ - "withdrawEtherOrThrow(uint256)" - ], - "0x24600fc3": [ - "withdrawFunds()" - ], - "0xf4aa1291": [ - "withdrawFundsAdvanced(address,uint256,uint256)" - ], - "0xceeafd9d": [ - "withdrawFundsAdvancedRP(address,uint256,uint256)" - ], - "0xc7f86c37": [ - "withdrawFundsRP()" - ], - "0x6103d70b": [ - "withdrawPayments()" - ], - "0x770c6cbb": [ - "WithDrawPreForkChildDAO()" - ], - "0x4f573cb2": [ - "withdrawRevenue()" - ], - "0xf108a7d2": [ - "withdraw(uint256,address,string)" - ], - "0x5b6b431d": [ - "Withdraw(uint256)" - ], - "0x44faa139": [ - "Withdraw(uint32)" - ], - "0xe63697c8": [ - "withdraw(uint256,address,uint256)" - ], - "0xf359671c": [ - "withdrawWithReference(address,uint256,string)" - ], - "0x89790192": [ - "WithFee(address,uint256)" - ], - "0x0d87a7c0": [ - "WLBDrawsDB()" - ], - "0xd08275f1": [ - "WolframAlpha()" - ], - "0x720c4798": [ - "workshop()" - ], - "0x214c9d50": [ - "WritedrawStatus()" - ], - "0xc0a1a949": [ - "x15()" - ], - "0x7266f4a4": [ - "X3()" - ], - "0xdb7ca38a": [ - "XaurmProxyContract()" - ], - "0x4f052648": [ - "XaurumDataContract()" - ], - "0xc1be4031": [ - "XaurumProxyERC20()" - ], - "0x71f297cc": [ - "XaurumToken(address)" - ], - "0x648621ec": [ - "xnotify(string)" - ], - "0xe3ceb06d": [ - "YesNo(bytes32,address,string,address,uint256)" - ], - "0xbc8f3bcb": [ - "ZeroDollarHomePage()" - ], - "0xbd02e4f6": [ - "calcRandomNumberAndGetPreliminaryGameResult(uint256,uint64)" - ], - "0x8f4fb958": [ - "calculateRandomNumberByBlockhash(uint256,address)" - ], - "0xae47a290": [ - "changeMaxBet(uint256)" - ], - "0x06394c9b": [ - "changeOperator(address)" - ], - "0x3aa5f4f7": [ - "changeTokenSettings(uint16,uint256,uint256)" - ], - "0x9a969768": [ - "distributeProfits(uint256)" - ], - "0x0f590c36": [ - "emergencyFixGameResult(uint64,uint256)" - ], - "0x364f4896": [ - "emission(address,address,uint256,uint16,uint16)" - ], - "0x7a8df1b9": [ - "getAffiliateInfo(address)" - ], - "0x9eb9dd3b": [ - "getBetsProcessed()" - ], - "0x2fd6d40b": [ - "getBetValueByGamble(uint8)" - ], - "0x6d12301c": [ - "getBetValue(bytes32,uint8)" - ], - "0x03ee8f08": [ - "getCoeff(uint16)" - ], - "0x38f77d69": [ - "getDistributeProfitsInfo()" - ], - "0xd02528e6": [ - "GetGameIndexesToProcess()" - ], - "0xb3fb14ad": [ - "getGameResult()" - ], - "0x49041903": [ - "getGame(uint64)" - ], - "0x824d5603": [ - "getIndex(uint16,uint16)" - ], - "0xf84f420b": [ - "getRandomNumber(address,uint256)" - ], - "0x267127ec": [ - "getTokenSettings()" - ], - "0x3cf885c4": [ - "isBitSet(uint256,uint8)" - ], - "0x15cff546": [ - "isOperationBlocked()" - ], - "0x257bcd6a": [ - "placeBet(uint256,bytes32,bytes32)" - ], - "0xfe73e3ec": [ - "preliminaryGameResult(uint64)" - ], - "0x89abeb19": [ - "ProcessGameExt(uint256)" - ], - "0x665bcc32": [ - "ProcessGames(uint256[],bool)" - ], - "0xa24d23eb": [ - "ProcessGame(uint256,uint256)" - ], - "0xaa677354": [ - "register(address,address)" - ], - "0xeb5904c0": [ - "setProfitDistributionContract(address)" - ], - "0x53c84526": [ - "setSmartAffiliateContract(address)" - ], - "0xf0caea2b": [ - "SmartRoulette()" - ], - "0xb599afc8": [ - "totalBetCount()" - ], - "0x4ce01d86": [ - "totalBetValue()" - ], - "0x2c4e591b": [ - "totalGames()" - ], - "0x37bdc99b": [ - "release(uint256)" - ], - "0x25fda176": [ - "notify(address,uint256)" - ], - "0x545e7c61": [ - "deploy(address,address)" - ], - "0xd3017193": [ - "addUser(address,uint256)" - ], - "0x2d580ef6": [ - "add(address,bytes32)" - ], - "0x79716e43": [ - "confirmTransaction(bytes32)" - ], - "0xca1d209d": [ - "fund(uint256)" - ], - "0x8b147245": [ - "update(bytes32)" - ], - "0x329ce29e": [ - "buyTile(uint256)" - ], - "0xa3908e1b": [ - "convert(uint256)" - ], - "0xdef2489b": [ - "convert(address)" - ], - "0x1e9a6950": [ - "redeem(address,uint256)" - ], - "0x74a93e6c": [ - "setTokenHolder(address,address)" - ], - "0xac940823": [ - "betOnLowHigh(bool)" - ], - "0x5521d17b": [ - "betOnColor(bool)" - ], - "0x338cdca1": [ - "request()" - ], - "0x59c87d70": [ - "request(bytes32)" - ], - "0x2bffc7ed": [ - "add(string,address)" - ], - "0x58d9fa04": [ - "addUser(uint256,address)" - ], - "0x64371977": [ - "set(uint256,string)" - ], - "0xf09ea2a6": [ - "offer(uint256,address,uint256,address)" - ], - "0x77fcb91d": [ - "forward(address,bool)" - ], - "0x53d9d910": [ - "create(address[],uint256,uint256)" - ], - "0xa8d95fb2": [ - "claim(address,string)" - ], - "0x591c515f": [ - "append(string,string)" - ], - "0xa7abc124": [ - "activate(bool,bool)" - ], - "0xc7f2e6af": [ - "Contribute(bytes20)" - ], - "0xebf6e91d": [ - "hit(uint256)" - ], - "0x7183616c": [ - "notarize(string)" - ], - "0x3da5c3ce": [ - "puzzle(address,bytes32)" - ], - "0x4b59e880": [ - "puzzle(address,bytes32,bytes32)" - ], - "0xae0a6b28": [ - "signature(string,bytes32)" - ], - "0x96b76c23": [ - "stand(uint256)" - ], - "0x6ea056a9": [ - "sweep(address,uint256)" - ], - "0x4637d827": [ - "trust(address)" - ], - "0x3af39c21": [ - "undefined()" - ], - "0x776d1a01": [ - "unvest(uint256,uint256,uint256,uint256,uint256,bool)" - ], - "0xb6608467": [ - "updateShares(uint256)" - ], - "0xf04da65b": [ - "getShares(address)" - ], - "0x90fa337d": [ - "storeBlockWithFeeAndRecipient(bytes,int256,int256)" - ], - "0x59d1d43c": [ - "text(bytes32,string)" - ], - "0x10f13a8c": [ - "setText(bytes32,string,string)" - ], - "0xa21174bb": [ - "DefaultReverseResolver(address)" - ], - "0x4e543b26": [ - "setResolver(address)" - ], - "0x0f5a5466": [ - "claimWithResolver(address,address)" - ], - "0xc0ee0b8a": [ - "tokenFallback(address,uint256,bytes)" - ], - "0x5a6b26ba": [ - "withdrawal(address,uint256)" - ], - "0x690e7c09": [ - "open(uint256)" - ], - "0x09fd018e": [ - "setClaimer(uint256,address,uint256)" - ], - "0x596c8976": [ - "close(uint256,uint256)" - ], - "0xdd0d74ff": [ - "IssueBank(address)" - ], - "0x228cb733": [ - "reward()" - ], - "0x99b721a5": [ - "rewardEthAnd(address[])" - ], - "0xeacccaf0": [ - "setReward(address,uint256)" - ], - "0x85eddeea": [ - "setReward(address[],uint256[])" - ], - "0xeb4dd8f2": [ - "confirm(address)" - ], - "0x342b7e71": [ - "setTokenList(address[])" - ], - "0xbd5dec98": [ - "withdraw(address[])" - ], - "0x640a4d0c": [ - "_deposited(address,address,uint256)" - ], - "0xc0b4fa6d": [ - "_reward(address[])" - ], - "0x18573bf9": [ - "calculeReward(uint256,uint256)" - ], - "0x73053f70": [ - "tokenDeposit(address)" - ], - "0x58e2cd76": [ - "watch(address)" - ], - "0xd9caed12": [ - "withdraw(address,address,uint256)" - ], - "0xb4427263": [ - "createTokens()" - ], - "0x01a7a8c0": [ - "batFundDeposit()" - ], - "0x229a4978": [ - "batFund()" - ], - "0x4172d080": [ - "tokenExchangeRate()" - ], - "0x6f7920fd": [ - "tokenCreationCap()" - ], - "0x8d4e4083": [ - "isFinalized()" - ], - "0x91b43d13": [ - "fundingEndBlock()" - ], - "0xa81c3bdf": [ - "ethFundDeposit()" - ], - "0xc039daf6": [ - "tokenCreationMin()" - ], - "0xd648a647": [ - "fundingStartBlock()" - ], - "0x3a1a635e": [ - "createNewRevision(bytes20,bytes32)" - ], - "0x7b760537": [ - "updateLatestRevision(bytes20,bytes32)" - ], - "0xa4b8c2e7": [ - "restart(bytes20,bytes32)" - ], - "0x22fa85ca": [ - "testFailRegisterContractAgain()" - ], - "0xcb56d626": [ - "testFailBlobStoreNotRegistered()" - ], - "0x6ec99dd0": [ - "testGetBlobStore()" - ], - "0x7604b6d7": [ - "testGetBlobStoreFromFullBlobId()" - ], - "0xc28bfe5a": [ - "testFailCreateSameIpfsHashAndNonce()" - ], - "0xded04fe9": [ - "testFailCreateNewRevisionNotOwner()" - ], - "0x9a93e940": [ - "testFailCreateNewRevisionNotUpdatable()" - ], - "0x960d8cd3": [ - "testFailUpdateLatestRevisionNotOwner()" - ], - "0x3ce1f4e7": [ - "testFailUpdateLatestRevisionNotUpdatable()" - ], - "0xf99ebb71": [ - "testFailUpdateLatestRevisionEnforceRevisions()" - ], - "0x251fa3b1": [ - "testFailRetractLatestRevisionNotOwner()" - ], - "0xb2ab530e": [ - "testFailRetractLatestRevisionNotUpdatable()" - ], - "0xc57a99e5": [ - "testFailRetractLatestRevisionEnforceRevisions()" - ], - "0xc204505a": [ - "testFailRetractLatestRevisionDoesntHaveAdditionalRevisions()" - ], - "0x617f8666": [ - "testFailRestartNotOwner()" - ], - "0xd2c5c368": [ - "testFailRestartNotUpdatable()" - ], - "0xcf984f16": [ - "testFailRestartEnforceRevisions()" - ], - "0x3cc0fb45": [ - "testFailRetractNotOwner()" - ], - "0xa9888148": [ - "testFailRetractNotRetractable()" - ], - "0x71e60fe6": [ - "testFailTransferEnableNotTransferable()" - ], - "0x9acade7e": [ - "testFailTransferDisableNotEnabled()" - ], - "0xe2b8766c": [ - "testFailTransferNotTransferable()" - ], - "0x615f9f1f": [ - "testFailTransferNotEnabled()" - ], - "0x19ea61db": [ - "testFailTransferDisabled()" - ], - "0x776df027": [ - "testFailDisownNotOwner()" - ], - "0xeddce76b": [ - "testFailDisownNotTransferable()" - ], - "0x32d8eee5": [ - "testFailSetNotUpdatableNotOwner()" - ], - "0x6fe5b536": [ - "testFailSetEnforceRevisionsNotOwner()" - ], - "0xf2c2dff2": [ - "testFailSetNotRetractableNotOwner()" - ], - "0x5cc501ce": [ - "testFailSetNotTransferableNotOwner()" - ], - "0xf38e5ca2": [ - "getBlobStoreFromFullBlobId(bytes32)" - ], - "0x01e3d346": [ - "create(bytes1,bytes32,uint256)" - ], - "0x147a5640": [ - "_getAllRevisionIpfsHashes(bytes20)" - ], - "0x64d12ec6": [ - "getRevisionIpfsHash(bytes20,uint256)" - ], - "0x540c97c8": [ - "getAllRevisionIpfsHashes(bytes20)" - ], - "0xb7c38d02": [ - "testControlCreateSameIpfsHashAndNonce()" - ], - "0x6e1479c0": [ - "testControlCreateNewRevisionNotOwner()" - ], - "0xe73b7d77": [ - "testControlCreateNewRevisionNotUpdatable()" - ], - "0x8cdcdae1": [ - "testControlUpdateLatestRevisionNotOwner()" - ], - "0x69c5c229": [ - "testControlUpdateLatestRevisionNotUpdatable()" - ], - "0x80e74b04": [ - "testControlUpdateLatestRevisionEnforceRevisions()" - ], - "0x86602b6b": [ - "testControlRetractLatestRevisionNotOwner()" - ], - "0xc7a3778f": [ - "testControlRetractLatestRevisionNotUpdatable()" - ], - "0x6c712471": [ - "testControlRetractLatestRevisionEnforceRevisions()" - ], - "0x610285d2": [ - "testControlRetractLatestRevisionDoesntHaveAdditionalRevisions()" - ], - "0xebc697d1": [ - "testControlRestartNotOwner()" - ], - "0x2d985cfb": [ - "testControlRestartNotUpdatable()" - ], - "0xcebb8bb0": [ - "testControlRestartEnforceRevisions()" - ], - "0xe37e60d1": [ - "testControlRetractNotOwner()" - ], - "0xcefdfcf3": [ - "testControlRetractNotRetractable()" - ], - "0x490825a9": [ - "testControlTransferEnableNotTransferable()" - ], - "0x20d615c2": [ - "testControlTransferDisableNotEnabled()" - ], - "0xe18c52ae": [ - "testControlTransferNotTransferable()" - ], - "0xe71d7bf0": [ - "testControlTransferNotEnabled()" - ], - "0x32bf775d": [ - "testControlTransferDisabled()" - ], - "0xb47784d9": [ - "testControlDisownNotOwner()" - ], - "0x98a29a58": [ - "testControlDisownNotTransferable()" - ], - "0x50a9eddb": [ - "testControlSetNotUpdatableNotOwner()" - ], - "0x0ec3b247": [ - "testControlSetEnforceRevisionsNotOwner()" - ], - "0xc3689f01": [ - "testControlSetNotRetractableNotOwner()" - ], - "0x9bf68006": [ - "testControlSetNotTransferableNotOwner()" - ], - "0x0ab03e1b": [ - "testControlRegisterContractAgain()" - ], - "0x895224db": [ - "testControlBlobStoreNotRegistered()" - ], - "0x81accd0b": [ - "create(bytes1,bytes32,bytes32)" - ], - "0x6013aa44": [ - "testControlCreateSameNonce()" - ], - "0x94106200": [ - "testFailCreateSameNonce()" - ], - "0x396ed0ab": [ - "Burn()" - ], - "0xd89135cd": [ - "totalBurned()" - ], - "0xf24e4a15": [ - "Purge()" - ], - "0x1caba41f": [ - "decimalUnits()" - ], - "0xc0463711": [ - "lastUpdate()" - ], - "0xe5a6b10f": [ - "currency()" - ], - "0x1820b575": [ - "Team(uint256,address,uint256)" - ], - "0x8a78f5e2": [ - "changeMember(address,bool,bool,uint256)" - ], - "0x30b0faab": [ - "changeSettings(uint256,address,uint256)" - ], - "0x03048a42": [ - "createRequest(address,uint256,string,bytes,bytes)" - ], - "0x17fb6c6e": [ - "approveRequest(uint256,bool,string)" - ], - "0x03ef2a2c": [ - "tryExecuteProposal(uint256,bytes)" - ], - "0x4ff6aa46": [ - "deactivateTeam()" - ], - "0x3f2885cb": [ - "publish(string,string,address,bytes32)" - ], - "0x50692d9a": [ - "toContentID(address,string,string,address,bytes32)" - ], - "0x7115c988": [ - "Batch(address)" - ], - "0x64eb7327": [ - "_getContent(bytes32)" - ], - "0x7ff0346b": [ - "getContents(bytes32[])" - ], - "0x2625e2e1": [ - "post(address,address,bytes32)" - ], - "0x534878fb": [ - "reply(address,address,bytes32,bytes32)" - ], - "0x7f602231": [ - "tip(bytes32,address,uint256)" - ], - "0x816e24b0": [ - "setupDeposits()" - ], - "0x68e7bdba": [ - "disableApi(address)" - ], - "0xbd322b77": [ - "enableApi(address)" - ], - "0x5cc15001": [ - "getContent(bytes32)" - ], - "0x9a01b4d5": [ - "getChannel(address)" - ], - "0xfbcbc0f1": [ - "getAccount(address)" - ], - "0xae9a0785": [ - "getChannelPostCount(address)" - ], - "0x5a17aa41": [ - "getContentTip(bytes32,address)" - ], - "0xd83a7f67": [ - "getDepositAddress(address)" - ], - "0xc489744b": [ - "getTokenBalance(address,address)" - ], - "0xe5c46944": [ - "MultiSigWallet(address[],uint256)" - ], - "0xe20056e6": [ - "replaceOwner(address,address)" - ], - "0xc6427474": [ - "submitTransaction(address,uint256,bytes)" - ], - "0x20ea8d86": [ - "revokeConfirmation(uint256)" - ], - "0xee22610b": [ - "executeTransaction(uint256)" - ], - "0x784547a7": [ - "isConfirmed(uint256)" - ], - "0xec096f8d": [ - "addTransaction(address,uint256,bytes)" - ], - "0x8b51d13f": [ - "getConfirmationCount(uint256)" - ], - "0x54741525": [ - "getTransactionCount(bool,bool)" - ], - "0xb5dc40c3": [ - "getConfirmations(uint256)" - ], - "0xa8abe69a": [ - "getTransactionIds(uint256,uint256,bool,bool)" - ], - "0x1914427f": [ - "MultiSigWalletWithDailyLimit(address[],uint256,uint256)" - ], - "0xcea08621": [ - "changeDailyLimit(uint256)" - ], - "0x811de206": [ - "isConfirmedByOwners(uint256)" - ], - "0x11c91914": [ - "isUnderLimit(uint256)" - ], - "0x4bc9fdc2": [ - "calcMaxWithdraw()" - ], - "0xae1a0b0c": [ - "launchLength()" - ], - "0x0a40f15f": [ - "fundDeal(string,address)" - ], - "0x1504ce95": [ - "payout(string)" - ], - "0x2de90801": [ - "hashtagToken()" - ], - "0x2e788443": [ - "resolve(string,address,uint256)" - ], - "0x5e717e2d": [ - "readDeal(string,address)" - ], - "0xac56c52b": [ - "makeDealForTwo(string,uint256)" - ], - "0xcdcf0c4a": [ - "dispute(string,address)" - ], - "0xf089b7dd": [ - "hashtag()" - ], - "0xf3227dc4": [ - "cancelDeal(string)" - ], - "0x3cebb823": [ - "changeController(address)" - ], - "0xf77c4791": [ - "controller()" - ], - "0x085d4883": [ - "provider()" - ], - "0x0e429ecc": [ - "providerValue()" - ], - "0x117de2fd": [ - "payout(address,uint256)" - ], - "0x200d2ed2": [ - "status()" - ], - "0x2e49d78b": [ - "setStatus(uint8)" - ], - "0x30cfac6c": [ - "assignTo(uint256,address,uint256)" - ], - "0xf3ab7ea9": [ - "seeker()" - ], - "0xfef1dc7d": [ - "seekerValue()" - ], - "0x0e4355d4": [ - "validFactories(address)" - ], - "0x10fe9ae8": [ - "getTokenAddress()" - ], - "0x29ce1ec5": [ - "addFactory(address)" - ], - "0x355e6b43": [ - "setCommission(uint256)" - ], - "0x4b37c73f": [ - "removeFactory(address)" - ], - "0x6985e46e": [ - "getConflictResolver()" - ], - "0x7f301b83": [ - "setMetadataHash(string)" - ], - "0x24664106": [ - "mintRep(int256,address,uint256)" - ], - "0xa4a75edc": [ - "registerDeal(address,address)" - ], - "0xaaf73ef7": [ - "registeredDeals()" - ], - "0xc5a1d7f0": [ - "metadataHash()" - ], - "0xcffee328": [ - "successfulDeals()" - ], - "0xe1489191": [ - "commission()" - ], - "0xf34f43f6": [ - "getRepTokenAddress()" - ], - "0xf6b44d03": [ - "validFactories()" - ], - "0x2dc2dbf2": [ - "makeSimpleDeal(address,address,uint256,bytes32)" - ], - "0x12424e3f": [ - "approve()" - ], - "0xb85477c5": [ - "dealStatus()" - ], - "0xe344606b": [ - "hashtagCommission()" - ], - "0x4a393149": [ - "onTransfer(address,address,uint256)" - ], - "0xda682aeb": [ - "onApprove(address,address,uint256)" - ], - "0xf48c3054": [ - "proxyPayment(address)" - ], - "0x55a373d6": [ - "tokenContract()" - ], - "0xc0112678": [ - "arcToken()" - ], - "0x921b2d64": [ - "mintTokens(int256,address,uint256)" - ], - "0x3290ce29": [ - "purchaseTokens()" - ], - "0x38cde380": [ - "changeWeight(uint256)" - ], - "0x4f995d08": [ - "getPeople()" - ], - "0x74607d91": [ - "patient(uint256)" - ], - "0x7b464e93": [ - "prescriptions(bytes32)" - ], - "0x86590955": [ - "changeHeight(uint256)" - ], - "0xd72dec33": [ - "changeVaccinHistory(address)" - ], - "0xdc3d4203": [ - "createPatient(bytes32,bytes32,uint256,uint256,uint256,bytes32,uint256)" - ], - "0xe571fd2d": [ - "addPrescription(uint256,string)" - ], - "0xfbbf93a0": [ - "getDetails()" - ], - "0x077dadb2": [ - "coinBalanceMultisig(address)" - ], - "0x249b4d4f": [ - "transferContractUser(address)" - ], - "0x388f3cd3": [ - "cashin(address,uint256)" - ], - "0x527f4ff1": [ - "setTransferAddressUser(address,address)" - ], - "0x6ba2aefc": [ - "transferMultisig(address,address,uint256)" - ], - "0x9d16aca6": [ - "changeExchangeContract(address)" - ], - "0xd126dac4": [ - "cashout(address,address,uint256)" - ], - "0xf1679095": [ - "getTransferAddressUser(address)" - ], - "0x0bf77989": [ - "debug_coinbaseTxSha(bytes,uint256)" - ], - "0x107b1f8c": [ - "debug_verifyShare(bytes,uint256[],uint256[],bytes,uint256,uint256)" - ], - "0x14ca5398": [ - "submitFullBlock(bytes,uint256[],uint256[],bytes,bytes,bytes,bytes,bytes,bytes,uint256)" - ], - "0x2850c72a": [ - "debug_extendCoinbaseTxOutput(uint256,uint256)" - ], - "0x3e2ee39e": [ - "debug_resetuser()" - ], - "0x43c33ac9": [ - "submitShares(uint256,uint256)" - ], - "0x579d5fba": [ - "debug_hash3Int(uint256)" - ], - "0x83cd5e13": [ - "debug_multiplehash(uint256,uint256)" - ], - "0x88702cc4": [ - "debug_hash256Double(bytes)" - ], - "0x88f6d5a4": [ - "constructCoinbaseTx(uint256,uint256)" - ], - "0x9559225c": [ - "debug_hash3Byte(bytes)" - ], - "0x99d1d002": [ - "debug_blockHeaderMerkle(bytes)" - ], - "0xa68393a2": [ - "debug_getCoinbaseTxOutputLen(uint256)" - ], - "0xad076bfc": [ - "debug_hash256Double_concat(bytes,bytes,bytes)" - ], - "0xb2b0aefb": [ - "verifyPendingShares(uint256[],uint256[],uint256,uint256[],uint256[],bytes,bytes,uint256)" - ], - "0xed47ca94": [ - "debug_verifySharesTreeSubmission(uint256[],uint256[],uint256,uint256,uint256,uint256)" - ], - "0xf16fa954": [ - "debug_resizeRealPrefix(uint256,uint256)" - ], - "0x6104464f": [ - "previousPublishedVersion()" - ], - "0x6737c877": [ - "setAttributes(bytes)" - ], - "0x884179d8": [ - "ipfsAttributeLookup(address)" - ], - "0x9352fad2": [ - "run(string)" - ], - "0x98e7ea43": [ - "reward(uint32[],address[])" - ], - "0x0456860a": [ - "acceptAtCommunity(address,uint256)" - ], - "0x0a90c704": [ - "createCommunity(string,string,string,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256)" - ], - "0x197f3c29": [ - "notLike(address)" - ], - "0x1b7db340": [ - "sysAdmin()" - ], - "0x2925ffc2": [ - "modifyCommunityTaxes(uint256,uint256,uint256,uint256)" - ], - "0x33b85b73": [ - "modifyCommunityRates(uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256)" - ], - "0x3500a48d": [ - "transferCommunityCommune(uint256,address)" - ], - "0x36b33415": [ - "modifyMemberInfo(string,string,string,string)" - ], - "0x47c66140": [ - "getProposalVotes(uint256)" - ], - "0x519a078f": [ - "getCommunitybyIndex(uint256)" - ], - "0x526b91d1": [ - "transferSysAdmin(address)" - ], - "0x52ea5667": [ - "getMPbyIndex(uint256)" - ], - "0x67a09c23": [ - "payment(address,uint256)" - ], - "0x71efeff1": [ - "transferCommunityBank(uint256,address)" - ], - "0x721a1f57": [ - "endorseCredit(address,uint256,uint256)" - ], - "0x84e10a90": [ - "getTotals()" - ], - "0x8b343e8f": [ - "getMemberCredit(address)" - ], - "0x9431e412": [ - "getCommunityRates(uint256)" - ], - "0xa5496e60": [ - "newProposal(uint256,string,string,uint256,uint256)" - ], - "0xad71c687": [ - "registerSystem(string,string,string,string)" - ], - "0xb122a0ef": [ - "joinCommunity(uint256)" - ], - "0xbcabb54c": [ - "modifyCommunityInfo(uint256,string,string,string,string)" - ], - "0xbfb04c60": [ - "proposeAcceptanceAsMember(uint256)" - ], - "0xd21cbffc": [ - "getIfVoted(uint256,address)" - ], - "0xd95ab72d": [ - "getMemberWallet(address)" - ], - "0xdde8535f": [ - "getMemberStatus(address)" - ], - "0xe05e3028": [ - "getCommunityManagement(uint256)" - ], - "0xe465c465": [ - "like(address)" - ], - "0xee650248": [ - "vote(uint256,int8)" - ], - "0xf47efbca": [ - "getMemberLinks(address)" - ], - "0xf6df26d2": [ - "kickOutCommunity(address,uint256)" - ], - "0xf82c2301": [ - "resignFromCommunity()" - ], - "0xfba6651c": [ - "getCommunityTaxes(uint256)" - ], - "0xfcc101ba": [ - "getCommunityDescription(uint256)" - ], - "0x04029f23": [ - "_setBugFixVersion(string,uint32,bytes32,uint32)" - ], - "0x1f9ea25d": [ - "_setDepositAccount(address)" - ], - "0x49593f53": [ - "submit(string,uint64,uint32,uint32,bytes32)" - ], - "0x569aa0d8": [ - "getPlayerSubmissionFromCompetition(string,uint8,address)" - ], - "0x59a4669f": [ - "increaseJackpot(string)" - ], - "0x656104f5": [ - "_setOrganiser(address)" - ], - "0x70de8c6e": [ - "start(string,uint64,uint8,uint32)" - ], - "0x71bde852": [ - "_startNextCompetition(string,uint32,uint88,uint8,uint8,uint16,uint64,uint32,bytes32,uint32[])" - ], - "0x8d909ad9": [ - "getSeedAndState(string,address)" - ], - "0x8f30435d": [ - "getCompetitionValues(string,uint8)" - ], - "0x916dbc17": [ - "getPlayersFromCompetition(string,uint8)" - ], - "0xc91540f6": [ - "getCurrentCompetitionValues(string)" - ], - "0xfedc2a28": [ - "_rewardWinners(string,uint8,address[])" - ], - "0x224ccc49": [ - "chainLastMessageHash(bytes32)" - ], - "0x482f63b0": [ - "postMessage(bytes32,bytes)" - ], - "0x590a4595": [ - "createNewChain(bytes)" - ], - "0x858c7559": [ - "chainIDSeed()" - ], - "0x52c98e33": [ - "checkClaim(address,uint256,uint256)" - ], - "0x598aa1fc": [ - "checkEndorsement(address,uint256,address)" - ], - "0xa16c6a73": [ - "setClaim(uint256,uint256)" - ], - "0xa1bdd146": [ - "setEndorsement(address,uint256,uint256)" - ], - "0xa3a48785": [ - "unsetClaim(uint256)" - ], - "0xd7789a9f": [ - "unsetEndorsement(address,uint256)" - ], - "0xa9d0ddc7": [ - "addContractWithInfo(string,string)" - ], - "0xfa3559f7": [ - "attestToContract(uint256,bool,string)" - ], - "0x179fc99f": [ - "etherBalanceOf(address)" - ], - "0x3b0c197e": [ - "getBook()" - ], - "0x42da3b6b": [ - "getAmount(uint256,address)" - ], - "0x6dee2032": [ - "getOpenOrdersOf(address)" - ], - "0x836e4158": [ - "numOrdersOf(address)" - ], - "0x8ab1a5d4": [ - "sell(uint256,uint256,bool)" - ], - "0x8b7afe2e": [ - "contractBalance()" - ], - "0x8c3f914a": [ - "spread(bool)" - ], - "0x8f70ccf7": [ - "setTrading(bool)" - ], - "0x975289fd": [ - "getPriceVolume(uint256)" - ], - "0xc3434883": [ - "buy(uint256,uint256,bool)" - ], - "0xd07866d2": [ - "sizeOf(uint256)" - ], - "0xe1725c92": [ - "decimalPlaces()" - ], - "0xe2dede94": [ - "getNode(uint256,uint256)" - ], - "0xec44acf2": [ - "trading()" - ], - "0x11456b47": [ - "addName(string)" - ], - "0x14bfd6d0": [ - "admins(uint256)" - ], - "0x4deb68a3": [ - "auctionStart(bytes32,uint256,uint256)" - ], - "0x663e90d9": [ - "setBuyNowListing(bytes32,uint256,bool)" - ], - "0x71c79588": [ - "releaseName(bytes32)" - ], - "0x7c72e273": [ - "auctionFinalize(bytes32)" - ], - "0x9bdd7cdb": [ - "forceRelease(bytes32)" - ], - "0xbfcf63b0": [ - "claimEther(address,uint256)" - ], - "0xc415b95c": [ - "feeCollector()" - ], - "0xd7ad4931": [ - "buyNow(bytes32)" - ], - "0xe2acf75d": [ - "auctionCancel(bytes32)" - ], - "0xf747a5eb": [ - "auctionBid(bytes32)" - ], - "0x13831693": [ - "getLevitatingUnicorns(bytes32,uint64)" - ], - "0x50fe533b": [ - "getLevitatingBirds(bytes32,uint64)" - ], - "0xc9aa71b8": [ - "getFlyingUnicorns(bytes32,uint64)" - ], - "0xfeb50430": [ - "getLevitatingKittens(bytes32,uint64)" - ], - "0x78c2c849": [ - "burnUnicorns()" - ], - "0xbd8b452e": [ - "eatUnicorns()" - ], - "0x4b06fb28": [ - "eatUnicornsAlive()" - ], - "0x5b303e16": [ - "eatUnicorns(uint256)" - ], - "0xa1e95792": [ - "eatUnicornsAlive(uint256)" - ], - "0x10867877": [ - "eatUnicornWithoutCorn()" - ], - "0x4b269a00": [ - "withdraw(int256[])" - ], - "0x2c7cce9e": [ - "auctionMinPriceIncrease()" - ], - "0x801c334e": [ - "auctionIncreaseBid(bytes32)" - ], - "0x95e911a8": [ - "feeBase()" - ], - "0xb4628c8a": [ - "ENSRegistrar()" - ], - "0xddca3f43": [ - "fee()" - ], - "0xe765cb44": [ - "auctionMinPrice()" - ], - "0x69f30401": [ - "bid(address,uint256[],uint256[])" - ], - "0x6e67b803": [ - "bid3(address,uint256[],uint256[])" - ], - "0x21462191": [ - "bid3(address,uint8[],uint8[])" - ], - "0x92584d80": [ - "finalize(bytes32)" - ], - "0xf3bf93a0": [ - "forceReleaseAdmin(bytes32)" - ], - "0x5b372532": [ - "press()" - ], - "0x9f095e88": [ - "asdf()" - ], - "0xb0459d49": [ - "LoanStandard(address,address,uint256,uint256,uint256,uint256,uint256)" - ], - "0xa2fb342d": [ - "lend(address,uint256)" - ], - "0xd334d75b": [ - "expireLoan()" - ], - "0xb7019744": [ - "payBack(address,uint256)" - ], - "0x60aeac18": [ - "neverPayBack()" - ], - "0xaad3ec96": [ - "claim(address,uint256)" - ], - "0x4c123019": [ - "tokenFallback(address,address,uint256,bytes)" - ], - "0xcb7acdd9": [ - "hola()" - ], - "0xacb6e9b1": [ - "testControlItemStoreNotRegistered()" - ], - "0xac767539": [ - "testFailItemStoreNotRegistered()" - ], - "0x1649cdcd": [ - "testGetItemStore()" - ], - "0xe41cc093": [ - "getItemStore(bytes12)" - ], - "0x79ba5097": [ - "acceptOwnership()" - ], - "0x58e9b208": [ - "Controlled()" - ], - "0x30311898": [ - "Account(address)" - ], - "0xce3f865f": [ - "collect(uint256)" - ], - "0x55ee6afb": [ - "Wallet(address,address)" - ], - "0x2268a358": [ - "changeMultisig(address)" - ], - "0xea2c23da": [ - "createAccounts(uint256)" - ], - "0xa5e8c5d6": [ - "setVoteRight(address,uint256)" - ], - "0x9cc0c5e3": [ - "experty_io()" - ], - "0x5022e940": [ - "experty()" - ], - "0xb7090bb5": [ - "www_experty_io()" - ], - "0x0edfb0f7": [ - "withdrawCollectedInterest()" - ], - "0x21856b36": [ - "interestOwed()" - ], - "0x402d8883": [ - "repay()" - ], - "0x4665096d": [ - "expiration()" - ], - "0x58f33e98": [ - "isTaker(address)" - ], - "0x5eda5b9a": [ - "interestCollected()" - ], - "0x6cbdb7d0": [ - "takers(uint256)" - ], - "0x7c3a00fd": [ - "interestRate()" - ], - "0xaa8116be": [ - "fundedPrincipal()" - ], - "0xbc99c8be": [ - "takerAddressAt(uint256)" - ], - "0xc41f4cc0": [ - "takerStatus(address)" - ], - "0xc537a210": [ - "principalOutstanding()" - ], - "0xc5ebeaec": [ - "borrow(uint256)" - ], - "0xcb6da9da": [ - "takerCount()" - ], - "0xfb775b46": [ - "giver()" - ], - "0xe1a27ad3": [ - "needsAdministration()" - ], - "0xb6253539": [ - "needsInitialization()" - ], - "0xb6f98e53": [ - "needsAllowancePayment()" - ], - "0xb5931f7c": [ - "safeDiv(uint256,uint256)" - ], - "0x3a4faf7f": [ - "max64(uint64,uint64)" - ], - "0x36b1315c": [ - "min64(uint64,uint64)" - ], - "0x0c255c94": [ - "max256(uint256,uint256)" - ], - "0xb1e9292f": [ - "min256(uint256,uint256)" - ], - "0x1d3b9edf": [ - "times(uint256,uint256)" - ], - "0xf4f3bdc1": [ - "minus(uint256,uint256)" - ], - "0x66098d4f": [ - "plus(uint256,uint256)" - ], - "0x8afc3605": [ - "Ownable()" - ], - "0x04bbc255": [ - "isPricingStrategy()" - ], - "0x8e768288": [ - "isSane(address)" - ], - "0x18a4155e": [ - "calculatePrice(uint256,uint256,uint256,address,uint256)" - ], - "0x614cb904": [ - "isFinalizeAgent()" - ], - "0x82771c8e": [ - "isSane()" - ], - "0x0bf318a3": [ - "finalizeCrowdsale()" - ], - "0x96f47800": [ - "investInternal(address,uint128)" - ], - "0x32013ac3": [ - "preallocate(address,uint256,uint256)" - ], - "0x1a49803b": [ - "investWithSignedAddress(address,uint128,uint8,bytes32,bytes32)" - ], - "0xef869443": [ - "investWithCustomerId(address,uint128)" - ], - "0x03f9c793": [ - "invest(address)" - ], - "0xf4869726": [ - "buyWithSignedAddress(uint128,uint8,bytes32,bytes32)" - ], - "0x99e9376c": [ - "buyWithCustomerId(uint128)" - ], - "0x7f7d711e": [ - "setRequireCustomerId(bool)" - ], - "0xed68ff2c": [ - "setRequireSignedAddress(bool,address)" - ], - "0xeac24932": [ - "setEarlyParicipantWhitelist(address,bool)" - ], - "0x6e50eb3f": [ - "setEndsAt(uint256)" - ], - "0xf3283fba": [ - "setMultisig(address)" - ], - "0x87612102": [ - "loadRefund()" - ], - "0x7c2e08a3": [ - "isMinimumGoalReached()" - ], - "0xa7ba44c3": [ - "isFinalizerSane()" - ], - "0x062b01ce": [ - "isPricingSane()" - ], - "0x1865c57d": [ - "getState()" - ], - "0x8d51faec": [ - "setOwnerTestValue(uint256)" - ], - "0x4551dd59": [ - "isCrowdsale()" - ], - "0x9d3c663f": [ - "isBreakingCap(uint256,uint256,uint256,uint256)" - ], - "0xd5d09021": [ - "isCrowdsaleFull()" - ], - "0x4d7edc15": [ - "assignTokens(address,uint256)" - ], - "0xeefa597b": [ - "isToken()" - ], - "0x09ae9452": [ - "PreICOProxyBuyer(address,uint256,uint256,uint256,uint256)" - ], - "0x21df0da7": [ - "getToken()" - ], - "0xbaeb91ae": [ - "invest(uint128)" - ], - "0x1fb00cdc": [ - "investWithId(uint128)" - ], - "0xdbb833df": [ - "investWithoutId()" - ], - "0xd4607048": [ - "buyForEverybody()" - ], - "0xdde070e8": [ - "getClaimAmount(address)" - ], - "0x3c67b6b7": [ - "getClaimLeft(address)" - ], - "0xd1058e59": [ - "claimAll()" - ], - "0x4042b66f": [ - "weiRaised()" - ], - "0xf6368f8a": [ - "transfer(address,uint256,bytes,string)" - ], - "0x3ef13367": [ - "flushTokens(address)" - ], - "0x083c6323": [ - "endBlock()" - ], - "0x7055060f": [ - "bulkStoreHeader(bytes)" - ], - "0x3115b4c4": [ - "bulkStoreHeader(bytes,uint256)" - ], - "0x01725a0b": [ - "demo()" - ], - "0xdce5c757": [ - "cool()" - ], - "0x939a79ac": [ - "demo(string)" - ], - "0x071bd079": [ - "demo(uint256)" - ], - "0x43b1c529": [ - "getSig(string,bytes4)" - ], - "0x1d03842f": [ - "onePlus(uint256)" - ], - "0x42966c68": [ - "burn(uint256)" - ], - "0x457f4d41": [ - "hammer()" - ], - "0x58292a3d": [ - "emission(uint256)" - ], - "0xd31fdffd": [ - "setHammer(address)" - ], - "0xb8c48f8c": [ - "setInitialParent(int256,int256,int256)" - ], - "0x08f75d17": [ - "move_reveal(bytes32,uint8)" - ], - "0x2e9c91a8": [ - "getStartParams(bytes32)" - ], - "0x497777d5": [ - "collect(bytes32)" - ], - "0x5598c576": [ - "reveal_move(bytes32,uint8,bytes32,bytes32)" - ], - "0x5cf34bcf": [ - "getMinFee()" - ], - "0x6a7bf76a": [ - "create_game(bytes32,uint32,uint32,uint8,uint16,uint8,address,uint256,bool)" - ], - "0x73931bbf": [ - "getGame(bytes32)" - ], - "0x87287fd7": [ - "setMinFee(uint8)" - ], - "0x89d61d77": [ - "setOrganizer(address)" - ], - "0xa361b184": [ - "move(bytes32,bytes32)" - ], - "0xe4083daf": [ - "create_game_invite(bytes32,address,uint32,uint32,uint8,uint16,uint8,address,uint256)" - ], - "0xf223446c": [ - "start_game(bytes32,uint8,uint32,uint16,address,uint256,uint8)" - ], - "0x3a4de190": [ - "repost(bytes32)" - ], - "0x4b91ab35": [ - "unfollow(bytes32)" - ], - "0x66e34dc6": [ - "registerUsername(bytes32)" - ], - "0x699f200f": [ - "addresses(bytes32)" - ], - "0x7e93163b": [ - "tip(bytes32,bytes32)" - ], - "0x8ee93cf3": [ - "post(string)" - ], - "0x9d7eb375": [ - "updateUserDetails(string)" - ], - "0xa66b7748": [ - "follow(bytes32)" - ], - "0xa83b1e21": [ - "reply(string,bytes32)" - ], - "0xd38d0f28": [ - "updateSplit(uint256)" - ], - "0xee91877c": [ - "usernames(address)" - ], - "0xf59823cf": [ - "Congress(uint256,uint256,int256)" - ], - "0xb3bb9b58": [ - "LiquidDemocracy(address,string,uint256)" - ], - "0x6dd7d8ea": [ - "vote(address)" - ], - "0xc0d061f4": [ - "execute(address,uint256,bytes32)" - ], - "0xf2ba18ed": [ - "calculateVotes()" - ], - "0xb154224e": [ - "TimeLockMultisig(address,address[],uint256)" - ], - "0x15bef9cd": [ - "changeMembers(address[],bool)" - ], - "0xc01f9e37": [ - "proposalDeadline(uint256)" - ], - "0x159887d1": [ - "calculateFactor(uint256,uint256)" - ], - "0x7207c19f": [ - "MyToken(uint256)" - ], - "0x73e9f3e6": [ - "Crowdsale(address,uint256,uint256,uint256,address,address)" - ], - "0xfd6b7ef8": [ - "safeWithdrawal()" - ], - "0x9dbf0087": [ - "TokenERC20(uint256,string,string)" - ], - "0x79cc6790": [ - "burnFrom(address,uint256)" - ], - "0x7e4f6b95": [ - "MyAdvancedToken(uint256,string,string)" - ], - "0xbc0c868c": [ - "stocksOf(uint256)" - ], - "0x8262fc7d": [ - "addrBalance(address)" - ], - "0x6dfe869b": [ - "Preallocation(address,uint256)" - ], - "0xa357880d": [ - "whitelistedAddrs(address)" - ], - "0x54da5393": [ - "Utils()" - ], - "0xe4edf852": [ - "transferManagement(address)" - ], - "0xc8c2fe6c": [ - "acceptManagement()" - ], - "0x67cc4882": [ - "TokenHolder()" - ], - "0x21e6b53d": [ - "transferTokenOwnership(address)" - ], - "0x38a5e016": [ - "acceptTokenOwnership()" - ], - "0x85d5e631": [ - "disableTokenTransfers(bool)" - ], - "0x205c2878": [ - "withdrawTo(address,uint256)" - ], - "0x1608f18f": [ - "disableTransfers(bool)" - ], - "0x29a00e7c": [ - "calculatePurchaseReturn(uint256,uint256,uint32,uint256)" - ], - "0x49f9b0f7": [ - "calculateSaleReturn(uint256,uint256,uint32,uint256)" - ], - "0x59f8714b": [ - "changeableTokenCount()" - ], - "0x503adbf6": [ - "changeableToken(uint16)" - ], - "0x9b99a8e2": [ - "reserveTokenCount()" - ], - "0x4e2280c4": [ - "clearQuickBuyPath()" - ], - "0x9396a7f0": [ - "getQuickBuyPathLength()" - ], - "0xabeb5f9f": [ - "hasQuickBuyEtherToken()" - ], - "0xb3a9afb7": [ - "getQuickBuyEtherToken()" - ], - "0x0b3f191a": [ - "disableChanging(bool)" - ], - "0x88c0b8a7": [ - "setChangeFee(uint32)" - ], - "0x48d6ca55": [ - "getChangeFeeAmount(uint256)" - ], - "0x7758c4f8": [ - "quickBuy(uint256)" - ], - "0x74214c92": [ - "StandardERC223Token(uint256)" - ], - "0x16279055": [ - "isContract(address)" - ], - "0x03ba3a88": [ - "notifyContract(address,address,uint256,bytes)" - ], - "0x27e235e3": [ - "balances(address)" - ], - "0x3f4ba83a": [ - "unpause()" - ], - "0x5c658165": [ - "allowed(address,address)" - ], - "0x5c975abb": [ - "paused()" - ], - "0x8456cb59": [ - "pause()" - ], - "0xa0821be3": [ - "availableBalance(address)" - ], - "0xe9ed8667": [ - "balanceLocks(address)" - ], - "0xf339c504": [ - "lockBalance(uint256)" - ], - "0x1d4d691d": [ - "fill(address,uint256,address,address,uint256,address,uint256,uint256,uint8,bytes32,bytes32)" - ], - "0x20158c44": [ - "fills(bytes32)" - ], - "0x66a26419": [ - "cancel(address,uint256,address,address,uint256,address,uint256,uint256,uint8,bytes32,bytes32)" - ], - "0x673a5ae3": [ - "Sale(address,address,uint256,string,uint8,string,uint256,uint256,uint256,uint256,uint256,uint256)" - ], - "0x94b5255b": [ - "distributePreBuyersRewards(address[],uint256[])" - ], - "0x555c4758": [ - "distributeTimelockedTokens(address[],uint256[],uint256[],uint256[])" - ], - "0x8b9b1cbd": [ - "withdrawRemainder()" - ], - "0xa2b40d19": [ - "changePrice(uint256)" - ], - "0x98b9a2dc": [ - "changeWallet(address)" - ], - "0x5437f098": [ - "changeStartBlock(uint256)" - ], - "0x82222674": [ - "changeEndBlock(uint256)" - ], - "0x00a53598": [ - "emergencyToggle()" - ], - "0xe382b854": [ - "_setPackedTimestamp(bytes20,uint256)" - ], - "0x31861423": [ - "_deleteAllPackedRevisionTimestamps(bytes20)" - ], - "0x4ae6ab70": [ - "_getRevisionTimestamp(bytes20,uint256)" - ], - "0x4e57d27d": [ - "_getAllRevisionTimestamps(bytes20)" - ], - "0xc5cd3bec": [ - "getRevisionTimestamp(bytes20,uint256)" - ], - "0x261c42dd": [ - "getAllRevisionTimestamps(bytes20)" - ], - "0x50035eb8": [ - "getInUse(bytes20)" - ], - "0xf25e7bb4": [ - "getState(bytes20)" - ], - "0x634bc7db": [ - "create(bytes32,bytes32)" - ], - "0xb0673d57": [ - "getItemStore(bytes32)" - ], - "0x455ea98c": [ - "getInUse(bytes32)" - ], - "0xa6c09381": [ - "_setPackedTimestamp(bytes32,uint256)" - ], - "0x001a4f5e": [ - "createNewRevision(bytes32,bytes32)" - ], - "0x032b0824": [ - "updateLatestRevision(bytes32,bytes32)" - ], - "0x1b5710ed": [ - "_deleteAllPackedRevisionTimestamps(bytes32)" - ], - "0x165ffd10": [ - "restart(bytes32,bytes32)" - ], - "0x2ab7d104": [ - "_getAllRevisionIpfsHashes(bytes32)" - ], - "0xf50f1ba9": [ - "_getRevisionTimestamp(bytes32,uint256)" - ], - "0xcd22f418": [ - "_getAllRevisionTimestamps(bytes32)" - ], - "0x09648a9d": [ - "getState(bytes32)" - ], - "0x72cef34b": [ - "getRevisionIpfsHash(bytes32,uint256)" - ], - "0x7c699401": [ - "getAllRevisionIpfsHashes(bytes32)" - ], - "0x05664cea": [ - "getRevisionTimestamp(bytes32,uint256)" - ], - "0x8cb3728c": [ - "getAllRevisionTimestamps(bytes32)" - ], - "0x93c8b0d4": [ - "addForeignChild(bytes32,bytes32)" - ], - "0x4048c449": [ - "getParent(bytes32)" - ], - "0x31230e23": [ - "createWithParent(bytes32,bytes32,bytes32)" - ], - "0x2eaad0b0": [ - "_getAllChildren(bytes32)" - ], - "0xa09e3d0a": [ - "getChildCount(bytes32)" - ], - "0x958d1725": [ - "getChild(bytes32,uint256)" - ], - "0xfbdf0378": [ - "getAllChildren(bytes32)" - ], - "0x9643aef4": [ - "testControlCreateWithParentSameNonce()" - ], - "0x8dc1c44d": [ - "testFailCreateWithParentSameNonce()" - ], - "0x2aaf1685": [ - "testControlCreateWithParentSameItemId()" - ], - "0xa121d8df": [ - "testFailCreateWithParentSameItemId()" - ], - "0x64d0d64c": [ - "testControlCreateWithParentNotInUse()" - ], - "0x75f208bf": [ - "testFailCreateWithParentNotInUse()" - ], - "0x473ae9fe": [ - "testCreateWithParent()" - ], - "0x59e1667d": [ - "testControlCreateWithForeignParentNotInUse()" - ], - "0xca615662": [ - "testFailCreateWithForeignParentNotInUse()" - ], - "0x121f2081": [ - "testCreateWithForeignParent()" - ], - "0xfc13a76a": [ - "testFailAddForeignChildNotInUse()" - ], - "0x4e6c61aa": [ - "testFailAddForeignChildNotChild()" - ], - "0x590ba734": [ - "getUint(int256)" - ], - "0x732e632e": [ - "assemblyTest()" - ], - "0x215de48a": [ - "getParentCount(bytes32)" - ], - "0x33ac7256": [ - "getParent(bytes32,uint256)" - ], - "0x32c4903d": [ - "getAllParents(bytes32)" - ], - "0x6844ab43": [ - "testControlCreateSameItemId()" - ], - "0x343f40a0": [ - "testFailCreateSameItemId()" - ], - "0x9d9c9a0d": [ - "testControlCreateWithParentParentSameItemId()" - ], - "0x3ce54ac3": [ - "testFailCreateWithParentParentSameItemId()" - ], - "0xbca9e546": [ - "testControlCreateWithParentParentNotInUse()" - ], - "0xbab9fc63": [ - "testFailCreateWithParentParentNotInUse()" - ], - "0x30840c31": [ - "testControlCreateWithParentForeignNotInUse()" - ], - "0x3d6b0cb7": [ - "testFailCreateWithParentForeignNotInUse()" - ], - "0x0de04691": [ - "testCreateWithParentForeign()" - ], - "0x3d608572": [ - "testControlCreateWithParentsSameItemId()" - ], - "0xba907b7e": [ - "testFailCreateWithParentsSameItemId()" - ], - "0x015689c6": [ - "testControlCreateWithParentsParentSameItemId()" - ], - "0x28e47076": [ - "testFailCreateWithParentsParentSameItemId0()" - ], - "0x8a7ef3df": [ - "testFailCreateWithParentsParentSameItemId1()" - ], - "0x041dd3f6": [ - "testControlCreateWithParentsParentNotInUse()" - ], - "0x46d47cdf": [ - "testFailCreateWithParentsParentNotInUse0()" - ], - "0x89a45223": [ - "testFailCreateWithParentsParentNotInUse1()" - ], - "0x44019db3": [ - "testCreateWithParents()" - ], - "0xbf0d44d5": [ - "testControlCreateWithParentsForeignNotInUse()" - ], - "0x0ee8e338": [ - "testFailCreateWithParentsForeignNotInUse0()" - ], - "0xdddb983b": [ - "testFailCreateWithParentsForeignNotInUse1()" - ], - "0xf94497fe": [ - "testCreateWithParentsForeign0()" - ], - "0xf6951038": [ - "testCreateWithParentsForeign1()" - ], - "0x26d3e889": [ - "testCreateWithParentsForeign2()" - ], - "0x98f69aeb": [ - "_addChildToParent(bytes32,bytes32)" - ], - "0x7fdd458d": [ - "createWithParents(bytes32,bytes32,bytes32[])" - ], - "0xa300eadf": [ - "_getAllParents(bytes32)" - ], - "0xa172045d": [ - "PUSH1()" - ], - "0x22a7118d": [ - "buyTokensFor(uint256,address,uint256,bool)" - ], - "0x9e1a00aa": [ - "sendTo(address,uint256)" - ], - "0x00b172d7": [ - "buyTokensForProposal(uint256,address)" - ], - "0x4913732e": [ - "buyTokenFromModerator(uint256,address,uint256,bool)" - ], - "0xdb6a3652": [ - "addOrder(address,uint256)" - ], - "0x9645337a": [ - "removeOrder(uint256)" - ], - "0x709ef231": [ - "sellTokens(uint256,uint256,uint256)" - ], - "0x868eb6bf": [ - "removeOrders(uint256,uint256)" - ], - "0x02d05d3f": [ - "creator()" - ], - "0x1f21f9af": [ - "marketMaker()" - ], - "0x28c05d32": [ - "shortSell(uint8,uint256,uint256)" - ], - "0x46280a80": [ - "sell(uint8,uint256,uint256)" - ], - "0x476343ee": [ - "withdrawFees()" - ], - "0x59acb42c": [ - "createdAtBlock()" - ], - "0xa157979c": [ - "netOutcomeTokensSold(uint256)" - ], - "0xb0011509": [ - "calcMarketFee(uint256)" - ], - "0xcb4c86b7": [ - "funding()" - ], - "0xe274fd24": [ - "eventContract()" - ], - "0xf6d956df": [ - "buy(uint8,uint256,uint256)" - ], - "0xfbde47f6": [ - "FEE_RANGE()" - ], - "0x27793f87": [ - "outcome()" - ], - "0x717a195a": [ - "setOutcome(int256)" - ], - "0x7e7e4b47": [ - "getOutcome()" - ], - "0xc623674f": [ - "ipfsHash()" - ], - "0xc65fb380": [ - "isSet()" - ], - "0xccdf68f3": [ - "isOutcomeSet()" - ], - "0x4e2f220c": [ - "createCentralizedOracle(bytes)" - ], - "0x5ea194a3": [ - "createScalarEvent(address,address,int256,int256)" - ], - "0x8d1d2c21": [ - "categoricalEvents(bytes32)" - ], - "0x9897e8a5": [ - "scalarEvents(bytes32)" - ], - "0x9df0c176": [ - "createCategoricalEvent(address,address,uint8)" - ], - "0xeac449d9": [ - "revoke(address,uint256)" - ], - "0x7abeb6a0": [ - "createMarket(address,address,uint24)" - ], - "0x42958b54": [ - "issue(address[],uint256)" - ], - "0x061a85c7": [ - "forwardedOracle()" - ], - "0x0853f7eb": [ - "frontRunnerPeriod()" - ], - "0x0f3e9438": [ - "frontRunner()" - ], - "0x1a39d8ef": [ - "totalAmount()" - ], - "0x1a4f5b67": [ - "isFrontRunnerPeriodOver()" - ], - "0x1ff14311": [ - "totalOutcomeAmounts(int256)" - ], - "0x466ae314": [ - "forwardedOutcomeSetTimestamp()" - ], - "0x72b8de14": [ - "isChallengePeriodOver()" - ], - "0x739b8c48": [ - "setForwardedOutcome()" - ], - "0x8ef8125e": [ - "frontRunnerSetTimestamp()" - ], - "0x984a470a": [ - "forwardedOutcome()" - ], - "0x9d89e7d4": [ - "challengeAmount()" - ], - "0x9df4d0fe": [ - "isChallenged()" - ], - "0x9f0de490": [ - "challengeOutcome(int256)" - ], - "0xb2016bd4": [ - "collateralToken()" - ], - "0xc427af9b": [ - "outcomeAmounts(address,int256)" - ], - "0xd84d2a47": [ - "spreadMultiplier()" - ], - "0xf3f480d9": [ - "challengePeriod()" - ], - "0xf7553098": [ - "voteForOutcome(int256,uint256)" - ], - "0xce70faec": [ - "createUltimateOracle(address,address,uint8,uint256,uint256,uint256)" - ], - "0x91e8609f": [ - "getParentId(bytes32,uint256)" - ], - "0xb4a39dfd": [ - "getChildId(bytes32,uint256)" - ], - "0x5de4381b": [ - "_addItemToParent(bytes32,bytes32)" - ], - "0x059417da": [ - "_getAllParentIds(bytes32)" - ], - "0xeca85419": [ - "_getAllChildIds(bytes32)" - ], - "0xaa0372e7": [ - "getItem(bytes32)" - ], - "0xdcf946c2": [ - "getAllParentIds(bytes32)" - ], - "0x1733043f": [ - "getAllChildIds(bytes32)" - ], - "0x025e7c27": [ - "owners(uint256)" - ], - "0x0cbe1eb8": [ - "USDDOWNLOADPRICE()" - ], - "0x11851b5e": [ - "BOARD_3()" - ], - "0x1e9be6a1": [ - "usdEthPrice()" - ], - "0x3c540687": [ - "txCount()" - ], - "0x436da5fe": [ - "transferLog(uint256)" - ], - "0x44fddeb7": [ - "BLOCKAPPS()" - ], - "0x52aaead8": [ - "priceLastUpdated()" - ], - "0x6695b592": [ - "stemPriceInWei()" - ], - "0x7dc0d1d0": [ - "oracle()" - ], - "0x7fa28d75": [ - "transferRightIfApproved(address,bytes32)" - ], - "0x83db0680": [ - "TOTALSHARES()" - ], - "0x977eda79": [ - "txLog(uint256)" - ], - "0xb9488546": [ - "ownersCount()" - ], - "0xcc445611": [ - "purchase(bytes32)" - ], - "0xda60d7e8": [ - "BOARD_2()" - ], - "0xe347a773": [ - "shares(bytes32,bytes32)" - ], - "0xe3d33fc9": [ - "transferCount()" - ], - "0xe80d47dd": [ - "USDSTEMPRICE()" - ], - "0xf267035f": [ - "BOARD_1()" - ], - "0xf7701b47": [ - "downloadPriceInWei()" - ], - "0xf851a440": [ - "admin()" - ], - "0x8a252194": [ - "betGanjilGenap(bool)" - ], - "0xa89171e3": [ - "checkHasilBet(address)" - ], - "0xdd365b8b": [ - "pwn()" - ], - "0x0537665d": [ - "setOutcome()" - ], - "0x28da850b": [ - "buyAllOutcomes(uint256)" - ], - "0x69c19d4c": [ - "getOutcomeTokenDistribution(address)" - ], - "0x6fb1edcd": [ - "sellAllOutcomes(uint256)" - ], - "0x7dc8f086": [ - "getOutcomeCount()" - ], - "0x8abe59ea": [ - "outcomeTokens(uint256)" - ], - "0xad0b2bec": [ - "redeemWinnings()" - ], - "0xe96e5950": [ - "getEventHash()" - ], - "0xf21a1468": [ - "getOutcomeTokens()" - ], - "0x561cce0a": [ - "LONG()" - ], - "0x6e5452fe": [ - "OUTCOME_RANGE()" - ], - "0xa384d6ff": [ - "lowerBound()" - ], - "0xa871da91": [ - "SHORT()" - ], - "0xb09ad8a0": [ - "upperBound()" - ], - "0x0a6fbb05": [ - "SetPass(bytes32)" - ], - "0x31fd725a": [ - "PassHasBeenSet(bytes32)" - ], - "0x6cd5c39b": [ - "deployContract()" - ], - "0xe79487da": [ - "checkInvariant()" - ] -}; \ No newline at end of file + '0x063925c8': ['scheduleCall(bytes,uint256,uint256)'], + '0x523ccfa8': ['isKnownCall(address)'], + '0x0a16697a': ['targetBlock()'], + '0xea8a1af0': ['cancel()'], + '0xae45850b': ['schedulerAddress()'], + '0x3f4be889': ['callContractAddress()'], + '0x62986e27': ['Canary(address,uint16)'], + '0x8129fc1c': ['initialize()'], + '0x4a420138': ['scheduleHeartbeat()'], + '0x3defb962': ['heartbeat()'], + '0x4136aa35': ['isAlive()'], + '0xac9873c7': ['CanaryV7()'], + '0x334dc700': ['CanaryV7Testnet()'], + '0x0b9e9817': ['CanaryV7FastTestnet()'], + '0xecf6eb22': ['setConfigAddress(bytes,address)'], + '0x6099af40': ['setConfigBool(bytes,bool)'], + '0x0baaaed9': ['setConfigBytes(bytes,bytes)'], + '0xa288fb1f': ['setConfigUint(int256,bytes,uint256)'], + '0x9e997121': ['getConfigAddress(bytes)'], + '0x087e055a': ['getConfigBool(bytes)'], + '0xb38415f3': ['getConfigBytes(bytes)'], + '0x015e4f3a': ['getConfigUint(int256,bytes)'], + '0x70480275': ['addAdmin(address)'], + '0x1785f53c': ['removeAdmin(address)'], + '0x43e6125d': ['Badge(address)'], + '0x4e30a66c': ['safeToAdd(uint256,uint256)'], + '0xc74c251f': ['addSafely(uint256,uint256)'], + '0xe74b9d11': ['safeToSubtract(uint256,uint256)'], + '0x3416f9d4': ['subtractSafely(uint256,uint256)'], + '0x70a08231': ['balanceOf(address)'], + '0xa9059cbb': ['transfer(address,uint256)'], + '0x23b872dd': ['transferFrom(address,address,uint256)'], + '0x095ea7b3': ['approve(address,uint256)'], + '0xdd62ed3e': ['allowance(address,address)'], + '0xd35f4a99': ['mint(int256,address,uint256)'], + '0x13af4035': ['setOwner(address)'], + '0x26070774': ['Token(address)'], + '0x80a23ddf': ['mintBadge(int256,address,uint256)'], + '0x2b297f9e': ['registerDao(address)'], + '0x6637b882': ['setDao(address)'], + '0x3f2965f0': ['registerSeller(address)'], + '0xac900c2d': ['unregisterSeller(address)'], + '0x18160ddd': ['totalSupply()'], + '0xdfcbb794': ['TrustFund(address,uint256,address)'], + '0x69d89575': ['releaseFunds()'], + '0xdd2ad311': ['scheduleCall(bytes,uint256)'], + '0x7f497550': ['scheduleTransfer(address,uint256,uint256)'], + '0x1e39499d': ['scheduleCall(address,bytes,uint256)'], + '0x075fe877': ['scheduleCall(address,bytes,uint256,uint256)'], + '0x6b069710': ['scheduleCall(address,bytes,uint256,uint256,uint8)'], + '0xb7aec6a5': ['scheduleCall(address,bytes,uint256,uint256,uint8,uint256)'], + '0xf37b437b': [ + 'scheduleCall(address,bytes,uint256,uint256,uint8,uint256,uint256)' + ], + '0xd826f88f': ['reset()'], + '0x638560cf': ['registerBool(address,bool)'], + '0x9872a20a': ['registerUInt(address,uint256)'], + '0x1fb291cb': ['registerInt(address,int256)'], + '0x9aa26f06': ['registerBytes32(address,bytes)'], + '0x5dcbac7a': ['registerBytes(address,bytes)'], + '0x31b0795c': ['registerAddress(address,address)'], + '0x9c1500f0': [ + 'registerMany(address,uint256,int256,uint256,bytes,address,bytes)' + ], + '0x5bfdc700': ['registerData(address,int256,bytes,address)'], + '0x5dfc2e4a': ['noop()'], + '0x5629c6d9': ['doExecution(address)'], + '0x1db71ffb': ['doLoops(uint256)'], + '0x6558488a': ['scheduleSetBool(address,uint256,bool)'], + '0x6f374a12': ['setBool()'], + '0xa71f94c8': ['scheduleSetUInt(address,uint256,uint256)'], + '0x54fd4d50': ['version()'], + '0x9378a9e2': ['setUInt(uint256)'], + '0x747586b8': ['setInt(int256)'], + '0xe30081a0': ['setAddress(address)'], + '0x46d667db': ['setBytes32(bytes)'], + '0xda359dc8': ['setBytes(bytes)'], + '0xbadbaa3c': ['setCallData()'], + '0x999a9965': ['setMany(uint256,int256,uint256,bytes,address,bytes)'], + '0xf46c50dc': ['doFail()'], + '0x3809c0bf': ['doInfinite()'], + '0x9941e3d0': ['setCallAddress(address)'], + '0xac1b14ff': ['proxyCall(uint256)'], + '0x21835af6': ['__dig(uint256)'], + '0x2e9c5e77': ['doStackExtension(uint256)'], + '0x971c803f': ['getMinimumStackCheck()'], + '0x586a69fa': ['getMaximumStackCheck()'], + '0x98e00e54': ['getCallWindowSize()'], + '0xc0f68859': ['getMinimumGracePeriod()'], + '0x8e46afa9': ['getDefaultGracePeriod()'], + '0x98c9cdf4': ['getMinimumCallGas()'], + '0x26a7985a': ['getMaximumCallGas()'], + '0x96cff3df': ['getMinimumCallCost(uint256,uint256)'], + '0xb152f19e': ['getFirstSchedulableBlock()'], + '0xea27a881': ['getMinimumEndowment(uint256,uint256,uint256,uint256)'], + '0x5548c837': ['Deposit(address,address,uint256)'], + '0x7fcf532c': ['Withdrawal(address,uint256)'], + '0x5c54305e': ['InsufficientFunds(address,uint256,uint256)'], + '0x12c82bcc': ['sendRobust(address,uint256)'], + '0xc6ab4514': ['sendRobust(address,uint256,uint256)'], + '0x6d5433e6': ['max(uint256,uint256)'], + '0xc5699d68': ['_compare(int256,bytes,int256)'], + '0x45fe6e2a': ['Scheduler()'], + '0x3017fe24': ['callAPIVersion()'], + '0xe6470fbe': ['updateDefaultPayment()'], + '0xbbc6eb1f': ['getDefaultDonation()'], + '0x1e74a2d3': ['getMinimumEndowment()'], + '0xaff21c65': ['getMinimumEndowment(uint256)'], + '0xf158458c': ['getMinimumEndowment(uint256,uint256)'], + '0x7c73f846': ['getMinimumEndowment(uint256,uint256,uint256)'], + '0x1b4fa6ab': ['getDefaultStackCheck()'], + '0xdbfef710': ['getDefaultRequiredGas()'], + '0xc3a2c0c3': ['scheduleCall()'], + '0x112e39a8': ['scheduleCall(uint256)'], + '0x67beaccb': ['scheduleCall(bytes)'], + '0xf4bbfd6a': ['scheduleCall(bytes,bytes)'], + '0x04509918': ['scheduleCall(address)'], + '0xa045fdff': ['scheduleCall(address,bytes)'], + '0x4b63e601': ['scheduleCall(address,uint256,bytes)'], + '0xa6cb9e64': ['scheduleCall(address,bytes,bytes)'], + '0x3fbb539d': ['scheduleCall(address,bytes,uint256,bytes)'], + '0xa00aede9': ['scheduleCall(uint256,address)'], + '0xb5b33eda': ['scheduleCall(address,uint256)'], + '0xd8e5c048': ['scheduleCall(address,uint256,uint256)'], + '0x75f45878': ['scheduleCall(bytes,bytes,uint256)'], + '0x349501b7': ['checkDepth(uint256)'], + '0xa0bd3c0f': ['scheduleCall(address,bytes,bytes,uint256)'], + '0xc17e6817': ['sendSafe(address,uint256)'], + '0x76ca0c77': ['scheduleCall(address,bytes,uint256,bytes,uint256)'], + '0xb5d0f16e': ['getGasScalar(uint256,uint256)'], + '0x49942ccb': ['scheduleCall(bytes,bytes,uint256,uint256)'], + '0xf5562753': ['getClaimAmountForBlock(uint256)'], + '0x64bd87d6': ['scheduleCall(address,bytes,bytes,uint256,uint256)'], + '0xa9d2293d': ['lastClaimBlock()'], + '0x0e554bd8': ['scheduleCall(bytes,uint256,uint256,uint8)'], + '0xcc3471af': ['maxClaimBlock()'], + '0xaa497b9d': ['scheduleCall(address,uint256,bytes,uint256,uint256,uint8)'], + '0x0fd1f94e': ['firstClaimBlock()'], + '0x67a59d91': ['scheduleCall(address,bytes,bytes,uint256,uint256,uint8)'], + '0x4571d4c4': [ + 'FutureCall(address,uint256,uint16,address,bytes,bytes,uint256,uint256,uint256)' + ], + '0xc6236a5c': ['scheduleCall(bytes,uint256,uint256,uint8,uint256)'], + '0xc19d93fb': ['state()'], + '0x40953102': [ + 'scheduleCall(address,uint256,bytes,uint256,uint256,uint8,uint256)' + ], + '0x7d298ee3': ['beforeExecute(address,uint256)'], + '0xe7329e71': ['scheduleCall(bytes,bytes,uint256,uint256,uint8,uint256)'], + '0x09b30ed5': ['afterExecute(address)'], + '0xd6eafd08': ['scheduleCall(address,bytes,bytes,uint8,uint256[4])'], + '0x67ce940d': ['getOverhead()'], + '0x991ffd4e': [ + 'scheduleCall(address,bytes,bytes,uint256,uint256,uint8,uint256)' + ], + '0x137c638b': ['getExtraGas()'], + '0xd13d1ace': [ + 'scheduleCall(bytes,bytes,uint16,uint8,uint256,uint256,uint256,uint256,uint256)' + ], + '0xf6b4dfb4': ['contractAddress()'], + '0x38eee93e': ['scheduleCall(address,bytes,bytes,uint16,uint8,uint256[5])'], + '0xca94692d': ['abiSignature()'], + '0x9f927be7': ['getNextCall(uint256)'], + '0x48107843': ['getNextCallSibling(address)'], + '0x4e417a98': ['callData()'], + '0xd62457f6': ['callValue()'], + '0x37f4c00e': ['anchorGasPrice()'], + '0x974654f4': ['requiredGas()'], + '0x2f95b833': ['requiredStackDepth()'], + '0xd379be23': ['claimer()'], + '0x830953ab': ['claimAmount()'], + '0x3233c686': ['claimerDeposit()'], + '0x09241200': ['wasSuccessful()'], + '0xc6803622': ['wasCalled()'], + '0x95ee1221': ['isCancelled()'], + '0x4f059a43': ['getClaimAmountForBlock()'], + '0xb0f07e44': ['registerData()'], + '0x4e71d92d': ['claim()'], + '0x24032866': ['checkExecutionAuthorization(address,uint256)'], + '0x61461954': ['execute()'], + '0x0cb749b6': [ + 'FutureBlockCall(address,uint256,uint8,address,bytes,bytes,uint256,uint256,uint16,uint256,uint256)' + ], + '0x4500054f': ['isCancellable()'], + '0xa3912ec8': ['receiveEther()'], + '0x612e45a3': ['newProposal(address,uint256,string,bytes,uint256,bool)'], + '0xeceb2945': ['checkProposalCode(uint256,address,uint256,bytes)'], + '0xc9d27afe': ['vote(uint256,bool)'], + '0x237e9492': ['executeProposal(uint256,bytes)'], + '0x82661dc4': ['splitDAO(uint256,address)'], + '0x6837ff1e': ['newContract(address)'], + '0x749f9889': ['changeAllowedRecipients(address,bool)'], + '0xe33734fd': ['changeProposalDeposit(uint256)'], + '0xa1da2fb9': ['retrieveDAOReward(bool)'], + '0xcc9ae3f6': ['getMyReward()'], + '0x8a00a82f': ['withdrawRewardFor(address)'], + '0x4e10c3ee': ['transferWithoutReward(address,uint256)'], + '0xdbde1988': ['transferFromWithoutReward(address,address,uint256)'], + '0x78524b2e': ['halveMinQuorum()'], + '0x8d7af473': ['numberOfProposals()'], + '0xbe7c29c1': ['getNewDAOAddress(uint256)'], + '0xfbac3951': ['isBlocked(address)'], + '0x2632bf20': ['unblockMe()'], + '0x0386a016': ['closeProposal(uint256)'], + '0x48027610': ['transferPaidOut(address,address,uint256)'], + '0x8400c307': ['isRecipientAllowed(address)'], + '0x39d1f908': ['actualBalance()'], + '0xf42ac1de': ['minQuorum(uint256)'], + '0xd21b84ac': ['createNewDAO(address)'], + '0xd92ebe46': [ + 'createDAO(address,uint256,uint256,uint256,string,string,uint8)' + ], + '0xebae35a6': ['DAOTokenCreationProxyTransferer(address,address)'], + '0xbe2430fe': ['sendValues()'], + '0x013cf08b': ['proposals(uint256)'], + '0x8bfc2f33': ['delegateDAOTokens(uint256)'], + '0xe417291b': ['undelegateDAOTokens(uint256)'], + '0x4da74ee6': ['setVoteIntention(uint256,bool,bool,string)'], + '0xf98a4eca': ['executeVote(uint256)'], + '0xe49dcee9': ['fixTokens()'], + '0xde0ff7c5': ['getEther()'], + '0xd9fe60f3': ['DTHPool(address,address,uint256,string,string,string)'], + '0xdaa283c8': ['__callback(bytes,string)'], + '0x0221038a': ['payOut(address,uint256)'], + '0x1fd96b69': ['ManagedAccount(address,bool)'], + '0x1adf2d1a': [ + 'Offer(address,address,bytes,uint256,uint256,uint128,uint256)' + ], + '0x1bcad37a': ['getTotalCost()'], + '0x60213b88': ['getInitialWithdrawal()'], + '0x42d16748': ['getMinDailyWithdrawalLimit()'], + '0xd6b4ec12': ['getDailyWithdrawalLimit()'], + '0x262c0b72': ['getPayoutFreezePeriod()'], + '0xb6cb405b': ['getContractor()'], + '0x43bf718e': ['getHashOfTheProposalDocument()'], + '0x0c0662a8': ['getLastWithdrawal()'], + '0xb29ae23f': ['getDateOfSignature()'], + '0x59dc735c': ['getClient()'], + '0x72b75585': ['getOriginalClient()'], + '0xa00ce377': ['getIsContractValid()'], + '0xd44f2d3d': ['getInitialWithdrawalDone()'], + '0x1f7b8622': ['getVotingDeadline()'], + '0x2ca15122': ['sign()'], + '0xedfbf7b6': ['setVotingDeadline(uint256)'], + '0x6a7fc8b7': ['setDailyWithdrawLimit(uint128)'], + '0x0c08bf88': ['terminate()'], + '0x3ccfd60b': ['withdraw()'], + '0x14918f5e': ['performInitialWithdrawal()'], + '0xb6ed9f15': ['PFOffer(address,address,bytes,uint256,uint256,uint128)'], + '0x350d141e': ['getWasApprovedBeforeDeadline()'], + '0x20768ee8': ['getProposalID()'], + '0xffb7bfba': ['watchProposal(uint256)'], + '0xe45ebe93': ['checkVoteStatus()'], + '0x5d268629': ['Refund()'], + '0x29f1bff4': ['withdrawFromChildDAO(uint256)'], + '0x943b0747': [ + 'RewardOffer(address,address,bytes,uint256,uint256,uint128,uint256)' + ], + '0x1632070c': ['setRewardDivisor(uint256)'], + '0xe32e9f22': ['setDeploymentReward(uint256)'], + '0xe9540395': ['getRewardDivisor()'], + '0x525b25b1': ['getDeploymentReward()'], + '0x51cff8d9': ['withdraw(address)'], + '0xbaac5300': ['createTokenProxy(address)'], + '0x590e1ae3': ['refund()'], + '0x1f2dc5ef': ['divisor()'], + '0x69431ab6': ['TokenCreation(uint256,uint256,address,string,string,uint8)'], + '0x36dfe260': ['payOneTimeReward()'], + '0x7842a3a4': ['payReward()'], + '0xadf59f99': ['query(uint256,string,string)'], + '0xc51be90f': ['query_withGasLimit(uint256,string,string,uint256)'], + '0x77228659': ['query2(uint256,string,string,string)'], + '0x85dee34c': ['query2_withGasLimit(uint256,string,string,string,uint256)'], + '0x524f3889': ['getPrice(string)'], + '0x2ef3accc': ['getPrice(string,uint256)'], + '0x60f66701': ['useCoupon(string)'], + '0x688dcfd7': ['setProofType(bytes1)'], + '0x38cc4831': ['getAddress()'], + '0x6b3fdc5a': ['oraclize_setNetwork(uint8)'], + '0x489306eb': ['oraclize_query(string,string)'], + '0x7975c56e': ['oraclize_query(uint256,string,string)'], + '0x056e1059': ['oraclize_query(uint256,string,string,uint256)'], + '0xae152cf4': ['oraclize_query(string,string,uint256)'], + '0x346b306a': ['oraclize_query(string,string,string)'], + '0x5731f357': ['oraclize_query(uint256,string,string,string)'], + '0x65a4dfb3': ['oraclize_query(uint256,string,string,string,uint256)'], + '0x2c85f8e0': ['oraclize_query(string,string,string,uint256)'], + '0xbcf175c8': ['oraclize_cbAddress()'], + '0xd7c26adb': ['oraclize_setProof(bytes1)'], + '0xa6823189': ['parseAddr(string)'], + '0xe8641652': ['strCompare(string,string)'], + '0x8a0807b7': ['indexOf(string,string)'], + '0xff74927b': ['strConcat(string,string)'], + '0x42346c5e': ['parseInt(string)'], + '0xbf4d89b5': ['parseInt(string,uint256)'], + '0xac996e7e': ['resolvePledging()'], + '0x45a3b0bf': ['resolveFailPledge()'], + '0x299e7318': ['resolveVoting()'], + '0x921f98bb': ['resolveFailVote()'], + '0x1afccfa5': ['Proposal(address,address,address,bytes,bool)'], + '0xaed8f3da': ['partsPerBillion(uint256,uint256)'], + '0x1ba326c4': ['calcShare(uint256,uint256,uint256)'], + '0xd630bd53': ['pledgeApprove(uint256)'], + '0x40b31937': ['pledgeDecline(uint256)'], + '0xdacaeb07': ['pledge(bool,uint256)'], + '0x5a9b0b89': ['getInfo()'], + '0x4e69d560': ['getStatus()'], + '0x6386c1c7': ['getUserInfo(address)'], + '0x7daa10ce': ['getMyInfo()'], + '0xd78c20ff': ['voteApprove(uint256)'], + '0x27a5c7c6': ['voteDecline(uint256)'], + '0x10e6e06c': ['vote(bool,uint256)'], + '0x052b81c7': ['releaseBadges()'], + '0xa96f8668': ['releaseTokens()'], + '0xed01bf29': ['budget()'], + '0xdcc0ccf3': ['Dao(address)'], + '0x8a3bc2bc': ['iPropose(bytes,uint256,bool)'], + '0xbade6033': ['propose(bytes,uint256)'], + '0xd205ad7d': ['proposeDissolve(bytes)'], + '0xc7f758a8': ['getProposal(uint256)'], + '0xc89f2ce4': ['funds()'], + '0xc4254c7b': ['CoreWallet()'], + '0xb69ef8a8': ['balance()'], + '0x67c2a360': ['authorizeUser(address)'], + '0x478aa69e': ['unauthorizeUser(address)'], + '0x267c8507': ['authorizeManager(address)'], + '0x17623e5b': ['unauthorizeManager(address)'], + '0xf3fef3a3': ['withdraw(address,uint256)'], + '0xc8c01a55': ['request(address,uint256)'], + '0xb759f954': ['approve(uint256)'], + '0xa0355f4e': ['decline(uint256)'], + '0xfedfd535': ['Config()'], + '0xf697a0ed': ['ppb(uint256,uint256)'], + '0xab519020': ['calcShare(uint256,uint256)'], + '0x6d568c43': ['weiToCents(uint256)'], + '0x4a5dddd2': ['proxyPurchase(address)'], + '0x8de93222': ['purchase(address,uint256)'], + '0x1959a002': ['userInfo(address)'], + '0x85b31d7b': ['myInfo()'], + '0x4551b1d7': ['ProxyPayment(address,address)'], + '0x6d98e9fc': ['totalWei()'], + '0xf0e959f9': ['TokenSales(address)'], + '0xbc126ba1': ['totalCents()'], + '0xdb83694c': ['getSaleInfo()'], + '0xddeae033': ['claimFor(address)'], + '0x0c77a697': ['claimFounders()'], + '0x7d3d6522': ['goalReached()'], + '0x1ed24195': ['getPeriod()'], + '0x0b97bc86': ['startDate()'], + '0x3f5b7675': ['periodTwo()'], + '0xbb7859b5': ['periodThree()'], + '0xc24a0f8b': ['endDate()'], + '0xa4fd6f56': ['isEnded()'], + '0x8d68cf59': ['sendFunds()'], + '0x5bd74490': ['regProxy(address,address)'], + '0x8c0e2a31': ['regProxy(address)'], + '0xb7fba4d3': ['getProxy(address)'], + '0x8006745b': ['getPayout(address)'], + '0xa69df4b5': ['unlock()'], + '0x8c3c4b34': ['getSaleStatus()'], + '0xcea943ee': ['getSaleConfig()'], + '0x034187fd': ['setEthToCents(uint256)'], + '0xb1adc241': ['BalanceDB()'], + '0x6c9c2faf': ['getSupply()'], + '0xf8b2cb4f': ['getBalance(address)'], + '0xe30443bc': ['setBalance(address,uint256)'], + '0x21e5383a': ['addBalance(address,uint256)'], + '0xcf8eeb7e': ['subBalance(address,uint256)'], + '0xd70cf105': ['moveBalance(address,address,uint256)'], + '0xf2371fb3': ['grantGiveableKudos(address,uint256)'], + '0xce79add1': ['givableBalanceOf(address)'], + '0x2b25a7e4': ['giveKudos(address,uint256)'], + '0x1dbf3bc7': ['spend(uint256)'], + '0xda1441cd': ['KudosBank(uint256)'], + '0xf009347d': ['KudosProxy(address)'], + '0xf2fde38b': ['transferOwnership(address)'], + '0xdf32754b': ['owned()'], + '0xb2aac51f': ['lookupUser(string)'], + '0x0e54b872': ['registerUser(string,address)'], + '0xd40a71fb': ['step1()'], + '0x8f4ed333': ['step2()'], + '0xdf4ec249': ['step3()'], + '0xfb5d7376': ['step4()'], + '0x4fb4bcec': ['step5()'], + '0xeb7c6f72': ['step6()'], + '0xbddd3a6b': ['step7()'], + '0xa3221c8e': ['step8()'], + '0x0a9254e4': ['setUp()'], + '0x775c300c': ['deploy()'], + '0x845051d3': ['testContractsNotNull()'], + '0x354b2735': ['testDeploy()'], + '0x9380b8e7': ['testFailAddingMembers()'], + '0xd83a8d11': ['testProposing()'], + '0xc1257bad': ['testPassingAProposal()'], + '0x524e4e61': ['testDistribution()'], + '0xb0166b04': ['testTransferringMkr()'], + '0x867904b4': ['issue(address,uint256)'], + '0x1de38038': ['makercoin(uint256)'], + '0x775a8f5e': ['toBytes(uint256)'], + '0xc490a266': ['toUInt(bytes)'], + '0x1f8947c1': ['extractUint(int256,bytes,uint256,uint256)'], + '0x0761a004': ['step(uint256,bytes)'], + '0x7b352962': ['isFinished()'], + '0xcf31e9fe': ['getOutputHash()'], + '0x3c9a4baa': ['requestOutput(bytes)'], + '0xfd735602': ['executeN()'], + '0xc64e8bc0': ['executeN(uint256)'], + '0x665beae7': ['ExecutableBase(bytes)'], + '0xc58343ef': ['getRequest(uint256)'], + '0x7a479160': ['getRequestArgs(uint256)'], + '0x5944427b': ['getRequestResult(uint256)'], + '0xf95b5a58': ['getInitialAnswer(uint256)'], + '0xcaaf2dd7': ['getInitialAnswerResult(uint256)'], + '0xafc24e3d': ['getChallengeAnswer(uint256)'], + '0x0411bca8': ['getChallengeAnswerResult(uint256)'], + '0x13a396d8': ['getRequiredDeposit(bytes)'], + '0x5023d124': ['TestFactory()'], + '0x9bee757b': ['requestExecution(bytes,uint256)'], + '0x3015394c': ['cancelRequest(uint256)'], + '0x5ea187c9': ['BuildByteArray(bytes)'], + '0xc70d169d': ['answerRequest(uint256,bytes)'], + '0xe10e5dce': ['_build(bytes)'], + '0xa8978434': ['softResolveAnswer(uint256)'], + '0x8143f8a8': ['totalGas(bytes)'], + '0xfcce2622': ['challengeAnswer(uint256,bytes)'], + '0x8e3d4e5e': ['Fibonacci(bytes)'], + '0x7b0383b2': ['initializeDispute(uint256)'], + '0x6dc3edcf': ['executeExecutable(uint256,uint256)'], + '0x05261aea': ['finalize(uint256)'], + '0x96e438a1': ['reclaimDeposit(uint256)'], + '0x29d28aad': ['Broker(address)'], + '0x5d3c1d4c': ['_getRequest(uint256)'], + '0xa6b1caa3': ['gasScalar(uint256)'], + '0xaf29e720': ['remainingGasFund(uint256)'], + '0x6835f32c': ['build(bytes)'], + '0x7ae2b5c7': ['min(uint256,uint256)'], + '0x53770f9a': ['isStateless()'], + '0x9c5d7030': ['reimburseGas(uint256,address,uint256,uint256)'], + '0x5d8227e6': ['FactoryBase(string,string,string)'], + '0xd8f012c6': ['StatelessFactory(string,string,string)'], + '0x03427656': ['getDefaultSoftResolutionBlocks()'], + '0x4f223fe3': ['StatefulFactory(string,string,string)'], + '0xf1448e10': ['requestExecution(bytes)'], + '0x4c0e207a': ['__outputCallback(uint256)'], + '0xd6c19fe0': ['build(bytes,uint256,uint256,address)'], + '0xe59d843a': ['Replicator(bytes,uint256,uint256,address)'], + '0x50c42921': ['replicate()'], + '0xb0604a26': ['schedule()'], + '0xdda3342b': ['ReplicatorFactory()'], + '0xa6b197aa': ['Order(address,uint256)'], + '0x67b830ad': ['fillOrder(uint256)'], + '0x9c7264d7': ['fillOrder(address,uint256)'], + '0xafd8c8c4': ['GasProxy(address,address)'], + '0x16f3cb5e': ['__kill()'], + '0x4d536fe3': ['doit()'], + '0x881be8f7': ['undo()'], + '0x60fe47b1': ['set(uint256)'], + '0x5bec9e67': ['infinite()'], + '0xce869a64': ['fails()'], + '0x1aca00fd': ['variable(uint256)'], + '0xd81ab0c1': ['invoke(uint256,address,address,bytes)'], + '0xf666323e': ['UUIDProvider()'], + '0x60585358': ['getByte()'], + '0x4b0bbf84': ['addEntropy()'], + '0x5404bbf7': ['getEntropy()'], + '0x31757f2e': ['collisionCount()'], + '0x352d2790': ['UUID4()'], + '0xd69450d5': ['setUUID4Bytes(bytes)'], + '0x3ae01f84': ['USDOracle()'], + '0x104d5fdd': ['getPriceProxy()'], + '0x531b97d7': ['oneCentOfWei()'], + '0xb845c9a2': ['WEI()'], + '0x1bf6c21b': ['USD()'], + '0x943a32bc': ['Relay(address)'], + '0x6edbd134': ['hasHash()'], + '0xb00140aa': ['getHash(bytes)'], + '0x54ed7b6e': ['addHash(bytes)'], + '0xe1041d86': ['__throw()'], + '0x25495998': ['getMinimumConsumerDeposit()'], + '0xf1076703': ['getVerificationId(address,bytes,bytes)'], + '0x8e2c6f4d': ['initiateVerification(address,bytes,bytes)'], + '0x5714f6a1': ['getTotalAvailableRelays()'], + '0xd2fb8787': ['recordExists(bytes)'], + '0x8e52cb51': ['getRecordKey(bytes,bytes,bytes)'], + '0x9ee035c9': ['lookupCanonicalFormat(bytes)'], + '0x50ea1932': ['lookupISO3116_1_alpha_2(bytes)'], + '0xfa68b4ce': ['lookupISO3116_1_alpha_3(bytes)'], + '0xd98d011d': ['getCandidateKey(bytes,bytes,bytes,bytes)'], + '0x70b1d9d4': ['requestCanonicalFormat(bytes)'], + '0x27bc39c0': ['submitCanonicalCandidate(bytes,bytes,bytes,bytes)'], + '0xe9dc0614': ['vote(bytes)'], + '0xa553a597': ['configure(uint256,uint256,uint8,address)'], + '0x2852b71c': ['accept()'], + '0x4dc415de': ['reject()'], + '0xc631b292': ['closeVoting()'], + '0x378a2178': ['tallyVotes()'], + '0xbc5d0f65': ['beginExecution()'], + '0x8124bb0f': ['continueExecution()'], + '0xcabd27de': ['Motion(address)'], + '0xcc2c2bcf': ['MotionFactory(string,string,string)'], + '0x6ad2a0b3': ['buildContract(address)'], + '0x0a3b0a4f': ['add(address)'], + '0x29092d0e': ['remove(address)'], + '0xf6a3d24e': ['exists(address)'], + '0xefc81a8c': ['create()'], + '0x207c64fb': ['validate(address)'], + '0x5bb47808': ['setFactory(address)'], + '0x1327d3d8': ['setValidator(address)'], + '0x68f5aa0f': ['setShareholderDB(address)'], + '0x8f99ea43': ['setDividendDB(address)'], + '0x62e05175': ['setMotionDB(address)'], + '0x611f69de': ['__proxy_motion(address,uint256,uint256,bytes)'], + '0x144fa6d7': ['setToken(address)'], + '0x13827950': ['getShareholderDB()'], + '0x299a7bcc': ['setOwner(address,address)'], + '0xf340fa01': ['deposit(address)'], + '0x9555a942': ['withdrawFrom(address,address,uint256)'], + '0x3b8e6f2e': ['balanceAt(address,uint256)'], + '0x3397ca17': ['numBalanceRecords(address)'], + '0xcbf1304d': ['balances(address,uint256)'], + '0x9a97043b': ['depositIdx(address)'], + '0xb9f28076': ['historyIdx(address)'], + '0xa0afd731': ['dividendBalance(address)'], + '0xbbd4e8c9': ['numDeposits()'], + '0xb6b55f25': ['deposit(uint256)'], + '0x311d5a2a': ['recordBalance(address)'], + '0x5437b39b': ['hasUnprocessedDividends(address)'], + '0x57f4d5ec': ['processDividends(address,uint256)'], + '0xe7334156': ['processNextDeposit(address)'], + '0x7f480f9d': ['processDividends(address)'], + '0xb89a73cb': ['isShareholder(address)'], + '0x08933d11': ['getJoinBlock(address)'], + '0xa200dc73': ['getNextShareholder(address)'], + '0xb722a9ef': ['getPreviousShareholder(address)'], + '0xc45aa04c': ['queryShareholders(bytes,uint256)'], + '0xdb29fe12': ['addShareholder(address)'], + '0x9babdad6': ['removeShareholder(address)'], + '0x8e2a6470': ['allocateShares(address,uint256)'], + '0x4d47feaa': ['ShareholderDB(uint256)'], + '0xa4898fd5': ['deployContract(address)'], + '0x96c52fc3': ['____forward(address,uint256,uint256,bytes)'], + '0x567dbf18': ['__forward(address,uint256,uint256,bytes)'], + '0xfd782de5': ['Proxy()'], + '0xb36df681': ['ExecutableBase()'], + '0x6f698fb5': ['setMinimumQuorum(uint256)'], + '0xa140e79c': ['setMinimumDebatePeriod(uint256)'], + '0x00e46700': ['setMinimumPassPercentage(uint8)'], + '0xb7c93330': ['ResourcePoolTester()'], + '0xf59f99ee': ['createNextGeneration()'], + '0x0bebd0f9': ['addAddressToGeneration(address,uint256)'], + '0xf8b11853': ['getGenerationStartAt(uint256)'], + '0x306b031d': ['getGenerationEndAt(uint256)'], + '0x67854643': ['getGenerationMemberLength(uint256)'], + '0x38fff2d0': ['getPoolId()'], + '0xc831391d': ['getPoolOverlapSize()'], + '0x61649472': ['getPoolFreezePeriod()'], + '0xed2b8e0b': ['getPoolRotationDelay()'], + '0xc630f92b': ['canEnterPool()'], + '0x8dd5e298': ['canEnterPool(address)'], + '0x50a3bd39': ['enterPool()'], + '0xffd10e07': ['enterPool(address)'], + '0x5a5383ac': ['canExitPool()'], + '0xb010d94a': ['canExitPool(address)'], + '0x29917954': ['exitPool()'], + '0xba5a2d33': ['exitPool(address)'], + '0xb0171fa4': ['getCurrentGenerationId()'], + '0xa502aae8': ['getNextGenerationId()'], + '0x7772a380': ['isInGeneration(address,uint256)'], + '0x7c47965e': ['isInCurrentGeneration()'], + '0x400aae08': ['isInCurrentGeneration(address)'], + '0x125b8f06': ['isInNextGeneration()'], + '0xd1734eac': ['isInNextGeneration(address)'], + '0x1ae460e5': ['isInPool()'], + '0x8baced64': ['isInPool(address)'], + '0x23306ed6': ['getMinimumBond()'], + '0x3cbfed74': ['getBondBalance()'], + '0x33613cbe': ['getBondBalance(address)'], + '0x741b3c39': ['depositBond()'], + '0xae6c0b03': ['canWithdrawBond(uint256)'], + '0x157ad5a1': ['canWithdrawBond(address,uint256)'], + '0xc3daab96': ['withdrawBond(uint256)'], + '0xeb947f19': ['ExampleResourcePool()'], + '0x2e817963': ['set_sdl(address)'], + '0x8757a2cd': ['test_depth(uint256,uint256)'], + '0x4afce471': ['test_requires_depth(uint16)'], + '0x135217e7': ['requires_depth()'], + '0x05d2f92a': ['check_depth(address,uint256)'], + '0x8e9ccd04': ['computeIndexId(address,bytes)'], + '0xfa80918b': ['computeNodeId(bytes,bytes)'], + '0x996a4be3': ['uintToBytes(uint256,uint256)'], + '0xcc8af0fe': ['bytesToUInt(bytes,bytes)'], + '0xa6f0e577': ['isLeapYear(uint16)'], + '0xb1999937': ['leapYearsBefore(uint256)'], + '0xb238ad0e': ['getDaysInMonth(uint8,uint16)'], + '0xf97d0591': ['parseTimestamp(uint256)'], + '0x92d66313': ['getYear(uint256)'], + '0xa324ad24': ['getMonth(uint256)'], + '0x65c72840': ['getDay(uint256)'], + '0x3e239e1a': ['getHour(uint256)'], + '0xfa93f883': ['getMinute(uint256)'], + '0x8aa001fc': ['getSecond(uint256)'], + '0x4ac1ad78': ['getWeekday(uint256)'], + '0x8c8d98a0': ['toTimestamp(uint16,uint8,uint8)'], + '0x7f791833': ['toTimestamp(uint16,uint8,uint8,uint8)'], + '0x62ba9687': ['toTimestamp(uint16,uint8,uint8,uint8,uint8)'], + '0x9054bdec': ['toTimestamp(uint16,uint8,uint8,uint8,uint8,uint8)'], + '0x136af582': ['next(bytes,bytes,bytes,bytes,bytes,bytes,bytes)'], + '0xa3ec5616': ['next(bytes,bytes,bytes,bytes,bytes,bytes,bytes,uint256)'], + '0x96f0aa8f': ['findNextSecond(uint256,bytes)'], + '0xc60ce271': ['findNextMinute(uint256,bytes)'], + '0x2f7f3ecf': ['findNextHour(uint256,bytes)'], + '0xdcaa5620': ['findNextWeekday(uint256,bytes)'], + '0x54d9d6f8': ['findNextDay(uint256,bytes)'], + '0xb245fc92': ['findNextMonth(uint256,bytes)'], + '0x8e280dce': ['findNextYear(uint256,bytes)'], + '0x7dc5cd32': ['_patternToNumber(bytes)'], + '0x7fc90182': ['Pool(uint256)'], + '0x96ff7e97': ['requestIdentity()'], + '0x998446a8': ['acceptRequest(uint256,bytes)'], + '0x2d7788db': ['rejectRequest(uint256)'], + '0x58e29e17': ['initiateProof()'], + '0x14cabddb': ['joinProof(uint256)'], + '0xae169a50': ['claimReward(uint256)'], + '0xc944a38e': ['CharlyLifeLog(string,int256)'], + '0xb60e72cc': ['log(string,uint256)'], + '0x09a399a7': ['personAdd(string,int256,int256,string)'], + '0x0af658ca': ['personUpdateActivity(uint256,bool)'], + '0x4a9b3f95': ['personUpdateName(uint256,string)'], + '0x0ce3151c': ['personUpdateRelation(uint256,string)'], + '0x61591a7c': ['personUpdateDOB(uint256,int256)'], + '0x98866c1a': ['personUpdateDOD(uint256,int256)'], + '0x524fa7b9': ['whitelistAdd(address)'], + '0xa932ed0d': ['whitelistRemove(address)'], + '0x2e1a7d4d': ['withdraw(uint256)'], + '0xed88c68e': ['donate()'], + '0x33298e25': ['invoke(uint256,uint256)'], + '0x2b30d2b8': ['invoke(uint256)'], + '0xc258ff74': ['List()'], + '0x959ac484': ['push(uint256)'], + '0x2b16b56a': ['setIndex(uint256,uint256)'], + '0x1f7b6d32': ['length()'], + '0x8e7cb6e1': ['getIndex(uint256)'], + '0x57dc9760': ['DaoChallenge()'], + '0x083b2732': ['callback()'], + '0x6d4ce63c': ['get()'], + '0xd09de08a': ['increment()'], + '0xc3ee6311': ['lockAndCall(string)'], + '0xe94acf0e': ['TinyRouter(address)'], + '0x39e525f9': ['resolveCallback(uint256)'], + '0x302d350e': ['firstChainedCallback(uint256)'], + '0x539e2bfb': ['secondChainedCallback(uint256)'], + '0x4f896d4f': ['resolve(uint256)'], + '0x9935935f': ['setResolveHandler(bytes,address)'], + '0x5dc77e26': ['andThen(string,address)'], + '0x7c45ef6c': ['stringToSig(string,string)'], + '0xbf8783e0': ['callAndGetReturn(address,bytes,uint256)'], + '0x9ed93318': ['create(address)'], + '0xd7bb99ba': ['contribute()'], + '0xc98165b6': ['createTarget()'], + '0x6493d7fc': ['CircuitBreaker(address,address,uint256,uint256)'], + '0xb7760c8f': ['transfer(uint256,address)'], + '0xa83627de': ['updatePeriod()'], + '0x8e5d97a2': ['releasePendingTransfer(uint256)'], + '0x66e5cb50': ['stopTransfer(uint256)'], + '0x75862df4': ['TokenWithEStop(address)'], + '0x63a599a4': ['emergencyStop()'], + '0xd0e30db0': ['deposit()'], + '0xe2faf044': ['createDAO(address,uint256,uint256,uint256)'], + '0xcc25decd': [ + 'SampleOffer(address,bytes,uint256,uint256,uint256,uint256,uint256)' + ], + '0x3535cd52': ['setDailyCosts(uint256)'], + '0xd4065763': ['returnRemainingMoney()'], + '0x9b29cb23': ['getDailyPayment()'], + '0xd002462b': ['setDeploymentFee(uint256)'], + '0xea25f24a': ['TokenCreation(uint256,uint256,address)'], + '0x704b6c02': ['setAdmin(address)'], + '0x29090202': ['Resolver(address)'], + '0xd393c871': ['register(string,address,uint256)'], + '0x18b31f94': ['registerLengthFunction(string,string,address)'], + '0x32b12eac': ['setFallback(address)'], + '0xc3b2556d': ['lookup(bytes)'], + '0xdc3f65d3': ['createdByMe()'], + '0x05215b2f': ['createStandardToken(uint256)'], + '0x7102c138': ['Standard_Token(uint256)'], + '0xfe01f1ff': ['TokenTester()'], + '0xa30b5c69': ['AttributeModel()'], + '0xc27d7721': ['create(uint256[101][])'], + '0x67f12ecf': ['validate(address,uint256,uint256[101][])'], + '0x63e38ff3': ['id_for_nym(uint256)'], + '0xcabfb934': ['replace(address)'], + '0xbd119967': ['add_rating(uint256,uint256)'], + '0x8f70009d': ['id_for_address(address,address)'], + '0x3b107682': ['DualIndex()'], + '0x43b0e8df': ['set(uint256,uint256,uint256)'], + '0xf0350c04': ['transfer_ownership(address)'], + '0xb4b9d1f1': ['lookup(uint256,uint256)'], + '0x272cda88': ['EternalDB()'], + '0x06661abd': ['count()'], + '0xcccf7a8e': ['has(uint256)'], + '0x9c851ebc': ['new_entry()'], + '0x505fb46c': ['add(uint256,uint256,uint256)'], + '0x25010816': ['get_length(uint256,uint256)'], + '0x58e59c32': ['get_entry(uint256,uint256,uint256)'], + '0x89029d8c': ['get_all(uint256,uint256)'], + '0x41ee903e': ['clear(uint256,uint256)'], + '0x1a10cfc3': ['delete_entry(uint256,uint256,uint256)'], + '0xf739ed4c': ['id_for_user_version(uint256,uint256)'], + '0x23cd7cd5': ['Model()'], + '0x3fda1281': ['get_keys()'], + '0x41d31feb': ['get_read_only_keys()'], + '0x582ca57b': ['get_associations()'], + '0x8ee21b8e': ['get_default_keys()'], + '0xeb121e2f': ['update(uint256,uint256[101][])'], + '0x595da94d': ['has_owners(uint256)'], + '0xd716222c': ['is_owner(uint256,address)'], + '0xb56b2627': ['add_owner(uint256,address)'], + '0x9d118770': ['destroy(uint256)'], + '0xdb6fcf01': ['is_destroyed(uint256)'], + '0xebd83378': ['get_blocks_for(uint256)'], + '0x49fb2dc5': ['add_to_association(uint256,uint256,uint256)'], + '0xe2deaa81': ['set_reference(uint256,uint256,uint256)'], + '0xf99ff4df': ['paged(uint256,uint256)'], + '0xa60bbcd3': ['ModelCoordinator()'], + '0x702fc7da': ['ReviewModel()'], + '0xe299beb3': ['SimpleIndex()'], + '0x1ab06ee5': ['set(uint256,uint256)'], + '0x0a874df6': ['lookup(uint256)'], + '0x39246d75': ['VersionModel()'], + '0x5c8a1053': ['extend(string)'], + '0x43d726d6': ['close()'], + '0x00ce2057': ['triggerPayment()'], + '0x4a3b0eec': ['authorizeOpen(uint256,bool,string)'], + '0xfdc4b338': ['authorizeExtension(uint256,bool,string)'], + '0x59d96db5': ['terminate(uint256,string)'], + '0x8ae475a9': ['notorize(string)'], + '0xb5d1990d': ['numRecords()'], + '0x4fb2e45d': ['transferOwner(address)'], + '0x29c08ba2': ['payPremium()'], + '0x0220a5b4': ['terminate(string)'], + '0x83f95f13': ['openClaim(string)'], + '0x1c1b8772': ['update(address)'], + '0xe6cb9013': ['safeAdd(uint256,uint256)'], + '0xa293d1e8': ['safeSub(uint256,uint256)'], + '0x6241bfd1': ['Token(uint256)'], + '0x0aa7881a': ['MintableToken(int256,uint256)'], + '0x27e056a5': ['addMinter(int256,address)'], + '0xad2fea7c': ['removeMinter(int256,address)'], + '0x1f3a3a53': ['mint(int256,uint256)'], + '0x2c7c4549': ['PurchasableToken(uint256)'], + '0x6a61e5fc': ['setTokenPrice(uint256)'], + '0xefef39a1': ['purchase(uint256)'], + '0x2f30283e': ['testSomething()'], + '0x3e5087cc': ['testBasicThing()'], + '0x4bbb216c': ['_target(address)'], + '0xa163a624': ['Test()'], + '0xa9cc4718': ['fail()'], + '0x0c9fd581': ['assertTrue(bool)'], + '0x5eb3f639': ['assertTrue(bool,bytes)'], + '0xa5982885': ['assertFalse(bool)'], + '0x16cb9a01': ['assertFalse(bool,bytes)'], + '0xf578fd85': ['assertEq0(bytes,bytes)'], + '0x7fa22001': ['assertEq0(bytes,bytes,bytes)'], + '0xd1af8a5a': ['LinkerExample()'], + '0x8af784dc': ['expectEventsExact(address)'], + '0xd38159b8': ['testPass()'], + '0x04d91c6a': ['testFail()'], + '0xc813c30e': ['testThrowSomething()'], + '0xfac34ff6': ['throwFoo()'], + '0x7fcf3a2f': ['throwFooBar()'], + '0x0db73c72': ['noevent()'], + '0x4f9d719e': ['testEvent()'], + '0x8bbb5af7': ['test1Fails()'], + '0x88a1e895': ['test2Fails()'], + '0xfdc193a4': ['test3Fails()'], + '0xdbecc372': ['Example(uint256)'], + '0x934bc29d': ['exampleFunction(uint256)'], + '0x3c67c51e': ['testLogs()'], + '0xe44d3084': ['testFailure()'], + '0x94bcdb4c': ['Example2()'], + '0xa677fbd9': ['example2Func()'], + '0x773c84ee': ['exec(address,bytes,uint256,uint256)'], + '0xf3541901': ['execute(address,bytes,uint256,uint256)'], + '0x1b437d0c': ['compareLastCalldata(bytes)'], + '0xdcfa9cc0': ['testProxyCall()'], + '0x2d2c44f2': ['Vault()'], + '0x0b6142fc': ['breach()'], + '0x6c050eae': ['look()'], + '0x04a2b2c2': ['testOwnerCanBreach()'], + '0x94a1710d': ['testNonOwnerCantBreach()'], + '0xb4c4e005': ['testTransferToAcceptAuthority()'], + '0xe17e1274': ['testTransferToRejectAuthority()'], + '0x2b1071c9': ['testTransferToNullAuthority()'], + '0xf0f967e8': ['canCall(address,address,bytes)'], + '0xe6d95eb8': ['DSAuthorized()'], + '0x57e6c2f4': ['isAuthorized()'], + '0xe2b178a0': ['getAuthority()'], + '0x6cd22eaf': ['updateAuthority(address,bool)'], + '0xfe9fbb80': ['isAuthorized(address)'], + '0x3c716e08': ['updateAuthority(address)'], + '0xed62cf1f': ['setCanCall(address,address,bytes,bool)'], + '0xc37e8cb2': ['testExportAuthorized()'], + '0xb870ecbb': ['testNormalWhitelistAdd()'], + '0x19f02ceb': ['set(address,address,uint256)'], + '0xd81e8423': ['get(address,address)'], + '0xf639365d': ['testSetGet()'], + '0x8b95ec0c': ['testAddBalance()'], + '0x6dbe31eb': ['testSubBalance()'], + '0x65f27bea': ['testSubBalanceFailsBelowZero()'], + '0xce220ecf': ['testAddBalanceFailsAboveOverflow()'], + '0x1bf20668': ['testAdminTransfer()'], + '0xd6d7d525': ['get(bytes)'], + '0xa18c751e': ['set(bytes,bytes)'], + '0x73e1743a': ['buildDSBasicAuthority()'], + '0x7d4cf602': ['buildDSBalanceDB()'], + '0xacf4280c': ['buildDSApprovalDB()'], + '0x089e0ad0': ['buildDSMap()'], + '0x2bed55b0': ['buildDSEasyMultisig(uint256,uint256,uint256)'], + '0x3647b87a': ['buildFactory()'], + '0x9e2262f5': ['testCreateCostData()'], + '0x386fcda8': ['testCreateCostToken()'], + '0x4e6ba0a9': ['testCreateCostMultisig()'], + '0x7c05caf3': ['testCreateCostAuth()'], + '0x5b067cce': ['testCreateCostMain()'], + '0xb06eb03f': ['DSEasyMultisig(uint256,uint256,uint256)'], + '0xca6d56dc': ['addMember(address)'], + '0xa230c524': ['isMember(address)'], + '0xf6d5959b': ['getActionStatus(uint256)'], + '0xff1b4341': ['easyPropose(address,uint256,uint256)'], + '0x268bb78e': ['propose(address,bytes,uint256,uint256)'], + '0xba0179b5': ['confirm(uint256)'], + '0xed684cc6': ['trigger(uint256)'], + '0xa6b206bf': ['doSomething(uint256)'], + '0xbca86986': ['testSetup()'], + '0x11d12402': ['testEasyPropose()'], + '0x246c02e6': ['check_depth(uint16)'], + '0x44602a7d': ['testFallbackReturn()'], + '0xbe45fd62': ['transfer(address,uint256,bytes)'], + '0x1b00fe51': ['testHypothesis()'], + '0xf06186c7': ['testReality()'], + '0xb09bc3bf': ['try_to_get()'], + '0xdabf7ec4': ['helper(uint256)'], + '0x8040cac4': ['testOverflow()'], + '0x828d671c': ['dyn_sig()'], + '0xe2f8feb2': ['internal_tester(int256)'], + '0xe0ad411d': ['assets(bytes)'], + '0x18178358': ['poke()'], + '0x6b1feeeb': ['get_my_sig()'], + '0xd57a12f5': ['testCheckSigs()'], + '0x60b431a4': ['testGetSig()'], + '0x189c94ae': ['testFallbackStaticSig()'], + '0x22017c5f': ['DSTokenBase(uint256)'], + '0xbeabacc8': ['transfer(address,address,uint256)'], + '0x15dacbea': ['transferFrom(address,address,address,uint256)'], + '0xe1f21c67': ['approve(address,address,uint256)'], + '0x003074ff': ['getFrontend()'], + '0xc971442c': ['getDBs()'], + '0x4956eaf0': ['deploy(address,uint256)'], + '0xf6c5c80d': ['cleanUp()'], + '0xb17b94c1': ['testSystem()'], + '0xe23941bc': ['testDepositWithdraw()'], + '0x1334a5e2': ['eventCallback(uint8,address,address,uint256)'], + '0x3018205f': ['getController()'], + '0x7fe1dc7e': ['getToken(bytes)'], + '0xef3a6031': ['testBaseToken()'], + '0xb085b9a5': ['Example()'], + '0x55241077': ['setValue(uint256)'], + '0x20965255': ['getValue()'], + '0x29d017b5': ['TestWithConstructor(address,uint256[])'], + '0x4b64e492': ['execute(address)'], + '0xf4b103d4': ['SimpleStorage(uint256)'], + '0xfc0c546a': ['token()'], + '0x90b98a11': ['sendCoin(address,uint256)'], + '0x01cb3b20': ['checkGoalReached()'], + '0xc0d2834b': ['DataSource()'], + '0x4b0697e4': ['Manager(address)'], + '0x044215c6': ['token(uint256)'], + '0x299e6b07': ['Wallet(address)'], + '0x93423e9c': ['getAccountBalance(address)'], + '0xbe999705': ['addFunds(uint256)'], + '0xbc4b3365': ['addFunds(address,uint256)'], + '0xa1a66e56': ['deductFunds(uint256)'], + '0x8d72a473': ['deductFunds(address,uint256)'], + '0x08aba5aa': ['setAccountBalance(uint256)'], + '0x46ddb7db': ['setAccountBalance(address,uint256)'], + '0xdb4cacec': ['Other()'], + '0x84a7b223': ['Canary(address)'], + '0x5c634241': ['CanaryV6()'], + '0xb5d3a379': ['CanaryTestnet()'], + '0x41868769': ['CallAborted(address,bytes)'], + '0x6560a307': ['suggestedGas()'], + '0xeec2b628': ['beforeExecute(address)'], + '0x980e8c81': [ + 'FutureBlockCall(address,uint256,uint8,address,bytes,uint256,uint256,uint256)' + ], + '0x08f235ec': ['getDefaultPayment()'], + '0x21bacf28': ['getDefaultFee()'], + '0x75c589a0': ['getMinimumCallCost()'], + '0x6822abae': ['getMinimumCallCost(uint256)'], + '0x2635f4de': ['registerLibrary(bytes,address)'], + '0xc5ae6e0e': ['Kernal()'], + '0x2030f721': ['num_objects()'], + '0xc4bd8ebc': ['num_monsters()'], + '0xc13afa91': ['object_locations(uint256)'], + '0x1d5a9f3f': ['object_types(uint256)'], + '0xc0576b73': ['monsters(uint256)'], + '0xc368109c': ['monster_hp(uint256)'], + '0xa01bc729': ['monster_attack(uint256)'], + '0x75160a20': ['pay_royalties()'], + '0x26121ff0': ['f()'], + '0xaef99eef': ['Game()'], + '0xe604cf9f': ['get_all_squares()'], + '0xbe600276': ['move(uint16)'], + '0xf651bf44': ['move_to(uint16)'], + '0xa5f3c23b': ['add(int256,int256)'], + '0x37c390e3': ['allow_move(uint16)'], + '0xdcf537b1': ['multiply7(int256)'], + '0x16216f39': ['return13()'], + '0x6ed7c013': ['move_monsters()'], + '0xcec7260b': ['move_monster(uint16,uint16)'], + '0xecb98714': ['random_damage(uint256)'], + '0x2d8c1c35': ['level_up()'], + '0xf504e0da': ['load_level(uint16)'], + '0x99753de7': ['clear_level()'], + '0xde5d953a': ['logSingleIndex(bytes,bytes,uint256)'], + '0xb409da05': ['logDoubleIndex(bytes,bytes,bytes,uint256)'], + '0xb29a0308': ['logAnonymous(bytes,bytes,bytes,uint256)'], + '0x5f515226': ['checkBalance(address)'], + '0x7eaef50c': ['over()'], + '0x12c8052f': ['won()'], + '0x21970c0c': ['pay_royalty()'], + '0x4c1b2446': ['transmitInteger(address,bytes,bytes,uint256,uint16)'], + '0x42909a9e': ['create_game()'], + '0xe54d4051': ['receiveInteger(bytes,uint256,uint16)'], + '0x8365172c': ['num_levels()'], + '0x3ced842b': ['make_offer()'], + '0x48db5f89': ['player()'], + '0x6896fabf': ['getAccountBalance()'], + '0x5b86914d': ['bet_value()'], + '0x6e8dad74': ['retrieveAccountBalance(bytes,bytes)'], + '0x6d705ebb': ['register(address,uint256)'], + '0x46b5e202': ['set_num_levels(uint256,uint256)'], + '0xbfad16f4': ['new_offer(uint256,uint256)'], + '0x97d47a60': ['registerAccountant(bytes,address)'], + '0x19b05f49': ['accept(uint256)'], + '0xdf3c8620': ['num_challenges()'], + '0xc3d0a564': ['getAccountBalance(bytes)'], + '0xf249cf19': ['get_all_challenges()'], + '0x340f5e4e': ['get_all_num_levels()'], + '0x407cfe5e': ['get_all_players()'], + '0xd1a8d447': ['get_all_bet_values()'], + '0x7140bdf3': ['get_all_best_offers()'], + '0x6677febe': ['get_all_accepted()'], + '0x5718b994': ['checkEvent(address,bytes,bytes,uint256)'], + '0xf51cbc72': ['Level()'], + '0x7cb97b2b': ['set_owner(address)'], + '0x7212b67e': ['add_potion(uint16)'], + '0xdd729530': ['add_shield(uint16)'], + '0xcc2c5453': ['add_sword(uint16)'], + '0xf3c37bd5': ['Verifier(address,uint256,uint8)'], + '0xf262de8c': ['add_staircase(uint16)'], + '0x62c335c1': ['checkCallback(address,uint256,bytes,bytes)'], + '0xe97b2190': ['add_wall(uint16)'], + '0x37a6b9f8': ['recordCallback(address,uint256,bytes,bytes)'], + '0x79216f5f': ['add_monster(uint16,uint16,uint16)'], + '0x52efea6e': ['clear()'], + '0x4bb278f3': ['finalize()'], + '0xb651cbaf': ['add_level(address,bytes)'], + '0xc985c221': ['get_all_levels()'], + '0x309424fe': ['get_all_names()'], + '0x7365870b': ['bet(uint256)'], + '0xdf25ee23': ['getIndexId(address,bytes)'], + '0x8963dab4': ['getNodeId(bytes,bytes)'], + '0x0c5c2ca3': ['getIndexName(bytes)'], + '0x337c1e28': ['getIndexRoot(bytes)'], + '0xf64fca2e': ['getNodeId(bytes)'], + '0xaa272d4b': ['getNodeIndexId(bytes)'], + '0x5ca1c5a0': ['getNodeValue(bytes)'], + '0x662dbe96': ['getNodeHeight(bytes)'], + '0x3517a740': ['getNodeParent(bytes)'], + '0xc1b056b0': ['getNodeLeftChild(bytes)'], + '0x4296a9cb': ['getNodeRightChild(bytes)'], + '0xb0aab296': ['getNextNode(bytes)'], + '0x1b370abb': ['getPreviousNode(bytes)'], + '0x3943807b': ['insert(bytes,bytes,int256)'], + '0xbea124a6': ['query(bytes,bytes,int256)'], + '0xb7bae9b7': ['exists(bytes,bytes)'], + '0x69573648': ['remove(bytes,bytes)'], + '0xb7e24979': ['addThing(bytes)'], + '0xe51ff1fc': ['iterateOverThings()'], + '0x69307c80': ['rotateBits(bytes,int256)'], + '0x6506b623': ['rotateBitsLeft(bytes,uint256)'], + '0x109df68e': ['rotateBitsRight(bytes,uint256)'], + '0xc02f081a': ['shiftBits(bytes,int256)'], + '0x5e07f240': ['shiftBitsLeft(bytes,uint256)'], + '0xff27c476': ['shiftBitsRight(bytes,uint256)'], + '0x15e33901': ['digest(bytes,uint256)'], + '0x41c0e1b5': ['kill()'], + '0x780900dc': ['create(uint256)'], + '0xa1e4d3c2': ['MembershipRoster()'], + '0x76d690bb': ['BountyList()'], + '0x0b1ca49a': ['removeMember(address)'], + '0xee2af3fb': ['set_factory(address)'], + '0x5fb64fd6': ['checkMembership(address)'], + '0x10c4e8b0': ['all()'], + '0x85654c9c': ['setMembershipRoster(address)'], + '0xeb95b7d5': ['Bounty(address,address)'], + '0x0b7e9c44': ['payout(address)'], + '0x92e9fd5e': ['ColdWallet(address,address)'], + '0x8a4fb16a': ['getWithdrawal(uint256)'], + '0xd845a4b3': ['request(uint256)'], + '0xfe0d94c1': ['execute(uint256)'], + '0xf3b50c04': ['rescind()'], + '0x49c15bd9': ['Purchase()'], + '0x35a063b4': ['abort()'], + '0xd6960697': ['confirmPurchase()'], + '0x73fac6f0': ['confirmReceived()'], + '0xda0774ad': ['getCallFeeScalar(uint256,uint256)'], + '0x4c33fe94': ['cancel(address)'], + '0xc032dc30': ['execute(uint256,address)'], + '0x6a704d7b': ['AddedToGeneration(address,uint256)'], + '0xf1173928': ['RemovedFromGeneration(address,uint256)'], + '0x345006b6': ['getGenerationForCall(address)'], + '0xb3559460': ['getGenerationSize(uint256)'], + '0xa6c01cfd': ['isInGeneration(uint256)'], + '0x04dd69fa': ['getGenerationIdForCall(address)'], + '0x5a8dd79f': ['getDesignatedCaller(address,uint256)'], + '0xdc75f2db': ['multiowned(address[],uint256)'], + '0x0b467b9b': ['revoke(bytes)'], + '0xf00d4b5d': ['changeOwner(address,address)'], + '0x7065cb48': ['addOwner(address)'], + '0x173825d9': ['removeOwner(address)'], + '0xba51a6df': ['changeRequirement(uint256)'], + '0x2f54bf6e': ['isOwner(address)'], + '0x3b49a77b': ['hasConfirmed(bytes,address)'], + '0xe88b8ac6': ['confirmAndCheck(bytes)'], + '0xc1812b15': ['reorganizeOwners()'], + '0x5f6a1301': ['clearPending()'], + '0xae99847b': ['daylimit(uint256)'], + '0xb20d30a9': ['setDailyLimit(uint256)'], + '0x5c52c2f5': ['resetSpentToday()'], + '0x180aadb7': ['underLimit(uint256)'], + '0xb74e452b': ['today()'], + '0xb61d27f6': ['execute(address,uint256,bytes)'], + '0xf2ddc772': ['confirm(bytes)'], + '0xc4ff3614': ['Wallet(address[],uint256,uint256)'], + '0xcbf0b0c0': ['kill(address)'], + '0xe854dfb4': ['Order(address,uint256,uint256)'], + '0x4c0bcfe5': ['getTransferableBalance(address)'], + '0x8f367001': ['numTokensAbleToPurchase()'], + '0x370ec1c5': ['_fillOrder(address,uint256)'], + '0xd9feeeb6': ['fillMyOrder(uint256)'], + '0xfcc6b5d5': ['fillTheirOrder(address)'], + '0x39f4debc': ['fillOrderAuto()'], + '0x9a1b420b': ['OraclizeAddrResolver()'], + '0xd1d80fdf': ['setAddr(address)'], + '0x0e1ca8a5': ['Oraclize()'], + '0xa2ec191a': ['addDSource(string,uint256)'], + '0x62b3b833': ['createCoupon(string)'], + '0xa8239d0b': ['getPrice(string,address)'], + '0xbf1fe420': ['setGasPrice(uint256)'], + '0x8579cbde': ['getPrice(string,uint256,address)'], + '0xde4b3262': ['setBasePrice(uint256)'], + '0x7d242ae5': ['setBasePrice(uint256,bytes)'], + '0x81ade307': ['query(string,string)'], + '0x45362978': ['query1(string,string)'], + '0xe839e65e': ['query2(string,string,string)'], + '0x23dc42e7': ['query1(uint256,string,string)'], + '0xae815843': ['query(uint256,string,string,uint256)'], + '0x5c242c59': ['query1(uint256,string,string,uint256)'], + '0x7e1c4205': ['query2(uint256,string,string,string,uint256)'], + '0x75700437': ['query1_withGasLimit(uint256,string,string,uint256)'], + '0xb303dcbd': ['Owned()'], + '0x32e7c5bf': ['B()'], + '0xc6888fa1': ['multiply(uint256)'], + '0xf8a8fd6d': ['test()'], + '0x78710d37': ['seven()'], + '0xe1bedf2a': ['AlarmTester(address)'], + '0xb29f0835': ['doIt()'], + '0x185061da': ['undoIt()'], + '0xdd012a15': ['setIt(uint256)'], + '0x22beb9b9': ['scheduleDoIt(uint256)'], + '0xd6b44859': ['scheduleUndoIt(uint256)'], + '0x245a03ec': ['scheduleSetIt(uint256,uint256)'], + '0x7429c086': ['repeat()'], + '0x553cc48d': ['Player(string)'], + '0x37b7bf11': ['Tile(int256,int256)'], + '0x2d67bb91': ['World()'], + '0xead710c4': ['greet(string)'], + '0x0f4cf692': ['numMessages()'], + '0xc633084f': ['sendGreeting(address,string)'], + '0xc6e1c178': ['TheLuckyOne(bytes)'], + '0xf18d20be': ['adminWithdraw()'], + '0x4faa2d54': ['getTimeElapsed()'], + '0xe8223468': ['sha3clone(bytes)'], + '0xa59d6986': ['recoverLostFunds()'], + '0xc535165f': ['revealAndPayout(bytes,bytes)'], + '0xf1eae25c': ['mortal()'], + '0xfaf27bca': ['greeter(string)'], + '0xcfae3217': ['greet()'], + '0xb51c4f96': ['getCodeSize(address)'], + '0x95978868': ['strConcat(string,string,string,string,string)'], + '0x45e965cd': ['strConcat(string,string,string,string)'], + '0x4112987c': ['strConcat(string,string,string)'], + '0xf5c98aff': ['GreeterB(bytes)'], + '0x3bc5de30': ['getData()'], + '0x9c1193ea': ['GreeterA(bytes)'], + '0x905e6e42': ['JSON_Test()'], + '0x1e26fd33': ['setBool(bool)'], + '0x9a19a953': ['setInt8(int8)'], + '0x4dfd1b02': ['setUint8(int8,uint8)'], + '0xa53b1c1e': ['setInt256(int256)'], + '0xec21a913': ['setUint256(int256,uint256)'], + '0x6cc5fdaa': ['setBytes32(bytes,bytes)'], + '0x12a7b914': ['getBool()'], + '0x57cb2fc4': ['getInt8()'], + '0x4a41e045': ['getUint8(int8)'], + '0xf5b53e17': ['getInt256()'], + '0xed180443': ['getUint256(int256)'], + '0x1f903037': ['getBytes32()'], + '0x65538c73': ['fireEventLog0()'], + '0xa6780857': ['fireEventLog0Anonym()'], + '0xb61c0503': ['fireEventLog1()'], + '0x4e7ad367': ['fireEventLog1Anonym()'], + '0x102accc1': ['fireEventLog2()'], + '0x76bc21d9': ['fireEventLog2Anonym()'], + '0xf38b0600': ['fireEventLog3()'], + '0xe8beef5b': ['fireEventLog3Anonym()'], + '0xfd408767': ['fireEventLog4()'], + '0x9dc2c8f5': ['fireEventLog4Anonym()'], + '0x2839e928': ['ackermann(uint256,uint256)'], + '0x61047ff4': ['fibonacci(uint256)'], + '0xdbbdf083': ['register(uint256,address)'], + '0xa02b161e': ['unregister(uint256)'], + '0x5fd4b08a': ['getName(address)'], + '0x1c4e6cd0': ['NameReg()'], + '0xe79a198f': ['unregister()'], + '0xf5c57382': ['nameOf(address)'], + '0xc47cf5de': ['getAddress(bytes)'], + '0x82fbdc9c': ['register(bytes)'], + '0x034cb28e': ['addressOf(address,bytes)'], + '0xf004b12b': ['CrowdFund(uint256,uint256,address)'], + '0x9bb01b5f': ['ElcoinDb(address)'], + '0x893d20e8': ['getOwner()'], + '0xab470f05': ['getCaller()'], + '0xbeb92f55': ['setCaller(address)'], + '0xf3125a1f': ['deposit(address,uint256,bytes,uint256)'], + '0x9483e91a': ['withdraw(address,uint256,bytes,uint256)'], + '0x3b343a13': ['getNodeAddress(bytes)'], + '0x7bfaad96': ['addNode(bytes,address)'], + '0xca3b5c91': ['hasRelation(bytes,bytes,address)'], + '0xba45b0b8': ['transfer(address,address)'], + '0xf8b71c64': ['rewardTo(address,uint256)'], + '0xfbf1f78a': ['unapprove(address)'], + '0x5184ffc9': ['setAmbiAddress(address,bytes)'], + '0xa7f43779': ['remove()'], + '0x444dd6f3': ['Elcoin()'], + '0x4a606c53': ['_db()'], + '0x9b9d0364': ['_setFeeStructure(uint256,uint256,uint256)'], + '0x99a5d747': ['calculateFee(uint256)'], + '0x63f80de3': ['issueCoin(address,uint256,uint256)'], + '0x88d695b2': ['batchTransfer(address[],uint256[])'], + '0xaa64c43b': ['transferPool(address,address,uint256)'], + '0xc71cbcf3': ['recoverAccount(address,address)'], + '0xb2855b4f': ['setFeeAddr(address)'], + '0x5b65b9ab': ['setFee(uint256,uint256,uint256)'], + '0x3f2f1596': ['setupTreasury(address,uint256)'], + '0x24c65f35': ['updateRefundGas()'], + '0x8f0c724c': ['setOperationsCallGas(uint256)'], + '0x23df9df5': ['_refund(uint256)'], + '0xd449ce7c': ['Administered()'], + '0xa925d85e': ['Exchange(address,address)'], + '0xf34c7010': ['commitSecurity(address,uint256,uint256)'], + '0x6d09e2ec': ['commitCurrency(address,uint256,uint256)'], + '0x144267e0': ['refundSecurity(address,uint256,uint256)'], + '0xc9cfac55': ['refundCurrency(address,uint256,uint256)'], + '0xa5b1e13d': ['settle(address,address,uint256,uint256)'], + '0x1d8ae626': ['Security(string,string)'], + '0xc74e907b': ['commit(address,uint256,uint256)'], + '0x60708ae3': ['issueAndCommit(address,address,uint256,uint256)'], + '0x68f2ab8e': ['Currency(string,string)'], + '0xb21bce4c': ['vote(bytes,bool)'], + '0x3b143184': ['Congress(uint256,uint256,int256,address)'], + '0x9644fcbd': ['changeMembership(address,bool,string)'], + '0xbcca1fd3': ['changeVotingRules(uint256,uint256,int256)'], + '0xb1050da5': ['newProposal(address,uint256,string,bytes)'], + '0xd3c0715b': ['vote(uint256,bool,string)'], + '0xbcc6092a': ['MyEtherBank()'], + '0xd917deb5': ['Donate()'], + '0xb774d3d7': ['BankOwner_GetDonationsBalance()'], + '0x07718a3b': ['BankOwner_WithdrawDonations()'], + '0x2dae9878': ['BankOwner_EnableConnectBankAccountToNewOwnerAddress()'], + '0x9be1fcee': ['BankOwner_DisableConnectBankAccountToNewOwnerAddress()'], + '0x32829a23': ['OpenBankAccount()'], + '0x25f3da52': ['GetBankAccountNumber()'], + '0xcf2e3efc': ['GetBankAccountBalance()'], + '0x9a9c9c53': ['DepositToBankAccount()'], + '0x62b24189': ['DepositToBankAccountFromDifferentAddress(uint32)'], + '0x13651124': ['WithdrawAmountFromBankAccount(uint256)'], + '0x85c7a953': ['WithdrawFullBalanceFromBankAccount()'], + '0x19663f7f': ['TransferAmountFromBankAccountToAddress(uint256,address)'], + '0xaf27c7b3': ['Security_HasPasswordSha3HashBeenAddedToBankAccount()'], + '0xb45c48dc': ['Security_AddPasswordSha3HashToBankAccount(bytes)'], + '0x766a3f2e': ['Security_ConnectBankAccountToNewOwnerAddress(uint32,string)'], + '0xf6232556': [ + 'Security_GetNumberOfAttemptsToConnectBankAccountToANewOwnerAddress()' + ], + '0x671fa0a0': ['Inscription(string)'], + '0xd6af9411': ['Rouleth()'], + '0x31119b4d': ['changeDeveloper(address)'], + '0xc87b36ed': ['disableBetting()'], + '0x5fa21f1f': ['enableBetting()'], + '0x63a8dac2': [ + 'changeSettings(uint256,uint256,uint256,uint8,uint256,uint256,uint8,uint8)' + ], + '0x2888f9d0': ['updateMaxBet()'], + '0x53f818d6': ['checkBetValue()'], + '0xb8cf14e7': ['updateStatusPlayer()'], + '0xb400d149': ['betOnNumber(uint8)'], + '0x5b7d47a9': ['betOnColor(bool,bool)'], + '0xadf54e0c': ['betOnLowHigh(bool,bool)'], + '0xb738169c': ['betOnOddEven(bool,bool)'], + '0xbfe8c107': ['betOnDozen(bool,bool,bool)'], + '0xe548cf13': ['betOnColumn(bool,bool,bool)'], + '0xd02bf162': ['spinTheWheel()'], + '0x403abbc7': ['updateFirstActiveGamble()'], + '0x021c309a': ['solveBet(address,uint8,bool,uint8)'], + '0x86269a88': ['checkBetNumber(uint8)'], + '0x57006864': ['checkBetParity(uint8)'], + '0xf80b3cfa': ['checkBetLowhigh(uint8)'], + '0xc1ae4044': ['checkBetColor(uint8)'], + '0xc124e2ea': ['checkBetDozen(uint8)'], + '0x06c1df7b': ['checkBetColumn(uint8)'], + '0xe8b5e51f': ['invest()'], + '0x2037fcbf': ['withdrawInvestment(uint256)'], + '0xb18c6847': ['manualUpdateBalances()'], + '0x6f3fe404': ['updateBalances()'], + '0x2c6b2c92': ['checkProfitLossSinceInvestorChange()'], + '0xf7ae9421': ['checkInvestorBalance(address)'], + '0x6ed43eb0': ['getInvestorList(uint256)'], + '0xf9e27106': ['investmentEntryCost()'], + '0x85b4bb53': ['getSettings()'], + '0xa0e2abf7': ['getFirstActiveGamble()'], + '0x942385eb': ['getPayroll()'], + '0x6e1b6bcc': ['checkMyBet(address)'], + '0xbcb3b5d2': ['getGamblesList(uint256)'], + '0x4e71e0c8': ['claimOwnership()'], + '0xb4d9cc3a': ['profitDisperser()'], + '0xc127c247': ['addMember(address,string)'], + '0x63deb2c5': ['changeMemberAddress(address)'], + '0x1c02708d': ['killContract()'], + '0xaacc5a17': ['getRandom()'], + '0x6103d915': ['Winners(uint256)'], + '0xd743ca38': ['newWinner(uint256,address,uint256,uint256,uint256)'], + '0x3e5fd9b5': ['dEthereumlotteryNet(address,address,bool,address)'], + '0x149c5066': ['ChanceOfWinning(uint256)'], + '0x860e9960': ['BetPriceLimit()'], + '0xe8930efd': ['Investors(address)'], + '0xc0819961': ['Invest()'], + '0xf9983a12': ['GetMyInvestmentBalance()'], + '0x7dee2cad': ['CancelMyInvestment()'], + '0x4247f52d': ['DoRoll()'], + '0x25209260': ['PrepareRoll(uint256)'], + '0x54738157': ['OwnerCloseContract()'], + '0xe9b93569': ['OwnerGetFee()'], + '0xe97db66e': ['setJackpot()'], + '0x9a7a7c11': ['makeRoll(uint256)'], + '0x414ceac0': ['investorAddFee(uint256)'], + '0x2f1927cb': ['prepareRoll(uint256,uint256,uint256)'], + '0x57764094': ['getRate(uint256)'], + '0x1dea0c57': ['getRealBet(uint256)'], + '0x3e0dfbdf': ['getInvestorByAddress(address)'], + '0xe5a27038': ['Pluton(uint256,string,uint8,string)'], + '0xcae9ca51': ['approveAndCall(address,uint256,bytes)'], + '0xc2412676': ['Token()'], + '0x3ccb7dc9': ['CrowdFund(uint256,uint256)'], + '0xe5225381': ['collect()'], + '0x3059ac30': ['Escrow(address,address)'], + '0x924c28c1': ['ContractInterface(address,address,address)'], + '0xdabc706e': ['getProposalCost()'], + '0x0380e2f3': ['getHashOfTheSignedDocument()'], + '0xd02a9889': ['getDateOfFirstPayment()'], + '0x938199a5': ['getDateOfLastPayment()'], + '0x708f29a6': ['getTotalPayments()'], + '0x270cfee1': ['getTokenAccount()'], + '0x00faf4dd': ['getTokenDivisor()'], + '0x8b863095': ['setContractorProposal(uint256,bytes)'], + '0x3e0d4f4a': ['ApproveContractorProposal()'], + '0xb7538f3e': ['ChangeClient(address)'], + '0x9ae4e388': ['ChangeClientTokenAccount(address,bool)'], + '0x9462eae5': ['ChangeContractor(address)'], + '0xea4af029': ['ConferenceCertification()'], + '0xd1f7a4e4': ['createCertificate(bytes)'], + '0x89eedf00': ['setPdfHash(bytes,bytes)'], + '0xbb3b8dca': ['getCertificateHash(bytes)'], + '0xc2def3b9': ['getOrganizer()'], + '0xb81e43fc': ['getEventName()'], + '0xe5dd90a5': ['HumanStandardToken(uint256,string,uint8,string)'], + '0x5d5bc4cb': ['BetOnRed()'], + '0x29d6f899': ['BetOnBlue()'], + '0xd0821b0e': ['bet(uint8)'], + '0x354d7e40': ['Payout()'], + '0x72c7c85a': ['minority()'], + '0x8f4ffcb1': ['receiveApproval(address,uint256,address,bytes)'], + '0x8a323b38': ['Contract(uint256,string,uint8,string)'], + '0x26745909': ['PRNG_Challenge()'], + '0xd2ef7398': ['challenge()'], + '0x76da5667': ['admin_kill()'], + '0xc2985578': ['foo()'], + '0x63bfe3d8': ['SkillBeatsLuck()'], + '0x478ae93c': ['playToWin(uint256)'], + '0x6a9d2afd': ['playToWinTest(uint256)'], + '0x793cd71e': ['cashOut()'], + '0x2530c905': ['rand(uint256)'], + '0x17db59a4': ['dEthereumlotteryNet(address,address,address)'], + '0xa0f029fc': ['ContractorInterface(address,address,address)'], + '0xf765088f': ['UpdateClientAddress(address)'], + '0x64e24f4b': ['UpdateClientTokenAccount(address)'], + '0xa36c8ec2': ['UpdateContractorAddress(address)'], + '0x84dac46e': ['Fucksign()'], + '0xfc1f2a70': ['Add(uint256,string,string)'], + '0xa87d942c': ['getCount()'], + '0xe3914699': ['dEthereumlotteryNetWinners(address)'], + '0x477bddaa': ['setContractAddress(address)'], + '0xc6ae3b57': ['dEthereumlotteryNet(address,address)'], + '0xe1376da2': ['updateFirstActiveGamble(uint256)'], + '0xd499555b': ['getFirstActiveDuel()'], + '0xf99fc046': ['dEthereumlotteryNet()'], + '0xc494f71a': ['LedgerFund(uint32,uint32,uint64,uint64)'], + '0xcdb6753b': ['setNav(uint32)'], + '0xc8691b2a': ['getHistory(uint256)'], + '0xbe1c766b': ['getLength()'], + '0x7cef6047': ['getNavHistory(uint256)'], + '0x9287c877': ['getNavLength()'], + '0xdd67a360': ['OrderLifeCycle()'], + '0x712ca0f8': ['getOrder(string)'], + '0xe3280126': ['addOrder(string,bool)'], + '0x1d8b70da': ['order_received(string)'], + '0x64265b1a': ['share_transfered(string)'], + '0x96ef7aa0': ['cash_transfered(string)'], + '0x13b2663b': ['cash_received(string)'], + '0xd052fbf6': ['getHistory(string,uint256)'], + '0x6981b5f4': ['getLength(string)'], + '0xbc9147a4': ['Foundation()'], + '0x6389654e': ['changeDailyWithdrawalLimit(uint256)'], + '0x12d00c2e': ['soloWithdraw(uint256)'], + '0xa4699cad': ['resetWithdrawls()'], + '0x3e476053': ['moveFunds(address,uint256)'], + '0xf5c8d71b': ['forceMove(address,address,uint256)'], + '0xfbae5e7d': ['Investors(uint256)'], + '0x1ceea715': ['GetMyInvestFee()'], + '0x1d2dbb22': ['CancelMyInvest()'], + '0xfee35ff8': ['newInvest(uint256,address,uint256)'], + '0x0ff0a4df': ['reFund()'], + '0x932db761': ['profitsFromBitnationDebitCard()'], + '0x79baa8a9': ['BasicIncome_CoFund()'], + '0x983ef725': ['getDifficulty(uint256)'], + '0xf00acc47': ['prepareRoll(uint256,uint256)'], + '0xf3c7d275': ['prenup(string,string,string,string,string,address,address)'], + '0x86a5ff97': ['changeStatus(string)'], + '0xffcce369': ['changeIPFSHash(string)'], + '0xb47d89ad': ['Details()'], + '0x24c9bf5e': ['Prizes()'], + '0xcee6ee38': ['aEthereumlotteryNet()'], + '0x91d8b14e': ['BuyTickets()'], + '0xd224118f': ['PrepareDraw()'], + '0xd4e78272': ['Draw()'], + '0xacc5a0dc': ['GetPrize()'], + '0xfea2920e': ['createNewDraw()'], + '0x350fbe2e': ['calcNextDrawTime()'], + '0x82f0d875': ['makeHash()'], + '0x206a44f3': ['getNum(bytes,uint256)'], + '0x5ed84aa6': ['getNymCenterAPIURL()'], + '0x4cdb48e4': ['isValidNym(address)'], + '0xf1320af2': ['exempt(address)'], + '0xf9e84395': ['unexempt(address)'], + '0xcc872b66': ['issue(uint256)'], + '0xdb006a75': ['redeem(uint256)'], + '0x879d46fd': ['DAOTrust(address,address,bytes,uint256,uint256,uint128)'], + '0xf7b89a3e': ['getTotalCosts()'], + '0x550538f6': ['getOneTimeCosts()'], + '0x0acc4382': ['getMinDailyWithdrawLimit()'], + '0xc988d70f': ['getDailyWithdrawLimit()'], + '0xd7ccc2c3': ['getLastPayment()'], + '0x7648c929': ['returnRemainingEther()'], + '0x6b256f57': ['DAOSecurity(address,address,bytes,uint256,uint256,uint128)'], + '0x293ffca3': ['AddressReg()'], + '0x63a9c3d7': ['verify(address)'], + '0x0d368fee': ['deverify(address)'], + '0xd173707d': ['hasPhysicalAddress(address)'], + '0x5f2e686d': ['Ethereum_eight_bagger()'], + '0x1437f9a3': ['Set_your_game_number(uint16)'], + '0xc3d23e10': ['checkBet()'], + '0xfd68a422': ['returnmoneycreator(uint8,uint128)'], + '0x6673ce2b': ['Results_of_the_last_round()'], + '0x2c329e99': ['Last_block_number_and_bloctime_used()'], + '0xdb641ab4': ['Game_balance_in_Ethers()'], + '0xd6f42038': ['PhoneToAddress()'], + '0x4636a159': ['newPhoneToAddr(address,uint256)'], + '0xe3ffc9a3': ['sendEtherToOwner()'], + '0xb958a5e1': ['getPhoneByAddress(address)'], + '0x1f83f440': ['getPaymentByAddress(address)'], + '0xa02b9aac': ['getPaymentDataByAddress(address)'], + '0xfe97ee88': ['hasPhone(address)'], + '0x11103599': ['Token_Offer(address,address,uint16)'], + '0x7824407f': ['tokenSupply()'], + '0xd0febe4c': ['buyTokens()'], + '0x0e662cf0': ['buyTokens(uint16)'], + '0x8ed67a44': ['setPrice(uint16)'], + '0xdc52696f': ['tokenSupplyChanged()'], + '0xf29d2f28': ['setTokenHolder(address)'], + '0x7b1a4909': ['transferETH(address,uint256)'], + '0x19901f1d': ['TokenSale(uint256,uint256)'], + '0x13d4bc24': ['buyTokenProxy(address)'], + '0xe8038e25': ['TokenSale(uint256,uint256,address)'], + '0x3fc6bc94': ['payDAO()'], + '0x81788e2b': ['addAllowedAddress(address)'], + '0x0b6d8d52': ['createDAO(address,uint256,uint256)'], + '0x656d2f63': ['ManagedAccount(address)'], + '0xb2e85b67': ['getPlayerStatus(address,uint256)'], + '0x1ce624d6': ['Crypted_RPS()'], + '0xb50954b6': ['cancelWaitingForOpponent()'], + '0xa28ecf0b': ['sendCryptedHand(bytes)'], + '0x3f2f46b4': ['revealRock(string)'], + '0xe7740cf9': ['revealPaper(string)'], + '0x953307d8': ['revealScissors(string)'], + '0xe1bc3003': ['reveal(bytes,string)'], + '0xf91a792e': ['decryptHand(string,uint256,uint256,uint256)'], + '0x0cf45ba5': ['updateFirstDuel2(uint256)'], + '0x2d0104a5': ['updateFirstDuel1(uint256)'], + '0x528fd7b0': ['manualPayExpiredDuel()'], + '0x6f52167d': ['payDuel(address,string,address,string)'], + '0xb1418cf4': ['payHouse()'], + '0x717fedf0': ['getFirstActiveDuel1()'], + '0xcb10e0c5': ['getLastDuel1()'], + '0x8dc45377': ['getDuel1(uint256)'], + '0xb782fc9b': ['getFirstActiveDuel2()'], + '0x67bd69a6': ['getLastDuel2()'], + '0x96f7807a': ['getDuel2(uint256)'], + '0xdd10d97e': ['getPlayerWaiting()'], + '0x92093dd6': ['getLastResult()'], + '0x81a60c0d': ['getResults(uint256)'], + '0xb5bfdd73': ['addDSource(string,bytes1,uint256)'], + '0x0f825673': ['deleteCoupon(string)'], + '0xdb37e42f': ['multisetProofType(uint256[],address[])'], + '0xd9597016': ['multisetCustomGasPrice(uint256[],address[])'], + '0x68742da6': ['withdrawFunds(address)'], + '0xca6ad1e4': ['setCustomGasPrice(uint256)'], + '0xa6f9dae1': ['changeOwner(address)'], + '0x64aabe92': ['tryExec(address,bytes,uint256)'], + '0xad8d5f48': ['exec(address,bytes,uint256)'], + '0xa6a20ff6': ['DSEasyMultisig(uint256,uint256,uint256,uint256)'], + '0xc9030ea0': ['addMember(address,bool)'], + '0xc7d6faf1': ['easyPropose(address,uint256)'], + '0x31c2bd0b': ['propose(address,bytes,uint256)'], + '0x1555e337': ['ConferenceCertificate()'], + '0x9844347b': ['createCertificate(bytes,bytes,uint256,bytes)'], + '0x682d3bb0': ['pdfCertificateProof(bytes)'], + '0x73e30e49': ['majorEventFunc(uint256,bytes,bytes)'], + '0x53850db3': ['getParticipantById(uint256)'], + '0xad605729': ['getParticipantCount()'], + '0x28f90e4b': ['Etheramid2()'], + '0xe67cdfb7': ['moveOldUser(uint256)'], + '0xe837ab59': ['getParticipantByAddress(address)'], + '0x9c7e8a03': ['addParticipant(address,address,uint256)'], + '0xd014c01f': ['enter(address)'], + '0xb3ea3924': ['PointlessCoin(int256,uint256,string,uint8,string,address)'], + '0xe724529c': ['freezeAccount(address,bool)'], + '0xf7c9f74a': ['insert_contribution(address,uint256)'], + '0x3f19d043': ['getContributions(address)'], + '0x0a2282ae': ['JackPot()'], + '0xc431f885': ['addToContribution()'], + '0x1f1f5e76': ['addValueToContribution(uint256)'], + '0x6e2cde85': ['drawPot(string,string)'], + '0x8afa08bd': ['setDrawDate(uint256)'], + '0xea3d2827': ['selectWinner(string)'], + '0x744d8b4f': ['recordWin(uint256,uint256)'], + '0x83197ef0': ['destroy()'], + '0x06005754': ['nameRegAddress()'], + '0xf9a7a2ef': ['named(bytes)'], + '0xb028ee13': ['s2b(string)'], + '0x2f570a23': ['test(bytes)'], + '0xcd50d44f': ['CheckRepresentment()'], + '0xa23744f0': ['tryCreateCheckRecord(bytes)'], + '0xfa8dc33a': ['checkRecordExists(bytes)'], + '0x4ac6b2be': ['getCheckRecordCreator(bytes)'], + '0x46e44f63': ['getCheckRecordTS(bytes)'], + '0xa352f1a8': ['calcSHA3(bytes)'], + '0x1eb5ea2e': ['returnFunds()'], + '0x4fa99dd0': ['Matching_Ethers()'], + '0x1a1df394': ['Play(bool)'], + '0xde14bbf7': ['randomGen(uint256,uint256)'], + '0x7f98444f': ['randomEnd()'], + '0x749aa2d9': ['endRound()'], + '0x60f8af90': ['refundRound()'], + '0x51b42b00': ['deactivate()'], + '0xd18611d6': ['reactivate()'], + '0xcbd08c8c': ['config(uint256,uint256,uint256,uint256)'], + '0xd68199dc': ['gameStats()'], + '0xb7297cf3': ['gameSettings()'], + '0xdfc765dc': ['getMatchers_by_index(uint256)'], + '0x3855dcd6': ['getContrarians_by_index(uint256)'], + '0x477801b1': ['getLastRoundResults_by_index(uint256)'], + '0x1c5d9faa': ['setNickname(string)'], + '0xadaccd74': ['getNickname(address)'], + '0xac5e81a9': ['historyPayout(address)'], + '0xd7c23572': ['historyTimesPlayed(address)'], + '0xf4b2dfea': ['Matching_Finneys()'], + '0x7df23b6a': ['ReleaseOracle(address[])'], + '0x46f0975a': ['signers()'], + '0xbf8ecf9c': ['authProposals()'], + '0x64ed31fe': ['authVotes(address)'], + '0x9d888e86': ['currentVersion()'], + '0x26db7648': ['proposedVersion()'], + '0xd0e0813a': ['promote(address)'], + '0x5c3d005d': ['demote(address)'], + '0x01b869f1': ['release(uint32,uint32,uint32,bytes)'], + '0xbc8fbbf8': ['nuke()'], + '0xf460590b': ['updateSigner(address,bool)'], + '0x5bc7e259': ['updateRelease(uint32,uint32,uint32,bytes,bool)'], + '0x60eb2826': ['Badge()'], + '0xee95feaf': ['isSeller(address)'], + '0x64ac2c4a': ['WavesPresale()'], + '0x09957e69': ['newSale(bytes,uint256,uint256)'], + '0x779beca0': ['getNumOfSalesWithSameId(bytes)'], + '0xe2b05077': ['getSaleDate(bytes,uint256)'], + '0x67eae672': ['sendCoinFrom(address,uint256,address)'], + '0xc86a90fe': ['sendCoin(uint256,address)'], + '0xd26c8a8a': ['coinBalance()'], + '0xbbd39ac0': ['coinBalanceOf(address)'], + '0xdaea85c5': ['approve(address)'], + '0x673448dd': ['isApproved(address)'], + '0x1fa03a2b': ['isApprovedFor(address,address)'], + '0x1c14179a': ['GavCoin()'], + '0x99f4b251': ['mine()'], + '0x58150c8b': ['GameRegistry()'], + '0x3c21db0a': ['theGames(uint256)'], + '0xe06174e4': ['settings()'], + '0xe37aa618': ['distributeValue()'], + '0x0d7af726': ['addGame(address,string,string)'], + '0x30945443': ['update(address,string,string)'], + '0xc3c5a547': ['isRegistered(address)'], + '0x617fba04': ['getRecord(address)'], + '0xfa544161': ['getOwner(address)'], + '0x4b70cec4': ['getTime(address)'], + '0x644998ae': ['maintain(int256,uint256,uint256)'], + '0x0aeacb5e': ['getTotalRecords()'], + '0x990c8f79': ['returnValue()'], + '0xea2d4cf8': ['__DeployerFunctions(address,address,uint256)'], + '0x3ac5cb73': ['GeometricPonzi()'], + '0x1b55ba3a': ['Start()'], + '0xe59f611f': ['InputLimit(uint256)'], + '0xcec1365a': ['ShortLimit(uint256)'], + '0xde640e19': ['Investment(uint256)'], + '0xb3dfcdc3': ['Contribution(uint256)'], + '0xa7eeea37': ['NewContributor(uint256)'], + '0x28f03554': ['ProcessDividend()'], + '0xc0b6f0c2': ['NextRoundAndEvents()'], + '0x5afeb106': ['Sqrt()'], + '0x0a4d564c': ['TieUpLooseEnds()'], + '0xdabf7dc8': ['PayoutDividendEarly(uint256,bool)'], + '0x9f9eac67': ['ChangeName(string)'], + '0x68f65f02': ['ChangeShownDenomination(bool,bool,bool,bool)'], + '0x29f27577': ['InvestorList(uint256)'], + '0x8c88752a': ['ContributorList(uint256)'], + '0x979b6f6f': ['RoundInfo()'], + '0x17e875e3': ['Transparancy()'], + '0xc08dd1dc': ['IOU(string,string,uint8)'], + '0xc2a95cc9': ['updateTrustSettings(address,uint256)'], + '0x7682e6ff': ['getTrustSetting(address)'], + '0x4889ca88': ['receiveApproval(address,uint256,address)'], + '0x3177029f': ['approveAndCall(address,uint256)'], + '0xd30fbd0d': ['safeSubtract(uint256,uint256)'], + '0xbe040fb0': ['redeem()'], + '0x4ff13571': ['x2()'], + '0xe97dcb62': ['enter()'], + '0xc8796572': ['collectFees()'], + '0xb6509c12': ['Ethereum_twelve_bagger()'], + '0x421aeda6': ['Set_your_game_number(string)'], + '0x00873367': ['comparisonchr(string)'], + '0x43e332c5': ['Last_block_number_and_blockhash_used()'], + '0xdd36e18b': ['ContractStatus()'], + '0x269975d0': ['GameDetails(uint256)'], + '0x068c966b': ['DrawDetails(uint256)'], + '0x86e4e178': ['CheckTickets(address,uint256,uint256)'], + '0x9bb5239a': ['CheckPrize(address,uint256)'], + '0x83b23b40': ['cEthereumlotteryNet()'], + '0xe56b9dce': ['GetPrize(uint256)'], + '0xd7e11e9d': ['AddTicket(bytes)'], + '0x3fbd40fd': ['ProcessDraw()'], + '0x9d3e069c': ['StartDraw()'], + '0x3211bb90': ['OwnerAddFunds()'], + '0xcc131be1': ['CreateNewDraw(uint256)'], + '0xd1d1c8ae': ['ConvertNumbers(bytes)'], + '0x7154ae61': ['CheckNumbers(uint8[5])'], + '0x05433a26': ['GetNumbersFromHash(bytes)'], + '0x090637a1': ['GetPart(bytes,uint256)'], + '0xe3da41b5': ['sortWinningNumbers(uint8[5])'], + '0x244c23ee': ['Token(uint256,string,uint8,string)'], + '0xe0429b6c': ['ShinySquirrels()'], + '0xc038a38e': ['totals()'], + '0xc8e4acef': ['playerByAddress(address)'], + '0xe46164c5': ['waitingForPayout()'], + '0x030d406b': ['entryPayout(uint256)'], + '0xfd35e71b': ['entryPayoutDue(uint256)'], + '0xb95594e5': ['lineOfPlayers(uint256)'], + '0x93e84cd9': ['play()'], + '0x99c724ef': ['skipInLine(uint256,uint256)'], + '0x67f809e9': ['DynamicPyramid()'], + '0x1da0fb1b': [ + 'updateSettings(uint256,uint256,uint256,uint256,uint256,bool)' + ], + '0x60689557': ['Rock()'], + '0xaf769eff': ['Paper()'], + '0x25ea269e': ['Scissors()'], + '0x00c721ab': ['setHand(uint256)'], + '0xd2b8035a': ['draw(uint256,uint256)'], + '0x2ad95786': ['winner(address)'], + '0x6a0e605f': ['MyToken(uint256,string,uint8,string,address)'], + '0x1b5ee6ae': ['mintToken(int256,address,uint256)'], + '0x2a64fb63': ['getSaleDate(bytes)'], + '0xd8e5ae6a': ['Etheramid()'], + '0xd35ada32': ['addParticipant(address,address)'], + '0x67dd74ca': ['buyTicket(uint256)'], + '0x48d9614d': ['GetFee()'], + '0x2675c123': ['CloseContract()'], + '0x501e8428': ['getPart(bytes,uint256)'], + '0x420a8ac8': ['NanoPyramid()'], + '0xa26dbf26': ['totalParticipants()'], + '0x64d905c0': ['awaitingParticipants()'], + '0x3133f2a7': ['outstandingBalance()'], + '0x6ec3af26': ['addTrustedIssuer(address,bytes)'], + '0x249b4d0b': ['removeTrustedIssuer(address,bytes)'], + '0xd3437fe0': ['assertFact(uint256,bytes)'], + '0x4c4766e8': ['KittenRegistry()'], + '0x3ead67b5': ['changeContractOwner(address)'], + '0x1043dcdf': ['LastIsMe(uint256,uint256)'], + '0xa5f8cdbb': ['buyTicket(address)'], + '0x313b7b19': ['finance()'], + '0xb974b0a3': ['allData()'], + '0x3b355af6': ['baseData()'], + '0x2f29d8c5': ['elapsed()'], + '0x55234ec0': ['remaining()'], + '0xbcc941b6': ['totalWinners()'], + '0x1e2ca0f3': ['updateLeftLottery(address)'], + '0xb2353d69': ['updateRightLottery(address)'], + '0x4a67fa7d': ['setLotteryFee(uint256)'], + '0x5a09f2f4': ['setHouseFee(uint256)'], + '0x5af77fff': ['Contract()'], + '0x315e2f1b': ['setTestString(string)'], + '0xd8c90762': ['addTrustedIssuer(address,string)'], + '0xf24b5779': ['removeTrustedIssuer(address,string)'], + '0xfe05e8b1': ['assertFact(uint256,string)'], + '0x5fb3e119': ['Auction()'], + '0xfe777bcd': ['etherForSale()'], + '0x78e97925': ['startTime()'], + '0x3197cbb6': ['endTime()'], + '0xe6d9bb0f': ['secondsUntilEnd()'], + '0x44691f7e': ['hasStarted()'], + '0xecb70fb7': ['hasEnded()'], + '0x5dd672ec': ['latestBid()'], + '0x63bd1d4a': ['payout()'], + '0xd98b9bb5': ['placeBid(address,uint256)'], + '0x90c3a370': ['AuctionMaster()'], + '0xd5563f31': ['createAuction(uint256)'], + '0xe6690fb1': ['nextAuction(uint256)'], + '0xf2b26d8f': ['nextEtherForSale()'], + '0x7a791524': ['setNextFeePercentage(uint8)'], + '0x5d068051': ['sendFees(address)'], + '0xb40a5627': ['bidCount()'], + '0x2da0d1ea': ['etherSold()'], + '0xdeb6930c': ['PriceTicker()'], + '0xa2e62045': ['update()'], + '0x7bc25372': ['UserCheckBalance(address)'], + '0x53b7b2e9': ['cEthereumlotteryNet(bytes)'], + '0x78e80b39': ['UserGetPrize()'], + '0x2b291eb6': ['UserAddTicket(bytes)'], + '0x3e0663e0': ['AdminDrawProcess()'], + '0xd96de4ce': ['AdminDrawError()'], + '0xe26c8434': ['AdminStartDraw(string,bytes)'], + '0x370b6939': ['AdminSetDrawer(address)'], + '0x0acf473b': ['AdminCloseContract()'], + '0x3fa6497f': ['AdminAddFunds()'], + '0xb6294bde': ['AdminGetFee()'], + '0xc1e5304a': ['CreateNewDraw(uint256,bytes)'], + '0xbf32bf97': ['FailGuyTax()'], + '0x24a852c6': ['unset(bytes)'], + '0x804ba97a': ['tryGet(bytes)'], + '0x2a0d79ef': ['totalSupply(bytes)'], + '0x8606f905': ['balanceOf(address,bytes)'], + '0x5fd9dff6': ['allowance(address,address,bytes)'], + '0xab67aa58': ['transferFrom(address,address,uint256,bytes)'], + '0x5c17f9f4': ['approve(address,uint256,bytes)'], + '0x669dafe8': ['toWei(uint256)'], + '0xe4fc6b6d': ['distribute()'], + '0xb78b52df': ['allocate(address,uint256)'], + '0x6617e11a': ['NiceGuyTax()'], + '0x0a7493b4': [ + 'Etheropt(uint256,string,uint256,uint256,bytes,address,int256[])' + ], + '0x7c7c7695': ['getAccountID(address)'], + '0xce88b145': ['getAccount(uint256)'], + '0xa26759cb': ['addFunds()'], + '0x155dd5ee': ['withdrawFunds(uint256)'], + '0x5c665f89': ['getFunds(address,bool)'], + '0xd5544f94': ['getFundsAndAvailable(address)'], + '0x502414e4': ['marketMaker(string)'], + '0x2043285d': ['getMarketMakers()'], + '0x0e1087c3': ['getMarketMakerFunds()'], + '0x756fb8c9': ['getOptionChain()'], + '0xd4dfadbf': ['getMarket(address)'], + '0xc398f030': ['expire(uint256,uint8,bytes,bytes,bytes)'], + '0xec0b4153': ['getMoneyness(int256,uint256,uint256)'], + '0xc6cb7a96': [ + 'orderMatchTest(uint256,uint256,int256,uint256,uint256,address,address,uint256,int256)' + ], + '0x6663bbec': [ + 'orderMatch(uint256,uint256,int256,uint256,uint256,address,uint8,bytes,bytes,int256)' + ], + '0x17c65aa7': ['getMaxLossAfterTrade(address,uint256,int256,int256)'], + '0x209a5b8a': ['moneySumAtSettlement(address,uint256,int256,uint256)'], + '0x7d619d9b': ['holdCoin(address,address)'], + '0xa66f7ad6': ['signRelease(uint256)'], + '0xbff0fbb8': ['calculateMeat(uint256)'], + '0xb8d3bfe3': [ + 'MeatGrindersAssociation(address,address,uint256,uint256,uint256,address)' + ], + '0x5938748e': ['changeVotingRules(address,address,uint256,uint256,uint256)'], + '0xeb08b304': ['changeMeatProvider(address)'], + '0x677342ce': ['sqrt(uint256)'], + '0x4ae85627': ['grindUnicorns(uint256)'], + '0x9a92b7e7': ['EthVenturesFinal()'], + '0x1097e579': ['Enter()'], + '0x3edd90e7': ['NewOwner(address)'], + '0x6b1781b6': ['Emergency()'], + '0x611daa7e': ['EmergencyBalanceReset(uint256)'], + '0x476e04c7': ['NewMessage(string)'], + '0x4cd11943': ['NewManualInvestor(address,uint256)'], + '0x112c7075': ['ManualDeposit()'], + '0x9f7f760c': ['SimpleDice()'], + '0x8fcc9cfb': ['setMinDeposit(uint256)'], + '0x45596e2e': ['setFeeRate(uint256)'], + '0x4b09ebb2': ['e_exp(uint256)'], + '0x24d4e90a': ['ln(uint256)'], + '0x084d72f4': ['getWinningOutcome(uint256)'], + '0xabebb7f3': ['MarketsContract()'], + '0x74580e2f': ['changeCreator(address)'], + '0x5a58cd4c': ['deleteContract()'], + '0xcdd13701': ['getEventHashes(uint256[256])'], + '0xb2c652f3': ['getMarkets(uint256[128])'], + '0x90e3c278': ['getShares(uint256[128])'], + '0x76abc03b': ['getShareDistribution(uint256)'], + '0xff49b26e': [ + 'createEvent(uint256,uint256,uint8,uint32,address,uint256,uint8)' + ], + '0x7a29332d': ['buyAllOutcomes(uint256,uint256)'], + '0x4757f1d2': ['redeemAllOutcomes(uint256,uint256)'], + '0x154af6b1': ['sendShares(uint256,uint8,uint256,address)'], + '0xd7ed7453': ['redeemWinnings(uint256)'], + '0x1335ff36': [ + 'createEventAndMarketMaker(uint256,uint256,uint8,uint32,address,uint256,uint8,uint16,uint256)' + ], + '0x968908a3': ['createMarketMaker(uint256,uint16,uint256)'], + '0xc7489441': ['closeMarketMaker(uint256)'], + '0x3f887fad': ['buyShares(uint256,uint8,uint256,uint256)'], + '0x590528a9': ['sellShares(uint256,uint8,uint256,uint256)'], + '0x7ef1925b': ['getShareRange(uint256,uint8)'], + '0x550dd006': ['calcCostsBuying(uint256,uint8,uint8,uint256)'], + '0x6111dd02': ['calcCostsSelling(uint256,uint8,uint8,uint256)'], + '0x8112821f': ['EthVentures()'], + '0xa20495d3': ['Managed()'], + '0xb3a2a6c0': ['setOfficialWebsite(string)'], + '0xa49d53a1': ['SmartRevshare()'], + '0x3d750b28': ['found()'], + '0x14ba5c09': ['getDay()'], + '0xcde99727': ['calculateROI()'], + '0x791b51f1': ['Consulting(address,address)'], + '0x51a5f2f2': ['ConsultingHalf(address,address)'], + '0x06900c41': ['ZeroPonzi()'], + '0x61472fd4': ['CSGOBets()'], + '0x940c154b': ['lockBet(uint256)'], + '0xe1152343': ['payout(uint256)'], + '0x85b1423e': ['returnAll()'], + '0xd7a58658': ['changeHouseedge(uint8)'], + '0x41fa4876': ['multiBlockRandomGen(uint256,uint256)'], + '0x340ddda6': ['MeatConversionCalculator(uint256,uint256)'], + '0x6fa8de90': ['changeMeatParameters(uint256,uint256)'], + '0xa80d4e9a': ['EtherAuction(uint256)'], + '0xe1c7392a': ['init()'], + '0x1998aeef': ['bid()'], + '0xfe67a54b': ['endAuction()'], + '0x547eeac1': ['acceptTransfer()'], + '0xed54746e': ['lastAuction()'], + '0xec93cfae': ['FountainOfWealth()'], + '0x2a745971': ['BlockKing()'], + '0x2431f164': ['process_payment()'], + '0x8e035ac1': ['BetOnHashV82()'], + '0x547916ea': ['finishRound()'], + '0xb688a363': ['join()'], + '0x6bf8f85a': ['forceFinish()'], + '0x9eded57a': ['paybackLast()'], + '0x72388610': ['paybackAll()'], + '0x758b5172': ['setPlayersPerRound(uint256)'], + '0x07da68f5': ['stop()'], + '0xa77b2e37': ['Coin()'], + '0xd0679d34': ['send(address,uint256)'], + '0x37ae43a3': ['BetOnHashV81()'], + '0xd850288b': ['etherlist_top()'], + '0x4789aaef': ['EthereumDice()'], + '0xc2e9fab3': ['SubUser()'], + '0x6d853ab6': ['isSubUser(address)'], + '0x018f5472': ['isAUser(address)'], + '0xc5d5997c': ['changeSubUser(address,address)'], + '0x0870607b': ['addSubUser(address)'], + '0x7ccfd45a': ['removeSubUser(address)'], + '0xbaf00f76': ['removeAllSubUsers()'], + '0x1a93fa4b': ['reorganizeSubUsers()'], + '0x8b9e5385': ['MeterSlock(uint256,uint256,address)'], + '0xf5bade66': ['setDeposit(uint256)'], + '0x91b7f5ed': ['setPrice(uint256)'], + '0xb29b5366': ['setRentable(bool)'], + '0xbe9a6555': ['start()'], + '0x6299f8cf': ['stop(uint256)'], + '0xd12c1e28': ['badgesOf(address)'], + '0x70844f7a': ['sendBadge(address,uint256)'], + '0x615664ba': ['Market()'], + '0x177766e6': ['getOptionChain(uint256)'], + '0x5025b9ae': ['expire(uint256,uint256,uint8,bytes,bytes,bytes)'], + '0x0448f79f': [ + 'addOptionChain(uint256,string,uint256,uint256,bytes,address,int256[])' + ], + '0x42bf4431': [ + 'orderMatchTest(uint256,uint256,uint256,int256,uint256,uint256,address,address,int256)' + ], + '0xb3760c80': [ + 'orderMatch(uint256,uint256,uint256,int256,uint256,uint256,address,uint8,bytes,bytes,int256)' + ], + '0xfe4667e9': ['getMaxLossAfterTrade(address,uint256,uint256,int256,int256)'], + '0x69d79ad5': [ + 'moneySumAtSettlement(address,uint256,uint256,int256,uint256,uint256)' + ], + '0xabcf1328': ['InterestBank()'], + '0x6fc9d5e4': ['changeCompareTo(uint256)'], + '0x315fdea3': ['TreasureChest()'], + '0xeebf9808': ['PiggyBank()'], + '0xf9391d24': ['AllPayAuction()'], + '0xecfc7ecc': ['placeBid()'], + '0x6b64c769': ['startAuction()'], + '0xf449619e': ['collectPrize(uint256)'], + '0x003b9d88': ['setLowerFeePercentage(uint8)'], + '0x164e68de': ['withdrawFees(address)'], + '0xdd467064': ['lock(uint256)'], + '0x1aa3a008': ['register()'], + '0x362e2565': ['returnDeposits()'], + '0xcc8b34ab': ['CrowdCoin()'], + '0x9a777d5d': ['buyCoins()'], + '0x84054d3d': ['cashout()'], + '0xa3053236': ['SafeInvestments()'], + '0xc31d0031': ['CrowdFundDAO(string,uint8,string)'], + '0x45755dd6': ['returnFunds(uint256)'], + '0x9b5fde7d': ['payOut(uint256,string)'], + '0x51d38d5f': ['addDeveloper(address,string)'], + '0xd9d73887': ['Diana()'], + '0x8691162a': ['TlcCoin()'], + '0x4b8e1ba8': ['isMinter(int256,address)'], + '0x4594d06a': ['delMinter(int256,address)'], + '0xc478fc37': ['EtherWheel(uint256,uint256,uint8)'], + '0x8f03850b': ['numContributors()'], + '0x8b7bcc86': ['numWinners()'], + '0xe3083fb5': ['removeFromContribution(uint256)'], + '0x88017e05': ['setContribution(uint256)'], + '0x33a99e04': ['selectWinner()'], + '0x739b47ca': ['recordWin(address)'], + '0x6e940a29': ['changeHost(address)'], + '0x4cdc6a73': ['Marriage()'], + '0xce60f78d': ['createMarriage(bytes,bytes,uint256,bytes,bytes)'], + '0xaf408d89': ['setStatus(bytes)'], + '0x26826bf8': ['setImage(bytes)'], + '0xe771066f': ['marriageProof(bytes)'], + '0x6f3a7561': ['SimpleAuction(address)'], + '0x2a24f46c': ['auctionEnd()'], + '0x824dbc9a': ['changeMembership(address,uint256,bool,string)'], + '0x522103fa': ['changeUnicorn(uint256,address)'], + '0x83876bc9': ['newProposalInWei(address,uint256,string,bytes)'], + '0xb9f256cd': ['newProposalInEther(address,uint256,string,bytes)'], + '0x0358d965': ['addPayout(uint256)'], + '0x686f2c90': ['collectAllFees()'], + '0xb4022950': ['collectFeesInEther(uint256)'], + '0x4229616d': ['collectPercentOfFees(uint256)'], + '0xced92670': ['changeMultiplier(uint256)'], + '0xfae14192': ['changeFeePercentage(uint256)'], + '0x6fbaaa1e': ['currentMultiplier()'], + '0x8a5fb3ca': ['currentFeePercentage()'], + '0x09dfdc71': ['currentPyramidBalanceApproximately()'], + '0x57d4021b': ['nextPayoutWhenPyramidBalanceTotalsApproximately()'], + '0x253459e3': ['feesSeperateFromBalanceApproximately()'], + '0xd11f13df': ['numberOfParticipantsWaitingForPayout()'], + '0x9dbc4f9b': ['participantDetails(uint256)'], + '0xea851885': ['buyStake(bool)'], + '0x7c3064f1': ['refundStake()'], + '0x20909fa0': ['communityCurrency()'], + '0x7817a60f': ['acceptMember(address,string)'], + '0xd9e947f3': ['kickOutMember(address)'], + '0xa5ea11da': ['getParameters()'], + '0xa5ebf389': ['getMoneyTotals()'], + '0xac4b2bae': ['newParameters(int256,uint256,int256,uint256)'], + '0x8da4d776': ['newCommune(address)'], + '0x9718b524': ['newTreasury(address)'], + '0x127714c7': ['getBudget()'], + '0x69c4113d': ['setNewBudget(uint256,uint256,uint256,uint256)'], + '0x69433e12': ['setExchange(uint256)'], + '0x70ab8ba8': ['creditUpdate()'], + '0xddb1bdc8': ['credit(address,uint256,uint256)'], + '0x1bad1d2e': ['monitorWallet(address)'], + '0x1b9f9647': ['accessMyWallet(address)'], + '0x85f8c16d': ['claimHours(int256)'], + '0x6a357465': ['payHours(address,uint256)'], + '0xea5ea470': ['payFunding(uint256)'], + '0x4f20f35a': ['payExpenses(address,uint256)'], + '0xc81caae7': ['acceptMember(address,string,string)'], + '0x80aed05f': ['LooneyDice()'], + '0xef7507c8': ['testWinner(uint256)'], + '0xcd5e3c5d': ['roll()'], + '0x699b328a': ['randomize()'], + '0x5601eaea': ['execute(uint256,uint256)'], + '0x4aa16737': ['enter(uint8)'], + '0x33f707d1': ['ownerWithdraw(uint256)'], + '0x37ab8f20': ['notifyPlayer(uint256,uint256,uint256,uint256)'], + '0xc2fb8f36': ['TinyHuman(address,address,address)'], + '0xad5c613d': ['purchase(bytes)'], + '0xd50495f4': ['addTransaction(bytes)'], + '0xb7f2f33c': ['transferRightIfApproved(address,bytes)'], + '0xed3058e0': ['transferRight(address,bytes)'], + '0xeba36dbd': ['setAddr(uint256,address)'], + '0x0790e880': ['setBlockappsAddr(address)'], + '0x8eec99c8': ['setNewAdmin(address)'], + '0x3d6a3664': ['setNewOracle(address)'], + '0x7ba38916': ['changeAdminFromBoard(address)'], + '0x279e0912': ['getDownloadPrice()'], + '0xb83069c5': ['getStemPrice()'], + '0xa33d4968': ['Tripler()'], + '0xe977992d': ['Doubler()'], + '0xa88c5ef7': ['NextPayout()'], + '0x8cf4dbfb': ['collectBalance()'], + '0x3169ff3e': ['LooneyLottery()'], + '0x4311de8f': ['ownerWithdraw()'], + '0x5d495aea': ['pickWinner()'], + '0xb94e962a': ['allocateTickets(uint256)'], + '0x1b83b823': ['notifyPlayer(uint256)'], + '0xc0a963c9': ['notifyWinner(address,uint256)'], + '0x5d3278f0': ['LooneyFifty()'], + '0x7bc49a95': ['play(uint256,uint256)'], + '0x2262cd94': ['wroom()'], + '0xd1738b72': ['wroomWroom()'], + '0x6d7da0b1': ['MyContract()'], + '0x7bb6a4c6': ['uno(uint256)'], + '0xa5468081': ['Pyramid(address)'], + '0x54ba7daa': ['enter(bytes,bytes)'], + '0xc80c28a2': ['getNumberOfParticipants()'], + '0xa480ca79': ['collectFees(address)'], + '0x483ba09e': ['setBitcoinBridge(address)'], + '0x02dc2e1d': ['queuePayment(bytes)'], + '0x27d6c032': ['unregister(bytes)'], + '0x6b4dd158': ['getPrice(bytes)'], + '0x7a6e9df7': ['getTimestamp(bytes)'], + '0x08b7fa31': ['PriceFeed()'], + '0xd249a52e': ['update(bytes,uint256[],uint256[])'], + '0x43d24a5e': ['addUpdater(address)'], + '0x04b07a5e': ['removeUpdater(address)'], + '0x76999896': ['KingOfTheEtherThrone()'], + '0xc8fdc891': ['numberOfMonarchs()'], + '0xb66a323c': ['claimThrone(string)'], + '0x0eb3f5a0': ['sweepCommission(uint256)'], + '0x55cc4e57': ['setIssuer(address)'], + '0x566735d8': ['PreVNK(uint256,string,string,uint8)'], + '0xb5d03751': ['YoutubeViews()'], + '0xaacf5328': ['setVideoID(string,uint256)'], + '0x788e26e7': ['sponsorDeposit()'], + '0x2a228fc2': ['processWithdrawals()'], + '0x01518d76': ['sendQuery(uint256)'], + '0x23145ca0': ['forceCheck()'], + '0x918f1bb5': ['ProjectKudos()'], + '0xd56b2889': ['finish()'], + '0x72929b56': ['getKudosPerProject(address)'], + '0x505ff574': ['register(address,uint256,bool)'], + '0xec3af4a9': ['getProjectKudos(address)'], + '0x94f60a63': ['getKudosLeft(address)'], + '0xe116b17e': ['getKudosLeftForProject(address,address)'], + '0xf4a81d08': ['getKudosGiven(address)'], + '0xda82a035': ['sweepCommission()'], + '0x2004dff6': ['Basics()'], + '0xc0aa18e7': ['History()'], + '0x84ebde52': ['Under_the_Hood()'], + '0xa9f6def0': ['HonestDice()'], + '0xaa9669c1': ['roll(uint256,bytes)'], + '0xa48566ba': ['serverSeed(address,bytes)'], + '0x59dac714': ['hashTo256(bytes)'], + '0xaa1e84de': ['hash(bytes)'], + '0xa094a031': ['isReady()'], + '0x2fac1d36': ['isReadyFor(address)'], + '0xef4592fb': ['getResult(bytes)'], + '0xf93589ce': ['didWin(bytes)'], + '0x06b5f02d': ['calcWinnings(uint256,uint256)'], + '0x2d9a37d3': ['getMaxPayout()'], + '0xc63ff8dd': ['claim(bytes)'], + '0xc7cf28fe': ['canClaimTimeout()'], + '0x0e1da6c3': ['claimTimeout()'], + '0x839930ba': ['getMinimumBet()'], + '0x0d1fce42': ['getBankroll()'], + '0x021991e7': ['getBetsLocked()'], + '0x55b775ea': ['setFeed(address)'], + '0x46b305d6': ['lockBetsForWithdraw()'], + '0xa1b9af31': ['unlockBets()'], + '0xc47bc007': ['add_funds()'], + '0xcce81927': ['EtherDice(address,address)'], + '0x89ef40e7': ['numberOfHealthyGenerations()'], + '0x918359c6': ['needsBirth()'], + '0x97950740': ['roomForBirth()'], + '0x32cea83e': ['birth(bytes)'], + '0xb3c1a588': ['parseMsgData(bytes)'], + '0x827ef325': ['_parseMsgData(bytes)'], + '0x83e78b31': ['bet(uint8,bool,uint8)'], + '0x21520c5f': ['calculatePayout(uint8,bool,uint256)'], + '0x2df8e00d': ['becomeMortal(uint256)'], + '0xe94a4db1': ['isSuitableGen(uint256,uint256)'], + '0x640f244b': ['findSuitableGen()'], + '0x62770252': ['needsFuneral(uint256)'], + '0xfed4614b': ['funeral(bytes,int256)'], + '0xf004073a': ['performAction(uint256)'], + '0x0fa9ced4': ['emergencyFuneral()'], + '0x99bb875c': ['funeralAndBirth(bytes,int256,bytes)'], + '0x44dd4b3b': ['lookupGeneration(uint256)'], + '0x784813e0': ['lookupBet(uint256,uint256)'], + '0xd5a4a3c6': ['findRecentBet(address)'], + '0xfe72e717': ['toDie(bytes)'], + '0x69bdfd3a': ['toContractDie(bytes,bytes,uint256)'], + '0x61886014': ['combineDice(uint8,uint8)'], + '0xe0457884': ['betResolution(uint8,uint8,uint8,bool)'], + '0x67acd805': ['lowerMinWager(uint256)'], + '0x03bda14e': ['raiseMaxNumBets(uint256)'], + '0xe87508be': ['investorDeposit()'], + '0xe6febc9b': ['investorWithdraw(uint256)'], + '0xd7206124': ['setInvestorLock(bool)'], + '0x0c1fad51': ['setSeedSourceA(address)'], + '0x6615dd83': ['setSeedSourceB(address)'], + '0xcd591822': ['CanaryV7Fast()'], + '0x21a49ec2': ['LCoin()'], + '0x02ba8742': ['sendCoins(address,uint256)'], + '0x3288eb0b': ['ChineseCookies()'], + '0x47b47102': ['bakeCookie(string)'], + '0xb78bd4a5': ['breakCookie(string)'], + '0xfce59d0c': ['MangoRepo()'], + '0xceebe28d': ['repoInterfaceVersion()'], + '0x80d9eaa6': ['refCount()'], + '0x8c79a24d': ['refName(uint256)'], + '0x9d170c5d': ['getRef(string)'], + '0x7d89ae63': ['__findRef(string)'], + '0x8bb0faee': ['setRef(string,string)'], + '0x5ae5df8f': ['deleteRef(string)'], + '0xadd82871': ['strEqual(string,string)'], + '0x098ab6a1': ['snapshotCount()'], + '0x76f10ad0': ['getSnapshot(uint256)'], + '0xfee6d28c': ['addSnapshot(string)'], + '0x8ac6a869': ['isObsolete()'], + '0x5cac8b27': ['amazing()'], + '0x04106c8b': ['startGeneration()'], + '0x434cb64c': ['startNextGeneration()'], + '0x11149ada': ['getProof(uint256)'], + '0x34c1b4ba': ['sha(bytes)'], + '0xf34ed4e6': ['RanDAOPlus(address)'], + '0x696bda86': ['submitProposal(uint256,bytes)'], + '0x141c4e60': ['challenge(uint256,address)'], + '0xd2756e11': ['finalizeNumber(uint256)'], + '0x28472c6c': ['claimComputation(bytes,bytes)'], + '0x287418e7': ['query(uint256,uint16)'], + '0xc3169ef2': ['respond(uint256,uint256[4])'], + '0xa068e8d3': ['convict(uint256,uint256,uint256,uint256)'], + '0x3f5e268f': ['convictInitial(uint256,uint256)'], + '0x89495172': ['convictFinal(uint256,uint256)'], + '0x87393bc6': ['verifyFirstHalf(uint256[4],uint256[4])'], + '0x6bc3e0f0': ['verifySecondHalf(uint256[4],uint256[4],uint256[4])'], + '0x00b5b223': ['computeResponse(uint256,uint16)'], + '0x990f3f53': ['computeResponseSecondHalf(uint256,uint16)'], + '0xe6e8c692': ['computeResponseFirstHalf(uint256,uint16)'], + '0x3b996f40': ['quarter(uint32,uint32,uint32,uint32)'], + '0x669e48aa': ['get(uint256,uint256)'], + '0x541aea0f': ['put(uint256,uint256)'], + '0xf2b445ad': ['rowround(uint256,uint256)'], + '0x6189be15': ['columnround(uint256,uint256)'], + '0x75ee85bd': ['salsa20_8(uint256,uint256)'], + '0x692ad3a9': ['round(uint256,uint256,uint256,uint256)'], + '0x19c32e0b': ['hmacsha256(bytes,bytes)'], + '0x15c91115': ['pbkdf2(bytes,bytes,uint256)'], + '0x7c7a52bf': ['newChallenge(uint256,address)'], + '0xbbdb31cb': ['challenge(uint256,address,bool)'], + '0x9af8c4ba': ['respond(uint256,address,bytes)'], + '0x18968a03': ['finalize(uint256,address,address)'], + '0xd500dd6a': ['challengeTimeout(uint256,bool,address)'], + '0x0ee07836': ['adjustDifficulty(uint256)'], + '0x60b1e173': ['getProof(uint256,address,address)'], + '0x98d5fdca': ['getPrice()'], + '0xd4871517': ['BTCLotto(address,uint256)'], + '0xc5b1d9aa': ['newRound()'], + '0xda333ca6': ['payOut(uint256)'], + '0x8f1327c0': ['getRound(uint256)'], + '0x0699d07d': ['updateMaxVal()'], + '0x1f794436': ['getBlockHeader(int256)'], + '0x02394872': ['getLastBlockHeight()'], + '0x09dd0e81': ['getBlockchainHead()'], + '0x0aece23c': ['getFeeAmount(int256)'], + '0x44d03ac6': ['BlockhashFetch(address)'], + '0x32254992': ['getPrevHash(int256)'], + '0x2cce81aa': ['getBlockHash(int256)'], + '0x66772438': ['computeResponse(uint16)'], + '0x2776a859': ['computeResponseSecondHalf(uint16)'], + '0xfe13a823': ['computeResponseFirstHalf(uint16)'], + '0x954ab4b2': ['say()'], + '0xd6d22fa4': ['MetaCoin()'], + '0x7bd703e8': ['getBalanceInEth(address)'], + '0x87def081': ['getFeeRecipient(int256)'], + '0xa0f61310': ['FakeRelay(bytes)'], + '0x96e4ee3d': ['convert(uint256,uint256)'], + '0xfa2acd87': ['G(uint64[16],uint256,uint256,uint256,uint256,uint64,uint64)'], + '0x33232609': ['blake2b(uint64[],uint64[],uint64)'], + '0x217311ac': ['getWords(uint64)'], + '0xfb72d24e': ['shift_right(uint64,uint256)'], + '0xbf187478': ['shift_left(uint64,uint256)'], + '0x0e47c76f': ['rotate(uint64,uint256)'], + '0x10142785': ['assign(bytes,uint256,bytes1)'], + '0xd985f122': ['RelayToolsTest()'], + '0xa54a2b8b': ['testBlockHashFetch()'], + '0x72c87075': ['testBlockHeaderFetch()'], + '0xedede601': ['testBalance()'], + '0x9a79f4a8': ['testFailHeaderInsufficientFee()'], + '0xfb95adeb': ['testFailBlockhashInsuffiecientFee()'], + '0xad82dcac': ['testBlockhashCorrectFee()'], + '0x70c9edb7': ['BTCRelayTools(address)'], + '0x4016535a': ['parseBlock(bytes,uint256)'], + '0xee82ac5e': ['getBlockHash(uint256)'], + '0xae6215d8': ['getBlockHeight(bytes)'], + '0x19c47214': ['getBlockVersion(bytes)'], + '0x726ab4ef': ['getParentHash(bytes)'], + '0xd9c67404': ['getMerkleRoot(bytes)'], + '0xf74100e3': ['getBits(bytes)'], + '0x51d6e547': ['getNonce(bytes)'], + '0x66aa6f26': ['payFee(bytes)'], + '0xde39acea': ['get32(bytes,uint256)'], + '0xdf5cc291': ['get4(bytes,uint256)'], + '0x745a8be2': ['flip32(bytes)'], + '0x26c7edaa': ['flip4(bytes)'], + '0x0b74edc6': ['testFinalHash()'], + '0x2f597e71': ['testLongInput()'], + '0xa7e25683': ['testShortOutput()'], + '0x6af2da2f': ['testKeyedHash()'], + '0xd299dac0': ['blake2b(bytes,bytes,uint64)'], + '0xd063f55f': ['toLittleEndian(uint64)'], + '0xd18dfdc9': ['parrot(uint256)'], + '0x5168afa4': ['getPackageHash(bytes,uint8,uint8,uint8)'], + '0x027a5e3f': ['getLastVersion(bytes)'], + '0xa587da29': ['setPackage(bytes,uint8,uint8,uint8,bytes)'], + '0x3cc8daf7': ['setNameOwner(bytes,address)'], + '0x44dfdce0': ['getNameOwner(bytes)'], + '0x4112b7f1': ['tryGetNameOwner(bytes)'], + '0x03da8902': ['transfearDBOwner(address)'], + '0x992c870d': ['transferName(bytes,address)'], + '0x8efc777f': ['isBeta(bytes)'], + '0xd1d3bb92': ['testSetPkg()'], + '0x8bab8791': ['testPkgUpdate()'], + '0xb5784f6f': ['testMultiplePackages()'], + '0x96013c9c': ['testLatestPkgGetter()'], + '0x74d89c47': ['testUpdateNameDb()'], + '0x408938d0': ['testUpdatePackageDb()'], + '0x930a80b4': ['testAuthorizedSetPackage()'], + '0x70be4ffa': ['testErrorUnauthorizedSetPackage()'], + '0xb9a904f9': ['testUnauthorizedSetBetaPackage()'], + '0x8a341c83': ['testErrorRootAuthorityChangeUnownedPackage()'], + '0x88a49164': ['testErrorUnauthorizedTransfer()'], + '0x337b5988': ['testSimpleNameRegister()'], + '0xeca5c793': ['testErrorUnauthorizedNameRegister()'], + '0x3e4565d2': ['testErrorUnauthorizedNameRegister2()'], + '0x36344022': ['testAuthorizedTransfer()'], + '0xb189ad2a': ['testErrorUnauthorizedAfterTransfer()'], + '0x0f5381f1': ['testUserCanIncreaseVersionNumber()'], + '0x5babb758': ['testSetUp()'], + '0xaf6fe8e2': ['testGetToken()'], + '0xec2ec781': ['testFailGetUnsetToken()'], + '0xad447a19': ['getBalanceDB()'], + '0xec727000': ['getApprovalDB()'], + '0x9cbf9e36': ['createToken()'], + '0xe6c3b4ab': ['testBalanceAuth()'], + '0x07b6f631': ['testTestHarnessAuth()'], + '0xc89f8f08': ['testGetController()'], + '0x0fe234ed': ['testSetController()'], + '0x4fab2ca4': ['testGetFrontend()'], + '0x9131d803': ['testSetFrontend()'], + '0x7353f62b': ['testGetApprovalDb()'], + '0x4df53a0f': ['testSetApprovalDb()'], + '0xea7a7184': ['testGetBalanceDb()'], + '0xd0bff051': ['testSetBalanceDb()'], + '0x2977b1b1': ['testAllowanceStartsAtZero()'], + '0xf3e3c629': ['testBalanceOfStartsAtZero()'], + '0xfb09b1ac': ['testBalanceOfReflectsTransfer()'], + '0xeb7492d1': ['testTotalSupply()'], + '0x730720b8': ['testControllerValidTransfers()'], + '0x0d8b5fa2': ['testControllerValidTransferFrom()'], + '0x1f2e886c': ['testControllerTransferTriggersEvent()'], + '0x2f5d3916': ['testControllerApproveTriggersEvent()'], + '0xa32f0f41': ['testFailControllerUnapprovedTransferFrom()'], + '0x6f4812e2': ['testFailControllerInsufficientFundsTransfer()'], + '0x296ed88f': ['testFailControllerInsufficientFundsTransferFrom()'], + '0xe50dce71': ['testControllerApproveSetsAllowance()'], + '0xf712d7ff': ['testFailControllerTransferFromWithoutApproval()'], + '0x821e9169': ['testFailControllerChargeMoreThanApproved()'], + '0x7f924c4e': ['testDeposit()'], + '0xd509b16c': ['testWithdraw()'], + '0x23de6651': ['emitTransfer(address,address,uint256)'], + '0x5687f2b8': ['emitApproval(address,address,uint256)'], + '0x2b4a3b31': ['doTransferFrom(address,address,uint256)'], + '0x0f24f5c8': ['doTransfer(address,uint256)'], + '0xa8484938': ['doApprove(address,uint256)'], + '0xfa566ddd': ['doAllowance(address,address)'], + '0xbc2a4dd6': ['doBalanceOf(address)'], + '0x0994a0a0': ['DSTokenTest()'], + '0x6632a507': ['testSetupPrecondition()'], + '0x10922cc1': ['testTransferCost()'], + '0xe13dc28b': ['testValidTransfers()'], + '0x61e539da': ['testFailWrongAccountTransfers()'], + '0xe7faecec': ['testFailInsufficientFundsTransfers()'], + '0x833b4596': ['testApproveSetsAllowance()'], + '0xb9a0a708': ['testChargesAmountApproved()'], + '0x5fe22c8b': ['testFailTransferWithoutApproval()'], + '0xbfc3cd2f': ['testFailChargeMoreThanApproved()'], + '0xc1829a14': ['testFailTooFewConfirms()'], + '0x77e4fb04': ['testFailNotEnoughValue()'], + '0xdf3a6b10': ['testMemberAddedEvent()'], + '0x0caf9d39': ['testFailTooManyMembers()'], + '0xa04a0908': ['execute(address,bytes,uint256)'], + '0x039a21b8': ['tryExecute(address,bytes,uint256)'], + '0x28a45038': ['testTryProxyCall()'], + '0x60a60fd8': ['testProxyCallWithValue()'], + '0xdd5244b4': ['testTryProxyCallWithValue()'], + '0x3358d2d3': ['buildDSTokenFrontend()'], + '0xa7c5052e': ['buildDSTokenRegistry()'], + '0xb8d94b95': ['buildDSNullMap()'], + '0x510f44cb': ['TestFactoryUser()'], + '0xd3ea3322': ['testBuildTokenSystemCost()'], + '0x2c60a055': ['MapTest()'], + '0x0e757a2e': ['testSetAndGet()'], + '0x2f0b15f6': ['testGetUnset()'], + '0x1dda5c7d': ['testFailSubBalanceBelowZero()'], + '0x9bac8602': ['testFailAddBalanceAboveOverflow()'], + '0x953a7fab': ['testMoveBalance()'], + '0xd930a90b': ['testFailMoveBalanceDueToInsufficientFunds()'], + '0x0cee22e9': ['testSetBalanceSetsSupply()'], + '0xcd9380d5': ['testSetBalanceSetsSupplyCumulatively()'], + '0x6f4dd69c': ['testSetBalanceUpdatesSupply()'], + '0x0c9fcec9': ['setApproval(address,address,uint256)'], + '0x89fcd099': ['getApproval(address,address)'], + '0xa005b87b': ['NullMapTest()'], + '0x4bd70ea3': ['testFailGetUnset()'], + '0x7d287697': ['testTryGetUnset()'], + '0x4464aec7': ['testTryGet()'], + '0x62a0b56b': ['testUnset()'], + '0x013d64bd': ['setCanCall(address,address,string,bool)'], + '0x2a714078': ['triggerAuth()'], + '0x6cb3d30a': ['triggerTryAuth()'], + '0x31db4b95': ['doTriggerAuth()'], + '0xd42bf301': ['doTriggerTryAuth()'], + '0xfe6f0d82': ['testConstructorEvent()'], + '0x9e920587': ['testOwnedAuth()'], + '0x7ac91cc2': ['testFailOwnedAuth()'], + '0xd3aa831f': ['testOwnedTryAuth()'], + '0xcae523c1': ['testOwnedTryAuthUnauthorized()'], + '0xaa7dcd84': ['testUpdateAuthorityEvent()'], + '0x9205fbc2': ['testAuthorityAuth()'], + '0x8fd28bcf': ['testFailAuthorityAuth()'], + '0x31ab4066': ['testAuthorityTryAuth()'], + '0xfd339d18': ['testAuthorityTryAuthUnauthorized()'], + '0x5858ef10': ['testErrorNonOwnerCantBreach()'], + '0x138cc941': ['testErrorTransferToRejectAuthority()'], + '0xda6b31b9': ['testErrorTransferToNullAuthority()'], + '0x4e209678': ['testFailBreach()'], + '0x399fdb86': ['testFailNormalWhitelistReset()'], + '0x5dcdddd1': ['testSafeToAddFix()'], + '0xc1c0e9c4': ['exec()'], + '0x3f74fecb': ['DSTrueFallbackTest()'], + '0x8a46bf6d': ['testFallback()'], + '0x92c8eb96': ['DSFalseFallbackTest()'], + '0x01bb85a4': ['__startBlock(string)'], + '0xc7102df7': ['__stopBlock()'], + '0x661e3605': ['ConstructorContract(uint256)'], + '0x1d57bcf7': ['ProofLibInterface()'], + '0x1f4e996b': ['challenge(bool)'], + '0xa991cb0e': ['respond(uint256)'], + '0x5c5d625e': ['getProof()'], + '0x92d0d153': ['t()'], + '0x11f72496': ['testT()'], + '0xd992bd5b': ['testResultNotZero()'], + '0xea2ea847': ['testChallengeFinalize()'], + '0x4b729aff': ['buyNumber(uint256)'], + '0x9dafbc13': ['initBlock(uint256)'], + '0xe2bbb158': ['deposit(uint256,uint256)'], + '0x201dcd7a': ['newChallenge(uint256,uint256)'], + '0x43114842': ['acceptChallenge(uint256,uint256,uint256)'], + '0x3c0870ae': ['challenge(uint256,uint256,uint256,bool)'], + '0xab09ee80': ['respond(uint256,uint256,uint256,uint256)'], + '0xb6013cef': ['finalize(uint256,uint256)'], + '0xf869b11a': ['declareVictor(uint256,uint256)'], + '0x9f489e4e': ['getDeposit(uint256,address)'], + '0xa0befa94': ['getStake(uint256,uint256)'], + '0x33637d5a': ['getPendingBlock(uint256)'], + '0x28cc413a': ['getProof(uint256,uint256,uint256)'], + '0xc37ff3d9': ['sha(uint256,uint256)'], + '0xf77a0923': ['BitcoinProcessor(address)'], + '0x1c0b6367': ['processTransaction(bytes,uint256)'], + '0x2b861629': ['storeBlockHeader(bytes)'], + '0xcef887b0': ['storeBlockWithFee(bytes,int256)'], + '0x6ebf10fe': ['storeHeader(bytes,address)'], + '0x540cafe0': ['storeHeaderWithFee(bytes,int256,address)'], + '0x7cc48875': ['Slots()'], + '0x3b84edbd': ['setRNG(address)'], + '0xd65ab5f2': ['startGame()'], + '0xeec3cb41': ['placeBet(bool[],uint256,uint256)'], + '0xac6bc853': ['startSpin()'], + '0x934354e7': ['finishSpin()'], + '0x93c94acb': ['calculateRewards(uint256[3][3])'], + '0x00100a18': ['NewPoll(string,string,uint256,uint256)'], + '0x1277e24f': ['payOneTimeFee()'], + '0xfc36e15b': ['vote(string)'], + '0x9a36f932': ['feeDivisor()'], + '0x8d99b2eb': ['endPoll()'], + '0x224993c2': ['setTimeBlock(uint256)'], + '0xfcfff16f': ['open()'], + '0x776d62f6': ['costs()'], + '0x82996d9f': ['rent()'], + '0x5ca8bc52': ['returnIt()'], + '0x8ecc0950': ['returnToOwner()'], + '0xfb5d5729': ['getPongvalTransactional()'], + '0x3af94817': ['getPongvalRemote()'], + '0x40193d17': ['getPongvalConstant()'], + '0xf4d94699': ['EndowmentRetriever()'], + '0xfab43cb1': ['getPongAddress()'], + '0xf00aac7f': ['ArrayRR()'], + '0x6c6f1d93': ['getContractCreationValue()'], + '0xa311dd70': ['setArray(uint8[10])'], + '0xf239e528': ['sendOneEtherHome()'], + '0xb8c86aa6': ['getArraySettingResult()'], + '0xd504ea1d': ['getArray()'], + '0x80db79d9': ['StructAndFor()'], + '0x181be00d': ['getValue(uint8)'], + '0x4166c1fd': ['getElevation(uint8,uint8)'], + '0xa3747fef': ['register(bytes,bytes)'], + '0x5460ef10': ['sendWithExtraGas(address,uint256,uint256)'], + '0x5dac1601': ['SimpleStablecoin()'], + '0xbe7cddf8': ['TwoD()'], + '0x1ebe5c0f': ['sendWithAllOurGasExcept(address,uint256,uint256)'], + '0x557ed1ba': ['getTime()'], + '0x0e13b9af': ['getValue(uint8,uint8)'], + '0x3ab1e703': ['roundMoneyDown3SF(uint256)'], + '0x880cdc31': ['updateOwner(address)'], + '0xd4088e33': ['setPrice(uint256,uint256,uint64)'], + '0x992ae976': ['isSafePunctuation(bytes1)'], + '0x6f8b44b0': ['setMaxSupply(uint256)'], + '0xdb2a0cb7': ['HumanStandardTokenFactory()'], + '0xbe592488': ['validateName(bytes)'], + '0x64edfbf0': ['purchase()'], + '0xa2f3ede2': ['computeNameHash(bytes)'], + '0xfc94dd18': ['verifyHumanStandardToken(address)'], + '0xfe757fb5': ['lastClaimPrice()'], + '0xd35b9d83': ['codeAt(address)'], + '0x64325ddb': ['currentClaimPrice()'], + '0x08216c0f': ['createHumanStandardToken(uint256,string,uint8,string)'], + '0x4f8e624e': ['Greeter(string)'], + '0x5fbddcf3': ['isLivingMonarch()'], + '0x42cbb15c': ['getBlockNumber()'], + '0x2ea459b8': ['claimThrone(bytes)'], + '0xa15afb48': ['Replicator()'], + '0xd6d902c4': ['claimThroneFor(bytes,address)'], + '0xa4136862': ['setGreeting(string)'], + '0x70961774': ['getBlockCreatedOn()'], + '0x59a547b0': ['recordCommission(uint256)'], + '0x715ef4ff': ['resendFailedPayment(uint256)'], + '0x19a278b9': ['getBAddress()'], + '0xe6e91cfc': ['voidFailedPayment(uint256)'], + '0xcb553ac9': ['sweepWizardCommission(uint256)'], + '0xd96aee49': ['MultipleConstructorTest()'], + '0x2d116186': ['deityBalance()'], + '0xa819819b': ['sweepDeityCommission(uint256)'], + '0x705eeb90': ['MultipleConstructorTest(bool)'], + '0xedb27f4e': ['switchWizard(address)'], + '0x1e223143': ['getFirst()'], + '0xa70a9ad7': ['switchDeity(address)'], + '0xdce4a447': ['at(address)'], + '0x1b03316f': ['getSecond()'], + '0xc1c723f4': ['validateProposedMonarchName(bytes)'], + '0x6d1f00a6': ['ThroneMaker(uint256)'], + '0xf2080ba6': ['Pong(int8)'], + '0x273bc3c9': ['numberOfThrones()'], + '0x1a092541': ['getDescription()'], + '0x23a1c271': ['setPongval(int8)'], + '0x931df75f': ['validateProposedThroneName(bytes)'], + '0x694e0d5b': ['StringPasser(uint8[])'], + '0xa396541e': ['getPongvalTxRetrievalAttempted()'], + '0x01df7f30': [ + 'validateProposedThroneConfig(uint256,uint256,uint256,uint256)' + ], + '0x16870257': ['getTileDescription(uint8,uint8)'], + '0x5581004d': ['createThrone(bytes,uint256,uint256,uint256,uint256)'], + '0x044f9ac8': ['findThroneCalled(bytes)'], + '0xd8589be3': ['CoinFlipper()'], + '0xb3a0b1ef': ['basicInfoGetter()'], + '0xf4e36afd': ['findThroneByNameHash(uint256)'], + '0x5acce36b': ['getEndowmentBalance()'], + '0x4ca8b0d0': ['registerExistingThrone(bytes,address,uint256,uint256)'], + '0xf8f46b5f': ['getCurrentMinerAddress()'], + '0xf9e05ed9': ['sha(uint128)'], + '0x2f4ee5d4': ['registerThrone(bytes,uint256,address,uint256,uint256)'], + '0x25d8dcf2': ['betAndFlip()'], + '0xa1188e56': ['getCurrentDifficulty()'], + '0x58ea80e5': ['setThroneCreationPrice(uint256)'], + '0x34dbe44d': ['getLastBlockNumberUsed()'], + '0x92b7d5b9': ['getCurrentGaslimit()'], + '0x94c3fa2e': ['getLastBlockHashUsed()'], + '0xee6d2641': ['sendWithExtraGasExt(address,uint256,uint256)'], + '0x6fd902e1': ['getCurrentBlockNumber()'], + '0xcee6f93c': ['getResultOfLastFlip()'], + '0x5294157f': ['sendWithAllOurGasExceptExt(address,uint256,uint256)'], + '0x796b89b9': ['getBlockTimestamp()'], + '0x0efafd01': ['getPlayerGainLossOnLastFlip()'], + '0x4b5dc8cb': ['roundMoneyDown3SFExt(uint256)'], + '0xc8e7ca2e': ['getMsgData()'], + '0x4d536f9f': ['validateNameExt(bytes)'], + '0x7a6ce2e1': ['getMsgSender()'], + '0x635cfda2': ['Incrementer()'], + '0x7fd8ee68': ['computeNameHashExt(bytes)'], + '0xa17042cc': ['getMsgValue()'], + '0xfc2c3e08': ['getIteration()'], + '0x9d5c6061': ['getMsgGas()'], + '0x77e5bf84': ['getTxGasprice()'], + '0xb8077e28': ['getTxOrigin()'], + '0xe31bfa00': ['next_id()'], + '0x32a2c5d0': ['getContractAddress()'], + '0x26066ad5': ['offer(uint256,bytes,uint256,bytes)'], + '0xc3da42b8': ['c()'], + '0x6f9fb98a': ['getContractBalance()'], + '0xb742398b': ['trade(address,uint256,bytes,address,uint256,bytes)'], + '0x67cb61b6': ['getChoice()'], + '0xd96a094a': ['buy(uint256)'], + '0x29161820': ['Base(uint256)'], + '0xa5d0bab1': ['buyPartial(uint256,uint256)'], + '0x20bf0c52': ['Derived(uint256)'], + '0x40e58ee5': ['cancel(uint256)'], + '0x13d1aa2e': ['f(uint256,uint256)'], + '0x4579268a': ['getOffer(uint256)'], + '0xe420264a': ['g(uint256)'], + '0x57e871e7': ['blockNumber()'], + '0x4848b1a5': ['setData(uint256,uint256)'], + '0x83324e8c': ['numGroups()'], + '0x0178fe3f': ['getData(uint256)'], + '0x3807ba1b': ['poi()'], + '0x9928811b': ['testBroken()'], + '0x75949c13': ['sendHalf(address)'], + '0x3c7a3aff': ['commit()'], + '0x90b5561d': ['insert(uint256)'], + '0x27121069': ['verify(bytes,uint8,bytes,bytes)'], + '0x3e2729bf': ['isRevocated(bytes)'], + '0x853255cc': ['sum()'], + '0x8cfd8901': ['_incBlock()'], + '0x2feda2fa': ['POI()'], + '0x6a4a6b6e': ['_myAddressHelper()'], + '0x100c8ada': ['setCAmodulus(bytes)'], + '0x5bbfe9b6': ['_myGroupHelper()'], + '0x114d69b2': ['setCRLaddr(address)'], + '0xfd747c0b': ['rsaVerify(bytes,bytes,uint256,bytes)'], + '0x8ac4e1d8': ['TemperatureOracle()'], + '0xfaee13b9': ['set(int8)'], + '0x84734476': ['copyBytes(bytes,uint256,uint256,bytes,uint256)'], + '0x9507d39a': ['get(uint256)'], + '0x9209b3c0': ['getCrtDetails(bytes)'], + '0x17ff0caa': ['WeatherBet(uint256,address,address,address)'], + '0x4664b235': ['bytes32_to_bytes(bytes,bytes,bytes)'], + '0x71dd8862': ['IndexOf()'], + '0xfc687311': ['betOn(int8)'], + '0xa87e7552': ['isValid(bytes,bytes)'], + '0x264c8e9a': ['whatWasTheVal()'], + '0x0b7623ba': ['abs(int8)'], + '0xb4787dc5': ['linkEID(bytes,bytes)'], + '0xbe71248a': ['payWinner()'], + '0x2a095fbe': ['unlinkEID(bytes,bytes,address)'], + '0x511b1df9': ['addr(string)'], + '0x2d077ad0': ['Latch()'], + '0x01984892': ['name(address)'], + '0x616fca9b': ['adopt(address)'], + '0xdf55b41a': ['owner(string)'], + '0x2125b65b': ['transfer(uint32,address,uint224)'], + '0x7f445c24': ['subRegistrar(string)'], + '0xf509b627': ['confirm(address,uint224,uint32,address)'], + '0xdd54a62f': ['content(string)'], + '0xa79f26dc': ['force()'], + '0x20620f37': ['onAuctionEnd(string)'], + '0x89cc5ea8': ['bid(string,address,uint256)'], + '0xb9f37c86': ['Registrar()'], + '0xae999ece': ['reserve(string)'], + '0xff1f7046': ['requiresAuction(string)'], + '0x092b25e9': ['setOwner(string,address)'], + '0x01bd4051': ['disown(string)'], + '0xc47f0027': ['setName(string)'], + '0x9b2ea4bd': ['setAddress(string,address)'], + '0xccf4f413': ['setSubRegistrar(string,address)'], + '0x8bbda7e3': ['setContent(string,bytes)'], + '0x98b1e06a': ['deposit(bytes)'], + '0x1bcf5758': ['getOccupies(uint8)'], + '0xfde9ba41': ['transfer(bytes,address,uint256)'], + '0x0878bc51': ['getAttachesto(uint8)'], + '0x922dd59a': ['icapTransfer(bytes,address,bytes,uint256)'], + '0x4d9e4e22': ['Etheria()'], + '0xe039e4a1': ['getOwner(uint8,uint8)'], + '0xdd34e129': ['PriceTest()'], + '0x7d5fec5a': ['setOwner(uint8,uint8,address)'], + '0xd2d4bd72': ['getCrossRate(bytes,bytes)'], + '0xa55cab95': ['getName(uint8,uint8)'], + '0x93eec1fb': ['setName(uint8,uint8,string)'], + '0xd39eb301': ['getStatus(uint8,uint8)'], + '0x54385526': ['setStatus(uint8,uint8,string)'], + '0x8435be4b': ['getLastFarm(uint8,uint8)'], + '0x90fd53ec': ['farmTile(uint8,uint8,int8)'], + '0x8cae1374': ['editBlock(uint8,uint8,uint256,int8[5])'], + '0xfa93019c': ['getBlocks(uint8,uint8)'], + '0x4ca168cf': ['register(bytes,uint256,address,string,uint256)'], + '0x2ef761d3': ['buyTile(uint8,uint8)'], + '0x6cf9cc58': ['registerResource(bytes,uint256,bytes,string)'], + '0x46c52b1a': ['blockHexCoordsValid(int8,int8)'], + '0xfae9d06d': ['calculateTxFee(uint256,address)'], + '0xbb963c8a': ['transferLibOwnership(bytes,address)'], + '0x8d7108e5': ['isValidLocation(uint8,uint8,int8[5],int8[24])'], + '0xfe029156': ['swap(address,address,uint256,uint256)'], + '0x081bf263': ['isOOB(uint8,uint8)'], + '0x4dd49ab4': ['get(bytes,uint256)'], + '0x9cc9299e': ['killSwap()'], + '0x182db370': ['getWhatHappened()'], + '0x6e353a1d': ['emergencyWithdrawal(address)'], + '0xdf98ef33': ['getResource(bytes,uint256,bytes)'], + '0xf2a75fe4': ['empty()'], + '0xc913b552': ['getVersions(bytes)'], + '0x10c1952f': ['setLocked()'], + '0x0f7d6673': ['Channel()'], + '0x763a738c': ['allNames()'], + '0x2d49ffcd': ['getLocked()'], + '0x423d4ef2': ['createChannel()'], + '0xcb14d93b': ['getHash(bytes,address,uint256)'], + '0x4d1f8c31': ['owner(uint64)'], + '0xadf5e565': ['verify(bytes,address,uint256,uint8,bytes,bytes)'], + '0xe86afde0': ['description(uint64)'], + '0x60c6b3a5': ['claim(bytes,address,uint256,uint8,bytes,bytes)'], + '0x0fdb468f': ['fee(uint64)'], + '0xcebce72d': ['token(uint64)'], + '0xf1c30ec0': ['reclaim(bytes)'], + '0xc0171112': ['timestamp(uint64)'], + '0x7b1cbb13': ['getChannelValue(bytes)'], + '0x1216e771': ['expiration(uint64)'], + '0x29e94503': ['VersionedBlob()'], + '0x5322f0c5': ['getChannelOwner(bytes)'], + '0x1c2f38ff': ['paid(uint64)'], + '0x4c488dac': ['getChannelValidUntil(bytes)'], + '0x9eab5253': ['getMembers()'], + '0x7c79ebce': ['expired(uint64)'], + '0x01da73ff': ['isValidChannel(bytes)'], + '0x541d920c': ['commit(bytes,string)'], + '0x9e66cd38': ['free(uint64)'], + '0x6dd6e87b': ['checkOut(int256)'], + '0x1fb6e99d': ['paymentNeeded(uint64)'], + '0xbb4d7cd1': ['tag(uint256,string)'], + '0x268eb055': ['setDescription(uint64,bytes)'], + '0x856deacf': ['findTag(string)'], + '0x21b36a08': ['setFee(uint64,uint256)'], + '0x86bb7121': ['getBlocksPerRound()'], + '0xb0de1cb7': ['publish(uint64,bytes,uint64)'], + '0x35d129f6': ['untag(string)'], + '0x7ef09476': ['transfer(uint64,address)'], + '0x87bb7ae0': ['getTicketPrice()'], + '0x4c6d1d9e': ['checkOutTag(string)'], + '0x89b8b492': ['read(uint64)'], + '0x67af1c81': ['getRoundIndex()'], + '0x49cbe338': ['tryRead(uint64)'], + '0x358d5dc2': ['getIsCashed(uint256,uint256)'], + '0xb1d51d31': ['pay(uint64,address)'], + '0x6572ae13': ['calculateWinner(uint256,uint256)'], + '0x452fbc41': ['USN(address,address,bytes,uint256,uint256,uint128)'], + '0xdf2f0a4a': ['getDecisionBlockNumber(uint256,uint256)'], + '0x46a2679a': ['getSubpotsCount(uint256)'], + '0x93dafba2': ['getSubpot(uint256)'], + '0x1e62be25': ['Bytes32Passer()'], + '0x930ed251': ['getSavedVar()'], + '0xce5566c5': ['cash(uint256,uint256)'], + '0x6df3edef': ['getSavedBytes()'], + '0x8089d001': ['getHashOfBlock(uint256)'], + '0x812cddf2': ['getSavedString()'], + '0x459f93f7': ['getBuyers(uint256,address)'], + '0x305a762a': ['getTicketsCountByBuyer(uint256,address)'], + '0x28d3ad3f': ['getPot(uint256)'], + '0xbcd3d8ca': ['Collector(address,address,uint256)'], + '0xaf93afdd': [ + 'Shipment(bytes,bytes,bytes,bytes,string,bytes,uint256,uint256,bytes,bytes,uint256,uint256,string,bytes,bytes,bytes)' + ], + '0x7e3faec1': ['GoldTxFeePool(address,address,bytes)'], + '0x7b789b3d': ['agreement(bytes,bytes,bytes)'], + '0xd7f31eb9': ['forward(address,uint256,bytes)'], + '0x5e11544b': ['newPeriod()'], + '0xe2fdcc17': ['escrow()'], + '0x45d27edf': ['forward_method(bytes,address,uint256,bytes)'], + '0x8d227fc0': ['getPeriodInfo()'], + '0xd116c8c4': ['releasePayment()'], + '0x97daa043': ['register(bytes,address,address,uint256,bytes)'], + '0x11e99c22': ['arrival()'], + '0xa7dfc874': ['unregister(bytes,address,uint256,bytes)'], + '0x412664ae': ['sendToken(address,uint256)'], + '0x86c57fcc': ['b32ToBytes(bytes)'], + '0x8c4dd5cd': ['Democracy()'], + '0x66d38203': ['setup(address)'], + '0xe8a1c08f': ['nibbleToChar(uint256)'], + '0x86a50535': ['voteFor(uint256)'], + '0xdbc45228': ['newProposal(address,uint256,bytes,bytes)'], + '0xa99e7e29': ['register(bytes,address)'], + '0x5e44daf3': ['vote(uint256,int256)'], + '0x750e443a': ['voteAgainst(uint256)'], + '0x0d61b519': ['executeProposal(uint256)'], + '0x798974dd': ['getNumProposals()'], + '0x4245b0f7': ['Lottery()'], + '0x11610c25': ['bet()'], + '0x837e7cc6': ['rollDice()'], + '0x714064f3': ['BreakableBond(address,address,uint256)'], + '0x74389991': ['breakit()'], + '0x4cedf74e': ['get_party1()'], + '0xd81a91e9': ['get_party2()'], + '0xa89a4f09': ['creatorBalanceChecker()'], + '0xb9e6f1d9': ['get_amount()'], + '0xa4325485': ['getCreatorBalance()'], + '0xe9a9c1b4': ['get_party1_balance()'], + '0xf363441f': ['getCreatorDotBalance()'], + '0xb8017221': ['get_party2_balance()'], + '0x0109f22e': ['CrowdSale()'], + '0x39aaba25': ['get_status()'], + '0x670c884e': ['setup(address,uint256,uint256,uint256,address)'], + '0x639d57f2': ['testGetBitSuccess()'], + '0x4f76cb02': ['testGetBitFailIndexOOB()'], + '0xfadf87b1': ['testGetBitsSuccess()'], + '0x5a353193': ['KrakenPriceTicker()'], + '0xf24a534e': ['Oracle()'], + '0xc8bb73ef': ['testGetBitsFailIndexOOB()'], + '0x4894e37f': ['__callback(bytes,string,bytes)'], + '0x98596726': ['note(uint224)'], + '0x68e4bd99': ['testSetBitSuccess()'], + '0x69f18967': ['testSetBitFailIndexOOB()'], + '0x2212dbc3': ['get_timestamp()'], + '0x8ba9f354': ['testClearBitSuccess()'], + '0x7057c20d': ['CFD(address)'], + '0x0aa46c12': ['testClearBitFailIndexOOB()'], + '0xd7ef1356': ['best_adjustment(bool)'], + '0xe706918c': ['testToggleBitSuccess()'], + '0x7af30442': ['testToggleBitFailIndexOOB()'], + '0x414053be': ['best_adjustment_for(bool,uint128)'], + '0xdaa21e0e': ['testBitSetSuccess()'], + '0xeef547d7': ['deal_details(uint32)'], + '0x254c91b3': ['testBitNotSetSuccess()'], + '0xb144adfb': ['balance_of(address)'], + '0x2145e36c': ['testBitSetFailIndexOOB()'], + '0xfc63d4fb': ['order(bool,uint32,uint128)'], + '0x6d052f56': ['testBitsSetSuccess()'], + '0xf1cff4b5': ['testBitsNotSetSuccess()'], + '0x1381e400': ['cancel(uint32)'], + '0xf85aefba': ['testBitsSetFailIndexOOB()'], + '0xf41017fc': ['finalize(uint24)'], + '0x42a745cb': ['testBitEqualSuccess()'], + '0x4e6ab570': ['insert_order(address,bool,uint32,uint128)'], + '0xf362d78f': ['testBitNotEqualSuccess()'], + '0xb2d37e95': ['remove_order(uint32)'], + '0x8a120dc9': ['testBitEqualFailIndexOOB()'], + '0x64a4a5d7': ['testBitsEqualSuccess()'], + '0x6f36ce79': ['insert_deal(address,address,uint64,uint128,uint32)'], + '0x74087040': ['testBitsNotEqualSuccess()'], + '0x10e89b22': ['remove_deal(uint32)'], + '0xfbffb355': ['testBitsEqualFailIndexOOB()'], + '0x1e44c112': ['find_strike(uint64,uint32,uint32)'], + '0x2b785960': ['testBitAndSuccess()'], + '0xc388cca6': ['testBitAndFailIndexOOB()'], + '0xbac1e2e0': ['testBitsAndSuccess()'], + '0xd588acc4': ['claimMiningReward()'], + '0xda2b7416': ['testBitsAndFailIndexOOB()'], + '0xa1616429': ['testBitOrSuccess()'], + '0xfd83f3e3': ['QueueUserMayBeDeliveryDroneCotnrol()'], + '0x91e8d3dc': ['testBitOrFailIndexOOB()'], + '0x4ca1fad8': ['addRequest(uint256)'], + '0xec0f1025': ['testBitsOrSuccess()'], + '0xe4690a0b': ['popRequest()'], + '0x2581c674': ['testBitsOrFailIndexOOB()'], + '0xab91c7b0': ['queueLength()'], + '0x31be6985': ['testBitXorSuccess()'], + '0xa268b332': ['testBitXorFailIndexOOB()'], + '0xe044c2de': [ + 'newLoan(bytes,address,uint256,uint256,uint256,uint256,uint256,uint256)' + ], + '0x622e88cb': ['testBitsXorSuccess()'], + '0x8e46fbb2': ['testBitsXorFailIndexOOB()'], + '0xc1cbbca7': ['contribute(uint256)'], + '0x278ecde1': ['refund(uint256)'], + '0xe2f8a017': ['payInstallment(uint256)'], + '0xbb510a77': ['createChannel(address,uint256)'], + '0xacf8bf2a': ['channelCount()'], + '0xd7bc23af': ['newParameters(int256,uint256,uint256,uint256)'], + '0x1b855044': ['getHash(uint256,uint256)'], + '0x65093661': ['newCommunity(address)'], + '0xe22b0c46': ['verify(uint256,uint256,uint8,bytes,bytes)'], + '0x5f1231ea': ['getMemberInfo(address)'], + '0x23add736': ['claim(uint256,uint256,uint8,bytes,bytes)'], + '0x3dd7c1b9': ['newProduct(string,string,uint256,uint256)'], + '0x79a85e6c': ['getProductInfo(uint256)'], + '0x2dabbeed': ['reclaim(uint256)'], + '0xa0440426': ['purchaseProduct(uint256,uint256)'], + '0xb7a97a2b': ['isValidChannel(uint256)'], + '0xe7d50e5c': ['FarmShare()'], + '0x3e0a51b4': ['TweetAccount()'], + '0xb6db75a0': ['isAdmin()'], + '0x4a23dc52': ['FileStore()'], + '0xfb46d4c5': ['tweet(string)'], + '0x5aebfd14': ['createFile(bytes)'], + '0xc3ad5ecb': ['getTweet(uint256)'], + '0xc5958bda': ['removeFile(bytes)'], + '0xae978f08': ['getLatestTweet()'], + '0x3d8e2947': ['getFileAddress(bytes)'], + '0xe4c2db06': ['getPreviousFile(bytes)'], + '0x0c4f65bd': ['getOwnerAddress()'], + '0xca77ab8a': ['getNextFile(bytes)'], + '0xca7dc5b1': ['getNumberOfTweets()'], + '0xdc63a62c': ['getFileListHead()'], + '0x95671958': ['getFileListTail()'], + '0x5c3e426c': ['adminRetrieveDonations(address)'], + '0x7d60e343': ['getFileListSize()'], + '0x3e450fff': ['adminDeleteAccount()'], + '0xe4360fc8': ['getFileListElement(bytes)'], + '0x492b67ea': ['Etherdoc()'], + '0x3f77b560': ['newDocument(bytes)'], + '0x3448c7d6': ['createHistory(bytes,address,address)'], + '0x0b80f8d3': ['invmod(uint256,uint256)'], + '0x2f6ae467': ['transferDocument(bytes,address)'], + '0x783ce458': ['expmod(uint256,uint256,uint256)'], + '0xe4547f98': ['documentExists(bytes)'], + '0xeccb15bc': ['SatPosition(int256,int256)'], + '0xf6458c6a': ['toZ1(uint256[3],uint256)'], + '0x3f9b250a': ['getDocument(uint256)'], + '0xafc4a982': ['PathCost(uint16,uint32)'], + '0xc36af460': ['getLatest()'], + '0x306df22d': ['GPSDestination(int256,int256,uint256)'], + '0xd44aadf7': ['initROS()'], + '0x54ae8492': ['CustodialForward()'], + '0x4a00a522': ['homebase(int256,int256)'], + '0x677913e9': ['setAmount(int32)'], + '0x418cf199': ['setEstimateCost(uint256,uint256)'], + '0x739f888c': ['setNewEstimate(int256,int256)'], + '0xc028df06': ['offer()'], + '0xe816a515': ['takeFlight()'], + '0xa6f2ae3a': ['buy()'], + '0xd810f298': ['computeSettlementAmount()'], + '0x48a0d754': ['available()'], + '0xb595181f': ['ShapeshiftBot()'], + '0xf27197ab': ['getIsAvailable()'], + '0xcb2b9031': ['addressToBytes(address,address)'], + '0x883ba26b': ['getIsSettled()'], + '0x504ac982': ['transfer(string,string)'], + '0x60e519c0': ['computeMarginAmount()'], + '0x8a9ffb90': ['transfer(string,string,bool)'], + '0x468f02d2': ['getUnderlyingPrice()'], + '0x2facc4e8': ['depositGovernance(uint256,address)'], + '0xf29617da': ['registrationDeposit(address)'], + '0x1d834a1b': ['insert(uint256,uint256)'], + '0x9a863892': ['NewProposal(uint256)'], + '0xe2233ada': ['smartDoor(address[])'], + '0x3106fea0': ['voteOnProposal(uint256,bool,uint256)'], + '0x22ebb3ac': ['DieselPricePeg()'], + '0xdb0e127a': ['openDoor()'], + '0x0965bf7d': ['processProposals()'], + '0x82ab890a': ['update(uint256)'], + '0xa05e822a': ['howManyOwners()'], + '0xa0e67e2b': ['getOwners()'], + '0x67546967': ['EthBtcEscrow()'], + '0x63052d82': ['getOwnersIndex(address)'], + '0x6cf761d4': ['getMinConfirmationsByAddr(address)'], + '0x97297467': ['checkAndVerify(bytes)'], + '0x9c43d950': ['registration(uint256,uint256,uint256)'], + '0xe68d3ae3': ['escrow(uint256,string,address,uint256)'], + '0xeece1e1f': ['scheduleShuffling()'], + '0x35ee2783': ['Alarm()'], + '0x48519189': ['MonedaAlcala(string,string)'], + '0xbd9335c0': ['scheduleHangouts()'], + '0x7143059f': ['getParticipant(address)'], + '0x65b1fdf4': ['scheduleIssuePOIs()'], + '0xb3c25835': ['addUser(address,string,string,uint256)'], + '0xb37217a4': ['getRandomNumber(uint256)'], + '0x47274dbe': ['disableUser(address,address)'], + '0xdcf73856': ['generateGroups()'], + '0x2090cf8b': ['consultBalance(address)'], + '0xc3d345c4': ['getHangoutAddress()'], + '0x9f8a13d7': ['isActive(address)'], + '0x4e23a144': ['fundUser(address,uint256)'], + '0x34e8980f': ['bootUpHangouts()'], + '0xfc89aff6': ['submitVerifiedUsers(address[])'], + '0x96ed10a4': ['issuePOIs()'], + '0x92b4bb50': ['rps()'], + '0x8e7ea5b2': ['getWinner()'], + '0x718e6302': ['play(string)'], + '0x4c738909': ['getMyBalance()'], + '0x79b0797c': ['AmIPlayer1()'], + '0x805210b7': ['AmIPlayer2()'], + '0x452d44dc': ['checkBothNotNull()'], + '0x4162169f': ['dao()'], + '0xce8b7151': ['isHF()'], + '0x8cdfb1e6': ['transferIfHF(address)'], + '0xc3b8bfe5': ['transferIfNoHF(address)'], + '0x82afd23b': ['isActive(uint256)'], + '0xc41a360a': ['getOwner(uint256)'], + '0xd05c78da': ['safeMul(uint256,uint256)'], + '0xd6febde8': ['buy(uint256,uint256)'], + '0x598647f8': ['bid(uint256,uint256)'], + '0x379607f5': ['claim(uint256)'], + '0x2ac9bf09': ['bid(uint256,uint256,uint256)'], + '0x1df47aad': ['ReplayProtection()'], + '0xc42cd8cf': ['etherSplit(address,address)'], + '0x9f5f7c7f': ['tokenSplit(address,address,address,uint256)'], + '0x2c215998': ['updateStatus(string)'], + '0x30ccebb5': ['getStatus(address)'], + '0xb46300ec': ['send()'], + '0x92d282c1': ['Send()'], + '0x5323c6cf': ['calcCostsBuying(bytes,uint256,uint256[],uint8,uint256)'], + '0x532e7e6a': ['calcEarningsSelling(bytes,uint256,uint256[],uint8,uint256)'], + '0x46a1d95f': ['closeMarket(bytes)'], + '0x4b031d0f': ['shortSellShares(bytes,uint8,uint256,uint256)'], + '0x45c41478': ['getMarkets(bytes,address)'], + '0x1c879c47': ['getMarketHashes(bytes)'], + '0x9948e493': ['calcMarketFee(bytes,uint256)'], + '0xf7a0fa0a': ['getShareDistribution(bytes)'], + '0xd0315658': ['getShareDistributionWithTimestamp(bytes)'], + '0xef04fdb7': ['buyShares(bytes,uint8,uint256,uint256)'], + '0x86723215': ['createMarket(bytes,uint256,uint256,address)'], + '0x55ba343f': ['getMarket(bytes)'], + '0x4401ff5c': ['sellShares(bytes,uint8,uint256,uint256)'], + '0xdf6c13c3': ['getMinFunding()'], + '0x9431f5f0': ['withdrawFees(bytes)'], + '0x43703b0e': ['getEventData(bytes)'], + '0x632f0ba6': ['descriptionHashes(bytes)'], + '0x5e58f141': ['shares(address,bytes,int256)'], + '0xdb5b4183': ['oracleOutcomes(bytes,address)'], + '0x3d69b403': ['isOutcomeSet(bytes)'], + '0xea4ba8eb': ['getOutcome(bytes)'], + '0xbbd8b602': ['getOracleOutcomes(bytes,address[])'], + '0x9ec32d45': ['challengeWinningOutcome(bytes,uint16)'], + '0x41095b60': ['voteForUltimateOutcome(bytes,uint16)'], + '0x8f6f988c': ['setUltimateOutcome(bytes)'], + '0x0968f264': ['withdraw(bytes)'], + '0x1397fdbd': ['getShares(address,bytes,int256[])'], + '0x45ee49b9': ['getUltimateOutcomes(bytes)'], + '0xc90d080a': ['registerEvent(bytes)'], + '0xc0ae6a3a': ['ultimateOutcomes(bytes)'], + '0xc2038560': ['setOutcome(bytes,bytes)'], + '0x8204ecdd': ['getFee(bytes)'], + '0xffcf21a9': ['eventOracles(bytes,uint256)'], + '0x08bf2d0d': ['getOrderBook(uint256,uint256)'], + '0x0e0f55d0': ['RewardOrder(uint256,uint256)'], + '0x0e97cfdf': ['placeOrder(uint256,uint256,uint256)'], + '0x29ef56b1': ['getAskOrderBookStats()'], + '0x3bed33ce': ['withdrawEther(uint256)'], + '0x50baa622': ['withdrawToken(uint256)'], + '0x512f1e64': ['orderBookLength()'], + '0x8ea98117': ['setCoordinator(address)'], + '0x9824425a': ['takeOrder(uint256,uint256,uint256,uint256)'], + '0x98ea5fca': ['depositEther()'], + '0xa2f16d80': ['dexWithdrawCollectedFees()'], + '0xb6ed0632': ['cancelOrder(uint256,uint256)'], + '0xe71264fa': ['addNewTokens(uint256)'], + '0xf1e4a540': ['unsetCoordinator()'], + '0xfe992c98': ['balanceOfAll(address)'], + '0x069d6d1c': ['closeOrder(uint256)'], + '0x070a888f': ['updateRewardDuration(uint256)'], + '0x09405164': ['getOpenCandidates()'], + '0x09a69f57': ['getRewardAmount()'], + '0x27cca148': ['lastClaimedBlock()'], + '0x942b90d3': ['getRewardTable()'], + '0xa9eed530': ['reduceOrderQty(uint256,uint256)'], + '0xc67d376d': ['getClosedCandidates()'], + '0xd3f297d6': ['claimLiquidityReward()'], + '0xfcc11241': ['addOrder(uint256,uint256,uint256,uint256,uint256,uint8)'], + '0x5829d310': ['entries(int256)'], + '0x8f9df278': [ + 'newEntry(int256,bool,uint256,int256,string,bytes32,address,uint256[])' + ], + '0x031d973e': ['closeMarket(bytes32)'], + '0x16181bb7': ['shortSellShares(bytes32,uint8,uint256,uint256)'], + '0x5aa97eeb': ['getMarkets(bytes32[],address)'], + '0x674cc1f5': ['getMarketHashes(bytes32[])'], + '0x6da84ec0': ['calcMarketFee(bytes32,uint256)'], + '0x929e626e': ['getShareDistribution(bytes32)'], + '0xa0bde7e8': ['getShareDistributionWithTimestamp(bytes32)'], + '0xbbd4f854': ['buyShares(bytes32,uint8,uint256,uint256)'], + '0xc1fd4339': ['createMarket(bytes32,uint256,uint256,address)'], + '0xc3c95c7b': ['getMarket(bytes32)'], + '0xdb833e3a': ['sellShares(bytes32,uint8,uint256,uint256)'], + '0xebb71194': ['withdrawFees(bytes32)'], + '0x07d5b826': ['buyAllOutcomes(bytes32,uint256)'], + '0x15e812ad': ['getBaseFee()'], + '0x1934d55a': ['isPermanentlyApproved(address,address)'], + '0x1d007f5f': ['changeDAO(address)'], + '0x1f0c1e0c': ['getEventTokenAddress(bytes32,uint256)'], + '0x3983d5c4': ['calcBaseFee(uint256)'], + '0x4025b293': ['redeemAllOutcomes(bytes32,uint256)'], + '0x428d64bd': ['getShares(address,bytes32[])'], + '0x481b659d': ['permitPermanentApproval(address)'], + '0x57bcccb6': ['revokePermanentApproval(address)'], + '0x8c172fa2': ['getEvent(bytes32)'], + '0x9ba5b4e9': ['getEventHashes(bytes32[])'], + '0xa4a7cf5c': ['redeemWinnings(bytes32)'], + '0xb11e3b82': [ + 'createEvent(bytes32,bool,int256,int256,uint8,address,address,bytes32[])' + ], + '0xc10dd4c6': ['getEvents(bytes32[],address)'], + '0xc51cf179': ['calcBaseFeeForShares(uint256)'], + '0xeff6be2f': ['changeBaseFee(uint256)'], + '0x13fc6ac2': ['getEventData(bytes32)'], + '0x51017702': ['isOutcomeSet(bytes32)'], + '0x5d1a3b82': ['getOutcome(bytes32)'], + '0xc1b06513': ['registerEvent(bytes32[])'], + '0xc91d7e9c': ['getFee(bytes32[])'], + '0x3ced516c': ['descriptionHashes(bytes32)'], + '0x488b3538': ['shares(address,bytes32,int256)'], + '0x4ad07b0e': ['oracleOutcomes(bytes32,address)'], + '0x659fb968': ['getOracleOutcomes(bytes32[],address[])'], + '0x6b1e564a': ['challengeWinningOutcome(bytes32,uint16)'], + '0x7b395487': ['voteForUltimateOutcome(bytes32,uint16)'], + '0x8aa6f1b1': ['setUltimateOutcome(bytes32)'], + '0x8e19899e': ['withdraw(bytes32)'], + '0x98f3b81a': ['getShares(address,bytes32[],int256[])'], + '0xa0ec4e09': ['getUltimateOutcomes(bytes32[])'], + '0xc25e6908': ['ultimateOutcomes(bytes32)'], + '0xc71e48d6': ['setOutcome(bytes32,bytes32[])'], + '0xfcf0f55b': ['eventOracles(bytes32,uint256)'], + '0x01991313': ['scheduleCall(address,bytes4,uint256)'], + '0x480b70bd': ['scheduleCall(address,bytes4,uint256,uint256)'], + '0x049ae734': ['scheduleCall(address,bytes4,uint256,uint256,uint8)'], + '0x68402460': ['scheduleCall(address,bytes4,uint256,uint256,uint8,uint256)'], + '0x8b676ae8': [ + 'scheduleCall(address,bytes4,uint256,uint256,uint8,uint256,uint256)' + ], + '0x30fd300f': ['registerBytes32(address,bytes32)'], + '0x741e2345': [ + 'registerMany(address,uint256,int256,uint256,bytes20,address,bytes)' + ], + '0x73b55eaf': ['registerData(address,int256,bytes32,address)'], + '0xc2b12a73': ['setBytes32(bytes32)'], + '0xf2da67db': ['setMany(uint256,int256,uint256,bytes20,address,bytes)'], + '0x0e850239': ['scheduleCall(bytes4,bytes)'], + '0x4db3da83': ['scheduleCall(bytes4)'], + '0x373a1bc3': ['scheduleCall(address,bytes4)'], + '0x3c2c21a0': ['scheduleCall(address,uint256,bytes4)'], + '0xa1c0539d': ['scheduleCall(address,bytes4,bytes)'], + '0x795b9a6f': ['scheduleCall(address,bytes4,uint256,bytes)'], + '0xc43d0575': ['scheduleCall(bytes4,uint256)'], + '0x3d9ce89b': ['scheduleCall(bytes4,bytes,uint256)'], + '0x48f05187': ['scheduleCall(address,bytes4,bytes,uint256)'], + '0x346cabbc': ['scheduleCall(address,bytes4,uint256,bytes,uint256)'], + '0x8c0e156d': ['scheduleCall(bytes4,uint256,uint256)'], + '0x5a9f2def': ['scheduleCall(bytes4,bytes,uint256,uint256)'], + '0x9772c982': ['scheduleCall(address,bytes4,bytes,uint256,uint256)'], + '0x3a9e7433': ['scheduleCall(bytes4,uint256,uint256,uint8)'], + '0x64ee49fe': ['scheduleCall(address,uint256,bytes4,uint256,uint256,uint8)'], + '0xee77fe86': ['scheduleCall(address,bytes4,bytes,uint256,uint256,uint8)'], + '0xe29fb547': ['scheduleCall(bytes4,uint256,uint256,uint8,uint256)'], + '0x03d22885': [ + 'scheduleCall(address,uint256,bytes4,uint256,uint256,uint8,uint256)' + ], + '0xb549793d': ['scheduleCall(bytes4,bytes,uint256,uint256,uint8,uint256)'], + '0x7b55c8b5': ['scheduleCall(address,bytes4,bytes,uint8,uint256[4])'], + '0x4c471cde': [ + 'scheduleCall(address,bytes4,bytes,uint256,uint256,uint8,uint256)' + ], + '0x938c4307': [ + 'scheduleCall(bytes4,bytes,uint16,uint8,uint256,uint256,uint256,uint256,uint256)' + ], + '0x0ce46c43': ['scheduleCall(address,bytes4,bytes,uint16,uint8,uint256[5])'], + '0x528eedcb': ['sendSafe(address,address,uint256)'], + '0x2812f8b8': [ + 'FutureCall(address,uint256,uint16,address,bytes4,bytes,uint256,uint256,uint256)' + ], + '0xcdda62ad': [ + 'FutureBlockCall(address,uint256,uint8,address,bytes4,bytes,uint256,uint256,uint16,uint256,uint256)' + ], + '0xc976bbbb': ['_compare(int256,bytes2,int256)'], + '0x9f2ce678': ['vote(bytes32,bool)'], + '0x318a3fee': ['relayTx(bytes,int256,int256[],int256,int256)'], + '0xa06db7dc': ['gracePeriod()'], + '0xc6502da8': ['basePayment()'], + '0x625cc465': ['baseDonation()'], + '0x938b5f32': ['origin()'], + '0xeaa37394': ['create(bytes,bytes32,bool,bool,bool,bool,bool)'], + '0xf6469342': ['_setPackedBlockNumber(bytes32,uint256)'], + '0xf3e84cf3': ['createNewRevision(bytes32,bytes)'], + '0xf0cb556c': ['updateLatestRevision(bytes32,bytes)'], + '0x37664643': ['retractLatestRevision(bytes32)'], + '0x9b619d3b': ['_deleteAllPackedRevisionBlockNumbers(bytes32)'], + '0x2bf1f9da': ['restart(bytes32,bytes)'], + '0x117b4705': ['retract(bytes32)'], + '0x0eb8ed07': ['transferEnable(bytes32)'], + '0xaaac50bd': ['transferDisable(bytes32)'], + '0x79ce9fac': ['transfer(bytes32,address)'], + '0xd93e7573': ['disown(bytes32)'], + '0x89ced196': ['setNotUpdatable(bytes32)'], + '0xfe8b6642': ['setEnforceRevisions(bytes32)'], + '0x0d244d68': ['setNotRetractable(bytes32)'], + '0xb7d454a4': ['setNotTransferable(bytes32)'], + '0x4788cabf': ['getContractId()'], + '0x737c8ea1': ['_getRevisionBlockNumber(bytes32,uint256)'], + '0x9070b18d': ['_getAllRevisionBlockNumbers(bytes32)'], + '0x7a02dc06': ['getInfo(bytes32)'], + '0xdeb931a2': ['getOwner(bytes32)'], + '0x64228857': ['getRevisionCount(bytes32)'], + '0xa95d017d': ['getRevisionBlockNumber(bytes32,uint256)'], + '0xb7dd1d17': ['getAllRevisionBlockNumbers(bytes32)'], + '0x49437210': ['getUpdatable(bytes32)'], + '0x0b6fcdb0': ['getEnforceRevisions(bytes32)'], + '0x331a72d1': ['getRetractable(bytes32)'], + '0xf0da84f8': ['getTransferable(bytes32)'], + '0x1d82e9c7': ['EXTRA_GAS()'], + '0x964c836c': ['receiveExecutionNotification()'], + '0xc262df45': ['isKnownRequest(address,address)'], + '0x7fee4ecb': ['GAS_PER_DEPTH()'], + '0x07ad9ecb': ['safeSend(address,uint256)'], + '0xeacc5b3b': ['safeSend(address,uint256,uint256)'], + '0x1a26ed1c': ['validateReservedWindowSize(uint256,uint256)'], + '0x2e898ddc': ['validateTemporalUnit(uint256)'], + '0xb3aaa277': [ + 'validate(address[4],address,uint256[11],uint256,bytes,uint256)' + ], + '0xc45b415e': ['createRequest(address[4],address,uint256[11],uint256,bytes)'], + '0xf00e8651': ['createRequest(address[2],address,uint256[11],uint256,bytes)'], + '0x17a601b5': ['MAX_STACK_DEPTH_REQUIREMENT()'], + '0x3121369d': ['validateRequiredStackDepth(uint256)'], + '0xb5f5962a': ['CALL_GAS_CEILING(uint256)'], + '0xf4c5ab7c': ['validateCallGas(uint256,uint256)'], + '0xd7504385': ['validateToAddress(address)'], + '0x610d5de8': ['validateEndowment(uint256,uint256,uint256,uint256,uint256)'], + '0xcd9a3c98': ['any(bool[7])'], + '0xf1fe42b8': [ + 'TransactionRequest(address[3],address,uint256[11],uint256,bytes)' + ], + '0x00a676f9': ['getExists(bytes32)'], + '0xf42aa287': ['getBlobStore(bytes12)'], + '0x8f420866': ['DEFAULT_SEND_GAS()'], + '0xa126c5df': ['GAS_TO_AUTHORIZE_EXECUTION()'], + '0xbd35d570': ['GAS_TO_COMPLETE_EXECUTION()'], + '0xf6bd5893': ['getGas(uint256)'], + '0x606deecd': ['requestData()'], + '0xf9909915': ['bulkStoreHeader(bytes,int256,bytes,int256)'], + '0x129484b6': [ + 'changeFeeRecipient(int256,int256,int256,int256,int256,int256)' + ], + '0xca0c1e62': [ + 'computeMerkle(int256,int256,int256[],int256,int256,int256[])' + ], + '0x752d349c': ['depthCheck(int256,int256)'], + '0x157f8f51': ['feePaid(int256,int256,int256,int256)'], + '0x7ca823d5': ['getAverageChainWork()'], + '0x9a15f4f3': ['getBlockHeader(int256,int256)'], + '0x2c181929': ['getChainWork()'], + '0xfa14df6b': ['getChangeRecipientFee()'], + '0xc018d0e6': ['getFeeAmount(int256,int256)'], + '0x16e27349': ['getFeeRecipient(int256,int256)'], + '0xace51abc': [ + 'helperVerifyHash__(uint256,int256,int256[],int256,uint256,int256,int256[],int256)' + ], + '0x11400d8e': ['priv_fastGetBlockHash__(int256,int256)'], + '0x3c2e7d54': ['priv_inMainChain__(int256,int256)'], + '0xecb0256b': [ + 'relayTx(bytes,int256,int256[],int256,int256,bytes,int256,int256[],int256,int256)' + ], + '0xfae8f9a2': ['setInitialParent(int256,int256,int256,int256,int256,int256)'], + '0x6e173a7f': ['storeBlockHeader(bytes,bytes)'], + '0x3af75ee1': ['storeBlockWithFee(bytes,int256,bytes,int256)'], + '0xfad9bf9e': [ + 'storeBlockWithFeeAndRecipient(bytes,int256,int256,bytes,int256,int256)' + ], + '0x05a5b8c6': [ + 'verifyTx(bytes,int256,int256[],int256,bytes,int256,int256[],int256)' + ], + '0x9a89ad65': ['within6Confirms(int256,int256)'], + '0x362af076': ['createRequest(address[3],address,uint256[11],uint256,bytes)'], + '0x09861b81': ['flooredSub(uint256,uint256)'], + '0x3dd297da': ['safeMultiply(uint256,uint256)'], + '0x88102583': ['safeCastSigned(uint256)'], + '0x592685d5': ['getWindowStart(address,address)'], + '0xbf2e694f': ['getPreviousRequest(address,address)'], + '0x1acb2719': ['getNextRequest(address,address)'], + '0x09d33f1d': ['addRequest(address,uint256)'], + '0xac8d6030': ['removeRequest(address)'], + '0xb15dcc25': ['query(address,bytes2,uint256)'], + '0x17e1b09b': ['minimumDeposit(uint256)'], + '0x8fbc3ecd': ['BUFFER()'], + '0x3f0ec70b': ['RequestFactory(address)'], + '0xfb87d5ea': [ + 'TransactionRequest(address[4],address,uint256[11],uint256,bytes)' + ], + '0xb311ee0c': ['refundClaimDeposit()'], + '0x8dd8596c': ['sendDonation()'], + '0x6720ceb1': ['sendPayment()'], + '0x6949a058': ['sendOwnerEther()'], + '0x66671c71': ['BaseScheduler(address,address)'], + '0xbf8c50ff': ['scheduleTransaction()'], + '0x93c166ec': ['computeEndowment(uint256,uint256,uint256,uint256)'], + '0xfff78f9c': ['doThrow()'], + '0xf0586f0d': ['doThrow(bool)'], + '0x2667f407': ['__proxy(address,bytes)'], + '0xc3fa5f93': ['BlockScheduler(address,address)'], + '0xb0bcc610': ['scheduleTransaction(address)'], + '0xb8f71f26': ['scheduleTransaction(uint256,address)'], + '0x30c0f8d6': ['scheduleTransaction(address,bytes)'], + '0xc0eb2325': ['scheduleTransaction(address,bytes,uint256)'], + '0x4d5b080c': ['scheduleTransaction(uint256,address,uint256)'], + '0xb03260be': ['scheduleTransaction(uint256,address,bytes)'], + '0xcf4a1612': ['scheduleTransaction(uint256,address,bytes,uint256)'], + '0xed4b1d0d': ['scheduleTransaction(uint256)'], + '0x57e2880d': ['scheduleTransaction(uint256,uint256)'], + '0xcf158fe9': ['scheduleTransaction(uint256,uint256,uint256)'], + '0xf0a78538': ['scheduleTransaction(uint256,bytes)'], + '0xe33c7ae2': ['scheduleTransaction(uint256,uint256,bytes)'], + '0x1099d3ec': ['scheduleTransaction(uint256,uint256,uint256,bytes)'], + '0x447cd682': ['scheduleTransaction(address,uint256)'], + '0x02e8d8c0': ['scheduleTransaction(address,uint256,uint256)'], + '0xd0549602': ['scheduleTransaction(address,uint256,uint256,uint256)'], + '0x44dd4b5e': ['scheduleTransaction(address,uint256,bytes)'], + '0xb67fabdf': ['scheduleTransaction(address,uint256,uint256,bytes)'], + '0xc9296d14': ['scheduleTransaction(address,uint256,uint256,uint256,bytes)'], + '0x314e0fb6': ['scheduleTransaction(address,bytes,uint256[3],uint256)'], + '0xceba30b5': ['scheduleTransaction(address,bytes,uint256[4],uint256)'], + '0xd4c2b6b1': ['scheduleTransaction(address,bytes,uint256[5],uint256)'], + '0xa42e36c6': ['scheduleTransaction(address,bytes,uint8,uint256[5],uint256)'], + '0x3c894475': ['scheduleTransaction(address,bytes,uint8,uint256[6],uint256)'], + '0x4ed4831a': ['all(bool[7])'], + '0xc5f310c0': ['register(bytes12)'], + '0x266710ca': ['manualUpdateBalances_only_Dev()'], + '0x2e0ef395': ['voteOnNewEntryFees_only_VIP(uint8)'], + '0x33ce7787': ['transferInvestorAccount(address,address)'], + '0x402e6230': ['getTotalGambles()'], + '0x580bdf3c': ['disableBetting_only_Dev()'], + '0x6ad50ed4': ['investmentEntryInfos()'], + '0x750cae6a': ['enableBetting_only_Dev()'], + '0x7c9cd7df': ['changeDeveloper_only_Dev(address)'], + '0xbb84d362': ['splitProfitVIP_only_Dev()'], + '0xc7144269': [ + 'changeSettings_only_Dev(uint256,uint256,uint256,uint256,uint16,uint256,uint256,uint256,uint8,uint8)' + ], + '0xe56c8552': ['spinTheWheel(address)'], + '0x433836dc': ['scheduleTransaction(address,bytes,uint8,uint256[3],uint256)'], + '0x9341231c': ['sendOrThrow(address,uint256)'], + '0x1d49e081': ['EXECUTE_EXTRA_GAS()'], + '0xd2531590': ['CANCEL_EXTRA_GAS()'], + '0xad8ed335': ['__proxy(address)'], + '0x9af605cb': ['__proxy(address,bytes,uint256)'], + '0xf10ae2ab': ['__dig_then_proxy(uint256,address,bytes)'], + '0x9a35f886': ['__dig_then_proxy(uint256)'], + '0x7cbcc254': ['__reset__()'], + '0x6aaba012': ['ErrorGenerator()'], + '0x40a3d246': ['toggle()'], + '0x51582ef3': ['sendProxyTransaction(address,uint256,uint256,bytes)'], + '0x7b632c41': ['TimestampScheduler(address,address)'], + '0xb69c0896': ['BaseScheduler(address,address,uint256)'], + '0x30aceb89': [ + 'validateRequestParams(address[3],address,uint256[11],uint256,bytes,uint256)' + ], + '0x15abc160': [ + 'createValidatedRequest(address[3],address,uint256[11],uint256,bytes)' + ], + '0x316b08a0': ['scheduleTransaction(address,bytes,uint256[7],uint256)'], + '0xd96d7ea2': ['PRE_EXECUTION_GAS()'], + '0x45104b16': ['EXECUTION_GAS_OVERHEAD()'], + '0xc7e67360': ['GAS_BUFFER()'], + '0x5ee345e4': [ + 'computeEndowment(uint256,uint256,uint256,uint256,uint256,uint256)' + ], + '0x27960c5f': [ + 'validateEndowment(uint256,uint256,uint256,uint256,uint256,uint256,uint256)' + ], + '0x81baf820': ['BlockScheduler(address)'], + '0xba8661a2': ['TimestampScheduler(address)'], + '0x6b9b1006': ['TransactionRecorder()'], + '0x043753ba': ['makeDecision(uint256,bool)'], + '0xcd2cdd5b': ['claimOwnershi()'], + '0x1ac61e8c': ['testBlobCreate()'], + '0x741273d6': ['testThrowRegisterContractAgain()'], + '0x59e2d30e': ['testThrowBlobStoreNotRegistered()'], + '0xfa3f1e99': ['testBlobStoreRegistered()'], + '0x29e30910': ['testThrowCreateExistingNonce()'], + '0xd62d3115': ['testCreate()'], + '0xa5dfee67': ['testThrowsCreateNewRevisionNotUpdatable()'], + '0x85b73d3c': ['testCreateNewRevision()'], + '0x5f0edfb8': ['create(bytes,bytes32,bytes1)'], + '0x2551858e': ['getFlags(bytes32)'], + '0x8d375da2': ['testMakeItFail()'], + '0xe597f402': ['create(bytes1,bytes32,bytes)'], + '0x7fefde53': ['WillRegistry()'], + '0x337b1cf9': ['setIpfsHash(bytes)'], + '0xd0b52156': ['getIpfsHash(address,address)'], + '0x5b37e150': ['create(bytes32,bytes)'], + '0x338a1379': ['_setPackedBlockNumber(bytes20,uint256)'], + '0xa84c5330': ['createNewRevision(bytes20,bytes)'], + '0x9e65c7e5': ['updateLatestRevision(bytes20,bytes)'], + '0xa7e93e87': ['retractLatestRevision(bytes20)'], + '0x5ccd2f9b': ['_deleteAllPackedRevisionBlockNumbers(bytes20)'], + '0xe0a70811': ['restart(bytes20,bytes)'], + '0xcf7315c6': ['retract(bytes20)'], + '0x12511c14': ['transferEnable(bytes20)'], + '0x47bdb7f4': ['transferDisable(bytes20)'], + '0xb06df18e': ['transfer(bytes20,address)'], + '0xd6ca8ccb': ['disown(bytes20)'], + '0xd0c24e93': ['setNotUpdatable(bytes20)'], + '0x9243e088': ['setEnforceRevisions(bytes20)'], + '0x976b01c0': ['setNotRetractable(bytes20)'], + '0xb971b4e5': ['setNotTransferable(bytes20)'], + '0x08b7c13b': ['getExists(bytes20)'], + '0xfb47a067': ['_getRevisionBlockNumber(bytes20,uint256)'], + '0xec035393': ['_getAllRevisionBlockNumbers(bytes20)'], + '0xba15e52e': ['getInfo(bytes20)'], + '0x01fd89a4': ['getFlags(bytes20)'], + '0x3df91162': ['getUpdatable(bytes20)'], + '0xdba1ac3d': ['getEnforceRevisions(bytes20)'], + '0x3c335b0e': ['getRetractable(bytes20)'], + '0xaa5d4719': ['getTransferable(bytes20)'], + '0xe487eb58': ['getOwner(bytes20)'], + '0x3ef87414': ['getRevisionCount(bytes20)'], + '0x74f8d96e': ['getRevisionBlockNumber(bytes20,uint256)'], + '0x22057bc7': ['getAllRevisionBlockNumbers(bytes20)'], + '0x13137731': ['testThrowsUpdateLatestRevisionNotUpdatable()'], + '0x2eb5c61f': ['testThrowsUpdateLatestRevisionEnforceRevisions()'], + '0x1fb2f2a0': ['testUpdateLatestRevision()'], + '0xe82f7dd4': ['testThrowsRetractLatestRevisionNotUpdatable()'], + '0x8e1ffb19': ['testThrowsRetractLatestRevisionEnforceRevisions()'], + '0xe0cfc05c': [ + 'testThrowsRetractLatestRevisionDoesntHaveAdditionalRevisions()' + ], + '0x40695625': ['testRetractLatestRevision()'], + '0x1b769e74': ['testThrowsRestartNotUpdatable()'], + '0x5292c1a9': ['testThrowsRestartEnforceRevisions()'], + '0x465e759b': ['testRestart()'], + '0xcaab0acc': ['testThrowCreateRetracted()'], + '0xd96e5565': ['testThrowsRetractNotRetractable()'], + '0x0af4626d': ['testRetract()'], + '0x804e11dc': ['testThrowsDisownNotTransferable()'], + '0xda5c0a7c': ['testDisown()'], + '0xad544dcb': ['testSetNotUpdatable()'], + '0xee0dc478': ['testSetEnforceRevisions()'], + '0xac3e6b2f': ['testSetNotRetractable()'], + '0xa039e3c7': ['testSetNotTransferable()'], + '0x30a24abd': ['create(bytes4,bytes)'], + '0x446fbcd1': ['CredSign()'], + '0x2e06c756': ['post(string,string,string,uint256,uint256,address)'], + '0xd5f37f95': ['sign(uint256,uint256,address)'], + '0xccbda1af': ['getChannelByName(string)'], + '0x738ddabe': ['getContentIndexedAccountCred(uint256,address,address)'], + '0x60dccd89': ['getContentAccount(uint256)'], + '0x05de4f07': ['getContentParent(uint256)'], + '0x9ea1b79d': ['getContentChannel(uint256)'], + '0xa5b9e922': ['getContentTimetamp(uint256)'], + '0x7e904a48': ['getNumContents(uint256)'], + '0xd644e356': ['index(uint256,address,uint256,uint256)'], + '0x0a4caed0': ['getChannelByRank(address,uint256)'], + '0x66099706': ['getChannelCred(address,uint256)'], + '0x5a1cc358': ['getChannelRank(address,uint256)'], + '0xffe34512': ['getNumChannels(address)'], + '0x771ad635': ['getContentCred(address,uint256)'], + '0x1d7e1f68': ['getContentRank(address,uint256)'], + '0xc01706dd': ['getContentByRank(address,uint256,uint256)'], + '0x2ae87a70': ['getNumContents(address,uint256)'], + '0x3b9901cc': ['getChannelsByRanks(address,uint256,uint256)'], + '0x9919b1cc': ['getContentsByRanks(address,uint256,uint256,uint256)'], + '0xf4dbeb9d': ['getCredRanksByContents(address,uint256[])'], + '0x6d1da953': ['createWithNonce(bytes32,bytes)'], + '0x67387d6b': ['testThrowCreateWithNonceExistingNonce()'], + '0x2aee19c7': ['testCreateWithNonce()'], + '0x81ebdeea': ['testThrowCreateWithNonceRetracted()'], + '0x089d5c4a': ['repr()'], + '0xaa237e21': ['set(bool,uint256)'], + '0xd1b1a22b': ['set(string,uint256[],uint256[],uint256[],bool[],uint256[])'], + '0x22bc3b8e': ['getArgument(uint256)'], + '0x0f3a1412': ['getArrlist(uint256,uint256)'], + '0xbb5d40eb': ['isValid()'], + '0x18921de4': [ + 'addSignature(string,uint256[],uint256[],uint256[],bool[],uint256[])' + ], + '0xd8c34127': ['isKnownSignature(string)'], + '0x6ba0b4f2': ['isKnownSelector(bytes4)'], + '0xa6cbcdd5': ['numSignatures(bytes4)'], + '0xe02426c1': ['getSignatureHash(bytes4,uint256)'], + '0x2324c67c': ['getAllSignatureHashes(bytes4)'], + '0xc4b14e0b': ['getSignature(bytes32)'], + '0x1baaeb91': ['getSignature(bytes4,uint256)'], + '0x0194db8e': ['sum(uint256[])'], + '0xcabb3a3a': ['isAlphaNumeric(string)'], + '0x7fdc8290': ['isUnderscore(bytes1)'], + '0x2973e372': ['isAlphaUpper(bytes1)'], + '0x9a571d9f': ['isAlphaLower(bytes1)'], + '0x342454c7': ['isDigit(bytes1)'], + '0xfadc51cf': ['isAlpha(bytes1)'], + '0xfd958695': ['isAlphaNumeric(bytes1)'], + '0xea3d508a': ['selector()'], + '0x4ed3885e': ['set(string)'], + '0x83d51a38': ['concatString(string)'], + '0x69d01268': ['concatUInt(uint256)'], + '0x364ea9e7': ['set(uint256,uint256,bool[],uint256[])'], + '0xcde0a4f8': ['setRegulator(address)'], + '0x483a83df': ['setKYC(address)'], + '0x5c7c9aa4': ['checkAccountState(address)'], + '0xbaccc92b': ['RegulatorIfc(address)'], + '0xbe3945e4': ['getFee(address,address,uint256)'], + '0x3395dc70': ['acceptTransfer(address,address,uint256)'], + '0x07b2779f': ['BasicRegulator(address,uint256,uint256)'], + '0x14cbdb54': ['EspCoin()'], + '0x1995333b': ['burnFunds(uint256)'], + '0x0ae5e739': ['grantAccess(address)'], + '0x85e68531': ['revokeAccess(address)'], + '0x95a078e8': ['hasAccess(address)'], + '0x56b8c724': ['transfer(address,uint256,string)'], + '0x1af716ba': ['transferFrom(address,address,uint256,string)'], + '0x24c93343': ['error(string)'], + '0x652f1f16': ['addSignature(string)'], + '0x560bb612': ['SignatureValidator(address)'], + '0x35b28153': ['addAuthorization(address)'], + '0x94f3f81d': ['removeAuthorization(address)'], + '0x7620a65b': ['Publisher()'], + '0xcc70bb1a': ['publish(string,string,string,address)'], + '0x8023ffbd': ['getOverallSize()'], + '0xebb741cb': ['getChannelSize(uint256)'], + '0xbbed7177': ['getContentTimestamp(uint256)'], + '0x8eaa1e29': ['getContentByData(address,uint256,string,string)'], + '0x69b144eb': ['testThrowsCreateNewRevisionNotOwner()'], + '0x334ef224': ['testThrowsUpdateLatestRevisionNotOwner()'], + '0xa6e16ba2': ['testThrowsRetractLatestRevisionNotOwner()'], + '0x6b6a53fa': ['testThrowsRestartNotOwner()'], + '0x869b3f6a': ['testThrowsRetractNotOwner()'], + '0xbc0e7adb': ['testThrowsDisownNotOwner()'], + '0xce19419b': ['testThrowsSetNotUpdatableNotOwner()'], + '0x67080f6e': ['testThrowsSetEnforceRevisionsNotOwner()'], + '0xe1569f6b': ['testThrowsSetNotRetractableNotOwner()'], + '0xb463bcde': ['testThrowsSetNotTransferableNotOwner()'], + '0x1da6822c': ['testThrowsTransferEnableNotTransferable()'], + '0x98024f18': ['testThrowsTransferDisableNotEnabled()'], + '0x06459119': ['testThrowsTransferNotTransferable()'], + '0xd3d6a975': ['testThrowsTransferNotEnabled()'], + '0xd4b1d19f': ['testThrowsTransferDisabled()'], + '0xd591221f': ['testTransfer()'], + '0x15a0df43': ['testThrowCreateNewRevisionNotOwner()'], + '0xe3a199d6': ['testThrowCreateNewRevisionNotUpdatable()'], + '0x42ce0f30': ['testThrowUpdateLatestRevisionNotOwner()'], + '0x835b42fc': ['testThrowUpdateLatestRevisionNotUpdatable()'], + '0x550bcd8d': ['testThrowUpdateLatestRevisionEnforceRevisions()'], + '0x46c3166f': ['testThrowRetractLatestRevisionNotOwner()'], + '0x2432eb23': ['testThrowRetractLatestRevisionNotUpdatable()'], + '0x531d1974': ['testThrowRetractLatestRevisionEnforceRevisions()'], + '0x6edb4cf6': [ + 'testThrowRetractLatestRevisionDoesntHaveAdditionalRevisions()' + ], + '0xfaf0952b': ['testThrowRestartNotOwner()'], + '0x85fe0448': ['testThrowRestartNotUpdatable()'], + '0xbb6a1427': ['testThrowRestartEnforceRevisions()'], + '0x23647398': ['testThrowRetractNotOwner()'], + '0x75a6a332': ['testThrowRetractNotRetractable()'], + '0x78205f67': ['testThrowTransferEnableNotTransferable()'], + '0xe5c7e509': ['testThrowTransferDisableNotEnabled()'], + '0x966acb38': ['testThrowTransferNotTransferable()'], + '0xd9ec0508': ['testThrowTransferNotEnabled()'], + '0x837a7ba5': ['testThrowTransferDisabled()'], + '0x7b48ba20': ['testThrowDisownNotOwner()'], + '0x938ae4cc': ['testThrowDisownNotTransferable()'], + '0x53caf582': ['testThrowSetNotUpdatableNotOwner()'], + '0xef41e06f': ['testThrowSetEnforceRevisionsNotOwner()'], + '0x20130753': ['testThrowSetNotRetractableNotOwner()'], + '0x5e1936d4': ['testThrowSetNotTransferableNotOwner()'], + '0x4123cb6b': ['m_numOwners()'], + '0x52375093': ['m_lastDay()'], + '0x659010e7': ['m_spentToday()'], + '0x746c9171': ['m_required()'], + '0x797af627': ['confirm(bytes32)'], + '0xb75c7dc6': ['revoke(bytes32)'], + '0xc2cf7326': ['hasConfirmed(bytes32,address)'], + '0xf1736d86': ['m_dailyLimit()'], + '0x96286cc9': ['isTokenOwner(address)'], + '0x69c8b344': ['ownedToken(address)'], + '0xe8580dd4': ['Survey(address,uint256,string,bytes32[])'], + '0x71c59097': ['MainnetSurvey(uint256,string,bytes32[])'], + '0x6e2edf30': ['ETCSurvey(address)'], + '0x58cb7323': ['MainnetETCSurvey()'], + '0x76d66f5d': ['_Transfer(address,address,bytes32)'], + '0x62c99e84': ['_Approval(address,address,bytes32)'], + '0x5fcc2edb': ['IndividualityTokenRoot(address)'], + '0xf3d91708': ['isEligibleForUpgrade(address)'], + '0x1a695230': ['transfer(address)'], + '0x103f9251': ['transferFrom(address,address)'], + '0x7dd56411': ['ownerOf(bytes32)'], + '0x7ca31724': ['tokenId(address)'], + '0xd55ec697': ['upgrade()'], + '0x216ef940': ['proxyUpgrade(address,address,bytes)'], + '0xc4128b6d': ['upgradeCount()'], + '0x09fc8f6d': ['isTokenUpgraded(bytes32)'], + '0x19a9c2f1': ['generateId(string)'], + '0xafb95eed': ['logApproval(address,address,bytes32)'], + '0x85d5c971': ['logTransfer(address,address,bytes32)'], + '0xbbba3333': ['safer_ecrecover(bytes32,uint8,bytes32,bytes32)'], + '0x77d32e94': ['ecrecovery(bytes32,bytes)'], + '0x39cdde32': ['ecverify(bytes32,bytes,address)'], + '0x72c3015c': ['mint(int256,address,string)'], + '0x6e0bd282': ['destroy(bytes32)'], + '0x983b2d56': ['addMinter(address)'], + '0x3092afd5': ['removeMinter(address)'], + '0x7d32e7bd': ['transfer(address,bytes32)'], + '0xb3c06f50': ['transferFrom(address,address,bytes32)'], + '0x5cd2f4d3': ['approve(address,bytes32)'], + '0x4fc9c91a': ['identityOf(bytes32)'], + '0x34b7ac9b': ['END_MINTING()'], + '0x899942b8': ['Devcon2Token()'], + '0x7993e5c2': ['Devcon2TokenForTesting()'], + '0x724121ae': ['contentExists(uint256)'], + '0x1003e2d2': ['add(uint256)'], + '0xa501e88d': ['Content()'], + '0x8570153e': ['publish(string,string,bytes,address[])'], + '0x76f30ca1': ['toContentID(address,uint256,string,bytes)'], + '0xee725d44': ['toChannelID(string)'], + '0x969cb7c3': ['getPublisher(uint256)'], + '0x110df916': ['getChannelID(uint256)'], + '0xb633620c': ['getTimestamp(uint256)'], + '0x4378a6e3': ['getAttributes(uint256)'], + '0x124eaee6': ['Identity()'], + '0xf207564e': ['register(uint256)'], + '0x4d207d9a': ['identify(address)'], + '0x54ea4000': ['identify(address[])'], + '0xeb782d8c': ['ContentSeries(address)'], + '0xde8fa431': ['getSize()'], + '0x21958a50': ['AddressSeries(address)'], + '0x504f1671': ['getSize(address)'], + '0xeb045789': ['ChannelSeries(address)'], + '0x023c23db': ['getSize(uint256)'], + '0x2fea7b81': ['getIdentity(address)'], + '0x043bb5e7': ['getIdentities(address[])'], + '0x27dc297e': ['__callback(bytes32,string)'], + '0x38bbfa50': ['__callback(bytes32,string,bytes)'], + '0xbc08afd9': ['WebOfTrustToken(address,uint256)'], + '0xa5bfa9a9': ['claimToken(bytes32)'], + '0x5669c94f': ['issueToken(address,string)'], + '0xcdcd77c0': ['baz(uint32,bool)'], + '0x0b811cb6': ['executeProposal(uint256,bytes32)'], + '0x1f5d0b4c': ['address(address,address,uint256)'], + '0x8ac0ca36': ['buyViaJohan()'], + '0xc1246d39': ['simulatePathwayFromBeneficiary()'], + '0x59e148fc': ['getLastOfferId()'], + '0x152583de': ['getAttributes()'], + '0x446d5aa4': ['getAttributes(address)'], + '0x88782386': ['UnicornMilk()'], + '0x13df7091': ['mintAll(int256)'], + '0xfa9acb05': ['addressInArray(address,address)'], + '0xb76e4890': ['Tester()'], + '0x0d2560ee': ['addMe()'], + '0x8894dd2b': ['addEther()'], + '0x1e9ea66a': ['balanceEther10000000(uint256)'], + '0xe5bf93b9': ['balanceEther(uint256)'], + '0xcd9f05b8': ['balanceEtherAddress(address)'], + '0xfd7ac203': ['TestToken()'], + '0x35b09a6e': ['someFunction()'], + '0x8f2c44a2': ['UnicornMilker()'], + '0xc26aa3c9': ['lockUnicorn(uint256)'], + '0xff556ecb': ['releaseUnicorn(uint256)'], + '0x27e8c2d8': ['burnUnicornShares()'], + '0xfff3c457': ['readMessages(uint256)'], + '0x6a226a49': ['addMessage(string)'], + '0x200ebe34': ['addTokensToGive(address)'], + '0x7a427d98': ['forceReturn()'], + '0xe53e04a5': ['refillGas()'], + '0x323082d7': ['Vote(string)'], + '0x90cf581c': ['voteYes()'], + '0x41c12a70': ['voteNo()'], + '0x49aa4ee2': ['removeVote()'], + '0xa48bdb7c': ['results()'], + '0x9832ee65': ['resultsWeightedByTokens()'], + '0x9dcb5c65': ['resultsWeightedByEther()'], + '0x49407a44': ['claimEther(uint256)'], + '0x509f8633': ['create_account()'], + '0x32fefb4c': ['add_account(address,address)'], + '0x9b5adea2': ['setMinter()'], + '0x0ecaea73': ['create(address,uint256)'], + '0xa24835d1': ['destroy(address,uint256)'], + '0x36f66528': ['EtherDelta(address,uint256,uint256)'], + '0x338b5dea': ['depositToken(address,uint256)'], + '0x9e281a98': ['withdrawToken(address,uint256)'], + '0xf7888aec': ['balanceOf(address,address)'], + '0x93f0bb51': [ + 'order(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)' + ], + '0x0a19b14a': [ + 'trade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256)' + ], + '0x6c86888b': [ + 'testTrade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,address)' + ], + '0xfb6e155f': [ + 'availableVolume(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)' + ], + '0xbb8be064': ['HardwareToken()'], + '0x57a373a1': ['uintInArray(uint256,uint256,int256,uint256[],uint256)'], + '0x32afa2f9': ['claimEtherOwner(uint256)'], + '0xa2a8336f': ['claimEtherSigner(uint256)'], + '0x4e077f2a': ['addGasEther()'], + '0x24804cef': ['Deed()'], + '0xfaab9d39': ['setRegistrar(address)'], + '0xfb1669ca': ['setBalance(uint256)'], + '0xbbe42771': ['closeDeed(uint256)'], + '0x0b5ab3d5': ['destroyDeed()'], + '0xa06cab79': ['Registrar(address,bytes32)'], + '0x367bbd78': ['strlen(string)'], + '0x03985426': ['getMode(bytes32)'], + '0xede8acdb': ['startAuction(bytes32)'], + '0xe27fe50f': ['startAuctions(bytes32[])'], + '0x22ec1244': ['shaBid(bytes32,address,uint256,bytes32)'], + '0xce92dced': ['newBid(bytes32)'], + '0xaefc8c72': ['unsealBid(bytes32,address,uint256,bytes32)'], + '0xdf7cec28': ['cancelBid(bytes32)'], + '0x983b94fb': ['finalizeAuction(bytes32)'], + '0x0230a07c': ['releaseDeed(bytes32)'], + '0x15f73331': ['invalidateName(string)'], + '0x5ddae283': ['transferRegistrars(bytes32)'], + '0xebb045fa': ['PublicResolver(address)'], + '0x41b9dc2b': ['has(bytes32,bytes32)'], + '0x01ffc9a7': ['supportsInterface(bytes4)'], + '0x3b3b57de': ['addr(bytes32)'], + '0xd5fa2b00': ['setAddr(bytes32,address)'], + '0x2dff6941': ['content(bytes32)'], + '0xc3d014d6': ['setContent(bytes32,bytes32)'], + '0x1d2e2cc4': ['ENS()'], + '0x02571be3': ['owner(bytes32)'], + '0x0178b8bf': ['resolver(bytes32)'], + '0x16a25cbd': ['ttl(bytes32)'], + '0x5b0fc9c3': ['setOwner(bytes32,address)'], + '0x06ab5923': ['setSubnodeOwner(bytes32,bytes32,address)'], + '0x1896f70a': ['setResolver(bytes32,address)'], + '0x14ab9038': ['setTTL(bytes32,uint64)'], + '0x9d063ed8': ['FIFSRegistrar(address,bytes32)'], + '0xd22057a9': ['register(bytes32,address)'], + '0xe8efc1a0': ['updatedValue(bytes32)'], + '0x3dfb4843': ['renewDeed(bytes32)'], + '0xd8389dc5': ['hash(bytes32)'], + '0xd7fa1007': ['setHash(bytes32,bytes32)'], + '0x003538c5': ['TestRegistrar(address,bytes32)'], + '0x267b6922': ['entries(bytes32)'], + '0x3f15457f': ['ens()'], + '0x61584936': ['sealedBids(bytes32)'], + '0xb88eef53': ['registryCreated()'], + '0xfaff50a8': ['rootNode()'], + '0x8b859409': ['setRelease(bytes32,bytes32,string)'], + '0x244fcd03': ['removeRelease(bytes32,string)'], + '0x89859b50': ['updateLatestTree(bytes32)'], + '0xa10889fa': ['setVersion(uint32,uint32,uint32,string,string)'], + '0x0ccec396': ['getNumReleases()'], + '0x57b07cd9': ['getReleaseHash(uint256)'], + '0x173cb7de': ['getNumReleasesForNameHash(bytes32)'], + '0x0c26e42e': ['getReleaseHashForNameHash(bytes32,uint256)'], + '0x3f415772': ['releaseExists(bytes32)'], + '0xbb814e9e': ['versionExists(bytes32)'], + '0x4c4aea87': ['getReleaseData(bytes32)'], + '0x0c4326a0': ['getMajorMinorPatch(bytes32)'], + '0xfac5bb92': ['getPreRelease(bytes32)'], + '0x8ca4eef6': ['getBuild(bytes32)'], + '0x2ffb8631': ['getReleaseLockfileURI(bytes32)'], + '0x0e5ffb3c': ['hashVersion(uint32,uint32,uint32,string,string)'], + '0x93d79105': ['hashRelease(bytes32,bytes32)'], + '0x3ae9b510': ['getLatestMajorTree(bytes32)'], + '0xf2f254c7': ['getLatestMinorTree(bytes32,uint32)'], + '0x5263ba87': ['getLatestPatchTree(bytes32,uint32,uint32)'], + '0xdea9c72b': ['getLatestPreReleaseTree(bytes32,uint32,uint32,uint32)'], + '0xd7cc8362': ['isLatestMajorTree(bytes32,bytes32)'], + '0xd1f59db9': ['isLatestMinorTree(bytes32,bytes32)'], + '0xc233e870': ['isLatestPatchTree(bytes32,bytes32)'], + '0x02de2cf3': ['isLatestPreReleaseTree(bytes32,bytes32)'], + '0x02556de3': ['updateMajorTree(bytes32)'], + '0x44d75fa9': ['updateMinorTree(bytes32)'], + '0xb6ac24df': ['updatePatchTree(bytes32)'], + '0x900d85fa': ['updatePreReleaseTree(bytes32)'], + '0xbed34bba': ['compareStrings(string,string)'], + '0x15398afe': ['compareNumericStrings(string,string)'], + '0xdd79e33e': ['splitIdentifiers(string)'], + '0x2fc0aad3': ['isNumericString(string)'], + '0x55ff440a': ['castStringToUInt(string)'], + '0xb7009613': ['canCall(address,address,bytes4)'], + '0xeacfc0ae': ['Authorized()'], + '0x87045369': ['setCanCall(address,address,bytes4,bool)'], + '0x02acdb44': ['setAnyoneCanCall(address,bytes4,bool)'], + '0x20d9822e': ['setAnyoneCanCall(address,string,bool)'], + '0x083ae1fe': ['setPackage(string)'], + '0x001f8d11': ['removePackage(bytes32,string)'], + '0x2406cedb': ['setPackageOwner(bytes32,address)'], + '0xa9b35240': ['packageExists(bytes32)'], + '0x7370a38d': ['getNumPackages()'], + '0x95f0684b': ['getPackageNameHash(uint256)'], + '0xb4d6d4c7': ['getPackageData(bytes32)'], + '0x06fe1fd7': ['getPackageName(bytes32)'], + '0xaf9a3f9b': ['hashName(string)'], + '0x34c0d654': ['setPackageDb(address)'], + '0xf314bf46': ['setReleaseDb(address)'], + '0x10ae4ce2': ['setReleaseValidator(address)'], + '0x5fcb568c': ['release(string,uint32,uint32,uint32,string,string,string)'], + '0x0f3d7c3e': ['release(string,uint32[3],string,string,string)'], + '0x4f197ee7': ['transferPackageOwner(string,address)'], + '0x83ea0620': ['packageExists(string)'], + '0x4188d79c': ['releaseExists(string,uint32,uint32,uint32,string,string)'], + '0xcfe9a7b8': ['getPackageName(uint256)'], + '0xc2ba5b40': ['getPackageData(string)'], + '0xcec95aa1': ['getReleaseHashForPackage(string,uint256)'], + '0xc392f5a0': ['getAllPackageReleaseHashes(string)'], + '0x12cc08f2': ['getPackageReleaseHashes(string,uint256,uint256)'], + '0x4cb71b9b': ['getAllReleaseHashes()'], + '0x79cce1c5': ['getReleaseHashes(uint256,uint256)'], + '0x1f6b0a9d': [ + 'getReleaseLockfileURI(string,uint32,uint32,uint32,string,string)' + ], + '0x79c3ddc1': ['isPackageOwner(string,address,address)'], + '0x91060168': ['fetchString(address,bytes4,bytes32)'], + '0xfa28ba0d': ['validateReleaseLockfileURI(string)'], + '0xf4ea95b9': ['validateReleaseVersion(uint32[3])'], + '0x6f0cfab6': ['DNSResolver()'], + '0x126a710e': ['dnsrr(bytes32)'], + '0x76196c88': ['setDnsrr(bytes32,bytes)'], + '0x61d585da': ['state(bytes32)'], + '0xe571c35e': ['ReverseRegistrar(address,bytes32)'], + '0x1e83409a': ['claim(address)'], + '0xbffbe61c': ['node(address)'], + '0x27b752b8': ['sha3HexAddress(address)'], + '0xe1fa8e84': ['register(bytes32)'], + '0xa31d5580': ['Registrar(address,bytes32,address)'], + '0x3ea3f6c5': ['activateRegistrar()'], + '0x271cd760': ['getPackageDb()'], + '0xfb3a1fb2': ['getReleaseDb()'], + '0x4961b40c': ['getReleaseValidator()'], + '0x2d34ba79': ['setup(address,address)'], + '0x30b9af98': ['withdrawFunding()'], + '0x92a781d8': ['changeBaseValue(uint256)'], + '0xb60d4288': ['fund()'], + '0xc062f578': ['updateStage()'], + '0xf3a44fe1': ['withdrawForWorkshop()'], + '0x99e0021f': ['mergencyCall()'], + '0x299ed37a': ['emergencyCall()'], + '0x0b7abf77': ['TOTAL_TOKENS()'], + '0x17f5de95': ['MAX_TOKENS_SOLD()'], + '0x39f64b52': ['calcTokenPrice()'], + '0x48c54b9d': ['claimTokens()'], + '0x48cd4cb1': ['startBlock()'], + '0x521eb273': ['wallet()'], + '0x60fd902c': ['gnosisToken()'], + '0x62ea82db': ['bids(address)'], + '0x6f85c7e4': ['WAITING_PERIOD()'], + '0x8da5cb5b': ['owner()'], + '0xa3c2c462': ['totalReceived()'], + '0xa6b513ee': ['finalPrice()'], + '0xc040e6b8': ['stage()'], + '0xc51bf934': ['CEILING()'], + '0xd9f8a4e2': ['calcCurrentTokenPrice()'], + '0xdd9dd688': ['calcStopPrice()'], + '0xde78e78a': ['tokenLaunched()'], + '0x4c6b25b1': ['results(bytes32)'], + '0x69347990': ['ownerWithdrawl()'], + '0x7b1aa45f': ['ownerDeposit()'], + '0x996a8046': ['__callback(bytes32,string,bool)'], + '0xb964608d': ['get_return_by_level(uint256)'], + '0xcddbe729': ['game(uint256)'], + '0x0674763c': ['assert(bool)'], + '0xe21608be': ['ReserveToken()'], + '0x1cbd0519': ['accountLevel(address)'], + '0x8abadb6b': ['setAccountLevel(address,uint256)'], + '0x4c7f74df': ['EtherDelta(address,address,address,uint256,uint256,uint256)'], + '0x8f283970': ['changeAdmin(address)'], + '0xe8f6bc2e': ['changeAccountLevelsAddr(address)'], + '0x71ffcb16': ['changeFeeAccount(address)'], + '0x54d03b5c': ['changeFeeMake(uint256)'], + '0x8823a9c0': ['changeFeeTake(uint256)'], + '0x5e1d7ae4': ['changeFeeRebate(uint256)'], + '0x0b927666': ['order(address,uint256,address,uint256,uint256,uint256)'], + '0x05888fcd': [ + 'tradeBalances(address,uint256,address,uint256,address,uint256)' + ], + '0x46be96c3': [ + 'amountFilled(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)' + ], + '0x278b8c0e': [ + 'cancelOrder(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)' + ], + '0x60116397': ['Registrar(address,bytes32,uint256)'], + '0xf4dc2d21': ['Deed(uint256)'], + '0x06fdde03': ['name()'], + '0x313ce567': ['decimals()'], + '0x40275f85': ['getPersonalDepositAddress(address)'], + '0x5a3b7e42': ['standard()'], + '0x89d59ee5': ['createPersonalDepositAddress()'], + '0x8c546f81': ['GNT()'], + '0x8f70bfa0': ['processDeposit()'], + '0x95d89b41': ['symbol()'], + '0xb414d4b6': ['frozenAccount(address)'], + '0xdc3080f2': ['spentAllowance(address,address)'], + '0x366a68dc': ['setBlockLock(uint256)'], + '0xa39a45b7': ['replaceOwner(address)'], + '0xa4e2d634': ['isLocked()'], + '0xd8162db7': ['lockedUntilBlock()'], + '0x1593a8c7': ['endLottery()'], + '0x53aab434': ['buyIn()'], + '0x5ec01e4d': ['random()'], + '0x6939864b': ['lotteryState()'], + '0xd366fbab': ['startLottery(bytes32,uint256,uint256,uint256,uint256,bool)'], + '0xfd7c460d': ['ciberLottery()'], + '0x2525f5c1': ['cancelBid(address,bytes32)'], + '0xc01a8c84': ['confirmTransaction(uint256)'], + '0x1209b1f6': ['ticketPrice()'], + '0x50b44712': ['tickets(uint256)'], + '0x5c3f9765': ['endDateClose()'], + '0x984ac378': ['lotteryTitle()'], + '0xb8851fea': ['endDateStart()'], + '0xc179520c': ['ManageAccount()'], + '0x12494160': ['isHolder()'], + '0x42ce1488': ['upload(string)'], + '0x3c925f16': ['getAccountHolder()'], + '0x83f7b8e1': ['getNumberOfPhotos()'], + '0xe2a71f12': ['accountDelete()'], + '0x009b9369': ['getVoteNumber(uint256)'], + '0x0ee79fb3': ['closeReferendums()'], + '0x291e6777': ['sendVote(uint256,uint256)'], + '0x32d2fb9f': ['getRefRemainingTime(uint256)'], + '0x3b0506f7': ['getVoteByAddress(address,uint256)'], + '0x62fb09b2': ['getRefDescr(uint256)'], + '0x77a7e6be': ['getRefTotal(uint256)'], + '0x80dcaf27': ['getRefNumber()'], + '0x8736fd16': ['getRefStatus(uint256)'], + '0xace523c4': ['createReferendum(string,string,uint256,uint256)'], + '0xb29d7914': ['getRefResults(uint256)'], + '0xc0df77d0': ['getRefName(uint256)'], + '0x94d9cf8f': [ + 'CreateProxyWithControllerAndRecovery(address,address[],uint256,uint256)' + ], + '0x4a3a87e2': [ + 'CreateProxyWithControllerAndRecoveryKey(address,address,uint256,uint256)' + ], + '0x4fcf8210': ['eraseRecord(bytes32)'], + '0xde10f04b': ['eraseNode(bytes32[])'], + '0x3a76abff': ['_eraseNode(uint256,bytes32[],bytes32)'], + '0x1cda37f2': ['eraseRecords(bytes32)'], + '0x00e43ee9': ['setMigrationStatus(uint256,address)'], + '0x984413b8': ['_eraseNode(bytes32)'], + '0xb0c80972': ['setBalance(uint256,bool)'], + '0xfebefd61': ['startAuctionsAndBid(bytes32[],bytes32)'], + '0x77bc222c': ['_eraseSingleNode(bytes32)'], + '0x57aee888': ['_eraseNodeHierarchy(uint256,bytes32[],bytes32)'], + '0xdce293a7': ['minLength(uint256)'], + '0xaf92a693': ['addRegistrar(address)'], + '0xba904eed': ['removeRegistrar(address)'], + '0x081780f4': ['clearRecord(bytes32)'], + '0xb0349184': ['clearRecords(bytes32[])'], + '0xf62cce34': ['_clearRecordHierarchy(uint256,bytes32[],bytes32)'], + '0x36b81feb': ['Deed(address)'], + '0x4a617faa': ['shaBid(bytes32,uint256,bytes32)'], + '0x47872b42': ['unsealBid(bytes32,uint256,bytes32)'], + '0x93503337': ['isAllowed(bytes32,uint256)'], + '0x8a4068dd': ['transfer()'], + '0x13c89a8f': ['getAllowedTime(bytes32)'], + '0xa360b26f': ['Migrations()'], + '0xfdacd576': ['setCompleted(uint256)'], + '0x99a88ec4': ['upgrade(address,address)'], + '0x8e7fd292': ['trySetSubnodeOwner(bytes32,address)'], + '0x29cd5777': ['_tryEraseSingleNode(bytes32)'], + '0x5e431709': ['sealedBids(address,bytes32)'], + '0x9c67f06f': ['registryStarted()'], + '0xea9e107a': ['acceptRegistrarTransfer(bytes32,address,uint256)'], + '0x05b34410': ['creationDate()'], + '0x2b20e397': ['registrar()'], + '0x3fa4f245': ['value()'], + '0x674f220f': ['previousOwner()'], + '0x2203ab56': ['ABI(bytes32,uint256)'], + '0x623195b0': ['setABI(bytes32,uint256,bytes)'], + '0xc8690233': ['pubkey(bytes32)'], + '0x29cd62ea': ['setPubkey(bytes32,bytes32,bytes32)'], + '0x691f3431': ['name(bytes32)'], + '0x77372213': ['setName(bytes32,string)'], + '0x20d8741f': ['Feed()'], + '0xdd114c22': ['publish(address,uint256,address,uint256)'], + '0xfb279ef3': ['tip(uint256,address,uint256)'], + '0x96c824a8': ['createAccountFundContract()'], + '0x33397816': ['withdrawAccountBalance(address)'], + '0x6ebbe863': ['updatePublishContract(address)'], + '0xfad4b99a': ['updateChannelMinimum(address,uint256)'], + '0x0b7ad54c': ['getContent(uint256)'], + '0xda9c6a46': ['getReplyCount(uint256)'], + '0x47372325': ['getChannelSize(address)'], + '0x2ca6d2c0': ['getAccountSize(address)'], + '0x73f93a48': ['getAccountContentTip(address,uint256)'], + '0x0a7f4239': ['getAccountFundContract(address)'], + '0x0fcda174': ['getAccountTokenBalance(address,address)'], + '0x79be02af': ['Read(address)'], + '0x27fbcac5': ['getChannelFeed(address,uint256,uint256)'], + '0xdd90c403': ['getAccountFeed(address,uint256,uint256)'], + '0xbff974e8': ['getContentReplies(uint256)'], + '0xb3822da8': ['getContents(uint256[])'], + '0x2a45a39a': ['Post(address)'], + '0xe3579ea5': ['publish(string,string,address,uint256)'], + '0x4c8cc20b': ['toContentID(address,string,string,address,uint256)'], + '0x6ce1417e': ['Fund()'], + '0xea46193e': ['getEtherBalance()'], + '0x55291dbd': ['claimEther()'], + '0xe9e99d81': ['getChannelFeed(address,uint256,uint256,uint256)'], + '0x05a17fc6': ['getAccountFeed(address,uint256,uint256,uint256)'], + '0xd90a88cd': ['getContentReplies(uint256,uint256)'], + '0x49e347ae': ['getContents(uint256[],uint256)'], + '0xbac1e9f6': ['getChannelSize(address,uint256)'], + '0x048e2e94': ['getAccountSize(address,uint256)'], + '0x9f181b5e': ['tokenCount()'], + '0xf446c1d0': ['A()'], + '0x314e99a2': ['abdicate()'], + '0x9b0b9c07': ['acceptBankDraft()'], + '0xbdfdb519': ['accept(string,uint256,uint16)'], + '0x8f5e9ca7': ['acceptTOS(address,bool)'], + '0xa79deb4f': ['acceptTradeDeal()'], + '0x5a28340a': ['accessOperatingBudget(uint256)'], + '0xa8b60b93': ['ackMsg(uint256,string)'], + '0x7ec0f30d': ['ack(string)'], + '0x82a62137': ['activateAccount(address)'], + '0x1e9fcc77': ['activateAllowance(address,address)'], + '0x6bd92f7c': ['activateAllowanceRecord(address,address)'], + '0x0651844e': ['activateBalance(address)'], + '0xc8e49707': ['activateExportFee(address)'], + '0x2cd78450': ['activateExportFeeChargeRecord(address)'], + '0xd532e481': ['activateFrozenAccount(address)'], + '0x1d2b7155': ['activateImportFeeChargeRecord(address)'], + '0xcf03f5f4': ['activateMasterKey(address)'], + '0x1917ab5c': ['activate(string)'], + '0x0b2acb3f': ['add(address,bytes)'], + '0xec97cff7': ['addCertificationDocument(address,bytes32)'], + '0xa0d605c6': ['addCertificationDocumentInternal(address,bytes32)'], + '0xe80bd3e5': ['addCertificationDocumentToSelf(bytes32)'], + '0x2b198366': ['addCertifier(address)'], + '0xac3e7d24': ['addChainyData(string)'], + '0x9450b1c8': ['addCharityFundation(string,string,string)'], + '0x6ac6205c': ['addDataPoint(int256,uint256,bool,string)'], + '0x4094ef5e': ['addDataRequest(string)'], + '0xd3118a5a': ['addDoc(string,string)'], + '0x20339891': ['addGridMember(address)'], + '0x61bffe01': ['addIdentities(bytes32[],bytes32[])'], + '0x17b3a34b': ['_addIdentities(uint256,bytes32[])'], + '0x17e1bfb7': ['addInstitution(address,string)'], + '0xf824384a': ['addInvestorAtID(uint256)'], + '0x202d6eaf': ['addInvestorsValue(uint256)'], + '0x2fe9541f': ['addIssueBounty(string,uint256)'], + '0x2d06177a': ['addManager(address)'], + '0x2ba0b09f': ['AddNewCategory(bytes4,uint8,uint8,address)'], + '0x29dfdded': ['addNewDonkey(address)'], + '0x74bfb965': ['addNewProxy(address)'], + '0x755f99c2': ['AddNewSmallContract(address)'], + '0xc1d5e84f': ['addNewUser(address)'], + '0x76849376': ['addNode(bytes32,address)'], + '0x7d380265': [ + 'addOptionChain(uint256,string,uint256,uint256,bytes32,address,int256[])' + ], + '0x227f9633': ['addOption(string,address,uint256)'], + '0xdf5dd1a5': ['addOracle(address)'], + '0x3c0dde1c': ['_addPools(address,address)'], + '0x3d90d44d': ['addPowerSource(address,uint256,uint256)'], + '0x49bf66d3': ['addRegistryIntoNameIndex(address)'], + '0xb796a339': ['addRegistryIntoOwnerIndex(address,address)'], + '0x7cdbae63': ['addRegistryIntoTagsIndex(address)'], + '0x3e82055a': ['addSignature(uint256,bytes16,bytes)'], + '0xd1feca67': ['addSpendingRequest(address)'], + '0xdab80d6f': ['addSponsor(address)'], + '0xb0c8f9dc': ['add(string)'], + '0x8396392d': ['add(string,string,string,address)'], + '0x36555b85': ['add(string,uint256)'], + '0xd2dc0869': ['add(string,uint256,string,string,address)'], + '0x0f3eb785': ['add(string,uint256,uint256,uint256)'], + '0x38178fbe': ['addString(string,string)'], + '0x45590ec8': ['addTag(uint256,string)'], + '0x0e1d88fc': ['addTender(uint256,uint256,address,uint256)'], + '0x7f0899f2': ['AddTicket(bytes5[])'], + '0xd48bfca7': ['addToken(address)'], + '0x75c4aaa6': ['addUnderDog(uint256)'], + '0x213ac932': ['addUser(address,uint256,uint8,bytes32,bytes32)'], + '0x9da680f3': ['adjustRegistrationFee(uint256)'], + '0x5b6a54bc': ['adjustTransactionFee(uint256)'], + '0x40fdef80': ['administration(uint256,string,uint256,uint256,address)'], + '0xbc21ce9d': ['Aggregation()'], + '0x98688a95': ['Ai()'], + '0xbd3f0965': ['AiraEtherFunds(string,string)'], + '0xe1efda6d': ['airaSend(address,address,uint256)'], + '0x6d2cb794': ['airaTransfer(address,address,uint256)'], + '0xa9f8ec6c': ['AlarmClockTipFaucet()'], + '0x4a8b5389': ['allocateBountyAndEcosystemTokens()'], + '0xbcfcb03e': ['allocateFounderTokens()'], + '0xd526b9bd': ['_allow()'], + '0x1c8d5d38': ['allowance(address,address,bytes32)'], + '0xeb06e65e': ['allowanceFromProxy(address,address,address)'], + '0x9c0a4bbc': ['AlwaysFail()'], + '0x3b591ea7': ['AmountToForgeTheNextBlock()'], + '0x6056969b': ['announce(bytes32)'], + '0x3ef8ec78': ['announce_numbers(uint8,uint8,uint8,uint8,uint32,bytes32)'], + '0xea0a5237': ['announce(string)'], + '0xac04f5a7': ['append(address)'], + '0x94ed9b77': ['append(address,address)'], + '0x9aaf442c': ['applyCensorship(uint256)'], + '0x691d58e7': ['_applyRefund(uint256)'], + '0x7b7d7225': ['_approve(address,uint256)'], + '0x6d1669e1': ['approveAndCall(address,address,uint256,bytes)'], + '0xf11c4482': ['approveFromProxy(address,address,uint256)'], + '0x7df52ba8': ['Arbitrate(uint32,uint32,bool)'], + '0x99154b49': ['ARK()'], + '0x014e5fde': ['ARKController_1_00()'], + '0xfb32f4f5': ['ARK_FLAGGER_1_00()'], + '0x2be6d43c': ['ARKTagger_1_00()'], + '0xae30d35d': ['ARK_TROGLOg_1_00()'], + '0x97709cde': [ + 'ARK_VOTER_1_00(uint256,uint256,uint256,uint256,uint256,uint256)' + ], + '0xdba21657': ['askForEther(uint256)'], + '0x8a3e44d4': ['assetMoveInformation(address,address)'], + '0x0399c357': ['assignFreeReadings(address,uint8)'], + '0x7fe0518a': ['asyncSend(address,uint256)'], + '0xa843c97f': ['attack(uint256,uint256,uint256[])'], + '0xe0886f90': ['at(uint256)'], + '0x373c98a2': ['authCall(address,bytes32)'], + '0x39b35753': ['authCancel(address)'], + '0x4a5db3b5': ['authorizeAddress(address)'], + '0x2db89533': ['Auth(uint8,address)'], + '0x10cf5d47': ['awaitingPayout()'], + '0x3d79d1c8': ['bal()'], + '0x0a6be0e7': ['BalancedPonzi()'], + '0x4d30b6be': ['balanceOf(address,bytes32)'], + '0x61a00f6d': ['Ballot(bytes32[])'], + '0x940f851c': ['Ballot(uint8)'], + '0x97c3ccd8': ['ban(address)'], + '0xb5deeca7': ['BaseRegistry()'], + '0xcbe9ef39': ['BasicCoin(uint256,address)'], + '0xd767aee0': ['bbb()'], + '0x738486bd': ['BeerCoin(uint256)'], + '0xf79b22e0': ['betOnATeam(uint256)'], + '0xd30a512e': ['betOnColumnOrDozen(bool,bool,bool)'], + '0x86314af9': ['BetOnHashV84()'], + '0x3adb2de7': ['bet_this_spin()'], + '0x416c8701': ['beyond()'], + '0x934db458': ['Big()'], + '0x71dd99fe': ['BigRisk()'], + '0xf67a1d37': ['BlockChainChallenge()'], + '0x8a519fb9': ['BlockChainEnterprise()'], + '0x9ad4f98e': ['BlocksureInfo()'], + '0x48d9a374': ['blockTransfer(address,uint256)'], + '0x00601d6c': ['board(uint256,uint8,uint8)'], + '0xd1100691': ['BookCafe()'], + '0xbb00fc55': ['bookEarnings()'], + '0x9eee85fe': ['bookEarnings(address,uint256)'], + '0xdba7ef7d': ['Bookie(address,address)'], + '0x60913244': ['botOnSale(uint256,uint256)'], + '0x4cb85356': ['BranchSender(uint256,bytes32)'], + '0x0ad95b44': ['bribery()'], + '0xb0ad38c4': ['buildCity(string,uint256[2],uint256[2])'], + '0xdad99989': ['burnCoins(address)'], + '0x5fc5d48b': ['burnUnsoldCoins(address)'], + '0x3824d8ee': ['buy100DaoFor1Eth()'], + '0x561a4873': ['buyAd(string,string,string,uint256,uint8,address)'], + '0x5f8f0483': ['buyBankerAgreementFromImporterBank()'], + '0x29274fe1': ['buyBOTx(uint256,string,string,address,uint256)'], + '0xe75528cc': ['buyBuilding(uint256,uint256)'], + '0xe7e2aa0e': ['buyer_cancel()'], + '0xd04bfc9c': ['buyer_pay()'], + '0x29cbdc86': ['buyin(address,uint256)'], + '0x4ea66c38': ['buyinInternal(address,uint256)'], + '0xd24ddcfe': ['buyKissBTC()'], + '0x854f4817': ['buyKissBTCWithCallback(address,uint256)'], + '0xdda44b10': ['buyRecipient(address,uint8,bytes32,bytes32)'], + '0xcef8d343': ['buyShare(uint256,bool)'], + '0x90cb04e1': ['buy(string,uint256,uint16)'], + '0xedca914c': ['buyTicket()'], + '0x920c94df': ['BuyTicketForOther(address,uint8,uint8,uint8)'], + '0x378c0605': ['buyTickets(address)'], + '0x46f7a883': ['BuyTicket(uint8,uint8,uint8)'], + '0xaaf9d13e': ['buyTopDog(uint256,uint256)'], + '0xe5fe4f31': ['buy(uint8,bytes32,bytes32)'], + '0x4b8772c1': ['buyUnit(uint256,uint256)'], + '0xb412d4d6': ['CafeDelivered()'], + '0x4dda1764': ['CafeMaker()'], + '0x4dc3141b': ['CalcAll()'], + '0xea295ec2': ['calcRevenue(address)'], + '0xc1cc0775': ['calculateFeeDynamic(uint256,uint256)'], + '0xc03e382f': ['calculateShare()'], + '0x671dacdc': ['CalculateSqrt(uint256)'], + '0xdcf8113e': ['campaignEndedSuccessfully()'], + '0x74e60a48': [ + 'cancelOrder(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)' + ], + '0xdc419fd8': ['cancelOrder(bool,uint256)'], + '0x3fb0b2c9': ['CancelRoundAndRefundAll()'], + '0x9d1bbd7e': ['CancelRoundAndRefundAll(uint256)'], + '0x6618b008': ['cancelSellOrder(address)'], + '0x39b50688': ['cancelSellOrder()'], + '0x06909f69': ['cancel(string,uint256)'], + '0x1d3390a1': ['carefulSendWithFixedGas(address,uint256,uint256)'], + '0x5cff876b': ['carrotsCaught()'], + '0x4bb4b260': ['cashAllOut()'], + '0xe2861c8d': ['cashOutProfit()'], + '0x4a30f976': ['censorship(uint256,bool,bool)'], + '0x05b2b03a': ['CertificationCentre(address)'], + '0x35d79fad': ['CertificationDb(address,uint256,address)'], + '0xf72457af': ['CertifierDb()'], + '0x5103a5a3': ['certify(address,bytes32)'], + '0x0f096163': ['Chainy()'], + '0xdabdc1f2': ['ChangeActiveDigger(address)'], + '0x839849c0': ['changeBaseMultiplier(uint256)'], + '0x1ed6f423': ['changeDescription(address,string)'], + '0x75090ebf': ['changeDomain(uint256,uint256,uint256,address)'], + '0x3fd94686': ['changeEligibleDonkeys(uint256)'], + '0x6a1db1bf': ['changeFee(uint256)'], + '0x93c32e06': ['changeFounder(address)'], + '0xd21d7950': ['changeGasLimitOfSafeSend(uint256)'], + '0x62ee6d29': ['changeHashtoLowOrHigh(uint256)'], + '0x1efb17ee': ['changeHouseAddress(address)'], + '0xeb1ff845': ['changeId(uint256,uint256,uint256)'], + '0x07a9574a': ['changeLeaderMessage(string)'], + '0x53fefd7d': ['changeMaxDeposit(uint256)'], + '0xa51aea2d': ['changeMaxMultiplier(uint256)'], + '0x45ca25ed': ['changeName(address,string)'], + '0x85eac05f': ['changeOwnerAddress(address)'], + '0x244ded7a': ['ChangeOwnership(address)'], + '0xc0b92612': ['changePig(address)'], + '0x0fffbb54': ['changeRankingSize(uint256)'], + '0x1982ed58': ['ChangeReuseCashInHarware(bool,uint16,uint16)'], + '0xcdcb7c8f': ['chase()'], + '0x919840ad': ['check()'], + '0xc23697a8': ['check(address)'], + '0xede8ebf3': ['checkApprove(address,uint256)'], + '0x20e647e1': ['checkBetColor(uint8,address,bytes32,bytes32)'], + '0xf2b904c3': ['checkBetColumn(uint8,address,bytes32,bytes32)'], + '0x74388347': ['checkBetDozen(uint8,address,bytes32,bytes32)'], + '0x75830463': ['checkBetLowhigh(uint8,address,bytes32,bytes32)'], + '0x40c0bcb9': ['checkBetNumber(uint8,address,bytes32,bytes32)'], + '0xe9c31315': ['checkBetParity(uint8,address,bytes32,bytes32)'], + '0x1e5330ca': ['checkBetResult(uint8,address,bytes32,bytes32)'], + '0x90a85119': ['checkBetResult(uint8)'], + '0xc67146a5': ['check_bet(uint256,address,uint8)'], + '0xf062e26b': ['check_darkdao()'], + '0x1a9360dd': ['checkDate()'], + '0x32921690': ['checkDepth(address,uint256)'], + '0xdc3ab866': ['checkEarnings(address)'], + '0x51fdaf92': ['checkExpiredfunds()'], + '0x46b207b8': ['checkExpiry()'], + '0xe95bee59': ['checkFormat(string)'], + '0x119aa5c8': ['checkForward(bytes)'], + '0x19483cd1': ['checkHash()'], + '0x0382c254': ['CheckHash(uint8,uint8,uint8,uint8,bytes32)'], + '0x255016c8': ['checkIfExploded()'], + '0x0343dfa0': ['checkInvariants()'], + '0x4c7a2254': ['checkMyWithdraw()'], + '0x33893071': ['checkMyWithdraw(address)'], + '0xb2bfd948': ['checkNumbers(uint8[3])'], + '0xbed411a0': ['CheckPrize(address)'], + '0xb623f5e5': ['checkSetCosignerAddress(address)'], + '0xef19c332': ['_checkSigned(bytes32,uint256,uint8,bytes32,bytes32)'], + '0x3c959aca': ['CheckTickets()'], + '0xe0c6190d': ['checkTime()'], + '0x5329c681': ['checkTimeout(uint256)'], + '0x88e072b2': ['checkTransfer(address,uint256)'], + '0xc5575ef0': ['checkTransferFrom(address,address,uint256)'], + '0x00a7d6b3': ['checkTransferFromToICAP(address,bytes32,uint256)'], + '0xbd8c1d33': [ + 'checkTransferFromToICAPWithReference(address,bytes32,uint256,string)' + ], + '0xc6e0c908': [ + 'checkTransferFromWithReference(address,address,uint256,string)' + ], + '0x8e4afa51': ['checkTransferToICAP(bytes32,uint256)'], + '0x058026d0': ['checkTransferToICAPWithReference(bytes32,uint256,string)'], + '0xcbcaacab': ['checkTransferWithReference(address,uint256,string)'], + '0x5f72f450': ['check(uint256)'], + '0x22d8cf5b': ['CheckUserVote(uint8,uint8)'], + '0xefdecd9b': ['check_withdrawdao()'], + '0xbd66528a': ['claim(bytes32)'], + '0x008a745d': ['claimDividendShare(uint256)'], + '0x0b3ed536': ['claimDonations(uint256)'], + '0xb88a802f': ['claimReward()'], + '0x3b751f7f': ['claimThroneRP(string)'], + '0xe6e7237f': ['claim_time_victory(uint256)'], + '0x4a1aa767': ['claim_victory(uint256,uint8,uint8,uint8)'], + '0x4e05ded6': ['ClassicCheck()'], + '0x565a2ecf': ['classicTransfer(address)'], + '0x2526d960': ['clawback()'], + '0x01775f23': ['_closeBooks()'], + '0xee1b4828': ['closeBooks()'], + '0x31a3a506': ['closeFunding()'], + '0xc71b583b': ['closeRequest()'], + '0x203c03fa': ['Coinflip()'], + '0x7879e19e': ['CollectAllFees()'], + '0xaf8b7525': ['CollectAndReduceFees(uint256)'], + '0xc27b2c2d': ['collectEarnings()'], + '0xd4d5d32a': ['collectFee()'], + '0xb17acdcd': ['collectFees(uint256)'], + '0xeeb57139': ['CollectMoney(uint256)'], + '0x4a71d469': ['collectRev()'], + '0xd9fcb31f': ['comm_channel()'], + '0xf14fcbc8': ['commit(bytes32)'], + '0xf3bb9741': ['commitmentCampaign(uint256,bytes32)'], + '0x355474d2': ['commitReading(address)'], + '0xbe4054b9': ['commitReading(address,uint256,uint256,string)'], + '0xf2f03877': ['commit(uint256,bytes32)'], + '0x3da0ac79': ['compare()'], + '0x3a96fdd7': ['compare(string,string)'], + '0x4f139314': ['compensateLatestMonarch(uint256)'], + '0xbfbc793c': ['computeNameFuzzyHash(string)'], + '0x5aa94a68': ['computeResultVoteExtraInvestFeesRate()'], + '0x6bdbf8e6': ['concat()'], + '0x89c19ddb': ['concat(string,string)'], + '0xc8f8d75d': ['Config(uint8,address)'], + '0x75cb2672': ['configure(address)'], + '0x305b73d9': ['configure(address,address,uint256,uint8,bytes32,bytes32)'], + '0x3773930e': ['ConfigureFunction(address,uint256,uint16,uint16,uint16)'], + '0x47f3d794': ['configure(uint256,uint8,uint256,uint256,uint256,uint256)'], + '0x4746cef8': ['_confirmAndCheck(address,bytes32)'], + '0xffb4c857': ['_confirmAndCheck(bytes32)'], + '0x0ae08793': ['confirmAndCheck(bytes32)'], + '0x3f3935d1': ['confirmReverse(string)'], + '0x0afa9fb9': ['contains(int256,address)'], + '0x5dbe47e8': ['contains(address)'], + '0xda4b5e29': ['contains()'], + '0x1747dfd4': ['ContractPlay()'], + '0x7e7a2fbf': ['contribute_toTheGame()'], + '0x1aadcc34': ['convertGreyGreen(uint8,uint8)'], + '0xc618d15f': ['ConvertNumbers(bytes5)'], + '0x11cd98ed': ['convertToAllTable(uint256,string)'], + '0x5020dcf4': ['convertToEach(uint256,string,uint256)'], + '0xbed1b8b9': ['convertToInt(string)'], + '0x3733ffca': ['convertTo(uint256,string,string)'], + '0x90f2c86d': ['convertToWei(uint256,string)'], + '0x276b94e1': ['copypaste()'], + '0x60726abb': ['copy()'], + '0x061ea8cc': ['countByOwner(address)'], + '0x135128c2': ['CounterPartyDeposit()'], + '0x1840f0ca': ['countVotes(uint256)'], + '0xe10e274a': ['CrazyEarning()'], + '0x4a82534b': ['create(address,address,address,uint256,uint8,uint8,uint256)'], + '0x66e98c31': ['createCoin(string,uint256,uint256,string,string,address)'], + '0x0eb0afa6': ['createDebt(address,address,uint256)'], + '0xf463edd1': ['createDocument(uint256)'], + '0xe9794dc1': ['CreateHash(uint8,string)'], + '0x5fe27ab0': ['createHKG(address)'], + '0xc88961da': ['createKingdom(string,address,address,address)'], + '0xeac116c4': ['createKingdom(string,address,address,address,address)'], + '0xa21931ea': [ + 'CreateProposal(string,string,string,uint32,string,string,string,uint32,uint32)' + ], + '0xa753d6f2': [ + 'CreateProposal(string,string,string,string,string,string,uint32,uint32)' + ], + '0x35cc59a9': ['createSchema(bytes)'], + '0x4156fdb7': ['createSwap(uint256)'], + '0x16d960b5': ['createThing(bytes32[],bytes32[],uint88)'], + '0x8ea822d8': ['createThings(bytes32[],uint16[],bytes32[],uint16[],uint88)'], + '0x72479140': ['CreateTicket(address,uint8,uint8,uint8)'], + '0x3d6a32bd': [ + 'createTradeContract(address,uint256,uint256,uint256,bool,bool)' + ], + '0x6f9a5eab': ['createTx(uint256,address,uint256)'], + '0xe1c66292': ['Create(uint32,address)'], + '0x77863b61': ['CrossWhitehatWithdraw(uint256,address)'], + '0x26a4861c': ['CROWDFUNDING_PERIOD()'], + '0xec5c9036': ['Crowdsale(address,uint256,uint256)'], + '0xe42def21': ['CryptoHill()'], + '0xeccf1b29': ['CrystalDoubler()'], + '0xbfc3d84b': ['CT()'], + '0xce845d1d': ['currentBalance()'], + '0x80c951bf': ['currentClaimPriceInFinney()'], + '0x85528394': ['currentClaimPriceWei()'], + '0xbab2f552': ['currentCycle()'], + '0x0295d71b': ['currentDepositLimit()'], + '0xda3c300d': ['currentFee()'], + '0xb8aca90b': ['CurrentGame()'], + '0xac4bd53a': ['currentLeader()'], + '0x499af77c': ['current_spin_number()'], + '0x06961560': ['DAO(address,uint256,uint256,uint256,address)'], + '0xcaed4f9f': ['DataService()'], + '0xd8915fc5': ['DCAssetBackend(bytes32,bytes32)'], + '0x306387a4': ['dealStatus(uint256)'], + '0x95669952': ['debtor(address,uint256)'], + '0xaa6be303': ['debtors(address)'], + '0x54107401': ['declareLove(string,string)'], + '0x5c19a95c': ['delegate(address)'], + '0x928a00d2': ['deleteCoin(uint256)'], + '0xe4dedc7f': ['DeleteContract()'], + '0xc0f5a9cb': ['deleteThing(bytes32[])'], + '0x07ef99a0': ['demintTokens(int256,address,uint8)'], + '0x4abb9d39': ['depletable()'], + '0xacfdfd1c': ['deploy(uint256,string,string,address)'], + '0xec2ac54e': ['deposit(address,uint256,bytes32,uint256)'], + '0xb7482509': ['deposit(address,string)'], + '0x47e7ef24': ['deposit(address,uint256)'], + '0xc5b1a53c': ['deposit(bytes16[],uint64)'], + '0xaa67c919': ['depositFor(address)'], + '0xbb3ce7fe': ['DepositHolder()'], + '0xb47fa7e0': ['DepositLimit(uint256)'], + '0x44e43cb8': ['depositRevenue()'], + '0xe241c1d9': ['deriveKey(uint256,uint256,uint256)'], + '0x9b1ad792': ['destroyToken(address,uint256)'], + '0x67fbd289': ['destroyTokens(uint256)'], + '0x2b68b9c6': ['destruct()'], + '0x41395efa': ['dgxBalance()'], + '0x56105a08': ['DgxSwap()'], + '0x594151e0': ['Dice()'], + '0x5e855f14': [ + 'Dice(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)' + ], + '0x6545bed3': [ + 'Dice(uint256,uint256,uint256,uint256,uint256,uint256,uint256)' + ], + '0x0f06670a': ['didWin(bytes32)'], + '0x91b4a0e7': ['Difficulty()'], + '0x1b3a8e6f': ['directionCount(int256,int256,int256,int256)'], + '0x0d17bc2e': ['_disallow()'], + '0x7f3bd56e': ['disburse(address,uint256)'], + '0x1f0f711f': ['discontinue()'], + '0x423e7e79': ['_dispatchEarnings()'], + '0xf240f7c3': ['dispute()'], + '0x44691f2b': ['Dispute()'], + '0x4ecd73e2': ['DistributeDividends(uint256)'], + '0x76577eae': ['distributeEarnings()'], + '0x2ef875fb': ['div10(uint256,uint8)'], + '0x058aace1': ['divest()'], + '0x11af3c68': ['divest(address)'], + '0xbb504317': ['divest(address,uint256)'], + '0x8ca17995': ['divest(uint256)'], + '0x8df554b3': ['Dividend()'], + '0x4a2b0c38': ['DividendProfit()'], + '0x0d48e8d0': ['doBalance()'], + '0xe916d0f0': ['doBalance(address)'], + '0x33fd066d': ['doBalanceFor(address)'], + '0xdfdb5f17': ['doBurn(address,uint256)'], + '0x60c311fd': ['doBurnFromContract(address,uint256)'], + '0xf1bca7a4': ['doCall(uint256)'], + '0x7fd238ba': ['doCoinage(address[],uint256[],uint256,uint256,uint256)'], + '0x8ac78c80': ['Docsign()'], + '0xddf187b0': ['dogFight()'], + '0x7997b997': ['doMelt(uint256,uint256)'], + '0xad1ef61e': ['donkeyInvested(address)'], + '0xc9bbc8c0': ['donkeyName(address)'], + '0x26161670': ['donkeyRanking(uint256)'], + '0x23509e69': ['donkeysEligibleForFees()'], + '0x37751b35': ['doTransfer(address,address,uint256)'], + '0x13220305': ['doTransferOther(address,address,address,uint256)'], + '0xdc583801': ['doubleyour5()'], + '0x4974bc27': ['download()'], + '0x9890220b': ['drain()'], + '0x0eecae21': ['draw()'], + '0x89d8ca67': ['drawPot(bytes32,bytes32)'], + '0x18433bb7': ['DrawPrepare()'], + '0xe436bdf3': ['Draws(uint256)'], + '0x4f39ca59': ['drop(bytes32)'], + '0x200538c6': ['DTE()'], + '0x5e0e2957': ['dumpOut()'], + '0xef5daf01': ['_dumpToCompany()'], + '0xaca66aec': ['DVIP()'], + '0xf245b9e4': ['DVIP(address)'], + '0xe570be18': ['DVIPBackend(address,address)'], + '0xa08b3367': ['EC()'], + '0xdb318833': ['_ecAdd(uint256,uint256,uint256,uint256,uint256,uint256)'], + '0xf47289e1': ['_ecDouble(uint256,uint256,uint256)'], + '0x913f424c': ['_ecMul(uint256,uint256,uint256,uint256)'], + '0x0c7de59d': ['edit(address,bytes,bool)'], + '0xf63da25b': ['Emailer()'], + '0x23385089': ['emitApprove(address,address,uint256)'], + '0xe3a9b508': ['EnableDisableTokenProxy()'], + '0x2c46d8d5': ['EndRound(uint256)'], + '0xacbf98a7': ['endsWith()'], + '0xf67abd87': ['entryDetails(uint256)'], + '0xd4625a3a': ['equals()'], + '0x46bdca9a': ['equal(string,string)'], + '0xfc72c1ef': ['ERC20Base(uint256)'], + '0x0bd2ae1c': ['ERW()'], + '0x22f607f6': ['Escrow()'], + '0x0bad342a': [ + 'EscrowContract(address,address,address,address,uint256,uint256,uint256,uint256)' + ], + '0x8383bfc8': ['EscrowFoundry()'], + '0x1768b436': ['ETCSurvey()'], + '0xdbf45aa3': ['EthBank()'], + '0x838445e8': ['EtherAds(address,address,address)'], + '0x1df5e755': ['Etherandom()'], + '0x384e5018': ['etherandomCallbackAddress()'], + '0xd216d55d': ['etherandomExec(bytes32,bytes32,uint256)'], + '0x1f201e39': ['etherandomExecWithGasLimit(bytes32,bytes32,uint256,uint256)'], + '0xa715ff59': ['EtherandomProxy()'], + '0x36f9f49c': ['etherandomSeed()'], + '0x70e71ea3': ['etherandomSeedWithGasLimit(uint256)'], + '0x4d561721': ['etherandomSetNetwork()'], + '0x7ca55e00': ['etherandomVerify(bytes32,bytes32,bytes32,uint256,uint256)'], + '0x29bed3bf': ['EthereumRoulette()'], + '0xd81f53fd': ['EtherId()'], + '0x50e06b57': ['Etherization()'], + '0xd409ddda': ['EtherizationUtils()'], + '0xff7f5f2a': ['EtherizationUtils2()'], + '0xf9a794ad': ['EtherLovers()'], + '0x1558ae4d': ['Etheroll()'], + '0xa08d3f83': [ + 'Etheropt(uint256,string,uint256,uint256,bytes32,address,int256[])' + ], + '0xadd43c59': ['EtherTopDog()'], + '0x356594ab': ['EtherTransfer()'], + '0x0da3e613': ['EthFactory()'], + '0xf5f6ea26': ['EthOne()'], + '0x3023d0c4': ['Ethstick()'], + '0x6f13e01b': ['EthVenturePlugin()'], + '0x4054f5de': ['EthVentures3()'], + '0x9c172f87': ['EthVentures4()'], + '0xd5171523': ['euroteambet()'], + '0x9f87acd0': ['exec(bytes32,bytes32,uint256)'], + '0xf4993bbd': ['executeEmergencyWithdrawal()'], + '0x38557648': ['executeSellOrder(address)'], + '0x4d782cbc': ['executeSellOrder()'], + '0x140b4465': ['executeSpendingRequests()'], + '0x3462f32d': ['execWithGasLimit(bytes32,bytes32,uint256,uint256)'], + '0xd4649fde': ['expire(uint256,uint8,bytes32,bytes32,bytes32)'], + '0x03cf4fd6': ['expire(uint256,uint256,uint8,bytes32,bytes32,bytes32)'], + '0x419945f8': ['ExpiringMarket(uint256)'], + '0x37930615': ['extend(bytes16[],uint64)'], + '0x6a6d31db': ['externalEnter()'], + '0xf55b23c0': ['externalLeave()'], + '0xe2056c46': ['ExtraBalToken()'], + '0x7ef95c6f': ['extractAccountAllowanceRecordLength(address)'], + '0x4de162e4': ['extractAccountLength()'], + '0x727089f1': ['extractAllowanceLength()'], + '0x8f731077': ['extractAllowanceRecordLength(address)'], + '0xc8117b5b': ['extractBalanceOfLength()'], + '0x1cf43b63': ['extractExportFeeChargeLength()'], + '0xa056469a': ['extractFeeLength()'], + '0xb5a6c525': ['extractFrozenAccountLength()'], + '0xd1da09ee': ['extractImportFeeChargeLength()'], + '0x2885b593': ['extractMasterKeyIndexLength()'], + '0x981a60f5': ['extractNameFromData(bytes)'], + '0xb764e273': ['failSend()'], + '0xc57a050e': ['fairandeasy()'], + '0xa5e62f02': ['fallbackRP()'], + '0x93e02d13': ['FallenLeaders()'], + '0xd3732642': ['FastRealisticPyramid()'], + '0xc5096a69': ['feeFor(address,address,uint256)'], + '0x6860fd58': ['Fees(uint256)'], + '0x5b151fd2': ['fifty_fifty()'], + '0x75438e49': ['fillGas()'], + '0x884b5dc2': ['fill(uint256[])'], + '0x7ff729fc': ['fillUpProject(uint256,uint256)'], + '0xbf12165e': ['fillUpSlot(uint256,uint256)'], + '0x5fa513d5': ['findPtr(uint256,uint256,uint256,uint256)'], + '0x70d53be5': ['find()'], + '0xc9bd2893': ['fines()'], + '0x2cce4abe': ['_finishNoCallback()'], + '0x113e6b66': ['fipsAddToLedger(bytes20,address)'], + '0xaa8dea8c': ['fipsAddToLedger(bytes20,address,bytes)'], + '0xa289673b': ['fipsChangeOwner(bytes20,address,address)'], + '0x1dcb304b': ['fipsGenerate()'], + '0x7910085d': ['fipsIsRegistered(bytes20)'], + '0x3ae7cdfa': ['fipsLegacyRegister(bytes20[],address)'], + '0xdfce8ac3': ['fipsLegacyRegister(bytes20,address,bytes)'], + '0x5cb18a6d': ['fipsLegacyRegisterMulti(bytes20[],address,bytes)'], + '0x3def449b': ['FipsNotary()'], + '0x7620f4bb': ['fipsNotaryLegacy68b4()'], + '0x5084da18': ['fipsOwner(bytes20)'], + '0x3df76482': ['fipsPublishData(bytes20,bytes)'], + '0xfba06849': ['fipsPublishDataMulti(bytes20[],bytes)'], + '0x74d4ab27': ['fipsRegister()'], + '0x419ffa03': ['fipsRegister(address)'], + '0xb16562fe': ['fipsRegister(address,bytes)'], + '0x1531c267': ['fipsRegisterMulti(uint256,address,bytes)'], + '0x3dc02266': ['fipsRegister(uint256)'], + '0x2f62a6ff': ['fipsRegister(uint256,address,bytes)'], + '0xc12af1ce': ['fipsRegister(uint256,bytes)'], + '0x2fa00e58': ['fipsTransfer(bytes20,address)'], + '0x42402c2c': ['fipsTransferMulti(bytes20[],address)'], + '0x9e9d3aa4': ['FirstBloodToken(address,address,uint256,uint256)'], + '0x3df4ddf4': ['first()'], + '0xe87df70e': ['fivetimes()'], + '0x912de8de': ['fixBalance()'], + '0xf1c760ae': ['fixBalanceInternal(address)'], + '0x3369dace': ['flipTheCoinAndWin()'], + '0x6b9f96ea': ['flush()'], + '0x446a7974': ['Fokitol()'], + '0x6a5da6e5': ['followCampaign(uint256)'], + '0x384b1393': ['follow(uint256)'], + '0x7cf0ffcb': ['forceDivestAll()'], + '0x29e206bd': ['forceDivestAll(bool)'], + '0x232523e8': ['forceDivestOfAllInvestors()'], + '0x51404cbe': ['forceDivestOfOneInvestor(address)'], + '0x93feb13b': ['ForceSendHelper(address)'], + '0x11b9fee8': ['ForkChecker(uint256,bytes32)'], + '0x16c72721': ['forked()'], + '0xd264e05e': ['forward()'], + '0xa4d575ce': ['_forward(address,bytes)'], + '0xac562666': ['freezeCoin()'], + '0xb466b76f': ['fresh()'], + '0xb72e717d': ['fromAddress(address)'], + '0x891de9ed': ['fromTLA(string)'], + '0x3c067945': ['fundBalance()'], + '0x43243797': ['fundsOf(address)'], + '0xca708230': ['funnel()'], + '0xfc108f70': ['GamblerPerAddress(address)'], + '0xefa7e56b': ['GameEnds()'], + '0x2143da91': ['GameOfThrones()'], + '0xa10edc55': ['GeneralPurposeProfitSplitter()'], + '0x4d70d1d7': ['generateId(uint256)'], + '0x6f6c0244': ['generateShortLink()'], + '0x419db07b': ['generousFee()'], + '0xfa7d68f1': ['getAccountInfo(uint256,uint256)'], + '0x10082bff': ['getActorBillXdetail(address,uint256,bool)'], + '0x04fc11d5': ['getActual()'], + '0x21f8a721': ['getAddress(bytes32)'], + '0x6795dbcd': ['getAddress(bytes32,string)'], + '0x42c69566': ['get_address(address,string)'], + '0xe7b48f74': ['get(int256,address)'], + '0x579cdf17': ['getAdminName(address)'], + '0xc8edf65e': ['GetAndReduceFeesByFraction(uint256)'], + '0xc6ed8e1b': ['getApprovedProxys()'], + '0xf9cc0605': ['getAvailable()'], + '0x12065fe0': ['getBalance()'], + '0x1177892f': ['getBalanceByAdress(address)'], + '0x565a2e2c': ['getBeneficiary()'], + '0xa6afd5fd': ['getBets()'], + '0x061e494f': ['getBet(uint256)'], + '0x8c98117c': ['getBill(uint256,uint256)'], + '0xe422ebe9': ['getBot()'], + '0x618fa9ce': ['getBotBillingIndex(uint256,uint256)'], + '0x4ae9af61': ['getBotStats(uint256,uint256)'], + '0x5f70d9ac': ['getBot(uint256)'], + '0xc06c4474': ['get_burned(bytes32)'], + '0xc00ca383': ['getByOwner(address,uint256)'], + '0x8eaa6ac0': ['get(bytes32)'], + '0xd120a284': ['getBytesFromNumbers(uint8[3])'], + '0x1f6e5117': ['getCallbackAddress()'], + '0x769dc523': ['GetCategoryNumber(bytes4)'], + '0x7281854d': ['GetCategoryValue(uint8)'], + '0xc88cc6ac': ['getCertification(address)'], + '0x777feff5': ['getCertificationDbAtIndex(uint256)'], + '0x808ab1d6': ['getCertificationDbCount()'], + '0xfd260dfc': ['getCertificationDbStatus(address)'], + '0xde629235': ['getCertificationDocumentAtIndex(address,uint256)'], + '0xd5582205': ['getCertifiedStudentAtIndex(uint256)'], + '0x038461ea': ['getCertifiedStudentsCount()'], + '0x2f695053': ['getCertifierAtIndex(uint256)'], + '0x56d73ad1': ['getCertifierDb()'], + '0x6e63015c': ['getCertifiersCount()'], + '0x05b765ea': ['getCertifierStatus(address)'], + '0x045236b4': ['getChainyData(string)'], + '0x919edc7c': ['getChainySender(string)'], + '0xe8b13c44': ['getChainyTimestamp(string)'], + '0x233120aa': ['getChainyURL()'], + '0xd7130651': ['getCity(uint256)'], + '0xd0068f80': ['getClient(uint256)'], + '0x3aa94b1d': ['getCoinStats(uint256)'], + '0xda311588': ['getCoin(uint256)'], + '0xe65d6b49': ['getCommission()'], + '0x69bcdb7d': ['getCommitment(uint256)'], + '0xf896503a': ['getConfigAddress(bytes32)'], + '0xea3ebae6': ['getConfigBool(bytes32)'], + '0x62c7855b': ['getConfigBytes(bytes32)'], + '0xb44bd51d': ['getConfig(string)'], + '0x5c1b3ca1': ['getConfigUint(int256,bytes32)'], + '0xd408746a': ['GetContractAddr()'], + '0xd3edcb5b': ['getCreditorAddresses()'], + '0x81064e2d': ['getCreditorAmounts()'], + '0x77c78df9': ['getCurrentLevel()'], + '0x2bf4e53d': ['getCurrentShareholders()'], + '0x329bfc33': ['getCurrentWinner()'], + '0x152cf9db': ['getDataPoint(int256,uint256,uint256)'], + '0xcf69df28': ['getDataRequestLength()'], + '0x88f53db1': ['getDataRequest(uint256)'], + '0xd2b0d554': ['getDisclaimer()'], + '0x80ede329': ['getDocumentDetails(uint256)'], + '0x16e55626': ['getDogName(address)'], + '0x1a7a98e2': ['getDomain(uint256)'], + '0xbe6307c8': ['getDraw(uint256)'], + '0x2fa7cbfb': ['getExecCost(uint256)'], + '0x752bacce': ['getExecPrice()'], + '0xba1162d7': ['getFmLength()'], + '0xd63547e6': ['GetFreeCnt()'], + '0x4a7e049e': ['getFullCompany(address,uint256)'], + '0x3e853128': ['getGasForXau(address)'], + '0x455259cb': ['getGasPrice()'], + '0x75608264': ['get_hash(uint8,bytes32)'], + '0xbba91ea7': ['getHomeadvIndex(uint256)'], + '0x24fc65ed': ['getId(uint256,uint256)'], + '0xb7de47d3': ['getIndex(uint256,uint256)'], + '0x2b98222e': ['getInstitutionByAddress(address)'], + '0x6da1833c': ['getInstitutionByName(string)'], + '0x728af7ec': ['getInterest(uint256,uint256)'], + '0x0a80ef45': ['getIsClosed()'], + '0x0ed21029': ['getIssueAssignee(uint256,bytes32)'], + '0x706dfe54': ['getIssueState(uint256,bytes32)'], + '0xc5bf339c': ['getLastNonPublished()'], + '0x65fa2f7f': ['getLastPrice(uint256)'], + '0x89f4ed7a': ['getLastTag(uint256)'], + '0x29a065bd': ['getLOg(uint256)'], + '0xe0e3ba5a': ['getLosesShare(address)'], + '0x550ed1f0': ['getMaxBetAmount()'], + '0x82a5285d': ['getMinBetAmount()'], + '0x5af73f3f': ['getMinimalBalance(uint256,address)'], + '0x90daaf67': ['getMinimalDeposit()'], + '0xf909d60d': ['getMinimumGasLimit()'], + '0x724ae9d0': ['getMinInvestment()'], + '0xa538d287': ['getMinMax()'], + '0x686e8aaa': ['GetMoney()'], + '0x3cc86b80': ['GetMoney(uint256,address)'], + '0x50ab6f7f': ['getMsgs()'], + '0xc1d4f708': ['getMwLength()'], + '0xcfb3a493': ['getMyBounty(uint256)'], + '0xb484e532': ['getMyMsg()'], + '0xc003b082': ['getMyPlayerID()'], + '0x36ffa905': ['getMyProposals()'], + '0x0645b5d5': ['getMyShareholderID()'], + '0x3e83fe36': ['getMyShares()'], + '0xea1bf386': ['getNextSellerBOTdata(uint256)'], + '0x2ade6c36': ['getNodeAddress(bytes32)'], + '0xbbe4fd50': ['getNow()'], + '0x1c895915': ['getNumberOfPayments(uint256)'], + '0x5819dde2': ['getNumbersFromBytes(bytes3)'], + '0x017972af': ['getNumbersFromHash(bytes32)'], + '0x06638e92': ['GetNumbersFromHash(bytes32)'], + '0x57ee24af': ['getNum(bytes32,uint256)'], + '0xb39a64cd': ['getNumCalled()'], + '0x52200a13': ['getNumHolders(uint256)'], + '0x72ea4b8c': ['getNumInvestors()'], + '0xa8893a6e': ['getNumOfSalesWithSameId(bytes16)'], + '0x531c1b33': ['getOperatingBudget()'], + '0x09574810': ['getOperationsNumber()'], + '0x202e3924': ['getOperation(uint256)'], + '0xfaa1a8ff': ['getOwnedBot(address,uint256)'], + '0x0ae50a39': ['GetOwner()'], + '0xe74ffbd5': ['getPart(bytes32,uint256)'], + '0xd085e66e': ['GetPart(bytes32,uint256)'], + '0xe42d5be0': ['getPaymentOf(address)'], + '0x5a825cbb': ['getPayment(uint256,uint256)'], + '0xe56556a9': ['getPlayerID(address)'], + '0x953aa435': ['GetPrice(uint8)'], + '0x116c6eab': ['getProfitShare(address)'], + '0x7486a8e3': ['get_publisher(bytes32)'], + '0x6a28db13': ['getQrLength()'], + '0x163aba3c': ['getQueryFee()'], + '0xf1b3f968': ['getRaceEndBlock()'], + '0xcd4b6914': ['getRandom(uint256)'], + '0x7bcd7fad': ['getRecordAtIndex(uint256)'], + '0xb719d1d0': ['getRegInfo(address)'], + '0x052b2aa7': ['getRegistrants()'], + '0xadd4c784': ['getResult(bytes32)'], + '0x7332b520': ['getRewardsCount(uint256)'], + '0x85dd2148': ['getSaleDate(bytes16)'], + '0xac92fdb5': ['getSaleDate(bytes16,uint256)'], + '0xd239ea8b': ['getSchemasLenght()'], + '0x288c6ed2': ['getSeedCost(uint256)'], + '0x9183fd01': ['getSeedPrice()'], + '0x347632e8': ['getShareholderAdressByID(uint256)'], + '0x308d6613': ['getSignData(uint256,uint8)'], + '0xb36a0b15': ['getSignDetails(uint256,uint8)'], + '0x28dcfdac': ['getSignsCount(uint256)'], + '0x842bc37b': ['GetSmallCotractIndex(address)'], + '0xafa293d4': ['getSource()'], + '0xe9e7a667': ['get_stake(bytes32)'], + '0x22b0f6ee': ['getStatusOfPayout(uint256)'], + '0x9a0af2ec': ['getStLength()'], + '0x693ec85e': ['get(string)'], + '0x4a0d89ba': ['getSwap(uint256)'], + '0x7ac26aeb': ['getTag(string,uint256)'], + '0xdf300b46': ['getThing(bytes32[])'], + '0x55b62dcf': ['getThresold(uint256)'], + '0x002a5cc9': ['getTicketHolders(uint256)'], + '0x9f0e3107': ['get_timestamp(bytes32)'], + '0x82b2e257': ['getTokenBalance()'], + '0xacab021c': ['getTOS(address)'], + '0x12b58349': ['getTotalBalance()'], + '0xc4e41b22': ['getTotalSupply()'], + '0xcaa648b4': ['getTotalValue()'], + '0xf709dd51': ['getTrademark()'], + '0x9bb0e4df': ['getUint(int256,bytes32,string)'], + '0x74e4435f': ['getUserAddress(uint256,bytes32)'], + '0xa2bb5d48': ['get_username(address)'], + '0x6de00927': ['GetUserRank(uint8,address)'], + '0xff981099': ['getVotes(uint256)'], + '0xffb1a6cb': ['getWins(address)'], + '0x4ae8c55f': ['getWwLength()'], + '0xfb9a4595': ['GitHubBounty()'], + '0x0b7373d6': ['giveAllBack()'], + '0x04706fdf': ['giveContributionsBackProfitBugged()'], + '0xb5299ca6': ['giveMeat()'], + '0x9e7b8d61': ['giveRightToVote(address)'], + '0x35ae41c9': ['godAutomaticCollectFee()'], + '0x691bfc89': ['goods(uint16,uint256)'], + '0x7c25f260': ['Government()'], + '0xbb6a0853': ['GreedPit()'], + '0x92ba4ba6': ['GridMember(string,uint256,bool,address,address)'], + '0x3cc7790a': ['GSI()'], + '0xa1c95ac2': ['GSIToken(uint256,string,uint8,string,address)'], + '0x75f96ead': ['Guess(uint256)'], + '0xdf143fb7': ['HackerGold(address)'], + '0x5ed7ca5b': ['halt()'], + '0x4f28af6a': ['handleBet(uint256)'], + '0xcb96012e': ['hashTo256(bytes32)'], + '0x650955d4': ['HashToken()'], + '0xa1add510': ['hasRelation(bytes32,bytes32,address)'], + '0x06f36cc9': ['helpBlue()'], + '0x353928d8': ['helpRed()'], + '0xce373b95': ['heroOfThePit()'], + '0xaeeb96af': ['Highlander()'], + '0x7eb69ba1': ['hint(int256,bytes32,string,bytes20)'], + '0xc98031be': ['hintURL(int256,bytes32,string)'], + '0xef4ffee2': ['Honestgamble()'], + '0xa6027d53': ['IconomiTokenTest(uint256,string,uint8,string,uint256)'], + '0xb98fdc36': ['IconomiToken(uint256,string,uint8,string,uint256)'], + '0xdaf22f4d': ['identify(bytes32)'], + '0xaf640d0f': ['id()'], + '0xf7c3ee7a': ['immortality()'], + '0x602acca1': ['InchainICO(address[],uint256)'], + '0xa4beffa7': ['increaseInvestment()'], + '0xcab5c0f1': ['_incrementState()'], + '0x1e8c72b4': ['incrUserAvailBal(address,uint256,bool)'], + '0x3d5db1c2': ['incrUserOnholdBal(address,uint256,bool)'], + '0x22686250': ['index(int256,uint256)'], + '0x1f13de92': ['inEther(uint256)'], + '0x9334ab61': ['Infos()'], + '0x4a1f0bf6': ['inheritToNextGeneration(address)'], + '0x2cc0b254': ['init(address,bytes32)'], + '0x87ebd76c': ['initContract(string,string,uint256,uint256)'], + '0x23584a21': ['initStats(string,address,uint256)'], + '0x98eaca94': ['inKissBTC(uint256)'], + '0xa0469b02': ['inputToDigit(uint256)'], + '0xfeaa29d8': ['insertProfitHere()'], + '0x46af23f5': ['InstantLottery(address,address,bool,address)'], + '0xf83d96c1': ['InsuranceAgent()'], + '0x8cecf66e': ['_inverse(uint256)'], + '0xadfe6b80': ['InvestAdd()'], + '0x391f2e96': ['InvestCancel()'], + '0x4f013184': ['investInTheSystem()'], + '0xc4321adb': ['investInTheSystem(uint256)'], + '0x2afb21bc': ['InvestWithdraw()'], + '0x76285b5b': ['_is360thDay()'], + '0x74eb9b68': ['isAccountLocked(address)'], + '0x1cf52f2b': ['isActiveRegistrant(address)'], + '0x24d7806c': ['isAdmin(address)'], + '0xfc1f7652': ['_isBoardMember(address)'], + '0xda7d0082': ['isCertification(address,bytes32)'], + '0x5afa5036': ['isCertified(address)'], + '0x1c2353e1': ['isCertifier(address)'], + '0x37b0574a': ['isClassic()'], + '0xc2b6b58c': ['isClosed()'], + '0x57eaeddf': ['_isContract()'], + '0x2f553d31': ['isCreated(bytes32)'], + '0x5445e38c': ['_isCycleValid(uint256)'], + '0x88eb7af7': ['_isHuman()'], + '0xaa51793c': ['isLosingBet(uint256)'], + '0x42f6e389': ['isModule(address)'], + '0x6534b4e2': ['IsPayoutReady__InfoFunction(bytes32)'], + '0x245a6f74': ['isProxyLegit(address)'], + '0x3e5cee05': ['issueIOU(string,uint256,address)'], + '0x05d87fe2': ['issueLetterOfCredit(uint256,uint256,uint256)'], + '0x40fdf515': ['issuetender(address,uint256,uint256)'], + '0x475a9fa9': ['issueTokens(address,uint256)'], + '0x4adcbd19': ['isThisHardforkedVersion()'], + '0xaf5610dd': ['isThisPreforkVersion()'], + '0x7c4c27c8': ['isThisPuritanicalVersion()'], + '0x4209fff1': ['isUser(address)'], + '0x04d10f1c': ['isValidChainyJson(string)'], + '0x6662e4be': ['isWinningBet(uint256)'], + '0x99aeade3': ['iterateTable(uint256,uint256)'], + '0x3b46a7df': ['ivote(bool)'], + '0x0138e31b': ['_jAdd(uint256,uint256,uint256,uint256)'], + '0xed64bea4': ['JamCoin()'], + '0x5f972df8': ['_jDiv(uint256,uint256,uint256,uint256)'], + '0x9743dfc1': ['jesterAutomaticCollectFee()'], + '0x5b764811': ['_jMul(uint256,uint256,uint256,uint256)'], + '0x4a7b26ec': ['join_game(uint256)'], + '0x1ecfe64d': ['_jSub(uint256,uint256,uint256,uint256)'], + '0x691fb8ea': ['jumpIn()'], + '0xc53ad76f': ['Kardashian()'], + '0x775dec49': ['keccak()'], + '0xbe26733c': ['Kill()'], + '0x73abecbb': ['kill1()'], + '0x2bb685bc': ['kill2()'], + '0x179b73da': ['killBoardProposal(uint256,address)'], + '0xb0c7f709': ['kingAutomaticCollectFee()'], + '0x7e81b6aa': ['KingdomFactory()'], + '0x5e68ac2c': [ + 'Kingdom(string,address,address,address,uint256,uint256,uint256,uint256,uint256)' + ], + '0x31ae0019': ['KissBTC()'], + '0x07e00bcb': ['kissBTCCallback(uint256,uint256)'], + '0x47799da8': ['last()'], + '0x7075b1d8': ['latestMonarchInternal()'], + '0xfa6d373c': ['LeaderHash()'], + '0x9fb25d9e': ['LeaderMessage()'], + '0x166c4b85': ['len(bytes32)'], + '0xd95a2d42': ['lendGovernmentMoney(address)'], + '0x56d88e27': ['len()'], + '0xfe71aec5': ['LittleCactus()'], + '0x7b647652': ['LittleEthereumDoubler()'], + '0xf83d08ba': ['lock()'], + '0xe8d1e961': ['lockAccount(uint256)'], + '0x3a7d280c': ['login(string)'], + '0x4cbee813': ['logout(string)'], + '0x41304fac': ['log(string)'], + '0x71e2d919': ['lol()'], + '0x3fd1f232': ['LookAtAllTheseTastyFees()'], + '0xf7bd2361': ['LookAtBalance()'], + '0x25d4bdeb': ['LookAtCollectedFees()'], + '0x7ee65635': ['LookAtDepositsToPlay()'], + '0xb0ecca8f': ['LookAtLastTimePerZone(uint256)'], + '0xb1c6517a': ['LookAtNumberOfPlayers()'], + '0xdfca2f53': ['LookAtPrizes()'], + '0xa9fbc614': ['lookupTicketHolder(uint256)'], + '0xba13a572': ['lottery()'], + '0x21bb79fe': ['luckyDogInfo()'], + '0xb74bc710': ['LuckyDoubler()'], + '0x5a2ee019': ['m()'], + '0x8af49ab7': ['maintain(uint256,uint256)'], + '0x561e91a1': ['makeBet()'], + '0x1077f06c': ['makeClaim(uint256)'], + '0x059a500c': ['makeDeposit(uint256)'], + '0x3df16377': [ + 'make_move_and_claim_victory(uint256,uint8,uint8,uint8,uint8,uint8,uint8,uint8)' + ], + '0xa35cfa22': ['make_move(uint256,uint8,uint8,uint8,uint8)'], + '0x2f1e4968': ['makeNewProposal(string,uint256)'], + '0x8b543b80': ['maximumCredit(address)'], + '0x11fe773d': ['memcpy(uint256,uint256,uint256)'], + '0x62be3172': ['Message(address,address,address,string)'], + '0x0257c48c': ['meta(bytes32,bytes32)'], + '0x7958533a': ['meta(uint256,bytes32)'], + '0x8f8bde82': ['MicroDAO()'], + '0x1e701780': ['MICRODAO(address,uint256,uint256,uint256,address)'], + '0x026993e0': ['Midas(address,address)'], + '0xfa968eea': ['minBetAmount()'], + '0xd10e99fe': ['mint(int256,bytes32)'], + '0x3a7fb796': ['mintGreen(int256,address,uint256)'], + '0x77ceded8': ['mintGrey(int256,address,uint256)'], + '0xf41bfa9e': ['mint(int256,uint256,string)'], + '0x411c4e72': ['ModifyFeeFraction(uint256)'], + '0xa20c404f': [ + 'ModifySettings(uint256,uint256,uint256,uint256,uint256,uint256,uint256)' + ], + '0x689b3e2d': ['Moonraker(address,address)'], + '0x5837e083': ['move_history(uint256)'], + '0xd8a8e03a': ['move(uint256,address)'], + '0x231944e2': ['moveUnits(uint256,uint256,uint256[])'], + '0x33f472b9': ['MPO()'], + '0xf714de9c': ['MultiAccess()'], + '0x4f60f334': ['multiAccessAddOwner(address)'], + '0x092a2e37': ['multiAccessAddOwnerD(address,address)'], + '0x69a5e902': ['multiAccessCall(address,uint256,bytes)'], + '0x8b9726c1': ['multiAccessCallD(address,uint256,bytes,address)'], + '0x9bd99195': ['multiAccessChangeOwner(address,address)'], + '0x6c494843': ['multiAccessChangeOwnerD(address,address,address)'], + '0x6d522b19': ['multiAccessChangeRequirementD(uint256,address)'], + '0x62891b5d': ['multiAccessChangeRequirement(uint256)'], + '0x446294ad': ['multiAccessGetOwners()'], + '0xeb7402f5': ['multiAccessHasConfirmed(bytes32,address)'], + '0xe419f189': ['multiAccessIsOwner(address)'], + '0x73f310df': ['multiAccessRemoveOwner(address)'], + '0x5a74dee5': ['multiAccessRemoveOwnerD(address,address)'], + '0x7ed19af9': ['multiAccessRevoke(bytes32)'], + '0xd1b4ff7e': ['multiAccessRevokeD(bytes32,address)'], + '0xd1cf113e': ['multiAccessSetRecipient(address)'], + '0x7429f1eb': ['multiAccessSetRecipientD(address,address)'], + '0x30677b83': ['multiplierFactor()'], + '0x9d7d6667': ['multipliers()'], + '0xfbeaebc6': ['murder()'], + '0x98391c94': ['muteMe(bool)'], + '0x0bd089ab': ['MyAdvancedToken(uint256,string,uint8,string,address)'], + '0xc95e81cb': ['MyBet(uint8,address)'], + '0x6e658fbe': ['myFundsExpireIn(uint256)'], + '0x089327de': ['MyToken()'], + '0x041d0c0b': ['MyTokenLoad(uint256,string,uint8,string,address)'], + '0x1d2bca17': ['MyToken(uint256,string,uint8,string)'], + '0x2e52d606': ['n()'], + '0x19350aea': ['nameFor(address)'], + '0x3bcf7d22': ['newBribedCitizen(address)'], + '0xba487e62': ['newCampaign(uint32,uint96,uint16,uint16)'], + '0x927ed13a': ['newClient(uint256,address)'], + '0x1df473bc': ['newContract(bytes)'], + '0xf3dd3d8a': ['newCurrency(string,string,uint8)'], + '0x78ae88d1': ['newDeal(uint256,uint256,uint256,uint256,uint256)'], + '0x7c69b5d1': ['NewDeposit(uint256)'], + '0xc853c03d': ['newDraw(uint256,uint8[3],uint256,uint256,uint256,uint256)'], + '0xdcff5581': ['NewFeeAddress(address)'], + '0x66ad484c': ['newfirst_player(address)'], + '0x7d03f5f3': ['newGame()'], + '0xd9e7ee1c': ['new_game(uint256,uint256)'], + '0x1d71a1cd': ['newIncome(string)'], + '0xfb099c84': ['newInvestor()'], + '0x4316abbb': ['newJester(address)'], + '0x9a8f09bd': ['newKing(address)'], + '0x9229c504': ['new_mainPlayer(address)'], + '0x2fac1a54': ['newOrder(bool,uint256,uint256,uint256,uint256)'], + '0x85952454': ['newOwner(address)'], + '0x3baf4e1e': ['newPayment(uint256,uint256)'], + '0x71589d6b': ['newponzi()'], + '0x4f24186a': ['newProposal(string)'], + '0xa07daa65': ['newRequest(uint256)'], + '0x025bbbe5': ['newSale(bytes16,uint256,uint256)'], + '0x97bb2a63': ['newvow(uint256,address)'], + '0xf28386bf': ['Nexium()'], + '0xab73e316': ['next(address)'], + '0x727b1cd6': ['next_draw(bytes32,uint256,uint256,uint256,uint256,uint256)'], + '0x332f93a9': ['nextPayoutGoal()'], + '0x47e40553': ['nextRound()'], + '0xd1bf9aba': ['nextRune()'], + '0xb3cb8885': ['nextUnderdogPayout()'], + '0xb3a2a999': ['nextWithdrawal(bytes16)'], + '0xa668d7c9': ['NiceGuyPonzi()'], + '0x0908178f': ['NoFeePonzi()'], + '0xac20902e': ['NormalizeMoney()'], + '0x305075db': ['NormalizeRanks()'], + '0xecb4136e': ['NotAnotherPonzi()'], + '0x58d3b617': ['Notifier(string)'], + '0xfa4e5e5a': ['notify(uint8,string,string)'], + '0xdea06188': ['NumberOfBlockAlreadyMined()'], + '0x892c0214': ['NumberOfCurrentBlockMiners()'], + '0x85233869': ['NumberOfMiners()'], + '0xdf811d7d': ['numberOfPlayersInCurrentRound()'], + '0xdf06f906': ['numBets()'], + '0xca35271c': ['numDebtors(address)'], + '0x902e64e5': ['Oath()'], + '0xa1920586': ['offer(uint256,uint256)'], + '0x901717d1': ['one()'], + '0xe671f510': ['onEtherandomExec(bytes32,bytes32,uint256)'], + '0x041fe13d': ['onEtherandomSeed(bytes32,bytes32)'], + '0xa5eb7a4e': ['operated()'], + '0x9549355e': ['oracalizeReading(uint256)'], + '0x9a828a71': ['oracalizeReading(uint256,string)'], + '0x053c351b': ['oraclize_getPrice(string)'], + '0xabe9f569': ['oraclize_getPrice(string,uint256)'], + '0xc8e55708': ['oraclize_query(string,string[1])'], + '0x871113c3': ['oraclize_query(string,string[1],uint256)'], + '0x044d0b06': ['oraclize_query(string,string[2])'], + '0xa6bf3df0': ['oraclize_query(string,string[2],uint256)'], + '0x9b9ba572': ['oraclize_query(string,string[3])'], + '0xae404996': ['oraclize_query(string,string[3],uint256)'], + '0x16d9356f': ['oraclize_query(string,string[4])'], + '0xbc5ff5e1': ['oraclize_query(string,string[4],uint256)'], + '0xbd9a5673': ['oraclize_query(string,string[5])'], + '0xb6ce5581': ['oraclize_query(string,string[5],uint256)'], + '0x14167bf0': ['oraclize_query(string,string[])'], + '0xe50a3bb1': ['oraclize_query(string,string[],uint256)'], + '0x0ff4f160': ['oraclize_query(uint256,string,string[1])'], + '0x77ac3da5': ['oraclize_query(uint256,string,string[1],uint256)'], + '0xa8c3ec48': ['oraclize_query(uint256,string,string[2])'], + '0x29a6f31b': ['oraclize_query(uint256,string,string[2],uint256)'], + '0xec6afc22': ['oraclize_query(uint256,string,string[3])'], + '0xfb114f57': ['oraclize_query(uint256,string,string[3],uint256)'], + '0x2ff92323': ['oraclize_query(uint256,string,string[4])'], + '0x0494630f': ['oraclize_query(uint256,string,string[4],uint256)'], + '0x6510ef4d': ['oraclize_query(uint256,string,string[5])'], + '0x00a94b6e': ['oraclize_query(uint256,string,string[5],uint256)'], + '0xdc206e5f': ['oraclize_query(uint256,string,string[])'], + '0xa2b5591c': ['oraclize_query(uint256,string,string[],uint256)'], + '0x83a51ad0': ['oraclize_setConfig(bytes32)'], + '0x01095962': ['oraclize_setCustomGasPrice(uint256)'], + '0x6b1cb549': [ + 'orderMatch(uint256,uint256,uint256,int256,uint256,uint256,address,uint8,bytes32,bytes32,int256)' + ], + '0xbd858288': [ + 'orderMatch(uint256,uint256,int256,uint256,uint256,address,uint8,bytes32,bytes32,int256)' + ], + '0x17961d0f': ['ord()'], + '0x16bac350': ['overthrow(string)'], + '0xe2894a8a': ['OwnerAnnounce(string)'], + '0x4f44728d': ['ownerChangeOwner(address)'], + '0xad04592e': ['owner_deposit()'], + '0xd6e0bf29': ['OwnerDeposit()'], + '0xd263b7eb': ['ownerkill()'], + '0x6eacd48a': ['ownerPauseGame(bool)'], + '0x4b7fcee7': ['ownerPausePayouts(bool)'], + '0xcf832ce2': ['ownerRefundPlayer(bytes32,address,uint256,uint256)'], + '0xa27c672a': ['owner_reveal_and_commit(uint8,bytes32,bytes32)'], + '0x392327b5': ['owner_set_fraction(uint256)'], + '0x268d50fe': ['ownerSetHouseEdge(uint256)'], + '0x5e968a49': ['ownerSetMaxProfitAsPercentOfHouse(uint256)'], + '0x6cdf4c90': ['ownerSetMinBet(uint256)'], + '0xd207e757': ['ownerSetOraclizeSafeGas(uint32)'], + '0x8b64d70e': ['owner_set_time_limit(uint256)'], + '0x31375242': ['ownerSetTreasury(address)'], + '0xf738e5ca': ['ownerTakeProfit()'], + '0x758971e8': ['ownerTakeProfit(bool)'], + '0x7ac37d58': ['ownerTransferEther(address,uint256)'], + '0x150ad2a8': ['owner_transfer_ownership(address)'], + '0x26da8e17': ['ownerUpdateCostToCallOraclize(uint256)'], + '0xb33926cb': ['owner_withdraw(uint256)'], + '0xf7bc39bf': ['owns(address)'], + '0x88c3ba85': ['ParallelGambling()'], + '0xf65c4d42': ['Participate(uint256)'], + '0x1b9265b8': ['pay()'], + '0x18b749c4': ['payEther(uint256)'], + '0x4d268ddd': ['payImporterBankForGoodsBought()'], + '0xff08d2b0': ['PayMiners()'], + '0x85db2dda': ['PayoutQueueSize()'], + '0xe0fe075e': ['payoutReady()'], + '0x081e806d': ['PayOut(uint256)'], + '0xb2310cc5': ['payRequstedSum(uint256,uint256)'], + '0xb821f815': ['pay_winner(uint256)'], + '0xabf74a93': ['pitFee()'], + '0x43046844': ['placeBet(uint8)'], + '0xa4406bcd': ['placeSellOrder(uint256,uint256)'], + '0xb1cc4348': ['placeWager()'], + '0x71b6663e': ['play1(address,uint256)'], + '0x2ddbc04a': ['play2(address,uint256)'], + '0xdb18c972': ['play4(address,uint256)'], + '0xf0e10c0d': ['play(address,uint256)'], + '0xc7a1865b': ['play(bytes32)'], + '0x3e4c0c82': ['player_1(uint256)'], + '0x1ef0625b': ['player_2(uint256)'], + '0xc068eae0': ['player_collect_winnings(uint256)'], + '0xa4fde8bc': ['player_declare_taking_too_long()'], + '0x3c314a91': ['playerGetPendingTxByAddress(address)'], + '0x46b04e53': ['PlayerInfoPerZone(uint256,uint256)'], + '0x63aea3e0': ['PlayerInfo(uint256)'], + '0xeace4827': ['player_make_bet(uint8)'], + '0xdc6dd152': ['playerRollDice(uint256)'], + '0x24fb563f': ['PlayerTickets(address,uint256,uint256)'], + '0xa5f4af33': ['playerWithdrawPendingTransactions()'], + '0x39b333d9': ['Play(uint8,uint8,uint8,uint8)'], + '0x4c0eceb5': ['plusOnePonzi()'], + '0xe6cbcba9': ['PlusOnePonzi()'], + '0xd1f0bb2d': ['populateAllowedFreeExchanges()'], + '0x3570c2ee': ['PosRewards()'], + '0xb45105b2': ['post(string,address,string)'], + '0xc6a17d2b': ['pow10(uint256,uint8)'], + '0x2c02d622': ['precalculate()'], + '0x13bd4e2c': ['_prepareAndSendReward()'], + '0xf81d087d': ['prepareLottery()'], + '0xe6c1beb4': ['prepend(address)'], + '0xf8018a79': ['prepend(address,address)'], + '0x6bae05cf': ['preRegister(address)'], + '0x45788ce2': ['prev(address)'], + '0xa035b1fe': ['price()'], + '0x1288c42a': ['Prism()'], + '0x22dc36e2': ['processed(uint64)'], + '0x61aa8d93': ['processFee()'], + '0x5c52e51e': ['processPayout()'], + '0x80acaafb': ['profitDistribution()'], + '0xe1f5ebc5': ['_projectAddNew(address,uint256)'], + '0x6a3c1198': ['_projectCancelNew()'], + '0xa055fe64': ['_projectCommitNew(address)'], + '0x87914c6f': ['prolongateContract()'], + '0x9801cb8e': ['ProofOfExistence()'], + '0x4671e65e': ['proposeEmergencyWithdrawal(address)'], + '0xac4e73f9': ['proposeReverse(string,address)'], + '0x1fdf6e0c': ['protectKingdom()'], + '0xa9b8f7b8': ['ProtectTheCastle()'], + '0x4f09eba7': ['proxyApprove(address,uint256,bytes32)'], + '0xe82b7cb2': ['proxySetCosignerAddress(address,bytes32)'], + '0xea98e540': [ + 'proxyTransferFromToICAPWithReference(address,bytes32,uint256,string)' + ], + '0xf0cbe059': [ + 'proxyTransferFromWithReference(address,address,uint256,bytes32,string)' + ], + '0xc5487661': ['proxyTransferToICAPWithReference(bytes32,uint256,string)'], + '0x64ef212e': ['proxyTransferWithReference(address,uint256,bytes32,string)'], + '0xd94073d4': ['PT()'], + '0x8940aebe': ['publicKey(uint256)'], + '0x8b2e6dcf': ['publish(bytes32)'], + '0x57e25a79': ['PullPaymentCapable()'], + '0x0eb495c2': ['pushCity()'], + '0x4616caa9': ['pushCoin(uint256,address,string)'], + '0xacc8cb18': ['pushTerm(string)'], + '0xafd09bab': ['quadrupler()'], + '0x4306cc3f': ['queryEarnings(address)'], + '0x83eed3d5': ['queryN(uint256,string,bytes)'], + '0xc55c1cb6': ['queryN_withGasLimit(uint256,string,bytes,uint256)'], + '0xfdd3a879': ['quick()'], + '0xf28a7912': ['quick2()'], + '0xe0c7c117': ['Randao()'], + '0x0b15650b': ['randInt(uint256,uint256)'], + '0x8e3957d9': ['RandomNumber()'], + '0x7741b4ec': ['RandomNumberFromSeed(uint256)'], + '0xb863bd37': ['random(uint256)'], + '0xeb7cdb56': ['rankDown(uint256,uint256)'], + '0x74fbbc86': ['rate(uint256,uint256,string)'], + '0xba344743': ['_rawTransfer(address,address,uint256)'], + '0x2d2800f1': ['react()'], + '0xb7213bd4': ['readLog(uint256)'], + '0x7d7c2a1c': ['rebalance()'], + '0x248582b0': ['receivePaymentForGoodsSoldEarly()'], + '0x743e0c9b': ['receiveTokens(uint256)'], + '0x49d55d9d': ['receiveTransfer(uint256)'], + '0xc864e760': ['recordCommissionEarned(uint256)'], + '0xe51ace16': ['record(string)'], + '0xf06d335e': ['_recoverAccount(address,address)'], + '0x648bf774': ['recover(address,address)'], + '0x0cd865ec': ['recover(address)'], + '0x0ca35682': ['recover(uint256)'], + '0xf32efd3c': ['recoverUser(address,address,uint256,uint8,bytes32,bytes32)'], + '0xe20bbd8d': ['RecoveryWithTenant()'], + '0x0f23cbaa': ['recycle()'], + '0x578bcc20': ['reduceDebt(address,address,uint256)'], + '0x538e0759': ['refill()'], + '0x58b1f29c': ['refundBounty(uint256)'], + '0x847f8a10': ['Refund(uint32)'], + '0x5af36e3e': ['refund(uint256,uint256)'], + '0x66b42dcb': ['register(address,string,uint256,string)'], + '0xeeda149c': ['Register(address)'], + '0x4420e486': ['register(address)'], + '0x8d59cc02': ['register(address,string,string)'], + '0x8b7f0ddd': [ + 'register(address,address,string,string,bytes32[],uint256,string)' + ], + '0x7b1a547c': ['registerAs(address,string,uint256,string,address)'], + '0x3facd57c': [ + 'registerBill(uint256,address,address,uint256,uint256,uint256)' + ], + '0x84c344fe': ['_register(bytes4,string)'], + '0xb0fd935b': ['registerCertificationDb(address)'], + '0x4cd995da': ['registerCompany(address,string)'], + '0x669ee827': ['RegisterDevice()'], + '0xfe63300a': [ + 'registerExternalBill(uint256,address,address,uint256,uint256,uint256)' + ], + '0x68af4971': ['registerListening()'], + '0x00e7d289': ['registerListening(address)'], + '0x7f6d8955': ['RegisterOne(uint32,address,address)'], + '0xf2c298be': ['register(string)'], + '0x3ffbd47f': ['register(string,string)'], + '0xaeb4f0d3': ['RegisterTwo(address,address)'], + '0x8ae986cf': ['registrantApprove(address)'], + '0xe9fe799e': ['registrantRemove(address)'], + '0x7db9743b': ['Registry()'], + '0x6d15f208': ['reject(string,uint256,uint16,address,uint256)'], + '0xc76a4bfb': ['relayReceiveApproval(address,address,uint256,bytes)'], + '0xd67cbec9': ['release(uint32,uint32,uint32,bytes20)'], + '0xa7b2d4cb': ['remove(int256,address)'], + '0xf3ee6305': ['removeCertificationDocument(address,bytes32)'], + '0x9c30936f': ['removeCertificationDocumentFromSelf(bytes32)'], + '0xba4c206e': ['removeCertificationDocumentInternal(address,bytes32)'], + '0x0066753e': ['removeCertifier(address)'], + '0xd5df7559': ['removeDocument(uint256)'], + '0xac18de43': ['removeManager(address)'], + '0xba7dc45f': ['_removeOperation(bytes32)'], + '0x2c4cb4be': ['removeRegistryFromNameIndex(address)'], + '0x669459a7': ['removeRegistryFromOwnerIndex(address)'], + '0xaf55bba0': ['removeRegistryFromTagsIndex(address)'], + '0xf25eb5c1': ['removeReverse()'], + '0x80599e4b': ['remove(string)'], + '0x7e32a592': ['repairTheCastle()'], + '0x631de4d6': ['replace(address,address)'], + '0x9fd4f7d1': ['replaceWizard(address)'], + '0xce87f626': ['replaceWizardRP(address)'], + '0xeaa1f9fe': ['reqisterListening(address)'], + '0x27f06fff': ['requestFillUp(uint256)'], + '0x2e5d1042': ['requestPayout(uint256,uint256,bytes32,uint256,uint256)'], + '0xe9c63b9c': ['requestPeerBalance()'], + '0x4c9ed763': ['requestTokensBack()'], + '0x0ac28725': ['requestTradeDeal(uint256,uint256,string)'], + '0xf802075f': ['requiredEndowment()'], + '0x432ced04': ['reserve(bytes32)'], + '0x92698814': ['reserved(bytes32)'], + '0x6676871d': ['reserved_funds()'], + '0x6423db34': ['Reset()'], + '0x478e25bf': ['resetAction(bytes32)'], + '0x769796fe': ['resetAction(uint256)'], + '0xb181a8fc': ['resetContract()'], + '0xf50d3914': ['resetFoundationtList()'], + '0xd337616e': ['resetLottery()'], + '0x5cfd8c24': ['ResetPonzi()'], + '0x433d4aab': ['resolve(uint8,uint8)'], + '0xa6403636': ['resolve(uint8,bytes32,bytes32,bytes32)'], + '0x1ef3755d': ['restart()'], + '0xa987d654': ['restoreItem(uint256)'], + '0xc4bc5da5': ['resumeContract()'], + '0x61b20d8c': ['retrieveFunds()'], + '0x85c78fac': ['retryOraclizeRequest(uint256)'], + '0x5cbc85d0': ['returnBounty(uint256)'], + '0xcff2fa42': ['_returnFee(address,uint256)'], + '0x0ca7395f': ['returnFund(address,uint256)'], + '0xec81e22e': ['returnmoneycreator(uint8,uint256)'], + '0x7ac4b05e': ['returnMyMoney(uint256)'], + '0x9ec35352': ['returnRandom()'], + '0xebaf7f2f': ['returnReward(uint256)'], + '0x66d8c463': ['reveal(bytes32,string)'], + '0x32d5fe98': ['revealCampaign(uint256,uint256)'], + '0x9348cef7': ['reveal(uint256,uint256)'], + '0x84ad6ff3': ['ReversibleDemo()'], + '0x05f8b6f5': ['_rewireIdentities(bytes32[],uint256,uint256,uint32)'], + '0x8390b02a': ['rfindPtr(uint256,uint256,uint256,uint256)'], + '0xe1108706': ['rfind()'], + '0xf7149220': ['RNG()'], + '0x4e1053cc': ['RobinHoodPonzi()'], + '0xd2602930': ['RockPaperScissors()'], + '0x8d216186': ['roll(uint256,bytes32)'], + '0x5a7a8850': ['rollWithSeed(bytes32)'], + '0xb73405a9': ['roundMoneyDownNicely(uint256)'], + '0x5ccc3eaa': ['roundMoneyUpToWholeFinney(uint256)'], + '0x96d02099': ['rsplit()'], + '0xdd727ea6': ['runJackpot()'], + '0x5674a3ed': ['runLottery()'], + '0x4d366398': ['runPeerBalance()'], + '0x677cee54': ['SafeConditionalHFTransfer()'], + '0x2baf4f22': ['_safeFalse()'], + '0x4401a6e4': ['safeSend(address)'], + '0x4269d8ef': ['_safeSend(address,uint256)'], + '0xa97ffd5e': ['safeToSell(uint256)'], + '0x38e48f06': ['save(string)'], + '0x3fb27b85': ['seal()'], + '0xddbbc35c': ['searchByName(string)'], + '0x42cf0e72': ['searchByOwner(address)'], + '0xc82aac47': ['searchByTag(bytes32)'], + '0x40a49a96': ['searchSmallestInvestor()'], + '0xf7c2b38c': ['seconds_left()'], + '0xcf1cd249': ['secureSend(address)'], + '0x85e5bb3a': ['Security_AddPasswordSha3HashToBankAccount(bytes32)'], + '0x7d94792a': ['seed()'], + '0xe4cc1161': ['seedWithGasLimit(uint256)'], + '0x88b9e10e': ['seizeTokens(address,uint256)'], + '0x6be505f5': ['selectWinner(bytes32)'], + '0x9cb8a26a': ['selfDestruct()'], + '0x2aa3177a': ['self_store()'], + '0x514dcfe3': ['seller_accept()'], + '0x2d592a34': ['sellKissBTC(uint256)'], + '0x41524433': ['sellKissBTCWithCallback(uint256,address,uint256)'], + '0xddb5b3ac': ['SellTokens()'], + '0xe4849b32': ['sell(uint256)'], + '0x227185d6': ['Send1Get2()'], + '0xd6006e88': ['send(address[],uint256[],uint256)'], + '0x3e58c58c': ['send(address)'], + '0x35d13969': ['SendAllMoney()'], + '0x3d21aa42': ['sendApproval(address,uint256,address)'], + '0xd1e15045': ['sendBack()'], + '0x5292af1f': ['sendBalance(address)'], + '0xeb455dc6': ['sendBitcoin(string,uint256)'], + '0xb938bf42': ['sendBounty(bytes32)'], + '0x9894221a': ['SendCashForHardwareReturn()'], + '0x010731c0': ['sendCryptedHand(bytes32)'], + '0x78ec81a0': ['sendEarnings(address)'], + '0xb1d05422': ['SendEmail(string,string)'], + '0xbb6b4619': ['SendETC(address)'], + '0x3a314b24': ['SendETH(address)'], + '0x9c6034a7': ['sendIfNotForked()'], + '0x7b02b2c9': ['sendMsg(address,string)'], + '0x76d438b0': ['sendReward(uint256,uint256)'], + '0xbf8fc670': ['sendToAggregation(uint256)'], + '0x6620a935': ['sendToOwner()'], + '0x03750d94': ['serverSeed(address,bytes32)'], + '0x7eff1465': ['setAccountAllowance(address,address,uint256)'], + '0x5e03d393': ['setAccountFrozenStatus(address,bool)'], + '0xf6d339e4': ['setAddress(bytes32,string,address)'], + '0x3c84f868': ['set(int256,address,uint256)'], + '0x213b9eb8': ['setAddr(string,address)'], + '0x5d96ec65': ['setAdministrator(address,string,bool)'], + '0xf8af9e6f': ['setAdv(uint256,string,string)'], + '0x058d7433': ['setAlliesContract(address)'], + '0x7a837213': ['setAllowedAccount(address)'], + '0xf8ec4bf2': ['setAllowTransactions(bool)'], + '0x7948f523': ['setAmbiAddress(address,bytes32)'], + '0x9fa5e5d5': ['setARKowner(address)'], + '0xd0d552dd': ['setAsset(address)'], + '0x9f203255': ['setAuditor(address)'], + '0xda7fc24f': ['setBackend(address)'], + '0x754dea40': ['setBackendOwner(address)'], + '0x5c89c10d': ['setBannedCycles(uint256[])'], + '0x1c31f710': ['setBeneficiary(address)'], + '0xcf09e6e1': ['SetBigContract(address)'], + '0xc1441172': ['setBlackFlagRequest(uint256,uint256)'], + '0x2ffda1e0': ['setBlackflag(uint256,bool)'], + '0x6b5caec4': ['setBot(address)'], + '0x23e9c216': ['setBounty(address,string,uint256)'], + '0x16ce8a69': ['setBuilding(uint256,uint256)'], + '0x47448e8a': ['set(bytes32,string,bytes32)'], + '0x37881810': ['setCallbackAddress(address)'], + '0x8702735c': ['setCapitol(uint256,uint256)'], + '0x951b01c5': ['setCertifierDb(address)'], + '0xeef8e35f': ['setChainyURL(string)'], + '0xf8bd526e': ['setCoinageContract(address)'], + '0xa510f776': ['setCompany()'], + '0x4c2d71b3': ['setConfigAddress(bytes32,address)'], + '0x1e0c7ed4': ['setConfigBool(bytes32,bool)'], + '0xe8a5282d': ['setConfig(bytes32)'], + '0x810a882f': ['setConfigBytes(bytes32,bytes32)'], + '0x3e8f5b90': ['setConfig(string,uint256)'], + '0xbc45d789': ['setConfigUint(int256,bytes32,uint256)'], + '0xfd6f5430': ['setContent(string,bytes32)'], + '0x92eefe9b': ['setController(address)'], + '0x5e6ad49d': ['_setCosignerAddress(address)'], + '0x82fc49b8': ['setCosignerAddress(address)'], + '0x986dcd4d': ['setCycleLimit(uint256)'], + '0xe73a914c': ['setDAO(address)'], + '0xc52bd836': ['setDappOwner(bytes32,address)'], + '0x03959bb7': ['setDataContract(address)'], + '0x4a994eef': ['setDelegate(address,bool)'], + '0x90c3f38f': ['setDescription(string)'], + '0x172d8a30': ['setDirectorLock(uint256,uint256)'], + '0xa1b7ae62': ['setdirectorName(string)'], + '0x38eaf913': ['setDirectorNode(string)'], + '0x423e1298': ['setDoNotAutoRefundTo(bool)'], + '0x6716a692': ['setDVIP(address)'], + '0x74331be7': ['sete(address)'], + '0xb56e1bca': ['setExchangeToken()'], + '0xfe4a3ac9': ['setExecPrice(uint256)'], + '0x01cceb38': ['setExpiry(uint256)'], + '0xb35893f3': ['setExporter()'], + '0x87cc1e1c': ['setExporterBank()'], + '0xa4502cb8': ['setExportFee(address,uint256)'], + '0xe5782fd5': ['setFeeStructure(uint256,uint256,uint256)'], + '0x69fe0e2d': ['setFee(uint256)'], + '0x02aa274b': ['setForward(bytes4,address)'], + '0x69569a51': ['setFrontend(address)'], + '0x576eac66': ['setFundingGoal(uint256)'], + '0x711953ef': ['setGameAddress(address)'], + '0x2187a833': ['setGreenToken()'], + '0x78f0161a': ['setGreyGreenPrice(uint8)'], + '0xad9ec17e': ['setGreyToken()'], + '0xd148288f': ['setHoldingPeriod(uint256)'], + '0xa37fd390': ['setHomeAdv(uint256,string)'], + '0x9fb755d7': ['setHotWallet(address)'], + '0x0a3b1cd2': ['setHotwallet(address)'], + '0x1bd9c46e': ['setImporter()'], + '0xae2df7b3': ['setImporterBank()'], + '0xe2c61114': ['setImportFee(address,uint256)'], + '0xa8659216': ['setInitialLockinDays(uint256)'], + '0x26b916b4': ['Set_Interest_Rate(uint256)'], + '0x9fcbc738': ['setIntermediate(address)'], + '0x18f303a1': ['SetInternalValues(uint8,uint256)'], + '0x7f0c949c': ['setJurisdication(string)'], + '0x74f519db': ['setLastTimestamp(uint256,uint256)'], + '0x27ea6f2b': ['setLimit(uint256)'], + '0x9cb31079': ['setLowLimit(uint256)'], + '0x73ffd969': ['setMap(uint256,uint256,uint256)'], + '0x457dd8b3': ['setMasterKey(address)'], + '0x5e404de3': ['setMaximumCredit(uint256)'], + '0xee8ff562': ['setMaxProfit()'], + '0x3b91ceef': ['setMax(uint256,uint256)'], + '0x1ca60aeb': ['setMeltingContract(address)'], + '0x50944a8f': ['setMembership(address)'], + '0x91cd242d': ['setMeta(bytes32,bytes32,bytes32)'], + '0xdd93890b': ['setMeta(uint256,bytes32,bytes32)'], + '0x35930e13': ['setMinimalRewardedBalance(uint256)'], + '0xb0414a2d': ['setMinimumGasLimit(uint256)'], + '0x03251a08': ['setMin(uint256,uint256)'], + '0xb1662d58': ['setModule(address,bool)'], + '0x29de91db': ['setMsg(address,uint256)'], + '0x8aa33776': ['setMsgPrice(uint256)'], + '0x5ac801fe': ['setName(bytes32)'], + '0xfe55932a': ['setName(uint256,string)'], + '0x4b3b6168': ['SetNewBigContract(address)'], + '0xc4d9102f': ['setNextID(uint256,int256)'], + '0xfc9e53df': ['setNextRegistrar(address)'], + '0x8389f353': ['setNumCities(uint256)'], + '0x8173b813': ['setNumCities(uint256,uint256)'], + '0x755b5b75': ['setNumUnits(uint256,uint256)'], + '0x65228934': [ + 'setOperationsCallGas(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)' + ], + '0x7adbf973': ['setOracle(address)'], + '0xc7e22ac4': ['setOracleGas(uint256)'], + '0x89ed0b30': ['setOraclizeGas(uint32)'], + '0x18f3fae1': ['setOversight(address)'], + '0xd62b255b': ['setOwner(address,string)'], + '0x167d3e9c': ['SetOwner(address)'], + '0x7acbfb65': ['setOwner(uint256,uint256)'], + '0xffe302d1': ['setPlz(string)'], + '0x2e3be78d': ['setPrecisionDirect(uint8)'], + '0x3f9f5b68': ['setPreviousID(uint256,int256)'], + '0x36f7cd70': ['setPricePerStake(uint256)'], + '0x5e983d08': ['setPrices()'], + '0x05fefda7': ['setPrices(uint256,uint256)'], + '0xf7d97577': ['setPrice(uint256,uint256)'], + '0x53d97e65': ['setPrizes(uint32[])'], + '0x6e0d98fe': ['setProbabilities(uint32[])'], + '0x7137ed47': ['setProxyContract(address)'], + '0x8e25071a': ['setProxyCurrator(address)'], + '0xc24924d6': ['setQueryFee(uint256)'], + '0xe50d0473': ['SetRank(uint8,address,uint16)'], + '0x50b7b7a2': ['setRating(bytes32,uint256)'], + '0x50f07cf9': ['setReadingDelay(uint256)'], + '0x8279c7db': ['setReceiverAddress(address)'], + '0xa0a2f629': ['setReferralId(uint256,address)'], + '0xe0117441': ['setRegistrationPrice(uint256)'], + '0x718bd6dd': ['setRequestUntil(uint8)'], + '0xaf030d2c': ['setResult(uint256,uint256,bytes32)'], + '0x0381cb3b': ['setRowcol(uint256,uint256[2])'], + '0xe1a9109d': ['setSeedPrice(uint256)'], + '0x09d2d0b9': ['setServiceAccount(address,bool)'], + '0xa8026912': ['setSource(address)'], + '0x81183633': ['setStandard(bytes32)'], + '0x3e0a322d': ['setStartTime(uint256)'], + '0x49e65440': ['setSymbol(bytes32)'], + '0xb1233451': ['setTerm(uint256,string)'], + '0xb950556a': ['setThingValid(bytes32[],bool)'], + '0xce592586': ['setThresold(uint256,uint256)'], + '0xaee84f6b': ['setTime(address,uint256)'], + '0x9a9c29f6': ['settle(uint256,uint256)'], + '0xb33a8a11': ['setTokenReference(address)'], + '0x55db4092': ['setTOS(address,bool)'], + '0x506e106c': ['setToS(string)'], + '0xf7ea7a3d': ['setTotalSupply(uint256)'], + '0xa33dd801': ['setTreasuryBalance(uint256)'], + '0x4dc43eaf': ['setTreasury(uint256,uint256)'], + '0xdd57d5c5': ['setTrust(address)'], + '0xacb6c69b': ['setTrustedClient(address)'], + '0x1d7b5baf': ['setUint(int256,bytes32,string,uint256)'], + '0x2f30c6f6': ['set(uint256,address)'], + '0x468129a5': ['setUnit(uint256,uint256,uint256)'], + '0x7bc0ff20': ['setupExportFee(address,uint256)'], + '0x26881518': ['setupFee(address)'], + '0x92d8c8cf': ['setupImportFee(address,uint256)'], + '0x294f3d4d': ['setUpLimit(uint256)'], + '0xce8d054e': ['_setupNoCallback()'], + '0x12ab7242': ['setupStackDepthLib(address)'], + '0x1d124fe4': ['setUtils2(address)'], + '0x69953501': ['setUtils(address)'], + '0x4bc2a657': ['setVoter(address)'], + '0x7318b453': ['setVotetUntil(uint8)'], + '0x4173b181': ['setWeiPrice(uint256)'], + '0x0df71602': ['setWinner(uint256)'], + '0x12819817': ['setXauForGasCurrator(address)'], + '0xef4bdfdd': ['Set_your_game_number_between_1_15(string)'], + '0xb3ade772': ['shipProducts(string,string)'], + '0x83d852d9': ['shutdownTransactions()'], + '0x95d5a1be': ['SignatureReg()'], + '0x76cd7cbc': ['sign(bytes)'], + '0x5f68804e': ['SimpleLotto()'], + '0x152fb125': ['SimpleMixer()'], + '0x4ac7becf': ['SimpleSign()'], + '0xc83be888': ['single_move(uint256,uint8,uint8)'], + '0x70d084c0': ['SingularDTVCrowdfunding()'], + '0x0ab58ead': ['SingularDTVFund()'], + '0x0b590c6b': ['SingularDTVToken()'], + '0x1ff13086': ['size(int256)'], + '0x9c4baf27': ['Skywalker(address,address)'], + '0x1a88bc66': ['slot()'], + '0x853552d7': ['_slotAddNew(address)'], + '0xee564544': ['_slotCancelNew()'], + '0x16f9ce49': ['_slotCommitNew(address)'], + '0x6fe665e9': ['SlotMachine()'], + '0x22593300': ['Small(address)'], + '0x5503a659': ['smallponzi()'], + '0xe3b26a8c': ['SocialNetwork()'], + '0x5d0be9de': ['softWithdrawRevenueFor(address)'], + '0xd5dbb1ad': ['solveBet(address,uint8,bool,uint8,bytes32,bytes32)'], + '0xb2f2588b': ['sortNumbers(uint8[3])'], + '0xface030b': ['SpinTheWheel(address)'], + '0x56fa47f0': ['split(address)'], + '0x0f2c9329': ['split(address,address)'], + '0x9c709343': ['split(bool,address)'], + '0xf7654176': ['split()'], + '0xd9d2d058': ['Splitter()'], + '0x2672b3e2': ['SplitterEtcToEth()'], + '0x8946d33f': ['SplitterEthToEtc()'], + '0xb7266456': ['StandardToken()'], + '0x70983e91': ['startBoardProposal(uint256,address)'], + '0x9f35d3b2': ['start(string,string,uint256,uint256,uint256,uint256)'], + '0x0fbf7151': ['startsWith()'], + '0xa1cb31b7': ['_state()'], + '0x12253a6c': ['stopContract()'], + '0x975057e7': ['store()'], + '0xdda9939c': ['Store(address[])'], + '0x877653f0': ['_storeBalanceRecord(address)'], + '0xf60381a1': ['stra2cbor(string[])'], + '0x2fcb6628': ['_stringGas(string,string)'], + '0xfc01abbe': ['stringToBytes32(string,string)'], + '0x9077dcfd': ['submitCoding(string,uint256)'], + '0x2da8f764': ['submitVideo(string,string)'], + '0xb71c47a2': ['surrender()'], + '0xcd57a448': ['SwapContract(address,uint256)'], + '0x6b76484e': ['swap(address,address)'], + '0xd60dcb5d': ['Switch()'], + '0xb660d77c': ['switchMPO(address,address)'], + '0xd422e4e0': ['takeFee(address,uint256,string)'], + '0x4f073130': ['takeOrder(bool,uint256,uint256)'], + '0xbf55486b': ['Tanya()'], + '0xe2ee9941': ['tap(bytes20)'], + '0x420ef2b3': ['TargetHash()'], + '0x922fc84b': ['taskProcessedNoCosting(uint256)'], + '0x36e6b92e': ['taskProcessedWithCosting(uint256,uint256)'], + '0x93cc9162': ['taskRejected(uint256,uint256)'], + '0x4dc7cc55': ['terminateAlt()'], + '0x08714bfa': ['TestContract()'], + '0x1465aa97': ['testingContract()'], + '0x2af7ceff': ['testPrice(uint256)'], + '0xbab86ea8': ['test(string,string)'], + '0x4cad42d3': ['testWager()'], + '0xc96593a0': ['The10ETHPyramid()'], + '0x83d8a90f': ['theDonkeyKing()'], + '0x87fd0421': ['TheEthereumLottery()'], + '0x0e3f732a': ['TheGame()'], + '0xafbec8df': ['TheGrid()'], + '0x7399646a': ['theRun()'], + '0x83c51a38': ['thesimplegame()'], + '0x6f9a023c': ['theultimatepyramid()'], + '0x3c6e03d7': ['thewhalegame()'], + '0x18489f50': ['thingExist(bytes32[])'], + '0xe3848e5b': ['thing(string,string,string)'], + '0xda25c0cd': ['ThisExternalAssembly()'], + '0x857d4c07': ['throwScraps(uint256)'], + '0x18253234': ['ticketsAvailable()'], + '0xd7f746ce': ['tickingBomb()'], + '0x5f17114e': ['TimeDeposit()'], + '0x2f5a5c5b': ['timegame()'], + '0xcfed9199': ['timePassed(uint256)'], + '0xdd137b5d': ['toBase58(uint256,uint8)'], + '0xb05e390a': ['TokenEther(string,string)'], + '0x7ff9b596': ['tokenPrice()'], + '0x31380c89': ['TokenSale()'], + '0x4da47ba0': ['TokenSale(address,uint256)'], + '0xd5089396': ['Token(string,string,uint8,uint256)'], + '0x6c1a5b8c': ['TOKEN_TARGET()'], + '0xb29c2493': ['token(uint256,string,uint8,string)'], + '0xf2022905': ['toldYouItWouldWork()'], + '0x283a4576': ['Tomeka()'], + '0x51560da9': ['topDogInfo()'], + '0x43ec3f38': ['toSliceB32(bytes32)'], + '0xafed762b': ['toSlice(string)'], + '0x15a03930': ['TossMyCoin()'], + '0x47e46806': ['toString()'], + '0xfc7b9c18': ['totalDebt()'], + '0x1ff517ff': ['totalDebt(address)'], + '0x7fef036e': ['totalEntries()'], + '0x5216aeec': ['totalInvested()'], + '0xdc19266f': ['Total_of_Players()'], + '0x6831c169': ['totalPayedOut()'], + '0x6a8c2437': ['totalRescues()'], + '0xb524abcf': ['totalSupply(bytes32)'], + '0xbff1f9e1': ['totalUsers()'], + '0x8caaaae6': ['totalWeiPrice()'], + '0x637e86eb': ['totBOTs()'], + '0xbb39a960': ['trade(address,uint256,address,uint256)'], + '0x04bb754c': ['TradeFinancing()'], + '0x4847a79c': ['_transfer(address,uint256)'], + '0x57cfeeee': ['transfer(address,uint256,bytes32)'], + '0xdeb80111': ['transfer_asset(address,uint256)'], + '0x22e803c2': ['transferBounty()'], + '0x60063887': ['transferDebt(address,address,address,uint256)'], + '0xddd41ef6': ['transferDirector(address)'], + '0x30e0789e': ['_transfer(address,address,uint256)'], + '0x63334c58': ['transferETC(address)'], + '0xd50f6bf0': ['transferETH(address)'], + '0x97fcb54e': ['transfer_eth(address,uint256)'], + '0xa0eda9f2': ['_transferFee(address,uint256,string)'], + '0xcb712535': ['_transferFrom(address,address,uint256)'], + '0xc204f9f1': ['_transferFromToICAP(address,bytes32,uint256)'], + '0xa525f42c': ['transferFromToICAP(address,bytes32,uint256)'], + '0xcac77df7': [ + '__transferFromToICAPWithReference(address,bytes32,uint256,string)' + ], + '0x0b1e400a': [ + '_transferFromToICAPWithReference(address,bytes32,uint256,string)' + ], + '0xa48a663c': [ + 'transferFromToICAPWithReference(address,bytes32,uint256,string)' + ], + '0x48a490fb': ['transferFromTreasury(address,uint256)'], + '0xcacc24eb': ['transferFromViaProxy(address,address,address,uint256)'], + '0x31c6c4cf': [ + 'transferFromWithReference(address,address,uint256,bytes32,string)' + ], + '0x3de9e4c6': ['__transferFromWithReference(address,address,uint256,string)'], + '0xa10bee85': ['_transferFromWithReference(address,address,uint256,string)'], + '0x6461fe39': ['transferFromWithReference(address,address,uint256,string)'], + '0x752a3df6': ['transferIfHardForked(address)'], + '0xd6a619e3': ['transferIfPuritanical(address)'], + '0x29605e77': ['transferOperator(address)'], + '0x235c002d': ['transferOther(address,address,uint256)'], + '0x67af26fb': ['transferOtherFrom(address,address,address,uint256)'], + '0x1301ee02': ['transferringETC(address)'], + '0xd4245e5b': ['transferringETH(address)'], + '0xfbf58b3e': ['transfer(string,address)'], + '0xd3aa22c7': ['transferTLA(string,address)'], + '0xa25057de': ['_transferToICAP(bytes32,uint256)'], + '0x733480b7': ['transferToICAP(bytes32,uint256)'], + '0x3bf2313d': ['__transferToICAPWithReference(bytes32,uint256,string)'], + '0x078c3fa4': ['_transferToICAPWithReference(bytes32,uint256,string)'], + '0x77fe38a4': ['transferToICAPWithReference(bytes32,uint256,string)'], + '0xe7dafdb6': ['transfer_token(address,address,uint256)'], + '0x12514bba': ['transfer(uint256)'], + '0x240ecad5': ['transferViaProxy(address,address,uint256)'], + '0x6d16f79c': ['__transferWithReference(address,uint256,string)'], + '0x51b3d7b9': ['_transferWithReference(address,uint256,string)'], + '0xac35caee': ['transferWithReference(address,uint256,string)'], + '0x1d065dde': ['_transferWithReward(address,address,uint256)'], + '0xe99543aa': ['Trash(uint256)'], + '0x8fe58eb9': ['Triger()'], + '0x54204ad4': ['triple()'], + '0x432c685f': ['trustClient(address)'], + '0x464f37c9': ['trustedChildRefund()'], + '0x866f6736': ['trustedChildWithdraw()'], + '0x2e6e504a': ['trusteeWithdraw()'], + '0x65343fcb': ['TrustEth()'], + '0x5fdf05d7': ['two()'], + '0x0d0c2008': ['TwoAndAHalfPonzi()'], + '0x49cc954b': ['twoYearsPassed()'], + '0x4dd850fb': ['UfoPonzi()'], + '0xf76f950e': ['uint2str(uint256)'], + '0x9e1e6528': ['uncertify(address)'], + '0x734d8287': ['unclaimedFees()'], + '0xf0d474f9': ['underdogCount()'], + '0x6eb7b4c2': ['underdogInfo(uint256)'], + '0x75f40f40': ['underdogPayoutFund()'], + '0x2880ebe7': ['underdogPayoutMarkup()'], + '0xcb3e64fd': ['unhalt()'], + '0xff81fb91': ['unhint(int256,bytes32)'], + '0xd4859dbc': [ + 'UniversalFunctionSecure(uint8,bytes32,bytes32,bytes32,bytes32,bytes32)' + ], + '0x579badf6': [ + 'UniversalFunction(uint8,bytes32,bytes32,bytes32,bytes32,bytes32)' + ], + '0x2ec2c246': ['unregister(address)'], + '0x1a0919dc': ['unregister(bytes32)'], + '0x4e116eb8': ['unRegisterCertificationDb(address)'], + '0xf1a00a53': ['unregisterListening(address)'], + '0xf295206f': ['_unsafeSend(address,uint256)'], + '0x9447fd0a': ['until()'], + '0x63def590': ['untrustClient(address)'], + '0x6a4b6aa5': ['untrustedChildWithdraw()'], + '0x0e38901a': ['unvault(uint256)'], + '0xe0b1cccb': ['updateBalance(address,uint256)'], + '0xfd8055d2': [ + 'updateBOTBillingInfo(uint256,string,address,string,string,uint256)' + ], + '0xb4a5ef58': ['updateDefaultTimeoutPeriod(uint256)'], + '0x2ffb9e64': ['updateGasForXaurData(uint256,uint256)'], + '0x4f10acc1': ['updateGoldFeeData(uint256)'], + '0x7c582304': ['updateInvestmentTotal(address,uint256)'], + '0xf2016a4f': ['updateMinEthPerNotification(uint256)'], + '0x10f41715': ['updateMintingData(uint256,uint256)'], + '0xb3485dca': ['UpdatePrice(uint8,uint32)'], + '0x482961e1': ['updateReading(uint256,uint256)'], + '0x9dc35799': ['updateReading(uint256)'], + '0x71e11354': ['updateRegistration(string,string)'], + '0x645dce72': ['updateRelease(uint32,uint32,uint32,bytes20,bool)'], + '0x5dddea66': ['updateState(uint256,uint8,uint256)'], + '0xbc058968': ['updateThingData(bytes32[],bytes32[],uint88)'], + '0x4ca7fbd0': ['updateTokenPriceWeekTwo()'], + '0x1d4b0796': ['updateTxStats()'], + '0x5a6c787e': ['updateWithMPO()'], + '0x1aa86370': ['updateXIPFSPublicKey(string)'], + '0xac7ffae3': ['updt(uint256,string,uint256,uint256,string,string,address)'], + '0x0900f010': ['upgrade(address)'], + '0xf597a499': ['UserDatabase(uint256)'], + '0x376fe102': ['userId(address)'], + '0xe6b972f5': ['userName(address)'], + '0x7b12df39': ['userProfits()'], + '0xe28fed1e': ['userRescues(address)'], + '0x8a65d874': ['userStats(address)'], + '0xed498fa8': ['userTokens(address)'], + '0xccf1ab9b': ['usurpation()'], + '0x83f6d9a4': ['validateNameInternal(string)'], + '0xb8d4efb5': ['validate_percent(uint8)'], + '0x67fc1c6a': ['validateProposedMonarchName(string)'], + '0xd22c391a': [ + 'validateProposedThroneRules(uint256,uint256,uint256,uint256,uint256)' + ], + '0x8f7fe231': ['ValidetherOracle()'], + '0xc0a239e3': ['valuePerShare()'], + '0xcc189d00': ['Vault(address,uint256)'], + '0xe820a32f': ['vetoPayout(uint256,uint256)'], + '0x4228974c': ['Videos()'], + '0x226685ee': ['Visit()'], + '0x6bf52ffa': ['Vote()'], + '0x5f09952e': ['voteAllowTransactions(bool)'], + '0x52a554a1': ['voteBoardProposal(uint256,address,bool)'], + '0x187a62d5': ['voteEmergencyWithdrawal(bool)'], + '0x045c6ce0': ['voteForProposal(uint256)'], + '0x58ae8bcf': ['voteInMasterKey(address)'], + '0x901d7775': ['voteOutMasterKey(address)'], + '0x23637e60': ['votePrice(uint256,bool)'], + '0x76e4ca0d': ['voteQuorum(uint256,bool)'], + '0xf2561a43': ['voteSuicide(address)'], + '0x0bf75567': ['voteSuperQuorum(uint256,bool)'], + '0xb3f98adc': ['vote(uint8)'], + '0xe2cdd42a': ['vote(uint256,address,bool)'], + '0x0121b93f': ['vote(uint256)'], + '0x655388be': ['walkTowardsBlock()'], + '0x5d5483b3': ['WatchAppliedFeePercentage()'], + '0xd628e0a6': ['WatchBalance()'], + '0xe0834ea4': ['WatchBalanceInEther()'], + '0x252786e4': ['WatchBlockSizeInEther()'], + '0xcf6b3822': ['WatchCollectedFeesInSzabo()'], + '0x82381c96': ['WatchCurrentMultiplier()'], + '0x20bfec70': ['WatchFees()'], + '0xc9734ebd': ['WatchLastPayout()'], + '0x61ba3377': ['WatchLastTime()'], + '0xfb34fc6f': ['WatchNextBlockReward()'], + '0x4ef5710a': ['WatchNumberOfPlayerInCurrentRound()'], + '0x6b3a87d2': ['WatchWinningPot()'], + '0xbe0638e4': ['WealthShare()'], + '0x05459f42': ['WeeklyLotteryB(address)'], + '0x836d6d66': ['WeeklyLotteryB(address,uint256)'], + '0x856f3080': ['WhatWasMyHash(bytes32)'], + '0x06e53f47': ['whichChainIsThis()'], + '0x9b19251a': ['whitelist(address)'], + '0xd6d02c51': ['whois(string)'], + '0x609ff1bd': ['winningProposal()'], + '0x95ceb4b3': ['winningProtocal()'], + '0x5ca3400c': ['WithBeneficiary(address)'], + '0x31e3e2fe': ['WithDraw()'], + '0x07bc6fad': ['withdraw(address,uint256,bytes32,uint256)'], + '0x8d92fdf3': ['withdrawAsset(uint256)'], + '0x5f52e9fd': ['WithdrawCashForHardwareReturn(uint256)'], + '0x1dd4914b': ['withdrawEtherOrThrow(uint256)'], + '0x24600fc3': ['withdrawFunds()'], + '0xf4aa1291': ['withdrawFundsAdvanced(address,uint256,uint256)'], + '0xceeafd9d': ['withdrawFundsAdvancedRP(address,uint256,uint256)'], + '0xc7f86c37': ['withdrawFundsRP()'], + '0x6103d70b': ['withdrawPayments()'], + '0x770c6cbb': ['WithDrawPreForkChildDAO()'], + '0x4f573cb2': ['withdrawRevenue()'], + '0xf108a7d2': ['withdraw(uint256,address,string)'], + '0x5b6b431d': ['Withdraw(uint256)'], + '0x44faa139': ['Withdraw(uint32)'], + '0xe63697c8': ['withdraw(uint256,address,uint256)'], + '0xf359671c': ['withdrawWithReference(address,uint256,string)'], + '0x89790192': ['WithFee(address,uint256)'], + '0x0d87a7c0': ['WLBDrawsDB()'], + '0xd08275f1': ['WolframAlpha()'], + '0x720c4798': ['workshop()'], + '0x214c9d50': ['WritedrawStatus()'], + '0xc0a1a949': ['x15()'], + '0x7266f4a4': ['X3()'], + '0xdb7ca38a': ['XaurmProxyContract()'], + '0x4f052648': ['XaurumDataContract()'], + '0xc1be4031': ['XaurumProxyERC20()'], + '0x71f297cc': ['XaurumToken(address)'], + '0x648621ec': ['xnotify(string)'], + '0xe3ceb06d': ['YesNo(bytes32,address,string,address,uint256)'], + '0xbc8f3bcb': ['ZeroDollarHomePage()'], + '0xbd02e4f6': ['calcRandomNumberAndGetPreliminaryGameResult(uint256,uint64)'], + '0x8f4fb958': ['calculateRandomNumberByBlockhash(uint256,address)'], + '0xae47a290': ['changeMaxBet(uint256)'], + '0x06394c9b': ['changeOperator(address)'], + '0x3aa5f4f7': ['changeTokenSettings(uint16,uint256,uint256)'], + '0x9a969768': ['distributeProfits(uint256)'], + '0x0f590c36': ['emergencyFixGameResult(uint64,uint256)'], + '0x364f4896': ['emission(address,address,uint256,uint16,uint16)'], + '0x7a8df1b9': ['getAffiliateInfo(address)'], + '0x9eb9dd3b': ['getBetsProcessed()'], + '0x2fd6d40b': ['getBetValueByGamble(uint8)'], + '0x6d12301c': ['getBetValue(bytes32,uint8)'], + '0x03ee8f08': ['getCoeff(uint16)'], + '0x38f77d69': ['getDistributeProfitsInfo()'], + '0xd02528e6': ['GetGameIndexesToProcess()'], + '0xb3fb14ad': ['getGameResult()'], + '0x49041903': ['getGame(uint64)'], + '0x824d5603': ['getIndex(uint16,uint16)'], + '0xf84f420b': ['getRandomNumber(address,uint256)'], + '0x267127ec': ['getTokenSettings()'], + '0x3cf885c4': ['isBitSet(uint256,uint8)'], + '0x15cff546': ['isOperationBlocked()'], + '0x257bcd6a': ['placeBet(uint256,bytes32,bytes32)'], + '0xfe73e3ec': ['preliminaryGameResult(uint64)'], + '0x89abeb19': ['ProcessGameExt(uint256)'], + '0x665bcc32': ['ProcessGames(uint256[],bool)'], + '0xa24d23eb': ['ProcessGame(uint256,uint256)'], + '0xaa677354': ['register(address,address)'], + '0xeb5904c0': ['setProfitDistributionContract(address)'], + '0x53c84526': ['setSmartAffiliateContract(address)'], + '0xf0caea2b': ['SmartRoulette()'], + '0xb599afc8': ['totalBetCount()'], + '0x4ce01d86': ['totalBetValue()'], + '0x2c4e591b': ['totalGames()'], + '0x37bdc99b': ['release(uint256)'], + '0x25fda176': ['notify(address,uint256)'], + '0x545e7c61': ['deploy(address,address)'], + '0xd3017193': ['addUser(address,uint256)'], + '0x2d580ef6': ['add(address,bytes32)'], + '0x79716e43': ['confirmTransaction(bytes32)'], + '0xca1d209d': ['fund(uint256)'], + '0x8b147245': ['update(bytes32)'], + '0x329ce29e': ['buyTile(uint256)'], + '0xa3908e1b': ['convert(uint256)'], + '0xdef2489b': ['convert(address)'], + '0x1e9a6950': ['redeem(address,uint256)'], + '0x74a93e6c': ['setTokenHolder(address,address)'], + '0xac940823': ['betOnLowHigh(bool)'], + '0x5521d17b': ['betOnColor(bool)'], + '0x338cdca1': ['request()'], + '0x59c87d70': ['request(bytes32)'], + '0x2bffc7ed': ['add(string,address)'], + '0x58d9fa04': ['addUser(uint256,address)'], + '0x64371977': ['set(uint256,string)'], + '0xf09ea2a6': ['offer(uint256,address,uint256,address)'], + '0x77fcb91d': ['forward(address,bool)'], + '0x53d9d910': ['create(address[],uint256,uint256)'], + '0xa8d95fb2': ['claim(address,string)'], + '0x591c515f': ['append(string,string)'], + '0xa7abc124': ['activate(bool,bool)'], + '0xc7f2e6af': ['Contribute(bytes20)'], + '0xebf6e91d': ['hit(uint256)'], + '0x7183616c': ['notarize(string)'], + '0x3da5c3ce': ['puzzle(address,bytes32)'], + '0x4b59e880': ['puzzle(address,bytes32,bytes32)'], + '0xae0a6b28': ['signature(string,bytes32)'], + '0x96b76c23': ['stand(uint256)'], + '0x6ea056a9': ['sweep(address,uint256)'], + '0x4637d827': ['trust(address)'], + '0x3af39c21': ['undefined()'], + '0x776d1a01': ['unvest(uint256,uint256,uint256,uint256,uint256,bool)'], + '0xb6608467': ['updateShares(uint256)'], + '0xf04da65b': ['getShares(address)'], + '0x90fa337d': ['storeBlockWithFeeAndRecipient(bytes,int256,int256)'], + '0x59d1d43c': ['text(bytes32,string)'], + '0x10f13a8c': ['setText(bytes32,string,string)'], + '0xa21174bb': ['DefaultReverseResolver(address)'], + '0x4e543b26': ['setResolver(address)'], + '0x0f5a5466': ['claimWithResolver(address,address)'], + '0xc0ee0b8a': ['tokenFallback(address,uint256,bytes)'], + '0x5a6b26ba': ['withdrawal(address,uint256)'], + '0x690e7c09': ['open(uint256)'], + '0x09fd018e': ['setClaimer(uint256,address,uint256)'], + '0x596c8976': ['close(uint256,uint256)'], + '0xdd0d74ff': ['IssueBank(address)'], + '0x228cb733': ['reward()'], + '0x99b721a5': ['rewardEthAnd(address[])'], + '0xeacccaf0': ['setReward(address,uint256)'], + '0x85eddeea': ['setReward(address[],uint256[])'], + '0xeb4dd8f2': ['confirm(address)'], + '0x342b7e71': ['setTokenList(address[])'], + '0xbd5dec98': ['withdraw(address[])'], + '0x640a4d0c': ['_deposited(address,address,uint256)'], + '0xc0b4fa6d': ['_reward(address[])'], + '0x18573bf9': ['calculeReward(uint256,uint256)'], + '0x73053f70': ['tokenDeposit(address)'], + '0x58e2cd76': ['watch(address)'], + '0xd9caed12': ['withdraw(address,address,uint256)'], + '0xb4427263': ['createTokens()'], + '0x01a7a8c0': ['batFundDeposit()'], + '0x229a4978': ['batFund()'], + '0x4172d080': ['tokenExchangeRate()'], + '0x6f7920fd': ['tokenCreationCap()'], + '0x8d4e4083': ['isFinalized()'], + '0x91b43d13': ['fundingEndBlock()'], + '0xa81c3bdf': ['ethFundDeposit()'], + '0xc039daf6': ['tokenCreationMin()'], + '0xd648a647': ['fundingStartBlock()'], + '0x3a1a635e': ['createNewRevision(bytes20,bytes32)'], + '0x7b760537': ['updateLatestRevision(bytes20,bytes32)'], + '0xa4b8c2e7': ['restart(bytes20,bytes32)'], + '0x22fa85ca': ['testFailRegisterContractAgain()'], + '0xcb56d626': ['testFailBlobStoreNotRegistered()'], + '0x6ec99dd0': ['testGetBlobStore()'], + '0x7604b6d7': ['testGetBlobStoreFromFullBlobId()'], + '0xc28bfe5a': ['testFailCreateSameIpfsHashAndNonce()'], + '0xded04fe9': ['testFailCreateNewRevisionNotOwner()'], + '0x9a93e940': ['testFailCreateNewRevisionNotUpdatable()'], + '0x960d8cd3': ['testFailUpdateLatestRevisionNotOwner()'], + '0x3ce1f4e7': ['testFailUpdateLatestRevisionNotUpdatable()'], + '0xf99ebb71': ['testFailUpdateLatestRevisionEnforceRevisions()'], + '0x251fa3b1': ['testFailRetractLatestRevisionNotOwner()'], + '0xb2ab530e': ['testFailRetractLatestRevisionNotUpdatable()'], + '0xc57a99e5': ['testFailRetractLatestRevisionEnforceRevisions()'], + '0xc204505a': [ + 'testFailRetractLatestRevisionDoesntHaveAdditionalRevisions()' + ], + '0x617f8666': ['testFailRestartNotOwner()'], + '0xd2c5c368': ['testFailRestartNotUpdatable()'], + '0xcf984f16': ['testFailRestartEnforceRevisions()'], + '0x3cc0fb45': ['testFailRetractNotOwner()'], + '0xa9888148': ['testFailRetractNotRetractable()'], + '0x71e60fe6': ['testFailTransferEnableNotTransferable()'], + '0x9acade7e': ['testFailTransferDisableNotEnabled()'], + '0xe2b8766c': ['testFailTransferNotTransferable()'], + '0x615f9f1f': ['testFailTransferNotEnabled()'], + '0x19ea61db': ['testFailTransferDisabled()'], + '0x776df027': ['testFailDisownNotOwner()'], + '0xeddce76b': ['testFailDisownNotTransferable()'], + '0x32d8eee5': ['testFailSetNotUpdatableNotOwner()'], + '0x6fe5b536': ['testFailSetEnforceRevisionsNotOwner()'], + '0xf2c2dff2': ['testFailSetNotRetractableNotOwner()'], + '0x5cc501ce': ['testFailSetNotTransferableNotOwner()'], + '0xf38e5ca2': ['getBlobStoreFromFullBlobId(bytes32)'], + '0x01e3d346': ['create(bytes1,bytes32,uint256)'], + '0x147a5640': ['_getAllRevisionIpfsHashes(bytes20)'], + '0x64d12ec6': ['getRevisionIpfsHash(bytes20,uint256)'], + '0x540c97c8': ['getAllRevisionIpfsHashes(bytes20)'], + '0xb7c38d02': ['testControlCreateSameIpfsHashAndNonce()'], + '0x6e1479c0': ['testControlCreateNewRevisionNotOwner()'], + '0xe73b7d77': ['testControlCreateNewRevisionNotUpdatable()'], + '0x8cdcdae1': ['testControlUpdateLatestRevisionNotOwner()'], + '0x69c5c229': ['testControlUpdateLatestRevisionNotUpdatable()'], + '0x80e74b04': ['testControlUpdateLatestRevisionEnforceRevisions()'], + '0x86602b6b': ['testControlRetractLatestRevisionNotOwner()'], + '0xc7a3778f': ['testControlRetractLatestRevisionNotUpdatable()'], + '0x6c712471': ['testControlRetractLatestRevisionEnforceRevisions()'], + '0x610285d2': [ + 'testControlRetractLatestRevisionDoesntHaveAdditionalRevisions()' + ], + '0xebc697d1': ['testControlRestartNotOwner()'], + '0x2d985cfb': ['testControlRestartNotUpdatable()'], + '0xcebb8bb0': ['testControlRestartEnforceRevisions()'], + '0xe37e60d1': ['testControlRetractNotOwner()'], + '0xcefdfcf3': ['testControlRetractNotRetractable()'], + '0x490825a9': ['testControlTransferEnableNotTransferable()'], + '0x20d615c2': ['testControlTransferDisableNotEnabled()'], + '0xe18c52ae': ['testControlTransferNotTransferable()'], + '0xe71d7bf0': ['testControlTransferNotEnabled()'], + '0x32bf775d': ['testControlTransferDisabled()'], + '0xb47784d9': ['testControlDisownNotOwner()'], + '0x98a29a58': ['testControlDisownNotTransferable()'], + '0x50a9eddb': ['testControlSetNotUpdatableNotOwner()'], + '0x0ec3b247': ['testControlSetEnforceRevisionsNotOwner()'], + '0xc3689f01': ['testControlSetNotRetractableNotOwner()'], + '0x9bf68006': ['testControlSetNotTransferableNotOwner()'], + '0x0ab03e1b': ['testControlRegisterContractAgain()'], + '0x895224db': ['testControlBlobStoreNotRegistered()'], + '0x81accd0b': ['create(bytes1,bytes32,bytes32)'], + '0x6013aa44': ['testControlCreateSameNonce()'], + '0x94106200': ['testFailCreateSameNonce()'], + '0x396ed0ab': ['Burn()'], + '0xd89135cd': ['totalBurned()'], + '0xf24e4a15': ['Purge()'], + '0x1caba41f': ['decimalUnits()'], + '0xc0463711': ['lastUpdate()'], + '0xe5a6b10f': ['currency()'], + '0x1820b575': ['Team(uint256,address,uint256)'], + '0x8a78f5e2': ['changeMember(address,bool,bool,uint256)'], + '0x30b0faab': ['changeSettings(uint256,address,uint256)'], + '0x03048a42': ['createRequest(address,uint256,string,bytes,bytes)'], + '0x17fb6c6e': ['approveRequest(uint256,bool,string)'], + '0x03ef2a2c': ['tryExecuteProposal(uint256,bytes)'], + '0x4ff6aa46': ['deactivateTeam()'], + '0x3f2885cb': ['publish(string,string,address,bytes32)'], + '0x50692d9a': ['toContentID(address,string,string,address,bytes32)'], + '0x7115c988': ['Batch(address)'], + '0x64eb7327': ['_getContent(bytes32)'], + '0x7ff0346b': ['getContents(bytes32[])'], + '0x2625e2e1': ['post(address,address,bytes32)'], + '0x534878fb': ['reply(address,address,bytes32,bytes32)'], + '0x7f602231': ['tip(bytes32,address,uint256)'], + '0x816e24b0': ['setupDeposits()'], + '0x68e7bdba': ['disableApi(address)'], + '0xbd322b77': ['enableApi(address)'], + '0x5cc15001': ['getContent(bytes32)'], + '0x9a01b4d5': ['getChannel(address)'], + '0xfbcbc0f1': ['getAccount(address)'], + '0xae9a0785': ['getChannelPostCount(address)'], + '0x5a17aa41': ['getContentTip(bytes32,address)'], + '0xd83a7f67': ['getDepositAddress(address)'], + '0xc489744b': ['getTokenBalance(address,address)'], + '0xe5c46944': ['MultiSigWallet(address[],uint256)'], + '0xe20056e6': ['replaceOwner(address,address)'], + '0xc6427474': ['submitTransaction(address,uint256,bytes)'], + '0x20ea8d86': ['revokeConfirmation(uint256)'], + '0xee22610b': ['executeTransaction(uint256)'], + '0x784547a7': ['isConfirmed(uint256)'], + '0xec096f8d': ['addTransaction(address,uint256,bytes)'], + '0x8b51d13f': ['getConfirmationCount(uint256)'], + '0x54741525': ['getTransactionCount(bool,bool)'], + '0xb5dc40c3': ['getConfirmations(uint256)'], + '0xa8abe69a': ['getTransactionIds(uint256,uint256,bool,bool)'], + '0x1914427f': ['MultiSigWalletWithDailyLimit(address[],uint256,uint256)'], + '0xcea08621': ['changeDailyLimit(uint256)'], + '0x811de206': ['isConfirmedByOwners(uint256)'], + '0x11c91914': ['isUnderLimit(uint256)'], + '0x4bc9fdc2': ['calcMaxWithdraw()'], + '0xae1a0b0c': ['launchLength()'], + '0x0a40f15f': ['fundDeal(string,address)'], + '0x1504ce95': ['payout(string)'], + '0x2de90801': ['hashtagToken()'], + '0x2e788443': ['resolve(string,address,uint256)'], + '0x5e717e2d': ['readDeal(string,address)'], + '0xac56c52b': ['makeDealForTwo(string,uint256)'], + '0xcdcf0c4a': ['dispute(string,address)'], + '0xf089b7dd': ['hashtag()'], + '0xf3227dc4': ['cancelDeal(string)'], + '0x3cebb823': ['changeController(address)'], + '0xf77c4791': ['controller()'], + '0x085d4883': ['provider()'], + '0x0e429ecc': ['providerValue()'], + '0x117de2fd': ['payout(address,uint256)'], + '0x200d2ed2': ['status()'], + '0x2e49d78b': ['setStatus(uint8)'], + '0x30cfac6c': ['assignTo(uint256,address,uint256)'], + '0xf3ab7ea9': ['seeker()'], + '0xfef1dc7d': ['seekerValue()'], + '0x0e4355d4': ['validFactories(address)'], + '0x10fe9ae8': ['getTokenAddress()'], + '0x29ce1ec5': ['addFactory(address)'], + '0x355e6b43': ['setCommission(uint256)'], + '0x4b37c73f': ['removeFactory(address)'], + '0x6985e46e': ['getConflictResolver()'], + '0x7f301b83': ['setMetadataHash(string)'], + '0x24664106': ['mintRep(int256,address,uint256)'], + '0xa4a75edc': ['registerDeal(address,address)'], + '0xaaf73ef7': ['registeredDeals()'], + '0xc5a1d7f0': ['metadataHash()'], + '0xcffee328': ['successfulDeals()'], + '0xe1489191': ['commission()'], + '0xf34f43f6': ['getRepTokenAddress()'], + '0xf6b44d03': ['validFactories()'], + '0x2dc2dbf2': ['makeSimpleDeal(address,address,uint256,bytes32)'], + '0x12424e3f': ['approve()'], + '0xb85477c5': ['dealStatus()'], + '0xe344606b': ['hashtagCommission()'], + '0x4a393149': ['onTransfer(address,address,uint256)'], + '0xda682aeb': ['onApprove(address,address,uint256)'], + '0xf48c3054': ['proxyPayment(address)'], + '0x55a373d6': ['tokenContract()'], + '0xc0112678': ['arcToken()'], + '0x921b2d64': ['mintTokens(int256,address,uint256)'], + '0x3290ce29': ['purchaseTokens()'], + '0x38cde380': ['changeWeight(uint256)'], + '0x4f995d08': ['getPeople()'], + '0x74607d91': ['patient(uint256)'], + '0x7b464e93': ['prescriptions(bytes32)'], + '0x86590955': ['changeHeight(uint256)'], + '0xd72dec33': ['changeVaccinHistory(address)'], + '0xdc3d4203': [ + 'createPatient(bytes32,bytes32,uint256,uint256,uint256,bytes32,uint256)' + ], + '0xe571fd2d': ['addPrescription(uint256,string)'], + '0xfbbf93a0': ['getDetails()'], + '0x077dadb2': ['coinBalanceMultisig(address)'], + '0x249b4d4f': ['transferContractUser(address)'], + '0x388f3cd3': ['cashin(address,uint256)'], + '0x527f4ff1': ['setTransferAddressUser(address,address)'], + '0x6ba2aefc': ['transferMultisig(address,address,uint256)'], + '0x9d16aca6': ['changeExchangeContract(address)'], + '0xd126dac4': ['cashout(address,address,uint256)'], + '0xf1679095': ['getTransferAddressUser(address)'], + '0x0bf77989': ['debug_coinbaseTxSha(bytes,uint256)'], + '0x107b1f8c': [ + 'debug_verifyShare(bytes,uint256[],uint256[],bytes,uint256,uint256)' + ], + '0x14ca5398': [ + 'submitFullBlock(bytes,uint256[],uint256[],bytes,bytes,bytes,bytes,bytes,bytes,uint256)' + ], + '0x2850c72a': ['debug_extendCoinbaseTxOutput(uint256,uint256)'], + '0x3e2ee39e': ['debug_resetuser()'], + '0x43c33ac9': ['submitShares(uint256,uint256)'], + '0x579d5fba': ['debug_hash3Int(uint256)'], + '0x83cd5e13': ['debug_multiplehash(uint256,uint256)'], + '0x88702cc4': ['debug_hash256Double(bytes)'], + '0x88f6d5a4': ['constructCoinbaseTx(uint256,uint256)'], + '0x9559225c': ['debug_hash3Byte(bytes)'], + '0x99d1d002': ['debug_blockHeaderMerkle(bytes)'], + '0xa68393a2': ['debug_getCoinbaseTxOutputLen(uint256)'], + '0xad076bfc': ['debug_hash256Double_concat(bytes,bytes,bytes)'], + '0xb2b0aefb': [ + 'verifyPendingShares(uint256[],uint256[],uint256,uint256[],uint256[],bytes,bytes,uint256)' + ], + '0xed47ca94': [ + 'debug_verifySharesTreeSubmission(uint256[],uint256[],uint256,uint256,uint256,uint256)' + ], + '0xf16fa954': ['debug_resizeRealPrefix(uint256,uint256)'], + '0x6104464f': ['previousPublishedVersion()'], + '0x6737c877': ['setAttributes(bytes)'], + '0x884179d8': ['ipfsAttributeLookup(address)'], + '0x9352fad2': ['run(string)'], + '0x98e7ea43': ['reward(uint32[],address[])'], + '0x0456860a': ['acceptAtCommunity(address,uint256)'], + '0x0a90c704': [ + 'createCommunity(string,string,string,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256)' + ], + '0x197f3c29': ['notLike(address)'], + '0x1b7db340': ['sysAdmin()'], + '0x2925ffc2': ['modifyCommunityTaxes(uint256,uint256,uint256,uint256)'], + '0x33b85b73': [ + 'modifyCommunityRates(uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256)' + ], + '0x3500a48d': ['transferCommunityCommune(uint256,address)'], + '0x36b33415': ['modifyMemberInfo(string,string,string,string)'], + '0x47c66140': ['getProposalVotes(uint256)'], + '0x519a078f': ['getCommunitybyIndex(uint256)'], + '0x526b91d1': ['transferSysAdmin(address)'], + '0x52ea5667': ['getMPbyIndex(uint256)'], + '0x67a09c23': ['payment(address,uint256)'], + '0x71efeff1': ['transferCommunityBank(uint256,address)'], + '0x721a1f57': ['endorseCredit(address,uint256,uint256)'], + '0x84e10a90': ['getTotals()'], + '0x8b343e8f': ['getMemberCredit(address)'], + '0x9431e412': ['getCommunityRates(uint256)'], + '0xa5496e60': ['newProposal(uint256,string,string,uint256,uint256)'], + '0xad71c687': ['registerSystem(string,string,string,string)'], + '0xb122a0ef': ['joinCommunity(uint256)'], + '0xbcabb54c': ['modifyCommunityInfo(uint256,string,string,string,string)'], + '0xbfb04c60': ['proposeAcceptanceAsMember(uint256)'], + '0xd21cbffc': ['getIfVoted(uint256,address)'], + '0xd95ab72d': ['getMemberWallet(address)'], + '0xdde8535f': ['getMemberStatus(address)'], + '0xe05e3028': ['getCommunityManagement(uint256)'], + '0xe465c465': ['like(address)'], + '0xee650248': ['vote(uint256,int8)'], + '0xf47efbca': ['getMemberLinks(address)'], + '0xf6df26d2': ['kickOutCommunity(address,uint256)'], + '0xf82c2301': ['resignFromCommunity()'], + '0xfba6651c': ['getCommunityTaxes(uint256)'], + '0xfcc101ba': ['getCommunityDescription(uint256)'], + '0x04029f23': ['_setBugFixVersion(string,uint32,bytes32,uint32)'], + '0x1f9ea25d': ['_setDepositAccount(address)'], + '0x49593f53': ['submit(string,uint64,uint32,uint32,bytes32)'], + '0x569aa0d8': ['getPlayerSubmissionFromCompetition(string,uint8,address)'], + '0x59a4669f': ['increaseJackpot(string)'], + '0x656104f5': ['_setOrganiser(address)'], + '0x70de8c6e': ['start(string,uint64,uint8,uint32)'], + '0x71bde852': [ + '_startNextCompetition(string,uint32,uint88,uint8,uint8,uint16,uint64,uint32,bytes32,uint32[])' + ], + '0x8d909ad9': ['getSeedAndState(string,address)'], + '0x8f30435d': ['getCompetitionValues(string,uint8)'], + '0x916dbc17': ['getPlayersFromCompetition(string,uint8)'], + '0xc91540f6': ['getCurrentCompetitionValues(string)'], + '0xfedc2a28': ['_rewardWinners(string,uint8,address[])'], + '0x224ccc49': ['chainLastMessageHash(bytes32)'], + '0x482f63b0': ['postMessage(bytes32,bytes)'], + '0x590a4595': ['createNewChain(bytes)'], + '0x858c7559': ['chainIDSeed()'], + '0x52c98e33': ['checkClaim(address,uint256,uint256)'], + '0x598aa1fc': ['checkEndorsement(address,uint256,address)'], + '0xa16c6a73': ['setClaim(uint256,uint256)'], + '0xa1bdd146': ['setEndorsement(address,uint256,uint256)'], + '0xa3a48785': ['unsetClaim(uint256)'], + '0xd7789a9f': ['unsetEndorsement(address,uint256)'], + '0xa9d0ddc7': ['addContractWithInfo(string,string)'], + '0xfa3559f7': ['attestToContract(uint256,bool,string)'], + '0x179fc99f': ['etherBalanceOf(address)'], + '0x3b0c197e': ['getBook()'], + '0x42da3b6b': ['getAmount(uint256,address)'], + '0x6dee2032': ['getOpenOrdersOf(address)'], + '0x836e4158': ['numOrdersOf(address)'], + '0x8ab1a5d4': ['sell(uint256,uint256,bool)'], + '0x8b7afe2e': ['contractBalance()'], + '0x8c3f914a': ['spread(bool)'], + '0x8f70ccf7': ['setTrading(bool)'], + '0x975289fd': ['getPriceVolume(uint256)'], + '0xc3434883': ['buy(uint256,uint256,bool)'], + '0xd07866d2': ['sizeOf(uint256)'], + '0xe1725c92': ['decimalPlaces()'], + '0xe2dede94': ['getNode(uint256,uint256)'], + '0xec44acf2': ['trading()'], + '0x11456b47': ['addName(string)'], + '0x14bfd6d0': ['admins(uint256)'], + '0x4deb68a3': ['auctionStart(bytes32,uint256,uint256)'], + '0x663e90d9': ['setBuyNowListing(bytes32,uint256,bool)'], + '0x71c79588': ['releaseName(bytes32)'], + '0x7c72e273': ['auctionFinalize(bytes32)'], + '0x9bdd7cdb': ['forceRelease(bytes32)'], + '0xbfcf63b0': ['claimEther(address,uint256)'], + '0xc415b95c': ['feeCollector()'], + '0xd7ad4931': ['buyNow(bytes32)'], + '0xe2acf75d': ['auctionCancel(bytes32)'], + '0xf747a5eb': ['auctionBid(bytes32)'], + '0x13831693': ['getLevitatingUnicorns(bytes32,uint64)'], + '0x50fe533b': ['getLevitatingBirds(bytes32,uint64)'], + '0xc9aa71b8': ['getFlyingUnicorns(bytes32,uint64)'], + '0xfeb50430': ['getLevitatingKittens(bytes32,uint64)'], + '0x78c2c849': ['burnUnicorns()'], + '0xbd8b452e': ['eatUnicorns()'], + '0x4b06fb28': ['eatUnicornsAlive()'], + '0x5b303e16': ['eatUnicorns(uint256)'], + '0xa1e95792': ['eatUnicornsAlive(uint256)'], + '0x10867877': ['eatUnicornWithoutCorn()'], + '0x4b269a00': ['withdraw(int256[])'], + '0x2c7cce9e': ['auctionMinPriceIncrease()'], + '0x801c334e': ['auctionIncreaseBid(bytes32)'], + '0x95e911a8': ['feeBase()'], + '0xb4628c8a': ['ENSRegistrar()'], + '0xddca3f43': ['fee()'], + '0xe765cb44': ['auctionMinPrice()'], + '0x69f30401': ['bid(address,uint256[],uint256[])'], + '0x6e67b803': ['bid3(address,uint256[],uint256[])'], + '0x21462191': ['bid3(address,uint8[],uint8[])'], + '0x92584d80': ['finalize(bytes32)'], + '0xf3bf93a0': ['forceReleaseAdmin(bytes32)'], + '0x5b372532': ['press()'], + '0x9f095e88': ['asdf()'], + '0xb0459d49': [ + 'LoanStandard(address,address,uint256,uint256,uint256,uint256,uint256)' + ], + '0xa2fb342d': ['lend(address,uint256)'], + '0xd334d75b': ['expireLoan()'], + '0xb7019744': ['payBack(address,uint256)'], + '0x60aeac18': ['neverPayBack()'], + '0xaad3ec96': ['claim(address,uint256)'], + '0x4c123019': ['tokenFallback(address,address,uint256,bytes)'], + '0xcb7acdd9': ['hola()'], + '0xacb6e9b1': ['testControlItemStoreNotRegistered()'], + '0xac767539': ['testFailItemStoreNotRegistered()'], + '0x1649cdcd': ['testGetItemStore()'], + '0xe41cc093': ['getItemStore(bytes12)'], + '0x79ba5097': ['acceptOwnership()'], + '0x58e9b208': ['Controlled()'], + '0x30311898': ['Account(address)'], + '0xce3f865f': ['collect(uint256)'], + '0x55ee6afb': ['Wallet(address,address)'], + '0x2268a358': ['changeMultisig(address)'], + '0xea2c23da': ['createAccounts(uint256)'], + '0xa5e8c5d6': ['setVoteRight(address,uint256)'], + '0x9cc0c5e3': ['experty_io()'], + '0x5022e940': ['experty()'], + '0xb7090bb5': ['www_experty_io()'], + '0x0edfb0f7': ['withdrawCollectedInterest()'], + '0x21856b36': ['interestOwed()'], + '0x402d8883': ['repay()'], + '0x4665096d': ['expiration()'], + '0x58f33e98': ['isTaker(address)'], + '0x5eda5b9a': ['interestCollected()'], + '0x6cbdb7d0': ['takers(uint256)'], + '0x7c3a00fd': ['interestRate()'], + '0xaa8116be': ['fundedPrincipal()'], + '0xbc99c8be': ['takerAddressAt(uint256)'], + '0xc41f4cc0': ['takerStatus(address)'], + '0xc537a210': ['principalOutstanding()'], + '0xc5ebeaec': ['borrow(uint256)'], + '0xcb6da9da': ['takerCount()'], + '0xfb775b46': ['giver()'], + '0xe1a27ad3': ['needsAdministration()'], + '0xb6253539': ['needsInitialization()'], + '0xb6f98e53': ['needsAllowancePayment()'], + '0xb5931f7c': ['safeDiv(uint256,uint256)'], + '0x3a4faf7f': ['max64(uint64,uint64)'], + '0x36b1315c': ['min64(uint64,uint64)'], + '0x0c255c94': ['max256(uint256,uint256)'], + '0xb1e9292f': ['min256(uint256,uint256)'], + '0x1d3b9edf': ['times(uint256,uint256)'], + '0xf4f3bdc1': ['minus(uint256,uint256)'], + '0x66098d4f': ['plus(uint256,uint256)'], + '0x8afc3605': ['Ownable()'], + '0x04bbc255': ['isPricingStrategy()'], + '0x8e768288': ['isSane(address)'], + '0x18a4155e': ['calculatePrice(uint256,uint256,uint256,address,uint256)'], + '0x614cb904': ['isFinalizeAgent()'], + '0x82771c8e': ['isSane()'], + '0x0bf318a3': ['finalizeCrowdsale()'], + '0x96f47800': ['investInternal(address,uint128)'], + '0x32013ac3': ['preallocate(address,uint256,uint256)'], + '0x1a49803b': [ + 'investWithSignedAddress(address,uint128,uint8,bytes32,bytes32)' + ], + '0xef869443': ['investWithCustomerId(address,uint128)'], + '0x03f9c793': ['invest(address)'], + '0xf4869726': ['buyWithSignedAddress(uint128,uint8,bytes32,bytes32)'], + '0x99e9376c': ['buyWithCustomerId(uint128)'], + '0x7f7d711e': ['setRequireCustomerId(bool)'], + '0xed68ff2c': ['setRequireSignedAddress(bool,address)'], + '0xeac24932': ['setEarlyParicipantWhitelist(address,bool)'], + '0x6e50eb3f': ['setEndsAt(uint256)'], + '0xf3283fba': ['setMultisig(address)'], + '0x87612102': ['loadRefund()'], + '0x7c2e08a3': ['isMinimumGoalReached()'], + '0xa7ba44c3': ['isFinalizerSane()'], + '0x062b01ce': ['isPricingSane()'], + '0x1865c57d': ['getState()'], + '0x8d51faec': ['setOwnerTestValue(uint256)'], + '0x4551dd59': ['isCrowdsale()'], + '0x9d3c663f': ['isBreakingCap(uint256,uint256,uint256,uint256)'], + '0xd5d09021': ['isCrowdsaleFull()'], + '0x4d7edc15': ['assignTokens(address,uint256)'], + '0xeefa597b': ['isToken()'], + '0x09ae9452': ['PreICOProxyBuyer(address,uint256,uint256,uint256,uint256)'], + '0x21df0da7': ['getToken()'], + '0xbaeb91ae': ['invest(uint128)'], + '0x1fb00cdc': ['investWithId(uint128)'], + '0xdbb833df': ['investWithoutId()'], + '0xd4607048': ['buyForEverybody()'], + '0xdde070e8': ['getClaimAmount(address)'], + '0x3c67b6b7': ['getClaimLeft(address)'], + '0xd1058e59': ['claimAll()'], + '0x4042b66f': ['weiRaised()'], + '0xf6368f8a': ['transfer(address,uint256,bytes,string)'], + '0x3ef13367': ['flushTokens(address)'], + '0x083c6323': ['endBlock()'], + '0x7055060f': ['bulkStoreHeader(bytes)'], + '0x3115b4c4': ['bulkStoreHeader(bytes,uint256)'], + '0x01725a0b': ['demo()'], + '0xdce5c757': ['cool()'], + '0x939a79ac': ['demo(string)'], + '0x071bd079': ['demo(uint256)'], + '0x43b1c529': ['getSig(string,bytes4)'], + '0x1d03842f': ['onePlus(uint256)'], + '0x42966c68': ['burn(uint256)'], + '0x457f4d41': ['hammer()'], + '0x58292a3d': ['emission(uint256)'], + '0xd31fdffd': ['setHammer(address)'], + '0xb8c48f8c': ['setInitialParent(int256,int256,int256)'], + '0x08f75d17': ['move_reveal(bytes32,uint8)'], + '0x2e9c91a8': ['getStartParams(bytes32)'], + '0x497777d5': ['collect(bytes32)'], + '0x5598c576': ['reveal_move(bytes32,uint8,bytes32,bytes32)'], + '0x5cf34bcf': ['getMinFee()'], + '0x6a7bf76a': [ + 'create_game(bytes32,uint32,uint32,uint8,uint16,uint8,address,uint256,bool)' + ], + '0x73931bbf': ['getGame(bytes32)'], + '0x87287fd7': ['setMinFee(uint8)'], + '0x89d61d77': ['setOrganizer(address)'], + '0xa361b184': ['move(bytes32,bytes32)'], + '0xe4083daf': [ + 'create_game_invite(bytes32,address,uint32,uint32,uint8,uint16,uint8,address,uint256)' + ], + '0xf223446c': [ + 'start_game(bytes32,uint8,uint32,uint16,address,uint256,uint8)' + ], + '0x3a4de190': ['repost(bytes32)'], + '0x4b91ab35': ['unfollow(bytes32)'], + '0x66e34dc6': ['registerUsername(bytes32)'], + '0x699f200f': ['addresses(bytes32)'], + '0x7e93163b': ['tip(bytes32,bytes32)'], + '0x8ee93cf3': ['post(string)'], + '0x9d7eb375': ['updateUserDetails(string)'], + '0xa66b7748': ['follow(bytes32)'], + '0xa83b1e21': ['reply(string,bytes32)'], + '0xd38d0f28': ['updateSplit(uint256)'], + '0xee91877c': ['usernames(address)'], + '0xf59823cf': ['Congress(uint256,uint256,int256)'], + '0xb3bb9b58': ['LiquidDemocracy(address,string,uint256)'], + '0x6dd7d8ea': ['vote(address)'], + '0xc0d061f4': ['execute(address,uint256,bytes32)'], + '0xf2ba18ed': ['calculateVotes()'], + '0xb154224e': ['TimeLockMultisig(address,address[],uint256)'], + '0x15bef9cd': ['changeMembers(address[],bool)'], + '0xc01f9e37': ['proposalDeadline(uint256)'], + '0x159887d1': ['calculateFactor(uint256,uint256)'], + '0x7207c19f': ['MyToken(uint256)'], + '0x73e9f3e6': ['Crowdsale(address,uint256,uint256,uint256,address,address)'], + '0xfd6b7ef8': ['safeWithdrawal()'], + '0x9dbf0087': ['TokenERC20(uint256,string,string)'], + '0x79cc6790': ['burnFrom(address,uint256)'], + '0x7e4f6b95': ['MyAdvancedToken(uint256,string,string)'], + '0xbc0c868c': ['stocksOf(uint256)'], + '0x8262fc7d': ['addrBalance(address)'], + '0x6dfe869b': ['Preallocation(address,uint256)'], + '0xa357880d': ['whitelistedAddrs(address)'], + '0x54da5393': ['Utils()'], + '0xe4edf852': ['transferManagement(address)'], + '0xc8c2fe6c': ['acceptManagement()'], + '0x67cc4882': ['TokenHolder()'], + '0x21e6b53d': ['transferTokenOwnership(address)'], + '0x38a5e016': ['acceptTokenOwnership()'], + '0x85d5e631': ['disableTokenTransfers(bool)'], + '0x205c2878': ['withdrawTo(address,uint256)'], + '0x1608f18f': ['disableTransfers(bool)'], + '0x29a00e7c': ['calculatePurchaseReturn(uint256,uint256,uint32,uint256)'], + '0x49f9b0f7': ['calculateSaleReturn(uint256,uint256,uint32,uint256)'], + '0x59f8714b': ['changeableTokenCount()'], + '0x503adbf6': ['changeableToken(uint16)'], + '0x9b99a8e2': ['reserveTokenCount()'], + '0x4e2280c4': ['clearQuickBuyPath()'], + '0x9396a7f0': ['getQuickBuyPathLength()'], + '0xabeb5f9f': ['hasQuickBuyEtherToken()'], + '0xb3a9afb7': ['getQuickBuyEtherToken()'], + '0x0b3f191a': ['disableChanging(bool)'], + '0x88c0b8a7': ['setChangeFee(uint32)'], + '0x48d6ca55': ['getChangeFeeAmount(uint256)'], + '0x7758c4f8': ['quickBuy(uint256)'], + '0x74214c92': ['StandardERC223Token(uint256)'], + '0x16279055': ['isContract(address)'], + '0x03ba3a88': ['notifyContract(address,address,uint256,bytes)'], + '0x27e235e3': ['balances(address)'], + '0x3f4ba83a': ['unpause()'], + '0x5c658165': ['allowed(address,address)'], + '0x5c975abb': ['paused()'], + '0x8456cb59': ['pause()'], + '0xa0821be3': ['availableBalance(address)'], + '0xe9ed8667': ['balanceLocks(address)'], + '0xf339c504': ['lockBalance(uint256)'], + '0x1d4d691d': [ + 'fill(address,uint256,address,address,uint256,address,uint256,uint256,uint8,bytes32,bytes32)' + ], + '0x20158c44': ['fills(bytes32)'], + '0x66a26419': [ + 'cancel(address,uint256,address,address,uint256,address,uint256,uint256,uint8,bytes32,bytes32)' + ], + '0x673a5ae3': [ + 'Sale(address,address,uint256,string,uint8,string,uint256,uint256,uint256,uint256,uint256,uint256)' + ], + '0x94b5255b': ['distributePreBuyersRewards(address[],uint256[])'], + '0x555c4758': [ + 'distributeTimelockedTokens(address[],uint256[],uint256[],uint256[])' + ], + '0x8b9b1cbd': ['withdrawRemainder()'], + '0xa2b40d19': ['changePrice(uint256)'], + '0x98b9a2dc': ['changeWallet(address)'], + '0x5437f098': ['changeStartBlock(uint256)'], + '0x82222674': ['changeEndBlock(uint256)'], + '0x00a53598': ['emergencyToggle()'], + '0xe382b854': ['_setPackedTimestamp(bytes20,uint256)'], + '0x31861423': ['_deleteAllPackedRevisionTimestamps(bytes20)'], + '0x4ae6ab70': ['_getRevisionTimestamp(bytes20,uint256)'], + '0x4e57d27d': ['_getAllRevisionTimestamps(bytes20)'], + '0xc5cd3bec': ['getRevisionTimestamp(bytes20,uint256)'], + '0x261c42dd': ['getAllRevisionTimestamps(bytes20)'], + '0x50035eb8': ['getInUse(bytes20)'], + '0xf25e7bb4': ['getState(bytes20)'], + '0x634bc7db': ['create(bytes32,bytes32)'], + '0xb0673d57': ['getItemStore(bytes32)'], + '0x455ea98c': ['getInUse(bytes32)'], + '0xa6c09381': ['_setPackedTimestamp(bytes32,uint256)'], + '0x001a4f5e': ['createNewRevision(bytes32,bytes32)'], + '0x032b0824': ['updateLatestRevision(bytes32,bytes32)'], + '0x1b5710ed': ['_deleteAllPackedRevisionTimestamps(bytes32)'], + '0x165ffd10': ['restart(bytes32,bytes32)'], + '0x2ab7d104': ['_getAllRevisionIpfsHashes(bytes32)'], + '0xf50f1ba9': ['_getRevisionTimestamp(bytes32,uint256)'], + '0xcd22f418': ['_getAllRevisionTimestamps(bytes32)'], + '0x09648a9d': ['getState(bytes32)'], + '0x72cef34b': ['getRevisionIpfsHash(bytes32,uint256)'], + '0x7c699401': ['getAllRevisionIpfsHashes(bytes32)'], + '0x05664cea': ['getRevisionTimestamp(bytes32,uint256)'], + '0x8cb3728c': ['getAllRevisionTimestamps(bytes32)'], + '0x93c8b0d4': ['addForeignChild(bytes32,bytes32)'], + '0x4048c449': ['getParent(bytes32)'], + '0x31230e23': ['createWithParent(bytes32,bytes32,bytes32)'], + '0x2eaad0b0': ['_getAllChildren(bytes32)'], + '0xa09e3d0a': ['getChildCount(bytes32)'], + '0x958d1725': ['getChild(bytes32,uint256)'], + '0xfbdf0378': ['getAllChildren(bytes32)'], + '0x9643aef4': ['testControlCreateWithParentSameNonce()'], + '0x8dc1c44d': ['testFailCreateWithParentSameNonce()'], + '0x2aaf1685': ['testControlCreateWithParentSameItemId()'], + '0xa121d8df': ['testFailCreateWithParentSameItemId()'], + '0x64d0d64c': ['testControlCreateWithParentNotInUse()'], + '0x75f208bf': ['testFailCreateWithParentNotInUse()'], + '0x473ae9fe': ['testCreateWithParent()'], + '0x59e1667d': ['testControlCreateWithForeignParentNotInUse()'], + '0xca615662': ['testFailCreateWithForeignParentNotInUse()'], + '0x121f2081': ['testCreateWithForeignParent()'], + '0xfc13a76a': ['testFailAddForeignChildNotInUse()'], + '0x4e6c61aa': ['testFailAddForeignChildNotChild()'], + '0x590ba734': ['getUint(int256)'], + '0x732e632e': ['assemblyTest()'], + '0x215de48a': ['getParentCount(bytes32)'], + '0x33ac7256': ['getParent(bytes32,uint256)'], + '0x32c4903d': ['getAllParents(bytes32)'], + '0x6844ab43': ['testControlCreateSameItemId()'], + '0x343f40a0': ['testFailCreateSameItemId()'], + '0x9d9c9a0d': ['testControlCreateWithParentParentSameItemId()'], + '0x3ce54ac3': ['testFailCreateWithParentParentSameItemId()'], + '0xbca9e546': ['testControlCreateWithParentParentNotInUse()'], + '0xbab9fc63': ['testFailCreateWithParentParentNotInUse()'], + '0x30840c31': ['testControlCreateWithParentForeignNotInUse()'], + '0x3d6b0cb7': ['testFailCreateWithParentForeignNotInUse()'], + '0x0de04691': ['testCreateWithParentForeign()'], + '0x3d608572': ['testControlCreateWithParentsSameItemId()'], + '0xba907b7e': ['testFailCreateWithParentsSameItemId()'], + '0x015689c6': ['testControlCreateWithParentsParentSameItemId()'], + '0x28e47076': ['testFailCreateWithParentsParentSameItemId0()'], + '0x8a7ef3df': ['testFailCreateWithParentsParentSameItemId1()'], + '0x041dd3f6': ['testControlCreateWithParentsParentNotInUse()'], + '0x46d47cdf': ['testFailCreateWithParentsParentNotInUse0()'], + '0x89a45223': ['testFailCreateWithParentsParentNotInUse1()'], + '0x44019db3': ['testCreateWithParents()'], + '0xbf0d44d5': ['testControlCreateWithParentsForeignNotInUse()'], + '0x0ee8e338': ['testFailCreateWithParentsForeignNotInUse0()'], + '0xdddb983b': ['testFailCreateWithParentsForeignNotInUse1()'], + '0xf94497fe': ['testCreateWithParentsForeign0()'], + '0xf6951038': ['testCreateWithParentsForeign1()'], + '0x26d3e889': ['testCreateWithParentsForeign2()'], + '0x98f69aeb': ['_addChildToParent(bytes32,bytes32)'], + '0x7fdd458d': ['createWithParents(bytes32,bytes32,bytes32[])'], + '0xa300eadf': ['_getAllParents(bytes32)'], + '0xa172045d': ['PUSH1()'], + '0x22a7118d': ['buyTokensFor(uint256,address,uint256,bool)'], + '0x9e1a00aa': ['sendTo(address,uint256)'], + '0x00b172d7': ['buyTokensForProposal(uint256,address)'], + '0x4913732e': ['buyTokenFromModerator(uint256,address,uint256,bool)'], + '0xdb6a3652': ['addOrder(address,uint256)'], + '0x9645337a': ['removeOrder(uint256)'], + '0x709ef231': ['sellTokens(uint256,uint256,uint256)'], + '0x868eb6bf': ['removeOrders(uint256,uint256)'], + '0x02d05d3f': ['creator()'], + '0x1f21f9af': ['marketMaker()'], + '0x28c05d32': ['shortSell(uint8,uint256,uint256)'], + '0x46280a80': ['sell(uint8,uint256,uint256)'], + '0x476343ee': ['withdrawFees()'], + '0x59acb42c': ['createdAtBlock()'], + '0xa157979c': ['netOutcomeTokensSold(uint256)'], + '0xb0011509': ['calcMarketFee(uint256)'], + '0xcb4c86b7': ['funding()'], + '0xe274fd24': ['eventContract()'], + '0xf6d956df': ['buy(uint8,uint256,uint256)'], + '0xfbde47f6': ['FEE_RANGE()'], + '0x27793f87': ['outcome()'], + '0x717a195a': ['setOutcome(int256)'], + '0x7e7e4b47': ['getOutcome()'], + '0xc623674f': ['ipfsHash()'], + '0xc65fb380': ['isSet()'], + '0xccdf68f3': ['isOutcomeSet()'], + '0x4e2f220c': ['createCentralizedOracle(bytes)'], + '0x5ea194a3': ['createScalarEvent(address,address,int256,int256)'], + '0x8d1d2c21': ['categoricalEvents(bytes32)'], + '0x9897e8a5': ['scalarEvents(bytes32)'], + '0x9df0c176': ['createCategoricalEvent(address,address,uint8)'], + '0xeac449d9': ['revoke(address,uint256)'], + '0x7abeb6a0': ['createMarket(address,address,uint24)'], + '0x42958b54': ['issue(address[],uint256)'], + '0x061a85c7': ['forwardedOracle()'], + '0x0853f7eb': ['frontRunnerPeriod()'], + '0x0f3e9438': ['frontRunner()'], + '0x1a39d8ef': ['totalAmount()'], + '0x1a4f5b67': ['isFrontRunnerPeriodOver()'], + '0x1ff14311': ['totalOutcomeAmounts(int256)'], + '0x466ae314': ['forwardedOutcomeSetTimestamp()'], + '0x72b8de14': ['isChallengePeriodOver()'], + '0x739b8c48': ['setForwardedOutcome()'], + '0x8ef8125e': ['frontRunnerSetTimestamp()'], + '0x984a470a': ['forwardedOutcome()'], + '0x9d89e7d4': ['challengeAmount()'], + '0x9df4d0fe': ['isChallenged()'], + '0x9f0de490': ['challengeOutcome(int256)'], + '0xb2016bd4': ['collateralToken()'], + '0xc427af9b': ['outcomeAmounts(address,int256)'], + '0xd84d2a47': ['spreadMultiplier()'], + '0xf3f480d9': ['challengePeriod()'], + '0xf7553098': ['voteForOutcome(int256,uint256)'], + '0xce70faec': [ + 'createUltimateOracle(address,address,uint8,uint256,uint256,uint256)' + ], + '0x91e8609f': ['getParentId(bytes32,uint256)'], + '0xb4a39dfd': ['getChildId(bytes32,uint256)'], + '0x5de4381b': ['_addItemToParent(bytes32,bytes32)'], + '0x059417da': ['_getAllParentIds(bytes32)'], + '0xeca85419': ['_getAllChildIds(bytes32)'], + '0xaa0372e7': ['getItem(bytes32)'], + '0xdcf946c2': ['getAllParentIds(bytes32)'], + '0x1733043f': ['getAllChildIds(bytes32)'], + '0x025e7c27': ['owners(uint256)'], + '0x0cbe1eb8': ['USDDOWNLOADPRICE()'], + '0x11851b5e': ['BOARD_3()'], + '0x1e9be6a1': ['usdEthPrice()'], + '0x3c540687': ['txCount()'], + '0x436da5fe': ['transferLog(uint256)'], + '0x44fddeb7': ['BLOCKAPPS()'], + '0x52aaead8': ['priceLastUpdated()'], + '0x6695b592': ['stemPriceInWei()'], + '0x7dc0d1d0': ['oracle()'], + '0x7fa28d75': ['transferRightIfApproved(address,bytes32)'], + '0x83db0680': ['TOTALSHARES()'], + '0x977eda79': ['txLog(uint256)'], + '0xb9488546': ['ownersCount()'], + '0xcc445611': ['purchase(bytes32)'], + '0xda60d7e8': ['BOARD_2()'], + '0xe347a773': ['shares(bytes32,bytes32)'], + '0xe3d33fc9': ['transferCount()'], + '0xe80d47dd': ['USDSTEMPRICE()'], + '0xf267035f': ['BOARD_1()'], + '0xf7701b47': ['downloadPriceInWei()'], + '0xf851a440': ['admin()'], + '0x8a252194': ['betGanjilGenap(bool)'], + '0xa89171e3': ['checkHasilBet(address)'], + '0xdd365b8b': ['pwn()'], + '0x0537665d': ['setOutcome()'], + '0x28da850b': ['buyAllOutcomes(uint256)'], + '0x69c19d4c': ['getOutcomeTokenDistribution(address)'], + '0x6fb1edcd': ['sellAllOutcomes(uint256)'], + '0x7dc8f086': ['getOutcomeCount()'], + '0x8abe59ea': ['outcomeTokens(uint256)'], + '0xad0b2bec': ['redeemWinnings()'], + '0xe96e5950': ['getEventHash()'], + '0xf21a1468': ['getOutcomeTokens()'], + '0x561cce0a': ['LONG()'], + '0x6e5452fe': ['OUTCOME_RANGE()'], + '0xa384d6ff': ['lowerBound()'], + '0xa871da91': ['SHORT()'], + '0xb09ad8a0': ['upperBound()'], + '0x0a6fbb05': ['SetPass(bytes32)'], + '0x31fd725a': ['PassHasBeenSet(bytes32)'], + '0x6cd5c39b': ['deployContract()'], + '0xe79487da': ['checkInvariant()'] +}; diff --git a/interface/client/lib/thirdParty.js b/interface/client/lib/thirdParty.js index f35a8d93d..26c109f3a 100644 --- a/interface/client/lib/thirdParty.js +++ b/interface/client/lib/thirdParty.js @@ -1,19 +1,19 @@ // set spinner options Meteor.Spinner.options = { - lines: 12, // The number of lines to draw - length: 0, // The length of each line - width: 4, // The line thickness - radius: 8, // The radius of the inner circle - corners: 1, // Corner roundness (0..1) - rotate: 0, // The rotation offset - direction: 1, // 1: clockwise, -1: counterclockwise - color: '#000', // #rgb or #rrggbb or array of colors - speed: 1.7, // Rounds per second - trail: 49, // Afterglow percentage - shadow: false, // Whether to render a shadow - hwaccel: false, // Whether to use hardware acceleration - className: 'spinner', // The CSS class to assign to the spinner - zIndex: 2e9, // The z-index (defaults to 2000000000) - top: '50%', // Top position relative to parent - left: '50%' // Left position relative to parent + lines: 12, // The number of lines to draw + length: 0, // The length of each line + width: 4, // The line thickness + radius: 8, // The radius of the inner circle + corners: 1, // Corner roundness (0..1) + rotate: 0, // The rotation offset + direction: 1, // 1: clockwise, -1: counterclockwise + color: '#000', // #rgb or #rrggbb or array of colors + speed: 1.7, // Rounds per second + trail: 49, // Afterglow percentage + shadow: false, // Whether to render a shadow + hwaccel: false, // Whether to use hardware acceleration + className: 'spinner', // The CSS class to assign to the spinner + zIndex: 2e9, // The z-index (defaults to 2000000000) + top: '50%', // Top position relative to parent + left: '50%' // Left position relative to parent }; diff --git a/interface/client/mistAPIBackend.js b/interface/client/mistAPIBackend.js index 3fa29b03c..6a23de9c4 100644 --- a/interface/client/mistAPIBackend.js +++ b/interface/client/mistAPIBackend.js @@ -2,27 +2,24 @@ @module MistAPI Backend */ - var allowedBrowserBarStyles = ['transparent']; - /** Filters a id the id to only contain a-z A-Z 0-9 _ -. @method filterId */ -var filterId = function (str) { - var newStr = ''; - var i; - for (i = 0; i < str.length; i += 1) { - if (/[a-zA-Z0-9_-]/.test(str.charAt(i))) { - newStr += str.charAt(i); - } +var filterId = function(str) { + var newStr = ''; + var i; + for (i = 0; i < str.length; i += 1) { + if (/[a-zA-Z0-9_-]/.test(str.charAt(i))) { + newStr += str.charAt(i); } - return newStr; + } + return newStr; }; - var sound = document.createElement('audio'); /** @@ -30,115 +27,129 @@ The backend side of the mist API. @method mistAPIBackend */ -mistAPIBackend = function (event) { - var template = this.template; - var webview = this.webview; - var arg = event.args[0]; - - // console.trace('mistAPIBackend event', event); - - if (event.channel === 'setWebviewId') { - Tabs.update(template.data._id, { $set: { webviewId: webview.getWebContents().id } }); +mistAPIBackend = function(event) { + var template = this.template; + var webview = this.webview; + var arg = event.args[0]; + + // console.trace('mistAPIBackend event', event); + + if (event.channel === 'setWebviewId') { + Tabs.update(template.data._id, { + $set: { webviewId: webview.getWebContents().id } + }); + } + + // Send TEST DATA + if (event.channel === 'sendTestData') { + var tests = Tabs.findOne('tests'); + + if (tests) { + web3.eth.getCoinbase(function(e, coinbase) { + webview.send('uiAction_sendTestData', tests.permissions, coinbase); + }); } - - // Send TEST DATA - if (event.channel === 'sendTestData') { - var tests = Tabs.findOne('tests'); - - if (tests) { - web3.eth.getCoinbase(function (e, coinbase) { - webview.send('uiAction_sendTestData', tests.permissions, coinbase); - }); + } + + // SET FAVICON + if (event.channel === 'favicon') { + Tabs.update(template.data._id, { + $set: { + icon: Blaze._escape(arg || '') + } + }); + } + + // SET APPBAR + if (event.channel === 'appBar') { + var appBarClass = Blaze._escape(arg || ''); + + Tabs.update(template.data._id, { + $set: { + appBar: _.contains(allowedBrowserBarStyles, appBarClass) + ? appBarClass + : null + } + }); + } + if (event.channel === 'mistAPI_sound') { + sound.pause(); + sound.src = Blaze._escape('file://' + dirname + '/sounds/' + arg + '.mp3'); + sound.play(); + } + + // STOP HERE, IF BROWSER + if (template.data._id === 'browser') { + return; + } + + // Actions: -------- + + if (event.channel === 'mistAPI_setBadge') { + Tabs.update(template.data._id, { + $set: { + badge: arg + } + }); + } + + if (event.channel === 'mistAPI_menuChanges' && arg instanceof Array) { + arg.forEach(function(eventArg) { + var query; + + if (eventArg.action === 'addMenu') { + // filter ID + if (eventArg.entry && eventArg.entry.id) { + eventArg.entry.id = filterId(eventArg.entry.id); } - } - - // SET FAVICON - if (event.channel === 'favicon') { - Tabs.update(template.data._id, { $set: { - icon: Blaze._escape(arg || ''), - } }); - } - - // SET APPBAR - if (event.channel === 'appBar') { - var appBarClass = Blaze._escape(arg || ''); - - Tabs.update(template.data._id, { $set: { - appBar: (_.contains(allowedBrowserBarStyles, appBarClass) ? appBarClass : null) - }}); - } - if (event.channel === 'mistAPI_sound') { - sound.pause(); - sound.src = Blaze._escape('file://'+ dirname +'/sounds/' + arg + '.mp3'); - sound.play(); - } - - // STOP HERE, IF BROWSER - if (template.data._id === 'browser') { - return; - } - - // Actions: -------- - - if (event.channel === 'mistAPI_setBadge') { - Tabs.update(template.data._id, { $set: { - badge: arg, - } }); - } - - if (event.channel === 'mistAPI_menuChanges' && arg instanceof Array) { - arg.forEach(function (eventArg) { - var query; - if (eventArg.action === 'addMenu') { - // filter ID - if (eventArg.entry && eventArg.entry.id) { - eventArg.entry.id = filterId(eventArg.entry.id); - } + query = { $set: {} }; - query = { $set: {} }; - - if (eventArg.entry.id) { - query.$set['menu.' + eventArg.entry.id + '.id'] = eventArg.entry.id; - } + if (eventArg.entry.id) { + query.$set['menu.' + eventArg.entry.id + '.id'] = eventArg.entry.id; + } - query.$set['menu.' + eventArg.entry.id + '.selected'] = !!eventArg.entry.selected; + query.$set['menu.' + eventArg.entry.id + '.selected'] = !!eventArg.entry + .selected; - if (!_.isUndefined(eventArg.entry.position)) { - query.$set['menu.' + eventArg.entry.id + '.position'] = eventArg.entry.position; - } - if (!_.isUndefined(eventArg.entry.name)) { - query.$set['menu.' + eventArg.entry.id + '.name'] = eventArg.entry.name; - } - if (!_.isUndefined(eventArg.entry.badge)) { - query.$set['menu.' + eventArg.entry.id + '.badge'] = eventArg.entry.badge; - } + if (!_.isUndefined(eventArg.entry.position)) { + query.$set['menu.' + eventArg.entry.id + '.position'] = + eventArg.entry.position; + } + if (!_.isUndefined(eventArg.entry.name)) { + query.$set['menu.' + eventArg.entry.id + '.name'] = + eventArg.entry.name; + } + if (!_.isUndefined(eventArg.entry.badge)) { + query.$set['menu.' + eventArg.entry.id + '.badge'] = + eventArg.entry.badge; + } - Tabs.update(template.data._id, query); - } + Tabs.update(template.data._id, query); + } - if (eventArg.action === 'selectMenu') { - var tab = Tabs.findOne(template.data._id); + if (eventArg.action === 'selectMenu') { + var tab = Tabs.findOne(template.data._id); - for (var e in tab.menu) { - if ({}.hasOwnProperty.call(tab.menu, e)) { - tab.menu[e].selected = (e === eventArg.id); - } - } - Tabs.update(template.data._id, { $set: { menu: tab.menu } }); - } + for (var e in tab.menu) { + if ({}.hasOwnProperty.call(tab.menu, e)) { + tab.menu[e].selected = e === eventArg.id; + } + } + Tabs.update(template.data._id, { $set: { menu: tab.menu } }); + } - if (eventArg.action === 'removeMenu') { - var removeQuery = { $unset: {} }; + if (eventArg.action === 'removeMenu') { + var removeQuery = { $unset: {} }; - removeQuery.$unset['menu.' + eventArg.id] = ''; + removeQuery.$unset['menu.' + eventArg.id] = ''; - Tabs.update(template.data._id, removeQuery); - } + Tabs.update(template.data._id, removeQuery); + } - if (eventArg.action === 'clearMenu') { - Tabs.update(template.data._id, { $set: { menu: {} } }); - } - }); - } + if (eventArg.action === 'clearMenu') { + Tabs.update(template.data._id, { $set: { menu: {} } }); + } + }); + } }; diff --git a/interface/client/styles/animations.import.less b/interface/client/styles/animations.import.less index c60b81f4a..8b218c2a2 100644 --- a/interface/client/styles/animations.import.less +++ b/interface/client/styles/animations.import.less @@ -1,61 +1,61 @@ // Menu aside.sidebar { - ul li { - transition: transform 0.25s, height 0.25s, visibility 0.5s; - - &.ui-sortable-helper { - transition: none; - } - - button.slide-out { - transition: transform 0.2s ease-in-out; - } - - ul.sub-menu { - li { - transition: background 0.05s ease-in-out, height 0.25s ease-out, opacity 0.25s ease-out; - } - .badge { - // ANIMATION - transition: max-width @animationSpeed; - } - } + ul li { + transition: transform 0.25s, height 0.25s, visibility 0.5s; + + &.ui-sortable-helper { + transition: none; + } + + button.slide-out { + transition: transform 0.2s ease-in-out; } -} + ul.sub-menu { + li { + transition: background 0.05s ease-in-out, height 0.25s ease-out, + opacity 0.25s ease-out; + } + .badge { + // ANIMATION + transition: max-width @animationSpeed; + } + } + } +} // Browser bar .browser-bar { - .url-input { - transition: opacity 0.1s; - } + .url-input { + transition: opacity 0.1s; + } } .popup-windows { - position: relative; - perspective: 800px; - - .field-container{ - transform-style: preserve-3d; - transition: transform 0.5s; - transition-timing-function: ease-out; - transition-timing-function: cubic-bezier(0.000, 1.125, 0.335, 1.650); - height: @gridHeight*1.5; - - &>* { - position: absolute; - left: @gridWidth*2; - top: -1*@gridHeight; - backface-visibility: hidden; - } - - .password-repeat { - transform: rotateX( 180deg ); - } - - &.repeat-field { - transform: rotateX( 180deg ); - } + position: relative; + perspective: 800px; + + .field-container { + transform-style: preserve-3d; + transition: transform 0.5s; + transition-timing-function: ease-out; + transition-timing-function: cubic-bezier(0, 1.125, 0.335, 1.65); + height: @gridHeight*1.5; + + & > * { + position: absolute; + left: @gridWidth*2; + top: -1 * @gridHeight; + backface-visibility: hidden; + } + + .password-repeat { + transform: rotateX(180deg); + } + + &.repeat-field { + transform: rotateX(180deg); } + } } diff --git a/interface/client/styles/browserbar.import.less b/interface/client/styles/browserbar.import.less index 4b35d1a28..ef2c05bc0 100644 --- a/interface/client/styles/browserbar.import.less +++ b/interface/client/styles/browserbar.import.less @@ -1,362 +1,364 @@ .browser-bar { + .display(flex); + position: absolute; + top: @gridHeight * 1.5; + left: @widthSideBar; + right: 0; + z-index: 3; + height: @gridHeight * 2; + font-family: @sourceSansPro; + + button.icon { + padding: @gridHeight / 4 @gridWidth / 4; + + &:focus { + border: 0; + color: @colorLinkFocus; + } + } + + .app-bar { + position: relative; .display(flex); - position: absolute; - top: @gridHeight * 1.5; - left: @widthSideBar; - right: 0; - z-index: 3; - height: @gridHeight * 2; - font-family: @sourceSansPro; + flex-grow: 1; + margin: @gridHeight / 4 @gridWidth / 4; + padding: @gridHeight / 4 @gridWidth / 4; + background: #fff; //#F6F6F6; + // border-radius: 3px; + // box-shadow: 0 2px 0 rgba(0, 0, 0, 0.25); + height: @gridHeight*1.7; + overflow: hidden; + + // ANIMATION + transition: height 0.25s, box-shadow 0.5s; + + > .dapp-info, + > button { + color: #6691c2; + position: relative; + padding-left: 0; + margin-top: 1px; + max-width: 33%; + height: 21px; + font-family: @sourceSansPro; + font-size: @fontSizeSmall; + font-weight: 500; + line-height: 21px; + white-space: nowrap; + margin-top: -1px; + + &.has-icon { + padding-left: @gridWidth * 0.84; + } + + &:focus { + border-bottom: 0; + } + + &.dapp-info { + .dapp-shorten-text; + } + + .app-icon { + position: absolute; + top: 0; + left: 0; + width: 21px; + height: 21px; + border-radius: 50%; + -webkit-user-drag: none; + user-drag: none; + } + + .connect-button { + float: left; + margin-right: 8px; + text-transform: uppercase; + } + .connect-button, + .dapp-info span { + line-height: 21px; + display: inline-block; + } + + span.no-accounts { + background-image: url(/images/anonymous-icon.png); + background-size: cover; + background-position: 50%; + width: 21px; + height: 21px; + display: inline-block; + border-radius: 50%; + } + } - button.icon { - padding: @gridHeight/4 @gridWidth/4; + > form { + position: relative; + flex-grow: 1; + height: @gridHeight; + + .url-input { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + padding: 0; + margin: 0; + width: 100%; + max-width: none; + background: transparent; + border: none; + text-align: center; + color: @colorLinkBlur; + opacity: 0; + transform: translateX(-20px) translateZ(0); + font-size: 80%; + font-family: @sourceSansPro; + font-weight: 400; + transition: opacity 0.2s ease-in-out; + line-height: @gridHeight; + z-index: 10; &:focus { - border: 0; - color: @colorLinkFocus; + color: @colorLinkActive; + opacity: 1; } - } - .app-bar { - position: relative; - .display(flex); - flex-grow: 1; - margin: @gridHeight/4 @gridWidth/4; - padding: @gridHeight/4 @gridWidth/4; - background: #fff;//#F6F6F6; - // border-radius: 3px; - // box-shadow: 0 2px 0 rgba(0, 0, 0, 0.25); - height: @gridHeight*1.7; + &:focus + .url-breadcrumb, + &:hover + .url-breadcrumb { + opacity: 0; + word-spacing: -4px; + } + } + + .url-breadcrumb { + color: lighten(@colorLinkBlur, 40%); + background-color: #fff; + opacity: 1; + font-size: 80%; + text-align: center; + font-weight: 400; + transition: opacity 0.2s ease-in-out, word-spacing 0.1s ease-in-out 0.1s; + line-height: @gridHeight; + height: @gridHeight; overflow: hidden; + z-index: 1; - // ANIMATION - transition: height 0.25s, box-shadow 0.5s; - - > .dapp-info, > button { - color: #6691c2; - position: relative; - padding-left: 0; - margin-top: 1px; - max-width: 33%; - height: 21px; - font-family: @sourceSansPro; - font-size: @fontSizeSmall; - font-weight: 500; - line-height: 21px; - white-space: nowrap; - margin-top: -1px; - - &.has-icon { - padding-left: @gridWidth * 0.84; - } - - &:focus { - border-bottom: 0; - } - - &.dapp-info { - .dapp-shorten-text; - } - - .app-icon { - position: absolute; - top: 0; - left: 0; - width: 21px; - height: 21px; - border-radius: 50%; - -webkit-user-drag: none; - user-drag: none; - } - - .connect-button { - float: left; - margin-right: 8px; - text-transform: uppercase; - } - .connect-button, .dapp-info span { - line-height: 21px; - display: inline-block; - } - - span.no-accounts { - background-image: url(/images/anonymous-icon.png); - background-size: cover; - background-position: 50%; - width: 21px; - height: 21px; - display: inline-block; - border-radius: 50%; - } + span { + color: @colorLinkBlur; } + } - > form { - position: relative; - flex-grow: 1; - height: @gridHeight; - - .url-input { - position: absolute; - top: 0; - left: 0; - bottom: 0; - right: 0; - padding: 0; - margin: 0; - width: 100%; - max-width: none; - background: transparent; - border: none; - text-align: center; - color: @colorLinkBlur; - opacity: 0; - transform: translateX(-20px) translateZ(0); - font-size: 80%; - font-family: @sourceSansPro; - font-weight: 400; - transition: opacity 0.2s ease-in-out; - line-height: @gridHeight; - z-index: 10; - - &:focus { - color: @colorLinkActive; - opacity: 1; - } - - &:focus + .url-breadcrumb, &:hover + .url-breadcrumb { - opacity: 0; - word-spacing: -4px; - } - } - - .url-breadcrumb { - color: lighten(@colorLinkBlur, 40%); - background-color: #fff; - opacity: 1; - font-size: 80%; - text-align: center; - font-weight: 400; - transition: opacity 0.2s ease-in-out, word-spacing 0.1s ease-in-out 0.1s; - line-height: @gridHeight; - height: @gridHeight; - overflow: hidden; - z-index: 1; - - span { - color: @colorLinkBlur; - } - } - - &:hover > .url-input { - opacity: 1; - transition: opacity 0.2s ease-in-out 0.1s; - } - - &:hover > .url-breadcrumb { - opacity: 0; - word-spacing: -3px; - transition: opacity 0.2s ease-in-out 0.1s, word-spacing 0.2s ease-in-out; - } - } + &:hover > .url-input { + opacity: 1; + transition: opacity 0.2s ease-in-out 0.1s; + } - div.dapp-info, - div.accounts, - div.url { - display: none; - position: absolute; - top: @gridHeight * 2; - left: 0; - right: 0; - bottom: 0; - padding: @gridHeight/2 @gridWidth/4 @gridHeight * 3; - margin: 0 @gridWidth/4 0; - border-top: solid 1px #BDB6B6; - } + &:hover > .url-breadcrumb { + opacity: 0; + word-spacing: -3px; + transition: opacity 0.2s ease-in-out 0.1s, word-spacing 0.2s ease-in-out; + } + } - div.accounts { - .message { - flex-grow: 1; - padding: @gridHeight/2 @gridWidth/2 0 0; - - h3 { - font-size: @fontSizeLarge; - text-transform: none; - color: #4A4A4A; - font-weight: 400; - - em { - font-weight: 700; - } - } - } - - .dapp-account-list { - min-width: @gridWidth * 10; - } - - .bar-actions { - display: flex; - justify-content: flex-end; - position: absolute; - bottom: 0; - left: 0; - right: 0; - height: @gridHeight * 3; - padding-top: @gridHeight; - - button { - display: inline-block; - font-size: 100%; - font-weight: 500; - text-transform: uppercase; - font-family: @sourceSansPro; - padding: @gridHeight/4 @gridWidth/2; - line-height: @gridHeight - } - - button.cancel { - font-weight: 300; - } - } - } + div.dapp-info, + div.accounts, + div.url { + display: none; + position: absolute; + top: @gridHeight * 2; + left: 0; + right: 0; + bottom: 0; + padding: @gridHeight / 2 @gridWidth / 4 @gridHeight * 3; + margin: 0 @gridWidth / 4 0; + border-top: solid 1px #bdb6b6; } - &.url-bar-transparent { - button.reload, button.back { - display: none; - } + div.accounts { + .message { + flex-grow: 1; + padding: @gridHeight / 2 @gridWidth / 2 0 0; - button.icon-close { - width: @gridWidth; - padding: 0; + h3 { + font-size: @fontSizeLarge; + text-transform: none; + color: #4a4a4a; + font-weight: 400; + + em { + font-weight: 700; + } + } + } + + .dapp-account-list { + min-width: @gridWidth * 10; + } + + .bar-actions { + display: flex; + justify-content: flex-end; + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: @gridHeight * 3; + padding-top: @gridHeight; + + button { + display: inline-block; + font-size: 100%; + font-weight: 500; + text-transform: uppercase; + font-family: @sourceSansPro; + padding: @gridHeight / 4 @gridWidth / 2; + line-height: @gridHeight; } - .app-bar { - margin-left: @gridWidth /2; - margin-right: @gridWidth /2; + button.cancel { + font-weight: 300; } + } + } + } + + &.url-bar-transparent { + button.reload, + button.back { + display: none; + } + + button.icon-close { + width: @gridWidth; + padding: 0; + } + .app-bar { + margin-left: @gridWidth / 2; + margin-right: @gridWidth / 2; } + } } .linux .browser-bar { - top: 0; - &.url-bar-transparent { - top: @gridHeight * 1.5; - } + top: 0; + &.url-bar-transparent { + top: @gridHeight * 1.5; + } } .loading { - .url-input { - .color-pulse; - opacity: 1 !important; - } - .url-breadcrumb { - visibility: hidden; - word-spacing: -3px; - transition: word-spacing 0.5s ease-in-out; - } - .reload { - .rotating; - } + .url-input { + .color-pulse; + opacity: 1 !important; + } + .url-breadcrumb { + visibility: hidden; + word-spacing: -3px; + transition: word-spacing 0.5s ease-in-out; + } + .reload { + .rotating; + } } .color-pulse { - animation-name: color-pulse; - animation-duration: 0.5s; - animation-iteration-count: infinite; - animation-timing-function: linear; - background: linear-gradient(to left, - darken(@colorLinkActive, 30%) 0, - saturate(@colorLinkActive, 100%), - darken(@colorLinkActive, 30%)) !important; - background-size: 200px !important; - background-repeat: repeat-x; - -webkit-background-clip: text !important; - -webkit-text-fill-color: transparent; + animation-name: color-pulse; + animation-duration: 0.5s; + animation-iteration-count: infinite; + animation-timing-function: linear; + background: linear-gradient( + to left, + darken(@colorLinkActive, 30%) 0, + saturate(@colorLinkActive, 100%), + darken(@colorLinkActive, 30%) + ) !important; + background-size: 200px !important; + background-repeat: repeat-x; + -webkit-background-clip: text !important; + -webkit-text-fill-color: transparent; } @keyframes color-pulse { - 0% { - transform: scale(0.992) translateZ(0); - opacity: 0.7; - background-position-x:0px; - } - 50% { - transform: scale(1) translateZ(0); - opacity: 1; - } - 100% { - transform: scale(0.992) translateZ(0); - opacity: 0.7; - background-position-x:-200px; - } + 0% { + transform: scale(0.992) translateZ(0); + opacity: 0.7; + background-position-x: 0px; + } + 50% { + transform: scale(1) translateZ(0); + opacity: 1; + } + 100% { + transform: scale(0.992) translateZ(0); + opacity: 0.7; + background-position-x: -200px; + } } @colorBlockchain: #c3d825; .color-ping { - animation-name: color-ping; - animation-duration: 12s; - animation-iteration-count: infinite; - animation-timing-function: ease-out; - background-image: linear-gradient(to top, - saturate(@colorLinkActive, 100%), - @colorGrayDark) !important; - background-size: 150px 150px; - background-position-y:0; - - -webkit-background-clip: text !important; - -webkit-text-fill-color: transparent; - + animation-name: color-ping; + animation-duration: 12s; + animation-iteration-count: infinite; + animation-timing-function: ease-out; + background-image: linear-gradient( + to top, + saturate(@colorLinkActive, 100%), + @colorGrayDark + ) !important; + background-size: 150px 150px; + background-position-y: 0; + + -webkit-background-clip: text !important; + -webkit-text-fill-color: transparent; } @keyframes color-ping { - 0% { - transform: scale(1) translateZ(0); - background-position-y:0; - - } - 5% { - transform: scale(0.95) translateZ(0); - background-position-y:30px; - } - 100% { - background-color: @colorGrayDark; - transform: scale(1) translateZ(0); - background-position-y:150px; - - } + 0% { + transform: scale(1) translateZ(0); + background-position-y: 0; + } + 5% { + transform: scale(0.95) translateZ(0); + background-position-y: 30px; + } + 100% { + background-color: @colorGrayDark; + transform: scale(1) translateZ(0); + background-position-y: 150px; + } } - - .rotating { - animation-name: rotating; - animation-duration: 0.5s; - animation-iteration-count: infinite; - animation-timing-function: linear; + animation-name: rotating; + animation-duration: 0.5s; + animation-iteration-count: infinite; + animation-timing-function: linear; } @keyframes rotating { - 0% { - transform: rotate(0deg) translate3d(0, 0, 0); - } - 100% { - transform: rotate(-180deg) translate3d(0, 1px, 0); - } + 0% { + transform: rotate(0deg) translate3d(0, 0, 0); + } + 100% { + transform: rotate(-180deg) translate3d(0, 1px, 0); + } } -@media screen and (max-width: 960px ) { - .browser-bar .accounts { - width: 0; - text-overflow: clip; - padding-left: @gridWidth * 0.75; - } +@media screen and (max-width: 960px) { + .browser-bar .accounts { + width: 0; + text-overflow: clip; + padding-left: @gridWidth * 0.75; + } } -@media screen and (max-width: 800px ) { - .browser-bar div.dapp-info { - width: 0; - text-overflow: clip; - } +@media screen and (max-width: 800px) { + .browser-bar div.dapp-info { + width: 0; + text-overflow: clip; + } } diff --git a/interface/client/styles/constants.import.less b/interface/client/styles/constants.import.less index a20b979a7..626d84b6a 100644 --- a/interface/client/styles/constants.import.less +++ b/interface/client/styles/constants.import.less @@ -1,27 +1,25 @@ @widthSideBar: 78px; -@colorLinkActive: #4A90E2; +@colorLinkActive: #4a90e2; @colorLinkBlur: #494949; @colorLinkFocus: lighten(@colorLinkBlur, 8%); @colorGrey: #666; -@shadowStandard: -1px 0 4px rgba(0,0,0,0.2); +@shadowStandard: -1px 0 4px rgba(0, 0, 0, 0.2); // FONTS -@sourceSansPro: 'Source Sans Pro', "Helvetica Neue", "Helvetica", Arial, Sans-serif; +@sourceSansPro: 'Source Sans Pro', 'Helvetica Neue', 'Helvetica', Arial, + Sans-serif; @fontSizeTiny: 8px; @fontSizeSmall: 12px; @fontSizeNormal: 14px; @fontSizeLarge: 18px; - - - // Platform specifics // Mac OSX -@colorOSBackgroundFocus: #D2D2D2; -@colorOSBackgroundBlur: #F6F6F6; +@colorOSBackgroundFocus: #d2d2d2; +@colorOSBackgroundBlur: #f6f6f6; // Windows // @colorOSBackgroundFocus windows F0F0F0 diff --git a/interface/client/styles/elements.import.less b/interface/client/styles/elements.import.less index f30f22bd9..6f21ab583 100644 --- a/interface/client/styles/elements.import.less +++ b/interface/client/styles/elements.import.less @@ -1,42 +1,41 @@ .red { - color: @colorError; + color: @colorError; } .gree { - color: @colorGreen; + color: @colorGreen; } .blue { - color: @colorBlue; + color: @colorBlue; } - img { - transition: opacity @animationSpeed/2; + transition: opacity @animationSpeed / 2; - &.loading { - opacity: 0; - } + &.loading { + opacity: 0; + } } ul.no-bullets { - margin: 0; - padding: 0; - list-style: none; - word-wrap: break-word; + margin: 0; + padding: 0; + list-style: none; + word-wrap: break-word; - li { - margin: 0; - margin-bottom: @defaultMargin/2; + li { + margin: 0; + margin-bottom: @defaultMargin / 2; - strong { - font-weight: 400; - } + strong { + font-weight: 400; } + } } .danger { - display: inline-block; - padding: 1px 2px; - border-radius: 3px; - color: @colorWhite; - background-color: @colorError; + display: inline-block; + padding: 1px 2px; + border-radius: 3px; + color: @colorWhite; + background-color: @colorError; } diff --git a/interface/client/styles/importAccount.import.less b/interface/client/styles/importAccount.import.less index acd753280..3de4a6384 100644 --- a/interface/client/styles/importAccount.import.less +++ b/interface/client/styles/importAccount.import.less @@ -1,304 +1,303 @@ .import-account { - display: flex; - flex-direction: column; - height: 100%; - position: relative; - // background: lighten(@colorOSBackgroundFocus, 10%); - - .main-content { - z-index: 1; - flex: 1 100%; - - h1 { - margin: @gridHeight*2 0 @gridHeight/2; - } - - .description { - font-weight: 500; - padding-bottom: @gridHeight; - } - - .col { - padding: 0; - } - - button, a.button { - display: block; - text-transform: uppercase; - font-weight: 500; - color: @colorLinkActive; - } - - p { - margin: 0; - padding: @gridHeight 0; - font-size: 90%; - } + display: flex; + flex-direction: column; + height: 100%; + position: relative; + // background: lighten(@colorOSBackgroundFocus, 10%); + + .main-content { + z-index: 1; + flex: 1 100%; + + h1 { + margin: @gridHeight*2 0 @gridHeight / 2; + } - .onboarding-start { - padding: @gridHeight @gridWidth @gridHeight @gridWidth * 10; - background-image: url('/images/onboarding-logo-metal.png'); - background-repeat: no-repeat; - background-position-y: @gridHeight*4; - background-size: 255px 257px; - - button, a.button { - font-size: 110%; - text-align: left; - } - } + .description { + font-weight: 500; + padding-bottom: @gridHeight; + } - .dropable { - display: block; - padding: @gridHeight*4 @gridWidth; - margin: @gridHeight 0; - background: lighten(@colorLinkActive, 30%); - border: dashed 3px @colorLinkActive; - border-radius: 3px; - text-align: center; - font-size: 150%; - color: @colorLinkActive; - - &.active { - transform: scale(1.05) !important; - } - } + .col { + padding: 0; + } - .dapp-block-button { - margin: 0 auto; - background-color: transparent; - border: solid 1px @colorLinkActive; - font-size: 80%; - } + button, + a.button { + display: block; + text-transform: uppercase; + font-weight: 500; + color: @colorLinkActive; + } - input { - background-color: transparent; - border-bottom: dashed 1px; - } + p { + margin: 0; + padding: @gridHeight 0; + font-size: 90%; + } - input.name { - text-align: center; - margin: @gridHeight/2 0 @gridHeight; - } + .onboarding-start { + padding: @gridHeight @gridWidth @gridHeight @gridWidth * 10; + background-image: url('/images/onboarding-logo-metal.png'); + background-repeat: no-repeat; + background-position-y: @gridHeight*4; + background-size: 255px 257px; + + button, + a.button { + font-size: 110%; + text-align: left; + } + } - input[type='checkbox'] { - margin-left: 14px; - } + .dropable { + display: block; + padding: @gridHeight*4 @gridWidth; + margin: @gridHeight 0; + background: lighten(@colorLinkActive, 30%); + border: dashed 3px @colorLinkActive; + border-radius: 3px; + text-align: center; + font-size: 150%; + color: @colorLinkActive; + + &.active { + transform: scale(1.05) !important; + } + } - input[type='checkbox'] + label { - position: relative; - top: -7px; - left: 9px; - opacity: 0.9; - } + .dapp-block-button { + margin: 0 auto; + background-color: transparent; + border: solid 1px @colorLinkActive; + font-size: 80%; + } - h6 { - opacity: 0.2; - margin: 0 0 @gridHeight/2; - } + input { + background-color: transparent; + border-bottom: dashed 1px; + } - .footer-buttons { - position: absolute; - bottom: @gridHeight*5; + input.name { + text-align: center; + margin: @gridHeight / 2 0 @gridHeight; + } - button { - position: absolute; - } - } - .right-align { - right: @gridWidth * 2; - } + input[type='checkbox'] { + margin-left: 14px; + } - .col-left { - padding-right: @gridWidth; - p { - padding-bottom: 0; - } - } + input[type='checkbox'] + label { + position: relative; + top: -7px; + left: 9px; + opacity: 0.9; } - footer { - z-index: 2; - flex: 0 @gridHeight * 4; - height: @gridHeight * 4; - padding: @gridHeight/2 @gridWidth/4; - display: flex; - flex-flow: row wrap; - - progress { - width: 100%; - height: 2px; - background: transparent; - - &.stateBar { - position: absolute; - left: 8px; - right: 8px; - bottom: 45px; - width: auto; - opacity: 0.15; - - &::-webkit-progress-value { - background:#000; - } - } - } + h6 { + opacity: 0.2; + margin: 0 0 @gridHeight / 2; + } - button { - position: relative; - top: -3px; - margin: 0 auto; - text-transform: uppercase; - font-weight: 500; - text-align: center; - display: block; - // width: 100%; - color: @colorLinkActive; - } + .footer-buttons { + position: absolute; + bottom: @gridHeight*5; - .status { - flex: 1; - } + button { + position: absolute; + } + } + .right-align { + right: @gridWidth * 2; + } - div { - font-size: 80%; - font-weight: 500; - opacity: 0.5; - padding: 0 @gridWidth/2; - } + .col-left { + padding-right: @gridWidth; + p { + padding-bottom: 0; + } } + } + footer { + z-index: 2; + flex: 0 @gridHeight * 4; + height: @gridHeight * 4; + padding: @gridHeight / 2 @gridWidth / 4; + display: flex; + flex-flow: row wrap; - /* Screen transitions */ + progress { + width: 100%; + height: 2px; + background: transparent; - .onboarding-section { - padding: @gridHeight @gridWidth; - opacity: 0; - z-index: 0; - transition: opacity 0.2s ease-in-out; + &.stateBar { position: absolute; - height: 100%; - width: 100%; - perspective: 500px; + left: 8px; + right: 8px; + bottom: 45px; + width: auto; + opacity: 0.15; - h4 { - margin-bottom: 0; + &::-webkit-progress-value { + background: #000; } + } } - .onboarding-start { - transition: opacity 0.8s, background-position-x 1.2s ease-in-out; - background-position-x: -200px; - p { - transform: translateX(300px); - transition: transform 0.6s ease-in-out; - } + button { + position: relative; + top: -3px; + margin: 0 auto; + text-transform: uppercase; + font-weight: 500; + text-align: center; + display: block; + // width: 100%; + color: @colorLinkActive; } - &.active-start .onboarding-start { - display: block; - opacity: 1; - background-position-x: @gridWidth; - z-index: 100; - transition-delay: 0.3s; - p { - transform: translateX(0); - transition-delay: 0.9s; - } + .status { + flex: 1; } - .onboarding-import-account { - opacity: 0; - z-index: 0; - transition-duration: 0s; - .col-6.col-left { - transform: scale(0.9) translateZ(-10px); - transition: transform 0.2s ease-in-out, opacity 0.2s ease-in-out; - } + div { + font-size: 80%; + font-weight: 500; + opacity: 0.5; + padding: 0 @gridWidth / 2; } + } + /* Screen transitions */ - .dapp-identicon.dapp-icon-loading { - position: relative; - margin-left: -32px; - left: 50%; - } - - .onboarding-account .col-deposit { - text-align: center; - } + .onboarding-section { + padding: @gridHeight @gridWidth; + opacity: 0; + z-index: 0; + transition: opacity 0.2s ease-in-out; + position: absolute; + height: 100%; + width: 100%; + perspective: 500px; - .onboarding-password { - transition: none; - .col-6 { - transition: none; - transform: translateX(0); - } - .col-6.col-left { - opacity: 0; - transform: translateX(-100px); - } + h4 { + margin-bottom: 0; } + } + + .onboarding-start { + transition: opacity 0.8s, background-position-x 1.2s ease-in-out; + background-position-x: -200px; + p { + transform: translateX(300px); + transition: transform 0.6s ease-in-out; + } + } + + &.active-start .onboarding-start { + display: block; + opacity: 1; + background-position-x: @gridWidth; + z-index: 100; + transition-delay: 0.3s; + p { + transform: translateX(0); + transition-delay: 0.9s; + } + } + + .onboarding-import-account { + opacity: 0; + z-index: 0; + transition-duration: 0s; + .col-6.col-left { + transform: scale(0.9) translateZ(-10px); + transition: transform 0.2s ease-in-out, opacity 0.2s ease-in-out; + } + } - .onboarding-testnet , - .onboarding-account { - transition: opacity 0.4s ease-in-out; - - .col-6 { - transition: transform 0.2s ease-in-out, opacity 0.2s; - transform: translateX(0) - } - .col-6.col-left { - opacity: 0; - transform: translateX(-100px) - } - - .dapp-identicon.dapp-icon-loading{ - margin-left: 0 auto; - } + .dapp-identicon.dapp-icon-loading { + position: relative; + margin-left: -32px; + left: 50%; + } + + .onboarding-account .col-deposit { + text-align: center; + } + + .onboarding-password { + transition: none; + .col-6 { + transition: none; + transform: translateX(0); + } + .col-6.col-left { + opacity: 0; + transform: translateX(-100px); + } + } - .you { - position: absolute; - font-weight: 600; - color: @colorLinkActive; - border: dashed @colorLinkActive 2px; - width: @gridWidth*2; - height: @gridWidth*2; - border-radius: 50%; - line-height: 60px; - top: 0; - left: @gridWidth*3; - z-index: -1; - } + .onboarding-testnet, + .onboarding-account { + transition: opacity 0.4s ease-in-out; - h6.address { - .allowSelection; - } + .col-6 { + transition: transform 0.2s ease-in-out, opacity 0.2s; + transform: translateX(0); + } + .col-6.col-left { + opacity: 0; + transform: translateX(-100px); } + .dapp-identicon.dapp-icon-loading { + margin-left: 0 auto; + } - &.active-import-account .onboarding-import-account, - &.active-password .onboarding-password, - &.active-testnet .onboarding-testnet, - &.active-account .onboarding-account { - display: block; - opacity: 1; - z-index: 100; - transition-delay: 0.1s; - .col-6 { - opacity: 1; - transform: translateX(0); - transition-delay: 0.2s; - } - .dapp-identicon { - transform: translateX(0); - } + .you { + position: absolute; + font-weight: 600; + color: @colorLinkActive; + border: dashed @colorLinkActive 2px; + width: @gridWidth*2; + height: @gridWidth*2; + border-radius: 50%; + line-height: 60px; + top: 0; + left: @gridWidth*3; + z-index: -1; } - .onboarding-testnet , - &.active-account .onboarding-account{ - transition-delay: 0; - transition-duration: 0; - transition: none; + h6.address { + .allowSelection; + } + } + + &.active-import-account .onboarding-import-account, + &.active-password .onboarding-password, + &.active-testnet .onboarding-testnet, + &.active-account .onboarding-account { + display: block; + opacity: 1; + z-index: 100; + transition-delay: 0.1s; + .col-6 { + opacity: 1; + transform: translateX(0); + transition-delay: 0.2s; + } + .dapp-identicon { + transform: translateX(0); } + } + + .onboarding-testnet, + &.active-account .onboarding-account { + transition-delay: 0; + transition-duration: 0; + transition: none; + } } diff --git a/interface/client/styles/layout.import.less b/interface/client/styles/layout.import.less index d18215bdf..0cf7c187a 100644 --- a/interface/client/styles/layout.import.less +++ b/interface/client/styles/layout.import.less @@ -1,15 +1,13 @@ - // Platform specifics // Mac OSX -@colorOSBackgroundFocus: #F1F1F1; -@colorOSBackgroundBlur: #F6F6F6; +@colorOSBackgroundFocus: #f1f1f1; +@colorOSBackgroundBlur: #f6f6f6; -@colorWinBackgroundFocus: #F0F0F0; -@colorWinBackgroundBlur: #F0F0F0; +@colorWinBackgroundFocus: #f0f0f0; +@colorWinBackgroundBlur: #f0f0f0; // WINDOWS .win32 { - } // LINUX @@ -17,182 +15,183 @@ .linux { } - // MAC -.darwin, .linux { - body { - background: @colorOSBackgroundFocus; - - &.app-blur { - background: @colorOSBackgroundBlur; - } -} - - -.darwin { - aside { - top: @gridHeight * 2; - height: calc(100% - @gridHeight * 2); - } - - div.browser-bar { - top: @gridHeight * 1.5; - } +.darwin, +.linux { + body { + background: @colorOSBackgroundFocus; - .node-info { - top: @gridHeight; - } + &.app-blur { + background: @colorOSBackgroundBlur; } -} + } + .darwin { + aside { + top: @gridHeight * 2; + height: calc(100% - @gridHeight * 2); + } -body, html { - height: 100%; - padding: 0; - margin: 0; - overflow: hidden; - background: @colorWinBackgroundFocus; + div.browser-bar { + top: @gridHeight * 1.5; + } - &.app-blur { - background: @colorWinBackgroundBlur; + .node-info { + top: @gridHeight; } + } +} - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; +body, +html { + height: 100%; + padding: 0; + margin: 0; + overflow: hidden; + background: @colorWinBackgroundFocus; + + &.app-blur { + background: @colorWinBackgroundBlur; + } + + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } -h1, h2, h3, p { - cursor: default; +h1, +h2, +h3, +p { + cursor: default; } pre { - .allowSelection; - cursor: text; + .allowSelection; + cursor: text; } -a h1, a h2, a h3, a p, -button h1, button h2, button h3, button p { - cursor: pointer; +a h1, +a h2, +a h3, +a p, +button h1, +button h2, +button h3, +button p { + cursor: pointer; } - - main { - z-index: 1; - position: absolute; - right: 0; - left: @widthSideBar; - top: 0; - bottom: 0; + z-index: 1; + position: absolute; + right: 0; + left: @widthSideBar; + top: 0; + bottom: 0; } .drag-bar { - position: absolute; - top: 0; - left: 0; - right: 0; - height: 30px; - -webkit-user-select: none; - -webkit-app-region: drag; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 30px; + -webkit-user-select: none; + -webkit-app-region: drag; } - // Fading Mist interface when sendTransactionConfirmationPopup is shown. html { - &.has-blur-overlay { - pointer-events: none; - opacity: 0.7; - body { - -webkit-filter: blur(3px); - transform: scale(1.001) translate3d(0,0,0); - } + &.has-blur-overlay { + pointer-events: none; + opacity: 0.7; + body { + -webkit-filter: blur(3px); + transform: scale(1.001) translate3d(0, 0, 0); } + } } - .webview { - position: absolute; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + border-left: 1px solid #e2e2e2; + background: #fff; + overflow: hidden; + opacity: 1; + z-index: 10; + + &.hidden { + z-index: 0; + } + + &.app-bar-transparent webview { top: 0; - left: 0; - right: 0; - bottom: 0; - border-left: 1px solid #E2E2E2; - background: #FFF; - overflow: hidden; - opacity: 1; - z-index: 10; - - &.hidden { - z-index: 0; - } - - &.app-bar-transparent webview { - top: 0; - margin-top: 0; - } + margin-top: 0; + } } webview { - position: absolute; - top: @gridHeight * 1.5; - left: 0; - right: 0; - bottom: 0; - overflow: hidden; - margin-top: @gridHeight*2; - border-top: solid 1px rgba(0, 0, 0, 0.1); + position: absolute; + top: @gridHeight * 1.5; + left: 0; + right: 0; + bottom: 0; + overflow: hidden; + margin-top: @gridHeight*2; + border-top: solid 1px rgba(0, 0, 0, 0.1); } .linux webview { - top: 0; + top: 0; } - // Scrollbars // Reference: https://gist.github.com/devinrhode2/2573411 aside.sidebar { - ::-webkit-scrollbar { - width: 7px; - background-color: rgba(0,0,0,0); - -webkit-border-radius: 100px; - } - ::-webkit-scrollbar-thumb { - background-color: rgba(0, 0, 0, 0.09); - } - + ::-webkit-scrollbar { + width: 7px; + background-color: rgba(0, 0, 0, 0); + -webkit-border-radius: 100px; + } + ::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, 0.09); + } + + ::-webkit-scrollbar-thumb:vertical { + background: rgba(0, 0, 0, 0.5); + -webkit-border-radius: 100px; + } + ::-webkit-scrollbar-thumb:vertical:active { + background: rgba(0, 0, 0, 0.61); + -webkit-border-radius: 100px; + background-clip: padding-box; + border: 2px solid rgba(0, 0, 0, 0); + } + + ::-webkit-scrollbar { + width: 10px; + } + + ::-webkit-scrollbar-thumb:vertical { + background-clip: padding-box; + border: 2px solid rgba(0, 0, 0, 0); + min-height: 30px; + } + + .submenu-container { ::-webkit-scrollbar-thumb:vertical { - background: rgba(0,0,0,0.5); - -webkit-border-radius: 100px; + background: rgba(255, 255, 255, 0.5); + border: 2px solid rgba(0, 0, 0, 0); + background-clip: padding-box; } ::-webkit-scrollbar-thumb:vertical:active { - background: rgba(0,0,0,0.61); - -webkit-border-radius: 100px; - background-clip: padding-box; + background: rgba(255, 255, 255, 0.61); border: 2px solid rgba(0, 0, 0, 0); + background-clip: padding-box; } - - ::-webkit-scrollbar { - width: 10px; - } - - ::-webkit-scrollbar-thumb:vertical { - background-clip: padding-box; - border: 2px solid rgba(0, 0, 0, 0); - min-height: 30px; - } - - .submenu-container { - ::-webkit-scrollbar-thumb:vertical { - background: rgba(255,255,255,0.5); - border: 2px solid rgba(0, 0, 0, 0); - background-clip: padding-box; - } - ::-webkit-scrollbar-thumb:vertical:active { - background: rgba(255,255,255,0.61); - border: 2px solid rgba(0, 0, 0, 0); - background-clip: padding-box; - } - - } - + } } diff --git a/interface/client/styles/menu.import.less b/interface/client/styles/menu.import.less index 387749c2a..378c6f640 100644 --- a/interface/client/styles/menu.import.less +++ b/interface/client/styles/menu.import.less @@ -1,316 +1,335 @@ .gradient-tip { - content: ''; - display: block; - width: 100%; - height: @gridHeight * 0.75; - left: 0px; - position: absolute; - pointer-events: none; + content: ''; + display: block; + width: 100%; + height: @gridHeight * 0.75; + left: 0px; + position: absolute; + pointer-events: none; } .sidePadding { - padding-left: 11px; - padding-right: 11px; + padding-left: 11px; + padding-right: 11px; } // OS-specific styles html.darwin aside.sidebar { - top: @gridHeight; + top: @gridHeight; - &::after { - top: @gridHeight; - } - nav { - margin-top: @gridHeight; - } + &::after { + top: @gridHeight; + } + nav { + margin-top: @gridHeight; + } } aside.sidebar { - display: flex; - flex-flow: column nowrap; - justify-content: space-between; - - z-index: 4; - position: absolute; + display: flex; + flex-flow: column nowrap; + justify-content: space-between; + + z-index: 4; + position: absolute; + top: @gridHeight / 2; + left: 0; + bottom: 0; + width: @widthSideBar; + + &::after { + .gradient-tip(); top: @gridHeight / 2; - left: 0; - bottom: 0; - width: @widthSideBar; - - &::after { - .gradient-tip(); - top: @gridHeight / 2; - height: 8px; - background-image: linear-gradient(to top, rgba(241, 241, 241, 0) 0%, rgba(241, 241, 241, 1) 100%); + height: 8px; + background-image: linear-gradient( + to top, + rgba(241, 241, 241, 0) 0%, + rgba(241, 241, 241, 1) 100% + ); + } + + nav { + position: relative; + margin-top: @gridHeight / 2; + padding: 0 12px 0; + overflow: hidden; + min-height: 0; + &:hover { + overflow-y: auto; } - nav { - position: relative; - margin-top: @gridHeight / 2; - padding: 0 12px 0; + > ul { + margin: 6px 0; + padding: 0; + width: 54px; + + > li { overflow: hidden; - min-height: 0; + margin-bottom: 14px; + transition-delay: 200ms; + + // draggable LI + &.ui-sortable-helper { + transform: scale(1.1); + .submenu-container { + display: none; + } + } + &:hover { - overflow-y: auto; + .submenu-container { + opacity: 1; + visibility: visible; + } } - > ul { - margin: 6px 0; - padding: 0; + &.selected, + &:active, + &:hover, + &:focus { + button.main { + opacity: 1; + } + } + button.main { + height: 55px; + width: 54px; + display: block; + opacity: 0.6; + transition: 100ms opacity linear; + + &:focus { + outline: 0; + border: none; + } + + .icon-globe { + font-size: 32px; + text-align: center; + display: block; + background-color: #fff; + padding-top: 10px; + } + + img, + .icon-globe { width: 54px; + height: 54px; + -webkit-mask-image: url('icons/mask-icon.svg'); + -webkit-mask-size: cover; + } + } + } + } - > li { - overflow: hidden; - margin-bottom: 14px; - transition-delay: 200ms; - - // draggable LI - &.ui-sortable-helper { - transform: scale(1.1); - .submenu-container { - display: none; - } - } - - &:hover { - .submenu-container { - opacity: 1; - visibility: visible; - } - } - - &.selected, &:active, &:hover, &:focus { - button.main { - opacity: 1; - } - } - button.main { - height: 55px; - width: 54px; - display: block; - opacity: .6; - transition: 100ms opacity linear; - - &:focus { - outline: 0; - border: none; - } - - .icon-globe { - font-size: 32px; - text-align: center; - display: block; - background-color: #fff; - padding-top: 10px; - } - - img, .icon-globe { - width: 54px; - height: 54px; - -webkit-mask-image: url('icons/mask-icon.svg'); - -webkit-mask-size: cover; - } - } - } + .submenu-container { + width: 185px; + position: fixed; + left: 90px; + top: 120px; + border-radius: 5px; + z-index: 1000; + visibility: hidden; + opacity: 0; + cursor: default; + + transition: 150ms linear all, 1ms linear top; + transition-delay: 200ms; + transform: translateY(-11px); + // backdrop-filter: blur(0); + + &::before { + @tipSize: 8px; + content: ''; + margin-left: -@tipSize; + margin-top: 19px + 11px; + display: block; + position: absolute; + width: 0px; + height: @tipSize * 2.25; + border: 0px solid transparent; + border-width: @tipSize; + border-left: 0; + border-right-color: rgba(0, 0, 0, 0.78); + } + + button { + &:active, + &:focus { + transform: none; + border: none; } + } + + section { + padding: 8px 0 0; + background-color: rgba(0, 0, 0, 0.78); + // backdrop-filter: blur(5px); + width: 100%; + border-radius: 5px; + color: #fff; + position: relative; - .submenu-container { - width: 185px; - position: fixed; - left: 90px; - top: 120px; - border-radius: 5px; - z-index: 1000; - visibility: hidden; - opacity: 0; - cursor: default; - - transition: 150ms linear all, 1ms linear top; - transition-delay: 200ms; - transform: translateY(-11px); - // backdrop-filter: blur(0); - - &::before { - @tipSize: 8px; - content: ''; - margin-left: -@tipSize; - margin-top: 19px + 11px; - display: block; - position: absolute; - width: 0px; - height: @tipSize * 2.25; - border: 0px solid transparent; - border-width: @tipSize; - border-left: 0; - border-right-color: rgba(0,0,0,0.78); - } + header { + .sidePadding(); + padding-bottom: 11px; + } + span { + font-weight: 400; + } + a, + button { + color: #fff; + } + .badge { + font-size: 11px; + } + .remove-tab { + color: #a6a6a6; + position: absolute; + right: 5px; + top: 4px; + width: 14px; + &:hover { + color: #fff; + } + } - button { - &:active, &:focus { - transform: none; - border: none; - } + .accounts { + margin-top: 11px; + button { + font-size: 12px; + font-weight: 300; + text-transform: uppercase; + width: 100%; + } + .connect { + background-color: #4c92e6; + border-radius: 4px; + padding: 3px 0; + } + .display { + @identiconHeight: 17px; + text-align: left; + line-height: @identiconHeight; + + .dapp-identicon-container { + float: right; + height: @identiconHeight; } - section { - padding: 8px 0 0; - background-color: rgba(0, 0, 0, 0.78); - // backdrop-filter: blur(5px); - width: 100%; - border-radius: 5px; - color: #fff; - position: relative; - - header { - .sidePadding(); - padding-bottom: 11px; - } - span { - font-weight: 400; - } - a, button { - color: #fff; - } - .badge { - font-size: 11px; - } - .remove-tab { - color: #A6A6A6; - position: absolute; - right: 5px; - top: 4px; - width: 14px; - &:hover { - color: #fff; - } - } - - .accounts { - margin-top: 11px; - button { - font-size: 12px; - font-weight: 300; - text-transform: uppercase; - width: 100%; - } - .connect { - background-color: #4C92E6; - border-radius: 4px; - padding: 3px 0; - } - .display { - @identiconHeight: 17px; - text-align: left; - line-height: @identiconHeight; - - .dapp-identicon-container { - float: right; - height: @identiconHeight; - } - - .dapp-identicon { - margin-right: 0px; - width: @identiconHeight; - height: @identiconHeight; - &:not(:last-child) { - margin-right: 4px; - } - } - } - } + .dapp-identicon { + margin-right: 0px; + width: @identiconHeight; + height: @identiconHeight; + &:not(:last-child) { + margin-right: 4px; + } } - - .sub-menu { - margin: 6px 0; - padding: 0; - border-top: 1px solid rgba(255, 255, 255, 0.2); - overflow-y: auto; - overflow-x: hidden; - padding-bottom: 0.1em; - margin-top: 2px; - margin-bottom: 0; - li { - opacity: 1; - font-weight: normal; - font-size: 14px; - margin-bottom: 0; - button { - padding: 8px 0 6px; - .sidePadding(); - box-sizing: border-box; - width: 100%; - text-align: left; - background-color: rgba(255, 255, 255, 0); - transition: 150ms linear background-color; - - margin: 5px 0; - display: -webkit-box; - -webkit-line-clamp: 2; // 2 lines max - -webkit-box-orient: vertical; - overflow: hidden; - text-overflow: ellipsis; - &:hover { - background-color: rgba(255, 255, 255, 0.2); - } - .badge { - display: block; - opacity: .8; - } - } - } + } + } + } + + .sub-menu { + margin: 6px 0; + padding: 0; + border-top: 1px solid rgba(255, 255, 255, 0.2); + overflow-y: auto; + overflow-x: hidden; + padding-bottom: 0.1em; + margin-top: 2px; + margin-bottom: 0; + li { + opacity: 1; + font-weight: normal; + font-size: 14px; + margin-bottom: 0; + button { + padding: 8px 0 6px; + .sidePadding(); + box-sizing: border-box; + width: 100%; + text-align: left; + background-color: rgba(255, 255, 255, 0); + transition: 150ms linear background-color; + + margin: 5px 0; + display: -webkit-box; + -webkit-line-clamp: 2; // 2 lines max + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; + &:hover { + background-color: rgba(255, 255, 255, 0.2); + } + .badge { + display: block; + opacity: 0.8; } + } } + } } + } - .node-info { - position: relative; - cursor: default; - - &::after { - .gradient-tip(); - height: 20px; - top: -(20px - 1); - background-image: linear-gradient(to bottom, rgba(241, 241, 241, 0) 0%, rgba(241, 241, 241, 1) 100%); - } + .node-info { + position: relative; + cursor: default; - display: flex; - flex-flow: row wrap; - flex-shrink: 0; - padding: 8px; - font-size: 0.9em; - color: @colorTextSecondary; + &::after { + .gradient-tip(); + height: 20px; + top: -(20px - 1); + background-image: linear-gradient( + to bottom, + rgba(241, 241, 241, 0) 0%, + rgba(241, 241, 241, 1) 100% + ); + } - div, span { - padding: @gridHeight/2 1px; - flex: 1; - text-align: center; - } + display: flex; + flex-flow: row wrap; + flex-shrink: 0; + padding: 8px; + font-size: 0.9em; + color: @colorTextSecondary; + + div, + span { + padding: @gridHeight / 2 1px; + flex: 1; + text-align: center; + } - i { - display: block; - margin-bottom: 2px; - } + i { + display: block; + margin-bottom: 2px; + } - progress { - flex: 1 100%; - } + progress { + flex: 1 100%; + } - .mining-indicator { - flex: 3; - } + .mining-indicator { + flex: 3; + } - .block-number { - flex: 2; - white-space: nowrap; - } + .block-number { + flex: 2; + white-space: nowrap; + } - .test-chain { - flex: 1 100%; - padding: 1px 5px 2px; - } + .test-chain { + flex: 1 100%; + padding: 1px 5px 2px; } + } } .app-blur aside.newsidebar nav::after { - background-image: linear-gradient(to bottom, rgba(246, 246, 246, 0) 0%, rgba(246, 246, 246, 1) 100%); + background-image: linear-gradient( + to bottom, + rgba(246, 246, 246, 0) 0%, + rgba(246, 246, 246, 1) 100% + ); } diff --git a/interface/client/styles/mixins.import.less b/interface/client/styles/mixins.import.less index 415642074..7d3591fdb 100644 --- a/interface/client/styles/mixins.import.less +++ b/interface/client/styles/mixins.import.less @@ -1,19 +1,17 @@ - - .allowSelection { - -webkit-touch-callout: initial; - -webkit-user-select: initial; - -khtml-user-select: initial; - -moz-user-select: initial; - -ms-user-select: initial; - user-select: initial; + -webkit-touch-callout: initial; + -webkit-user-select: initial; + -khtml-user-select: initial; + -moz-user-select: initial; + -ms-user-select: initial; + user-select: initial; } .disallowSelection { - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none -} \ No newline at end of file + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} diff --git a/interface/client/styles/networkIndicator.import.less b/interface/client/styles/networkIndicator.import.less index 0cc4165a0..b469f69fe 100644 --- a/interface/client/styles/networkIndicator.import.less +++ b/interface/client/styles/networkIndicator.import.less @@ -1,27 +1,27 @@ // Applies to both onboarding and splash screen .network-indicator { - position: absolute; - top: 10px; - right: 10px; - left: 10px; - text-align: right; - font-weight: 600; - font-size: 80%; - opacity: 0.8; - color: @colorGrey; - text-transform: uppercase; + position: absolute; + top: 10px; + right: 10px; + left: 10px; + text-align: right; + font-weight: 600; + font-size: 80%; + opacity: 0.8; + color: @colorGrey; + text-transform: uppercase; } // Applies only to the splash screen .splash-screen .network-indicator .unknown { - position: absolute; - top: 155px; - text-align: center; - left: 10px; - right: 10px; - font-size: 110%; - opacity: 0.8; - font-weight: normal; - text-transform: none; - color: #fff; -} \ No newline at end of file + position: absolute; + top: 155px; + text-align: center; + left: 10px; + right: 10px; + font-size: 110%; + opacity: 0.8; + font-weight: normal; + text-transform: none; + color: #fff; +} diff --git a/interface/client/styles/popupWindows.import.less b/interface/client/styles/popupWindows.import.less index f71fb28ad..6f07dd51e 100644 --- a/interface/client/styles/popupWindows.import.less +++ b/interface/client/styles/popupWindows.import.less @@ -1,601 +1,622 @@ @-webkit-keyframes slideInLeft { - from { - transform: translate3d(50%, 0, 0) rotate(45deg); - opacity: 0; - } - to { - transform: translate3d(0, 0, 0); - opacity: 1; - } + from { + transform: translate3d(50%, 0, 0) rotate(45deg); + opacity: 0; + } + to { + transform: translate3d(0, 0, 0); + opacity: 1; + } } @-webkit-keyframes slideInRight { - from { - transform: translate3d(-50%, 0, 0) rotate(-45deg); - opacity: 0; - } - to { - transform: none; - opacity: 1; - } + from { + transform: translate3d(-50%, 0, 0) rotate(-45deg); + opacity: 0; + } + to { + transform: none; + opacity: 1; + } } @-webkit-keyframes fadeIn { - from { - opacity: 0; - } - to { - opacity: 1; - } + from { + opacity: 0; + } + to { + opacity: 1; + } } .popup-windows { - text-align: center; - height: 100vh; - - a, - button { - color: @colorLinkActive; - } - a:focus { - color: @colorLinkFocus; - } - - h3 { - color: @colorGrayDark; - a { - float: right; - font-weight: 400; - } - } - img.left-overlay { - position: relative; - top: -40px; - left: -160%; - width: 300%; - z-index: 1; - } - - footer { - position: fixed; - bottom: 0; - left: 0; - right: 0; - padding: 0 @gridHeight; - padding-top: @gridHeight * 3; - background: linear-gradient(transparent 0%, @colorGrayLight 35%); - - &.dapp-small { - background: linear-gradient(transparent 50%, @colorGrayLight 70%); + text-align: center; + height: 100vh; + + a, + button { + color: @colorLinkActive; + } + a:focus { + color: @colorLinkFocus; + } + + h3 { + color: @colorGrayDark; + a { + float: right; + font-weight: 400; + } + } + img.left-overlay { + position: relative; + top: -40px; + left: -160%; + width: 300%; + z-index: 1; + } + + footer { + position: fixed; + bottom: 0; + left: 0; + right: 0; + padding: 0 @gridHeight; + padding-top: @gridHeight * 3; + background: linear-gradient(transparent 0%, @colorGrayLight 35%); + + &.dapp-small { + background: linear-gradient(transparent 50%, @colorGrayLight 70%); + } + } + + .info.dapp-error { + color: @colorError; + font-weight: 600; + } + + &.update-available { + -webkit-user-select: auto; + user-select: auto; + + .text { + text-align: left; + } + h1 { + font-size: 200%; + margin-bottom: 20px; + + &.no-update { + font-size: 180%; + } + } + } + &.tx-info { + .container { + overflow: auto; + height: 80vh; + padding-bottom: 120px; + } + + .transaction-parties { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + margin: 0 @gridWidth; + + > div { + // flex: 1 1 auto; + color: @colorTextSecondary; + position: relative; + } + + div.connection { + padding: @gridHeight @gridWidth / 2; + } + + div.amount, + div.function-signature { + flex: 1 50%; + } + + // amount + div.amount { + position: relative; + margin-top: -30px; + height: 40px; + font-size: 1.5em; + color: darken(@colorTextSecondary, 8%); + border-bottom: 1px solid @colorTextSecondary; + &:after { + content: ''; + position: absolute; + bottom: -5px; + right: 0; + border: 5px solid @colorTextSecondary; + border-color: transparent @colorTextSecondary @colorTextSecondary + transparent; + .rotate(-45deg); + } + .unit { + font-size: 0.6em; + font-weight: 400; + } + .execute-function { + display: block; + position: absolute; + bottom: -30px; + left: 0; + right: 0; + font-size: 0.6em; + text-align: center; + font-weight: 600; } - } - - .info.dapp-error{ - color: @colorError; - font-weight: 600; - } - - &.update-available { - -webkit-user-select: auto; - user-select: auto; - - .text { - text-align: left; - } - h1 { - font-size: 200%; - margin-bottom: 20px; - - &.no-update { - font-size: 180%; - } - } - } - &.tx-info { - - .container { - overflow: auto; - height: 80vh; - padding-bottom: 120px; - } - - .transaction-parties { - display: flex; - flex-direction: row; - align-items: center; - justify-content: center; - margin: 0 @gridWidth; - - > div { - // flex: 1 1 auto; - color: @colorTextSecondary; - position: relative; - } - - div.connection { - padding: @gridHeight @gridWidth/2; - } - - div.amount, div.function-signature { - flex: 1 50%; - } - - // amount - div.amount { - position: relative; - margin-top: -30px; - height: 40px; - font-size: 1.5em; - color: darken(@colorTextSecondary, 8%); - border-bottom: 1px solid @colorTextSecondary; - &:after { - content: ''; - position: absolute; - bottom: -5px; - right: 0; - border: 5px solid @colorTextSecondary; - border-color: transparent @colorTextSecondary @colorTextSecondary transparent; - .rotate(-45deg); - } - .unit { - font-size: 0.6em; - font-weight: 400; - } - .execute-function { - display: block; - position: absolute; - bottom: -30px; - left: 0; - right: 0; - font-size: 0.6em; - text-align: center; - font-weight: 600; - } - } - .function-signature { - font-weight: 400; - font-size: 1.5em; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - text-transform: uppercase; - max-width: @gridWidth * 10; - - &.has-signature { - text-transform: none; - } + } + .function-signature { + font-weight: 400; + font-size: 1.5em; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + text-transform: uppercase; + max-width: @gridWidth * 10; + + &.has-signature { + text-transform: none; + } + } + } + table, + .data, + .parameters, + .fees, + .info { + width: 420px; + margin: @defaultMargin*2 auto; + } + table { + td:nth-child(1) { + text-align: left; + } + td:nth-child(2) { + text-align: right; + font-weight: 400; + } + } + + // Parameters + .fees, + .parameters { + font-size: 0.9em; + text-align: left; + ul, + ol { + counter-reset: item; + padding: 0; + list-style-type: none; + list-style-position: inside; + li { + display: flex; + min-height: @gridHeight * 2; + align-items: center; + + .allowSelection; + font-weight: 200; + transition: background 0.5s ease-out; + + & > div { + padding: 0 @gridWidth / 4; + } + .value { + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + .icon { + position: relative; + top: 1px; } - } - table, - .data, - .parameters, - .fees, - .info { - width: 420px; - margin: @defaultMargin*2 auto; - } - table { - td:nth-child(1) { - text-align: left; - } - td:nth-child(2) { - text-align: right; - font-weight: 400; - } - } - - // Parameters - .fees, - .parameters { - font-size: 0.9em; - text-align: left; - ul, ol { - counter-reset: item; - padding: 0; - list-style-type: none; - list-style-position: inside; - li { - display: flex; - min-height: @gridHeight * 2; - align-items: center; - - .allowSelection; - font-weight: 200; - transition: background 0.5s ease-out; - - &> div { - padding: 0 @gridWidth/4; - } - .value { - flex: 1; - overflow: hidden; - text-overflow: ellipsis; - .icon { - position: relative; - top: 1px; - } - &:hover strong { - word-break: break-all; - } - - } - .type { - text-align: right; - max-width: @gridWidth * 10; - } - - &:hover { - background-color: #FFF; - transition: background 0.1s ease-in; - } - } - - ::selection { - color: #FFF; - background: @colorLink; - } + &:hover strong { + word-break: break-all; } + } + .type { + text-align: right; + max-width: @gridWidth * 10; + } - ol li::before { - counter-increment: item; - content: counter(item); - opacity: 0.5; - color: @colorGrayDark; - font-weight: 400; - } + &:hover { + background-color: #fff; + transition: background 0.1s ease-in; + } } - .overlap-icon { - position: absolute; - top: 34px; - font-size: 18px; - text-align: center; - color: #FFF; - width: @gridWidth*2; - opacity: 0.75; - text-shadow: 0 1px 1px rgba(0,0,0,0.5); - - } - .circle-icon { - display: inline-block; - background-color: @colorGrayLight; - .border-radius(50%); - font-size: 33px; - padding: @defaultMargin; - // + span { - // display: inline-block; - // } - } - .provided-gas { - display: inline; - width: 70px; - padding: 0; - margin: 0; - color: @colorLink; - background-color: transparent; - border: 0; - text-align: right; - border-bottom: 1px dotted @colorLink; - &:focus { - outline: 0; - } - } - input[type="password"] { - width: @gridWidth * 12; - } - .data, - .info { - text-align: left; - padding: 0 @defaultMargin/2; - } - .data { - font-size: 0.9em; - pre { - margin: 0 -@defaultMargin; - overflow: auto; - height: 90px; - background-color: @colorGrayLight; //lighten(@colorGray, 10%); - color: @colorTextPrimary; - span.zero { - color: fadeout(@colorTextSecondary, 30%); - } - span.function { - font-weight: 600; - } - } - } - } - &.request-account { - h1 { - margin-bottom: 20px; - } - .fields-container { - // addresses - > div:nth-child(odd) { - position: relative; - padding: 0 @defaultMargin*2; - font-weight: 400; - } - > div:nth-child(1) { - .overlap-icon { - right: @defaultMargin * 1.25; - } - } - > div:nth-child(3) { - .overlap-icon { - left: @defaultMargin * 1; - } - } - // amount - > div.amount { - position: relative; - margin-top: -30px; - height: 40px; - width: @defaultMargin * 10; - font-size: 1.5em; - color: darken(@colorTextSecondary, 8%); - border-bottom: 1px solid @colorTextSecondary; - - &:after { - content: ''; - position: absolute; - bottom: -5px; - right: 0; - border: 5px solid @colorTextSecondary; - border-color: transparent @colorTextSecondary @colorTextSecondary transparent; - .rotate(-45deg); - } - - .unit { - font-size: 0.6em; - font-weight: 400; - } - } + ::selection { + color: #fff; + background: @colorLink; } - - table, - .data, - .info { - width: 420px; - margin: @defaultMargin*2 auto; + } + + ol li::before { + counter-increment: item; + content: counter(item); + opacity: 0.5; + color: @colorGrayDark; + font-weight: 400; + } + } + + .overlap-icon { + position: absolute; + top: 34px; + font-size: 18px; + text-align: center; + color: #fff; + width: @gridWidth*2; + opacity: 0.75; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5); + } + .circle-icon { + display: inline-block; + background-color: @colorGrayLight; + .border-radius(50%); + font-size: 33px; + padding: @defaultMargin; + // + span { + // display: inline-block; + // } + } + .provided-gas { + display: inline; + width: 70px; + padding: 0; + margin: 0; + color: @colorLink; + background-color: transparent; + border: 0; + text-align: right; + border-bottom: 1px dotted @colorLink; + &:focus { + outline: 0; + } + } + input[type='password'] { + width: @gridWidth * 12; + } + .data, + .info { + text-align: left; + padding: 0 @defaultMargin / 2; + } + .data { + font-size: 0.9em; + pre { + margin: 0 -@defaultMargin; + overflow: auto; + height: 90px; + background-color: @colorGrayLight; //lighten(@colorGray, 10%); + color: @colorTextPrimary; + span.zero { + color: fadeout(@colorTextSecondary, 30%); } - table { - - td:nth-child(1) { - text-align: left; - } - td:nth-child(2) { - text-align: right; - font-weight: 400; - } + span.function { + font-weight: 600; } - + } + } + } + &.request-account { + h1 { + margin-bottom: 20px; + } + .fields-container { + // addresses + > div:nth-child(odd) { + position: relative; + padding: 0 @defaultMargin*2; + font-weight: 400; + } + > div:nth-child(1) { .overlap-icon { - position: absolute; - top: 20px; - font-size: 20px; + right: @defaultMargin * 1.25; } - .circle-icon { - display: inline-block; - background-color: @colorGrayLight; - .border-radius(50%); - font-size: 33px; - padding: @defaultMargin; - - // + span { - // display: inline-block; - // } + } + > div:nth-child(3) { + .overlap-icon { + left: @defaultMargin * 1; } - - .provided-gas { - display: inline; - width: 70px; - padding: 0; - margin: 0; - color: @colorLink; - background-color: transparent; - border: 0; - text-align: right; - border-bottom: 1px dotted @colorLink; - - &:focus { - outline: 0; - } + } + // amount + > div.amount { + position: relative; + margin-top: -30px; + height: 40px; + width: @defaultMargin * 10; + font-size: 1.5em; + color: darken(@colorTextSecondary, 8%); + border-bottom: 1px solid @colorTextSecondary; + + &:after { + content: ''; + position: absolute; + bottom: -5px; + right: 0; + border: 5px solid @colorTextSecondary; + border-color: transparent @colorTextSecondary @colorTextSecondary + transparent; + .rotate(-45deg); } - .show-password-container { - width: 300px; - margin: 0 auto 0; - padding: 12px 0 0; - text-align: left; - input[type=checkbox] { - margin-left: 16px; - } - label { - position: relative; - top: -7px; - left: 6px; - opacity: 0.9; - font-size: 14px; - } - } - } - &.connect-account { - text-align: left; - box-sizing: border-box; - margin: 0 auto; - padding: 0 60px; - form { - display: -webkit-flex; - display: flex; - flex-direction: column; - align-content: space-between; - height: 100vh; - - > * { - flex: 0; - } - } - p strong { - font-weight: 400; - } - .account-dapp-user-container { - display: -webkit-flex; - display: flex; - height: 64px; - justify-content: center; - align-items: center; - margin: 30px 0 15px; - flex: 0 64px; - } - .account-dapp-user { - margin: 0 5px; - position: relative; - width: 120px; - height: 64px; - & > * { - position: absolute; - top: 0; - display: inline-block; - width: 64px; - height: 64px; - border-radius: 50%; - &.is-empty { - background-color: #6E6C6F; - border-radius: 50%; - i { - color: #fff; - display: block; - text-align: center; - line-height: 64px; - font-size: 2.8em; - } - } - &.no-account { - background-image: url(/images/anonymous-icon.png); - background-size: cover; - background-position: 50%; - } - } - .user-icon, - .simptip-position-left { - z-index: 2; - left: 0; - animation: .7s cubic-bezier(0, 0, 0.13, 1) slideInLeft; - &:first-child {left: 0px;} - &:nth-of-type(2) { left: 5px; } - &:nth-of-type(3) { left: 10px; } - &:nth-of-type(4) { left: 15px; } - &:nth-of-type(5) { left: 20px; } - &:nth-of-type(6) { left: 25px; } - } - .app-icon { - z-index: 1; - left: 55px; - animation: .7s cubic-bezier(0, 0, 0.13, 1) slideInRight; - } - } - .dapp-account-list { - flex-grow: 5; - position: relative; - overflow: auto; - padding: 0; - margin: 0; - &::after { - - position: fixed; - content: ''; - display: block; - bottom: 130px; - width: 100%; - height: @gridHeight * 1.5; - pointer-events: none; - background: -webkit-linear-gradient(top, rgba(241, 241, 241, 0), rgba(241, 241, 241, 1)); - } - li:last-child { - margin-bottom: 25px; - } - } - .create-account-icon { - background-color: @colorLinkActive; - box-shadow: none; - &:after { - color: #fff; - content: '+'; - display: block; - text-align: center; - line-height: 32px; - font-size: 1.7em; - font-weight: 400; - } - } - .checkbox-container { - display: flex; - flex: 0 50px; - padding: 1em 0; - input { - margin-right: 6px; - } - label { - color: @colorLinkActive; - font-weight: 500; - } - } - .dapp-modal-buttons { - flex: 0 62px; - } - .dapp-modal-buttons, - .dapp-modal-buttons button:last-of-type { - margin-right: 0; - } - span.account-address, - span.dapp-url { - animation: .9s cubic-bezier(0.74, 0, 1, 0.29) fadeIn; - display: inline-block; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; - width: 100px; - font-size: 14px; - color: #AEAEAE; - } - - .data, - .info { - text-align: left; - padding: 0 @defaultMargin/2; - position: relative; - .toggle-panel { - position: absolute; - right: 0; - top: 0; - font-weight: 500; - font-size: 0.8em; - } + .unit { + font-size: 0.6em; + font-weight: 400; } - .data { - font-size: 0.9em; - - pre { - margin: 0 -@defaultMargin; - overflow: auto; - height: 90px; - background-color: @colorGrayLight;//lighten(@colorGray, 10%); - color: @colorTextPrimary; - - span.zero { - color: fadeout(@colorTextSecondary, 30%); - } - span.function { - font-weight: 600; - } - } + } + } + + table, + .data, + .info { + width: 420px; + margin: @defaultMargin*2 auto; + } + table { + td:nth-child(1) { + text-align: left; + } + td:nth-child(2) { + text-align: right; + font-weight: 400; + } + } + + .overlap-icon { + position: absolute; + top: 20px; + font-size: 20px; + } + .circle-icon { + display: inline-block; + background-color: @colorGrayLight; + .border-radius(50%); + font-size: 33px; + padding: @defaultMargin; + + // + span { + // display: inline-block; + // } + } + + .provided-gas { + display: inline; + width: 70px; + padding: 0; + margin: 0; + color: @colorLink; + background-color: transparent; + border: 0; + text-align: right; + border-bottom: 1px dotted @colorLink; + + &:focus { + outline: 0; + } + } + + .show-password-container { + width: 300px; + margin: 0 auto 0; + padding: 12px 0 0; + text-align: left; + input[type='checkbox'] { + margin-left: 16px; + } + label { + position: relative; + top: -7px; + left: 6px; + opacity: 0.9; + font-size: 14px; + } + } + } + &.connect-account { + text-align: left; + box-sizing: border-box; + margin: 0 auto; + padding: 0 60px; + form { + display: -webkit-flex; + display: flex; + flex-direction: column; + align-content: space-between; + height: 100vh; + + > * { + flex: 0; + } + } + p strong { + font-weight: 400; + } + .account-dapp-user-container { + display: -webkit-flex; + display: flex; + height: 64px; + justify-content: center; + align-items: center; + margin: 30px 0 15px; + flex: 0 64px; + } + .account-dapp-user { + margin: 0 5px; + position: relative; + width: 120px; + height: 64px; + & > * { + position: absolute; + top: 0; + display: inline-block; + width: 64px; + height: 64px; + border-radius: 50%; + &.is-empty { + background-color: #6e6c6f; + border-radius: 50%; + i { + color: #fff; + display: block; + text-align: center; + line-height: 64px; + font-size: 2.8em; + } } - - } + &.no-account { + background-image: url(/images/anonymous-icon.png); + background-size: cover; + background-position: 50%; + } + } + .user-icon, + .simptip-position-left { + z-index: 2; + left: 0; + animation: 0.7s cubic-bezier(0, 0, 0.13, 1) slideInLeft; + &:first-child { + left: 0px; + } + &:nth-of-type(2) { + left: 5px; + } + &:nth-of-type(3) { + left: 10px; + } + &:nth-of-type(4) { + left: 15px; + } + &:nth-of-type(5) { + left: 20px; + } + &:nth-of-type(6) { + left: 25px; + } + } + .app-icon { + z-index: 1; + left: 55px; + animation: 0.7s cubic-bezier(0, 0, 0.13, 1) slideInRight; + } + } + .dapp-account-list { + flex-grow: 5; + position: relative; + overflow: auto; + padding: 0; + margin: 0; + &::after { + position: fixed; + content: ''; + display: block; + bottom: 130px; + width: 100%; + height: @gridHeight * 1.5; + pointer-events: none; + background: -webkit-linear-gradient( + top, + rgba(241, 241, 241, 0), + rgba(241, 241, 241, 1) + ); + } + li:last-child { + margin-bottom: 25px; + } + } + .create-account-icon { + background-color: @colorLinkActive; + box-shadow: none; + &:after { + color: #fff; + content: '+'; + display: block; + text-align: center; + line-height: 32px; + font-size: 1.7em; + font-weight: 400; + } + } + .checkbox-container { + display: flex; + flex: 0 50px; + padding: 1em 0; + input { + margin-right: 6px; + } + label { + color: @colorLinkActive; + font-weight: 500; + } + } + .dapp-modal-buttons { + flex: 0 62px; + } + .dapp-modal-buttons, + .dapp-modal-buttons button:last-of-type { + margin-right: 0; + } + span.account-address, + span.dapp-url { + animation: 0.9s cubic-bezier(0.74, 0, 1, 0.29) fadeIn; + display: inline-block; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + width: 100px; + font-size: 14px; + color: #aeaeae; + } + + .data, + .info { + text-align: left; + padding: 0 @defaultMargin / 2; + position: relative; + .toggle-panel { + position: absolute; + right: 0; + top: 0; + font-weight: 500; + font-size: 0.8em; + } + } + .data { + font-size: 0.9em; + + pre { + margin: 0 -@defaultMargin; + overflow: auto; + height: 90px; + background-color: @colorGrayLight; //lighten(@colorGray, 10%); + color: @colorTextPrimary; + + span.zero { + color: fadeout(@colorTextSecondary, 30%); + } + span.function { + font-weight: 600; + } + } + } + } } - -body.app-blur .popup-windows.connect-account .cards-container .switch-card ul::after { - background: -webkit-linear-gradient(top, rgba(246, 246, 246, 0), rgba(246, 246, 246, 1)); +body.app-blur + .popup-windows.connect-account + .cards-container + .switch-card + ul::after { + background: -webkit-linear-gradient( + top, + rgba(246, 246, 246, 0), + rgba(246, 246, 246, 1) + ); } diff --git a/interface/client/styles/splashScreen.import.less b/interface/client/styles/splashScreen.import.less index 52206abb4..d9ae26be6 100644 --- a/interface/client/styles/splashScreen.import.less +++ b/interface/client/styles/splashScreen.import.less @@ -6,177 +6,179 @@ } .splash-screen { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - color: #fff; - text-align: center; - font-family: 'Source Sans Pro', 'Helvetica Neue', 'Helvetica', verdana, arial; - overflow: hidden; - - background-size: cover; - background-position: 50% 50%; - -webkit-app-region: drag; - - &.wallet { - background-image: url('/images/bg-homestead.jpg'); - - h1 { - color: #fff; - } - button.start-app, - button.retry-connection { - color: #BCD3E6; - &:hover { - color: darken(#BCD3E6, 5%); - } - } - button.close { - color: rgba(0,0,0, 0.3); - - &:hover { - color: rgba(0,0,0, 0.8); - } - } - } - &.mist { - background-image: url('/images/bg-metropolis.jpg'); - - h1 { - color: #152f58; - text-shadow: 0 1px 5px rgba(255,255,255,0.75); - } - - .network-indicator { - color: #FFF; - opacity: 0.9; - .unknown { - color: #152f58; - text-shadow: 0 1px 5px rgba(255,255,255,0.75); - } - } - } - - h1, small { - cursor: default; - } + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + color: #fff; + text-align: center; + font-family: 'Source Sans Pro', 'Helvetica Neue', 'Helvetica', verdana, arial; + overflow: hidden; + + background-size: cover; + background-position: 50% 50%; + -webkit-app-region: drag; + + &.wallet { + background-image: url('/images/bg-homestead.jpg'); - button { - -webkit-app-region: no-drag; - z-index: 3; - position: absolute; - color: #fff; - background: none; - border: 0; - outline: 0; - padding: @defaultMargin/2; - font-size: 0.8em; - } - button:active { - transform: scale(0.95); - } - - /* Close button */ - button.close { - top: 0; - right: 3px; - font-size: 20px; - color: rgba(255,255,255, 0.3); - } - button.close:hover { - color: rgba(255,255,255, 0.8); + h1 { + color: #fff; } - /* start app button */ button.start-app, button.retry-connection { - bottom: 10px; - right: 0; - left: 0; - width: 100%; - margin: 0; - padding: 0; - text-align: center; - color: #4A90E2; - text-transform: uppercase; - font-family: 'Source Sans Pro', 'Helvetica Neue', 'Helvetica', verdana, arial; - font-size: 1em; - font-weight: bold; - } - button.start-app:hover, - button.retry-connection:hover { - color: #2A6ED0; - } - - img { - margin-top: 7px; - width: 110px; - transition: width 0.5s ease-in-out; - } - &.small img { - width: 80px; - } - img.shadow { - box-shadow: 0 0 15px rgba(0,0,0,0.4); - border-radius: 50%; - } - h1 { - margin-top: 10px; - font-size: 18px; - font-weight: 400; - /*text-shadow: 0 1px 5px rgba(0,0,0,0.6);*/ - -webkit-user-select: none; - } - &.small h1 { - margin-top: 20px; - } - small { - display: inline-block; - margin-top: 2px; - opacity: 0.6; - line-height: 1.3em; - cursor: text; - -webkit-app-region: no-drag; - -webkit-user-select: initial; + color: #bcd3e6; + &:hover { + color: darken(#bcd3e6, 5%); + } } + button.close { + color: rgba(0, 0, 0, 0.3); - /* PROGRESSBAR */ - progress { - position: absolute; - bottom: 35px; - left: 10px; - right: 10px; - -webkit-appearance: none; - appearance: none; - width: auto; - height: 10px; - opacity: 0.8; + &:hover { + color: rgba(0, 0, 0, 0.8); + } } + } + &.mist { + background-image: url('/images/bg-metropolis.jpg'); - progress[value]::-webkit-progress-bar { - background-color: rgba(255,255,255, 0.2); - border-radius: 2px; - box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25) inset; + h1 { + color: #152f58; + text-shadow: 0 1px 5px rgba(255, 255, 255, 0.75); } - progress.wallet::-webkit-progress-value { - background-image: -webkit-linear-gradient(left, #DCCAB6, #fff); - } - progress.mist::-webkit-progress-value { - background-image: -webkit-linear-gradient(left, #3185CC, #ADA1E2); - } - progress::-webkit-progress-value { - opacity: 0.7; - border-radius: 2px; - box-shadow: inset 0 0 10px rgba(255, 255, 255, 0.3); + .network-indicator { + color: #fff; + opacity: 0.9; + .unknown { + color: #152f58; + text-shadow: 0 1px 5px rgba(255, 255, 255, 0.75); + } } + } - progress.state { - opacity: 0.3; - } + h1, + small { + cursor: default; + } - progress.state[value]::-webkit-progress-bar { - background: transparent; - } + button { + -webkit-app-region: no-drag; + z-index: 3; + position: absolute; + color: #fff; + background: none; + border: 0; + outline: 0; + padding: @defaultMargin / 2; + font-size: 0.8em; + } + button:active { + transform: scale(0.95); + } + + /* Close button */ + button.close { + top: 0; + right: 3px; + font-size: 20px; + color: rgba(255, 255, 255, 0.3); + } + button.close:hover { + color: rgba(255, 255, 255, 0.8); + } + /* start app button */ + button.start-app, + button.retry-connection { + bottom: 10px; + right: 0; + left: 0; + width: 100%; + margin: 0; + padding: 0; + text-align: center; + color: #4a90e2; + text-transform: uppercase; + font-family: 'Source Sans Pro', 'Helvetica Neue', 'Helvetica', verdana, + arial; + font-size: 1em; + font-weight: bold; + } + button.start-app:hover, + button.retry-connection:hover { + color: #2a6ed0; + } + + img { + margin-top: 7px; + width: 110px; + transition: width 0.5s ease-in-out; + } + &.small img { + width: 80px; + } + img.shadow { + box-shadow: 0 0 15px rgba(0, 0, 0, 0.4); + border-radius: 50%; + } + h1 { + margin-top: 10px; + font-size: 18px; + font-weight: 400; + /*text-shadow: 0 1px 5px rgba(0,0,0,0.6);*/ + -webkit-user-select: none; + } + &.small h1 { + margin-top: 20px; + } + small { + display: inline-block; + margin-top: 2px; + opacity: 0.6; + line-height: 1.3em; + cursor: text; + -webkit-app-region: no-drag; + -webkit-user-select: initial; + } + + /* PROGRESSBAR */ + progress { + position: absolute; + bottom: 35px; + left: 10px; + right: 10px; + -webkit-appearance: none; + appearance: none; + width: auto; + height: 10px; + opacity: 0.8; + } + + progress[value]::-webkit-progress-bar { + background-color: rgba(255, 255, 255, 0.2); + border-radius: 2px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25) inset; + } + + progress.wallet::-webkit-progress-value { + background-image: -webkit-linear-gradient(left, #dccab6, #fff); + } + progress.mist::-webkit-progress-value { + background-image: -webkit-linear-gradient(left, #3185cc, #ada1e2); + } + progress::-webkit-progress-value { + opacity: 0.7; + border-radius: 2px; + box-shadow: inset 0 0 10px rgba(255, 255, 255, 0.3); + } + + progress.state { + opacity: 0.3; + } + + progress.state[value]::-webkit-progress-bar { + background: transparent; + } } diff --git a/interface/client/templates/elements/img.js b/interface/client/templates/elements/img.js index 060bef3bb..61bbe0b8f 100644 --- a/interface/client/templates/elements/img.js +++ b/interface/client/templates/elements/img.js @@ -12,22 +12,22 @@ The img template */ Template['elements_img'].helpers({ - /** + /** This helper will preload the image, and then inject it later after its loaded @method (preload) */ - 'preload': function () { - var template = Template.instance(), - data = this, - img = new Image(); + preload: function() { + var template = Template.instance(), + data = this, + img = new Image(); - TemplateVar.set('loading', true); + TemplateVar.set('loading', true); - img.onload = function () { - TemplateVar.set(template, 'loading', false); - TemplateVar.set(template, 'src', data.src); - }; - img.src = data.src; - } + img.onload = function() { + TemplateVar.set(template, 'loading', false); + TemplateVar.set(template, 'src', data.src); + }; + img.src = data.src; + } }); diff --git a/interface/client/templates/elements/networkIndicator.js b/interface/client/templates/elements/networkIndicator.js index 0f720b0bc..3268d4dcc 100644 --- a/interface/client/templates/elements/networkIndicator.js +++ b/interface/client/templates/elements/networkIndicator.js @@ -11,59 +11,68 @@ The networkIndicator template @constructor */ - /** Check network type. @method checkNetworkType */ -var checkNetworkType = function (template) { - console.trace('Check network type...'); - - try { - web3.eth.getBlock(0, function (e, res) { - console.trace('Get block 0', e, res); - - if (e) { - console.error('Got error fetching block 0', e); - } else { - TemplateVar.set(template, 'network', Helpers.detectNetwork(res.hash).type); - TemplateVar.set(template, 'networkName', Helpers.detectNetwork(res.hash).name); - } - }); - } catch (err) { - console.error('Unable to get block 0', err); - } +var checkNetworkType = function(template) { + console.trace('Check network type...'); + + try { + web3.eth.getBlock(0, function(e, res) { + console.trace('Get block 0', e, res); + + if (e) { + console.error('Got error fetching block 0', e); + } else { + TemplateVar.set( + template, + 'network', + Helpers.detectNetwork(res.hash).type + ); + TemplateVar.set( + template, + 'networkName', + Helpers.detectNetwork(res.hash).name + ); + } + }); + } catch (err) { + console.error('Unable to get block 0', err); + } }; +Template['elements_networkIndicator'].onRendered(function() { + var template = this; -Template['elements_networkIndicator'].onRendered(function () { - var template = this; + TemplateVar.set(template, 'network', 'unknown'); - TemplateVar.set(template, 'network', 'unknown'); + checkNetworkType(template); - checkNetworkType(template); + ipc.on('uiAction_nodeStatus', function(e, status) { + console.trace('Node status', status); - ipc.on('uiAction_nodeStatus', function (e, status) { - console.trace('Node status', status); - - switch (status) { - case 'starting': - case 'stopping': - case 'connected': - console.debug('Node status changing, reset network type indicator'); - TemplateVar.set(template, 'network', 'unknown'); - break; - } - }); + switch (status) { + case 'starting': + case 'stopping': + case 'connected': + console.debug('Node status changing, reset network type indicator'); + TemplateVar.set(template, 'network', 'unknown'); + break; + } + }); - ipc.on('uiAction_nodeSyncStatus', function (e, status, data) { - console.trace('Node sync status', status); + ipc.on('uiAction_nodeSyncStatus', function(e, status, data) { + console.trace('Node sync status', status); - if ('inProgress' === status && TemplateVar.get(template, 'network') === 'unknown') { - console.debug('Node syncing, re-check network type.'); + if ( + 'inProgress' === status && + TemplateVar.get(template, 'network') === 'unknown' + ) { + console.debug('Node syncing, re-check network type.'); - checkNetworkType(template); - } - }); + checkNetworkType(template); + } + }); }); diff --git a/interface/client/templates/elements/nodeInfo.js b/interface/client/templates/elements/nodeInfo.js index ceedbddef..5f0b04aac 100644 --- a/interface/client/templates/elements/nodeInfo.js +++ b/interface/client/templates/elements/nodeInfo.js @@ -10,10 +10,9 @@ Update the peercount @method getPeerCount */ var getPeerCount = function(template) { - web3.net.getPeerCount(function(e, res) { - if(!e) - TemplateVar.set(template, 'peerCount', res); - }); + web3.net.getPeerCount(function(e, res) { + if (!e) TemplateVar.set(template, 'peerCount', res); + }); }; /** @@ -22,17 +21,21 @@ Update the mining hashrate @method getMining */ var getMining = function(template) { - web3.eth.getMining(function(e, res) { - if(!e && res) { - web3.eth.getHashrate(function(e, res) { - if(!e) { - TemplateVar.set(template, 'mining', numeral(res/1000).format('0,0.0')); - } - }); - } else { - TemplateVar.set(template, 'mining', false); + web3.eth.getMining(function(e, res) { + if (!e && res) { + web3.eth.getHashrate(function(e, res) { + if (!e) { + TemplateVar.set( + template, + 'mining', + numeral(res / 1000).format('0,0.0') + ); } - }); + }); + } else { + TemplateVar.set(template, 'mining', false); + } + }); }; /** @@ -42,108 +45,111 @@ The main template @constructor */ -Template['elements_nodeInfo'].onCreated(function(){ - var template = this; - - // CHECK FOR NETWORK - web3.eth.getBlock(0, function(e, res){ - if(!e){ - const network = Helpers.detectNetwork(res.hash); - TemplateVar.set(template, 'network', network.type); - TemplateVar.set(template, 'networkName', network.name); - } - }); - - // CHECK SYNCING - this.syncFilter = web3.eth.isSyncing(function(error, syncing) { - if(!error) { - - if(syncing === true) { - console.log('Node started syncing, stopping app operation'); - web3.reset(true); - - } else if(_.isObject(syncing)) { +Template['elements_nodeInfo'].onCreated(function() { + var template = this; - syncing.progress = Math.floor(((syncing.currentBlock - syncing.startingBlock) / (syncing.highestBlock - syncing.startingBlock)) * 100); - syncing.blockDiff = numeral(syncing.highestBlock - syncing.currentBlock).format('0,0'); - - TemplateVar.set(template, 'syncing', syncing); - - } else { - console.log('Restart app operation again'); - - TemplateVar.set(template, 'syncing', false); - } - } - }); + // CHECK FOR NETWORK + web3.eth.getBlock(0, function(e, res) { + if (!e) { + const network = Helpers.detectNetwork(res.hash); + TemplateVar.set(template, 'network', network.type); + TemplateVar.set(template, 'networkName', network.name); + } + }); + + // CHECK SYNCING + this.syncFilter = web3.eth.isSyncing(function(error, syncing) { + if (!error) { + if (syncing === true) { + console.log('Node started syncing, stopping app operation'); + web3.reset(true); + } else if (_.isObject(syncing)) { + syncing.progress = Math.floor( + (syncing.currentBlock - syncing.startingBlock) / + (syncing.highestBlock - syncing.startingBlock) * + 100 + ); + syncing.blockDiff = numeral( + syncing.highestBlock - syncing.currentBlock + ).format('0,0'); + + TemplateVar.set(template, 'syncing', syncing); + } else { + console.log('Restart app operation again'); + + TemplateVar.set(template, 'syncing', false); + } + } + }); + // CHECK PEER COUNT + this.peerCountIntervalId = null; - // CHECK PEER COUNT - this.peerCountIntervalId = null; + TemplateVar.set('peerCount', 0); + getPeerCount(template); - TemplateVar.set('peerCount', 0); + Meteor.clearInterval(this.peerCountIntervalId); + this.peerCountIntervalId = setInterval(function() { getPeerCount(template); + }, 1000); - Meteor.clearInterval(this.peerCountIntervalId); - this.peerCountIntervalId = setInterval(function() { - getPeerCount(template); - }, 1000); + // CHECK MINING and HASHRATE + this.miningIntervalId = null; - // CHECK MINING and HASHRATE - this.miningIntervalId = null; + TemplateVar.set('mining', false); + getMining(template); - TemplateVar.set('mining', false); + Meteor.clearInterval(this.miningIntervalId); + this.miningIntervalId = setInterval(function() { getMining(template); - - Meteor.clearInterval(this.miningIntervalId); - this.miningIntervalId = setInterval(function() { - getMining(template); - }, 1000); + }, 1000); }); - Template['elements_nodeInfo'].onDestroyed(function() { - Meteor.clearInterval(this.peerCountIntervalId); + Meteor.clearInterval(this.peerCountIntervalId); - if (this.syncFilter) { - this.syncFilter.stopWatching(); - } + if (this.syncFilter) { + this.syncFilter.stopWatching(); + } }); - Template['elements_nodeInfo'].helpers({ - /** + /** Formats the last block number @method (formattedBlockNumber) @return {String} */ - formattedBlockNumber: function () { - return numeral(EthBlocks.latest.number).format('0,0'); - }, - /** + formattedBlockNumber: function() { + return numeral(EthBlocks.latest.number).format('0,0'); + }, + /** Formats the time since the last block @method (timeSinceBlock) */ - timeSinceBlock: function () { - var timeSince = moment(EthBlocks.latest.timestamp, 'X'); - var now = moment(); - var diff = now.diff(timeSince, 'seconds'); + timeSinceBlock: function() { + var timeSince = moment(EthBlocks.latest.timestamp, 'X'); + var now = moment(); + var diff = now.diff(timeSince, 'seconds'); - if (!EthBlocks.latest.timestamp) { - return '-'; - } - - if (diff > 60) { - Helpers.rerun['10s'].tick(); - return timeSince.fromNow(true); - } else if (diff < 2) { - Helpers.rerun['1s'].tick(); - return ' ' + TAPi18n.__('mist.nodeInfo.blockReceivedShort') + ''; - } + if (!EthBlocks.latest.timestamp) { + return '-'; + } - Helpers.rerun['1s'].tick(); - return diff + 's'; + if (diff > 60) { + Helpers.rerun['10s'].tick(); + return timeSince.fromNow(true); + } else if (diff < 2) { + Helpers.rerun['1s'].tick(); + return ( + ' ' + + TAPi18n.__('mist.nodeInfo.blockReceivedShort') + + '' + ); } + + Helpers.rerun['1s'].tick(); + return diff + 's'; + } }); diff --git a/interface/client/templates/index.js b/interface/client/templates/index.js index ce04c55d3..0485880b7 100644 --- a/interface/client/templates/index.js +++ b/interface/client/templates/index.js @@ -13,33 +13,39 @@ The body template // Generic windows reuse windows by switching the template ipc.on('uiAction_switchTemplate', (e, templateName) => { - TemplateVar.setTo('#generic-body', 'MainRenderTemplate', `popupWindows_${templateName}`); + TemplateVar.setTo( + '#generic-body', + 'MainRenderTemplate', + `popupWindows_${templateName}` + ); }); Template.body.helpers({ - /** + /** Chooses the view to render at start @method renderApp */ - 'renderApp': function () { - // Generic windows return the TemplateVar if set in the ipc call above - const template = TemplateVar.get('MainRenderTemplate'); - if (template) { return template; } - - if (_.isEmpty(location.hash)) { - $('title').text('Mist'); - return 'layout_main'; - } else { - var renderWindow = location.hash.match(/#([a-zA-Z]*)_?/); - - if (renderWindow.length > 0) { - return 'popupWindows_' + renderWindow[1]; - } else { - return false; - } - } + renderApp: function() { + // Generic windows return the TemplateVar if set in the ipc call above + const template = TemplateVar.get('MainRenderTemplate'); + if (template) { + return template; + } + + if (_.isEmpty(location.hash)) { + $('title').text('Mist'); + return 'layout_main'; + } else { + var renderWindow = location.hash.match(/#([a-zA-Z]*)_?/); + + if (renderWindow.length > 0) { + return 'popupWindows_' + renderWindow[1]; + } else { + return false; + } } + } }); /* diff --git a/interface/client/templates/layout/browserBar.js b/interface/client/templates/layout/browserBar.js index b8db40c62..a98912f68 100644 --- a/interface/client/templates/layout/browserBar.js +++ b/interface/client/templates/layout/browserBar.js @@ -11,159 +11,163 @@ The browserBar template @constructor */ - -Template['layout_browserBar'].onRendered(function () { - var template = this; +Template['layout_browserBar'].onRendered(function() { + var template = this; }); - Template['layout_browserBar'].helpers({ - /** + /** Break the URL in protocol, domain and folders @method (breadcrumb) */ - breadcrumb: function () { - if (!this || !this.url) { - return; - } - try { - return Helpers.generateBreadcrumb(new URL(this.url)); - } catch (e) { - return; - } - }, - - /** + breadcrumb: function() { + if (!this || !this.url) { + return; + } + try { + return Helpers.generateBreadcrumb(new URL(this.url)); + } catch (e) { + return; + } + }, + + /** Returns the current dapp @method (dapp) */ - 'dapp': function () { - return Tabs.findOne(LocalStore.get('selectedTab')); - }, - /** + dapp: function() { + return Tabs.findOne(LocalStore.get('selectedTab')); + }, + /** Returns dapps current accounts @method (dappAccounts) */ - 'dappAccounts': function () { - if (this.permissions) { - return EthAccounts.find({ address: { $in: this.permissions.accounts || [] } }); - } - }, - /** + dappAccounts: function() { + if (this.permissions) { + return EthAccounts.find({ + address: { $in: this.permissions.accounts || [] } + }); + } + }, + /** Show the add button, when on a dapp and in doogle @method (isBrowser) */ - 'isBrowser': function () { - return (LocalStore.get('selectedTab') === 'browser'); - }, - /** + isBrowser: function() { + return LocalStore.get('selectedTab') === 'browser'; + }, + /** Current selected view @method (currentWebView) */ - 'currentWebView': function () { - return '.webview webview[data-id="' + LocalStore.get('selectedTab') + '"]'; - } + currentWebView: function() { + return '.webview webview[data-id="' + LocalStore.get('selectedTab') + '"]'; + } }); Template['layout_browserBar'].events({ - /* + /* Go back in the dapps browser history @event click button.back */ - 'click button.back': function () { - var webview = Helpers.getWebview(LocalStore.get('selectedTab')); - - if (webview && webview.canGoBack()) { - webview.goBack(); - } - }, - /* + 'click button.back': function() { + var webview = Helpers.getWebview(LocalStore.get('selectedTab')); + + if (webview && webview.canGoBack()) { + webview.goBack(); + } + }, + /* Reload the current webview @event click button.reload */ - 'click button.reload': function () { - var webview = Helpers.getWebview(LocalStore.get('selectedTab')); - - if (webview) { - webview.reload(); - } - }, - /* + 'click button.reload': function() { + var webview = Helpers.getWebview(LocalStore.get('selectedTab')); + + if (webview) { + webview.reload(); + } + }, + /* Remove the current selected tab // TODO show popup before to confirm @event click button.remove-tab */ - 'click button.remove-tab': function () { - var tabId = LocalStore.get('selectedTab'); + 'click button.remove-tab': function() { + var tabId = LocalStore.get('selectedTab'); - Tabs.remove(tabId); - LocalStore.set('selectedTab', 'browser'); - }, - /** + Tabs.remove(tabId); + LocalStore.set('selectedTab', 'browser'); + }, + /** Show connect account popup @event click .app-bar > button.accounts' */ - 'click .app-bar > button.accounts': function (e, template) { - LocalStore.set('chosenTab', LocalStore.get('selectedTab')); // needed by connectAccount - mist.requestAccount(function (e, addresses) { - var tabId = LocalStore.get('selectedTab'); - - dbSync.syncDataFromBackend(LastVisitedPages); - dbSync.syncDataFromBackend(Tabs).then(function () { - Tabs.update(tabId, { $set: { - 'permissions.accounts': addresses - } }); - }); + 'click .app-bar > button.accounts': function(e, template) { + LocalStore.set('chosenTab', LocalStore.get('selectedTab')); // needed by connectAccount + mist.requestAccount(function(e, addresses) { + var tabId = LocalStore.get('selectedTab'); + + dbSync.syncDataFromBackend(LastVisitedPages); + dbSync.syncDataFromBackend(Tabs).then(function() { + Tabs.update(tabId, { + $set: { + 'permissions.accounts': addresses + } }); - }, - /* + }); + }); + }, + /* Hide the app bar on input blur @event blur */ - 'blur .app-bar > form.url .url-input': function (e, template) { - template.$('.app-bar').removeClass('show-bar'); - }, - /* + 'blur .app-bar > form.url .url-input': function(e, template) { + template.$('.app-bar').removeClass('show-bar'); + }, + /* Stop hiding the app bar @event mouseenter .app-bar */ - 'mouseenter .app-bar': function (e, template) { - clearTimeout(TemplateVar.get('timeoutId')); - }, - /* + 'mouseenter .app-bar': function(e, template) { + clearTimeout(TemplateVar.get('timeoutId')); + }, + /* Send the domain @event submit */ - 'submit': function (e, template) { - var url = Helpers.formatUrl(template.$('.url-input')[0].value); - - // remove focus from url input - template.$('.url-input').blur(); - - // look in tabs - var url = Helpers.sanitizeUrl(url); - var tabId = Helpers.getTabIdByUrl(url); - - console.log('Submitted new URL: ' + url); - - // update current tab url - Tabs.update(tabId, { $set: { - url: url, - redirect: url - } }); - LocalStore.set('selectedTab', tabId); - } + submit: function(e, template) { + var url = Helpers.formatUrl(template.$('.url-input')[0].value); + + // remove focus from url input + template.$('.url-input').blur(); + + // look in tabs + var url = Helpers.sanitizeUrl(url); + var tabId = Helpers.getTabIdByUrl(url); + + console.log('Submitted new URL: ' + url); + + // update current tab url + Tabs.update(tabId, { + $set: { + url: url, + redirect: url + } + }); + LocalStore.set('selectedTab', tabId); + } }); diff --git a/interface/client/templates/layout/sidebar.js b/interface/client/templates/layout/sidebar.js index 56b3e49d0..e0971611d 100644 --- a/interface/client/templates/layout/sidebar.js +++ b/interface/client/templates/layout/sidebar.js @@ -11,210 +11,225 @@ The sidebar template @constructor */ -Template['layout_sidebar'].onRendered(function () { - var template = this, - $ul = template.$('nav > ul'); - - $ul.sortable({ - containment: 'aside.sidebar', - axis: 'y', - // tolerance: 'pointer', - items: '> li:not(.browser)', - handle: 'button.main', - cancel: '.browser', - cursor: 'move', - delay: 150, - revert: 200, - start: function (e) { - $ul.sortable('refreshPositions'); - }, - update: function (e) { - // iterate over the lis and reposition the items - $ul.find('> li').each(function (index, test) { - var id = $(this).data('tab-id'); - if (id) { - Tabs.update(id, { $set: { position: index + 1 } }); - } - }); +Template['layout_sidebar'].onRendered(function() { + var template = this, + $ul = template.$('nav > ul'); + + $ul.sortable({ + containment: 'aside.sidebar', + axis: 'y', + // tolerance: 'pointer', + items: '> li:not(.browser)', + handle: 'button.main', + cancel: '.browser', + cursor: 'move', + delay: 150, + revert: 200, + start: function(e) { + $ul.sortable('refreshPositions'); + }, + update: function(e) { + // iterate over the lis and reposition the items + $ul.find('> li').each(function(index, test) { + var id = $(this).data('tab-id'); + if (id) { + Tabs.update(id, { $set: { position: index + 1 } }); } - }); + }); + } + }); - template.$('[data-tab-id]').on('mouseover', function () { - }); + template.$('[data-tab-id]').on('mouseover', function() {}); }); - Template['layout_sidebar'].helpers({ - /** + /** Return the tabs @method (tabs) */ - 'tabs': function () { - return Tabs.find({}, { sort: { position: 1 } }).fetch(); - }, - /** + tabs: function() { + return Tabs.find({}, { sort: { position: 1 } }).fetch(); + }, + /** Return the correct name @method (name) */ - 'name': function () { - return (this._id === 'browser') ? TAPi18n.__('mist.sidebar.buttons.browser') : this.name; - }, - /** + name: function() { + return this._id === 'browser' + ? TAPi18n.__('mist.sidebar.buttons.browser') + : this.name; + }, + /** Return the correct dapp icon @method (icon) */ - 'icon': function () { - return (this._id === 'browser') ? 'icons/browse-icon@2x.png' : this.icon; - }, - /** + icon: function() { + return this._id === 'browser' ? 'icons/browse-icon@2x.png' : this.icon; + }, + /** Return the tabs sub menu as array @method (subMenu) */ - 'subMenu': function () { - var template = Template.instance(); - - if (this._id === 'browser') { - return LastVisitedPages.find({}, { sort: { timestamp: -1 }, limit: 25 }); - - } else if (this.menu) { - var menu = _.toArray(this.menu); - - // sort by position - menu.sort(function (a, b) { - if (a.position < b.position) { - return -1; - } - if (a.position > b.position) { - return 1; - } - return 0; - }); - - return menu; + subMenu: function() { + var template = Template.instance(); + + if (this._id === 'browser') { + return LastVisitedPages.find({}, { sort: { timestamp: -1 }, limit: 25 }); + } else if (this.menu) { + var menu = _.toArray(this.menu); + + // sort by position + menu.sort(function(a, b) { + if (a.position < b.position) { + return -1; } - }, - /** + if (a.position > b.position) { + return 1; + } + return 0; + }); + + return menu; + } + }, + /** Returns connected accounts for dapp @method (dappAccounts) */ - 'dappAccounts': function (limit) { - if (this.permissions) { - if (limit) { - return EthAccounts.find({ address: { $in: this.permissions.accounts || [] } }, - { limit: limit }); - } - return EthAccounts.find({ address: { $in: this.permissions.accounts || [] } }); - } - }, - /** + dappAccounts: function(limit) { + if (this.permissions) { + if (limit) { + return EthAccounts.find( + { address: { $in: this.permissions.accounts || [] } }, + { limit: limit } + ); + } + return EthAccounts.find({ + address: { $in: this.permissions.accounts || [] } + }); + } + }, + /** Determines if the current tab is visible @method (isSelected) */ - 'isSelected': function () { - return (LocalStore.get('selectedTab') === (this._id || 'browser')) ? 'selected' : ''; - }, - /** + isSelected: function() { + return LocalStore.get('selectedTab') === (this._id || 'browser') + ? 'selected' + : ''; + }, + /** It defines which tabs will have a remove button on the interface @method (tabShouldBeRemovable) */ - 'tabShouldBeRemovable': function () { - return !_.contains(['browser', 'wallet'], this._id); - }, + tabShouldBeRemovable: function() { + return !_.contains(['browser', 'wallet'], this._id); + } }); - Template['layout_sidebar'].events({ - /** + /** Select the current visible tab @event click button.main */ - 'click nav button.main': function (e, template) { - LocalStore.set('selectedTab', this._id || 'browser'); - }, - /** + 'click nav button.main': function(e, template) { + LocalStore.set('selectedTab', this._id || 'browser'); + }, + /** Call the submenu dapp callback @event click ul.sub-menu button */ - 'click nav ul.sub-menu button': function (e, template) { - var tabId = $(e.currentTarget).parent().parents('li').data('tab-id'); - var webview = $('webview[data-id="' + tabId + '"]')[0]; - - // browser - if (tabId === 'browser') { - webviewLoadStart.call(webview, tabId, { newURL: this.url, type: 'side-bar-click', preventDefault: function () {} }); - - // dapp tab - } else if (webview) { - webview.send('mistAPI_callMenuFunction', this.id); - LocalStore.set('selectedTab', tabId); - } - }, - /** + 'click nav ul.sub-menu button': function(e, template) { + var tabId = $(e.currentTarget) + .parent() + .parents('li') + .data('tab-id'); + var webview = $('webview[data-id="' + tabId + '"]')[0]; + + // browser + if (tabId === 'browser') { + webviewLoadStart.call(webview, tabId, { + newURL: this.url, + type: 'side-bar-click', + preventDefault: function() {} + }); + + // dapp tab + } else if (webview) { + webview.send('mistAPI_callMenuFunction', this.id); + LocalStore.set('selectedTab', tabId); + } + }, + /** Remove the current selected tab // TODO show popup before to confirm @event click button.remove-tab */ - 'click button.remove-tab': function () { - if (LocalStore.get('selectedTab') === this._id) { - LocalStore.set('selectedTab', 'browser'); - } - - Tabs.remove(this._id); - }, - /** + 'click button.remove-tab': function() { + if (LocalStore.get('selectedTab') === this._id) { + LocalStore.set('selectedTab', 'browser'); + } + + Tabs.remove(this._id); + }, + /** Show connect account popup @event click .accounts button' */ - 'click .accounts button': function (e, template) { - var initialTabCount = Tabs.find().fetch().length; - LocalStore.set('selectedTab', this._id); - var initialTabId = this._id; - - mist.requestAccount(function (ev, addresses) { - dbSync.syncDataFromBackend(LastVisitedPages); - dbSync.syncDataFromBackend(Tabs).then(function () { - var tabCount = Tabs.find().fetch().length; - var tabId; - if (tabCount > initialTabCount) { // browse tab was pinned - tabId = Tabs.findOne({}, { sort: { position: -1 }, limit: 1 }); - } else { - tabId = initialTabId; - } - Tabs.update(tabId, { - $set: { - 'permissions.accounts': addresses - } - }); - }); + 'click .accounts button': function(e, template) { + var initialTabCount = Tabs.find().fetch().length; + LocalStore.set('selectedTab', this._id); + var initialTabId = this._id; + + mist.requestAccount(function(ev, addresses) { + dbSync.syncDataFromBackend(LastVisitedPages); + dbSync.syncDataFromBackend(Tabs).then(function() { + var tabCount = Tabs.find().fetch().length; + var tabId; + if (tabCount > initialTabCount) { + // browse tab was pinned + tabId = Tabs.findOne({}, { sort: { position: -1 }, limit: 1 }); + } else { + tabId = initialTabId; + } + Tabs.update(tabId, { + $set: { + 'permissions.accounts': addresses + } }); - }, + }); + }); + }, - /** + /** Shows dapp submenu @event mouseenter .sidebar-menu > li */ - 'mouseenter .sidebar-menu > li': function (e, template) { - var $this = $(e.currentTarget); - var tabTopOffset = $this.offset().top; - var $submenuContainer = $this.find('.submenu-container'); - var $submenu = $this.find('.sub-menu'); - var submenuHeaderHeight = $this.find('header').outerHeight(); - var windowHeight = $(window).outerHeight(); - - $submenuContainer.css('top', tabTopOffset + 'px'); - $submenu.css('max-height', (windowHeight - tabTopOffset - submenuHeaderHeight - 30) + 'px'); - }, + 'mouseenter .sidebar-menu > li': function(e, template) { + var $this = $(e.currentTarget); + var tabTopOffset = $this.offset().top; + var $submenuContainer = $this.find('.submenu-container'); + var $submenu = $this.find('.sub-menu'); + var submenuHeaderHeight = $this.find('header').outerHeight(); + var windowHeight = $(window).outerHeight(); + + $submenuContainer.css('top', tabTopOffset + 'px'); + $submenu.css( + 'max-height', + windowHeight - tabTopOffset - submenuHeaderHeight - 30 + 'px' + ); + } }); diff --git a/interface/client/templates/layout/webviews.js b/interface/client/templates/layout/webviews.js index baefbfa0c..8724f2bb5 100644 --- a/interface/client/templates/layout/webviews.js +++ b/interface/client/templates/layout/webviews.js @@ -12,12 +12,12 @@ The main section template */ Template['layout_webviews'].helpers({ - /** + /** Return the tabs @method (tabs) */ - 'tabs': function () { - return Tabs.find({}, { field: { position: 1 } }); - } + tabs: function() { + return Tabs.find({}, { field: { position: 1 } }); + } }); diff --git a/interface/client/templates/popupWindows/about.js b/interface/client/templates/popupWindows/about.js index 3be06a553..737009f8c 100644 --- a/interface/client/templates/popupWindows/about.js +++ b/interface/client/templates/popupWindows/about.js @@ -4,14 +4,10 @@ Template Controllers @module Templates */ - /** The about template @class [template] popupWindows_about @constructor */ -Template['popupWindows_about'].onCreated(function () { - -}); - +Template['popupWindows_about'].onCreated(function() {}); diff --git a/interface/client/templates/popupWindows/clientUpdateAvailable.js b/interface/client/templates/popupWindows/clientUpdateAvailable.js index 34c48f3fd..dd2da139f 100644 --- a/interface/client/templates/popupWindows/clientUpdateAvailable.js +++ b/interface/client/templates/popupWindows/clientUpdateAvailable.js @@ -4,12 +4,11 @@ Template Controllers @module Templates */ - Template['popupWindows_clientUpdateAvailable'].events({ - 'click .ok': function (e) { - ipc.send('backendAction_windowCallback', 'update'); - }, - 'click .cancel': function (e) { - ipc.send('backendAction_windowCallback', 'skip'); - }, + 'click .ok': function(e) { + ipc.send('backendAction_windowCallback', 'update'); + }, + 'click .cancel': function(e) { + ipc.send('backendAction_windowCallback', 'skip'); + } }); diff --git a/interface/client/templates/popupWindows/connectAccount.js b/interface/client/templates/popupWindows/connectAccount.js index a7207476e..37fc0703f 100644 --- a/interface/client/templates/popupWindows/connectAccount.js +++ b/interface/client/templates/popupWindows/connectAccount.js @@ -1,170 +1,182 @@ +var pinToSidebar = function() { + var selectedTab = TemplateVar.get('tab'); + + if (selectedTab) { + var existingUserTab = Helpers.getTabIdByUrl(selectedTab.url); + + if (existingUserTab === 'browser') { + var newTabId = Tabs.insert({ + url: selectedTab.url, + redirect: selectedTab.url, + name: selectedTab.name, + menu: {}, + position: Tabs.find().count() + 1 + }); + LocalStore.set('selectedTab', newTabId); + } else if (existingUserTab) { + LocalStore.set('selectedTab', existingUserTab); + } - -var pinToSidebar = function () { - var selectedTab = TemplateVar.get('tab'); - - if (selectedTab) { - var existingUserTab = Helpers.getTabIdByUrl(selectedTab.url); - - if (existingUserTab === 'browser') { - var newTabId = Tabs.insert({ - url: selectedTab.url, - redirect: selectedTab.url, - name: selectedTab.name, - menu: {}, - position: Tabs.find().count() + 1 - }); - LocalStore.set('selectedTab', newTabId); - - } else if (existingUserTab) { - LocalStore.set('selectedTab', existingUserTab); - } - - if (selectedTab._id === 'browser') { - var sameLastPage; - - // move the current browser tab to the last visited page - var lastPageItems = LastVisitedPages.find({}, { limit: 2, sort: { timestamp: -1 } }).fetch(); - var lastPage = lastPageItems.pop(); - var lastPageURL = lastPage ? lastPage.url : 'http://about:blank'; - Tabs.update('browser', { - url: lastPageURL, - redirect: lastPageURL - }); - - // remove last page form last pages - if (sameLastPage = LastVisitedPages.findOne({ url: selectedTab.url })) { - LastVisitedPages.remove(sameLastPage._id); - } - } + if (selectedTab._id === 'browser') { + var sameLastPage; + + // move the current browser tab to the last visited page + var lastPageItems = LastVisitedPages.find( + {}, + { limit: 2, sort: { timestamp: -1 } } + ).fetch(); + var lastPage = lastPageItems.pop(); + var lastPageURL = lastPage ? lastPage.url : 'http://about:blank'; + Tabs.update('browser', { + url: lastPageURL, + redirect: lastPageURL + }); + + // remove last page form last pages + if ( + (sameLastPage = LastVisitedPages.findOne({ + url: selectedTab.url + })) + ) { + LastVisitedPages.remove(sameLastPage._id); + } } + } }; -var updateSelectedTabAccounts = function (accounts) { - var tabId = TemplateVar.get('selectedTab')._id; - Tabs.update(tabId, { $set: { - 'permissions.accounts': accounts - } }); +var updateSelectedTabAccounts = function(accounts) { + var tabId = TemplateVar.get('selectedTab')._id; + Tabs.update(tabId, { + $set: { + 'permissions.accounts': accounts + } + }); }; -Template['popupWindows_connectAccount'].onCreated(function () { - this.autorun(function () { - TemplateVar.set('tab', Tabs.findOne(LocalStore.get('selectedTab'))); - - var tab = TemplateVar.get('tab'); - var accounts = (tab && tab.permissions && tab.permissions.accounts) ? tab.permissions.accounts : []; - TemplateVar.set('accounts', accounts); - }); +Template['popupWindows_connectAccount'].onCreated(function() { + this.autorun(function() { + TemplateVar.set('tab', Tabs.findOne(LocalStore.get('selectedTab'))); + + var tab = TemplateVar.get('tab'); + var accounts = + tab && tab.permissions && tab.permissions.accounts + ? tab.permissions.accounts + : []; + TemplateVar.set('accounts', accounts); + }); }); - Template['popupWindows_connectAccount'].helpers({ - /** + /** Returns the current dapp @method (dapp) */ - dapp: function () { - return TemplateVar.get('tab'); - }, - /** + dapp: function() { + return TemplateVar.get('tab'); + }, + /** Returns a cleaner version of URL @method (dappFriendlyURL) */ - dappFriendlyURL: function () { - var currentTab = TemplateVar.get('tab'); - if (currentTab && currentTab.url) { - return currentTab.url.replace(/^https?:\/\/(www\.)?/, '').replace(/\/$/, ''); - } - }, - /** + dappFriendlyURL: function() { + var currentTab = TemplateVar.get('tab'); + if (currentTab && currentTab.url) { + return currentTab.url + .replace(/^https?:\/\/(www\.)?/, '') + .replace(/\/$/, ''); + } + }, + /** Return the number of accounts this tab has permission for. @method accountNumber @return {Number} */ - 'accountNumber': function () { - var accounts = _.pluck(EthAccounts.find().fetch(), 'address'); + accountNumber: function() { + var accounts = _.pluck(EthAccounts.find().fetch(), 'address'); - return _.intersection(accounts, TemplateVar.get('accounts')).length; - }, - /** + return _.intersection(accounts, TemplateVar.get('accounts')).length; + }, + /** Return an array with the selected accounts. @method selectedAccounts @return {Array} */ - 'selectedAccounts': function () { - var accounts = _.pluck(EthAccounts.find().fetch(), 'address'); - return _.intersection(accounts, TemplateVar.get('accounts')); - }, - /** + selectedAccounts: function() { + var accounts = _.pluck(EthAccounts.find().fetch(), 'address'); + return _.intersection(accounts, TemplateVar.get('accounts')); + }, + /** Return "selected" if the current account is allowed in that dapp. @method selected @return {String} "selected" */ - 'selected': function () { - return (_.contains(TemplateVar.get('accounts'), this.address)) ? 'selected' : ''; - } + selected: function() { + return _.contains(TemplateVar.get('accounts'), this.address) + ? 'selected' + : ''; + } }); Template['popupWindows_connectAccount'].events({ - /** + /** Toggles dapp account list selection. @event click .dapp-account-list button */ - 'click .dapp-account-list button': function (e, template) { - e.preventDefault(); - var accounts = TemplateVar.get('accounts'); - - if (!_.contains(accounts, this.address)) { - accounts.push(this.address); - } else { - accounts = _.without(accounts, this.address); - } - - TemplateVar.set(template, 'accounts', accounts); - }, - /** + 'click .dapp-account-list button': function(e, template) { + e.preventDefault(); + var accounts = TemplateVar.get('accounts'); + + if (!_.contains(accounts, this.address)) { + accounts.push(this.address); + } else { + accounts = _.without(accounts, this.address); + } + + TemplateVar.set(template, 'accounts', accounts); + }, + /** Closes the popup @event click .cancel */ - 'click .cancel': function (e) { - ipc.send('backendAction_closePopupWindow'); - }, - /** + 'click .cancel': function(e) { + ipc.send('backendAction_closePopupWindow'); + }, + /** - Confirm or cancel the accounts available for this dapp and reload the dapp. @event click button.confirm, click button.cancel */ - 'click .ok, click .stay-anonymous': function (e) { - e.preventDefault(); + 'click .ok, click .stay-anonymous': function(e) { + e.preventDefault(); - var accounts = TemplateVar.get('accounts'); + var accounts = TemplateVar.get('accounts'); - // Pin to sidebar, if needed - if ($('#pin-to-sidebar')[0].checked) { - pinToSidebar(); - } + // Pin to sidebar, if needed + if ($('#pin-to-sidebar')[0].checked) { + pinToSidebar(); + } - accounts = _.unique(_.flatten(accounts)); + accounts = _.unique(_.flatten(accounts)); - // reload the webview - ipc.send('backendAction_windowMessageToOwner', null, accounts); - setTimeout(function () { - ipc.send('backendAction_closePopupWindow'); - }, 600); - }, - /** + // reload the webview + ipc.send('backendAction_windowMessageToOwner', null, accounts); + setTimeout(function() { + ipc.send('backendAction_closePopupWindow'); + }, 600); + }, + /** Create account @event click button.create-account */ - 'click button.create-account': function (e, template) { - ipc.send('mistAPI_createAccount'); - } + 'click button.create-account': function(e, template) { + ipc.send('mistAPI_createAccount'); + } }); diff --git a/interface/client/templates/popupWindows/generic.js b/interface/client/templates/popupWindows/generic.js index 9731d1956..68e0f26dd 100644 --- a/interface/client/templates/popupWindows/generic.js +++ b/interface/client/templates/popupWindows/generic.js @@ -4,14 +4,10 @@ Template Controllers @module Templates */ - /** The about template @class [template] popupWindows_generic @constructor */ -Template['popupWindows_generic'].onCreated(function () { - -}); - +Template['popupWindows_generic'].onCreated(function() {}); diff --git a/interface/client/templates/popupWindows/importAccount.js b/interface/client/templates/popupWindows/importAccount.js index 9503282be..d8d7d88eb 100644 --- a/interface/client/templates/popupWindows/importAccount.js +++ b/interface/client/templates/popupWindows/importAccount.js @@ -12,144 +12,152 @@ The importAccount import template */ Template['popupWindows_importAccount'].helpers({ - /** + /** Show password @method showPassword */ - 'showPassword': function () { - return TemplateVar.get('showPassword') ? 'text' : 'password'; - } + showPassword: function() { + return TemplateVar.get('showPassword') ? 'text' : 'password'; + } }); - Template['popupWindows_importAccount'].events({ - /** + /** On drag enter, change class @event dragenter .dropable */ - 'dragenter .dropable': function (e) { - $(e.currentTarget).addClass('active'); - }, - /** + 'dragenter .dropable': function(e) { + $(e.currentTarget).addClass('active'); + }, + /** On drag leave, change class @event dragleave .dropable */ - 'dragleave .dropable': function (e) { - $(e.currentTarget).removeClass('active'); - }, - /** + 'dragleave .dropable': function(e) { + $(e.currentTarget).removeClass('active'); + }, + /** When the file is droped, read the path @event drop .dropable */ - 'drop .dropable': function (e, template) { - e.preventDefault(); + 'drop .dropable': function(e, template) { + e.preventDefault(); - if (e.originalEvent.dataTransfer) { - files = e.originalEvent.dataTransfer.files; - } + if (e.originalEvent.dataTransfer) { + files = e.originalEvent.dataTransfer.files; + } + + if (files.length) { + ipc.send('backendAction_checkWalletFile', files[0].path); - if (files.length) { - ipc.send('backendAction_checkWalletFile', files[0].path); - - ipc.on('uiAction_checkedWalletFile', function (ev, error, type) { - switch (type) { - case 'presale': - console.log(`Imported ${type} account`); - TemplateVar.set(template, 'filePath', files[0].path); - Tracker.afterFlush(function () { - template.$('.password').focus(); - }); - break; - case 'web3': - console.log(`Imported ${type} account`); - TemplateVar.set(template, 'filePath', files[0].path); - TemplateVar.set(template, 'importing', true); - setTimeout(function () { - ipc.send('backendAction_closePopupWindow'); - }, 750); - break; - default: - GlobalNotification.warning({ - content: TAPi18n.__('mist.popupWindows.onboarding.errors.unknownFile'), - duration: 4 - }); - } + ipc.on('uiAction_checkedWalletFile', function(ev, error, type) { + switch (type) { + case 'presale': + console.log(`Imported ${type} account`); + TemplateVar.set(template, 'filePath', files[0].path); + Tracker.afterFlush(function() { + template.$('.password').focus(); + }); + break; + case 'web3': + console.log(`Imported ${type} account`); + TemplateVar.set(template, 'filePath', files[0].path); + TemplateVar.set(template, 'importing', true); + setTimeout(function() { + ipc.send('backendAction_closePopupWindow'); + }, 750); + break; + default: + GlobalNotification.warning({ + content: TAPi18n.__( + 'mist.popupWindows.onboarding.errors.unknownFile' + ), + duration: 4 }); } + }); + } - $(e.currentTarget).removeClass('active'); - }, - /** + $(e.currentTarget).removeClass('active'); + }, + /** On drag over prevent redirect @event dragover .dropable */ - 'dragover .dropable': function (e) { - e.preventDefault(); - }, - /** + 'dragover .dropable': function(e) { + e.preventDefault(); + }, + /** On show password @event click .show-password */ - 'click .show-password': function (e) { - TemplateVar.set('showPassword', e.currentTarget.checked); - }, - /** + 'click .show-password': function(e) { + TemplateVar.set('showPassword', e.currentTarget.checked); + }, + /** Checks the password match sends the file path and password to the mist backend to import @event submit form */ - 'submit form': function (e, template) { - var pw = template.find('input.password').value; - - - ipc.send('backendAction_importWalletFile', TemplateVar.get('filePath'), pw); - - TemplateVar.set('importing', true); - ipc.on('uiAction_importedWalletFile', function (ev, error, address) { - TemplateVar.set(template, 'importing', false); - TemplateVar.set(template, 'filePath', false); - - if (address) { - ipc.removeAllListeners('uiAction_importedWalletFile'); - console.log('Imported account: ', address); - - // move to add account screen, when in the onboarding window - if ($('.onboarding-start')[0]) { - TemplateVar.setTo('.onboarding-account', 'newAccount', web3.toChecksumAddress(address)); - TemplateVar.setTo('.onboarding-screen', 'currentActive', 'account'); - - // otherwise simply close the window - } else { - ipc.send('backendAction_closePopupWindow'); - } - - - } else { - console.log('Import failed', error); - - if (error === 'Decryption Failed') { - GlobalNotification.warning({ - content: TAPi18n.__('mist.popupWindows.onboarding.errors.wrongPassword'), - duration: 4 - }); - } else { - GlobalNotification.warning({ - content: TAPi18n.__('mist.popupWindows.onboarding.errors.importFailed', { error - }), - duration: 4 - }); - } - } - }); - - // clear form - template.find('input.password').value = ''; - pw = null; - } + 'submit form': function(e, template) { + var pw = template.find('input.password').value; + + ipc.send('backendAction_importWalletFile', TemplateVar.get('filePath'), pw); + + TemplateVar.set('importing', true); + ipc.on('uiAction_importedWalletFile', function(ev, error, address) { + TemplateVar.set(template, 'importing', false); + TemplateVar.set(template, 'filePath', false); + + if (address) { + ipc.removeAllListeners('uiAction_importedWalletFile'); + console.log('Imported account: ', address); + + // move to add account screen, when in the onboarding window + if ($('.onboarding-start')[0]) { + TemplateVar.setTo( + '.onboarding-account', + 'newAccount', + web3.toChecksumAddress(address) + ); + TemplateVar.setTo('.onboarding-screen', 'currentActive', 'account'); + + // otherwise simply close the window + } else { + ipc.send('backendAction_closePopupWindow'); + } + } else { + console.log('Import failed', error); + + if (error === 'Decryption Failed') { + GlobalNotification.warning({ + content: TAPi18n.__( + 'mist.popupWindows.onboarding.errors.wrongPassword' + ), + duration: 4 + }); + } else { + GlobalNotification.warning({ + content: TAPi18n.__( + 'mist.popupWindows.onboarding.errors.importFailed', + { + error + } + ), + duration: 4 + }); + } + } + }); + + // clear form + template.find('input.password').value = ''; + pw = null; + } }); diff --git a/interface/client/templates/popupWindows/requestAccount.js b/interface/client/templates/popupWindows/requestAccount.js index a0e7982b9..aed232d49 100644 --- a/interface/client/templates/popupWindows/requestAccount.js +++ b/interface/client/templates/popupWindows/requestAccount.js @@ -11,72 +11,74 @@ The request account popup window template @constructor */ -Template['popupWindows_requestAccount'].onRendered(function () { - this.$('input.password').focus(); - TemplateVar.set('showPassword', false); +Template['popupWindows_requestAccount'].onRendered(function() { + this.$('input.password').focus(); + TemplateVar.set('showPassword', false); }); Template['popupWindows_requestAccount'].helpers({ - 'passwordInputType': function () { - return TemplateVar.get('showPassword') ? 'text' : 'password'; - } + passwordInputType: function() { + return TemplateVar.get('showPassword') ? 'text' : 'password'; + } }); Template['popupWindows_requestAccount'].events({ - 'click .cancel': function () { - ipc.send('backendAction_closePopupWindow'); - }, - 'click .show-password': function (e) { - TemplateVar.set('showPassword', e.currentTarget.checked); - }, - 'submit form': function (e, template) { - e.preventDefault(); - var pw = template.find('input.password').value; - var pwRepeat = template.find('input.password-repeat').value; + 'click .cancel': function() { + ipc.send('backendAction_closePopupWindow'); + }, + 'click .show-password': function(e) { + TemplateVar.set('showPassword', e.currentTarget.checked); + }, + 'submit form': function(e, template) { + e.preventDefault(); + var pw = template.find('input.password').value; + var pwRepeat = template.find('input.password-repeat').value; - // ask for password repeat - if (!pwRepeat) { - TemplateVar.set('password-repeat', true); - template.$('input.password-repeat').focus(); + // ask for password repeat + if (!pwRepeat) { + TemplateVar.set('password-repeat', true); + template.$('input.password-repeat').focus(); - // stop here so we dont set the password repeat to false - return; - } - - // check passwords - if ( pw !== pwRepeat) { - GlobalNotification.warning({ - content: TAPi18n.__('mist.popupWindows.requestAccount.errors.passwordMismatch'), - duration: 3 - }); - } else if (pw && pw.length < 8) { - GlobalNotification.warning({ - content: TAPi18n.__('mist.popupWindows.requestAccount.errors.passwordTooShort'), - duration: 3 - }); - } else if (pw && pw.length >= 8) { + // stop here so we dont set the password repeat to false + return; + } - TemplateVar.set('creating', true); - web3.personal.newAccount(pwRepeat, function (e, res) { - if (!e) { - ipc.send('backendAction_windowMessageToOwner', null, res); - } else { - ipc.send('backendAction_windowMessageToOwner', e); - } + // check passwords + if (pw !== pwRepeat) { + GlobalNotification.warning({ + content: TAPi18n.__( + 'mist.popupWindows.requestAccount.errors.passwordMismatch' + ), + duration: 3 + }); + } else if (pw && pw.length < 8) { + GlobalNotification.warning({ + content: TAPi18n.__( + 'mist.popupWindows.requestAccount.errors.passwordTooShort' + ), + duration: 3 + }); + } else if (pw && pw.length >= 8) { + TemplateVar.set('creating', true); + web3.personal.newAccount(pwRepeat, function(e, res) { + if (!e) { + ipc.send('backendAction_windowMessageToOwner', null, res); + } else { + ipc.send('backendAction_windowMessageToOwner', e); + } - TemplateVar.set(template, 'creating', false); + TemplateVar.set(template, 'creating', false); - // notifiy about backing up! - alert(TAPi18n.__('mist.popupWindows.requestAccount.backupHint')); + // notifiy about backing up! + alert(TAPi18n.__('mist.popupWindows.requestAccount.backupHint')); - ipc.send('backendAction_closePopupWindow'); - }); - - } + ipc.send('backendAction_closePopupWindow'); + }); + } - TemplateVar.set('password-repeat', false); - template.find('input.password-repeat').value = ''; - template.find('input.password').value = ''; - pw = pwRepeat = null; - } + TemplateVar.set('password-repeat', false); + template.find('input.password-repeat').value = ''; + template.find('input.password').value = ''; + pw = pwRepeat = null; + } }); diff --git a/interface/client/templates/popupWindows/sendTransactionConfirmation.js b/interface/client/templates/popupWindows/sendTransactionConfirmation.js index 02b048214..e57fd8960 100644 --- a/interface/client/templates/popupWindows/sendTransactionConfirmation.js +++ b/interface/client/templates/popupWindows/sendTransactionConfirmation.js @@ -4,13 +4,16 @@ Template Controllers @module Templates */ -var setWindowSize = function (template) { - Tracker.afterFlush(function () { - ipc.send('backendAction_setWindowSize', 580, template.$('.popup-windows .inner-container').height() + 240); - }); +var setWindowSize = function(template) { + Tracker.afterFlush(function() { + ipc.send( + 'backendAction_setWindowSize', + 580, + template.$('.popup-windows .inner-container').height() + 240 + ); + }); }; - var defaultEstimateGas = 50000000; /** @@ -20,400 +23,473 @@ The sendTransaction confirmation popup window template @constructor */ - /** Takes a 4-byte function signature and does a best-effort conversion to a human readable text signature. @method (lookupFunctionSignature) */ -var lookupFunctionSignature = function (data, remoteLookup) { - return new Q(function (resolve, reject) { - if (data && data.length > 8) { - var bytesSignature = (data.substr(0, 2) === '0x') - ? data.substr(0, 10) - : '0x' + data.substr(0, 8); - - if (remoteLookup) { - https.get('https://www.4byte.directory/api/v1/signatures/?hex_signature=' + bytesSignature, function (response) { - var body = ''; - - response.on('data', function (chunk) { - body += chunk; - }); - - response.on('end', function () { - var responseData = JSON.parse(body); - if (responseData.results.length) { - resolve(responseData.results[0].text_signature); - } else { - resolve(bytesSignature); - } - }); - }).on('error', function (error) { - console.warn('Error querying Function Signature Registry.', err); - reject(bytesSignature); - }); - } else if (_.first(window.SIGNATURES[bytesSignature])) { - resolve(_.first(window.SIGNATURES[bytesSignature])); +var lookupFunctionSignature = function(data, remoteLookup) { + return new Q(function(resolve, reject) { + if (data && data.length > 8) { + var bytesSignature = + data.substr(0, 2) === '0x' + ? data.substr(0, 10) + : '0x' + data.substr(0, 8); + + if (remoteLookup) { + https + .get( + 'https://www.4byte.directory/api/v1/signatures/?hex_signature=' + + bytesSignature, + function(response) { + var body = ''; + + response.on('data', function(chunk) { + body += chunk; + }); + + response.on('end', function() { + var responseData = JSON.parse(body); + if (responseData.results.length) { + resolve(responseData.results[0].text_signature); } else { - reject(bytesSignature); + resolve(bytesSignature); } - } else { - reject(undefined); - } - }); + }); + } + ) + .on('error', function(error) { + console.warn('Error querying Function Signature Registry.', err); + reject(bytesSignature); + }); + } else if (_.first(window.SIGNATURES[bytesSignature])) { + resolve(_.first(window.SIGNATURES[bytesSignature])); + } else { + reject(bytesSignature); + } + } else { + reject(undefined); + } + }); }; -var localSignatureLookup = function (data) { - return lookupFunctionSignature(data, false); +var localSignatureLookup = function(data) { + return lookupFunctionSignature(data, false); }; -var remoteSignatureLookup = function (data) { - return lookupFunctionSignature(data, true); +var remoteSignatureLookup = function(data) { + return lookupFunctionSignature(data, true); }; -var signatureLookupCallback = function (textSignature) { - // Clean version of function signature. Striping params - TemplateVar.set(template, 'executionFunction', textSignature.replace(/\(.+$/g, '')); - TemplateVar.set(template, 'hasSignature', true); - - var params = textSignature.match(/\((.+)\)/i); - if (params) { - console.log('params sent', params); - TemplateVar.set(template, 'executionFunctionParamTypes', params); - ipc.send('backendAction_decodeFunctionSignature', textSignature, data.data); - } +var signatureLookupCallback = function(textSignature) { + // Clean version of function signature. Striping params + TemplateVar.set( + template, + 'executionFunction', + textSignature.replace(/\(.+$/g, '') + ); + TemplateVar.set(template, 'hasSignature', true); + + var params = textSignature.match(/\((.+)\)/i); + if (params) { + console.log('params sent', params); + TemplateVar.set(template, 'executionFunctionParamTypes', params); + ipc.send('backendAction_decodeFunctionSignature', textSignature, data.data); + } }; +Template['popupWindows_sendTransactionConfirmation'].onCreated(function() { + var template = this; + + ipc.on('uiAction_decodedFunctionSignatures', function(event, params) { + console.log('params returned', params); + TemplateVar.set(template, 'params', params); + }); + + // check reactively if provided gas is enough + this.autorun(function() { + if ( + TemplateVar.get('estimatedGas') > Number(TemplateVar.get('providedGas')) + ) { + TemplateVar.set('gasError', 'notEnoughGas'); + } else if (TemplateVar.get('estimatedGas') > 4000000) { + TemplateVar.set('gasError', 'overBlockGasLimit'); + } else { + TemplateVar.set('gasError', null); + } + }); -Template['popupWindows_sendTransactionConfirmation'].onCreated(function () { - var template = this; - - ipc.on('uiAction_decodedFunctionSignatures', function (event, params) { - console.log('params returned', params); - TemplateVar.set(template, 'params', params); - }); - - // check reactively if provided gas is enough - this.autorun(function () { - if (TemplateVar.get('estimatedGas') > Number(TemplateVar.get('providedGas'))) { - TemplateVar.set('gasError', 'notEnoughGas'); - } else if (TemplateVar.get('estimatedGas') > 4000000) { - TemplateVar.set('gasError', 'overBlockGasLimit'); - } else { - TemplateVar.set('gasError', null); - } - }); - + // check inital data and gas estimates + this.autorun(function() { + TemplateVar.set(template, 'displayDecodedParams', true); - // check inital data and gas estimates - this.autorun(function () { - TemplateVar.set(template, 'displayDecodedParams', true); + var data = Session.get('data'); - var data = Session.get('data'); + if (data) { + // set window size + setWindowSize(template); - if (data) { + // set provided gas to templateVar + TemplateVar.set('providedGas', data.gas || 0); + TemplateVar.set('initialProvidedGas', data.gas || 0); + // add gasPrice if not set + if (!data.gasPrice) { + web3.eth.getGasPrice(function(e, res) { + if (!e) { + data.gasPrice = '0x' + res.toString(16); + Session.set('data', data); + } + }); + } - // set window size + // check if to is a contract + if (data.to) { + web3.eth.getCode(data.to, function(e, res) { + if (!e && res && res.length > 2) { + TemplateVar.set(template, 'toIsContract', true); setWindowSize(template); + } + }); - // set provided gas to templateVar - TemplateVar.set('providedGas', data.gas || 0); - TemplateVar.set('initialProvidedGas', data.gas || 0); - - // add gasPrice if not set - if (!data.gasPrice) { - web3.eth.getGasPrice(function (e, res) { - if (!e) { - data.gasPrice = '0x' + res.toString(16); - Session.set('data', data); - } - }); - } - - // check if to is a contract - if (data.to) { - web3.eth.getCode(data.to, function (e, res) { - if (!e && res && res.length > 2) { - TemplateVar.set(template, 'toIsContract', true); - setWindowSize(template); - } - }); - - if (data.data) { - localSignatureLookup(data.data).then(function (textSignature) { - // Clean version of function signature. Striping params - TemplateVar.set(template, 'executionFunction', textSignature.replace(/\(.+$/g, '')); - TemplateVar.set(template, 'hasSignature', true); - - var params = textSignature.match(/\((.+)\)/i); - if (params) { - TemplateVar.set(template, 'executionFunctionParamTypes', params); - ipc.send('backendAction_decodeFunctionSignature', textSignature, data.data); - } - }).catch(function (bytesSignature) { - TemplateVar.set(template, 'executionFunction', bytesSignature); - TemplateVar.set(template, 'hasSignature', false); - }); - } - } - if (data.from) { - web3.eth.getCode(data.from, function (e, res) { - if (!e && res && res.length > 2) { - TemplateVar.set(template, 'fromIsContract', true); - } - }); + if (data.data) { + localSignatureLookup(data.data) + .then(function(textSignature) { + // Clean version of function signature. Striping params + TemplateVar.set( + template, + 'executionFunction', + textSignature.replace(/\(.+$/g, '') + ); + TemplateVar.set(template, 'hasSignature', true); + + var params = textSignature.match(/\((.+)\)/i); + if (params) { + TemplateVar.set( + template, + 'executionFunctionParamTypes', + params + ); + ipc.send( + 'backendAction_decodeFunctionSignature', + textSignature, + data.data + ); + } + }) + .catch(function(bytesSignature) { + TemplateVar.set(template, 'executionFunction', bytesSignature); + TemplateVar.set(template, 'hasSignature', false); + }); + } + } + if (data.from) { + web3.eth.getCode(data.from, function(e, res) { + if (!e && res && res.length > 2) { + TemplateVar.set(template, 'fromIsContract', true); + } + }); + } + + // estimate gas usage + var estimateData = _.clone(data); + estimateData.gas = defaultEstimateGas; + web3.eth.estimateGas(estimateData, function(e, res) { + console.log('Estimated gas: ', res, e); + if (!e && res) { + // set the gas to the estimation, if not provided or lower + Tracker.nonreactive(function() { + var gas = Number(TemplateVar.get(template, 'providedGas')); + + if (res === defaultEstimateGas) { + return TemplateVar.set(template, 'estimatedGas', 'invalid'); } - // estimate gas usage - var estimateData = _.clone(data); - estimateData.gas = defaultEstimateGas; - web3.eth.estimateGas(estimateData, function (e, res) { - console.log('Estimated gas: ', res, e); - if (!e && res) { - - // set the gas to the estimation, if not provided or lower - Tracker.nonreactive(function () { - var gas = Number(TemplateVar.get(template, 'providedGas')); - - if (res === defaultEstimateGas) { - return TemplateVar.set(template, 'estimatedGas', 'invalid'); - } - - TemplateVar.set(template, 'estimatedGas', res); - + TemplateVar.set(template, 'estimatedGas', res); - if (!gas && res) { - TemplateVar.set(template, 'providedGas', res + 100000); - TemplateVar.set(template, 'initialProvidedGas', res + 100000); - } - }); - } - }); + if (!gas && res) { + TemplateVar.set(template, 'providedGas', res + 100000); + TemplateVar.set(template, 'initialProvidedGas', res + 100000); + } + }); } - }); + }); + } + }); }); -Template['popupWindows_sendTransactionConfirmation'].onRendered(function () { - var template = this; +Template['popupWindows_sendTransactionConfirmation'].onRendered(function() { + var template = this; - Meteor.setTimeout(function () { - template.$('input[type="password"]').focus(); - }, 200); + Meteor.setTimeout(function() { + template.$('input[type="password"]').focus(); + }, 200); }); Template['popupWindows_sendTransactionConfirmation'].helpers({ - /** + /** Returns the total amount @method (totalAmount) */ - 'totalAmount': function () { - var amount = EthTools.formatBalance(this.value, '0,0.00[0000000000000000]', 'ether'); - var dotPos = (~amount.indexOf('.')) ? amount.indexOf('.') + 3 : amount.indexOf(',') + 3; - - return amount ? amount.substr(0, dotPos) + '' + amount.substr(dotPos) + '' : '0'; - }, - /** + totalAmount: function() { + var amount = EthTools.formatBalance( + this.value, + '0,0.00[0000000000000000]', + 'ether' + ); + var dotPos = ~amount.indexOf('.') + ? amount.indexOf('.') + 3 + : amount.indexOf(',') + 3; + + return amount + ? amount.substr(0, dotPos) + + '' + + amount.substr(dotPos) + + '' + : '0'; + }, + /** Calculates the fee used for this transaction in ether @method (estimatedFee) */ - 'estimatedFee': function () { - var gas = TemplateVar.get('estimatedGas'); - if (gas && this.gasPrice) { - return EthTools.formatBalance(new BigNumber(gas, 10).times(new BigNumber(this.gasPrice, 10)), '0,0.0[0000000] unit', 'ether'); - } - }, - /** + estimatedFee: function() { + var gas = TemplateVar.get('estimatedGas'); + if (gas && this.gasPrice) { + return EthTools.formatBalance( + new BigNumber(gas, 10).times(new BigNumber(this.gasPrice, 10)), + '0,0.0[0000000] unit', + 'ether' + ); + } + }, + /** Calculates the provided gas amount in ether @method (providedGas) */ - 'providedGas': function () { - var gas = TemplateVar.get('providedGas'); - if (gas && this.gasPrice) { - return EthTools.formatBalance(new BigNumber(gas, 10).times(new BigNumber(this.gasPrice, 10)), '0,0.0[0000000]', 'ether'); - } - }, - /** + providedGas: function() { + var gas = TemplateVar.get('providedGas'); + if (gas && this.gasPrice) { + return EthTools.formatBalance( + new BigNumber(gas, 10).times(new BigNumber(this.gasPrice, 10)), + '0,0.0[0000000]', + 'ether' + ); + } + }, + /** Shortens the address to 0xffff...ffff @method (shortenAddress) */ - 'shortenAddress': function (address) { - if (_.isString(address)) { - return address.substr(0, 6) + '...' + address.substr(-4); - } - }, - /** + shortenAddress: function(address) { + if (_.isString(address)) { + return address.substr(0, 6) + '...' + address.substr(-4); + } + }, + /** Formats the data so that all zeros are wrapped in span.zero @method (formattedData) */ - 'formattedData': function () { - return (TemplateVar.get('toIsContract')) - ? this.data.replace(/([0]{2,})/g, '$1').replace(/(0x[a-f0-9]{8})/i, '$1') - : this.data.replace(/([0]{2,})/g, '$1'); - }, - - 'params': function () { - return TemplateVar.get('params'); - }, - /** + formattedData: function() { + return TemplateVar.get('toIsContract') + ? this.data + .replace(/([0]{2,})/g, '$1') + .replace(/(0x[a-f0-9]{8})/i, '$1') + : this.data.replace(/([0]{2,})/g, '$1'); + }, + + params: function() { + return TemplateVar.get('params'); + }, + /** Formats parameters @method (showFormattedParams) */ - 'showFormattedParams': function () { - return TemplateVar.get('params') && TemplateVar.get('displayDecodedParams'); - }, - /** + showFormattedParams: function() { + return TemplateVar.get('params') && TemplateVar.get('displayDecodedParams'); + }, + /** Checks if transaction will be invalid @method (transactionInvalid) */ - 'transactionInvalid': function () { - return TemplateVar.get('estimatedGas') === 'invalid' - || TemplateVar.get('estimatedGas') === 0 - || typeof TemplateVar.get('estimatedGas') === 'undefined'; - } + transactionInvalid: function() { + return ( + TemplateVar.get('estimatedGas') === 'invalid' || + TemplateVar.get('estimatedGas') === 0 || + typeof TemplateVar.get('estimatedGas') === 'undefined' + ); + } }); Template['popupWindows_sendTransactionConfirmation'].events({ - /** + /** Gets the new provided gas in ether amount and calculates the resulting providedGas @event change .provided-gas, input .provided-gas */ - 'change .provided-gas, input .provided-gas': function (e, template) { - var gas = template.$('.provided-gas').text().replace(/[, ]+/g, '');// template.$('.provided-gas').text(); - - TemplateVar.set('providedGas', gas); - }, - /** + 'change .provided-gas, input .provided-gas': function(e, template) { + var gas = template + .$('.provided-gas') + .text() + .replace(/[, ]+/g, ''); // template.$('.provided-gas').text(); + + TemplateVar.set('providedGas', gas); + }, + /** Increase the estimated gas @event click .not-enough-gas */ - 'click .not-enough-gas': function () { - var gas = Number(TemplateVar.get('estimatedGas')) + 100000; - TemplateVar.set('initialProvidedGas', gas); - TemplateVar.set('providedGas', gas); - }, - /** + 'click .not-enough-gas': function() { + var gas = Number(TemplateVar.get('estimatedGas')) + 100000; + TemplateVar.set('initialProvidedGas', gas); + TemplateVar.set('providedGas', gas); + }, + /** Cancel the transaction confirmation and close the popup @event click .cancel */ - 'click .cancel': function () { - ipc.send('backendAction_unlockedAccountAndSentTransaction', 'Transaction not confirmed'); - ipc.send('backendAction_closePopupWindow'); - }, - /** + 'click .cancel': function() { + ipc.send( + 'backendAction_unlockedAccountAndSentTransaction', + 'Transaction not confirmed' + ); + ipc.send('backendAction_closePopupWindow'); + }, + /** Confirm the transaction @event submit form */ - 'submit form': function (e, template) { - e.preventDefault(); - - var data = Session.get('data'), - pw = template.find('input[type="password"]').value, - gas = web3.fromDecimal(TemplateVar.get('providedGas')); - - // check if account is about to send to itself - if (data.to && data.from === data.to.toLowerCase()) { - GlobalNotification.warning({ - content: TAPi18n.__('mist.popupWindows.sendTransactionConfirmation.errors.sameAccount'), - duration: 5 - }); + 'submit form': function(e, template) { + e.preventDefault(); + + var data = Session.get('data'), + pw = template.find('input[type="password"]').value, + gas = web3.fromDecimal(TemplateVar.get('providedGas')); + + // check if account is about to send to itself + if (data.to && data.from === data.to.toLowerCase()) { + GlobalNotification.warning({ + content: TAPi18n.__( + 'mist.popupWindows.sendTransactionConfirmation.errors.sameAccount' + ), + duration: 5 + }); + + return false; + } - return false; - } + console.log('Choosen Gas: ', gas, TemplateVar.get('providedGas')); - console.log('Choosen Gas: ', gas, TemplateVar.get('providedGas')); + if (!gas || !_.isFinite(gas)) { + return; + } else { + data.gas = gas; + } - if (!gas || !_.isFinite(gas)) { - return; - } else { - data.gas = gas; - } + TemplateVar.set('unlocking', true); - TemplateVar.set('unlocking', true); - - // unlock and send transaction! - web3.personal.sendTransaction(data, pw || '', function (e, res) { - pw = null; - TemplateVar.set(template, 'unlocking', false); - - if (!e && res) { - ipc.send('backendAction_unlockedAccountAndSentTransaction', null, res); - - } else { - Tracker.afterFlush(function () { - template.find('input[type="password"]').value = ''; - template.$('input[type="password"]').focus(); - }); - if (e.message.indexOf('Unable to connect to socket: timeout') !== -1) { - GlobalNotification.warning({ - content: TAPi18n.__('mist.popupWindows.sendTransactionConfirmation.errors.connectionTimeout'), - duration: 5 - }); - } else if (e.message.indexOf('could not decrypt key with given passphrase') !== -1) { - GlobalNotification.warning({ - content: TAPi18n.__('mist.popupWindows.sendTransactionConfirmation.errors.wrongPassword'), - duration: 3 - }); - } else if (e.message.indexOf('multiple keys match address') !== -1) { - GlobalNotification.warning({ - content: TAPi18n.__('mist.popupWindows.sendTransactionConfirmation.errors.multipleKeysMatchAddress'), - duration: 10 - }); - } else if (e.message.indexOf('Insufficient funds for gas * price + value') !== -1) { - GlobalNotification.warning({ - content: TAPi18n.__('mist.popupWindows.sendTransactionConfirmation.errors.insufficientFundsForGas'), - duration: 5 - }); - } else { - GlobalNotification.warning({ - content: e.message, - duration: 5 - }); - } - } - }); - }, - - 'click .data .toggle-panel': function () { - TemplateVar.set('displayDecodedParams', true); - }, - 'click .parameters .toggle-panel': function () { - TemplateVar.set('displayDecodedParams', false); - }, - 'click .lookup-function-signature': function (e, template) { - var data = Session.get('data'); - TemplateVar.set('lookingUpFunctionSignature', true); - - remoteSignatureLookup(data.data).then(function (textSignature) { - TemplateVar.set(template, 'lookingUpFunctionSignature', false); - - // Clean version of function signature. Striping params - TemplateVar.set(template, 'executionFunction', textSignature.replace(/\(.+$/g, '')); - TemplateVar.set(template, 'hasSignature', true); - - var params = textSignature.match(/\((.+)\)/i); - if (params) { - console.log('params:', params); - TemplateVar.set(template, 'executionFunctionParamTypes', params); - ipc.send('backendAction_decodeFunctionSignature', textSignature, data.data); - } - }).catch(function (bytesSignature) { - TemplateVar.set(template, 'lookingUpFunctionSignature', false); - TemplateVar.set(template, 'executionFunction', bytesSignature); - TemplateVar.set(template, 'hasSignature', false); + // unlock and send transaction! + web3.personal.sendTransaction(data, pw || '', function(e, res) { + pw = null; + TemplateVar.set(template, 'unlocking', false); + + if (!e && res) { + ipc.send('backendAction_unlockedAccountAndSentTransaction', null, res); + } else { + Tracker.afterFlush(function() { + template.find('input[type="password"]').value = ''; + template.$('input[type="password"]').focus(); }); - } + if (e.message.indexOf('Unable to connect to socket: timeout') !== -1) { + GlobalNotification.warning({ + content: TAPi18n.__( + 'mist.popupWindows.sendTransactionConfirmation.errors.connectionTimeout' + ), + duration: 5 + }); + } else if ( + e.message.indexOf('could not decrypt key with given passphrase') !== + -1 + ) { + GlobalNotification.warning({ + content: TAPi18n.__( + 'mist.popupWindows.sendTransactionConfirmation.errors.wrongPassword' + ), + duration: 3 + }); + } else if (e.message.indexOf('multiple keys match address') !== -1) { + GlobalNotification.warning({ + content: TAPi18n.__( + 'mist.popupWindows.sendTransactionConfirmation.errors.multipleKeysMatchAddress' + ), + duration: 10 + }); + } else if ( + e.message.indexOf('Insufficient funds for gas * price + value') !== -1 + ) { + GlobalNotification.warning({ + content: TAPi18n.__( + 'mist.popupWindows.sendTransactionConfirmation.errors.insufficientFundsForGas' + ), + duration: 5 + }); + } else { + GlobalNotification.warning({ + content: e.message, + duration: 5 + }); + } + } + }); + }, + + 'click .data .toggle-panel': function() { + TemplateVar.set('displayDecodedParams', true); + }, + 'click .parameters .toggle-panel': function() { + TemplateVar.set('displayDecodedParams', false); + }, + 'click .lookup-function-signature': function(e, template) { + var data = Session.get('data'); + TemplateVar.set('lookingUpFunctionSignature', true); + + remoteSignatureLookup(data.data) + .then(function(textSignature) { + TemplateVar.set(template, 'lookingUpFunctionSignature', false); + + // Clean version of function signature. Striping params + TemplateVar.set( + template, + 'executionFunction', + textSignature.replace(/\(.+$/g, '') + ); + TemplateVar.set(template, 'hasSignature', true); + + var params = textSignature.match(/\((.+)\)/i); + if (params) { + console.log('params:', params); + TemplateVar.set(template, 'executionFunctionParamTypes', params); + ipc.send( + 'backendAction_decodeFunctionSignature', + textSignature, + data.data + ); + } + }) + .catch(function(bytesSignature) { + TemplateVar.set(template, 'lookingUpFunctionSignature', false); + TemplateVar.set(template, 'executionFunction', bytesSignature); + TemplateVar.set(template, 'hasSignature', false); + }); + } }); diff --git a/interface/client/templates/popupWindows/splashScreen.js b/interface/client/templates/popupWindows/splashScreen.js index ef62312a5..23e918e23 100644 --- a/interface/client/templates/popupWindows/splashScreen.js +++ b/interface/client/templates/popupWindows/splashScreen.js @@ -1,5 +1,3 @@ - - /** Template Controllers @@ -19,228 +17,284 @@ Contains the last state of the data @property lastSyncData */ var lastSyncData = {}, - showNodeLog = true; - + showNodeLog = true; -Template['popupWindows_splashScreen'].onCreated(function () { - var template = this; - template._intervalId = null; - - ipc.on('uiAction_nodeLogText', function (e, text, data) { - if (showNodeLog && data) { - TemplateVar.set(template, 'logText', data); - TemplateVar.set(template, 'syncStatusMessage', false); - return; - } - }); +Template['popupWindows_splashScreen'].onCreated(function() { + var template = this; + template._intervalId = null; - ipc.on('uiAction_clientBinaryStatus', function (e, status) { - TemplateVar.set(template, 'text', TAPi18n.__('mist.startScreen.clientBinaries.' + status)); - TemplateVar.set(template, 'showNetworkIndicator', status === 'done'); + ipc.on('uiAction_nodeLogText', function(e, text, data) { + if (showNodeLog && data) { + TemplateVar.set(template, 'logText', data); + TemplateVar.set(template, 'syncStatusMessage', false); + return; + } + }); + + ipc.on('uiAction_clientBinaryStatus', function(e, status) { + TemplateVar.set( + template, + 'text', + TAPi18n.__('mist.startScreen.clientBinaries.' + status) + ); + TemplateVar.set(template, 'showNetworkIndicator', status === 'done'); + TemplateVar.set(template, 'showProgressBar', false); + TemplateVar.set(template, 'showStartAppButton', false); + TemplateVar.set(template, 'showRetryConnectionButton', false); + TemplateVar.set(template, 'logText', null); + }); + + ipc.on('uiAction_nodeStatus', function(e, status, errorTag) { + switch (status) { + case 'starting': + TemplateVar.set( + template, + 'text', + TAPi18n.__('mist.startScreen.nodeStarting') + ); + showNodeLog = true; + TemplateVar.set(template, 'logText', null); TemplateVar.set(template, 'showProgressBar', false); TemplateVar.set(template, 'showStartAppButton', false); TemplateVar.set(template, 'showRetryConnectionButton', false); - TemplateVar.set(template, 'logText', null); - }); - - - ipc.on('uiAction_nodeStatus', function (e, status, errorTag) { - switch (status) { - case 'starting': - TemplateVar.set(template, 'text', TAPi18n.__('mist.startScreen.nodeStarting')); - showNodeLog = true; - TemplateVar.set(template, 'logText', null); - TemplateVar.set(template, 'showProgressBar', false); - TemplateVar.set(template, 'showStartAppButton', false); - TemplateVar.set(template, 'showRetryConnectionButton', false); - break; - - case 'started': - TemplateVar.set(template, 'text', TAPi18n.__('mist.startScreen.nodeStarted')); - break; - - case 'connected': - TemplateVar.set(template, 'text', TAPi18n.__('mist.startScreen.nodeConnected')); - lastSyncData = {}; - break; - - case 'stopping': - TemplateVar.set(template, 'text', TAPi18n.__('mist.startScreen.nodeStopping')); - TemplateVar.set(template, 'showProgressBar', false); - TemplateVar.set(template, 'showStartAppButton', false); - break; - - case 'stopped': - TemplateVar.set(template, 'text', TAPi18n.__('mist.startScreen.nodeStopped')); - break; - - case 'connectionTimeout': - TemplateVar.set(template, 'text', TAPi18n.__('mist.startScreen.nodeConnectionTimeout')); - break; - - case 'error': - errorTag = 'mist.startScreen.' + (errorTag || 'nodeError'); - - TemplateVar.set(template, 'text', TAPi18n.__(errorTag)); - TemplateVar.set(template, 'showRetryConnectionButton', true); - TemplateVar.set(template, 'retryConnectionButtonText', TAPi18n.__('mist.startScreen.retryConnection')); - break; + break; + + case 'started': + TemplateVar.set( + template, + 'text', + TAPi18n.__('mist.startScreen.nodeStarted') + ); + break; + + case 'connected': + TemplateVar.set( + template, + 'text', + TAPi18n.__('mist.startScreen.nodeConnected') + ); + lastSyncData = {}; + break; + + case 'stopping': + TemplateVar.set( + template, + 'text', + TAPi18n.__('mist.startScreen.nodeStopping') + ); + TemplateVar.set(template, 'showProgressBar', false); + TemplateVar.set(template, 'showStartAppButton', false); + break; + + case 'stopped': + TemplateVar.set( + template, + 'text', + TAPi18n.__('mist.startScreen.nodeStopped') + ); + break; + + case 'connectionTimeout': + TemplateVar.set( + template, + 'text', + TAPi18n.__('mist.startScreen.nodeConnectionTimeout') + ); + break; + + case 'error': + errorTag = 'mist.startScreen.' + (errorTag || 'nodeError'); + + TemplateVar.set(template, 'text', TAPi18n.__(errorTag)); + TemplateVar.set(template, 'showRetryConnectionButton', true); + TemplateVar.set( + template, + 'retryConnectionButtonText', + TAPi18n.__('mist.startScreen.retryConnection') + ); + break; + } + }); + + ipc.on('uiAction_nodeSyncStatus', function(e, status, data) { + console.trace('Node sync status', status, data); + + TemplateVar.set(template, 'smallClass', 'small'); + + if (status === 'inProgress') { + TemplateVar.set(template, 'showStartAppButton', true); + TemplateVar.set( + template, + 'startAppButtonText', + TAPi18n.__('mist.startScreen.launchApp') + ); + + if (data !== false) { + // if state is "in progress" and we have data + showNodeLog = false; + var translationString = ''; + + // add the data received to the object lastSyncData + lastSyncData = _.extend(lastSyncData, data || {}); + + // Select the appropriate message + if (web3.net.peerCount > 0) { + // Check which state we are + if ( + 0 < lastSyncData._displayKnownStates && + (Number(lastSyncData.pulledStates) !== + Math.round(lastSyncData._displayState) || + Number(lastSyncData.knownStates) !== + Math.round(lastSyncData._displayKnownStates)) + ) { + // Mostly downloading new states + translationString = 'mist.startScreen.nodeSyncInfoStates'; + } else { + // Mostly downloading blocks + translationString = 'mist.startScreen.nodeSyncInfo'; + } + } else { + // Not online + translationString = 'mist.startScreen.nodeSyncConnecting'; } - }); - - ipc.on('uiAction_nodeSyncStatus', function (e, status, data) { - console.trace('Node sync status', status, data); - - TemplateVar.set(template, 'smallClass', 'small'); - - if (status === 'inProgress') { - TemplateVar.set(template, 'showStartAppButton', true); - TemplateVar.set(template, 'startAppButtonText', TAPi18n.__('mist.startScreen.launchApp')); - - if (data !== false) { - // if state is "in progress" and we have data - showNodeLog = false; - var translationString = ''; - - // add the data received to the object lastSyncData - lastSyncData = _.extend(lastSyncData, data || {}); - - // Select the appropriate message - if (web3.net.peerCount > 0) { - // Check which state we are - if (0 < lastSyncData._displayKnownStates && ( - Number(lastSyncData.pulledStates) !== Math.round(lastSyncData._displayState) - || Number(lastSyncData.knownStates) !== Math.round(lastSyncData._displayKnownStates)) - ) { - // Mostly downloading new states - translationString = 'mist.startScreen.nodeSyncInfoStates'; - } else { - // Mostly downloading blocks - translationString = 'mist.startScreen.nodeSyncInfo'; - } - } else { - // Not online - translationString = 'mist.startScreen.nodeSyncConnecting'; - } - - // Saves data as numbers (hex) - lastSyncData._highestBlock = lastSyncData.highestBlock; - - // saves data as pretty strings - lastSyncData.highestBlock = numeral(lastSyncData.highestBlock).format('0,0'); - - // saves to template - TemplateVar.set(template, 'lastSyncData', lastSyncData); - - } else { - // It's not connected anymore - if (web3.net.peerCount > 1) { - translationString = 'mist.startScreen.nodeSyncFoundPeers'; - } else { - translationString = 'mist.startScreen.nodeSyncConnecting'; - } - - TemplateVar.set(template, 'lastSyncData', { 'peers': web3.net.peerCount }); - - } - - TemplateVar.set(template, 'logText', false); - TemplateVar.set(template, 'text', TAPi18n.__('mist.startScreen.nodeSyncing')); - TemplateVar.set(template, 'syncStatusMessage', translationString); + + // Saves data as numbers (hex) + lastSyncData._highestBlock = lastSyncData.highestBlock; + + // saves data as pretty strings + lastSyncData.highestBlock = numeral(lastSyncData.highestBlock).format( + '0,0' + ); + + // saves to template + TemplateVar.set(template, 'lastSyncData', lastSyncData); + } else { + // It's not connected anymore + if (web3.net.peerCount > 1) { + translationString = 'mist.startScreen.nodeSyncFoundPeers'; + } else { + translationString = 'mist.startScreen.nodeSyncConnecting'; } - }); + TemplateVar.set(template, 'lastSyncData', { + peers: web3.net.peerCount + }); + } + + TemplateVar.set(template, 'logText', false); + TemplateVar.set( + template, + 'text', + TAPi18n.__('mist.startScreen.nodeSyncing') + ); + TemplateVar.set(template, 'syncStatusMessage', translationString); + } + }); }); Template['popupWindows_splashScreen'].helpers({ - /** + /** Returns the current splash screen mode @method mode */ - 'mode': function () { - return window.mistMode; - }, - /** + mode: function() { + return window.mistMode; + }, + /** Returns the icon path @method iconPath */ - 'iconPath': function () { - return 'file://' + window.dirname + '/icons/' + window.mistMode + '/icon2x.png'; - }, - /** + iconPath: function() { + return ( + 'file://' + window.dirname + '/icons/' + window.mistMode + '/icon2x.png' + ); + }, + /** Updates the Sync Message live @method syncStatus */ - 'syncStatus': function () { - - // This functions loops trhough numbers while waiting for the node to respond - var template = Template.instance(); - Meteor.clearInterval(template._intervalId); - - // Create an interval to quickly iterate trough the numbers - template._intervalId = Meteor.setInterval(function () { - // loads data from templates - var syncData = TemplateVar.get(template, 'lastSyncData', lastSyncData); - var translationString = TemplateVar.get(template, 'syncStatusMessage'); - - if (!(syncData._displayBlock > -1)) { - // initialize the display numbers - syncData._displayBlock = Number(syncData.currentBlock); - syncData._displayState = Number(syncData.pulledStates || 0); - syncData._displayKnownStates = Number(syncData.knownStates || 0); - } else { - // Increment each them slowly to match target number - syncData._displayBlock += (Number(syncData.currentBlock) - syncData._displayBlock) / 100; - syncData._displayState += (Number(syncData.pulledStates || 0) - syncData._displayState) / 100; - syncData._displayKnownStates += (Number(syncData.knownStates || 0) - syncData._displayKnownStates) / 100; - } - - // Create the fancy strings - lastSyncData.displayBlock = numeral(Math.round(lastSyncData._displayBlock)).format('0,0'); - lastSyncData.displayState = numeral(Math.round(lastSyncData._displayState)).format('0,0'); - lastSyncData.displayKnownStates = numeral(Math.round(lastSyncData._displayKnownStates)).format('0,0'); - - // Translate it - var translatedMessage = TAPi18n.__(translationString, syncData); - - // Calculates both progress bars - var stateProgress = null; - if (0 < lastSyncData._displayKnownStates) { - stateProgress = (lastSyncData._displayState / lastSyncData._displayKnownStates) * 100; - } - - var progress = ((lastSyncData._displayBlock - Number(lastSyncData.startingBlock)) / (Number(lastSyncData._highestBlock) - Number(lastSyncData.startingBlock))) * 100; - - // Saves data back to templates - TemplateVar.set(template, 'syncStatusMessageLive', translatedMessage); - TemplateVar.set(template, 'lastSyncData', syncData); - - // set progress value - if (_.isFinite(progress)) { - TemplateVar.set(template, 'showProgressBar', true); - TemplateVar.set(template, 'progress', progress); - if (null !== stateProgress) { - TemplateVar.set(template, 'showStateProgressBar', true); - TemplateVar.set(template, 'stateProgress', stateProgress); - } - } - - }, 10); - - return TemplateVar.get(template, 'syncStatusMessageLive'); - } -}); + syncStatus: function() { + // This functions loops trhough numbers while waiting for the node to respond + var template = Template.instance(); + Meteor.clearInterval(template._intervalId); + + // Create an interval to quickly iterate trough the numbers + template._intervalId = Meteor.setInterval(function() { + // loads data from templates + var syncData = TemplateVar.get(template, 'lastSyncData', lastSyncData); + var translationString = TemplateVar.get(template, 'syncStatusMessage'); + + if (!(syncData._displayBlock > -1)) { + // initialize the display numbers + syncData._displayBlock = Number(syncData.currentBlock); + syncData._displayState = Number(syncData.pulledStates || 0); + syncData._displayKnownStates = Number(syncData.knownStates || 0); + } else { + // Increment each them slowly to match target number + syncData._displayBlock += + (Number(syncData.currentBlock) - syncData._displayBlock) / 100; + syncData._displayState += + (Number(syncData.pulledStates || 0) - syncData._displayState) / 100; + syncData._displayKnownStates += + (Number(syncData.knownStates || 0) - syncData._displayKnownStates) / + 100; + } + + // Create the fancy strings + lastSyncData.displayBlock = numeral( + Math.round(lastSyncData._displayBlock) + ).format('0,0'); + lastSyncData.displayState = numeral( + Math.round(lastSyncData._displayState) + ).format('0,0'); + lastSyncData.displayKnownStates = numeral( + Math.round(lastSyncData._displayKnownStates) + ).format('0,0'); + + // Translate it + var translatedMessage = TAPi18n.__(translationString, syncData); + + // Calculates both progress bars + var stateProgress = null; + if (0 < lastSyncData._displayKnownStates) { + stateProgress = + lastSyncData._displayState / lastSyncData._displayKnownStates * 100; + } + + var progress = + (lastSyncData._displayBlock - Number(lastSyncData.startingBlock)) / + (Number(lastSyncData._highestBlock) - + Number(lastSyncData.startingBlock)) * + 100; + + // Saves data back to templates + TemplateVar.set(template, 'syncStatusMessageLive', translatedMessage); + TemplateVar.set(template, 'lastSyncData', syncData); + + // set progress value + if (_.isFinite(progress)) { + TemplateVar.set(template, 'showProgressBar', true); + TemplateVar.set(template, 'progress', progress); + if (null !== stateProgress) { + TemplateVar.set(template, 'showStateProgressBar', true); + TemplateVar.set(template, 'stateProgress', stateProgress); + } + } + }, 10); + return TemplateVar.get(template, 'syncStatusMessageLive'); + } +}); Template['popupWindows_splashScreen'].events({ - 'click .start-app': function () { - ipc.send('backendAction_skipSync'); - }, + 'click .start-app': function() { + ipc.send('backendAction_skipSync'); + }, - 'click .retry-connection': function () { - ipc.send('retryConnection'); - } + 'click .retry-connection': function() { + ipc.send('retryConnection'); + } }); diff --git a/interface/client/templates/popupWindows/unlockMasterPassword.js b/interface/client/templates/popupWindows/unlockMasterPassword.js index 49de9e486..ba136f79c 100644 --- a/interface/client/templates/popupWindows/unlockMasterPassword.js +++ b/interface/client/templates/popupWindows/unlockMasterPassword.js @@ -11,45 +11,46 @@ The request account popup window template @constructor */ -Template['popupWindows_unlockMasterPassword'].onRendered(function () { - var template = this; +Template['popupWindows_unlockMasterPassword'].onRendered(function() { + var template = this; - template.$('input.password').focus(); + template.$('input.password').focus(); - template.autorun(function () { - var data = Session.get('data'); + template.autorun(function() { + var data = Session.get('data'); - if (data && data.masterPasswordWrong) { - TemplateVar.set('unlocking', false); + if (data && data.masterPasswordWrong) { + TemplateVar.set('unlocking', false); - Tracker.afterFlush(function () { - template.$('input.password').focus(); - }); + Tracker.afterFlush(function() { + template.$('input.password').focus(); + }); - GlobalNotification.warning({ - content: TAPi18n.__('mist.popupWindows.unlockMasterPassword.errors.wrongPassword'), - duration: 3 - }); + GlobalNotification.warning({ + content: TAPi18n.__( + 'mist.popupWindows.unlockMasterPassword.errors.wrongPassword' + ), + duration: 3 + }); - Session.set('data', false); - } - }); + Session.set('data', false); + } + }); }); - Template['popupWindows_unlockMasterPassword'].events({ - 'click .cancel': function () { - ipc.send('backendAction_closePopupWindow'); - }, - 'submit form': function (e, template) { - e.preventDefault(); - var pw = template.find('input.password').value; + 'click .cancel': function() { + ipc.send('backendAction_closePopupWindow'); + }, + 'submit form': function(e, template) { + e.preventDefault(); + var pw = template.find('input.password').value; - TemplateVar.set('unlocking', true); + TemplateVar.set('unlocking', true); - ipc.send('backendAction_unlockedMasterPassword', null, pw); + ipc.send('backendAction_unlockedMasterPassword', null, pw); - template.find('input.password').value = ''; - pw = null; - } + template.find('input.password').value = ''; + pw = null; + } }); diff --git a/interface/client/templates/popupWindows/updateAvailable.js b/interface/client/templates/popupWindows/updateAvailable.js index 7605ecbb1..464c90f8a 100644 --- a/interface/client/templates/popupWindows/updateAvailable.js +++ b/interface/client/templates/popupWindows/updateAvailable.js @@ -10,43 +10,40 @@ The updateAvailable template @class [template] popupWindows_updateAvailable @constructor */ -Template['popupWindows_updateAvailable'].onCreated(function () { - var template = this; +Template['popupWindows_updateAvailable'].onCreated(function() { + var template = this; - TemplateVar.set(template, 'checking', true); + TemplateVar.set(template, 'checking', true); - /* + /* When app update check is in progress it. */ - ipc.on('uiAction_checkUpdateInProgress', function (e, update) { - console.debug('Update check in progress...'); + ipc.on('uiAction_checkUpdateInProgress', function(e, update) { + console.debug('Update check in progress...'); - TemplateVar.set(template, 'checking', true); - }); + TemplateVar.set(template, 'checking', true); + }); - /* + /* When app update data is received display it. */ - ipc.on('uiAction_checkUpdateDone', function (e, update) { - console.debug('Update check done'); + ipc.on('uiAction_checkUpdateDone', function(e, update) { + console.debug('Update check done'); - TemplateVar.set(template, 'checking', false); + TemplateVar.set(template, 'checking', false); - if (update) { - TemplateVar.set(template, 'update', update); - } - }); + if (update) { + TemplateVar.set(template, 'update', update); + } + }); }); - Template['popupWindows_updateAvailable'].events({ - 'click .get-update': function (e) { - var update = TemplateVar.get('update'); + 'click .get-update': function(e) { + var update = TemplateVar.get('update'); - if (update && update.url) { - ipc.send('backendAction_openExternalUrl', update.url); - } + if (update && update.url) { + ipc.send('backendAction_openExternalUrl', update.url); } + } }); - - diff --git a/interface/client/templates/views/webview.js b/interface/client/templates/views/webview.js index 6cf6bfbfc..7b0c6d932 100644 --- a/interface/client/templates/views/webview.js +++ b/interface/client/templates/views/webview.js @@ -4,7 +4,6 @@ Template Controllers @module Templates */ - /** The tab template @@ -12,161 +11,181 @@ The tab template @constructor */ -Template['views_webview'].onRendered(function () { - var template = this, - tabId = template.data._id, - webview = template.find('webview'); - - - ipc.on('uiAction_reloadSelectedTab', function (e) { - console.log('uiAction_reloadSelectedTab', LocalStore.get('selectedTab')); - if (LocalStore.get('selectedTab') === this._id) { - var webview = Helpers.getWebview(LocalStore.get('selectedTab')); - webview.reload(); - } - }); - - webview.addEventListener('did-start-loading', function (e) { - TemplateVar.set(template, 'loading', true); - }); - webview.addEventListener('did-stop-loading', function (e) { - TemplateVar.set(template, 'loading', false); - }); - - // change url - webview.addEventListener('did-navigate', webviewChangeUrl.bind(webview, tabId)); - webview.addEventListener('did-navigate-in-page', webviewChangeUrl.bind(webview, tabId)); - webview.addEventListener('did-get-redirect-request', webviewChangeUrl.bind(webview, tabId)); - webview.addEventListener('did-stop-loading', webviewChangeUrl.bind(webview, tabId)); - - // set page history - webview.addEventListener('dom-ready', function (e) { - - var titleFull = webview.getTitle(), - title = titleFull; - - if (titleFull && titleFull.length > 40) { - title = titleFull.substr(0, 40); - title += '…'; - } - - // update the title - Tabs.update(tabId, { $set: { - name: title, - nameFull: titleFull, - // url: webview.getURL(), - } }); +Template['views_webview'].onRendered(function() { + var template = this, + tabId = template.data._id, + webview = template.find('webview'); - webviewLoadStop.call(this, tabId, e); - }); + ipc.on('uiAction_reloadSelectedTab', function(e) { + console.log('uiAction_reloadSelectedTab', LocalStore.get('selectedTab')); + if (LocalStore.get('selectedTab') === this._id) { + var webview = Helpers.getWebview(LocalStore.get('selectedTab')); + webview.reload(); + } + }); + + webview.addEventListener('did-start-loading', function(e) { + TemplateVar.set(template, 'loading', true); + }); + webview.addEventListener('did-stop-loading', function(e) { + TemplateVar.set(template, 'loading', false); + }); + + // change url + webview.addEventListener( + 'did-navigate', + webviewChangeUrl.bind(webview, tabId) + ); + webview.addEventListener( + 'did-navigate-in-page', + webviewChangeUrl.bind(webview, tabId) + ); + webview.addEventListener( + 'did-get-redirect-request', + webviewChangeUrl.bind(webview, tabId) + ); + webview.addEventListener( + 'did-stop-loading', + webviewChangeUrl.bind(webview, tabId) + ); + + // set page history + webview.addEventListener('dom-ready', function(e) { + var titleFull = webview.getTitle(), + title = titleFull; + + if (titleFull && titleFull.length > 40) { + title = titleFull.substr(0, 40); + title += '…'; + } - // show error pages - webview.addEventListener('did-fail-load', showError.bind(webview, tabId)); - webview.addEventListener('crashed', showError.bind(webview, tabId)); - - // Forward SWARM status code errors to showError - webview.addEventListener('did-get-response-details', function (e) { - if (e && e.resourceType === 'mainFrame' && /^bzz:\//i.test(e.newURL)) { - switch (e.httpResponseCode) { - case 500: - showError.call(webview, tabId, { - isMainFrame: true, - errorCode: 404 - }); - break; - } - } + // update the title + Tabs.update(tabId, { + $set: { + name: title, + nameFull: titleFull + // url: webview.getURL(), + } }); - - // navigate page, and redirect to browser tab if necessary - webview.addEventListener('will-navigate', webviewLoadStart.bind(webview, tabId)); - webview.addEventListener('did-get-redirect-request', webviewLoadStart.bind(webview, tabId)); - webview.addEventListener('new-window', webviewLoadStart.bind(webview, tabId)); - - - // MIST API for installed tabs/dapps - webview.addEventListener('ipc-message', mistAPIBackend.bind({ - template: template, - webview: webview - })); + webviewLoadStop.call(this, tabId, e); + }); + + // show error pages + webview.addEventListener('did-fail-load', showError.bind(webview, tabId)); + webview.addEventListener('crashed', showError.bind(webview, tabId)); + + // Forward SWARM status code errors to showError + webview.addEventListener('did-get-response-details', function(e) { + if (e && e.resourceType === 'mainFrame' && /^bzz:\//i.test(e.newURL)) { + switch (e.httpResponseCode) { + case 500: + showError.call(webview, tabId, { + isMainFrame: true, + errorCode: 404 + }); + break; + } + } + }); + + // navigate page, and redirect to browser tab if necessary + webview.addEventListener( + 'will-navigate', + webviewLoadStart.bind(webview, tabId) + ); + webview.addEventListener( + 'did-get-redirect-request', + webviewLoadStart.bind(webview, tabId) + ); + webview.addEventListener('new-window', webviewLoadStart.bind(webview, tabId)); + + // MIST API for installed tabs/dapps + webview.addEventListener( + 'ipc-message', + mistAPIBackend.bind({ + template: template, + webview: webview + }) + ); }); - Template['views_webview'].helpers({ - /** + /** Gets the correct preloader file @method (preloaderFile) */ - 'preloaderFile': function () { - switch (this._id) { - case 'browser': - return 'file://' + Helpers.preloaderDirname + '/browser.js'; - case 'tests': - return 'file://' + Helpers.preloaderDirname + '/tests.js'; - default: - return 'file://' + Helpers.preloaderDirname + '/dapps.js'; - } - }, - /** + preloaderFile: function() { + switch (this._id) { + case 'browser': + return 'file://' + Helpers.preloaderDirname + '/browser.js'; + case 'tests': + return 'file://' + Helpers.preloaderDirname + '/tests.js'; + default: + return 'file://' + Helpers.preloaderDirname + '/dapps.js'; + } + }, + /** Determines if the current tab is visible @method (isVisible) */ - 'isVisible': function () { - return (LocalStore.get('selectedTab') === this._id) ? '' : 'hidden'; - }, - /** + isVisible: function() { + return LocalStore.get('selectedTab') === this._id ? '' : 'hidden'; + }, + /** Gets the current url @method (checkedUrl) */ - 'checkedUrl': function () { - var template = Template.instance(); - var tab = Tabs.findOne(this._id, { fields: { redirect: 1 } }); - var url; - - if (tab) { - - // set url only once - if (tab.redirect) { - url = tab.redirect; - - // remove redirect - Tabs.update(this._id, { $unset: { - redirect: '' - } }); - } - - // allow error pages - if (url && url.indexOf('file://' + dirname + '/errorPages/') === 0) { - return url; - } - - // CHECK URL and throw error if not allowed - if (!Helpers.sanitizeUrl(url, true)) { - - // Prevent websites usingt the history back attacks - if (template.view.isRendered) { - // get the current webview - var webview = template.find('webview'); - webview.clearHistory(); - } - - console.warn('Not allowed URL: ' + template.url); - return 'file://' + dirname + '/errorPages/400.html'; - } - - // add url - if (url) { - template.url = url; - Tabs.update(this._id, { $set: { - url: url - } }); - } - - return Helpers.formatUrl(url); + checkedUrl: function() { + var template = Template.instance(); + var tab = Tabs.findOne(this._id, { fields: { redirect: 1 } }); + var url; + + if (tab) { + // set url only once + if (tab.redirect) { + url = tab.redirect; + + // remove redirect + Tabs.update(this._id, { + $unset: { + redirect: '' + } + }); + } + + // allow error pages + if (url && url.indexOf('file://' + dirname + '/errorPages/') === 0) { + return url; + } + + // CHECK URL and throw error if not allowed + if (!Helpers.sanitizeUrl(url, true)) { + // Prevent websites usingt the history back attacks + if (template.view.isRendered) { + // get the current webview + var webview = template.find('webview'); + webview.clearHistory(); } + + console.warn('Not allowed URL: ' + template.url); + return 'file://' + dirname + '/errorPages/400.html'; + } + + // add url + if (url) { + template.url = url; + Tabs.update(this._id, { + $set: { + url: url + } + }); + } + + return Helpers.formatUrl(url); } + } }); diff --git a/interface/client/templates/webviewEvents.js b/interface/client/templates/webviewEvents.js index dc4e03347..e668f4578 100644 --- a/interface/client/templates/webviewEvents.js +++ b/interface/client/templates/webviewEvents.js @@ -1,139 +1,151 @@ +showError = function(tabId, e) { + if (e.isMainFrame || e.killed) { + var url, + path = 'file://' + dirname + '/errorPages/'; -showError = function (tabId, e) { - if (e.isMainFrame || e.killed) { - var url, - path = 'file://' + dirname + '/errorPages/'; - - if (e.killed) { - e.errorCode = 500; - } - - switch (e.errorCode) { - case -105: - url = path + '404.html'; - break; - case 404: - url = path + '404.html'; - break; - case 500: - url = path + '500.html'; - break; - } - - if (url) { - Tabs.update(tabId, { $set: { - redirect: url - } }); - } + if (e.killed) { + e.errorCode = 500; } -}; - -webviewChangeUrl = function (tabId, e) { - if (e.type === 'did-navigate-in-page' && !e.isMainFrame) { - return; + switch (e.errorCode) { + case -105: + url = path + '404.html'; + break; + case 404: + url = path + '404.html'; + break; + case 500: + url = path + '500.html'; + break; } - var url = Helpers.sanitizeUrl(e.url || this.getURL()); - - console.log(e.type, tabId, url); - - if (e.type === 'did-navigate') { - // destroy socket when navigating away - ipc.send('ipcProvider-destroy', this.getWebContents().id); + if (url) { + Tabs.update(tabId, { + $set: { + redirect: url + } + }); } + } +}; - // make sure to not store error pages in history - if (!url || url.indexOf('mist/errorPages/') !== -1 || url.indexOf('app.asar/errorPages/') !== -1) { - return; +webviewChangeUrl = function(tabId, e) { + if (e.type === 'did-navigate-in-page' && !e.isMainFrame) { + return; + } + + var url = Helpers.sanitizeUrl(e.url || this.getURL()); + + console.log(e.type, tabId, url); + + if (e.type === 'did-navigate') { + // destroy socket when navigating away + ipc.send('ipcProvider-destroy', this.getWebContents().id); + } + + // make sure to not store error pages in history + if ( + !url || + url.indexOf('mist/errorPages/') !== -1 || + url.indexOf('app.asar/errorPages/') !== -1 + ) { + return; + } + + // update the URL + Tabs.update(tabId, { + $set: { + url: url } - - // update the URL - Tabs.update(tabId, { $set: { - url: url - } }); + }); }; // fired by "did-stop-loading" -webviewLoadStop = function (tabId, e) { - var webview = this, - url = Helpers.sanitizeUrl(webview.getURL()), - title = webview.getTitle(); - - console.log(e.type, tabId, url); - - // IS BROWSER - if (tabId === 'browser') { - - // ADD to doogle last visited pages - if ((find = _.find(LastVisitedPages.find().fetch(), function (historyEntry) { - if (!historyEntry.url) { - return; - } - var historyEntryOrigin = new URL(historyEntry.url).origin; - return (url.indexOf(historyEntryOrigin) !== -1); - }))) { - LastVisitedPages.update(find._id, { $set: { - timestamp: moment().unix(), - url: url - } }); - } else { - LastVisitedPages.insert({ - name: title, - url: url, - // icon: '', - timestamp: moment().unix() - }); +webviewLoadStop = function(tabId, e) { + var webview = this, + url = Helpers.sanitizeUrl(webview.getURL()), + title = webview.getTitle(); + + console.log(e.type, tabId, url); + + // IS BROWSER + if (tabId === 'browser') { + // ADD to doogle last visited pages + if ( + (find = _.find(LastVisitedPages.find().fetch(), function(historyEntry) { + if (!historyEntry.url) { + return; } - - // ADD to doogle history - if (find = History.findOne({ url: url })) { - History.update(find._id, { $set: { timestamp: moment().unix() } }); - } else { - History.insert({ - name: title, - url: url, - // icon: '', - timestamp: moment().unix() - }); + var historyEntryOrigin = new URL(historyEntry.url).origin; + return url.indexOf(historyEntryOrigin) !== -1; + })) + ) { + LastVisitedPages.update(find._id, { + $set: { + timestamp: moment().unix(), + url: url } + }); + } else { + LastVisitedPages.insert({ + name: title, + url: url, + // icon: '', + timestamp: moment().unix() + }); } -}; + // ADD to doogle history + if ((find = History.findOne({ url: url }))) { + History.update(find._id, { $set: { timestamp: moment().unix() } }); + } else { + History.insert({ + name: title, + url: url, + // icon: '', + timestamp: moment().unix() + }); + } + } +}; // fired by "did-get-redirect-request" // fired by "new-window" // fired by "will-navigate" -webviewLoadStart = function (currentTabId, e) { - var webview = this; +webviewLoadStart = function(currentTabId, e) { + var webview = this; - if (e.type === 'did-get-redirect-request' && !e.isMainFrame) { - return; - } - - console.log(e.type, currentTabId, e); + if (e.type === 'did-get-redirect-request' && !e.isMainFrame) { + return; + } - // stop this action, as the redirect happens reactive through setting the URL attribute - e.preventDefault(); // doesnt work - webview.stop(); // doesnt work - ipc.sendSync('backendAction_stopWebviewNavigation', webview.getWebContents().id); + console.log(e.type, currentTabId, e); + // stop this action, as the redirect happens reactive through setting the URL attribute + e.preventDefault(); // doesnt work + webview.stop(); // doesnt work + ipc.sendSync( + 'backendAction_stopWebviewNavigation', + webview.getWebContents().id + ); - var url = Helpers.sanitizeUrl(e.newURL || e.url); - var tabId = Helpers.getTabIdByUrl(url); + var url = Helpers.sanitizeUrl(e.newURL || e.url); + var tabId = Helpers.getTabIdByUrl(url); - // if new window (_blank) open in tab, or browser - if (e.type === 'new-window' && tabId === currentTabId) { - tabId = 'browser'; - } + // if new window (_blank) open in tab, or browser + if (e.type === 'new-window' && tabId === currentTabId) { + tabId = 'browser'; + } - var tab = Tabs.findOne(tabId); + var tab = Tabs.findOne(tabId); - if (tab.url !== url) { - Tabs.update(tabId, { $set: { - redirect: url, - url: url - } }); - } - LocalStore.set('selectedTab', tabId); + if (tab.url !== url) { + Tabs.update(tabId, { + $set: { + redirect: url, + url: url + } + }); + } + LocalStore.set('selectedTab', tabId); }; diff --git a/interface/client/windowEvents.js b/interface/client/windowEvents.js index 4b78209f5..8e344e508 100644 --- a/interface/client/windowEvents.js +++ b/interface/client/windowEvents.js @@ -1,61 +1,55 @@ - // add the platform to the HTML tag -setTimeout(function () { - document.getElementsByTagName('html')[0].className = window.mist.platform; - - if (window.basePathHref) { - var base = document.createElement('base'); +setTimeout(function() { + document.getElementsByTagName('html')[0].className = window.mist.platform; - base.href = window.basePathHref; + if (window.basePathHref) { + var base = document.createElement('base'); - document.getElementsByTagName('head')[0].appendChild(base); - } + base.href = window.basePathHref; + document.getElementsByTagName('head')[0].appendChild(base); + } }, 200); - -$(window).on('blur', function (e) { - $('body').addClass('app-blur'); +$(window).on('blur', function(e) { + $('body').addClass('app-blur'); }); -$(window).on('focus', function (e) { - $('body').removeClass('app-blur'); +$(window).on('focus', function(e) { + $('body').removeClass('app-blur'); }); // make sure files can only be dropped in the browser webview -$(window).on('dragenter', function (e) { - LocalStore.set('selectedTab', 'browser'); - ipc.send('backendAction_focusMainWindow'); +$(window).on('dragenter', function(e) { + LocalStore.set('selectedTab', 'browser'); + ipc.send('backendAction_focusMainWindow'); }); - -$(window).on('keydown', function (e) { - - // Select tab with index when number is 1-8 - if (e.metaKey && e.keyCode >= 49 && e.keyCode <= 56) { - var index = parseInt(String.fromCharCode(e.keyCode), 10) - 1; - Helpers.selectTabWithIndex(index); - return; +$(window).on('keydown', function(e) { + // Select tab with index when number is 1-8 + if (e.metaKey && e.keyCode >= 49 && e.keyCode <= 56) { + var index = parseInt(String.fromCharCode(e.keyCode), 10) - 1; + Helpers.selectTabWithIndex(index); + return; + } + + // RELOAD current webview + if (e.metaKey && e.keyCode === 82) { + var webview = Helpers.getWebview(LocalStore.get('selectedTab')); + if (webview) { + webview.reloadIgnoringCache(); } - - // RELOAD current webview - if (e.metaKey && e.keyCode === 82) { - var webview = Helpers.getWebview(LocalStore.get('selectedTab')); - if (webview) { - webview.reloadIgnoringCache(); - } - return; - } - - // Select last tab on Ctrl + 9 - if (e.metaKey && e.keyCode === 57) { - Helpers.selectLastTab(); - return; - } - - // Ctrl + tab || Ctrl + shift + tab - if (e.ctrlKey && e.keyCode === 9) { - var tabOffset = (e.shiftKey) ? -1 : 1; - Helpers.selectTabWithOffset(tabOffset); - } - + return; + } + + // Select last tab on Ctrl + 9 + if (e.metaKey && e.keyCode === 57) { + Helpers.selectLastTab(); + return; + } + + // Ctrl + tab || Ctrl + shift + tab + if (e.ctrlKey && e.keyCode === 9) { + var tabOffset = e.shiftKey ? -1 : 1; + Helpers.selectTabWithOffset(tabOffset); + } }); diff --git a/main.js b/main.js index 5ac2888ff..7246f0119 100644 --- a/main.js +++ b/main.js @@ -15,19 +15,22 @@ const Settings = require('./modules/settings'); import configureReduxStore from './modules/core/store'; import { quitApp } from './modules/core/ui/actions'; -import { setLanguageOnMain, toggleSwarm } from './modules/core/settings/actions'; +import { + setLanguageOnMain, + toggleSwarm +} from './modules/core/settings/actions'; import { SwarmState } from './modules/core/settings/reducer'; import swarmNode from './modules/swarmNode.js'; Q.config({ - cancellation: true, + cancellation: true }); global.store = configureReduxStore(); Settings.init(); -const db = global.db = require('./modules/db'); +const db = (global.db = require('./modules/db')); require('./modules/ipcCommunicator.js'); const appMenu = require('./modules/menuItems'); @@ -42,38 +45,38 @@ global.mode = store.getState().settings.uiMode; global.icon = `${__dirname}/icons/${global.mode}/icon.png`; global.dirname = __dirname; global.i18n = i18n; - + // INTERFACE PATHS // - WALLET if (global.mode === 'wallet') { - log.info('Starting in Wallet mode'); + log.info('Starting in Wallet mode'); - global.interfaceAppUrl = (Settings.inProductionMode) - ? `file://${__dirname}/interface/wallet/index.html` - : 'http://localhost:3050'; - global.interfacePopupsUrl = (Settings.inProductionMode) - ? `file://${__dirname}/interface/index.html` - : 'http://localhost:3000'; + global.interfaceAppUrl = Settings.inProductionMode + ? `file://${__dirname}/interface/wallet/index.html` + : 'http://localhost:3050'; + global.interfacePopupsUrl = Settings.inProductionMode + ? `file://${__dirname}/interface/index.html` + : 'http://localhost:3000'; -// - MIST + // - MIST } else { - log.info('Starting in Mist mode'); + log.info('Starting in Mist mode'); - let url = (Settings.inProductionMode) - ? `file://${__dirname}/interface/index.html` - : 'http://localhost:3000'; + let url = Settings.inProductionMode + ? `file://${__dirname}/interface/index.html` + : 'http://localhost:3000'; - if (Settings.cli.resetTabs) { - url += '?reset-tabs=true'; - } + if (Settings.cli.resetTabs) { + url += '?reset-tabs=true'; + } - global.interfaceAppUrl = global.interfacePopupsUrl = url; + global.interfaceAppUrl = global.interfacePopupsUrl = url; } // prevent crashes and close gracefully -process.on('uncaughtException', (error) => { - log.error('UNCAUGHT EXCEPTION', error); - store.dispatch(quitApp()); +process.on('uncaughtException', error => { + log.error('UNCAUGHT EXCEPTION', error); + store.dispatch(quitApp()); }); // Quit when all windows are closed. @@ -82,39 +85,37 @@ app.on('window-all-closed', () => store.dispatch(quitApp())); // Listen to custom protocol incoming messages, needs registering of URL schemes app.on('open-url', (e, url) => log.info('Open URL', url)); - let killedSocketsAndNodes = false; -app.on('before-quit', async (event) => { - if (!killedSocketsAndNodes) { - log.info('Defer quitting until sockets and node are shut down'); - - event.preventDefault(); - - // sockets manager - try { - await Sockets.destroyAll(); - store.dispatch({ type: '[MAIN]:SOCKETS:DESTROY' }); - } catch (e) { - log.error('Error shutting down sockets'); - } - - // delay quit, so the sockets can close - setTimeout(async () => { - await ethereumNode.stop(); - store.dispatch({ type: '[MAIN]:ETH_NODE:STOP' }); - - killedSocketsAndNodes = true; - await db.close(); - store.dispatch({ type: '[MAIN]:DB:CLOSE' }); - - store.dispatch(quitApp()); - }, 500); - } else { - log.info('About to quit...'); +app.on('before-quit', async event => { + if (!killedSocketsAndNodes) { + log.info('Defer quitting until sockets and node are shut down'); + + event.preventDefault(); + + // sockets manager + try { + await Sockets.destroyAll(); + store.dispatch({ type: '[MAIN]:SOCKETS:DESTROY' }); + } catch (e) { + log.error('Error shutting down sockets'); } -}); + // delay quit, so the sockets can close + setTimeout(async () => { + await ethereumNode.stop(); + store.dispatch({ type: '[MAIN]:ETH_NODE:STOP' }); + + killedSocketsAndNodes = true; + await db.close(); + store.dispatch({ type: '[MAIN]:DB:CLOSE' }); + + store.dispatch(quitApp()); + }, 500); + } else { + log.info('About to quit...'); + } +}); let mainWindow; let splashWindow; @@ -122,233 +123,293 @@ let splashWindow; // This method will be called when Electron has done everything // initialization and ready for creating browser windows. app.on('ready', async () => { - // if using HTTP RPC then inform user - if (Settings.rpcMode === 'http') { - dialog.showErrorBox('Insecure RPC connection', ` + // if using HTTP RPC then inform user + if (Settings.rpcMode === 'http') { + dialog.showErrorBox( + 'Insecure RPC connection', + ` WARNING: You are connecting to an Ethereum node via: ${Settings.rpcHttpPath} This is less secure than using local IPC - your passwords will be sent over the wire in plaintext. Only do this if you have secured your HTTP connection or you know what you are doing. -`); - } - - // initialise the db - try { - await global.db.init(); - store.dispatch({ type: '[MAIN]:DB:INIT' }); - onReady(); - } catch (e) { - log.error(e); - store.dispatch(quitApp()); - } +` + ); + } + + // initialise the db + try { + await global.db.init(); + store.dispatch({ type: '[MAIN]:DB:INIT' }); + onReady(); + } catch (e) { + log.error(e); + store.dispatch(quitApp()); + } }); protocol.registerStandardSchemes(['bzz']); -store.dispatch({ type: '[MAIN]:PROTOCOL:REGISTER', payload: { protocol: 'bzz' } }); +store.dispatch({ + type: '[MAIN]:PROTOCOL:REGISTER', + payload: { protocol: 'bzz' } +}); async function onReady() { - global.config = db.getCollection('SYS_config'); + global.config = db.getCollection('SYS_config'); - dbSync.initializeListeners(); + dbSync.initializeListeners(); - Windows.init(); + Windows.init(); - enableSwarmProtocol(); + enableSwarmProtocol(); - if (!Settings.inAutoTestMode) { await UpdateChecker.run(); } + if (!Settings.inAutoTestMode) { + await UpdateChecker.run(); + } - ipcProviderBackend.init(); + ipcProviderBackend.init(); - // TODO: Settings.language relies on global.config object being set - store.dispatch(setLanguageOnMain(Settings.language)); + // TODO: Settings.language relies on global.config object being set + store.dispatch(setLanguageOnMain(Settings.language)); - appMenu(); + appMenu(); - createCoreWindows(); + createCoreWindows(); - checkTimeSync(); + checkTimeSync(); - splashWindow ? splashWindow.on('ready', kickStart) : kickStart(); + splashWindow ? splashWindow.on('ready', kickStart) : kickStart(); } function enableSwarmProtocol() { - protocol.registerHttpProtocol('bzz', (request, callback) => { - if ([SwarmState.Disabling, SwarmState.Disabled].includes(store.getState().settings.swarmState)) { - const error = global.i18n.t('mist.errors.swarm.notEnabled'); - dialog.showErrorBox('Note', error); - callback({ error }); - store.dispatch({ type: '[MAIN]:PROTOCOL:ERROR', payload: { protocol: 'bzz', error } }); - return; - } - - const redirectPath = `${Settings.swarmURL}/${request.url.replace('bzz:/', 'bzz://')}`; - - if (store.getState().settings.swarmState === SwarmState.Enabling) { - swarmNode.on('started', () => { - callback({ method: request.method, referrer: request.referrer, url: redirectPath }); - }); - } else { // Swarm enabled - callback({ method: request.method, referrer: request.referrer, url: redirectPath }); - } - - store.dispatch({ type: '[MAIN]:PROTOCOL:REQUEST', payload: { protocol: 'bzz' } }); - - }, (error) => { - if (error) { - log.error(error); - } - }); + protocol.registerHttpProtocol( + 'bzz', + (request, callback) => { + if ( + [SwarmState.Disabling, SwarmState.Disabled].includes( + store.getState().settings.swarmState + ) + ) { + const error = global.i18n.t('mist.errors.swarm.notEnabled'); + dialog.showErrorBox('Note', error); + callback({ error }); + store.dispatch({ + type: '[MAIN]:PROTOCOL:ERROR', + payload: { protocol: 'bzz', error } + }); + return; + } + + const redirectPath = `${Settings.swarmURL}/${request.url.replace( + 'bzz:/', + 'bzz://' + )}`; + + if (store.getState().settings.swarmState === SwarmState.Enabling) { + swarmNode.on('started', () => { + callback({ + method: request.method, + referrer: request.referrer, + url: redirectPath + }); + }); + } else { + // Swarm enabled + callback({ + method: request.method, + referrer: request.referrer, + url: redirectPath + }); + } + + store.dispatch({ + type: '[MAIN]:PROTOCOL:REQUEST', + payload: { protocol: 'bzz' } + }); + }, + error => { + if (error) { + log.error(error); + } + } + ); } function createCoreWindows() { - global.defaultWindow = windowStateKeeper({ defaultWidth: 1024 + 208, defaultHeight: 720 }); + global.defaultWindow = windowStateKeeper({ + defaultWidth: 1024 + 208, + defaultHeight: 720 + }); - // Create the browser window. - mainWindow = Windows.create('main'); + // Create the browser window. + mainWindow = Windows.create('main'); - // Delegating events to save window bounds on windowStateKeeper - global.defaultWindow.manage(mainWindow.window); + // Delegating events to save window bounds on windowStateKeeper + global.defaultWindow.manage(mainWindow.window); - if (!Settings.inAutoTestMode) { splashWindow = Windows.create('splash'); } + if (!Settings.inAutoTestMode) { + splashWindow = Windows.create('splash'); + } } function checkTimeSync() { - if (!Settings.skiptimesynccheck) { - timesync.checkEnabled((err, enabled) => { - if (err) { - log.error('Couldn\'t infer if computer automatically syncs time.', err); - return; - } - - if (!enabled) { - dialog.showMessageBox({ - type: 'warning', - buttons: ['OK'], - message: global.i18n.t('mist.errors.timeSync.title'), - detail: `${global.i18n.t('mist.errors.timeSync.description')}\n\n${global.i18n.t(`mist.errors.timeSync.${process.platform}`)}`, - }, () => { - }); - } - }); - } + if (!Settings.skiptimesynccheck) { + timesync.checkEnabled((err, enabled) => { + if (err) { + log.error("Couldn't infer if computer automatically syncs time.", err); + return; + } + + if (!enabled) { + dialog.showMessageBox( + { + type: 'warning', + buttons: ['OK'], + message: global.i18n.t('mist.errors.timeSync.title'), + detail: `${global.i18n.t( + 'mist.errors.timeSync.description' + )}\n\n${global.i18n.t(`mist.errors.timeSync.${process.platform}`)}` + }, + () => {} + ); + } + }); + } } async function kickStart() { - initializeKickStartListeners(); - checkForLegacyChain(); - await ClientBinaryManager.init(); - await ethereumNode.init(); - - if (Settings.enableSwarmOnStart) { store.dispatch(toggleSwarm()); } - - if (!ethereumNode.isIpcConnected) { throw new Error('Either the node didn\'t start or IPC socket failed to connect.'); } - log.info('Connected via IPC to node.'); - - // Update menu, to show node switching possibilities - appMenu(); - - if (splashWindow) { splashWindow.show(); } - if (!Settings.inAutoTestMode) { await handleNodeSync(); } - - await startMainWindow(); + initializeKickStartListeners(); + checkForLegacyChain(); + await ClientBinaryManager.init(); + await ethereumNode.init(); + + if (Settings.enableSwarmOnStart) { + store.dispatch(toggleSwarm()); + } + + if (!ethereumNode.isIpcConnected) { + throw new Error( + "Either the node didn't start or IPC socket failed to connect." + ); + } + log.info('Connected via IPC to node.'); + + // Update menu, to show node switching possibilities + appMenu(); + + if (splashWindow) { + splashWindow.show(); + } + if (!Settings.inAutoTestMode) { + await handleNodeSync(); + } + + await startMainWindow(); } function checkForLegacyChain() { - if ((Settings.loadUserData('daoFork') || '').trim() === 'false') { - dialog.showMessageBox({ - type: 'warning', - buttons: ['OK'], - message: global.i18n.t('mist.errors.legacyChain.title'), - detail: global.i18n.t('mist.errors.legacyChain.description') - }, () => { - shell.openExternal('https://github.com/ethereum/mist/releases'); - store.dispatch(quitApp()); - }); + if ((Settings.loadUserData('daoFork') || '').trim() === 'false') { + dialog.showMessageBox( + { + type: 'warning', + buttons: ['OK'], + message: global.i18n.t('mist.errors.legacyChain.title'), + detail: global.i18n.t('mist.errors.legacyChain.description') + }, + () => { + shell.openExternal('https://github.com/ethereum/mist/releases'); + store.dispatch(quitApp()); + } + ); - throw new Error('Cant start client due to legacy non-Fork setting.'); - } + throw new Error('Cant start client due to legacy non-Fork setting.'); + } } function initializeKickStartListeners() { - ClientBinaryManager.on('status', (status, data) => { - Windows.broadcast('uiAction_clientBinaryStatus', status, data); - }); - - ethereumNode.on('nodeConnectionTimeout', () => { - Windows.broadcast('uiAction_nodeStatus', 'connectionTimeout'); - }); - - ethereumNode.on('nodeLog', (data) => { - Windows.broadcast('uiAction_nodeLogText', data.replace(/^.*[0-9]]/, '')); - }); - - ethereumNode.on('state', (state, stateAsText) => { - Windows.broadcast('uiAction_nodeStatus', stateAsText, - ethereumNode.STATES.ERROR === state ? ethereumNode.lastError : null - ); - }); + ClientBinaryManager.on('status', (status, data) => { + Windows.broadcast('uiAction_clientBinaryStatus', status, data); + }); + + ethereumNode.on('nodeConnectionTimeout', () => { + Windows.broadcast('uiAction_nodeStatus', 'connectionTimeout'); + }); + + ethereumNode.on('nodeLog', data => { + Windows.broadcast('uiAction_nodeLogText', data.replace(/^.*[0-9]]/, '')); + }); + + ethereumNode.on('state', (state, stateAsText) => { + Windows.broadcast( + 'uiAction_nodeStatus', + stateAsText, + ethereumNode.STATES.ERROR === state ? ethereumNode.lastError : null + ); + }); } function handleNodeSync() { - return new Q((resolve, reject) => { - nodeSync.on('nodeSyncing', (result) => { - Windows.broadcast('uiAction_nodeSyncStatus', 'inProgress', result); - }); + return new Q((resolve, reject) => { + nodeSync.on('nodeSyncing', result => { + Windows.broadcast('uiAction_nodeSyncStatus', 'inProgress', result); + }); - nodeSync.on('stopped', () => { - Windows.broadcast('uiAction_nodeSyncStatus', 'stopped'); - }); + nodeSync.on('stopped', () => { + Windows.broadcast('uiAction_nodeSyncStatus', 'stopped'); + }); - nodeSync.on('error', (err) => { - log.error('Error syncing node', err); + nodeSync.on('error', err => { + log.error('Error syncing node', err); - reject(err); - }); + reject(err); + }); - nodeSync.on('finished', () => { - nodeSync.removeAllListeners('error'); - nodeSync.removeAllListeners('finished'); + nodeSync.on('finished', () => { + nodeSync.removeAllListeners('error'); + nodeSync.removeAllListeners('finished'); - resolve(); - }); + resolve(); }); + }); } function startMainWindow() { - log.info(`Loading Interface at ${global.interfaceAppUrl}`); - initializeMainWindowListeners(); - initializeTabs(); + log.info(`Loading Interface at ${global.interfaceAppUrl}`); + initializeMainWindowListeners(); + initializeTabs(); } function initializeMainWindowListeners() { - mainWindow.on('ready', () => { - if (splashWindow) { splashWindow.close(); } - mainWindow.show(); - }); + mainWindow.on('ready', () => { + if (splashWindow) { + splashWindow.close(); + } + mainWindow.show(); + }); - mainWindow.load(global.interfaceAppUrl); + mainWindow.load(global.interfaceAppUrl); - mainWindow.on('closed', () => store.dispatch(quitApp())); + mainWindow.on('closed', () => store.dispatch(quitApp())); } function initializeTabs() { - const Tabs = global.db.getCollection('UI_tabs'); - const sortedTabs = Tabs.getDynamicView('sorted_tabs') || Tabs.addDynamicView('sorted_tabs'); - sortedTabs.applySimpleSort('position', false); - - const refreshMenu = () => { - clearTimeout(global._refreshMenuFromTabsTimer); - - global._refreshMenuFromTabsTimer = setTimeout(() => { - log.debug('Refresh menu with tabs'); - global.webviews = sortedTabs.data(); - appMenu(global.webviews); - store.dispatch({ type: '[MAIN]:MENU:REFRESH' }); - }, 1000); - }; - - Tabs.on('insert', refreshMenu); - Tabs.on('update', refreshMenu); - Tabs.on('delete', refreshMenu); + const Tabs = global.db.getCollection('UI_tabs'); + const sortedTabs = + Tabs.getDynamicView('sorted_tabs') || Tabs.addDynamicView('sorted_tabs'); + sortedTabs.applySimpleSort('position', false); + + const refreshMenu = () => { + clearTimeout(global._refreshMenuFromTabsTimer); + + global._refreshMenuFromTabsTimer = setTimeout(() => { + log.debug('Refresh menu with tabs'); + global.webviews = sortedTabs.data(); + appMenu(global.webviews); + store.dispatch({ type: '[MAIN]:MENU:REFRESH' }); + }, 1000); + }; + + Tabs.on('insert', refreshMenu); + Tabs.on('update', refreshMenu); + Tabs.on('delete', refreshMenu); } diff --git a/modules/abi.js b/modules/abi.js index a8a3f3842..ec9bfa984 100644 --- a/modules/abi.js +++ b/modules/abi.js @@ -8,45 +8,48 @@ const { ipcMain: ipc } = require('electron'); const abi = require('ethereumjs-abi'); function isHexType(type) { - return _.includes(['address', 'bytes'], type) || type.match(/bytes\d+/g); + return _.includes(['address', 'bytes'], type) || type.match(/bytes\d+/g); } function padLeft(string, chars) { - return (new Array((chars - string.length) + 1).join('0')) + string; + return new Array(chars - string.length + 1).join('0') + string; } ipc.on('backendAction_decodeFunctionSignature', (event, _signature, _data) => { - const data = _data.slice(10, _data.length); - const signature = _signature.match(/\((.+)\)/i); - - if (!signature) return; - - const paramTypes = signature[1].split(','); - - try { - const paramsResponse = abi.rawDecode(paramTypes, new Buffer(data, 'hex')); - const paramsDictArr = []; - - // Turns addresses into proper hex string - // Turns numbers into their decimal string version - paramTypes.forEach((type, index) => { - const conversionFlag = isHexType(type) ? 'hex' : null; - const prefix = isHexType(type) ? '0x' : ''; - - paramsResponse[index] = paramsResponse[index].toString(conversionFlag); - - const res = type.match(/bytes(\d+)/i); - if (type === 'address') { - paramsResponse[index] = padLeft(paramsResponse[index], 40); - } else if (res) { - paramsResponse[index] = padLeft(paramsResponse[index], Number(res[1]) * 2); - } - - paramsDictArr.push({ type, value: prefix + paramsResponse[index] }); - }); - - event.sender.send('uiAction_decodedFunctionSignatures', paramsDictArr); - } catch (e) { - console.warn('ABI.js Warning:', e.message); - } + const data = _data.slice(10, _data.length); + const signature = _signature.match(/\((.+)\)/i); + + if (!signature) return; + + const paramTypes = signature[1].split(','); + + try { + const paramsResponse = abi.rawDecode(paramTypes, new Buffer(data, 'hex')); + const paramsDictArr = []; + + // Turns addresses into proper hex string + // Turns numbers into their decimal string version + paramTypes.forEach((type, index) => { + const conversionFlag = isHexType(type) ? 'hex' : null; + const prefix = isHexType(type) ? '0x' : ''; + + paramsResponse[index] = paramsResponse[index].toString(conversionFlag); + + const res = type.match(/bytes(\d+)/i); + if (type === 'address') { + paramsResponse[index] = padLeft(paramsResponse[index], 40); + } else if (res) { + paramsResponse[index] = padLeft( + paramsResponse[index], + Number(res[1]) * 2 + ); + } + + paramsDictArr.push({ type, value: prefix + paramsResponse[index] }); + }); + + event.sender.send('uiAction_decodedFunctionSignatures', paramsDictArr); + } catch (e) { + console.warn('ABI.js Warning:', e.message); + } }); diff --git a/modules/blurOverlay.js b/modules/blurOverlay.js index 71d3c3ceb..7537fc8bc 100644 --- a/modules/blurOverlay.js +++ b/modules/blurOverlay.js @@ -1,21 +1,18 @@ - - const Windows = require('./windows'); class BlurOverlay { + static enable() { + BlurOverlay.setBlurOverlay(true); + } - static enable() { - BlurOverlay.setBlurOverlay(true); - } - - static disable() { - BlurOverlay.setBlurOverlay(false); - } + static disable() { + BlurOverlay.setBlurOverlay(false); + } - static setBlurOverlay(flag) { - const mainWindow = Windows.getByType('main'); - mainWindow.send('uiAction_enableBlurOverlay', flag); - } + static setBlurOverlay(flag) { + const mainWindow = Windows.getByType('main'); + mainWindow.send('uiAction_enableBlurOverlay', flag); + } } module.exports = BlurOverlay; diff --git a/modules/clientBinaryManager.js b/modules/clientBinaryManager.js index c3c535483..595120cab 100644 --- a/modules/clientBinaryManager.js +++ b/modules/clientBinaryManager.js @@ -11,307 +11,342 @@ const EventEmitter = require('events').EventEmitter; const log = require('./utils/logger').create('ClientBinaryManager'); - // should be 'https://raw.githubusercontent.com/ethereum/mist/master/clientBinaries.json' -const BINARY_URL = 'https://raw.githubusercontent.com/ethereum/mist/master/clientBinaries.json'; +const BINARY_URL = + 'https://raw.githubusercontent.com/ethereum/mist/master/clientBinaries.json'; -const ALLOWED_DOWNLOAD_URLS_REGEX = - /^https:\/\/(?:(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)?ethereum\.org\/|gethstore\.blob\.core\.windows\.net\/|bintray\.com\/artifact\/download\/karalabe\/ethereum\/)(?:.+)/; // eslint-disable-line max-len +const ALLOWED_DOWNLOAD_URLS_REGEX = /^https:\/\/(?:(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)?ethereum\.org\/|gethstore\.blob\.core\.windows\.net\/|bintray\.com\/artifact\/download\/karalabe\/ethereum\/)(?:.+)/; // eslint-disable-line max-len class Manager extends EventEmitter { - constructor() { - super(); + constructor() { + super(); - this._availableClients = {}; - } + this._availableClients = {}; + } - init(restart) { - log.info('Initializing...'); + init(restart) { + log.info('Initializing...'); - // check every hour - setInterval(() => this._checkForNewConfig(true), 1000 * 60 * 60); + // check every hour + setInterval(() => this._checkForNewConfig(true), 1000 * 60 * 60); - return this._checkForNewConfig(restart); - } + return this._checkForNewConfig(restart); + } - getClient(clientId) { - return this._availableClients[clientId.toLowerCase()]; - } + getClient(clientId) { + return this._availableClients[clientId.toLowerCase()]; + } - _writeLocalConfig(json) { - log.info('Write new client binaries local config to disk ...'); + _writeLocalConfig(json) { + log.info('Write new client binaries local config to disk ...'); - fs.writeFileSync( - path.join(Settings.userDataPath, 'clientBinaries.json'), - JSON.stringify(json, null, 2) - ); - } + fs.writeFileSync( + path.join(Settings.userDataPath, 'clientBinaries.json'), + JSON.stringify(json, null, 2) + ); + } - _checkForNewConfig(restart) { - const nodeType = 'Geth'; - let binariesDownloaded = false; - let nodeInfo; - - log.info(`Checking for new client binaries config from: ${BINARY_URL}`); - - this._emit('loadConfig', 'Fetching remote client config'); - - // fetch config - return got(BINARY_URL, { - timeout: 3000, - json: true, - }) - .then((res) => { - if (!res || _.isEmpty(res.body)) { - throw new Error('Invalid fetch result'); - } else { - return res.body; - } - }) - .catch((err) => { - log.warn('Error fetching client binaries config from repo', err); - }) - .then((latestConfig) => { - if (!latestConfig) return; - - let localConfig; - let skipedVersion; - const nodeVersion = latestConfig.clients[nodeType].version; - - this._emit('loadConfig', 'Fetching local config'); - - try { - // now load the local json - localConfig = JSON.parse( - fs.readFileSync(path.join(Settings.userDataPath, 'clientBinaries.json')).toString() - ); - } catch (err) { - log.warn(`Error loading local config - assuming this is a first run: ${err}`); + _checkForNewConfig(restart) { + const nodeType = 'Geth'; + let binariesDownloaded = false; + let nodeInfo; - if (latestConfig) { - localConfig = latestConfig; + log.info(`Checking for new client binaries config from: ${BINARY_URL}`); - this._writeLocalConfig(localConfig); - } else { - throw new Error('Unable to load local or remote config, cannot proceed!'); - } - } + this._emit('loadConfig', 'Fetching remote client config'); - try { - skipedVersion = fs.readFileSync(path.join(Settings.userDataPath, 'skippedNodeVersion.json')).toString(); - } catch (err) { - log.info('No "skippedNodeVersion.json" found.'); - } + // fetch config + return got(BINARY_URL, { + timeout: 3000, + json: true + }) + .then(res => { + if (!res || _.isEmpty(res.body)) { + throw new Error('Invalid fetch result'); + } else { + return res.body; + } + }) + .catch(err => { + log.warn('Error fetching client binaries config from repo', err); + }) + .then(latestConfig => { + if (!latestConfig) return; + + let localConfig; + let skipedVersion; + const nodeVersion = latestConfig.clients[nodeType].version; + + this._emit('loadConfig', 'Fetching local config'); + + try { + // now load the local json + localConfig = JSON.parse( + fs + .readFileSync( + path.join(Settings.userDataPath, 'clientBinaries.json') + ) + .toString() + ); + } catch (err) { + log.warn( + `Error loading local config - assuming this is a first run: ${err}` + ); + + if (latestConfig) { + localConfig = latestConfig; + + this._writeLocalConfig(localConfig); + } else { + throw new Error( + 'Unable to load local or remote config, cannot proceed!' + ); + } + } - // prepare node info - const platform = process.platform.replace('darwin', 'mac').replace('win32', 'win').replace('freebsd', 'linux').replace('sunos', 'linux'); - const binaryVersion = latestConfig.clients[nodeType].platforms[platform][process.arch]; - const checksums = _.pick(binaryVersion.download, 'sha256', 'md5'); - const algorithm = _.keys(checksums)[0].toUpperCase(); - const hash = _.values(checksums)[0]; - - // get the node data, to be able to pass it to a possible error - nodeInfo = { - type: nodeType, - version: nodeVersion, - checksum: hash, - algorithm, - }; - - - // if new config version available then ask user if they wish to update - if (latestConfig - && JSON.stringify(localConfig) !== JSON.stringify(latestConfig) - && nodeVersion !== skipedVersion) { - - return new Q((resolve) => { - - log.debug('New client binaries config found, asking user if they wish to update...'); - - const wnd = Windows.createPopup('clientUpdateAvailable', { - sendData: { - uiAction_sendData: { - name: nodeType, - version: nodeVersion, - checksum: `${algorithm}: ${hash}`, - downloadUrl: binaryVersion.download.url, - restart, - }, - }, - }, (update) => { - // update - if (update === 'update') { - this._writeLocalConfig(latestConfig); - - resolve(latestConfig); - - // skip - } else if (update === 'skip') { - fs.writeFileSync( - path.join(Settings.userDataPath, 'skippedNodeVersion.json'), - nodeVersion - ); - - resolve(localConfig); - } - - wnd.close(); - }); - - // if the window is closed, simply continue and as again next time - wnd.on('close', () => { - resolve(localConfig); - }); - }); - } + try { + skipedVersion = fs + .readFileSync( + path.join(Settings.userDataPath, 'skippedNodeVersion.json') + ) + .toString(); + } catch (err) { + log.info('No "skippedNodeVersion.json" found.'); + } - return localConfig; - }) - .then((localConfig) => { - if (!localConfig) { - log.info('No config for the ClientBinaryManager could be loaded, using local clientBinaries.json.'); + // prepare node info + const platform = process.platform + .replace('darwin', 'mac') + .replace('win32', 'win') + .replace('freebsd', 'linux') + .replace('sunos', 'linux'); + const binaryVersion = + latestConfig.clients[nodeType].platforms[platform][process.arch]; + const checksums = _.pick(binaryVersion.download, 'sha256', 'md5'); + const algorithm = _.keys(checksums)[0].toUpperCase(); + const hash = _.values(checksums)[0]; + + // get the node data, to be able to pass it to a possible error + nodeInfo = { + type: nodeType, + version: nodeVersion, + checksum: hash, + algorithm + }; - const localConfigPath = path.join(Settings.userDataPath, 'clientBinaries.json'); - localConfig = (fs.existsSync(localConfigPath)) ? require(localConfigPath) : require('../clientBinaries.json'); // eslint-disable-line no-param-reassign, global-require, import/no-dynamic-require, import/no-unresolved - } + // if new config version available then ask user if they wish to update + if ( + latestConfig && + JSON.stringify(localConfig) !== JSON.stringify(latestConfig) && + nodeVersion !== skipedVersion + ) { + return new Q(resolve => { + log.debug( + 'New client binaries config found, asking user if they wish to update...' + ); + + const wnd = Windows.createPopup( + 'clientUpdateAvailable', + { + sendData: { + uiAction_sendData: { + name: nodeType, + version: nodeVersion, + checksum: `${algorithm}: ${hash}`, + downloadUrl: binaryVersion.download.url, + restart + } + } + }, + update => { + // update + if (update === 'update') { + this._writeLocalConfig(latestConfig); + + resolve(latestConfig); + + // skip + } else if (update === 'skip') { + fs.writeFileSync( + path.join(Settings.userDataPath, 'skippedNodeVersion.json'), + nodeVersion + ); + + resolve(localConfig); + } + + wnd.close(); + } + ); - // scan for node - const mgr = new ClientBinaryManager(localConfig); - mgr.logger = log; + // if the window is closed, simply continue and as again next time + wnd.on('close', () => { + resolve(localConfig); + }); + }); + } - this._emit('scanning', 'Scanning for binaries'); + return localConfig; + }) + .then(localConfig => { + if (!localConfig) { + log.info( + 'No config for the ClientBinaryManager could be loaded, using local clientBinaries.json.' + ); + + const localConfigPath = path.join( + Settings.userDataPath, + 'clientBinaries.json' + ); + localConfig = fs.existsSync(localConfigPath) + ? require(localConfigPath) + : require('../clientBinaries.json'); // eslint-disable-line no-param-reassign, global-require, import/no-dynamic-require, import/no-unresolved + } - return mgr.init({ - folders: [ - path.join(Settings.userDataPath, 'binaries', 'Geth', 'unpacked'), - path.join(Settings.userDataPath, 'binaries', 'Eth', 'unpacked'), - ], - }) - .then(() => { - const clients = mgr.clients; + // scan for node + const mgr = new ClientBinaryManager(localConfig); + mgr.logger = log; - this._availableClients = {}; + this._emit('scanning', 'Scanning for binaries'); - const available = _.filter(clients, c => !!c.state.available); + return mgr + .init({ + folders: [ + path.join(Settings.userDataPath, 'binaries', 'Geth', 'unpacked'), + path.join(Settings.userDataPath, 'binaries', 'Eth', 'unpacked') + ] + }) + .then(() => { + const clients = mgr.clients; - if (!available.length) { - if (_.isEmpty(clients)) { - throw new Error('No client binaries available for this system!'); - } + this._availableClients = {}; - this._emit('downloading', 'Downloading binaries'); + const available = _.filter(clients, c => !!c.state.available); - return Q.map(_.values(clients), (c) => { - binariesDownloaded = true; + if (!available.length) { + if (_.isEmpty(clients)) { + throw new Error( + 'No client binaries available for this system!' + ); + } - return mgr.download(c.id, { - downloadFolder: path.join(Settings.userDataPath, 'binaries'), - urlRegex: ALLOWED_DOWNLOAD_URLS_REGEX, - }); - }); - } - }) - .then(() => { - this._emit('filtering', 'Filtering available clients'); - - _.each(mgr.clients, (client) => { - if (client.state.available) { - const idlcase = client.id.toLowerCase(); - - this._availableClients[idlcase] = { - binPath: Settings[`${idlcase}Path`] || client.activeCli.fullPath, - version: client.version, - }; - } - }); + this._emit('downloading', 'Downloading binaries'); - // restart if it downloaded while running - if (restart && binariesDownloaded) { - log.info('Restarting app ...'); - app.relaunch(); - app.quit(); - } + return Q.map(_.values(clients), c => { + binariesDownloaded = true; - this._emit('done'); - }); - }) - .catch((err) => { - log.error(err); - - this._emit('error', err.message); - - // show error - if (err.message.indexOf('Hash mismatch') !== -1) { - // show hash mismatch error - dialog.showMessageBox({ - type: 'warning', - buttons: ['OK'], - message: global.i18n.t('mist.errors.nodeChecksumMismatch.title'), - detail: global.i18n.t('mist.errors.nodeChecksumMismatch.description', { - type: nodeInfo.type, - version: nodeInfo.version, - algorithm: nodeInfo.algorithm, - hash: nodeInfo.checksum, - }), - }, () => { - app.quit(); + return mgr.download(c.id, { + downloadFolder: path.join(Settings.userDataPath, 'binaries'), + urlRegex: ALLOWED_DOWNLOAD_URLS_REGEX }); + }); + } + }) + .then(() => { + this._emit('filtering', 'Filtering available clients'); + + _.each(mgr.clients, client => { + if (client.state.available) { + const idlcase = client.id.toLowerCase(); + + this._availableClients[idlcase] = { + binPath: + Settings[`${idlcase}Path`] || client.activeCli.fullPath, + version: client.version + }; + } + }); - // throw so the main.js can catch it - throw err; + // restart if it downloaded while running + if (restart && binariesDownloaded) { + log.info('Restarting app ...'); + app.relaunch(); + app.quit(); } - }); - } + this._emit('done'); + }); + }) + .catch(err => { + log.error(err); + + this._emit('error', err.message); + + // show error + if (err.message.indexOf('Hash mismatch') !== -1) { + // show hash mismatch error + dialog.showMessageBox( + { + type: 'warning', + buttons: ['OK'], + message: global.i18n.t('mist.errors.nodeChecksumMismatch.title'), + detail: global.i18n.t( + 'mist.errors.nodeChecksumMismatch.description', + { + type: nodeInfo.type, + version: nodeInfo.version, + algorithm: nodeInfo.algorithm, + hash: nodeInfo.checksum + } + ) + }, + () => { + app.quit(); + } + ); - _emit(status, msg) { - log.debug(`Status: ${status} - ${msg}`); + // throw so the main.js can catch it + throw err; + } + }); + } - this.emit('status', status, msg); - } + _emit(status, msg) { + log.debug(`Status: ${status} - ${msg}`); + this.emit('status', status, msg); + } - _resolveEthBinPath() { - log.info('Resolving path to Eth client binary ...'); + _resolveEthBinPath() { + log.info('Resolving path to Eth client binary ...'); - let platform = process.platform; + let platform = process.platform; - // "win32" -> "win" (because nodes are bundled by electron-builder) - if (platform.indexOf('win') === 0) { - platform = 'win'; - } else if (platform.indexOf('darwin') === 0) { - platform = 'mac'; - } + // "win32" -> "win" (because nodes are bundled by electron-builder) + if (platform.indexOf('win') === 0) { + platform = 'win'; + } else if (platform.indexOf('darwin') === 0) { + platform = 'mac'; + } - log.debug(`Platform: ${platform}`); + log.debug(`Platform: ${platform}`); - let binPath = path.join( - __dirname, - '..', - 'nodes', - 'eth', - `${platform}-${process.arch}` - ); + let binPath = path.join( + __dirname, + '..', + 'nodes', + 'eth', + `${platform}-${process.arch}` + ); - if (Settings.inProductionMode) { - // get out of the ASAR - binPath = binPath.replace('nodes', path.join('..', '..', 'nodes')); - } + if (Settings.inProductionMode) { + // get out of the ASAR + binPath = binPath.replace('nodes', path.join('..', '..', 'nodes')); + } - binPath = path.join(path.resolve(binPath), 'eth'); + binPath = path.join(path.resolve(binPath), 'eth'); - if (platform === 'win') { - binPath += '.exe'; - } + if (platform === 'win') { + binPath += '.exe'; + } - log.info(`Eth client binary path: ${binPath}`); + log.info(`Eth client binary path: ${binPath}`); - this._availableClients.eth = { - binPath, - version: '1.3.0', - }; - } + this._availableClients.eth = { + binPath, + version: '1.3.0' + }; + } } - module.exports = new Manager(); diff --git a/modules/core/rootReducer.js b/modules/core/rootReducer.js index 7d7ad8a61..2f909dcff 100644 --- a/modules/core/rootReducer.js +++ b/modules/core/rootReducer.js @@ -3,6 +3,6 @@ import settings from './settings/reducer'; import ui from './ui/reducer'; export default combineReducers({ - settings, - ui, + settings, + ui }); diff --git a/modules/core/settings/actions.js b/modules/core/settings/actions.js index 2612e422b..7ecd4f822 100644 --- a/modules/core/settings/actions.js +++ b/modules/core/settings/actions.js @@ -7,160 +7,175 @@ import { SwarmState } from './reducer'; const swarmLog = logger.create('swarm'); export function syncFlags(argv) { - return { type: '[MAIN]:CLI_FLAGS:SYNC', payload: { cliFlags: argv } }; + return { type: '[MAIN]:CLI_FLAGS:SYNC', payload: { cliFlags: argv } }; } export function syncBuildConfig(key, value) { - return { - type: '[MAIN]:BUILD_CONFIG:SYNC', - payload: { [key]: value } - }; + return { + type: '[MAIN]:BUILD_CONFIG:SYNC', + payload: { [key]: value } + }; } export function setLanguage(lang, browserWindow) { - return dispatch => { - dispatch({ type: '[MAIN]:SET_LANGUAGE:START' }); - dispatch(setLanguageOnMain(lang)); - dispatch(setLanguageOnClient(lang, browserWindow)); - dispatch(setAcceptLanguageHeader(lang, browserWindow)); - dispatch(resetMenu(lang)); - dispatch({ type: '[MAIN]:SET_LANGUAGE:FINISH' }); - } + return dispatch => { + dispatch({ type: '[MAIN]:SET_LANGUAGE:START' }); + dispatch(setLanguageOnMain(lang)); + dispatch(setLanguageOnClient(lang, browserWindow)); + dispatch(setAcceptLanguageHeader(lang, browserWindow)); + dispatch(resetMenu(lang)); + dispatch({ type: '[MAIN]:SET_LANGUAGE:FINISH' }); + }; } export function setLanguageOnMain(lang) { - return dispatch => { - dispatch({ type: '[MAIN]:SET_LANGUAGE_ON_MAIN:START' }); - try { - i18n.changeLanguage(lang.substr(0, 5)); - dispatch({ type: '[MAIN]:SET_LANGUAGE_ON_MAIN:SUCCESS', payload: { i18n: lang } }); - } catch (error) { - dispatch({ type: '[MAIN]:SET_LANGUAGE_ON_MAIN:FAILURE', error }); - } + return dispatch => { + dispatch({ type: '[MAIN]:SET_LANGUAGE_ON_MAIN:START' }); + try { + i18n.changeLanguage(lang.substr(0, 5)); + dispatch({ + type: '[MAIN]:SET_LANGUAGE_ON_MAIN:SUCCESS', + payload: { i18n: lang } + }); + } catch (error) { + dispatch({ type: '[MAIN]:SET_LANGUAGE_ON_MAIN:FAILURE', error }); } + }; } export function setLanguageOnClient(lang, browserWindow) { - return dispatch => { - dispatch({ type: '[MAIN]:SET_LANGUAGE_ON_CLIENT:START' }); - try { - browserWindow.webContents.executeJavaScript( - `TAPi18n.setLanguage("${lang}");` - ); - dispatch({ type: '[MAIN]:SET_LANGUAGE_ON_CLIENT:SUCCESS', payload: { i18n: lang } }); - } catch (error) { - dispatch({ type: '[MAIN]:SET_LANGUAGE_ON_CLIENT:FAILURE', error }); - } + return dispatch => { + dispatch({ type: '[MAIN]:SET_LANGUAGE_ON_CLIENT:START' }); + try { + browserWindow.webContents.executeJavaScript( + `TAPi18n.setLanguage("${lang}");` + ); + dispatch({ + type: '[MAIN]:SET_LANGUAGE_ON_CLIENT:SUCCESS', + payload: { i18n: lang } + }); + } catch (error) { + dispatch({ type: '[MAIN]:SET_LANGUAGE_ON_CLIENT:FAILURE', error }); } + }; } export function setAcceptLanguageHeader(lang, browserWindow) { - return dispatch => { - dispatch({ type: '[MAIN]:SET_ACCEPT_LANGUAGE_HEADER:START' }); - try { - const session = browserWindow.webContents.session; - session.setUserAgent(session.getUserAgent(), lang); - dispatch({ type: '[MAIN]:SET_ACCEPT_LANGUAGE_HEADER:SUCCESS' }); - } catch (error) { - dispatch({ type: '[MAIN]:SET_ACCEPT_LANGUAGE_HEADER:FAILURE', error }); - } + return dispatch => { + dispatch({ type: '[MAIN]:SET_ACCEPT_LANGUAGE_HEADER:START' }); + try { + const session = browserWindow.webContents.session; + session.setUserAgent(session.getUserAgent(), lang); + dispatch({ type: '[MAIN]:SET_ACCEPT_LANGUAGE_HEADER:SUCCESS' }); + } catch (error) { + dispatch({ + type: '[MAIN]:SET_ACCEPT_LANGUAGE_HEADER:FAILURE', + error + }); } + }; } export function resetMenu(lang) { - return dispatch => { - dispatch({ type: '[MAIN]:RESET_MENU:START' }); - try { - if (lang) { - Settings.language = lang; - } - - const appMenu = require('../../menuItems'); - appMenu(global.webviews); - - dispatch({ type: '[MAIN]:RESET_MENU:SUCCESS' }); - } catch (error) { - dispatch({ type: '[MAIN]:RESET_MENU:FAILURE', error }); - } + return dispatch => { + dispatch({ type: '[MAIN]:RESET_MENU:START' }); + try { + if (lang) { + Settings.language = lang; + } + + const appMenu = require('../../menuItems'); + appMenu(global.webviews); + + dispatch({ type: '[MAIN]:RESET_MENU:SUCCESS' }); + } catch (error) { + dispatch({ type: '[MAIN]:RESET_MENU:FAILURE', error }); } + }; } export function getLanguage(event) { - return (dispatch, getState) => { - dispatch({ type: '[MAIN]:GET_LANGUAGE:START' }); - try { - const i18n = getState().settings.i18n; - event.returnValue = i18n; - dispatch({ type: '[MAIN]:GET_LANGUAGE:SUCCESS', payload: { i18n } }); - } catch (error) { - dispatch({ type: '[MAIN]:GET_LANGUAGE:FAILURE', error }); - } + return (dispatch, getState) => { + dispatch({ type: '[MAIN]:GET_LANGUAGE:START' }); + try { + const i18n = getState().settings.i18n; + event.returnValue = i18n; + dispatch({ + type: '[MAIN]:GET_LANGUAGE:SUCCESS', + payload: { i18n } + }); + } catch (error) { + dispatch({ type: '[MAIN]:GET_LANGUAGE:FAILURE', error }); } + }; } export function toggleSwarm(event) { - return (dispatch, getState) => { - if ([SwarmState.Enabled, SwarmState.Enabling].includes(getState().settings.swarmState)) { - dispatch({ type: '[MAIN]:SWARM:STOP' }); - - try { - swarmNode.on('stopping', () => { - swarmLog.info('Stopping Swarm'); - dispatch({ type: '[MAIN]:SWARM:DISABLING' }); - }); - - swarmNode.on('stopped', () => { - swarmLog.info('Swarm stopped'); - dispatch({ type: '[MAIN]:SWARM:DISABLED' }); - dispatch(resetMenu()); - }); - - swarmNode.stop(); - - if (getState().settings.swarmEnableOnStart) { - Settings.enableSwarmOnStart = false; - dispatch({ type: '[MAIN]:SWARM:DISABLE_ON_START' }); - } - - } catch (error) { - dispatch({ type: '[MAIN]:SWARM:FAILURE', error }); - swarmLog.error(error); - } - - } else { - dispatch({ type: '[MAIN]:SWARM:START' }); - - try { - swarmNode.on('starting', () => { - swarmLog.info('Starting Swarm'); - dispatch({ type: '[MAIN]:SWARM:ENABLING' }); - }); - - swarmNode.on('downloadProgress', (progress) => { - swarmLog.info(`Downloading Swarm binary: ${(progress * 100).toFixed(1)}%`); - }); - - swarmNode.on('started', () => { - swarmLog.info('Swarm started'); - dispatch({ type: '[MAIN]:SWARM:ENABLED' }); - dispatch(resetMenu()); - }); - - swarmNode.init(); - - if (!getState().settings.swarmEnableOnStart) { - Settings.enableSwarmOnStart = true; - dispatch({ type: '[MAIN]:SWARM:ENABLE_ON_START' }); - } - - } catch (error) { - dispatch({ type: '[MAIN]:SWARM:FAILURE', error }); - swarmLog.error(error); - } + return (dispatch, getState) => { + if ( + [SwarmState.Enabled, SwarmState.Enabling].includes( + getState().settings.swarmState + ) + ) { + dispatch({ type: '[MAIN]:SWARM:STOP' }); + + try { + swarmNode.on('stopping', () => { + swarmLog.info('Stopping Swarm'); + dispatch({ type: '[MAIN]:SWARM:DISABLING' }); + }); + + swarmNode.on('stopped', () => { + swarmLog.info('Swarm stopped'); + dispatch({ type: '[MAIN]:SWARM:DISABLED' }); + dispatch(resetMenu()); + }); + + swarmNode.stop(); + + if (getState().settings.swarmEnableOnStart) { + Settings.enableSwarmOnStart = false; + dispatch({ type: '[MAIN]:SWARM:DISABLE_ON_START' }); } + } catch (error) { + dispatch({ type: '[MAIN]:SWARM:FAILURE', error }); + swarmLog.error(error); + } + } else { + dispatch({ type: '[MAIN]:SWARM:START' }); + + try { + swarmNode.on('starting', () => { + swarmLog.info('Starting Swarm'); + dispatch({ type: '[MAIN]:SWARM:ENABLING' }); + }); + + swarmNode.on('downloadProgress', progress => { + swarmLog.info( + `Downloading Swarm binary: ${(progress * 100).toFixed(1)}%` + ); + }); + + swarmNode.on('started', () => { + swarmLog.info('Swarm started'); + dispatch({ type: '[MAIN]:SWARM:ENABLED' }); + dispatch(resetMenu()); + }); + + swarmNode.init(); + + if (!getState().settings.swarmEnableOnStart) { + Settings.enableSwarmOnStart = true; + dispatch({ type: '[MAIN]:SWARM:ENABLE_ON_START' }); + } + } catch (error) { + dispatch({ type: '[MAIN]:SWARM:FAILURE', error }); + swarmLog.error(error); + } } + }; } export function setSwarmEnableOnStart() { - return { type: '[MAIN]:SWARM:ENABLE_ON_START' }; -} \ No newline at end of file + return { type: '[MAIN]:SWARM:ENABLE_ON_START' }; +} diff --git a/modules/core/settings/reducer.js b/modules/core/settings/reducer.js index 7dced1909..3f734e83e 100644 --- a/modules/core/settings/reducer.js +++ b/modules/core/settings/reducer.js @@ -1,71 +1,79 @@ export const SwarmState = { - Enabled: 'Enabled', - Enabling: 'Enabling', - Disabling: 'Disabling', - Disabled: 'Disabled', - Error: 'Error' -} + Enabled: 'Enabled', + Enabling: 'Enabling', + Disabling: 'Disabling', + Disabled: 'Disabled', + Error: 'Error' +}; export const initialState = { - appVersion: '', - autoTestMode: false, - dbInit: false, - dbSync: false, - ignoreGpuBlacklist: false, - i18n: '', - ipcProviderBackendInit: false, - productionMode: null, - protocols: [], - rpcMode: '', - swarmState: SwarmState.Disabled, - swarmEnableOnStart: false, - uiMode: '', - updateCheckerRan: false, - cliFlags: {} + appVersion: '', + autoTestMode: false, + dbInit: false, + dbSync: false, + ignoreGpuBlacklist: false, + i18n: '', + ipcProviderBackendInit: false, + productionMode: null, + protocols: [], + rpcMode: '', + swarmState: SwarmState.Disabled, + swarmEnableOnStart: false, + uiMode: '', + updateCheckerRan: false, + cliFlags: {} }; const settings = (state = initialState, action) => { - switch (action.type) { - case '[MAIN]:DB:INIT': - return Object.assign({}, state, { dbInit: true }); - case '[MAIN]:DB:SYNC_TO_BACKEND': - return Object.assign({}, state, { dbSync: true }); - case '[MAIN]:PROTOCOL:REGISTER': - return Object.assign({}, state, { - protocols: state.protocols.concat(action.payload.protocol) - }); - case '[MAIN]:BUILD_CONFIG:SYNC': - const key = Object.keys(action.payload)[0]; - return Object.assign({}, state, { [key]: action.payload[key] }); - case '[MAIN]:IGNORE_GPU_BLACKLIST:SET': - return Object.assign({}, state, { ignoreGpuBlacklist: true }); - case '[MAIN]:TEST_MODE:SET': - return Object.assign({}, state, { autoTestMode: true }); - case '[MAIN]:CLI_FLAGS:SYNC': - return Object.assign({}, state, { cliFlags: action.payload.cliFlags }); - case '[MAIN]:SET_LANGUAGE_ON_MAIN:SUCCESS': - return Object.assign({}, state, { i18n: action.payload.i18n }); - case '[MAIN]:SWARM:ENABLING': - return Object.assign({}, state, { swarmState: SwarmState.Enabling }); - case '[MAIN]:SWARM:ENABLED': - return Object.assign({}, state, { swarmState: SwarmState.Enabled }); - case '[MAIN]:SWARM:DISABLING': - return Object.assign({}, state, { swarmState: SwarmState.Disabling }); - case '[MAIN]:SWARM:DISABLED': - return Object.assign({}, state, { swarmState: SwarmState.Disabled }); - case '[MAIN]:SWARM:FAILURE': - return Object.assign({}, state, { swarmState: SwarmState.Error }); - case '[MAIN]:SWARM:ENABLE_ON_START': - return Object.assign({}, state, { swarmEnableOnStart: true }); - case '[MAIN]:SWARM:DISABLE_ON_START': - return Object.assign({}, state, { swarmEnableOnStart: false }); - case '[MAIN]:UPDATE_CHECKER:FINISH': - return Object.assign({}, state, { updateCheckerRan: true }); - case '[MAIN]:IPC_PROVIDER_BACKEND:FINISH': - return Object.assign({}, state, { ipcProviderBackendInit: true }); - default: - return state; - } -} + switch (action.type) { + case '[MAIN]:DB:INIT': + return Object.assign({}, state, { dbInit: true }); + case '[MAIN]:DB:SYNC_TO_BACKEND': + return Object.assign({}, state, { dbSync: true }); + case '[MAIN]:PROTOCOL:REGISTER': + return Object.assign({}, state, { + protocols: state.protocols.concat(action.payload.protocol) + }); + case '[MAIN]:BUILD_CONFIG:SYNC': + const key = Object.keys(action.payload)[0]; + return Object.assign({}, state, { [key]: action.payload[key] }); + case '[MAIN]:IGNORE_GPU_BLACKLIST:SET': + return Object.assign({}, state, { ignoreGpuBlacklist: true }); + case '[MAIN]:TEST_MODE:SET': + return Object.assign({}, state, { autoTestMode: true }); + case '[MAIN]:CLI_FLAGS:SYNC': + return Object.assign({}, state, { + cliFlags: action.payload.cliFlags + }); + case '[MAIN]:SET_LANGUAGE_ON_MAIN:SUCCESS': + return Object.assign({}, state, { i18n: action.payload.i18n }); + case '[MAIN]:SWARM:ENABLING': + return Object.assign({}, state, { + swarmState: SwarmState.Enabling + }); + case '[MAIN]:SWARM:ENABLED': + return Object.assign({}, state, { swarmState: SwarmState.Enabled }); + case '[MAIN]:SWARM:DISABLING': + return Object.assign({}, state, { + swarmState: SwarmState.Disabling + }); + case '[MAIN]:SWARM:DISABLED': + return Object.assign({}, state, { + swarmState: SwarmState.Disabled + }); + case '[MAIN]:SWARM:FAILURE': + return Object.assign({}, state, { swarmState: SwarmState.Error }); + case '[MAIN]:SWARM:ENABLE_ON_START': + return Object.assign({}, state, { swarmEnableOnStart: true }); + case '[MAIN]:SWARM:DISABLE_ON_START': + return Object.assign({}, state, { swarmEnableOnStart: false }); + case '[MAIN]:UPDATE_CHECKER:FINISH': + return Object.assign({}, state, { updateCheckerRan: true }); + case '[MAIN]:IPC_PROVIDER_BACKEND:FINISH': + return Object.assign({}, state, { ipcProviderBackendInit: true }); + default: + return state; + } +}; export default settings; diff --git a/modules/core/store.js b/modules/core/store.js index dc6487c6f..7d439ea93 100644 --- a/modules/core/store.js +++ b/modules/core/store.js @@ -6,12 +6,12 @@ import { app } from 'electron'; import rootReducer from './rootReducer'; export default function configureReduxStore() { - const store = createStore( - rootReducer, - composeWithDevTools(applyMiddleware(thunk, forwardToRenderer)), - ); + const store = createStore( + rootReducer, + composeWithDevTools(applyMiddleware(thunk, forwardToRenderer)) + ); - replayActionMain(store); + replayActionMain(store); - return store; + return store; } diff --git a/modules/core/ui/actions.js b/modules/core/ui/actions.js index 3d33b3e06..9ab66097b 100644 --- a/modules/core/ui/actions.js +++ b/modules/core/ui/actions.js @@ -1,29 +1,29 @@ import { app } from 'electron'; export function quitApp() { - return dispatch => { - dispatch({ type: '[MAIN]:APP_QUIT:START' }); - try { - app.quit(); - dispatch({ type: '[MAIN]:APP_QUIT:SUCCESS' }); - } catch (error) { - dispatch({ type: '[MAIN]:APP_QUIT:FAILURE', error }); - } + return dispatch => { + dispatch({ type: '[MAIN]:APP_QUIT:START' }); + try { + app.quit(); + dispatch({ type: '[MAIN]:APP_QUIT:SUCCESS' }); + } catch (error) { + dispatch({ type: '[MAIN]:APP_QUIT:FAILURE', error }); } + }; } export function openWindow(windowType) { - return { type: '[MAIN]:WINDOW:OPEN', payload: { windowType } }; + return { type: '[MAIN]:WINDOW:OPEN', payload: { windowType } }; } export function closeWindow(windowType) { - return { type: '[MAIN]:WINDOW:CLOSE', payload: { windowType } }; + return { type: '[MAIN]:WINDOW:CLOSE', payload: { windowType } }; } export function reuseGenericWindow(actingType) { - return { type: '[MAIN]:GENERIC_WINDOW:REUSE', payload: { actingType } }; + return { type: '[MAIN]:GENERIC_WINDOW:REUSE', payload: { actingType } }; } export function resetGenericWindow() { - return { type: '[MAIN]:GENERIC_WINDOW:RESET' }; + return { type: '[MAIN]:GENERIC_WINDOW:RESET' }; } diff --git a/modules/core/ui/reducer.js b/modules/core/ui/reducer.js index 1e327eefe..cf294d29c 100644 --- a/modules/core/ui/reducer.js +++ b/modules/core/ui/reducer.js @@ -1,41 +1,41 @@ import uniq from 'lodash/uniq'; export const initialState = { - appQuit: false, - genericWindowActingType: '', - windowsInit: false, - windowsOpen: [], + appQuit: false, + genericWindowActingType: '', + windowsInit: false, + windowsOpen: [] }; const ui = (state = initialState, action) => { - switch (action.type) { - case '[MAIN]:APP_QUIT:SUCCESS': - return Object.assign({}, state, { appQuit: true }); - case '[MAIN]:WINDOW:OPEN': - return Object.assign({}, state, { - windowsOpen: uniq(state.windowsOpen.concat(action.payload.windowType)), - }); - case '[MAIN]:WINDOW:CLOSE': - return Object.assign({}, state, { - windowsOpen: state.windowsOpen.filter(w => { - return w !== action.payload.windowType; - }), - }); - case '[MAIN]:WINDOWS:INIT_FINISH': - return Object.assign({}, state, { windowsInit: true }); - case '[MAIN]:GENERIC_WINDOW:REUSE': - return Object.assign({}, state, { - genericWindowActingType: action.payload.actingType, - windowsOpen: state.windowsOpen.concat('generic'), - }); - case '[MAIN]:GENERIC_WINDOW:RESET': - return Object.assign({}, state, { - genericWindowActingType: '', - windowsOpen: state.windowsOpen.filter(i => i !== 'generic'), - }); - default: - return state; - } -} + switch (action.type) { + case '[MAIN]:APP_QUIT:SUCCESS': + return Object.assign({}, state, { appQuit: true }); + case '[MAIN]:WINDOW:OPEN': + return Object.assign({}, state, { + windowsOpen: uniq(state.windowsOpen.concat(action.payload.windowType)) + }); + case '[MAIN]:WINDOW:CLOSE': + return Object.assign({}, state, { + windowsOpen: state.windowsOpen.filter(w => { + return w !== action.payload.windowType; + }) + }); + case '[MAIN]:WINDOWS:INIT_FINISH': + return Object.assign({}, state, { windowsInit: true }); + case '[MAIN]:GENERIC_WINDOW:REUSE': + return Object.assign({}, state, { + genericWindowActingType: action.payload.actingType, + windowsOpen: state.windowsOpen.concat('generic') + }); + case '[MAIN]:GENERIC_WINDOW:RESET': + return Object.assign({}, state, { + genericWindowActingType: '', + windowsOpen: state.windowsOpen.filter(i => i !== 'generic') + }); + default: + return state; + } +}; export default ui; diff --git a/modules/db.js b/modules/db.js index c7d95ce58..373436511 100644 --- a/modules/db.js +++ b/modules/db.js @@ -4,71 +4,66 @@ const Loki = require('lokijs'); const Settings = require('./settings'); const log = require('./utils/logger').create('Db'); - let db; - exports.init = () => { - const filePath = Settings.dbFilePath; + const filePath = Settings.dbFilePath; - return Q.try(() => { - // if db file doesn't exist then create it - try { - log.debug(`Check that db exists and it's writeable: ${filePath}`); - fs.accessSync(filePath, fs.R_OK | fs.W_OK); - return Q.resolve(); - } catch (err) { - log.info(`Creating db: ${filePath}`); + return Q.try(() => { + // if db file doesn't exist then create it + try { + log.debug(`Check that db exists and it's writeable: ${filePath}`); + fs.accessSync(filePath, fs.R_OK | fs.W_OK); + return Q.resolve(); + } catch (err) { + log.info(`Creating db: ${filePath}`); - const tempdb = new Loki(filePath, { - env: 'NODEJS', - autoload: false, - }); + const tempdb = new Loki(filePath, { + env: 'NODEJS', + autoload: false + }); - return new Q.promisify(tempdb.saveDatabase, { context: tempdb })(); - } - }) - .then(() => { - log.info(`Loading db: ${filePath}`); + return new Q.promisify(tempdb.saveDatabase, { context: tempdb })(); + } + }).then(() => { + log.info(`Loading db: ${filePath}`); - return new Q((resolve, reject) => { - db = new Loki(filePath, { - env: 'NODEJS', - autosave: true, - autosaveInterval: 5000, - autoload: true, - autoloadCallback(err) { - if (err) { - log.error(err); - reject(new Error('Error instantiating db')); - } - resolve(); - }, - }); - }); + return new Q((resolve, reject) => { + db = new Loki(filePath, { + env: 'NODEJS', + autosave: true, + autosaveInterval: 5000, + autoload: true, + autoloadCallback(err) { + if (err) { + log.error(err); + reject(new Error('Error instantiating db')); + } + resolve(); + } + }); }); + }); }; +exports.getCollection = name => { + if (!db.getCollection(name)) { + db.addCollection(name, { + unique: ['_id'] + }); + } -exports.getCollection = (name) => { - if (!db.getCollection(name)) { - db.addCollection(name, { - unique: ['_id'] - }); - } - - return db.getCollection(name); + return db.getCollection(name); }; - exports.close = () => { - return new Q((resolve, reject) => { - db.close((err) => { - if (err) { - reject(err); - } else { - resolve(); - } - }); + return new Q((resolve, reject) => { + db.close(err => { + if (err) { + reject(err); + } else { + resolve(); + } }); + }); }; diff --git a/modules/dbSync.js b/modules/dbSync.js index 40d052ff3..7420a7eac 100644 --- a/modules/dbSync.js +++ b/modules/dbSync.js @@ -7,187 +7,188 @@ const { ipcMain, ipcRenderer } = require('electron'); * Sync IPC calls received from given window into given db table. * @param {Object} coll Db collection to save to. */ -exports.initializeListeners = function () { - let log = require('./utils/logger').create('dbSync'), - db = require('./db'), - ipc = ipcMain; +exports.initializeListeners = function() { + let log = require('./utils/logger').create('dbSync'), + db = require('./db'), + ipc = ipcMain; - ipc.on('dbSync-add', (event, args) => { - let collName = args.collName, - coll = db.getCollection(`UI_${collName}`); + ipc.on('dbSync-add', (event, args) => { + let collName = args.collName, + coll = db.getCollection(`UI_${collName}`); - log.trace('dbSync-add', collName, args._id); + log.trace('dbSync-add', collName, args._id); - const _id = args._id; + const _id = args._id; - if (!coll.by('_id', _id)) { - args.fields._id = _id; - coll.insert(args.fields); - } - }); + if (!coll.by('_id', _id)) { + args.fields._id = _id; + coll.insert(args.fields); + } + }); - ipc.on('dbSync-changed', (event, args) => { - let collName = args.collName, - coll = db.getCollection(`UI_${collName}`); + ipc.on('dbSync-changed', (event, args) => { + let collName = args.collName, + coll = db.getCollection(`UI_${collName}`); - log.trace('dbSync-changed', collName, args._id); + log.trace('dbSync-changed', collName, args._id); - const _id = args._id; - const item = coll.by('_id', _id); - - if (item) { - for (const k in args.fields) { - if ({}.hasOwnProperty.call(args.fields, k)) { - item[k] = args.fields[k]; - } - } + const _id = args._id; + const item = coll.by('_id', _id); - coll.update(item); - } else { - log.error('Item not found in db', _id); + if (item) { + for (const k in args.fields) { + if ({}.hasOwnProperty.call(args.fields, k)) { + item[k] = args.fields[k]; } - }); + } - ipc.on('dbSync-removed', (event, args) => { - let collName = args.collName, - coll = db.getCollection(`UI_${collName}`); + coll.update(item); + } else { + log.error('Item not found in db', _id); + } + }); - log.trace('dbSync-removed', collName, args._id); + ipc.on('dbSync-removed', (event, args) => { + let collName = args.collName, + coll = db.getCollection(`UI_${collName}`); - const _id = args._id; - const item = coll.by('_id', _id); + log.trace('dbSync-removed', collName, args._id); - if (item) { - coll.remove(item); - } else { - log.error('Item not found in db', _id); - } - }); + const _id = args._id; + const item = coll.by('_id', _id); - // Get all data (synchronous) - ipc.on('dbSync-reloadSync', (event, args) => { - let collName = args.collName, - coll = db.getCollection(`UI_${collName}`), - docs = coll.find(); + if (item) { + coll.remove(item); + } else { + log.error('Item not found in db', _id); + } + }); - log.debug('dbSync-reloadSync, no. of docs:', collName, docs.length); + // Get all data (synchronous) + ipc.on('dbSync-reloadSync', (event, args) => { + let collName = args.collName, + coll = db.getCollection(`UI_${collName}`), + docs = coll.find(); - docs = docs.map((doc) => { - const ret = {}; + log.debug('dbSync-reloadSync, no. of docs:', collName, docs.length); - for (const k in doc) { - if (k !== 'meta' && k !== '$loki') { - ret[k] = doc[k]; - } - } + docs = docs.map(doc => { + const ret = {}; - return ret; - }); + for (const k in doc) { + if (k !== 'meta' && k !== '$loki') { + ret[k] = doc[k]; + } + } - event.returnValue = docs; + return ret; }); -}; -const syncDataFromBackend = function (coll) { - const ipc = ipcRenderer; + event.returnValue = docs; + }); +}; - const collName = coll._name; +const syncDataFromBackend = function(coll) { + const ipc = ipcRenderer; - console.debug('Load collection data from backend: ', collName); + const collName = coll._name; - return new Promise((resolve, reject) => { - const dataJson = ipc.sendSync('dbSync-reloadSync', { - collName, - }); + console.debug('Load collection data from backend: ', collName); - try { - let done = 0; + return new Promise((resolve, reject) => { + const dataJson = ipc.sendSync('dbSync-reloadSync', { + collName + }); - coll.remove({}); + try { + let done = 0; + + coll.remove({}); + + if (!dataJson.length) { + resolve(); + } + + // we do inserts slowly, to avoid race conditions when it comes + // to updating the UI + dataJson.forEach(record => { + Tracker.afterFlush(() => { + try { + // On Meteor startup if a record contains a redirect to about:blank + // page, the application process crashes. + if ( + _.isString(record.redirect) && + record.redirect.indexOf('//about:blank') > -1 + ) { + record.redirect = null; + } - if (!dataJson.length) { - resolve(); + if (record._id) { + coll.upsert(record._id, record); + } else { + coll.insert(record); } + } catch (err) { + console.error(err.toString()); + } - // we do inserts slowly, to avoid race conditions when it comes - // to updating the UI - dataJson.forEach((record) => { - Tracker.afterFlush(() => { - try { - // On Meteor startup if a record contains a redirect to about:blank - // page, the application process crashes. - if (_.isString(record.redirect) && - record.redirect.indexOf('//about:blank') > -1) { - record.redirect = null; - } - - if (record._id) { - coll.upsert(record._id, record); - } else { - coll.insert(record); - } - } catch (err) { - console.error(err.toString()); - } - - done++; - - if (done >= dataJson.length) { - resolve(); - } - }); - }); - } catch (err) { - reject(err); - } - }); + done++; + + if (done >= dataJson.length) { + resolve(); + } + }); + }); + } catch (err) { + reject(err); + } + }); }; exports.syncDataFromBackend = syncDataFromBackend; -exports.frontendSyncInit = function (coll) { - let ipc = ipcRenderer, - syncDoneResolver; +exports.frontendSyncInit = function(coll) { + let ipc = ipcRenderer, + syncDoneResolver; - const collName = coll._name; + const collName = coll._name; - coll.onceSynced = new Promise((resolve, reject) => { - syncDoneResolver = resolve; - }); + coll.onceSynced = new Promise((resolve, reject) => { + syncDoneResolver = resolve; + }); - - syncDataFromBackend(coll) - .catch((err) => { - console.error(err.toString()); + syncDataFromBackend(coll) + .catch(err => { + console.error(err.toString()); }) .then(() => { - // start watching for changes - coll.find().observeChanges({ - added(id, fields) { - ipc.send('dbSync-add', { - collName, - _id: id, - fields, - }); - }, - changed(id, fields) { - ipc.send('dbSync-changed', { - collName, - _id: id, - fields, - }); - }, - removed(id) { - ipc.send('dbSync-removed', { - collName, - _id: id, - }); - }, - }); + // start watching for changes + coll.find().observeChanges({ + added(id, fields) { + ipc.send('dbSync-add', { + collName, + _id: id, + fields + }); + }, + changed(id, fields) { + ipc.send('dbSync-changed', { + collName, + _id: id, + fields + }); + }, + removed(id) { + ipc.send('dbSync-removed', { + collName, + _id: id + }); + } + }); - console.debug('Sync collection data to backend started: ', collName); + console.debug('Sync collection data to backend started: ', collName); - syncDoneResolver(); + syncDoneResolver(); }); - return coll; + return coll; }; diff --git a/modules/ethereumNode.js b/modules/ethereumNode.js index fa6956b9d..caa033d67 100644 --- a/modules/ethereumNode.js +++ b/modules/ethereumNode.js @@ -22,526 +22,571 @@ const UNABLE_TO_BIND_PORT_ERROR = 'unableToBindPort'; const NODE_START_WAIT_MS = 3000; const STATES = { - STARTING: 0, /* Node about to be started */ - STARTED: 1, /* Node started */ - CONNECTED: 2, /* IPC connected - all ready */ - STOPPING: 3, /* Node about to be stopped */ - STOPPED: 4, /* Node stopped */ - ERROR: -1, /* Unexpected error */ + STARTING: 0 /* Node about to be started */, + STARTED: 1 /* Node started */, + CONNECTED: 2 /* IPC connected - all ready */, + STOPPING: 3 /* Node about to be stopped */, + STOPPED: 4 /* Node stopped */, + ERROR: -1 /* Unexpected error */ }; - /** * Etheruem nodes manager. */ class EthereumNode extends EventEmitter { - constructor() { - super(); - - this.STATES = STATES; - - this._loadDefaults(); - - this._node = null; - this._type = null; - this._network = null; - - this._socket = Sockets.get('node-ipc', Settings.rpcMode); - - this.on('data', _.bind(this._logNodeData, this)); + constructor() { + super(); + + this.STATES = STATES; + + this._loadDefaults(); + + this._node = null; + this._type = null; + this._network = null; + + this._socket = Sockets.get('node-ipc', Settings.rpcMode); + + this.on('data', _.bind(this._logNodeData, this)); + } + + get isOwnNode() { + return !!this._node; + } + + get isExternalNode() { + return !this._node; + } + + get isIpcConnected() { + return this._socket.isConnected; + } + + get type() { + return this.isOwnNode ? this._type : null; + } + + get network() { + return this.isOwnNode ? this._network : null; + } + + get syncMode() { + return this._syncMode; + } + + get isEth() { + return this._type === 'eth'; + } + + get isGeth() { + return this._type === 'geth'; + } + + get isMainNetwork() { + return this.network === 'main'; + } + + get isTestNetwork() { + return this.network === 'test'; + } + + get isRinkebyNetwork() { + return this.network === 'rinkeby'; + } + + get isDevNetwork() { + return this.network === 'dev'; + } + + get isLightMode() { + return this._syncMode === 'light'; + } + + get state() { + return this._state; + } + + get stateAsText() { + switch (this._state) { + case STATES.STARTING: + return 'starting'; + case STATES.STARTED: + return 'started'; + case STATES.CONNECTED: + return 'connected'; + case STATES.STOPPING: + return 'stopping'; + case STATES.STOPPED: + return 'stopped'; + case STATES.ERROR: + return 'error'; + default: + return false; } + } + + set state(newState) { + this._state = newState; + + this.emit('state', this.state, this.stateAsText); + } + + get lastError() { + return this._lastErr; + } + + set lastError(err) { + this._lastErr = err; + } + + /** + * This method should always be called first to initialise the connection. + * @return {Promise} + */ + init() { + return this._socket + .connect(Settings.rpcConnectConfig) + .then(() => { + this.state = STATES.CONNECTED; + + this.emit('runningNodeFound'); + }) + .catch(() => { + ethereumNodeLog.warn( + "Failed to connect to node. Maybe it's not running so let's start our own..." + ); + + ethereumNodeLog.info(`Node type: ${this.defaultNodeType}`); + ethereumNodeLog.info(`Network: ${this.defaultNetwork}`); + ethereumNodeLog.info(`SyncMode: ${this.defaultSyncMode}`); + + // if not, start node yourself + return this._start( + this.defaultNodeType, + this.defaultNetwork, + this.defaultSyncMode + ).catch(err => { + ethereumNodeLog.error('Failed to start node', err); + throw err; + }); + }); + } + + restart(newType, newNetwork, syncMode) { + return Q.try(() => { + if (!this.isOwnNode) { + throw new Error('Cannot restart node since it was started externally'); + } + + ethereumNodeLog.info('Restart node', newType, newNetwork); + + return this.stop() + .then(() => Windows.loading.show()) + .then(() => + this._start( + newType || this.type, + newNetwork || this.network, + syncMode || this.syncMode + ) + ) + .then(() => Windows.loading.hide()) + .catch(err => { + ethereumNodeLog.error('Error restarting node', err); + throw err; + }); + }); + } + + /** + * Stop node. + * + * @return {Promise} + */ + stop() { + if (!this._stopPromise) { + return new Q(resolve => { + if (!this._node) { + return resolve(); + } - get isOwnNode() { - return !!this._node; - } + this.state = STATES.STOPPING; - get isExternalNode() { - return !this._node; - } + ethereumNodeLog.info( + `Stopping existing node: ${this._type} ${this._network}` + ); - get isIpcConnected() { - return this._socket.isConnected; - } + this._node.stderr.removeAllListeners('data'); + this._node.stdout.removeAllListeners('data'); + this._node.stdin.removeAllListeners('error'); + this._node.removeAllListeners('error'); + this._node.removeAllListeners('exit'); - get type() { - return this.isOwnNode ? this._type : null; - } + this._node.kill('SIGINT'); - get network() { - return this.isOwnNode ? this._network : null; - } + // after some time just kill it if not already done so + const killTimeout = setTimeout(() => { + if (this._node) { + this._node.kill('SIGKILL'); + } + }, 8000 /* 8 seconds */); - get syncMode() { - return this._syncMode; - } + this._node.once('close', () => { + clearTimeout(killTimeout); - get isEth() { - return this._type === 'eth'; - } + this._node = null; - get isGeth() { - return this._type === 'geth'; + resolve(); + }); + }).then(() => { + this.state = STATES.STOPPED; + this._stopPromise = null; + }); } - - get isMainNetwork() { - return this.network === 'main'; + ethereumNodeLog.debug( + 'Disconnection already in progress, returning Promise.' + ); + return this._stopPromise; + } + + /** + * Send Web3 command to socket. + * @param {String} method Method name + * @param {Array} [params] Method arguments + * @return {Promise} resolves to result or error. + */ + send(method, params) { + return this._socket.send({ + method, + params + }); + } + + /** + * Start an ethereum node. + * @param {String} nodeType geth, eth, etc + * @param {String} network network id + * @return {Promise} + */ + _start(nodeType, network, syncMode) { + ethereumNodeLog.info(`Start node: ${nodeType} ${network} ${syncMode}`); + + const isTestNet = network === 'test'; + + if (isTestNet) { + ethereumNodeLog.debug('Node will connect to the test network'); } - get isTestNetwork() { - return this.network === 'test'; - } + return this.stop() + .then(() => { + return this.__startNode(nodeType, network, syncMode).catch(err => { + ethereumNodeLog.error('Failed to start node', err); - get isRinkebyNetwork() { - return this.network === 'rinkeby'; - } + this._showNodeErrorDialog(nodeType, network); - get isDevNetwork() { - return this.network === 'dev'; - } + throw err; + }); + }) + .then(proc => { + ethereumNodeLog.info( + `Started node successfully: ${nodeType} ${network} ${syncMode}` + ); + + this._node = proc; + this.state = STATES.STARTED; + + Settings.saveUserData('node', this._type); + Settings.saveUserData('network', this._network); + Settings.saveUserData('syncmode', this._syncMode); + + return this._socket + .connect(Settings.rpcConnectConfig, { + timeout: 30000 /* 30s */ + }) + .then(() => { + this.state = STATES.CONNECTED; + }) + .catch(err => { + ethereumNodeLog.error('Failed to connect to node', err); + + if (err.toString().indexOf('timeout') >= 0) { + this.emit('nodeConnectionTimeout'); + } - get isLightMode() { - return this._syncMode === 'light'; - } + this._showNodeErrorDialog(nodeType, network); - get state() { - return this._state; - } + throw err; + }); + }) + .catch(err => { + // set before updating state so that state change event observers + // can pick up on this + this.lastError = err.tag; + this.state = STATES.ERROR; - get stateAsText() { - switch (this._state) { - case STATES.STARTING: - return 'starting'; - case STATES.STARTED: - return 'started'; - case STATES.CONNECTED: - return 'connected'; - case STATES.STOPPING: - return 'stopping'; - case STATES.STOPPED: - return 'stopped'; - case STATES.ERROR: - return 'error'; - default: - return false; + // if unable to start eth node then write geth to defaults + if (nodeType === 'eth') { + Settings.saveUserData('node', 'geth'); } - } - set state(newState) { - this._state = newState; + throw err; + }); + } - this.emit('state', this.state, this.stateAsText); - } + /** + * @return {Promise} + */ + __startNode(nodeType, network, syncMode) { + this.state = STATES.STARTING; - get lastError() { - return this._lastErr; - } + this._network = network; + this._type = nodeType; + this._syncMode = syncMode; - set lastError(err) { - this._lastErr = err; - } + const client = ClientBinaryManager.getClient(nodeType); + let binPath; - /** - * This method should always be called first to initialise the connection. - * @return {Promise} - */ - init() { - return this._socket.connect(Settings.rpcConnectConfig) - .then(() => { - this.state = STATES.CONNECTED; - - this.emit('runningNodeFound'); - }) - .catch(() => { - ethereumNodeLog.warn('Failed to connect to node. Maybe it\'s not running so let\'s start our own...'); - - ethereumNodeLog.info(`Node type: ${this.defaultNodeType}`); - ethereumNodeLog.info(`Network: ${this.defaultNetwork}`); - ethereumNodeLog.info(`SyncMode: ${this.defaultSyncMode}`); - - // if not, start node yourself - return this._start(this.defaultNodeType, this.defaultNetwork, this.defaultSyncMode) - .catch((err) => { - ethereumNodeLog.error('Failed to start node', err); - throw err; - }); - }); + if (client) { + binPath = client.binPath; + } else { + throw new Error(`Node "${nodeType}" binPath is not available.`); } - - restart(newType, newNetwork, syncMode) { - return Q.try(() => { - if (!this.isOwnNode) { - throw new Error('Cannot restart node since it was started externally'); - } - - ethereumNodeLog.info('Restart node', newType, newNetwork); - - return this.stop() - .then(() => Windows.loading.show()) - .then(() => this._start( - newType || this.type, - newNetwork || this.network, - syncMode || this.syncMode - )) - .then(() => Windows.loading.hide()) - .catch((err) => { - ethereumNodeLog.error('Error restarting node', err); - throw err; - }); - }); + ethereumNodeLog.info(`Start node using ${binPath}`); + + return new Q((resolve, reject) => { + this.__startProcess(nodeType, network, binPath, syncMode).then( + resolve, + reject + ); + }); + } + + /** + * @return {Promise} + */ + __startProcess(nodeType, network, binPath, _syncMode) { + let syncMode = _syncMode; + if (nodeType === 'geth' && !syncMode) { + syncMode = DEFAULT_SYNCMODE; } - - /** - * Stop node. - * - * @return {Promise} - */ - stop() { - if (!this._stopPromise) { - return new Q((resolve) => { - if (!this._node) { - return resolve(); - } - - this.state = STATES.STOPPING; - - ethereumNodeLog.info(`Stopping existing node: ${this._type} ${this._network}`); - - this._node.stderr.removeAllListeners('data'); - this._node.stdout.removeAllListeners('data'); - this._node.stdin.removeAllListeners('error'); - this._node.removeAllListeners('error'); - this._node.removeAllListeners('exit'); - - this._node.kill('SIGINT'); - - // after some time just kill it if not already done so - const killTimeout = setTimeout(() => { - if (this._node) { - this._node.kill('SIGKILL'); - } - }, 8000 /* 8 seconds */); - - this._node.once('close', () => { - clearTimeout(killTimeout); - - this._node = null; - - resolve(); - }); - }) - .then(() => { - this.state = STATES.STOPPED; - this._stopPromise = null; - }); + return new Q((resolve, reject) => { + ethereumNodeLog.trace('Rotate log file'); + + logRotate( + path.join(Settings.userDataPath, 'logs', 'all.log'), + { count: 5 }, + error => { + if (error) { + ethereumNodeLog.error('Log rotation problems', error); + return reject(error); + } } - ethereumNodeLog.debug('Disconnection already in progress, returning Promise.'); - return this._stopPromise; - } - - /** - * Send Web3 command to socket. - * @param {String} method Method name - * @param {Array} [params] Method arguments - * @return {Promise} resolves to result or error. - */ - send(method, params) { - return this._socket.send({ - method, - params, - }); - } - - - /** - * Start an ethereum node. - * @param {String} nodeType geth, eth, etc - * @param {String} network network id - * @return {Promise} - */ - _start(nodeType, network, syncMode) { - ethereumNodeLog.info(`Start node: ${nodeType} ${network} ${syncMode}`); - - const isTestNet = (network === 'test'); - - if (isTestNet) { - ethereumNodeLog.debug('Node will connect to the test network'); + ); + + logRotate( + path.join( + Settings.userDataPath, + 'logs', + 'category', + 'ethereum_node.log' + ), + { count: 5 }, + error => { + if (error) { + ethereumNodeLog.error('Log rotation problems', error); + return reject(error); + } } + ); + + let args; + + switch (network) { + // Starts Ropsten network + case 'test': + args = [ + '--testnet', + '--syncmode', + syncMode, + '--cache', + process.arch === 'x64' ? '1024' : '512', + '--ipcpath', + Settings.rpcIpcPath + ]; + break; + + // Starts Rinkeby network + case 'rinkeby': + args = [ + '--rinkeby', + '--syncmode', + syncMode, + '--cache', + process.arch === 'x64' ? '1024' : '512', + '--ipcpath', + Settings.rpcIpcPath + ]; + break; + + // Starts local network + case 'dev': + args = [ + '--dev', + '--minerthreads', + '1', + '--ipcpath', + Settings.rpcIpcPath + ]; + break; + + // Starts Main net + default: + args = + nodeType === 'geth' + ? [ + '--syncmode', + syncMode, + '--cache', + process.arch === 'x64' ? '1024' : '512' + ] + : ['--unsafe-transactions']; + } - return this.stop() - .then(() => { - return this.__startNode(nodeType, network, syncMode) - .catch((err) => { - ethereumNodeLog.error('Failed to start node', err); - - this._showNodeErrorDialog(nodeType, network); - - throw err; - }); - }) - .then((proc) => { - ethereumNodeLog.info(`Started node successfully: ${nodeType} ${network} ${syncMode}`); - - this._node = proc; - this.state = STATES.STARTED; - - Settings.saveUserData('node', this._type); - Settings.saveUserData('network', this._network); - Settings.saveUserData('syncmode', this._syncMode); - - return this._socket.connect(Settings.rpcConnectConfig, { - timeout: 30000, /* 30s */ - }) - .then(() => { - this.state = STATES.CONNECTED; - }) - .catch((err) => { - ethereumNodeLog.error('Failed to connect to node', err); - - if (err.toString().indexOf('timeout') >= 0) { - this.emit('nodeConnectionTimeout'); - } - - this._showNodeErrorDialog(nodeType, network); - - throw err; - }); - }) - .catch((err) => { - // set before updating state so that state change event observers - // can pick up on this - this.lastError = err.tag; - this.state = STATES.ERROR; - - // if unable to start eth node then write geth to defaults - if (nodeType === 'eth') { - Settings.saveUserData('node', 'geth'); - } - - throw err; - }); - } + const nodeOptions = Settings.nodeOptions; + if (nodeOptions && nodeOptions.length) { + ethereumNodeLog.debug('Custom node options', nodeOptions); - /** - * @return {Promise} - */ - __startNode(nodeType, network, syncMode) { - this.state = STATES.STARTING; + args = args.concat(nodeOptions); + } - this._network = network; - this._type = nodeType; - this._syncMode = syncMode; + ethereumNodeLog.trace('Spawn', binPath, args); - const client = ClientBinaryManager.getClient(nodeType); - let binPath; + const proc = spawn(binPath, args); - if (client) { - binPath = client.binPath; - } else { - throw new Error(`Node "${nodeType}" binPath is not available.`); - } + proc.once('error', error => { + if (this.state === STATES.STARTING) { + this.state = STATES.ERROR; - ethereumNodeLog.info(`Start node using ${binPath}`); - - return new Q((resolve, reject) => { - this.__startProcess(nodeType, network, binPath, syncMode) - .then(resolve, reject); - }); - } + ethereumNodeLog.info('Node startup error'); + // TODO: detect this properly + // this.emit('nodeBinaryNotFound'); - /** - * @return {Promise} - */ - __startProcess(nodeType, network, binPath, _syncMode) { - let syncMode = _syncMode; - if (nodeType === 'geth' && !syncMode) { - syncMode = DEFAULT_SYNCMODE; + reject(error); } - - return new Q((resolve, reject) => { - ethereumNodeLog.trace('Rotate log file'); - - logRotate(path.join(Settings.userDataPath, 'logs', 'all.log'), { count: 5 }, (error) => { - if (error) { - ethereumNodeLog.error('Log rotation problems', error); - return reject(error); - } - }); - - logRotate(path.join(Settings.userDataPath, 'logs', 'category', 'ethereum_node.log'), { count: 5 }, (error) => { - if (error) { - ethereumNodeLog.error('Log rotation problems', error); - return reject(error); - } - }); - - let args; - - switch (network) { - - // Starts Ropsten network - case 'test': - args = [ - '--testnet', - '--syncmode', syncMode, - '--cache', ((process.arch === 'x64') ? '1024' : '512'), - '--ipcpath', Settings.rpcIpcPath - ]; - break; - - // Starts Rinkeby network - case 'rinkeby': - args = [ - '--rinkeby', - '--syncmode', syncMode, - '--cache', ((process.arch === 'x64') ? '1024' : '512'), - '--ipcpath', Settings.rpcIpcPath - ]; - break; - - // Starts local network - case 'dev': - args = [ - '--dev', - '--minerthreads', '1', - '--ipcpath', Settings.rpcIpcPath - ]; - break; - - // Starts Main net - default: - args = (nodeType === 'geth') - ? [ - '--syncmode', syncMode, - '--cache', ((process.arch === 'x64') ? '1024' : '512') - ] - : ['--unsafe-transactions']; - } - - const nodeOptions = Settings.nodeOptions; - - if (nodeOptions && nodeOptions.length) { - ethereumNodeLog.debug('Custom node options', nodeOptions); - - args = args.concat(nodeOptions); - } - - ethereumNodeLog.trace('Spawn', binPath, args); - - const proc = spawn(binPath, args); - - proc.once('error', (error) => { - if (this.state === STATES.STARTING) { - this.state = STATES.ERROR; - - ethereumNodeLog.info('Node startup error'); - - // TODO: detect this properly - // this.emit('nodeBinaryNotFound'); - - reject(error); - } - }); - - proc.stdout.on('data', (data) => { - ethereumNodeLog.trace('Got stdout data', data.toString()); - this.emit('data', data); - }); - - proc.stderr.on('data', (data) => { - ethereumNodeLog.trace('Got stderr data', data.toString()); - ethereumNodeLog.info(data.toString()); // TODO: This should be ethereumNodeLog.error(), but not sure why regular stdout data is coming in through stderror - this.emit('data', data); - }); - - // when data is first received - this.once('data', () => { - /* + }); + + proc.stdout.on('data', data => { + ethereumNodeLog.trace('Got stdout data', data.toString()); + this.emit('data', data); + }); + + proc.stderr.on('data', data => { + ethereumNodeLog.trace('Got stderr data', data.toString()); + ethereumNodeLog.info(data.toString()); // TODO: This should be ethereumNodeLog.error(), but not sure why regular stdout data is coming in through stderror + this.emit('data', data); + }); + + // when data is first received + this.once('data', () => { + /* We wait a short while before marking startup as successful because we may want to parse the initial node output for errors, etc (see geth port-binding error above) */ - setTimeout(() => { - if (STATES.STARTING === this.state) { - ethereumNodeLog.info(`${NODE_START_WAIT_MS}ms elapsed, assuming node started up successfully`); - resolve(proc); - } - }, NODE_START_WAIT_MS); - }); - }); + setTimeout(() => { + if (STATES.STARTING === this.state) { + ethereumNodeLog.info( + `${NODE_START_WAIT_MS}ms elapsed, assuming node started up successfully` + ); + resolve(proc); + } + }, NODE_START_WAIT_MS); + }); + }); + } + + _showNodeErrorDialog(nodeType, network) { + let log = path.join(Settings.userDataPath, 'logs', 'all.log'); + + if (log) { + log = `...${log.slice(-1000)}`; + } else { + log = global.i18n.t('mist.errors.nodeStartup'); } - - _showNodeErrorDialog(nodeType, network) { - let log = path.join(Settings.userDataPath, 'logs', 'all.log'); - - if (log) { - log = `...${log.slice(-1000)}`; - } else { - log = global.i18n.t('mist.errors.nodeStartup'); - } - - // add node type - log = `Node type: ${nodeType}\n` + - `Network: ${network}\n` + - `Platform: ${process.platform} (Architecture ${process.arch})\n\n${ - log}`; - - dialog.showMessageBox({ - type: 'error', - buttons: ['OK'], - message: global.i18n.t('mist.errors.nodeConnect'), - detail: log, - }, () => {}); + // add node type + log = + `Node type: ${nodeType}\n` + + `Network: ${network}\n` + + `Platform: ${process.platform} (Architecture ${process.arch})\n\n${log}`; + + dialog.showMessageBox( + { + type: 'error', + buttons: ['OK'], + message: global.i18n.t('mist.errors.nodeConnect'), + detail: log + }, + () => {} + ); + } + + _logNodeData(data) { + const cleanData = data.toString().replace(/[\r\n]+/, ''); + const nodeType = (this.type || 'node').toUpperCase(); + + ethereumNodeLog.trace(`${nodeType}: ${cleanData}`); + + if (!/^-*$/.test(cleanData) && !_.isEmpty(cleanData)) { + this.emit('nodeLog', cleanData); } + // check for geth startup errors + if (STATES.STARTING === this.state) { + const dataStr = data.toString().toLowerCase(); + if (nodeType === 'geth') { + if (dataStr.indexOf('fatal: error') >= 0) { + const error = new Error(`Geth error: ${dataStr}`); - _logNodeData(data) { - const cleanData = data.toString().replace(/[\r\n]+/, ''); - const nodeType = (this.type || 'node').toUpperCase(); - - ethereumNodeLog.trace(`${nodeType}: ${cleanData}`); - - if (!/^-*$/.test(cleanData) && !_.isEmpty(cleanData)) { - this.emit('nodeLog', cleanData); - } - - // check for geth startup errors - if (STATES.STARTING === this.state) { - const dataStr = data.toString().toLowerCase(); - if (nodeType === 'geth') { - if (dataStr.indexOf('fatal: error') >= 0) { - const error = new Error(`Geth error: ${dataStr}`); - - if (dataStr.indexOf('bind') >= 0) { - error.tag = UNABLE_TO_BIND_PORT_ERROR; - } + if (dataStr.indexOf('bind') >= 0) { + error.tag = UNABLE_TO_BIND_PORT_ERROR; + } - ethereumNodeLog.error(error); - return reject(error); - } - } + ethereumNodeLog.error(error); + return reject(error); } + } } - - - _loadDefaults() { - ethereumNodeLog.trace('Load defaults'); - - this.defaultNodeType = Settings.nodeType || Settings.loadUserData('node') || DEFAULT_NODE_TYPE; - this.defaultNetwork = Settings.network || Settings.loadUserData('network') || DEFAULT_NETWORK; - this.defaultSyncMode = Settings.syncmode || Settings.loadUserData('syncmode') || DEFAULT_SYNCMODE; - - ethereumNodeLog.info(Settings.syncmode, Settings.loadUserData('syncmode'), DEFAULT_SYNCMODE); - ethereumNodeLog.info(`Defaults loaded: ${this.defaultNodeType} ${this.defaultNetwork} ${this.defaultSyncMode}`); - } + } + + _loadDefaults() { + ethereumNodeLog.trace('Load defaults'); + + this.defaultNodeType = + Settings.nodeType || Settings.loadUserData('node') || DEFAULT_NODE_TYPE; + this.defaultNetwork = + Settings.network || Settings.loadUserData('network') || DEFAULT_NETWORK; + this.defaultSyncMode = + Settings.syncmode || + Settings.loadUserData('syncmode') || + DEFAULT_SYNCMODE; + + ethereumNodeLog.info( + Settings.syncmode, + Settings.loadUserData('syncmode'), + DEFAULT_SYNCMODE + ); + ethereumNodeLog.info( + `Defaults loaded: ${this.defaultNodeType} ${this.defaultNetwork} ${ + this.defaultSyncMode + }` + ); + } } - EthereumNode.STARTING = 0; - module.exports = new EthereumNode(); diff --git a/modules/i18n.js b/modules/i18n.js index 10a97a1ca..d3fc4b799 100644 --- a/modules/i18n.js +++ b/modules/i18n.js @@ -10,43 +10,44 @@ let i18nConf = fs.readFileSync(`${__dirname}/../interface/project-tap.i18n`); i18nConf = JSON.parse(i18nConf); const resources = { - dev: { translation: require('../interface/i18n/mist.en.i18n.json') }, + dev: { translation: require('../interface/i18n/mist.en.i18n.json') } }; // add supported languages -i18nConf.supported_languages.forEach((lang) => { - resources[lang] = { translation: require(`../interface/i18n/mist.${lang}.i18n.json`) }; +i18nConf.supported_languages.forEach(lang => { + resources[lang] = { + translation: require(`../interface/i18n/mist.${lang}.i18n.json`) + }; }); /** -* Given a language code, get best matched code from supported languages. -* -* > getBestMatchedLangCode('en-US') -* 'en' -* > getBestMatchedLangCode('zh-TW') -* 'zh-TW' -* > getBestMatchedLangCode('no-such-code') -* 'en' -*/ -i18n.getBestMatchedLangCode = (langCode) => { - const codeList = Object.keys(resources); - let bestMatchedCode = langCode; - if (codeList.indexOf(langCode) === -1) { - if (codeList.indexOf(langCode.substr(0, 2)) > -1) { - bestMatchedCode = langCode.substr(0, 2); - } else { - bestMatchedCode = 'en'; - } + * Given a language code, get best matched code from supported languages. + * + * > getBestMatchedLangCode('en-US') + * 'en' + * > getBestMatchedLangCode('zh-TW') + * 'zh-TW' + * > getBestMatchedLangCode('no-such-code') + * 'en' + */ +i18n.getBestMatchedLangCode = langCode => { + const codeList = Object.keys(resources); + let bestMatchedCode = langCode; + if (codeList.indexOf(langCode) === -1) { + if (codeList.indexOf(langCode.substr(0, 2)) > -1) { + bestMatchedCode = langCode.substr(0, 2); + } else { + bestMatchedCode = 'en'; } - return bestMatchedCode; + } + return bestMatchedCode; }; - // init i18n i18n.init({ - lng: global.language || 'en', - resources, - interpolation: { prefix: '__', suffix: '__' }, + lng: global.language || 'en', + resources, + interpolation: { prefix: '__', suffix: '__' } }); module.exports = i18n; diff --git a/modules/ipc/ipcProviderBackend.js b/modules/ipc/ipcProviderBackend.js index 99626849e..33e98f795 100644 --- a/modules/ipc/ipcProviderBackend.js +++ b/modules/ipc/ipcProviderBackend.js @@ -1,5 +1,3 @@ - - /** The IPC provider backend filter and tunnel all incoming request to the ethereum node. @@ -17,355 +15,370 @@ const Sockets = require('../socketManager'); const Settings = require('../settings'); const ethereumNode = require('../ethereumNode'); - const ERRORS = { - INVALID_PAYLOAD: { code: -32600, message: "Payload, or some of its content properties are invalid. Please check if they are valid HEX with '0x' prefix." }, - METHOD_DENIED: { code: -32601, message: 'Method __method__ not allowed.' }, - METHOD_TIMEOUT: { code: -32603, message: 'Request timed out for method __method__.' }, - TX_DENIED: { code: -32603, message: 'Transaction denied' }, - BATCH_TX_DENIED: { code: -32603, message: 'Transactions denied, sendTransaction is not allowed in batch requests.' }, - BATCH_COMPILE_DENIED: { code: -32603, message: 'Compilation denied, compileSolidity is not allowed in batch requests.' }, + INVALID_PAYLOAD: { + code: -32600, + message: + "Payload, or some of its content properties are invalid. Please check if they are valid HEX with '0x' prefix." + }, + METHOD_DENIED: { code: -32601, message: 'Method __method__ not allowed.' }, + METHOD_TIMEOUT: { + code: -32603, + message: 'Request timed out for method __method__.' + }, + TX_DENIED: { code: -32603, message: 'Transaction denied' }, + BATCH_TX_DENIED: { + code: -32603, + message: + 'Transactions denied, sendTransaction is not allowed in batch requests.' + }, + BATCH_COMPILE_DENIED: { + code: -32603, + message: + 'Compilation denied, compileSolidity is not allowed in batch requests.' + } }; - /** * IPC provider backend. */ class IpcProviderBackend { - constructor() { - this._connections = {}; - - this.ERRORS = ERRORS; - - ethereumNode.on('state', _.bind(this._onNodeStateChanged, this)); - - ipc.on('ipcProvider-create', _.bind(this._getOrCreateConnection, this)); - ipc.on('ipcProvider-destroy', _.bind(this._destroyConnection, this)); - ipc.on('ipcProvider-write', _.bind(this._sendRequest, this, false)); - ipc.on('ipcProvider-writeSync', _.bind(this._sendRequest, this, true)); - - this._connectionPromise = {}; - - // dynamically load in method processors - const processors = fs.readdirSync(path.join(__dirname, 'methods')); - - // get response processors - this._processors = {}; - processors.forEach((p) => { - const name = path.basename(p, '.js'); - - const PClass = require(path.join(__dirname, 'methods', p)); - - this._processors[name] = new PClass(name, this); - }); - - log.trace('Loaded processors', _.keys(this._processors)); - - store.dispatch({ type: '[MAIN]:IPC_PROVIDER_BACKEND:INIT' }); - } - - - /** - * Get/create new connection to node. - * @return {Promise} - */ - _getOrCreateConnection(event) { - const owner = event.sender; - const ownerId = owner.id; - - let socket; + constructor() { + this._connections = {}; + + this.ERRORS = ERRORS; + + ethereumNode.on('state', _.bind(this._onNodeStateChanged, this)); + + ipc.on('ipcProvider-create', _.bind(this._getOrCreateConnection, this)); + ipc.on('ipcProvider-destroy', _.bind(this._destroyConnection, this)); + ipc.on('ipcProvider-write', _.bind(this._sendRequest, this, false)); + ipc.on('ipcProvider-writeSync', _.bind(this._sendRequest, this, true)); + + this._connectionPromise = {}; + + // dynamically load in method processors + const processors = fs.readdirSync(path.join(__dirname, 'methods')); + + // get response processors + this._processors = {}; + processors.forEach(p => { + const name = path.basename(p, '.js'); + + const PClass = require(path.join(__dirname, 'methods', p)); + + this._processors[name] = new PClass(name, this); + }); + + log.trace('Loaded processors', _.keys(this._processors)); + + store.dispatch({ type: '[MAIN]:IPC_PROVIDER_BACKEND:INIT' }); + } + + /** + * Get/create new connection to node. + * @return {Promise} + */ + _getOrCreateConnection(event) { + const owner = event.sender; + const ownerId = owner.id; + + let socket; + + return Q.try(() => { + // already got? + if (this._connections[ownerId]) { + socket = this._connections[ownerId].socket; + } else { + log.debug(`Create new socket connection, id=${ownerId}`); + + socket = Sockets.get(ownerId, Settings.rpcMode); + } + }) + .then(() => { + if (!this._connections[ownerId]) { + // save to collection + this._connections[ownerId] = { + id: ownerId, + owner, + socket + }; + + // if something goes wrong destroy the socket + ['error', 'timeout', 'end'].forEach(ev => { + socket.on(ev, data => { + log.debug( + `Destroy socket connection due to event: ${ev}, id=${ownerId}` + ); + + socket.destroy().finally(() => { + if (!owner.isDestroyed()) { + owner.send(`ipcProvider-${ev}`, JSON.stringify(data)); + } + }); - return Q.try(() => { - // already got? - if (this._connections[ownerId]) { - socket = this._connections[ownerId].socket; - } else { - log.debug(`Create new socket connection, id=${ownerId}`); + delete this._connections[ownerId]; + Sockets.remove(ownerId); + }); + }); - socket = Sockets.get(ownerId, Settings.rpcMode); + socket.on('connect', data => { + if (!owner.isDestroyed()) { + owner.send('ipcProvider-connect', JSON.stringify(data)); } - }) - .then(() => { - if (!this._connections[ownerId]) { - // save to collection - this._connections[ownerId] = { - id: ownerId, - owner, - socket, - }; - - // if something goes wrong destroy the socket - ['error', 'timeout', 'end'].forEach((ev) => { - socket.on(ev, (data) => { - log.debug(`Destroy socket connection due to event: ${ev}, id=${ownerId}`); - - socket.destroy().finally(() => { - if (!owner.isDestroyed()) { owner.send(`ipcProvider-${ev}`, JSON.stringify(data)); } - }); - - delete this._connections[ownerId]; - Sockets.remove(ownerId); - }); - }); + }); - socket.on('connect', (data) => { - if (!owner.isDestroyed()) { - owner.send('ipcProvider-connect', JSON.stringify(data)); - } - }); + // pass notifications back up the chain + socket.on('data-notification', data => { + log.trace('Notification received', ownerId, data); - // pass notifications back up the chain - socket.on('data-notification', (data) => { - log.trace('Notification received', ownerId, data); - - if (data.error) { - data = this._makeErrorResponsePayload(data, data); - } else { - data = this._makeResponsePayload(data, data); - } - - if (!owner.isDestroyed()) { - owner.send('ipcProvider-data', JSON.stringify(data)); - } - }); + if (data.error) { + data = this._makeErrorResponsePayload(data, data); + } else { + data = this._makeResponsePayload(data, data); } - }) - .then(() => { - if (!socket.isConnected) { - // since we may enter this function multiple times for the same - // event source's IPC we don't want to repeat the connection - // process each time - so let's track things in a promise - if (!this._connectionPromise[ownerId]) { - this._connectionPromise[ownerId] = Q.try(() => { - log.debug(`Connecting socket ${ownerId}`); - - // wait for node to connect first. - if (ethereumNode.state !== ethereumNode.STATES.CONNECTED) { - return new Q((resolve, reject) => { - const onStateChange = (newState) => { - if (ethereumNode.STATES.CONNECTED === newState) { - ethereumNode.removeListener('state', onStateChange); - - log.debug(`Ethereum node connected, resume connecting socket ${ownerId}`); - - resolve(); - } - }; - - ethereumNode.on('state', onStateChange); - }); - } - }) - .then(() => { - return socket.connect(Settings.rpcConnectConfig, { - timeout: 5000, - }); - }) - .then(() => { - log.debug(`Socket connected, id=${ownerId}`); - }) - .finally(() => { - delete this._connectionPromise[ownerId]; - }); - } - return this._connectionPromise[ownerId]; - } - }) - .then(() => { if (!owner.isDestroyed()) { - owner.send('ipcProvider-setWritable', true); + owner.send('ipcProvider-data', JSON.stringify(data)); } - - return this._connections[ownerId]; - }); - } - - - /** - * Handle IPC call to destroy a connection. - */ - _destroyConnection(event) { - const ownerId = event.sender.id; - - if (this._connections[ownerId]) { - log.debug('Destroy socket connection', ownerId); - - this._connections[ownerId].owner.send('ipcProvider-setWritable', false); - - this._connections[ownerId].socket.destroy(); - delete this._connections[ownerId]; - Sockets.remove(ownerId); + }); } - } - + }) + .then(() => { + if (!socket.isConnected) { + // since we may enter this function multiple times for the same + // event source's IPC we don't want to repeat the connection + // process each time - so let's track things in a promise + if (!this._connectionPromise[ownerId]) { + this._connectionPromise[ownerId] = Q.try(() => { + log.debug(`Connecting socket ${ownerId}`); + + // wait for node to connect first. + if (ethereumNode.state !== ethereumNode.STATES.CONNECTED) { + return new Q((resolve, reject) => { + const onStateChange = newState => { + if (ethereumNode.STATES.CONNECTED === newState) { + ethereumNode.removeListener('state', onStateChange); + + log.debug( + `Ethereum node connected, resume connecting socket ${ownerId}` + ); + + resolve(); + } + }; - /** - * Handler for when Ethereum node state changes. - * - * Auto-reconnect sockets when ethereum node state changes - * - * @param {String} state The new state. - */ - _onNodeStateChanged(state) { - switch (state) { // eslint-disable-line default-case - // stop syncing when node about to be stopped - case ethereumNode.STATES.STOPPING: - log.info('Ethereum node stopping, disconnecting sockets'); - - Q.all(_.map(this._connections, (item) => { - if (item.socket.isConnected) { - return item.socket.disconnect() - .then(() => { - log.debug(`Tell owner ${item.id} that socket is not currently writeable`); - - item.owner.send('ipcProvider-setWritable', false); - }); - } - return Q.resolve(); - })) - .catch((err) => { - log.error('Error disconnecting sockets', err); + ethereumNode.on('state', onStateChange); }); - - break; + } + }) + .then(() => { + return socket.connect(Settings.rpcConnectConfig, { + timeout: 5000 + }); + }) + .then(() => { + log.debug(`Socket connected, id=${ownerId}`); + }) + .finally(() => { + delete this._connectionPromise[ownerId]; + }); + } + + return this._connectionPromise[ownerId]; + } + }) + .then(() => { + if (!owner.isDestroyed()) { + owner.send('ipcProvider-setWritable', true); } - } - - /** - * Handle IPC call to send a request. - * @param {Boolean} isSync whether request is sync. - * @param {Object} event IPC event. - * @param {String} payload request payload. - */ - _sendRequest(isSync, event, payload) { - const ownerId = event.sender.id; - log.trace('sendRequest', isSync ? 'sync' : 'async', ownerId, payload); + return this._connections[ownerId]; + }); + } - const originalPayloadStr = payload; + /** + * Handle IPC call to destroy a connection. + */ + _destroyConnection(event) { + const ownerId = event.sender.id; - return Q.try(() => { - // overwrite playload var with parsed version - payload = JSON.parse(originalPayloadStr); + if (this._connections[ownerId]) { + log.debug('Destroy socket connection', ownerId); - return this._getOrCreateConnection(event); - }) - .then((conn) => { - if (!conn.socket.isConnected) { - log.trace('Socket not connected.'); + this._connections[ownerId].owner.send('ipcProvider-setWritable', false); - throw this.ERRORS.METHOD_TIMEOUT; + this._connections[ownerId].socket.destroy(); + delete this._connections[ownerId]; + Sockets.remove(ownerId); + } + } + + /** + * Handler for when Ethereum node state changes. + * + * Auto-reconnect sockets when ethereum node state changes + * + * @param {String} state The new state. + */ + _onNodeStateChanged(state) { + switch (state) { // eslint-disable-line default-case + // stop syncing when node about to be stopped + case ethereumNode.STATES.STOPPING: + log.info('Ethereum node stopping, disconnecting sockets'); + + Q.all( + _.map(this._connections, item => { + if (item.socket.isConnected) { + return item.socket.disconnect().then(() => { + log.debug( + `Tell owner ${item.id} that socket is not currently writeable` + ); + + item.owner.send('ipcProvider-setWritable', false); + }); } + return Q.resolve(); + }) + ).catch(err => { + log.error('Error disconnecting sockets', err); + }); - // reparse original string (so that we don't modify input payload) - const finalPayload = JSON.parse(originalPayloadStr); + break; + } + } - // is batch? - const isBatch = _.isArray(finalPayload), - finalPayloadList = isBatch ? finalPayload : [finalPayload]; + /** + * Handle IPC call to send a request. + * @param {Boolean} isSync whether request is sync. + * @param {Object} event IPC event. + * @param {String} payload request payload. + */ + _sendRequest(isSync, event, payload) { + const ownerId = event.sender.id; - // sanitize each and every request payload - _.each(finalPayloadList, (p) => { - const processor = (this._processors[p.method]) - ? this._processors[p.method] - : this._processors.base; + log.trace('sendRequest', isSync ? 'sync' : 'async', ownerId, payload); - processor.sanitizeRequestPayload(conn, p, isBatch); - }); + const originalPayloadStr = payload; - // if a single payload and has an error then throw it - if (!isBatch && finalPayload.error) { - throw finalPayload.error; - } + return Q.try(() => { + // overwrite playload var with parsed version + payload = JSON.parse(originalPayloadStr); - // get non-error payloads - const nonErrorPayloads = _.filter(finalPayloadList, p => (!p.error)); - - // execute non-error payloads - return Q.try(() => { - if (nonErrorPayloads.length) { - // if single payload check if we have special processor for it - // if not then use base generic processor - const processor = (this._processors[finalPayload.method]) - ? this._processors[finalPayload.method] - : this._processors.base; - - return processor.exec( - conn, - isBatch ? nonErrorPayloads : nonErrorPayloads[0] - ); - } else { - return []; - } - }) - .then((ret) => { - log.trace('Got result', ret); + return this._getOrCreateConnection(event); + }) + .then(conn => { + if (!conn.socket.isConnected) { + log.trace('Socket not connected.'); - let finalResult = []; + throw this.ERRORS.METHOD_TIMEOUT; + } - // collate results - _.each(finalPayloadList, (p) => { - if (p.error) { - finalResult.push(p); - } else { - p = _.extend({}, p, isBatch ? ret.shift() : ret); + // reparse original string (so that we don't modify input payload) + const finalPayload = JSON.parse(originalPayloadStr); - const processor = (this._processors[p.method]) - ? this._processors[p.method] - : this._processors.base; + // is batch? + const isBatch = _.isArray(finalPayload), + finalPayloadList = isBatch ? finalPayload : [finalPayload]; - // sanitize response payload - processor.sanitizeResponsePayload(conn, p, isBatch); + // sanitize each and every request payload + _.each(finalPayloadList, p => { + const processor = this._processors[p.method] + ? this._processors[p.method] + : this._processors.base; - finalResult.push(p); - } - }); - - // extract single payload result - if (!isBatch) { - finalResult = finalResult.pop(); + processor.sanitizeRequestPayload(conn, p, isBatch); + }); - // check if it's an error - if (finalResult.error) { - throw finalResult.error; - } - } + // if a single payload and has an error then throw it + if (!isBatch && finalPayload.error) { + throw finalPayload.error; + } - return finalResult; - }); - }) - .then((result) => { - log.trace('Got result', result); + // get non-error payloads + const nonErrorPayloads = _.filter(finalPayloadList, p => !p.error); - return this._makeResponsePayload(payload, result); - }) - .catch((err) => { + // execute non-error payloads + return Q.try(() => { + if (nonErrorPayloads.length) { + // if single payload check if we have special processor for it + // if not then use base generic processor + const processor = this._processors[finalPayload.method] + ? this._processors[finalPayload.method] + : this._processors.base; + + return processor.exec( + conn, + isBatch ? nonErrorPayloads : nonErrorPayloads[0] + ); + } else { + return []; + } + }).then(ret => { + log.trace('Got result', ret); + + let finalResult = []; + + // collate results + _.each(finalPayloadList, p => { + if (p.error) { + finalResult.push(p); + } else { + p = _.extend({}, p, isBatch ? ret.shift() : ret); - log.error('Send request failed', err); + const processor = this._processors[p.method] + ? this._processors[p.method] + : this._processors.base; - err = this._makeErrorResponsePayload(payload || {}, { - message: (typeof err === 'string' ? err : err.message), - code: err.code, - }); + // sanitize response payload + processor.sanitizeResponsePayload(conn, p, isBatch); - return err; - }) - .then((returnValue) => { - returnValue = JSON.stringify(returnValue); + finalResult.push(p); + } + }); - log.trace('Return', ownerId, returnValue); + // extract single payload result + if (!isBatch) { + finalResult = finalResult.pop(); - if (isSync) { - event.returnValue = returnValue; - } else if (!event.sender.isDestroyed()) { - event.sender.send('ipcProvider-data', returnValue); + // check if it's an error + if (finalResult.error) { + throw finalResult.error; } + } + + return finalResult; }); - } + }) + .then(result => { + log.trace('Got result', result); + + return this._makeResponsePayload(payload, result); + }) + .catch(err => { + log.error('Send request failed', err); + + err = this._makeErrorResponsePayload(payload || {}, { + message: typeof err === 'string' ? err : err.message, + code: err.code + }); + + return err; + }) + .then(returnValue => { + returnValue = JSON.stringify(returnValue); + log.trace('Return', ownerId, returnValue); - /** + if (isSync) { + event.returnValue = returnValue; + } else if (!event.sender.isDestroyed()) { + event.sender.send('ipcProvider-data', returnValue); + } + }); + } + + /** Sanitize a single or batch request payload. This will modify the passed-in payload. @@ -373,61 +386,62 @@ class IpcProviderBackend { @param {Object} conn The connection. @param {Object|Array} payload The request payload. */ - _sanitizeRequestPayload(conn, payload) { - if (_.isArray(payload)) { - _.each(payload, (p) => { - if (p.method === 'eth_sendTransaction') { - p.error = ERRORS.BATCH_TX_DENIED; - } else { - this._processors.base.sanitizePayload(conn, p); - } - }); + _sanitizeRequestPayload(conn, payload) { + if (_.isArray(payload)) { + _.each(payload, p => { + if (p.method === 'eth_sendTransaction') { + p.error = ERRORS.BATCH_TX_DENIED; } else { - this._processors.base.sanitizePayload(conn, payload); + this._processors.base.sanitizePayload(conn, p); } + }); + } else { + this._processors.base.sanitizePayload(conn, payload); } + } - - /** + /** Make an error response payload @param {Object|Array} originalPayload Original payload @param {Object} error Error result */ - _makeErrorResponsePayload(originalPayload, error) { - const e = ([].concat(originalPayload)).map((item) => { - const e = _.extend({ - jsonrpc: '2.0', - }, error); - - if (e.message) { - if (_.isArray(e.message)) { - e.message = e.message.pop(); - } + _makeErrorResponsePayload(originalPayload, error) { + const e = [].concat(originalPayload).map(item => { + const e = _.extend( + { + jsonrpc: '2.0' + }, + error + ); + + if (e.message) { + if (_.isArray(e.message)) { + e.message = e.message.pop(); + } - e.error = { - code: e.code, - message: e.message.replace(/'[a-z_]*'/i, `'${item.method}'`), - }; + e.error = { + code: e.code, + message: e.message.replace(/'[a-z_]*'/i, `'${item.method}'`) + }; - delete e.code; - delete e.message; - } + delete e.code; + delete e.message; + } - // delete stuff leftover from request - delete e.params; - delete e.method; + // delete stuff leftover from request + delete e.params; + delete e.method; - e.id = item.id; + e.id = item.id; - return e; - }); - - return _.isArray(originalPayload) ? e : e[0]; - } + return e; + }); + return _.isArray(originalPayload) ? e : e[0]; + } - /** + /** Make a response payload. @param {Object|Array} originalPayload Original payload @@ -435,39 +449,37 @@ class IpcProviderBackend { @method makeReturnValue */ - _makeResponsePayload(originalPayload, value) { - const finalValue = _.isArray(originalPayload) ? value : [value]; - - const allResults = ([].concat(originalPayload)).map((item, idx) => { - const finalResult = finalValue[idx]; + _makeResponsePayload(originalPayload, value) { + const finalValue = _.isArray(originalPayload) ? value : [value]; - let ret; + const allResults = [].concat(originalPayload).map((item, idx) => { + const finalResult = finalValue[idx]; - // handle error result - if (finalResult.error) { - ret = this._makeErrorResponsePayload(item, finalResult.error); - } else { - ret = _.extend({}, item, { - result: finalResult.result, - }); - } + let ret; - if (item.id) { - delete ret.params; - delete ret.method; - } + // handle error result + if (finalResult.error) { + ret = this._makeErrorResponsePayload(item, finalResult.error); + } else { + ret = _.extend({}, item, { + result: finalResult.result + }); + } - ret.jsonrpc = '2.0'; + if (item.id) { + delete ret.params; + delete ret.method; + } - return ret; - }); + ret.jsonrpc = '2.0'; - return _.isArray(originalPayload) ? allResults : allResults[0]; - } + return ret; + }); + return _.isArray(originalPayload) ? allResults : allResults[0]; + } } - exports.init = () => { - return new IpcProviderBackend(); + return new IpcProviderBackend(); }; diff --git a/modules/ipc/ipcProviderWrapper.js b/modules/ipc/ipcProviderWrapper.js index bb71b87ed..1deb7b9aa 100644 --- a/modules/ipc/ipcProviderWrapper.js +++ b/modules/ipc/ipcProviderWrapper.js @@ -11,23 +11,21 @@ The IPC provider wrapper to communicate to the backend const { ipcRenderer } = require('electron'); - /** Gets the writable property. @method on('ipcProvider-setWritable') */ ipcRenderer.on('ipcProvider-setWritable', (e, writable) => { - // console.debug('ipcProvider-setWritable', writable); + // console.debug('ipcProvider-setWritable', writable); - ipcProviderWrapper.writable = writable; + ipcProviderWrapper.writable = writable; }); - const ipcProviderWrapper = { - writable: false, + writable: false, - /** + /** Connects the IPC on the backend to the geth node Note: web3.isConnected will always return true, as otherwise race conditions can occour, @@ -35,91 +33,89 @@ const ipcProviderWrapper = { @method connect */ - connect(path) { - // console.debug('ipcProviderWrapper: connect'); + connect(path) { + // console.debug('ipcProviderWrapper: connect'); - ipcRenderer.send('ipcProvider-create', path); + ipcRenderer.send('ipcProvider-create', path); - return this; - }, - /** + return this; + }, + /** Returns data from the IPC through the backend @method on @param {String} name `connect`, `error`, `end`, `timeout` or `data` @param {Funciton} callback */ - on(name, callback) { - // console.debug('ipcProviderWrapper: add listener', name); - - ipcRenderer.on(`ipcProvider-${name}`, (e, result) => { - callback(result); - }); - }, - /** + on(name, callback) { + // console.debug('ipcProviderWrapper: add listener', name); + + ipcRenderer.on(`ipcProvider-${name}`, (e, result) => { + callback(result); + }); + }, + /** Returns data from the IPC through the backend @method once @param {String} name `connect`, `error`, `end`, `timeout` or `data` @param {Funciton} callback */ - once(name, callback) { - // console.debug('ipcProviderWrapper: add listener', name); - - ipcRenderer.once(`ipcProvider-${name}`, (e, result) => { - callback(result); - }); - }, - /** + once(name, callback) { + // console.debug('ipcProviderWrapper: add listener', name); + + ipcRenderer.once(`ipcProvider-${name}`, (e, result) => { + callback(result); + }); + }, + /** Removes listener @method removeListener */ - removeListener(name, callback) { - // console.debug('ipcProviderWrapper: remove listener', name); + removeListener(name, callback) { + // console.debug('ipcProviderWrapper: remove listener', name); - ipcRenderer.removeListener(`ipcProvider-${name}`, callback); - }, + ipcRenderer.removeListener(`ipcProvider-${name}`, callback); + }, - /** + /** Removes all listeners @method removeAllListeners */ - removeAllListeners(name) { - // console.debug('ipcProviderWrapper: remove all listeners', name); - - if (name) { - ipcRenderer.removeAllListeners(`ipcProvider-${name}`); - } else { - ipcRenderer.removeAllListeners('ipcProvider-error'); - ipcRenderer.removeAllListeners('ipcProvider-end'); - ipcRenderer.removeAllListeners('ipcProvider-timeout'); - ipcRenderer.removeAllListeners('ipcProvider-connect'); - } - }, - /** + removeAllListeners(name) { + // console.debug('ipcProviderWrapper: remove all listeners', name); + + if (name) { + ipcRenderer.removeAllListeners(`ipcProvider-${name}`); + } else { + ipcRenderer.removeAllListeners('ipcProvider-error'); + ipcRenderer.removeAllListeners('ipcProvider-end'); + ipcRenderer.removeAllListeners('ipcProvider-timeout'); + ipcRenderer.removeAllListeners('ipcProvider-connect'); + } + }, + /** Write to the IPC connection through the backend @method write */ - write(payload) { - // console.debug('ipcProviderWrapper: write payload'); + write(payload) { + // console.debug('ipcProviderWrapper: write payload'); - ipcRenderer.send('ipcProvider-write', payload); - }, - /** + ipcRenderer.send('ipcProvider-write', payload); + }, + /** Write synchronous to the IPC connection through the backend @method writeSync */ - writeSync(payload) { - // console.debug('ipcProviderWrapper: write payload (sync)'); - - return ipcRenderer.sendSync('ipcProvider-writeSync', payload); - }, + writeSync(payload) { + // console.debug('ipcProviderWrapper: write payload (sync)'); + return ipcRenderer.sendSync('ipcProvider-writeSync', payload); + } }; - module.exports = ipcProviderWrapper; diff --git a/modules/ipc/methods/base.js b/modules/ipc/methods/base.js index 57f1d3072..e4cdfc431 100644 --- a/modules/ipc/methods/base.js +++ b/modules/ipc/methods/base.js @@ -1,5 +1,3 @@ - - const _ = global._; const Q = require('bluebird'); @@ -7,47 +5,46 @@ const log = require('../../utils/logger').create('method'); const Windows = require('../../windows'); const db = require('../../db'); - /** * Process a request. * * This is the base class for all specialized request processors. */ module.exports = class BaseProcessor { - constructor(name, ipcProviderBackend) { - this._log = log.create(name); - this._ipcProviderBackend = ipcProviderBackend; - this.ERRORS = this._ipcProviderBackend.ERRORS; - } - - /** - * Execute given request. - * @param {Object} conn IPCProviderBackend connection data. - * @param {Object|Array} payload payload - * @return {Promise} - */ - async exec(conn, payload) { - this._log.trace('Execute request', payload); - - const ret = await conn.socket.send(payload, { - fullResult: true, - }); - - return ret.result; - } - - - _isAdminConnection(conn) { - // main window or popupwindows - always allow requests - const wnd = Windows.getById(conn.id); - const tab = db.getCollection('UI_tabs').findOne({ webviewId: conn.id }); - - return ((wnd && (wnd.type === 'main' || wnd.isPopup)) || - (tab && _.get(tab, 'permissions.admin') === true)); - } - - - /** + constructor(name, ipcProviderBackend) { + this._log = log.create(name); + this._ipcProviderBackend = ipcProviderBackend; + this.ERRORS = this._ipcProviderBackend.ERRORS; + } + + /** + * Execute given request. + * @param {Object} conn IPCProviderBackend connection data. + * @param {Object|Array} payload payload + * @return {Promise} + */ + async exec(conn, payload) { + this._log.trace('Execute request', payload); + + const ret = await conn.socket.send(payload, { + fullResult: true + }); + + return ret.result; + } + + _isAdminConnection(conn) { + // main window or popupwindows - always allow requests + const wnd = Windows.getById(conn.id); + const tab = db.getCollection('UI_tabs').findOne({ webviewId: conn.id }); + + return ( + (wnd && (wnd.type === 'main' || wnd.isPopup)) || + (tab && _.get(tab, 'permissions.admin') === true) + ); + } + + /** Sanitize a request payload. This may modify the input payload object. @@ -56,14 +53,13 @@ module.exports = class BaseProcessor { @param {Object} payload The request payload. @param {Boolean} isPartOfABatch Whether it's part of a batch payload. */ - sanitizeRequestPayload(conn, payload, isPartOfABatch) { - this._log.trace('Sanitize request payload', payload); - - this._sanitizeRequestResponsePayload(conn, payload, isPartOfABatch); - } + sanitizeRequestPayload(conn, payload, isPartOfABatch) { + this._log.trace('Sanitize request payload', payload); + this._sanitizeRequestResponsePayload(conn, payload, isPartOfABatch); + } - /** + /** Sanitize a response payload. This may modify the input payload object. @@ -72,14 +68,13 @@ module.exports = class BaseProcessor { @param {Object} payload The request payload. @param {Boolean} isPartOfABatch Whether it's part of a batch payload. */ - sanitizeResponsePayload(conn, payload, isPartOfABatch) { - this._log.trace('Sanitize response payload', payload); + sanitizeResponsePayload(conn, payload, isPartOfABatch) { + this._log.trace('Sanitize response payload', payload); - this._sanitizeRequestResponsePayload(conn, payload, isPartOfABatch); - } + this._sanitizeRequestResponsePayload(conn, payload, isPartOfABatch); + } - - /** + /** Sanitize a request or response payload. This may modify the input payload object. @@ -88,21 +83,21 @@ module.exports = class BaseProcessor { @param {Object} payload The request payload. @param {Boolean} isPartOfABatch Whether it's part of a batch payload. */ - _sanitizeRequestResponsePayload(conn, payload, isPartOfABatch) { - if (!_.isObject(payload)) { - throw this.ERRORS.INVALID_PAYLOAD; - } - - if (this._isAdminConnection(conn)) { - return; - } - - // prevent dapps from acccesing admin endpoints - if (!/^eth_|^bzz_|^shh_|^net_|^web3_|^db_/.test(payload.method)) { - delete payload.result; - const err = _.clone(this.ERRORS.METHOD_DENIED); - err.message = err.message.replace('__method__', `"${payload.method}"`); - payload.error = err; - } + _sanitizeRequestResponsePayload(conn, payload, isPartOfABatch) { + if (!_.isObject(payload)) { + throw this.ERRORS.INVALID_PAYLOAD; + } + + if (this._isAdminConnection(conn)) { + return; + } + + // prevent dapps from acccesing admin endpoints + if (!/^eth_|^bzz_|^shh_|^net_|^web3_|^db_/.test(payload.method)) { + delete payload.result; + const err = _.clone(this.ERRORS.METHOD_DENIED); + err.message = err.message.replace('__method__', `"${payload.method}"`); + payload.error = err; } + } }; diff --git a/modules/ipc/methods/eth_accounts.js b/modules/ipc/methods/eth_accounts.js index a7dc10a7f..a1405af4a 100644 --- a/modules/ipc/methods/eth_accounts.js +++ b/modules/ipc/methods/eth_accounts.js @@ -1,5 +1,3 @@ - - const _ = global._; const BaseProcessor = require('./base'); const db = require('../../db'); @@ -8,24 +6,26 @@ const db = require('../../db'); * Process method: eth_accounts */ module.exports = class extends BaseProcessor { - /** - * @override - */ - sanitizeResponsePayload(conn, payload, isPartOfABatch) { - this._log.trace('Sanitize eth_acconts', payload.result); - - // if not an admin connection then do a check - if (!this._isAdminConnection(conn)) { - const tab = db.getCollection('UI_tabs').findOne({ webviewId: conn.id }); + /** + * @override + */ + sanitizeResponsePayload(conn, payload, isPartOfABatch) { + this._log.trace('Sanitize eth_acconts', payload.result); - if (_.get(tab, 'permissions.accounts')) { - payload.result = _.intersection(payload.result, tab.permissions.accounts); - } else { - payload.result = []; - } - } + // if not an admin connection then do a check + if (!this._isAdminConnection(conn)) { + const tab = db.getCollection('UI_tabs').findOne({ webviewId: conn.id }); - return super.sanitizeResponsePayload(conn, payload, isPartOfABatch); + if (_.get(tab, 'permissions.accounts')) { + payload.result = _.intersection( + payload.result, + tab.permissions.accounts + ); + } else { + payload.result = []; + } } -}; + return super.sanitizeResponsePayload(conn, payload, isPartOfABatch); + } +}; diff --git a/modules/ipc/methods/eth_coinbase.js b/modules/ipc/methods/eth_coinbase.js index 710ab5e45..a4508fb77 100644 --- a/modules/ipc/methods/eth_coinbase.js +++ b/modules/ipc/methods/eth_coinbase.js @@ -6,22 +6,24 @@ const db = require('../../db'); * Process method: eth_coinbase */ module.exports = class extends BaseProcessor { - /** - * @override - */ - sanitizeResponsePayload(conn, payload, isPartOfABatch) { - this._log.trace('Sanitize account eth_coinbase', payload.result); + /** + * @override + */ + sanitizeResponsePayload(conn, payload, isPartOfABatch) { + this._log.trace('Sanitize account eth_coinbase', payload.result); - // if not an admin connection then do a check - if (!this._isAdminConnection(conn)) { - const tab = db.getCollection('UI_tabs').findOne({ webviewId: conn.id }); + // if not an admin connection then do a check + if (!this._isAdminConnection(conn)) { + const tab = db.getCollection('UI_tabs').findOne({ webviewId: conn.id }); - if (_.get(tab, 'permissions.accounts')) { - payload.result = _.contains(tab.permissions.accounts, payload.result) ? payload.result : null; - } else { - payload.result = null; - } - } - return super.sanitizeResponsePayload(conn, payload, isPartOfABatch); + if (_.get(tab, 'permissions.accounts')) { + payload.result = _.contains(tab.permissions.accounts, payload.result) + ? payload.result + : null; + } else { + payload.result = null; + } } + return super.sanitizeResponsePayload(conn, payload, isPartOfABatch); + } }; diff --git a/modules/ipc/methods/eth_compileSolidity.js b/modules/ipc/methods/eth_compileSolidity.js index b34a63bd5..f4a59a3d9 100644 --- a/modules/ipc/methods/eth_compileSolidity.js +++ b/modules/ipc/methods/eth_compileSolidity.js @@ -1,54 +1,50 @@ - - const _ = global._; const solc = require('solc'); const Q = require('bluebird'); const BaseProcessor = require('./base'); - /** * Process method: eth_compileSolidity */ module.exports = class extends BaseProcessor { - /** - * @override - */ - exec(conn, payload) { - return Q.try(() => { - this._log.debug('Compile solidity'); - - const output = solc.compile(payload.params[0], 1); // 1 activates the optimiser - - const finalResult = _.extend({}, payload); - - if (!output || output.errors) { - let msg = (output ? output.errors : 'Compile error'); - - if (_.isArray(msg)) { - msg = msg.join(', '); - } - - finalResult.error = { - code: -32700, - message: msg, - }; - } else { - finalResult.result = output.contracts; - } - - return finalResult; - }); - } + /** + * @override + */ + exec(conn, payload) { + return Q.try(() => { + this._log.debug('Compile solidity'); + + const output = solc.compile(payload.params[0], 1); // 1 activates the optimiser - /** - * @override - */ - sanitizeRequestPayload(conn, payload, isPartOfABatch) { - if (isPartOfABatch) { - throw this.ERRORS.BATCH_COMPILE_DENIED; + const finalResult = _.extend({}, payload); + + if (!output || output.errors) { + let msg = output ? output.errors : 'Compile error'; + + if (_.isArray(msg)) { + msg = msg.join(', '); } - return super.sanitizeRequestPayload(conn, payload, isPartOfABatch); + finalResult.error = { + code: -32700, + message: msg + }; + } else { + finalResult.result = output.contracts; + } + + return finalResult; + }); + } + + /** + * @override + */ + sanitizeRequestPayload(conn, payload, isPartOfABatch) { + if (isPartOfABatch) { + throw this.ERRORS.BATCH_COMPILE_DENIED; } -}; + return super.sanitizeRequestPayload(conn, payload, isPartOfABatch); + } +}; diff --git a/modules/ipc/methods/eth_getTransactionReceipt.js b/modules/ipc/methods/eth_getTransactionReceipt.js index 0eae6f2cd..e4e5444aa 100644 --- a/modules/ipc/methods/eth_getTransactionReceipt.js +++ b/modules/ipc/methods/eth_getTransactionReceipt.js @@ -9,56 +9,62 @@ const eth = require('ethereumjs-util'); */ module.exports = class extends BaseProcessor { + sanitizeRequestPayload(conn, payload, isPartOfABatch) { + return super.sanitizeRequestPayload(conn, payload, isPartOfABatch); + } - sanitizeRequestPayload(conn, payload, isPartOfABatch) { - return super.sanitizeRequestPayload(conn, payload, isPartOfABatch); - } - - async exec(conn, payload) { - const txHash = payload.params[0]; - - // Sends regular eth_getTransactionReceipt request - const ret = await conn.socket.send(payload, { - fullResult: true - }); + async exec(conn, payload) { + const txHash = payload.params[0]; - try { - // If that contains a contractAddress already, fine. - if (ret.result.result && ret.result.result.contractAddress != null) { - return ret.result; - } + // Sends regular eth_getTransactionReceipt request + const ret = await conn.socket.send(payload, { + fullResult: true + }); - // 1. GET TRANSACTION from AND nonce VALUES - const transactionInfo = await conn.socket.send({ - jsonrpc: '2.0', - id: _.uuid(), - method: 'eth_getTransactionByHash', - params: [txHash] - }, { fullResult: true }); + try { + // If that contains a contractAddress already, fine. + if (ret.result.result && ret.result.result.contractAddress != null) { + return ret.result; + } - const fromAddress = transactionInfo.result.result.from; - const nonce = parseInt(transactionInfo.result.result.nonce, 16); - const possibleContractAddress = `0x${eth.generateAddress(fromAddress, nonce).toString('hex')}`; + // 1. GET TRANSACTION from AND nonce VALUES + const transactionInfo = await conn.socket.send( + { + jsonrpc: '2.0', + id: _.uuid(), + method: 'eth_getTransactionByHash', + params: [txHash] + }, + { fullResult: true } + ); + const fromAddress = transactionInfo.result.result.from; + const nonce = parseInt(transactionInfo.result.result.nonce, 16); + const possibleContractAddress = `0x${eth + .generateAddress(fromAddress, nonce) + .toString('hex')}`; - // 2. GET CODE FROM ADDRESS - const contractCode = await conn.socket.send({ - jsonrpc: '2.0', - id: _.uuid(), - method: 'eth_getCode', - params: [possibleContractAddress, 'latest'] - }, { fullResult: true }); + // 2. GET CODE FROM ADDRESS + const contractCode = await conn.socket.send( + { + jsonrpc: '2.0', + id: _.uuid(), + method: 'eth_getCode', + params: [possibleContractAddress, 'latest'] + }, + { fullResult: true } + ); - const contractCodeResult = contractCode.result.result; + const contractCodeResult = contractCode.result.result; - // 3. IF IT EXISTS, ASSIGN TO RETURN VALUE - if (contractCodeResult && contractCodeResult.length > 2) { - ret.result.result.contractAddress = possibleContractAddress; - } - } catch (e) { - console.warn('[WARN]', txHash, e); - return ret.result; - } - return ret.result; + // 3. IF IT EXISTS, ASSIGN TO RETURN VALUE + if (contractCodeResult && contractCodeResult.length > 2) { + ret.result.result.contractAddress = possibleContractAddress; + } + } catch (e) { + console.warn('[WARN]', txHash, e); + return ret.result; } + return ret.result; + } }; diff --git a/modules/ipc/methods/eth_sendTransaction.js b/modules/ipc/methods/eth_sendTransaction.js index da6c7acf1..f3030981e 100644 --- a/modules/ipc/methods/eth_sendTransaction.js +++ b/modules/ipc/methods/eth_sendTransaction.js @@ -1,5 +1,3 @@ - - const BaseProcessor = require('./base'); const Windows = require('../../windows'); const Q = require('bluebird'); @@ -10,85 +8,88 @@ const BlurOverlay = require('../../blurOverlay'); * Process method: eth_sendTransaction */ module.exports = class extends BaseProcessor { - - /** - * @override - */ - sanitizeRequestPayload(conn, payload, isPartOfABatch) { - if (isPartOfABatch) { - throw this.ERRORS.BATCH_TX_DENIED; - } - - return super.sanitizeRequestPayload(conn, payload, isPartOfABatch); + /** + * @override + */ + sanitizeRequestPayload(conn, payload, isPartOfABatch) { + if (isPartOfABatch) { + throw this.ERRORS.BATCH_TX_DENIED; } - - /** - * @override - */ - exec(conn, payload) { - return new Q((resolve, reject) => { - this._log.info('Ask user for password'); - - this._log.info(payload.params[0]); - - // validate data - try { - _.each(payload.params[0], (val, key) => { - // if doesn't have hex then leave - if (!_.isString(val)) { - throw this.ERRORS.INVALID_PAYLOAD; - } else { - // make sure all data is lowercase and has 0x - if (val) val = `0x${val.toLowerCase().replace(/^0x/, '')}`; - - if (val.substr(2).match(/[^0-9a-f]/igm)) { - throw this.ERRORS.INVALID_PAYLOAD; - } - } - - payload.params[0][key] = val; - }); - } catch (err) { - return reject(err); + return super.sanitizeRequestPayload(conn, payload, isPartOfABatch); + } + + /** + * @override + */ + exec(conn, payload) { + return new Q((resolve, reject) => { + this._log.info('Ask user for password'); + + this._log.info(payload.params[0]); + + // validate data + try { + _.each(payload.params[0], (val, key) => { + // if doesn't have hex then leave + if (!_.isString(val)) { + throw this.ERRORS.INVALID_PAYLOAD; + } else { + // make sure all data is lowercase and has 0x + if (val) val = `0x${val.toLowerCase().replace(/^0x/, '')}`; + + if (val.substr(2).match(/[^0-9a-f]/gim)) { + throw this.ERRORS.INVALID_PAYLOAD; } + } - const modalWindow = Windows.createPopup('sendTransactionConfirmation', { - sendData: { uiAction_sendData: payload.params[0] } - }); - - BlurOverlay.enable(); - - modalWindow.on('hidden', () => { - BlurOverlay.disable(); + payload.params[0][key] = val; + }); + } catch (err) { + return reject(err); + } - // user cancelled? - if (!modalWindow.processed) { - reject(this.ERRORS.METHOD_DENIED); - } - }); + const modalWindow = Windows.createPopup('sendTransactionConfirmation', { + sendData: { uiAction_sendData: payload.params[0] } + }); - ipc.once('backendAction_unlockedAccountAndSentTransaction', (ev, err, result) => { - if (Windows.getById(ev.sender.id) === modalWindow && !modalWindow.isClosed) { - if (err || !result) { - this._log.debug('Confirmation error', err); + BlurOverlay.enable(); - reject(err || this.ERRORS.METHOD_DENIED); - } else { - this._log.info('Transaction sent', result); + modalWindow.on('hidden', () => { + BlurOverlay.disable(); - resolve(result); - } + // user cancelled? + if (!modalWindow.processed) { + reject(this.ERRORS.METHOD_DENIED); + } + }); + + ipc.once( + 'backendAction_unlockedAccountAndSentTransaction', + (ev, err, result) => { + if ( + Windows.getById(ev.sender.id) === modalWindow && + !modalWindow.isClosed + ) { + if (err || !result) { + this._log.debug('Confirmation error', err); + + reject(err || this.ERRORS.METHOD_DENIED); + } else { + this._log.info('Transaction sent', result); + + resolve(result); + } - modalWindow.processed = true; - modalWindow.close(); - } - }); - }) - .then((result) => { - return _.extend({}, payload, { - result, - }); - }); - } + modalWindow.processed = true; + modalWindow.close(); + } + } + ); + }).then(result => { + return _.extend({}, payload, { + result + }); + }); + } }; diff --git a/modules/ipcCommunicator.js b/modules/ipcCommunicator.js index a09c03fde..fc3ef8f59 100644 --- a/modules/ipcCommunicator.js +++ b/modules/ipcCommunicator.js @@ -39,226 +39,252 @@ windows = { // UI ACTIONS ipc.on('backendAction_closeApp', () => { - app.quit(); + app.quit(); }); ipc.on('backendAction_openExternalUrl', (e, url) => { - shell.openExternal(url); + shell.openExternal(url); }); -ipc.on('backendAction_closePopupWindow', (e) => { - const windowId = e.sender.id; - const senderWindow = Windows.getById(windowId); +ipc.on('backendAction_closePopupWindow', e => { + const windowId = e.sender.id; + const senderWindow = Windows.getById(windowId); - if (senderWindow) { - senderWindow.close(); - } + if (senderWindow) { + senderWindow.close(); + } }); ipc.on('backendAction_setWindowSize', (e, width, height) => { - const windowId = e.sender.id; - const senderWindow = Windows.getById(windowId); + const windowId = e.sender.id; + const senderWindow = Windows.getById(windowId); - if (senderWindow) { - senderWindow.window.setSize(width, height); - senderWindow.window.center(); // ? - } + if (senderWindow) { + senderWindow.window.setSize(width, height); + senderWindow.window.center(); // ? + } }); ipc.on('backendAction_windowCallback', (e, value1, value2, value3) => { - const windowId = e.sender.id; - const senderWindow = Windows.getById(windowId); + const windowId = e.sender.id; + const senderWindow = Windows.getById(windowId); - if (senderWindow.callback) { - senderWindow.callback(value1, value2, value3); - } + if (senderWindow.callback) { + senderWindow.callback(value1, value2, value3); + } }); ipc.on('backendAction_windowMessageToOwner', (e, error, value) => { - const windowId = e.sender.id; - const senderWindow = Windows.getById(windowId); - - // If msg is from a generic window, use the "actingType" instead of type - const senderWindowType = senderWindow.actingType || senderWindow.type; - - if (senderWindow.ownerId) { - const ownerWindow = Windows.getById(senderWindow.ownerId); - const mainWindow = Windows.getByType('main'); - - if (ownerWindow) { - ownerWindow.send('uiAction_windowMessage', senderWindowType, error, value); - } + const windowId = e.sender.id; + const senderWindow = Windows.getById(windowId); + + // If msg is from a generic window, use the "actingType" instead of type + const senderWindowType = senderWindow.actingType || senderWindow.type; + + if (senderWindow.ownerId) { + const ownerWindow = Windows.getById(senderWindow.ownerId); + const mainWindow = Windows.getByType('main'); + + if (ownerWindow) { + ownerWindow.send( + 'uiAction_windowMessage', + senderWindowType, + error, + value + ); + } - // send through the mainWindow to the webviews - if (mainWindow) { - mainWindow.send('uiAction_windowMessage', senderWindowType, senderWindow.ownerId, error, value); - } + // send through the mainWindow to the webviews + if (mainWindow) { + mainWindow.send( + 'uiAction_windowMessage', + senderWindowType, + senderWindow.ownerId, + error, + value + ); } + } }); -ipc.on('backendAction_getLanguage', (e) => { store.dispatch(getLanguage(e)); }); +ipc.on('backendAction_getLanguage', e => { + store.dispatch(getLanguage(e)); +}); ipc.on('backendAction_stopWebviewNavigation', (e, id) => { - console.log('webcontent ID', id); - const webContent = webContents.fromId(id); + console.log('webcontent ID', id); + const webContent = webContents.fromId(id); - if (webContent && !webContent.isDestroyed()) { - webContent.stop(); - } + if (webContent && !webContent.isDestroyed()) { + webContent.stop(); + } - e.returnValue = true; + e.returnValue = true; }); // check wallet file ipc.on('backendAction_checkWalletFile', (e, path) => { - fs.readFile(path, 'utf8', (event, data) => { - try { - const keyfile = JSON.parse(data); - const result = keyfileRecognizer(keyfile); - /** result - * [ 'ethersale', undefined ] Ethersale keyfile - * [ 'web3', 3 ] web3 (v3) keyfile - * null no valid keyfile - */ - - const type = _.first(result); - - log.debug(`Importing ${type} account...`); - - if (type === 'ethersale') { - e.sender.send('uiAction_checkedWalletFile', null, 'presale'); - } else if (type === 'web3') { - e.sender.send('uiAction_checkedWalletFile', null, 'web3'); - - let keystorePath = Settings.userHomePath; - // eth - if (ethereumNode.isEth) { - if (process.platform === 'win32') { - keystorePath = `${Settings.appDataPath}\\Web3\\keys`; - } else { - keystorePath += '/.web3/keys'; - } - // geth - } else { - if (process.platform === 'darwin') keystorePath += '/Library/Ethereum/keystore'; - - if (process.platform === 'freebsd' || - process.platform === 'linux' || - process.platform === 'sunos') keystorePath += '/.ethereum/keystore'; - - if (process.platform === 'win32') keystorePath = `${Settings.appDataPath}\\Ethereum\\keystore`; - } - - if (!/^[0-9a-fA-F]{40}$/.test(keyfile.address)) { - throw new Error('Invalid Address format.'); - } - - fs.writeFile(`${keystorePath}/0x${keyfile.address}`, data, (err) => { - if (err) throw new Error("Can't write file to disk"); - }); - } else { - throw new Error('Account import: Cannot recognize keyfile (invalid)'); - } - } catch (err) { - e.sender.send('uiAction_checkedWalletFile', null, 'invalid'); - if (/Unexpected token . in JSON at position 0/.test(err.message) === true) { - log.error('Account import: Cannot recognize keyfile (no JSON)'); - } else { - log.error(err); - } + fs.readFile(path, 'utf8', (event, data) => { + try { + const keyfile = JSON.parse(data); + const result = keyfileRecognizer(keyfile); + /** result + * [ 'ethersale', undefined ] Ethersale keyfile + * [ 'web3', 3 ] web3 (v3) keyfile + * null no valid keyfile + */ + + const type = _.first(result); + + log.debug(`Importing ${type} account...`); + + if (type === 'ethersale') { + e.sender.send('uiAction_checkedWalletFile', null, 'presale'); + } else if (type === 'web3') { + e.sender.send('uiAction_checkedWalletFile', null, 'web3'); + + let keystorePath = Settings.userHomePath; + // eth + if (ethereumNode.isEth) { + if (process.platform === 'win32') { + keystorePath = `${Settings.appDataPath}\\Web3\\keys`; + } else { + keystorePath += '/.web3/keys'; + } + // geth + } else { + if (process.platform === 'darwin') + keystorePath += '/Library/Ethereum/keystore'; + + if ( + process.platform === 'freebsd' || + process.platform === 'linux' || + process.platform === 'sunos' + ) + keystorePath += '/.ethereum/keystore'; + + if (process.platform === 'win32') + keystorePath = `${Settings.appDataPath}\\Ethereum\\keystore`; } - }); -}); - -// import presale wallet -ipc.on('backendAction_importWalletFile', (e, path, pw) => { - const spawn = require('child_process').spawn; // eslint-disable-line global-require - const ClientBinaryManager = require('./clientBinaryManager'); // eslint-disable-line global-require - let error = false; - - const binPath = ClientBinaryManager.getClient('geth').binPath; - const nodeProcess = spawn(binPath, ['wallet', 'import', path]); - - nodeProcess.once('error', () => { - error = true; - e.sender.send('uiAction_importedWalletFile', 'Couldn\'t start the "geth wallet import " process.'); - }); - nodeProcess.stdout.on('data', (_data) => { - const data = _data.toString(); - if (data) { - log.info('Imported presale: ', data); + if (!/^[0-9a-fA-F]{40}$/.test(keyfile.address)) { + throw new Error('Invalid Address format.'); } - if (/Decryption failed|not equal to expected addr|could not decrypt/.test(data)) { - e.sender.send('uiAction_importedWalletFile', 'Decryption Failed'); + fs.writeFile(`${keystorePath}/0x${keyfile.address}`, data, err => { + if (err) throw new Error("Can't write file to disk"); + }); + } else { + throw new Error('Account import: Cannot recognize keyfile (invalid)'); + } + } catch (err) { + e.sender.send('uiAction_checkedWalletFile', null, 'invalid'); + if ( + /Unexpected token . in JSON at position 0/.test(err.message) === true + ) { + log.error('Account import: Cannot recognize keyfile (no JSON)'); + } else { + log.error(err); + } + } + }); +}); - // if imported, return the address - } else if (data.indexOf('Address:') !== -1) { - const find = data.match(/\{([a-f0-9]+)\}/i); - if (find.length && find[1]) { - e.sender.send('uiAction_importedWalletFile', null, `0x${find[1]}`); - } else { - e.sender.send('uiAction_importedWalletFile', data); - } +// import presale wallet +ipc.on('backendAction_importWalletFile', (e, path, pw) => { + const spawn = require('child_process').spawn; // eslint-disable-line global-require + const ClientBinaryManager = require('./clientBinaryManager'); // eslint-disable-line global-require + let error = false; + + const binPath = ClientBinaryManager.getClient('geth').binPath; + const nodeProcess = spawn(binPath, ['wallet', 'import', path]); + + nodeProcess.once('error', () => { + error = true; + e.sender.send( + 'uiAction_importedWalletFile', + 'Couldn\'t start the "geth wallet import " process.' + ); + }); + nodeProcess.stdout.on('data', _data => { + const data = _data.toString(); + if (data) { + log.info('Imported presale: ', data); + } - // if not stop, so we don't kill the process - } else { - return; - } + if ( + /Decryption failed|not equal to expected addr|could not decrypt/.test( + data + ) + ) { + e.sender.send('uiAction_importedWalletFile', 'Decryption Failed'); + + // if imported, return the address + } else if (data.indexOf('Address:') !== -1) { + const find = data.match(/\{([a-f0-9]+)\}/i); + if (find.length && find[1]) { + e.sender.send('uiAction_importedWalletFile', null, `0x${find[1]}`); + } else { + e.sender.send('uiAction_importedWalletFile', data); + } + + // if not stop, so we don't kill the process + } else { + return; + } - nodeProcess.stdout.removeAllListeners('data'); - nodeProcess.removeAllListeners('error'); - nodeProcess.kill('SIGINT'); - }); + nodeProcess.stdout.removeAllListeners('data'); + nodeProcess.removeAllListeners('error'); + nodeProcess.kill('SIGINT'); + }); - // file password - setTimeout(() => { - if (!error) { - nodeProcess.stdin.write(`${pw}\n`); - pw = null; // eslint-disable-line no-param-reassign - } - }, 2000); + // file password + setTimeout(() => { + if (!error) { + nodeProcess.stdin.write(`${pw}\n`); + pw = null; // eslint-disable-line no-param-reassign + } + }, 2000); }); - -const createAccountPopup = (e) => { - Windows.createPopup('requestAccount', { ownerId: e.sender.id }); +const createAccountPopup = e => { + Windows.createPopup('requestAccount', { ownerId: e.sender.id }); }; // MIST API ipc.on('mistAPI_createAccount', createAccountPopup); -ipc.on('mistAPI_requestAccount', (e) => { - if (global.mode === 'wallet') { - createAccountPopup(e); - } else { // Mist - // if coming from wallet, skip connect, go straight to create - if (e.sender.history[0] === 'https://wallet.ethereum.org/') { - createAccountPopup(e); - } else { - Windows.createPopup('connectAccount', { ownerId: e.sender.id }); - } +ipc.on('mistAPI_requestAccount', e => { + if (global.mode === 'wallet') { + createAccountPopup(e); + } else { + // Mist + // if coming from wallet, skip connect, go straight to create + if (e.sender.history[0] === 'https://wallet.ethereum.org/') { + createAccountPopup(e); + } else { + Windows.createPopup('connectAccount', { ownerId: e.sender.id }); } + } }); const uiLoggers = {}; ipc.on('console_log', (event, id, logLevel, logItemsStr) => { - try { - const loggerId = `(ui: ${id})`; + try { + const loggerId = `(ui: ${id})`; - let windowLogger = uiLoggers[loggerId]; + let windowLogger = uiLoggers[loggerId]; - if (!windowLogger) { - windowLogger = uiLoggers[loggerId] = logger.create(loggerId); - } - - windowLogger[logLevel](..._.toArray(JSON.parse(logItemsStr))); - } catch (err) { - log.error(err); + if (!windowLogger) { + windowLogger = uiLoggers[loggerId] = logger.create(loggerId); } + + windowLogger[logLevel](..._.toArray(JSON.parse(logItemsStr))); + } catch (err) { + log.error(err); + } }); -ipc.on('backendAction_reloadSelectedTab', (event) => { - event.sender.send('uiAction_reloadSelectedTab'); +ipc.on('backendAction_reloadSelectedTab', event => { + event.sender.send('uiAction_reloadSelectedTab'); }); diff --git a/modules/menuItems.js b/modules/menuItems.js index d82451222..2e0fbbfee 100644 --- a/modules/menuItems.js +++ b/modules/menuItems.js @@ -1,4 +1,11 @@ -const { app, BrowserWindow, ipcMain: ipc, Menu, shell, dialog } = require('electron'); +const { + app, + BrowserWindow, + ipcMain: ipc, + Menu, + shell, + dialog +} = require('electron'); const fs = require('fs'); const path = require('path'); const Windows = require('./windows'); @@ -9,642 +16,703 @@ const updateChecker = require('./updateChecker'); const ethereumNode = require('./ethereumNode.js'); const ClientBinaryManager = require('./clientBinaryManager'); -import { setLanguage, toggleSwarm, toggleSwarmOnStart } from './core/settings/actions'; +import { + setLanguage, + toggleSwarm, + toggleSwarmOnStart +} from './core/settings/actions'; import { SwarmState } from './core/settings/reducer'; import swarmNode from './swarmNode.js'; // Make easier to return values for specific systems -const switchForSystem = function (options) { - if (process.platform in options) { - return options[process.platform]; - } else if ('default' in options) { - return options.default; - } - return null; +const switchForSystem = function(options) { + if (process.platform in options) { + return options[process.platform]; + } else if ('default' in options) { + return options.default; + } + return null; }; - // create menu // null -> null -const createMenu = function (webviews) { - webviews = webviews || []; +const createMenu = function(webviews) { + webviews = webviews || []; - const menu = Menu.buildFromTemplate(menuTempl(webviews)); - Menu.setApplicationMenu(menu); + const menu = Menu.buildFromTemplate(menuTempl(webviews)); + Menu.setApplicationMenu(menu); }; +const restartNode = function(newType, newNetwork, syncMode, webviews) { + newNetwork = newNetwork || ethereumNode.network; -const restartNode = function (newType, newNetwork, syncMode, webviews) { - newNetwork = newNetwork || ethereumNode.network; + log.info('Switch node', newType, newNetwork); - log.info('Switch node', newType, newNetwork); + return ethereumNode + .restart(newType, newNetwork, syncMode) + .then(() => { + Windows.getByType('main').load(global.interfaceAppUrl); - return ethereumNode.restart(newType, newNetwork, syncMode) - .then(() => { - Windows.getByType('main').load(global.interfaceAppUrl); - - createMenu(webviews); - log.info('Node switch successful.'); - }) - .catch((err) => { - log.error('Error switching node', err); - }); + createMenu(webviews); + log.info('Node switch successful.'); + }) + .catch(err => { + log.error('Error switching node', err); + }); }; - -const startMining = (webviews) => { - ethereumNode.send('miner_start', [1]) - .then((ret) => { - log.info('miner_start', ret.result); - - if (ret.result) { - global.mining = true; - createMenu(webviews); - } - }) - .catch((err) => { - log.error('miner_start', err); - }); +const startMining = webviews => { + ethereumNode + .send('miner_start', [1]) + .then(ret => { + log.info('miner_start', ret.result); + + if (ret.result) { + global.mining = true; + createMenu(webviews); + } + }) + .catch(err => { + log.error('miner_start', err); + }); }; -const stopMining = (webviews) => { - ethereumNode.send('miner_stop', [1]) - .then((ret) => { - log.info('miner_stop', ret.result); - - if (ret.result) { - global.mining = false; - createMenu(webviews); - } - }) - .catch((err) => { - log.error('miner_stop', err); - }); +const stopMining = webviews => { + ethereumNode + .send('miner_stop', [1]) + .then(ret => { + log.info('miner_stop', ret.result); + + if (ret.result) { + global.mining = false; + createMenu(webviews); + } + }) + .catch(err => { + log.error('miner_stop', err); + }); }; - // create a menu template // null -> obj -let menuTempl = function (webviews) { - const menu = []; - webviews = webviews || []; - - // APP - const fileMenu = []; - - if (process.platform === 'darwin') { - fileMenu.push( - { - label: i18n.t('mist.applicationMenu.app.about', { app: Settings.appName }), - click() { - Windows.createPopup('about'); - } - }, - { - label: i18n.t('mist.applicationMenu.app.checkForUpdates'), - click() { - updateChecker.runVisibly(); - } - }, - { - label: i18n.t('mist.applicationMenu.app.checkForNodeUpdates'), - click() { - // remove skipVersion - fs.writeFileSync( - path.join(Settings.userDataPath, 'skippedNodeVersion.json'), - '' // write no version - ); - - // true = will restart after updating and user consent - ClientBinaryManager.init(true); - } - }, - { - type: 'separator', - }, - { - label: i18n.t('mist.applicationMenu.app.services', { app: Settings.appName }), - role: 'services', - submenu: [], - }, - { - type: 'separator', - }, - { - label: i18n.t('mist.applicationMenu.app.hide', { app: Settings.appName }), - accelerator: 'Command+H', - role: 'hide', - }, - { - label: i18n.t('mist.applicationMenu.app.hideOthers', { app: Settings.appName }), - accelerator: 'Command+Alt+H', - role: 'hideothers', - }, - { - label: i18n.t('mist.applicationMenu.app.showAll', { app: Settings.appName }), - role: 'unhide', - }, - { - type: 'separator', - } - ); +let menuTempl = function(webviews) { + const menu = []; + webviews = webviews || []; + + // APP + const fileMenu = []; + + if (process.platform === 'darwin') { + fileMenu.push( + { + label: i18n.t('mist.applicationMenu.app.about', { + app: Settings.appName + }), + click() { + Windows.createPopup('about'); + } + }, + { + label: i18n.t('mist.applicationMenu.app.checkForUpdates'), + click() { + updateChecker.runVisibly(); + } + }, + { + label: i18n.t('mist.applicationMenu.app.checkForNodeUpdates'), + click() { + // remove skipVersion + fs.writeFileSync( + path.join(Settings.userDataPath, 'skippedNodeVersion.json'), + '' // write no version + ); + + // true = will restart after updating and user consent + ClientBinaryManager.init(true); + } + }, + { + type: 'separator' + }, + { + label: i18n.t('mist.applicationMenu.app.services', { + app: Settings.appName + }), + role: 'services', + submenu: [] + }, + { + type: 'separator' + }, + { + label: i18n.t('mist.applicationMenu.app.hide', { + app: Settings.appName + }), + accelerator: 'Command+H', + role: 'hide' + }, + { + label: i18n.t('mist.applicationMenu.app.hideOthers', { + app: Settings.appName + }), + accelerator: 'Command+Alt+H', + role: 'hideothers' + }, + { + label: i18n.t('mist.applicationMenu.app.showAll', { + app: Settings.appName + }), + role: 'unhide' + }, + { + type: 'separator' + } + ); + } + + fileMenu.push({ + label: i18n.t('mist.applicationMenu.app.quit', { + app: Settings.appName + }), + accelerator: 'CommandOrControl+Q', + click() { + app.quit(); } - - fileMenu.push({ - label: i18n.t('mist.applicationMenu.app.quit', { app: Settings.appName }), - accelerator: 'CommandOrControl+Q', + }); + + menu.push({ + label: i18n.t('mist.applicationMenu.app.label', { + app: Settings.appName + }), + submenu: fileMenu + }); + + let swarmUpload = []; + if (global.mode !== 'wallet') { + swarmUpload.push( + { + type: 'separator' + }, + { + label: i18n.t('mist.applicationMenu.file.swarmUpload'), + accelerator: 'Shift+CommandOrControl+U', + enabled: store.getState().settings.swarmState == SwarmState.Enabled, click() { - app.quit(); - }, - }); - - menu.push({ - label: i18n.t('mist.applicationMenu.app.label', { app: Settings.appName }), - submenu: fileMenu, - }); - - let swarmUpload = []; - if (global.mode !== 'wallet') { - swarmUpload.push({ - type: 'separator', - }, - { - label: i18n.t('mist.applicationMenu.file.swarmUpload'), - accelerator: 'Shift+CommandOrControl+U', - enabled: store.getState().settings.swarmState == SwarmState.Enabled, - click() { - const focusedWindow = BrowserWindow.getFocusedWindow(); - const paths = dialog.showOpenDialog(focusedWindow, { - properties: ['openFile', 'openDirectory'] - }); - if (paths && paths.length === 1) { - const isDir = fs.lstatSync(paths[0]).isDirectory(); - const defaultPath = path.join(paths[0], 'index.html'); - const uploadConfig = { - path: paths[0], - kind: isDir ? 'directory' : 'file', - defaultFile: fs.existsSync(defaultPath) ? '/index.html' : null - }; - swarmNode.upload(uploadConfig).then((hash) => { - focusedWindow.webContents.executeJavaScript(` + const focusedWindow = BrowserWindow.getFocusedWindow(); + const paths = dialog.showOpenDialog(focusedWindow, { + properties: ['openFile', 'openDirectory'] + }); + if (paths && paths.length === 1) { + const isDir = fs.lstatSync(paths[0]).isDirectory(); + const defaultPath = path.join(paths[0], 'index.html'); + const uploadConfig = { + path: paths[0], + kind: isDir ? 'directory' : 'file', + defaultFile: fs.existsSync(defaultPath) ? '/index.html' : null + }; + swarmNode + .upload(uploadConfig) + .then(hash => { + focusedWindow.webContents.executeJavaScript(` Tabs.update('browser', {$set: { url: 'bzz://${hash}', redirect: 'bzz://${hash}' }}); LocalStore.set('selectedTab', 'browser'); `); - swarmLog.info('Hash uploaded:', hash); - }).catch(e => swarmLog.error(e)); - } - } - }); - } - - menu.push({ - label: i18n.t('mist.applicationMenu.file.label'), - submenu: [ - { - label: i18n.t('mist.applicationMenu.file.newAccount'), - accelerator: 'CommandOrControl+N', - click() { - Windows.createPopup('requestAccount'); - }, - }, - { - label: i18n.t('mist.applicationMenu.file.importPresale'), - accelerator: 'CommandOrControl+I', - enabled: ethereumNode.isMainNetwork, - click() { - Windows.createPopup('importAccount'); - }, - }, - { - type: 'separator', - }, - { - label: i18n.t('mist.applicationMenu.file.backup'), - submenu: [ - { - label: i18n.t('mist.applicationMenu.file.backupKeyStore'), - click() { - let userPath = Settings.userHomePath; - - // eth - if (ethereumNode.isEth) { - if (process.platform === 'win32') { - userPath = `${Settings.appDataPath}\\Web3\\keys`; - } else { - userPath += '/.web3/keys'; - } - - // geth - } else { - if (process.platform === 'darwin') { - userPath += '/Library/Ethereum/keystore'; - } - - if (process.platform === 'freebsd' || - process.platform === 'linux' || - process.platform === 'sunos') { - userPath += '/.ethereum/keystore'; - } - - if (process.platform === 'win32') { - userPath = `${Settings.appDataPath}\\Ethereum\\keystore`; - } - } - - shell.showItemInFolder(userPath); - }, - }, { - label: i18n.t('mist.applicationMenu.file.backupMist'), - click() { - shell.openItem(Settings.userDataPath); - }, - }, - ], - }, - ...swarmUpload - ] - }); - - // EDIT - menu.push({ - label: i18n.t('mist.applicationMenu.edit.label'), - submenu: [ - { - label: i18n.t('mist.applicationMenu.edit.undo'), - accelerator: 'CommandOrControl+Z', - role: 'undo', - }, - { - label: i18n.t('mist.applicationMenu.edit.redo'), - accelerator: 'Shift+CommandOrControl+Z', - role: 'redo', - }, - { - type: 'separator', - }, - { - label: i18n.t('mist.applicationMenu.edit.cut'), - accelerator: 'CommandOrControl+X', - role: 'cut', - }, - { - label: i18n.t('mist.applicationMenu.edit.copy'), - accelerator: 'CommandOrControl+C', - role: 'copy', - }, - { - label: i18n.t('mist.applicationMenu.edit.paste'), - accelerator: 'CommandOrControl+V', - role: 'paste', - }, - { - label: i18n.t('mist.applicationMenu.edit.selectAll'), - accelerator: 'CommandOrControl+A', - role: 'selectall', - }, - ], - }); - - // LANGUAGE (VIEW) - const switchLang = langCode => (menuItem, browserWindow) => { - store.dispatch(setLanguage(langCode, browserWindow)); - }; - - const currentLanguage = Settings.language; - const languageMenu = Object.keys(i18n.options.resources) - .filter(langCode => langCode !== 'dev') - .map((langCode) => { - const menuItem = { - label: i18n.t(`mist.applicationMenu.view.langCodes.${langCode}`), - type: 'checkbox', - checked: (langCode === currentLanguage), - click: switchLang(langCode), - }; - return menuItem; - }); - - languageMenu.unshift({ - label: i18n.t('mist.applicationMenu.view.default'), - click: switchLang(i18n.getBestMatchedLangCode(app.getLocale())), - }, { - type: 'separator', - }); - - // VIEW - menu.push({ - label: i18n.t('mist.applicationMenu.view.label'), + swarmLog.info('Hash uploaded:', hash); + }) + .catch(e => swarmLog.error(e)); + } + } + } + ); + } + + menu.push({ + label: i18n.t('mist.applicationMenu.file.label'), + submenu: [ + { + label: i18n.t('mist.applicationMenu.file.newAccount'), + accelerator: 'CommandOrControl+N', + click() { + Windows.createPopup('requestAccount'); + } + }, + { + label: i18n.t('mist.applicationMenu.file.importPresale'), + accelerator: 'CommandOrControl+I', + enabled: ethereumNode.isMainNetwork, + click() { + Windows.createPopup('importAccount'); + } + }, + { + type: 'separator' + }, + { + label: i18n.t('mist.applicationMenu.file.backup'), submenu: [ - { - label: i18n.t('mist.applicationMenu.view.fullscreen'), - accelerator: switchForSystem({ - darwin: 'Command+Control+F', - default: 'F11', - }), - click() { - const mainWindow = Windows.getByType('main'); - - mainWindow.window.setFullScreen(!mainWindow.window.isFullScreen()); - }, - }, - { - label: i18n.t('mist.applicationMenu.view.languages'), - submenu: languageMenu, - }, - ], - }); + { + label: i18n.t('mist.applicationMenu.file.backupKeyStore'), + click() { + let userPath = Settings.userHomePath; + // eth + if (ethereumNode.isEth) { + if (process.platform === 'win32') { + userPath = `${Settings.appDataPath}\\Web3\\keys`; + } else { + userPath += '/.web3/keys'; + } - // DEVELOP - const devToolsMenu = []; - let devtToolsSubMenu; - let curWindow; + // geth + } else { + if (process.platform === 'darwin') { + userPath += '/Library/Ethereum/keystore'; + } - // change for wallet - if (Settings.uiMode === 'mist') { - devtToolsSubMenu = [{ - label: i18n.t('mist.applicationMenu.develop.devToolsMistUI'), - accelerator: 'Alt+CommandOrControl+I', - click() { - curWindow = BrowserWindow.getFocusedWindow(); - if (curWindow) { - curWindow.toggleDevTools(); + if ( + process.platform === 'freebsd' || + process.platform === 'linux' || + process.platform === 'sunos' + ) { + userPath += '/.ethereum/keystore'; } - }, - }, { - type: 'separator', - }]; - - // add webviews - webviews.forEach((webview) => { - devtToolsSubMenu.push({ - label: i18n.t('mist.applicationMenu.develop.devToolsWebview', { webview: webview.name }), - click() { - Windows.getByType('main').send('uiAction_toggleWebviewDevTool', webview._id); - }, - }); - }); - // wallet - } else { - devtToolsSubMenu = [{ - label: i18n.t('mist.applicationMenu.develop.devToolsWalletUI'), - accelerator: 'Alt+CommandOrControl+I', - click() { - curWindow = BrowserWindow.getFocusedWindow(); - if (curWindow) { - curWindow.toggleDevTools(); + if (process.platform === 'win32') { + userPath = `${Settings.appDataPath}\\Ethereum\\keystore`; } - }, - }]; - } + } - devToolsMenu.push({ - label: i18n.t('mist.applicationMenu.develop.devTools'), - submenu: devtToolsSubMenu, + shell.showItemInFolder(userPath); + } + }, + { + label: i18n.t('mist.applicationMenu.file.backupMist'), + click() { + shell.openItem(Settings.userDataPath); + } + } + ] + }, + ...swarmUpload + ] + }); + + // EDIT + menu.push({ + label: i18n.t('mist.applicationMenu.edit.label'), + submenu: [ + { + label: i18n.t('mist.applicationMenu.edit.undo'), + accelerator: 'CommandOrControl+Z', + role: 'undo' + }, + { + label: i18n.t('mist.applicationMenu.edit.redo'), + accelerator: 'Shift+CommandOrControl+Z', + role: 'redo' + }, + { + type: 'separator' + }, + { + label: i18n.t('mist.applicationMenu.edit.cut'), + accelerator: 'CommandOrControl+X', + role: 'cut' + }, + { + label: i18n.t('mist.applicationMenu.edit.copy'), + accelerator: 'CommandOrControl+C', + role: 'copy' + }, + { + label: i18n.t('mist.applicationMenu.edit.paste'), + accelerator: 'CommandOrControl+V', + role: 'paste' + }, + { + label: i18n.t('mist.applicationMenu.edit.selectAll'), + accelerator: 'CommandOrControl+A', + role: 'selectall' + } + ] + }); + + // LANGUAGE (VIEW) + const switchLang = langCode => (menuItem, browserWindow) => { + store.dispatch(setLanguage(langCode, browserWindow)); + }; + + const currentLanguage = Settings.language; + const languageMenu = Object.keys(i18n.options.resources) + .filter(langCode => langCode !== 'dev') + .map(langCode => { + const menuItem = { + label: i18n.t(`mist.applicationMenu.view.langCodes.${langCode}`), + type: 'checkbox', + checked: langCode === currentLanguage, + click: switchLang(langCode) + }; + return menuItem; }); - if (Settings.uiMode === 'mist') { - devToolsMenu.push({ - label: i18n.t('mist.applicationMenu.develop.openRemix'), - enabled: true, - click() { - Windows.createPopup('remix'); - }, - }); + languageMenu.unshift( + { + label: i18n.t('mist.applicationMenu.view.default'), + click: switchLang(i18n.getBestMatchedLangCode(app.getLocale())) + }, + { + type: 'separator' } + ); + + // VIEW + menu.push({ + label: i18n.t('mist.applicationMenu.view.label'), + submenu: [ + { + label: i18n.t('mist.applicationMenu.view.fullscreen'), + accelerator: switchForSystem({ + darwin: 'Command+Control+F', + default: 'F11' + }), + click() { + const mainWindow = Windows.getByType('main'); - devToolsMenu.push({ - label: i18n.t('mist.applicationMenu.develop.runTests'), - enabled: (Settings.uiMode === 'mist'), + mainWindow.window.setFullScreen(!mainWindow.window.isFullScreen()); + } + }, + { + label: i18n.t('mist.applicationMenu.view.languages'), + submenu: languageMenu + } + ] + }); + + // DEVELOP + const devToolsMenu = []; + let devtToolsSubMenu; + let curWindow; + + // change for wallet + if (Settings.uiMode === 'mist') { + devtToolsSubMenu = [ + { + label: i18n.t('mist.applicationMenu.develop.devToolsMistUI'), + accelerator: 'Alt+CommandOrControl+I', click() { - Windows.getByType('main').send('uiAction_runTests', 'webview'); - }, + curWindow = BrowserWindow.getFocusedWindow(); + if (curWindow) { + curWindow.toggleDevTools(); + } + } + }, + { + type: 'separator' + } + ]; + + // add webviews + webviews.forEach(webview => { + devtToolsSubMenu.push({ + label: i18n.t('mist.applicationMenu.develop.devToolsWebview', { + webview: webview.name + }), + click() { + Windows.getByType('main').send( + 'uiAction_toggleWebviewDevTool', + webview._id + ); + } + }); }); - devToolsMenu.push({ - label: i18n.t('mist.applicationMenu.develop.logFiles'), + // wallet + } else { + devtToolsSubMenu = [ + { + label: i18n.t('mist.applicationMenu.develop.devToolsWalletUI'), + accelerator: 'Alt+CommandOrControl+I', click() { - try { - shell.showItemInFolder(path.join(Settings.userDataPath, 'logs', 'all.log')); - } catch (error) { - log.error(error); - } - }, - }); + curWindow = BrowserWindow.getFocusedWindow(); + if (curWindow) { + curWindow.toggleDevTools(); + } + } + } + ]; + } - // add node switching menu + devToolsMenu.push({ + label: i18n.t('mist.applicationMenu.develop.devTools'), + submenu: devtToolsSubMenu + }); + + if (Settings.uiMode === 'mist') { devToolsMenu.push({ - type: 'separator', + label: i18n.t('mist.applicationMenu.develop.openRemix'), + enabled: true, + click() { + Windows.createPopup('remix'); + } }); + } - - // add node switch - if (process.platform === 'darwin' || process.platform === 'win32') { - const nodeSubmenu = []; - - const ethClient = ClientBinaryManager.getClient('eth'); - const gethClient = ClientBinaryManager.getClient('geth'); - - if (gethClient) { - nodeSubmenu.push({ - label: `Geth ${gethClient.version}`, - checked: ethereumNode.isOwnNode && ethereumNode.isGeth, - enabled: ethereumNode.isOwnNode, - type: 'checkbox', - click() { - restartNode('geth', null, 'fast', webviews); - }, - }); - } - - if (ethClient) { - nodeSubmenu.push( - { - label: `Eth ${ethClient.version} (C++)`, - checked: ethereumNode.isOwnNode && ethereumNode.isEth, - enabled: ethereumNode.isOwnNode, - // enabled: false, - type: 'checkbox', - click() { - restartNode('eth'); - }, - } - ); - } - - devToolsMenu.push({ - label: i18n.t('mist.applicationMenu.develop.ethereumNode'), - submenu: nodeSubmenu, - }); + devToolsMenu.push({ + label: i18n.t('mist.applicationMenu.develop.runTests'), + enabled: Settings.uiMode === 'mist', + click() { + Windows.getByType('main').send('uiAction_runTests', 'webview'); } - - // add network switch - devToolsMenu.push({ - label: i18n.t('mist.applicationMenu.develop.network'), - submenu: [ - { - label: i18n.t('mist.applicationMenu.develop.mainNetwork'), - accelerator: 'CommandOrControl+Alt+1', - checked: ethereumNode.isOwnNode && ethereumNode.isMainNetwork, - enabled: ethereumNode.isOwnNode, - type: 'checkbox', - click() { - restartNode(ethereumNode.type, 'main'); - }, - }, - { - label: 'Ropsten - Test network', - accelerator: 'CommandOrControl+Alt+2', - checked: ethereumNode.isOwnNode && ethereumNode.network === 'test', - enabled: ethereumNode.isOwnNode, - type: 'checkbox', - click() { - restartNode(ethereumNode.type, 'test'); - }, - }, - { - label: 'Rinkeby - Test network', - accelerator: 'CommandOrControl+Alt+3', - checked: ethereumNode.isOwnNode && ethereumNode.network === 'rinkeby', - enabled: ethereumNode.isOwnNode, - type: 'checkbox', - click() { - restartNode(ethereumNode.type, 'rinkeby'); - }, - }, - { - label: 'Solo network', - accelerator: 'CommandOrControl+Alt+4', - checked: ethereumNode.isOwnNode && ethereumNode.isDevNetwork, - enabled: ethereumNode.isOwnNode, - type: 'checkbox', - click() { - restartNode(ethereumNode.type, 'dev'); - }, - } - ] }); - - // Light mode switch should appear when not in Solo Mode (dev network) - if (ethereumNode.isOwnNode && ethereumNode.isGeth && !ethereumNode.isDevNetwork) { - devToolsMenu.push({ - label: 'Sync with Light client (beta)', - enabled: true, - checked: ethereumNode.isLightMode, - type: 'checkbox', - click() { - restartNode('geth', null, (ethereumNode.isLightMode) ? 'fast' : 'light'); - }, - }); + }); + + devToolsMenu.push({ + label: i18n.t('mist.applicationMenu.develop.logFiles'), + click() { + try { + shell.showItemInFolder( + path.join(Settings.userDataPath, 'logs', 'all.log') + ); + } catch (error) { + log.error(error); + } } - - // Enables mining menu: only in Solo mode and Ropsten network (testnet) - if (ethereumNode.isOwnNode && (ethereumNode.isTestNetwork || ethereumNode.isDevNetwork)) { - devToolsMenu.push({ - label: (global.mining) ? i18n.t('mist.applicationMenu.develop.stopMining') : i18n.t('mist.applicationMenu.develop.startMining'), - accelerator: 'CommandOrControl+Shift+M', - enabled: true, - click() { - if (global.mining) { - stopMining(webviews); - } else { - startMining(webviews); - } - } - }); + }); + + // add node switching menu + devToolsMenu.push({ + type: 'separator' + }); + + // add node switch + if (process.platform === 'darwin' || process.platform === 'win32') { + const nodeSubmenu = []; + + const ethClient = ClientBinaryManager.getClient('eth'); + const gethClient = ClientBinaryManager.getClient('geth'); + + if (gethClient) { + nodeSubmenu.push({ + label: `Geth ${gethClient.version}`, + checked: ethereumNode.isOwnNode && ethereumNode.isGeth, + enabled: ethereumNode.isOwnNode, + type: 'checkbox', + click() { + restartNode('geth', null, 'fast', webviews); + } + }); } - if (global.mode !== 'wallet') { - devToolsMenu.push({ - type: 'separator' - }, - { - label: i18n.t('mist.applicationMenu.develop.enableSwarm'), - enabled: true, - checked: [SwarmState.Enabling, SwarmState.Enabled].includes(global.store.getState().settings.swarmState), - type: 'checkbox', - click() { - store.dispatch(toggleSwarm()); - } - }); + if (ethClient) { + nodeSubmenu.push({ + label: `Eth ${ethClient.version} (C++)`, + checked: ethereumNode.isOwnNode && ethereumNode.isEth, + enabled: ethereumNode.isOwnNode, + // enabled: false, + type: 'checkbox', + click() { + restartNode('eth'); + } + }); } - menu.push({ - label: ((global.mining) ? '⛏ ' : '') + i18n.t('mist.applicationMenu.develop.label'), - submenu: devToolsMenu, - }); - - // WINDOW - menu.push({ - label: i18n.t('mist.applicationMenu.window.label'), - role: 'window', - submenu: [ - { - label: i18n.t('mist.applicationMenu.window.minimize'), - accelerator: 'CommandOrControl+M', - role: 'minimize', - }, - { - label: i18n.t('mist.applicationMenu.window.close'), - accelerator: 'CommandOrControl+W', - role: 'close', - }, - { - type: 'separator', - }, - { - label: i18n.t('mist.applicationMenu.window.toFront'), - role: 'front', - }, - ], + devToolsMenu.push({ + label: i18n.t('mist.applicationMenu.develop.ethereumNode'), + submenu: nodeSubmenu }); - - // HELP - const helpMenu = []; - - if (process.platform === 'freebsd' || process.platform === 'linux' || - process.platform === 'sunos' || process.platform === 'win32') { - helpMenu.push( - { - label: i18n.t('mist.applicationMenu.app.about', { app: Settings.appName }), - click() { - Windows.createPopup('about'); - }, - }, - { - label: i18n.t('mist.applicationMenu.app.checkForUpdates'), - click() { - updateChecker.runVisibly(); - }, - } - ); - } - helpMenu.push({ - label: i18n.t('mist.applicationMenu.help.mistWiki'), + } + + // add network switch + devToolsMenu.push({ + label: i18n.t('mist.applicationMenu.develop.network'), + submenu: [ + { + label: i18n.t('mist.applicationMenu.develop.mainNetwork'), + accelerator: 'CommandOrControl+Alt+1', + checked: ethereumNode.isOwnNode && ethereumNode.isMainNetwork, + enabled: ethereumNode.isOwnNode, + type: 'checkbox', click() { - shell.openExternal('https://github.com/ethereum/mist/wiki'); - }, - }, { - label: i18n.t('mist.applicationMenu.help.gitter'), + restartNode(ethereumNode.type, 'main'); + } + }, + { + label: 'Ropsten - Test network', + accelerator: 'CommandOrControl+Alt+2', + checked: ethereumNode.isOwnNode && ethereumNode.network === 'test', + enabled: ethereumNode.isOwnNode, + type: 'checkbox', click() { - shell.openExternal('https://gitter.im/ethereum/mist'); - }, - }, { - label: i18n.t('mist.applicationMenu.help.reportBug'), + restartNode(ethereumNode.type, 'test'); + } + }, + { + label: 'Rinkeby - Test network', + accelerator: 'CommandOrControl+Alt+3', + checked: ethereumNode.isOwnNode && ethereumNode.network === 'rinkeby', + enabled: ethereumNode.isOwnNode, + type: 'checkbox', + click() { + restartNode(ethereumNode.type, 'rinkeby'); + } + }, + { + label: 'Solo network', + accelerator: 'CommandOrControl+Alt+4', + checked: ethereumNode.isOwnNode && ethereumNode.isDevNetwork, + enabled: ethereumNode.isOwnNode, + type: 'checkbox', click() { - shell.openExternal('https://github.com/ethereum/mist/issues'); - }, + restartNode(ethereumNode.type, 'dev'); + } + } + ] + }); + + // Light mode switch should appear when not in Solo Mode (dev network) + if ( + ethereumNode.isOwnNode && + ethereumNode.isGeth && + !ethereumNode.isDevNetwork + ) { + devToolsMenu.push({ + label: 'Sync with Light client (beta)', + enabled: true, + checked: ethereumNode.isLightMode, + type: 'checkbox', + click() { + restartNode('geth', null, ethereumNode.isLightMode ? 'fast' : 'light'); + } }); + } - menu.push({ - label: i18n.t('mist.applicationMenu.help.label'), - role: 'help', - submenu: helpMenu, + // Enables mining menu: only in Solo mode and Ropsten network (testnet) + if ( + ethereumNode.isOwnNode && + (ethereumNode.isTestNetwork || ethereumNode.isDevNetwork) + ) { + devToolsMenu.push({ + label: global.mining + ? i18n.t('mist.applicationMenu.develop.stopMining') + : i18n.t('mist.applicationMenu.develop.startMining'), + accelerator: 'CommandOrControl+Shift+M', + enabled: true, + click() { + if (global.mining) { + stopMining(webviews); + } else { + startMining(webviews); + } + } }); - return menu; + } + + if (global.mode !== 'wallet') { + devToolsMenu.push( + { + type: 'separator' + }, + { + label: i18n.t('mist.applicationMenu.develop.enableSwarm'), + enabled: true, + checked: [SwarmState.Enabling, SwarmState.Enabled].includes( + global.store.getState().settings.swarmState + ), + type: 'checkbox', + click() { + store.dispatch(toggleSwarm()); + } + } + ); + } + + menu.push({ + label: + (global.mining ? '⛏ ' : '') + + i18n.t('mist.applicationMenu.develop.label'), + submenu: devToolsMenu + }); + + // WINDOW + menu.push({ + label: i18n.t('mist.applicationMenu.window.label'), + role: 'window', + submenu: [ + { + label: i18n.t('mist.applicationMenu.window.minimize'), + accelerator: 'CommandOrControl+M', + role: 'minimize' + }, + { + label: i18n.t('mist.applicationMenu.window.close'), + accelerator: 'CommandOrControl+W', + role: 'close' + }, + { + type: 'separator' + }, + { + label: i18n.t('mist.applicationMenu.window.toFront'), + role: 'front' + } + ] + }); + + // HELP + const helpMenu = []; + + if ( + process.platform === 'freebsd' || + process.platform === 'linux' || + process.platform === 'sunos' || + process.platform === 'win32' + ) { + helpMenu.push( + { + label: i18n.t('mist.applicationMenu.app.about', { + app: Settings.appName + }), + click() { + Windows.createPopup('about'); + } + }, + { + label: i18n.t('mist.applicationMenu.app.checkForUpdates'), + click() { + updateChecker.runVisibly(); + } + } + ); + } + helpMenu.push( + { + label: i18n.t('mist.applicationMenu.help.mistWiki'), + click() { + shell.openExternal('https://github.com/ethereum/mist/wiki'); + } + }, + { + label: i18n.t('mist.applicationMenu.help.gitter'), + click() { + shell.openExternal('https://gitter.im/ethereum/mist'); + } + }, + { + label: i18n.t('mist.applicationMenu.help.reportBug'), + click() { + shell.openExternal('https://github.com/ethereum/mist/issues'); + } + } + ); + + menu.push({ + label: i18n.t('mist.applicationMenu.help.label'), + role: 'help', + submenu: helpMenu + }); + return menu; }; - module.exports = createMenu; diff --git a/modules/nodeSync.js b/modules/nodeSync.js index 8a524ba32..0b9820654 100644 --- a/modules/nodeSync.js +++ b/modules/nodeSync.js @@ -12,193 +12,189 @@ const { ipcMain: ipc } = require('electron'); const ethereumNode = require('./ethereumNode'); const log = require('./utils/logger').create('NodeSync'); - const SYNC_CHECK_INTERVAL_MS = 2000; - class NodeSync extends EventEmitter { - constructor() { - super(); - - ethereumNode.on('state', _.bind(this._onNodeStateChanged, this)); - } - - /** - * @return {Promise} - */ - start() { - if (this._syncPromise) { - log.warn('Sync already in progress, returning Promise'); - - return Q.resolve(this._syncPromise); - } - - this._syncPromise = Q.try(() => { - if (!ethereumNode.isIpcConnected) { - throw new Error('Cannot sync - Ethereum node not yet connected'); - } + constructor() { + super(); - return new Q((resolve, reject) => { - log.info('Starting sync loop'); + ethereumNode.on('state', _.bind(this._onNodeStateChanged, this)); + } - this._syncInProgress = true; - this._onSyncDone = resolve; - this._onSyncError = reject; + /** + * @return {Promise} + */ + start() { + if (this._syncPromise) { + log.warn('Sync already in progress, returning Promise'); - this.emit('starting'); - - ipc.on('backendAction_skipSync', () => { - ipc.removeAllListeners('backendAction_skipSync'); - log.info('Sync has been skipped'); - - this._onSyncDone(); - }); - - this._sync(); - }); - }) - .then(() => { - this.emit('finished'); - }) - .catch((err) => { - log.error('Sync error', err); - - this.emit('error', err); - }) - .finally(() => { - log.info('Sync loop ended'); - - this._clearState(); - }); - - return this._syncPromise; + return Q.resolve(this._syncPromise); } + this._syncPromise = Q.try(() => { + if (!ethereumNode.isIpcConnected) { + throw new Error('Cannot sync - Ethereum node not yet connected'); + } - /** - * @return {Promise} - */ - stop() { - return Q.try(() => { - if (!this._syncInProgress) { - log.debug('Sync not already in progress.'); - } else { - log.info('Stopping sync loop'); + return new Q((resolve, reject) => { + log.info('Starting sync loop'); - this._clearState(); - - return Q.delay(SYNC_CHECK_INTERVAL_MS) - .then(() => { - this.emit('stopped'); - }); - } - }); - } + this._syncInProgress = true; + this._onSyncDone = resolve; + this._onSyncError = reject; + this.emit('starting'); - _clearState() { - ipc.removeAllListeners('backendAction_skipSync'); + ipc.on('backendAction_skipSync', () => { + ipc.removeAllListeners('backendAction_skipSync'); + log.info('Sync has been skipped'); - this._syncInProgress - = this._syncPromise - = this._onSyncDone - = this._onSyncError - = false; - } + this._onSyncDone(); + }); + this._sync(); + }); + }) + .then(() => { + this.emit('finished'); + }) + .catch(err => { + log.error('Sync error', err); + + this.emit('error', err); + }) + .finally(() => { + log.info('Sync loop ended'); + + this._clearState(); + }); + + return this._syncPromise; + } + + /** + * @return {Promise} + */ + stop() { + return Q.try(() => { + if (!this._syncInProgress) { + log.debug('Sync not already in progress.'); + } else { + log.info('Stopping sync loop'); + + this._clearState(); + + return Q.delay(SYNC_CHECK_INTERVAL_MS).then(() => { + this.emit('stopped'); + }); + } + }); + } - _sync() { - _.delay(() => { - if (!this._syncInProgress) { - log.debug('Sync no longer in progress, so ending sync loop.'); + _clearState() { + ipc.removeAllListeners('backendAction_skipSync'); - return; - } + this._syncInProgress = this._syncPromise = this._onSyncDone = this._onSyncError = false; + } - log.trace('Check sync status'); + _sync() { + _.delay(() => { + if (!this._syncInProgress) { + log.debug('Sync no longer in progress, so ending sync loop.'); - ethereumNode.send('eth_syncing', []) - .then((ret) => { - const result = ret.result; + return; + } - // got a result, check for error - if (result) { - log.trace('Sync status', result); + log.trace('Check sync status'); - // got an error? - if (result.error) { - if (result.error.code === -32601) { - log.warn('Sync method not implemented, skipping sync.'); + ethereumNode + .send('eth_syncing', []) + .then(ret => { + const result = ret.result; - return this._onSyncDone(); - } + // got a result, check for error + if (result) { + log.trace('Sync status', result); - throw new Error(`Unexpected error: ${result.error}`); - } else { // no error, so call again in a bit - this.emit('nodeSyncing', result); + // got an error? + if (result.error) { + if (result.error.code === -32601) { + log.warn('Sync method not implemented, skipping sync.'); - return this._sync(); - } - } else { // got no result, let's check the block number - log.debug('Check latest block number'); + return this._onSyncDone(); + } - return ethereumNode.send('eth_getBlockByNumber', ['latest', false]) - .then((ret2) => { - const blockResult = ret2.result; - const now = Math.floor(new Date().getTime() / 1000); + throw new Error(`Unexpected error: ${result.error}`); + } else { + // no error, so call again in a bit + this.emit('nodeSyncing', result); - if (!blockResult) { - return this._sync(); - } + return this._sync(); + } + } else { + // got no result, let's check the block number + log.debug('Check latest block number'); - log.debug(`Last block: ${Number(blockResult.number)}; timestamp: ${blockResult.timestamp}`); + return ethereumNode + .send('eth_getBlockByNumber', ['latest', false]) + .then(ret2 => { + const blockResult = ret2.result; + const now = Math.floor(new Date().getTime() / 1000); - const diff = now - +blockResult.timestamp; + if (!blockResult) { + return this._sync(); + } - // need sync if > 1 minute - if (diff > 60) { - this.emit('nodeSyncing', result); + log.debug( + `Last block: ${Number(blockResult.number)}; timestamp: ${ + blockResult.timestamp + }` + ); - log.trace('Keep syncing...'); + const diff = now - +blockResult.timestamp; - return this._sync(); - } + // need sync if > 1 minute + if (diff > 60) { + this.emit('nodeSyncing', result); - log.info('No more sync necessary'); + log.trace('Keep syncing...'); - return this._onSyncDone(); - }); - } - }) - .catch((err) => { - log.error('Node crashed while syncing?', err); + return this._sync(); + } - this._onSyncError(err); - }); - }, SYNC_CHECK_INTERVAL_MS); - } + log.info('No more sync necessary'); + return this._onSyncDone(); + }); + } + }) + .catch(err => { + log.error('Node crashed while syncing?', err); - _onNodeStateChanged(state) { - switch (state) { // eslint-disable-line default-case - // stop syncing when node about to be stopped - case ethereumNode.STATES.STOPPING: - log.info('Ethereum node stopping, so stop sync'); - - this.stop(); - break; - // auto-sync whenever node gets connected - case ethereumNode.STATES.CONNECTED: - log.info('Ethereum node connected, re-start sync'); - - // stop syncing, then start again - this.stop().then(() => { - this.start(); - }); - break; - } + this._onSyncError(err); + }); + }, SYNC_CHECK_INTERVAL_MS); + } + + _onNodeStateChanged(state) { + switch (state) { // eslint-disable-line default-case + // stop syncing when node about to be stopped + case ethereumNode.STATES.STOPPING: + log.info('Ethereum node stopping, so stop sync'); + + this.stop(); + break; + // auto-sync whenever node gets connected + case ethereumNode.STATES.CONNECTED: + log.info('Ethereum node connected, re-start sync'); + + // stop syncing, then start again + this.stop().then(() => { + this.start(); + }); + break; } + } } - module.exports = new NodeSync(); diff --git a/modules/preloader/browser.js b/modules/preloader/browser.js index 7776efac6..f4696575c 100644 --- a/modules/preloader/browser.js +++ b/modules/preloader/browser.js @@ -14,145 +14,151 @@ const path = remote.require('path'); // set navigator.language Object.defineProperty(navigator, 'language', { - get() { return ipcRenderer.sendSync('backendAction_getLanguage'); } + get() { + return ipcRenderer.sendSync('backendAction_getLanguage'); + } }); // notifiy the tab to store the webview id ipcRenderer.sendToHost('setWebviewId'); -const isValidJsonRpc = function (message) { - return !!(Object.prototype.hasOwnProperty.call(message, 'method') || +const isValidJsonRpc = function(message) { + return !!( + Object.prototype.hasOwnProperty.call(message, 'method') || Object.prototype.hasOwnProperty.call(message, 'id') || Object.prototype.hasOwnProperty.call(message, 'params') || - Object.prototype.hasOwnProperty.call(message, 'jsonrpc')); + Object.prototype.hasOwnProperty.call(message, 'jsonrpc') + ); }; -const sanatizeJsonRpc = function (message) { - // sanitize - return { - jsonrpc: message.jsonrpc, - id: message.id, - method: message.method, - params: message.params - }; +const sanatizeJsonRpc = function(message) { + // sanitize + return { + jsonrpc: message.jsonrpc, + id: message.id, + method: message.method, + params: message.params + }; }; // Wait for post messages window.addEventListener('message', function message(event) { + let data; + try { + data = JSON.parse(event.data); + } catch (e) { + data = event.data; + } + if (typeof data !== 'object') { + return; + } - - let data; - try { - data = JSON.parse(event.data); - } catch(e){ - data = event.data; - } - - - - if (typeof data !== 'object') { - return; - } - - - // EthereumProvider: connect - if (data.type === 'create') { - ipcRenderer.send('ipcProvider-create'); + // EthereumProvider: connect + if (data.type === 'create') { + ipcRenderer.send('ipcProvider-create'); // EthereumProvider: write - } else if (data.type === 'write') { - let messageIsArray = _.isArray(data.message); - - // only accept valid JSON rpc requests - if (messageIsArray) { - for (let i = 0; i < data.message.length; i++) { - if (isValidJsonRpc(data.message[i])) { - data.message[i] = sanatizeJsonRpc(data.message[i]); - } else { - return; - } - } + } else if (data.type === 'write') { + let messageIsArray = _.isArray(data.message); + + // only accept valid JSON rpc requests + if (messageIsArray) { + for (let i = 0; i < data.message.length; i++) { + if (isValidJsonRpc(data.message[i])) { + data.message[i] = sanatizeJsonRpc(data.message[i]); } else { - if (isValidJsonRpc(data.message)) { - data.message = sanatizeJsonRpc(data.message); - } else { - return; - } + return; } + } + } else { + if (isValidJsonRpc(data.message)) { + data.message = sanatizeJsonRpc(data.message); + } else { + return; + } + } - // make sure we only send allowed properties - ipcRenderer.send('ipcProvider-write', JSON.stringify(data.message)); + // make sure we only send allowed properties + ipcRenderer.send('ipcProvider-write', JSON.stringify(data.message)); // mistAPI - } else if (/^mistAPI_[a-z]/i.test(data.type)) { - - if (data.type === 'mistAPI_requestAccount') { - ipcRenderer.send(data.type, data.message); - } else { - ipcRenderer.sendToHost(data.type, data.message); - } + } else if (/^mistAPI_[a-z]/i.test(data.type)) { + if (data.type === 'mistAPI_requestAccount') { + ipcRenderer.send(data.type, data.message); + } else { + ipcRenderer.sendToHost(data.type, data.message); } + } }); -const postMessage = function (payload) { - if (typeof payload === 'object') { - payload = JSON.stringify(payload); - } +const postMessage = function(payload) { + if (typeof payload === 'object') { + payload = JSON.stringify(payload); + } - window.postMessage(payload, (!location.origin || location.origin === "null" ) ? '*' : location.origin); + window.postMessage( + payload, + !location.origin || location.origin === 'null' ? '*' : location.origin + ); }; // custom Events -['uiAction_windowMessage', 'mistAPI_callMenuFunction'].forEach(function (type) { - ipcRenderer.on(type, function onIpcRenderer(e, result) { - - // this type needs special packaging - if(type === 'uiAction_windowMessage') { - result = { - type: arguments[1], - error: arguments[2], - value: arguments[3] - }; - } +['uiAction_windowMessage', 'mistAPI_callMenuFunction'].forEach(function(type) { + ipcRenderer.on(type, function onIpcRenderer(e, result) { + // this type needs special packaging + if (type === 'uiAction_windowMessage') { + result = { + type: arguments[1], + error: arguments[2], + value: arguments[3] + }; + } - postMessage({ - type: type, - message: result - }); + postMessage({ + type: type, + message: result }); + }); }); // add IPCbackend events -['data', 'error', 'end', 'timeout', 'connect'].forEach(function (type) { - ipcRenderer.on(`ipcProvider-`+ type, function onIpcRenderer(e, result) { - postMessage({ - type: type, - message: JSON.parse(result) - }); +['data', 'error', 'end', 'timeout', 'connect'].forEach(function(type) { + ipcRenderer.on(`ipcProvider-` + type, function onIpcRenderer(e, result) { + postMessage({ + type: type, + message: JSON.parse(result) }); + }); }); - // load ethereumProvider -const bignumber = fs.readFileSync(path.join(__dirname, '/injected/BigNumber.js')).toString(); -const eventEmitter3 = fs.readFileSync(path.join(__dirname, '/injected/EventEmitter3.js')).toString(); -let mistAPI = fs.readFileSync(path.join(__dirname, '/injected/mistAPI.js')).toString(); -const ethereumProvider = fs.readFileSync(path.join(__dirname, '/injected/EthereumProvider.js')).toString(); - -mistAPI = mistAPI.replace('__version__', packageJson.version) - .replace('__license__', packageJson.license) - .replace('__platform__', process.platform) - .replace('__solidityVersion__', String(packageJson.dependencies.solc).match(/\d+\.\d+\.\d+/)[0]); +const bignumber = fs + .readFileSync(path.join(__dirname, '/injected/BigNumber.js')) + .toString(); +const eventEmitter3 = fs + .readFileSync(path.join(__dirname, '/injected/EventEmitter3.js')) + .toString(); +let mistAPI = fs + .readFileSync(path.join(__dirname, '/injected/mistAPI.js')) + .toString(); +const ethereumProvider = fs + .readFileSync(path.join(__dirname, '/injected/EthereumProvider.js')) + .toString(); + +mistAPI = mistAPI + .replace('__version__', packageJson.version) + .replace('__license__', packageJson.license) + .replace('__platform__', process.platform) + .replace( + '__solidityVersion__', + String(packageJson.dependencies.solc).match(/\d+\.\d+\.\d+/)[0] + ); webFrame.executeJavaScript( - mistAPI + - bignumber + - eventEmitter3 + - ethereumProvider + mistAPI + bignumber + eventEmitter3 + ethereumProvider ); - // notifiy the tab to store the webview id ipcRenderer.sendToHost('setWebviewId'); diff --git a/modules/preloader/include/common.js b/modules/preloader/include/common.js index a20ee4a2e..a53e7b15f 100644 --- a/modules/preloader/include/common.js +++ b/modules/preloader/include/common.js @@ -1,16 +1,16 @@ -module.exports = (windowType) => { - const { ipcRenderer, webFrame } = require('electron'); +module.exports = windowType => { + const { ipcRenderer, webFrame } = require('electron'); - if (process.env.TEST_MODE) { - window.electronRequire = require; - } + if (process.env.TEST_MODE) { + window.electronRequire = require; + } - // disable pinch zoom - webFrame.setZoomLevelLimits(1, 1); + // disable pinch zoom + webFrame.setZoomLevelLimits(1, 1); - require('./consoleLogCapture')(windowType); // !!! - require('./suppressWindowPrompt')(); + require('./consoleLogCapture')(windowType); // !!! + require('./suppressWindowPrompt')(); - // register with window manager - ipcRenderer.send('backendAction_setWindowId'); + // register with window manager + ipcRenderer.send('backendAction_setWindowId'); }; diff --git a/modules/preloader/include/consoleLogCapture.js b/modules/preloader/include/consoleLogCapture.js index 4edf8b18b..187569315 100644 --- a/modules/preloader/include/consoleLogCapture.js +++ b/modules/preloader/include/consoleLogCapture.js @@ -1,59 +1,60 @@ const { ipcRenderer } = require('electron'); - -const extractLineNumberFromStack = function (stack) { - // / - // / Get the line/filename detail from a Webkit stack trace. See http://stackoverflow.com/a/3806596/1037948 - // / - // / the stack string - - let line = stack.split('\n')[2]; - // fix for various display text - if (line) { - line = (line.indexOf(' (') >= 0 - ? line.split(' (')[1].substring(0, line.length - 1) - : line.split('at ')[1] - ); - return line; - } +const extractLineNumberFromStack = function(stack) { + // / + // / Get the line/filename detail from a Webkit stack trace. See http://stackoverflow.com/a/3806596/1037948 + // / + // / the stack string + + let line = stack.split('\n')[2]; + // fix for various display text + if (line) { + line = + line.indexOf(' (') >= 0 + ? line.split(' (')[1].substring(0, line.length - 1) + : line.split('at ')[1]; + return line; + } }; - -module.exports = function (windowId) { - if (typeof window === 'undefined') { - return; - } - - windowId = windowId || window.location.url; - - const console = window.console; - - // send console logging to IPC backend - ['trace', 'debug', 'info', 'warn', 'error', 'log'].forEach((method) => { - console[`_${method}`] = console[method]; - console[method] = (function (origMethod) { - return function () { - const args = Array.from(arguments); - - const suffix = `@ ${ - this.lineNumber - ? `${this.fileName}:${this.lineNumber}:1` - : extractLineNumberFromStack(new Error().stack)}` - ; - - origMethod.apply(console, args.concat([suffix])); - - try { - ipcRenderer.send( - 'console_log', - windowId, - (method === 'log' ? 'info' : method), - JSON.stringify(args) - ); - } catch (err) { - console._warn('Unable to stringify arguments to log to backend', err.stack); - } - }; - }(console[method])); - }); +module.exports = function(windowId) { + if (typeof window === 'undefined') { + return; + } + + windowId = windowId || window.location.url; + + const console = window.console; + + // send console logging to IPC backend + ['trace', 'debug', 'info', 'warn', 'error', 'log'].forEach(method => { + console[`_${method}`] = console[method]; + console[method] = (function(origMethod) { + return function() { + const args = Array.from(arguments); + + const suffix = `@ ${ + this.lineNumber + ? `${this.fileName}:${this.lineNumber}:1` + : extractLineNumberFromStack(new Error().stack) + }`; + + origMethod.apply(console, args.concat([suffix])); + + try { + ipcRenderer.send( + 'console_log', + windowId, + method === 'log' ? 'info' : method, + JSON.stringify(args) + ); + } catch (err) { + console._warn( + 'Unable to stringify arguments to log to backend', + err.stack + ); + } + }; + })(console[method]); + }); }; diff --git a/modules/preloader/include/getFavicon.js b/modules/preloader/include/getFavicon.js index be7e26f2d..af3052075 100644 --- a/modules/preloader/include/getFavicon.js +++ b/modules/preloader/include/getFavicon.js @@ -6,18 +6,23 @@ Gets the favicon url const { ipcRenderer } = require('electron'); -(function () { - document.addEventListener('DOMContentLoaded', DOMContentLoaded, false); +(function() { + document.addEventListener('DOMContentLoaded', DOMContentLoaded, false); - function DOMContentLoaded(event) { - const icon = document.querySelector('link[rel="apple-touch-icon"]') || document.querySelector('link[type="image/x-icon"]') || document.querySelector('link[rel="shortcut"]') || document.querySelector('link[rel="shortcut icon"]') || document.querySelector('link[rel="icon"]'); + function DOMContentLoaded(event) { + const icon = + document.querySelector('link[rel="apple-touch-icon"]') || + document.querySelector('link[type="image/x-icon"]') || + document.querySelector('link[rel="shortcut"]') || + document.querySelector('link[rel="shortcut icon"]') || + document.querySelector('link[rel="icon"]'); - if (icon) { - ipcRenderer.sendToHost('favicon', icon.href); - } else { - ipcRenderer.sendToHost('favicon', null); - } - - document.removeEventListener('DOMContentLoaded', DOMContentLoaded, false); + if (icon) { + ipcRenderer.sendToHost('favicon', icon.href); + } else { + ipcRenderer.sendToHost('favicon', null); } -}()); + + document.removeEventListener('DOMContentLoaded', DOMContentLoaded, false); + } +})(); diff --git a/modules/preloader/include/getMetaTags.js b/modules/preloader/include/getMetaTags.js index 6186ddade..815cd9d17 100644 --- a/modules/preloader/include/getMetaTags.js +++ b/modules/preloader/include/getMetaTags.js @@ -6,18 +6,20 @@ Gest the meta[name="ethereum-dapp-url-bar-style"] meta tag const { ipcRenderer } = require('electron'); -module.export = (function () { - document.addEventListener('DOMContentLoaded', DOMContentLoaded, false); +module.export = (function() { + document.addEventListener('DOMContentLoaded', DOMContentLoaded, false); - function DOMContentLoaded(event) { - const appBar = document.querySelector('meta[name="ethereum-dapp-url-bar-style"]'); + function DOMContentLoaded(event) { + const appBar = document.querySelector( + 'meta[name="ethereum-dapp-url-bar-style"]' + ); - if (appBar) { - ipcRenderer.sendToHost('appBar', appBar.content); - } else { - ipcRenderer.sendToHost('appBar', null); - } - - document.removeEventListener('DOMContentLoaded', DOMContentLoaded, false); + if (appBar) { + ipcRenderer.sendToHost('appBar', appBar.content); + } else { + ipcRenderer.sendToHost('appBar', null); } -}()); + + document.removeEventListener('DOMContentLoaded', DOMContentLoaded, false); + } +})(); diff --git a/modules/preloader/include/legacyWeb3IpcProvider.js b/modules/preloader/include/legacyWeb3IpcProvider.js index aced1fc2d..2f3b19d7b 100644 --- a/modules/preloader/include/legacyWeb3IpcProvider.js +++ b/modules/preloader/include/legacyWeb3IpcProvider.js @@ -20,62 +20,63 @@ * @date 2015 */ -"use strict"; +'use strict'; var _ = require('underscore'); var errors = { - InvalidConnection: function (host){ - return new Error('CONNECTION ERROR: Couldn\'t connect to node '+ host +'.'); - }, - InvalidResponse: function (result){ - var message = !!result && !!result.error && !!result.error.message ? result.error.message : 'Invalid JSON RPC response: ' + JSON.stringify(result); - return new Error(message); - } + InvalidConnection: function(host) { + return new Error( + "CONNECTION ERROR: Couldn't connect to node " + host + '.' + ); + }, + InvalidResponse: function(result) { + var message = + !!result && !!result.error && !!result.error.message + ? result.error.message + : 'Invalid JSON RPC response: ' + JSON.stringify(result); + return new Error(message); + } }; +var IpcProvider = function(path, net) { + var _this = this; + this.responseCallbacks = {}; + this.path = path; -var IpcProvider = function (path, net) { - var _this = this; - this.responseCallbacks = {}; - this.path = path; - - this.connection = net.connect({path: this.path}); - - this.connection.on('error', function(e){ - console.error('IPC Connection Error', e); - _this._timeout(); - }); - - this.connection.on('end', function(){ - _this._timeout(); - }); - + this.connection = net.connect({ path: this.path }); - // LISTEN FOR CONNECTION RESPONSES - this.connection.on('data', function(data) { - /*jshint maxcomplexity: 6 */ + this.connection.on('error', function(e) { + console.error('IPC Connection Error', e); + _this._timeout(); + }); - _this._parseResponse(data.toString()).forEach(function(result){ + this.connection.on('end', function() { + _this._timeout(); + }); - var id = null; + // LISTEN FOR CONNECTION RESPONSES + this.connection.on('data', function(data) { + /*jshint maxcomplexity: 6 */ - // get the id which matches the returned id - if(_.isArray(result)) { - result.forEach(function(load){ - if(_this.responseCallbacks[load.id]) - id = load.id; - }); - } else { - id = result.id; - } + _this._parseResponse(data.toString()).forEach(function(result) { + var id = null; - // fire the callback - if(_this.responseCallbacks[id]) { - _this.responseCallbacks[id](null, result); - delete _this.responseCallbacks[id]; - } + // get the id which matches the returned id + if (_.isArray(result)) { + result.forEach(function(load) { + if (_this.responseCallbacks[load.id]) id = load.id; }); + } else { + id = result.id; + } + + // fire the callback + if (_this.responseCallbacks[id]) { + _this.responseCallbacks[id](null, result); + delete _this.responseCallbacks[id]; + } }); + }); }; /** @@ -85,54 +86,48 @@ Will parse the response and make an array out of it. @param {String} data */ IpcProvider.prototype._parseResponse = function(data) { - var _this = this, - returnValues = []; - - // DE-CHUNKER - var dechunkedData = data - .replace(/\}[\n\r]?\{/g,'}|--|{') // }{ - .replace(/\}\][\n\r]?\[\{/g,'}]|--|[{') // }][{ - .replace(/\}[\n\r]?\[\{/g,'}|--|[{') // }[{ - .replace(/\}\][\n\r]?\{/g,'}]|--|{') // }]{ - .split('|--|'); - - dechunkedData.forEach(function(data){ - - // prepend the last chunk - if(_this.lastChunk) - data = _this.lastChunk + data; - - var result = null; - - try { - result = JSON.parse(data); - - } catch(e) { - - _this.lastChunk = data; - - // start timeout to cancel all requests - clearTimeout(_this.lastChunkTimeout); - _this.lastChunkTimeout = setTimeout(function(){ - _this._timeout(); - throw errors.InvalidResponse(data); - }, 1000 * 15); + var _this = this, + returnValues = []; + + // DE-CHUNKER + var dechunkedData = data + .replace(/\}[\n\r]?\{/g, '}|--|{') // }{ + .replace(/\}\][\n\r]?\[\{/g, '}]|--|[{') // }][{ + .replace(/\}[\n\r]?\[\{/g, '}|--|[{') // }[{ + .replace(/\}\][\n\r]?\{/g, '}]|--|{') // }]{ + .split('|--|'); + + dechunkedData.forEach(function(data) { + // prepend the last chunk + if (_this.lastChunk) data = _this.lastChunk + data; + + var result = null; + + try { + result = JSON.parse(data); + } catch (e) { + _this.lastChunk = data; + + // start timeout to cancel all requests + clearTimeout(_this.lastChunkTimeout); + _this.lastChunkTimeout = setTimeout(function() { + _this._timeout(); + throw errors.InvalidResponse(data); + }, 1000 * 15); - return; - } + return; + } - // cancel timeout and set chunk to null - clearTimeout(_this.lastChunkTimeout); - _this.lastChunk = null; + // cancel timeout and set chunk to null + clearTimeout(_this.lastChunkTimeout); + _this.lastChunk = null; - if(result) - returnValues.push(result); - }); + if (result) returnValues.push(result); + }); - return returnValues; + return returnValues; }; - /** Get the adds a callback to the responseCallbacks object, which will be called if a response matching the response Id will arrive. @@ -140,11 +135,11 @@ which will be called if a response matching the response Id will arrive. @method _addResponseCallback */ IpcProvider.prototype._addResponseCallback = function(payload, callback) { - var id = payload.id || payload[0].id; - var method = payload.method || payload[0].method; + var id = payload.id || payload[0].id; + var method = payload.method || payload[0].method; - this.responseCallbacks[id] = callback; - this.responseCallbacks[id].method = method; + this.responseCallbacks[id] = callback; + this.responseCallbacks[id].method = method; }; /** @@ -153,62 +148,60 @@ Timeout all requests when the end/error event is fired @method _timeout */ IpcProvider.prototype._timeout = function() { - for(var key in this.responseCallbacks) { - if(this.responseCallbacks.hasOwnProperty(key)){ - this.responseCallbacks[key](errors.InvalidConnection('on IPC')); - delete this.responseCallbacks[key]; - } + for (var key in this.responseCallbacks) { + if (this.responseCallbacks.hasOwnProperty(key)) { + this.responseCallbacks[key](errors.InvalidConnection('on IPC')); + delete this.responseCallbacks[key]; } + } }; - /** Check if the current connection is still valid. @method isConnected */ IpcProvider.prototype.isConnected = function() { - var _this = this; + var _this = this; - // try reconnect, when connection is gone - if(!_this.connection.writable) - _this.connection.connect({path: _this.path}); + // try reconnect, when connection is gone + if (!_this.connection.writable) + _this.connection.connect({ path: _this.path }); - return !!this.connection.writable; + return !!this.connection.writable; }; -IpcProvider.prototype.send = function (payload) { - - if(this.connection.writeSync) { - var result; +IpcProvider.prototype.send = function(payload) { + if (this.connection.writeSync) { + var result; - // try reconnect, when connection is gone - if(!this.connection.writable) - this.connection.connect({path: this.path}); - - var data = this.connection.writeSync(JSON.stringify(payload)); - - try { - result = JSON.parse(data); - } catch(e) { - throw errors.InvalidResponse(data); - } + // try reconnect, when connection is gone + if (!this.connection.writable) this.connection.connect({ path: this.path }); - return result; + var data = this.connection.writeSync(JSON.stringify(payload)); - } else { - throw new Error('You tried to send "'+ payload.method +'" synchronously. Synchronous requests are not supported by the IPC provider.'); + try { + result = JSON.parse(data); + } catch (e) { + throw errors.InvalidResponse(data); } -}; -IpcProvider.prototype.sendAsync = function (payload, callback) { - // try reconnect, when connection is gone - if(!this.connection.writable) - this.connection.connect({path: this.path}); + return result; + } else { + throw new Error( + 'You tried to send "' + + payload.method + + '" synchronously. Synchronous requests are not supported by the IPC provider.' + ); + } +}; +IpcProvider.prototype.sendAsync = function(payload, callback) { + // try reconnect, when connection is gone + if (!this.connection.writable) this.connection.connect({ path: this.path }); - this.connection.write(JSON.stringify(payload)); - this._addResponseCallback(payload, callback); + this.connection.write(JSON.stringify(payload)); + this._addResponseCallback(payload, callback); }; module.exports = IpcProvider; diff --git a/modules/preloader/include/mistAPI.js b/modules/preloader/include/mistAPI.js index a542a3c71..1b985fdca 100644 --- a/modules/preloader/include/mistAPI.js +++ b/modules/preloader/include/mistAPI.js @@ -6,34 +6,35 @@ const _ = require('underscore'); const { ipcRenderer } = require('electron'); const packageJson = require('./../../../package.json'); - module.exports = () => { - let queue = []; - const prefix = 'entry_'; - const MIST_SUBMENU_LIMIT = 100; - - // todo: error handling - const filterAdd = (options) => { - if (!(options instanceof Object)) { return false; } - - return ['name'].every(e => e in options); - }; - - // filterId the id to only contain a-z A-Z 0-9 - const filterId = (str) => { - const filteredStr = String(str); - let newStr = ''; - if (filteredStr) { - for (let i = 0; i < filteredStr.length; i += 1) { - if (/[a-zA-Z0-9_-]/.test(filteredStr.charAt(i))) { - newStr += filteredStr.charAt(i); - } - } + let queue = []; + const prefix = 'entry_'; + const MIST_SUBMENU_LIMIT = 100; + + // todo: error handling + const filterAdd = options => { + if (!(options instanceof Object)) { + return false; + } + + return ['name'].every(e => e in options); + }; + + // filterId the id to only contain a-z A-Z 0-9 + const filterId = str => { + const filteredStr = String(str); + let newStr = ''; + if (filteredStr) { + for (let i = 0; i < filteredStr.length; i += 1) { + if (/[a-zA-Z0-9_-]/.test(filteredStr.charAt(i))) { + newStr += filteredStr.charAt(i); } - return newStr; - }; + } + } + return newStr; + }; - /** + /** Mist API Provides an API for all dapps, which specifically targets features from the Mist browser @@ -41,38 +42,47 @@ module.exports = () => { @class mist @constructor */ - const mist = { - callbacks: {}, - version: packageJson.version, - license: packageJson.license, - platform: process.platform, - requestAccount(callback) { - if (callback) { - if (!this.callbacks.connectAccount) { - this.callbacks.connectAccount = []; - } - this.callbacks.connectAccount.push(callback); - } - - ipcRenderer.send('mistAPI_requestAccount'); - }, - solidity: { - version: String(packageJson.dependencies.solc).match(/\d+\.\d+\.\d+/)[0], - }, - sounds: { - bip: function playSound() { - ipcRenderer.sendToHost('mistAPI_sound', `file://${__dirname}/../../../sounds/bip.mp3`); - }, - bloop: function playSound() { - ipcRenderer.sendToHost('mistAPI_sound', `file://${__dirname}/../../../sounds/bloop.mp3`); - }, - invite: function playSound() { - ipcRenderer.sendToHost('mistAPI_sound', `file://${__dirname}/../../../sounds/invite.mp3`); - }, - }, - menu: { - entries: {}, - /** + const mist = { + callbacks: {}, + version: packageJson.version, + license: packageJson.license, + platform: process.platform, + requestAccount(callback) { + if (callback) { + if (!this.callbacks.connectAccount) { + this.callbacks.connectAccount = []; + } + this.callbacks.connectAccount.push(callback); + } + + ipcRenderer.send('mistAPI_requestAccount'); + }, + solidity: { + version: String(packageJson.dependencies.solc).match(/\d+\.\d+\.\d+/)[0] + }, + sounds: { + bip: function playSound() { + ipcRenderer.sendToHost( + 'mistAPI_sound', + `file://${__dirname}/../../../sounds/bip.mp3` + ); + }, + bloop: function playSound() { + ipcRenderer.sendToHost( + 'mistAPI_sound', + `file://${__dirname}/../../../sounds/bloop.mp3` + ); + }, + invite: function playSound() { + ipcRenderer.sendToHost( + 'mistAPI_sound', + `file://${__dirname}/../../../sounds/invite.mp3` + ); + } + }, + menu: { + entries: {}, + /** Sets the badge text for the apps menu button Example @@ -82,10 +92,10 @@ module.exports = () => { @method setBadge @param {String} text */ - setBadge(text) { - ipcRenderer.sendToHost('mistAPI_setBadge', text); - }, - /** + setBadge(text) { + ipcRenderer.sendToHost('mistAPI_setBadge', text); + }, + /** Adds/Updates a menu entry Example @@ -104,43 +114,50 @@ module.exports = () => { @param {Object} options The menu options like {badge: 23, name: 'My Entry'} @param {Function} callback Change the callback to be called when the menu is pressed. */ - add(id, options, callback) { - const args = Array.prototype.slice.call(arguments); - callback = _.isFunction(args[args.length - 1]) ? args.pop() : null; - options = _.isObject(args[args.length - 1]) ? args.pop() : null; - id = _.isString(args[args.length - 1]) || _.isFinite(args[args.length - 1]) ? args.pop() : null; - - if (!filterAdd(options)) { return false; } - - const filteredId = prefix + filterId(id); - - // restricting to 100 menu entries - if (!(filteredId in this.entries) && - Object.keys(this.entries).length >= MIST_SUBMENU_LIMIT) { - return false; - } - - const entry = { - id: filteredId || 'mist_defaultId', - position: options.position, - selected: !!options.selected, - name: options.name, - badge: options.badge, - }; - - queue.push({ - action: 'addMenu', - entry, - }); - - if (callback) { - entry.callback = callback; - } - - this.entries[filteredId] = entry; - return true; - }, - /** + add(id, options, callback) { + const args = Array.prototype.slice.call(arguments); + callback = _.isFunction(args[args.length - 1]) ? args.pop() : null; + options = _.isObject(args[args.length - 1]) ? args.pop() : null; + id = + _.isString(args[args.length - 1]) || _.isFinite(args[args.length - 1]) + ? args.pop() + : null; + + if (!filterAdd(options)) { + return false; + } + + const filteredId = prefix + filterId(id); + + // restricting to 100 menu entries + if ( + !(filteredId in this.entries) && + Object.keys(this.entries).length >= MIST_SUBMENU_LIMIT + ) { + return false; + } + + const entry = { + id: filteredId || 'mist_defaultId', + position: options.position, + selected: !!options.selected, + name: options.name, + badge: options.badge + }; + + queue.push({ + action: 'addMenu', + entry + }); + + if (callback) { + entry.callback = callback; + } + + this.entries[filteredId] = entry; + return true; + }, + /** Updates a menu entry from the mist sidebar. @method update @@ -148,10 +165,10 @@ module.exports = () => { @param {Object} options The menu options like {badge: 23, name: 'My Entry'} @param {Function} callback Change the callback to be called when the menu is pressed. */ - update() { - this.add.apply(this, arguments); - }, - /** + update() { + this.add.apply(this, arguments); + }, + /** Removes a menu entry from the mist sidebar. @method remove @@ -160,68 +177,67 @@ module.exports = () => { @param {Object} options The menu options like {badge: 23, name: 'My Entry'} @param {Function} callback Change the callback to be called when the menu is pressed. */ - remove(id) { - const filteredId = prefix + filterId(id); + remove(id) { + const filteredId = prefix + filterId(id); - delete this.entries[filteredId]; + delete this.entries[filteredId]; - queue.push({ - action: 'removeMenu', - filteredId, - }); - }, - /** + queue.push({ + action: 'removeMenu', + filteredId + }); + }, + /** Marks a menu entry as selected @method select @param {String} id */ - select(id) { - const filteredId = prefix + filterId(id); - queue.push({ action: 'selectMenu', id: filteredId }); - - for (const e in this.entries) { - if ({}.hasOwnProperty.call(this.entries, e)) { - this.entries[e].selected = (e === filteredId); - } - } - }, - /** + select(id) { + const filteredId = prefix + filterId(id); + queue.push({ action: 'selectMenu', id: filteredId }); + + for (const e in this.entries) { + if ({}.hasOwnProperty.call(this.entries, e)) { + this.entries[e].selected = e === filteredId; + } + } + }, + /** Removes all menu entries. @method clear */ - clear() { - this.entries = {}; - queue.push({ action: 'clearMenu' }); - }, - }, - }; - - ipcRenderer.on('mistAPI_callMenuFunction', (e, id) => { - if (mist.menu.entries[id] && mist.menu.entries[id].callback) { - mist.menu.entries[id].callback(); - } - }); - - ipcRenderer.on('uiAction_windowMessage', (e, type, error, value) => { - console.log('uiAction_windowMessage',type, error, value); - if (mist.callbacks[type]) { - mist.callbacks[type].forEach((cb) => { - cb(error, value); - }); - delete mist.callbacks[type]; - } - }); - - // work up queue every 500ms - setInterval(() => { - if (queue.length > 0) { - ipcRenderer.sendToHost('mistAPI_menuChanges', queue); - queue = []; - } - }, 500); - - - return mist; + clear() { + this.entries = {}; + queue.push({ action: 'clearMenu' }); + } + } + }; + + ipcRenderer.on('mistAPI_callMenuFunction', (e, id) => { + if (mist.menu.entries[id] && mist.menu.entries[id].callback) { + mist.menu.entries[id].callback(); + } + }); + + ipcRenderer.on('uiAction_windowMessage', (e, type, error, value) => { + console.log('uiAction_windowMessage', type, error, value); + if (mist.callbacks[type]) { + mist.callbacks[type].forEach(cb => { + cb(error, value); + }); + delete mist.callbacks[type]; + } + }); + + // work up queue every 500ms + setInterval(() => { + if (queue.length > 0) { + ipcRenderer.sendToHost('mistAPI_menuChanges', queue); + queue = []; + } + }, 500); + + return mist; }; diff --git a/modules/preloader/include/openExternal.js b/modules/preloader/include/openExternal.js index 7c3510635..d596fc40f 100644 --- a/modules/preloader/include/openExternal.js +++ b/modules/preloader/include/openExternal.js @@ -6,20 +6,27 @@ Opens windows and popups const { shell } = require('electron'); - // open a[target="_blank"] in external browser -document.addEventListener('click', (e) => { +document.addEventListener( + 'click', + e => { let node = false; if (e.target.nodeName === 'A') { - node = e.target; + node = e.target; } else if (e.target.parentNode && e.target.parentNode.nodeName === 'A') { - node = e.target.parentNode; + node = e.target.parentNode; } // open in browser - if (node && node.attributes.target && node.attributes.target.value === '_blank') { - e.preventDefault(); - shell.openExternal(node.href); + if ( + node && + node.attributes.target && + node.attributes.target.value === '_blank' + ) { + e.preventDefault(); + shell.openExternal(node.href); } -}, false); + }, + false +); diff --git a/modules/preloader/include/setBasePath.js b/modules/preloader/include/setBasePath.js index 6dc84712c..938b38437 100644 --- a/modules/preloader/include/setBasePath.js +++ b/modules/preloader/include/setBasePath.js @@ -7,9 +7,13 @@ Sets the base path in production for the file protocol, so assets are loaded pro const { remote } = require('electron'); const path = require('path'); -module.exports = (appPath) => { - // set the base path for relative assets in production mode - if (remote.getGlobal('production') && ~location.origin.indexOf('file://')) { - window.basePathHref = `${String(path.resolve(`${__dirname}/../../${appPath}`)).replace(/\\/g, '/').replace('/interface', '/app.asar/interface')}/`; - } +module.exports = appPath => { + // set the base path for relative assets in production mode + if (remote.getGlobal('production') && ~location.origin.indexOf('file://')) { + window.basePathHref = `${String( + path.resolve(`${__dirname}/../../${appPath}`) + ) + .replace(/\\/g, '/') + .replace('/interface', '/app.asar/interface')}/`; + } }; diff --git a/modules/preloader/include/suppressWindowPrompt.js b/modules/preloader/include/suppressWindowPrompt.js index bbaa52156..74ca5a566 100644 --- a/modules/preloader/include/suppressWindowPrompt.js +++ b/modules/preloader/include/suppressWindowPrompt.js @@ -1,6 +1,5 @@ - module.exports = () => { - window.prompt = () => { - console.warn('Mist doesn\'t support window.prompt()'); - }; + window.prompt = () => { + console.warn("Mist doesn't support window.prompt()"); + }; }; diff --git a/modules/preloader/include/web3CurrentProvider.js b/modules/preloader/include/web3CurrentProvider.js index dfa412e0e..1beb5ad0f 100644 --- a/modules/preloader/include/web3CurrentProvider.js +++ b/modules/preloader/include/web3CurrentProvider.js @@ -8,15 +8,13 @@ const BigNumber = require('bignumber.js'); const ipcProviderWrapper = require('../../ipc/ipcProviderWrapper.js'); const LegacyWeb3IpcProvider = require('./legacyWeb3IpcProvider.js'); - // SET ETHEREUM PROVIDER // window.ethereumProvider = new Web3.providers.IpcProvider('', ipcProviderWrapper); - // LEGACY window.BigNumber = BigNumber; window.web3 = { - currentProvider: new LegacyWeb3IpcProvider('', ipcProviderWrapper) + currentProvider: new LegacyWeb3IpcProvider('', ipcProviderWrapper) }; // for now still add this too: WILL BE REMOVED with web3 1.0 diff --git a/modules/preloader/injected/BigNumber.js b/modules/preloader/injected/BigNumber.js index 05b0e781e..89a4661af 100644 --- a/modules/preloader/injected/BigNumber.js +++ b/modules/preloader/injected/BigNumber.js @@ -1,9 +1,1321 @@ +(function() { + /* bignumber.js v4.0.0 https://github.com/MikeMcl/bignumber.js/LICENCE */ + !(function(e) { + 'use strict'; + function n(e) { + function a(e, n) { + var t, + r, + i, + o, + u, + s, + l = this; + if (!(l instanceof a)) + return z && x(26, 'constructor call without new', e), new a(e, n); + if (null != n && V(n, 2, 64, C, 'base')) { + if (((n = 0 | n), (s = e + ''), 10 == n)) + return (l = new a(e instanceof a ? e : s)), I(l, B + l.e + 1, P); + if ( + ((o = 'number' == typeof e) && 0 * e != 0) || + !new RegExp( + '^-?' + (t = '[' + v.slice(0, n) + ']+') + '(?:\\.' + t + ')?$', + 37 > n ? 'i' : '' + ).test(s) + ) + return U(l, s, o, n); + o + ? ((l.s = 0 > 1 / e ? ((s = s.slice(1)), -1) : 1), + z && s.replace(/^0\.0*|\./, '').length > 15 && x(C, w, e), + (o = !1)) + : (l.s = 45 === s.charCodeAt(0) ? ((s = s.slice(1)), -1) : 1), + (s = A(s, 10, n, l.s)); + } else { + if (e instanceof a) + return ( + (l.s = e.s), + (l.e = e.e), + (l.c = (e = e.c) ? e.slice() : e), + void (C = 0) + ); + if ((o = 'number' == typeof e) && 0 * e == 0) { + if (((l.s = 0 > 1 / e ? ((e = -e), -1) : 1), e === ~~e)) { + for (r = 0, i = e; i >= 10; i /= 10, r++); + return (l.e = r), (l.c = [e]), void (C = 0); + } + s = e + ''; + } else { + if (!h.test((s = e + ''))) return U(l, s, o); + l.s = 45 === s.charCodeAt(0) ? ((s = s.slice(1)), -1) : 1; + } + } + for ( + (r = s.indexOf('.')) > -1 && (s = s.replace('.', '')), + (i = s.search(/e/i)) > 0 + ? (0 > r && (r = i), + (r += +s.slice(i + 1)), + (s = s.substring(0, i))) + : 0 > r && (r = s.length), + i = 0; + 48 === s.charCodeAt(i); + i++ + ); + for (u = s.length; 48 === s.charCodeAt(--u); ); + if ((s = s.slice(i, u + 1))) + if ( + ((u = s.length), + o && z && u > 15 && (e > y || e !== p(e)) && x(C, w, l.s * e), + (r = r - i - 1), + r > G) + ) + l.c = l.e = null; + else if ($ > r) l.c = [(l.e = 0)]; + else { + if ( + ((l.e = r), + (l.c = []), + (i = (r + 1) % b), + 0 > r && (i += b), + u > i) + ) { + for (i && l.c.push(+s.slice(0, i)), u -= b; u > i; ) + l.c.push(+s.slice(i, (i += b))); + (s = s.slice(i)), (i = b - s.length); + } else i -= u; + for (; i--; s += '0'); + l.c.push(+s); + } + else l.c = [(l.e = 0)]; + C = 0; + } + function A(e, n, t, i) { + var o, + u, + l, + c, + h, + g, + p, + d = e.indexOf('.'), + m = B, + w = P; + for ( + 37 > t && (e = e.toLowerCase()), + d >= 0 && + ((l = W), + (W = 0), + (e = e.replace('.', '')), + (p = new a(t)), + (h = p.pow(e.length - d)), + (W = l), + (p.c = s(f(r(h.c), h.e), 10, n)), + (p.e = p.c.length)), + g = s(e, t, n), + u = l = g.length; + 0 == g[--l]; + g.pop() + ); + if (!g[0]) return '0'; + if ( + (0 > d + ? --u + : ((h.c = g), + (h.e = u), + (h.s = i), + (h = L(h, p, m, w, n)), + (g = h.c), + (c = h.r), + (u = h.e)), + (o = u + m + 1), + (d = g[o]), + (l = n / 2), + (c = c || 0 > o || null != g[o + 1]), + (c = + 4 > w + ? (null != d || c) && (0 == w || w == (h.s < 0 ? 3 : 2)) + : d > l || + (d == l && + (4 == w || + c || + (6 == w && 1 & g[o - 1]) || + w == (h.s < 0 ? 8 : 7)))), + 1 > o || !g[0]) + ) + e = c ? f('1', -m) : '0'; + else { + if (((g.length = o), c)) + for (--n; ++g[--o] > n; ) (g[o] = 0), o || (++u, g.unshift(1)); + for (l = g.length; !g[--l]; ); + for (d = 0, e = ''; l >= d; e += v.charAt(g[d++])); + e = f(e, u); + } + return e; + } + function E(e, n, t, i) { + var o, u, s, c, h; + if (((t = null != t && V(t, 0, 8, i, m) ? 0 | t : P), !e.c)) + return e.toString(); + if (((o = e.c[0]), (s = e.e), null == n)) + (h = r(e.c)), + (h = 19 == i || (24 == i && q >= s) ? l(h, s) : f(h, s)); + else if ( + ((e = I(new a(e), n, t)), + (u = e.e), + (h = r(e.c)), + (c = h.length), + 19 == i || (24 == i && (u >= n || q >= u))) + ) { + for (; n > c; h += '0', c++); + h = l(h, u); + } else if (((n -= s), (h = f(h, u)), u + 1 > c)) { + if (--n > 0) for (h += '.'; n--; h += '0'); + } else if (((n += u - c), n > 0)) + for (u + 1 == c && (h += '.'); n--; h += '0'); + return e.s < 0 && o ? '-' + h : h; + } + function D(e, n) { + var t, + r, + i = 0; + for (u(e[0]) && (e = e[0]), t = new a(e[0]); ++i < e.length; ) { + if (((r = new a(e[i])), !r.s)) { + t = r; + break; + } + n.call(t, r) && (t = r); + } + return t; + } + function F(e, n, t, r, i) { + return ( + (n > e || e > t || e != c(e)) && + x( + r, + (i || 'decimal places') + + (n > e || e > t ? ' out of range' : ' not an integer'), + e + ), + !0 + ); + } + function _(e, n, t) { + for (var r = 1, i = n.length; !n[--i]; n.pop()); + for (i = n[0]; i >= 10; i /= 10, r++); + return ( + (t = r + t * b - 1) > G + ? (e.c = e.e = null) + : $ > t ? (e.c = [(e.e = 0)]) : ((e.e = t), (e.c = n)), + e + ); + } + function x(e, n, t) { + var r = new Error( + [ + 'new BigNumber', + 'cmp', + 'config', + 'div', + 'divToInt', + 'eq', + 'gt', + 'gte', + 'lt', + 'lte', + 'minus', + 'mod', + 'plus', + 'precision', + 'random', + 'round', + 'shift', + 'times', + 'toDigits', + 'toExponential', + 'toFixed', + 'toFormat', + 'toFraction', + 'pow', + 'toPrecision', + 'toString', + 'BigNumber' + ][e] + + '() ' + + n + + ': ' + + t + ); + throw ((r.name = 'BigNumber Error'), (C = 0), r); + } + function I(e, n, t, r) { + var i, + o, + u, + s, + l, + f, + c, + a = e.c, + h = O; + if (a) { + e: { + for (i = 1, s = a[0]; s >= 10; s /= 10, i++); + if (((o = n - i), 0 > o)) + (o += b), + (u = n), + (l = a[(f = 0)]), + (c = ((l / h[i - u - 1]) % 10) | 0); + else if (((f = g((o + 1) / b)), f >= a.length)) { + if (!r) break e; + for (; a.length <= f; a.push(0)); + (l = c = 0), (i = 1), (o %= b), (u = o - b + 1); + } else { + for (l = s = a[f], i = 1; s >= 10; s /= 10, i++); + (o %= b), + (u = o - b + i), + (c = 0 > u ? 0 : ((l / h[i - u - 1]) % 10) | 0); + } + if ( + ((r = + r || + 0 > n || + null != a[f + 1] || + (0 > u ? l : l % h[i - u - 1])), + (r = + 4 > t + ? (c || r) && (0 == t || t == (e.s < 0 ? 3 : 2)) + : c > 5 || + (5 == c && + (4 == t || + r || + (6 == t && + ((o > 0 ? (u > 0 ? l / h[i - u] : 0) : a[f - 1]) % + 10) & + 1) || + t == (e.s < 0 ? 8 : 7)))), + 1 > n || !a[0]) + ) + return ( + (a.length = 0), + r + ? ((n -= e.e + 1), + (a[0] = h[(b - n % b) % b]), + (e.e = -n || 0)) + : (a[0] = e.e = 0), + e + ); + if ( + (0 == o + ? ((a.length = f), (s = 1), f--) + : ((a.length = f + 1), + (s = h[b - o]), + (a[f] = u > 0 ? p((l / h[i - u]) % h[u]) * s : 0)), + r) + ) + for (;;) { + if (0 == f) { + for (o = 1, u = a[0]; u >= 10; u /= 10, o++); + for (u = a[0] += s, s = 1; u >= 10; u /= 10, s++); + o != s && (e.e++, a[0] == N && (a[0] = 1)); + break; + } + if (((a[f] += s), a[f] != N)) break; + (a[f--] = 0), (s = 1); + } + for (o = a.length; 0 === a[--o]; a.pop()); + } + e.e > G ? (e.c = e.e = null) : e.e < $ && (e.c = [(e.e = 0)]); + } + return e; + } + var L, + U, + C = 0, + M = a.prototype, + T = new a(1), + B = 20, + P = 4, + q = -7, + k = 21, + $ = -1e7, + G = 1e7, + z = !0, + V = F, + j = !1, + H = 1, + W = 0, + J = { + decimalSeparator: '.', + groupSeparator: ',', + groupSize: 3, + secondaryGroupSize: 0, + fractionGroupSeparator: ' ', + fractionGroupSize: 0 + }; + return ( + (a.another = n), + (a.ROUND_UP = 0), + (a.ROUND_DOWN = 1), + (a.ROUND_CEIL = 2), + (a.ROUND_FLOOR = 3), + (a.ROUND_HALF_UP = 4), + (a.ROUND_HALF_DOWN = 5), + (a.ROUND_HALF_EVEN = 6), + (a.ROUND_HALF_CEIL = 7), + (a.ROUND_HALF_FLOOR = 8), + (a.EUCLID = 9), + (a.config = a.set = function() { + var e, + n, + t = 0, + r = {}, + i = arguments, + s = i[0], + l = + s && 'object' == typeof s + ? function() { + return s.hasOwnProperty(n) ? null != (e = s[n]) : void 0; + } + : function() { + return i.length > t ? null != (e = i[t++]) : void 0; + }; + return ( + l((n = 'DECIMAL_PLACES')) && V(e, 0, S, 2, n) && (B = 0 | e), + (r[n] = B), + l((n = 'ROUNDING_MODE')) && V(e, 0, 8, 2, n) && (P = 0 | e), + (r[n] = P), + l((n = 'EXPONENTIAL_AT')) && + (u(e) + ? V(e[0], -S, 0, 2, n) && + V(e[1], 0, S, 2, n) && + ((q = 0 | e[0]), (k = 0 | e[1])) + : V(e, -S, S, 2, n) && (q = -(k = 0 | (0 > e ? -e : e)))), + (r[n] = [q, k]), + l((n = 'RANGE')) && + (u(e) + ? V(e[0], -S, -1, 2, n) && + V(e[1], 1, S, 2, n) && + (($ = 0 | e[0]), (G = 0 | e[1])) + : V(e, -S, S, 2, n) && + (0 | e + ? ($ = -(G = 0 | (0 > e ? -e : e))) + : z && x(2, n + ' cannot be zero', e))), + (r[n] = [$, G]), + l((n = 'ERRORS')) && + (e === !!e || 1 === e || 0 === e + ? ((C = 0), (V = (z = !!e) ? F : o)) + : z && x(2, n + d, e)), + (r[n] = z), + l((n = 'CRYPTO')) && + (e === !0 || e === !1 || 1 === e || 0 === e + ? e + ? ((e = 'undefined' == typeof crypto), + !e && + crypto && + (crypto.getRandomValues || crypto.randomBytes) + ? (j = !0) + : z + ? x(2, 'crypto unavailable', e ? void 0 : crypto) + : (j = !1)) + : (j = !1) + : z && x(2, n + d, e)), + (r[n] = j), + l((n = 'MODULO_MODE')) && V(e, 0, 9, 2, n) && (H = 0 | e), + (r[n] = H), + l((n = 'POW_PRECISION')) && V(e, 0, S, 2, n) && (W = 0 | e), + (r[n] = W), + l((n = 'FORMAT')) && + ('object' == typeof e + ? (J = e) + : z && x(2, n + ' not an object', e)), + (r[n] = J), + r + ); + }), + (a.max = function() { + return D(arguments, M.lt); + }), + (a.min = function() { + return D(arguments, M.gt); + }), + (a.random = (function() { + var e = 9007199254740992, + n = + (Math.random() * e) & 2097151 + ? function() { + return p(Math.random() * e); + } + : function() { + return ( + 8388608 * ((1073741824 * Math.random()) | 0) + + ((8388608 * Math.random()) | 0) + ); + }; + return function(e) { + var t, + r, + i, + o, + u, + s = 0, + l = [], + f = new a(T); + if ( + ((e = null != e && V(e, 0, S, 14) ? 0 | e : B), (o = g(e / b)), j) + ) + if (crypto.getRandomValues) { + for ( + t = crypto.getRandomValues(new Uint32Array((o *= 2))); + o > s; -(function () { + ) + (u = 131072 * t[s] + (t[s + 1] >>> 11)), + u >= 9e15 + ? ((r = crypto.getRandomValues(new Uint32Array(2))), + (t[s] = r[0]), + (t[s + 1] = r[1])) + : (l.push(u % 1e14), (s += 2)); + s = o / 2; + } else if (crypto.randomBytes) { + for (t = crypto.randomBytes((o *= 7)); o > s; ) + (u = + 281474976710656 * (31 & t[s]) + + 1099511627776 * t[s + 1] + + 4294967296 * t[s + 2] + + 16777216 * t[s + 3] + + (t[s + 4] << 16) + + (t[s + 5] << 8) + + t[s + 6]), + u >= 9e15 + ? crypto.randomBytes(7).copy(t, s) + : (l.push(u % 1e14), (s += 7)); + s = o / 7; + } else (j = !1), z && x(14, 'crypto unavailable', crypto); + if (!j) for (; o > s; ) (u = n()), 9e15 > u && (l[s++] = u % 1e14); + for ( + o = l[--s], + e %= b, + o && e && ((u = O[b - e]), (l[s] = p(o / u) * u)); + 0 === l[s]; + l.pop(), s-- + ); + if (0 > s) l = [(i = 0)]; + else { + for (i = -1; 0 === l[0]; l.shift(), i -= b); + for (s = 1, u = l[0]; u >= 10; u /= 10, s++); + b > s && (i -= b - s); + } + return (f.e = i), (f.c = l), f; + }; + })()), + (L = (function() { + function e(e, n, t) { + var r, + i, + o, + u, + s = 0, + l = e.length, + f = n % R, + c = (n / R) | 0; + for (e = e.slice(); l--; ) + (o = e[l] % R), + (u = (e[l] / R) | 0), + (r = c * o + u * f), + (i = f * o + (r % R) * R + s), + (s = ((i / t) | 0) + ((r / R) | 0) + c * u), + (e[l] = i % t); + return s && e.unshift(s), e; + } + function n(e, n, t, r) { + var i, o; + if (t != r) o = t > r ? 1 : -1; + else + for (i = o = 0; t > i; i++) + if (e[i] != n[i]) { + o = e[i] > n[i] ? 1 : -1; + break; + } + return o; + } + function r(e, n, t, r) { + for (var i = 0; t--; ) + (e[t] -= i), + (i = e[t] < n[t] ? 1 : 0), + (e[t] = i * r + e[t] - n[t]); + for (; !e[0] && e.length > 1; e.shift()); + } + return function(i, o, u, s, l) { + var f, + c, + h, + g, + d, + m, + w, + v, + y, + O, + R, + S, + A, + E, + D, + F, + _, + x = i.s == o.s ? 1 : -1, + L = i.c, + U = o.c; + if (!(L && L[0] && U && U[0])) + return new a( + i.s && o.s && (L ? !U || L[0] != U[0] : U) + ? (L && 0 == L[0]) || !U ? 0 * x : x / 0 + : NaN + ); + for ( + v = new a(x), + y = v.c = [], + c = i.e - o.e, + x = u + c + 1, + l || + ((l = N), (c = t(i.e / b) - t(o.e / b)), (x = (x / b) | 0)), + h = 0; + U[h] == (L[h] || 0); + h++ + ); + if ((U[h] > (L[h] || 0) && c--, 0 > x)) y.push(1), (g = !0); + else { + for ( + E = L.length, + F = U.length, + h = 0, + x += 2, + d = p(l / (U[0] + 1)), + d > 1 && + ((U = e(U, d, l)), + (L = e(L, d, l)), + (F = U.length), + (E = L.length)), + A = F, + O = L.slice(0, F), + R = O.length; + F > R; + O[R++] = 0 + ); + (_ = U.slice()), _.unshift(0), (D = U[0]), U[1] >= l / 2 && D++; + do { + if (((d = 0), (f = n(U, O, F, R)), 0 > f)) { + if ( + ((S = O[0]), + F != R && (S = S * l + (O[1] || 0)), + (d = p(S / D)), + d > 1) + ) + for ( + d >= l && (d = l - 1), + m = e(U, d, l), + w = m.length, + R = O.length; + 1 == n(m, O, w, R); -/* bignumber.js v4.0.0 https://github.com/MikeMcl/bignumber.js/LICENCE */ -!function(e){"use strict";function n(e){function a(e,n){var t,r,i,o,u,s,l=this;if(!(l instanceof a))return z&&x(26,"constructor call without new",e),new a(e,n);if(null!=n&&V(n,2,64,C,"base")){if(n=0|n,s=e+"",10==n)return l=new a(e instanceof a?e:s),I(l,B+l.e+1,P);if((o="number"==typeof e)&&0*e!=0||!new RegExp("^-?"+(t="["+v.slice(0,n)+"]+")+"(?:\\."+t+")?$",37>n?"i":"").test(s))return U(l,s,o,n);o?(l.s=0>1/e?(s=s.slice(1),-1):1,z&&s.replace(/^0\.0*|\./,"").length>15&&x(C,w,e),o=!1):l.s=45===s.charCodeAt(0)?(s=s.slice(1),-1):1,s=A(s,10,n,l.s)}else{if(e instanceof a)return l.s=e.s,l.e=e.e,l.c=(e=e.c)?e.slice():e,void(C=0);if((o="number"==typeof e)&&0*e==0){if(l.s=0>1/e?(e=-e,-1):1,e===~~e){for(r=0,i=e;i>=10;i/=10,r++);return l.e=r,l.c=[e],void(C=0)}s=e+""}else{if(!h.test(s=e+""))return U(l,s,o);l.s=45===s.charCodeAt(0)?(s=s.slice(1),-1):1}}for((r=s.indexOf("."))>-1&&(s=s.replace(".","")),(i=s.search(/e/i))>0?(0>r&&(r=i),r+=+s.slice(i+1),s=s.substring(0,i)):0>r&&(r=s.length),i=0;48===s.charCodeAt(i);i++);for(u=s.length;48===s.charCodeAt(--u););if(s=s.slice(i,u+1))if(u=s.length,o&&z&&u>15&&(e>y||e!==p(e))&&x(C,w,l.s*e),r=r-i-1,r>G)l.c=l.e=null;else if($>r)l.c=[l.e=0];else{if(l.e=r,l.c=[],i=(r+1)%b,0>r&&(i+=b),u>i){for(i&&l.c.push(+s.slice(0,i)),u-=b;u>i;)l.c.push(+s.slice(i,i+=b));s=s.slice(i),i=b-s.length}else i-=u;for(;i--;s+="0");l.c.push(+s)}else l.c=[l.e=0];C=0}function A(e,n,t,i){var o,u,l,c,h,g,p,d=e.indexOf("."),m=B,w=P;for(37>t&&(e=e.toLowerCase()),d>=0&&(l=W,W=0,e=e.replace(".",""),p=new a(t),h=p.pow(e.length-d),W=l,p.c=s(f(r(h.c),h.e),10,n),p.e=p.c.length),g=s(e,t,n),u=l=g.length;0==g[--l];g.pop());if(!g[0])return"0";if(0>d?--u:(h.c=g,h.e=u,h.s=i,h=L(h,p,m,w,n),g=h.c,c=h.r,u=h.e),o=u+m+1,d=g[o],l=n/2,c=c||0>o||null!=g[o+1],c=4>w?(null!=d||c)&&(0==w||w==(h.s<0?3:2)):d>l||d==l&&(4==w||c||6==w&&1&g[o-1]||w==(h.s<0?8:7)),1>o||!g[0])e=c?f("1",-m):"0";else{if(g.length=o,c)for(--n;++g[--o]>n;)g[o]=0,o||(++u,g.unshift(1));for(l=g.length;!g[--l];);for(d=0,e="";l>=d;e+=v.charAt(g[d++]));e=f(e,u)}return e}function E(e,n,t,i){var o,u,s,c,h;if(t=null!=t&&V(t,0,8,i,m)?0|t:P,!e.c)return e.toString();if(o=e.c[0],s=e.e,null==n)h=r(e.c),h=19==i||24==i&&q>=s?l(h,s):f(h,s);else if(e=I(new a(e),n,t),u=e.e,h=r(e.c),c=h.length,19==i||24==i&&(u>=n||q>=u)){for(;n>c;h+="0",c++);h=l(h,u)}else if(n-=s,h=f(h,u),u+1>c){if(--n>0)for(h+=".";n--;h+="0");}else if(n+=u-c,n>0)for(u+1==c&&(h+=".");n--;h+="0");return e.s<0&&o?"-"+h:h}function D(e,n){var t,r,i=0;for(u(e[0])&&(e=e[0]),t=new a(e[0]);++ie||e>t||e!=c(e))&&x(r,(i||"decimal places")+(n>e||e>t?" out of range":" not an integer"),e),!0}function _(e,n,t){for(var r=1,i=n.length;!n[--i];n.pop());for(i=n[0];i>=10;i/=10,r++);return(t=r+t*b-1)>G?e.c=e.e=null:$>t?e.c=[e.e=0]:(e.e=t,e.c=n),e}function x(e,n,t){var r=new Error(["new BigNumber","cmp","config","div","divToInt","eq","gt","gte","lt","lte","minus","mod","plus","precision","random","round","shift","times","toDigits","toExponential","toFixed","toFormat","toFraction","pow","toPrecision","toString","BigNumber"][e]+"() "+n+": "+t);throw r.name="BigNumber Error",C=0,r}function I(e,n,t,r){var i,o,u,s,l,f,c,a=e.c,h=O;if(a){e:{for(i=1,s=a[0];s>=10;s/=10,i++);if(o=n-i,0>o)o+=b,u=n,l=a[f=0],c=l/h[i-u-1]%10|0;else if(f=g((o+1)/b),f>=a.length){if(!r)break e;for(;a.length<=f;a.push(0));l=c=0,i=1,o%=b,u=o-b+1}else{for(l=s=a[f],i=1;s>=10;s/=10,i++);o%=b,u=o-b+i,c=0>u?0:l/h[i-u-1]%10|0}if(r=r||0>n||null!=a[f+1]||(0>u?l:l%h[i-u-1]),r=4>t?(c||r)&&(0==t||t==(e.s<0?3:2)):c>5||5==c&&(4==t||r||6==t&&(o>0?u>0?l/h[i-u]:0:a[f-1])%10&1||t==(e.s<0?8:7)),1>n||!a[0])return a.length=0,r?(n-=e.e+1,a[0]=h[(b-n%b)%b],e.e=-n||0):a[0]=e.e=0,e;if(0==o?(a.length=f,s=1,f--):(a.length=f+1,s=h[b-o],a[f]=u>0?p(l/h[i-u]%h[u])*s:0),r)for(;;){if(0==f){for(o=1,u=a[0];u>=10;u/=10,o++);for(u=a[0]+=s,s=1;u>=10;u/=10,s++);o!=s&&(e.e++,a[0]==N&&(a[0]=1));break}if(a[f]+=s,a[f]!=N)break;a[f--]=0,s=1}for(o=a.length;0===a[--o];a.pop());}e.e>G?e.c=e.e=null:e.e<$&&(e.c=[e.e=0])}return e}var L,U,C=0,M=a.prototype,T=new a(1),B=20,P=4,q=-7,k=21,$=-1e7,G=1e7,z=!0,V=F,j=!1,H=1,W=0,J={decimalSeparator:".",groupSeparator:",",groupSize:3,secondaryGroupSize:0,fractionGroupSeparator:" ",fractionGroupSize:0};return a.another=n,a.ROUND_UP=0,a.ROUND_DOWN=1,a.ROUND_CEIL=2,a.ROUND_FLOOR=3,a.ROUND_HALF_UP=4,a.ROUND_HALF_DOWN=5,a.ROUND_HALF_EVEN=6,a.ROUND_HALF_CEIL=7,a.ROUND_HALF_FLOOR=8,a.EUCLID=9,a.config=a.set=function(){var e,n,t=0,r={},i=arguments,s=i[0],l=s&&"object"==typeof s?function(){return s.hasOwnProperty(n)?null!=(e=s[n]):void 0}:function(){return i.length>t?null!=(e=i[t++]):void 0};return l(n="DECIMAL_PLACES")&&V(e,0,S,2,n)&&(B=0|e),r[n]=B,l(n="ROUNDING_MODE")&&V(e,0,8,2,n)&&(P=0|e),r[n]=P,l(n="EXPONENTIAL_AT")&&(u(e)?V(e[0],-S,0,2,n)&&V(e[1],0,S,2,n)&&(q=0|e[0],k=0|e[1]):V(e,-S,S,2,n)&&(q=-(k=0|(0>e?-e:e)))),r[n]=[q,k],l(n="RANGE")&&(u(e)?V(e[0],-S,-1,2,n)&&V(e[1],1,S,2,n)&&($=0|e[0],G=0|e[1]):V(e,-S,S,2,n)&&(0|e?$=-(G=0|(0>e?-e:e)):z&&x(2,n+" cannot be zero",e))),r[n]=[$,G],l(n="ERRORS")&&(e===!!e||1===e||0===e?(C=0,V=(z=!!e)?F:o):z&&x(2,n+d,e)),r[n]=z,l(n="CRYPTO")&&(e===!0||e===!1||1===e||0===e?e?(e="undefined"==typeof crypto,!e&&crypto&&(crypto.getRandomValues||crypto.randomBytes)?j=!0:z?x(2,"crypto unavailable",e?void 0:crypto):j=!1):j=!1:z&&x(2,n+d,e)),r[n]=j,l(n="MODULO_MODE")&&V(e,0,9,2,n)&&(H=0|e),r[n]=H,l(n="POW_PRECISION")&&V(e,0,S,2,n)&&(W=0|e),r[n]=W,l(n="FORMAT")&&("object"==typeof e?J=e:z&&x(2,n+" not an object",e)),r[n]=J,r},a.max=function(){return D(arguments,M.lt)},a.min=function(){return D(arguments,M.gt)},a.random=function(){var e=9007199254740992,n=Math.random()*e&2097151?function(){return p(Math.random()*e)}:function(){return 8388608*(1073741824*Math.random()|0)+(8388608*Math.random()|0)};return function(e){var t,r,i,o,u,s=0,l=[],f=new a(T);if(e=null!=e&&V(e,0,S,14)?0|e:B,o=g(e/b),j)if(crypto.getRandomValues){for(t=crypto.getRandomValues(new Uint32Array(o*=2));o>s;)u=131072*t[s]+(t[s+1]>>>11),u>=9e15?(r=crypto.getRandomValues(new Uint32Array(2)),t[s]=r[0],t[s+1]=r[1]):(l.push(u%1e14),s+=2);s=o/2}else if(crypto.randomBytes){for(t=crypto.randomBytes(o*=7);o>s;)u=281474976710656*(31&t[s])+1099511627776*t[s+1]+4294967296*t[s+2]+16777216*t[s+3]+(t[s+4]<<16)+(t[s+5]<<8)+t[s+6],u>=9e15?crypto.randomBytes(7).copy(t,s):(l.push(u%1e14),s+=7);s=o/7}else j=!1,z&&x(14,"crypto unavailable",crypto);if(!j)for(;o>s;)u=n(),9e15>u&&(l[s++]=u%1e14);for(o=l[--s],e%=b,o&&e&&(u=O[b-e],l[s]=p(o/u)*u);0===l[s];l.pop(),s--);if(0>s)l=[i=0];else{for(i=-1;0===l[0];l.shift(),i-=b);for(s=1,u=l[0];u>=10;u/=10,s++);b>s&&(i-=b-s)}return f.e=i,f.c=l,f}}(),L=function(){function e(e,n,t){var r,i,o,u,s=0,l=e.length,f=n%R,c=n/R|0;for(e=e.slice();l--;)o=e[l]%R,u=e[l]/R|0,r=c*o+u*f,i=f*o+r%R*R+s,s=(i/t|0)+(r/R|0)+c*u,e[l]=i%t;return s&&e.unshift(s),e}function n(e,n,t,r){var i,o;if(t!=r)o=t>r?1:-1;else for(i=o=0;t>i;i++)if(e[i]!=n[i]){o=e[i]>n[i]?1:-1;break}return o}function r(e,n,t,r){for(var i=0;t--;)e[t]-=i,i=e[t]1;e.shift());}return function(i,o,u,s,l){var f,c,h,g,d,m,w,v,y,O,R,S,A,E,D,F,_,x=i.s==o.s?1:-1,L=i.c,U=o.c;if(!(L&&L[0]&&U&&U[0]))return new a(i.s&&o.s&&(L?!U||L[0]!=U[0]:U)?L&&0==L[0]||!U?0*x:x/0:NaN);for(v=new a(x),y=v.c=[],c=i.e-o.e,x=u+c+1,l||(l=N,c=t(i.e/b)-t(o.e/b),x=x/b|0),h=0;U[h]==(L[h]||0);h++);if(U[h]>(L[h]||0)&&c--,0>x)y.push(1),g=!0;else{for(E=L.length,F=U.length,h=0,x+=2,d=p(l/(U[0]+1)),d>1&&(U=e(U,d,l),L=e(L,d,l),F=U.length,E=L.length),A=F,O=L.slice(0,F),R=O.length;F>R;O[R++]=0);_=U.slice(),_.unshift(0),D=U[0],U[1]>=l/2&&D++;do{if(d=0,f=n(U,O,F,R),0>f){if(S=O[0],F!=R&&(S=S*l+(O[1]||0)),d=p(S/D),d>1)for(d>=l&&(d=l-1),m=e(U,d,l),w=m.length,R=O.length;1==n(m,O,w,R);)d--,r(m,w>F?_:U,w,l),w=m.length,f=1;else 0==d&&(f=d=1),m=U.slice(),w=m.length;if(R>w&&m.unshift(0),r(O,m,R,l),R=O.length,-1==f)for(;n(U,O,F,R)<1;)d++,r(O,R>F?_:U,R,l),R=O.length}else 0===f&&(d++,O=[0]);y[h++]=d,O[0]?O[R++]=L[A]||0:(O=[L[A]],R=1)}while((A++=10;x/=10,h++);I(v,u+(v.e=h+c*b-1)+1,s,g)}else v.e=c,v.r=+g;return v}}(),U=function(){var e=/^(-?)0([xbo])(?=\w[\w.]*$)/i,n=/^([^.]+)\.$/,t=/^\.([^.]+)$/,r=/^-?(Infinity|NaN)$/,i=/^\s*\+(?=[\w.])|^\s+|\s+$/g;return function(o,u,s,l){var f,c=s?u:u.replace(i,"");if(r.test(c))o.s=isNaN(c)?null:0>c?-1:1;else{if(!s&&(c=c.replace(e,function(e,n,t){return f="x"==(t=t.toLowerCase())?16:"b"==t?2:8,l&&l!=f?e:n}),l&&(f=l,c=c.replace(n,"$1").replace(t,"0.$1")),u!=c))return new a(c,f);z&&x(C,"not a"+(l?" base "+l:"")+" number",u),o.s=null}o.c=o.e=null,C=0}}(),M.absoluteValue=M.abs=function(){var e=new a(this);return e.s<0&&(e.s=1),e},M.ceil=function(){return I(new a(this),this.e+1,2)},M.comparedTo=M.cmp=function(e,n){return C=1,i(this,new a(e,n))},M.decimalPlaces=M.dp=function(){var e,n,r=this.c;if(!r)return null;if(e=((n=r.length-1)-t(this.e/b))*b,n=r[n])for(;n%10==0;n/=10,e--);return 0>e&&(e=0),e},M.dividedBy=M.div=function(e,n){return C=3,L(this,new a(e,n),B,P)},M.dividedToIntegerBy=M.divToInt=function(e,n){return C=4,L(this,new a(e,n),0,1)},M.equals=M.eq=function(e,n){return C=5,0===i(this,new a(e,n))},M.floor=function(){return I(new a(this),this.e+1,3)},M.greaterThan=M.gt=function(e,n){return C=6,i(this,new a(e,n))>0},M.greaterThanOrEqualTo=M.gte=function(e,n){return C=7,1===(n=i(this,new a(e,n)))||0===n},M.isFinite=function(){return!!this.c},M.isInteger=M.isInt=function(){return!!this.c&&t(this.e/b)>this.c.length-2},M.isNaN=function(){return!this.s},M.isNegative=M.isNeg=function(){return this.s<0},M.isZero=function(){return!!this.c&&0==this.c[0]},M.lessThan=M.lt=function(e,n){return C=8,i(this,new a(e,n))<0},M.lessThanOrEqualTo=M.lte=function(e,n){return C=9,-1===(n=i(this,new a(e,n)))||0===n},M.minus=M.sub=function(e,n){var r,i,o,u,s=this,l=s.s;if(C=10,e=new a(e,n),n=e.s,!l||!n)return new a(NaN);if(l!=n)return e.s=-n,s.plus(e);var f=s.e/b,c=e.e/b,h=s.c,g=e.c;if(!f||!c){if(!h||!g)return h?(e.s=-n,e):new a(g?s:NaN);if(!h[0]||!g[0])return g[0]?(e.s=-n,e):new a(h[0]?s:3==P?-0:0)}if(f=t(f),c=t(c),h=h.slice(),l=f-c){for((u=0>l)?(l=-l,o=h):(c=f,o=g),o.reverse(),n=l;n--;o.push(0));o.reverse()}else for(i=(u=(l=h.length)<(n=g.length))?l:n,l=n=0;i>n;n++)if(h[n]!=g[n]){u=h[n]0)for(;n--;h[r++]=0);for(n=N-1;i>l;){if(h[--i]0?(s=u,r=f):(o=-o,r=l),r.reverse();o--;r.push(0));r.reverse()}for(o=l.length,n=f.length,0>o-n&&(r=f,f=l,l=r,n=o),o=0;n;)o=(l[--n]=l[n]+f[n]+o)/N|0,l[n]=N===l[n]?0:l[n]%N;return o&&(l.unshift(o),++s),_(e,l,s)},M.precision=M.sd=function(e){var n,t,r=this,i=r.c;if(null!=e&&e!==!!e&&1!==e&&0!==e&&(z&&x(13,"argument"+d,e),e!=!!e&&(e=null)),!i)return null;if(t=i.length-1,n=t*b+1,t=i[t]){for(;t%10==0;t/=10,n--);for(t=i[0];t>=10;t/=10,n++);}return e&&r.e+1>n&&(n=r.e+1),n},M.round=function(e,n){var t=new a(this);return(null==e||V(e,0,S,15))&&I(t,~~e+this.e+1,null!=n&&V(n,0,8,15,m)?0|n:P),t},M.shift=function(e){var n=this;return V(e,-y,y,16,"argument")?n.times("1e"+c(e)):new a(n.c&&n.c[0]&&(-y>e||e>y)?n.s*(0>e?0:1/0):n)},M.squareRoot=M.sqrt=function(){var e,n,i,o,u,s=this,l=s.c,f=s.s,c=s.e,h=B+4,g=new a("0.5");if(1!==f||!l||!l[0])return new a(!f||0>f&&(!l||l[0])?NaN:l?s:1/0);if(f=Math.sqrt(+s),0==f||f==1/0?(n=r(l),(n.length+c)%2==0&&(n+="0"),f=Math.sqrt(n),c=t((c+1)/2)-(0>c||c%2),f==1/0?n="1e"+c:(n=f.toExponential(),n=n.slice(0,n.indexOf("e")+1)+c),i=new a(n)):i=new a(f+""),i.c[0])for(c=i.e,f=c+h,3>f&&(f=0);;)if(u=i,i=g.times(u.plus(L(s,u,h,1))),r(u.c).slice(0,f)===(n=r(i.c)).slice(0,f)){if(i.ef&&(m=O,O=S,S=m,o=f,f=g,g=o),o=f+g,m=[];o--;m.push(0));for(w=N,v=R,o=g;--o>=0;){for(r=0,p=S[o]%v,d=S[o]/v|0,s=f,u=o+s;u>o;)c=O[--s]%v,h=O[s]/v|0,l=d*c+h*p,c=p*c+l%v*v+m[u]+r,r=(c/w|0)+(l/v|0)+d*h,m[u--]=c%w;m[u]=r}return r?++i:m.shift(),_(e,m,i)},M.toDigits=function(e,n){var t=new a(this);return e=null!=e&&V(e,1,S,18,"precision")?0|e:null,n=null!=n&&V(n,0,8,18,m)?0|n:P,e?I(t,e,n):t},M.toExponential=function(e,n){return E(this,null!=e&&V(e,0,S,19)?~~e+1:null,n,19)},M.toFixed=function(e,n){return E(this,null!=e&&V(e,0,S,20)?~~e+this.e+1:null,n,20)},M.toFormat=function(e,n){var t=E(this,null!=e&&V(e,0,S,21)?~~e+this.e+1:null,n,21);if(this.c){var r,i=t.split("."),o=+J.groupSize,u=+J.secondaryGroupSize,s=J.groupSeparator,l=i[0],f=i[1],c=this.s<0,a=c?l.slice(1):l,h=a.length;if(u&&(r=o,o=u,u=r,h-=r),o>0&&h>0){for(r=h%o||o,l=a.substr(0,r);h>r;r+=o)l+=s+a.substr(r,o);u>0&&(l+=s+a.slice(r)),c&&(l="-"+l)}t=f?l+J.decimalSeparator+((u=+J.fractionGroupSize)?f.replace(new RegExp("\\d{"+u+"}\\B","g"),"$&"+J.fractionGroupSeparator):f):l}return t},M.toFraction=function(e){var n,t,i,o,u,s,l,f,c,h=z,g=this,p=g.c,d=new a(T),m=t=new a(T),w=l=new a(T);if(null!=e&&(z=!1,s=new a(e),z=h,(!(h=s.isInt())||s.lt(T))&&(z&&x(22,"max denominator "+(h?"out of range":"not an integer"),e),e=!h&&s.c&&I(s,s.e+1,1).gte(T)?s:null)),!p)return g.toString();for(c=r(p),o=d.e=c.length-g.e-1,d.c[0]=O[(u=o%b)<0?b+u:u],e=!e||s.cmp(d)>0?o>0?d:m:s,u=G,G=1/0,s=new a(c),l.c[0]=0;f=L(s,d,0,1),i=t.plus(f.times(w)),1!=i.cmp(e);)t=w,w=i,m=l.plus(f.times(i=m)),l=i,d=s.minus(f.times(i=d)),s=i;return i=L(e.minus(t),w,0,1),l=l.plus(i.times(m)),t=t.plus(i.times(w)),l.s=m.s=g.s,o*=2,n=L(m,w,o,P).minus(g).abs().cmp(L(l,t,o,P).minus(g).abs())<1?[m.toString(),w.toString()]:[l.toString(),t.toString()],G=u,n},M.toNumber=function(){return+this},M.toPower=M.pow=function(e,n){var t,r,i,o=p(0>e?-e:+e),u=this;if(null!=n&&(C=23,n=new a(n)),!V(e,-y,y,23,"exponent")&&(!isFinite(e)||o>y&&(e/=0)||parseFloat(e)!=e&&!(e=NaN))||0==e)return t=Math.pow(+u,e),new a(n?t%n:t);for(n?e>1&&u.gt(T)&&u.isInt()&&n.gt(T)&&n.isInt()?u=u.mod(n):(i=n,n=null):W&&(t=g(W/b+2)),r=new a(T);;){if(o%2){if(r=r.times(u),!r.c)break;t?r.c.length>t&&(r.c.length=t):n&&(r=r.mod(n))}if(o=p(o/2),!o)break;u=u.times(u),t?u.c&&u.c.length>t&&(u.c.length=t):n&&(u=u.mod(n))}return n?r:(0>e&&(r=T.div(r)),i?r.mod(i):t?I(r,W,P):r)},M.toPrecision=function(e,n){return E(this,null!=e&&V(e,1,S,24,"precision")?0|e:null,n,24)},M.toString=function(e){var n,t=this,i=t.s,o=t.e;return null===o?i?(n="Infinity",0>i&&(n="-"+n)):n="NaN":(n=r(t.c),n=null!=e&&V(e,2,64,25,"base")?A(f(n,o),0|e,10,i):q>=o||o>=k?l(n,o):f(n,o),0>i&&t.c[0]&&(n="-"+n)),n},M.truncated=M.trunc=function(){return I(new a(this),this.e+1,1)},M.valueOf=M.toJSON=function(){var e,n=this,t=n.e;return null===t?n.toString():(e=r(n.c),e=q>=t||t>=k?l(e,t):f(e,t),n.s<0?"-"+e:e)},M.isBigNumber=!0,null!=e&&a.config(e),a}function t(e){var n=0|e;return e>0||e===n?n:n-1}function r(e){for(var n,t,r=1,i=e.length,o=e[0]+"";i>r;){for(n=e[r++]+"",t=b-n.length;t--;n="0"+n);o+=n}for(i=o.length;48===o.charCodeAt(--i););return o.slice(0,i+1||1)}function i(e,n){var t,r,i=e.c,o=n.c,u=e.s,s=n.s,l=e.e,f=n.e;if(!u||!s)return null;if(t=i&&!i[0],r=o&&!o[0],t||r)return t?r?0:-s:u;if(u!=s)return u;if(t=0>u,r=l==f,!i||!o)return r?0:!i^t?1:-1;if(!r)return l>f^t?1:-1;for(s=(l=i.length)<(f=o.length)?l:f,u=0;s>u;u++)if(i[u]!=o[u])return i[u]>o[u]^t?1:-1;return l==f?0:l>f^t?1:-1}function o(e,n,t){return(e=c(e))>=n&&t>=e}function u(e){return"[object Array]"==Object.prototype.toString.call(e)}function s(e,n,t){for(var r,i,o=[0],u=0,s=e.length;s>u;){for(i=o.length;i--;o[i]*=n);for(o[r=0]+=v.indexOf(e.charAt(u++));rt-1&&(null==o[r+1]&&(o[r+1]=0),o[r+1]+=o[r]/t|0,o[r]%=t)}return o.reverse()}function l(e,n){return(e.length>1?e.charAt(0)+"."+e.slice(1):e)+(0>n?"e":"e+")+n}function f(e,n){var t,r;if(0>n){for(r="0.";++n;r+="0");e=r+e}else if(t=e.length,++n>t){for(r="0",n-=t;--n;r+="0");e+=r}else t>n&&(e=e.slice(0,n)+"."+e.slice(n));return e}function c(e){return e=parseFloat(e),0>e?g(e):p(e)}var a,h=/^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i,g=Math.ceil,p=Math.floor,d=" not a boolean or binary digit",m="rounding mode",w="number type has more than 15 significant digits",v="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_",N=1e14,b=14,y=9007199254740991,O=[1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13],R=1e7,S=1e9;a=n(),a["default"]=a.BigNumber=a,"function"==typeof define&&define.amd?define(function(){return a}):"undefined"!=typeof module&&module.exports?module.exports=a:(e||(e="undefined"!=typeof self?self:Function("return this")()),e.BigNumber=a)}(this); -//# sourceMappingURL=bignumber.js.map + ) + d--, r(m, w > F ? _ : U, w, l), (w = m.length), (f = 1); + else 0 == d && (f = d = 1), (m = U.slice()), (w = m.length); + if ( + (R > w && m.unshift(0), + r(O, m, R, l), + (R = O.length), + -1 == f) + ) + for (; n(U, O, F, R) < 1; ) + d++, r(O, R > F ? _ : U, R, l), (R = O.length); + } else 0 === f && (d++, (O = [0])); + (y[h++] = d), + O[0] ? (O[R++] = L[A] || 0) : ((O = [L[A]]), (R = 1)); + } while ((A++ < E || null != O[0]) && x--); + (g = null != O[0]), y[0] || y.shift(); + } + if (l == N) { + for (h = 1, x = y[0]; x >= 10; x /= 10, h++); + I(v, u + (v.e = h + c * b - 1) + 1, s, g); + } else (v.e = c), (v.r = +g); + return v; + }; + })()), + (U = (function() { + var e = /^(-?)0([xbo])(?=\w[\w.]*$)/i, + n = /^([^.]+)\.$/, + t = /^\.([^.]+)$/, + r = /^-?(Infinity|NaN)$/, + i = /^\s*\+(?=[\w.])|^\s+|\s+$/g; + return function(o, u, s, l) { + var f, + c = s ? u : u.replace(i, ''); + if (r.test(c)) o.s = isNaN(c) ? null : 0 > c ? -1 : 1; + else { + if ( + !s && + ((c = c.replace(e, function(e, n, t) { + return ( + (f = 'x' == (t = t.toLowerCase()) ? 16 : 'b' == t ? 2 : 8), + l && l != f ? e : n + ); + })), + l && ((f = l), (c = c.replace(n, '$1').replace(t, '0.$1'))), + u != c) + ) + return new a(c, f); + z && x(C, 'not a' + (l ? ' base ' + l : '') + ' number', u), + (o.s = null); + } + (o.c = o.e = null), (C = 0); + }; + })()), + (M.absoluteValue = M.abs = function() { + var e = new a(this); + return e.s < 0 && (e.s = 1), e; + }), + (M.ceil = function() { + return I(new a(this), this.e + 1, 2); + }), + (M.comparedTo = M.cmp = function(e, n) { + return (C = 1), i(this, new a(e, n)); + }), + (M.decimalPlaces = M.dp = function() { + var e, + n, + r = this.c; + if (!r) return null; + if (((e = ((n = r.length - 1) - t(this.e / b)) * b), (n = r[n]))) + for (; n % 10 == 0; n /= 10, e--); + return 0 > e && (e = 0), e; + }), + (M.dividedBy = M.div = function(e, n) { + return (C = 3), L(this, new a(e, n), B, P); + }), + (M.dividedToIntegerBy = M.divToInt = function(e, n) { + return (C = 4), L(this, new a(e, n), 0, 1); + }), + (M.equals = M.eq = function(e, n) { + return (C = 5), 0 === i(this, new a(e, n)); + }), + (M.floor = function() { + return I(new a(this), this.e + 1, 3); + }), + (M.greaterThan = M.gt = function(e, n) { + return (C = 6), i(this, new a(e, n)) > 0; + }), + (M.greaterThanOrEqualTo = M.gte = function(e, n) { + return (C = 7), 1 === (n = i(this, new a(e, n))) || 0 === n; + }), + (M.isFinite = function() { + return !!this.c; + }), + (M.isInteger = M.isInt = function() { + return !!this.c && t(this.e / b) > this.c.length - 2; + }), + (M.isNaN = function() { + return !this.s; + }), + (M.isNegative = M.isNeg = function() { + return this.s < 0; + }), + (M.isZero = function() { + return !!this.c && 0 == this.c[0]; + }), + (M.lessThan = M.lt = function(e, n) { + return (C = 8), i(this, new a(e, n)) < 0; + }), + (M.lessThanOrEqualTo = M.lte = function(e, n) { + return (C = 9), -1 === (n = i(this, new a(e, n))) || 0 === n; + }), + (M.minus = M.sub = function(e, n) { + var r, + i, + o, + u, + s = this, + l = s.s; + if (((C = 10), (e = new a(e, n)), (n = e.s), !l || !n)) + return new a(NaN); + if (l != n) return (e.s = -n), s.plus(e); + var f = s.e / b, + c = e.e / b, + h = s.c, + g = e.c; + if (!f || !c) { + if (!h || !g) return h ? ((e.s = -n), e) : new a(g ? s : NaN); + if (!h[0] || !g[0]) + return g[0] ? ((e.s = -n), e) : new a(h[0] ? s : 3 == P ? -0 : 0); + } + if (((f = t(f)), (c = t(c)), (h = h.slice()), (l = f - c))) { + for ( + (u = 0 > l) ? ((l = -l), (o = h)) : ((c = f), (o = g)), + o.reverse(), + n = l; + n--; + o.push(0) + ); + o.reverse(); + } else + for ( + i = (u = (l = h.length) < (n = g.length)) ? l : n, l = n = 0; + i > n; + n++ + ) + if (h[n] != g[n]) { + u = h[n] < g[n]; + break; + } + if ( + (u && ((o = h), (h = g), (g = o), (e.s = -e.s)), + (n = (i = g.length) - (r = h.length)), + n > 0) + ) + for (; n--; h[r++] = 0); + for (n = N - 1; i > l; ) { + if (h[--i] < g[i]) { + for (r = i; r && !h[--r]; h[r] = n); + --h[r], (h[i] += N); + } + h[i] -= g[i]; + } + for (; 0 == h[0]; h.shift(), --c); + return h[0] + ? _(e, h, c) + : ((e.s = 3 == P ? -1 : 1), (e.c = [(e.e = 0)]), e); + }), + (M.modulo = M.mod = function(e, n) { + var t, + r, + i = this; + return ( + (C = 11), + (e = new a(e, n)), + !i.c || !e.s || (e.c && !e.c[0]) + ? new a(NaN) + : !e.c || (i.c && !i.c[0]) + ? new a(i) + : (9 == H + ? ((r = e.s), + (e.s = 1), + (t = L(i, e, 0, 3)), + (e.s = r), + (t.s *= r)) + : (t = L(i, e, 0, H)), + i.minus(t.times(e))) + ); + }), + (M.negated = M.neg = function() { + var e = new a(this); + return (e.s = -e.s || null), e; + }), + (M.plus = M.add = function(e, n) { + var r, + i = this, + o = i.s; + if (((C = 12), (e = new a(e, n)), (n = e.s), !o || !n)) + return new a(NaN); + if (o != n) return (e.s = -n), i.minus(e); + var u = i.e / b, + s = e.e / b, + l = i.c, + f = e.c; + if (!u || !s) { + if (!l || !f) return new a(o / 0); + if (!l[0] || !f[0]) return f[0] ? e : new a(l[0] ? i : 0 * o); + } + if (((u = t(u)), (s = t(s)), (l = l.slice()), (o = u - s))) { + for ( + o > 0 ? ((s = u), (r = f)) : ((o = -o), (r = l)), r.reverse(); + o--; + r.push(0) + ); + r.reverse(); + } + for ( + o = l.length, + n = f.length, + 0 > o - n && ((r = f), (f = l), (l = r), (n = o)), + o = 0; + n; - window.BigNumber = BigNumber; + ) + (o = ((l[--n] = l[n] + f[n] + o) / N) | 0), + (l[n] = N === l[n] ? 0 : l[n] % N); + return o && (l.unshift(o), ++s), _(e, l, s); + }), + (M.precision = M.sd = function(e) { + var n, + t, + r = this, + i = r.c; + if ( + (null != e && + e !== !!e && + 1 !== e && + 0 !== e && + (z && x(13, 'argument' + d, e), e != !!e && (e = null)), + !i) + ) + return null; + if (((t = i.length - 1), (n = t * b + 1), (t = i[t]))) { + for (; t % 10 == 0; t /= 10, n--); + for (t = i[0]; t >= 10; t /= 10, n++); + } + return e && r.e + 1 > n && (n = r.e + 1), n; + }), + (M.round = function(e, n) { + var t = new a(this); + return ( + (null == e || V(e, 0, S, 15)) && + I( + t, + ~~e + this.e + 1, + null != n && V(n, 0, 8, 15, m) ? 0 | n : P + ), + t + ); + }), + (M.shift = function(e) { + var n = this; + return V(e, -y, y, 16, 'argument') + ? n.times('1e' + c(e)) + : new a( + n.c && n.c[0] && (-y > e || e > y) + ? n.s * (0 > e ? 0 : 1 / 0) + : n + ); + }), + (M.squareRoot = M.sqrt = function() { + var e, + n, + i, + o, + u, + s = this, + l = s.c, + f = s.s, + c = s.e, + h = B + 4, + g = new a('0.5'); + if (1 !== f || !l || !l[0]) + return new a(!f || (0 > f && (!l || l[0])) ? NaN : l ? s : 1 / 0); + if ( + ((f = Math.sqrt(+s)), + 0 == f || f == 1 / 0 + ? ((n = r(l)), + (n.length + c) % 2 == 0 && (n += '0'), + (f = Math.sqrt(n)), + (c = t((c + 1) / 2) - (0 > c || c % 2)), + f == 1 / 0 + ? (n = '1e' + c) + : ((n = f.toExponential()), + (n = n.slice(0, n.indexOf('e') + 1) + c)), + (i = new a(n))) + : (i = new a(f + '')), + i.c[0]) + ) + for (c = i.e, f = c + h, 3 > f && (f = 0); ; ) + if ( + ((u = i), + (i = g.times(u.plus(L(s, u, h, 1)))), + r(u.c).slice(0, f) === (n = r(i.c)).slice(0, f)) + ) { + if ( + (i.e < c && --f, + (n = n.slice(f - 3, f + 1)), + '9999' != n && (o || '4999' != n)) + ) { + (!+n || (!+n.slice(1) && '5' == n.charAt(0))) && + (I(i, i.e + B + 2, 1), (e = !i.times(i).eq(s))); + break; + } + if (!o && (I(u, u.e + B + 2, 0), u.times(u).eq(s))) { + i = u; + break; + } + (h += 4), (f += 4), (o = 1); + } + return I(i, i.e + B + 1, P, e); + }), + (M.times = M.mul = function(e, n) { + var r, + i, + o, + u, + s, + l, + f, + c, + h, + g, + p, + d, + m, + w, + v, + y = this, + O = y.c, + S = ((C = 17), (e = new a(e, n))).c; + if (!(O && S && O[0] && S[0])) + return ( + !y.s || !e.s || (O && !O[0] && !S) || (S && !S[0] && !O) + ? (e.c = e.e = e.s = null) + : ((e.s *= y.s), + O && S ? ((e.c = [0]), (e.e = 0)) : (e.c = e.e = null)), + e + ); + for ( + i = t(y.e / b) + t(e.e / b), + e.s *= y.s, + f = O.length, + g = S.length, + g > f && ((m = O), (O = S), (S = m), (o = f), (f = g), (g = o)), + o = f + g, + m = []; + o--; + m.push(0) + ); + for (w = N, v = R, o = g; --o >= 0; ) { + for ( + r = 0, p = S[o] % v, d = (S[o] / v) | 0, s = f, u = o + s; + u > o; + + ) + (c = O[--s] % v), + (h = (O[s] / v) | 0), + (l = d * c + h * p), + (c = p * c + (l % v) * v + m[u] + r), + (r = ((c / w) | 0) + ((l / v) | 0) + d * h), + (m[u--] = c % w); + m[u] = r; + } + return r ? ++i : m.shift(), _(e, m, i); + }), + (M.toDigits = function(e, n) { + var t = new a(this); + return ( + (e = null != e && V(e, 1, S, 18, 'precision') ? 0 | e : null), + (n = null != n && V(n, 0, 8, 18, m) ? 0 | n : P), + e ? I(t, e, n) : t + ); + }), + (M.toExponential = function(e, n) { + return E(this, null != e && V(e, 0, S, 19) ? ~~e + 1 : null, n, 19); + }), + (M.toFixed = function(e, n) { + return E( + this, + null != e && V(e, 0, S, 20) ? ~~e + this.e + 1 : null, + n, + 20 + ); + }), + (M.toFormat = function(e, n) { + var t = E( + this, + null != e && V(e, 0, S, 21) ? ~~e + this.e + 1 : null, + n, + 21 + ); + if (this.c) { + var r, + i = t.split('.'), + o = +J.groupSize, + u = +J.secondaryGroupSize, + s = J.groupSeparator, + l = i[0], + f = i[1], + c = this.s < 0, + a = c ? l.slice(1) : l, + h = a.length; + if ((u && ((r = o), (o = u), (u = r), (h -= r)), o > 0 && h > 0)) { + for (r = h % o || o, l = a.substr(0, r); h > r; r += o) + l += s + a.substr(r, o); + u > 0 && (l += s + a.slice(r)), c && (l = '-' + l); + } + t = f + ? l + + J.decimalSeparator + + ((u = +J.fractionGroupSize) + ? f.replace( + new RegExp('\\d{' + u + '}\\B', 'g'), + '$&' + J.fractionGroupSeparator + ) + : f) + : l; + } + return t; + }), + (M.toFraction = function(e) { + var n, + t, + i, + o, + u, + s, + l, + f, + c, + h = z, + g = this, + p = g.c, + d = new a(T), + m = (t = new a(T)), + w = (l = new a(T)); + if ( + (null != e && + ((z = !1), + (s = new a(e)), + (z = h), + (!(h = s.isInt()) || s.lt(T)) && + (z && + x( + 22, + 'max denominator ' + + (h ? 'out of range' : 'not an integer'), + e + ), + (e = !h && s.c && I(s, s.e + 1, 1).gte(T) ? s : null))), + !p) + ) + return g.toString(); + for ( + c = r(p), + o = d.e = c.length - g.e - 1, + d.c[0] = O[(u = o % b) < 0 ? b + u : u], + e = !e || s.cmp(d) > 0 ? (o > 0 ? d : m) : s, + u = G, + G = 1 / 0, + s = new a(c), + l.c[0] = 0; + (f = L(s, d, 0, 1)), (i = t.plus(f.times(w))), 1 != i.cmp(e); + + ) + (t = w), + (w = i), + (m = l.plus(f.times((i = m)))), + (l = i), + (d = s.minus(f.times((i = d)))), + (s = i); + return ( + (i = L(e.minus(t), w, 0, 1)), + (l = l.plus(i.times(m))), + (t = t.plus(i.times(w))), + (l.s = m.s = g.s), + (o *= 2), + (n = + L(m, w, o, P) + .minus(g) + .abs() + .cmp( + L(l, t, o, P) + .minus(g) + .abs() + ) < 1 + ? [m.toString(), w.toString()] + : [l.toString(), t.toString()]), + (G = u), + n + ); + }), + (M.toNumber = function() { + return +this; + }), + (M.toPower = M.pow = function(e, n) { + var t, + r, + i, + o = p(0 > e ? -e : +e), + u = this; + if ( + (null != n && ((C = 23), (n = new a(n))), + (!V(e, -y, y, 23, 'exponent') && + (!isFinite(e) || + (o > y && (e /= 0)) || + (parseFloat(e) != e && !(e = NaN)))) || + 0 == e) + ) + return (t = Math.pow(+u, e)), new a(n ? t % n : t); + for ( + n + ? e > 1 && u.gt(T) && u.isInt() && n.gt(T) && n.isInt() + ? (u = u.mod(n)) + : ((i = n), (n = null)) + : W && (t = g(W / b + 2)), + r = new a(T); + ; + + ) { + if (o % 2) { + if (((r = r.times(u)), !r.c)) break; + t ? r.c.length > t && (r.c.length = t) : n && (r = r.mod(n)); + } + if (((o = p(o / 2)), !o)) break; + (u = u.times(u)), + t + ? u.c && u.c.length > t && (u.c.length = t) + : n && (u = u.mod(n)); + } + return n + ? r + : (0 > e && (r = T.div(r)), i ? r.mod(i) : t ? I(r, W, P) : r); + }), + (M.toPrecision = function(e, n) { + return E( + this, + null != e && V(e, 1, S, 24, 'precision') ? 0 | e : null, + n, + 24 + ); + }), + (M.toString = function(e) { + var n, + t = this, + i = t.s, + o = t.e; + return ( + null === o + ? i ? ((n = 'Infinity'), 0 > i && (n = '-' + n)) : (n = 'NaN') + : ((n = r(t.c)), + (n = + null != e && V(e, 2, 64, 25, 'base') + ? A(f(n, o), 0 | e, 10, i) + : q >= o || o >= k ? l(n, o) : f(n, o)), + 0 > i && t.c[0] && (n = '-' + n)), + n + ); + }), + (M.truncated = M.trunc = function() { + return I(new a(this), this.e + 1, 1); + }), + (M.valueOf = M.toJSON = function() { + var e, + n = this, + t = n.e; + return null === t + ? n.toString() + : ((e = r(n.c)), + (e = q >= t || t >= k ? l(e, t) : f(e, t)), + n.s < 0 ? '-' + e : e); + }), + (M.isBigNumber = !0), + null != e && a.config(e), + a + ); + } + function t(e) { + var n = 0 | e; + return e > 0 || e === n ? n : n - 1; + } + function r(e) { + for (var n, t, r = 1, i = e.length, o = e[0] + ''; i > r; ) { + for (n = e[r++] + '', t = b - n.length; t--; n = '0' + n); + o += n; + } + for (i = o.length; 48 === o.charCodeAt(--i); ); + return o.slice(0, i + 1 || 1); + } + function i(e, n) { + var t, + r, + i = e.c, + o = n.c, + u = e.s, + s = n.s, + l = e.e, + f = n.e; + if (!u || !s) return null; + if (((t = i && !i[0]), (r = o && !o[0]), t || r)) + return t ? (r ? 0 : -s) : u; + if (u != s) return u; + if (((t = 0 > u), (r = l == f), !i || !o)) return r ? 0 : !i ^ t ? 1 : -1; + if (!r) return (l > f) ^ t ? 1 : -1; + for (s = (l = i.length) < (f = o.length) ? l : f, u = 0; s > u; u++) + if (i[u] != o[u]) return (i[u] > o[u]) ^ t ? 1 : -1; + return l == f ? 0 : (l > f) ^ t ? 1 : -1; + } + function o(e, n, t) { + return (e = c(e)) >= n && t >= e; + } + function u(e) { + return '[object Array]' == Object.prototype.toString.call(e); + } + function s(e, n, t) { + for (var r, i, o = [0], u = 0, s = e.length; s > u; ) { + for (i = o.length; i--; o[i] *= n); + for (o[(r = 0)] += v.indexOf(e.charAt(u++)); r < o.length; r++) + o[r] > t - 1 && + (null == o[r + 1] && (o[r + 1] = 0), + (o[r + 1] += (o[r] / t) | 0), + (o[r] %= t)); + } + return o.reverse(); + } + function l(e, n) { + return ( + (e.length > 1 ? e.charAt(0) + '.' + e.slice(1) : e) + + (0 > n ? 'e' : 'e+') + + n + ); + } + function f(e, n) { + var t, r; + if (0 > n) { + for (r = '0.'; ++n; r += '0'); + e = r + e; + } else if (((t = e.length), ++n > t)) { + for (r = '0', n -= t; --n; r += '0'); + e += r; + } else t > n && (e = e.slice(0, n) + '.' + e.slice(n)); + return e; + } + function c(e) { + return (e = parseFloat(e)), 0 > e ? g(e) : p(e); + } + var a, + h = /^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i, + g = Math.ceil, + p = Math.floor, + d = ' not a boolean or binary digit', + m = 'rounding mode', + w = 'number type has more than 15 significant digits', + v = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_', + N = 1e14, + b = 14, + y = 9007199254740991, + O = [ + 1, + 10, + 100, + 1e3, + 1e4, + 1e5, + 1e6, + 1e7, + 1e8, + 1e9, + 1e10, + 1e11, + 1e12, + 1e13 + ], + R = 1e7, + S = 1e9; + (a = n()), + (a['default'] = a.BigNumber = a), + 'function' == typeof define && define.amd + ? define(function() { + return a; + }) + : 'undefined' != typeof module && module.exports + ? (module.exports = a) + : (e || + (e = + 'undefined' != typeof self ? self : Function('return this')()), + (e.BigNumber = a)); + })(this); + //# sourceMappingURL=bignumber.js.map + + window.BigNumber = BigNumber; })(); diff --git a/modules/preloader/injected/EthereumProvider.js b/modules/preloader/injected/EthereumProvider.js index a1f87f101..c359a8ac0 100644 --- a/modules/preloader/injected/EthereumProvider.js +++ b/modules/preloader/injected/EthereumProvider.js @@ -1,175 +1,191 @@ +(function() { + var EventEmitter = window.EventEmitter; -(function () { - var EventEmitter = window.EventEmitter; + var postMessage = function(payload) { + if (typeof payload === 'object') { + payload = JSON.stringify(payload); + } - var postMessage = function(payload) { - if(typeof payload === 'object') { - payload = JSON.stringify(payload); + window.postMessage( + payload, + !location.origin || location.origin === 'null' ? '*' : location.origin + ); + }; + + // on events are: "connect", "data", "error", "end", "timeout" + // "data" will get notifications + + function EthereumProvider() { + var _this = this; + // Call constructor of superclass to initialize superclass-derived members. + EventEmitter.call(this); + + this.responseCallbacks = {}; + + // fire the connect + this._connect(); + this._reconnectCheck(); + + // Wait for response messages + window.addEventListener('message', function(event) { + var data; + try { + data = JSON.parse(event.data); + } catch (e) { + data = event.data; + } + + if ( + typeof data !== 'object' || + (data.message && + (!Object.prototype.hasOwnProperty.call(data.message, 'jsonrpc') && + !Object.prototype.hasOwnProperty.call(data.message[0], 'jsonrpc'))) + ) { + return; + } + + if (data.type === 'data') { + var id = null; + var result = data.message; + + // get the id which matches the returned id + if ( + typeof result === 'object' && + result.forEach && + isFinite(result.length) + ) { + result.forEach(function(load) { + if (_this.responseCallbacks[load.id]) id = load.id; + }); + } else { + id = result.id; } - window.postMessage(payload, (!location.origin || location.origin === "null" ) ? '*' : location.origin); - }; - - // on events are: "connect", "data", "error", "end", "timeout" - // "data" will get notifications - - function EthereumProvider() { - var _this = this; - // Call constructor of superclass to initialize superclass-derived members. - EventEmitter.call(this); - - this.responseCallbacks = {}; - - // fire the connect - this._connect(); - this._reconnectCheck(); - - - - // Wait for response messages - window.addEventListener('message', function(event) { - var data; - try { - data = JSON.parse(event.data); - } catch(e){ - data = event.data; - } - - - if(typeof data !== 'object' || (data.message && (!Object.prototype.hasOwnProperty.call(data.message, 'jsonrpc') && !Object.prototype.hasOwnProperty.call(data.message[0], 'jsonrpc')))) { - return; - } - - if (data.type === 'data') { - - var id = null; - var result = data.message; - - // get the id which matches the returned id - if(typeof result === 'object' && result.forEach && isFinite(result.length)) { - result.forEach(function(load){ - if(_this.responseCallbacks[load.id]) - id = load.id; - }); - } else { - id = result.id; - } - - // notification - if(!id && result.method && result.method.indexOf('_subscription') !== -1) { - // _this.listeners('data').forEach(function(callback){ - // if(typeof callback === 'function') - // callback(null, result); - // }); - _this.emit('data', result); - - // fire the callback - } else if(_this.responseCallbacks[id]) { - _this.responseCallbacks[id](null, result); - delete _this.responseCallbacks[id]; - } - - // make all other events listenable - } else if(data.type) { - // _this.listeners(data.type).forEach(function(callback){ - // if(typeof callback === 'function') - // callback(null, data.message); - // }); - // TODO check if secure - _this.emit('data.type', data.message); - } - }); - } - - EthereumProvider.prototype = Object.create(EventEmitter.prototype); - EthereumProvider.prototype.constructor = EthereumProvider; + // notification + if ( + !id && + result.method && + result.method.indexOf('_subscription') !== -1 + ) { + // _this.listeners('data').forEach(function(callback){ + // if(typeof callback === 'function') + // callback(null, result); + // }); + _this.emit('data', result); + + // fire the callback + } else if (_this.responseCallbacks[id]) { + _this.responseCallbacks[id](null, result); + delete _this.responseCallbacks[id]; + } - /** + // make all other events listenable + } else if (data.type) { + // _this.listeners(data.type).forEach(function(callback){ + // if(typeof callback === 'function') + // callback(null, data.message); + // }); + // TODO check if secure + _this.emit('data.type', data.message); + } + }); + } + + EthereumProvider.prototype = Object.create(EventEmitter.prototype); + EthereumProvider.prototype.constructor = EthereumProvider; + + /** Get the adds a callback to the responseCallbacks object, which will be called if a response matching the response Id will arrive. @method _addResponseCallback */ - EthereumProvider.prototype._addResponseCallback = function(payload, callback) { - var id = payload.id || payload[0].id; - var method = payload.method || payload[0].method; - - if (typeof callback !== 'function') { - throw new Error('No callback given, sync calls are not possible anymore in Mist. Please use only async calls.'); - } - - this.responseCallbacks[id] = callback; - this.responseCallbacks[id].method = method; - }; + EthereumProvider.prototype._addResponseCallback = function( + payload, + callback + ) { + var id = payload.id || payload[0].id; + var method = payload.method || payload[0].method; + + if (typeof callback !== 'function') { + throw new Error( + 'No callback given, sync calls are not possible anymore in Mist. Please use only async calls.' + ); + } + this.responseCallbacks[id] = callback; + this.responseCallbacks[id].method = method; + }; - /** + /** Will watch for connection drops and tries to reconnect. @method _reconnectCheck */ - EthereumProvider.prototype._reconnectCheck = function() { - var _this = this; - var reconnectIntervalId; - - this.on('end', function () { - reconnectIntervalId = setInterval(function () { - _this._connect(); - }, 500); - }); - - this.on('connect', function () { - clearInterval(reconnectIntervalId); - }); - }; - - - - /** + EthereumProvider.prototype._reconnectCheck = function() { + var _this = this; + var reconnectIntervalId; + + this.on('end', function() { + reconnectIntervalId = setInterval(function() { + _this._connect(); + }, 500); + }); + + this.on('connect', function() { + clearInterval(reconnectIntervalId); + }); + }; + + /** Will try to make a connection @method connect */ - EthereumProvider.prototype._connect = function(payload, callback) { - postMessage({ - type: 'create' - }); - }; + EthereumProvider.prototype._connect = function(payload, callback) { + postMessage({ + type: 'create' + }); + }; - /** + /** Sends the request @method send @param {Object} payload example: {id: 1, jsonrpc: '2.0', 'method': 'eth_someMethod', params: []} @param {Function} callback the callback to call */ - // TODO transform to: send(method, params, callback) - EthereumProvider.prototype.send = function send(payload, callback) { - - this._addResponseCallback(payload, callback); - postMessage({ - type: 'write', - message: payload - }, this.origin); - }; - - - - - delete window.EventEmitter; - // TODO set real ethereum provider - // window.ethereum = new EthereumProvider(); - - - // For backwards compatibility of web3.currentProvider; - EthereumProvider.prototype.sendSync = function () { - return {jsonrpc: '2.0', error: {"code": -32603, message: 'Sync calls are not anymore supported in Mist :\\'}}; - }; - EthereumProvider.prototype.sendAsync = EthereumProvider.prototype.send; - EthereumProvider.prototype.isConnected = function () { - return true; - }; - window.web3 = { - currentProvider: new EthereumProvider() + // TODO transform to: send(method, params, callback) + EthereumProvider.prototype.send = function send(payload, callback) { + this._addResponseCallback(payload, callback); + postMessage( + { + type: 'write', + message: payload + }, + this.origin + ); + }; + + delete window.EventEmitter; + // TODO set real ethereum provider + // window.ethereum = new EthereumProvider(); + + // For backwards compatibility of web3.currentProvider; + EthereumProvider.prototype.sendSync = function() { + return { + jsonrpc: '2.0', + error: { + code: -32603, + message: 'Sync calls are not anymore supported in Mist :\\' + } }; + }; + EthereumProvider.prototype.sendAsync = EthereumProvider.prototype.send; + EthereumProvider.prototype.isConnected = function() { + return true; + }; + window.web3 = { + currentProvider: new EthereumProvider() + }; })(); diff --git a/modules/preloader/injected/EventEmitter3.js b/modules/preloader/injected/EventEmitter3.js index f6f3792ab..d488300e8 100644 --- a/modules/preloader/injected/EventEmitter3.js +++ b/modules/preloader/injected/EventEmitter3.js @@ -1,318 +1,340 @@ - -(function () { - - 'use strict'; - - var has = Object.prototype.hasOwnProperty - , prefix = '~'; - - /** - * Constructor to create a storage for our `EE` objects. - * An `Events` instance is a plain object whose properties are event names. - * - * @constructor - * @api private - */ - function Events() {} +(function() { + 'use strict'; + + var has = Object.prototype.hasOwnProperty, + prefix = '~'; + + /** + * Constructor to create a storage for our `EE` objects. + * An `Events` instance is a plain object whose properties are event names. + * + * @constructor + * @api private + */ + function Events() {} + + // + // We try to not inherit from `Object.prototype`. In some engines creating an + // instance in this way is faster than calling `Object.create(null)` directly. + // If `Object.create(null)` is not supported we prefix the event names with a + // character to make sure that the built-in object properties are not + // overridden or used as an attack vector. + // + if (Object.create) { + Events.prototype = Object.create(null); // - // We try to not inherit from `Object.prototype`. In some engines creating an - // instance in this way is faster than calling `Object.create(null)` directly. - // If `Object.create(null)` is not supported we prefix the event names with a - // character to make sure that the built-in object properties are not - // overridden or used as an attack vector. + // This hack is needed because the `__proto__` property is still inherited in + // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5. // - if (Object.create) { - Events.prototype = Object.create(null); - - // - // This hack is needed because the `__proto__` property is still inherited in - // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5. - // - if (!new Events().__proto__) prefix = false; + if (!new Events().__proto__) prefix = false; + } + + /** + * Representation of a single event listener. + * + * @param {Function} fn The listener function. + * @param {Mixed} context The context to invoke the listener with. + * @param {Boolean} [once=false] Specify if the listener is a one-time listener. + * @constructor + * @api private + */ + function EE(fn, context, once) { + this.fn = fn; + this.context = context; + this.once = once || false; + } + + /** + * Minimal `EventEmitter` interface that is molded against the Node.js + * `EventEmitter` interface. + * + * @constructor + * @api public + */ + function EventEmitter() { + this._events = new Events(); + this._eventsCount = 0; + } + + /** + * Return an array listing the events for which the emitter has registered + * listeners. + * + * @returns {Array} + * @api public + */ + EventEmitter.prototype.eventNames = function eventNames() { + var names = [], + events, + name; + + if (this._eventsCount === 0) return names; + + for (name in (events = this._events)) { + if (has.call(events, name)) names.push(prefix ? name.slice(1) : name); } - /** - * Representation of a single event listener. - * - * @param {Function} fn The listener function. - * @param {Mixed} context The context to invoke the listener with. - * @param {Boolean} [once=false] Specify if the listener is a one-time listener. - * @constructor - * @api private - */ - function EE(fn, context, once) { - this.fn = fn; - this.context = context; - this.once = once || false; + if (Object.getOwnPropertySymbols) { + return names.concat(Object.getOwnPropertySymbols(events)); } - /** - * Minimal `EventEmitter` interface that is molded against the Node.js - * `EventEmitter` interface. - * - * @constructor - * @api public - */ - function EventEmitter() { - this._events = new Events(); - this._eventsCount = 0; + return names; + }; + + /** + * Return the listeners registered for a given event. + * + * @param {String|Symbol} event The event name. + * @param {Boolean} exists Only check if there are listeners. + * @returns {Array|Boolean} + * @api public + */ + EventEmitter.prototype.listeners = function listeners(event, exists) { + var evt = prefix ? prefix + event : event, + available = this._events[evt]; + + if (exists) return !!available; + if (!available) return []; + if (available.fn) return [available.fn]; + + for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) { + ee[i] = available[i].fn; } - /** - * Return an array listing the events for which the emitter has registered - * listeners. - * - * @returns {Array} - * @api public - */ - EventEmitter.prototype.eventNames = function eventNames() { - var names = [] - , events - , name; - - if (this._eventsCount === 0) return names; - - for (name in (events = this._events)) { - if (has.call(events, name)) names.push(prefix ? name.slice(1) : name); - } - - if (Object.getOwnPropertySymbols) { - return names.concat(Object.getOwnPropertySymbols(events)); - } - - return names; - }; - - /** - * Return the listeners registered for a given event. - * - * @param {String|Symbol} event The event name. - * @param {Boolean} exists Only check if there are listeners. - * @returns {Array|Boolean} - * @api public - */ - EventEmitter.prototype.listeners = function listeners(event, exists) { - var evt = prefix ? prefix + event : event - , available = this._events[evt]; - - if (exists) return !!available; - if (!available) return []; - if (available.fn) return [available.fn]; - - for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) { - ee[i] = available[i].fn; - } - - return ee; - }; - - /** - * Calls each of the listeners registered for a given event. - * - * @param {String|Symbol} event The event name. - * @returns {Boolean} `true` if the event had listeners, else `false`. - * @api public - */ - EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) { - var evt = prefix ? prefix + event : event; - - if (!this._events[evt]) return false; - - var listeners = this._events[evt] - , len = arguments.length - , args - , i; - - if (listeners.fn) { - if (listeners.once) this.removeListener(event, listeners.fn, undefined, true); - - switch (len) { - case 1: return listeners.fn.call(listeners.context), true; - case 2: return listeners.fn.call(listeners.context, a1), true; - case 3: return listeners.fn.call(listeners.context, a1, a2), true; - case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true; - case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true; - case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true; - } - - for (i = 1, args = new Array(len -1); i < len; i++) { - args[i - 1] = arguments[i]; - } - - listeners.fn.apply(listeners.context, args); - } else { - var length = listeners.length - , j; - - for (i = 0; i < length; i++) { - if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true); - - switch (len) { - case 1: listeners[i].fn.call(listeners[i].context); break; - case 2: listeners[i].fn.call(listeners[i].context, a1); break; - case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break; - case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break; - default: - if (!args) for (j = 1, args = new Array(len -1); j < len; j++) { - args[j - 1] = arguments[j]; - } - - listeners[i].fn.apply(listeners[i].context, args); - } - } - } - - return true; - }; - - /** - * Add a listener for a given event. - * - * @param {String|Symbol} event The event name. - * @param {Function} fn The listener function. - * @param {Mixed} [context=this] The context to invoke the listener with. - * @returns {EventEmitter} `this`. - * @api public - */ - EventEmitter.prototype.on = function on(event, fn, context) { - var listener = new EE(fn, context || this) - , evt = prefix ? prefix + event : event; - - if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++; - else if (!this._events[evt].fn) this._events[evt].push(listener); - else this._events[evt] = [this._events[evt], listener]; - - return this; - }; - - /** - * Add a one-time listener for a given event. - * - * @param {String|Symbol} event The event name. - * @param {Function} fn The listener function. - * @param {Mixed} [context=this] The context to invoke the listener with. - * @returns {EventEmitter} `this`. - * @api public - */ - EventEmitter.prototype.once = function once(event, fn, context) { - var listener = new EE(fn, context || this, true) - , evt = prefix ? prefix + event : event; - - if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++; - else if (!this._events[evt].fn) this._events[evt].push(listener); - else this._events[evt] = [this._events[evt], listener]; - - return this; - }; - - /** - * Remove the listeners of a given event. - * - * @param {String|Symbol} event The event name. - * @param {Function} fn Only remove the listeners that match this function. - * @param {Mixed} context Only remove the listeners that have this context. - * @param {Boolean} once Only remove one-time listeners. - * @returns {EventEmitter} `this`. - * @api public - */ - EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) { - var evt = prefix ? prefix + event : event; - - if (!this._events[evt]) return this; - if (!fn) { - if (--this._eventsCount === 0) this._events = new Events(); - else delete this._events[evt]; - return this; + return ee; + }; + + /** + * Calls each of the listeners registered for a given event. + * + * @param {String|Symbol} event The event name. + * @returns {Boolean} `true` if the event had listeners, else `false`. + * @api public + */ + EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) { + var evt = prefix ? prefix + event : event; + + if (!this._events[evt]) return false; + + var listeners = this._events[evt], + len = arguments.length, + args, + i; + + if (listeners.fn) { + if (listeners.once) + this.removeListener(event, listeners.fn, undefined, true); + + switch (len) { + case 1: + return listeners.fn.call(listeners.context), true; + case 2: + return listeners.fn.call(listeners.context, a1), true; + case 3: + return listeners.fn.call(listeners.context, a1, a2), true; + case 4: + return listeners.fn.call(listeners.context, a1, a2, a3), true; + case 5: + return listeners.fn.call(listeners.context, a1, a2, a3, a4), true; + case 6: + return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true; + } + + for (i = 1, args = new Array(len - 1); i < len; i++) { + args[i - 1] = arguments[i]; + } + + listeners.fn.apply(listeners.context, args); + } else { + var length = listeners.length, + j; + + for (i = 0; i < length; i++) { + if (listeners[i].once) + this.removeListener(event, listeners[i].fn, undefined, true); + + switch (len) { + case 1: + listeners[i].fn.call(listeners[i].context); + break; + case 2: + listeners[i].fn.call(listeners[i].context, a1); + break; + case 3: + listeners[i].fn.call(listeners[i].context, a1, a2); + break; + case 4: + listeners[i].fn.call(listeners[i].context, a1, a2, a3); + break; + default: + if (!args) + for (j = 1, args = new Array(len - 1); j < len; j++) { + args[j - 1] = arguments[j]; + } + + listeners[i].fn.apply(listeners[i].context, args); } + } + } - var listeners = this._events[evt]; - - if (listeners.fn) { - if ( - listeners.fn === fn - && (!once || listeners.once) - && (!context || listeners.context === context) - ) { - if (--this._eventsCount === 0) this._events = new Events(); - else delete this._events[evt]; - } - } else { - for (var i = 0, events = [], length = listeners.length; i < length; i++) { - if ( - listeners[i].fn !== fn - || (once && !listeners[i].once) - || (context && listeners[i].context !== context) - ) { - events.push(listeners[i]); - } - } - - // - // Reset the array, or remove it completely if we have no more listeners. - // - if (events.length) this._events[evt] = events.length === 1 ? events[0] : events; - else if (--this._eventsCount === 0) this._events = new Events(); - else delete this._events[evt]; - } + return true; + }; + + /** + * Add a listener for a given event. + * + * @param {String|Symbol} event The event name. + * @param {Function} fn The listener function. + * @param {Mixed} [context=this] The context to invoke the listener with. + * @returns {EventEmitter} `this`. + * @api public + */ + EventEmitter.prototype.on = function on(event, fn, context) { + var listener = new EE(fn, context || this), + evt = prefix ? prefix + event : event; + + if (!this._events[evt]) (this._events[evt] = listener), this._eventsCount++; + else if (!this._events[evt].fn) this._events[evt].push(listener); + else this._events[evt] = [this._events[evt], listener]; + + return this; + }; + + /** + * Add a one-time listener for a given event. + * + * @param {String|Symbol} event The event name. + * @param {Function} fn The listener function. + * @param {Mixed} [context=this] The context to invoke the listener with. + * @returns {EventEmitter} `this`. + * @api public + */ + EventEmitter.prototype.once = function once(event, fn, context) { + var listener = new EE(fn, context || this, true), + evt = prefix ? prefix + event : event; + + if (!this._events[evt]) (this._events[evt] = listener), this._eventsCount++; + else if (!this._events[evt].fn) this._events[evt].push(listener); + else this._events[evt] = [this._events[evt], listener]; + + return this; + }; + + /** + * Remove the listeners of a given event. + * + * @param {String|Symbol} event The event name. + * @param {Function} fn Only remove the listeners that match this function. + * @param {Mixed} context Only remove the listeners that have this context. + * @param {Boolean} once Only remove one-time listeners. + * @returns {EventEmitter} `this`. + * @api public + */ + EventEmitter.prototype.removeListener = function removeListener( + event, + fn, + context, + once + ) { + var evt = prefix ? prefix + event : event; + + if (!this._events[evt]) return this; + if (!fn) { + if (--this._eventsCount === 0) this._events = new Events(); + else delete this._events[evt]; + return this; + } - return this; - }; - - /** - * Remove all listeners, or those of the specified event. - * - * @param {String|Symbol} [event] The event name. - * @returns {EventEmitter} `this`. - * @api public - */ - EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) { - var evt; - - if (event) { - evt = prefix ? prefix + event : event; - if (this._events[evt]) { - if (--this._eventsCount === 0) this._events = new Events(); - else delete this._events[evt]; - } - } else { - this._events = new Events(); - this._eventsCount = 0; + var listeners = this._events[evt]; + + if (listeners.fn) { + if ( + listeners.fn === fn && + (!once || listeners.once) && + (!context || listeners.context === context) + ) { + if (--this._eventsCount === 0) this._events = new Events(); + else delete this._events[evt]; + } + } else { + for (var i = 0, events = [], length = listeners.length; i < length; i++) { + if ( + listeners[i].fn !== fn || + (once && !listeners[i].once) || + (context && listeners[i].context !== context) + ) { + events.push(listeners[i]); } - - return this; - }; - - // - // Alias methods names because people roll like that. - // - EventEmitter.prototype.off = EventEmitter.prototype.removeListener; - EventEmitter.prototype.addListener = EventEmitter.prototype.on; - - // - // This function doesn't apply anymore. - // - EventEmitter.prototype.setMaxListeners = function setMaxListeners() { - return this; - }; - - // - // Expose the prefix. - // - EventEmitter.prefixed = prefix; - - // - // Allow `EventEmitter` to be imported as module namespace. - // - EventEmitter.EventEmitter = EventEmitter; - - // - // Expose the module. - // - if ('undefined' !== typeof module) { - module.exports = EventEmitter; + } + + // + // Reset the array, or remove it completely if we have no more listeners. + // + if (events.length) + this._events[evt] = events.length === 1 ? events[0] : events; + else if (--this._eventsCount === 0) this._events = new Events(); + else delete this._events[evt]; } + return this; + }; + + /** + * Remove all listeners, or those of the specified event. + * + * @param {String|Symbol} [event] The event name. + * @returns {EventEmitter} `this`. + * @api public + */ + EventEmitter.prototype.removeAllListeners = function removeAllListeners( + event + ) { + var evt; + + if (event) { + evt = prefix ? prefix + event : event; + if (this._events[evt]) { + if (--this._eventsCount === 0) this._events = new Events(); + else delete this._events[evt]; + } + } else { + this._events = new Events(); + this._eventsCount = 0; + } - window.EventEmitter = EventEmitter; + return this; + }; + + // + // Alias methods names because people roll like that. + // + EventEmitter.prototype.off = EventEmitter.prototype.removeListener; + EventEmitter.prototype.addListener = EventEmitter.prototype.on; + + // + // This function doesn't apply anymore. + // + EventEmitter.prototype.setMaxListeners = function setMaxListeners() { + return this; + }; + + // + // Expose the prefix. + // + EventEmitter.prefixed = prefix; + + // + // Allow `EventEmitter` to be imported as module namespace. + // + EventEmitter.EventEmitter = EventEmitter; + + // + // Expose the module. + // + if ('undefined' !== typeof module) { + module.exports = EventEmitter; + } + + window.EventEmitter = EventEmitter; })(); diff --git a/modules/preloader/injected/mistAPI.js b/modules/preloader/injected/mistAPI.js index d480c6621..bdd842261 100644 --- a/modules/preloader/injected/mistAPI.js +++ b/modules/preloader/injected/mistAPI.js @@ -2,44 +2,49 @@ @module MistAPI */ -(function () { - 'use strict'; - - var postMessage = function(payload) { - if(typeof payload === 'object') { - payload = JSON.stringify(payload); - } - - window.postMessage(payload, (!location.origin || location.origin === "null" ) ? '*' : location.origin); - }; - - var queue = []; - - const prefix = 'entry_'; - const MIST_SUBMENU_LIMIT = 100; - - // todo: error handling - const filterAdd = function(options) { - if (!(options instanceof Object)) { return false; } - - return ['name'].every(e => e in options); - }; - - // filterId the id to only contain a-z A-Z 0-9 - const filterId = function(str) { - const filteredStr = String(str); - let newStr = ''; - if (filteredStr) { - for (let i = 0; i < filteredStr.length; i += 1) { - if (/[a-zA-Z0-9_-]/.test(filteredStr.charAt(i))) { - newStr += filteredStr.charAt(i); - } - } +(function() { + 'use strict'; + + var postMessage = function(payload) { + if (typeof payload === 'object') { + payload = JSON.stringify(payload); + } + + window.postMessage( + payload, + !location.origin || location.origin === 'null' ? '*' : location.origin + ); + }; + + var queue = []; + + const prefix = 'entry_'; + const MIST_SUBMENU_LIMIT = 100; + + // todo: error handling + const filterAdd = function(options) { + if (!(options instanceof Object)) { + return false; + } + + return ['name'].every(e => e in options); + }; + + // filterId the id to only contain a-z A-Z 0-9 + const filterId = function(str) { + const filteredStr = String(str); + let newStr = ''; + if (filteredStr) { + for (let i = 0; i < filteredStr.length; i += 1) { + if (/[a-zA-Z0-9_-]/.test(filteredStr.charAt(i))) { + newStr += filteredStr.charAt(i); } - return newStr; - }; + } + } + return newStr; + }; - /** + /** Mist API Provides an API for all dapps, which specifically targets features from the Mist browser @@ -47,49 +52,49 @@ @class mist @constructor */ - const mist = { - callbacks: {}, - version: '__version__', - license: '__license__', - platform: '__platform__', - requestAccount(callback) { - if (callback) { - if (!this.callbacks.connectAccount) { - this.callbacks.connectAccount = []; - } - this.callbacks.connectAccount.push(callback); - } - - postMessage({ - type: 'mistAPI_requestAccount' - }); - }, - solidity: { - version: '__solidityVersion__', - }, - sounds: { - bip: function playSound() { - postMessage({ - type: 'mistAPI_sound', - message: 'bip' - }); - }, - bloop: function playSound() { - postMessage({ - type: 'mistAPI_sound', - message: 'bloop' - }); - }, - invite: function playSound() { - postMessage({ - type: 'mistAPI_sound', - message: 'invite' - }); - }, - }, - menu: { - entries: {}, - /** + const mist = { + callbacks: {}, + version: '__version__', + license: '__license__', + platform: '__platform__', + requestAccount(callback) { + if (callback) { + if (!this.callbacks.connectAccount) { + this.callbacks.connectAccount = []; + } + this.callbacks.connectAccount.push(callback); + } + + postMessage({ + type: 'mistAPI_requestAccount' + }); + }, + solidity: { + version: '__solidityVersion__' + }, + sounds: { + bip: function playSound() { + postMessage({ + type: 'mistAPI_sound', + message: 'bip' + }); + }, + bloop: function playSound() { + postMessage({ + type: 'mistAPI_sound', + message: 'bloop' + }); + }, + invite: function playSound() { + postMessage({ + type: 'mistAPI_sound', + message: 'invite' + }); + } + }, + menu: { + entries: {}, + /** Sets the badge text for the apps menu button Example @@ -99,13 +104,13 @@ @method setBadge @param {String} text */ - setBadge(text) { - postMessage({ - type: 'mistAPI_setBadge', - message: text - }); - }, - /** + setBadge(text) { + postMessage({ + type: 'mistAPI_setBadge', + message: text + }); + }, + /** Adds/Updates a menu entry Example @@ -124,43 +129,52 @@ @param {Object} options The menu options like {badge: 23, name: 'My Entry'} @param {Function} callback Change the callback to be called when the menu is pressed. */ - add(id, options, callback) { - const args = Array.prototype.slice.call(arguments); - callback = (typeof args[args.length - 1] === 'function') ? args.pop() : null; - options = (typeof args[args.length - 1] === 'object') ? args.pop() : null; - id = (typeof args[args.length - 1] === 'string') || isFinite(args[args.length - 1]) ? args.pop() : null; - - if (!filterAdd(options)) { return false; } - - const filteredId = prefix + filterId(id); - - // restricting to 100 menu entries - if (!(filteredId in this.entries) && - Object.keys(this.entries).length >= MIST_SUBMENU_LIMIT) { - return false; - } - - const entry = { - id: filteredId || 'mist_defaultId', - position: options.position, - selected: !!options.selected, - name: options.name, - badge: options.badge, - }; - - queue.push({ - action: 'addMenu', - entry, - }); - - if (callback) { - entry.callback = callback; - } - - this.entries[filteredId] = entry; - return true; - }, - /** + add(id, options, callback) { + const args = Array.prototype.slice.call(arguments); + callback = + typeof args[args.length - 1] === 'function' ? args.pop() : null; + options = typeof args[args.length - 1] === 'object' ? args.pop() : null; + id = + typeof args[args.length - 1] === 'string' || + isFinite(args[args.length - 1]) + ? args.pop() + : null; + + if (!filterAdd(options)) { + return false; + } + + const filteredId = prefix + filterId(id); + + // restricting to 100 menu entries + if ( + !(filteredId in this.entries) && + Object.keys(this.entries).length >= MIST_SUBMENU_LIMIT + ) { + return false; + } + + const entry = { + id: filteredId || 'mist_defaultId', + position: options.position, + selected: !!options.selected, + name: options.name, + badge: options.badge + }; + + queue.push({ + action: 'addMenu', + entry + }); + + if (callback) { + entry.callback = callback; + } + + this.entries[filteredId] = entry; + return true; + }, + /** Updates a menu entry from the mist sidebar. @method update @@ -168,10 +182,10 @@ @param {Object} options The menu options like {badge: 23, name: 'My Entry'} @param {Function} callback Change the callback to be called when the menu is pressed. */ - update() { - this.add.apply(this, arguments); - }, - /** + update() { + this.add.apply(this, arguments); + }, + /** Removes a menu entry from the mist sidebar. @method remove @@ -180,91 +194,86 @@ @param {Object} options The menu options like {badge: 23, name: 'My Entry'} @param {Function} callback Change the callback to be called when the menu is pressed. */ - remove(id) { - const filteredId = prefix + filterId(id); + remove(id) { + const filteredId = prefix + filterId(id); - delete this.entries[filteredId]; + delete this.entries[filteredId]; - queue.push({ - action: 'removeMenu', - filteredId, - }); - }, - /** + queue.push({ + action: 'removeMenu', + filteredId + }); + }, + /** Marks a menu entry as selected @method select @param {String} id */ - select(id) { - const filteredId = prefix + filterId(id); - queue.push({ action: 'selectMenu', id: filteredId }); - - for (const e in this.entries) { - if ({}.hasOwnProperty.call(this.entries, e)) { - this.entries[e].selected = (e === filteredId); - } - } - }, - /** + select(id) { + const filteredId = prefix + filterId(id); + queue.push({ action: 'selectMenu', id: filteredId }); + + for (const e in this.entries) { + if ({}.hasOwnProperty.call(this.entries, e)) { + this.entries[e].selected = e === filteredId; + } + } + }, + /** Removes all menu entries. @method clear */ - clear() { - this.entries = {}; - queue.push({ action: 'clearMenu' }); - }, - }, - }; - - - // Wait for response messages - window.addEventListener('message', function(event) { - var data; - try { - data = JSON.parse(event.data); - } catch(e){ - data = event.data; - } - - if(typeof data !== 'object') { - return; - } - - if (data.type === 'mistAPI_callMenuFunction') { - var id = data.message; - - if (mist.menu.entries[id] && mist.menu.entries[id].callback) { - mist.menu.entries[id].callback(); - } - - } else if (data.type === 'uiAction_windowMessage') { - var params = data.message; - - if (mist.callbacks[params.type]) { - mist.callbacks[params.type].forEach(function(cb) { - cb(params.error, params.value); - }); - delete mist.callbacks[params.type]; - } - } - }); - - - // work up queue every 500ms - setInterval(function() { - if (queue.length > 0) { - - postMessage({ - type: 'mistAPI_menuChanges', - message: queue - }); - - queue = []; - } - }, 500); - - - window.mist = mist; + clear() { + this.entries = {}; + queue.push({ action: 'clearMenu' }); + } + } + }; + + // Wait for response messages + window.addEventListener('message', function(event) { + var data; + try { + data = JSON.parse(event.data); + } catch (e) { + data = event.data; + } + + if (typeof data !== 'object') { + return; + } + + if (data.type === 'mistAPI_callMenuFunction') { + var id = data.message; + + if (mist.menu.entries[id] && mist.menu.entries[id].callback) { + mist.menu.entries[id].callback(); + } + } else if (data.type === 'uiAction_windowMessage') { + var params = data.message; + + if (mist.callbacks[params.type]) { + mist.callbacks[params.type].forEach(function(cb) { + cb(params.error, params.value); + }); + delete mist.callbacks[params.type]; + } + } + }); + + // work up queue every 500ms + setInterval(function() { + if (queue.length > 0) { + postMessage({ + type: 'mistAPI_menuChanges', + message: queue + }); + + queue = []; + } + }, 500); + + window.mist = mist; })(); diff --git a/modules/preloader/mistUI.js b/modules/preloader/mistUI.js index 1f567b29d..b1fdc44ad 100644 --- a/modules/preloader/mistUI.js +++ b/modules/preloader/mistUI.js @@ -7,7 +7,7 @@ window.store = require('./rendererStore'); require('./include/common')('mist'); require('./include/web3CurrentProvider.js'); -const { ipcRenderer, remote, webFrame } = require('electron'); // eslint-disable-line import/newline-after-import +const { ipcRenderer, remote, webFrame } = require('electron'); // eslint-disable-line import/newline-after-import const { Menu, MenuItem } = remote; const dbSync = require('../dbSync.js'); const i18n = require('../i18n.js'); @@ -16,10 +16,9 @@ const web3Admin = require('../web3Admin.js'); require('./include/setBasePath')('interface'); - // add admin later setTimeout(() => { - web3Admin.extend(window.web3); + web3Admin.extend(window.web3); }, 1000); window.mist = mist(); @@ -28,100 +27,102 @@ window.dbSync = dbSync; window.dirname = remote.getGlobal('dirname'); window.ipc = ipcRenderer; - // remove require and module, because node-integration is on delete window.module; delete window.require; - // prevent overwriting the Dapps Web3 // delete global.Web3; // delete window.Web3; - // set the langauge for the electron interface // ipcRenderer.send('setLanguage', navigator.language.substr(0,2)); - // A message coming from other window, to be passed to a webview ipcRenderer.on('uiAction_windowMessage', (e, type, id, error, value) => { - if ((type === 'requestAccount') || (type === 'connectAccount') && !error) { - Tabs.update({ webviewId: id }, { $addToSet: { 'permissions.accounts': value } }); - } - - // forward to the webview (TODO: remove and manage in the ipcCommunicator?) - const tab = Tabs.findOne({ webviewId: id }); - if (tab) { - webview = $(`webview[data-id=${tab._id}]`)[0]; - if (webview) { - webview.send('uiAction_windowMessage', type, error, value); - } + if (type === 'requestAccount' || (type === 'connectAccount' && !error)) { + Tabs.update( + { webviewId: id }, + { $addToSet: { 'permissions.accounts': value } } + ); + } + + // forward to the webview (TODO: remove and manage in the ipcCommunicator?) + const tab = Tabs.findOne({ webviewId: id }); + if (tab) { + webview = $(`webview[data-id=${tab._id}]`)[0]; + if (webview) { + webview.send('uiAction_windowMessage', type, error, value); } + } }); ipcRenderer.on('uiAction_enableBlurOverlay', (e, value) => { - $('html').toggleClass('has-blur-overlay', !!value); + $('html').toggleClass('has-blur-overlay', !!value); }); // Wait for webview toggle ipcRenderer.on('uiAction_toggleWebviewDevTool', (e, id) => { - const webview = Helpers.getWebview(id); + const webview = Helpers.getWebview(id); - if (!webview) { - return; - } + if (!webview) { + return; + } - if (webview.isDevToolsOpened()) { - webview.closeDevTools(); - } else { - webview.openDevTools(); - } + if (webview.isDevToolsOpened()) { + webview.closeDevTools(); + } else { + webview.openDevTools(); + } }); - // randomize accounts and drop half // also certainly remove the web3.ethbase one const randomizeAccounts = (acc, coinbase) => { - let accounts = _.shuffle(acc); - accounts = _.rest(accounts, (accounts.length / 2).toFixed(0)); - accounts = _.without(accounts, coinbase); - return accounts; + let accounts = _.shuffle(acc); + accounts = _.rest(accounts, (accounts.length / 2).toFixed(0)); + accounts = _.without(accounts, coinbase); + return accounts; }; // Run tests ipcRenderer.on('uiAction_runTests', (e, type) => { - if (type === 'webview') { - web3.eth.getAccounts((error, accounts) => { - if (error) return; - - web3.eth.getCoinbase((coinbaseError, coinbase) => { - if (coinbaseError) return; - - - Tabs.upsert('tests', { - position: -1, - name: 'Tests', - url: '', // is hardcoded in webview.html to prevent hijacking - permissions: { - accounts: randomizeAccounts(accounts, coinbase), - }, - }); - - Tracker.afterFlush(() => { - LocalStore.set('selectedTab', 'tests'); - }); - - // update the permissions, when accounts change - Tracker.autorun(() => { - const accountList = _.pluck(EthAccounts.find({}, { fields: { address: 1 } }).fetch(), 'address'); - - Tabs.update('tests', { $set: { - 'permissions.accounts': randomizeAccounts(accountList, coinbase), - } }); - }); - }); + if (type === 'webview') { + web3.eth.getAccounts((error, accounts) => { + if (error) return; + + web3.eth.getCoinbase((coinbaseError, coinbase) => { + if (coinbaseError) return; + + Tabs.upsert('tests', { + position: -1, + name: 'Tests', + url: '', // is hardcoded in webview.html to prevent hijacking + permissions: { + accounts: randomizeAccounts(accounts, coinbase) + } }); - } + + Tracker.afterFlush(() => { + LocalStore.set('selectedTab', 'tests'); + }); + + // update the permissions, when accounts change + Tracker.autorun(() => { + const accountList = _.pluck( + EthAccounts.find({}, { fields: { address: 1 } }).fetch(), + 'address' + ); + + Tabs.update('tests', { + $set: { + 'permissions.accounts': randomizeAccounts(accountList, coinbase) + } + }); + }); + }); + }); + } }); // CONTEXT MENU @@ -129,44 +130,66 @@ ipcRenderer.on('uiAction_runTests', (e, type) => { const currentMousePosition = { x: 0, y: 0 }; const menu = new Menu(); // menu.append(new MenuItem({ type: 'separator' })); -menu.append(new MenuItem({ label: i18n.t('mist.rightClick.reload'), accelerator: 'Command+R', click() { - const webview = Helpers.getWebview(LocalStore.get('selectedTab')); - if (webview) { +menu.append( + new MenuItem({ + label: i18n.t('mist.rightClick.reload'), + accelerator: 'Command+R', + click() { + const webview = Helpers.getWebview(LocalStore.get('selectedTab')); + if (webview) { webview.reloadIgnoringCache(); + } } -} })); -menu.append(new MenuItem({ label: i18n.t('mist.rightClick.openDevTools'), click() { - const webview = Helpers.getWebview(LocalStore.get('selectedTab')); - if (webview) { + }) +); +menu.append( + new MenuItem({ + label: i18n.t('mist.rightClick.openDevTools'), + click() { + const webview = Helpers.getWebview(LocalStore.get('selectedTab')); + if (webview) { webview.openDevTools(); + } } -} })); -menu.append(new MenuItem({ label: i18n.t('mist.rightClick.inspectElements'), click() { - const webview = Helpers.getWebview(LocalStore.get('selectedTab')); - if (webview) { + }) +); +menu.append( + new MenuItem({ + label: i18n.t('mist.rightClick.inspectElements'), + click() { + const webview = Helpers.getWebview(LocalStore.get('selectedTab')); + if (webview) { webview.inspectElement(currentMousePosition.x, currentMousePosition.y); + } } -} })); - + }) +); -window.addEventListener('contextmenu', (e) => { +window.addEventListener( + 'contextmenu', + e => { e.preventDefault(); // OPEN CONTEXT MENU over webviews if ($('webview:hover')[0]) { - currentMousePosition.x = e.layerX; - currentMousePosition.y = e.layerY; - menu.popup(remote.getCurrentWindow()); + currentMousePosition.x = e.layerX; + currentMousePosition.y = e.layerY; + menu.popup(remote.getCurrentWindow()); } -}, false); + }, + false +); - -document.addEventListener('keydown', (e) => { +document.addEventListener( + 'keydown', + e => { // RELOAD current webview if (e.metaKey && e.keyCode === 82) { - const webview = Helpers.getWebview(LocalStore.get('selectedTab')); - if (webview) { - webview.reloadIgnoringCache(); - } + const webview = Helpers.getWebview(LocalStore.get('selectedTab')); + if (webview) { + webview.reloadIgnoringCache(); + } } -}, false); + }, + false +); diff --git a/modules/preloader/popupWindows.js b/modules/preloader/popupWindows.js index 9563e8ec9..8e26a88f0 100644 --- a/modules/preloader/popupWindows.js +++ b/modules/preloader/popupWindows.js @@ -8,7 +8,6 @@ const Q = require('bluebird'); const web3Admin = require('../web3Admin.js'); const https = require('https'); - web3Admin.extend(window.web3); // make variables globally accessable diff --git a/modules/preloader/popupWindowsNoWeb3.js b/modules/preloader/popupWindowsNoWeb3.js index f52583c1a..af53dd49a 100644 --- a/modules/preloader/popupWindowsNoWeb3.js +++ b/modules/preloader/popupWindowsNoWeb3.js @@ -9,10 +9,9 @@ const dbSync = require('../dbSync.js'); require('./include/setBasePath')('interface'); require('./include/openExternal.js'); - // receive data in from SendData ipcRenderer.on('uiAction_sendData', (e, data) => { - Session.set('data', data); + Session.set('data', data); }); window.mist = mist(); diff --git a/modules/preloader/rendererStore.js b/modules/preloader/rendererStore.js index 7b55086f8..93842afe5 100644 --- a/modules/preloader/rendererStore.js +++ b/modules/preloader/rendererStore.js @@ -2,17 +2,17 @@ // This store's only purpose is to sync with the main store. const { createStore, applyMiddleware } = require('redux'); const { - forwardToMain, - getInitialStateRenderer, - replayActionRenderer, + forwardToMain, + getInitialStateRenderer, + replayActionRenderer } = require('electron-redux'); const thunk = require('redux-thunk').default; const initialState = getInitialStateRenderer(); const store = createStore( - () => {}, - initialState, - applyMiddleware(forwardToMain, thunk), + () => {}, + initialState, + applyMiddleware(forwardToMain, thunk) ); replayActionRenderer(store); diff --git a/modules/preloader/tests.js b/modules/preloader/tests.js index db81384b8..16ecb7fae 100644 --- a/modules/preloader/tests.js +++ b/modules/preloader/tests.js @@ -2,21 +2,21 @@ @module preloader tests */ -if (location.origin !== "file://") { - throw new Error('Wrong test file loaded'); +if (location.origin !== 'file://') { + throw new Error('Wrong test file loaded'); } else { - // load dapp preloader file - require('./dapps.js'); + // load dapp preloader file + require('./dapps.js'); - const electron = require('electron'); - const ipcRenderer = electron.ipcRenderer; + const electron = require('electron'); + const ipcRenderer = electron.ipcRenderer; - window.ipcProvider = require('../ipc/ipcProviderWrapper.js'); - window.permissions = {}; + window.ipcProvider = require('../ipc/ipcProviderWrapper.js'); + window.permissions = {}; - ipcRenderer.sendToHost('sendTestData'); - ipcRenderer.on('uiAction_sendTestData', function(e, permissions, coinbase) { - window.permissions = permissions; - window.coinbase = coinbase; - }); + ipcRenderer.sendToHost('sendTestData'); + ipcRenderer.on('uiAction_sendTestData', function(e, permissions, coinbase) { + window.permissions = permissions; + window.coinbase = coinbase; + }); } diff --git a/modules/preloader/walletMain.js b/modules/preloader/walletMain.js index 354e5a496..563df3d2e 100644 --- a/modules/preloader/walletMain.js +++ b/modules/preloader/walletMain.js @@ -5,7 +5,7 @@ require('./dapps.js'); require('./include/openExternal.js'); require('./include/setBasePath')('interface/wallet'); -const {webFrame} = require('electron'); +const { webFrame } = require('electron'); const web3Admin = require('../web3Admin.js'); // make variables globally accessable @@ -13,14 +13,13 @@ const web3Admin = require('../web3Admin.js'); webFrame.executeJavaScript("window.mistMode = 'wallet';"); - // add admin later setTimeout(() => { - web3Admin.extend(window.web3); + web3Admin.extend(window.web3); }, 1000); setTimeout(() => { - if (document.getElementsByTagName('html')[0]) { - document.getElementsByTagName('html')[0].className = window.platform; - } + if (document.getElementsByTagName('html')[0]) { + document.getElementsByTagName('html')[0].className = window.platform; + } }, 500); diff --git a/modules/settings.js b/modules/settings.js index 2d7716c6b..b30a45af7 100644 --- a/modules/settings.js +++ b/modules/settings.js @@ -5,7 +5,11 @@ const packageJson = require('../package.json'); const _ = require('./utils/underscore'); const lodash = require('lodash'); -import { syncBuildConfig, syncFlags, setSwarmEnableOnStart } from './core/settings/actions'; +import { + syncBuildConfig, + syncFlags, + setSwarmEnableOnStart +} from './core/settings/actions'; import logger from './utils/logger'; const settingsLog = logger.create('Settings'); @@ -13,297 +17,300 @@ const settingsLog = logger.create('Settings'); let instance = null; class Settings { - constructor() { - if (!instance) { - instance = this; - } - - return instance; + constructor() { + if (!instance) { + instance = this; } - init() { - const logLevel = {logLevel: argv.loglevel}; - const logFolder = {logFolder: path.join(this.userDataPath, 'logs')}; - const loggerOptions = Object.assign(argv, logLevel, logFolder); - logger.setup(loggerOptions); - - store.dispatch(syncFlags(argv)); - - // If -v flag provided, log the Mist version and exit - if (argv.version) { - settingsLog.info(`Mist v${this.appVersion}`); - process.exit(0); - } - - // Some Linux installations require this setting: - if (argv.ignoreGpuBlacklist) { - app.commandLine.appendSwitch('ignore-gpu-blacklist', 'true'); - store.dispatch({ type: '[MAIN]:IGNORE_GPU_BLACKLIST:SET' }); - } - - if (this.inAutoTestMode) { - settingsLog.info('AUTOMATED TESTING'); - store.dispatch({ type: '[MAIN]:TEST_MODE:SET' }); - } - - settingsLog.info(`Running in production mode: ${this.inProductionMode}`); - - if (this.rpcMode === 'http') { - settingsLog.warn('Connecting to a node via HTTP instead of ipcMain. This is less secure!!!!'.toUpperCase()); - } - - store.dispatch(syncBuildConfig('appVersion', packageJson.version)); - store.dispatch(syncBuildConfig('rpcMode', this.rpcMode)); - store.dispatch(syncBuildConfig('productionMode', this.inProductionMode)); - store.dispatch(syncBuildConfig('uiMode', this.uiMode)); - } + return instance; + } + init() { + const logLevel = { logLevel: argv.loglevel }; + const logFolder = { logFolder: path.join(this.userDataPath, 'logs') }; + const loggerOptions = Object.assign(argv, logLevel, logFolder); + logger.setup(loggerOptions); - // @returns "Application Support/Mist" in production mode - // @returns "Application Support/Electron" in development mode - get userDataPath() { - return app.getPath('userData'); - } + store.dispatch(syncFlags(argv)); - get dbFilePath() { - const dbFileName = (this.inAutoTestMode) ? 'mist.test.lokidb' : 'mist.lokidb'; - return path.join(this.userDataPath, dbFileName); + // If -v flag provided, log the Mist version and exit + if (argv.version) { + settingsLog.info(`Mist v${this.appVersion}`); + process.exit(0); } - get appDataPath() { - // Application Support/ - return app.getPath('appData'); + // Some Linux installations require this setting: + if (argv.ignoreGpuBlacklist) { + app.commandLine.appendSwitch('ignore-gpu-blacklist', 'true'); + store.dispatch({ type: '[MAIN]:IGNORE_GPU_BLACKLIST:SET' }); } - get userHomePath() { - return app.getPath('home'); + if (this.inAutoTestMode) { + settingsLog.info('AUTOMATED TESTING'); + store.dispatch({ type: '[MAIN]:TEST_MODE:SET' }); } - get cli() { - return argv; - } + settingsLog.info(`Running in production mode: ${this.inProductionMode}`); - get appVersion() { - return packageJson.version; + if (this.rpcMode === 'http') { + settingsLog.warn( + 'Connecting to a node via HTTP instead of ipcMain. This is less secure!!!!'.toUpperCase() + ); } - get appName() { - return this.uiMode === 'mist' ? 'Mist' : 'Ethereum Wallet'; - } - - get appLicense() { - return packageJson.license; - } + store.dispatch(syncBuildConfig('appVersion', packageJson.version)); + store.dispatch(syncBuildConfig('rpcMode', this.rpcMode)); + store.dispatch(syncBuildConfig('productionMode', this.inProductionMode)); + store.dispatch(syncBuildConfig('uiMode', this.uiMode)); + } - get uiMode() { - return (_.isString(argv.mode)) ? argv.mode.toLowerCase() : argv.mode; - } + // @returns "Application Support/Mist" in production mode + // @returns "Application Support/Electron" in development mode + get userDataPath() { + return app.getPath('userData'); + } - get inProductionMode() { - return defaultConfig.production; - } + get dbFilePath() { + const dbFileName = this.inAutoTestMode ? 'mist.test.lokidb' : 'mist.lokidb'; + return path.join(this.userDataPath, dbFileName); + } - get inAutoTestMode() { - return !!process.env.TEST_MODE; - } + get appDataPath() { + // Application Support/ + return app.getPath('appData'); + } - get swarmURL() { - return argv.swarmurl; - } + get userHomePath() { + return app.getPath('home'); + } - get gethPath() { - return argv.gethpath; - } + get cli() { + return argv; + } - get ethPath() { - return argv.ethpath; - } + get appVersion() { + return packageJson.version; + } - get rpcMode() { - if (argv.rpc && argv.rpc.indexOf('http') === 0) - return 'http'; - if (argv.rpc && argv.rpc.indexOf('ws:') === 0) { - settingsLog.warn('Websockets are not yet supported by Mist, using default IPC connection'); - argv.rpc = null; - return 'ipc'; - } else - return 'ipc'; - } + get appName() { + return this.uiMode === 'mist' ? 'Mist' : 'Ethereum Wallet'; + } - get rpcConnectConfig() { - if (this.rpcMode === 'ipc') { - return { - path: this.rpcIpcPath, - }; - } + get appLicense() { + return packageJson.license; + } - return { - hostPort: this.rpcHttpPath, - }; - } + get uiMode() { + return _.isString(argv.mode) ? argv.mode.toLowerCase() : argv.mode; + } - get rpcHttpPath() { - return (this.rpcMode === 'http') ? argv.rpc : null; - } + get inProductionMode() { + return defaultConfig.production; + } - get rpcIpcPath() { - let ipcPath = (this.rpcMode === 'ipc') ? argv.rpc : null; + get inAutoTestMode() { + return !!process.env.TEST_MODE; + } - if (ipcPath) { - return ipcPath; - } + get swarmURL() { + return argv.swarmurl; + } - ipcPath = this.userHomePath; + get gethPath() { + return argv.gethpath; + } - if (process.platform === 'darwin') { - ipcPath += '/Library/Ethereum/geth.ipc'; - } else if (process.platform === 'freebsd' || - process.platform === 'linux' || - process.platform === 'sunos') { - ipcPath += '/.ethereum/geth.ipc'; - } else if (process.platform === 'win32') { - ipcPath = '\\\\.\\pipe\\geth.ipc'; - } + get ethPath() { + return argv.ethpath; + } - settingsLog.debug(`IPC path: ${ipcPath}`); + get rpcMode() { + if (argv.rpc && argv.rpc.indexOf('http') === 0) return 'http'; + if (argv.rpc && argv.rpc.indexOf('ws:') === 0) { + settingsLog.warn( + 'Websockets are not yet supported by Mist, using default IPC connection' + ); + argv.rpc = null; + return 'ipc'; + } else return 'ipc'; + } - return ipcPath; + get rpcConnectConfig() { + if (this.rpcMode === 'ipc') { + return { + path: this.rpcIpcPath + }; } - get nodeType() { - return argv.node; - } + return { + hostPort: this.rpcHttpPath + }; + } - get network() { - return argv.network; - } + get rpcHttpPath() { + return this.rpcMode === 'http' ? argv.rpc : null; + } - get syncmode() { - return argv.syncmode; - } + get rpcIpcPath() { + let ipcPath = this.rpcMode === 'ipc' ? argv.rpc : null; - get nodeOptions() { - return argv.nodeOptions; + if (ipcPath) { + return ipcPath; } - get language() { - return this.loadConfig('ui.i18n'); - } + ipcPath = this.userHomePath; - set language(langCode) { - this.saveConfig('ui.i18n', langCode); + if (process.platform === 'darwin') { + ipcPath += '/Library/Ethereum/geth.ipc'; + } else if ( + process.platform === 'freebsd' || + process.platform === 'linux' || + process.platform === 'sunos' + ) { + ipcPath += '/.ethereum/geth.ipc'; + } else if (process.platform === 'win32') { + ipcPath = '\\\\.\\pipe\\geth.ipc'; } - get enableSwarmOnStart() { - if (global.mode === 'wallet') { - return false; - } + settingsLog.debug(`IPC path: ${ipcPath}`); - if (argv.swarm) { - return true; - } + return ipcPath; + } - const enableOnStart = this.loadConfig('swarm.enableOnStart'); + get nodeType() { + return argv.node; + } - // Sync to redux - if (enableOnStart) { - store.dispatch(setSwarmEnableOnStart()); - } + get network() { + return argv.network; + } - return enableOnStart; - } + get syncmode() { + return argv.syncmode; + } - set enableSwarmOnStart(bool) { - this.saveConfig('swarm.enableOnStart', bool); + get nodeOptions() { + return argv.nodeOptions; + } + + get language() { + return this.loadConfig('ui.i18n'); + } + + set language(langCode) { + this.saveConfig('ui.i18n', langCode); + } + + get enableSwarmOnStart() { + if (global.mode === 'wallet') { + return false; } - get skiptimesynccheck() { - return argv.skiptimesynccheck; + if (argv.swarm) { + return true; } - initConfig() { - global.config.insert({ - ui: { - i18n: i18n.getBestMatchedLangCode(app.getLocale()) - }, - swarm: { - enableOnStart: argv.swarm - } - }); + const enableOnStart = this.loadConfig('swarm.enableOnStart'); + + // Sync to redux + if (enableOnStart) { + store.dispatch(setSwarmEnableOnStart()); } - saveConfig(key, value) { - let obj = global.config.get(1); + return enableOnStart; + } - if (!obj) { - this.initConfig(); - obj = global.config.get(1); - } + set enableSwarmOnStart(bool) { + this.saveConfig('swarm.enableOnStart', bool); + } - if (lodash.get(obj, key) !== value) { - lodash.set(obj, key, value); - global.config.update(obj); + get skiptimesynccheck() { + return argv.skiptimesynccheck; + } - settingsLog.debug(`Settings: saveConfig('${key}', '${value}')`); - settingsLog.trace(global.config.data); - } + initConfig() { + global.config.insert({ + ui: { + i18n: i18n.getBestMatchedLangCode(app.getLocale()) + }, + swarm: { + enableOnStart: argv.swarm + } + }); + } + + saveConfig(key, value) { + let obj = global.config.get(1); + + if (!obj) { + this.initConfig(); + obj = global.config.get(1); } - loadConfig(key) { - const obj = global.config.get(1); + if (lodash.get(obj, key) !== value) { + lodash.set(obj, key, value); + global.config.update(obj); - if (!obj) { - this.initConfig(); - return this.loadConfig(key); - } + settingsLog.debug(`Settings: saveConfig('${key}', '${value}')`); + settingsLog.trace(global.config.data); + } + } - settingsLog.trace(`Settings: loadConfig('${key}') = '${lodash.get(obj, key)}'`); + loadConfig(key) { + const obj = global.config.get(1); - return lodash.get(obj, key); + if (!obj) { + this.initConfig(); + return this.loadConfig(key); } - loadUserData(path2) { - const fullPath = this.constructUserDataPath(path2); + settingsLog.trace( + `Settings: loadConfig('${key}') = '${lodash.get(obj, key)}'` + ); - settingsLog.trace('Load user data', fullPath); + return lodash.get(obj, key); + } - // check if the file exists - try { - fs.accessSync(fullPath, fs.R_OK); - } catch (err) { - return null; - } + loadUserData(path2) { + const fullPath = this.constructUserDataPath(path2); - // try to read it - try { - const data = fs.readFileSync(fullPath, { encoding: 'utf8' }); - settingsLog.debug(`Reading "${data}" from ${fullPath}`); - return data; - } catch (err) { - settingsLog.warn(`File not readable: ${fullPath}`, err); - } + settingsLog.trace('Load user data', fullPath); - return null; + // check if the file exists + try { + fs.accessSync(fullPath, fs.R_OK); + } catch (err) { + return null; } + // try to read it + try { + const data = fs.readFileSync(fullPath, { encoding: 'utf8' }); + settingsLog.debug(`Reading "${data}" from ${fullPath}`); + return data; + } catch (err) { + settingsLog.warn(`File not readable: ${fullPath}`, err); + } - saveUserData(path2, data) { - if (!data) return; // return so we dont write null, or other invalid data - - const fullPath = this.constructUserDataPath(path2); + return null; + } - try { - settingsLog.debug(`Saving "${data}" to ${fullPath}`); - fs.writeFileSync(fullPath, data, { encoding: 'utf8' }); - } catch (err) { - settingsLog.warn(`Unable to write to ${fullPath}`, err); - } - } + saveUserData(path2, data) { + if (!data) return; // return so we dont write null, or other invalid data + const fullPath = this.constructUserDataPath(path2); - constructUserDataPath(filePath) { - return path.join(this.userDataPath, filePath); + try { + settingsLog.debug(`Saving "${data}" to ${fullPath}`); + fs.writeFileSync(fullPath, data, { encoding: 'utf8' }); + } catch (err) { + settingsLog.warn(`Unable to write to ${fullPath}`, err); } + } + + constructUserDataPath(filePath) { + return path.join(this.userDataPath, filePath); + } } module.exports = new Settings(); @@ -314,163 +321,168 @@ Command line argument parsing // Load config const defaultConfig = { - mode: 'mist', - production: false, + mode: 'mist', + production: false }; try { - _.extend(defaultConfig, require('../config.json')); + _.extend(defaultConfig, require('../config.json')); } catch (error) { - settingsLog.error(error); + settingsLog.error(error); } const argv = require('yargs') - .usage('Usage: $0 [Mist options] [Node options]') - .option({ - mode: { - alias: 'm', - demand: false, - default: defaultConfig.mode, - describe: 'App UI mode: wallet, mist.', - requiresArg: true, - nargs: 1, - type: 'string', - group: 'Mist options:', - }, - node: { - demand: false, - default: null, - describe: 'Node to use: geth, eth', - requiresArg: true, - nargs: 1, - type: 'string', - group: 'Mist options:', - }, - network: { - demand: false, - default: null, - describe: 'Network to connect to: main, test', - requiresArg: true, - nargs: 1, - type: 'string', - group: 'Mist options:', - }, - rpc: { - demand: false, - describe: 'Path to node IPC socket file OR HTTP RPC hostport (if IPC socket file then --node-ipcpath will be set with this value).', - requiresArg: true, - nargs: 1, - type: 'string', - group: 'Mist options:', - }, - swarm: { - describe: 'Enable Swarm on start.', - requiresArg: false, - nargs: 0, - type: 'boolean', - group: 'Mist options:', - }, - swarmurl: { - demand: false, - default: 'http://localhost:8500', - describe: 'URL serving the Swarm HTTP API. If null, Mist will open a local node.', - requiresArg: true, - nargs: 1, - type: 'string', - group: 'Mist options:', - }, - gethpath: { - demand: false, - describe: 'Path to Geth executable to use instead of default.', - requiresArg: true, - nargs: 1, - type: 'string', - group: 'Mist options:', - }, - ethpath: { - demand: false, - describe: 'Path to Eth executable to use instead of default.', - requiresArg: true, - nargs: 1, - type: 'string', - group: 'Mist options:', - }, - 'ignore-gpu-blacklist': { - demand: false, - describe: 'Ignores GPU blacklist (needed for some Linux installations).', - requiresArg: false, - nargs: 0, - type: 'boolean', - group: 'Mist options:', - }, - 'reset-tabs': { - demand: false, - describe: 'Reset Mist tabs to their default settings.', - requiresArg: false, - nargs: 0, - type: 'boolean', - group: 'Mist options:', - }, - loglevel: { - demand: false, - default: 'info', - describe: 'Minimum logging threshold: info, debug, error, trace (shows all logs, including possible passwords over IPC!).', - requiresArg: true, - nargs: 1, - type: 'string', - group: 'Mist options:', - }, - syncmode: { - demand: false, - requiresArg: true, - describe: 'Geth synchronization mode: [fast|light|full]', - nargs: 1, - type: 'string', - group: 'Mist options:', - }, - version: { - alias: 'v', - demand: false, - requiresArg: false, - nargs: 0, - describe: 'Display Mist version.', - group: 'Mist options:', - type: 'boolean', - }, - skiptimesynccheck: { - demand: false, - requiresArg: false, - nargs: 0, - describe: 'Disable checks for the presence of automatic time sync on your OS.', - group: 'Mist options:', - type: 'boolean', - }, - '': { - describe: 'To pass options to the underlying node (e.g. Geth) use the --node- prefix, e.g. --node-datadir', - group: 'Node options:', - }, - }) - .help('h') - .alias('h', 'help') - .parse(process.argv.slice(1)); + .usage('Usage: $0 [Mist options] [Node options]') + .option({ + mode: { + alias: 'm', + demand: false, + default: defaultConfig.mode, + describe: 'App UI mode: wallet, mist.', + requiresArg: true, + nargs: 1, + type: 'string', + group: 'Mist options:' + }, + node: { + demand: false, + default: null, + describe: 'Node to use: geth, eth', + requiresArg: true, + nargs: 1, + type: 'string', + group: 'Mist options:' + }, + network: { + demand: false, + default: null, + describe: 'Network to connect to: main, test', + requiresArg: true, + nargs: 1, + type: 'string', + group: 'Mist options:' + }, + rpc: { + demand: false, + describe: + 'Path to node IPC socket file OR HTTP RPC hostport (if IPC socket file then --node-ipcpath will be set with this value).', + requiresArg: true, + nargs: 1, + type: 'string', + group: 'Mist options:' + }, + swarm: { + describe: 'Enable Swarm on start.', + requiresArg: false, + nargs: 0, + type: 'boolean', + group: 'Mist options:' + }, + swarmurl: { + demand: false, + default: 'http://localhost:8500', + describe: + 'URL serving the Swarm HTTP API. If null, Mist will open a local node.', + requiresArg: true, + nargs: 1, + type: 'string', + group: 'Mist options:' + }, + gethpath: { + demand: false, + describe: 'Path to Geth executable to use instead of default.', + requiresArg: true, + nargs: 1, + type: 'string', + group: 'Mist options:' + }, + ethpath: { + demand: false, + describe: 'Path to Eth executable to use instead of default.', + requiresArg: true, + nargs: 1, + type: 'string', + group: 'Mist options:' + }, + 'ignore-gpu-blacklist': { + demand: false, + describe: 'Ignores GPU blacklist (needed for some Linux installations).', + requiresArg: false, + nargs: 0, + type: 'boolean', + group: 'Mist options:' + }, + 'reset-tabs': { + demand: false, + describe: 'Reset Mist tabs to their default settings.', + requiresArg: false, + nargs: 0, + type: 'boolean', + group: 'Mist options:' + }, + loglevel: { + demand: false, + default: 'info', + describe: + 'Minimum logging threshold: info, debug, error, trace (shows all logs, including possible passwords over IPC!).', + requiresArg: true, + nargs: 1, + type: 'string', + group: 'Mist options:' + }, + syncmode: { + demand: false, + requiresArg: true, + describe: 'Geth synchronization mode: [fast|light|full]', + nargs: 1, + type: 'string', + group: 'Mist options:' + }, + version: { + alias: 'v', + demand: false, + requiresArg: false, + nargs: 0, + describe: 'Display Mist version.', + group: 'Mist options:', + type: 'boolean' + }, + skiptimesynccheck: { + demand: false, + requiresArg: false, + nargs: 0, + describe: + 'Disable checks for the presence of automatic time sync on your OS.', + group: 'Mist options:', + type: 'boolean' + }, + '': { + describe: + 'To pass options to the underlying node (e.g. Geth) use the --node- prefix, e.g. --node-datadir', + group: 'Node options:' + } + }) + .help('h') + .alias('h', 'help') + .parse(process.argv.slice(1)); argv.nodeOptions = []; for (const optIdx in argv) { - if (optIdx.indexOf('node-') === 0) { - argv.nodeOptions.push(`--${optIdx.substr(5)}`); + if (optIdx.indexOf('node-') === 0) { + argv.nodeOptions.push(`--${optIdx.substr(5)}`); - if (argv[optIdx] !== true) { - argv.nodeOptions.push(argv[optIdx]); - } + if (argv[optIdx] !== true) { + argv.nodeOptions.push(argv[optIdx]); } + } } // some options are shared if (argv.ipcpath) { - argv.nodeOptions.push('--ipcpath', argv.ipcpath); + argv.nodeOptions.push('--ipcpath', argv.ipcpath); } if (argv.nodeOptions && argv.nodeOptions.syncmode) { - argv.push('--syncmode', argv.nodeOptions.syncmode); -} \ No newline at end of file + argv.push('--syncmode', argv.nodeOptions.syncmode); +} diff --git a/modules/socketManager.js b/modules/socketManager.js index b2f60de3b..851191683 100644 --- a/modules/socketManager.js +++ b/modules/socketManager.js @@ -5,75 +5,73 @@ const log = require('./utils/logger').create('Sockets'); const Web3IpcSocket = require('./sockets/web3Ipc'); const Web3HttpSocket = require('./sockets/web3Http'); - /** * `Socket` manager. */ class SocketManager { - constructor() { - this._sockets = {}; - } - - /** - * Get socket with given id, creating it if it does not exist. - * - * @return {Socket} - */ - create(id, type) { - log.debug(`Create socket, id=${id}, type=${type}`); - - switch (type) { - case 'ipc': - this._sockets[id] = new Web3IpcSocket(this, id); - break; - case 'http': - this._sockets[id] = new Web3HttpSocket(this, id); - break; - default: - throw new Error(`Unrecognized socket type: ${type}`); - } - - return this._sockets[id]; - } - - /** - * Get socket with given id, creating it if it does not exist. - * - * @return {Socket} - */ - get(id, type) { - if (!this._sockets[id]) { - this.create(id, type); - } - - return this._sockets[id]; + constructor() { + this._sockets = {}; + } + + /** + * Get socket with given id, creating it if it does not exist. + * + * @return {Socket} + */ + create(id, type) { + log.debug(`Create socket, id=${id}, type=${type}`); + + switch (type) { + case 'ipc': + this._sockets[id] = new Web3IpcSocket(this, id); + break; + case 'http': + this._sockets[id] = new Web3HttpSocket(this, id); + break; + default: + throw new Error(`Unrecognized socket type: ${type}`); } - - /** - * @return {Promise} - */ - destroyAll() { - log.info('Destroy all sockets'); - - return Q.all(_.map(this._sockets, (s, id) => { - this.remove(id); - return s.destroy(); - })); - } - - /** - * Remove socket with given id from this manager. - * - * Usually called by `Socket` instances when they're destroyed. - */ - remove(id) { - log.debug(`Remove socket, id=${id}`); - - delete this._sockets[id]; + return this._sockets[id]; + } + + /** + * Get socket with given id, creating it if it does not exist. + * + * @return {Socket} + */ + get(id, type) { + if (!this._sockets[id]) { + this.create(id, type); } + return this._sockets[id]; + } + + /** + * @return {Promise} + */ + destroyAll() { + log.info('Destroy all sockets'); + + return Q.all( + _.map(this._sockets, (s, id) => { + this.remove(id); + return s.destroy(); + }) + ); + } + + /** + * Remove socket with given id from this manager. + * + * Usually called by `Socket` instances when they're destroyed. + */ + remove(id) { + log.debug(`Remove socket, id=${id}`); + + delete this._sockets[id]; + } } - module.exports = new SocketManager(); diff --git a/modules/sockets/base.js b/modules/sockets/base.js index 9f90910e6..65c9ab0ed 100644 --- a/modules/sockets/base.js +++ b/modules/sockets/base.js @@ -4,215 +4,210 @@ const EventEmitter = require('events').EventEmitter; const log = require('../utils/logger').create('Sockets'); - const CONNECT_INTERVAL_MS = 1000; const CONNECT_TIMEOUT_MS = 3000; - /** * Socket connecting to Ethereum Node. */ class Socket extends EventEmitter { - constructor(socketMgr, id) { - super(); - - this._mgr = socketMgr; - this._id = id; - - this._log = log.create(this._id); - - this._state = null; - } - - - get id() { - return this._id; - } - - - get isConnected() { - return STATE.CONNECTED === this._state; - } + constructor(socketMgr, id) { + super(); + this._mgr = socketMgr; + this._id = id; - /** - * Connect to host. - * @param {Object} connectConfig - * @param {Object} [options] - * @param {Number} [options.timeout] Milliseconds to wait before timeout (default is 5000). - * @return {Promise} - */ - connect(connectConfig, options) { - this._log.info(`Connect to ${JSON.stringify(connectConfig)}`); + this._log = log.create(this._id); - options = _.extend({ - timeout: CONNECT_TIMEOUT_MS, - }, options); + this._state = null; + } - return this._resetSocket() - .then(() => { - let connectTimerId = null; - let timeoutTimerId = null; + get id() { + return this._id; + } - this._log.debug('Connecting...'); + get isConnected() { + return STATE.CONNECTED === this._state; + } - this._log.debug(`Will wait ${options.timeout}ms for connection to happen.`); + /** + * Connect to host. + * @param {Object} connectConfig + * @param {Object} [options] + * @param {Number} [options.timeout] Milliseconds to wait before timeout (default is 5000). + * @return {Promise} + */ + connect(connectConfig, options) { + this._log.info(`Connect to ${JSON.stringify(connectConfig)}`); - this._state = STATE.CONNECTING; + options = _.extend( + { + timeout: CONNECT_TIMEOUT_MS + }, + options + ); - return new Q((resolve, reject) => { - this._socket.once('connect', () => { - if (STATE.CONNECTING === this._state) { - this._log.info('Connected!'); + return this._resetSocket().then(() => { + let connectTimerId = null; + let timeoutTimerId = null; - this._state = STATE.CONNECTED; + this._log.debug('Connecting...'); - clearTimeout(connectTimerId); - clearTimeout(timeoutTimerId); + this._log.debug( + `Will wait ${options.timeout}ms for connection to happen.` + ); - this.emit('connect'); + this._state = STATE.CONNECTING; - resolve(); - } - }); + return new Q((resolve, reject) => { + this._socket.once('connect', () => { + if (STATE.CONNECTING === this._state) { + this._log.info('Connected!'); - this._socket.on('error', (err) => { - if (STATE.CONNECTING === this._state) { - this._log.warn(`Connection failed, retrying after ${CONNECT_INTERVAL_MS}ms...`); + this._state = STATE.CONNECTED; - connectTimerId = setTimeout(() => { - this._socket.connect(connectConfig); - }, CONNECT_INTERVAL_MS); - } - }); + clearTimeout(connectTimerId); + clearTimeout(timeoutTimerId); - timeoutTimerId = setTimeout(() => { - if (STATE.CONNECTING === this._state) { - this._log.error(`Connection failed (${options.timeout}ms elapsed)`); + this.emit('connect'); - this._state = STATE.CONNECTION_TIMEOUT; + resolve(); + } + }); - clearTimeout(connectTimerId); + this._socket.on('error', err => { + if (STATE.CONNECTING === this._state) { + this._log.warn( + `Connection failed, retrying after ${CONNECT_INTERVAL_MS}ms...` + ); - return reject(new Error('Unable to connect to socket: timeout')); - } - }, options.timeout); + connectTimerId = setTimeout(() => { + this._socket.connect(connectConfig); + }, CONNECT_INTERVAL_MS); + } + }); - // initial kick-off - this._socket.connect(connectConfig); - }); - }); - } + timeoutTimerId = setTimeout(() => { + if (STATE.CONNECTING === this._state) { + this._log.error(`Connection failed (${options.timeout}ms elapsed)`); - resume() { - this._socket.resume.apply(this, arguments); - } + this._state = STATE.CONNECTION_TIMEOUT; - pause() { - this._socket.pause.apply(this, arguments); - } + clearTimeout(connectTimerId); - pipe() { - this._socket.pipe.apply(this, arguments); - } + return reject(new Error('Unable to connect to socket: timeout')); + } + }, options.timeout); - /** - * Disconnect from socket. - * @return {Promise} - */ - disconnect(options) { - if (!this._disconnectPromise) { - this._disconnectPromise = new Q((resolve, reject) => { - this._log.info('Disconnecting...'); + // initial kick-off + this._socket.connect(connectConfig); + }); + }); + } - this._state = STATE.DISCONNECTING; + resume() { + this._socket.resume.apply(this, arguments); + } - // remove all existing listeners - this._socket.removeAllListeners(); + pause() { + this._socket.pause.apply(this, arguments); + } - const timer = setTimeout(() => { - log.warn('Disconnection timed out, closing socket anyway...'); + pipe() { + this._socket.pipe.apply(this, arguments); + } - this._state = STATE.DISCONNECTION_TIMEOUT; + /** + * Disconnect from socket. + * @return {Promise} + */ + disconnect(options) { + if (!this._disconnectPromise) { + this._disconnectPromise = new Q((resolve, reject) => { + this._log.info('Disconnecting...'); - resolve(); - }, 5000 /* wait 5 seconds for disconnection */); + this._state = STATE.DISCONNECTING; - this._socket.once('close', () => { - // if we manually killed it then all good - if (STATE.DISCONNECTING === this._state) { - this._log.debug('Disconnected as expected'); - } else { - this._log.warn('Unexpectedly disconnected'); - } + // remove all existing listeners + this._socket.removeAllListeners(); + + const timer = setTimeout(() => { + log.warn('Disconnection timed out, closing socket anyway...'); - this._state = STATE.DISCONNECTED; + this._state = STATE.DISCONNECTION_TIMEOUT; - clearTimeout(timer); + resolve(); + }, 5000 /* wait 5 seconds for disconnection */); - resolve(); - }); + this._socket.once('close', () => { + // if we manually killed it then all good + if (STATE.DISCONNECTING === this._state) { + this._log.debug('Disconnected as expected'); + } else { + this._log.warn('Unexpectedly disconnected'); + } - this._socket.destroy(); - }) - .finally(() => { - this._disconnectPromise = null; - }); - } + this._state = STATE.DISCONNECTED; - return this._disconnectPromise; - } + clearTimeout(timer); + resolve(); + }); - /** - * An alias to `disconnect()`. - * @return {Promise} - */ - destroy() { - this.removeAllListeners(); - return this.disconnect(); + this._socket.destroy(); + }).finally(() => { + this._disconnectPromise = null; + }); } - - /** - * Write data to socket. - * @param {String} data - */ - write(data) { - if (STATE.CONNECTED !== this._state) { - throw new Error('Socket not connected'); - } - - this._log.trace('Write data', data); - - this._socket.write(data); + return this._disconnectPromise; + } + + /** + * An alias to `disconnect()`. + * @return {Promise} + */ + destroy() { + this.removeAllListeners(); + return this.disconnect(); + } + + /** + * Write data to socket. + * @param {String} data + */ + write(data) { + if (STATE.CONNECTED !== this._state) { + throw new Error('Socket not connected'); } - - /** - * Reset socket. - * - * Upon completion `this._socket` will be set to a valid socket object, but - * not yet connected. - * - * To be implemented by subclasses. - */ - _resetSocket() { - return Q.reject(new Error('Not yet implemented')); - } + this._log.trace('Write data', data); + + this._socket.write(data); + } + + /** + * Reset socket. + * + * Upon completion `this._socket` will be set to a valid socket object, but + * not yet connected. + * + * To be implemented by subclasses. + */ + _resetSocket() { + return Q.reject(new Error('Not yet implemented')); + } } - exports.Socket = Socket; - -const STATE = exports.STATE = Socket.STATE = { - CREATED: 0, - CONNECTING: 1, - CONNECTED: 2, - DISCONNECTING: 3, - DISCONNECTED: 4, - ERROR: -1, - DISCONNECTION_TIMEOUT: -2, - CONNECTION_TIMEOUT: -3, -}; +const STATE = (exports.STATE = Socket.STATE = { + CREATED: 0, + CONNECTING: 1, + CONNECTED: 2, + DISCONNECTING: 3, + DISCONNECTED: 4, + ERROR: -1, + DISCONNECTION_TIMEOUT: -2, + CONNECTION_TIMEOUT: -3 +}); diff --git a/modules/sockets/web3Base.js b/modules/sockets/web3Base.js index 9b2dd9978..8503a0c87 100644 --- a/modules/sockets/web3Base.js +++ b/modules/sockets/web3Base.js @@ -7,155 +7,144 @@ const Socket = SocketBase.Socket; const STATE = SocketBase.STATE; module.exports = class Web3Socket extends Socket { - constructor(socketMgr, id) { - super(socketMgr, id); - - this._sendRequests = {}; - - this._handleSocketResponse(); - } - - - /** - * Send an RPC call. - * @param {Array|Object} single or array of payloads. - * @param {Object} options Additional options. - * @param {Boolean} [options.fullResult] If set then will return full result - * JSON, not just result value. - * @return {Promise} - */ - send(payload, options) { - return Q.try(() => { - if (!this.isConnected) { - throw new Error('Not connected'); - } - - const isBatch = _.isArray(payload); - - const finalPayload = isBatch - ? _.map(payload, p => this._finalizeSinglePayload(p)) - : this._finalizeSinglePayload(payload); - - /* + constructor(socketMgr, id) { + super(socketMgr, id); + + this._sendRequests = {}; + + this._handleSocketResponse(); + } + + /** + * Send an RPC call. + * @param {Array|Object} single or array of payloads. + * @param {Object} options Additional options. + * @param {Boolean} [options.fullResult] If set then will return full result + * JSON, not just result value. + * @return {Promise} + */ + send(payload, options) { + return Q.try(() => { + if (!this.isConnected) { + throw new Error('Not connected'); + } + + const isBatch = _.isArray(payload); + + const finalPayload = isBatch + ? _.map(payload, p => this._finalizeSinglePayload(p)) + : this._finalizeSinglePayload(payload); + + /* For batch requeests we use the id of the first request as the id to refer to the batch as one. We can do this because the response will also come back as a batch, in the same order as the the requests within the batch were sent. */ - const id = isBatch - ? finalPayload[0].id - : finalPayload.id; + const id = isBatch ? finalPayload[0].id : finalPayload.id; - this._log.trace( - isBatch ? 'Batch request' : 'Request', - id, finalPayload - ); + this._log.trace(isBatch ? 'Batch request' : 'Request', id, finalPayload); - this._sendRequests[id] = { - options, - /* Preserve the original id of the request so that we can + this._sendRequests[id] = { + options, + /* Preserve the original id of the request so that we can update the response with it */ - origId: ( - isBatch ? _.map(payload, p => p.id) : payload.id - ), - }; + origId: isBatch ? _.map(payload, p => p.id) : payload.id + }; - this.write(JSON.stringify(finalPayload)); + this.write(JSON.stringify(finalPayload)); - return new Q((resolve, reject) => { - _.extend(this._sendRequests[id], { - resolve, - reject, - }); - }); + return new Q((resolve, reject) => { + _.extend(this._sendRequests[id], { + resolve, + reject }); + }); + }); + } + + /** + * Construct a payload object. + * @param {Object} payload Payload to send. + * @param {String} payload.method Method name. + * @param {Object} [payload.params] Method arguments. + * @return {Object} final payload object + */ + _finalizeSinglePayload(payload) { + if (!payload.method) { + throw new Error('Method required'); } + return { + jsonrpc: '2.0', + id: _.uuid(), + method: payload.method, + params: payload.params || [] + }; + } - /** - * Construct a payload object. - * @param {Object} payload Payload to send. - * @param {String} payload.method Method name. - * @param {Object} [payload.params] Method arguments. - * @return {Object} final payload object - */ - _finalizeSinglePayload(payload) { - if (!payload.method) { - throw new Error('Method required'); - } + /** + * Handle responses from Geth. + */ + _handleSocketResponse() { + oboe(this) + .done(result => { + this._log.trace('JSON response', result); - return { - jsonrpc: '2.0', - id: _.uuid(), - method: payload.method, - params: payload.params || [], - }; - } + try { + const isBatch = _.isArray(result); + const firstItem = isBatch ? result[0] : result; + + const req = firstItem.id ? this._sendRequests[firstItem.id] : null; + + if (req) { + this._log.trace( + isBatch ? 'Batch response' : 'Response', + firstItem.id, + result + ); - /** - * Handle responses from Geth. - */ - _handleSocketResponse() { - oboe(this) - .done((result) => { - this._log.trace('JSON response', result); - - try { - - const isBatch = _.isArray(result); - - const firstItem = isBatch ? result[0] : result; - - const req = firstItem.id ? this._sendRequests[firstItem.id] : null; - - if (req) { - this._log.trace( - isBatch ? 'Batch response' : 'Response', - firstItem.id, result - ); - - // if we don't want full JSON result, send just the result - if (!_.get(req, 'options.fullResult')) { - if (isBatch) { - result = _.map(result, r => r.result); - } else { - result = result.result; - } - } else { - // restore original ids - if (isBatch) { - req.origId.forEach((id, idx) => { - if (result[idx]) { - result[idx].id = id; - } - }); - } else { - result.id = req.origId; - } - } - - req.resolve({ - isBatch, - result, - }); - } else { - // not a response to a request so pass it on as a notification - this.emit('data-notification', result); - } - - } catch (err) { - this._log.error('Error handling socket response', err); + // if we don't want full JSON result, send just the result + if (!_.get(req, 'options.fullResult')) { + if (isBatch) { + result = _.map(result, r => r.result); + } else { + result = result.result; + } + } else { + // restore original ids + if (isBatch) { + req.origId.forEach((id, idx) => { + if (result[idx]) { + result[idx].id = id; + } + }); + } else { + result.id = req.origId; + } } - }) - .fail((err) => { - this._log.error('Socket response error', err); - _.each(this._sendRequests, (req) => { - req.reject(err); + req.resolve({ + isBatch, + result }); + } else { + // not a response to a request so pass it on as a notification + this.emit('data-notification', result); + } + } catch (err) { + this._log.error('Error handling socket response', err); + } + }) + .fail(err => { + this._log.error('Socket response error', err); - this._sendRequests = {}; + _.each(this._sendRequests, req => { + req.reject(err); }); - } + + this._sendRequests = {}; + }); + } }; diff --git a/modules/sockets/web3Http.js b/modules/sockets/web3Http.js index 01bc14403..880ef830a 100644 --- a/modules/sockets/web3Http.js +++ b/modules/sockets/web3Http.js @@ -7,124 +7,122 @@ const STATE = SocketBase.STATE; const Web3SocketBase = require('./web3Base'); - class HttpSocket extends EventEmitter { - constructor(_parentSocket) { - super(); - - this._log = _parentSocket._log.create('HttpSocket'); - } - - connect(connectConfig) { - this._log.trace('Connect', connectConfig); - - this._hostPort = connectConfig.hostPort; - - const payload = JSON.stringify({ - jsonrpc: '2.0', - id: 0, - method: 'eth_accounts', - params: [], - }); - - this._call(payload) - .then(() => { - this._log.trace('Connection successful'); - - this.emit('connect'); - }) - .catch((err) => { - this._log.trace('Connection failed', err); - - this.emit.bind(this, new Error('Unable to connect to HTTP RPC')); - }); - } - - destroy() { - this._log.trace('Destroy'); - - this._hostPort = null; - - this.emit('close'); - } - - write(data) { - this._log.trace('Write data', data); - - this._call(data) - .then((body) => { - this._log.trace('Got response', body); - - this.emit('data', body); - }) - .catch(this.emit.bind(this, 'error')); - } - - setEncoding(enc) { - this._log.trace('Set encoding', enc); - - this._encoding = enc; - } - - _call(dataStr) { - return got.post(this._hostPort, { - encoding: this._encoding, - headers: { - 'Content-Type': 'application/json', - }, - body: dataStr, - }) - .then((res) => { - return res.body; - }); - } + constructor(_parentSocket) { + super(); + + this._log = _parentSocket._log.create('HttpSocket'); + } + + connect(connectConfig) { + this._log.trace('Connect', connectConfig); + + this._hostPort = connectConfig.hostPort; + + const payload = JSON.stringify({ + jsonrpc: '2.0', + id: 0, + method: 'eth_accounts', + params: [] + }); + + this._call(payload) + .then(() => { + this._log.trace('Connection successful'); + + this.emit('connect'); + }) + .catch(err => { + this._log.trace('Connection failed', err); + + this.emit.bind(this, new Error('Unable to connect to HTTP RPC')); + }); + } + + destroy() { + this._log.trace('Destroy'); + + this._hostPort = null; + + this.emit('close'); + } + + write(data) { + this._log.trace('Write data', data); + + this._call(data) + .then(body => { + this._log.trace('Got response', body); + + this.emit('data', body); + }) + .catch(this.emit.bind(this, 'error')); + } + + setEncoding(enc) { + this._log.trace('Set encoding', enc); + + this._encoding = enc; + } + + _call(dataStr) { + return got + .post(this._hostPort, { + encoding: this._encoding, + headers: { + 'Content-Type': 'application/json' + }, + body: dataStr + }) + .then(res => { + return res.body; + }); + } } - module.exports = class Web3HttpSocket extends Web3SocketBase { - /** - * Reset socket. - */ - _resetSocket() { - this._log.debug('Resetting socket'); - - return Q.try(() => { - if (STATE.CONNECTED === this._state) { - this._log.debug('Disconnecting prior to reset'); - - return this.disconnect(); - } - }) - .then(() => { - this._socket = new HttpSocket(this); - - this._socket.setEncoding('utf8'); - - this._socket.on('close', (hadError) => { - // if we did the disconnection then all good - if (STATE.DISCONNECTING === this._state) { - return; - } - - this.emit('close', hadError); - }); - - this._socket.on('data', (data) => { - this._log.trace('Got data'); - - this.emit('data', data); - }); - - this._socket.on('error', (err) => { - // connection errors will be handled in connect() code - if (STATE.CONNECTING === this._state) { - return; - } - - this._log.error(err); - - this.emit('error', err); - }); - }); - } + /** + * Reset socket. + */ + _resetSocket() { + this._log.debug('Resetting socket'); + + return Q.try(() => { + if (STATE.CONNECTED === this._state) { + this._log.debug('Disconnecting prior to reset'); + + return this.disconnect(); + } + }).then(() => { + this._socket = new HttpSocket(this); + + this._socket.setEncoding('utf8'); + + this._socket.on('close', hadError => { + // if we did the disconnection then all good + if (STATE.DISCONNECTING === this._state) { + return; + } + + this.emit('close', hadError); + }); + + this._socket.on('data', data => { + this._log.trace('Got data'); + + this.emit('data', data); + }); + + this._socket.on('error', err => { + // connection errors will be handled in connect() code + if (STATE.CONNECTING === this._state) { + return; + } + + this._log.error(err); + + this.emit('error', err); + }); + }); + } }; diff --git a/modules/sockets/web3Ipc.js b/modules/sockets/web3Ipc.js index 32953ef00..9fe18df61 100644 --- a/modules/sockets/web3Ipc.js +++ b/modules/sockets/web3Ipc.js @@ -6,65 +6,63 @@ const STATE = SocketBase.STATE; const Web3SocketBase = require('./web3Base'); - module.exports = class Web3IpcSocket extends Web3SocketBase { - /** - * Reset socket. - */ - _resetSocket() { - this._log.debug('Resetting socket'); + /** + * Reset socket. + */ + _resetSocket() { + this._log.debug('Resetting socket'); - return Q.try(() => { - if (STATE.CONNECTED === this._state) { - this._log.debug('Disconnecting prior to reset'); + return Q.try(() => { + if (STATE.CONNECTED === this._state) { + this._log.debug('Disconnecting prior to reset'); - return this.disconnect(); - } - }) - .then(() => { - this._socket = new net.Socket(); + return this.disconnect(); + } + }).then(() => { + this._socket = new net.Socket(); - this._socket.setTimeout(0); - this._socket.setEncoding('utf8'); - this._socket.unref(); /* allow app to exit even if socket fails to close */ + this._socket.setTimeout(0); + this._socket.setEncoding('utf8'); + this._socket.unref(); /* allow app to exit even if socket fails to close */ - this._socket.on('close', (hadError) => { - // if we did the disconnection then all good - if (STATE.DISCONNECTING === this._state) { - return; - } + this._socket.on('close', hadError => { + // if we did the disconnection then all good + if (STATE.DISCONNECTING === this._state) { + return; + } - this.emit('close', hadError); - }); + this.emit('close', hadError); + }); - this._socket.on('end', () => { - this._log.debug('Got "end" event'); + this._socket.on('end', () => { + this._log.debug('Got "end" event'); - this.emit('end'); - }); + this.emit('end'); + }); - this._socket.on('data', (data) => { - this._log.trace('Got data'); + this._socket.on('data', data => { + this._log.trace('Got data'); - this.emit('data', data); - }); + this.emit('data', data); + }); - this._socket.on('timeout', () => { - this._log.trace('Timeout'); + this._socket.on('timeout', () => { + this._log.trace('Timeout'); - this.emit('timeout'); - }); + this.emit('timeout'); + }); - this._socket.on('error', (err) => { - // connection errors will be handled in connect() code - if (STATE.CONNECTING === this._state) { - return; - } + this._socket.on('error', err => { + // connection errors will be handled in connect() code + if (STATE.CONNECTING === this._state) { + return; + } - this._log.error(err); + this._log.error(err); - this.emit('error', err); - }); - }); - } + this.emit('error', err); + }); + }); + } }; diff --git a/modules/swarmNode.js b/modules/swarmNode.js index 994fa0b2d..de6da4947 100644 --- a/modules/swarmNode.js +++ b/modules/swarmNode.js @@ -11,103 +11,107 @@ import Swarm from 'swarm-js'; let instance = null; class SwarmNode extends EventEmitter { - constructor() { - super(); + constructor() { + super(); - if (!instance) { - instance = this; - } - - return instance; + if (!instance) { + instance = this; } - getKeyPath() { - // TODO: replace by web3.utils.randomHex when we use it - function randomHex(bytes) { - let hex = ''; - for (let i = 0; i < bytes * 2; i = i + 1) { - hex += (Math.random() * 16 | 0).toString(16); - } - return hex; - } - - // Gets Swarm Key path - const swarmKeyDir = path.join(Settings.userDataPath, 'swarmjs'); - const swarmKeyPath = path.join(swarmKeyDir, 'swarmKey'); - - // Generates the key if not there - if (!fs.existsSync(swarmKeyDir)) { - fs.mkdirSync(swarmKeyDir); - } - if (!fs.existsSync(swarmKeyPath)) { - fs.writeFileSync(swarmKeyPath, randomHex(32)); - } - - return swarmKeyPath; + return instance; + } + + getKeyPath() { + // TODO: replace by web3.utils.randomHex when we use it + function randomHex(bytes) { + let hex = ''; + for (let i = 0; i < bytes * 2; i = i + 1) { + hex += ((Math.random() * 16) | 0).toString(16); + } + return hex; } - startUsingLocalNode() { - const totalSize = 7406937; // TODO: hardcoded & innacurate, use archives.json instead - let totalDownloaded = 0; - - const swarmBinDir = path.join(Settings.userDataPath, 'swarmjs', 'bin'); - const swarmBinExt = os.platform() === 'win32' ? '.exe' : ''; - const swarmBinPath = path.join(swarmBinDir, `swarm${swarmBinExt}`); - - const config = { - privateKey: this.getKeyPath(), - dataDir: path.join(Settings.userDataPath, 'swarmjs'), - ensApi: Settings.rpcIpcPath, - binPath: swarmBinPath, - onProgress: size => this.emit('downloadProgress', (totalDownloaded += size) / totalSize), - archives: clientBinaries.swarm.archives - }; - - return new Q((resolve, reject) => { - Swarm.local(config)(swarm => new Q((stop) => { - this.emit('started', true); - this._stop = stop; - this._swarm = swarm; - resolve(this); - })).catch(reject); - }); + // Gets Swarm Key path + const swarmKeyDir = path.join(Settings.userDataPath, 'swarmjs'); + const swarmKeyPath = path.join(swarmKeyDir, 'swarmKey'); + + // Generates the key if not there + if (!fs.existsSync(swarmKeyDir)) { + fs.mkdirSync(swarmKeyDir); + } + if (!fs.existsSync(swarmKeyPath)) { + fs.writeFileSync(swarmKeyPath, randomHex(32)); } - startUsingGateway() { - return new Q((resolve, reject) => { - this.emit('started', false); - this._swarm = Swarm.at(Settings.swarmURL); - this._stop = () => {}; + return swarmKeyPath; + } + + startUsingLocalNode() { + const totalSize = 7406937; // TODO: hardcoded & innacurate, use archives.json instead + let totalDownloaded = 0; + + const swarmBinDir = path.join(Settings.userDataPath, 'swarmjs', 'bin'); + const swarmBinExt = os.platform() === 'win32' ? '.exe' : ''; + const swarmBinPath = path.join(swarmBinDir, `swarm${swarmBinExt}`); + + const config = { + privateKey: this.getKeyPath(), + dataDir: path.join(Settings.userDataPath, 'swarmjs'), + ensApi: Settings.rpcIpcPath, + binPath: swarmBinPath, + onProgress: size => + this.emit('downloadProgress', (totalDownloaded += size) / totalSize), + archives: clientBinaries.swarm.archives + }; + + return new Q((resolve, reject) => { + Swarm.local(config)( + swarm => + new Q(stop => { + this.emit('started', true); + this._stop = stop; + this._swarm = swarm; resolve(this); - }); + }) + ).catch(reject); + }); + } + + startUsingGateway() { + return new Q((resolve, reject) => { + this.emit('started', false); + this._swarm = Swarm.at(Settings.swarmURL); + this._stop = () => {}; + resolve(this); + }); + } + + init() { + this.emit('starting'); + + if (Settings.swarmURL === 'http://localhost:8500') { + return this.startUsingLocalNode(); } + return this.startUsingGateway(); + } - init() { - this.emit('starting'); - - if (Settings.swarmURL === 'http://localhost:8500') { - return this.startUsingLocalNode(); - } - return this.startUsingGateway(); + stop() { + if (!this._swarm) { + return Q.reject(new Error('Swarm not initialized, unable to stop.')); } - stop() { - if (!this._swarm) { - return Q.reject(new Error('Swarm not initialized, unable to stop.')); - } + this.emit('stopping'); + this._stop(); + this.emit('stopped'); + } - this.emit('stopping'); - this._stop(); - this.emit('stopped'); + upload(arg) { + if (!this._swarm) { + return Q.reject(new Error('Swarm not initialized, unable to upload.')); } - upload(arg) { - if (!this._swarm) { - return Q.reject(new Error('Swarm not initialized, unable to upload.')); - } - - return this._swarm.upload(arg); - } + return this._swarm.upload(arg); + } } module.exports = new SwarmNode(); diff --git a/modules/updateChecker.js b/modules/updateChecker.js index 5c45fdd1f..3fd53ebdb 100644 --- a/modules/updateChecker.js +++ b/modules/updateChecker.js @@ -5,100 +5,106 @@ const log = require('./utils/logger').create('updateChecker'); const got = require('got'); const semver = require('semver'); - /** * Check for updates to the app. * @return {[type]} [description] */ -const check = exports.check = () => { - log.info('Check for update...'); +const check = (exports.check = () => { + log.info('Check for update...'); - let str = null; + let str = null; - switch (Settings.uiMode) { // eslint-disable-line default-case + switch (Settings.uiMode) { // eslint-disable-line default-case case 'mist': - str = 'mist'; - break; + str = 'mist'; + break; case 'wallet': - str = 'wallet'; - break; - } - - return got('https://api.github.com/repos/ethereum/mist/releases', { - timeout: 3000, - json: true, - }) - .then((res) => { - const releases = _.filter(res.body, (release) => { - return ( - !_.get(release, 'draft') - && _.get(release, 'name', '').toLowerCase().indexOf(str) >= 0 - ); - }); - - if (!releases.length) { - log.debug('No releases available to check against.'); - - return; - } - - const latest = releases[0]; - - if (semver.gt(latest.tag_name, Settings.appVersion)) { - log.info(`App (${Settings.appVersion}) is out of date. New ${latest.tag_name} found.`); - - return { - name: latest.name, - version: latest.tag_name, - url: latest.html_url, - }; - } - - log.info('App is up-to-date.'); + str = 'wallet'; + break; + } + + return got('https://api.github.com/repos/ethereum/mist/releases', { + timeout: 3000, + json: true + }) + .then(res => { + const releases = _.filter(res.body, release => { + return ( + !_.get(release, 'draft') && + _.get(release, 'name', '') + .toLowerCase() + .indexOf(str) >= 0 + ); + }); + + if (!releases.length) { + log.debug('No releases available to check against.'); + + return; + } + + const latest = releases[0]; + + if (semver.gt(latest.tag_name, Settings.appVersion)) { + log.info( + `App (${Settings.appVersion}) is out of date. New ${ + latest.tag_name + } found.` + ); + + return { + name: latest.name, + version: latest.tag_name, + url: latest.html_url + }; + } + + log.info('App is up-to-date.'); }) - .catch((err) => { - log.error('Error checking for update', err); + .catch(err => { + log.error('Error checking for update', err); }); -}; - +}); function showWindow(options) { - log.debug('Show update checker window'); + log.debug('Show update checker window'); - return Windows.createPopup('updateAvailable', options); + return Windows.createPopup('updateAvailable', options); } - exports.run = () => { - check().then((update) => { - if (update) { - showWindow({ - sendData: { - uiAction_checkUpdateDone: update, - }, - }); - } - store.dispatch({ type: '[MAIN]:UPDATE_CHECKER:FINISHED' }); - }).catch((err) => { - log.error(err); + check() + .then(update => { + if (update) { + showWindow({ + sendData: { + uiAction_checkUpdateDone: update + } + }); + } + store.dispatch({ type: '[MAIN]:UPDATE_CHECKER:FINISHED' }); + }) + .catch(err => { + log.error(err); }); }; - exports.runVisibly = () => { - const wnd = showWindow({ - sendData: 'uiAction_checkUpdateInProgress', - }); - - wnd.on('ready', () => { - check().then((update) => { - wnd.send({ - uiAction_checkUpdateDone: update, - }); - }).catch((err) => { - log.error(err); - - wnd.send('uiAction_checkUpdateDone'); + const wnd = showWindow({ + sendData: 'uiAction_checkUpdateInProgress' + }); + + wnd.on('ready', () => { + check() + .then(update => { + wnd.send({ + uiAction_checkUpdateDone: update }); - }); + }) + .catch(err => { + log.error(err); + + wnd.send('uiAction_checkUpdateDone'); + }); + }); }; diff --git a/modules/utils/logger.js b/modules/utils/logger.js index 676d9534a..4ab0ba1a2 100644 --- a/modules/utils/logger.js +++ b/modules/utils/logger.js @@ -7,49 +7,47 @@ import log4js from 'log4js'; * @param {String} [options.logLevel] Minimum logging threshold (default: info). * @param {String} [options.logFolder] Log folder to write logs to. */ -exports.setup = function (options) { - const logFolder = options.logFolder - const level = options.logLevel || 'info'; - - const config = { - appenders: { - out: { type: 'console' }, - all: { - type: 'file', - filename: `${logFolder}/all.log`, - }, - main: { - type: 'file', - filename: `${logFolder}/category/main.log`, - - }, - EthereumNode: { - type: 'file', - filename: `${logFolder}/category/ethereum_node.log` - }, - swarm: { - type: 'file', - filename: `${logFolder}/category/swarm.log` - } - }, - categories: { - default: { appenders: [ 'out', 'all', 'main' ], level }, - EthereumNode: { appenders: [ 'out', 'all', 'EthereumNode' ], level }, - swarm: { appenders: [ 'out', 'all', 'swarm' ], level } - } - }; - - log4js.configure(config); +exports.setup = function(options) { + const logFolder = options.logFolder; + const level = options.logLevel || 'info'; + + const config = { + appenders: { + out: { type: 'console' }, + all: { + type: 'file', + filename: `${logFolder}/all.log` + }, + main: { + type: 'file', + filename: `${logFolder}/category/main.log` + }, + EthereumNode: { + type: 'file', + filename: `${logFolder}/category/ethereum_node.log` + }, + swarm: { + type: 'file', + filename: `${logFolder}/category/swarm.log` + } + }, + categories: { + default: { appenders: ['out', 'all', 'main'], level }, + EthereumNode: { appenders: ['out', 'all', 'EthereumNode'], level }, + swarm: { appenders: ['out', 'all', 'swarm'], level } + } + }; + + log4js.configure(config); }; +exports.create = category => { + const logger = log4js.getLogger(category); -exports.create = (category) => { - const logger = log4js.getLogger(category); - - // Allow for easy creation of sub-categories. - logger.create = (subCategory) => { - return exports.create(`${category}/${subCategory}`); - }; + // Allow for easy creation of sub-categories. + logger.create = subCategory => { + return exports.create(`${category}/${subCategory}`); + }; - return logger; + return logger; }; diff --git a/modules/utils/underscore.js b/modules/utils/underscore.js index 98b51d9e1..3231f7b32 100644 --- a/modules/utils/underscore.js +++ b/modules/utils/underscore.js @@ -1,39 +1,39 @@ -const _ = module.exports = require('underscore'); +const _ = (module.exports = require('underscore')); const uuid = require('uuid'); const underscoreDeepExtend = require('underscore-deep-extend'); _.mixin({ - /** - * Get a deeply nested object property. - * - * @param {Object} obj The object. - * @param {String} path The path within the object to fetch. - * @param {*} fallbackValue The value to return if given path not found. - * - * @return {*} Returns value if found; otherwise the fallbackVAlue. - */ - get(obj, path, fallbackValue) { - if (this.isUndefined(obj) || obj === null || typeof path !== 'string') { - return fallbackValue; - } + /** + * Get a deeply nested object property. + * + * @param {Object} obj The object. + * @param {String} path The path within the object to fetch. + * @param {*} fallbackValue The value to return if given path not found. + * + * @return {*} Returns value if found; otherwise the fallbackVAlue. + */ + get(obj, path, fallbackValue) { + if (this.isUndefined(obj) || obj === null || typeof path !== 'string') { + return fallbackValue; + } - const fields = path.split('.'); - let result = obj; + const fields = path.split('.'); + let result = obj; - for (let i = 0; i < fields.length; ++i) { - if (!this.isObject(result) && !this.isArray(result)) { - return fallbackValue; - } + for (let i = 0; i < fields.length; ++i) { + if (!this.isObject(result) && !this.isArray(result)) { + return fallbackValue; + } - result = result[fields[i]]; - } + result = result[fields[i]]; + } - return result || fallbackValue; - }, - deepExtend: underscoreDeepExtend(_), - uuid() { - return uuid.v4(); - }, + return result || fallbackValue; + }, + deepExtend: underscoreDeepExtend(_), + uuid() { + return uuid.v4(); + } }); module.exports = _; diff --git a/modules/web3Admin.js b/modules/web3Admin.js index b0bc656ae..3496f2466 100644 --- a/modules/web3Admin.js +++ b/modules/web3Admin.js @@ -1,93 +1,227 @@ module.exports = { - extend: (web3) => { - function insertMethod(name, call, params, inputFormatter, outputFormatter) { - return new web3._extend.Method({ name, call, params, inputFormatter, outputFormatter }); - } + extend: web3 => { + function insertMethod(name, call, params, inputFormatter, outputFormatter) { + return new web3._extend.Method({ + name, + call, + params, + inputFormatter, + outputFormatter + }); + } - function insertProperty(name, getter, outputFormatter) { - return new web3._extend.Property({ name, getter, outputFormatter }); - } + function insertProperty(name, getter, outputFormatter) { + return new web3._extend.Property({ name, getter, outputFormatter }); + } - // ADMIN - web3._extend({ - property: 'admin', - methods: - [ - insertMethod('addPeer', 'admin_addPeer', 1, [null], web3._extend.formatters.formatOutputBool), - insertMethod('exportChain', 'admin_exportChain', 1, [null], null), - insertMethod('importChain', 'admin_importChain', 1, [null], null), - insertMethod('verbosity', 'admin_verbosity', 1, [web3._extend.utils.formatInputInt], web3._extend.formatters.formatOutputBool), - insertMethod('setSolc', 'admin_setSolc', 1, [null], web3._extend.formatters.formatOutputString), - insertMethod('startRPC', 'admin_startRPC', 4, [null, web3._extend.utils.formatInputInteger, null, null], web3._extend.formatters.formatOutputBool), - insertMethod('stopRPC', 'admin_stopRPC', 0, [], web3._extend.formatters.formatOutputBool), - ], - properties: - [ - insertProperty('nodeInfo', 'admin_nodeInfo', web3._extend.formatters.formatOutputString), - insertProperty('peers', 'admin_peers', null), - insertProperty('datadir', 'admin_datadir', web3._extend.formatters.formatOutputString), - insertProperty('chainSyncStatus', 'admin_chainSyncStatus', null), - ], - }); + // ADMIN + web3._extend({ + property: 'admin', + methods: [ + insertMethod( + 'addPeer', + 'admin_addPeer', + 1, + [null], + web3._extend.formatters.formatOutputBool + ), + insertMethod('exportChain', 'admin_exportChain', 1, [null], null), + insertMethod('importChain', 'admin_importChain', 1, [null], null), + insertMethod( + 'verbosity', + 'admin_verbosity', + 1, + [web3._extend.utils.formatInputInt], + web3._extend.formatters.formatOutputBool + ), + insertMethod( + 'setSolc', + 'admin_setSolc', + 1, + [null], + web3._extend.formatters.formatOutputString + ), + insertMethod( + 'startRPC', + 'admin_startRPC', + 4, + [null, web3._extend.utils.formatInputInteger, null, null], + web3._extend.formatters.formatOutputBool + ), + insertMethod( + 'stopRPC', + 'admin_stopRPC', + 0, + [], + web3._extend.formatters.formatOutputBool + ) + ], + properties: [ + insertProperty( + 'nodeInfo', + 'admin_nodeInfo', + web3._extend.formatters.formatOutputString + ), + insertProperty('peers', 'admin_peers', null), + insertProperty( + 'datadir', + 'admin_datadir', + web3._extend.formatters.formatOutputString + ), + insertProperty('chainSyncStatus', 'admin_chainSyncStatus', null) + ] + }); - // DEBUG - web3._extend({ - property: 'debug', - methods: - [ - insertMethod('printBlock', 'debug_printBlock', 1, [web3._extend.formatters.formatInputInt], web3._extend.formatters.formatOutputString), - insertMethod('getBlockRlp', 'debug_getBlockRlp', 1, [web3._extend.formatters.formatInputInt], web3._extend.formatters.formatOutputString), - insertMethod('setHead', 'debug_setHead', 1, [web3._extend.formatters.formatInputInt], web3._extend.formatters.formatOutputBool), - insertMethod('processBlock', 'debug_processBlock', 1, [web3._extend.formatters.formatInputInt], null), - insertMethod('seedHash', 'debug_seedHash', 1, [web3._extend.formatters.formatInputInt], web3._extend.formatters.formatOutputString), - insertMethod('dumpBlock', 'debug_dumpBlock', 1, [web3._extend.formatters.formatInputInt], null), - ], - properties: [], - }); + // DEBUG + web3._extend({ + property: 'debug', + methods: [ + insertMethod( + 'printBlock', + 'debug_printBlock', + 1, + [web3._extend.formatters.formatInputInt], + web3._extend.formatters.formatOutputString + ), + insertMethod( + 'getBlockRlp', + 'debug_getBlockRlp', + 1, + [web3._extend.formatters.formatInputInt], + web3._extend.formatters.formatOutputString + ), + insertMethod( + 'setHead', + 'debug_setHead', + 1, + [web3._extend.formatters.formatInputInt], + web3._extend.formatters.formatOutputBool + ), + insertMethod( + 'processBlock', + 'debug_processBlock', + 1, + [web3._extend.formatters.formatInputInt], + null + ), + insertMethod( + 'seedHash', + 'debug_seedHash', + 1, + [web3._extend.formatters.formatInputInt], + web3._extend.formatters.formatOutputString + ), + insertMethod( + 'dumpBlock', + 'debug_dumpBlock', + 1, + [web3._extend.formatters.formatInputInt], + null + ) + ], + properties: [] + }); - // MINER - web3._extend({ - property: 'miner', - methods: - [ - insertMethod('start', 'miner_start', 1, [web3._extend.formatters.formatInputInt], web3._extend.formatters.formatOutputBool), - insertMethod('stop', 'miner_stop', 1, [web3._extend.formatters.formatInputInt], web3._extend.formatters.formatOutputBool), - insertMethod('setExtra', 'miner_setExtra', 1, [null], web3._extend.formatters.formatOutputBool), - insertMethod('setGasPrice', 'miner_setGasPrice', 1, [web3._extend.utils.fromDecimal], web3._extend.formatters.formatOutputBool), - insertMethod('startAutoDAG', 'miner_startAutoDAG', 0, [], web3._extend.formatters.formatOutputBool), - insertMethod('stopAutoDAG', 'miner_stopAutoDAG', 0, [], web3._extend.formatters.formatOutputBool), - insertMethod('makeDAG', 'miner_makeDAG', 1, [web3._extend.formatters.inputDefaultBlockNumberFormatter], web3._extend.formatters.formatOutputBool), - ], - properties: - [ - insertProperty('hashrate', 'miner_hashrate', web3._extend.utils.toDecimal), - ], - }); + // MINER + web3._extend({ + property: 'miner', + methods: [ + insertMethod( + 'start', + 'miner_start', + 1, + [web3._extend.formatters.formatInputInt], + web3._extend.formatters.formatOutputBool + ), + insertMethod( + 'stop', + 'miner_stop', + 1, + [web3._extend.formatters.formatInputInt], + web3._extend.formatters.formatOutputBool + ), + insertMethod( + 'setExtra', + 'miner_setExtra', + 1, + [null], + web3._extend.formatters.formatOutputBool + ), + insertMethod( + 'setGasPrice', + 'miner_setGasPrice', + 1, + [web3._extend.utils.fromDecimal], + web3._extend.formatters.formatOutputBool + ), + insertMethod( + 'startAutoDAG', + 'miner_startAutoDAG', + 0, + [], + web3._extend.formatters.formatOutputBool + ), + insertMethod( + 'stopAutoDAG', + 'miner_stopAutoDAG', + 0, + [], + web3._extend.formatters.formatOutputBool + ), + insertMethod( + 'makeDAG', + 'miner_makeDAG', + 1, + [web3._extend.formatters.inputDefaultBlockNumberFormatter], + web3._extend.formatters.formatOutputBool + ) + ], + properties: [ + insertProperty( + 'hashrate', + 'miner_hashrate', + web3._extend.utils.toDecimal + ) + ] + }); - // NETWORK - web3._extend({ - property: 'network', - methods: - [ - insertMethod('getPeerCount', 'net_peerCount', 0, [], web3._extend.formatters.formatOutputString), - ], - properties: - [ - insertProperty('listening', 'net_listening', web3._extend.formatters.formatOutputBool), - insertProperty('peerCount', 'net_peerCount', web3._extend.utils.toDecimal), - insertProperty('peers', 'net_peers', null), - insertProperty('version', 'net_version', web3._extend.formatters.formatOutputString), - ], - }); + // NETWORK + web3._extend({ + property: 'network', + methods: [ + insertMethod( + 'getPeerCount', + 'net_peerCount', + 0, + [], + web3._extend.formatters.formatOutputString + ) + ], + properties: [ + insertProperty( + 'listening', + 'net_listening', + web3._extend.formatters.formatOutputBool + ), + insertProperty( + 'peerCount', + 'net_peerCount', + web3._extend.utils.toDecimal + ), + insertProperty('peers', 'net_peers', null), + insertProperty( + 'version', + 'net_version', + web3._extend.formatters.formatOutputString + ) + ] + }); - // TX POOL - web3._extend({ - property: 'txpool', - methods: [], - properties: - [ - insertProperty('status', 'txpool_status', null), - ], - }); - }, + // TX POOL + web3._extend({ + property: 'txpool', + methods: [], + properties: [insertProperty('status', 'txpool_status', null)] + }); + } }; diff --git a/modules/windows.js b/modules/windows.js index 5cc55bf48..ea40fe94a 100644 --- a/modules/windows.js +++ b/modules/windows.js @@ -3,657 +3,674 @@ const Settings = require('./settings'); const log = require('./utils/logger').create('Windows'); const EventEmitter = require('events').EventEmitter; import { - closeWindow, - openWindow, - resetGenericWindow, - reuseGenericWindow, + closeWindow, + openWindow, + resetGenericWindow, + reuseGenericWindow } from './core/ui/actions'; class GenericWindow extends EventEmitter { - constructor(mgr) { - super(); - - this._mgr = mgr; - this._log = log.create('generic'); - this.isPrimary = false; - this.type = 'generic'; - this.isPopup = true; - this.ownerId = null; - this.isAvailable = true; - this.actingType = null; - - this._log.debug('Creating generic window'); - let electronOptions = this._mgr.getDefaultOptionsForType('generic'); - this.window = new BrowserWindow(electronOptions); - - // set Accept_Language header - this.session = this.window.webContents.session; - this.session.setUserAgent(this.session.getUserAgent(), Settings.language); - - this.webContents = this.window.webContents; - this.webContents.once('did-finish-load', () => { - this._log.debug(`Content loaded, id: ${this.id}`); - this.emit('ready'); - }); - - // prevent dropping files - this.webContents.on('will-navigate', e => e.preventDefault()); - - this.window.once('closed', () => { - this._log.debug('Closed'); - this.emit('closed'); - }); - - this.window.on('close', (e) => { - // Preserve window unless quitting Mist - if (store.getState().ui.appQuit) { return this.emit('close', e); } - e.preventDefault(); - this.hide(); - }); - - this.window.on('show', e => this.emit('show', e)); - - this.window.on('hide', e => this.emit('hide', e)); - - this.load(`${global.interfacePopupsUrl}#generic`); + constructor(mgr) { + super(); + + this._mgr = mgr; + this._log = log.create('generic'); + this.isPrimary = false; + this.type = 'generic'; + this.isPopup = true; + this.ownerId = null; + this.isAvailable = true; + this.actingType = null; + + this._log.debug('Creating generic window'); + let electronOptions = this._mgr.getDefaultOptionsForType('generic'); + this.window = new BrowserWindow(electronOptions); + + // set Accept_Language header + this.session = this.window.webContents.session; + this.session.setUserAgent(this.session.getUserAgent(), Settings.language); + + this.webContents = this.window.webContents; + this.webContents.once('did-finish-load', () => { + this._log.debug(`Content loaded, id: ${this.id}`); + this.emit('ready'); + }); + + // prevent dropping files + this.webContents.on('will-navigate', e => e.preventDefault()); + + this.window.once('closed', () => { + this._log.debug('Closed'); + this.emit('closed'); + }); + + this.window.on('close', e => { + // Preserve window unless quitting Mist + if (store.getState().ui.appQuit) { + return this.emit('close', e); + } + e.preventDefault(); + this.hide(); + }); + + this.window.on('show', e => this.emit('show', e)); + + this.window.on('hide', e => this.emit('hide', e)); + + this.load(`${global.interfacePopupsUrl}#generic`); + } + + load(url) { + this._log.debug(`Load URL: ${url}`); + this.window.loadURL(url); + } + + send() { + this._log.trace('Sending data', arguments); + this.webContents.send.apply(this.webContents, arguments); + } + + hide() { + this._log.debug('Hide'); + this.window.hide(); + this.send('uiAction_switchTemplate', 'generic'); + this.actingType = null; + this.isAvailable = true; + this.emit('hidden'); + store.dispatch(resetGenericWindow()); + } + + show() { + this._log.debug('Show'); + this.window.show(); + } + + close() { + this._log.debug('Avoiding close of generic window'); + this.hide(); + } + + reuse(type, options, callback) { + this.isAvailable = false; + this.actingType = type; + if (callback) { + this.callback = callback; } - - load(url) { - this._log.debug(`Load URL: ${url}`); - this.window.loadURL(url); - } - - send() { - this._log.trace('Sending data', arguments); - this.webContents.send.apply(this.webContents, arguments); - } - - hide() { - this._log.debug('Hide'); - this.window.hide(); - this.send('uiAction_switchTemplate', 'generic'); - this.actingType = null; - this.isAvailable = true; - this.emit('hidden'); - store.dispatch(resetGenericWindow()); - } - - show() { - this._log.debug('Show'); - this.window.show(); - } - - close() { - this._log.debug('Avoiding close of generic window'); - this.hide(); + if (options.ownerId) { + this.ownerId = options.ownerId; } - - reuse(type, options, callback) { - this.isAvailable = false; - this.actingType = type; - if (callback) { this.callback = callback; } - if (options.ownerId) { this.ownerId = options.ownerId; } - if (options.sendData) { - if (_.isString(options.sendData)) { - this.send(options.sendData); - } else if (_.isObject(options.sendData)) { - for (const key in options.sendData) { - if ({}.hasOwnProperty.call(options.sendData, key)) { - this.send(key, options.sendData[key]); - } - } - } + if (options.sendData) { + if (_.isString(options.sendData)) { + this.send(options.sendData); + } else if (_.isObject(options.sendData)) { + for (const key in options.sendData) { + if ({}.hasOwnProperty.call(options.sendData, key)) { + this.send(key, options.sendData[key]); + } } - this.window.setSize(options.electronOptions.width, options.electronOptions.height); - this.window.setAlwaysOnTop(true, 'floating', 1); - this.send('uiAction_switchTemplate', type); - this.show(); - store.dispatch(reuseGenericWindow(type)); + } } + this.window.setSize( + options.electronOptions.width, + options.electronOptions.height + ); + this.window.setAlwaysOnTop(true, 'floating', 1); + this.send('uiAction_switchTemplate', type); + this.show(); + store.dispatch(reuseGenericWindow(type)); + } } class Window extends EventEmitter { - constructor(mgr, type, opts) { - super(); - - opts = opts || {}; - - this._mgr = mgr; - this._log = log.create(type); - this.isPrimary = !!opts.primary; - this.type = type; - this.isPopup = !!opts.isPopup; - this.ownerId = opts.ownerId; // the window which creates this new window - - let electronOptions = { - title: Settings.appName, - show: false, - width: 1100, - height: 720, - icon: global.icon, - titleBarStyle: 'hidden-inset', // hidden-inset: more space - backgroundColor: '#F6F6F6', - acceptFirstMouse: true, - darkTheme: true, - webPreferences: { - nodeIntegration: false, - webaudio: true, - webgl: false, - webSecurity: false, // necessary to make routing work on file:// protocol for assets in windows and popups. Not webviews! - textAreasAreResizable: true, - }, - }; - - electronOptions = _.deepExtend(electronOptions, opts.electronOptions); - - this._log.debug('Creating browser window'); - - this.window = new BrowserWindow(electronOptions); - - // set Accept_Language header - this.session = this.window.webContents.session; - this.session.setUserAgent(this.session.getUserAgent(), Settings.language); - - this.webContents = this.window.webContents; - - this.webContents.once('did-finish-load', () => { - this.isContentReady = true; - - this._log.debug(`Content loaded, id: ${this.id}`); - - if (opts.sendData) { - if (_.isString(opts.sendData)) { - this.send(opts.sendData); - } else if (_.isObject(opts.sendData)) { - for (const key in opts.sendData) { - if ({}.hasOwnProperty.call(opts.sendData, key)) { - this.send(key, opts.sendData[key]); - } - } - } - } - - if (opts.show) { - this.show(); + constructor(mgr, type, opts) { + super(); + + opts = opts || {}; + + this._mgr = mgr; + this._log = log.create(type); + this.isPrimary = !!opts.primary; + this.type = type; + this.isPopup = !!opts.isPopup; + this.ownerId = opts.ownerId; // the window which creates this new window + + let electronOptions = { + title: Settings.appName, + show: false, + width: 1100, + height: 720, + icon: global.icon, + titleBarStyle: 'hidden-inset', // hidden-inset: more space + backgroundColor: '#F6F6F6', + acceptFirstMouse: true, + darkTheme: true, + webPreferences: { + nodeIntegration: false, + webaudio: true, + webgl: false, + webSecurity: false, // necessary to make routing work on file:// protocol for assets in windows and popups. Not webviews! + textAreasAreResizable: true + } + }; + + electronOptions = _.deepExtend(electronOptions, opts.electronOptions); + + this._log.debug('Creating browser window'); + + this.window = new BrowserWindow(electronOptions); + + // set Accept_Language header + this.session = this.window.webContents.session; + this.session.setUserAgent(this.session.getUserAgent(), Settings.language); + + this.webContents = this.window.webContents; + + this.webContents.once('did-finish-load', () => { + this.isContentReady = true; + + this._log.debug(`Content loaded, id: ${this.id}`); + + if (opts.sendData) { + if (_.isString(opts.sendData)) { + this.send(opts.sendData); + } else if (_.isObject(opts.sendData)) { + for (const key in opts.sendData) { + if ({}.hasOwnProperty.call(opts.sendData, key)) { + this.send(key, opts.sendData[key]); } + } + } + } - this.emit('ready'); - }); + if (opts.show) { + this.show(); + } + this.emit('ready'); + }); - // prevent droping files - this.webContents.on('will-navigate', (e) => { - e.preventDefault(); - }); + // prevent droping files + this.webContents.on('will-navigate', e => { + e.preventDefault(); + }); + this.window.once('closed', () => { + this._log.debug('Closed'); - this.window.once('closed', () => { - this._log.debug('Closed'); + this.isShown = false; + this.isClosed = true; + this.isContentReady = false; - this.isShown = false; - this.isClosed = true; - this.isContentReady = false; + this.emit('closed'); + store.dispatch(closeWindow(this.type)); + }); - this.emit('closed'); - store.dispatch(closeWindow(this.type)); - }); + this.window.once('close', e => { + this.emit('close', e); + }); - this.window.once('close', (e) => { - this.emit('close', e); - }); + this.window.on('show', e => { + this.emit('show', e); + }); - this.window.on('show', (e) => { - this.emit('show', e); - }); + this.window.on('hide', e => { + this.emit('hide', e); + }); - this.window.on('hide', (e) => { - this.emit('hide', e); - }); + if (opts.url) { + this.load(opts.url); + } + } - if (opts.url) { - this.load(opts.url); - } + load(url) { + if (this.isClosed) { + return; } - load(url) { - if (this.isClosed) { - return; - } + this._log.debug(`Load URL: ${url}`); - this._log.debug(`Load URL: ${url}`); + this.window.loadURL(url); + } - this.window.loadURL(url); + send() { + if (this.isClosed || !this.isContentReady) { + return; } - send() { - if (this.isClosed || !this.isContentReady) { - return; - } + this._log.trace('Sending data', arguments); - this._log.trace('Sending data', arguments); + this.webContents.send.apply(this.webContents, arguments); + } - this.webContents.send.apply( - this.webContents, - arguments - ); + hide() { + if (this.isClosed) { + return; } + this._log.debug('Hide'); - hide() { - if (this.isClosed) { - return; - } - - this._log.debug('Hide'); + this.window.hide(); - this.window.hide(); + this.isShown = false; + } - this.isShown = false; + show() { + if (this.isClosed) { + return; } + this._log.debug('Show'); - show() { - if (this.isClosed) { - return; - } - - this._log.debug('Show'); + this.window.show(); - this.window.show(); + this.isShown = true; - this.isShown = true; + store.dispatch(openWindow(this.type)); + } - store.dispatch(openWindow(this.type)); + close() { + if (this.isClosed) { + return; } + this._log.debug('Close'); - close() { - if (this.isClosed) { - return; - } - - this._log.debug('Close'); - - this.window.close(); - } + this.window.close(); + } } - class Windows { - constructor() { - this._windows = {}; - } + constructor() { + this._windows = {}; + } + init() { + log.info('Creating commonly-used windows'); - init() { - log.info('Creating commonly-used windows'); + this.loading = this.create('loading'); + this.generic = this.createGenericWindow(); - this.loading = this.create('loading'); - this.generic = this.createGenericWindow(); + this.loading.on('show', () => { + this.loading.window.center(); + store.dispatch(openWindow('loading')); + }); - this.loading.on('show', () => { - this.loading.window.center(); - store.dispatch(openWindow('loading')); - }); + this.loading.on('hide', () => { + store.dispatch(closeWindow('loading')); + }); - this.loading.on('hide', () => { - store.dispatch(closeWindow('loading')); - }); + // when a window gets initalized it will send us its id + ipc.on('backendAction_setWindowId', event => { + const id = event.sender.id; - // when a window gets initalized it will send us its id - ipc.on('backendAction_setWindowId', (event) => { - const id = event.sender.id; + log.debug('Set window id', id); - log.debug('Set window id', id); + const bwnd = BrowserWindow.fromWebContents(event.sender); + const wnd = _.find(this._windows, w => { + return w.window === bwnd; + }); - const bwnd = BrowserWindow.fromWebContents(event.sender); - const wnd = _.find(this._windows, (w) => { - return (w.window === bwnd); - }); + if (wnd) { + log.trace(`Set window id=${id}, type=${wnd.type}`); - if (wnd) { - log.trace(`Set window id=${id}, type=${wnd.type}`); + wnd.id = id; + } + }); - wnd.id = id; - } - }); + store.dispatch({ type: '[MAIN]:WINDOWS:INIT_FINISH' }); + } - store.dispatch({ type: '[MAIN]:WINDOWS:INIT_FINISH' }); - } + createGenericWindow() { + const wnd = (this._windows.generic = new GenericWindow(this)); + return wnd; + } - createGenericWindow() { - const wnd = this._windows.generic = new GenericWindow(this); - return wnd; - } + create(type, opts, callback) { + store.dispatch({ + type: '[MAIN]:WINDOW:CREATE_START', + payload: { type } + }); - create(type, opts, callback) { - store.dispatch({ type: '[MAIN]:WINDOW:CREATE_START', payload: { type } }); + const options = _.deepExtend( + this.getDefaultOptionsForType(type), + opts || {} + ); - const options = _.deepExtend(this.getDefaultOptionsForType(type), opts || {}); + const existing = this.getByType(type); - const existing = this.getByType(type); + if (existing && existing.ownerId === options.ownerId) { + log.debug( + `Window ${type} with owner ${options.ownerId} already existing.` + ); - if (existing && existing.ownerId === options.ownerId) { - log.debug(`Window ${type} with owner ${options.ownerId} already existing.`); - - return existing; - } - - const category = options.primary ? 'primary' : 'secondary'; - - log.info(`Create ${category} window: ${type}, owner: ${options.ownerId || 'notset'}`); + return existing; + } - const wnd = this._windows[type] = new Window(this, type, options); - wnd.on('closed', this._onWindowClosed.bind(this, wnd)); + const category = options.primary ? 'primary' : 'secondary'; - if (callback) { - wnd.callback = callback; - } + log.info( + `Create ${category} window: ${type}, owner: ${options.ownerId || + 'notset'}` + ); - store.dispatch({ type: '[MAIN]:WINDOW:CREATE_FINISH', payload: { type } }); + const wnd = (this._windows[type] = new Window(this, type, options)); + wnd.on('closed', this._onWindowClosed.bind(this, wnd)); - return wnd; + if (callback) { + wnd.callback = callback; } - - getDefaultOptionsForType(type) { - const mainWebPreferences = { - mist: { - nodeIntegration: true, /* necessary for webviews; - require will be removed through preloader */ - preload: `${__dirname}/preloader/mistUI.js`, - 'overlay-fullscreen-video': true, - 'overlay-scrollbars': true, - experimentalFeatures: true, - }, - wallet: { - preload: `${__dirname}/preloader/walletMain.js`, - 'overlay-fullscreen-video': true, - 'overlay-scrollbars': true, + store.dispatch({ + type: '[MAIN]:WINDOW:CREATE_FINISH', + payload: { type } + }); + + return wnd; + } + + getDefaultOptionsForType(type) { + const mainWebPreferences = { + mist: { + nodeIntegration: true /* necessary for webviews; + require will be removed through preloader */, + preload: `${__dirname}/preloader/mistUI.js`, + 'overlay-fullscreen-video': true, + 'overlay-scrollbars': true, + experimentalFeatures: true + }, + wallet: { + preload: `${__dirname}/preloader/walletMain.js`, + 'overlay-fullscreen-video': true, + 'overlay-scrollbars': true + } + }; + + switch (type) { + case 'main': + return { + primary: true, + electronOptions: { + width: Math.max(global.defaultWindow.width, 500), + height: Math.max(global.defaultWindow.height, 440), + x: global.defaultWindow.x, + y: global.defaultWindow.y, + webPreferences: mainWebPreferences[global.mode] + } + }; + case 'splash': + return { + primary: true, + url: `${global.interfacePopupsUrl}#splashScreen_${global.mode}`, + show: true, + electronOptions: { + width: 400, + height: 230, + resizable: false, + backgroundColor: '#F6F6F6', + useContentSize: true, + frame: false, + webPreferences: { + preload: `${__dirname}/preloader/splashScreen.js` } - } - - switch (type) { - case 'main': - return { - primary: true, - electronOptions: { - width: Math.max(global.defaultWindow.width, 500), - height: Math.max(global.defaultWindow.height, 440), - x: global.defaultWindow.x, - y: global.defaultWindow.y, - webPreferences: mainWebPreferences[global.mode], - }, - }; - case 'splash': - return { - primary: true, - url: `${global.interfacePopupsUrl}#splashScreen_${global.mode}`, - show: true, - electronOptions: { - width: 400, - height: 230, - resizable: false, - backgroundColor: '#F6F6F6', - useContentSize: true, - frame: false, - webPreferences: { - preload: `${__dirname}/preloader/splashScreen.js`, - }, - }, - }; - case 'loading': - return { - show: false, - url: `${global.interfacePopupsUrl}#loadingWindow`, - electronOptions: { - title: '', - alwaysOnTop: true, - resizable: false, - width: 100, - height: 80, - center: true, - frame: false, - useContentSize: true, - titleBarStyle: '', // hidden-inset: more space - skipTaskbar: true, - webPreferences: { - preload: `${__dirname}/preloader/popupWindowsNoWeb3.js`, - }, - }, - }; - case 'about': - return { - url: `${global.interfacePopupsUrl}#about`, - electronOptions: { - width: 420, - height: 230, - alwaysOnTop: true, - }, - }; - case 'remix': - return { - url: 'https://remix.ethereum.org', - electronOptions: { - width: 1024, - height: 720, - center: true, - frame: true, - resizable: true, - titleBarStyle: 'default', - } - }; - case 'importAccount': - return { - electronOptions: { - width: 600, - height: 370, - alwaysOnTop: true, - }, - }; - case 'requestAccount': - return { - electronOptions: { - width: 420, - height: 230, - alwaysOnTop: true, - }, - }; - case 'connectAccount': - return { - electronOptions: { - width: 460, - height: 520, - maximizable: false, - minimizable: false, - alwaysOnTop: true, - }, - }; - case 'sendTransactionConfirmation': - return { - electronOptions: { - width: 580, - height: 550, - alwaysOnTop: true, - enableLargerThanScreen: false, - resizable: true - }, - }; - case 'updateAvailable': - return { - useWeb3: false, - electronOptions: { - width: 580, - height: 250, - alwaysOnTop: true, - resizable: false, - maximizable: false, - }, - }; - case 'clientUpdateAvailable': - return { - useWeb3: false, - electronOptions: { - width: 600, - height: 340, - alwaysOnTop: false, - resizable: false, - maximizable: false, - }, - }; - case 'generic': - return { - title: Settings.appName, - show: false, - icon: global.icon, - titleBarStyle: 'hidden-inset', // hidden-inset: more space - backgroundColor: '#F6F6F6', - acceptFirstMouse: true, - darkTheme: true, - webPreferences: { - preload: `${__dirname}/preloader/popupWindows.js`, - nodeIntegration: false, - webaudio: true, - webgl: false, - webSecurity: false, // necessary to make routing work on file:// protocol for assets in windows and popups. Not webviews! - textAreasAreResizable: true, - }, - }; - } - } - - - createPopup(type, options, callback) { - const defaultPopupOpts = { - url: `${global.interfacePopupsUrl}#${type}`, - show: true, - ownerId: null, - useWeb3: true, - electronOptions: { - title: '', - width: 400, - height: 400, - resizable: false, - center: true, - useContentSize: true, - titleBarStyle: 'hidden', // hidden-inset: more space - autoHideMenuBar: true, // TODO: test on windows - webPreferences: { - textAreasAreResizable: false, - } + } + }; + case 'loading': + return { + show: false, + url: `${global.interfacePopupsUrl}#loadingWindow`, + electronOptions: { + title: '', + alwaysOnTop: true, + resizable: false, + width: 100, + height: 80, + center: true, + frame: false, + useContentSize: true, + titleBarStyle: '', // hidden-inset: more space + skipTaskbar: true, + webPreferences: { + preload: `${__dirname}/preloader/popupWindowsNoWeb3.js` } + } }; - - let opts = _.deepExtend(defaultPopupOpts, this.getDefaultOptionsForType(type), options || {}); - - // always show on top of main window - const parent = _.find(this._windows, (w) => { - return w.type === 'main'; - }); - - if (parent) { - opts.electronOptions.parent = parent.window; + case 'about': + return { + url: `${global.interfacePopupsUrl}#about`, + electronOptions: { + width: 420, + height: 230, + alwaysOnTop: true + } + }; + case 'remix': + return { + url: 'https://remix.ethereum.org', + electronOptions: { + width: 1024, + height: 720, + center: true, + frame: true, + resizable: true, + titleBarStyle: 'default' + } + }; + case 'importAccount': + return { + electronOptions: { + width: 600, + height: 370, + alwaysOnTop: true + } + }; + case 'requestAccount': + return { + electronOptions: { + width: 420, + height: 230, + alwaysOnTop: true + } + }; + case 'connectAccount': + return { + electronOptions: { + width: 460, + height: 520, + maximizable: false, + minimizable: false, + alwaysOnTop: true + } + }; + case 'sendTransactionConfirmation': + return { + electronOptions: { + width: 580, + height: 550, + alwaysOnTop: true, + enableLargerThanScreen: false, + resizable: true + } + }; + case 'updateAvailable': + return { + useWeb3: false, + electronOptions: { + width: 580, + height: 250, + alwaysOnTop: true, + resizable: false, + maximizable: false + } + }; + case 'clientUpdateAvailable': + return { + useWeb3: false, + electronOptions: { + width: 600, + height: 340, + alwaysOnTop: false, + resizable: false, + maximizable: false + } + }; + case 'generic': + return { + title: Settings.appName, + show: false, + icon: global.icon, + titleBarStyle: 'hidden-inset', // hidden-inset: more space + backgroundColor: '#F6F6F6', + acceptFirstMouse: true, + darkTheme: true, + webPreferences: { + preload: `${__dirname}/preloader/popupWindows.js`, + nodeIntegration: false, + webaudio: true, + webgl: false, + webSecurity: false, // necessary to make routing work on file:// protocol for assets in windows and popups. Not webviews! + textAreasAreResizable: true + } + }; + } + } + + createPopup(type, options, callback) { + const defaultPopupOpts = { + url: `${global.interfacePopupsUrl}#${type}`, + show: true, + ownerId: null, + useWeb3: true, + electronOptions: { + title: '', + width: 400, + height: 400, + resizable: false, + center: true, + useContentSize: true, + titleBarStyle: 'hidden', // hidden-inset: more space + autoHideMenuBar: true, // TODO: test on windows + webPreferences: { + textAreasAreResizable: false } + } + }; + + let opts = _.deepExtend( + defaultPopupOpts, + this.getDefaultOptionsForType(type), + options || {} + ); + + // always show on top of main window + const parent = _.find(this._windows, w => { + return w.type === 'main'; + }); + + if (parent) { + opts.electronOptions.parent = parent.window; + } + // mark it as a pop-up window + opts.isPopup = true; - // mark it as a pop-up window - opts.isPopup = true; - - if (opts.useWeb3) { - opts.electronOptions.webPreferences.preload = `${__dirname}/preloader/popupWindows.js`; - } else { - opts.electronOptions.webPreferences.preload = `${__dirname}/preloader/popupWindowsNoWeb3.js`; - } + if (opts.useWeb3) { + opts.electronOptions.webPreferences.preload = `${__dirname}/preloader/popupWindows.js`; + } else { + opts.electronOptions.webPreferences.preload = `${__dirname}/preloader/popupWindowsNoWeb3.js`; + } - // If generic window is available, recycle it (unless on blacklist) - const genericWindow = this.getByType('generic'); - const genericWindowBlacklist = ['remix', 'updateAvailable', 'connectAccount']; - if (!genericWindowBlacklist.includes(type) && genericWindow && genericWindow.isAvailable) { - genericWindow.reuse(type, opts, callback); - return genericWindow; - } else if (genericWindow) { - // If a generic window exists of the same actingType, focus that window - if (genericWindow.actingType === type) { - genericWindow.webContents.focus(); - return genericWindow; - } - } + // If generic window is available, recycle it (unless on blacklist) + const genericWindow = this.getByType('generic'); + const genericWindowBlacklist = [ + 'remix', + 'updateAvailable', + 'connectAccount' + ]; + if ( + !genericWindowBlacklist.includes(type) && + genericWindow && + genericWindow.isAvailable + ) { + genericWindow.reuse(type, opts, callback); + return genericWindow; + } else if (genericWindow) { + // If a generic window exists of the same actingType, focus that window + if (genericWindow.actingType === type) { + genericWindow.webContents.focus(); + return genericWindow; + } + } - this.loading.show(); + this.loading.show(); - log.info(`Create popup window: ${type}`); + log.info(`Create popup window: ${type}`); - const wnd = this.create(type, opts, callback); + const wnd = this.create(type, opts, callback); - wnd.once('ready', () => { - this.loading.hide(); - }); + wnd.once('ready', () => { + this.loading.hide(); + }); - return wnd; - } + return wnd; + } + getByType(type) { + log.trace('Get by type', type); - getByType(type) { - log.trace('Get by type', type); + return _.find(this._windows, w => { + return w.type === type; + }); + } - return _.find(this._windows, (w) => { - return w.type === type; - }); - } + getById(id) { + log.trace('Get by id', id); + return _.find(this._windows, w => { + return w.id === id; + }); + } - getById(id) { - log.trace('Get by id', id); + broadcast() { + const data = arguments; - return _.find(this._windows, (w) => { - return (w.id === id); - }); - } + log.trace('Broadcast', data); + _.each(this._windows, wnd => { + wnd.send(...data); + }); + } - broadcast() { - const data = arguments; + /** + * Handle a window being closed. + * + * This will remove the window from the internal list. + * + * This also checks to see if any primary windows are still visible + * (even if hidden). If none found then it quits the app. + * + * @param {Window} wnd + */ + _onWindowClosed(wnd) { + log.debug(`Removing window from list: ${wnd.type}`); - log.trace('Broadcast', data); + for (const t in this._windows) { + if (this._windows[t] === wnd) { + delete this._windows[t]; - _.each(this._windows, (wnd) => { - wnd.send(...data); - }); + break; + } } + const anyOpen = _.find(this._windows, wnd => { + return wnd.isPrimary && !wnd.isClosed && wnd.isShown; + }); - /** - * Handle a window being closed. - * - * This will remove the window from the internal list. - * - * This also checks to see if any primary windows are still visible - * (even if hidden). If none found then it quits the app. - * - * @param {Window} wnd - */ - _onWindowClosed(wnd) { - log.debug(`Removing window from list: ${wnd.type}`); - - for (const t in this._windows) { - if (this._windows[t] === wnd) { - delete this._windows[t]; - - break; - } - } - - const anyOpen = _.find(this._windows, (wnd) => { - return wnd.isPrimary && !wnd.isClosed && wnd.isShown; - }); - - if (!anyOpen) { - log.info('All primary windows closed/invisible, so quitting app...'); + if (!anyOpen) { + log.info('All primary windows closed/invisible, so quitting app...'); - app.quit(); - } + app.quit(); } + } } - module.exports = new Windows(); diff --git a/package.json b/package.json index 002be6651..0ef40f361 100644 --- a/package.json +++ b/package.json @@ -1,85 +1,90 @@ { - "name": "Mist", - "version": "0.9.4", - "license": "GPL-3.0", - "author": "Ethereum Mist Team ", - "repository": { - "type": "git", - "url": "https://github.com/ethereum/mist.git" - }, - "scripts": { - "postinstall": "electron-builder install-app-deps; cd interface && yarn", - "dev:electron": "electron -r babel-register main.js", - "dev:meteor": "cd interface && meteor --no-release-check", - "dev:tools": "open http://remotedev.io/local/", - "test:basic": "gulp test --test=basic", - "test:unit": "mocha --compilers babel-register tests/unit/**/* --watch", - "test:unit:once": "mocha --compilers babel-register tests/unit/**/*" - }, - "main": "main.js", - "dependencies": { - "bignumber.js": "^4.0.1", - "bluebird": "^3.5.0", - "chai-as-promised": "^6.0.0", - "chai-string": "^1.3.0", - "electron-redux": "^1.3.1", - "electron-window-state": "^4.0.1", - "ethereum-client-binaries": "ethereum/ethereum-client-binaries", - "ethereum-keyfile-recognizer": "^1.0.2", - "ethereumjs-abi": "^0.6.3", - "ethereumjs-util": "^5.1.2", - "fs-promise": "^2.0.0", - "got": "^6.7.1", - "i18next": "^7.1.3", - "lodash": "^4.17.4", - "log-rotate": "^0.2.7", - "log4js": "^2.4.1", - "lokijs": "^1.4.3", - "minimongo-standalone": "^1.1.0-3", - "numeral": "^2.0.6", - "oboe": "^2.1.3", - "os-timesync": "^1.0.9", - "redux": "^3.7.2", - "redux-thunk": "^2.2.0", - "remote-redux-devtools": "^0.5.12", - "semver": "^5.1.0", - "solc": "^0.4.18", - "swarm-js": "^0.1.21", - "typescript": "^2.2.2", - "underscore": "^1.8.3", - "underscore-deep-extend": "^1.1.5", - "uuid": "^3.0.1", - "web3": "^0.18.4", - "yargs": "^7.0.2" - }, - "devDependencies": { - "babel-preset-es2016-node5": "^1.1.2", - "babel-register": "^6.26.0", - "chai": "^3.5.0", - "co-mocha": "^1.2.0", - "del": "^3.0.0", - "ecstatic": "^2.1.0", - "electron": "1.8.3", - "electron-builder": "^20.0.8", - "eslint": "^3.14.1", - "eslint-config-airbnb-base": "^11.0.1", - "eslint-plugin-import": "^2.2.0", - "express": "^4.15.3", - "genomatic": "^1.0.0", - "geth-private": "^1.3.0", - "gh-release-assets": "^1.1.0", - "gulp": "4.0.0", - "gulp-babel": "^7.0.0", - "gulp-spawn-mocha": "^3.3.0", - "json-structure-diff": "^0.0.2", - "minimist": "^1.2.0", - "mocha": "^3.2.0", - "redux-mock-store": "^1.3.0", - "require-dir": "^0.3.2", - "run-sequence": "^1.2.1", - "semver-compare": "^1.0.0", - "shelljs": "^0.7.7", - "spectron": "3.8.0", - "xml2js": "^0.4.17" - } + "name": "Mist", + "version": "0.9.4", + "license": "GPL-3.0", + "author": "Ethereum Mist Team ", + "repository": { + "type": "git", + "url": "https://github.com/ethereum/mist.git" + }, + "scripts": { + "precommit": "pretty-quick --staged", + "postinstall": + "electron-builder install-app-deps; cd interface && yarn", + "dev:electron": "electron -r babel-register main.js", + "dev:meteor": "cd interface && meteor --no-release-check", + "dev:tools": "open http://remotedev.io/local/", + "test:basic": "gulp test --test=basic", + "test:unit": "mocha --compilers babel-register tests/unit/**/* --watch", + "test:unit:once": "mocha --compilers babel-register tests/unit/**/*" + }, + "main": "main.js", + "dependencies": { + "bignumber.js": "^4.0.1", + "bluebird": "^3.5.0", + "chai-as-promised": "^6.0.0", + "chai-string": "^1.3.0", + "electron-redux": "^1.3.1", + "electron-window-state": "^4.0.1", + "ethereum-client-binaries": "ethereum/ethereum-client-binaries", + "ethereum-keyfile-recognizer": "^1.0.2", + "ethereumjs-abi": "^0.6.3", + "ethereumjs-util": "^5.1.2", + "fs-promise": "^2.0.0", + "got": "^6.7.1", + "i18next": "^7.1.3", + "lodash": "^4.17.4", + "log-rotate": "^0.2.7", + "log4js": "^2.4.1", + "lokijs": "^1.4.3", + "minimongo-standalone": "^1.1.0-3", + "numeral": "^2.0.6", + "oboe": "^2.1.3", + "os-timesync": "^1.0.9", + "redux": "^3.7.2", + "redux-thunk": "^2.2.0", + "remote-redux-devtools": "^0.5.12", + "semver": "^5.1.0", + "solc": "^0.4.18", + "swarm-js": "^0.1.21", + "typescript": "^2.2.2", + "underscore": "^1.8.3", + "underscore-deep-extend": "^1.1.5", + "uuid": "^3.0.1", + "web3": "^0.18.4", + "yargs": "^7.0.2" + }, + "devDependencies": { + "babel-preset-es2016-node5": "^1.1.2", + "babel-register": "^6.26.0", + "chai": "^3.5.0", + "co-mocha": "^1.2.0", + "del": "^3.0.0", + "ecstatic": "^2.1.0", + "electron": "1.8.3", + "electron-builder": "^20.0.8", + "eslint": "^3.14.1", + "eslint-config-airbnb-base": "^11.0.1", + "eslint-plugin-import": "^2.2.0", + "express": "^4.15.3", + "genomatic": "^1.0.0", + "geth-private": "^1.3.0", + "gh-release-assets": "^1.1.0", + "gulp": "4.0.0", + "gulp-babel": "^7.0.0", + "gulp-spawn-mocha": "^3.3.0", + "husky": "^0.14.3", + "json-structure-diff": "^0.0.2", + "minimist": "^1.2.0", + "mocha": "^3.2.0", + "prettier": "^1.11.1", + "pretty-quick": "^1.4.1", + "redux-mock-store": "^1.3.0", + "require-dir": "^0.3.2", + "run-sequence": "^1.2.1", + "semver-compare": "^1.0.0", + "shelljs": "^0.7.7", + "spectron": "3.8.0", + "xml2js": "^0.4.17" + } } diff --git a/release.js b/release.js index dfdcf10da..63a45e6d8 100644 --- a/release.js +++ b/release.js @@ -1,4 +1,7 @@ -module.exports = async (markdown, metaData) => `_Write a brief description of this release._ +module.exports = async ( + markdown, + metaData +) => `_Write a brief description of this release._ ### Checksums diff --git a/tests/_base.js b/tests/_base.js index 2c131d098..24ee207f8 100644 --- a/tests/_base.js +++ b/tests/_base.js @@ -21,413 +21,469 @@ process.env.TEST_MODE = 'true'; const log = logger.create('base'); -const startGeth = function* () { - let gethPath; - - const config = JSON.parse( - fs.readFileSync(path.join('clientBinaries.json')).toString() - ); - const manager = new ClientBinaryManager(config); - yield manager.init(); - - if (!manager.clients.Geth.state.available) { - gethPath = manager.clients.Geth.activeCli.fullPath; - console.info('Downloading geth...'); - const downloadedGeth = yield manager.download('Geth'); - gethPath = downloadedGeth.client.activeCli.fullPath; - console.info('Geth downloaded at:', gethPath); +const startGeth = function*() { + let gethPath; + + const config = JSON.parse( + fs.readFileSync(path.join('clientBinaries.json')).toString() + ); + const manager = new ClientBinaryManager(config); + yield manager.init(); + + if (!manager.clients.Geth.state.available) { + gethPath = manager.clients.Geth.activeCli.fullPath; + console.info('Downloading geth...'); + const downloadedGeth = yield manager.download('Geth'); + gethPath = downloadedGeth.client.activeCli.fullPath; + console.info('Geth downloaded at:', gethPath); + } + + const geth = gethPrivate({ + gethPath, + balance: 5, + genesisBlock: { + config: { + chainId: 33333 + }, + difficulty: '0x01', + extraData: '0x01' + }, + gethOptions: { + port: 58546, + rpcport: 58545 } + }); - const geth = gethPrivate({ - gethPath, - balance: 5, - genesisBlock: { - config: { - chainId: 33333, - }, - difficulty: '0x01', - extraData: '0x01', - }, - gethOptions: { - port: 58546, - rpcport: 58545, - }, - }); - - console.info('Geth starting...'); - yield geth.start(); - console.info('Geth started'); + console.info('Geth starting...'); + yield geth.start(); + console.info('Geth started'); - return geth; + return geth; }; -const startFixtureServer = function (serverPort) { - log.info('Starting fixture server...'); - const app = express(); - app.use(express.static(path.join(__dirname, 'fixtures'))); - - app.get('/redirect', (req, res) => { - // Redirects to param ?url=XX - res.redirect(302, req.query.to); - }); - app.listen(serverPort); - log.info('Fixture server started'); - return app; +const startFixtureServer = function(serverPort) { + log.info('Starting fixture server...'); + const app = express(); + app.use(express.static(path.join(__dirname, 'fixtures'))); + + app.get('/redirect', (req, res) => { + // Redirects to param ?url=XX + res.redirect(302, req.query.to); + }); + app.listen(serverPort); + log.info('Fixture server started'); + return app; }; exports.mocha = (_module, options) => { - const tests = {}; - - options = _.extend({ - app: 'mist', - }, options); - - _module.exports[options.name || path.basename(_module.filename)] = { - * before() { - this.timeout(1e7); - - this.assert = chai.assert; - this.expect = chai.expect; - - const mistLogFile = path.join(__dirname, 'mist.log'); - const chromeLogFile = path.join(__dirname, 'chrome.log'); - const webdriverLogDir = path.join(__dirname, 'webdriver'); - - _.each([mistLogFile, webdriverLogDir, chromeLogFile], (e) => { - console.info('Removing log files', e); - shell.rm('-rf', e); - }); - - this.geth = yield startGeth(); - - const appFileName = (options.app === 'wallet') ? 'Ethereum Wallet' : 'Mist'; - const platformArch = `${process.platform}-${process.arch}`; - console.info(`${appFileName} :: ${platformArch}`); - - let appPath; - const ipcProviderPath = path.join(this.geth.dataDir, 'geth.ipc'); - - switch (platformArch) { - case 'darwin-x64': - appPath = path.join(process.cwd(), `dist_${options.app}`, 'dist', 'mac', - `${appFileName}.app`, 'Contents', 'MacOS', appFileName - ); - break; - case 'linux-x64': - appPath = path.join(process.cwd(), `dist_${options.app}`, 'dist', 'linux-unpacked', appFileName.toLowerCase()); - break; - default: - throw new Error(`Cannot run tests on ${platformArch}, please run on: darwin-x64, linux-x64`); - } - console.info(`appPath: ${appPath}`); - - // check that appPath exists - if (!shell.test('-f', appPath)) { - throw new Error(`Cannot find binary: ${appPath}`); - } + const tests = {}; - this.web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:58545')); - this.app = new Application({ - requireName: 'electronRequire', - startTimeout: 10000, - waitTimeout: 10000, - quitTimeout: 10000, - path: appPath, - args: [ - '--loglevel', 'debug', - '--logfile', mistLogFile, - '--node-datadir', this.geth.dataDir, - '--rpc', ipcProviderPath, - ], - webdriverLogPath: webdriverLogDir, - chromeDriverLogPath: chromeLogFile, - }); - - console.info('Starting app...'); - yield this.app.start(); - console.info('App started'); - - this.client = this.app.client; - - /* + options = _.extend( + { + app: 'mist' + }, + options + ); + + _module.exports[options.name || path.basename(_module.filename)] = { + *before() { + this.timeout(1e7); + + this.assert = chai.assert; + this.expect = chai.expect; + + const mistLogFile = path.join(__dirname, 'mist.log'); + const chromeLogFile = path.join(__dirname, 'chrome.log'); + const webdriverLogDir = path.join(__dirname, 'webdriver'); + + _.each([mistLogFile, webdriverLogDir, chromeLogFile], e => { + console.info('Removing log files', e); + shell.rm('-rf', e); + }); + + this.geth = yield startGeth(); + + const appFileName = options.app === 'wallet' ? 'Ethereum Wallet' : 'Mist'; + const platformArch = `${process.platform}-${process.arch}`; + console.info(`${appFileName} :: ${platformArch}`); + + let appPath; + const ipcProviderPath = path.join(this.geth.dataDir, 'geth.ipc'); + + switch (platformArch) { + case 'darwin-x64': + appPath = path.join( + process.cwd(), + `dist_${options.app}`, + 'dist', + 'mac', + `${appFileName}.app`, + 'Contents', + 'MacOS', + appFileName + ); + break; + case 'linux-x64': + appPath = path.join( + process.cwd(), + `dist_${options.app}`, + 'dist', + 'linux-unpacked', + appFileName.toLowerCase() + ); + break; + default: + throw new Error( + `Cannot run tests on ${platformArch}, please run on: darwin-x64, linux-x64` + ); + } + console.info(`appPath: ${appPath}`); + + // check that appPath exists + if (!shell.test('-f', appPath)) { + throw new Error(`Cannot find binary: ${appPath}`); + } + + this.web3 = new Web3( + new Web3.providers.HttpProvider('http://localhost:58545') + ); + this.app = new Application({ + requireName: 'electronRequire', + startTimeout: 10000, + waitTimeout: 10000, + quitTimeout: 10000, + path: appPath, + args: [ + '--loglevel', + 'debug', + '--logfile', + mistLogFile, + '--node-datadir', + this.geth.dataDir, + '--rpc', + ipcProviderPath + ], + webdriverLogPath: webdriverLogDir, + chromeDriverLogPath: chromeLogFile + }); + + console.info('Starting app...'); + yield this.app.start(); + console.info('App started'); + + this.client = this.app.client; + + /* Starting HTTP server for HTML fixtures */ - const serverPort = 8080; - this.httpServer = startFixtureServer(serverPort); - this.fixtureBaseUrl = `http://localhost:${serverPort}/`; + const serverPort = 8080; + this.httpServer = startFixtureServer(serverPort); + this.fixtureBaseUrl = `http://localhost:${serverPort}/`; - /* + /* Utility methods */ - for (const key in Utils) { - this[key] = genomatic.bind(Utils[key], this); - } + for (const key in Utils) { + this[key] = genomatic.bind(Utils[key], this); + } - // Loop over windows trying to select Main Window - const app = this; - const selectMainWindow = function* (mainWindowSearch, retries = 20) { - console.log(`selectMainWindow retries remaining: ${retries}`); - let windowHandles = (yield app.client.windowHandles()).value; - - for (let handle in windowHandles) { - yield app.client.window(windowHandles[handle]); - const windowUrl = yield app.client.getUrl(); - const isMainWindow = mainWindowSearch.test(windowUrl); - if (isMainWindow) return true; - } - - if (retries === 0) throw new Error('Failed to select main window'); - - // not main window. try again after 2 seconds. - yield Q.delay(2000); - yield selectMainWindow(mainWindowSearch, --retries); - }; - - const mainWindowSearch = (options.app === 'wallet') ? /^file:\/\/\/$/ : /interface\/index\.html$/; - yield selectMainWindow(mainWindowSearch); - console.log('Main window selected'); - - this.mainWindowHandle = (yield this.client.windowHandle()).value; - }, - - * beforeEach() { - yield this.app.client.window(this.mainWindowHandle); - - yield this.client.execute(() => { // Code executed in context of browser - Tabs.remove({}); - LastVisitedPages.remove({}); - History.remove({}); - - Tabs.insert({ - _id: 'browser', - url: 'http://localhost:8080/', - redirect: 'http://localhost:8080/', - position: 0 - }); - Tabs.upsert({_id: 'wallet'}, {$set: { - url: 'https://wallet.ethereum.org', - redirect: 'https://wallet.ethereum.org', - position: 1, - permissions: { admin: true } - }}); - - LocalStore.set('selectedTab', 'browser'); - }); - yield Q.delay(1000); - }, - - // * afterEach() { }, - - * after() { - if (this.app && this.app.isRunning()) { - console.log('Stopping app...'); - yield this.app.stop(); - } + // Loop over windows trying to select Main Window + const app = this; + const selectMainWindow = function*(mainWindowSearch, retries = 20) { + console.log(`selectMainWindow retries remaining: ${retries}`); + let windowHandles = (yield app.client.windowHandles()).value; - if (this.geth && this.geth.isRunning) { - console.log('Stopping geth...'); - yield this.geth.stop(); - } + for (let handle in windowHandles) { + yield app.client.window(windowHandles[handle]); + const windowUrl = yield app.client.getUrl(); + const isMainWindow = mainWindowSearch.test(windowUrl); + if (isMainWindow) return true; + } - if (this.httpServer && this.httpServer.isListening) { - console.log('Stopping http server...'); - yield this.httpServer.close(); - } - }, + if (retries === 0) throw new Error('Failed to select main window'); - tests, - }; + // not main window. try again after 2 seconds. + yield Q.delay(2000); + yield selectMainWindow(mainWindowSearch, --retries); + }; - return tests; -}; + const mainWindowSearch = + options.app === 'wallet' ? /^file:\/\/\/$/ : /interface\/index\.html$/; + yield selectMainWindow(mainWindowSearch); + console.log('Main window selected'); - -const Utils = { - * waitUntil(msg, promiseFn) { - yield this.client.waitUntil(promiseFn, 10000, msg, 500); - }, - * waitForText(selector, text, ms = 5000, message = 'Element couldn\'t be found') { - const client = this.client; - yield client.waitUntil(() => { - return client.getText(selector).then((e) => { - return e === text; - }); - }, ms, message); + this.mainWindowHandle = (yield this.client.windowHandle()).value; }, - * getUiElements(selector) { - const elems = yield this.client.elements(selector); - return elems.value; - }, - * getUiElement(selector) { - const elem = yield this.client.element(selector); + *beforeEach() { + yield this.app.client.window(this.mainWindowHandle); - return elem.value; - }, - * openAndFocusNewWindow(type, fnPromise) { - yield fnPromise(); - const handle = yield this.selectWindowHandleByType(type); - yield this.client.window(handle); - }, - * selectWindowHandleByType(type) { - const client = this.client; - const windowHandles = (yield client.windowHandles()).value; + yield this.client.execute(() => { + // Code executed in context of browser + Tabs.remove({}); + LastVisitedPages.remove({}); + History.remove({}); - for (let handle in windowHandles) { - yield client.window(windowHandles[handle]); - const windowUrl = yield client.getUrl(); - if (new RegExp(type).test(windowUrl)) { - return windowHandles[handle]; + Tabs.insert({ + _id: 'browser', + url: 'http://localhost:8080/', + redirect: 'http://localhost:8080/', + position: 0 + }); + Tabs.upsert( + { _id: 'wallet' }, + { + $set: { + url: 'https://wallet.ethereum.org', + redirect: 'https://wallet.ethereum.org', + position: 1, + permissions: { admin: true } } - } - }, - * execElemsMethod(clientElementIdMethod, selector) { - const elems = yield this.client.elements(selector); - - const values = yield elems.value.map( - e => this.client[clientElementIdMethod](e.ELEMENT) - ); + } + ); - return values.map(r => r.value); + LocalStore.set('selectedTab', 'browser'); + }); + yield Q.delay(1000); }, - * execElemMethod(clientElementIdMethod, selector) { - const e = yield this.client.element(selector); - console.log(e); + // * afterEach() { }, + + *after() { + if (this.app && this.app.isRunning()) { + console.log('Stopping app...'); + yield this.app.stop(); + } - const value = yield this.client[clientElementIdMethod](e.ELEMENT); + if (this.geth && this.geth.isRunning) { + console.log('Stopping geth...'); + yield this.geth.stop(); + } - return value.value; + if (this.httpServer && this.httpServer.isListening) { + console.log('Stopping http server...'); + yield this.httpServer.close(); + } }, - * capturePage() { - const pageImage = yield this.app.browserWindow.capturePage(); - if (!pageImage) { - throw new Error('Page capture failed'); - } + tests + }; - fs.writeFileSync(path.join(__dirname, 'mist.png'), pageImage); - }, - * getRealAccountBalances() { - let accounts = this.web3.eth.accounts; + return tests; +}; + +const Utils = { + *waitUntil(msg, promiseFn) { + yield this.client.waitUntil(promiseFn, 10000, msg, 500); + }, + *waitForText( + selector, + text, + ms = 5000, + message = "Element couldn't be found" + ) { + const client = this.client; + yield client.waitUntil( + () => { + return client.getText(selector).then(e => { + return e === text; + }); + }, + ms, + message + ); + }, + *getUiElements(selector) { + const elems = yield this.client.elements(selector); + + return elems.value; + }, + *getUiElement(selector) { + const elem = yield this.client.element(selector); + + return elem.value; + }, + *openAndFocusNewWindow(type, fnPromise) { + yield fnPromise(); + const handle = yield this.selectWindowHandleByType(type); + yield this.client.window(handle); + }, + *selectWindowHandleByType(type) { + const client = this.client; + const windowHandles = (yield client.windowHandles()).value; + + for (let handle in windowHandles) { + yield client.window(windowHandles[handle]); + const windowUrl = yield client.getUrl(); + if (new RegExp(type).test(windowUrl)) { + return windowHandles[handle]; + } + } + }, + *execElemsMethod(clientElementIdMethod, selector) { + const elems = yield this.client.elements(selector); - let balances = accounts.map(acc => - `${this.web3.fromWei(this.web3.eth.getBalance(acc), 'ether')}` + const values = yield elems.value.map(e => + this.client[clientElementIdMethod](e.ELEMENT) ); - accounts = accounts.map(a => a.toLowerCase()); - balances = balances.map(b => parseInt(b, 10)); + return values.map(r => r.value); + }, + *execElemMethod(clientElementIdMethod, selector) { + const e = yield this.client.element(selector); - return _.object(accounts, balances); - }, - * getUiAccountBalances() { - // check balances on the pgetUiAccountsBalancesage - let _accounts = yield this.execElemsMethod('elementIdText', '.wallet-box .account-id'); - let _balances = yield this.execElemsMethod('elementIdText', '.wallet-box .account-balance'); + console.log(e); - _accounts = _accounts.map(a => a.toLowerCase()); - _balances = _balances.map(b => parseInt(b, 10)); + const value = yield this.client[clientElementIdMethod](e.ELEMENT); - return _.object(_accounts, _balances); - }, - * openAccountInUi(accId) { - const _accounts = yield this.execElemsMethod('elementIdText', '.wallet-box .account-id'); + return value.value; + }, + *capturePage() { + const pageImage = yield this.app.browserWindow.capturePage(); - let idx = -1; + if (!pageImage) { + throw new Error('Page capture failed'); + } - const accountId = accId.toLowerCase(); + fs.writeFileSync(path.join(__dirname, 'mist.png'), pageImage); + }, + *getRealAccountBalances() { + let accounts = this.web3.eth.accounts; - for (const i in _accounts) { - if (_accounts[i].toLowerCase() === accountId) { - idx = i; - } - } + let balances = accounts.map( + acc => `${this.web3.fromWei(this.web3.eth.getBalance(acc), 'ether')}` + ); - if (idx < 0) { - throw new Error('Unable to find account in UI'); - } + accounts = accounts.map(a => a.toLowerCase()); + balances = balances.map(b => parseInt(b, 10)); - const accLinks = yield this.client.elements('.wallet-box'); + return _.object(accounts, balances); + }, + *getUiAccountBalances() { + // check balances on the pgetUiAccountsBalancesage + let _accounts = yield this.execElemsMethod( + 'elementIdText', + '.wallet-box .account-id' + ); + let _balances = yield this.execElemsMethod( + 'elementIdText', + '.wallet-box .account-balance' + ); - yield this.client.elementIdClick(accLinks.value[idx].ELEMENT); + _accounts = _accounts.map(a => a.toLowerCase()); + _balances = _balances.map(b => parseInt(b, 10)); - yield Q.delay(1000); - }, - * startMining() { - yield this.geth.consoleExec('miner.start();'); - }, - * stopMining() { - yield this.geth.consoleExec('miner.stop();'); - }, + return _.object(_accounts, _balances); + }, + *openAccountInUi(accId) { + const _accounts = yield this.execElemsMethod( + 'elementIdText', + '.wallet-box .account-id' + ); - * selectTab(tabId) { - yield this.getUiElement(`.sidebar [data-tab-id=${tabId}]`); - yield this.client.click(`.sidebar [data-tab-id=${tabId}] button.main`); - // TODO: returns webview reference - }, + let idx = -1; - * getSelectedWebviewParam(param) { - const selectedTabId = (yield this.client.execute(() => { - return localStorage.getItem('selectedTab'); - })).value; - return yield this.client.getAttribute(`webview[data-id=${selectedTabId}]`, param); - }, + const accountId = accId.toLowerCase(); - * loadFixture(uri = '') { - const client = this.client; - yield client.setValue('#url-input', `${this.fixtureBaseUrl}${uri}`); - yield client.submitForm('form.url'); - yield client.waitUntil(() => { - return client.getText('.dapp-info span', (e) => { - /Fixture/.test(e); - }); - }, 3000, 'expected to properly load fixture'); - }, + for (const i in _accounts) { + if (_accounts[i].toLowerCase() === accountId) { + idx = i; + } + } - * getBrowserBarText() { - return yield this.client.getText('.url-breadcrumb'); - }, + if (idx < 0) { + throw new Error('Unable to find account in UI'); + } - * pinCurrentTab() { - const client = this.client; - yield this.openAndFocusNewWindow('connectAccount', () => { - return client.click('span.connect-button'); + const accLinks = yield this.client.elements('.wallet-box'); + + yield this.client.elementIdClick(accLinks.value[idx].ELEMENT); + + yield Q.delay(1000); + }, + *startMining() { + yield this.geth.consoleExec('miner.start();'); + }, + *stopMining() { + yield this.geth.consoleExec('miner.stop();'); + }, + + *selectTab(tabId) { + yield this.getUiElement(`.sidebar [data-tab-id=${tabId}]`); + yield this.client.click(`.sidebar [data-tab-id=${tabId}] button.main`); + // TODO: returns webview reference + }, + + *getSelectedWebviewParam(param) { + const selectedTabId = (yield this.client.execute(() => { + return localStorage.getItem('selectedTab'); + })).value; + return yield this.client.getAttribute( + `webview[data-id=${selectedTabId}]`, + param + ); + }, + + *loadFixture(uri = '') { + const client = this.client; + yield client.setValue('#url-input', `${this.fixtureBaseUrl}${uri}`); + yield client.submitForm('form.url'); + yield client.waitUntil( + () => { + return client.getText('.dapp-info span', e => { + /Fixture/.test(e); }); - yield client.click('.dapp-primary-button'); - yield this.delay(500); - yield client.window(this.mainWindowHandle); // selects main window again + }, + 3000, + 'expected to properly load fixture' + ); + }, - const pinnedWebview = (yield client.windowHandles()).value.pop(); - return pinnedWebview; - }, + *getBrowserBarText() { + return yield this.client.getText('.url-breadcrumb'); + }, - * delay(ms) { - yield this.waitUntil('delay', async () => { - return new Promise(resolve => setTimeout(() => resolve(true), ms)); - }); - }, + *pinCurrentTab() { + const client = this.client; + yield this.openAndFocusNewWindow('connectAccount', () => { + return client.click('span.connect-button'); + }); + yield client.click('.dapp-primary-button'); + yield this.delay(500); + yield client.window(this.mainWindowHandle); // selects main window again - * navigateTo(url) { - const client = this.client; - yield client.setValue('#url-input', url); - yield client.submitForm('form.url'); - }, + const pinnedWebview = (yield client.windowHandles()).value.pop(); + return pinnedWebview; + }, + + *delay(ms) { + yield this.waitUntil('delay', async () => { + return new Promise(resolve => setTimeout(() => resolve(true), ms)); + }); + }, + + *navigateTo(url) { + const client = this.client; + yield client.setValue('#url-input', url); + yield client.submitForm('form.url'); + }, - /* + /* @method getWindowByUrl @param search: function that tells how to search by window @param tries: amount of tries left until give up searching for */ - * getWindowByUrl(search, tries = 5) { - if (tries < 0) throw new Error('Couldn\'t select window using given parameters.'); - const windowHandles = (yield this.client.windowHandles()).value; - for (let handle in windowHandles) { - yield this.client.window(windowHandles[handle]); - const found = !!search(yield this.client.getUrl()); - if (found) return true; - } - yield Q.delay(500); - yield this.getWindowByUrl(search, --tries); //eslint-disable-line + *getWindowByUrl(search, tries = 5) { + if (tries < 0) + throw new Error("Couldn't select window using given parameters."); + const windowHandles = (yield this.client.windowHandles()).value; + for (let handle in windowHandles) { + yield this.client.window(windowHandles[handle]); + const found = !!search(yield this.client.getUrl()); + if (found) return true; } + yield Q.delay(500); + yield this.getWindowByUrl(search, --tries); //eslint-disable-line + } }; diff --git a/tests/mist/basic.test.js b/tests/mist/basic.test.js index 1d8e1d9f9..de505434f 100644 --- a/tests/mist/basic.test.js +++ b/tests/mist/basic.test.js @@ -3,220 +3,277 @@ const path = require('path'); const should = require('chai').should(); const test = require('../_base').mocha(module, { - app: 'mist', + app: 'mist' }); -test['Check for Mist title'] = function* () { - (yield this.client.getTitle()).should.eql('Mist'); +test['Check for Mist title'] = function*() { + (yield this.client.getTitle()).should.eql('Mist'); }; -test['Sanity Check: main window is focused'] = function* () { - const client = this.client; - (yield client.getUrl()).should.match(/interface\/index\.html$/); +test['Sanity Check: main window is focused'] = function*() { + const client = this.client; + (yield client.getUrl()).should.match(/interface\/index\.html$/); }; -test['Browser bar should render urls with separators'] = function* () { - yield this.navigateTo('http://localhost:8080/page1/page2?param=value#hash'); - yield Q.delay(500); - yield this.waitForText('.url-breadcrumb', 'http://localhost:8080 ▸ page1 ▸ page2 ▸ param=value ▸ hash'); +test['Browser bar should render urls with separators'] = function*() { + yield this.navigateTo('http://localhost:8080/page1/page2?param=value#hash'); + yield Q.delay(500); + yield this.waitForText( + '.url-breadcrumb', + 'http://localhost:8080 ▸ page1 ▸ page2 ▸ param=value ▸ hash' + ); }; -test['Browser bar should not render script tags on breadcrumb view'] = function* () { // ETH-01-001 - yield this.navigateTo(''); - yield Q.delay(1500); +test[ + 'Browser bar should not render script tags on breadcrumb view' +] = function*() { + // ETH-01-001 + yield this.navigateTo(''); + yield Q.delay(1500); - const webviewErrorURL = yield this.getSelectedWebviewParam('src'); - webviewErrorURL.should.match(/errorPages\/404\.html$/); + const webviewErrorURL = yield this.getSelectedWebviewParam('src'); + webviewErrorURL.should.match(/errorPages\/404\.html$/); - should.exist(yield this.getUiElement('form.url')); - should.not.exist(yield this.getUiElement('form.url script')); + should.exist(yield this.getUiElement('form.url')); + should.not.exist(yield this.getUiElement('form.url script')); }; -test['Browser bar should not render script tags in disguise on breadcrumb view'] = function* () { // ETH-01-001 - const client = this.client; - - yield client.setValue('#url-input', '<script>alert()</script>'); - const isUrlBlocked = (yield client.execute(() => { // Code executed in context of browser - try { - $('form.url').submit(); - } catch (e) { - return /Invalid URL/.test(e); - } - return false; - })).value; - - isUrlBlocked.should.be.true; - should.not.exist(yield this.getUiElement('form.url script')); +test[ + 'Browser bar should not render script tags in disguise on breadcrumb view' +] = function*() { + // ETH-01-001 + const client = this.client; + + yield client.setValue('#url-input', '<script>alert()</script>'); + const isUrlBlocked = (yield client.execute(() => { + // Code executed in context of browser + try { + $('form.url').submit(); + } catch (e) { + return /Invalid URL/.test(e); + } + return false; + })).value; + + isUrlBlocked.should.be.true; + should.not.exist(yield this.getUiElement('form.url script')); }; -test['Browser bar should not render script tags in disguise (2) on breadcrumb view'] = function* () { // ETH-01-001 - yield this.navigateTo(''); - yield Q.delay(1500); +test[ + 'Browser bar should not render script tags in disguise (2) on breadcrumb view' +] = function*() { + // ETH-01-001 + yield this.navigateTo(''); + yield Q.delay(1500); - should.exist(yield this.getUiElement('form.url')); - should.not.exist(yield this.getUiElement('form.url svg')); - should.not.exist(yield this.getUiElement('form.url script')); + should.exist(yield this.getUiElement('form.url')); + should.not.exist(yield this.getUiElement('form.url svg')); + should.not.exist(yield this.getUiElement('form.url script')); - const webviewErrorURL = yield this.getSelectedWebviewParam('src'); - webviewErrorURL.should.match(/errorPages\/404\.html$/); + const webviewErrorURL = yield this.getSelectedWebviewParam('src'); + webviewErrorURL.should.match(/errorPages\/404\.html$/); }; - -test['Browser bar should not render arbitrary code as HTML'] = function* () { // ETH-01-001 - const client = this.client; - - yield client.waitUntil(() => { - return client.getText('.url-breadcrumb', (e) => { - return e === '%3Ciframe onload="alert%28%29%"%3E'; - }); - }, 5000, 'expected breadcrumb to render as HTML encoded'); +test['Browser bar should not render arbitrary code as HTML'] = function*() { + // ETH-01-001 + const client = this.client; + + yield client.waitUntil( + () => { + return client.getText('.url-breadcrumb', e => { + return e === '%3Ciframe onload="alert%28%29%"%3E'; + }); + }, + 5000, + 'expected breadcrumb to render as HTML encoded' + ); }; -test['Browser bar should not execute JS'] = function* () { // ETH-01-001 - const client = this.client; +test['Browser bar should not execute JS'] = function*() { + // ETH-01-001 + const client = this.client; - yield this.navigateTo(''); - const mist = yield client.execute(() => { return window.mist; }); // checking if `execute` works - const pwned = yield client.execute(() => { return window.pwned; }); + yield this.navigateTo(''); + const mist = yield client.execute(() => { + return window.mist; + }); // checking if `execute` works + const pwned = yield client.execute(() => { + return window.pwned; + }); - should.exist(mist.value); - should.not.exist(pwned.value); + should.exist(mist.value); + should.not.exist(pwned.value); }; -test['Should select Wallet and Browse tabs properly'] = function* () { - yield this.selectTab('wallet'); +test['Should select Wallet and Browse tabs properly'] = function*() { + yield this.selectTab('wallet'); }; -test['Load fixture page'] = function* () { - yield this.loadFixture(); +test['Load fixture page'] = function*() { + yield this.loadFixture(); }; -test['"http" protocol should be allowed on browser bar'] = function* () { // ETH-01-002 - const client = this.client; - yield this.loadFixture(); - - yield client.setValue('#url-input', `${this.fixtureBaseUrl}index.html`); - const isProtocolBlocked = (yield client.execute(() => { // Code executed in context of browser - try { - $('form.url').submit(); - } catch (e) { - return /Invalid URL/.test(e); - } - return false; - })).value; - isProtocolBlocked.should.be.false; - - yield this.waitForText('.url-breadcrumb', 'http://localhost:8080 ▸ index.html'); - - const browserBarText = yield this.client.getText('.url-breadcrumb'); - browserBarText.should.eql('http://localhost:8080 ▸ index.html'); // checks that did change displayed URL +test['"http" protocol should be allowed on browser bar'] = function*() { + // ETH-01-002 + const client = this.client; + yield this.loadFixture(); + + yield client.setValue('#url-input', `${this.fixtureBaseUrl}index.html`); + const isProtocolBlocked = (yield client.execute(() => { + // Code executed in context of browser + try { + $('form.url').submit(); + } catch (e) { + return /Invalid URL/.test(e); + } + return false; + })).value; + isProtocolBlocked.should.be.false; + + yield this.waitForText( + '.url-breadcrumb', + 'http://localhost:8080 ▸ index.html' + ); + + const browserBarText = yield this.client.getText('.url-breadcrumb'); + browserBarText.should.eql('http://localhost:8080 ▸ index.html'); // checks that did change displayed URL }; -test['"javascript" protocol should be disallowed on browser bar'] = function* () { // ETH-01-002 - const client = this.client; - yield this.loadFixture(); - yield client.setValue('#url-input', 'javascript:window.close()'); // eslint-disable-line no-script-url - - const isProtocolBlocked = (yield client.execute(() => { // Code executed in context of browser - try { - $('form.url').submit(); - } - catch (e) { - return /Invalid URL/.test(e); - } - return false; - })).value; - isProtocolBlocked.should.be.true; - - yield Q.delay(800); - const browserBarText = yield this.getBrowserBarText(); - browserBarText.should.eql('http://localhost:8080'); // checks that hasn't changed displayed URL +test[ + '"javascript" protocol should be disallowed on browser bar' +] = function*() { + // ETH-01-002 + const client = this.client; + yield this.loadFixture(); + yield client.setValue('#url-input', 'javascript:window.close()'); // eslint-disable-line no-script-url + + const isProtocolBlocked = (yield client.execute(() => { + // Code executed in context of browser + try { + $('form.url').submit(); + } catch (e) { + return /Invalid URL/.test(e); + } + return false; + })).value; + isProtocolBlocked.should.be.true; + + yield Q.delay(800); + const browserBarText = yield this.getBrowserBarText(); + browserBarText.should.eql('http://localhost:8080'); // checks that hasn't changed displayed URL }; -test['"data" protocol should be disallowed on browser bar'] = function* () { // ETH-01-002 - const client = this.client; - yield this.loadFixture(); - yield client.setValue('#url-input', 'data:text/plain;charset=utf-8;base64,dGhpcyB0ZXN0IGlzIG9uIGZpcmU='); - - const isProtocolBlocked = (yield client.execute(() => { // Code executed in context of browser - try { - $('form.url').submit(); - } catch (e) { - return /Invalid URL/.test(e); - } - return false; - })).value; - isProtocolBlocked.should.be.true; - - yield Q.delay(500); - const browserBarText = yield this.getBrowserBarText(); - browserBarText.should.eql('http://localhost:8080'); // checks that hasn't changed displayed URL +test['"data" protocol should be disallowed on browser bar'] = function*() { + // ETH-01-002 + const client = this.client; + yield this.loadFixture(); + yield client.setValue( + '#url-input', + 'data:text/plain;charset=utf-8;base64,dGhpcyB0ZXN0IGlzIG9uIGZpcmU=' + ); + + const isProtocolBlocked = (yield client.execute(() => { + // Code executed in context of browser + try { + $('form.url').submit(); + } catch (e) { + return /Invalid URL/.test(e); + } + return false; + })).value; + isProtocolBlocked.should.be.true; + + yield Q.delay(500); + const browserBarText = yield this.getBrowserBarText(); + browserBarText.should.eql('http://localhost:8080'); // checks that hasn't changed displayed URL }; -test['"file" protocol should be disallowed on browser bar'] = function* () { // ETH-01-012 - const filePath = `file://${path.join(__dirname, '..', 'fixtures', 'index.html')}`; +test['"file" protocol should be disallowed on browser bar'] = function*() { + // ETH-01-012 + const filePath = `file://${path.join( + __dirname, + '..', + 'fixtures', + 'index.html' + )}`; - yield this.navigateTo(filePath); - yield Q.delay(1000); + yield this.navigateTo(filePath); + yield Q.delay(1000); - const webviewErrorURL = yield this.getSelectedWebviewParam('src'); - webviewErrorURL.should.match(/errorPages\/400\.html$/); + const webviewErrorURL = yield this.getSelectedWebviewParam('src'); + webviewErrorURL.should.match(/errorPages\/400\.html$/); }; +test['Pin tab test'] = function*() { + const client = this.client; + const sidebarItems = (yield client.elements('.sidebar nav > ul > li')).value; -test['Pin tab test'] = function* () { - const client = this.client; - const sidebarItems = (yield client.elements('.sidebar nav > ul > li')).value; - - yield this.selectTab('browser'); - yield this.pinCurrentTab(); + yield this.selectTab('browser'); + yield this.pinCurrentTab(); - const sidebarItemsAfterAdd = (yield client.elements('.sidebar nav > ul > li')).value; + const sidebarItemsAfterAdd = (yield client.elements('.sidebar nav > ul > li')) + .value; - sidebarItems.length.should.eql(2); - sidebarItemsAfterAdd.length.should.eql(3); + sidebarItems.length.should.eql(2); + sidebarItemsAfterAdd.length.should.eql(3); }; -test['Browse tab should be changed to pinned tab if URLs are the same'] = function* () { // ETH-01-007 - const client = this.client; - yield this.selectTab('browser'); - - yield this.navigateTo('https://wallet.ethereum.org'); - yield Q.delay(1000); - const selectedTab = (yield client.execute(() => { // code executed in browser context - return LocalStore.get('selectedTab'); - })).value; - - selectedTab.should.eql('wallet'); +test[ + 'Browse tab should be changed to pinned tab if URLs are the same' +] = function*() { + // ETH-01-007 + const client = this.client; + yield this.selectTab('browser'); + + yield this.navigateTo('https://wallet.ethereum.org'); + yield Q.delay(1000); + const selectedTab = (yield client.execute(() => { + // code executed in browser context + return LocalStore.get('selectedTab'); + })).value; + + selectedTab.should.eql('wallet'); }; -test['Wallet tab shouldn\'t have the page replaced if URLs does not match'] = function* () { // ETH-01-007 - const client = this.client; - yield this.selectTab('wallet'); - - yield this.navigateTo(`${this.fixtureBaseUrl}index.html?https://wallet.ethereum.org`); - yield client.waitUntil(() => { - return client.execute(() => { - return LocalStore.get('selectedTab') === 'browser'; - }); - }, 2000); +test[ + "Wallet tab shouldn't have the page replaced if URLs does not match" +] = function*() { + // ETH-01-007 + const client = this.client; + yield this.selectTab('wallet'); + + yield this.navigateTo( + `${this.fixtureBaseUrl}index.html?https://wallet.ethereum.org` + ); + yield client.waitUntil(() => { + return client.execute(() => { + return LocalStore.get('selectedTab') === 'browser'; + }); + }, 2000); }; -test['Wallet tab shouldn\'t have the page replaced if URLs does not match - 2'] = function* () { // ETH-01-007 - const client = this.client; - yield this.selectTab('wallet'); - - // Now changing address via JS - yield client.setValue('#url-input', `${this.fixtureBaseUrl}index.html?https://wallet.ethereum.org`); - yield client.execute(() => { // Code executed in context of browser - $('form.url').submit(); +test[ + "Wallet tab shouldn't have the page replaced if URLs does not match - 2" +] = function*() { + // ETH-01-007 + const client = this.client; + yield this.selectTab('wallet'); + + // Now changing address via JS + yield client.setValue( + '#url-input', + `${this.fixtureBaseUrl}index.html?https://wallet.ethereum.org` + ); + yield client.execute(() => { + // Code executed in context of browser + $('form.url').submit(); + }); + + yield client.waitUntil(() => { + return client.execute(() => { + return LocalStore.get('selectedTab') === 'browser'; }); - - yield client.waitUntil(() => { - return client.execute(() => { - return LocalStore.get('selectedTab') === 'browser'; - }); - }, 2000); + }, 2000); }; //test['Links with target _blank should open inside Mist'] = function* () { @@ -260,13 +317,15 @@ test['Wallet tab shouldn\'t have the page replaced if URLs does not match - 2'] // // ETH-01-008 -test['Mist main webview should not redirect to local files'] = function* () { - const client = this.client; - const url = `${this.fixtureBaseUrl}redirect?to=file:///Users/ev/Desktop/keystore.txt`; +test['Mist main webview should not redirect to local files'] = function*() { + const client = this.client; + const url = `${ + this.fixtureBaseUrl + }redirect?to=file:///Users/ev/Desktop/keystore.txt`; - yield this.navigateTo(url); - yield Q.delay(1000); + yield this.navigateTo(url); + yield Q.delay(1000); - const webviewErrorURL = yield this.getSelectedWebviewParam('src'); - webviewErrorURL.should.match(/errorPages\/400\.html$/); + const webviewErrorURL = yield this.getSelectedWebviewParam('src'); + webviewErrorURL.should.match(/errorPages\/400\.html$/); }; diff --git a/tests/mocha-in-browser/README.md b/tests/mocha-in-browser/README.md index e19ab4f6e..dd20379ff 100644 --- a/tests/mocha-in-browser/README.md +++ b/tests/mocha-in-browser/README.md @@ -1,7 +1,7 @@ # Mocha In the Browser A super simple example of how [Mocha](http://visionmedia.github.com/mocha/) tests -can be executed in the browser. A great way to start is cloning this project and +can be executed in the browser. A great way to start is cloning this project and working through the [String Calculator Kata](http://osherove.com/tdd-kata-1/). Open up the public/index.html file in a browser to see the JavaScript object used by the page. diff --git a/tests/mocha-in-browser/spec/general-spec.js b/tests/mocha-in-browser/spec/general-spec.js index 5a4786b95..64427455a 100644 --- a/tests/mocha-in-browser/spec/general-spec.js +++ b/tests/mocha-in-browser/spec/general-spec.js @@ -1,114 +1,146 @@ // implement chai's should interface var expect = chai.expect; -describe('General', function () { - describe('window.prompt()', function () { - it('should not throw errors', function () { - expect(window.prompt).to.not.throw(Error); - }); +describe('General', function() { + describe('window.prompt()', function() { + it('should not throw errors', function() { + expect(window.prompt).to.not.throw(Error); }); + }); - describe('mist', function () { - it('shouldn\'t expose dirname', function () { - expect(mist.dirname).to.be.undefined; - }); - - it('shouldn\'t expose shell', function () { - expect(mist.shell).to.be.undefined; - }); - - it('should contain only allowed attributes', function () { - var allowedAttributes = [ - 'callbacks', - 'version', - 'license', - 'platform', - 'requestAccount', - 'sounds', - 'menu', - 'solidity' - ]; - - expect(mist).to.have.all.keys(allowedAttributes); - }); - - it('should return platform', function () { - expect(mist.platform).to.be.oneOf(['darwin', 'win32', 'freebsd', 'linux', 'sunos']); - }); - - it('should report solidity version', function () { - expect(mist.solidity.version).to.match(/^\d\.\d{1,2}\.\d{1,2}$/); // match examples: 0.4.6, 0.5.10, 0.10.0 - }); + describe('mist', function() { + it("shouldn't expose dirname", function() { + expect(mist.dirname).to.be.undefined; }); - describe('mist.menu', function () { - before(function () { - mist.menu.clear(); - }); - - afterEach(function () { - mist.menu.clear(); - }); - - it('add() should return false when params are incorrect', function () { - expect(mist.menu.add()).to.be.false; - expect(mist.menu.add('mydappmenu')).to.be.false; - expect(mist.menu.add('mydappmenu', {})).to.be.false; - }); - - it('add() should return true when successful', function () { - expect(mist.menu.add('mydappmenu', { name: 'MyMenu' })).to.be.true; - expect(mist.menu.add('mydappmenu', { name: 'MyMenu', position: 1 }, function () {})).to.be.true; - }); - - it('add() should update menu entries', function () { - mist.menu.add('menu0', { name: 'Test1', selected: true, position: 1 }); - - mist.menu.update('menu0', { name: 'Test1234', selected: false, position: 12 }); - - expect(mist.menu.entries.entry_menu0).to.eql({ id: 'entry_menu0', position: 12, name: 'Test1234', selected: false, badge: undefined }); - }); - - it('should be selectable', function () { - mist.menu.add('menu0', { name: 'Test1', selected: true }); - mist.menu.add('menu1', { name: 'Test2' }); - - mist.menu.select('menu1'); - - expect(mist.menu.entries.entry_menu0.selected).to.be.false; - expect(mist.menu.entries.entry_menu1.selected).to.be.true; - }); - - it('remove() should remove menu from entries', function () { - mist.menu.add('menu0', { name: 'Test2' }); - mist.menu.add('menu1', { name: 'Test3' }); - mist.menu.add('menu2', { name: 'Test4' }); - - expect(mist.menu.entries).to.have.all.keys('entry_menu0', 'entry_menu1', 'entry_menu2'); - mist.menu.remove('menu1'); - expect(mist.menu.entries).to.have.all.keys('entry_menu0', 'entry_menu2'); - }); - - it('clear() should clear menu entries', function () { - mist.menu.add('menu0', { name: 'Test1' }); - mist.menu.add('menu1', { name: 'Test2' }); - - expect(mist.menu.entries).to.have.all.keys('entry_menu0', 'entry_menu1'); - - mist.menu.clear(); - expect(mist.menu.entries).to.be.empty; - }); - - it('add() should be limited to 100 entries', function () { - var i; - // adding 100 entries - for (i = 0; i < 100; i += 1) { - mist.menu.add('menu' + i, { name: 'Test' + i }); - } - expect(Object.keys(mist.menu.entries).length).to.equals(100); - expect(mist.menu.add('menu 101', { - name: 'Menu overflow', - })).to.be.false; - }); + it("shouldn't expose shell", function() { + expect(mist.shell).to.be.undefined; }); + + it('should contain only allowed attributes', function() { + var allowedAttributes = [ + 'callbacks', + 'version', + 'license', + 'platform', + 'requestAccount', + 'sounds', + 'menu', + 'solidity' + ]; + + expect(mist).to.have.all.keys(allowedAttributes); + }); + + it('should return platform', function() { + expect(mist.platform).to.be.oneOf([ + 'darwin', + 'win32', + 'freebsd', + 'linux', + 'sunos' + ]); + }); + + it('should report solidity version', function() { + expect(mist.solidity.version).to.match(/^\d\.\d{1,2}\.\d{1,2}$/); // match examples: 0.4.6, 0.5.10, 0.10.0 + }); + }); + + describe('mist.menu', function() { + before(function() { + mist.menu.clear(); + }); + + afterEach(function() { + mist.menu.clear(); + }); + + it('add() should return false when params are incorrect', function() { + expect(mist.menu.add()).to.be.false; + expect(mist.menu.add('mydappmenu')).to.be.false; + expect(mist.menu.add('mydappmenu', {})).to.be.false; + }); + + it('add() should return true when successful', function() { + expect(mist.menu.add('mydappmenu', { name: 'MyMenu' })).to.be.true; + expect( + mist.menu.add( + 'mydappmenu', + { name: 'MyMenu', position: 1 }, + function() {} + ) + ).to.be.true; + }); + + it('add() should update menu entries', function() { + mist.menu.add('menu0', { + name: 'Test1', + selected: true, + position: 1 + }); + + mist.menu.update('menu0', { + name: 'Test1234', + selected: false, + position: 12 + }); + + expect(mist.menu.entries.entry_menu0).to.eql({ + id: 'entry_menu0', + position: 12, + name: 'Test1234', + selected: false, + badge: undefined + }); + }); + + it('should be selectable', function() { + mist.menu.add('menu0', { name: 'Test1', selected: true }); + mist.menu.add('menu1', { name: 'Test2' }); + + mist.menu.select('menu1'); + + expect(mist.menu.entries.entry_menu0.selected).to.be.false; + expect(mist.menu.entries.entry_menu1.selected).to.be.true; + }); + + it('remove() should remove menu from entries', function() { + mist.menu.add('menu0', { name: 'Test2' }); + mist.menu.add('menu1', { name: 'Test3' }); + mist.menu.add('menu2', { name: 'Test4' }); + + expect(mist.menu.entries).to.have.all.keys( + 'entry_menu0', + 'entry_menu1', + 'entry_menu2' + ); + mist.menu.remove('menu1'); + expect(mist.menu.entries).to.have.all.keys('entry_menu0', 'entry_menu2'); + }); + + it('clear() should clear menu entries', function() { + mist.menu.add('menu0', { name: 'Test1' }); + mist.menu.add('menu1', { name: 'Test2' }); + + expect(mist.menu.entries).to.have.all.keys('entry_menu0', 'entry_menu1'); + + mist.menu.clear(); + expect(mist.menu.entries).to.be.empty; + }); + + it('add() should be limited to 100 entries', function() { + var i; + // adding 100 entries + for (i = 0; i < 100; i += 1) { + mist.menu.add('menu' + i, { name: 'Test' + i }); + } + expect(Object.keys(mist.menu.entries).length).to.equals(100); + expect( + mist.menu.add('menu 101', { + name: 'Menu overflow' + }) + ).to.be.false; + }); + }); }); diff --git a/tests/mocha-in-browser/spec/ipc-spec.js b/tests/mocha-in-browser/spec/ipc-spec.js index a7f300f9a..b7f5aa327 100644 --- a/tests/mocha-in-browser/spec/ipc-spec.js +++ b/tests/mocha-in-browser/spec/ipc-spec.js @@ -2,117 +2,127 @@ var expect = chai.expect; var idCount = 500; -describe("IPC connection", function() { +describe('IPC connection', function() { + describe('ipcProvider', function() { + it("shouldn't allow admin functionality [sync]", function() { + var id = idCount++; + + ipcProvider.connect(); + + var data = ipcProvider.writeSync( + JSON.stringify({ + jsonrpc: '2.0', + id: id, + method: 'admin_nodeInfo', + params: [] + }) + ); + + data = data.toString(); + data = JSON.parse(data); + + expect(data.id).to.be.equal(id); + expect(data.error).to.be.defined; + expect(data.error.code).to.be.equal(-32601); + }); + + it("shouldn't allow admin functionality [sync, batch request]", function() { + var id = idCount++; + + ipcProvider.connect(); + + var data = ipcProvider.writeSync( + JSON.stringify([ + { + jsonrpc: '2.0', + id: id, + method: 'admin_nodeInfo', + params: [] + }, + { + jsonrpc: '2.0', + id: id + 1, + method: 'eth_accounts', + params: [] + } + ]) + ); + + data = data.toString(); + data = JSON.parse(data); + + expect(data[0].id).to.be.equal(id); + expect(data[0].error).to.be.defined; + expect(data[0].error.code).to.be.equal(-32601); + + expect(data[1].id).to.be.equal(id + 1); + expect(data[1].result).to.be.defined; + }); + + it("shouldn't allow admin functionality [async]", function(done) { + var id = idCount++; - describe('ipcProvider', function() { - - it('shouldn\'t allow admin functionality [sync]', function() { - var id = idCount++; + ipcProvider.connect(); - ipcProvider.connect(); + ipcProvider.write( + JSON.stringify({ + jsonrpc: '2.0', + id: id, + method: 'admin_nodeInfo', + params: [] + }) + ); + + ipcProvider.on('data', function(data) { + data = data.toString(); + data = JSON.parse(data); + + if (data.id === id) { + expect(data.error).to.be.defined; + expect(data.error.code).to.be.equal(-32601); + + done(); + } + }); + }); - var data = ipcProvider.writeSync(JSON.stringify({ - "jsonrpc": "2.0", - "id": id, - "method": "admin_nodeInfo", - "params": [] - })); - - data = data.toString(); - data = JSON.parse(data); - - expect(data.id).to.be.equal(id); - expect(data.error).to.be.defined; - expect(data.error.code).to.be.equal(-32601); - }); - - it('shouldn\'t allow admin functionality [sync, batch request]', function() { - var id = idCount++; - - ipcProvider.connect(); - - var data = ipcProvider.writeSync(JSON.stringify([{ - "jsonrpc": "2.0", - "id": id, - "method": "admin_nodeInfo", - "params": [] - },{ - "jsonrpc": "2.0", - "id": id + 1, - "method": "eth_accounts", - "params": [] - }])); - - data = data.toString(); - data = JSON.parse(data); - - expect(data[0].id).to.be.equal(id); - expect(data[0].error).to.be.defined; - expect(data[0].error.code).to.be.equal(-32601); - - expect(data[1].id).to.be.equal(id + 1); - expect(data[1].result).to.be.defined; - }); - - it('shouldn\'t allow admin functionality [async]', function(done) { - var id = idCount++; - - ipcProvider.connect(); - - ipcProvider.write(JSON.stringify({ - "jsonrpc": "2.0", - "id": id, - "method": "admin_nodeInfo", - "params": [] - })); - - ipcProvider.on('data', function(data){ - data = data.toString(); - data = JSON.parse(data); - - if(data.id === id) { - expect(data.error).to.be.defined; - expect(data.error.code).to.be.equal(-32601); - - done(); - } - }); - }); - - it('shouldn\'t allow admin functionality [async, batch request]', function(done) { - var id = idCount++; - - ipcProvider.connect(); - - ipcProvider.write(JSON.stringify([{ - "jsonrpc": "2.0", - "id": id, - "method": "admin_nodeInfo", - "params": [] - },{ - "jsonrpc": "2.0", - "id": id + 1, - "method": "eth_accounts", - "params": [] - }])); - - ipcProvider.on('data', function(data){ - - data = data.toString(); - data = JSON.parse(data); - - if(data[0] && data[0].id === id) { - - expect(data[0].id).to.be.equal(id); - expect(data[0].error).to.be.defined; - expect(data[0].error.code).to.be.equal(-32601); - - expect(data[1].id).to.be.equal(id + 1); - expect(data[1].result).to.be.defined; - - done(); - } - }); - }); + it("shouldn't allow admin functionality [async, batch request]", function(done) { + var id = idCount++; + + ipcProvider.connect(); + + ipcProvider.write( + JSON.stringify([ + { + jsonrpc: '2.0', + id: id, + method: 'admin_nodeInfo', + params: [] + }, + { + jsonrpc: '2.0', + id: id + 1, + method: 'eth_accounts', + params: [] + } + ]) + ); + + ipcProvider.on('data', function(data) { + data = data.toString(); + data = JSON.parse(data); + + if (data[0] && data[0].id === id) { + expect(data[0].id).to.be.equal(id); + expect(data[0].error).to.be.defined; + expect(data[0].error.code).to.be.equal(-32601); + + expect(data[1].id).to.be.equal(id + 1); + expect(data[1].result).to.be.defined; + + done(); + } + }); }); + }); }); diff --git a/tests/mocha-in-browser/spec/permissions-spec.js b/tests/mocha-in-browser/spec/permissions-spec.js index e186e4321..daa416175 100644 --- a/tests/mocha-in-browser/spec/permissions-spec.js +++ b/tests/mocha-in-browser/spec/permissions-spec.js @@ -1,155 +1,161 @@ // implement chai's should interface var expect = chai.expect; -describe('Permissions', function () { - - describe('permissions', function () { - it('should be available', function () { - expect(window.permissions).to.be.an('object', 'The permissions object was not present, please reload the test page'); - expect(window.permissions.accounts).to.be.an('array', 'The permissions object was not present, please reload the test page'); - }); +describe('Permissions', function() { + describe('permissions', function() { + it('should be available', function() { + expect(window.permissions).to.be.an( + 'object', + 'The permissions object was not present, please reload the test page' + ); + expect(window.permissions.accounts).to.be.an( + 'array', + 'The permissions object was not present, please reload the test page' + ); }); + }); - describe('web3.eth.accounts', function () { - - it('should return an array [sync]', function () { - var accounts = web3.eth.accounts; - expect(accounts).to.be.an('array'); - }); - - it('should return an array [async]', function (done) { - web3.eth.getAccounts(function (e, accounts) { - expect(e).to.be.null; - expect(accounts).to.be.an('array'); - - done(); - }); - }); - - it('should match the allowed accounts in the tabs permisssions, and don\'t contain coinbase [sync]', function (done) { - var accounts = web3.eth.accounts; - - expect(window.permissions.accounts.length).to.equal(accounts.length); - expect(window.permissions.accounts).to.not.include(window.coinbase); - accounts.forEach(function (account) { - expect(window.permissions.accounts).to.include(account); - }); - - done(); - }); - - it('should match the allowed accounts in the tabs permisssions, and don\'t contain coinbase [async]', function (done) { - web3.eth.getAccounts(function (e, accounts) { - expect(window.permissions.accounts.length).to.equal(accounts.length); - expect(window.permissions.accounts).to.not.include(window.coinbase); - accounts.forEach(function (account) { - expect(window.permissions.accounts).to.include(account); - }); - - done(); - }); - }); + describe('web3.eth.accounts', function() { + it('should return an array [sync]', function() { + var accounts = web3.eth.accounts; + expect(accounts).to.be.an('array'); + }); + it('should return an array [async]', function(done) { + web3.eth.getAccounts(function(e, accounts) { + expect(e).to.be.null; + expect(accounts).to.be.an('array'); - it('should match the allowed accounts in the tabs permisssions, and don\'t contain coinbase [async, batch request]', function (done) { - var count = 1; + done(); + }); + }); - var callback = function (e, accounts) { - expect(window.permissions.accounts.length).to.equal(accounts.length); - expect(window.permissions.accounts).to.not.include(window.coinbase); - accounts.forEach(function (account) { - expect(window.permissions.accounts).to.include(account); - }); + it("should match the allowed accounts in the tabs permisssions, and don't contain coinbase [sync]", function(done) { + var accounts = web3.eth.accounts; - if (count === 2) { - done(); - } + expect(window.permissions.accounts.length).to.equal(accounts.length); + expect(window.permissions.accounts).to.not.include(window.coinbase); + accounts.forEach(function(account) { + expect(window.permissions.accounts).to.include(account); + }); - count += count; - }; + done(); + }); - var batch = web3.createBatch(); - batch.add(web3.eth.getAccounts.request(callback)); - batch.add(web3.eth.getAccounts.request(callback)); - batch.execute(); + it("should match the allowed accounts in the tabs permisssions, and don't contain coinbase [async]", function(done) { + web3.eth.getAccounts(function(e, accounts) { + expect(window.permissions.accounts.length).to.equal(accounts.length); + expect(window.permissions.accounts).to.not.include(window.coinbase); + accounts.forEach(function(account) { + expect(window.permissions.accounts).to.include(account); }); + done(); + }); }); - describe('web3.eth.coinbase', function () { + it("should match the allowed accounts in the tabs permisssions, and don't contain coinbase [async, batch request]", function(done) { + var count = 1; - it('should be empty [sync]', function () { - var coinbase = web3.eth.coinbase; - expect(coinbase).to.be.null; + var callback = function(e, accounts) { + expect(window.permissions.accounts.length).to.equal(accounts.length); + expect(window.permissions.accounts).to.not.include(window.coinbase); + accounts.forEach(function(account) { + expect(window.permissions.accounts).to.include(account); }); - it('should be empty [async]', function (done) { - web3.eth.getCoinbase(function (e, coinbase) { - expect(e).to.be.null; - expect(coinbase).to.be.null; + if (count === 2) { + done(); + } - done(); - }); - }); + count += count; + }; + var batch = web3.createBatch(); + batch.add(web3.eth.getAccounts.request(callback)); + batch.add(web3.eth.getAccounts.request(callback)); + batch.execute(); + }); + }); - it('should be empty [async, batch request]', function (done) { - var count = 1; + describe('web3.eth.coinbase', function() { + it('should be empty [sync]', function() { + var coinbase = web3.eth.coinbase; + expect(coinbase).to.be.null; + }); - var callback = function (e, coinbase) { - expect(e).to.be.null; - expect(coinbase).to.be.null; + it('should be empty [async]', function(done) { + web3.eth.getCoinbase(function(e, coinbase) { + expect(e).to.be.null; + expect(coinbase).to.be.null; - if (count === 2) { - done(); - } + done(); + }); + }); - count += count; - }; + it('should be empty [async, batch request]', function(done) { + var count = 1; - var batch = web3.createBatch(); - batch.add(web3.eth.getCoinbase.request(callback)); - batch.add(web3.eth.getCoinbase.request(callback)); - batch.execute(); - }); + var callback = function(e, coinbase) { + expect(e).to.be.null; + expect(coinbase).to.be.null; - }); + if (count === 2) { + done(); + } - describe('web3 parameter validation', function () { + count += count; + }; - it('shouldn\'t allow RegExp (possible XSS)', function () { - var add = '0x0000000000000000000000000000000000000000'; - expect(function () { web3.eth.sendTransaction({ from: add, to: add, data: new RegExp('') }); }).to.throw('Payload, or some of its content properties are invalid. Please check if they are valid HEX with \'0x\' prefix.'); + var batch = web3.createBatch(); + batch.add(web3.eth.getCoinbase.request(callback)); + batch.add(web3.eth.getCoinbase.request(callback)); + batch.execute(); + }); + }); + + describe('web3 parameter validation', function() { + it("shouldn't allow RegExp (possible XSS)", function() { + var add = '0x0000000000000000000000000000000000000000'; + expect(function() { + web3.eth.sendTransaction({ + from: add, + to: add, + data: new RegExp('') }); + }).to.throw( + "Payload, or some of its content properties are invalid. Please check if they are valid HEX with '0x' prefix." + ); }); + }); - describe('web3 attributes', function () { - it('shouldn\'t allow `admin`', function () { - expect(web3.admin).to.be.undefined; - }); + describe('web3 attributes', function() { + it("shouldn't allow `admin`", function() { + expect(web3.admin).to.be.undefined; + }); - it('shouldn\'t allow IPC provider', function () { - expect(window.ipc).to.be.undefined; - expect(window.ipcRenderer).to.be.undefined; - }); + it("shouldn't allow IPC provider", function() { + expect(window.ipc).to.be.undefined; + expect(window.ipcRenderer).to.be.undefined; + }); - it('should only contain allowed attributes', function () { - var allowedAttributes = [ - '_requestManager', - 'bzz', - 'currentProvider', - 'eth', - 'db', - 'shh', - 'net', - 'personal', - 'settings', - 'version', - 'providers', - '_extend' - ]; - - expect(web3).to.have.all.keys(allowedAttributes); - }); + it('should only contain allowed attributes', function() { + var allowedAttributes = [ + '_requestManager', + 'bzz', + 'currentProvider', + 'eth', + 'db', + 'shh', + 'net', + 'personal', + 'settings', + 'version', + 'providers', + '_extend' + ]; + + expect(web3).to.have.all.keys(allowedAttributes); }); + }); }); diff --git a/tests/unit/core/settings/actions.test.js b/tests/unit/core/settings/actions.test.js index 1e4df4fee..019a95663 100644 --- a/tests/unit/core/settings/actions.test.js +++ b/tests/unit/core/settings/actions.test.js @@ -3,93 +3,93 @@ import configureMockStore from 'redux-mock-store'; import thunk from 'redux-thunk'; import { initialState } from '../../../../modules/core/settings/reducer'; import { - getLanguage, - resetMenu, - setAcceptLanguageHeader, - setLanguage, - setLanguageOnClient, - setLanguageOnMain, - syncBuildConfig, - syncFlags, + getLanguage, + resetMenu, + setAcceptLanguageHeader, + setLanguage, + setLanguageOnClient, + setLanguageOnMain, + syncBuildConfig, + syncFlags } from '../../../../modules/core/settings/actions'; describe('settings actions:', () => { - describe('synchronous action creators', () => { - it('should handle #syncFlags', () => { - const argv = { mode: 'mist', rpcMode: 'ipc', productionMode: true }; - const action = { - type: '[MAIN]:CLI_FLAGS:SYNC', - payload: { cliFlags: argv } - }; - - assert.deepEqual(syncFlags(argv), action); - }); - - it('should handle #syncBuildConfig', () => { - const appVersion = '1.0.0'; - const action = { - type: '[MAIN]:BUILD_CONFIG:SYNC', - payload: { appVersion } - }; - - assert.deepEqual(syncBuildConfig('appVersion', appVersion), action); - }); + describe('synchronous action creators', () => { + it('should handle #syncFlags', () => { + const argv = { mode: 'mist', rpcMode: 'ipc', productionMode: true }; + const action = { + type: '[MAIN]:CLI_FLAGS:SYNC', + payload: { cliFlags: argv } + }; + + assert.deepEqual(syncFlags(argv), action); }); - describe('asynchronous action creators', () => { - const middlewares = [thunk]; - const initMockStore = configureMockStore(middlewares); - const store = initMockStore({ settings: initialState }); + it('should handle #syncBuildConfig', () => { + const appVersion = '1.0.0'; + const action = { + type: '[MAIN]:BUILD_CONFIG:SYNC', + payload: { appVersion } + }; - afterEach(() => store.clearActions()); + assert.deepEqual(syncBuildConfig('appVersion', appVersion), action); + }); + }); + + describe('asynchronous action creators', () => { + const middlewares = [thunk]; + const initMockStore = configureMockStore(middlewares); + const store = initMockStore({ settings: initialState }); - it('should handle #setLanguage', async () => { - await store.dispatch(setLanguage('en', {})); - const actions = store.getActions(); + afterEach(() => store.clearActions()); - assert.equal(actions.length, 10); - assert.equal(actions[0].type, '[MAIN]:SET_LANGUAGE:START'); - assert.equal(actions.slice(-1)[0].type, '[MAIN]:SET_LANGUAGE:FINISH'); - }); + it('should handle #setLanguage', async () => { + await store.dispatch(setLanguage('en', {})); + const actions = store.getActions(); + + assert.equal(actions.length, 10); + assert.equal(actions[0].type, '[MAIN]:SET_LANGUAGE:START'); + assert.equal(actions.slice(-1)[0].type, '[MAIN]:SET_LANGUAGE:FINISH'); + }); - it('should handle #setLanguageOnMain', async () => { - await store.dispatch(setLanguageOnMain('en')); - const actions = store.getActions(); + it('should handle #setLanguageOnMain', async () => { + await store.dispatch(setLanguageOnMain('en')); + const actions = store.getActions(); - assert.equal(actions.length, 2); - assert.equal(actions[0].type, '[MAIN]:SET_LANGUAGE_ON_MAIN:START'); - }); + assert.equal(actions.length, 2); + assert.equal(actions[0].type, '[MAIN]:SET_LANGUAGE_ON_MAIN:START'); + }); - it('should handle #setLanguageOnClient', async () => { - await store.dispatch(setLanguageOnClient('en', {})); - const actions = store.getActions(); + it('should handle #setLanguageOnClient', async () => { + await store.dispatch(setLanguageOnClient('en', {})); + const actions = store.getActions(); - assert.equal(actions.length, 2); - assert.equal(actions[0].type, '[MAIN]:SET_LANGUAGE_ON_CLIENT:START'); - }); + assert.equal(actions.length, 2); + assert.equal(actions[0].type, '[MAIN]:SET_LANGUAGE_ON_CLIENT:START'); + }); - it('should handle #setAcceptLanguageHeader', async () => { - await store.dispatch(setAcceptLanguageHeader('en', {})); - const actions = store.getActions(); + it('should handle #setAcceptLanguageHeader', async () => { + await store.dispatch(setAcceptLanguageHeader('en', {})); + const actions = store.getActions(); - assert.equal(actions.length, 2); - assert.equal(actions[0].type, '[MAIN]:SET_ACCEPT_LANGUAGE_HEADER:START'); - }); + assert.equal(actions.length, 2); + assert.equal(actions[0].type, '[MAIN]:SET_ACCEPT_LANGUAGE_HEADER:START'); + }); - it('should handle #resetMenu', async () => { - await store.dispatch(resetMenu('en')); - const actions = store.getActions(); + it('should handle #resetMenu', async () => { + await store.dispatch(resetMenu('en')); + const actions = store.getActions(); - assert.equal(actions.length, 2); - assert.equal(actions[0].type, '[MAIN]:RESET_MENU:START'); - }); + assert.equal(actions.length, 2); + assert.equal(actions[0].type, '[MAIN]:RESET_MENU:START'); + }); - it('should handle #getLanguage', async () => { - await store.dispatch(getLanguage({})); - const actions = store.getActions(); + it('should handle #getLanguage', async () => { + await store.dispatch(getLanguage({})); + const actions = store.getActions(); - assert.equal(actions.length, 2); - assert.equal(actions[0].type, '[MAIN]:GET_LANGUAGE:START'); - }); + assert.equal(actions.length, 2); + assert.equal(actions[0].type, '[MAIN]:GET_LANGUAGE:START'); }); + }); }); diff --git a/tests/unit/core/settings/reducer.test.js b/tests/unit/core/settings/reducer.test.js index 7ed05c83c..ccfce6587 100644 --- a/tests/unit/core/settings/reducer.test.js +++ b/tests/unit/core/settings/reducer.test.js @@ -1,63 +1,65 @@ import { assert } from 'chai'; -import reducer, { initialState } from '../../../../modules/core/settings/reducer'; +import reducer, { + initialState +} from '../../../../modules/core/settings/reducer'; describe('the settings reducer', () => { - it('should return a default initial state', () => { - assert.deepEqual(reducer(undefined, {}), initialState); - }); - - it('should handle the "[MAIN]:BUILD_CONFIG:SYNC" action', () => { - const action = { - type: '[MAIN]:BUILD_CONFIG:SYNC', - payload: { appVersion: '1.0.0' } - }; - const expectedState = Object.assign({}, initialState, { - appVersion: '1.0.0', - }); + it('should return a default initial state', () => { + assert.deepEqual(reducer(undefined, {}), initialState); + }); - assert.deepEqual(reducer(initialState, action), expectedState); + it('should handle the "[MAIN]:BUILD_CONFIG:SYNC" action', () => { + const action = { + type: '[MAIN]:BUILD_CONFIG:SYNC', + payload: { appVersion: '1.0.0' } + }; + const expectedState = Object.assign({}, initialState, { + appVersion: '1.0.0' }); - it('should handle the "[MAIN]:IGNORE_GPU_BLACKLIST:SET" action', () => { - const action = { type: '[MAIN]:IGNORE_GPU_BLACKLIST:SET' }; - const expectedState = Object.assign({}, initialState, { - ignoreGpuBlacklist: true - }); + assert.deepEqual(reducer(initialState, action), expectedState); + }); - assert.deepEqual(reducer(initialState, action), expectedState); + it('should handle the "[MAIN]:IGNORE_GPU_BLACKLIST:SET" action', () => { + const action = { type: '[MAIN]:IGNORE_GPU_BLACKLIST:SET' }; + const expectedState = Object.assign({}, initialState, { + ignoreGpuBlacklist: true }); - it('should handle the "[MAIN]:CLI_FLAGS:SYNC" action', () => { - const action = { - type: '[MAIN]:CLI_FLAGS:SYNC', - payload: { - cliFlags: { - mode: 'mist', - syncmode: 'light', - swarmurl: 'http://localhost:8585' - } - } - }; - const expectedState = Object.assign({}, initialState, { - cliFlags: { - mode: 'mist', - syncmode: 'light', - swarmurl: 'http://localhost:8585' - } - }); - - assert.deepEqual(reducer(initialState, action), expectedState); + assert.deepEqual(reducer(initialState, action), expectedState); + }); + + it('should handle the "[MAIN]:CLI_FLAGS:SYNC" action', () => { + const action = { + type: '[MAIN]:CLI_FLAGS:SYNC', + payload: { + cliFlags: { + mode: 'mist', + syncmode: 'light', + swarmurl: 'http://localhost:8585' + } + } + }; + const expectedState = Object.assign({}, initialState, { + cliFlags: { + mode: 'mist', + syncmode: 'light', + swarmurl: 'http://localhost:8585' + } }); - it('should handle the "[MAIN]:SET_LANGUAGE_ON_MAIN:SUCCESS" action', () => { - const action = { - type: '[MAIN]:SET_LANGUAGE_ON_MAIN:SUCCESS', - payload: { i18n: 'de' } - }; - const expectedState = Object.assign({}, initialState, { - i18n: 'de' - }); + assert.deepEqual(reducer(initialState, action), expectedState); + }); - assert.deepEqual(reducer(initialState, action), expectedState); + it('should handle the "[MAIN]:SET_LANGUAGE_ON_MAIN:SUCCESS" action', () => { + const action = { + type: '[MAIN]:SET_LANGUAGE_ON_MAIN:SUCCESS', + payload: { i18n: 'de' } + }; + const expectedState = Object.assign({}, initialState, { + i18n: 'de' }); + + assert.deepEqual(reducer(initialState, action), expectedState); + }); }); diff --git a/tests/unit/core/ui/actions.test.js b/tests/unit/core/ui/actions.test.js index 3d05837bc..6dcae6b84 100644 --- a/tests/unit/core/ui/actions.test.js +++ b/tests/unit/core/ui/actions.test.js @@ -5,19 +5,19 @@ import { initialState } from '../../../../modules/core/ui/reducer'; import { quitApp } from '../../../../modules/core/ui/actions'; describe('ui actions:', () => { - describe('asynchronous action creators', () => { - const middlewares = [thunk]; - const initMockStore = configureMockStore(middlewares); - const store = initMockStore({ ui: initialState }); + describe('asynchronous action creators', () => { + const middlewares = [thunk]; + const initMockStore = configureMockStore(middlewares); + const store = initMockStore({ ui: initialState }); - afterEach(() => store.clearActions()); + afterEach(() => store.clearActions()); - it('should handle #quitApp', async () => { - await store.dispatch(quitApp()); - const actions = store.getActions(); + it('should handle #quitApp', async () => { + await store.dispatch(quitApp()); + const actions = store.getActions(); - assert.equal(actions.length, 2); - assert.equal(actions[0].type, '[MAIN]:APP_QUIT:START'); - }); + assert.equal(actions.length, 2); + assert.equal(actions[0].type, '[MAIN]:APP_QUIT:START'); }); + }); }); diff --git a/tests/unit/core/ui/reducer.test.js b/tests/unit/core/ui/reducer.test.js index 3c2e8a0d2..c9da1175d 100644 --- a/tests/unit/core/ui/reducer.test.js +++ b/tests/unit/core/ui/reducer.test.js @@ -2,72 +2,72 @@ import { assert } from 'chai'; import reducer, { initialState } from '../../../../modules/core/ui/reducer'; describe('the ui reducer', () => { - it('should return a default initial state', () => { - assert.deepEqual(reducer(undefined, {}), initialState); - }); - - it('should handle the "[MAIN]:APP_QUIT:SUCCESS" action', () => { - const action = { type: '[MAIN]:APP_QUIT:SUCCESS' }; - const expectedState = Object.assign({}, initialState, { - appQuit: true - }); + it('should return a default initial state', () => { + assert.deepEqual(reducer(undefined, {}), initialState); + }); - assert.deepEqual(reducer(initialState, action), expectedState); + it('should handle the "[MAIN]:APP_QUIT:SUCCESS" action', () => { + const action = { type: '[MAIN]:APP_QUIT:SUCCESS' }; + const expectedState = Object.assign({}, initialState, { + appQuit: true }); - it('should handle the "[MAIN]:WINDOW:OPEN" action', () => { - const state = Object.assign({}, initialState, { - windowsOpen: ['about'] - }); - const action = { - type: '[MAIN]:WINDOW:OPEN', - payload: { windowType: 'importAccount' }, - }; - const expectedState = Object.assign({}, state, { - windowsOpen: ['about', 'importAccount'] - }); + assert.deepEqual(reducer(initialState, action), expectedState); + }); - assert.deepEqual(reducer(state, action), expectedState); + it('should handle the "[MAIN]:WINDOW:OPEN" action', () => { + const state = Object.assign({}, initialState, { + windowsOpen: ['about'] + }); + const action = { + type: '[MAIN]:WINDOW:OPEN', + payload: { windowType: 'importAccount' } + }; + const expectedState = Object.assign({}, state, { + windowsOpen: ['about', 'importAccount'] }); - it('should handle the "[MAIN]:WINDOW:CLOSE" action', () => { - const state = Object.assign({}, initialState, { - windowsOpen: ['about', 'importAccount'] - }); - const action = { - type: '[MAIN]:WINDOW:CLOSE', - payload: { windowType: 'importAccount' }, - }; - const expectedState = Object.assign({}, state, { - windowsOpen: ['about'] - }); + assert.deepEqual(reducer(state, action), expectedState); + }); - assert.deepEqual(reducer(state, action), expectedState); + it('should handle the "[MAIN]:WINDOW:CLOSE" action', () => { + const state = Object.assign({}, initialState, { + windowsOpen: ['about', 'importAccount'] + }); + const action = { + type: '[MAIN]:WINDOW:CLOSE', + payload: { windowType: 'importAccount' } + }; + const expectedState = Object.assign({}, state, { + windowsOpen: ['about'] }); - it('should handle the "[MAIN]:GENERIC_WINDOW:REUSE" action', () => { - const action = { - type: '[MAIN]:GENERIC_WINDOW:REUSE', - payload: { actingType: 'about' }, - }; - const expectedState = Object.assign({}, initialState, { - genericWindowActingType: 'about', - windowsOpen: ['generic'], - }); + assert.deepEqual(reducer(state, action), expectedState); + }); - assert.deepEqual(reducer(initialState, action), expectedState); + it('should handle the "[MAIN]:GENERIC_WINDOW:REUSE" action', () => { + const action = { + type: '[MAIN]:GENERIC_WINDOW:REUSE', + payload: { actingType: 'about' } + }; + const expectedState = Object.assign({}, initialState, { + genericWindowActingType: 'about', + windowsOpen: ['generic'] }); - it('should handle the "[MAIN]:GENERIC_WINDOW:RESET" action', () => { - const state = Object.assign({}, initialState, { - genericWindowActingType: 'about', - windowsOpen: ['generic', 'main'], - }); - const action = { type: '[MAIN]:GENERIC_WINDOW:RESET' }; - const expectedState = Object.assign({}, initialState, { - windowsOpen: ['main'], - }); + assert.deepEqual(reducer(initialState, action), expectedState); + }); - assert.deepEqual(reducer(state, action), expectedState); + it('should handle the "[MAIN]:GENERIC_WINDOW:RESET" action', () => { + const state = Object.assign({}, initialState, { + genericWindowActingType: 'about', + windowsOpen: ['generic', 'main'] + }); + const action = { type: '[MAIN]:GENERIC_WINDOW:RESET' }; + const expectedState = Object.assign({}, initialState, { + windowsOpen: ['main'] }); + + assert.deepEqual(reducer(state, action), expectedState); + }); }); diff --git a/tests/wallet/basic.test.js b/tests/wallet/basic.test.js index c338f1ab5..8b1157407 100644 --- a/tests/wallet/basic.test.js +++ b/tests/wallet/basic.test.js @@ -3,31 +3,29 @@ const Q = require('bluebird'); const fs = require('fs'); const path = require('path'); - const test = require('../_base').mocha(module, { - app: 'wallet', + app: 'wallet' }); -test['Title test'] = function* () { - const client = this.client; +test['Title test'] = function*() { + const client = this.client; - yield client.waitUntilWindowLoaded(); - (yield client.getTitle()).should.eql('Ethereum Wallet'); -} + yield client.waitUntilWindowLoaded(); + (yield client.getTitle()).should.eql('Ethereum Wallet'); +}; -test['account balances'] = function* () { - const web3 = this.web3; - const client = this.client; +test['account balances'] = function*() { + const web3 = this.web3; + const client = this.client; - const realBalances = this.getRealAccountBalances(); - const appBalances = this.getUiAccountBalances(); + const realBalances = this.getRealAccountBalances(); + const appBalances = this.getUiAccountBalances(); - realBalances.should.not.be.null; - realBalances.should.eql('5'); - appBalances.should.eql(realBalances); + realBalances.should.not.be.null; + realBalances.should.eql('5'); + appBalances.should.eql(realBalances); }; - // test['create account'] = function*() { // const web3 = this.web3; // const client = this.client; @@ -43,74 +41,71 @@ test['account balances'] = function* () { // appBalances.should.eql(realBalances); // }; +test['deposit into account'] = function*() { + const web3 = this.web3; + const client = this.client; -test['deposit into account'] = function* () { - const web3 = this.web3; - const client = this.client; + const accounts = web3.eth.accounts; - const accounts = web3.eth.accounts; + yield _createNewAccount.call(this); - yield _createNewAccount.call(this); + const newAccount = _.difference(web3.eth.accounts, accounts)[0]; - const newAccount = _.difference(web3.eth.accounts, accounts)[0]; - - yield this.openAccountInUi(newAccount); + yield this.openAccountInUi(newAccount); // links - const accLinks = yield this.getUiElements('.dapp-actionbar li'); - yield client.elementIdClick(accLinks[0].ELEMENT); + const accLinks = yield this.getUiElements('.dapp-actionbar li'); + yield client.elementIdClick(accLinks[0].ELEMENT); // fill in send form and submit - yield _completeSendForm.call(this, 1); + yield _completeSendForm.call(this, 1); // do some mining - yield this.startMining(); - yield Q.delay(10000); - yield this.stopMining(); + yield this.startMining(); + yield Q.delay(10000); + yield this.stopMining(); // check balances - const realBalances = yield this.getRealAccountBalances(); + const realBalances = yield this.getRealAccountBalances(); - realBalances[newAccount].should.eql(1); + realBalances[newAccount].should.eql(1); }; - -const _createNewAccount = function* () { - const client = this.client; +const _createNewAccount = function*() { + const client = this.client; // open password window - yield this.openAndFocusNewWindow(() => { - return client.click('button.create.account'); - }); + yield this.openAndFocusNewWindow(() => { + return client.click('button.create.account'); + }); // enter password - yield client.setValue('form .password', '1234'); - yield client.click('form button.ok'); + yield client.setValue('form .password', '1234'); + yield client.click('form button.ok'); // re-enter password - yield client.setValue('form .password-repeat', '1234'); - yield client.click('form button.ok'); + yield client.setValue('form .password-repeat', '1234'); + yield client.click('form button.ok'); - yield Q.delay(10000); + yield Q.delay(10000); - yield client.window(this.mainWindowHandle); + yield client.window(this.mainWindowHandle); }; - -const _completeSendForm = function* (amt) { - const client = this.client; +const _completeSendForm = function*(amt) { + const client = this.client; // enter password - yield client.setValue('form input[name=amount]', `${amt}`); + yield client.setValue('form input[name=amount]', `${amt}`); // open password window - yield this.openAndFocusNewWindow(() => { - return client.click('form button[type=submit]'); - }); + yield this.openAndFocusNewWindow(() => { + return client.click('form button[type=submit]'); + }); // fill in password and submit - yield client.setValue('form input[type=password]', '1234'); - yield client.click('form button.ok'); + yield client.setValue('form input[type=password]', '1234'); + yield client.click('form button.ok'); - yield Q.delay(5000); + yield Q.delay(5000); }; diff --git a/yarn.lock b/yarn.lock index c5e0480c6..8a7bb11eb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -23,14 +23,14 @@ "7zip-bin-win" "~2.2.0" "@types/node@^8.0.24": - version "8.9.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.9.4.tgz#dfd327582a06c114eb6e0441fa3d6fab35edad48" + version "8.9.5" + resolved "http://registry.npmjs.org/@types/node/-/node-8.9.5.tgz#162b864bc70be077e6db212b322754917929e976" abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" -accepts@~1.3.4: +accepts@~1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" dependencies: @@ -47,9 +47,9 @@ acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" -acorn@^5.4.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.0.tgz#1abb587fbf051f94e3de20e6b26ef910b1828298" +acorn@^5.5.0: + version "5.5.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" addressparser@1.0.1: version "1.0.1" @@ -87,8 +87,8 @@ ajv@^5.1.0: json-schema-traverse "^0.3.0" ajv@^6.1.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.2.0.tgz#afac295bbaa0152449e522742e4547c1ae9328d2" + version "6.2.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.2.1.tgz#28a6abc493a2abe0fb4c8507acaedb43fa550671" dependencies: fast-deep-equal "^1.0.0" fast-json-stable-stringify "^2.0.0" @@ -146,9 +146,9 @@ ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" -ansi-styles@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" dependencies: color-convert "^1.9.0" @@ -167,25 +167,25 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -app-builder-bin-linux@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/app-builder-bin-linux/-/app-builder-bin-linux-1.5.0.tgz#c22df1ab9ee7fb0270ec27a3c8a6993966ea4220" +app-builder-bin-linux@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/app-builder-bin-linux/-/app-builder-bin-linux-1.7.2.tgz#a764c8e52ecf1b5b068f32c820c6daf1ffed6a8f" -app-builder-bin-mac@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/app-builder-bin-mac/-/app-builder-bin-mac-1.5.0.tgz#40821128a1f20e0559f1fca71a59ecab81bb59b5" +app-builder-bin-mac@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/app-builder-bin-mac/-/app-builder-bin-mac-1.7.2.tgz#c4ee0d950666c97c12a45ac74ec6396be3357644" -app-builder-bin-win@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/app-builder-bin-win/-/app-builder-bin-win-1.5.0.tgz#0a12437d825ac89fc2357e8be0ba855f54c083e9" +app-builder-bin-win@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/app-builder-bin-win/-/app-builder-bin-win-1.7.2.tgz#7acac890782f4118f09941b343ba06c56452a6f6" -app-builder-bin@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-1.5.0.tgz#dc768af9704876959c68af5456ef31f67a4663fe" +app-builder-bin@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-1.7.2.tgz#daf67060a6bad8f5f611a0d2876d9db897a83f06" optionalDependencies: - app-builder-bin-linux "1.5.0" - app-builder-bin-mac "1.5.0" - app-builder-bin-win "1.5.0" + app-builder-bin-linux "1.7.2" + app-builder-bin-mac "1.7.2" + app-builder-bin-win "1.7.2" append-buffer@^1.0.2: version "1.0.2" @@ -342,8 +342,8 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" ast-types@0.x.x: - version "0.11.2" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.11.2.tgz#cc4e1d15a36b39979a1986fe1e91321cbfae7783" + version "0.11.3" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.11.3.tgz#c20757fe72ee71278ea0ff3d87e5c2ca30d9edf8" async-done@^1.2.0, async-done@^1.2.2: version "1.2.4" @@ -943,19 +943,19 @@ builder-util-runtime@4.0.5, builder-util-runtime@^4.0.5: fs-extra-p "^4.5.0" sax "^1.2.4" -builder-util@5.6.0, builder-util@^5.6.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-5.6.0.tgz#c37c5207cd818531bda819ac836b6d51dfbccd4a" +builder-util@5.6.5, builder-util@^5.6.5: + version "5.6.5" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-5.6.5.tgz#f2d156541b8df9599456848e057566443dc04c82" dependencies: "7zip-bin" "~3.1.0" - app-builder-bin "1.5.0" + app-builder-bin "1.7.2" bluebird-lst "^1.0.5" builder-util-runtime "^4.0.5" - chalk "^2.3.0" + chalk "^2.3.2" debug "^3.1.0" fs-extra-p "^4.5.2" is-ci "^1.1.0" - js-yaml "^3.10.0" + js-yaml "^3.11.0" lazy-val "^1.0.3" semver "^5.5.0" source-map-support "^0.5.3" @@ -1061,13 +1061,13 @@ chainsaw@~0.1.0: dependencies: traverse ">=0.3.0 <0.4" -chalk@*, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.1.tgz#523fe2678aec7b04e8041909292fe8b17059b796" +chalk@*, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65" dependencies: - ansi-styles "^3.2.0" + ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" - supports-color "^5.2.0" + supports-color "^5.3.0" chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" @@ -1110,8 +1110,8 @@ chromium-pickle-js@^0.2.0: resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" ci-info@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.2.tgz#03561259db48d0474c8bdc90f5b47b068b6bbfb4" + version "1.1.3" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2" cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -1194,12 +1194,12 @@ clone@^1.0.0: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" cloneable-readable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.0.0.tgz#a6290d413f217a61232f95e458ff38418cfb0117" + version "1.1.2" + resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.2.tgz#d591dee4a8f8bc15da43ce97dceeba13d43e2a65" dependencies: inherits "^2.0.1" - process-nextick-args "^1.0.6" - through2 "^2.0.1" + process-nextick-args "^2.0.0" + readable-stream "^2.3.5" co-mocha@^1.2.0: version "1.2.2" @@ -1266,8 +1266,8 @@ commander@2.9.0: graceful-readlink ">= 1.0.0" commander@^2.8.1, commander@^2.9.0: - version "2.14.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa" + version "2.15.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.0.tgz#ad2a23a1c3b036e392469b8012cec6b33b4c1322" commander@~2.8.1: version "2.8.1" @@ -1689,7 +1689,7 @@ depd@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" -depd@~1.1.1: +depd@~1.1.1, depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -1719,16 +1719,16 @@ diff@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" -dmg-builder@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-4.1.1.tgz#a12214eb3eb3cba0addccfd129f1981c9805045c" +dmg-builder@4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-4.1.2.tgz#b4d7245dc2e91812395b4268b12f888443ba5f30" dependencies: bluebird-lst "^1.0.5" - builder-util "^5.6.0" - electron-builder-lib "~20.2.0" + builder-util "^5.6.5" + electron-builder-lib "~20.5.0" fs-extra-p "^4.5.2" iconv-lite "^0.4.19" - js-yaml "^3.10.0" + js-yaml "^3.11.0" parse-color "^1.0.0" sanitize-filename "^1.6.1" @@ -1786,8 +1786,8 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" duplexify@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.3.tgz#8b5818800df92fd0125b27ab896491912858243e" + version "3.5.4" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.4.tgz#4bb46c1796eabebeec4ca9a2e66b808cb7a3d8b4" dependencies: end-of-stream "^1.0.0" inherits "^2.0.1" @@ -1824,26 +1824,26 @@ ejs@^2.5.7, ejs@~2.5.6: version "2.5.7" resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.7.tgz#cc872c168880ae3c7189762fd5ffc00896c9518a" -electron-builder-lib@20.2.0, electron-builder-lib@~20.2.0: - version "20.2.0" - resolved "https://registry.yarnpkg.com/electron-builder-lib/-/electron-builder-lib-20.2.0.tgz#e8dba288cf26858803eb1800da870d7312837bfa" +electron-builder-lib@20.5.1, electron-builder-lib@~20.5.0: + version "20.5.1" + resolved "https://registry.yarnpkg.com/electron-builder-lib/-/electron-builder-lib-20.5.1.tgz#c155345c58d25580d316f6437c251a57e8e92d62" dependencies: "7zip-bin" "~3.1.0" - app-builder-bin "1.5.0" + app-builder-bin "1.7.2" async-exit-hook "^2.0.1" bluebird-lst "^1.0.5" - builder-util "5.6.0" + builder-util "5.6.5" builder-util-runtime "4.0.5" chromium-pickle-js "^0.2.0" debug "^3.1.0" ejs "^2.5.7" - electron-osx-sign "0.4.8" - electron-publish "20.2.0" + electron-osx-sign "0.4.10" + electron-publish "20.5.0" fs-extra-p "^4.5.2" - hosted-git-info "^2.5.0" + hosted-git-info "^2.6.0" is-ci "^1.1.0" isbinaryfile "^3.0.2" - js-yaml "^3.10.0" + js-yaml "^3.11.0" lazy-val "^1.0.3" minimatch "^3.0.4" normalize-package-data "^2.4.0" @@ -1854,15 +1854,15 @@ electron-builder-lib@20.2.0, electron-builder-lib@~20.2.0: temp-file "^3.1.1" electron-builder@^20.0.8: - version "20.2.0" - resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-20.2.0.tgz#aaeaa439cb96c9a3d7ffda25b28130327c982982" + version "20.5.1" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-20.5.1.tgz#8e6fba76dcd65aeabab60f15bd46f294ee04dd11" dependencies: bluebird-lst "^1.0.5" - builder-util "5.6.0" + builder-util "5.6.5" builder-util-runtime "4.0.5" - chalk "^2.3.0" - dmg-builder "4.1.1" - electron-builder-lib "20.2.0" + chalk "^2.3.2" + dmg-builder "4.1.2" + electron-builder-lib "20.5.1" electron-download-tf "4.3.4" fs-extra-p "^4.5.2" is-ci "^1.1.0" @@ -1921,9 +1921,9 @@ electron-download@^4.1.0: semver "^5.3.0" sumchecker "^2.0.1" -electron-osx-sign@0.4.8: - version "0.4.8" - resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.4.8.tgz#f0b9fadded9e1e54ec35fa89877b5c6c34c7bc40" +electron-osx-sign@0.4.10: + version "0.4.10" + resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.4.10.tgz#be4f3b89b2a75a1dc5f1e7249081ab2929ca3a26" dependencies: bluebird "^3.5.0" compare-version "^0.1.2" @@ -1932,14 +1932,14 @@ electron-osx-sign@0.4.8: minimist "^1.2.0" plist "^2.1.0" -electron-publish@20.2.0: - version "20.2.0" - resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-20.2.0.tgz#1812738c4a4e14a8e156a9a083424a6e4e8e8264" +electron-publish@20.5.0: + version "20.5.0" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-20.5.0.tgz#bcef9949c63899d34680e89110e8d38d1016f1f6" dependencies: bluebird-lst "^1.0.5" - builder-util "^5.6.0" + builder-util "^5.6.5" builder-util-runtime "^4.0.5" - chalk "^2.3.0" + chalk "^2.3.2" fs-extra-p "^4.5.2" lazy-val "^1.0.3" mime "^2.2.0" @@ -1980,7 +1980,7 @@ elliptic@^6.2.3, elliptic@^6.4.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" -encodeurl@~1.0.1: +encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -2001,8 +2001,8 @@ error-ex@^1.2.0: is-arrayish "^0.2.1" es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.39" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.39.tgz#fca21b67559277ca4ac1a1ed7048b107b6f76d87" + version "0.10.40" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.40.tgz#ab3d2179b943008c5e9ef241beb25ef41424c774" dependencies: es6-iterator "~2.0.3" es6-symbol "~3.1.1" @@ -2164,10 +2164,10 @@ eslint@^3.14.1: user-home "^2.0.0" espree@^3.4.0: - version "3.5.3" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.3.tgz#931e0af64e7fbbed26b050a29daad1fc64799fa6" + version "3.5.4" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" dependencies: - acorn "^5.4.0" + acorn "^5.5.0" acorn-jsx "^3.0.0" esprima@3.x.x, esprima@^3.1.3: @@ -2216,7 +2216,7 @@ eth-lib@^0.1.26: ethereum-client-binaries@ethereum/ethereum-client-binaries: version "1.6.4" - resolved "https://codeload.github.com/ethereum/ethereum-client-binaries/tar.gz/c7cad554581f4038f3bb553622d5aee17c152e3a" + resolved "https://codeload.github.com/ethereum/ethereum-client-binaries/tar.gz/2f09d516d1dcb3679d1f2ebb011d401fe6df1401" dependencies: buffered-spawn "^3.3.2" got "^6.5.0" @@ -2224,8 +2224,8 @@ ethereum-client-binaries@ethereum/ethereum-client-binaries: lodash.isempty "^4.4.0" lodash.values "^4.3.0" mkdirp "^0.5.1" + node-unzip-2 "github:glebdmitriew/node-unzip-2" tmp "0.0.29" - unzip "github:glebdmitriew/node-unzip-2" ethereum-keyfile-recognizer@^1.0.2: version "1.0.2" @@ -2296,6 +2296,18 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + exit-hook@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" @@ -2319,10 +2331,10 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: homedir-polyfill "^1.0.1" express@^4.14.0, express@^4.15.3: - version "4.16.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" + version "4.16.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" dependencies: - accepts "~1.3.4" + accepts "~1.3.5" array-flatten "1.1.1" body-parser "1.18.2" content-disposition "0.5.2" @@ -2330,26 +2342,26 @@ express@^4.14.0, express@^4.15.3: cookie "0.3.1" cookie-signature "1.0.6" debug "2.6.9" - depd "~1.1.1" - encodeurl "~1.0.1" + depd "~1.1.2" + encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.1.0" + finalhandler "1.1.1" fresh "0.5.2" merge-descriptors "1.0.1" methods "~1.1.2" on-finished "~2.3.0" parseurl "~1.3.2" path-to-regexp "0.1.7" - proxy-addr "~2.0.2" + proxy-addr "~2.0.3" qs "6.5.1" range-parser "~1.2.0" safe-buffer "5.1.1" - send "0.16.1" - serve-static "1.13.1" + send "0.16.2" + serve-static "1.13.2" setprototypeof "1.1.0" - statuses "~1.3.1" - type-is "~1.6.15" + statuses "~1.4.0" + type-is "~1.6.16" utils-merge "1.0.1" vary "~1.1.2" @@ -2479,16 +2491,16 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" -finalhandler@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" +finalhandler@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" dependencies: debug "2.6.9" - encodeurl "~1.0.1" + encodeurl "~1.0.2" escape-html "~1.0.3" on-finished "~2.3.0" parseurl "~1.3.2" - statuses "~1.3.1" + statuses "~1.4.0" unpipe "~1.0.0" find-up@^1.0.0: @@ -3246,9 +3258,9 @@ homedir-polyfill@^1.0.1: dependencies: parse-passwd "^1.0.0" -hosted-git-info@^2.1.4, hosted-git-info@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" +hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" http-errors@1.6.2, http-errors@~1.6.2: version "1.6.2" @@ -3306,6 +3318,14 @@ https-proxy-agent@1: debug "2" extend "3" +husky@^0.14.3: + version "0.14.3" + resolved "https://registry.yarnpkg.com/husky/-/husky-0.14.3.tgz#c69ed74e2d2779769a17ba8399b54ce0b63c12c3" + dependencies: + is-ci "^1.0.10" + normalize-path "^1.0.0" + strip-indent "^2.0.0" + i18next@^7.1.3: version "7.2.3" resolved "https://registry.yarnpkg.com/i18next/-/i18next-7.2.3.tgz#a6c220ac1c8240ff1078aa9bc997fd449e052dc7" @@ -3322,7 +3342,7 @@ ieee754@^1.1.4: version "1.1.8" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" -ignore@^3.2.0: +ignore@^3.2.0, ignore@^3.3.7: version "3.3.7" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" @@ -3405,8 +3425,8 @@ interpret@^1.0.0, interpret@^1.1.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" invariant@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.3.tgz#1a827dfde7dcbd7c323f0ca826be8fa7c5e9d688" + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" dependencies: loose-envify "^1.0.0" @@ -3465,7 +3485,7 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" -is-ci@^1.1.0: +is-ci@^1.0.10, is-ci@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5" dependencies: @@ -3733,14 +3753,14 @@ js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" -js-yaml@^3.10.0, js-yaml@^3.5.1: - version "3.10.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" +js-yaml@^3.10.0, js-yaml@^3.11.0, js-yaml@^3.5.1: + version "3.11.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" dependencies: argparse "^1.0.7" esprima "^4.0.0" -jsan@^3.1.0, jsan@^3.1.5: +jsan@^3.1.5, jsan@^3.1.9: version "3.1.9" resolved "https://registry.yarnpkg.com/jsan/-/jsan-3.1.9.tgz#2705676c1058f0a7d9ac266ad036a5769cfa7c96" @@ -3874,12 +3894,6 @@ latest-version@^3.0.0: dependencies: package-json "^4.0.0" -lazy-cache@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" - dependencies: - set-getter "^0.1.0" - lazy-val@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.3.tgz#bb97b200ef00801d94c317e29dc6ed39e31c5edc" @@ -3969,8 +3983,8 @@ locate-path@^2.0.0: path-exists "^3.0.0" lodash-es@^4.2.1: - version "4.17.5" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.5.tgz#9fc6e737b1c4d151d8f9cae2247305d552ce748f" + version "4.17.7" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.7.tgz#db240a3252c3dd8360201ac9feef91ac977ea856" lodash._baseassign@^3.0.0: version "3.2.0" @@ -4151,8 +4165,8 @@ lowercase-keys@^1.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" lru-cache@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + version "4.1.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.2.tgz#45234b2e6e2f2b33da125624c4664929a0224c3f" dependencies: pseudomap "^1.0.2" yallist "^2.1.2" @@ -4405,6 +4419,10 @@ mout@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/mout/-/mout-0.11.1.tgz#ba3611df5f0e5b1ffbfd01166b8f02d1f5fa2b99" +mri@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.0.tgz#5c0a3f29c8ccffbbb1ec941dcec09d71fa32f36a" + ms@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" @@ -4492,6 +4510,17 @@ node-pre-gyp@^0.6.39: tar "^2.2.1" tar-pack "^3.4.0" +"node-unzip-2@github:glebdmitriew/node-unzip-2": + version "0.2.7" + resolved "https://codeload.github.com/glebdmitriew/node-unzip-2/tar.gz/3702bce9596496bf45442e156541c68eb965b9f9" + dependencies: + binary "~0.3.0" + fstream "~1.0.10" + match-stream "~0.0.2" + pullstream "~0.4.0" + readable-stream "~1.0.0" + setimmediate "~1.0.1" + node-uuid@~1.4.7: version "1.4.8" resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" @@ -4561,6 +4590,10 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package- semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" +normalize-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379" + normalize-path@^2.0.0, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" @@ -4704,7 +4737,7 @@ once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.3.3, once@^1.4.0: onetime@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + resolved "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" onetime@^2.0.0: version "2.0.1" @@ -5012,6 +5045,10 @@ prepend-http@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" +prettier@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.11.1.tgz#61e43fc4cd44e68f2b0dfc2c38cd4bb0fccdcc75" + pretty-bytes@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-1.0.4.tgz#0a22e8210609ad35542f8c8d5d2159aff0751c84" @@ -5023,15 +5060,25 @@ pretty-hrtime@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" +pretty-quick@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-1.4.1.tgz#9d41f778d2d4d940ec603d1293a0998e84c4722c" + dependencies: + chalk "^2.3.0" + execa "^0.8.0" + find-up "^2.1.0" + ignore "^3.3.7" + mri "^1.1.0" + private@^0.1.7: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" -process-nextick-args@^1.0.6, process-nextick-args@^1.0.7, process-nextick-args@~1.0.6: +process-nextick-args@^1.0.7, process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" -process-nextick-args@~2.0.0: +process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" @@ -5057,7 +5104,7 @@ progress@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" -proxy-addr@~2.0.2: +proxy-addr@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341" dependencies: @@ -5134,8 +5181,8 @@ qs@~6.4.0: resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" query-string@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.0.tgz#9583b15fd1307f899e973ed418886426a9976469" + version "5.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" dependencies: decode-uri-component "^0.2.0" object-assign "^4.1.0" @@ -5159,8 +5206,8 @@ raw-body@2, raw-body@2.3.2: unpipe "1.0.0" rc@^1.0.1, rc@^1.1.2, rc@^1.1.6, rc@^1.1.7, rc@^1.2.1: - version "1.2.5" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd" + version "1.2.6" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.6.tgz#eb18989c6d4f4f162c399f79ddd29f3835568092" dependencies: deep-extend "~0.4.0" ini "~1.3.0" @@ -5220,9 +5267,9 @@ readable-stream@1.1.x, "readable-stream@1.x >=1.1.9", readable-stream@~1.1.9: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.4.tgz#c946c3f47fa7d8eabc0b6150f4a12f69a4574071" +readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5: + version "2.3.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.5.tgz#b4f85003a938cbb6ecbce2a124fb1012bd1a838d" dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -5382,10 +5429,10 @@ remote-redux-devtools@^0.5.12: socketcluster-client "^5.3.1" remotedev-serialize@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/remotedev-serialize/-/remotedev-serialize-0.1.0.tgz#074768e98cb7aa806f45994eeb0c8af95120ee32" + version "0.1.1" + resolved "https://registry.yarnpkg.com/remotedev-serialize/-/remotedev-serialize-0.1.1.tgz#0f598000b7dd7515d67f9b51a61d211e18ce9554" dependencies: - jsan "^3.1.0" + jsan "^3.1.9" remotedev-utils@^0.1.1: version "0.1.4" @@ -5499,7 +5546,34 @@ request@2.81.0: tunnel-agent "^0.6.0" uuid "^3.0.0" -request@^2.0.0, request@^2.45.0, request@^2.55.0, request@^2.74.0, request@^2.79.0, request@^2.81.0, request@~2.83.0: +request@^2.0.0, request@^2.45.0, request@^2.55.0, request@^2.74.0, request@^2.79.0, request@^2.81.0: + version "2.85.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + hawk "~6.0.2" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + stringstream "~0.0.5" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +request@~2.83.0: version "2.83.0" resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" dependencies: @@ -5748,14 +5822,14 @@ semver@~5.0.1: version "5.0.3" resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a" -send@0.16.1: - version "0.16.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" dependencies: debug "2.6.9" - depd "~1.1.1" + depd "~1.1.2" destroy "~1.0.4" - encodeurl "~1.0.1" + encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" @@ -5764,16 +5838,16 @@ send@0.16.1: ms "2.0.0" on-finished "~2.3.0" range-parser "~1.2.0" - statuses "~1.3.1" + statuses "~1.4.0" -serve-static@1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" dependencies: - encodeurl "~1.0.1" + encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.2" - send "0.16.1" + send "0.16.2" servify@^0.1.12: version "0.1.12" @@ -5789,12 +5863,6 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" -set-getter@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376" - dependencies: - to-object-path "^0.3.0" - set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" @@ -5936,8 +6004,8 @@ snapdragon-util@^3.0.1: kind-of "^3.2.0" snapdragon@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.1.tgz#e12b5487faded3e3dea0ac91e9400bf75b401370" + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" dependencies: base "^0.11.1" debug "^2.2.0" @@ -5946,7 +6014,7 @@ snapdragon@^0.8.1: map-cache "^0.2.2" source-map "^0.5.6" source-map-resolve "^0.5.0" - use "^2.0.0" + use "^3.1.0" sntp@1.x.x: version "1.0.9" @@ -5997,8 +6065,8 @@ socks@~1.1.5: smart-buffer "^1.0.13" solc@^0.4.18: - version "0.4.20" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.20.tgz#1f8dd0b830cfe0064092d3a135dcaf2af1896009" + version "0.4.21" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.21.tgz#6a7ecd505bfa0fc268330d5de6b9ae65c8c68264" dependencies: fs-extra "^0.30.0" memorystream "^0.3.1" @@ -6032,8 +6100,8 @@ source-map-support@^0.4.15: source-map "^0.5.6" source-map-support@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.3.tgz#2b3d5fff298cfa4d1afd7d4352d569e9a0158e76" + version "0.5.4" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.4.tgz#54456efa89caa9270af7cd624cc2f123e51fbae8" dependencies: source-map "^0.6.0" @@ -6120,8 +6188,8 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" sshpk@^1.7.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + version "1.14.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.1.tgz#130f5975eddad963f1d56f92b9ac6c51fa9f83eb" dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -6148,14 +6216,10 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.3.1 < 2": +"statuses@>= 1.3.1 < 2", statuses@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" -statuses@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" - stream-exhaust@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/stream-exhaust/-/stream-exhaust-1.0.2.tgz#acdac8da59ef2bc1e17a2c0ccf6c320d120e555d" @@ -6250,6 +6314,10 @@ strip-indent@^1.0.1: dependencies: get-stdin "^4.0.1" +strip-indent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -6277,9 +6345,9 @@ supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" -supports-color@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.2.0.tgz#b0d5333b1184dd3666cbe5aa0b45c5ac7ac17a4a" +supports-color@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0" dependencies: has-flag "^3.0.0" @@ -6411,7 +6479,7 @@ through2-filter@^2.0.0: through2 "~2.0.0" xtend "~4.0.0" -through2@^2.0.0, through2@^2.0.1, through2@^2.0.3, through2@~2.0.0, through2@~2.0.3: +through2@^2.0.0, through2@^2.0.3, through2@~2.0.0, through2@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" dependencies: @@ -6562,7 +6630,7 @@ type-detect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" -type-is@~1.6.15: +type-is@~1.6.15, type-is@~1.6.16: version "1.6.16" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" dependencies: @@ -6667,17 +6735,6 @@ unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" -"unzip@github:glebdmitriew/node-unzip-2": - version "0.2.7" - resolved "https://codeload.github.com/glebdmitriew/node-unzip-2/tar.gz/3702bce9596496bf45442e156541c68eb965b9f9" - dependencies: - binary "~0.3.0" - fstream "~1.0.10" - match-stream "~0.0.2" - pullstream "~0.4.0" - readable-stream "~1.0.0" - setimmediate "~1.0.1" - upath@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/upath/-/upath-1.0.4.tgz#ee2321ba0a786c50973db043a50b7bcba822361d" @@ -6725,13 +6782,11 @@ url@~0.11.0: punycode "1.3.2" querystring "0.2.0" -use@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8" +use@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" dependencies: - define-property "^0.2.5" - isobject "^3.0.0" - lazy-cache "^2.0.2" + kind-of "^6.0.2" user-home@^2.0.0: version "2.0.0" @@ -6866,8 +6921,8 @@ web3@^0.18.4: xmlhttprequest "*" webdriverio@^4.8.0: - version "4.11.0" - resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-4.11.0.tgz#289baae2257301d95cfecefdec2038a6aa6b94c5" + version "4.12.0" + resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-4.12.0.tgz#e340def272183c8168a4dd0b382322f9d7bee10d" dependencies: archiver "~2.1.0" babel-runtime "^6.26.0" From fb3e7122c390b37089ea67777cafea1c4b830268 Mon Sep 17 00:00:00 2001 From: Ev Date: Mon, 19 Mar 2018 19:24:46 -0300 Subject: [PATCH 149/150] Update electron 1.8.4 (#3763) * Updating to electron 1.8.4 * Updating client-binaries --- .travis.yml | 2 +- README.md | 2 +- package.json | 171 +++++++++++++++++++++++++-------------------------- yarn.lock | 16 ++--- 4 files changed, 93 insertions(+), 98 deletions(-) diff --git a/.travis.yml b/.travis.yml index 50bfae87a..cb09ae641 100644 --- a/.travis.yml +++ b/.travis.yml @@ -67,7 +67,7 @@ install: - echo $PATH - PATH=$PATH:$HOME/.meteor && curl -L https://raw.githubusercontent.com/arunoda/travis-ci-meteor-packages/1390e0f96162d0d70fc1e60a6b0f4f891a0e8f42/configure.sh | /bin/sh - export PATH=$PATH:`yarn global bin` - - yarn global add gulp-cli meteor-build-client electron@1.8.2 + - yarn global add gulp-cli meteor-build-client electron@1.8.4 - yarn script: diff --git a/README.md b/README.md index 7cbe183f4..83a75b022 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ Install the latter ones via: ```bash $ curl https://install.meteor.com/ | sh $ curl -o- -L https://yarnpkg.com/install.sh | bash -$ yarn global add electron@1.7.11 +$ yarn global add electron@1.8.4 $ yarn global add gulp ``` diff --git a/package.json b/package.json index 0ef40f361..a06f9b32c 100644 --- a/package.json +++ b/package.json @@ -1,90 +1,85 @@ { - "name": "Mist", - "version": "0.9.4", - "license": "GPL-3.0", - "author": "Ethereum Mist Team ", - "repository": { - "type": "git", - "url": "https://github.com/ethereum/mist.git" - }, - "scripts": { - "precommit": "pretty-quick --staged", - "postinstall": - "electron-builder install-app-deps; cd interface && yarn", - "dev:electron": "electron -r babel-register main.js", - "dev:meteor": "cd interface && meteor --no-release-check", - "dev:tools": "open http://remotedev.io/local/", - "test:basic": "gulp test --test=basic", - "test:unit": "mocha --compilers babel-register tests/unit/**/* --watch", - "test:unit:once": "mocha --compilers babel-register tests/unit/**/*" - }, - "main": "main.js", - "dependencies": { - "bignumber.js": "^4.0.1", - "bluebird": "^3.5.0", - "chai-as-promised": "^6.0.0", - "chai-string": "^1.3.0", - "electron-redux": "^1.3.1", - "electron-window-state": "^4.0.1", - "ethereum-client-binaries": "ethereum/ethereum-client-binaries", - "ethereum-keyfile-recognizer": "^1.0.2", - "ethereumjs-abi": "^0.6.3", - "ethereumjs-util": "^5.1.2", - "fs-promise": "^2.0.0", - "got": "^6.7.1", - "i18next": "^7.1.3", - "lodash": "^4.17.4", - "log-rotate": "^0.2.7", - "log4js": "^2.4.1", - "lokijs": "^1.4.3", - "minimongo-standalone": "^1.1.0-3", - "numeral": "^2.0.6", - "oboe": "^2.1.3", - "os-timesync": "^1.0.9", - "redux": "^3.7.2", - "redux-thunk": "^2.2.0", - "remote-redux-devtools": "^0.5.12", - "semver": "^5.1.0", - "solc": "^0.4.18", - "swarm-js": "^0.1.21", - "typescript": "^2.2.2", - "underscore": "^1.8.3", - "underscore-deep-extend": "^1.1.5", - "uuid": "^3.0.1", - "web3": "^0.18.4", - "yargs": "^7.0.2" - }, - "devDependencies": { - "babel-preset-es2016-node5": "^1.1.2", - "babel-register": "^6.26.0", - "chai": "^3.5.0", - "co-mocha": "^1.2.0", - "del": "^3.0.0", - "ecstatic": "^2.1.0", - "electron": "1.8.3", - "electron-builder": "^20.0.8", - "eslint": "^3.14.1", - "eslint-config-airbnb-base": "^11.0.1", - "eslint-plugin-import": "^2.2.0", - "express": "^4.15.3", - "genomatic": "^1.0.0", - "geth-private": "^1.3.0", - "gh-release-assets": "^1.1.0", - "gulp": "4.0.0", - "gulp-babel": "^7.0.0", - "gulp-spawn-mocha": "^3.3.0", - "husky": "^0.14.3", - "json-structure-diff": "^0.0.2", - "minimist": "^1.2.0", - "mocha": "^3.2.0", - "prettier": "^1.11.1", - "pretty-quick": "^1.4.1", - "redux-mock-store": "^1.3.0", - "require-dir": "^0.3.2", - "run-sequence": "^1.2.1", - "semver-compare": "^1.0.0", - "shelljs": "^0.7.7", - "spectron": "3.8.0", - "xml2js": "^0.4.17" - } + "name": "Mist", + "version": "0.9.4", + "license": "GPL-3.0", + "author": "Ethereum Mist Team ", + "repository": { + "type": "git", + "url": "https://github.com/ethereum/mist.git" + }, + "scripts": { + "postinstall": "electron-builder install-app-deps; cd interface && yarn", + "dev:electron": "electron -r babel-register main.js", + "dev:meteor": "cd interface && meteor --no-release-check", + "dev:tools": "open http://remotedev.io/local/", + "test:basic": "gulp test --test=basic", + "test:unit": "mocha --compilers babel-register tests/unit/**/* --watch", + "test:unit:once": "mocha --compilers babel-register tests/unit/**/*" + }, + "main": "main.js", + "dependencies": { + "bignumber.js": "^4.0.1", + "bluebird": "^3.5.0", + "chai-as-promised": "^6.0.0", + "chai-string": "^1.3.0", + "electron-redux": "^1.3.1", + "electron-window-state": "^4.0.1", + "ethereum-client-binaries": "1.6.4", + "ethereum-keyfile-recognizer": "^1.0.2", + "ethereumjs-abi": "^0.6.3", + "ethereumjs-util": "^5.1.2", + "fs-promise": "^2.0.0", + "got": "^6.7.1", + "i18next": "^7.1.3", + "lodash": "^4.17.4", + "log-rotate": "^0.2.7", + "log4js": "^2.4.1", + "lokijs": "^1.4.3", + "minimongo-standalone": "^1.1.0-3", + "numeral": "^2.0.6", + "oboe": "^2.1.3", + "os-timesync": "^1.0.9", + "redux": "^3.7.2", + "redux-thunk": "^2.2.0", + "remote-redux-devtools": "^0.5.12", + "semver": "^5.1.0", + "solc": "^0.4.18", + "swarm-js": "^0.1.21", + "typescript": "^2.2.2", + "underscore": "^1.8.3", + "underscore-deep-extend": "^1.1.5", + "uuid": "^3.0.1", + "web3": "^0.18.4", + "yargs": "^7.0.2" + }, + "devDependencies": { + "babel-preset-es2016-node5": "^1.1.2", + "babel-register": "^6.26.0", + "chai": "^3.5.0", + "co-mocha": "^1.2.0", + "del": "^3.0.0", + "ecstatic": "^2.1.0", + "electron": "1.8.4", + "electron-builder": "^20.0.8", + "eslint": "^3.14.1", + "eslint-config-airbnb-base": "^11.0.1", + "eslint-plugin-import": "^2.2.0", + "express": "^4.15.3", + "genomatic": "^1.0.0", + "geth-private": "^1.3.0", + "gh-release-assets": "^1.1.0", + "gulp": "4.0.0", + "gulp-babel": "^7.0.0", + "gulp-spawn-mocha": "^3.3.0", + "json-structure-diff": "^0.0.2", + "minimist": "^1.2.0", + "mocha": "^3.2.0", + "redux-mock-store": "^1.3.0", + "require-dir": "^0.3.2", + "run-sequence": "^1.2.1", + "semver-compare": "^1.0.0", + "shelljs": "^0.7.7", + "spectron": "3.8.0", + "xml2js": "^0.4.17" + } } diff --git a/yarn.lock b/yarn.lock index 8a7bb11eb..47a75b224 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1960,9 +1960,9 @@ electron-window-state@^4.0.1: jsonfile "^2.2.3" mkdirp "^0.5.1" -electron@1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/electron/-/electron-1.8.3.tgz#001416ea3a25ce594e317cb5531bc41eadd22f7f" +electron@1.8.4: + version "1.8.4" + resolved "https://registry.yarnpkg.com/electron/-/electron-1.8.4.tgz#cca8d0e6889f238f55b414ad224f03e03b226a38" dependencies: "@types/node" "^8.0.24" electron-download "^3.0.1" @@ -2214,9 +2214,9 @@ eth-lib@^0.1.26: ws "^3.0.0" xhr-request-promise "^0.1.2" -ethereum-client-binaries@ethereum/ethereum-client-binaries: +ethereum-client-binaries@1.6.4: version "1.6.4" - resolved "https://codeload.github.com/ethereum/ethereum-client-binaries/tar.gz/2f09d516d1dcb3679d1f2ebb011d401fe6df1401" + resolved "https://registry.yarnpkg.com/ethereum-client-binaries/-/ethereum-client-binaries-1.6.4.tgz#c4fcf97e873d6c66f7f33cb501b4059868baaee5" dependencies: buffered-spawn "^3.3.2" got "^6.5.0" @@ -2224,7 +2224,7 @@ ethereum-client-binaries@ethereum/ethereum-client-binaries: lodash.isempty "^4.4.0" lodash.values "^4.3.0" mkdirp "^0.5.1" - node-unzip-2 "github:glebdmitriew/node-unzip-2" + node-unzip-2 "^0.2.7" tmp "0.0.29" ethereum-keyfile-recognizer@^1.0.2: @@ -4510,9 +4510,9 @@ node-pre-gyp@^0.6.39: tar "^2.2.1" tar-pack "^3.4.0" -"node-unzip-2@github:glebdmitriew/node-unzip-2": +node-unzip-2@^0.2.7: version "0.2.7" - resolved "https://codeload.github.com/glebdmitriew/node-unzip-2/tar.gz/3702bce9596496bf45442e156541c68eb965b9f9" + resolved "https://registry.yarnpkg.com/node-unzip-2/-/node-unzip-2-0.2.7.tgz#33433d018ded3ca9219e757990cc0b990e4fa51b" dependencies: binary "~0.3.0" fstream "~1.0.10" From 70e88ffb638f08ba82851d14345d5dc65a9b19cc Mon Sep 17 00:00:00 2001 From: Ev Date: Mon, 19 Mar 2018 19:26:41 -0300 Subject: [PATCH 150/150] Version bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a06f9b32c..1c67c850c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "Mist", - "version": "0.9.4", + "version": "0.10.0", "license": "GPL-3.0", "author": "Ethereum Mist Team ", "repository": {