diff options
author | tmashuang <thomas.b.huang@gmail.com> | 2018-05-22 05:57:57 +0800 |
---|---|---|
committer | tmashuang <thomas.b.huang@gmail.com> | 2018-05-22 05:57:57 +0800 |
commit | 58b9afff4f3801d6d74b5311fb95060cc0a79cc1 (patch) | |
tree | c8d5a97f85fc7cf3c09a92949fdd615a082915cb | |
parent | 554a10f17e8e6b4bc79d3e5440295d280458717a (diff) | |
parent | 08d95bbafa3f952b960124c36958edbafa57cb3d (diff) | |
download | tangerine-wallet-browser-58b9afff4f3801d6d74b5311fb95060cc0a79cc1.tar tangerine-wallet-browser-58b9afff4f3801d6d74b5311fb95060cc0a79cc1.tar.gz tangerine-wallet-browser-58b9afff4f3801d6d74b5311fb95060cc0a79cc1.tar.bz2 tangerine-wallet-browser-58b9afff4f3801d6d74b5311fb95060cc0a79cc1.tar.lz tangerine-wallet-browser-58b9afff4f3801d6d74b5311fb95060cc0a79cc1.tar.xz tangerine-wallet-browser-58b9afff4f3801d6d74b5311fb95060cc0a79cc1.tar.zst tangerine-wallet-browser-58b9afff4f3801d6d74b5311fb95060cc0a79cc1.zip |
Merge branch 'develop' into testing
23 files changed, 342 insertions, 1810 deletions
diff --git a/app/scripts/controllers/address-book.js b/app/scripts/controllers/address-book.js index c91e6b2e4..4697e074c 100644 --- a/app/scripts/controllers/address-book.js +++ b/app/scripts/controllers/address-book.js @@ -13,19 +13,17 @@ class AddressBookController { * @param {object} opts Overrides the defaults for the initial state of this.store * @property {array} opts.initState initializes the the state of the AddressBookController. Can contain an * addressBook property to initialize the addressBook array - * @param {KeyringController} keyringController (Soon to be deprecated) The keyringController used in the current - * MetamaskController. Contains the identities used in this AddressBookController. + * @property {object} opts.preferencesStore the {@code PreferencesController} store * @property {object} store The the store of the current users address book * @property {array} store.addressBook An array of addresses and nicknames. These are set by the user when sending * to a new address. * */ - constructor (opts = {}, keyringController) { - const initState = extend({ + constructor ({initState, preferencesStore}) { + this.store = new ObservableStore(extend({ addressBook: [], - }, opts.initState) - this.store = new ObservableStore(initState) - this.keyringController = keyringController + }, initState)) + this._preferencesStore = preferencesStore } // @@ -62,7 +60,7 @@ class AddressBookController { */ _addToAddressBook (address, name) { const addressBook = this._getAddressBook() - const identities = this._getIdentities() + const {identities} = this._preferencesStore.getState() const addressBookIndex = addressBook.findIndex((element) => { return element.address.toLowerCase() === address.toLowerCase() || element.name === name }) const identitiesIndex = Object.keys(identities).findIndex((element) => { return element.toLowerCase() === address.toLowerCase() }) @@ -95,19 +93,6 @@ class AddressBookController { _getAddressBook () { return this.store.getState().addressBook } - - /** - * Retrieves identities from the keyring controller in order to avoid - * duplication - * - * @deprecated - * @returns {array} Returns the identies array from the keyringContoller's state - * - */ - _getIdentities () { - return this.keyringController.memStore.getState().identities - } - } module.exports = AddressBookController diff --git a/app/scripts/controllers/preferences.js b/app/scripts/controllers/preferences.js index 1d3308d36..a4ff1207e 100644 --- a/app/scripts/controllers/preferences.js +++ b/app/scripts/controllers/preferences.js @@ -27,6 +27,7 @@ class PreferencesController { useBlockie: false, featureFlags: {}, currentLocale: opts.initLangCode, + identities: {}, }, opts.initState) this.store = new ObservableStore(initState) } @@ -62,6 +63,16 @@ class PreferencesController { this.store.updateState({ currentLocale: key }) } + setAddresses (addresses) { + const oldIdentities = this.store.getState().identities + const identities = addresses.reduce((ids, address, index) => { + const oldId = oldIdentities[address] || {} + ids[address] = {name: `Account ${index + 1}`, address, ...oldId} + return ids + }, {}) + this.store.updateState({ identities }) + } + /** * Setter for the `selectedAddress` property * @@ -156,6 +167,21 @@ class PreferencesController { } /** + * Sets a custom label for an account + * @param {string} account the account to set a label for + * @param {string} label the custom label for the account + * @return {Promise<string>} + */ + setAccountLabel (account, label) { + const address = normalizeAddress(account) + const {identities} = this.store.getState() + identities[address] = identities[address] || {} + identities[address].name = label + this.store.updateState({ identities }) + return Promise.resolve(label) + } + + /** * Gets an updated rpc list from this.addToFrequentRpcList() and sets the `frequentRpcList` to this update list. * * @param {string} _url The the new rpc url to add to the updated list @@ -189,8 +215,8 @@ class PreferencesController { * The returned list will have a max length of 2. If the _url currently exists it the list, it will be moved to the * end of the list. The current list is modified and returned as a promise. * - * @param {string} _url The rpc url to add to the frequentRpcList. - * @returns {Promise<array>} The updated frequentRpcList. + * @param {string} _url The rpc url to add to the frequentRpcList. + * @returns {Promise<array>} The updated frequentRpcList. * */ addToFrequentRpcList (_url) { diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index a6b5d3453..807c9a0b9 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -144,7 +144,8 @@ module.exports = class MetamaskController extends EventEmitter { // address book controller this.addressBookController = new AddressBookController({ initState: initState.AddressBookController, - }, this.keyringController) + preferencesStore: this.preferencesController.store, + }) // tx mgmt this.txController = new TransactionController({ @@ -363,6 +364,7 @@ module.exports = class MetamaskController extends EventEmitter { addToken: nodeify(preferencesController.addToken, preferencesController), removeToken: nodeify(preferencesController.removeToken, preferencesController), setCurrentAccountTab: nodeify(preferencesController.setCurrentAccountTab, preferencesController), + setAccountLabel: nodeify(preferencesController.setAccountLabel, preferencesController), setFeatureFlag: nodeify(preferencesController.setFeatureFlag, preferencesController), // AddressController @@ -373,7 +375,6 @@ module.exports = class MetamaskController extends EventEmitter { createNewVaultAndKeychain: nodeify(this.createNewVaultAndKeychain, this), createNewVaultAndRestore: nodeify(this.createNewVaultAndRestore, this), addNewKeyring: nodeify(keyringController.addNewKeyring, keyringController), - saveAccountLabel: nodeify(keyringController.saveAccountLabel, keyringController), exportAccount: nodeify(keyringController.exportAccount, keyringController), // txController @@ -433,7 +434,9 @@ module.exports = class MetamaskController extends EventEmitter { } else { vault = await this.keyringController.createNewVaultAndKeychain(password) - this.selectFirstIdentity(vault) + const accounts = await this.keyringController.getAccounts() + this.preferencesController.setAddresses(accounts) + this.selectFirstIdentity() } release() } catch (err) { @@ -453,7 +456,9 @@ module.exports = class MetamaskController extends EventEmitter { const release = await this.createVaultMutex.acquire() try { const vault = await this.keyringController.createNewVaultAndRestore(password, seed) - this.selectFirstIdentity(vault) + const accounts = await this.keyringController.getAccounts() + this.preferencesController.setAddresses(accounts) + this.selectFirstIdentity() release() return vault } catch (err) { @@ -471,12 +476,10 @@ module.exports = class MetamaskController extends EventEmitter { */ /** - * Retrieves the first Identiy from the passed Vault and selects the related address - * - * @param {} vault + * Sets the first address in the state to the selected address */ - selectFirstIdentity (vault) { - const { identities } = vault + selectFirstIdentity () { + const { identities } = this.preferencesController.store.getState() const address = Object.keys(identities)[0] this.preferencesController.setSelectedAddress(address) } @@ -502,13 +505,15 @@ module.exports = class MetamaskController extends EventEmitter { await this.verifySeedPhrase() + this.preferencesController.setAddresses(newAccounts) newAccounts.forEach((address) => { if (!oldAccounts.includes(address)) { this.preferencesController.setSelectedAddress(address) } }) - return keyState + const {identities} = this.preferencesController.store.getState() + return {...keyState, identities} } /** diff --git a/app/scripts/migrations/026.js b/app/scripts/migrations/026.js new file mode 100644 index 000000000..1b8a91a45 --- /dev/null +++ b/app/scripts/migrations/026.js @@ -0,0 +1,47 @@ +const version = 26 + +/* + +This migration moves the identities stored in the KeyringController + into the PreferencesController + +*/ + +const clone = require('clone') + +module.exports = { + version, + migrate (originalVersionedData) { + const versionedData = clone(originalVersionedData) + versionedData.meta.version = version + try { + const state = versionedData.data + versionedData.data = transformState(state) + } catch (err) { + console.warn(`MetaMask Migration #${version}` + err.stack) + return Promise.reject(err) + } + return Promise.resolve(versionedData) + }, +} + +function transformState (state) { + if (!state.KeyringController || !state.PreferencesController) { + return + } + + if (!state.KeyringController.walletNicknames) { + return state + } + + state.PreferencesController.identities = Object.keys(state.KeyringController.walletNicknames) + .reduce((identities, address) => { + identities[address] = { + name: state.KeyringController.walletNicknames[address], + address, + } + return identities + }, {}) + delete state.KeyringController.walletNicknames + return state +} diff --git a/app/scripts/migrations/index.js b/app/scripts/migrations/index.js index 6c4a51b32..04d90bfff 100644 --- a/app/scripts/migrations/index.js +++ b/app/scripts/migrations/index.js @@ -36,4 +36,5 @@ module.exports = [ require('./023'), require('./024'), require('./025'), + require('./026'), ] diff --git a/old-ui/app/account-detail.js b/old-ui/app/account-detail.js index 692d50491..c67f0cf71 100644 --- a/old-ui/app/account-detail.js +++ b/old-ui/app/account-detail.js @@ -91,7 +91,7 @@ AccountDetailScreen.prototype.render = function () { isEditingLabel: false, }, saveText: (text) => { - props.dispatch(actions.saveAccountLabel(selected, text)) + props.dispatch(actions.setAccountLabel(selected, text)) }, }, [ diff --git a/package-lock.json b/package-lock.json index 1df46989c..c0cf49d0a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8054,9 +8054,9 @@ } }, "eth-keyring-controller": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eth-keyring-controller/-/eth-keyring-controller-2.2.0.tgz", - "integrity": "sha512-f/g1ZrxciWJs2aHgpfvYmZ3ImP48GA+pobTU0EFNF/y5Yylf1zQyDw671W5opGpIt5TgV4F9sYXcvyjlgbL0Pg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eth-keyring-controller/-/eth-keyring-controller-3.1.1.tgz", + "integrity": "sha512-Z9HTzrop/V4Ld8Wq7uwetKecfWIyx25/uL8aFoZxV3kegZGoXaWoRmNy+4oW0WNLp4BcJ1lk6QfsGEdlymGjmA==", "requires": { "bip39": "2.4.0", "bluebird": "3.5.1", @@ -8064,7 +8064,7 @@ "eth-hd-keyring": "1.2.2", "eth-sig-util": "1.4.2", "eth-simple-keyring": "1.2.1", - "ethereumjs-util": "5.1.5", + "ethereumjs-util": "5.2.0", "loglevel": "1.6.0", "obs-store": "2.4.1", "promise-filter": "1.1.0" @@ -8080,9 +8080,9 @@ } }, "ethereumjs-util": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.1.5.tgz", - "integrity": "sha512-xPaSEATYJpMTCGowIt0oMZwFP4R1bxd6QsWgkcDvFL0JtXsr39p32WEcD14RscCjfP41YXZPCVWA4yAg0nrJmw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", + "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", "requires": { "bn.js": "4.11.8", "create-hash": "1.1.3", @@ -8176,16 +8176,16 @@ "integrity": "sha1-bXs1LcWppQINYfafryHvsvY2P0U=", "requires": { "eth-sig-util": "1.4.2", - "ethereumjs-util": "5.1.5", + "ethereumjs-util": "5.2.0", "ethereumjs-wallet": "0.6.0", "events": "1.1.1", "xtend": "4.0.1" }, "dependencies": { "ethereumjs-util": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.1.5.tgz", - "integrity": "sha512-xPaSEATYJpMTCGowIt0oMZwFP4R1bxd6QsWgkcDvFL0JtXsr39p32WEcD14RscCjfP41YXZPCVWA4yAg0nrJmw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", + "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", "requires": { "bn.js": "4.11.8", "create-hash": "1.1.3", diff --git a/package.json b/package.json index 0c55c1e58..20618472f 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,7 @@ "eth-hd-keyring": "^1.2.1", "eth-json-rpc-filters": "^1.2.6", "eth-json-rpc-infura": "^3.0.0", - "eth-keyring-controller": "^2.2.0", + "eth-keyring-controller": "^3.1.1", "eth-phishing-detect": "^1.1.4", "eth-query": "^2.1.2", "eth-sig-util": "^1.4.2", diff --git a/test/stub/blacklist.json b/test/stub/blacklist.json deleted file mode 100644 index 14a890fec..000000000 --- a/test/stub/blacklist.json +++ /dev/null @@ -1,1689 +0,0 @@ -{ - "version": 2, - "tolerance": 2, - "fuzzylist": [ - "metamask.io", - "myetherwallet.com", - "cryptokitties.co", - "mycrypto.com", - "localethereum.com", - "dfinity.org" - ], - "whitelist": [ - "ncrypto.com", - "mrcrypto.dk", - "nedfinity.com", - "affinity.me", - "crypto.cat", - "winity.io", - "gfinity.net", - "p-crypto.ru", - "mycryptons.com", - "aicrypto.ai", - "azcrypto.net", - "crypto.com", - "affinity.photography", - "abcrypto.info", - "ucrypto.net", - "vscrypto.com", - "affinity.com", - "affinity.co", - "crypto.news", - "dbcrypto.com", - "ezcrypto.guide", - "gocrypto.me", - "finity.ai", - "weffkemining.com", - "nwcrypto.com", - "cobinhood.com", - "affinity.vc", - "trinity.tech", - "metahusk.com", - "mrcrypto.fr", - "affinity.store", - "affinity.serif.com", - "xfinity.com", - "dfinity.org", - "ggcrypto.net", - "mycrypto.website", - "pqcrypto.org", - "z-crypto.com", - "mpcrypo.com", - "localethereum.com", - "localbitcoins.com", - "huobipro.com", - "ncrypto.tech", - "9crypto.co", - "netmask.hu", - "cryptokittens.club", - "rucrypto.com", - "cryptocities.world", - "mqtcrypto.com", - "crypto.press", - "becrypto.xyz", - "hicrypto.io", - "crypto.nl", - "zycrypto.com", - "mmcrypto.io", - "mycrypter.com", - "crypto.tickets", - "crypto.pro", - "ocrypto.org", - "wecrypto.net", - "iccrypto.io", - "crypto.kred", - "ohmycrypto.io", - "spcrypto.net", - "melcrypto.com", - "zzcrypto.org", - "zzcrypto.net", - "crypto.bg", - "mycrypto24.online", - "acrypto.io", - "mycrypto.ca", - "scrypto.io", - "mycrypto.dk", - "mvzcrypto.com", - "ambcrypto.com", - "crypto.bi", - "crypto.jobs", - "crypto.help", - "my.crypt.observer", - "crypt.observer", - "ucrypto.com", - "cryptojobslist.com", - "crypto.review", - "crypto.me", - "b3crypto.com", - "mycrypto.ninja", - "jkcrypto.com", - "crypto.cr", - "mycrypto.live", - "yocrypto.io", - "crypto.ba", - "zacrypto.info", - "mycrypto.com", - "remix.ethereum.org", - "metahash.io", - "metahash.net", - "metahash.org", - "cryptotitties.com", - "cryptocities.net", - "cryptoshitties.co", - "cryptotitties.fun", - "cryptokitties.forsale", - "cryptokitties.care", - "metamate.cc", - "metamesh.tech", - "ico.nexus.social", - "metamesh.org", - "metatask.io", - "metmask.com", - "metarasa.com", - "metapack.com", - "metacase.com", - "metafas.nl", - "metamako.com", - "metamast.com", - "metamax.ru", - "metadesk.io", - "metadisk.com", - "metallsk.ru", - "metamag.fr", - "metamaks.ru", - "metamap.ru", - "metamaps.cc", - "metamats.com", - "metamax.by", - "metamax.com", - "metamax.io", - "metamuse.net", - "metarank.com", - "metaxas.com", - "megamas2.ru", - "metamask.io", - "myetherwallet.com", - "ethereum.org", - "myetheroll.com", - "myetherapi.com", - "ledgerwallet.com", - "databrokerdao.com", - "etherscan.io", - "etherid.org", - "ether.cards", - "etheroll.com", - "ethnews.com", - "ethex.market", - "ethereumdev.io", - "ethereumdev.kr", - "dether.io", - "ethermine.org", - "slaask.com", - "etherbtc.io", - "ethereal.capital", - "etherisc.com", - "m.famalk.net", - "etherecho.com", - "ethereum.os.tc", - "theethereum.wiki", - "metajack.im", - "etherhub.io", - "ethereum.network", - "ethereum.link", - "ethereum.com", - "prethereum.org", - "ethereumj.io", - "etheraus.com", - "ethereum.dev", - "1ethereum.ru", - "ethereum.nz", - "nethereum.com", - "metabank.com", - "metamas.com", - "aventus.io", - "metabase.com", - "etherdelta.com", - "metabase.one", - "cryptokitties.co", - "remme.io", - "jibrel.network", - "twinity.com" - ], - "blacklist": [ - "binance-promo.net", - "trust-cryptopayment.com", - "ethereum-transfer.online", - "icotonsale.com", - "etherbonuses.com", - "ethfreeget.com", - "tongram.me", - "funfaircoin.org", - "coinbase-secure-a2k34j.bitballoon.com", - "ethereumtrans.com", - "xn--condes-8bb1661d.com", - "ethergiveawaytweet.tk", - "eth-giveaway.gq", - "nnyettiervwallat.com", - "nnyettiervwallet.com", - "eth.vote", - "eth-promo.bitballoon.com", - "ethfreepay.com", - "promo-trx.tk", - "paymentaddress.tumblr.com", - "cryptongram.org", - "campaigntoken.blogspot.de", - "coin-promos.com", - "xn--ytherwallet-iw8ex8c.com", - "smartexchangecenter.tk", - "xn--oindesk-15a.com", - "eth-transaction.secure.kissr.com", - "otoeveryday.info", - "ethfreecandy.bitballoon.com", - "etherscanio.github.io", - "ico-gram.net", - "gramtoken.network", - "ethfreegive.com", - "ether-promo.bitballoon.com", - "xn--cindesk-cx4c.com", - "theadsleader.000webhostapp.com", - "myetherwalletico.blogspot.de", - "eth-giveaway.info", - "syncfab.eu", - "eth-giveaway.com", - "icoeth.tk", - "eth-giveaway-706.htmlcomponentservice.com", - "htmlcomponentservice.com", - "mybinance.info", - "xn--myethewallet-kjc.com", - "polyswamr.io", - "polyswarm.me", - "polyswarms.io", - "eth4free.ml", - "ico-telegram-ton.com", - "telegram.tw", - "gramton.info", - "gramsap.enterprises", - "ico-telegram.club", - "telegram.one", - "etharscan.io", - "xn--coindes-jhb.com", - "blocikchair.info", - "eth-cz-319.htmlcomponentservice.com", - "xn--myetherwaet-0t8ea.com", - "eth-giveaway-514.htmlcomponentservice.com", - "xn--mtherwallet-z19ex1a.com", - "xn--eo-e9a.com", - "cosss.io", - "callistonetwork.tech", - "xn--metherwallt-819eo1a.com", - "ethfreepays.com", - "nnyettiervwailet.com", - "xn--hapehift-oh0de.com", - "gram.vc", - "bonus.etherpayout.com", - "etherpayout.com", - "ethereum-giveaway.info", - "xn--bnanc-fsax.com", - "xn--binnce-y0a.com", - "geocities.ws", - "eth-giveaway-209.statichtmlapp.com", - "binance.bitballoon.com", - "binance-give.com", - "ilil.pw", - "myetherwallet.com.send-transaction_8hlg6z8mgt6zyg.ilil.pw", - "telegram.site", - "telegram.auction", - "miroskii.com", - "eth-transactions.neocities.org", - "online-eos.org", - "data-token.org", - "eth953883.htmlcomponentservice.com", - "reeveclancy.wixsite.com", - "transfer-eth.neocities.org", - "eth.secure-transactionssecure.com", - "secure-transactionssecure.com", - "nnyiictehervvailiat.com", - "odachi.neocities.org", - "bittrex-give.com", - "policypal.info", - "changlley.org", - "rnyertherwallet.com", - "xn--thabyss-u8a.com", - "callisto-airdrop.com", - "telegramfoundation.org", - "polymathnetwork.org", - "ethereum-promo.bitballoon.com", - "dfintty.org", - "dftnity.org", - "usermd.net", - "xn--gemn-nzab.com", - "xn--bnance-3va.com", - "xn--binnce-yc8b.com", - "xn--bnance-p9a.com", - "xn--binane-0ua.com", - "binalce.com", - "binince.com", - "xn--conbase-pza.com", - "xn--conbase-sfb.com", - "xn--coinbas-xya.com", - "xn--coinbas-z8a.com", - "xn--coinbse-9wa.com", - "xn--coinbse-lwa.com", - "xn--polonex-vfb.com", - "xn--ploniex-l0a.com", - "xn--plniex-bxab.com", - "xn--havvn-9za.io", - "havvenio.com", - "nucelus.vision", - "metronometoken.io", - "meganfoxloveyou.com", - "xn--yetherwalle-iw8e1s.com", - "tron-online.org", - "myenthereumwallet.com", - "myetherwallet-team.com", - "myetherwallet.usermd.net", - "xn--yetherwalle-tv8ezt.com", - "xn--coindek-873c.com", - "dflinity.org", - "ipsx.promo", - "havven-sale.com", - "tokensale-adhive.com", - "ataritoken.ltd", - "transfer-address-confirmation.droppages.com", - "droppages.com", - "dfinlty.org", - "poloniex.work", - "tokensale-havven.in", - "ico-havven.org", - "secure.poloniex.work", - "vechain-foundation.org", - "telegram.tokyo", - "forkdelta.io", - "ton-sale.com", - "ico-telegram.online", - "telegramtoken.io", - "gonetwork-airdrop.co", - "secure-transaction-confirmation.droppages.com", - "neonexchanges.org", - "eth-transact.secure.droppages.com", - "6khb.payment-checker-ethereum-id-bslyftexjuwcgv8.filesusr.com", - "akasha-world.com", - "address-transfer-confirmation.droppages.com", - "b5z.net", - "p.b5z.net", - "tokensale.xn--havve-7l1b.com", - "xn--coindes-bx3c.com", - "xn--coindek-s73c.com", - "locaeltherum.com", - "myetherwallet.tokenimport.com", - "tokenimport.com", - "leadscoin.network", - "localethereom.com", - "havvens.win", - "xn--metherwalle-jb9ejq.com", - "xn--myetheralle-jb9exm.com", - "tefood.me", - "havventoken.com", - "havven.cc", - "havven.eu", - "havven.top", - "mywalletether.com", - "myetherwallett.site", - "xn--myethewalle-w48erh.com", - "el-petro-coin.com", - "xn--yeterwallet-bm8eym.com", - "sale-orchid.com", - "electrify-asia.info", - "tron-foundation.org", - "dflnlty.org", - "polyswarm.tech", - "tokensale.polyswarm.tech", - "polyswarm.ru", - "dock.click", - "leadcoins.network", - "dock-tokensale.eu", - "polyswarm.pw", - "dock-io.org", - "heavven.io", - "havven.live", - "havven.sale", - "havven.info", - "dock.network", - "blocklancer.me", - "tokensale-havven.io", - "havven.pro", - "tokentelegram.com", - "ico-telegram.me", - "myetherzero.com", - "seele-token.pro", - "tokensale-havven.com", - "polyswarm.in", - "sale-dock.com", - "polyswarm.co", - "polyswarm.bid", - "ton.fund", - "forkdeita.github.io", - "xn--binnce-5nf.com", - "xn--biace-4l1bb.com", - "jiocoins.io", - "xn--polonx-0va26t.com", - "myetlherewallet.org", - "myeithereiuwallet.com", - "fin-trux.com", - "finetrux.com", - "telcoin.pro", - "xn--es-8bb.com", - "xn--myetherallt-pl9elw.com", - "ico-dock.org", - "dock.io-bonus.online", - "docks.site", - "dock-ico.pro", - "dock-ico.eu", - "dock.su", - "tokensale-dock.io", - "dock-ico.site", - "openplatform.tech", - "rightmesh.in", - "waxtoken.in", - "metamaskgiveaway.xyz", - "nebulastoken.in", - "vechain-foundation.com", - "icotoken-current.top", - "xn--myethrwalle-jb9e19a.com", - "xn--myetheralle-7b9ezl.com", - "iconfoundation.co", - "fundrequest.info", - "xn--myetherwale-os8e7x.com", - "remme-ico.eu", - "gonetwork.live", - "token.gonetwork.pro", - "gonetwork.pro", - "gonetwork.eu", - "nucleus-vision.cc", - "jibreltoken.in", - "dock.so", - "dock.promo", - "xn--mycrypt-r0a.com", - "xn--mycrypt-g1a.com", - "xn--mycrpto-y2a.com", - "ethexploit.org", - "remme.in", - "remme.ws", - "remme.com.ng", - "nyeitthervvallet.com", - "xn--myeerhwailet-ooc.com", - "myeterhwaliot.com", - "remme.live", - "xn--yethewalle-to2exkhi.com", - "myetherwallet.custom-token.com", - "custom-token.com", - "sale-earn.com", - "bankera.live", - "originprotocol.io", - "originprotocol.online", - "trx.foundation", - "tokensale.adhive.net", - "adhive.net", - "decentral.market", - "cryptoexploite.com", - "blockclain.net", - "xn--blckchin-5za9o.info", - "xn--blkhain-m0a4pb.info", - "xn--blocchal-gmb8m.info", - "xn--blocchaln-orb.info", - "xn--blocchan-gmb7c.info", - "xn--blockaden-lsen-5pb.com", - "xn--blockchai-3vb.info", - "xn--blockchai-jvb.info", - "xn--blockchal-3vb.info", - "xn--blockcham-ipb.info", - "xn--blockchan-2pb.com", - "xn--blockchan-75a.com", - "xn--blockchan-7sb.info", - "xn--blockchan-d5a.net", - "xn--blockchan-dob.info", - "xn--blockchan-ipb.com", - "xn--blockchan-ipb.info", - "xn--blockchan-nk7d.com", - "xn--blockchan-xub.info", - "xn--blockchann-4ub.com", - "xn--blockchi-n7a50e.info", - "xn--blockchi-o8a54d.info", - "xn--blockchi-p99co8a.com", - "xn--blockchim-hdb.info", - "xn--blockchin-1xb.info", - "xn--blockchin-61a.info", - "xn--blockchin-61a.net", - "xn--blockchin-6ib.info", - "xn--blockchin-ccb.info", - "xn--blockchin-h4a.com", - "xn--blockchin-h4a.info", - "xn--blockchin-hdb.info", - "xn--blockchin-hhb.info", - "xn--blockchin-mib.net", - "xn--blockchin-wcb.com", - "xn--blockchn-fza4j.com", - "xn--blockchn-fza4j.info", - "xn--blockchn-n7a43b.info", - "xn--blockchn-p0a.info", - "xn--blockchn-tx0d4p.com", - "xn--blockclai-3vb.info", - "xn--blockclin-hdb.com", - "xn--blockclin-hdb.info", - "xn--blockclin-hdb.org", - "xn--blockflte-kirchrode-w6b.de", - "xn--blockfltenquartett-windspiel-81c.de", - "xn--blockhai-obb78c.info", - "xn--blockhain-4eb.com", - "xn--blockhain-pfb.com", - "xn--blockhain-pfb.info", - "xn--blockhain-zdb.info", - "xn--blockhan-obb65a.info", - "xn--blockhas-d6a.com", - "xn--blockwallt-j7a.com", - "xn--blokchai-fqb.info", - "xn--blokchain-nfb.info", - "xn--blokhain-28ab.info", - "xn--bockclnain-eyb.info", - "xn--mymoeo-zt7bzf.com", - "xn--mymoer-nqc1368c.com", - "xn--mymoero-c13c.com", - "xn--mymoero-s13c.com", - "xn--mymoneo-f63c.com", - "xn--mymoneo-v63c.com", - "xn--mymoneo-y53c.com", - "xn--mymoner-j0a.com", - "xn--mymoner-j5b.com", - "xn--mymoner-r0a.com", - "xn--mymoner-z0a.com", - "xn--mymoner-z2c.com", - "xn--mymonro-fya.com", - "xn--mymonro-x8a.com", - "xn--myetheallet-l58emu.com", - "xn--myetheraet-9k2ea77h.com", - "xn--myetheralet-ms8e21b.com", - "xn--myetheralle-7b9exm.com", - "xn--myetherallet-5s5f.com", - "xn--myetherallet-fs5f.com", - "xn--myetherewalle-1t1g.com", - "xn--myetherllet-pl9e6k.com", - "xn--myethervvalle-8vc.com", - "xn--myetherwaet-61ea.com", - "xn--myetherwaet-8eda.com", - "xn--myetherwaet-ns8ea.com", - "xn--myetherwale-ns8e8x.com", - "xn--myetherwalet-0fb.com", - "xn--myetherwalet-0z4f.com", - "xn--myetherwalet-814f.com", - "xn--myetherwalet-d9b.com", - "xn--myetherwalet-h14f.com", - "xn--myetherwalle-9me.com", - "xn--myetherwalle-ek5f.com", - "xn--myetherwalle-fqc.com", - "xn--myetherwalle-opc.com", - "xn--myetherwalle-q05f.com", - "xn--myetherwllet-wob.com", - "xn--myetherwllt-r7a0i.com", - "xn--myethewaliet-9d5f.com", - "xn--myethewalle-3ic0947g.com", - "xn--myethewallet-0e5f.com", - "xn--myethewallet-1kc.com", - "xn--myethewallet-bkc.com", - "xn--myethewallet-vof.com", - "xn--myethewalliet-nm1g.com", - "xn--myethewallt-kbb3019g.com", - "xn--myethewallt-w48ew7b.com", - "xn--myethrwalet-6qb6408g.com", - "xn--myethrwalet-ms8e83d.com", - "xn--myethrwallet-1db.com", - "xn--myethrwallt-29af.com", - "xn--myethrwallt-29as.com", - "xn--myethrwllet-q7a31e.com", - "xn--myethrwllet-r8a3c.com", - "fintrux.eu", - "refereum-ico.eu", - "arcblock-ico.org", - "xn--fuson-1sa.org", - "refereum-token.com", - "fintrux.co", - "ico-ton.org", - "xn--mytherwallt-cbbv.com", - "xmoneta.co", - "data-wallet.co", - "tokensale.data-wallet.co", - "xn--myeerhwallot-ooc.com", - "xn--myeterwalet-cm8epi.com", - "xn--myeterwalle-cm8ev6a.com", - "rnyetherumwallet.com", - "republic-protocol.net", - "nyeihitervvallatt.com", - "arcblock.eu", - "republicprotocol.eu", - "tokensale-fusion.com", - "myetherwalletjoin.com", - "medicalchian.com", - "myeahteirwaliet.com", - "myenhtersvvailct.com", - "trinity-token.com", - "xn--eo-yzs.com", - "zilliqa.in", - "sparc.pro", - "myetherwallet.import-tokens.com", - "token-gram.org", - "xn--shapshift-e4a.com", - "xn--shapshift-y4a.com", - "xn--shpeshift-c2a.com", - "xn--shpeshift-r1a.com", - "xn--shapshift-o4a.com", - "xn--shpeshift-w2a.com", - "xn--shapeshft-w5a.com", - "tokensale-fusion.org", - "fusion-ico.com", - "beetolen.com", - "tokencrowdsale.online", - "fusion.tokencrowdsale.online", - "beetokem.com", - "block.chaiins.in", - "origintrail.in", - "bit-z.ru", - "xn--myetherallet-nu5f.com", - "xn--mytherwalet-3qb08c.com", - "xn--myeterwllet-cm8et1d.com", - "xn--mytherwllet-q7a01e.com", - "xn--biance-xt7b.com", - "xn--bnance-wic.com", - "xn--biance-jeb.com", - "xn--bttrx-9za8334c.com", - "wwwkodakcoin.com", - "myetherwallet.uk.com", - "kodakone.cc", - "nyeihitervvallet.com", - "xn--myeterwalet-cm8eoi.com", - "nucleus.foundation", - "beetoken-ico.com", - "data-token.com", - "tron-labs.com", - "ocoin.tech", - "aionfoundation.com", - "ico-telegram.org", - "nyeihitervvallat.com", - "telegramcoin.us", - "daddi.cloud", - "daditoken.com", - "blockarray.org", - "dadi-cloud.net", - "wanchainfunding.org", - "ico-telegram.io", - "iconfoundation.site", - "iost.co", - "beetoken-ico.eu", - "cindicator.network", - "wanchainetwork.org", - "wamchain.org", - "wanchainltd.org", - "wanchainalliance.org", - "nucleus-vision.net", - "ledgerwallet.by", - "nucleuss.vision", - "myenhterswailct.com", - "cobin-hood.com", - "wanchainfoundation.org", - "xn--polniex-ex4c.com", - "xn--polniex-s1a.com", - "xn--polonex-ieb.com", - "xn--polonex-sza.com", - "xn--polonex-zw4c.com", - "xn--polonix-ws4c.com", - "xn--polonix-y8a.com", - "xn--pooniex-ojb.com", - "gramico.info", - "dimnsions.network", - "www-gemini.com", - "login-kucoin.net", - "venchain.foundation", - "grampreico.com", - "tgram.cc", - "ton-gramico.com", - "wwwpaywithink.com", - "coniomi.com", - "paywithnk.com", - "paywithlnk.com", - "iluminatto.com.br", - "pundix.eu", - "xn--bttrx-esay.com", - "xn--bttrex-w8a.com", - "xn--bnance-bwa.com", - "xn--shpeshift-11a.com", - "xn--shapeshif-ts6d.com", - "xn--shapshift-yf7d.com", - "wwwbluzelle.com", - "bluzelie.com", - "nucleus-vision.org", - "omisegonetwork.site", - "etlherzero.com", - "etlherdelta.com", - "xn--condesk-0ya.com", - "xn--condesk-sfb.com", - "xn--coindsk-vs4c.com", - "iexecplatform.com", - "tongramico.com", - "nucleus-vision.eu", - "intchain.network", - "wanchain.cloud", - "bluzelle-ico.com", - "ethzero-wallet.com", - "xn--metherwalle-jb9et7d.com", - "xn--coinesk-jo3c.com", - "venchainfoundation.com", - "myenhtersvvailot.com", - "ether-zero.net", - "ins.foundation", - "nastoken.org", - "telcointoken.com", - "ether0.org", - "eterzero.org", - "bluzelle-ico.eu", - "bleuzelle.com", - "appcoinstoken.org", - "xn--quanstamp-8s6d.com", - "myehntersvvailct.com", - "myeherwalllet.com", - "ico-bluzelle.com", - "bluzelle.im", - "bluzelle.one", - "bluzele.sale", - "bluzele.co", - "sether.ws", - "xn--myetherwalet-6gf.com", - "xn--rnyethewaliet-om1g.com", - "rnyethervailet.com", - "mvetherwaliet.com", - "rnyetherwailet.com", - "myethervaliet.com", - "rnyethervaliet.com", - "mvetherwalilet.com", - "xn--myethewalie-3ic0947g.com", - "xn--mthrwallet-z6ac3y.com", - "xn--myeherwalie-vici.com", - "xn--myethervvalie-8vc.com", - "xn--mythrwallt-06acf.com", - "xn--mtherwallet-y9a6y.com", - "myetherwallet.applytoken.tk", - "ethereum-zero.com", - "quanstamptoken.tk", - "bluzelle.network", - "ether-wallet.org", - "tron-wallet.info", - "appcoinsproject.com", - "vechain.foundation", - "tronlab.site", - "tronlabs.network", - "bluzelle.cc", - "ethblender.com", - "ethpaperwallet.net", - "waltontoken.org", - "icoselfkey.org", - "etherzeroclaim.com", - "etherzero.promo", - "bluzelle.pro", - "token-selfkey.org", - "xn--etherdlta-0f7d.com", - "sether.in", - "xn--ttrex-ysa9423c.com", - "bluzelle.eu", - "bluzelle.site", - "gifto.tech", - "xn--os-g7s.com", - "selfkey.co", - "xn--myeherwalet-ns8exy.com", - "xn--coinelegraph-wk5f.com", - "dai-stablecoin.com", - "eos-token.org", - "venchain.org", - "gatcoins.io", - "deepbrainchain.co", - "myetherwalililet.info", - "myehvterwallet.com", - "myehterumswallet.com", - "nucleusico.com", - "tronlab.tech", - "0x-project.com", - "gift-token-events.mywebcommunity.org", - "funfairtoken.org", - "breadtokenapp.com", - "cloudpetstore.com", - "myethwalilet.com", - "selfkeys.org", - "wallet-ethereum.com", - "xn--methrwallt-26ar0z.com", - "xn--mytherwllet-r8a0c.com", - "bluzelle.promo", - "tokensale.bluzelle.promo", - "cedarlake.org", - "marketingleads4u.com", - "cashaa.co", - "xn--inance-hrb.com", - "wanchain.tech", - "zenprolocol.com", - "ethscan.io", - "etherscan.in", - "props-project.com", - "zilliaq.com", - "reqestnetwork.com", - "etherdelta.pw", - "ethereum-giveaway.org", - "mysimpletoken.org", - "binancc.com", - "blnance.org", - "elherdelta.io", - "xn--hapeshit-ez9c2y.com", - "tenxwallet.co", - "singularitynet.info", - "mytlherwaliet.info", - "iconmainnet.ml", - "tokenselfkey.org", - "xn--myetewallet-cm8e5y.com", - "envione.org", - "myetherwalletet.com", - "claimbcd.com", - "ripiocreditnetwork.in", - "xn--yeterwallet-ml8euo.com", - "ethclassicwallet.info", - "myltherwallet.ru.com", - "etherdella.com", - "xn--yeterwallet-bm8ewn.com", - "singularty.net", - "cloudkitties.co", - "iconfoundation.io", - "kittystat.com", - "gatscoin.io", - "singularitynet.in", - "sale.canay.io", - "canay.io", - "wabicoin.co", - "envion.top", - "sirinslabs.com", - "tronlab.co", - "paxful.com.ng", - "changellyli.com", - "ethereum-code.com", - "xn--plonex-6va6c.com", - "envion.co", - "envion.cc", - "envion.site", - "ethereumchain.info", - "xn--envon-1sa.org", - "xn--btstamp-rfb.net", - "envlon.org", - "envion-ico.org", - "spectivvr.org", - "sirinlbs.com", - "ethereumdoubler.life", - "xn--myetherwllet-fnb.com", - "sirin-labs.com", - "sirin-labs.org", - "envion.one", - "envion.live", - "propsproject.org", - "propsprojects.com", - "decentralland.org", - "xn--metherwalet-ns8ep4b.com", - "redpulsetoken.co", - "propsproject.tech", - "xn--myeterwalet-nl8emj.com", - "powrerledger.com", - "cryptokitties.com", - "sirinlabs.pro", - "sirinlabs.co", - "sirnlabs.com", - "superbitcoin-blockchain.info", - "hellobloom.me", - "mobus.network", - "powrrledger.com", - "xn--myeherwalet-ms8eyy.com", - "qlink-ico.com", - "gatcoin.in", - "tokensale.gamefllp.com", - "gamefllp.com", - "xn--myeherwalle-vici.com", - "xn--myetherwalet-39b.com", - "xn--polonex-ffb.com", - "xn--birex-leba.com", - "raiden-network.org", - "sirintabs.com", - "xn--metherwallt-79a30a.com", - "xn--myethrwllet-2kb3p.com", - "myethlerwallet.eu", - "xn--btrex-b4a.com", - "powerrledger.com", - "xn--cointeegraph-wz4f.com", - "myerherwalet.com", - "qauntstanp.com", - "myetherermwallet.com", - "xn--myethewalet-ns8eqq.com", - "xn--nvion-hza.org", - "nnyetherwallelt.ru.com", - "ico-wacoin.com", - "xn--myeterwalet-nl8enj.com", - "bitcoinsilver.io", - "t0zero.com", - "tokensale.gizer.in", - "gizer.in", - "wabitoken.com", - "gladius.ws", - "xn--metherwallt-8bb4w.com", - "quanttstamp.com", - "gladius.im", - "ethereumstorage.net", - "powerledgerr.com", - "xn--myeherwallet-4j5f.com", - "quamtstamp.com", - "quntstamp.com", - "xn--changely-j59c.com", - "shapeshlft.com", - "coinbasenews.co.uk", - "xn--metherwallet-hmb.com", - "envoin.org", - "powerledger.com", - "bitstannp.net", - "xn--myetherallet-4k5fwn.com", - "xn--coinbas-pya.com", - "requestt.network", - "oracls.network", - "sirinlabs.website", - "powrledger.io", - "slackconfirm.com", - "shape-shift.io", - "oracles-network.org", - "xn--myeherwalle-zb9eia.com", - "blockstack.one", - "urtust.io", - "bittrex.one", - "t0-ico.com", - "xn--cinbase-90a.com", - "xn--metherwalet-ns8ez1g.com", - "tzero-ico.com", - "tzero.su", - "tzero.website", - "blockstack.network", - "ico-tzero.com", - "spectre.site", - "tzero.pw", - "spectre-ai.net", - "xn--waxtokn-y8a.com", - "dmarket.pro", - "bittrex.com11648724328774.cf", - "bittrex.com1987465798.ga", - "autcus.org", - "t-zero.org", - "xn--zero-zxb.com", - "myetherwalletfork.com", - "blokclbain.info", - "datum.sale", - "spectre-ai.org", - "powerledgr.com", - "simpletoken.live", - "sale.simpletoken.live", - "qauntstamp.com", - "raiden-network.com", - "metalpayme.com", - "quantstamp-ico.com", - "myetherwailetclient.com", - "biockchain.biz", - "wallets-blockchain.com", - "golemairdrop.com", - "omisegoairdrop.net", - "blodkchainwallet.info", - "walton-chain.org", - "elite888-ico.com", - "bitflyerjp.com", - "chainlinksmartcontract.com", - "stormtoken.eu", - "omise-go.tech", - "saltending.com", - "stormltoken.com", - "xn--quanttamp-42b.com", - "stormtoken.co", - "storntoken.com", - "stromtoken.com", - "storm-token.com", - "stormtokens.io", - "ether-delta.com", - "ethconnect.live", - "ethconnect.trade", - "xn--bttrex-3va.net", - "quantstamp.com.co", - "wancha.in", - "augur-network.com", - "quantstamp.com.ua", - "myetherwalletmew.com", - "myetherumwalletts.com", - "xn--quanstamp-tmd.com", - "quantsstamps.com", - "changellyl.net", - "xn--myetherwalet-1fb.com", - "myethereumwallets.com", - "xn--myetherwalet-e9b.com", - "quantslamp.com", - "metelpay.com", - "xn--eterdelta-m75d.com", - "linksmartcontract.com", - "myetherwalletaccess.com", - "myetherwalletcheck.com", - "myetherwalletcheck.info", - "myetherwalletconf.com", - "myetherwalleteal.com", - "myetherwalletec.com", - "myetherwalletgeth.com", - "myetherwalletmetamask.com", - "myetherwalletmm.com", - "myetherwalletmy.com", - "myetherwalletnh.com", - "myetherwalletnod.com", - "myetherwalletrr.com", - "myetherwalletrty.com", - "myetherwalletsec.com", - "myetherwalletsecure.com", - "myetherwalletutc.com", - "myetherwalletver.info", - "myetherwalletview.com", - "myetherwalletview.info", - "myetherwalletvrf.com", - "myetherwalletmist.com", - "myetherwalletext.com", - "myetherwalletjson.com", - "mettalpay.com", - "bricklblock.io", - "bittrexy.com", - "utrust.so", - "myethierwallet.org", - "metallpay.com", - "kraken-wallet.com", - "dmarkt.io", - "etherdeltla.com", - "unlversa.io", - "universa.sale", - "mercuryprotocol.live", - "ripiocredlt.network", - "myetlherwa11et.com", - "dentacoin.in", - "rdrtg.com", - "myetherwallet.com.rdrgh.com", - "rdrgh.com", - "ripiocreditnetwork.co", - "riaden.network", - "hydrominer.biz", - "rdrblock.com", - "reqest.network", - "senstoken.com", - "myetherwallat.services", - "ripiocredit.net", - "xn--metherwallet-c06f.com", - "ico.ripiocredits.com", - "ripiocredits.com", - "raidens.network", - "artoken.co", - "myetherwalletlgn.com", - "etherblog.click", - "stormtoken.site", - "httpmyetherwallet.com", - "myetherwalletverify.com", - "byzantiumfork.com", - "myetherwallet.com.byzantiumfork.com", - "www-myethervvallet.com", - "ether24.info", - "block-v.io", - "bittrex.cash", - "shapishift.io", - "ripiocerdit.network", - "rnyetherwa11et.com", - "claimether.com", - "enigmatokensale.com", - "ethereum-org.com", - "mvetnerwallet.com", - "myctherwallet.com", - "myetherwaltet.com", - "myetherwatlet.com", - "privatix.me", - "myetherwalletcnf.com", - "myetherwalletver.com", - "privatix.top", - "privatix.pro", - "privatex.io", - "stormtoken.cc", - "raiden.online", - "stormstoken.com", - "myetereumwallet.com", - "stormtokens.net", - "myetherwalletconf.info", - "storrntoken.com", - "worldofbattles.io", - "ico.worldofbattles.io", - "privatix.live", - "riden.network", - "raidan.network", - "ralden.network", - "mymyetherwallet.com", - "myetherwallets.net", - "myetherwalletverify.info", - "stormxtoken.com", - "myethereum-wallet.com", - "myetherwallet-forkprep.pagedemo.co", - "myetnerwailet.com", - "www-mvetherwallet.com", - "etheirdelta.com", - "myetherwalletiu.com", - "myetherwaiiett.com", - "xn--mytherwalet-cbb87i.com", - "xn--myethrwallet-ivb.co", - "xn--myeterwallet-f1b.com", - "myehterwaliet.com", - "omegaone.co", - "myetherwaiietw.com", - "slack.com.ru", - "polkodot.network", - "request-network.net", - "requestnetwork.live", - "binancie.com", - "first-eth.info", - "myewerthwalliet.com", - "enjincoin.pw", - "xn--bitrex-k17b.com", - "alrswap.io", - "www-request.network", - "myetnenwallet.com", - "www-enigma.co", - "cryptoinsidenews.com", - "air-swap.tech", - "launch.airswap.cc", - "airswap.cc", - "airswaptoken.com", - "launch.airswap.in", - "airswap.in", - "security-steemit.com.mx", - "blockchalnwallet.com", - "blodkchainwallet.com", - "blodkchaln.com", - "myethereumwaiiet.com", - "myethereumwaliet.com", - "myethereumwalilet.com", - "myetherswailet.com", - "myetherswaliet.com", - "myetherswalilet.com", - "myetherwalilett.com", - "myetherwalletl.com", - "myetherwalletww.com", - "myethereunwallet.com", - "myethereumwallct.com", - "myetherwaiieti.com", - "myetherwaiiete.com", - "upfirng.com", - "paypie.net", - "paypie.tech", - "soam.co", - "myetherwaiict.com", - "numerai-token.com", - "www-bankera.com", - "vvanchain.org", - "omisegoairdrop.com", - "xn--enjncoin-41a.io", - "suncontract.su", - "myetherwaiietr.com", - "shapeshiff.io", - "warchain.org", - "myethwallett.com", - "myethervvaliet.com", - "wanchains.org", - "etherparty.in", - "enjincoin.me", - "etiam.io", - "invest.smartlands.tech", - "smartlands.tech", - "enijncoin.io", - "wanchain.network", - "nimiq.su", - "enjincoin.sale", - "tenxwallet.io", - "golem-network.net", - "myyethwallet.ml", - "mywetherwailiet.com", - "omg-omise.com", - "district0x.tech", - "centra-token.com", - "etherdetla.com", - "etnerparty.io", - "etherdelta.su", - "myetherwallett.neocities.org", - "myetherwallet-secure.com", - "myethereumwalletntw.info", - "real-markets.io", - "wallet-ethereum.org", - "request-network.com", - "shapeshifth.io", - "shiapeshift.in", - "coin.red-puise.com", - "ibittreix.com", - "coinkbase.com", - "cindicator.pro", - "myetherwallet.com.ailogin.me", - "eventchain.co", - "kinkik.in", - "myetherumwalletview.com", - "protostokenhub.com", - "coinrbase.com", - "myetherwalletlogin.com", - "omisegotoken.com", - "myethereumwalletntw.com", - "reall.markets", - "cobinhood.org", - "cobinhood.io", - "happy-coin.org", - "bitfinex.com.co", - "bitfienex.com", - "iconn.foundation", - "centra.vip", - "smartcontract.live", - "icon.community", - "air-token.com", - "centra.credit", - "myetherwallet-singin.com", - "smartcontractlink.com", - "shapesshift.io", - "0xtoken.io", - "augurproject.co", - "ethereumus.one", - "myetherumwalet.com", - "myetherwalletsignin.com", - "change-bank.org", - "charge-bank.com", - "myetherwalletsingin.com", - "myetherwalletcontract.com", - "change-bank.io", - "chainlink.tech", - "myetherwallet-confirm.com", - "tokensale.kybernet.network", - "kybernet.network", - "kyberr.network", - "kybernetwork.io", - "myetherwalletconfirm.com", - "kvnuke.github.io", - "kin.kikpro.co", - "myethereumwallet.co.uk", - "tokensale-kyber.network", - "kyber-network.co", - "tokensale.kyber-network.co", - "pyro0.github.io", - "tokensale.kyber.digital", - "kyber.digital", - "omise-go.me", - "my.etherwallet.com.de", - "bepartof.change-bank.co", - "change-bank.co", - "enigma-tokens.co", - "coinbase.com.eslogin.co", - "xn--bittrx-mva.com", - "ethrdelta.github.io", - "etherdellta.com", - "ico-nexus.social", - "red-pulse.tech", - "bitj0b.io", - "xn--bttrex-bwa.com", - "kin-klk.com", - "kin-crowdsale.com", - "ethedelta.com", - "coindash.su", - "myethwallet.co.uk", - "swarm.credit", - "myethereumwallet.uk", - "iconexu.social", - "wanchain.co", - "enigrna.co", - "linknetwork.co", - "qtum-token.com", - "omisego.com.co", - "rivetzintl.org", - "etherdelta.one", - "the-ether.pro", - "etherdelta.gitnub.io", - "kirkik.com", - "monetha.ltd", - "vlberate.io", - "ethereumwallet-kr.info", - "omise-go.org", - "iconexus.social", - "bittirrex.com", - "aventus.pro", - "atlant.solutions", - "aventus.group", - "metamak.io", - "omise.com.co", - "herotokens.io", - "starbase.pro", - "etherdelta.githulb.io", - "herotoken.co", - "kinico.net", - "dmarket.ltd", - "etherdelta.gilthub.io", - "golem-network.com", - "etnerscan.io", - "bllttriex.com", - "monetha.me", - "monetha.co", - "monetha-crowdsale.com", - "starbase.tech", - "aventus-crowdsale.com", - "shapeshift.pro", - "bllttrex.com", - "kickico.co", - "statustoken.im", - "bilttrex.com", - "tenxpay.io", - "bittrex.ltd", - "metalpay.im", - "aragon.im", - "coindash.tech", - "decentraland.tech", - "decentraland.pro", - "status-token.com", - "bittrex.cam", - "enigmatoken.com", - "unocoin.company", - "unocoin.fund", - "0xproject.io", - "0xtoken.com", - "numerai.tech", - "decentraiand.org", - "blockcrein.info", - "blockchealn.info", - "bllookchain.info", - "blockcbhain.info", - "myetherwallet.com.ethpromonodes.com", - "mettamask.io", - "tokenswap.org", - "netherum.com", - "etherexx.org", - "etherume.io", - "ethereum.plus", - "ehtereum.org", - "etereurm.org", - "etheream.com", - "ethererum.org", - "ethereum.io", - "etherdelta-glthub.com", - "cryptoalliance.herokuapp.com", - "bitspark2.com", - "indorsetoken.com", - "iconexus.tk", - "iconexus.ml", - "iconexus.ga", - "iconexus.cf", - "etherwallet.online", - "wallet-ethereum.net", - "bitsdigit.com", - "etherswap.org", - "eos.ac", - "uasfwallet.com", - "ziber.io", - "multiply-ethereum.info", - "bittrex.comze.com", - "karbon.vacau.com", - "etherdelta.gitlhub.io", - "etherdelta.glthub.io", - "digitaldevelopersfund.vacau.com", - "district-0x.io", - "coin-dash.com", - "coindash.ru", - "district0x.net", - "aragonproject.io", - "coin-wallet.info", - "coinswallet.info", - "contribute-status.im", - "ether-api.com", - "ether-wall.com", - "mycoinwallet.net", - "ethereumchamber.com", - "ethereumchamber.net", - "ethereumchest.com", - "ethewallet.com", - "myetherwallet.com.vc", - "myetherwallet.com.pe", - "myetherwallet.us.com", - "myetherwallet.com.u0387831.cp.regruhosting.ru", - "myethereumwallet.su", - "myetherweb.com.de", - "myetherieumwallet.com", - "myetehrwallet.com", - "myeterwalet.com", - "myetherwaiiet.com", - "myetherwallet.info", - "myetherwallet.ch", - "myetherwallet.om", - "myethervallet.com", - "myetherwallet.com.cm", - "myetherwallet.com.co", - "myetherwallet.com.de", - "myetherwallet.com.gl", - "myetherwallet.com.im", - "myetherwallet.com.ua", - "secure-myetherwallet.com", - "update-myetherwallet.com", - "wwwmyetherwallet.com", - "myeatherwallet.com", - "myetharwallet.com", - "myelherwallel.com", - "myetherwaillet.com", - "myetherwaliet.com", - "myetherwallel.com", - "myetherwallet.cam", - "myetherwallet.cc", - "myetherwallet.co", - "myetherwallet.cm", - "myetherwallet.cz", - "myetherwallet.org", - "myetherwallet.tech", - "myetherwallet.top", - "myetherwallet.net", - "myetherwallet.ru.com", - "myetherwallet.com.ru", - "metherwallet.com", - "myetrerwallet.com", - "myetlerwallet.com", - "myethterwallet.com", - "myethwallet.io", - "myethterwallet.co", - "myehterwallet.co", - "myaetherwallet.com", - "myetthterwallet.com", - "myetherwallet.one", - "myelterwallet.com", - "myetherwallet.gdn", - "myetherwallt.com", - "myeterwallet.com", - "myeteherwallet.com", - "myethearwailet.com", - "myetherwallelt.com", - "myetherwallett.com", - "etherwallet.org", - "myetherewallet.com", - "myeherwallet.com", - "myethcrwallet.com", - "myetherwallet.link", - "myetherwallets.com", - "myethearwaillet.com", - "myethearwallet.com", - "myetherawllet.com", - "myethereallet.com", - "myetherswallet.com", - "myetherwalet.com", - "myetherwaller.com", - "myetherwalliet.com", - "myetherwllet.com", - "etherwallet.io", - "myetherwallet.ca", - "myetherwallet.me", - "myetherwallet.ru", - "myetherwallet.xyz", - "myetherwallte.com", - "myethirwallet.com", - "myethrewallet.com", - "etherwallet.net", - "maetherwallet.com", - "meyetherwallet.com", - "my.ether-wallet.pw", - "myehterwallet.com", - "myeitherwallet.com", - "myelherwallet.com", - "myeltherwallet.com", - "myerherwallet.com", - "myethearwalet.com", - "myetherewalle.com", - "myethervvallet.com", - "myetherwallent.com", - "myetherwallet.fm", - "myetherwalllet.com", - "myetherwalltet.com", - "myetherwollet.com", - "myetlherwalet.com", - "myetlherwallet.com", - "rnyetherwallet.com", - "etherclassicwallet.com", - "omg-omise.co", - "omise-go.com", - "omise-go.net", - "omise-omg.com", - "omise-go.io", - "tenx-tech.com", - "bitclaive.com", - "tokensale-tenx.tech", - "ubiqcoin.org", - "metamask.com", - "ethtrade.io", - "myetcwallet.com", - "account-kigo.net", - "bitcoin-wallet.net", - "blocklichan.info", - "bloclkicihan.info", - "coindash.ml", - "eos-bonus.com", - "eos-io.info", - "ether-wallet.net", - "ethereum-wallet.info", - "ethereum-wallet.net", - "ethereumchest.net", - "reservations-kigo.net", - "reservations-lodgix.com", - "secure-liverez.com", - "secure-onerooftop.com", - "settings-liverez.com", - "software-liverez.com", - "software-lodgix.com", - "unhackableetherwallets.com", - "www-myetherwallet.com", - "etherwallet.co.za", - "etherwalletchain.com", - "etherwallets.net", - "etherwallets.nl", - "my-ethwallet.com", - "my.ether-wallet.co", - "myetherwallet.com.am", - "myetherwallet.com.ht", - "myetherwalletcom.com", - "myehterwailet.com", - "xn--myetherwalle-xoc.com", - "xn--myetherwalle-44i.com", - "xn--myetherwalle-xhk.com", - "xn--myetherwallt-cfb.com", - "xn--myetherwallt-6tb.com", - "xn--myetherwallt-xub.com", - "xn--myetherwallt-ovb.com", - "xn--myetherwallt-fwb.com", - "xn--myetherwallt-5wb.com", - "xn--myetherwallt-jzi.com", - "xn--myetherwallt-2ck.com", - "xn--myetherwallt-lok.com", - "xn--myetherwallt-lsl.com", - "xn--myetherwallt-ce6f.com", - "xn--myetherwalet-mcc.com", - "xn--myetherwalet-xhf.com", - "xn--myetherwalet-lcc.com", - "xn--myetherwaet-15ba.com", - "xn--myetherwalet-whf.com", - "xn--myetherwaet-v2ea.com", - "xn--myetherwllet-59a.com", - "xn--myetherwllet-jbb.com", - "xn--myetherwllet-wbb.com", - "xn--myetherwllet-9bb.com", - "xn--myetherwllet-ncb.com", - "xn--myetherwllet-0cb.com", - "xn--myetherwllet-5nb.com", - "xn--myetherwllet-ktd.com", - "xn--myetherwllet-mre.com", - "xn--myetherwllet-76e.com", - "xn--myetherwllet-o0l.com", - "xn--myetherwllet-c45f.com", - "xn--myetherallet-ejn.com", - "xn--myethewallet-4nf.com", - "xn--myethewallet-iof.com", - "xn--myethewallet-mpf.com", - "xn--myethewallet-6bk.com", - "xn--myethewallet-i31f.com", - "xn--myethrwallet-feb.com", - "xn--myethrwallt-fbbf.com", - "xn--myethrwallet-seb.com", - "xn--myethrwallt-rbbf.com", - "xn--myethrwallet-5eb.com", - "xn--myethrwallt-3bbf.com", - "xn--myethrwallet-0tb.com", - "xn--myethrwallt-tpbf.com", - "xn--myethrwallet-rub.com", - "xn--myethrwallt-iqbf.com", - "xn--myethrwallet-ivb.com", - "xn--myethrwallt-6qbf.com", - "xn--myethrwallet-8vb.com", - "xn--myethrwallt-vrbf.com", - "xn--myethrwallet-zwb.com", - "xn--myethrwallt-ksbf.com", - "xn--myethrwallet-dzi.com", - "xn--myethrwallt-wbif.com", - "xn--myethrwallet-wck.com", - "xn--myethrwallt-skjf.com", - "xn--myethrwallet-fok.com", - "xn--myethrwallt-fvjf.com", - "xn--myethrwallet-fsl.com", - "xn--myethrwallt-fwkf.com", - "xn--myethrwallet-5d6f.com", - "xn--myethrwallt-319ef.com", - "xn--myeterwallet-ufk.com", - "xn--myeterwallet-nrl.com", - "xn--myeterwallet-von.com", - "xn--myeterwallet-jl6c.com", - "xn--myeherwallet-ooc.com", - "xn--myeherwalle-6hci.com", - "xn--myeherwallet-v4i.com", - "xn--myeherwalle-zgii.com", - "xn--myeherwallet-ohk.com", - "xn--myeherwalle-6oji.com", - "xn--mytherwallet-ceb.com", - "xn--mythrwallet-cbbc.com", - "xn--mythrwallt-c7acf.com", - "xn--mytherwallet-peb.com", - "xn--mythrwallet-obbc.com", - "xn--mythrwallt-n7acf.com", - "xn--mytherwallet-2eb.com", - "xn--mythrwallet-0bbc.com", - "xn--mythrwallt-y7acf.com", - "xn--mytherwallet-xtb.com", - "xn--mythrwallet-qpbc.com", - "xn--mythrwallt-jlbcf.com", - "xn--mytherwallet-oub.com", - "xn--mythrwallet-fqbc.com", - "xn--mythrwallt-5lbcf.com", - "xn--mythrwallet-3qbc.com", - "xn--mythrwallt-smbcf.com", - "xn--mytherwallet-5vb.com", - "xn--mythrwallet-srbc.com", - "xn--mythrwallt-fnbcf.com", - "xn--mytherwallet-wwb.com", - "xn--mythrwallet-hsbc.com", - "xn--mythrwallt-1nbcf.com", - "xn--mytherwallet-9yi.com", - "xn--mythrwallet-tbic.com", - "xn--mythrwallt-dnhcf.com", - "xn--mytherwallet-tck.com", - "xn--mythrwallet-pkjc.com", - "xn--mythrwallt-lsicf.com", - "xn--mytherwallet-cok.com", - "xn--mythrwallet-cvjc.com", - "xn--mythrwallt-c2icf.com", - "xn--mytherwallet-csl.com", - "xn--mythrwallet-cwkc.com", - "xn--mythrwallt-c0jcf.com", - "xn--mytherwallet-2d6f.com", - "xn--mythrwallet-019ec.com", - "xn--mythrwallt-yq3ecf.com", - "xn--metherwallet-qlb.com", - "xn--metherwallet-1uf.com", - "xn--metherwallet-iyi.com", - "xn--metherwallet-zhk.com", - "xn--metherwallet-3ml.com", - "xn--mytherwallet-fvb.com", - "xn--myetherwallt-7db.com", - "xn--myetherwallt-leb.com", - "xn--myetherwallt-yeb.com", - "xn--yetherwallet-vjf.com", - "xn--yetherwallet-dfk.com", - "xn--yetherwallet-1t1f.com", - "xn--yetherwallet-634f.com", - "xn--myeherwallet-fpc.com", - "xn--myethewallt-crb.com", - "xn--metherwallet-1vc.com", - "xn--myeherwallt-kbb8039g.com", - "xn--myeherwallet-vk5f.com", - "xn--yethewallet-iw8ejl.com", - "xn--bittrx-th8b.com", - "xn--polniex-n0a.com", - "thekey.vin", - "thekey-vip.com", - "digitexftures.com", - "ethzero-wallet.org", - "zeepln.io", - "wepowers.network", - "wepower.vision", - "seele.promo", - "seele-ico.eu", - "seele-ico.pro", - "syncfab.tech", - "tokensale.syncfab.tech", - "havven.promo", - "havven-ico.com", - "havven-ico.eu", - "hawen.io", - "havven.xyz", - "tomo-coin.io", - "tomocoln.io", - "docai.science", - "tomocoin.network", - "celsius-ico.network", - "celsiuss.network" - ] -}
\ No newline at end of file diff --git a/test/unit/actions/save_account_label_test.js b/test/unit/actions/save_account_label_test.js deleted file mode 100644 index c5ffd6cbf..000000000 --- a/test/unit/actions/save_account_label_test.js +++ /dev/null @@ -1,35 +0,0 @@ -// var jsdom = require('mocha-jsdom') -var assert = require('assert') -var freeze = require('deep-freeze-strict') -var path = require('path') - -var actions = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'actions.js')) -var reducers = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'reducers.js')) - -describe('SAVE_ACCOUNT_LABEL', function () { - it('updates the state.metamask.identities[:i].name property of the state to the action.value.label', function () { - var initialState = { - metamask: { - identities: { - foo: { - name: 'bar', - }, - }, - }, - } - freeze(initialState) - - const action = { - type: actions.SAVE_ACCOUNT_LABEL, - value: { - account: 'foo', - label: 'baz', - }, - } - freeze(action) - - var resultingState = reducers(initialState, action) - assert.equal(resultingState.metamask.identities.foo.name, action.value.label) - }) -}) - diff --git a/test/unit/actions/set_account_label_test.js b/test/unit/actions/set_account_label_test.js new file mode 100644 index 000000000..53ea1d130 --- /dev/null +++ b/test/unit/actions/set_account_label_test.js @@ -0,0 +1,34 @@ +const assert = require('assert') +const freeze = require('deep-freeze-strict') +const path = require('path') + +const actions = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'actions.js')) +const reducers = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'reducers.js')) + +describe('SET_ACCOUNT_LABEL', function () { + it('updates the state.metamask.identities[:i].name property of the state to the action.value.label', function () { + const initialState = { + metamask: { + identities: { + foo: { + name: 'bar', + }, + }, + }, + } + freeze(initialState) + + const action = { + type: actions.SET_ACCOUNT_LABEL, + value: { + account: 'foo', + label: 'baz', + }, + } + freeze(action) + + const resultingState = reducers(initialState, action) + assert.equal(resultingState.metamask.identities.foo.name, action.value.label) + }) +}) + diff --git a/test/unit/app/controllers/address-book-controller.js b/test/unit/app/controllers/address-book-controller.js index 1836dea94..dc4b8e3ff 100644 --- a/test/unit/app/controllers/address-book-controller.js +++ b/test/unit/app/controllers/address-book-controller.js @@ -1,26 +1,26 @@ const assert = require('assert') const AddressBookController = require('../../../../app/scripts/controllers/address-book') -const mockKeyringController = { - memStore: { - getState: function () { - return { - identities: { - '0x0aaa': { - address: '0x0aaa', - name: 'owned', - }, +const stubPreferencesStore = { + getState: function () { + return { + identities: { + '0x0aaa': { + address: '0x0aaa', + name: 'owned', }, - } - }, + }, + } }, -} +}; describe('address-book-controller', function () { var addressBookController beforeEach(function () { - addressBookController = new AddressBookController({}, mockKeyringController) + addressBookController = new AddressBookController({ + preferencesStore: stubPreferencesStore, + }) }) describe('addres book management', function () { diff --git a/test/unit/app/controllers/metamask-controller-test.js b/test/unit/app/controllers/metamask-controller-test.js index 65a6fea09..4bc16e65e 100644 --- a/test/unit/app/controllers/metamask-controller-test.js +++ b/test/unit/app/controllers/metamask-controller-test.js @@ -4,7 +4,7 @@ const clone = require('clone') const nock = require('nock') const createThoughStream = require('through2').obj const MetaMaskController = require('../../../../app/scripts/metamask-controller') -const blacklistJSON = require('../../../stub/blacklist') +const blacklistJSON = require('eth-phishing-detect/src/config') const firstTimeState = require('../../../../app/scripts/first-time-state') const currentNetworkId = 42 @@ -118,7 +118,7 @@ describe('MetaMaskController', function () { [TEST_ADDRESS]: { address: TEST_ADDRESS, name: DEFAULT_LABEL }, }) - await metamaskController.keyringController.saveAccountLabel(TEST_ADDRESS, 'Account Foo') + await metamaskController.preferencesController.setAccountLabel(TEST_ADDRESS, 'Account Foo') assert.deepEqual(metamaskController.getState().identities, { [TEST_ADDRESS]: { address: TEST_ADDRESS, name: 'Account Foo' }, }) @@ -170,14 +170,17 @@ describe('MetaMaskController', function () { beforeEach(function () { address = '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc' identities = { - identities: { - '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc': { - 'address': '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc', - 'name': 'Account 1', - }, + '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc': { + 'address': address, + 'name': 'Account 1', + }, + '0xc42edfcc21ed14dda456aa0756c153f7985d8813': { + 'address': '0xc42edfcc21ed14dda456aa0756c153f7985d8813', + 'name': 'Account 2', }, } - metamaskController.selectFirstIdentity(identities) + metamaskController.preferencesController.store.updateState({ identities }) + metamaskController.selectFirstIdentity() }) it('changes preferences controller select address', function () { diff --git a/test/unit/app/controllers/preferences-controller-test.js b/test/unit/app/controllers/preferences-controller-test.js index 3d903bd5b..e5e751b57 100644 --- a/test/unit/app/controllers/preferences-controller-test.js +++ b/test/unit/app/controllers/preferences-controller-test.js @@ -4,16 +4,91 @@ const PreferencesController = require('../../../../app/scripts/controllers/prefe describe('preferences controller', function () { let preferencesController - before(() => { + beforeEach(() => { preferencesController = new PreferencesController() }) + describe('setAddresses', function () { + it('should keep a map of addresses to names and addresses in the store', function () { + preferencesController.setAddresses([ + '0xda22le', + '0x7e57e2', + ]) + + const {identities} = preferencesController.store.getState() + assert.deepEqual(identities, { + '0xda22le': { + name: 'Account 1', + address: '0xda22le', + }, + '0x7e57e2': { + name: 'Account 2', + address: '0x7e57e2', + }, + }) + }) + + it('should replace its list of addresses', function () { + preferencesController.setAddresses([ + '0xda22le', + '0x7e57e2', + ]) + preferencesController.setAddresses([ + '0xda22le77', + '0x7e57e277', + ]) + + const {identities} = preferencesController.store.getState() + assert.deepEqual(identities, { + '0xda22le77': { + name: 'Account 1', + address: '0xda22le77', + }, + '0x7e57e277': { + name: 'Account 2', + address: '0x7e57e277', + }, + }) + }) + }) + + describe('setAccountLabel', function () { + it('should update a label for the given account', function () { + preferencesController.setAddresses([ + '0xda22le', + '0x7e57e2', + ]) + + assert.deepEqual(preferencesController.store.getState().identities['0xda22le'], { + name: 'Account 1', + address: '0xda22le', + }) + + + preferencesController.setAccountLabel('0xda22le', 'Dazzle') + assert.deepEqual(preferencesController.store.getState().identities['0xda22le'], { + name: 'Dazzle', + address: '0xda22le', + }) + }) + }) + + describe('getTokens', function () { + it('should return an empty list initially', async function () { + await preferencesController.setSelectedAddress('0x7e57e2') + + const tokens = preferencesController.getTokens() + assert.equal(tokens.length, 0, 'empty list of tokens') + }) + }) + describe('addToken', function () { it('should add that token to its state', async function () { const address = '0xabcdef1234567' const symbol = 'ABBR' const decimals = 5 + await preferencesController.setSelectedAddress('0x7e57e2') await preferencesController.addToken(address, symbol, decimals) const tokens = preferencesController.getTokens() @@ -30,6 +105,7 @@ describe('preferences controller', function () { const symbol = 'ABBR' const decimals = 5 + await preferencesController.setSelectedAddress('0x7e57e2') await preferencesController.addToken(address, symbol, decimals) const newDecimals = 6 @@ -43,6 +119,44 @@ describe('preferences controller', function () { assert.equal(added.symbol, symbol, 'set symbol correctly') assert.equal(added.decimals, newDecimals, 'updated decimals correctly') }) + + it('should allow adding tokens to two separate addresses', async function () { + const address = '0xabcdef1234567' + const symbol = 'ABBR' + const decimals = 5 + + await preferencesController.setSelectedAddress('0x7e57e2') + await preferencesController.addToken(address, symbol, decimals) + assert.equal(preferencesController.getTokens().length, 1, 'one token added for 1st address') + + await preferencesController.setSelectedAddress('0xda22le') + await preferencesController.addToken(address, symbol, decimals) + assert.equal(preferencesController.getTokens().length, 1, 'one token added for 2nd address') + }) + }) + + describe('removeToken', function () { + it('should remove the only token from its state', async function () { + await preferencesController.setSelectedAddress('0x7e57e2') + await preferencesController.addToken('0xa', 'A', 5) + await preferencesController.removeToken('0xa') + + const tokens = preferencesController.getTokens() + assert.equal(tokens.length, 0, 'one token removed') + }) + + it('should remove a token from its state', async function () { + await preferencesController.setSelectedAddress('0x7e57e2') + await preferencesController.addToken('0xa', 'A', 4) + await preferencesController.addToken('0xb', 'B', 5) + await preferencesController.removeToken('0xa') + + const tokens = preferencesController.getTokens() + assert.equal(tokens.length, 1, 'one token removed') + + const [token1] = tokens + assert.deepEqual(token1, {address: '0xb', symbol: 'B', decimals: 5}) + }) }) }) diff --git a/test/unit/migrations/026-test.js b/test/unit/migrations/026-test.js new file mode 100644 index 000000000..b3f5470cf --- /dev/null +++ b/test/unit/migrations/026-test.js @@ -0,0 +1,41 @@ +const assert = require('assert') +const migration26 = require('../../../app/scripts/migrations/026') +const oldStorage = { + 'meta': {'version': 25}, + 'data': { + 'PreferencesController': {}, + 'KeyringController': { + 'walletNicknames': { + '0x1e77e2': 'Test Account 1', + '0x7e57e2': 'Test Account 2', + }, + }, + }, +} + +describe('migration #26', () => { + it('should move the identities from KeyringController', (done) => { + migration26.migrate(oldStorage) + .then((newStorage) => { + const identities = newStorage.data.PreferencesController.identities + assert.deepEqual(identities, { + '0x1e77e2': {name: 'Test Account 1', address: '0x1e77e2'}, + '0x7e57e2': {name: 'Test Account 2', address: '0x7e57e2'}, + }) + assert.strictEqual(newStorage.data.KeyringController.walletNicknames, undefined) + done() + }) + .catch(done) + }) + + it('should successfully migrate first time state', (done) => { + migration26.migrate({ + meta: {}, + data: require('../../../app/scripts/first-time-state'), + }) + .then((migratedData) => { + assert.equal(migratedData.meta.version, migration26.version) + done() + }).catch(done) + }) +}) diff --git a/ui/app/accounts/new-account/index.js b/ui/app/accounts/new-account/index.js index 207cf7760..795bd7ce6 100644 --- a/ui/app/accounts/new-account/index.js +++ b/ui/app/accounts/new-account/index.js @@ -24,7 +24,7 @@ function mapDispatchToProps (dispatch) { dispatch(actions.showModal({ name: 'EXPORT_PRIVATE_KEY' })) }, hideModal: () => dispatch(actions.hideModal()), - saveAccountLabel: (address, label) => dispatch(actions.saveAccountLabel(address, label)), + setAccountLabel: (address, label) => dispatch(actions.setAccountLabel(address, label)), } } diff --git a/ui/app/actions.js b/ui/app/actions.js index 2d238b2f8..57bffb046 100644 --- a/ui/app/actions.js +++ b/ui/app/actions.js @@ -124,8 +124,8 @@ var actions = { SHOW_PRIVATE_KEY: 'SHOW_PRIVATE_KEY', showPrivateKey: showPrivateKey, exportAccountComplete, - SAVE_ACCOUNT_LABEL: 'SAVE_ACCOUNT_LABEL', - saveAccountLabel: saveAccountLabel, + SET_ACCOUNT_LABEL: 'SET_ACCOUNT_LABEL', + setAccountLabel, // tx conf screen COMPLETED_TX: 'COMPLETED_TX', TRANSACTION_ERROR: 'TRANSACTION_ERROR', @@ -1598,13 +1598,13 @@ function showPrivateKey (key) { } } -function saveAccountLabel (account, label) { +function setAccountLabel (account, label) { return (dispatch) => { dispatch(actions.showLoadingIndication()) - log.debug(`background.saveAccountLabel`) + log.debug(`background.setAccountLabel`) return new Promise((resolve, reject) => { - background.saveAccountLabel(account, label, (err) => { + background.setAccountLabel(account, label, (err) => { dispatch(actions.hideLoadingIndication()) if (err) { @@ -1613,7 +1613,7 @@ function saveAccountLabel (account, label) { } dispatch({ - type: actions.SAVE_ACCOUNT_LABEL, + type: actions.SET_ACCOUNT_LABEL, value: { account, label }, }) diff --git a/ui/app/components/modals/account-details-modal.js b/ui/app/components/modals/account-details-modal.js index d9885daf5..5607cf051 100644 --- a/ui/app/components/modals/account-details-modal.js +++ b/ui/app/components/modals/account-details-modal.js @@ -25,7 +25,7 @@ function mapDispatchToProps (dispatch) { dispatch(actions.showModal({ name: 'EXPORT_PRIVATE_KEY' })) }, hideModal: () => dispatch(actions.hideModal()), - saveAccountLabel: (address, label) => dispatch(actions.saveAccountLabel(address, label)), + setAccountLabel: (address, label) => dispatch(actions.setAccountLabel(address, label)), } } @@ -49,7 +49,7 @@ AccountDetailsModal.prototype.render = function () { selectedIdentity, network, showExportPrivateKeyModal, - saveAccountLabel, + setAccountLabel, } = this.props const { name, address } = selectedIdentity @@ -57,7 +57,7 @@ AccountDetailsModal.prototype.render = function () { h(EditableLabel, { className: 'account-modal__name', defaultValue: name, - onSubmit: label => saveAccountLabel(address, label), + onSubmit: label => setAccountLabel(address, label), }), h(QrView, { diff --git a/ui/app/components/modals/edit-account-name-modal.js b/ui/app/components/modals/edit-account-name-modal.js index c79645dbf..5681a3cad 100644 --- a/ui/app/components/modals/edit-account-name-modal.js +++ b/ui/app/components/modals/edit-account-name-modal.js @@ -18,8 +18,8 @@ function mapDispatchToProps (dispatch) { hideModal: () => { dispatch(actions.hideModal()) }, - saveAccountLabel: (account, label) => { - dispatch(actions.saveAccountLabel(account, label)) + setAccountLabel: (account, label) => { + dispatch(actions.setAccountLabel(account, label)) }, } } @@ -41,7 +41,7 @@ module.exports = connect(mapStateToProps, mapDispatchToProps)(EditAccountNameMod EditAccountNameModal.prototype.render = function () { - const { hideModal, saveAccountLabel, identity } = this.props + const { hideModal, setAccountLabel, identity } = this.props return h('div', {}, [ h('div.flex-column.edit-account-name-modal-content', { @@ -69,7 +69,7 @@ EditAccountNameModal.prototype.render = function () { h('button.btn-clear.edit-account-name-modal-save-button.allcaps', { onClick: () => { if (this.state.inputText.length !== 0) { - saveAccountLabel(identity.address, this.state.inputText) + setAccountLabel(identity.address, this.state.inputText) hideModal() } }, diff --git a/ui/app/components/modals/new-account-modal.js b/ui/app/components/modals/new-account-modal.js index 0635b3f72..a66a3ed4a 100644 --- a/ui/app/components/modals/new-account-modal.js +++ b/ui/app/components/modals/new-account-modal.js @@ -95,7 +95,7 @@ const mapDispatchToProps = dispatch => { dispatch(actions.addNewAccount()) .then((newAccountAddress) => { if (newAccountName) { - dispatch(actions.saveAccountLabel(newAccountAddress, newAccountName)) + dispatch(actions.setAccountLabel(newAccountAddress, newAccountName)) } dispatch(actions.hideModal()) }) diff --git a/ui/app/components/pages/create-account/index.js b/ui/app/components/pages/create-account/index.js index 0962477d8..475261253 100644 --- a/ui/app/components/pages/create-account/index.js +++ b/ui/app/components/pages/create-account/index.js @@ -75,7 +75,7 @@ const mapDispatchToProps = dispatch => ({ dispatch(actions.showModal({ name: 'EXPORT_PRIVATE_KEY' })) }, hideModal: () => dispatch(actions.hideModal()), - saveAccountLabel: (address, label) => dispatch(actions.saveAccountLabel(address, label)), + setAccountLabel: (address, label) => dispatch(actions.setAccountLabel(address, label)), }) module.exports = connect(mapStateToProps, mapDispatchToProps)(CreateAccountPage) diff --git a/ui/app/components/pages/create-account/new-account.js b/ui/app/components/pages/create-account/new-account.js index 40fa584be..03a5ee72d 100644 --- a/ui/app/components/pages/create-account/new-account.js +++ b/ui/app/components/pages/create-account/new-account.js @@ -87,7 +87,7 @@ const mapDispatchToProps = dispatch => { return dispatch(actions.addNewAccount()) .then(newAccountAddress => { if (newAccountName) { - dispatch(actions.saveAccountLabel(newAccountAddress, newAccountName)) + dispatch(actions.setAccountLabel(newAccountAddress, newAccountName)) } }) }, diff --git a/ui/app/reducers/metamask.js b/ui/app/reducers/metamask.js index bb35cf990..9afaf6a50 100644 --- a/ui/app/reducers/metamask.js +++ b/ui/app/reducers/metamask.js @@ -163,7 +163,7 @@ function reduceMetamask (state, action) { selectedTokenAddress: action.value, }) - case actions.SAVE_ACCOUNT_LABEL: + case actions.SET_ACCOUNT_LABEL: const account = action.value.account const name = action.value.label const id = {} |