diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 00000000..5171c540
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,2 @@
+node_modules
+npm-debug.log
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 3ba02bf0..aa98d8da 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,5 @@
node_modules
npm-debug.log
-_cache
-_site
-config.js
\ No newline at end of file
+config.json
+cache.db
+dist
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 00000000..72a52267
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,11 @@
+FROM node:10
+
+ENV NODE_ENV=production
+WORKDIR /usr/src/EtherScamDB
+
+COPY package*.json ./
+RUN npm install --only=production
+COPY . .
+EXPOSE 80
+
+CMD ["npm", "start"]
\ No newline at end of file
diff --git a/README.md b/README.md
index 190396e7..f1549cb3 100644
--- a/README.md
+++ b/README.md
@@ -1,33 +1,34 @@
-![EtherScamDB Logotype](https://raw.githubusercontent.com/MrLuit/EtherScamDB/master/_static/logo/logotype-readme.png)
+![EtherScamDB Logotype](https://raw.githubusercontent.com/MrLuit/EtherScamDB/master/assets/logo.png)
# Ethereum Scam Database
*An open-source database to keep track of all the current ethereum scams*
+## Why should I run it myself?
+
+Running it yourself will mean you can have your own instance of EtherScamDb so you will have a GUI and an API in case for whatever reason the etherscamdb.info domain is down. This is important to know as products start integrating with our APIs and you will want to have the option of privacy - for example, checking our APIs for specific addresses especially in an integration where we are checking if the address is blacklisted could be a privacy concern for you.
+
## Usage
Make sure you have both [Node.JS](https://nodejs.org/en/download/) and [Git](https://git-scm.com/downloads) installed.
-Rename `config.exmaple.js` to `config.js` and replace the placeholders with your keys.
-
Then, open a command line anywhere and run the following commands:
> git clone https://github.com/MrLuit/EtherScamDB.git
-> npm install
+> cd EtherScamDB
-> node run.js
+> npm install
-The command line should now exit, asking you to update the config.js file with correct values. Please use your own API keys. When you're done, launch run.js again:
+> npm run electron
-> node run.js
+The electron app will now start!
-Generating should take a couple of minutes the first time or after a clean, but when `cache.json` is already present it should launch instantly.
+## Docker
-## Flags
+(make sure config.json is already existent)
-- `--clean` Clean up all the old files and folders
-- `--update` Manually update all content
+> docker-compose up
## Contribute
@@ -35,9 +36,8 @@ Fork this project and edit `_data/data.yaml`. Every item can have the following
- **id**: A unique incremental integer
- **name**: The title of the scam, should probably not be longer than 64 characters
-- **status**: The status of a scam. If `status` isn't provided and `url` is, status will be autogenerated with the `--update` flag **(Optional)**
-- **description**: A full description for the scam **(Optional)**
- **url**: The protocol + hostname for a scam website, without a trailing `/` **(Optional)**
+- **description**: A full description for the scam **(Optional)**
- **category**: The category under which the item falls **(Optional)**
- **addresses**: An array of all ethereum addresses that were involved in this scam, with leading '0x' **(Optional)**
diff --git a/_data/metamaskImports.json b/_data/metamaskImports.json
deleted file mode 100644
index 14a890fe..00000000
--- a/_data/metamaskImports.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/_data/migrate.js b/_data/migrate.js
new file mode 100644
index 00000000..6813944a
--- /dev/null
+++ b/_data/migrate.js
@@ -0,0 +1,23 @@
+const fs = require('fs');
+const yaml = require('js-yaml');
+
+/* Retrieve old YAML objects */
+const oldScamEntries = yaml.safeLoad(fs.readFileSync('./scams.yaml','utf8'));
+const oldVerifiedEntries = yaml.safeLoad(fs.readFileSync('./legit_urls.yaml','utf8'));
+
+/* scams.yaml: remove every 'id' and 'name' property */
+const newScamEntries = oldScamEntries.map(entry => {
+ delete entry.id;
+ delete entry.name;
+ return entry;
+});
+
+/* legit_urls.yaml: remove every 'id' property */
+const newVerifiedEntries = oldVerifiedEntries.map(entry => {
+ delete entry.id;
+ return entry;
+});
+
+/* Write new YAML to files */
+fs.writeFileSync('./scams.yaml',yaml.safeDump(newScamEntries,{ lineWidth: 99999999, indent: 4 }));
+fs.writeFileSync('./legit_urls.yaml',yaml.safeDump(newVerifiedEntries,{ lineWidth: 99999999, indent: 4 }));
\ No newline at end of file
diff --git a/_data/scams.yaml b/_data/scams.yaml
index 82cc253f..a89f5991 100644
--- a/_data/scams.yaml
+++ b/_data/scams.yaml
@@ -3158,7 +3158,7 @@
url: 'http://xn--mythrwallt-yq3ecf.com'
category: Phishing
subcategory: MyEtherWallet
- description: 'Fake Idex market phishing for keys. Reported address: 0x85f3e26a776c06338722d263406f260dcd79962e'
+ description: Homoglyph
-
id: 463
name: xn--metherwallet-qlb.com
@@ -16251,8 +16251,8 @@
id: 2550
name: ethereum-code.com
url: 'http://ethereum-code.com'
- category: Scamming
- subcategory: Pyramid Scheme
+ category: Phishing
+ subcategory: ?
description: 'Using Ethereum name guaranteeing $10k a week'
-
id: 2551
@@ -17737,7 +17737,6 @@
addresses:
- '0xAC1a4f4D49715e31f54CB8e0bf867Bb9170C10Cb'
- '0x08986f5CecD3cb8882E4A34A16961e3124377291'
- - '0x8B1b4F3A25444005ecD37f7b0c12BC5078c13443'
-
id: 2739
name: twitter.com/VitalikButeriin
@@ -19096,6 +19095,13 @@
category: Phishing
subcategory: LocalEthereum
description: 'Fake LocalEthereum site'
+-
+ id: 2911
+ name: huobipro.com
+ url: 'https://huobipro.com'
+ category: Phishing
+ subcategory: Huobi
+ description: 'Fake Huobi site'
-
id: 2912
name: leadcoins.network
@@ -22617,7 +22623,6 @@
description: 'Trust trading scam site'
addresses:
- '0x860B62006Ea05A05c7638D16a106858450bde336'
- - '0x09909c850F0e3019A645e0530AA37798dbA59EB1'
-
id: 3338
name: mithriltoken.tech
@@ -24347,7 +24352,6 @@
description: 'Trust trading scam site'
addresses:
- '0x45f7582fd6445918912977b9460475b5524cF962'
- - '0x05f71263372AC109Cd13Faa86d13a0e5830FCEDc'
-
id: 3552
name: quick.payeths.com
@@ -26272,7 +26276,7 @@
url: 'https://xn--mytherwalet-obb56i.com'
category: Phishing
subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet - IDN homograph attack domain. Reported address: 0x4F223fCb9BEb2d560f8D55c17D7Ce5Aa4B7BdC5B 0x539832908A06ff5cDD5Abc84db81C2a95F70eB33'
+ description: 'Fake MyEtherWallet - IDN homograph attack domain'
-
id: 3788
name: xn--myethrwalet-6qb77c.com
@@ -30062,7 +30066,6 @@
description: 'Trust trading scam site'
addresses:
- '0x224B9f4666472682f3e805f4dC1e0Fc39B7B96fB'
- - '0xC597498f0d102036ff7bf9fDa401F3174d2E9D96'
-
id: 4259
name: eth-giveaway.surge.sh
@@ -30392,7 +30395,6 @@
- '0x83D7Cb758C30d067e99E9f52F9e4f987101aB888'
- '0x61cbEf9dB89E5D397Bdde7Ff9095bEDe35d4eeb5'
- '0x9844F5C5F9aA7146a74ffC7b9227742acFA71dEa'
- - '0x6Dd3262c18cD5a0f03Dd8f2c0dB5b19b8fb92C85'
-
id: 4298
name: ethereum-claim.org
@@ -30514,7 +30516,7 @@
url: 'https://eosprivate.io'
category: Phishing
subcategory: EOS
- description: 'Fake KYC directing users to a Fake MyEtherWallet myetherwallet.com.api.signmessage.me/signmsg.html via bit.ly/2tj9f2U+ and myetherwallet.com.api.root.signmsg.me/signmsg.html via bitly.com/2thn41W+ Reported address: 0xA125929ba78213a27D8695B276f55D6aba567B01'
+ description: 'Fake KYC directing users to a Fake MyEtherWallet myetherwallet.com.api.signmessage.me/signmsg.html via bit.ly/2tj9f2U+ and myetherwallet.com.api.root.signmsg.me/signmsg.html via bitly.com/2thn41W+'
-
id: 4313
name: myetherwallet.com.api.signmessage.me
@@ -30992,7 +30994,6 @@
description: 'Trust trading scam site'
addresses:
- '0xba8A5cF96D605B630025E3e2C8bd177391e32122'
- - '0x42E0d29d1cb3A28d748A7aC2D06d679329022C72'
-
id: 4373
name: free-ethers.org
@@ -31912,9 +31913,6 @@
- '0x2a206bca8ee7c324af1b67ae05373a59a3d4502d'
- '0xB6eCd180F5CBB9167147394841D31f94EfF77DBf'
- '0x79B570F107F07589244C76Ad8fd9a7cca0fb80ef'
- - '0xed6B90c028310122AF361ce84a4604afBED40910'
- - '0x76524f023C42Cb4018D24b8097959B2ecF8fA8EA'
- - '0x3F92555D98cCEe1822565F8b4e0C8bf406ebb674'
-
id: 4480
name: dapp.doubledouble.io
@@ -32636,7 +32634,6 @@
addresses:
- '0x3BF351A62dF57DCE8512b136daA4cd6EBE2DdA91'
- '0x051005cDCecd916FB8b98643d923646Acc7e07cd'
- - '0x7D73f38770997f30BB6Dfa2B8Da184f2CFebA6C6'
-
id: 4565
name: event-eth-ada.uk
@@ -33652,8 +33649,6 @@
description: 'Trust trading scam site.'
addresses:
- '0x1D7BC400d3c6d9D37EC54D0e729cbaDD06dc0390'
- - '0xbC55B0f2DbAF492FC8adf35c0f9939eb5Fe92131'
- - '0xb0Ce77a4F5c02b92235D6829c94b2D27f939aBE1'
-
id: 4690
name: limited-promo.org
@@ -34232,3029 +34227,3 @@
category: Phishing
subcategory: Idex
description: 'Fake Idex market phishing for keys with POST /save.php'
--
- id: 4761
- name: blvonance.com
- url: 'https://blvonance.com'
- category: Phishing
- subcategory: Binance
- description: 'Reported as a fake Binance phishing for logins - Suspicious domain'
--
- id: 4762
- name: airdrop-event.info
- url: 'http://airdrop-event.info'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0xb0d46Eb7e6Aac501BcCE47F05aCe37527B8B329a'
--
- id: 4763
- name: currency.promo
- url: 'http://currency.promo'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0xD8D0506ED425364EE126819E8b73Fc3160C39D49'
--
- id: 4764
- name: czgive.site
- url: 'http://czgive.site'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x44610ceE8C56D34e80468243065e3a319250e32a'
--
- id: 4765
- name: verify.bonuseth.info
- url: 'http://verify.bonuseth.info'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x429D386Adc915adE21593609B1b89b976B2F2af4'
--
- id: 4766
- name: get.bigethgift.com
- url: 'http://get.bigethgift.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0xC71943c6411DD88aAD1E5b69Da551F16596d73cC'
--
- id: 4767
- name: bigethgift.com
- url: 'http://bigethgift.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0xC71943c6411DD88aAD1E5b69Da551F16596d73cC'
--
- id: 4768
- name: ethsafe.info
- url: 'http://ethsafe.info'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x1cBc864EA74e0f23F103dF8623Ba56a01b1eDa59'
--
- id: 4769
- name: ethnewpromoaway.com
- url: 'http://ethnewpromoaway.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0xB75Be435Ee985Ab09f99299A90b03937B33855c6'
--
- id: 4770
- name: btcgiveaway.org
- url: 'http://btcgiveaway.org'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site. Bitcoin address: 17mKwVQHq7YXk9bwocPjnnypbzPEWTnN2o'
--
- id: 4771
- name: btcpromogivegroup.com
- url: 'http://btcpromogivegroup.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site. Bitcoin address: 3LfmhNmuE3vXuruFG9nHwT9heMYvceahhQ'
--
- id: 4772
- name: metamaskpro.io
- url: 'http://metamaskpro.io'
- category: Phishing
- subcategory: Metamask
- description: 'Promoting a fake MetaMask - https://chrome.google.com/webstore/detail/metamask-pro/bjhhmlocoehibjnebcaedkhecggonhne/'
--
- id: 4773
- name: www-bitfinex.com
- url: 'http://www-bitfinex.com'
- category: Phishing
- subcategory: Bitfinex
- description: 'Fake Bitfinex phishing for private keys - https://twitter.com/sniko_/status/1020078544922214400'
--
- id: 4774
- name: ethzerdelta.com
- url: 'http://ethzerdelta.com'
- category: Phishing
- subcategory: EtherDelta
- description: 'Fake EtherDelta'
--
- id: 4775
- name: forkdelta.su
- url: 'http://forkdelta.su'
- category: Phishing
- subcategory: ForkDelta
- description: 'Fake ForkDelta'
--
- id: 4776
- name: forkdeltagithub.info
- url: 'http://forkdeltagithub.info'
- category: Phishing
- subcategory: ForkDelta
- description: 'Fake ForkDelta'
--
- id: 4777
- name: myethrewallett.com
- url: 'http://myethrewallett.com'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet'
--
- id: 4778
- name: eosauthority.services
- url: 'https://eosauthority.services'
- category: Phishing
- subcategory: EOS
- description: 'Fake EOS site phishing for private keys via POST store.php'
--
- id: 4779
- name: blocokchain.top
- url: 'https://blocokchain.top'
- category: Phishing
- subcategory: Blockchain
- description: 'Fake Blockchain phishing for logins'
--
- id: 4780
- name: xn--binanc-n4a.exchange
- url: 'https://xn--binanc-n4a.exchange'
- category: Phishing
- subcategory: Binance
- description: 'Fake binance. IDN homograph attack domain. Parked at time of blacklist'
--
- id: 4781
- name: idex.market.transactlon.info
- url: 'https://idex.market.transactlon.info'
- category: Phishing
- subcategory: Idex
- description: 'Fake Idex market phishing for keys'
--
- id: 4782
- name: satoshi-giveaway.org
- url: 'http://satoshi-giveaway.org'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam - Google Plus group'
--
- id: 4783
- name: buterinfree.org
- url: 'http://buterinfree.org'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam - Google Plus group'
--
- id: 4784
- name: bdinamce.com
- url: 'http://bdinamce.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site. Bitcoin address: 34oxKKuq8g7W23gvDD6K3bpbTVCg1FLYGb 3LfmhNmuE3vXuruFG9nHwT9heMYvceahhQ'
--
- id: 4785
- name: go.ether10000.win
- url: 'http://go.ether10000.win'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0xe2DAb81EFe425bDD0A64E9c69393f0243d7d672F'
--
- id: 4786
- name: event-eth-giveaway.com
- url: 'http://event-eth-giveaway.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0xf70c78be20884e3e90a8cabd46620f1823b2d4b3'
--
- id: 4787
- name: login.blockchaim.co
- url: 'https://login.blockchaim.co'
- category: Phishing
- subcategory: Blockchain
- description: 'Fake Blockchain phishing for logins'
--
- id: 4788
- name: mcafee.promo
- url: 'http://mcafee.promo'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0xD8D0506ED425364EE126819E8b73Fc3160C39D49'
--
- id: 4789
- name: eth60.top
- url: 'http://eth60.top'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0xab7ec7596fc05bc55afc07008cc06c1193ed6f9a'
--
- id: 4790
- name: getfree-eth.org
- url: 'http://getfree-eth.org'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x2B1C266E2a39a7a30aED472Fad47d6b6AB953F7e'
--
- id: 4791
- name: vaxx.co
- url: 'http://vaxx.co'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0xD8D0506ED425364EE126819E8b73Fc3160C39D49'
--
- id: 4792
- name: cryptoether.info
- url: 'http://cryptoether.info'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0xA4F06F1afB7B8589D1F4609257e5010C30eD3D2b'
- - '0x9e5a6b7A73C6b390Aa418f5B4CD3a8f6d1572810'
- - '0x00D07F8C2194F14C8D694680f2B8C0BE66d4D5e9'
--
- id: 4793
- name: coincapitals.org
- url: 'http://coincapitals.org'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x68AaCF41FA22ecD5ca0BB102dA46b0f503E2E168'
--
- id: 4794
- name: bonancre.com
- url: 'https://bonancre.com'
- category: Phishing
- subcategory: Binance
- description: 'Fake Binance phishing for logins'
--
- id: 4795
- name: coinssafe.org
- url: 'http://coinssafe.org'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x68AaCF41FA22ecD5ca0BB102dA46b0f503E2E168'
--
- id: 4796
- name: getethernow.org
- url: 'http://getethernow.org'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x7aA266963882F13eB0Ab5920E16aFeF2F26cDa8f'
--
- id: 4797
- name: officialairdrop.com
- url: 'http://officialairdrop.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x451ba6133b64829398fe074ae649a7998acb16f3'
--
- id: 4798
- name: eth-event.com
- url: 'http://eth-event.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x8729Abb00a517bBA3d615ed13E7C9C55aB311D41'
--
- id: 4799
- name: ethclose.info
- url: 'http://ethclose.info'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x74a01390635D8D4016827fA3AfB1A0f6c33eD8d8'
--
- id: 4800
- name: freecoindrop.com
- url: 'http://freecoindrop.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x82603fEc3241b319aC1a0470f2C08BD90461A355'
--
- id: 4801
- name: binance-acess.com
- url: 'https://binance-acess.com'
- category: Phishing
- subcategory: Binance
- description: 'Fake Binance phishing for logins - https://twitter.com/jmoconnor415/status/1020784200213938177'
--
- id: 4802
- name: sociall.ooo
- url: 'https://sociall.ooo'
- category: Phishing
- subcategory: Sociall
- description: 'Fake Social.io crowdsale site - t.me/sociallairdropbot'
--
- id: 4803
- name: ether-gift.website
- url: 'http://ether-gift.website'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x52b949fb4678c20873135ce6b3727949432af1d7'
--
- id: 4804
- name: authorize-transfer.droppages.com
- url: 'http://authorize-transfer.droppages.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x5e3eC117baf30044A1b08267208a130E7D69704E'
--
- id: 4805
- name: login-binance.com
- url: 'https://login-binance.com'
- category: Phishing
- subcategory: Binance
- description: 'Suspicious binance domain targetting login'
--
- id: 4806
- name: authhitbtc.com
- url: 'https://authhitbtc.com'
- category: Phishing
- subcategory: Hitbtc
- description: 'Suspcious hitbtc domain targetting login'
--
- id: 4807
- name: hltbtc.cam
- url: 'https://hltbtc.cam'
- category: Phishing
- subcategory: Hitbtc
- description: 'Fake Hitbtc phishing for logins'
--
- id: 4808
- name: hiitdtc.com
- url: 'https://hiitdtc.com'
- category: Phishing
- subcategory: Hitbtc
- description: 'Suspcious hitbtc domain phishing for logins'
--
- id: 4809
- name: idex-markt-roosen-gmbh.com
- url: 'https://idex-markt-roosen-gmbh.com'
- category: Phishing
- subcategory: Idex
- description: 'Suspicious domain targetting idex users (being iframed on idex-market.me)'
--
- id: 4810
- name: idex-market.me
- url: 'https://idex-market.me'
- category: Phishing
- subcategory: Idex
- description: 'Suspicious domain targetting idex users (iframing idex-markt-roosen-gmbh.com)'
--
- id: 4811
- name: iclex-market.com
- url: 'https://iclex-market.com'
- category: Phishing
- subcategory: Idex
- description: 'Suspicious domain targetting idex users'
--
- id: 4812
- name: xn--dex-market-58a.com
- url: 'https://xn--dex-market-58a.com'
- category: Phishing
- subcategory: Idex
- description: 'Suspicious domain targetting idex users'
--
- id: 4813
- name: idex-markett.com
- url: 'https://idex-markett.com'
- category: Phishing
- subcategory: Idex
- description: 'Suspicious domain targetting idex users'
--
- id: 4814
- name: medium.getethernow.top
- url: 'http://medium.getethernow.top'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x2B164ae662a0AB1832C87cb4A226EFEC56219FB6'
--
- id: 4815
- name: verify.ethereumnow.top
- url: 'http://verify.ethereumnow.top'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x2B164ae662a0AB1832C87cb4A226EFEC56219FB6'
--
- id: 4816
- name: stellar-w.com
- url: 'https://stellar-w.com'
- category: Phishing
- subcategory: Stellar
- description: 'Fake Stellar Web Wallet'
--
- id: 4817
- name: bitfinex.im
- url: 'https://bitfinex.im'
- category: Phishing
- subcategory: Bitfinex
- description: 'Fake Bitfinex phishing for logins - also has an admin login at /admm/'
--
- id: 4818
- name: dailycurrency.ml
- url: 'http://dailycurrency.ml'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0xFc6BB078EC56C85E8f7adDFed0F2dE6CB86ee3c3'
--
- id: 4819
- name: ethgivewaypromo.info
- url: 'http://ethgivewaypromo.info'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0xC597498f0d102036ff7bf9fDa401F3174d2E9D96'
--
- id: 4820
- name: xn--etherem-y24c.com
- url: 'https://xn--etherem-y24c.com'
- category: Phishing
- subcategory: Ethereum
- description: 'Fake Ethereum site - IDN homograph attack domain - directing users to xn--mythrwallt-yq3ecf.com/#eth-staking - email sent from info@mail5-ethereum.com'
--
- id: 4821
- name: giveaway-binance.com
- url: 'http://giveaway-binance.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x6B0A6C142905ce6c1db7276d8878a3e7846675d9'
--
- id: 4822
- name: ethereumclaim.net
- url: 'http://ethereumclaim.net'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0xf19c11540E012227466a59cadE5F7fCf8dC1d1D1'
--
- id: 4823
- name: ethescan.info
- url: 'http://ethescan.info'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x68e45B998240d77FbE30BE84bd8397a51F0EF962'
--
- id: 4824
- name: verify.getbigeth.com
- url: 'http://verify.getbigeth.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x215e7E7eDEfdA37EB39df17B8b91DA9a60d85530'
--
- id: 4825
- name: getbigeth.com
- url: 'http://getbigeth.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x215e7E7eDEfdA37EB39df17B8b91DA9a60d85530'
--
- id: 4826
- name: okexgiveaway.com
- url: 'http://okexgiveaway.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x13B56F970b8982b1b4A76982876086ecAd4756dA'
--
- id: 4827
- name: medium-promo.top
- url: 'http://medium-promo.top'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site - linking to verify.medium-promo.top/payment.php (currently down)'
--
- id: 4828
- name: myetherwallet-coinin.top
- url: 'https://myetherwallet-coinin.top'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Suspicious MyEtherWallet domain'
--
- id: 4829
- name: binance.bnb-token.sale
- url: 'https://binance.bnb-token.sale'
- category: Phishing
- subcategory: Binance
- description: 'Fake Binance token sale site'
- addresses:
- - '0x3Fc7cA472D19F24F544fCd79bcA992019650c1Eb'
--
- id: 4830
- name: bitfanex.com
- url: 'https://bitfanex.com'
- category: Phishing
- subcategory: Bitfinex
- description: 'Fake Bitfinex phishing for logins with an admin panel /admm/'
--
- id: 4831
- name: idexx-corpcom.com
- url: 'https://idexx-corpcom.com'
- category: Phishing
- subcategory: Idex
- description: 'Fake Idex market phishing for keys'
--
- id: 4832
- name: bnb-token.org
- url: 'https://bnb-token.org'
- category: Phishing
- subcategory: Binance
- description: 'Fake Binance token sale site'
- addresses:
- - '0xBC025972d6DCEbE52793A2B19dE53CF621Cf1EDc'
--
- id: 4833
- name: promo.etherpay.site
- url: 'http://promo.etherpay.site'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x562109A47a469CA0c385d654Bb0AF14c98cf6E12'
--
- id: 4834
- name: blog.mediumpromo.top
- url: 'http://blog.mediumpromo.top'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x5cf03f522dcbe4efeed2462759da179b50230969'
--
- id: 4835
- name: medium-promotion.com
- url: 'http://medium-promotion.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site - directing users to celebration-eth.com'
- addresses:
- - '0xed6B90c028310122AF361ce84a4604afBED40910'
--
- id: 4836
- name: eosgas.io
- url: 'https://eosgas.io'
- category: Phishing
- subcategory: EOS
- description: 'Fake KYC form linking users to a fake MyEtherWallet myetherwallet.com.root5.icu/signmsg.html via bit.ly/2NLjLsi+'
--
- id: 4837
- name: internationalstudy.online
- url: 'https://internationalstudy.online'
- category: Phishing
- subcategory: Idex
- description: 'Fake Idex market phishing for keys'
--
- id: 4838
- name: myetherwallet.com.root5.icu
- url: 'https://myetherwallet.com.root5.icu'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet. Reported address: 0x51aF777899f0E81FbB69836E9255cC5bab7a5842 0x58192aCD70c8F198337Ee9eB90D96B255643636A 0x6040E8DeeC06c448671b11676ceD4BF742E10031'
--
- id: 4839
- name: xn--myetherwale-jb9e.com
- url: 'https://xn--myetherwale-jb9e.com'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet - IDN homograph attack domain'
--
- id: 4840
- name: eosgas.co
- url: 'https://eosgas.co'
- category: Phishing
- subcategory: EOS
- description: 'Fake EOS airdrop KYC form directing users to a fake MyEtherWallet myetherwallet.com.api4.icu/signmsg.html via bit.ly/2JVvRwS+ Reported address: 0x51aF777899f0E81FbB69836E9255cC5bab7a5842'
--
- id: 4841
- name: myetherwallet.com.api4.icu
- url: 'https://myetherwallet.com.api4.icu'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet. Reported address: 0xBCA08E0DB1634B272E42630e2f1E7C4b92148B8d'
--
- id: 4842
- name: get-ethereum.net
- url: 'http://get-ethereum.net'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x30faC621bD26F6828551a79807ed3c2a70b1b082'
--
- id: 4843
- name: airdrops.promo
- url: 'http://airdrops.promo'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x76bb5b6177096b337c79F2f948Aa08b0db5f5211'
--
- id: 4844
- name: binance.claims
- url: 'http://binance.claims'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site. Bitcoin address: 13XzbaQV6k21yfbS5WDkzwSPkAxQ1AsbQ3'
--
- id: 4845
- name: verify.mediumpromos.top
- url: 'http://verify.mediumpromos.top'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x2B164ae662a0AB1832C87cb4A226EFEC56219FB6'
--
- id: 4846
- name: mediumpromos.top
- url: 'http://mediumpromos.top'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site. Directing users to verify.mediumpromos.top/payment.php'
- addresses:
- - '0x2B164ae662a0AB1832C87cb4A226EFEC56219FB6'
--
- id: 4847
- name: safecrypt.net
- url: 'http://safecrypt.net'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x2246D2b56c283EA88FedCa9c1F81BFa411Bf2D9C'
--
- id: 4848
- name: binance-claims.com
- url: 'http://binance-claims.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0xdc48d0F659267418e05915cC0A299cdA3f30bDDB'
--
- id: 4849
- name: medium-promotions.com
- url: 'http://medium-promotions.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x3F92555D98cCEe1822565F8b4e0C8bf406ebb674'
--
- id: 4850
- name: prize-eth.com
- url: 'http://prize-eth.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x5A733412E4fbB89e7EBB7EFbbd1B79D5fdA4F4cC'
--
- id: 4851
- name: claim-eth.net
- url: 'http://claim-eth.net'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x31e437cfa7DD0c6bad194e4865c3696551715c4A'
--
- id: 4852
- name: ethsafe.promo
- url: 'http://ethsafe.promo'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x7b6E99Ba5304EdEeD50C0ab2001740C39b4022Ad'
--
- id: 4853
- name: ethpresent.io
- url: 'http://ethpresent.io'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x4Fcff4B71481562Cd6Fdb0FDc7e25F3a8Db55598'
--
- id: 4854
- name: givecoins.info
- url: 'http://givecoins.info'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x64187c01FBAc6F26bC8bF6Fd6d683cb9A58D1737'
--
- id: 4855
- name: musk-official-promo.com
- url: 'http://musk-official-promo.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0xbC55B0f2DbAF492FC8adf35c0f9939eb5Fe92131'
--
- id: 4856
- name: coinsair.org
- url: 'http://coinsair.org'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0xBC025972d6DCEbE52793A2B19dE53CF621Cf1EDc'
--
- id: 4857
- name: myetherwallet.com.api.root3.icu
- url: 'https://myetherwallet.com.api.root3.icu'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet'
--
- id: 4858
- name: myetherwallet.com.api3.icu
- url: 'https://myetherwallet.com.api3.icu'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet'
--
- id: 4859
- name: myetherwallet.com.api4.icu
- url: 'https://myetherwallet.com.api4.icu'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet'
--
- id: 4860
- name: myetherwallet.com.root4.icu
- url: 'https://myetherwallet.com.root4.icu'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet. Reported address: 0x51af777899f0e81fbb69836e9255cc5bab7a5842'
--
- id: 4861
- name: myetherwallet.com.api5.icu
- url: 'https://myetherwallet.com.api5.icu'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet'
--
- id: 4862
- name: nuetheriumllet.com
- url: 'https://nuetheriumllet.com'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet'
--
- id: 4863
- name: myelhervvalet.com
- url: 'https://myelhervvalet.com'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet'
--
- id: 4864
- name: seositesworld.online
- url: 'https://seositesworld.online'
- category: Phishing
- subcategory: Idex
- description: 'Fake Idex market phishing for keys with POST /furia.php'
--
- id: 4865
- name: myetherwallet.com.api6.icu
- url: 'https://myetherwallet.com.api6.icu'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet'
--
- id: 4866
- name: eosgas.net
- url: 'https://eosgas.netu'
- category: Phishing
- subcategory: EOS
- description: 'Fake EOS KYC form directing users to a fake MyEtherWallet myetherwallet.com.api6.icu/signmsg.html via bit.ly/2LrOL4a+'
--
- id: 4867
- name: claimprize.org
- url: 'http://claimprize.org'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0xaE34b154ADA796cFEbE8a60D265d266eF809Fb05'
--
- id: 4868
- name: myetherwallet-hydrosign.space
- url: 'https://myetherwallet-hydrosign.space'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet'
--
- id: 4869
- name: dailycurrency.promo
- url: 'http://dailycurrency.promo'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0xA51960dF18ca816B738A401AC310656fBA0d52EF'
--
- id: 4870
- name: claimsafe.org
- url: 'http://claimsafe.org'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site directing to giveawaypromo.byethost14.com'
- addresses:
- - '0xE5E71b33c6a05910A5bDb05b9fC4c826711de336'
--
- id: 4871
- name: musk-present.blogspot.com
- url: 'http://musk-present.blogspot.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site directing users to musk-official-promo.com/e/'
- addresses:
- - '0xbC55B0f2DbAF492FC8adf35c0f9939eb5Fe92131'
--
- id: 4872
- name: binance-get.claims
- url: 'http://binance-get.claims'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x11775A106157a283873A81E8Ec58394b8d568E06'
--
- id: 4873
- name: dodoflyer.com
- url: 'http://dodoflyer.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x76bb5b6177096b337c79F2f948Aa08b0db5f5211'
--
- id: 4874
- name: eth-transfer.com
- url: 'http://eth-transfer.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xf63164C4912AED27Cd900f92Fe5a66F1ebE5c0Ce'
- - '0xC348085A86D14F9EDE78a5ddD5aA7fEF232c9950'
--
- id: 4875
- name: savetoken.org
- url: 'http://savetoken.org'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x74DDE07C099e4f017E95e30D0235AdA70C7F126F'
--
- id: 4876
- name: followers-special.ml
- url: 'http://followers-special.ml'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xa8Cf72C86C3139E5fcd98F42586Ef5596bBaD182'
--
- id: 4877
- name: giveaway.ethereum-promo.com
- url: 'http://giveaway.ethereum-promo.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x63eBbFc7530b49d8856BF14CBE78dA584E8D0b2A'
--
- id: 4878
- name: descentx.com
- url: 'https://descentx.com'
- category: Phishing
- subcategory: Descentx
- description: 'Fake web wallet stealing keys with POST http://cryptocurrency-prediction.com/unu.php'
--
- id: 4879
- name: myetherwalletv.org
- url: 'https://myetherwalletv.org'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet'
--
- id: 4880
- name: idex-market.trade
- url: 'https://idex-market.trade'
- category: Phishing
- subcategory: Idex
- description: 'Fake Idex phishing for keys'
--
- id: 4881
- name: btc-binance.com
- url: 'http://btc-binance.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site. Bitcoin address: 12z4fAETZTXehv8Y2v3GcD7jjdgG38Ppor'
--
- id: 4882
- name: eth-away.com
- url: 'http://eth-away.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x0A0bA956038d4a66002D612648332B9c4ab7646C'
--
- id: 4883
- name: theethpromogive.net
- url: 'http://theethpromogive.net'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xCAce623CA5F210EDcEE90F36a7AE795C2F6604Cb'
--
- id: 4884
- name: ethpromotake.net
- url: 'http://ethpromotake.net'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x6488b63be2FC20c1F25983A53C447F6530351971'
--
- id: 4885
- name: ethpromogivenow.net
- url: 'http://ethpromogivenow.net'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xCAce623CA5F210EDcEE90F36a7AE795C2F6604Cb'
--
- id: 4886
- name: ethpromoget.net
- url: 'http://ethpromoget.net'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x87F304f9F630CD33DD446fF5Ae969b7f50faFd95'
--
- id: 4887
- name: ethpromogivecare.com
- url: 'http://ethpromogivecare.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x87F304f9F630CD33DD446fF5Ae969b7f50faFd95'
--
- id: 4888
- name: ethnewpromo.com
- url: 'http://ethnewpromo.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x8e8f4161c9c3D2D8857230A048DF1Fc6F4326948'
--
- id: 4889
- name: aethpromogive.com
- url: 'http://aethpromogive.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x6488b63be2FC20c1F25983A53C447F6530351971'
--
- id: 4890
- name: receiveethpromo.cx
- url: 'http://receiveethpromo.cx'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x7a2934Bf040706cE585E547fAB846dD79057956d'
--
- id: 4891
- name: eth-promosgive.com
- url: 'http://eth-promosgive.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xf276C0aD29363689792702986667D562a3CB7C04'
--
- id: 4892
- name: elon-musk.me
- url: 'http://elon-musk.me'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x4764214c17e0Bb358042345356A2Ec5Bf8E76C6b'
--
- id: 4893
- name: eth-promoui.com
- url: 'http://eth-promoui.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x0A0bA956038d4a66002D612648332B9c4ab7646C'
--
- id: 4894
- name: eth-promo-awayx.com
- url: 'http://eth-promo-awayx.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xAaaA3b6D0b72aDE31A99C933a8BF737a4E904527'
--
- id: 4895
- name: ethpromo-give.com
- url: 'http://ethpromo-give.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xAaaA3b6D0b72aDE31A99C933a8BF737a4E904527'
--
- id: 4896
- name: eth-pronosgive.com
- url: 'http://eth-pronosgive.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xB75Be435Ee985Ab09f99299A90b03937B33855c6'
--
- id: 4897
- name: receiveethfree.cx
- url: 'http://receiveethfree.cx'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x059615eA15F7F0e2A276103127BBAce30223d294'
--
- id: 4898
- name: ethpoolcompet.cx
- url: 'http://ethpoolcompet.cx'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x7a2934Bf040706cE585E547fAB846dD79057956d'
--
- id: 4899
- name: coinleft.org
- url: 'http://coinleft.org'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x797Ab7505608A943A4f00E275aD6F2a514b8e038'
--
- id: 4900
- name: blogmedium.tk
- url: 'http://blogmedium.tk'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site - iframing 209.159.154.156/~blogmedi/ether/'
- addresses:
- - '0xBDd6c2d0a22B1aFA22Fc0F5381EB08621DB5929b'
--
- id: 4901
- name: justinsun.promo
- url: 'http://justinsun.promo'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xCe9e24Dffdb3DC08EFe33AD3DB858576C3f27D5d'
--
- id: 4902
- name: ettereum.info
- url: 'http://ettereum.info'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x3fbda35fd333a7bd863e66ee18ed5282a76203f2'
--
- id: 4903
- name: binanace.sizemedium.top
- url: 'http://binanace.sizemedium.top'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x6128c3095e2b0A64CE64e10F05B60d5029e5F8eC'
--
- id: 4904
- name: sizemedium.top
- url: 'http://sizemedium.top'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x6128c3095e2b0A64CE64e10F05B60d5029e5F8eC'
--
- id: 4905
- name: idex-market.biz.pl
- url: 'https://idex-market.biz.pl'
- category: Phishing
- subcategory: Idex
- description: 'Fake Idex phishing for keys'
--
- id: 4906
- name: getethereumforfree.com
- url: 'http://getethereumforfree.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xC7566BA63f39bA75B56EAdc0328F9A76Dbd1ADf3'
--
- id: 4907
- name: medium-hitbtc.tumblr.com
- url: 'http://medium-hitbtc.tumblr.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x8C500BD17174e8604ff9aD3399bD13af245EeF52'
--
- id: 4908
- name: ethereum-return.com
- url: 'http://ethereum-return.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x8C500BD17174e8604ff9aD3399bD13af245EeF52'
--
- id: 4909
- name: ethcryptocomp.cx
- url: 'http://ethcryptocomp.cx'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xBe3E5cBa8cb230678a7bF5ECdaE37783C8dF89bd'
--
- id: 4910
- name: ethpromoui.com
- url: 'http://ethpromoui.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xBe3E5cBa8cb230678a7bF5ECdaE37783C8dF89bd'
--
- id: 4911
- name: ethpromonow.com
- url: 'http://ethpromonow.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x8e8f4161c9c3D2D8857230A048DF1Fc6F4326948'
--
- id: 4912
- name: eth-give-away-promo.com
- url: 'http://eth-give-away-promo.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x14B7716c688875Bcf54D5Ff47cAd4FcA6B3834fA'
--
- id: 4913
- name: eth-promo-give-away.com
- url: 'http://eth-promo-give-away.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x14B7716c688875Bcf54D5Ff47cAd4FcA6B3834fA'
--
- id: 4914
- name: eth-pronogive.com
- url: 'http://eth-pronogive.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xB75Be435Ee985Ab09f99299A90b03937B33855c6'
--
- id: 4915
- name: eth-promosgivex.com
- url: 'http://eth-promosgivex.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xf276C0aD29363689792702986667D562a3CB7C04'
--
- id: 4916
- name: ethpramengive.com
- url: 'http://ethpramengive.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x70f36e78224389C462dd0FC7Fe1627A2928031c7'
--
- id: 4917
- name: et-gi.net
- url: 'http://et-gi.net'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x70f36e78224389C462dd0FC7Fe1627A2928031c7'
--
- id: 4918
- name: bitfilinex.com
- url: 'https://bitfilinex.com'
- category: Phishing
- subcategory: Bitfinex
- description: 'Fake Bitfinex phishing for logins'
--
- id: 4919
- name: blgem.blogspot.com
- url: 'http://blgem.blogspot.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xBDd6c2d0a22B1aFA22Fc0F5381EB08621DB5929b'
--
- id: 4920
- name: airdrop.delivery
- url: 'http://airdrop.delivery'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x76bb5b6177096b337c79F2f948Aa08b0db5f5211'
--
- id: 4921
- name: giveawayofficial.info
- url: 'http://giveawayofficial.info'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xC597498f0d102036ff7bf9fDa401F3174d2E9D96'
--
- id: 4922
- name: binance.delivery
- url: 'http://binance.delivery'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x76bb5b6177096b337c79F2f948Aa08b0db5f5211'
--
- id: 4923
- name: eth-binance.com
- url: 'http://eth-binance.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x27Ec5a27E521364699b870e5D8B5245D97CD0031'
--
- id: 4924
- name: ethgoldmin.com
- url: 'http://ethgoldmin.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xFeA28ca175A80F5A348016583961f63bE8605f80'
--
- id: 4925
- name: take-eth.website
- url: 'http://take-eth.website'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xc77a77d24bb7cd50eec19cc1ce72ed090d841ddd'
--
- id: 4926
- name: safe.earnethnow.com
- url: 'http://safe.earnethnow.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x09f8b64A3992aB516FC34de1157d2b4a39D45301'
--
- id: 4927
- name: earnethnow.com
- url: 'http://earnethnow.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x09f8b64A3992aB516FC34de1157d2b4a39D45301'
--
- id: 4928
- name: myetnerwallet.com.checkbalance.info
- url: 'https://myetnerwallet.com.checkbalance.info'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet stealing keys with POST /callback.php'
--
- id: 4929
- name: mycyrptto.com
- url: 'https://mycyrptto.com'
- category: Phishing
- subcategory: MyCrypto
- description: 'Fake MyCrypto stealing keys with POST /send.php'
--
- id: 4930
- name: kuciorn.hosstinger.info
- url: 'https://kuciorn.hosstinger.info'
- category: Phishing
- subcategory: Kucoin
- description: 'Fake Kucoin phishing for logins'
--
- id: 4931
- name: lhitlbtc.hosstinger.info
- url: 'https://lhitlbtc.hosstinger.info'
- category: Phishing
- subcategory: Hitbtc
- description: 'Fake Hitbtc phishing for logins'
--
- id: 4932
- name: shapeshift-exchange.online
- url: 'https://shapeshift-exchange.online'
- category: Phishing
- subcategory: Shapeshift
- description: 'Fake Shapeshift'
- addresses:
- - '0xcfb10450BB6e7F77b856bf6dF74EA56dD92304AD'
--
- id: 4933
- name: fgcoin.io
- url: 'http://fgcoin.io'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xfb2050604A065CF9699bcF07b33ACCB6f5c27231'
--
- id: 4934
- name: john-mcafee.com
- url: 'http://john-mcafee.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x8E3f2d9bbd1759e13eBd96d95cEf2fE468009E6c'
--
- id: 4935
- name: evotrustllc.com
- url: 'http://evotrustllc.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x8E3f2d9bbd1759e13eBd96d95cEf2fE468009E6c'
--
- id: 4936
- name: amazy-eth.com
- url: 'http://amazy-eth.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x7D73f38770997f30BB6Dfa2B8Da184f2CFebA6C6'
--
- id: 4937
- name: eth-drop.io
- url: 'http://eth-drop.io'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x4Fcff4B71481562Cd6Fdb0FDc7e25F3a8Db55598'
--
- id: 4938
- name: ethermone.info
- url: 'http://ethermone.info'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xb86FAbBB253b69906ab8311de95A9008c738E92E'
--
- id: 4939
- name: ethpromos.info
- url: 'http://ethpromos.info'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xA69Ea6ab7707C551eeaE1d443e179318a9dC73Ee'
--
- id: 4940
- name: mediumblogs.top
- url: 'http://mediumblogs.top'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xab7ec7596fc05bc55afc07008cc06c1193ed6f9a'
- - '0x0CD4ea9B68CEd287Fc25923B071C0b1a0a14e9c6'
--
- id: 4941
- name: eth-giveaway.space
- url: 'http://eth-giveaway.space'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x7f7Be29BD339a38FAcE53918dC8cDBF6a06bC7e7'
--
- id: 4942
- name: claimprize.xyz
- url: 'http://claimprize.xyz'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xA2922aE30Ff11c0fEf6E250b3892A451BDd533f1'
--
- id: 4943
- name: ethereum-transfer.com
- url: 'http://ethereum-transfer.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xbA32570e4c276C74e6DC67BFa6F82253228BD1cD'
- - '0xC348085A86D14F9EDE78a5ddD5aA7fEF232c9950'
--
- id: 4944
- name: ethfast.top
- url: 'http://ethfast.top'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xa0a51563Ca933ECDf030f84425dEF24ab8cC6733'
--
- id: 4945
- name: medium-promo.com
- url: 'http://medium-promo.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site. Directing users to ethereum-transfer.com'
- addresses:
- - '0xbA32570e4c276C74e6DC67BFa6F82253228BD1cD'
--
- id: 4946
- name: ethbonus-binance.com
- url: 'http://ethbonus-binance.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0xe62adc2A7F08db6230e627bb5Faf4F68bc13f88a'
--
- id: 4947
- name: fast.getether.xyz
- url: 'http://fast.getether.xyz'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x5a504295ab80ccA776afDc6DB4f493e7c6Fa8211'
--
- id: 4948
- name: getether.xyz
- url: 'http://getether.xyz'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x5a504295ab80ccA776afDc6DB4f493e7c6Fa8211'
--
- id: 4949
- name: btcbonus-binance.com
- url: 'http://btcbonus-binance.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site. Bitcoin address: 12z4fAETZTXehv8Y2v3GcD7jjdgG38Ppor'
--
- id: 4950
- name: betaclient-wbtcgwap.cf
- url: 'http://betaclient-wbtcgwap.cf'
- category: Phishing
- subcategory: Waves
- description: 'Fake Waves client phishing for secrets with POST /sendwaves.php'
--
- id: 4951
- name: blovrnance.com
- url: 'https://blovrnance.com'
- category: Phishing
- subcategory: Binance
- description: 'Fake Binance phishing for logins'
--
- id: 4952
- name: bingmancol.com
- url: 'https://bingmancol.com'
- category: Phishing
- subcategory: Binance
- description: 'Used in Google Ads (UK) to redirect to blovrnance.com - Fake Binance'
--
- id: 4953
- name: biflnex.com
- url: 'https://biflnex.com'
- category: Phishing
- subcategory: Bitfinex
- description: 'Fake Bitfinex phishing for logins'
--
- id: 4954
- name: bnbnews.org
- url: 'http://bnbnews.org'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x797Ab7505608A943A4f00E275aD6F2a514b8e038'
--
- id: 4955
- name: btcdrop.top
- url: 'http://btcdrop.top'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site. Bitcoin address: 187R5KKL5oT2hUrdGH3yJv8H36N3BSnsii'
--
- id: 4956
- name: johnmcafee.promo
- url: 'http://johnmcafee.promo'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0xCe9e24Dffdb3DC08EFe33AD3DB858576C3f27D5d'
--
- id: 4957
- name: safe.getbesteth.com
- url: 'http://safe.getbesteth.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0xda5f6405808111De82084E6804aDF7153eDaA8eD'
--
- id: 4958
- name: getbesteth.com
- url: 'http://getbesteth.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0xda5f6405808111De82084E6804aDF7153eDaA8eD'
--
- id: 4959
- name: mediumblogsot.top
- url: 'http://mediumblogsot.top'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0xff8e6af02d41a576a0c82f7835535193e1a6bccc'
--
- id: 4960
- name: about.me/vitalik.buterin
- url: 'http://about.me/vitalik.buterin'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x496a0d23712De70896E17AdcbFFA488C4ad2E187'
--
- id: 4961
- name: ethersdrop.online
- url: 'http://ethersdrop.online'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x00c8bd3CD1e649A3Fd2A89b3edC1C2aB631227a0'
--
- id: 4961
- name: ethdrop.top
- url: 'http://ethdrop.top'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x4Fcff4B71481562Cd6Fdb0FDc7e25F3a8Db55598'
--
- id: 4962
- name: elon-musk.promo
- url: 'http://elon-musk.promo'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
--
- id: 4963
- name: cryptocandies.updog.co
- url: 'http://cryptocandies.updog.co'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x458DEa31f89D70eD1923D414E4d4A72E98AD0A4C'
--
- id: 4964
- name: elon-gift.club
- url: 'http://elon-gift.club'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0xB5624bEe455817D8707Aab3D9228A23319aDFB15'
--
- id: 4965
- name: elon-gift.info
- url: 'http://elon-gift.info'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0x26BF2ea373496c1e4b91c49965cd58c60712787c'
--
- id: 4966
- name: eether-free.tech
- url: 'http://ether-free.tech'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site.'
- addresses:
- - '0xeBfce0F5135C0bd67F9Fa5b1aE1366A566f659fF'
--
- id: 4967
- name: tron-presents.blogspot.com
- url: 'http://tron-presents.blogspot.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site linking to airdropeth.info & airdropseth.info'
- addresses:
- - '0xA69Ea6ab7707C551eeaE1d443e179318a9dC73Ee'
- - '0xe55996c55E188FbCf95eD6Ca96Fa933171c05fA0'
--
- id: 4968
- name: airdropeth.info
- url: 'http://airdropeth.info'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xA69Ea6ab7707C551eeaE1d443e179318a9dC73Ee'
--
- id: 4969
- name: myetherwallet-coins.space
- url: 'https://myetherwallet-coins.space'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet phishing for keys'
--
- id: 4970
- name: getherwallet.com
- url: 'https://getherwallet.com'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet phishing for keys'
--
- id: 4971
- name: myetherwallet-coinss.space
- url: 'https://myetherwallet-coinss.space'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet (directed from https://docs.google.com/forms/d/e/1FAIpQLSfFAk465ZL9TiyFvKniV6X82STeasX77KsZk-WaWcOtUR1aBA/viewform)'
--
- id: 4972
- name: fantom-foundation.de
- url: 'https://fantom-foundation.de'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet stealing keys with POST /eth'
--
- id: 4973
- name: bincomance.com
- url: 'https://bincomance.com'
- category: Phishing
- subcategory: Binance
- description: 'Fake Binance phishing for logins'
--
- id: 4974
- name: kraken-authentication.com
- url: 'https://kraken-authentication.com'
- category: Phishing
- subcategory: Kraken
- description: 'Suspicious kraken domain'
--
- id: 4975
- name: kraken-we.com
- url: 'https://kraken-we.com'
- category: Phishing
- subcategory: Kraken
- description: 'Fake Kraken phishing for logins'
--
- id: 4976
- name: kraken-ix.com
- url: 'https://kraken-ix.com'
- category: Phishing
- subcategory: Kraken
- description: 'Suspcious kraken domain'
--
- id: 4977
- name: kraken-on.com
- url: 'https://kraken-on.com'
- category: Phishing
- subcategory: Kraken
- description: 'Suspcious kraken domain'
--
- id: 4978
- name: binance-validation.com
- url: 'https://binance-validation.com'
- category: Phishing
- subcategory: Binance
- description: 'Fake Binance phishing for logins'
--
- id: 4979
- name: grabeth.cf
- url: 'http://grabeth.cf'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x827216bd50d13B3e1daC8686e85f8B6B1bf2e856'
--
- id: 4980
- name: ether-claim.com
- url: 'http://ether-claim.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x2dfc601dB0C0b5EEfc302249acDf936Dce83cFb3'
--
- id: 4981
- name: eos-airdrop.info
- url: 'https://eos-airdrop.info'
- category: Phishing
- subcategory: EOS
- description: 'Fake airdrop linking users to myetheruvvalet.com. Reported address: 0x81fbb23ce259d141339e49ece91599ed97cc8b49'
--
- id: 4982
- name: myethervallet.000webhostapp.com
- url: 'https://myethervallet.000webhostapp.com'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet stealing keys'
--
- id: 4983
- name: myetheruvvalet.com
- url: 'https://myetheruvvalet.com'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet. Reported address: 0x81fbb23ce259d141339e49ece91599ed97cc8b49'
--
- id: 4984
- name: giveaway-promo.net
- url: 'http://giveaway-promo.net'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xbc345238F87abE2978456a3F1c04483e0B63932B'
- - '0x17980B9Ff9B318C93263eD52d19f3cA7ad24Ed9a'
--
- id: 4985
- name: eth-pro.co.nf
- url: 'http://eth-pro.co.nf'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x3a0086083aa90c4692507Bb82Dc14B8754ebC663'
--
- id: 4986
- name: blokckchian.com
- url: 'https://blokckchian.com'
- category: Phishing
- subcategory: Blockchain
- description: 'Fake Blockchain wallet phishing for logins'
--
- id: 4987
- name: coinbaselogin.com.ru
- url: 'https://coinbaselogin.com.ru'
- category: Phishing
- subcategory: Coinbase
- description: 'Suspicious coinbase domain'
--
- id: 4988
- name: binconarnce.com
- url: 'https://binconarnce.com'
- category: Phishing
- subcategory: Binance
- description: 'Fake Binance phishing for logins'
--
- id: 4989
- name: binconamce.com
- url: 'https://binconamce.com'
- category: Phishing
- subcategory: Binance
- description: 'Fake Binance phishing for logins'
--
- id: 4990
- name: hitbtc.mobi
- url: 'https://hitbtc.mobi'
- category: Phishing
- subcategory: HitBtc
- description: 'Fake HitBtc phishing for logins'
--
- id: 4991
- name: kraken-validation.com
- url: 'https://kraken-validation.com'
- category: Phishing
- subcategory: Kraken
- description: 'Fake Kraken phishing for logins'
--
- id: 4992
- name: kraken-portal.com
- url: 'https://kraken-portal.com'
- category: Phishing
- subcategory: Kraken
- description: 'Fake Kraken phishing for logins'
--
- id: 4993
- name: clubeth.live
- url: 'http://clubeth.live'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x420eDd527F217b56Ab9b0fdf7A6C553Fe78EB2aa'
--
- id: 4994
- name: myethgift.com
- url: 'http://myethgift.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xCBA1E79e47DD511B87Dcc69B279953543d453fC5'
--
- id: 4995
- name: clubbtc.live
- url: 'http://clubbtc.live'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site. Bitcoin address: 18dCxtGHAzWbrGBxPQyW4WqSV7N94HQuHt'
--
- id: 4996
- name: binance-official.com
- url: 'https://binance-official.com'
- category: Phishing
- subcategory: Binance
- description: 'Fake Binance phishing for logins'
--
- id: 4997
- name: shapeshift-exchange.io
- url: 'https://shapeshift-exchange.io'
- category: Phishing
- subcategory: Shapeshift
- description: 'Suspicious Shapeshift domain'
--
- id: 4998
- name: view-wallel.info
- url: 'https://view-wallel.info'
- category: Phishing
- subcategory: Ddex
- description: 'Fake Ddex stealing keys with POST /callback.php'
--
- id: 4999
- name: myetheruvvalleet.xyz
- url: 'https://myetheruvvalleet.xyz'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet'
--
- id: 5000
- name: kraken-ixz.com
- url: 'https://kraken-ixz.com'
- category: Phishing
- subcategory: Kraken
- description: 'Fake Kraken phishing for logins'
--
- id: 5001
- name: kraken-check.com
- url: 'https://kraken-check.com'
- category: Phishing
- subcategory: Kraken
- description: 'Fake Kraken phishing for logins'
--
- id: 5002
- name: airdrops.delivery
- url: 'http://airdrops.delivery'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xCe9e24Dffdb3DC08EFe33AD3DB858576C3f27D5d'
--
- id: 5003
- name: ethereum-promotion.org
- url: 'http://ethereum-promotion.org'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x1e1041d4e5E03D90E6350f8A239d8C0E9770F036'
--
- id: 5004
- name: ethmore.io
- url: 'http://ethmore.io'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x4Fcff4B71481562Cd6Fdb0FDc7e25F3a8Db55598'
--
- id: 5005
- name: buzcoinio.com
- url: 'http://buzcoinio.com'
- category: Phishing
- subcategory: Buzcoin
- description: 'Fake Buzcoin crowdsale site'
- addresses:
- - '0x86dDF5b305B9081fB5208e903EDeB013510997cd'
--
- id: 5006
- name: official-promotion.org
- url: 'http://official-promotion.org'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x11775A106157a283873A81E8Ec58394b8d568E06'
--
- id: 5007
- name: airdropseth.info
- url: 'http://airdropseth.info'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xe55996c55E188FbCf95eD6Ca96Fa933171c05fA0'
--
- id: 5008
- name: medium-airdrop-promo.com
- url: 'http://medium-airdrop-promo.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x74FAd851228f905A8F0E46D52259Bd593d63c7cb'
--
- id: 5009
- name: ethereum-airdrop.org
- url: 'http://ethereum-airdrop.org'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x74FAd851228f905A8F0E46D52259Bd593d63c7cb'
--
- id: 5010
- name: air-drop.org
- url: 'http://air-drop.org'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x52C9DFD68c67aAFc9E3e615fB38824b17deF6432'
--
- id: 5011
- name: ethereum-return.top
- url: 'http://ethereum-return.top'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x8C500BD17174e8604ff9aD3399bD13af245EeF52'
--
- id: 5012
- name: ethereum-promotion.website
- url: 'http://ethereum-promotion.website'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x31fca2139b07c2a97287de51f0219a34f4181710'
--
- id: 5013
- name: noweth.top
- url: 'http://noweth.top'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xA2C7736ddDF5CF870896c96E3017A78bC7BB6Ef0'
--
- id: 5014
- name: aronum.com
- url: 'https://aronum.com'
- category: Phishing
- subcategory: Arionum
- description: 'Fake Arionum site'
--
- id: 5015
- name: vechainx.io
- url: 'https://vechainx.io'
- category: Phishing
- subcategory: Vechain
- description: 'Fake Vechain KYC directing users to myetherwallet.com.api10.icu/signmsg.html via bitly.com/2Md9p46+'
--
- id: 5016
- name: etherdrop.top
- url: 'http://etherdrop.top'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x820C415a17Bf165a174e6B55232D956202d9470f'
--
- id: 5017
- name: ether-gather.com
- url: 'http://ether-gather.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x5A733412E4fbB89e7EBB7EFbbd1B79D5fdA4F4cC'
--
- id: 5018
- name: safeclaims.info
- url: 'http://safeclaims.info'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x0A104b095bC84815b27D93B232c6863759b79043'
--
- id: 5019
- name: ethverify.info
- url: 'http://ethverify.info'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x3095E50D8b6ecD80EdC83943a19E00BF596E525f'
--
- id: 5020
- name: elon-musk.org
- url: 'http://elon-musk.org'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x4ff5a066af7f713478e1933929282fd70bD41AFB'
--
- id: 5021
- name: ethereumfast.io
- url: 'http://ethereumfast.io'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x731Dcf009E769453336B53380AF55985dA6D1127'
--
- id: 5022
- name: tron-gifts.blogspot.com
- url: 'http://tron-gifts.blogspot.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site. Linking to airdropseth.info'
- addresses:
- - '0xe55996c55E188FbCf95eD6Ca96Fa933171c05fA0'
--
- id: 5023
- name: xn--etereum-yt3c.com
- url: 'https://xn--etereum-yt3c.com'
- category: Phishing
- subcategory: Ethereum
- description: 'Fake Ethereum site'
--
- id: 5024
- name: ethereu.mfoundation.cf
- url: 'http://ethereu.mfoundation.cf'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xb5f3A62E8f0468efEc0A65b81c09E8b46D1F9158'
--
- id: 5025
- name: bigethereum.org
- url: 'http://bigethereum.org'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x6F0041B3906048528a6760a1BC9627A201A83E38'
--
- id: 5026
- name: giftofeth.info
- url: 'http://giftofeth.info'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x1e21312d1e05a13A7d4aF51fFf776b93D5324111'
- - '0xe55996c55E188FbCf95eD6Ca96Fa933171c05fA0'
--
- id: 5027
- name: crypto-promo.website
- url: 'http://crypto-promo.website'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x52b949fb4678c20873135ce6b3727949432af1d7'
--
- id: 5028
- name: btcdrop.in
- url: 'http://btcdrop.in'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x820C415a17Bf165a174e6B55232D956202d9470f'
--
- id: 5029
- name: ethdrop.in
- url: 'http://ethdrop.in'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x820C415a17Bf165a174e6B55232D956202d9470f'
--
- id: 5030
- name: ethinvesting.info
- url: 'http://ethinvesting.info'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x096c13f383A32253e238bc148307753D14868235'
- - '0xe4408602e316F75f632e9a9cf16560cD20FF18a7'
- - '0xe64a2686C1e46438da0F1F1aDcFA8FfC02063E1B'
--
- id: 5031
- name: bnb.newsmedium.info
- url: 'http://bnb.newsmedium.info'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xBC025972d6DCEbE52793A2B19dE53CF621Cf1EDc'
--
- id: 5032
- name: mediumvert.xyz
- url: 'http://mediumvert.xyz'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xA2922aE30Ff11c0fEf6E250b3892A451BDd533f1'
--
- id: 5033
- name: getethernow.top
- url: 'http://getethernow.top'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site. Linking users to verify.ethereumnow.top/payment.php'
- addresses:
- - '0x2B164ae662a0AB1832C87cb4A226EFEC56219FB6'
--
- id: 5034
- name: vechainx.net
- url: 'https://vechainx.net'
- category: Phishing
- subcategory: Vechain
- description: 'Fake VechainX KYC form. Directing users to a fake MyEtherWallet myetherwallet.com.api12.icu/signmsg.html via bit.ly/2OKn84i+ Reported address: 0x9D61De20D2987EEabaa3B384ff6b5001CA570787'
--
- id: 5035
- name: hadica.com
- url: 'https://hadica.com'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Hosting a fake MyEtherWallet stealing keys with POST goastra.ga/sky.php'
--
- id: 5036
- name: jax-x.com
- url: 'https://jax-x.com'
- category: Phishing
- subcategory: Jaxx
- description: 'Fake JAXX wallet - https://www.virustotal.com/#/url/3a0e85584ae987357fa5b04a4411d4ca015326f5966443a418bb7332ffaa3d4f/detection'
--
- id: 5037
- name: safeclaim.info
- url: 'http://safeclaim.info'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xC4cE40Af23A0619119E7f59730131C22650d5D11'
- - '0x8196FA469BD2F8105bAE01702C4B84B04CdF4A2c'
--
- id: 5038
- name: tesla-giveaway.getforge.io
- url: 'http://tesla-giveaway.getforge.io'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site - linking to eth.getforge.io'
- addresses:
- - '0xE3115696Fc96B8b15Bd7afb0213082bE4595Cdd8'
--
- id: 5039
- name: eth.getforge.io
- url: 'http://eth.getforge.io'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xE3115696Fc96B8b15Bd7afb0213082bE4595Cdd8'
--
- id: 5040
- name: elon-musk.fun
- url: 'http://elon-musk.fun'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x4ff5a066af7f713478e1933929282fd70bD41AFB'
--
- id: 5041
- name: getethfree.com
- url: 'http://getethfree.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xa8A6497978C264d7Ce268D826A834C1d7134D914'
--
- id: 5042
- name: airdrop-event.site
- url: 'http://airdrop-event.site'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xf847860A334c63B347030B3E6Dc1d18136Ce6F65'
--
- id: 5043
- name: xn--methewallet-638e95e.com
- url: 'https://xn--methewallet-638e95e.com'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet (now hosting a coindesk view)'
--
- id: 5044
- name: medeum-airdrop-news.com
- url: 'http://medeum-airdrop-news.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x43FA247764BfBe1Beba49111e4ed215524f02c41'
--
- id: 5045
- name: ethereum-transfer.net
- url: 'http://ethereum-transfer.net'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x43FA247764BfBe1Beba49111e4ed215524f02c41'
--
- id: 5046
- name: forkdelta.biz
- url: 'https://forkdelta.biz'
- category: Phishing
- subcategory: ForkDelta
- description: 'Suspicious forkdelta domain - not active yet'
--
- id: 5047
- name: https-myetherwallet.net
- url: 'https://https-myetherwallet.net'
- category: Phishing
- subcategory: ForkDelta
- description: 'Fake forkdelta'
--
- id: 5048
- name: etherdeita.top
- url: 'https://etherdeita.top'
- category: Phishing
- subcategory: EtherDelta
- description: 'Suspicious etherdelta domain - not active yet'
--
- id: 5049
- name: etherdeita.site
- url: 'https://etherdeita.site'
- category: Phishing
- subcategory: EtherDelta
- description: 'Suspicious etherdelta domain - not active yet'
--
- id: 5050
- name: mycryrptto.com
- url: 'https://mycryrptto.com'
- category: Phishing
- subcategory: MyCrypto
- description: 'Fake MyCrypto'
--
- id: 5051
- name: myethervvallet.ru
- url: 'https://myethervvallet.ru'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Suspicious MyEtherWallet domain'
--
- id: 5052
- name: myethervvallet.top
- url: 'https://myethervvallet.top'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Suspicious MyEtherWallet domain - not active yet'
--
- id: 5053
- name: myetherwallet-coin.top
- url: 'https://myetherwallet-coin.top'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Suspicious MyEtherWallet domain'
--
- id: 5054
- name: myetherwelliet.com
- url: 'https://myetherwelliet.com'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Suspicious MyEtherWallet domain'
--
- id: 5055
- name: myethierwalet.com
- url: 'https://myethierwalet.com'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Suspicious MyEtherWallet domain'
--
- id: 5056
- name: myethertawallet.com
- url: 'https://myethertawallet.com'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Suspicious MyEtherWallet domain'
--
- id: 5057
- name: myetheruwalleet.site
- url: 'https://myetheruwalleet.site'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Suspicious MyEtherWallet domain - not active yet'
--
- id: 5058
- name: myethirvvale.info
- url: 'https://myethirvvale.info'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet phishing for private keys'
--
- id: 5059
- name: omg-myetherwallet.com
- url: 'https://omg-myetherwallet.com'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Suspicious MyEtherWallet domain'
--
- id: 5060
- name: lbinanrce.com
- url: 'https://lbinanrce.com'
- category: Phishing
- subcategory: Binance
- description: 'Fake Binance site phishing for logins'
--
- id: 5061
- name: myethpromogive.com
- url: 'http://myethpromogive.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x14a11E2eF83895918da176165e33025e02e472dE'
--
- id: 5062
- name: bjlttrex.com
- url: 'https://bjlttrex.com'
- category: Phishing
- subcategory: Bittrex
- description: 'Fake Bittrex site phishing for logins'
--
- id: 5063
- name: blocrkchein.com
- url: 'https://blocrkchein.com'
- category: Phishing
- subcategory: Blockchain
- description: 'Fake Blockchain site phishing for logins'
--
- id: 5064
- name: blrockchein.com
- url: 'https://blrockchein.com'
- category: Phishing
- subcategory: Blockchain
- description: 'Fake Blockchain site phishing for logins'
--
- id: 5065
- name: exrno.su
- url: 'https://exrno.su'
- category: Phishing
- subcategory: Exmo
- description: 'Fake Exmo site phishing for logins'
--
- id: 5066
- name: gaterhub.net
- url: 'https://gaterhub.net'
- category: Phishing
- subcategory: Gatehub
- description: 'Fake Gatehub site phishing for logins'
--
- id: 5067
- name: kuciorn.com
- url: 'https://kuciorn.com'
- category: Phishing
- subcategory: Kucoin
- description: 'Fake Kucoin site phishing for logins'
--
- id: 5068
- name: lhitdtc.com
- url: 'https://lhitdtc.com'
- category: Phishing
- subcategory: Hitbtc
- description: 'Fake Hitbtc site phishing for logins'
--
- id: 5069
- name: lhitlbtc.com
- url: 'https://lhitlbtc.com'
- category: Phishing
- subcategory: Hitbtc
- description: 'Fake Hitbtc site phishing for logins'
--
- id: 5070
- name: lkralken.com
- url: 'https://lkralken.com'
- category: Phishing
- subcategory: Kraken
- description: 'Fake Kraken site phishing for logins'
--
- id: 5071
- name: myerthewallet.com
- url: 'https://myerthewallet.com'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet site phishing for keys'
--
- id: 5072
- name: myethaewallet.com
- url: 'https://myethaewallet.com'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet site phishing for keys'
--
- id: 5073
- name: polonreix.com
- url: 'https://polonreix.com'
- category: Phishing
- subcategory: Poloniex
- description: 'Fake Poloniex site phishing for logins'
--
- id: 5074
- name: yobirt.net
- url: 'https://yobirt.net'
- category: Phishing
- subcategory: Yobit
- description: 'Fake Yobit site phishing for logins'
--
- id: 5075
- name: safeclaims.space
- url: 'http://safeclaims.space'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xe2e55d8889141495e8442ED4ba48c6f2E638071d'
--
- id: 5076
- name: safeclaims.net
- url: 'http://safeclaims.net'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xdd944483Ace0a893C328877608e7975B4Ec987Ab'
--
- id: 5077
- name: myethgift.net
- url: 'http://myethgift.net'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x335E40277f127c620560FaF1cfa001E5899864ad'
--
- id: 5078
- name: official.ethx10.com
- url: 'http://official.ethx10.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xdd0D7fcCDF1142B0157d34866c404a249eeA2Eb8'
--
- id: 5079
- name: ethx10.com
- url: 'http://ethx10.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xdd0D7fcCDF1142B0157d34866c404a249eeA2Eb8'
--
- id: 5080
- name: elon-giveaway.org
- url: 'http://elon-giveaway.org'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site linking to musk-official-promo.com/e/'
- addresses:
- - '0xb0Ce77a4F5c02b92235D6829c94b2D27f939aBE1'
--
- id: 5081
- name: ether-airdrop.org
- url: 'http://ether-airdrop.org'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x433c216A36681787A4603f2EECBd2e5F4085C7fb'
--
- id: 5082
- name: myehterwaillet.com
- url: 'https://myehterwaillet.com'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Suspicious MyEtherWallet domain'
--
- id: 5083
- name: xn--yetherallet-iw8ew5a.com
- url: 'https://xn--yetherallet-iw8ew5a.com'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Suspicious MyEtherWallet domain - IDN homograph attack'
--
- id: 5084
- name: tron-gift.blogspot.com
- url: 'http://tron-gift.blogspot.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site linking to giftofeth.info'
- addresses:
- - '0x1e21312d1e05a13a7d4af51fff776b93d5324111'
--
- id: 5085
- name: dubai-oilcorp.company
- url: 'https://dubai-oilcorp.company'
- category: Scamming
- subcategory: Ponzi
- description: 'Ponzi scheme promosing 55% daily returns'
--
- id: 5086
- name: idex.site
- url: 'https://idex.site'
- category: Phishing
- subcategory: Idex
- description: 'Fake Idex phishing for keys'
--
- id: 5087
- name: ideix.market
- url: 'https://ideix.market'
- category: Phishing
- subcategory: Idex
- description: 'Fake Idex phishing for keys with POST /furia.php'
--
- id: 5088
- name: ethclaim.info
- url: 'http://ethclaim.info'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x3095E50D8b6ecD80EdC83943a19E00BF596E525f'
--
- id: 5089
- name: ethgiftonline.com
- url: 'http://ethgiftonline.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site, redirecting to myethgift.net'
- addresses:
- - '0x335E40277f127c620560FaF1cfa001E5899864ad'
--
- id: 5090
- name: ether.blogmedium.top
- url: 'http://ether.blogmedium.top'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xc4856c6C04Ee3416dAEaeD3E5abAE3622BBE1eBe'
--
- id: 5091
- name: bnb.medium-air.org
- url: 'http://bnb.medium-air.org'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xBC025972d6DCEbE52793A2B19dE53CF621Cf1EDc'
--
- id: 5092
- name: airdrops.delivery
- url: 'http://airdrops.delivery'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xbefA0509207c8834003Af4bd82d13876f1A58FDD'
--
- id: 5093
- name: ether-airdrop.website
- url: 'http://ether-airdrop.website'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x1d6065940bfd6ac7c4ec1e2a35e1420e0a9c1bff'
--
- id: 5094
- name: giveaway.ether-claim.org
- url: 'http://giveaway.ether-claim.org'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xBb802918Bc1Ac6089315f951F2b60a1CC275c3Bb'
- - '0xc86619343080fa921baaff201c91dbbe8ceffa9e'
--
- id: 5095
- name: giftsforyou.online
- url: 'http://giftsforyou.online'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x1707BC69d91F86A6000d318E85D07B00747152FE'
--
- id: 5096
- name: coinsprize.org
- url: 'http://coinsprize.org'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x88be7aD530Cba44949817cE40dB87a6d25B44FdE'
--
- id: 5097
- name: ethereumwin.in
- url: 'http://ethereumwin.in'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xf77F1Dcf1A2b748797D807718a77173c668D4bf7'
- - '0x557a5C0B3ACBf9Fe59D5a079aa59c9C7ff481c87'
--
- id: 5098
- name: smart-eth-contract.site
- url: 'http://smart-eth-contract.site'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xDa9c7d72d902DB64b42B663358C47559be293F80'
--
- id: 5099
- name: safec41944.nichost.ru
- url: 'http://safec41944.nichost.ru'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x1D7821B0167C9Eb24b49977D394fB5E4E2C9AB6f'
--
- id: 5100
- name: bliovnarnce.com
- url: 'https://bliovnarnce.com'
- category: Phishing
- subcategory: Binance
- description: 'Fake Binance phishing for logins'
--
- id: 5101
- name: meyhferwallet.com
- url: 'https://meyhferwallet.com'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet phishing for keys'
--
- id: 5102
- name: airdropbox.site
- url: 'http://airdropbox.site'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xEd8c8830cFC51F306C4765598cF3EE50ad8d978A'
--
- id: 5103
- name: ethereum-giveaway.top
- url: 'http://ethereum-giveaway.top'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xcB3f9c4cD5D31B4D6DB04a63f5A414779cFe6Fc7'
- - '0x9DbF942bE15c70c4E1Fb8c0D1B53007377bCaa09'
--
- id: 5104
- name: etherescan.net
- url: 'http://etherescan.net'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x1707BC69d91F86A6000d318E85D07B00747152FE'
--
- id: 5105
- name: transaction.status-eth.top
- url: 'http://transaction.status-eth.top'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x883d723B3F4a12EdD577A47f80DF9f2896Cd3cE7'
--
- id: 5106
- name: mediumblog.today
- url: 'http://mediumblog.today'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x0CD4ea9B68CEd287Fc25923B071C0b1a0a14e9c6'
--
- id: 5107
- name: ethereum-airdop.com
- url: 'http://ethereum-airdop.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xA59FC1920284607Dd1d95bCC43F821601fAeF7d3'
--
- id: 5108
- name: medium-blogpost.info
- url: 'http://medium-blogpost.info'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xA59FC1920284607Dd1d95bCC43F821601fAeF7d3'
--
- id: 5109
- name: bonus.status-eth.top
- url: 'http://bonus.status-eth.top'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x883d723B3F4a12EdD577A47f80DF9f2896Cd3cE7'
--
- id: 5110
- name: ethereum.smart.contract.myeltherwallet.ml
- url: 'http://ethereum.smart.contract.myeltherwallet.ml'
- category: Phishing
- subcategory: MyEtherWallet
- description: 'Fake MyEtherWallet phishing for keys with POST mail.php'
--
- id: 5111
- name: lelectrum.com
- url: 'http://lelectrum.com'
- category: Phishing
- subcategory: Electrum
- description: 'Fake Electrum site with dodgy download - https://www.virustotal.com/#/url/96d6354bd1f7b3859c7ee34c7638439c20700cf59bb762502da1ce1be4f32086/detection'
--
- id: 5112
- name: get.10keth.com
- url: 'http://get.10keth.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x88f8717A2B30041006E08e286af9F1E9671B5724'
--
- id: 5113
- name: 10keth.com
- url: 'http://10keth.com'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x88f8717A2B30041006E08e286af9F1E9671B5724'
--
- id: 5114
- name: airdrop-token.website
- url: 'http://airdrop-token.website'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xe889b0d59fd4181857edb19f5fecafa8510f2fad'
--
- id: 5115
- name: ethvent.net
- url: 'http://ethvent.net'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x335E40277f127c620560FaF1cfa001E5899864ad'
--
- id: 5116
- name: ethclaim.live
- url: 'http://ethclaim.live'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x1b2f4abac29e739d8eb439a3f7fdef571f1d0e69'
--
- id: 5117
- name: claim.status-eth.top
- url: 'http://claim.status-eth.top'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x883d723B3F4a12EdD577A47f80DF9f2896Cd3cE7'
--
- id: 5118
- name: my-followers.ml
- url: 'http://my-followers.ml'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0x02D1347ABE00beAA073058b1414722CdcC31aBB3'
--
- id: 5119
- name: gcox086.com
- url: 'http://gcox086.com'
- category: Phishing
- subcategory: Gcox
- description: 'Fake Gcox crowdsale site'
--
- id: 5120
- name: gcoxkorea.com
- url: 'http://gcoxkorea.com'
- category: Phishing
- subcategory: Gcox
- description: 'Fake Gcox crowdsale site'
--
- id: 5121
- name: xn--bnanc-r51bze.com
- url: 'http://xn--bnanc-r51bze.com'
- category: Phishing
- subcategory: Binance
- description: 'Fake Binance - IDN homograph attack domain'
--
- id: 5122
- name: ycbit.net
- url: 'http://ycbit.net'
- category: Phishing
- subcategory: Yobit
- description: 'Suspcious Yobit (not deployed yet)'
--
- id: 5123
- name: kuccin.com
- url: 'http://kuccin.com'
- category: Phishing
- subcategory: Kucoin
- description: 'Suspcious Kucoin (not deployed yet)'
--
- id: 5124
- name: lnitbtc.com
- url: 'http://lnitbtc.com'
- category: Phishing
- subcategory: Hitbtc
- description: 'Suspcious Hitbtc (not deployed yet)'
--
- id: 5125
- name: www-nycryqto.com
- url: 'http://www-nycryqto.com'
- category: Phishing
- subcategory: MyCrypto
- description: 'Suspcious MyCrypto (not deployed yet)'
--
- id: 5126
- name: www-nycryptos.com
- url: 'http://www-nycryptos.com'
- category: Phishing
- subcategory: MyCrypto
- description: 'Suspcious MyCrypto (not deployed yet)'
--
- id: 5127
- name: go.ethers.pw
- url: 'http://go.ethers.pw'
- category: Scamming
- subcategory: Trust-Trading
- description: 'Trust trading scam site'
- addresses:
- - '0xE5f08B41BC8e37EE5E5934d4A27e67e059370011'
diff --git a/_layouts/404.html b/_layouts/404.html
deleted file mode 100644
index 996a66ee..00000000
--- a/_layouts/404.html
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
404
-This page was not found
-
\ No newline at end of file
diff --git a/_layouts/address.html b/_layouts/address.html
deleted file mode 100644
index 97e0a204..00000000
--- a/_layouts/address.html
+++ /dev/null
@@ -1,24 +0,0 @@
-
-{{ address.address }}
-{{ address.notification }}
-Balance : loading...
-USD Value : loading...
-{{ address.list }}
-
- View address on etherscan
-
-
-
-
-Please enable JavaScript to view the comments powered by Disqus.
diff --git a/_layouts/api.html b/_layouts/api.html
deleted file mode 100644
index c23825a0..00000000
--- a/_layouts/api.html
+++ /dev/null
@@ -1,121 +0,0 @@
- API
-
-
-Check
-URL : GET "https://etherscamdb.info/api/check/0xDaa29859836D97C810c7F9D350D4A1B3E8CafC9a/" (can be a domain, ethereum address, or ip address)
-Response:
-
-Report
-Example URL : https://etherscamdb.info/report/domain/fake-mycrypto.com/
-Another example URL : https://etherscamdb.info/report/address/0x0000000000000000000000000000000000000000/
-All of the values (fake-mycrypto.com and 0x0000000000000000000000000000000000000000) are optional.
-Scams
-URL : GET "https://etherscamdb.info/api/scams/"
-Response:
-
-Addresses
-URL : GET "https://etherscamdb.info/api/addresses/"
-Response:
-
-IPs
-URL : GET "https://etherscamdb.info/api/ips/"
-Response:
-
-Verified
-URL : GET "https://etherscamdb.info/api/verified/"
-Response:
-
-Blacklist
-URL : GET "https://etherscamdb.info/api/blacklist/"
-Response:
-
-Whitelist
-URL : GET "https://etherscamdb.info/api/whitelist/"
-Response:
-
-
-Inactives
-URL : GET "https://etherscamdb.info/api/inactives/"
-Response:
-
-
-Actives
-URL : GET "https://etherscamdb.info/api/actives/"
-Response:
-
-
-Abuse report
-URL : GET "https://etherscamdb.info/api/abusereport/changellyli.com/"
-Response:
-
-
diff --git a/_layouts/default.html b/_layouts/default.html
deleted file mode 100644
index e4f369fa..00000000
--- a/_layouts/default.html
+++ /dev/null
@@ -1,83 +0,0 @@
-
-
-
-
- Ethereum Scam Database
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ config.perform_dns_lookup }}
-
- {{ content }}
-
-
-
-
-
-
-
diff --git a/_layouts/faq.html b/_layouts/faq.html
deleted file mode 100644
index 5e72663b..00000000
--- a/_layouts/faq.html
+++ /dev/null
@@ -1,22 +0,0 @@
- FAQ
-How to protect myself against scammers?
-
-
-
Bookmark your crypto sites - Use those bookmarks and only those.
-
Only send funds to trusted addresses - Double-check what address you're sending ETH to. Look up the address at
etherscan.io and check if there are bad reviews
-
Never trust any discord/slack/telegram/reddit message - Don't ever fall for messages that say you can get free ETH or that a hack has occurred.
-
-MyCrypto has written a great guide on protecting yourself and your funds .
-How can I join the fight?
-
-
-
-
Send abuse reports to the registrar, hosting and ssl provider of the scam domains
-
-
-Can I use the data from this project?
-Yes, you can either download the raw data files from Github or take a look at our API .
-Are the reports open source? Where do they go?
-All reports end up in a private Slack to protect people's privacy. The reports can be read by all team members of MyCrypto and they can decide whether the report makes it to the blacklist.
-Why was the database created?
-The database was created in 2017 by #TeamMEW when trying to find a solution to the ethereum scams. Of course grouping all the scams won't make them go away, but it will make identifying them and taking them down easier. It is now being maintained by the MyCrypto team.
diff --git a/_layouts/index.html b/_layouts/index.html
deleted file mode 100644
index a575b141..00000000
--- a/_layouts/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
Open-Source
- The full website is open-source at
Github including all datasets with documentation to use them in your own application.
-
-
-
Knowledge
- By combining all the information that's available, connections between scams can easily be found.
-
-
-
-
-
Report
- An easy-to-use report function helps us identifying all the current scams so we can add them to the database.
-
-
-
Donate
- Support the developers and maintainers of this project by donating ETH or ERC20 tokens to
etherscamdb.eth
-
-
-
diff --git a/_layouts/ip.html b/_layouts/ip.html
deleted file mode 100644
index 79fb7842..00000000
--- a/_layouts/ip.html
+++ /dev/null
@@ -1,8 +0,0 @@
-{{ ip.ip }}
-Location : loading...
-AbuseIPDB: {{ ip.abuseipdb_link }}
-URLScan: {{ ip.urlscan_link }}
-Related to the following scams ({{ ip.scams_count }}) : {{ ip.scams }}
-
-
-
\ No newline at end of file
diff --git a/_layouts/neutraldomain.html b/_layouts/neutraldomain.html
deleted file mode 100644
index fd8bca88..00000000
--- a/_layouts/neutraldomain.html
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-{{ neutral.notification }}
-{{ neutral.url }}
-{{ neutral.googlethreat }}
-{{ neutral.virustotal }}
-{{ neutral.phishtank }}
-{{ neutral.urlscan }}
-{{ neutral.urlscreenshot }}
-
-
-
-{{ page.built }}
-
-Please enable JavaScript to view the comments powered by Disqus.
-
diff --git a/_layouts/no-scam-found.html b/_layouts/no-scam-found.html
deleted file mode 100644
index bbe8a73f..00000000
--- a/_layouts/no-scam-found.html
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
-
Copy the following url to share with other people:
-
-
-
-
- Cancel
-
-
- Copy
-
-
-
-
-
-
-
-
-
- Cancel
-
-
- Copy
-
-
-
-
-
404 - Record does not exist
-
-
-
-
-Sorry, but this record cannot be found.
\ No newline at end of file
diff --git a/_layouts/redirect.html b/_layouts/redirect.html
deleted file mode 100644
index 88eac067..00000000
--- a/_layouts/redirect.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
- Warning
-You are about to leave the official website to an untrusted domain.
-
-Domain: {{ redirect.domain }}
-
-
-
Do not click anything.
-
Do not fill in any of your information. (And definitely no private keys!)
-
Wipe your history after you have visited this domain. You don't want a fake website to show up when you type "myetherwa" in your address bar.
-
-
-I understand
-
-
-
\ No newline at end of file
diff --git a/_layouts/reportaddress.html b/_layouts/reportaddress.html
deleted file mode 100644
index e25e8bef..00000000
--- a/_layouts/reportaddress.html
+++ /dev/null
@@ -1,85 +0,0 @@
-
-
-
-
-
-
What malicious address would you like to report?
-
-
-
-
-
- Continue
-
-
-
-
-
-
-
Please specify a reason for your report
-
-
-
-
-
- Send
-
-
-
-
-
-
-
Thanks for your report
-
Your report has been sent. In the meanwhile, you can learn how to protect yourself and others in the future:
-
-
-
-
-
-
-
-
- If you have IE / Edge, report a domain here
-
-
-
-
-
-
-
-
diff --git a/_layouts/reportdomain.html b/_layouts/reportdomain.html
deleted file mode 100644
index ebd54904..00000000
--- a/_layouts/reportdomain.html
+++ /dev/null
@@ -1,85 +0,0 @@
-
-
-
-
-
-
What malicious domain would you like to report?
-
-
-
-
-
- Continue
-
-
-
-
-
-
-
Please specify a reason for your report
-
-
-
-
-
- Send
-
-
-
-
-
-
-
Thanks for your report
-
Your report has been sent. In the meanwhile, you can learn how to protect yourself and others in the future:
-
-
-
-
-
-
-
-
- If you have IE / Edge, report a domain here
-
-
-
-
-
-
-
-
diff --git a/_layouts/scam.html b/_layouts/scam.html
deleted file mode 100644
index c1fae612..00000000
--- a/_layouts/scam.html
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
-
-
-
-
Copy the following url to share with other people:
-
-
-
-
- Cancel
-
-
- Copy
-
-
-
-
-
-
-
-
-
- Cancel
-
-
- Copy
-
-
-
-
-
{{ scam.name }}
-
- {{ scam.actions }}
-
-
-{{ scam.url }}
-{{ scam.category }}
-{{ scam.description }}
-{{ scam.status }}
-{{ scam.ip }}
-{{ scam.metamask }}
-{{ scam.googlethreat }}
-{{ scam.nameservers }}
-{{ scam.addresses }}
-{{ scam.screenshot }}
-
-
-
-{{ page.built }}
-
-Please enable JavaScript to view the comments powered by Disqus.
-
\ No newline at end of file
diff --git a/_layouts/scamdomain.html b/_layouts/scamdomain.html
deleted file mode 100644
index 59eab598..00000000
--- a/_layouts/scamdomain.html
+++ /dev/null
@@ -1,93 +0,0 @@
-
-
-
-
-
-
Copy the following url to share with other people:
-
-
-
-
- Cancel
-
-
- Copy
-
-
-
-
-
-
-
-
-
- Cancel
-
-
- Copy
-
-
-
-
-
{{ scam.name }}
-
- {{ scam.actions }}
-
-
-
-
-
- {{ scam.notification }}
- {{ scam.url }}
- {{ scam.category }}
- {{ scam.description }}
- {{ scam.status }}
- {{ scam.ip }}
-
-
-
- {{ scam.metamask }}
- {{ scam.googlethreat }}
- {{ scam.virustotal }}
- {{ scam.phishtank }}
- {{ scam.urlscan }}
- {{ scam.nameservers }}
- {{ scam.addresses }}
-
-
-
-
-{{ scam.urlscreenshot }}
-
-
-
-
-
-{{ page.built }}
-
-Please enable JavaScript to view the comments powered by Disqus.
-
diff --git a/_layouts/scams.html b/_layouts/scams.html
deleted file mode 100644
index 63ff7d3b..00000000
--- a/_layouts/scams.html
+++ /dev/null
@@ -1,59 +0,0 @@
-
-
-
-
-
- {{ scams.total }}
-
-
- Total scams
-
-
-
-
-
-
- {{ scams.active }}
-
-
- Active scams
-
-
-
-
-
-
- {{ addresses.total }}
-
-
- Addresses registered
-
-
-
-
-
-
- {{ scams.inactive }}
-
-
- Inactive scams
-
-
-
-
- Scams
-
-
- Category
- Subcategory
- Status
- Title
- Info
-
-
- {{ scams.table }}
-
-
-
-{{ scams.pagination }}
-
\ No newline at end of file
diff --git a/_layouts/verifieddomain.html b/_layouts/verifieddomain.html
deleted file mode 100644
index c047f6c3..00000000
--- a/_layouts/verifieddomain.html
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-{{ verified.notification }}
-{{ verified.url }}
-{{ verified.description }}
-{{ verified.googlethreat }}
-{{ verified.virustotal }}
-{{ verified.phishtank }}
-{{ verified.urlscan }}
-{{ verified.addresses }}
-{{ verified.urlscreenshot }}
-
-
-
-{{ page.built }}
-
-Please enable JavaScript to view the comments powered by Disqus.
-
diff --git a/_static/css/neutraldomain.css b/_static/css/neutraldomain.css
deleted file mode 100644
index 78271275..00000000
--- a/_static/css/neutraldomain.css
+++ /dev/null
@@ -1,54 +0,0 @@
-.ui.bulleted.list {
- margin-top: 4px;
- margin-bottom: 0;
-}
-
-.ui.grid {
- margin-bottom: 0px;
-}
-
-.ui.input {
- width: 100%;
-}
-
-#actions {
- text-align: right;
-}
-
-.class_offline {
- color: green;
-}
-
-.class_active {
- color: red;
-}
-
-.class_suspended {
- color: orange;
-}
-
-.class_inactive {
- color: orange;
-}
-
-#scam-screenshot {
- filter: gray;
- -webkit-filter: grayscale(1);
- filter: grayscale(1);
- width: 100%;
- height: 100%;
- border: 2px solid #000;
-}
-#scam-screenshot:hover {
- cursor: -moz-zoom-in;
- cursor: -webkit-zoom-in;
- cursor: zoom-in;
- -webkit-filter: grayscale(0);
- filter: none;
-}
-
-.built {
- font-size: 8pt;
- font-style: italic;
- margin-top: 7%;
-}
diff --git a/_static/css/scam.css b/_static/css/scam.css
deleted file mode 100644
index a813f94c..00000000
--- a/_static/css/scam.css
+++ /dev/null
@@ -1,68 +0,0 @@
-.ui.bulleted.list {
- margin-top: 4px;
- margin-bottom: 0;
-}
-
-.ui.grid {
- margin-bottom: 0px;
-}
-
-.ui.input {
- width: 100%;
-}
-
-#actions {
- text-align: right;
-}
-
-.class_offline {
- color: green;
-}
-
-.class_active {
- color: red;
-}
-
-.class_suspended {
- color: orange;
-}
-
-.class_inactive {
- color: orange;
-}
-
-#scam-screenshot {
- filter: gray;
- -webkit-filter: grayscale(1);
- filter: grayscale(1);
- width: 100%;
- height: 100%;
- border: 2px solid #000;
-}
-#scam-screenshot:hover {
- cursor: -moz-zoom-in;
- cursor: -webkit-zoom-in;
- cursor: zoom-in;
- -webkit-filter: grayscale(0);
- filter: none;
-}
-
-.built {
- font-size: 8pt;
- font-style: italic;
- margin-top: 7%;
-}
-
-.tip {
- border: 1px solid #000;
- background-color: #90EE90;
- border-radius: 3px;
-}
-
-.ui.green.message {
- color: #189826;
- font-size: 14px;
-}
-.ui.red.message {
- font-size: 14px;
-}
diff --git a/_static/js/scam.js b/_static/js/scam.js
deleted file mode 100644
index 63b8bc44..00000000
--- a/_static/js/scam.js
+++ /dev/null
@@ -1,22 +0,0 @@
-window.addEventListener("load", function() {
- $("#shr").val(location.href);
- $("#gen").click(function() {
- $('#abusemodal').modal('show');
- });
- $("#history").click(function() {
- $('#historymodal').modal('show');
- });
- $("#share").click(function() {
- $('#sharemodal').modal('show');
- });
-});
-
-function copyshr() {
- document.getElementById("shr").select();
- document.execCommand("copy");
-}
-
-function copyabuse() {
- document.getElementById("abuse").select();
- document.execCommand("copy");
-}
\ No newline at end of file
diff --git a/_static/js/verified.js b/_static/js/verified.js
deleted file mode 100644
index 63b8bc44..00000000
--- a/_static/js/verified.js
+++ /dev/null
@@ -1,22 +0,0 @@
-window.addEventListener("load", function() {
- $("#shr").val(location.href);
- $("#gen").click(function() {
- $('#abusemodal').modal('show');
- });
- $("#history").click(function() {
- $('#historymodal').modal('show');
- });
- $("#share").click(function() {
- $('#sharemodal').modal('show');
- });
-});
-
-function copyshr() {
- document.getElementById("shr").select();
- document.execCommand("copy");
-}
-
-function copyabuse() {
- document.getElementById("abuse").select();
- document.execCommand("copy");
-}
\ No newline at end of file
diff --git a/_utils/lookup.js b/_utils/lookup.js
deleted file mode 100644
index d2c5b487..00000000
--- a/_utils/lookup.js
+++ /dev/null
@@ -1,18 +0,0 @@
-const request = require('request')
-
-class weblookup {
- lookup (input) {
- return new Promise(function(resolve, reject) {
- var result = request(input,
- {timeout: 30*1000}, function(e, response, body) {
- if(e || !([200, 301, 302].includes(response.statusCode))) {
- resolve(e)
- }
- else if(!e && response.statusCode == 200){
- resolve(JSON.parse(body))
- }
- });
- });
- }
-}
-module.exports = weblookup
diff --git a/_utils/webcheck.js b/_utils/webcheck.js
deleted file mode 100644
index 7de9fc72..00000000
--- a/_utils/webcheck.js
+++ /dev/null
@@ -1,18 +0,0 @@
-const request = require('request')
-
-class web {
- lookup (input) {
- return new Promise(function(resolve, reject) {
- var result = request('https://urlscan.io/api/v1/search/?q=domain%3A' + input,
- {timeout: 30*1000}, function(e, response, body) {
- if(e || !([200, 301, 302].includes(response.statusCode))) {
- resolve(e)
- }
- else if(!e && response.statusCode == 200){
- resolve(JSON.parse(body))
- }
- });
- });
- }
-}
-module.exports = web
diff --git a/assets/favicon.icns b/assets/favicon.icns
new file mode 100644
index 00000000..1972268f
Binary files /dev/null and b/assets/favicon.icns differ
diff --git a/assets/favicon.ico b/assets/favicon.ico
new file mode 100644
index 00000000..533c0188
Binary files /dev/null and b/assets/favicon.ico differ
diff --git a/_static/logo/favicon.png b/assets/favicon.png
similarity index 100%
rename from _static/logo/favicon.png
rename to assets/favicon.png
diff --git a/_static/logo/favicon.svg b/assets/favicon.svg
similarity index 100%
rename from _static/logo/favicon.svg
rename to assets/favicon.svg
diff --git a/_static/img/logo.png b/assets/logo.png
similarity index 100%
rename from _static/img/logo.png
rename to assets/logo.png
diff --git a/_static/logo/logotype-a.svg b/assets/logotype-a.svg
similarity index 100%
rename from _static/logo/logotype-a.svg
rename to assets/logotype-a.svg
diff --git a/_static/logo/logotype-b.svg b/assets/logotype-b.svg
similarity index 100%
rename from _static/logo/logotype-b.svg
rename to assets/logotype-b.svg
diff --git a/config.example.js b/config.example.js
deleted file mode 100644
index 6c4b5b15..00000000
--- a/config.example.js
+++ /dev/null
@@ -1,15 +0,0 @@
-module.exports = {
- "port": 8080,
- "cache_refreshing_interval": 1000 * 60 * 30,
- "Google_SafeBrowsing_API_Key": null,
- "Github_Hook_Secret": null,
- "VirusTotal_API_Key": null,
- "Urlscan_API_Key": null,
- "AbuseIPDB_API_Key": null,
- "repository": {
- author: "MrLuit",
- name: "EtherScamDB",
- branch: "master"
- },
- "perform_dns_lookup": false
-};
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 00000000..68a769ba
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,22 @@
+version: "3"
+services:
+ esdb:
+ container_name: esdb
+ restart: unless-stopped
+ build: .
+ ports:
+ - "80:80"
+ environment:
+ - NODE_ENV=production
+ - DEBUG=*
+ portainer:
+ image: portainer/portainer
+ ports:
+ - "9000:9000"
+ command: -H unix:///var/run/docker.sock
+ volumes:
+ - /var/run/docker.sock:/var/run/docker.sock
+ - portainer_data:/data
+
+volumes:
+ portainer_data:
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index faef7cdc..14e59884 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,9 +1,26 @@
{
"name": "etherscamdb",
- "version": "2.0.0",
+ "version": "3.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
+ "7zip-bin": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-4.0.2.tgz",
+ "integrity": "sha512-XtGk+IF57pr852UK1AhQJXqmm1WmSgS5uISL+LPs0z/iAxXouMvdlLJrHPeukP6gd7yR2rDTMSMkHNODgwIq7A==",
+ "dev": true
+ },
+ "@sindresorhus/is": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz",
+ "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow=="
+ },
+ "@types/node": {
+ "version": "8.10.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.23.tgz",
+ "integrity": "sha512-aEp5ZTLr4mYhR9S85cJ+sEYkcsgFY10N1Si5m49iTAVzanZXOwp/pgw6ibFLKXxpflqm71aSWZCRtnTXXO56gA==",
+ "dev": true
+ },
"accepts": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
@@ -39,6 +56,156 @@
"json-schema-traverse": "^0.3.0"
}
},
+ "ajv-keywords": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz",
+ "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=",
+ "dev": true
+ },
+ "ansi-align": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
+ "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
+ "dev": true,
+ "requires": {
+ "string-width": "^2.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ }
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "app-builder-bin": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-2.0.0.tgz",
+ "integrity": "sha512-JUJ1Wiaig1589MxF110HHh5I5v9hn2Qu4ZeleNwSZHfD1S2LrCxm4H+q7Snr/rWlWdEChFoWM2lj11Cdl4LP0Q==",
+ "dev": true
+ },
+ "app-builder-lib": {
+ "version": "20.26.1",
+ "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-20.26.1.tgz",
+ "integrity": "sha512-tLRC9bU3f7TgeK//jjDfhwzQymmLACkcs6vC/5VZLstVigg0G55RejsD4cCP3YA7fdUNNH6MaOAUh4l9FblCMg==",
+ "dev": true,
+ "requires": {
+ "7zip-bin": "~4.0.2",
+ "app-builder-bin": "2.0.0",
+ "async-exit-hook": "^2.0.1",
+ "bluebird-lst": "^1.0.5",
+ "builder-util": "5.20.1",
+ "builder-util-runtime": "4.4.1",
+ "chromium-pickle-js": "^0.2.0",
+ "debug": "^3.1.0",
+ "ejs": "^2.6.1",
+ "electron-osx-sign": "0.4.10",
+ "electron-publish": "20.26.0",
+ "env-paths": "^1.0.0",
+ "fs-extra-p": "^4.6.1",
+ "hosted-git-info": "^2.7.1",
+ "is-ci": "^1.1.0",
+ "isbinaryfile": "^3.0.2",
+ "js-yaml": "^3.12.0",
+ "lazy-val": "^1.0.3",
+ "minimatch": "^3.0.4",
+ "normalize-package-data": "^2.4.0",
+ "plist": "^3.0.1",
+ "read-config-file": "3.1.0",
+ "sanitize-filename": "^1.6.1",
+ "semver": "^5.5.0",
+ "sumchecker": "^2.0.2",
+ "temp-file": "^3.1.3"
+ },
+ "dependencies": {
+ "js-yaml": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
+ "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "sumchecker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz",
+ "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=",
+ "dev": true,
+ "requires": {
+ "debug": "^2.2.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ }
+ }
+ },
+ "archive-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz",
+ "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=",
+ "requires": {
+ "file-type": "^4.2.0"
+ },
+ "dependencies": {
+ "file-type": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz",
+ "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU="
+ }
+ }
+ },
"argparse": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
@@ -47,11 +214,22 @@
"sprintf-js": "~1.0.2"
}
},
+ "array-find-index": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+ "dev": true
+ },
"array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
},
+ "array-object-dictionary": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-object-dictionary/-/array-object-dictionary-1.0.0.tgz",
+ "integrity": "sha512-r5bvWPkKIs/c8Z1NVl1HXbQBf2sMarNRVwdDI6TGGjADfoN6UKpYxd1nsSBV6mCvUQCSdl3B+zH0eBc2VbeW0w=="
+ },
"asn1": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
@@ -62,6 +240,12 @@
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
},
+ "async-exit-hook": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz",
+ "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==",
+ "dev": true
+ },
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -80,7 +264,14 @@
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base64-js": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz",
+ "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=",
+ "dev": true
},
"bcrypt-pbkdf": {
"version": "1.0.2",
@@ -91,40 +282,115 @@
"tweetnacl": "^0.14.3"
}
},
- "body-parser": {
- "version": "1.18.2",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
- "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
+ "bl": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
+ "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
"requires": {
- "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"
+ "readable-stream": "^2.3.5",
+ "safe-buffer": "^5.1.1"
},
"dependencies": {
- "content-type": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
- "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
},
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"requires": {
- "ms": "2.0.0"
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "bluebird": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
+ "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==",
+ "dev": true
+ },
+ "bluebird-lst": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.5.tgz",
+ "integrity": "sha512-Ey0bDNys5qpYPhZ/oQ9vOEvD0TYQDTILMXWP2iGfvMg7rSDde+oV4aQQgqRH+CvBFNz2BSDQnPGMUl6LKBUUQA==",
+ "dev": true,
+ "requires": {
+ "bluebird": "^3.5.1"
+ }
+ },
+ "bottleneck": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.6.0.tgz",
+ "integrity": "sha512-3fgu36UohvqOzv4aYPFyUR39LckOcA5cM4Yxija/V9Effd7a/22tFtZga89t3rSNtqEqo0bMT8IhCFztD7d/8A=="
+ },
+ "boxen": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
+ "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==",
+ "dev": true,
+ "requires": {
+ "ansi-align": "^2.0.0",
+ "camelcase": "^4.0.0",
+ "chalk": "^2.0.1",
+ "cli-boxes": "^1.0.0",
+ "string-width": "^2.0.0",
+ "term-size": "^1.2.0",
+ "widest-line": "^2.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
}
},
- "qs": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
- "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
}
}
},
@@ -132,6 +398,7 @@
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
"integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
+ "dev": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -143,21 +410,242 @@
"integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
"dev": true
},
+ "buffer": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz",
+ "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=",
+ "requires": {
+ "base64-js": "0.0.8",
+ "ieee754": "^1.1.4",
+ "isarray": "^1.0.0"
+ },
+ "dependencies": {
+ "base64-js": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz",
+ "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg="
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ }
+ }
+ },
+ "buffer-alloc": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
+ "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
+ "requires": {
+ "buffer-alloc-unsafe": "^1.1.0",
+ "buffer-fill": "^1.0.0"
+ }
+ },
+ "buffer-alloc-unsafe": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
+ "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
+ },
+ "buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI="
+ },
+ "buffer-fill": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
+ "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw="
+ },
+ "buffer-from": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
+ "dev": true
+ },
+ "builder-util": {
+ "version": "5.20.1",
+ "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-5.20.1.tgz",
+ "integrity": "sha512-rqSl3Tbi/sECIVWAys8Blic4UEzUpZkGgmVXR2mZwdVPreNnfY3MHqSGSxlJRMTqxSsO0SgxnAEnanBNw4212g==",
+ "dev": true,
+ "requires": {
+ "7zip-bin": "~4.0.2",
+ "app-builder-bin": "2.0.0",
+ "bluebird-lst": "^1.0.5",
+ "builder-util-runtime": "^4.4.1",
+ "chalk": "^2.4.1",
+ "debug": "^3.1.0",
+ "fs-extra-p": "^4.6.1",
+ "is-ci": "^1.1.0",
+ "js-yaml": "^3.12.0",
+ "lazy-val": "^1.0.3",
+ "semver": "^5.5.0",
+ "source-map-support": "^0.5.6",
+ "stat-mode": "^0.2.2",
+ "temp-file": "^3.1.3"
+ },
+ "dependencies": {
+ "js-yaml": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
+ "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ }
+ }
+ },
+ "builder-util-runtime": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-4.4.1.tgz",
+ "integrity": "sha512-8L2pbL6D3VdI1f8OMknlZJpw0c7KK15BRz3cY77AOUElc4XlCv2UhVV01jJM7+6Lx7henaQh80ALULp64eFYAQ==",
+ "dev": true,
+ "requires": {
+ "bluebird-lst": "^1.0.5",
+ "debug": "^3.1.0",
+ "fs-extra-p": "^4.6.1",
+ "sax": "^1.2.4"
+ }
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "dev": true
+ },
"bytes": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
"integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
},
+ "cacheable-request": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz",
+ "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=",
+ "requires": {
+ "clone-response": "1.0.2",
+ "get-stream": "3.0.0",
+ "http-cache-semantics": "3.8.1",
+ "keyv": "3.0.0",
+ "lowercase-keys": "1.0.0",
+ "normalize-url": "2.0.1",
+ "responselike": "1.0.2"
+ },
+ "dependencies": {
+ "lowercase-keys": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz",
+ "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY="
+ }
+ }
+ },
+ "camelcase": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+ "dev": true
+ },
+ "camelcase-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "dev": true,
+ "requires": {
+ "camelcase": "^2.0.0",
+ "map-obj": "^1.0.0"
+ }
+ },
+ "camelize": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz",
+ "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs="
+ },
+ "capture-stack-trace": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz",
+ "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=",
+ "dev": true
+ },
"caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
},
+ "caw": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz",
+ "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==",
+ "requires": {
+ "get-proxy": "^2.0.0",
+ "isurl": "^1.0.0-alpha5",
+ "tunnel-agent": "^0.6.0",
+ "url-to-options": "^1.0.1"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "chromium-pickle-js": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz",
+ "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=",
+ "dev": true
+ },
+ "ci-info": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz",
+ "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==",
+ "dev": true
+ },
+ "cli-boxes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
+ "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=",
+ "dev": true
+ },
+ "clone-response": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
+ "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
+ "requires": {
+ "mimic-response": "^1.0.0"
+ }
+ },
"co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
"integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
},
+ "code-point-at": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+ "dev": true
+ },
+ "color-convert": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz",
+ "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.1"
+ }
+ },
+ "color-name": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz",
+ "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=",
+ "dev": true
+ },
"combined-stream": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
@@ -172,16 +660,139 @@
"integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
"dev": true
},
+ "compare-version": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz",
+ "integrity": "sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=",
+ "dev": true
+ },
+ "compressible": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.14.tgz",
+ "integrity": "sha1-MmxfUH+7BV9UEWeCuWmoG2einac=",
+ "requires": {
+ "mime-db": ">= 1.34.0 < 2"
+ },
+ "dependencies": {
+ "mime-db": {
+ "version": "1.35.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz",
+ "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg=="
+ }
+ }
+ },
+ "compression": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz",
+ "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==",
+ "requires": {
+ "accepts": "~1.3.5",
+ "bytes": "3.0.0",
+ "compressible": "~2.0.14",
+ "debug": "2.6.9",
+ "on-headers": "~1.0.1",
+ "safe-buffer": "5.1.2",
+ "vary": "~1.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ }
+ }
+ },
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "config-chain": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz",
+ "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=",
+ "requires": {
+ "ini": "^1.3.4",
+ "proto-list": "~1.2.1"
+ }
+ },
+ "configstore": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz",
+ "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==",
+ "dev": true,
+ "requires": {
+ "dot-prop": "^4.1.0",
+ "graceful-fs": "^4.1.2",
+ "make-dir": "^1.0.0",
+ "unique-string": "^1.0.0",
+ "write-file-atomic": "^2.0.0",
+ "xdg-basedir": "^3.0.0"
+ }
},
"content-disposition": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
"integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
},
+ "content-security-policy-builder": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-2.0.0.tgz",
+ "integrity": "sha512-j+Nhmj1yfZAikJLImCvPJFE29x/UuBi+/MWqggGGc515JKaZrjuei2RhULJmy0MsstW3E3htl002bwmBNMKr7w=="
+ },
"content-type": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
@@ -202,9 +813,18 @@
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
- "cross-env": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.0.tgz",
+ "create-error-class": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
+ "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
+ "dev": true,
+ "requires": {
+ "capture-stack-trace": "^1.0.0"
+ }
+ },
+ "cross-env": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.0.tgz",
"integrity": "sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg==",
"requires": {
"cross-spawn": "^6.0.5",
@@ -223,6 +843,21 @@
"which": "^1.2.9"
}
},
+ "crypto-random-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
+ "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=",
+ "dev": true
+ },
+ "currently-unhandled": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+ "dev": true,
+ "requires": {
+ "array-find-index": "^1.0.1"
+ }
+ },
"dashdash": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
@@ -231,6 +866,11 @@
"assert-plus": "^1.0.0"
}
},
+ "dasherize": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz",
+ "integrity": "sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg="
+ },
"dateformat": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz",
@@ -244,6 +884,143 @@
"ms": "2.0.0"
}
},
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
+ },
+ "decompress": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz",
+ "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=",
+ "requires": {
+ "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"
+ }
+ },
+ "decompress-response": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
+ "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
+ "requires": {
+ "mimic-response": "^1.0.0"
+ }
+ },
+ "decompress-tar": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz",
+ "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==",
+ "requires": {
+ "file-type": "^5.2.0",
+ "is-stream": "^1.1.0",
+ "tar-stream": "^1.5.2"
+ },
+ "dependencies": {
+ "file-type": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
+ "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY="
+ }
+ }
+ },
+ "decompress-tarbz2": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz",
+ "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==",
+ "requires": {
+ "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"
+ },
+ "dependencies": {
+ "file-type": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz",
+ "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg=="
+ }
+ }
+ },
+ "decompress-targz": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz",
+ "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==",
+ "requires": {
+ "decompress-tar": "^4.1.1",
+ "file-type": "^5.2.0",
+ "is-stream": "^1.1.0"
+ },
+ "dependencies": {
+ "file-type": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
+ "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY="
+ }
+ }
+ },
+ "decompress-unzip": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz",
+ "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=",
+ "requires": {
+ "file-type": "^3.8.0",
+ "get-stream": "^2.2.0",
+ "pify": "^2.3.0",
+ "yauzl": "^2.4.2"
+ },
+ "dependencies": {
+ "fd-slicer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+ "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
+ "requires": {
+ "pend": "~1.2.0"
+ }
+ },
+ "file-type": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
+ "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek="
+ },
+ "get-stream": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz",
+ "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=",
+ "requires": {
+ "object-assign": "^4.0.1",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
+ "requires": {
+ "buffer-crc32": "~0.2.3",
+ "fd-slicer": "~1.1.0"
+ }
+ }
+ }
+ },
+ "deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "dev": true
+ },
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -265,14 +1042,142 @@
"integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
"dev": true
},
- "download-file": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/download-file/-/download-file-0.1.5.tgz",
- "integrity": "sha1-ylC6ZNkJSwyHAu+f/5LSGJ4UERc=",
+ "dmg-builder": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-5.1.0.tgz",
+ "integrity": "sha512-Pyi64um0eZMwwyZeKM2ckhwuCQCvudcRXDwREHm7m9hYzzfKVWmExYXIV0+a9aaeqHesqxwfWyTwl3lwThW+Bw==",
+ "dev": true,
"requires": {
- "mkdirp": "^0.5.0"
+ "app-builder-lib": "~20.26.0",
+ "bluebird-lst": "^1.0.5",
+ "builder-util": "~5.20.0",
+ "fs-extra-p": "^4.6.1",
+ "iconv-lite": "^0.4.23",
+ "js-yaml": "^3.12.0",
+ "parse-color": "^1.0.0",
+ "sanitize-filename": "^1.6.1"
+ },
+ "dependencies": {
+ "iconv-lite": {
+ "version": "0.4.23",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
+ "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "js-yaml": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
+ "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ }
+ }
+ },
+ "dns-prefetch-control": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz",
+ "integrity": "sha1-YN20V3dOF48flBXwyrsOhbCzALI="
+ },
+ "dont-sniff-mimetype": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.0.0.tgz",
+ "integrity": "sha1-WTKJDcn04vGeXrAqIAJuXl78j1g="
+ },
+ "dot-prop": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
+ "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
+ "dev": true,
+ "requires": {
+ "is-obj": "^1.0.0"
+ }
+ },
+ "dotenv": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.0.0.tgz",
+ "integrity": "sha512-FlWbnhgjtwD+uNLUGHbMykMOYQaTivdHEmYwAKFjn6GKe/CqY0fNae93ZHTd20snh9ZLr8mTzIL9m0APQ1pjQg==",
+ "dev": true
+ },
+ "dotenv-expand": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz",
+ "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=",
+ "dev": true
+ },
+ "download": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz",
+ "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==",
+ "requires": {
+ "archive-type": "^4.0.0",
+ "caw": "^2.0.1",
+ "content-disposition": "^0.5.2",
+ "decompress": "^4.2.0",
+ "ext-name": "^5.0.0",
+ "file-type": "^8.1.0",
+ "filenamify": "^2.0.0",
+ "get-stream": "^3.0.0",
+ "got": "^8.3.1",
+ "make-dir": "^1.2.0",
+ "p-event": "^2.1.0",
+ "pify": "^3.0.0"
+ },
+ "dependencies": {
+ "got": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz",
+ "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==",
+ "requires": {
+ "@sindresorhus/is": "^0.7.0",
+ "cacheable-request": "^2.1.1",
+ "decompress-response": "^3.3.0",
+ "duplexer3": "^0.1.4",
+ "get-stream": "^3.0.0",
+ "into-stream": "^3.1.0",
+ "is-retry-allowed": "^1.1.0",
+ "isurl": "^1.0.0-alpha5",
+ "lowercase-keys": "^1.0.0",
+ "mimic-response": "^1.0.0",
+ "p-cancelable": "^0.4.0",
+ "p-timeout": "^2.0.1",
+ "pify": "^3.0.0",
+ "safe-buffer": "^5.1.1",
+ "timed-out": "^4.0.1",
+ "url-parse-lax": "^3.0.0",
+ "url-to-options": "^1.0.1"
+ }
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
+ },
+ "prepend-http": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
+ "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc="
+ },
+ "url-parse-lax": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
+ "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
+ "requires": {
+ "prepend-http": "^2.0.0"
+ }
+ }
}
},
+ "duplexer3": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
+ },
"ecc-jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
@@ -287,11 +1192,312 @@
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
+ "ejs": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz",
+ "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ=="
+ },
+ "electron": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/electron/-/electron-2.0.6.tgz",
+ "integrity": "sha512-1UHBWHF2EMjjVyTvcdcUBmISnoxElY4cUgkFVslw5pM1HxTVzi2vev+8NBohdLLFGbIbPyNua5vcBg+bxo1rqw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "^8.0.24",
+ "electron-download": "^3.0.1",
+ "extract-zip": "^1.0.3"
+ }
+ },
+ "electron-builder": {
+ "version": "20.26.1",
+ "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-20.26.1.tgz",
+ "integrity": "sha512-WEqb8BVdcc8uSfWW9TA9WrltG4TDydwhlUIINkyXVOz68ckV56dSt383unTT9Awo+6oFsjABZdMMYtAjLAuDEw==",
+ "dev": true,
+ "requires": {
+ "app-builder-lib": "20.26.1",
+ "bluebird-lst": "^1.0.5",
+ "builder-util": "5.20.1",
+ "builder-util-runtime": "4.4.1",
+ "chalk": "^2.4.1",
+ "dmg-builder": "5.1.0",
+ "fs-extra-p": "^4.6.1",
+ "is-ci": "^1.1.0",
+ "lazy-val": "^1.0.3",
+ "read-config-file": "3.1.0",
+ "sanitize-filename": "^1.6.1",
+ "update-notifier": "^2.5.0",
+ "yargs": "^12.0.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ },
+ "cliui": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
+ "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^2.1.1",
+ "strip-ansi": "^4.0.0",
+ "wrap-ansi": "^2.0.0"
+ }
+ },
+ "decamelize": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz",
+ "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==",
+ "dev": true,
+ "requires": {
+ "xregexp": "4.0.0"
+ }
+ },
+ "find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^3.0.0"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "os-locale": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
+ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
+ "dev": true,
+ "requires": {
+ "execa": "^0.7.0",
+ "lcid": "^1.0.0",
+ "mem": "^1.1.0"
+ }
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ },
+ "which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+ "dev": true
+ },
+ "yargs": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.1.tgz",
+ "integrity": "sha512-B0vRAp1hRX4jgIOWFtjfNjd9OA9RWYZ6tqGA9/I/IrTMsxmKvtWy+ersM+jzpQqbC3YfLzeABPdeTgcJ9eu1qQ==",
+ "dev": true,
+ "requires": {
+ "cliui": "^4.0.0",
+ "decamelize": "^2.0.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^1.0.1",
+ "os-locale": "^2.0.0",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^1.0.1",
+ "set-blocking": "^2.0.0",
+ "string-width": "^2.0.0",
+ "which-module": "^2.0.0",
+ "y18n": "^3.2.1 || ^4.0.0",
+ "yargs-parser": "^10.1.0"
+ }
+ },
+ "yargs-parser": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
+ "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^4.1.0"
+ }
+ }
+ }
+ },
+ "electron-download": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-3.3.0.tgz",
+ "integrity": "sha1-LP1U1pZsAZxNSa1l++Zcyc3vaMg=",
+ "dev": true,
+ "requires": {
+ "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"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "fs-extra": {
+ "version": "0.30.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz",
+ "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^2.1.0",
+ "klaw": "^1.0.0",
+ "path-is-absolute": "^1.0.0",
+ "rimraf": "^2.2.8"
+ }
+ },
+ "jsonfile": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
+ "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ }
+ }
+ },
+ "electron-osx-sign": {
+ "version": "0.4.10",
+ "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.10.tgz",
+ "integrity": "sha1-vk87ibKnWh3F8eckkIGrKSnKOiY=",
+ "dev": true,
+ "requires": {
+ "bluebird": "^3.5.0",
+ "compare-version": "^0.1.2",
+ "debug": "^2.6.8",
+ "isbinaryfile": "^3.0.2",
+ "minimist": "^1.2.0",
+ "plist": "^2.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ },
+ "plist": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/plist/-/plist-2.1.0.tgz",
+ "integrity": "sha1-V8zbeggh3yGDEhejytVOPhRqECU=",
+ "dev": true,
+ "requires": {
+ "base64-js": "1.2.0",
+ "xmlbuilder": "8.2.2",
+ "xmldom": "0.1.x"
+ }
+ }
+ }
+ },
+ "electron-publish": {
+ "version": "20.26.0",
+ "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-20.26.0.tgz",
+ "integrity": "sha512-CPh/U+qyyG8HXrS3s/E2JAgrmysIMDij9VTqz2QAUAwExH1e5V06iII0eMn47BFRRVqw4yF8VMzefuugpwAbkg==",
+ "dev": true,
+ "requires": {
+ "bluebird-lst": "^1.0.5",
+ "builder-util": "~5.20.0",
+ "builder-util-runtime": "^4.4.1",
+ "chalk": "^2.4.1",
+ "fs-extra-p": "^4.6.1",
+ "lazy-val": "^1.0.3",
+ "mime": "^2.3.1"
+ },
+ "dependencies": {
+ "mime": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz",
+ "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==",
+ "dev": true
+ }
+ }
+ },
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
},
+ "end-of-stream": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+ "requires": {
+ "once": "^1.4.0"
+ }
+ },
+ "env-paths": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz",
+ "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=",
+ "dev": true
+ },
+ "error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "es6-promise": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz",
+ "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==",
+ "dev": true
+ },
"escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -300,8 +1506,7 @@
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
},
"esprima": {
"version": "4.0.1",
@@ -321,6 +1526,39 @@
"fast-levenshtein": "^2.0.6"
}
},
+ "execa": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+ "dev": true,
+ "requires": {
+ "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"
+ },
+ "dependencies": {
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^4.0.1",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ }
+ }
+ }
+ },
+ "expect-ct": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.1.1.tgz",
+ "integrity": "sha512-ngXzTfoRGG7fYens3/RMb6yYoVLvLMfmsSllP/mZPxNHgFq41TmPSLF/nLY7fwoclI2vElvAmILFWGUYqdjfCg=="
+ },
"express": {
"version": "4.16.3",
"resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz",
@@ -358,6 +1596,23 @@
"vary": "~1.1.2"
},
"dependencies": {
+ "body-parser": {
+ "version": "1.18.2",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
+ "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
+ "requires": {
+ "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"
+ }
+ },
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -371,6 +1626,11 @@
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
},
+ "iconv-lite": {
+ "version": "0.4.19",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
+ "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
+ },
"mime-db": {
"version": "1.35.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz",
@@ -384,6 +1644,17 @@
"mime-db": "~1.35.0"
}
},
+ "raw-body": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
+ "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
+ "requires": {
+ "bytes": "3.0.0",
+ "http-errors": "1.6.2",
+ "iconv-lite": "0.4.19",
+ "unpipe": "1.0.0"
+ }
+ },
"setprototypeof": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
@@ -405,11 +1676,60 @@
}
}
},
- "extend": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
- "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ="
- },
+ "ext-list": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz",
+ "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==",
+ "requires": {
+ "mime-db": "^1.28.0"
+ }
+ },
+ "ext-name": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz",
+ "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==",
+ "requires": {
+ "ext-list": "^2.0.0",
+ "sort-keys-length": "^1.0.0"
+ }
+ },
+ "extend": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
+ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ="
+ },
+ "extract-zip": {
+ "version": "1.6.7",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz",
+ "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=",
+ "dev": true,
+ "requires": {
+ "concat-stream": "1.6.2",
+ "debug": "2.6.9",
+ "mkdirp": "0.5.1",
+ "yauzl": "2.4.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ }
+ }
+ },
"extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
@@ -430,6 +1750,35 @@
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
},
+ "fd-slicer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
+ "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
+ "dev": true,
+ "requires": {
+ "pend": "~1.2.0"
+ }
+ },
+ "file-type": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz",
+ "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ=="
+ },
+ "filename-reserved-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
+ "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik="
+ },
+ "filenamify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz",
+ "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==",
+ "requires": {
+ "filename-reserved-regex": "^2.0.0",
+ "strip-outer": "^1.0.0",
+ "trim-repeated": "^1.0.0"
+ }
+ },
"finalhandler": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
@@ -459,6 +1808,16 @@
}
}
},
+ "find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "dev": true,
+ "requires": {
+ "path-exists": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
"forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
@@ -479,25 +1838,122 @@
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
},
+ "frameguard": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/frameguard/-/frameguard-3.0.0.tgz",
+ "integrity": "sha1-e8rUae57lukdEs6zlZx4I1qScuk="
+ },
"fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
},
+ "from2": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+ "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
+ "requires": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "fs-constants": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
+ },
"fs-extra": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
- "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.0.tgz",
+ "integrity": "sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ==",
"requires": {
"graceful-fs": "^4.1.2",
"jsonfile": "^4.0.0",
"universalify": "^0.1.0"
}
},
+ "fs-extra-p": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/fs-extra-p/-/fs-extra-p-4.6.1.tgz",
+ "integrity": "sha512-IsTMbUS0svZKZTvqF4vDS9c/L7Mw9n8nZQWWeSzAGacOSe+8CzowhUN0tdZEZFIJNP5HC7L9j3MMikz/G4hDeQ==",
+ "dev": true,
+ "requires": {
+ "bluebird-lst": "^1.0.5",
+ "fs-extra": "^6.0.1"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz",
+ "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ }
+ }
+ },
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "get-caller-file": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
+ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
+ "dev": true
+ },
+ "get-proxy": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz",
+ "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==",
+ "requires": {
+ "npm-conf": "^1.1.0"
+ }
+ },
+ "get-stdin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+ "dev": true
+ },
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
},
"getpass": {
"version": "0.1.7",
@@ -511,6 +1967,7 @@
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
"integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -520,11 +1977,49 @@
"path-is-absolute": "^1.0.0"
}
},
+ "global-dirs": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
+ "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
+ "dev": true,
+ "requires": {
+ "ini": "^1.3.4"
+ }
+ },
+ "got": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
+ "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
+ "dev": true,
+ "requires": {
+ "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"
+ }
+ },
+ "graceful-dns": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/graceful-dns/-/graceful-dns-1.2.0.tgz",
+ "integrity": "sha512-5wK/4h/yF7aEF5CqhMVGHJq3cg3iX9Kf/NOj2OXjd39npMlGB+MnFCSIwVGwMXnXY95NbogVNhn08Q59xtijag=="
+ },
"graceful-fs": {
"version": "4.1.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
"integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
},
+ "graceful-readlink": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU="
+ },
"growl": {
"version": "1.10.5",
"resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
@@ -551,12 +2046,93 @@
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
+ "has-symbol-support-x": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz",
+ "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw=="
+ },
+ "has-to-string-tag-x": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz",
+ "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==",
+ "requires": {
+ "has-symbol-support-x": "^1.4.1"
+ }
+ },
"he": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
"integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
"dev": true
},
+ "helmet": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.13.0.tgz",
+ "integrity": "sha512-rCYnlbOBkeP6fCo4sXZNu91vIAWlbVgolwnUANtnzPANRf2kJZ2a6yjRnCqG23Tyl2/ExvJ8bDg4xUdNCIWnrw==",
+ "requires": {
+ "dns-prefetch-control": "0.1.0",
+ "dont-sniff-mimetype": "1.0.0",
+ "expect-ct": "0.1.1",
+ "frameguard": "3.0.0",
+ "helmet-crossdomain": "0.3.0",
+ "helmet-csp": "2.7.1",
+ "hide-powered-by": "1.0.0",
+ "hpkp": "2.0.0",
+ "hsts": "2.1.0",
+ "ienoopen": "1.0.0",
+ "nocache": "2.0.0",
+ "referrer-policy": "1.1.0",
+ "x-xss-protection": "1.1.0"
+ }
+ },
+ "helmet-crossdomain": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/helmet-crossdomain/-/helmet-crossdomain-0.3.0.tgz",
+ "integrity": "sha512-YiXhj0E35nC4Na5EPE4mTfoXMf9JTGpN4OtB4aLqShKuH9d2HNaJX5MQoglO6STVka0uMsHyG5lCut5Kzsy7Lg=="
+ },
+ "helmet-csp": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.7.1.tgz",
+ "integrity": "sha512-sCHwywg4daQ2mY0YYwXSZRsgcCeerUwxMwNixGA7aMLkVmPTYBl7gJoZDHOZyXkqPrtuDT3s2B1A+RLI7WxSdQ==",
+ "requires": {
+ "camelize": "1.0.0",
+ "content-security-policy-builder": "2.0.0",
+ "dasherize": "2.0.0",
+ "platform": "1.3.5"
+ }
+ },
+ "hide-powered-by": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.0.0.tgz",
+ "integrity": "sha1-SoWtZYgfYoV/xwr3F0oRhNzM4ys="
+ },
+ "home-path": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.6.tgz",
+ "integrity": "sha512-wo+yjrdAtoXt43Vy92a+0IPCYViiyLAHyp0QVS4xL/tfvVz5sXIW1ubLZk3nhVkD92fQpUMKX+fzMjr5F489vw==",
+ "dev": true
+ },
+ "hosted-git-info": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
+ "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
+ "dev": true
+ },
+ "hpkp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz",
+ "integrity": "sha1-EOFCJk52IVpdMMROxD3mTe5tFnI="
+ },
+ "hsts": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.1.0.tgz",
+ "integrity": "sha512-zXhh/DqgrTXJ7erTN6Fh5k/xjMhDGXCqdYN3wvxUvGUQvnxcFfUd8E+6vLg/nk3ss1TYMb+DhRl25fYABioTvA=="
+ },
+ "http-cache-semantics": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz",
+ "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w=="
+ },
"http-errors": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
@@ -578,15 +2154,42 @@
"sshpk": "^1.7.0"
}
},
- "iconv-lite": {
- "version": "0.4.19",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
- "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
+ "ieee754": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz",
+ "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA=="
+ },
+ "ienoopen": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.0.0.tgz",
+ "integrity": "sha1-NGpCj0dKrI9QzzeE6i0PFvYr2ms="
+ },
+ "import-lazy": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
+ "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
+ "dev": true
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "indent-string": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+ "dev": true,
+ "requires": {
+ "repeating": "^2.0.0"
+ }
},
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
"requires": {
"once": "^1.3.0",
"wrappy": "1"
@@ -597,21 +2200,166 @@
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
},
+ "ini": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
+ },
+ "into-stream": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz",
+ "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=",
+ "requires": {
+ "from2": "^2.1.1",
+ "p-is-promise": "^1.1.0"
+ }
+ },
+ "invert-kv": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
+ "dev": true
+ },
"ipaddr.js": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz",
"integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs="
},
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
+ "is-builtin-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+ "dev": true,
+ "requires": {
+ "builtin-modules": "^1.0.0"
+ }
+ },
+ "is-ci": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz",
+ "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==",
+ "dev": true,
+ "requires": {
+ "ci-info": "^1.0.0"
+ }
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "is-installed-globally": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
+ "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
+ "dev": true,
+ "requires": {
+ "global-dirs": "^0.1.0",
+ "is-path-inside": "^1.0.0"
+ }
+ },
+ "is-natural-number": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz",
+ "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg="
+ },
+ "is-npm": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
+ "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=",
+ "dev": true
+ },
+ "is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+ "dev": true
+ },
+ "is-object": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz",
+ "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA="
+ },
+ "is-path-inside": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
+ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+ "dev": true,
+ "requires": {
+ "path-is-inside": "^1.0.1"
+ }
+ },
+ "is-plain-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+ "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
+ },
+ "is-redirect": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
+ "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=",
+ "dev": true
+ },
+ "is-retry-allowed": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
+ "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ="
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
+ },
"is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
},
+ "is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+ "dev": true
+ },
"is-windows": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
"integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
},
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "isbinaryfile": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz",
+ "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==",
+ "dev": true,
+ "requires": {
+ "buffer-alloc": "^1.2.0"
+ }
+ },
"isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -622,6 +2370,15 @@
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
},
+ "isurl": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz",
+ "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==",
+ "requires": {
+ "has-to-string-tag-x": "^1.2.0",
+ "is-object": "^1.0.1"
+ }
+ },
"js-yaml": {
"version": "3.9.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.9.0.tgz",
@@ -637,6 +2394,11 @@
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
"optional": true
},
+ "json-buffer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
+ "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg="
+ },
"json-schema": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
@@ -652,6 +2414,23 @@
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
},
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ }
+ }
+ },
"jsonfile": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
@@ -665,17 +2444,178 @@
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
"integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
"requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.2.3",
- "verror": "1.10.0"
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.0"
+ }
+ },
+ "keyv": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz",
+ "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==",
+ "requires": {
+ "json-buffer": "3.0.0"
+ }
+ },
+ "klaw": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
+ "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.9"
+ }
+ },
+ "latest-version": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
+ "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
+ "dev": true,
+ "requires": {
+ "package-json": "^4.0.0"
+ }
+ },
+ "lazy-val": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.3.tgz",
+ "integrity": "sha512-pjCf3BYk+uv3ZcPzEVM0BFvO9Uw58TmlrU0oG5tTrr9Kcid3+kdKxapH8CjdYmVa2nO5wOoZn2rdvZx2PKj/xg==",
+ "dev": true
+ },
+ "lcid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "dev": true,
+ "requires": {
+ "invert-kv": "^1.0.0"
+ }
+ },
+ "load-json-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0",
+ "strip-bom": "^2.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "dependencies": {
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true
+ }
+ }
+ },
+ "loud-rejection": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+ "dev": true,
+ "requires": {
+ "currently-unhandled": "^0.4.1",
+ "signal-exit": "^3.0.0"
+ }
+ },
+ "lowercase-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
+ },
+ "lru-cache": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz",
+ "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==",
+ "dev": true,
+ "requires": {
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
+ },
+ "dependencies": {
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+ "dev": true
+ }
+ }
+ },
+ "make-dir": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
+ "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
+ "requires": {
+ "pify": "^3.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
+ }
}
},
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true
+ },
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
},
+ "mem": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
+ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^1.0.0"
+ }
+ },
+ "meow": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+ "dev": true,
+ "requires": {
+ "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"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ }
+ }
+ },
"merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
@@ -704,10 +2644,22 @@
"mime-db": "~1.29.0"
}
},
+ "mimic-fn": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+ "dev": true
+ },
+ "mimic-response": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+ "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
+ },
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
"requires": {
"brace-expansion": "^1.1.7"
}
@@ -715,15 +2667,8 @@
"minimist": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
- },
- "mkdirp": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz",
- "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=",
- "requires": {
- "minimist": "0.0.8"
- }
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
},
"mocha": {
"version": "5.2.0",
@@ -770,11 +2715,127 @@
"resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz",
"integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA=="
},
+ "nocache": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.0.0.tgz",
+ "integrity": "sha1-ICtIAhoMTL3i34DeFaF0Q8i0OYA="
+ },
+ "normalize-package-data": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
+ "dev": true,
+ "requires": {
+ "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-url": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz",
+ "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==",
+ "requires": {
+ "prepend-http": "^2.0.0",
+ "query-string": "^5.0.1",
+ "sort-keys": "^2.0.0"
+ },
+ "dependencies": {
+ "prepend-http": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
+ "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc="
+ },
+ "sort-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz",
+ "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=",
+ "requires": {
+ "is-plain-obj": "^1.0.0"
+ }
+ }
+ }
+ },
+ "npm-conf": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz",
+ "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==",
+ "requires": {
+ "config-chain": "^1.1.11",
+ "pify": "^3.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
+ }
+ }
+ },
+ "npm-run-path": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+ "dev": true,
+ "requires": {
+ "path-key": "^2.0.0"
+ }
+ },
+ "nugget": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz",
+ "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=",
+ "dev": true,
+ "requires": {
+ "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"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ }
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
"oauth-sign": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
"integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM="
},
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ },
+ "object-keys": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
+ "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=",
+ "dev": true
+ },
"on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
@@ -783,6 +2844,11 @@
"ee-first": "1.1.1"
}
},
+ "on-headers": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
+ "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c="
+ },
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -791,15 +2857,124 @@
"wrappy": "1"
}
},
+ "p-cancelable": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz",
+ "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ=="
+ },
+ "p-event": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.1.0.tgz",
+ "integrity": "sha512-sDEpDVnzLGlJj3k590uUdpfEUySP5yAYlvfTCu5hTDvSTXQVecYWKcEwdO49PrZlnJ5wkfAvtawnno/jyXeqvA==",
+ "requires": {
+ "p-timeout": "^2.0.1"
+ }
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
+ },
+ "p-is-promise": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
+ "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4="
+ },
+ "p-limit": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz",
+ "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.0.0"
+ }
+ },
+ "p-timeout": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz",
+ "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==",
+ "requires": {
+ "p-finally": "^1.0.0"
+ }
+ },
+ "p-try": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
+ "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
+ "dev": true
+ },
+ "package-json": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
+ "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
+ "dev": true,
+ "requires": {
+ "got": "^6.7.1",
+ "registry-auth-token": "^3.0.1",
+ "registry-url": "^3.0.3",
+ "semver": "^5.1.0"
+ }
+ },
+ "parse-color": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz",
+ "integrity": "sha1-e3SLlag/A/FqlPU15S1/PZRlhhk=",
+ "dev": true,
+ "requires": {
+ "color-convert": "~0.5.0"
+ },
+ "dependencies": {
+ "color-convert": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz",
+ "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=",
+ "dev": true
+ }
+ }
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "dev": true,
+ "requires": {
+ "error-ex": "^1.2.0"
+ }
+ },
"parseurl": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
"integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M="
},
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "dev": true,
+ "requires": {
+ "pinkie-promise": "^2.0.0"
+ }
+ },
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
},
"path-key": {
"version": "2.0.1",
@@ -811,11 +2986,116 @@
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
},
+ "path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
+ },
"performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
},
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "requires": {
+ "pinkie": "^2.0.0"
+ }
+ },
+ "platform": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz",
+ "integrity": "sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q=="
+ },
+ "plist": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz",
+ "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==",
+ "dev": true,
+ "requires": {
+ "base64-js": "^1.2.3",
+ "xmlbuilder": "^9.0.7",
+ "xmldom": "0.1.x"
+ },
+ "dependencies": {
+ "base64-js": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
+ "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
+ "dev": true
+ },
+ "xmlbuilder": {
+ "version": "9.0.7",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
+ "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=",
+ "dev": true
+ }
+ }
+ },
+ "prepend-http": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
+ "dev": true
+ },
+ "pretty-bytes": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz",
+ "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "^4.0.1",
+ "meow": "^3.1.0"
+ }
+ },
+ "private-ip": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/private-ip/-/private-ip-1.0.5.tgz",
+ "integrity": "sha1-ItAYP7oJ0OwaKk4PRv63cVY9FEk="
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
+ },
+ "progress-stream": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz",
+ "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=",
+ "dev": true,
+ "requires": {
+ "speedometer": "~0.1.2",
+ "through2": "~0.2.3"
+ }
+ },
+ "proto-list": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
+ "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk="
+ },
"proxy-addr": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz",
@@ -825,35 +3105,179 @@
"ipaddr.js": "1.6.0"
}
},
- "punycode": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
- "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+ "dev": true
},
"qs": {
"version": "6.5.1",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
"integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
},
- "querystring": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
- "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
+ "query-string": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz",
+ "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==",
+ "requires": {
+ "decode-uri-component": "^0.2.0",
+ "object-assign": "^4.1.0",
+ "strict-uri-encode": "^1.0.0"
+ }
},
"range-parser": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
"integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
},
- "raw-body": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
- "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
+ "rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "dev": true,
"requires": {
- "bytes": "3.0.0",
- "http-errors": "1.6.2",
- "iconv-lite": "0.4.19",
- "unpipe": "1.0.0"
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ }
+ }
+ },
+ "read-config-file": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-3.1.0.tgz",
+ "integrity": "sha512-z3VTrR9fgFu+Ll6MhTdtxbPFBKNGKgzYYnRjOcZvQeE/zwJTjPYVrps0ATgaSWU2/BnucUg3knP+Oz4zo9vEoA==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.5.2",
+ "ajv-keywords": "^3.2.0",
+ "bluebird-lst": "^1.0.5",
+ "dotenv": "^6.0.0",
+ "dotenv-expand": "^4.2.0",
+ "fs-extra-p": "^4.6.1",
+ "js-yaml": "^3.12.0",
+ "json5": "^1.0.1",
+ "lazy-val": "^1.0.3"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz",
+ "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^2.0.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.1"
+ }
+ },
+ "fast-deep-equal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
+ "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ }
+ }
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "^1.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^1.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+ "dev": true,
+ "requires": {
+ "find-up": "^1.0.0",
+ "read-pkg": "^1.0.0"
+ }
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "redent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "dev": true,
+ "requires": {
+ "indent-string": "^2.1.0",
+ "strip-indent": "^1.0.1"
+ }
+ },
+ "referrer-policy": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.1.0.tgz",
+ "integrity": "sha1-NXdOtzW/UPtsB46DM0tHI1AgfXk="
+ },
+ "registry-auth-token": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
+ "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==",
+ "dev": true,
+ "requires": {
+ "rc": "^1.1.6",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "registry-url": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
+ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
+ "dev": true,
+ "requires": {
+ "rc": "^1.0.1"
+ }
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "^1.0.0"
}
},
"request": {
@@ -898,10 +3322,31 @@
}
}
},
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true
+ },
+ "require-main-filename": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+ "dev": true
+ },
+ "responselike": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
+ "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
+ "requires": {
+ "lowercase-keys": "^1.0.0"
+ }
+ },
"rimraf": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
"integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+ "dev": true,
"requires": {
"glob": "^7.0.5"
}
@@ -916,11 +3361,53 @@
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
+ "sanitize-filename": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.1.tgz",
+ "integrity": "sha1-YS2hyWRz+gLczaktzVtKsWSmdyo=",
+ "dev": true,
+ "requires": {
+ "truncate-utf8-bytes": "^1.0.0"
+ }
+ },
+ "sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+ "dev": true
+ },
+ "seek-bzip": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz",
+ "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=",
+ "requires": {
+ "commander": "~2.8.1"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
+ "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
+ "requires": {
+ "graceful-readlink": ">= 1.0.0"
+ }
+ }
+ }
+ },
"semver": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
"integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
},
+ "semver-diff": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
+ "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
+ "dev": true,
+ "requires": {
+ "semver": "^5.0.3"
+ }
+ },
"send": {
"version": "0.16.2",
"resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
@@ -961,6 +3448,15 @@
}
}
},
+ "serialijse": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/serialijse/-/serialijse-0.1.3.tgz",
+ "integrity": "sha512-Ra9NpfBmQqfefQjte6fjk3KXOvkK8oiCfRhui9wIehkAwAu+sVYymQzwJ1xkSpWjqey4a3pcCa/ugB3vMWoEmw==",
+ "requires": {
+ "object-assign": "^4.1.1",
+ "zlib": "1.0.5"
+ }
+ },
"serve-static": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
@@ -972,6 +3468,12 @@
"send": "0.16.2"
}
},
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+ "dev": true
+ },
"setprototypeof": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
@@ -990,10 +3492,90 @@
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
"integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
},
- "shuffle-array": {
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+ "dev": true
+ },
+ "single-line-log": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz",
+ "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.1"
+ }
+ },
+ "sort-keys": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
+ "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
+ "requires": {
+ "is-plain-obj": "^1.0.0"
+ }
+ },
+ "sort-keys-length": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/shuffle-array/-/shuffle-array-1.0.1.tgz",
- "integrity": "sha1-xP88/nTRb5NzBZIwGyXmV3sSiYs="
+ "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz",
+ "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=",
+ "requires": {
+ "sort-keys": "^1.0.0"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "source-map-support": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz",
+ "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "spdx-correct": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz",
+ "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==",
+ "dev": true,
+ "requires": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz",
+ "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==",
+ "dev": true
+ },
+ "spdx-expression-parse": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
+ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+ "dev": true,
+ "requires": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-license-ids": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz",
+ "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==",
+ "dev": true
+ },
+ "speedometer": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz",
+ "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=",
+ "dev": true
},
"sprintf-js": {
"version": "1.0.3",
@@ -1016,11 +3598,115 @@
"tweetnacl": "~0.14.0"
}
},
+ "stat-mode": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz",
+ "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=",
+ "dev": true
+ },
"statuses": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
"integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
},
+ "strict-uri-encode": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
+ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM="
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "^0.2.0"
+ }
+ },
+ "strip-dirs": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz",
+ "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==",
+ "requires": {
+ "is-natural-number": "^4.0.1"
+ }
+ },
+ "strip-eof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+ "dev": true
+ },
+ "strip-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "^4.0.1"
+ }
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+ "dev": true
+ },
+ "strip-outer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
+ "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
+ "requires": {
+ "escape-string-regexp": "^1.0.2"
+ }
+ },
+ "sumchecker": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-1.3.1.tgz",
+ "integrity": "sha1-ebs7RFbdBPGOvbwNcDodHa7FEF0=",
+ "dev": true,
+ "requires": {
+ "debug": "^2.2.0",
+ "es6-promise": "^4.0.5"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
"supports-color": {
"version": "5.4.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
@@ -1030,6 +3716,106 @@
"has-flag": "^3.0.0"
}
},
+ "tar-stream": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz",
+ "integrity": "sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA==",
+ "requires": {
+ "bl": "^1.0.0",
+ "buffer-alloc": "^1.1.0",
+ "end-of-stream": "^1.0.0",
+ "fs-constants": "^1.0.0",
+ "readable-stream": "^2.3.0",
+ "to-buffer": "^1.1.0",
+ "xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
+ }
+ }
+ },
+ "temp-file": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.1.3.tgz",
+ "integrity": "sha512-oz2J77loDE9sGrlRTqBzwbsUvoBD2BpyXeaRPKyGwBIwaamSs2jdqAfhutw7Tch9llr1u8E2ruoug09rNPa3PA==",
+ "dev": true,
+ "requires": {
+ "async-exit-hook": "^2.0.1",
+ "bluebird-lst": "^1.0.5",
+ "fs-extra-p": "^4.6.1",
+ "lazy-val": "^1.0.3"
+ }
+ },
+ "term-size": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
+ "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=",
+ "dev": true,
+ "requires": {
+ "execa": "^0.7.0"
+ }
+ },
+ "throttleit": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz",
+ "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=",
+ "dev": true
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
+ },
+ "through2": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz",
+ "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "~1.1.9",
+ "xtend": "~2.1.1"
+ }
+ },
+ "timed-out": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
+ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8="
+ },
+ "to-buffer": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz",
+ "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg=="
+ },
"tough-cookie": {
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
@@ -1045,6 +3831,29 @@
}
}
},
+ "trim-newlines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+ "dev": true
+ },
+ "trim-repeated": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
+ "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=",
+ "requires": {
+ "escape-string-regexp": "^1.0.2"
+ }
+ },
+ "truncate-utf8-bytes": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz",
+ "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=",
+ "dev": true,
+ "requires": {
+ "utf8-byte-length": "^1.0.1"
+ }
+ },
"tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
@@ -1059,13 +3868,28 @@
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
"optional": true
},
- "type-is": {
- "version": "1.6.15",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz",
- "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=",
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "dev": true
+ },
+ "unbzip2-stream": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz",
+ "integrity": "sha512-izD3jxT8xkzwtXRUZjtmRwKnZoeECrfZ8ra/ketwOcusbZEp4mjULMnJOCfTDZBgGQAAY1AJ/IgxcwkavcX9Og==",
+ "requires": {
+ "buffer": "^3.0.1",
+ "through": "^2.3.6"
+ }
+ },
+ "unique-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
+ "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
+ "dev": true,
"requires": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.15"
+ "crypto-random-string": "^1.0.0"
}
},
"universalify": {
@@ -1078,15 +3902,72 @@
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
},
- "url": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
- "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+ "unzip-response": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
+ "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
+ "dev": true
+ },
+ "update-notifier": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz",
+ "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==",
+ "dev": true,
+ "requires": {
+ "boxen": "^1.2.1",
+ "chalk": "^2.0.1",
+ "configstore": "^3.0.0",
+ "import-lazy": "^2.1.0",
+ "is-ci": "^1.0.10",
+ "is-installed-globally": "^0.1.0",
+ "is-npm": "^1.0.0",
+ "latest-version": "^3.0.0",
+ "semver-diff": "^2.0.0",
+ "xdg-basedir": "^3.0.0"
+ }
+ },
+ "uri-js": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
+ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.0"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true
+ }
+ }
+ },
+ "url-parse-lax": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
+ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
+ "dev": true,
"requires": {
- "punycode": "1.3.2",
- "querystring": "0.2.0"
+ "prepend-http": "^1.0.1"
}
},
+ "url-to-options": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz",
+ "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k="
+ },
+ "utf8-byte-length": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz",
+ "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=",
+ "dev": true
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ },
"utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
@@ -1097,6 +3978,16 @@
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
"integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
},
+ "validate-npm-package-license": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz",
+ "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==",
+ "dev": true,
+ "requires": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
"vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
@@ -1120,10 +4011,132 @@
"isexe": "^2.0.0"
}
},
+ "widest-line": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz",
+ "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=",
+ "dev": true,
+ "requires": {
+ "string-width": "^2.1.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ }
+ }
+ },
+ "wrap-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1"
+ }
+ },
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ },
+ "write-file-atomic": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz",
+ "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.11",
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "x-xss-protection": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.1.0.tgz",
+ "integrity": "sha512-rx3GzJlgEeZ08MIcDsU2vY2B1QEriUKJTSiNHHUIem6eg9pzVOr2TL3Y4Pd6TMAM5D5azGjcxqI62piITBDHVg=="
+ },
+ "xdg-basedir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
+ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=",
+ "dev": true
+ },
+ "xmlbuilder": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz",
+ "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=",
+ "dev": true
+ },
+ "xmldom": {
+ "version": "0.1.27",
+ "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz",
+ "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=",
+ "dev": true
+ },
+ "xregexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz",
+ "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==",
+ "dev": true
+ },
+ "xtend": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz",
+ "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=",
+ "dev": true,
+ "requires": {
+ "object-keys": "~0.4.0"
+ }
+ },
+ "y18n": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+ "dev": true
+ },
+ "yauzl": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz",
+ "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=",
+ "dev": true,
+ "requires": {
+ "fd-slicer": "~1.0.1"
+ }
+ },
+ "zlib": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/zlib/-/zlib-1.0.5.tgz",
+ "integrity": "sha1-bnyXL8NxxkWmr7A6sUdp3vEU/MA=",
+ "optional": true
}
}
}
diff --git a/package.json b/package.json
index f6f05458..e5b40a3f 100644
--- a/package.json
+++ b/package.json
@@ -1,32 +1,57 @@
{
"name": "etherscamdb",
- "version": "2.0.0",
- "main": "run.js",
+ "version": "3.0.0",
+ "description": "Keeping track of all current ethereum scams in a large open-source database",
+ "keywords": "ethereum, ether, scam, scamming, phishing, database",
+ "homepage": "https://etherscamdb.info",
"license": "MIT",
+ "author": "Luit",
+ "main": "./src/scripts/electron.js",
"scripts": {
- "start": "cross-env NODE_ENV=development DEBUG=* node run.js",
- "test": "mocha ./tests/validate_data.js"
+ "start": "node src/app.js",
+ "start:dev": "cross-env NODE_ENV=development DEBUG=* node src/app.js --trace-sync-io",
+ "start:prod": "cross-env NODE_ENV=production DEBUG=-* node src/app.js",
+ "electron": "cross-env NODE_ENV=development DEBUG=* electron ./src/scripts/electron.js",
+ "build": "cross-env DEBUG=electron-builder node src/scripts/build.js",
+ "build:windows": "cross-env DEBUG=electron-builder ELECTRON_OS=windows node src/scripts/build.js",
+ "build:linux": "cross-env DEBUG=electron-builder ELECTRON_OS=linux node src/scripts/build.js",
+ "build:osx": "cross-env DEBUG=electron-builder ELECTRON_OS=osx node src/scripts/build.js",
+ "test": "mocha tests --recursive",
+ "clean": "rimraf cache.db node_modules dist config.json"
},
"repository": {
"type": "git",
"url": "git://github.com/MrLuit/EtherScamDB.git"
},
+ "build": {
+ "appId": "info.etherscamdb",
+ "mac": {
+ "category": "public.app-category.utilities"
+ }
+ },
"dependencies": {
- "body-parser": "^1.18.2",
+ "array-object-dictionary": "^1.0.0",
+ "bottleneck": "^2.6.0",
+ "compression": "^1.7.3",
"cross-env": "^5.2.0",
"dateformat": "^2.2.0",
"debug": "^3.1.0",
- "download-file": "^0.1.5",
+ "download": "^7.1.0",
+ "ejs": "^2.6.1",
"eth-phishing-detect": "^1.1.12",
"express": "^4.16.3",
- "fs-extra": "^5.0.0",
+ "fs-extra": "^7.0.0",
+ "graceful-dns": "^1.2.0",
+ "helmet": "^3.13.0",
"js-yaml": "^3.9.0",
+ "private-ip": "^1.0.5",
"request": "^2.87.0",
- "rimraf": "^2.6.2",
- "shuffle-array": "^1.0.1",
- "url": "^0.11.0"
+ "serialijse": "^0.1.3"
},
"devDependencies": {
- "mocha": "^5.2.0"
+ "electron": "2.0.6",
+ "electron-builder": "^20.26.1",
+ "mocha": "^5.2.0",
+ "rimraf": "^2.6.2"
}
}
diff --git a/run-locally.md b/run-locally.md
deleted file mode 100644
index 631b9e9e..00000000
--- a/run-locally.md
+++ /dev/null
@@ -1,25 +0,0 @@
-## EtherScamDB
-
-### Requirements:
-
-* node js (working on v8.9.4)
-* npm (working on v5.6.0)
-* git
-
-### Spin-Up Process:
-
-* `git clone https://github.com/mrluit/etherscamdb.git` - This will clone the project locally.
-* `cd etherscamdb` - Navigate into your newly-created project folder.
-* Rename the `config.example.js` file to `config.js`
- * Input API keys for abuseipdb, github, google safebrowsing, and urlscan.
-* Ensure the option `ping_domains` is set to `0` so you don’t contact any of the bad domains on your local machine.
-* `npm install` - This will install required dependencies
-* `npm update` - This will create and update a new `_cache/cache.json` file inside the project folder.
-* `npm run` - This will start the project running locally at `http://localhost:8080`
-
-### Why should I run it myself?
-
-Running it yourself will mean you can have your own instance of EtherScamDb so you will have a GUI and an API in case for
-whatever reason the etherscamdb.info domain is down. This is important to know as products start integrating with our APIs
-and you will want to have the option of privacy - for example, checking our APIs for specific addresses especially in an
-integration where we are checking if the address is blacklisted could be a privacy concern for you.
diff --git a/run.js b/run.js
deleted file mode 100644
index d2efe6f1..00000000
--- a/run.js
+++ /dev/null
@@ -1,1303 +0,0 @@
-'use strict';
-
-const fs = require('fs-extra');
-const debug = require('debug')('app');
-const express = require('express');
-const bodyParser = require('body-parser');
-const url = require('url');
-const dateFormat = require('dateformat');
-const {fork} = require('child_process');
-const download = require('download-file');
-const rimraf = require('rimraf');
-const phishingDetector = require('eth-phishing-detect/src/detector');
-const crypto = require("crypto");
-const request = require('request');
-const app = express();
-const config = require('./config');
-const check = require('./_utils/webcheck.js');
-const lookup = require('./_utils/lookup.js');
-
-
-let default_template = fs.readFileSync('./_layouts/default.html', 'utf8');
-let cache;
-let updating_now = false;
-let icon_warnings = [];
-var older_cache_time;
-
-
-if('perform_dns_lookup' in config && config.perform_dns_lookup === false) {
- default_template = default_template.replace("{{ config.perform_dns_lookup }}", "DNS lookups not performed due to configuration.
");
-} else {
- default_template = default_template.replace("{{ config.perform_dns_lookup }}", '');
-}
-
-/* See if there's an up-to-date cache, otherwise run `update.js` to create one. */
-function getCache(callback = false) {
- if (!fs.existsSync('_cache/cache.json')) {
- debug("No cache file found. Creating one...");
- if (callback) {
- if (!updating_now) {
- updating_now = true;
- fork('update.js');
- }
- var checkDone = setInterval(function() {
- if (fs.existsSync('_cache/cache.json')) {
- updating_now = false;
- cache = JSON.parse(fs.readFileSync('_cache/cache.json'));
- clearInterval(checkDone);
- debug("Successfully updated cache!");
- callback();
- }
- }, 1000);
- } else {
- fork('update.js');
- }
- } else if (!cache) {
- cache = JSON.parse(fs.readFileSync('_cache/cache.json'));
- if (callback) {
- callback();
- }
- } else if ((new Date().getTime() - cache.updated) < config.cache_refreshing_interval) {
- return cache;
- } else if ((new Date().getTime() - cache.updated) >= config.cache_refreshing_interval) {
- if (!updating_now) {
- updating_now = true;
- older_cache_time = cache.updated;
- fork('update.js');
- var checkDone2 = setInterval(function() {
- if (cache.updated != older_cache_time) {
- clearInterval(checkDone2);
- debug("Successfully updated cache!");
- updating_now = false;
- }
- }, 1000);
- }
- return cache;
- }
-}
-
-/* Generate an abuse report for a scam domain */
-function generateAbuseReport(scam) {
- let abusereport = "";
- abusereport += "I would like to inform you of suspicious activities at the domain " + url.parse(scam.url).hostname;
- if ('ip' in scam) {
- abusereport += " located at IP address " + scam['ip'] + ".";
- } else {
- abusereport += ".";
- }
- if ('subcategory' in scam && scam.subcategory == "MyEtherWallet") {
- abusereport += "The domain is impersonating MyEtherWallet.com, a website where people can create Ethereum wallets (a cryptocurrency like Bitcoin).";
- } else if ('subcategory' in scam && scam.subcategory == "MyCrypto") {
- abusereport += "The domain is impersonating MyCrypto.com, a website where people can create Ethereum wallets (a cryptocurrency like Bitcoin).";
- } else if ('subcategory' in scam && scam.subcategory == "Classic Ether Wallet") {
- abusereport += "The domain is impersonating classicetherwallet.com, a website where people can create Ethereum Classic wallets (a cryptocurrency like Bitcoin).";
- } else if ('category' in scam && scam.category == "Fake ICO") {
- abusereport += "The domain is impersonating a website where an ICO is being held (initial coin offering, like an initial public offering but it's for cryptocurrencies).";
- }
- if ('category' in scam && scam.category == "Phishing") {
- abusereport += "\r\n\r\nThe attackers wish to steal funds by using phishing to get the victim's private keys (passwords to a wallet) and using them to send funds to their own wallets.";
- } else if ('category' in scam && scam.category == "Fake ICO") {
- abusereport += "\r\n\r\nThe attackers wish to steal funds by cloning the real website and changing the ethereum address so people will send funds to the attackers' address instead of the real address.";
- }
- abusereport += "\r\n\r\nPlease shut down this domain so further attacks will be prevented.";
- return abusereport;
-}
-
-/* Start the web server */
-function startWebServer() {
- app.use(express.static('_static')); // Serve all static pages first
-
- app.use('/screenshot', express.static('_cache/screenshots/')); // Serve all screenshots
-
- app.use(bodyParser.json()); // to support JSON-encoded bodies
-
- app.get('/(/|index.html)?', function(req, res) { // Serve index.html
- res.send(default_template.replace('{{ content }}', fs.readFileSync('./_layouts/index.html', 'utf8')));
- });
-
- app.get('/search/', function(req, res) { // Serve /search/
- let table = "";
- getCache().legiturls.sort(function(a, b) {
- return a.name.localeCompare(b.name);
- }).forEach(function(url) {
- if ('featured' in url && url.featured) {
- if (fs.existsSync("_static/img/" + url.name.toLowerCase().replace(' ', '') + ".png")) {
- table += " " + url.name + "" + url.url + " ";
- } else {
- debug("Warning: No verified icon was found for %s",url.name);
- table += "" + url.name + " " + url.url + " ";
- }
- }
- });
- var template = fs.readFileSync('./_layouts/search.html', 'utf8').replace('{{ trusted.table }}', table);
- res.send(default_template.replace('{{ content }}', template));
- });
-
- app.get('/faq/', function(req, res) { // Serve /faq/
- res.send(default_template.replace('{{ content }}', fs.readFileSync('./_layouts/faq.html', 'utf8')));
- });
-
- app.get('/report/:type?/:value?', function(req, res) { // Serve /report/, /report/domain/, and /report/address/ (or /report/domain/fake-mycrypto.com
- if (!req.params.type) {
- res.send(default_template.replace('{{ content }}', fs.readFileSync('./_layouts/report.html', 'utf8')));
- } else if (req.params.type == "address") {
- if (req.params.value) {
- res.send(default_template.replace('{{ content }}', fs.readFileSync('./_layouts/reportaddress.html', 'utf8')).replace('{{ page.placeholder }}', req.params.value));
- } else {
- res.send(default_template.replace('{{ content }}', fs.readFileSync('./_layouts/reportaddress.html', 'utf8')).replace('{{ page.placeholder }}', ''));
- }
- } else if (req.params.type == "domain") {
- if (req.params.value) {
- res.send(default_template.replace('{{ content }}', fs.readFileSync('./_layouts/reportdomain.html', 'utf8')).replace('{{ page.placeholder }}', req.params.value));
- } else {
- res.send(default_template.replace('{{ content }}', fs.readFileSync('./_layouts/reportdomain.html', 'utf8')).replace('{{ page.placeholder }}', ''));
- }
- } else {
- res.sendStatus(404);
- }
- });
-
- app.get('/scams/:page?/:sorting?/', function(req, res) { // Serve /scams/
- const MAX_RESULTS_PER_PAGE = 30;
- let template = fs.readFileSync('./_layouts/scams.html', 'utf8');
- if (!req.params.sorting || req.params.sorting == 'latest') {
- var scams = getCache().scams.sort(function(a, b) {
- return b.id - a.id;
- });
- } else if (req.params.sorting == 'oldest') {
- var scams = getCache().scams.sort(function(a, b) {
- return a.id - b.id;
- });
- } else if (req.params.sorting == 'status') {
- template = template.replace("{{ sorting.status }}", "sorted descending");
- var scams = getCache().scams.sort(function(a, b) {
- if ('status' in a && 'status' in b) {
- if ((a.status == 'Active' && b.status != 'Active') || (a.status == 'Inactive' && (b.status == 'Suspended' || b.status == 'Offline')) || (a.status == 'Suspended' && b.status == 'Offline')) {
- return -1;
- } else if (a.status == b.status) {
- return 0;
- } else {
- return 1;
- }
- } else {
- return 1;
- }
- });
- } else if (req.params.sorting == 'category') {
- template = template.replace("{{ sorting.category }}", "sorted descending");
- var scams = getCache().scams.sort(function(a, b) {
- if ('category' in a && 'category' in b && a.category && b.category) {
- return a.category.localeCompare(b.category);
- } else {
- return -1;
- }
- });
- } else if (req.params.sorting == 'subcategory') {
- template = template.replace("{{ sorting.subcategory }}", "sorted descending");
- var scams = getCache().scams.sort(function(a, b) {
- if ('subcategory' in a && 'subcategory' in b && a.subcategory && b.subcategory) {
- return a.subcategory.localeCompare(b.subcategory);
- } else {
- return -1;
- }
- });
- } else if (req.params.sorting == 'title') {
- template = template.replace("{{ sorting.title }}", "sorted descending");
- var scams = getCache().scams.sort(function(a, b) {
- return a.name.localeCompare(b.name);
- });
- } else {
- res.status(404).send(default_template.replace('{{ content }}', fs.readFileSync('./_layouts/404.html', 'utf8')));
- }
-
- template = template.replace("{{ sorting.category }}", "");
- template = template.replace("{{ sorting.subcategory }}", "");
- template = template.replace("{{ sorting.status }}", "");
- template = template.replace("{{ sorting.title }}", "");
-
- let addresses = {};
-
- var intActiveScams = 0;
- var intInactiveScams = 0;
-
- scams.forEach(function(scam, index) {
- if ('addresses' in scam) {
- scams[index].addresses.forEach(function(address) {
- addresses[address] = true;
- });
- }
-
- if ('status' in scam) {
- if (scam.status === 'Active') {
- ++intActiveScams;
- } else {
- ++intInactiveScams;
- }
- }
- });
-
- template = template.replace("{{ scams.total }}", scams.length.toLocaleString('en-US'));
- template = template.replace("{{ scams.active }}", intActiveScams.toLocaleString('en-US'));
- template = template.replace("{{ addresses.total }}", Object.keys(addresses).length.toLocaleString('en-US'));
- template = template.replace("{{ scams.inactive }}", intInactiveScams.toLocaleString('en-US'));
-
- var table = "";
- if (req.params.page == "all") {
- var max = scams.length - 1; //0-based indexing
- var start = 0;
- } else if (!isNaN(parseInt(req.params.page))) {
- var max = (req.params.page * MAX_RESULTS_PER_PAGE) + MAX_RESULTS_PER_PAGE;
- var start = req.params.page * MAX_RESULTS_PER_PAGE;
- } else {
- var max = MAX_RESULTS_PER_PAGE;
- var start = 0;
- }
- for (var i = start; i <= max; i++) {
- if (scams.hasOwnProperty(i) === false) {
- continue;
- }
- if ('status' in scams[i]) {
- if (scams[i].status == "Active") {
- var status = " Active ";
- } else if (scams[i].status == "Inactive") {
- var status = " Inactive ";
- } else if (scams[i].status == "Offline") {
- var status = " Offline ";
- } else if (scams[i].status == "Suspended") {
- var status = " Suspended ";
- } else if (scams[i].status == "NotChecked") {
- var status = " Not Checked ";
- }
- } else {
- var status = "None ";
- }
- if ('category' in scams[i]) {
- switch (scams[i].category) {
- case "Phishing":
- var category = ' Phishing';
- break;
- case "Scamming":
- var category = ' Scamming';
- break;
- case "Fake ICO":
- var category = ' Fake ICO';
- break;
- default:
- var category = scams[i].category;
- }
- } else {
- var category = ' None';
- }
- if ('subcategory' in scams[i] && scams[i].subcategory) {
- if (scams[i].subcategory.toLowerCase() == "wallets") {
- var subcategory = ' ' + scams[i].subcategory;
- } else if (fs.existsSync("_static/img/" + scams[i].subcategory.toLowerCase().replace(/\s/g, '') + ".png")) {
- var subcategory = " " + scams[i].subcategory;
- } else {
- var subcategory = scams[i].subcategory;
- if (!(icon_warnings.includes(subcategory))) {
- icon_warnings.push(subcategory);
- debug("Warning! No subcategory icon found for %s",subcategory);
- }
- }
- } else {
- var subcategory = ' None';
- }
- if (scams[i].name.length > 40) {
- scams[i].name = scams[i].name.substring(0, 40) + '...';
- }
- table += "" + category + " " + subcategory + " " + status + "" + scams[i].name + " ";
- }
- template = template.replace("{{ scams.table }}", table);
-
- if (req.params.page !== "all") {
- var intCurrentPage = 0;
- if (Number.parseInt(req.params.page) > 0) {
- intCurrentPage = req.params.page;
- }
- var strPagination = "";
- if (intCurrentPage == 0) {
- var arrLoop = [1, 6];
- } else if (intCurrentPage == 1) {
- var arrLoop = [0, 5];
- } else if (intCurrentPage == 2) {
- var arrLoop = [-1, 4];
- } else {
- var arrLoop = [-2, 3];
- }
- for (var i = arrLoop[0]; i < arrLoop[1]; i++) {
- var intPageNumber = (Number(intCurrentPage) + Number(i));
- var strItemClass = "item";
- var strHref = "/scams/" + intPageNumber + "/";
- if (req.params.sorting) {
- strHref += req.params.sorting + "/";
- }
- if ((intPageNumber > (scams.length) / MAX_RESULTS_PER_PAGE) || (intPageNumber < 1)) {
- strItemClass = "disabled item";
- strHref = "#";
- } else if (intCurrentPage == intPageNumber) {
- strItemClass = "active item";
- }
- strPagination += "" + intPageNumber + " ";
- }
- if (intCurrentPage > 3) {
- if (req.params.sorting) {
- strPagination = " " + strPagination;
- } else {
- strPagination = " " + strPagination;
- }
- }
- if (intCurrentPage < Math.ceil(scams.length / MAX_RESULTS_PER_PAGE) - 3) {
- if (req.params.sorting) {
- strPagination += " ";
- } else {
- strPagination += " ";
- }
- }
- } else {
- strPagination = "";
- }
- template = template.replace("{{ scams.pagination }}", "");
- res.send(default_template.replace('{{ content }}', template));
- });
-
- app.get('/scam/:id/', function(req, res) { // Serve /scam//
- var whitelistImports;
- var blacklistImports;
- var fuzzylistImports;
- var toleranceImports;
- let startTime = (new Date()).getTime();
- let scam = getCache().scams.find(function(scam) {
- return scam.id == req.params.id;
- });
-
- if(typeof scam === "undefined") {
- let template = fs.readFileSync('./_layouts/no-scam-found.html', 'utf8');
- res.send(default_template.replace('{{ content }}', template));
- }
- let template = fs.readFileSync('./_layouts/scam.html', 'utf8');
- var actions_text = "";
- template = template.replace("{{ scam.id }}", scam.id);
- template = template.replace("{{ scam.name }}", scam.name);
- if ('category' in scam) {
- if ('subcategory' in scam) {
- template = template.replace("{{ scam.category }}", 'Category : ' + scam.category + ' - ' + scam.subcategory + ' ');
- } else {
- template = template.replace("{{ scam.category }}", 'Category : ' + scam.category + ' ');
- }
- } else {
- template = template.replace("{{ scam." + name + " }}", '');
- }
- if ('status' in scam) {
- template = template.replace("{{ scam.status }}", 'Status : ' + scam.status + ' ');
- } else {
- template = template.replace("{{ scam.status }}", '');
- }
- if ('description' in scam) {
- template = template.replace("{{ scam.description }}", 'Description : ' + scam.description + ' ');
- } else {
- template = template.replace("{{ scam.description }}", '');
- }
- if ('nameservers' in scam) {
- var nameservers_text = '';
- scam.nameservers.forEach(function(nameserver) {
- nameservers_text += '' + nameserver + '
';
- });
- template = template.replace("{{ scam.nameservers }}", 'Nameservers : ' + nameservers_text + '
');
- } else {
- template = template.replace("{{ scam.nameservers }}", '');
- }
- if ('addresses' in scam) {
- var addresses_text = '';
- scam.addresses.forEach(function(address) {
- addresses_text += '';
- });
- template = template.replace("{{ scam.addresses }}", 'Related addresses : ' + addresses_text + '
');
- } else {
- template = template.replace("{{ scam.addresses }}", '');
- }
- if ('ip' in scam) {
- template = template.replace("{{ scam.ip }}", 'IP : ' + scam.ip + ' ');
- } else {
- template = template.replace("{{ scam.ip }}", '');
- }
- if ('url' in scam) {
- template = template.replace("{{ scam.abusereport }}", generateAbuseReport(scam));
- actions_text += ' Abuse Report ';
- actions_text += ' Archive ';
- template = template.replace("{{ scam.url }}", 'URL : ' + scam.url + ' ');
- template = template.replace("{{ scam.googlethreat }}", "Google Safe Browsing : {{ scam.googlethreat }} ");
- /* Parses data for Metamask*/
- if (fs.existsSync('./_data/metamaskImports.json')) {
- try {
- var importsData = require('./_data/metamaskImports.json')
- const detector = new phishingDetector(importsData);
- template = template.replace("{{ scam.metamask }}", "MetaMask Status: " + (detector.check(url.parse(scam.url).hostname).result ? "Blocked " : "Not Blocked ") + " ");
- } catch (e) {
- debug(e);
- }
- } else{
- debug('MetaMask JSON not found');
- };
- if ('status' in scam && scam.status != 'Offline' && fs.existsSync('_cache/screenshots/' + scam.id + '.png')) {
- template = template.replace("{{ scam.screenshot }}", 'Screenshot ');
- } else {
- template = template.replace("{{ scam.screenshot }}", '');
- }
- } else {
- template = template.replace("{{ scam.googlethreat }}", '');
- template = template.replace("{{ scam.screenshot }}", '');
- }
- actions_text += ' Improve Share ';
- template = template.replace("{{ scam.actions }}", '' + actions_text + '
');
- if ('Google_SafeBrowsing_API_Key' in config && config.Google_SafeBrowsing_API_Key && 'url' in scam) {
- var options = {
- uri: 'https://safebrowsing.googleapis.com/v4/threatMatches:find?key=' + config.Google_SafeBrowsing_API_Key,
- method: 'POST',
- json: {
- client: {
- clientId: "Ethereum Scam Database",
- clientVersion: "1.0.0"
- },
- threatInfo: {
- threatTypes: ["THREAT_TYPE_UNSPECIFIED", "MALWARE", "SOCIAL_ENGINEERING", "UNWANTED_SOFTWARE", "POTENTIALLY_HARMFUL_APPLICATION"],
- platformTypes: ["ANY_PLATFORM"],
- threatEntryTypes: ["THREAT_ENTRY_TYPE_UNSPECIFIED", "URL", "EXECUTABLE"],
- threatEntries: [{
- "url": url.parse(scam.url).hostname
- }]
- }
- }
- };
- request(options, function(error, response, body) {
- if (!error && response.statusCode == 200) {
- if ('matches' in body && 0 in body.matches) {
- template = template.replace("{{ scam.googlethreat }}", "Blocked for " + body.matches[0]['threatType'] + ' ');
- } else {
- template = template.replace("{{ scam.googlethreat }}", "Not Blocked ");
- }
- }
- template = template.replace("{{ page.built }}", 'This page was built in ' + ((new Date()).getTime() - startTime) + ' ms, and last updated at ' + dateFormat(getCache().updated, "UTC:mmm dd yyyy, HH:MM") + ' UTC
');
- res.send(default_template.replace('{{ content }}', template));
- });
- } else {
- debug("Warning: No Google Safe Browsing API key found");
- res.send(default_template.replace('{{ content }}', template));
- }
- });
-
- app.get('/domain/:domain/', function(req, res) { // Serve /domain//
- var whitelistImports;
- var blacklistImports;
- var fuzzylistImports;
- var toleranceImports;
- let domainpage = encodeURIComponent(req.params.domain.replace("www.","").split(/[/?#]/)[0].toLowerCase());
-
- if(/^([0-9a-z\.\-]+)$/.exec(domainpage) === null) {
- let template = fs.readFileSync('./_layouts/404.html', 'utf8');
- res.send(default_template.replace('{{ content }}', template));
- return;
- }
-
- var webcheck = new check();
- var urllookup = new lookup();
- let startTime = (new Date()).getTime();
-
- let scam = getCache().scams.find(function(scam) {
- return scam.name == domainpage;
- });
-
- let verified = getCache().legiturls.find(function(verified) {
- return verified.url.replace("https://", '') == domainpage;
- });
-
- // NEUTRAL DOMAIN PAGES
- if(typeof scam === "undefined" && typeof verified === "undefined") {
- let template = fs.readFileSync('./_layouts/neutraldomain.html', 'utf8');
- template = template.replace("{{ neutral.name }}", domainpage);
- template = template.replace("{{ neutral.url }}", 'URL : ' + "http://" + domainpage + ' ');
- template = template.replace("{{ neutral.notification }}", ' This domain has not yet been classified on EtherScamDB
')
- template = template.replace("{{ neutral.googlethreat }}", "Google Safe Browsing Status : {{ neutral.googlethreat }} ");
- template = template.replace("{{ neutral.virustotal }}", "VirusTotal Detections : {{ neutral.virustotal }} ");
- template = template.replace("{{ neutral.phishtank }}", "Phishtank Detected : {{ neutral.phishtank }} ");
- template = template.replace("{{ neutral.urlscan }}", "Urlscan Scan Results : {{ neutral.urlscan }} ");
- template = template.replace("{{ neutral.urlscreenshot }}", "Urlscan Screenshot : {{ neutral.urlscreenshot }} ");
- webcheck.lookup( domainpage ).then(function(output) {
- if(output.total == 0){
- template = template.replace("{{ neutral.urlscan }}", " Not Yet ");
- template = template.replace("{{ neutral.urlscreenshot }}", " Screenshot could not be displayed ");
- res.send(default_template.replace('{{ content }}', template));
- } else if(output.total != 0){
- var interval = 0;
- var index = 0;
- for(interval; interval < output.total; interval++){
- if(url.parse(output.results[interval].task.url).hostname.replace('www.','') == domainpage){
- index = interval;
- break;
- } else if(interval == 99){
- template = template.replace("{{ neutral.urlscan }}", " Link could not be found ")
- template = template.replace("{{ neutral.urlscanlink }}", "");
- template = template.replace("{{ neutral.urlscreenshot }}", " Screenshot could not be displayed ");
- res.send(default_template.replace('{{ content }}', template));
- return;
- }
- }
- template = template.replace("{{ neutral.urlscan }}", "Link ");
- template = template.replace("{{ neutral.urlscanlink }}", 'https://urlscan.io/result/' + output.results[index]._id);
- urllookup.lookup( output.results[index].result ).then(function(lookupout) {
- if(lookupout.data != null){
- template = template.replace("{{ neutral.urlscreenshot }}", "");
- res.send(default_template.replace('{{ content }}', template));
- } else{
- template = template.replace("{{ neutral.urlscreenshot }}", " Screenshot could not be displayed ");
- }
- })
- }
- });
-
- if ('Google_SafeBrowsing_API_Key' in config && config.Google_SafeBrowsing_API_Key && domainpage != 'undefined') {
- var options = {
- uri: 'https://safebrowsing.googleapis.com/v4/threatMatches:find?key=' + config.Google_SafeBrowsing_API_Key,
- method: 'POST',
- json: {
- client: {
- clientId: "Ethereum Scam Database",
- clientVersion: "1.0.0"
- },
- threatInfo: {
- threatTypes: ["THREAT_TYPE_UNSPECIFIED", "MALWARE", "SOCIAL_ENGINEERING", "UNWANTED_SOFTWARE", "POTENTIALLY_HARMFUL_APPLICATION"],
- platformTypes: ["ANY_PLATFORM"],
- threatEntryTypes: ["THREAT_ENTRY_TYPE_UNSPECIFIED", "URL", "EXECUTABLE"],
- threatEntries: [{
- "url": domainpage
- }]
- }
- }
- };
- request(options, function(error, response, body) {
- if (!error && response.statusCode == 200) {
- if ('matches' in body && 0 in body.matches) {
- template = template.replace("{{ neutral.googlethreat }}", "Blocked for " + body.matches[0]['threatType'] + ' ');
- } else {
- template = template.replace("{{ neutral.googlethreat }}", "Not Blocked ");
- }
- } else {
- template = template.replace("{{ neutral.googlethreat }}", " Could not pull data from Google SafeBrowsing ");
- }
- });
- } else {
- template = template.replace("{{ neutral.googlethreat }}", " Could not pull data from Google SafeBrowsing ");
- debug("Warning: No Google Safe Browsing API key found");
- }
- if ('VirusTotal_API_Key' in config && config.VirusTotal_API_Key && domainpage != 'undefined') {
- var options = {
- uri: 'https://www.virustotal.com/vtapi/v2/url/report?apikey=' + config.VirusTotal_API_Key + '&resource=http://' + domainpage,
- method: 'GET',
- };
- request(options, function(error, response, body) {
- if (!error && response.statusCode == 200) {
- body = JSON.parse(body);
- if(body.response_code != 0){
- if (body.positives == 0) {
- template = template.replace("{{ neutral.virustotal }}", " " + body.positives + ' / ' + body.total + ' ');
- } else {
- template = template.replace("{{ neutral.virustotal }}", " " + body.positives + ' / ' + body.total + " ");
- }
- if (body.scans.Phishtank.result == "clean site"){
- template = template.replace("{{ neutral.phishtank }}", " " + "Clean Site" + ' ');
- } else if(body.scans.Phishtank.result == "phishing site"){
- template = template.replace("{{ neutral.phishtank }}", " " + "Phishing Site"+ ' ');
- } else{
- template = template.replace("{{ neutral.phishtank }}", " " + body.scans.Phishtank.result + ' ');
- }
- } else{
- template = template.replace("{{ neutral.virustotal }}", " Could not pull data from VirusTotal ");
- template = template.replace("{{ neutral.phishtank }}", " Could not pull data from Phishtank ");
- }
- } else {
- template = template.replace("{{ neutral.virustotal }}", " Could not pull data from VirusTotal ");
- template = template.replace("{{ neutral.phishtank }}", " Could not pull data from Phishtank ");
- }
- template = template.replace("{{ page.built }}", 'This page was built in ' + ((new Date()).getTime() - startTime) + ' ms, and last updated at ' + dateFormat(getCache().updated, "UTC:mmm dd yyyy, HH:MM") + ' UTC
');
- });
- } else {
- template = template.replace("{{ neutral.virustotal }}", " Could not pull data from VirusTotal ");
- template = template.replace("{{ neutral.phishtank }}", " Could not pull data from Phishtank ");
- template = template.replace("{{ page.built }}", 'This page was built in ' + ((new Date()).getTime() - startTime) + ' ms, and last updated at ' + dateFormat(getCache().updated, "UTC:mmm dd yyyy, HH:MM") + ' UTC
');
- debug("Warning: No VirusTotal API key found");
- }
- }
-
- // VERIFIED DOMAIN PAGES
- if(typeof verified != "undefined"){
- let template = fs.readFileSync('./_layouts/verifieddomain.html', 'utf8');
- template = template.replace("{{ verified.name }}", verified.name);
- template = template.replace("{{ verified.notification }}", ' This is a verified domain.
')
- template = template.replace("{{ verified.googlethreat }}", "Google Safe Browsing Status : {{ verified.googlethreat }} ");
- template = template.replace("{{ verified.virustotal }}", "VirusTotal Detections : {{ verified.virustotal }} ");
- template = template.replace("{{ verified.phishtank }}", "Phishtank Detected : {{ verified.phishtank }} ");
- template = template.replace("{{ verified.urlscan }}", "Urlscan Scan Results : {{ verified.urlscan }} ");
- template = template.replace("{{ verified.urlscreenshot }}", "Urlscan Screenshot : {{ verified.urlscreenshot }} ");
- webcheck.lookup( url.parse(verified.url).hostname ).then(function(output) {
- if(output.total == 0){
- template = template.replace("{{ verified.urlscan }}", "Not Yet");
- res.send(default_template.replace('{{ content }}', template));
- } else if(output.total != 0){
- var interval = 0;
- var index = 0;
- for(interval; interval < output.total; interval++){
- if(url.parse(output.results[interval].task.url).hostname.replace('www.','') == url.parse(verified.url).hostname){
- index = interval;
- break;
- } else if(interval == 99){
- index = 0;
- template = template.replace("{{ verified.urlscan }}", " Link could not be found ")
- template = template.replace("{{ verified.urlscanlink }}", "");
- template = template.replace("{{ verified.urlscreenshot }}", " Screenshot could not be displayed ");
- res.send(default_template.replace('{{ content }}', template));
- return;
- }
- }
- template = template.replace("{{ verified.urlscan }}", "Link ");
- template = template.replace("{{ verified.urlscanlink }}", 'https://urlscan.io/result/' + output.results[index]._id);
- urllookup.lookup( output.results[index].result ).then(function(lookupout) {
- if(lookupout.data != null){
- template = template.replace("{{ verified.urlscreenshot }}", "");
- res.send(default_template.replace('{{ content }}', template));
- } else{
- template = template.replace("{{ verified.urlscreenshot }}", " Screenshot could not be displayed ");
- }
- })
- }
- });
-
- if ('description' in verified) {
- template = template.replace("{{ verified.description }}", 'Description : ' + verified.description + ' ');
- } else {
- template = template.replace("{{ verified.description }}", '');
- }
- if ('addresses' in verified) {
- var addresses_text = '';
- verified.addresses.forEach(function(address) {
- addresses_text += '';
- });
- template = template.replace("{{ verified.addresses }}", 'Related addresses : ' + addresses_text + '
');
- } else {
- template = template.replace("{{ verified.addresses }}", '');
- }
- if ('url' in verified) {
- template = template.replace("{{ verified.url }}", 'URL : ' + verified.url + ' ');
- } else {
- template = template.replace("{{ verified.url }}", '');
- }
- if ('Google_SafeBrowsing_API_Key' in config && config.Google_SafeBrowsing_API_Key && domainpage != 'undefined') {
- var options = {
- uri: 'https://safebrowsing.googleapis.com/v4/threatMatches:find?key=' + config.Google_SafeBrowsing_API_Key,
- method: 'POST',
- json: {
- client: {
- clientId: "Ethereum Scam Database",
- clientVersion: "1.0.0"
- },
- threatInfo: {
- threatTypes: ["THREAT_TYPE_UNSPECIFIED", "MALWARE", "SOCIAL_ENGINEERING", "UNWANTED_SOFTWARE", "POTENTIALLY_HARMFUL_APPLICATION"],
- platformTypes: ["ANY_PLATFORM"],
- threatEntryTypes: ["THREAT_ENTRY_TYPE_UNSPECIFIED", "URL", "EXECUTABLE"],
- threatEntries: [{
- "url": domainpage
- }]
- }
- }
- };
- request(options, function(error, response, body) {
- if (!error && response.statusCode == 200) {
- if ('matches' in body && 0 in body.matches) {
- template = template.replace("{{ verified.googlethreat }}", " Blocked for " + body.matches[0]['threatType'] + ' ');
- } else {
- template = template.replace("{{ verified.googlethreat }}", " Not Blocked ");
- }
- } else {
- template = template.replace("{{ verified.googlethreat }}", " Could not pull data from Google SafeBrowsing ");
- }
- });
- } else {
- template = template.replace("{{ verified.googlethreat }}", " Could not pull data from Google SafeBrowsing ");
- debug("Warning: No Google Safe Browsing API key found");
- }
-
- if ('VirusTotal_API_Key' in config && config.VirusTotal_API_Key && domainpage != 'undefined') {
- var options = {
- uri: 'https://www.virustotal.com/vtapi/v2/url/report?apikey=' + config.VirusTotal_API_Key + '&resource=http://' + domainpage,
- method: 'GET',
- };
- request(options, function(error, response, body) {
- if (!error && response.statusCode == 200) {
- body = JSON.parse(body);
- if(body.response_code != 0){
- if (body.positives == 0) {
- template = template.replace("{{ verified.virustotal }}", " " + body.positives + ' / ' + body.total + ' ');
- } else {
- template = template.replace("{{ verified.virustotal }}", " " + body.positives + ' / ' + body.total + " ");
- }
- if (body.scans.Phishtank.result == "clean site"){
- template = template.replace("{{ verified.phishtank }}", " " + "Clean Site" + ' ');
- } else if(body.scans.Phishtank.result == "phishing site"){
- template = template.replace("{{ verified.phishtank }}", " " + "Phishing Site"+ ' ');
- } else{
- template = template.replace("{{ verified.phishtank }}", " " + body.scans.Phishtank.result + ' ');
- }
- } else{
- template = template.replace("{{ verified.virustotal }}", " Could not pull data from VirusTotal ");
- template = template.replace("{{ verified.phishtank }}", " Could not pull data from Phishtank ");
- }
- } else {
- template = template.replace("{{ verified.virustotal }}", " Could not pull data from VirusTotal ");
- template = template.replace("{{ verified.phishtank }}", " Could not pull data from Phishtank ");
- }
- template = template.replace("{{ page.built }}", 'This page was built in ' + ((new Date()).getTime() - startTime) + ' ms, and last updated at ' + dateFormat(getCache().updated, "UTC:mmm dd yyyy, HH:MM") + ' UTC
');
- });
- } else {
- template = template.replace("{{ verified.virustotal }}", " Could not pull data from VirusTotal ");
- template = template.replace("{{ verified.phishtank }}", " Could not pull data from Phishtank ");
- template = template.replace("{{ page.built }}", 'This page was built in ' + ((new Date()).getTime() - startTime) + ' ms, and last updated at ' + dateFormat(getCache().updated, "UTC:mmm dd yyyy, HH:MM") + ' UTC
');
- }
- }
-
- // SCAM DOMAIN PAGES
- if(typeof scam != "undefined"){
- let template = fs.readFileSync('./_layouts/scamdomain.html', 'utf8');
- var actions_text = "";
- template = template.replace("{{ scam.id }}", scam.id);
- template = template.replace("{{ scam.name }}", scam.name);
- template = template.replace("{{ scam.tip }}", " Security Tip(s) : ");
- template = template.replace("{{ scam.notification }}", ' Warning: This is a scam domain.
')
- template = template.replace("{{ scam.googlethreat }}", "Google Safe Browsing Status : {{ scam.googlethreat }} ");
- template = template.replace("{{ scam.virustotal }}", "VirusTotal Detections : {{ scam.virustotal }} ");
- template = template.replace("{{ scam.phishtank }}", "Phishtank Detected : {{ scam.phishtank }} ");
- template = template.replace("{{ scam.urlscan }}", "Urlscan Scan Results : {{ scam.urlscan }} ");
- template = template.replace("{{ scam.urlscreenshot }}", "Urlscan Screenshot : {{ scam.urlscreenshot }} ");
- webcheck.lookup( url.parse(scam.url).hostname ).then(function(output) {
- if(output.total == 0){
- template = template.replace("{{ scam.urlscan }}", "Not Yet");
- res.send(default_template.replace('{{ content }}', template));
- } else if(output.total != 0){
- var interval = 0;
- var index = 0;
- for(interval; interval < output.total; interval++){
- if(url.parse(output.results[interval].task.url).hostname.replace('www.','') == url.parse(scam.url).hostname){
- index = interval;
- break;
- } else if(interval == 99){
- index = 0;
- template = template.replace("{{ scam.urlscan }}", " Link could not be found ")
- template = template.replace("{{ scam.urlscanlink }}", "");
- template = template.replace("{{ scam.urlscreenshot }}", " Screenshot could not be displayed ");
- res.send(default_template.replace('{{ content }}', template));
- return;
- }
- }
- template = template.replace("{{ scam.urlscan }}", "Link ");
- template = template.replace("{{ scam.urlscanlink }}", 'https://urlscan.io/result/' + output.results[index]._id);
- urllookup.lookup( output.results[index].result ).then(function(lookupout) {
- if(lookupout.data != null){
- template = template.replace("{{ scam.urlscreenshot }}", "");
- res.send(default_template.replace('{{ content }}', template));
- } else{
- template = template.replace("{{ scam.urlscreenshot }}", " Screenshot could not be displayed ");
- }
- })
- }
- })
-
- if ('category' in scam) {
- if ('subcategory' in scam) {
- if (scam.category == "Phishing"){
- if (scam.subcategory == "MyCrypto"){
- template = template.replace("{{ scam.tip }}", 'Run MyCrypto offline using the desktop app . Reference this article if you need any help. {{ scam.tip }} ');
- template = template.replace("{{ scam.tip }}", 'Download the EtherAddressLookup Chrome Extension to warn you of potential phishing/scamming sites. {{ scam.tip }} ');
- template = template.replace("{{ scam.tip }}", 'Use a hardware wallet such as a Ledger Nano S or a Trezor . ');
- }
- if (scam.subcategory == "MyEtherWallet"){
- template = template.replace("{{ scam.tip }}", 'Run MyEtherWallet offline using this guide on their knowledgebase . {{ scam.tip }} ');
- template = template.replace("{{ scam.tip }}", 'Download the EtherAddressLookup Chrome Extension to warn you of potential phishing/scamming sites. {{ scam.tip }} ');
- template = template.replace("{{ scam.tip }}", 'Use a hardware wallet such as a Ledger Nano S or a Trezor . ');
- }
- template = template.replace("{{ scam.tip }}", 'Download the EtherAddressLookup Chrome Extension to warn you of potential phishing/scamming sites. {{ scam.tip }} ');
- template = template.replace("{{ scam.tip }}", 'Use a hardware wallet such as a Ledger Nano S or a Trezor . ');
- } if (scam.category == "Scamming") {
- if (scam.subcategory == "Trust-Trading"){
- template = template.replace("{{ scam.tip }}", 'Never trust giveaway scams! They are almost 100% of the time malicious attempts to steal your funds. {{ scam.tip }} ')
- template = template.replace("{{ scam.tip }}", 'Download the EtherAddressLookup Chrome Extension to warn you of potential phishing/scamming sites. ');
- }
- } if (scam.category == "Fake ICO") {
- template = template.replace("{{ scam.tip }}", 'Read about how to be safe during ICOs on MyCrypto\'s Knowledgebase ')
- }
- else {
- template = template.replace("{{ scam.tip }}", 'Download the EtherAddressLookup Chrome Extension to warn you of potential phishing/scamming sites. {{ scam.tip }} ');
- template = template.replace("{{ scam.tip }}", 'Use a hardware wallet such as a Ledger Nano S or a Trezor . ');
- }
- template = template.replace("{{ scam.category }}", 'Category : ' + scam.category + ' - ' + scam.subcategory + ' ');
- } else {
- template = template.replace("{{ scam.category }}", 'Category : ' + scam.category + ' ');
- }
- } else {
- template = template.replace("{{ scam." + name + " }}", '');
- }
- if ('status' in scam) {
- template = template.replace("{{ scam.status }}", 'Status : ' + scam.status + ' ');
- } else {
- template = template.replace("{{ scam.status }}", '');
- }
- if ('description' in scam) {
- template = template.replace("{{ scam.description }}", 'Description : ' + scam.description + ' ');
- } else {
- template = template.replace("{{ scam.description }}", '');
- }
- if ('nameservers' in scam) {
- var nameservers_text = '';
- scam.nameservers.forEach(function(nameserver) {
- nameservers_text += '' + nameserver + '
';
- });
- template = template.replace("{{ scam.nameservers }}", 'Nameservers : ' + nameservers_text + '
');
- } else {
- template = template.replace("{{ scam.nameservers }}", '');
- }
- if ('addresses' in scam) {
- var addresses_text = '';
- scam.addresses.forEach(function(address) {
- addresses_text += '';
- });
- template = template.replace("{{ scam.addresses }}", 'Related addresses : ' + addresses_text + '
');
- } else {
- template = template.replace("{{ scam.addresses }}", '');
- }
- if ('ip' in scam) {
- template = template.replace("{{ scam.ip }}", 'IP : ' + scam.ip + ' ');
- } else {
- template = template.replace("{{ scam.ip }}", '');
- }
- if ('url' in scam) {
- template = template.replace("{{ scam.abusereport }}", generateAbuseReport(scam));
- actions_text += ' Abuse Report ';
- actions_text += ' Archive ';
- template = template.replace("{{ scam.url }}", 'URL : ' + scam.url + ' ');
- /* Parses data for Metamask*/
- if (fs.existsSync('./_data/metamaskImports.json')) {
- try {
- var importsData = require('./_data/metamaskImports.json')
- const detector = new phishingDetector(importsData);
- template = template.replace("{{ scam.metamask }}", "MetaMask Status: " + (detector.check(url.parse(scam.url).hostname).result ? "Blocked " : "Not Yet Blocked ") + " ");
- } catch (e) {
- debug(e);
- }
- } else{
- debug('MetaMask JSON not found');
- };
- if ('status' in scam && scam.status != 'Offline' && fs.existsSync('_cache/screenshots/' + scam.id + '.png')) {
- template = template.replace("{{ scam.screenshot }}", 'Screenshot ');
- } else {
- template = template.replace("{{ scam.screenshot }}", '');
- }
- } else {
- template = template.replace("{{ scam.googlethreat }}", '');
- template = template.replace("{{ scam.screenshot }}", '');
- }
- actions_text += ' Improve Share ';
- template = template.replace("{{ scam.actions }}", '' + actions_text + '
');
- if ('Google_SafeBrowsing_API_Key' in config && config.Google_SafeBrowsing_API_Key && 'url' in scam) {
- var options = {
- uri: 'https://safebrowsing.googleapis.com/v4/threatMatches:find?key=' + config.Google_SafeBrowsing_API_Key,
- method: 'POST',
- json: {
- client: {
- clientId: "Ethereum Scam Database",
- clientVersion: "1.0.0"
- },
- threatInfo: {
- threatTypes: ["THREAT_TYPE_UNSPECIFIED", "MALWARE", "SOCIAL_ENGINEERING", "UNWANTED_SOFTWARE", "POTENTIALLY_HARMFUL_APPLICATION"],
- platformTypes: ["ANY_PLATFORM"],
- threatEntryTypes: ["THREAT_ENTRY_TYPE_UNSPECIFIED", "URL", "EXECUTABLE"],
- threatEntries: [{
- "url": url.parse(scam.url).hostname
- }]
- }
- }
- };
- request(options, function(error, response, body) {
- if (!error && response.statusCode == 200) {
- if ('matches' in body && 0 in body.matches) {
- template = template.replace("{{ scam.googlethreat }}", " Blocked for " + body.matches[0]['threatType'] + ' ');
- } else {
- template = template.replace("{{ scam.googlethreat }}", " Not Blocked Yet ");
- }
- } else {
- template = template.replace("{{ scam.googlethreat }}", " Could not pull data from Google SafeBrowsing ");
- }
- });
- } else {
- template = template.replace("{{ scam.googlethreat }}", " Could not pull data from Google SafeBrowsing ");
- debug("Warning: No Google Safe Browsing API key found");
- }
- if ('VirusTotal_API_Key' in config && config.VirusTotal_API_Key && domainpage != 'undefined') {
- var options = {
- uri: 'https://www.virustotal.com/vtapi/v2/url/report?apikey=' + config.VirusTotal_API_Key + '&resource=http://' + domainpage,
- method: 'GET',
- };
- request(options, function(error, response, body) {
- if (!error && response.statusCode == 200) {
- body = JSON.parse(body);
- if(body.response_code != 0){
- if (body.positives == 0) {
- template = template.replace("{{ scam.virustotal }}", " " + body.positives + ' / ' + body.total + ' ');
- } else {
- template = template.replace("{{ scam.virustotal }}", " " + body.positives + ' / ' + body.total + " ");
- }
- if (body.scans.Phishtank.result == "clean site"){
- template = template.replace("{{ scam.phishtank }}", " " + "Clean Site" + ' ');
- } else if(body.scans.Phishtank.result == "phishing site"){
- template = template.replace("{{ scam.phishtank }}", " " + "Phishing Site"+ ' ');
- } else{
- template = template.replace("{{ scam.phishtank }}", " " + body.scans.Phishtank.result + ' ');
- }
- } else{
- template = template.replace("{{ scam.virustotal }}", " Could not pull data from VirusTotal ");
- template = template.replace("{{ scam.phishtank }}", " Could not pull data from Phishtank ");
- }
- } else {
- template = template.replace("{{ scam.virustotal }}", " Could not pull data from VirusTotal ");
- template = template.replace("{{ scam.phishtank }}", " Could not pull data from Phishtank ");
- }
- template = template.replace("{{ page.built }}", 'This page was built in ' + ((new Date()).getTime() - startTime) + ' ms, and last updated at ' + dateFormat(getCache().updated, "UTC:mmm dd yyyy, HH:MM") + ' UTC
');
- });
- } else {
- template = template.replace("{{ scam.virustotal }}", " Could not pull data from VirusTotal ");
- template = template.replace("{{ scam.phishtank }}", " Could not pull data from Phishtank ");
- template = template.replace("{{ page.built }}", 'This page was built in ' + ((new Date()).getTime() - startTime) + ' ms, and last updated at ' + dateFormat(getCache().updated, "UTC:mmm dd yyyy, HH:MM") + ' UTC
');
- debug("Warning: No VirusTotal API key found");
- }
- }
-
- });
-
- app.get('/ip/:ip/', function(req, res) { // Serve /ip//
- let template = fs.readFileSync('./_layouts/ip.html', 'utf8');
- template = template.replace("{{ ip.ip }}", req.params.ip);
- var related = '';
- let total = 0;
- getCache().scams.filter(function(obj) {
- return obj.ip === req.params.ip;
- }).forEach(function(value) {
- related += "";
- total++;
- });
-
- template = template.replace("{{ ip.scams_count }}", total);
-
- //Grab the result from abuseipdb
- let abuseipdb_categories = {
- 3: "Fraud Orders",
- 4: "DDoS Attack",
- 5: "FTP Brute-Force",
- 6: "Ping of Death",
- 7: "Phishing",
- 8: "Fraud VoIP",
- 9: "Open Proxy",
- 10: "Web Spam",
- 11: "Email Spam",
- 12: "Blog Spam",
- 13: "VPN IP",
- 14: "Port Scan",
- 15: "Hacking",
- 16: "SQL Injection",
- 17: "Spoofing",
- 18: "Brute-Force",
- 19: "Bad Web Bot",
- 20: "Exploited Host",
- 21: "Web App Attack",
- 22: "SSH",
- 23: "IoT Targeted"
- };
-
- template = template.replace("{{ ip.abuseipdb_link }}", 'View Report ');
- template = template.replace("{{ ip.urlscan_link }}", 'View Report ');
- template = template.replace("{{ ip.scams }}", '' + related + '
');
- res.send(default_template.replace('{{ content }}', template));
- });
-
- app.get('/address/:address/', function(req, res) { // Serve /address//
- let template = fs.readFileSync('./_layouts/address.html', 'utf8');
- let inputAddr = req.params.address.toLowerCase();
- template = template.replace(/{{ address.address }}/g, inputAddr);
- var related = '';
- var whitelistrelated = '';
- var scamstatus = false;
- var legitstatus = false;
-
- scamstatus = getCache().scams.filter(function(obj) {
- if ('addresses' in obj) {
- return obj.addresses.includes(inputAddr);
- } else {
- return false;
- }
- }).forEach(function(value) {
- template = template.replace("{{ address.notification }}", ' Warning: Do not send money to this address
')
- template = template.replace("{{ address.list }}", "Related to the following verified scams : {{ address.scams }}")
- related += "";
- });
-
- legitstatus = getCache().legiturls.filter(function(objtwo) {
- if ('addresses' in objtwo) {
- return objtwo.addresses.includes(inputAddr);
- } else {
- return false;
- }
- }).forEach(function(valuetwo) {
- template = template.replace("{{ address.notification }}", 'This is a verified address
')
- template = template.replace("{{ address.list }}", "Related to the following verified urls : {{ address.verifieddomains }}")
- whitelistrelated += "";
- });
-
- if(!legitstatus && !scamstatus) {
- template = template.replace("{{ address.notification }}", ' This is an unclassified address. This does not mean that it is safe. It simply means that it hasn\'t been classified.
')
- template = template.replace("{{ address.list }}", "")
- }
-
- template = template.replace("{{ address.scams }}", '' + related + '
');
- template = template.replace("{{ address.verifieddomains }}", '' + whitelistrelated + '
');
- res.send(default_template.replace('{{ content }}', template));
- });
-
- app.get('/redirect/:url/', function(req, res) { // Serve /redirect//
- let template = fs.readFileSync('./_layouts/redirect.html', 'utf8').replace(/{{ redirect.domain }}/g, req.params.url);
- res.send(default_template.replace('{{ content }}', template));
- });
-
- app.get('/rss/', function(req, res) { // Serve /rss/ (rss feed)
- let template = fs.readFileSync('./_layouts/rss.html', 'utf8');
- var entries = '';
- getCache().scams.forEach(function(scam, index) {
- entries += "" + scam.name + " https://etherscamdb.info/scam/" + scam.id + "/" + scam.category + " ";
- });
- res.send(template.replace('{{ rss.entries }}', entries));
- });
-
- app.get('/api/:type?/:domain?/', function(req, res) { // Serve /api//
- res.header('Access-Control-Allow-Origin', '*');
- if (req.params.type == "scams") {
- res.send(JSON.stringify({
- success: true,
- result: getCache().scams
- }));
- } else if (req.params.type == "addresses") {
- res.send(JSON.stringify({
- success: true,
- result: getCache().addresses
- }));
- } else if (req.params.type == "ips") {
- res.send(JSON.stringify({
- success: true,
- result: getCache().ips
- }));
- } else if (req.params.type == "verified") {
- res.send(JSON.stringify({
- success: true,
- result: getCache().legiturls
- }));
- } else if (req.params.type == "inactives") {
- res.send(JSON.stringify({
- success: true,
- result: getCache().inactives
- }));
- } else if (req.params.type == "actives") {
- res.send(JSON.stringify({
- success: true,
- result: getCache().actives
- }));
- } else if (req.params.type == "blacklist") {
- res.send(JSON.stringify(getCache().blacklist, null, 2));
- } else if (req.params.type == "whitelist") {
- res.send(JSON.stringify(getCache().whitelist, null, 2));
- } else if (req.params.type == "check" && req.params.domain) {
- //They can search for an address or domain.
- if (/^0x?[0-9A-Fa-f]{40,42}$/.test(req.params.domain)) {
- var blocked = false;
- Object.keys(getCache().whitelistaddresses).forEach(function(address, index) {
- //They searched for an address
- if (req.params.domain.toLowerCase() === address.toLowerCase()) {
- blocked = true;
- res.send(JSON.stringify({
- success: true,
- result: 'whitelisted',
- type: 'address',
- entries: getCache().legiturls.filter(function(verified) {
- if ('addresses' in verified) {
- return (verified.addresses.includes(req.params.domain.toLowerCase()));
- } else {
- return false;
- }
- })
- }));
- }
- });
- Object.keys(getCache().addresses).forEach(function(address, index) {
- //They searched for an address
- if (req.params.domain.toLowerCase() === address.toLowerCase()) {
- blocked = true;
- res.send(JSON.stringify({
- success: true,
- result: 'blocked',
- type: 'address',
- entries: getCache().scams.filter(function(scam) {
- if ('addresses' in scam) {
- return (scam.addresses.includes(req.params.domain.toLowerCase()));
- } else {
- return false;
- }
- })
- }));
- }
- });
- if (!blocked) {
- res.send(JSON.stringify({
- success: true,
- result: 'neutral',
- type: 'address',
- entries: {}
- }));
- }
- } else {
- //They searched for a domain or an ip address
- if (getCache().whitelist.includes(url.parse(req.params.domain).hostname) || getCache().whitelist.includes(req.params.domain)) {
- res.send(JSON.stringify({
- success: true,
- input: url.parse(req.params.domain).hostname || req.params.domain,
- result: 'verified'
- }));
- } else if (getCache().blacklist.includes(url.parse(req.params.domain).hostname) || getCache().blacklist.includes(req.params.domain.replace(/(^\w+:|^)\/\//, ''))) {
- if (/^(([1-9]?\d|1\d\d|2[0-5][0-5]|2[0-4]\d)\.){3}([1-9]?\d|1\d\d|2[0-5][0-5]|2[0-4]\d)$/.test(req.params.domain.replace(/(^\w+:|^)\/\//, ''))) {
- //They searched for an ip address
- res.send(JSON.stringify({
- success: true,
- input: req.params.domain.replace(/(^\w+:|^)\/\//, ''),
- result: 'blocked',
- type: 'ip',
- entries: getCache().scams.filter(function(scam) {
- return (url.parse(scam.url).hostname == url.parse(req.params.domain).hostname || scam.url.replace(/(^\w+:|^)\/\//, '') == req.params.domain || scam.ip == req.params.domain.replace(/(^\w+:|^)\/\//, ''));
- }) || false
- }));
- } else {
- //They searched for a domain
- res.send(JSON.stringify({
- success: true,
- input: url.parse(req.params.domain).hostname || req.params.domain,
- result: 'blocked',
- type: 'domain',
- entries: getCache().scams.filter(function(scam) {
- return (url.parse(scam.url).hostname == url.parse(req.params.domain).hostname || scam.url.replace(/(^\w+:|^)\/\//, '') == req.params.domain);
- }) || false
- }));
- }
- } else {
- res.send(JSON.stringify({
- success: true,
- result: 'neutral'
- }));
- }
- }
- } else if (req.params.type == "abusereport" && req.params.domain) {
- var results = getCache().scams.filter(function(scam) {
- return (url.parse(scam.url).hostname == url.parse(req.params.domain).hostname || scam.url.replace(/(^\w+:|^)\/\//, '') == req.params.domain);
- }) || false;
- if (results.length == 0) {
- res.send(JSON.stringify({
- success: false,
- error: "URL wasn't found"
- }));
- } else {
- res.send(JSON.stringify({
- success: true,
- result: generateAbuseReport(results[0])
- }));
- }
- } else {
- res.send(default_template.replace('{{ content }}', fs.readFileSync('./_layouts/api.html', 'utf8')));
- }
- });
-
- app.post('/update/', function(req, res) { // New github update?
- req.rawBody = '';
- req.setEncoding('utf8');
-
- req.on('data', function(chunk) {
- req.rawBody += chunk;
- });
-
- req.on('end', function() {
-
- if ('x-hub-signature' in req.headers && 'Github_Hook_Secret' in config && crypto.timingSafeEqual(Buffer.from(req.headers['x-hub-signature']), Buffer.from("sha1=" + crypto.createHmac("sha1", config.Github_Hook_Secret).update(req.rawBody).digest("hex")))) {
- debug("New commit pushed");
- download("https://raw.githubusercontent.com/" + config.repository.author + "/" + config.repository.name + "/" + config.repository.branch + "/_data/scams.yaml?no-cache=" + (new Date()).getTime(), {
- directory: "_data/",
- filename: "scams.yaml"
- }, function(err) {
- if (err) throw err;
- download("https://raw.githubusercontent.com/" + config.repository.author + "/" + config.repository.name + "/" + config.repository.branch + "/_data/legit_urls.yaml?no-cache=" + (new Date()).getTime(), {
- directory: "_data/",
- filename: "legit_urls.yaml"
- }, function(err) {
- if (err) throw err;
- res.status(200).end();
- fork('update.js');
- });
- });
- } else {
- debug("Incorrect webhook attempt %o",req);
- }
- });
- });
-
- app.get('*', function(req, res) { // Serve all other pages as 404
- res.status(404).send(default_template.replace('{{ content }}', fs.readFileSync('./_layouts/404.html', 'utf8')));
- });
-
- app.listen(config.port, function() { // Listen on port (defined in config)
- debug('Content served on http://localhost:%s',config.port);
- });
-}
-
-/* Copy config.example.js to config.js, if it does not exist yet */
-if (!fs.existsSync('config.js')) {
- fs.copySync('config.example.js', 'config.js');
- debug('Config file was copied. Please update with correct values');
- process.exit();
-} else if (2 in process.argv) {
- if (process.argv[2] == "--clean") {
- rimraf('_cache', function() {
- debug("Cleared cache");
- });
- } else if (process.argv[2] == "--update") {
- if (fs.existsSync("_cache/cache.json") && cache) {
- fork('update.js');
- } else {
- debug("Another update is already in progress...");
- }
- } else {
- debug("Unsupported flag: %s",process.argv[2]);
- }
-} else {
- /* Update the local cache using the external cache every 60 seconds */
- setInterval(function() {
- if (fs.existsSync('_cache/cache.json')) {
- fs.readFile('_cache/cache.json', function(err, data) {
- try {
- cache = JSON.parse(data);
- } catch (e) {
- debug(e);
- }
- });
- }
- }, 60000);
- getCache(function() {
- startWebServer();
- });
-}
diff --git a/src/app.js b/src/app.js
new file mode 100644
index 00000000..2fe10447
--- /dev/null
+++ b/src/app.js
@@ -0,0 +1,85 @@
+'use strict';
+
+const debug = require('debug')('app');
+const {fork} = require('child_process');
+const express = require('express');
+const path = require('path');
+const helmet = require('helmet');
+const db = require('./utils/db');
+const github = require('./utils/github');
+const config = require('./utils/config');
+const writeConfig = require('./utils/writeConfig');
+const app = express();
+
+module.exports.check = (input) => {
+ /* TODO: add isMalicious check */
+}
+
+module.exports.update = async () => {
+ if(config.lookups.DNS.IP.enabled || config.lookups.DNS.NS.enabled || config.lookups.HTTP.enabled) {
+ debug("Spawning update process...");
+ const updateProcess = fork(path.join(__dirname,'scripts/update.js'));
+ updateProcess.on('message', data => db.write(data.url,data));
+ updateProcess.on('exit', () => setTimeout(() => this.update(),config.interval.cacheRenewCheck));
+ }
+}
+
+module.exports.serve = async (electronApp) => {
+ /* Initiate database */
+ await db.init();
+
+ /* Allow both JSON and URL encoded bodies */
+ app.use(express.json());
+ app.use(express.urlencoded({ extended: true }));
+
+ /* Set security headers */
+ app.use(helmet());
+ app.use(helmet.referrerPolicy());
+
+ /* Set EJS config */
+ app.set('view engine', 'ejs');
+ app.set('views',path.join(__dirname,'views/pages'));
+ app.locals.environment = process.env.NODE_ENV;
+ app.locals.announcement = config.announcement;
+
+ /* Compress pages */
+ app.use(require('compression')());
+
+ /* Serve static content*/
+ app.use(express.static(path.join(__dirname,'views/static')));
+
+ /* Configuration middleware */
+ app.use(async (req,res,next) => {
+ const {NODE_ENV} = process.env;
+ if(!config.manual && req.path != '/config/' && NODE_ENV == 'development') res.render('config', { production: false, done: false });
+ else if(!config.manual && req.path != '/config/' && NODE_ENV == 'production') res.render('config', { production: true, done: false });
+ else if(req.path == '/config' && (req.method != 'POST' || !req.body || config.manual)) res.status(403).end();
+ else if(req.path == '/config/' && req.method == 'POST' && !config.manual) {
+ await writeConfig(req.body);
+ if(electronApp) {
+ electronApp.relaunch();
+ electronApp.exit();
+ } else {
+ res.render('config', { production: false, done: true });
+ }
+ }
+ else next();
+ });
+
+ /* Serve all routes (see src/utils/router.js) */
+ app.use(require('./utils/router'));
+
+ /* Serve all other pages as 404 */
+ app.get('*', (req, res) => res.status(404).render('404'));
+
+ /* Listen to port (defined in config */
+ app.listen(config.port, () => debug('Content served on http://localhost:%s',config.port));
+
+ /* Update scams after 100ms timeout (to process async) */
+ setTimeout(() => this.update(),100);
+
+ /* If auto pulling from Github is enabled; schedule timer */
+ if(config.autoPull.enabled) setInterval(github.pullData,config.autoPull.interval);
+}
+
+if(!module.parent) this.serve();
diff --git a/src/classes/scam.class.js b/src/classes/scam.class.js
new file mode 100644
index 00000000..0e1d344a
--- /dev/null
+++ b/src/classes/scam.class.js
@@ -0,0 +1,75 @@
+const {parse} = require('url');
+const dns = require('graceful-dns');
+const {lookup,getURLScan} = require('../utils/lookup');
+
+module.exports = class Scam {
+ constructor(scamObject = {}) {
+ if(scamObject.url) {
+ this.name = parse(scamObject.url).hostname.replace("www.", "");
+ this.url = scamObject.url;
+ }
+ if(scamObject.category) this.category = scamObject.category;
+ if(scamObject.subcategory) this.subcategory = scamObject.subcategory;
+ if(scamObject.description) this.description = scamObject.description;
+ if(scamObject.addresses) this.addresses = scamObject.addresses;
+ }
+
+ async lookup() {
+ return lookup(this.url);
+ }
+
+ getHostname() {
+ return parse(this.url).hostname;
+ }
+
+ async getIP() {
+ this.ip = await dns.getIP(this.url);
+ return this.ip;
+ }
+
+ async getNameservers() {
+ this.nameservers = await dns.getNS(this.url);
+ return this.nameservers;
+ }
+
+ async getStatus() {
+ const result = await this.lookup();
+
+ if(result && result.statusCode) this.statusCode = result.statusCode;
+ else this.statusCode = -1;
+
+ if(!result) {
+ this.status = 'Offline';
+ } else if(result && result.request && result.request.uri && result.request.uri.path && result.request.uri.path == '/cgi-sys/suspendedpage.cgi') {
+ this.status = 'Suspended';
+ } else if(result && (result.body == '' || (result.request && result.request.uri && result.request.uri.path && result.request.uri.path == '/cgi-sys/defaultwebpage.cgi'))) {
+ this.status = 'Inactive';
+ } else if (result && this.subcategory && this.subcategory == 'MyEtherWallet') {
+ const isMEW = await lookup('http://' + parse(this.url).hostname.replace("www.", "") + '/js/etherwallet-static.min.js');
+ if(isMEW) {
+ this.status = 'Active';
+ } else {
+ this.status = 'Inactive';
+ }
+ } else if (result && this.subcategory && this.subcategory == 'MyCrypto') {
+ const isMYC = await lookup('http://' + parse(this.url).hostname.replace("www.", "") + '/js/mycrypto-static.min.js');
+ if(isMYC) {
+ this.status = 'Active';
+ } else {
+ this.status = 'Inactive';
+ }
+ } else {
+ this.status = 'Active';
+ }
+
+ return this.status;
+ }
+
+ getURLScan() {
+ return getURLScan(this.getHostname());
+ }
+
+ howRecent() {
+ return Date.now()-(this.updated || 0);
+ }
+}
diff --git a/src/scripts/build.js b/src/scripts/build.js
new file mode 100644
index 00000000..8b9a6e40
--- /dev/null
+++ b/src/scripts/build.js
@@ -0,0 +1,55 @@
+const rimraf = require('rimraf');
+const builder = require('electron-builder');
+
+const shouldBuildOs = (os) => {
+ const { ELECTRON_OS } = process.env;
+ if (ELECTRON_OS === 'JENKINS_LINUX') {
+ return os === 'linux' || os === 'windows';
+ } else if (ELECTRON_OS === 'JENKINS_MAC') {
+ return os === 'mac';
+ } else {
+ return !process.env.ELECTRON_OS || process.env.ELECTRON_OS === os;
+ }
+}
+
+(async () => {
+ console.log('Building Electron apps...');
+
+ rimraf.sync('./dist');
+ rimraf.sync('./config.json');
+ rimraf.sync('./cache.db');
+
+ await builder.build({
+ mac: shouldBuildOs('mac') ? ['zip', 'dmg'] : undefined,
+ win: shouldBuildOs('windows') ? ['nsis'] : undefined,
+ linux: shouldBuildOs('linux') ? ['AppImage'] : undefined,
+ x64: true,
+ ia32: true,
+ config: {
+ appId: 'info.etherscamdb',
+ productName: 'EtherScamDB',
+ directories: {
+ app: './',
+ output: './dist'
+ },
+ mac: {
+ category: 'public.app-category.utilities',
+ icon: './assets/favicon.icns',
+ compression: 'store'
+ },
+ win: {
+ icon: './assets/favicon.ico',
+ compression: 'store'
+ },
+ linux: {
+ category: 'Utilities',
+ icon: './assets/favicon.png',
+ compression: 'store'
+ },
+ publish: null,
+ extends: null
+ }
+ });
+
+ console.log("Electron builds are finished!");
+})();
\ No newline at end of file
diff --git a/src/scripts/electron.js b/src/scripts/electron.js
new file mode 100644
index 00000000..6cb9aeaa
--- /dev/null
+++ b/src/scripts/electron.js
@@ -0,0 +1,73 @@
+const {app, BrowserWindow, Menu} = require('electron');
+const util = require('util');
+const config = require('../utils/config');
+const db = require('../utils/db');
+const esdb = require('../app');
+
+app.on('ready', async () => {
+ await esdb.serve(app);
+ const mainWindow = new BrowserWindow({
+ icon: "./assets/favicon.ico",
+ titleBarStyle: 'hidden',
+ webPreferences: {
+ nodeIntegration: false
+ },
+ show: false,
+ darkTheme: true
+ });
+ const windowMenu = Menu.buildFromTemplate([{
+ label: 'Home',
+ click: () => mainWindow.loadURL('http://localhost:' + config.port)
+ }, {
+ type: 'separator'
+ }, {
+ label: 'Add scam',
+ click: () => mainWindow.loadURL('http://localhost:' + config.port + '/add')
+ }, {
+ type: 'separator'
+ }, {
+ label: 'Debug',
+ submenu: [{
+ role: 'reload'
+ }, {
+ role: 'forcereload'
+ }, {
+ role: 'toggledevtools'
+ }, {
+ type: 'separator'
+ }, {
+ label: 'Inspect cache',
+ click: () => mainWindow.loadURL("data:text/html;charset=utf-8," + encodeURI('' + util.inspect(db.read()) + ' '))
+ }, {
+ label: 'View config',
+ click: () => mainWindow.loadURL("data:text/html;charset=utf-8," + encodeURI('' + util.inspect(config) + ' '))
+ }, {
+ label: 'Manually spawn update',
+ click: () => {
+ esdb.update();
+ mainWindow.loadURL("data:text/html;charset=utf-8," + encodeURI('Spawned update process successfully.'));
+ }
+ }]
+ }]);
+ Menu.setApplicationMenu(windowMenu);
+ mainWindow.loadURL('http://localhost:' + config.port);
+ mainWindow.once('ready-to-show', () => {
+ mainWindow.maximize();
+ mainWindow.show();
+ mainWindow.focus();
+ });
+ let handled = false;
+ app.on('window-all-closed', app.quit);
+ app.on('before-quit', (event) => {
+ event.preventDefault();
+ mainWindow.removeAllListeners('close');
+ if(!handled) {
+ handled = true;
+ console.log("Cleaning up...");
+ db.exitHandler();
+ console.log("Exited.");
+ mainWindow.close();
+ process.exit();
+ }
+ });
+});
\ No newline at end of file
diff --git a/src/scripts/update.js b/src/scripts/update.js
new file mode 100644
index 00000000..87cf9171
--- /dev/null
+++ b/src/scripts/update.js
@@ -0,0 +1,38 @@
+process.env.UV_THREADPOOL_SIZE = 128;
+const debug = require('debug')('update');
+const path = require('path');
+const Scam = require('../classes/scam.class');
+const serialijse = require("serialijse");
+const fs = require('fs-extra');
+const config = require('../utils/config');
+
+serialijse.declarePersistable(Scam);
+if(!process.send) throw new Error("This script can only run as a child process");
+
+process.once('close', () => process.exit(1));
+
+(async () => {
+ const cacheExists = await fs.pathExists('./cache.db');
+ if(!cacheExists) throw new Error("No cache file found");
+ const cacheFile = await fs.readFile('./cache.db','utf8');
+
+ debug("Updating scams...");
+
+ await Promise.all(serialijse.deserialize(cacheFile).scams.reverse().filter(scam => scam.howRecent() > config.interval.cacheExpiration).map(async scam => {
+ if(config.lookups.HTTP.enabled) await scam.getStatus();
+ if(config.lookups.DNS.IP.enabled) await scam.getIP();
+ if(config.lookups.DNS.NS.enabled) await scam.getNameservers();
+
+ process.send({
+ url: scam.url,
+ name: scam.name,
+ ip: scam.ip,
+ nameservers: scam.nameservers,
+ status: scam.status,
+ statusCode: scam.statusCode,
+ updated: Date.now()
+ });
+ }));
+
+ debug("Done updating!");
+})();
diff --git a/src/utils/abusereport.js b/src/utils/abusereport.js
new file mode 100644
index 00000000..eb353955
--- /dev/null
+++ b/src/utils/abusereport.js
@@ -0,0 +1,25 @@
+module.exports = (scam) => {
+ let abusereport = "";
+ abusereport += "I would like to inform you of suspicious activities at the domain " + scam.getHostname();
+ if ('ip' in scam && scam.ip) {
+ abusereport += " located at IP address " + scam['ip'] + ".";
+ } else {
+ abusereport += ".";
+ }
+ if ('subcategory' in scam && scam.subcategory == "MyEtherWallet") {
+ abusereport += "The domain is impersonating MyEtherWallet.com, a website where people can create Ethereum wallets (a cryptocurrency like Bitcoin).";
+ } else if ('subcategory' in scam && scam.subcategory == "MyCrypto") {
+ abusereport += "The domain is impersonating MyCrypto.com, a website where people can create Ethereum wallets (a cryptocurrency like Bitcoin).";
+ } else if ('subcategory' in scam && scam.subcategory == "Classic Ether Wallet") {
+ abusereport += "The domain is impersonating classicetherwallet.com, a website where people can create Ethereum Classic wallets (a cryptocurrency like Bitcoin).";
+ } else if ('category' in scam && scam.category == "Fake ICO") {
+ abusereport += "The domain is impersonating a website where an ICO is being held (initial coin offering, like an initial public offering but it's for cryptocurrencies).";
+ }
+ if ('category' in scam && scam.category == "Phishing") {
+ abusereport += "\r\n\r\nThe attackers wish to steal funds by using phishing to get the victim's private keys (passwords to a wallet) and using them to send funds to their own wallets.";
+ } else if ('category' in scam && scam.category == "Fake ICO") {
+ abusereport += "\r\n\r\nThe attackers wish to steal funds by cloning the real website and changing the ethereum address so people will send funds to the attackers' address instead of the real address.";
+ }
+ abusereport += "\r\n\r\nPlease shut down this domain so further attacks will be prevented.";
+ return abusereport;
+}
\ No newline at end of file
diff --git a/src/utils/config.js b/src/utils/config.js
new file mode 100644
index 00000000..9bfd14e2
--- /dev/null
+++ b/src/utils/config.js
@@ -0,0 +1,36 @@
+const fs = require('fs');
+const dns = require('graceful-dns');
+const debug = require('debug')('config');
+
+if (!fs.existsSync('./config.json')) {
+ module.exports = {
+ manual: false,
+ announcement: null,
+ port: 5111,
+ interval: {
+ cacheExpiration: -1,
+ cacheRenewCheck: -1,
+ databasePersist: -1
+ },
+ apiKeys: {
+ Google_SafeBrowsing: undefined,
+ Github_WebHook: undefined,
+ VirusTotal: undefined
+ },
+ autoPull: { enabled: false },
+ lookups: {
+ DNS: {
+ IP: { enabled: false },
+ NS: { enabled: false }
+ },
+ HTTP: { enabled: false }
+ }
+ }
+} else {
+ const config = JSON.parse(fs.readFileSync('./config.json','utf8'));
+ config.manual = true;
+ if(!config.apiKeys.Google_SafeBrowsing) debug("Warning: No Google SafeBrowsing API key found");
+ if(!config.apiKeys.VirusTotal) debug("Warning: No VirusTotal API key found");
+ if(config.lookups.DNS.servers.length > 0) dns.setServers(config.lookups.DNS.servers);
+ module.exports = config;
+}
\ No newline at end of file
diff --git a/src/utils/db.js b/src/utils/db.js
new file mode 100644
index 00000000..bd3db47e
--- /dev/null
+++ b/src/utils/db.js
@@ -0,0 +1,93 @@
+const fs = require('fs-extra');
+const yaml = require('js-yaml');
+const url = require('url');
+const path = require('path');
+const config = require('./config');
+const serialijse = require("serialijse");
+const createDictionary = require('array-object-dictionary');
+const Scam = require('../classes/scam.class');
+const debug = require('debug')('db');
+
+serialijse.declarePersistable(Scam);
+
+const db = {
+ scams: [],
+ verified: [],
+ index: {
+ featured: [],
+ blacklist: [],
+ whitelist: [],
+ whitelistAddresses: [],
+ addresses: [],
+ ips: [],
+ inactives: [],
+ actives: []
+ }
+};
+
+const readEntries = async () => {
+ debug("Reading entries...");
+ const scamsFile = await fs.readFile(path.join(__dirname, '../../_data/scams.yaml'),'utf8');
+ const verifiedFile = await fs.readFile(path.join(__dirname, '../../_data/legit_urls.yaml'),'utf8');
+ const cacheExists = await fs.pathExists('./cache.db');
+ if(!cacheExists) {
+ yaml.safeLoad(scamsFile).map(entry => new Scam(entry)).forEach(entry => db.scams.push(entry));
+ yaml.safeLoad(verifiedFile).forEach(entry => db.verified.push(entry));
+ } else {
+ const cacheFile = await fs.readFile('./cache.db','utf8');
+ Object.assign(db,serialijse.deserialize(cacheFile));
+ yaml.safeLoad(scamsFile).filter(entry => !db.scams.find(scam => scam.url == entry.url)).map(entry => new Scam(entry)).forEach(entry => db.scams.push(entry));
+ yaml.safeLoad(verifiedFile).filter(entry => !db.verified.find(verified => verified.url == entry.url)).forEach(entry => db.verified.push(entry));
+ }
+}
+
+const updateIndex = async () => {
+ debug("Updating index...");
+ const scamDictionary = createDictionary(db.scams);
+ const verifiedDictionary = createDictionary(db.verified);
+
+ db.index.featured = db.verified.filter(entry => entry.featured).sort((a,b) => a.name.localeCompare(b.name));
+ db.index.blacklist = [...db.scams.map(entry => entry.getHostname().replace('www.','')),...db.scams.map(entry => entry.getHostname().replace('www.','')),...Object.keys(scamDictionary.ip || {})];
+ db.index.whitelist = [...db.verified.map(entry => url.parse(entry.url).hostname.replace('www.','')),...db.verified.map(entry => 'www.' + url.parse(entry.url).hostname.replace('www.',''))];
+ db.index.whitelistAddresses = (verifiedDictionary.addresses || []);
+ db.index.addresses = (scamDictionary.addresses || []);
+ db.index.ips = (scamDictionary.ip || []);
+ db.index.inactives = db.scams.filter(scam => scam.status !== 'Active');
+ db.index.actives = db.scams.filter(scam => scam.status === 'Active');
+}
+
+const exitHandler = () => {
+ console.log("Cleaning up...");
+ fs.writeFileSync('./cache.db',serialijse.serialize(db));
+ console.log("Exited.");
+}
+
+module.exports.init = async () => {
+ await readEntries();
+ await updateIndex();
+ await module.exports.persist();
+ if(config.interval.databasePersist > 0) setInterval(module.exports.persist,config.interval.databasePersist);
+ process.stdin.resume();
+ process.once('beforeExit', exitHandler);
+ process.once('SIGINT', exitHandler);
+ process.once('SIGTERM', exitHandler);
+}
+
+module.exports.read = () => db;
+
+module.exports.write = (url,data) => {
+ const scam = db.scams.find(scam => scam.url == url);
+ Object.keys(data).forEach(key => scam[key] = data[key]);
+ updateIndex();
+}
+
+module.exports.persist = async () => {
+ debug("Persisting cache...");
+ await fs.writeFile('./cache.db',serialijse.serialize(db));
+}
+
+module.exports.exitHandler = exitHandler;
+
+module.exports.readEntries = readEntries;
+
+module.exports.updateIndex = updateIndex;
\ No newline at end of file
diff --git a/src/utils/github.js b/src/utils/github.js
new file mode 100644
index 00000000..2f2e49c7
--- /dev/null
+++ b/src/utils/github.js
@@ -0,0 +1,45 @@
+const request = require('request');
+const download = require('download');
+const crypto = require('crypto');
+const config = require('./config');
+const db = require('./db');
+const debug = require('debug')('github');
+
+const pullDataFiles = async () => {
+ debug("Pulling data files...");
+ await download("https://raw.githubusercontent.com/" + config.autoPull.repository.author + "/" + config.autoPull.repository.name + "/" + config.autoPull.repository.branch + "/_data/scams.yaml", "_data");
+ await download("https://raw.githubusercontent.com/" + config.autoPull.repository.author + "/" + config.autoPull.repository.name + "/" + config.autoPull.repository.branch + "/_data/legit_urls.yaml", "_data");
+ await download("https://raw.githubusercontent.com/" + config.autoPull.repository.author + "/" + config.autoPull.repository.name + "/" + config.autoPull.repository.branch + "/_data/twitter.json", "_data");
+ debug("Done");
+}
+
+module.exports.webhook = async (req,res) => {
+ if(!config.apiKeys.Github_WebHook) {
+ debug("Warning: Incoming Github Webhook attempt - no secret found in config");
+ res.status(403).end();
+ } else if(!('x-hub-signature' in req.headers)) {
+ debug("Warning: Incoming Github Webhook attempt without x-hub-signature header");
+ res.status(403).end();
+ } else {
+ const githubSig = Buffer.from(req.headers['x-hub-signature']);
+ const localSig = Buffer.from("sha1=" + crypto.createHmac("sha1", config.apiKeys.Github_WebHook).update(req.rawBody).digest("hex"));
+ if(crypto.timingSafeEqual(githubSig,localSig)) {
+ debug("Valid incoming Github webhook!");
+ await pullDataFiles();
+ await db.readEntries();
+ await db.updateIndex();
+ await db.persist();
+ res.status(200).end();
+ } else {
+ debug("Warning: Invalid Github webhook attempt");
+ res.status(403).end();
+ }
+ }
+}
+
+module.exports.pullData = async () => {
+ await pullDataFiles();
+ await db.readEntries();
+ await db.updateIndex();
+ await db.persist();
+}
\ No newline at end of file
diff --git a/src/utils/lookup.js b/src/utils/lookup.js
new file mode 100644
index 00000000..e1f402a6
--- /dev/null
+++ b/src/utils/lookup.js
@@ -0,0 +1,93 @@
+const request = require('request');
+const config = require('./config');
+const debug = require('debug')('lookup');
+const Bottleneck = require('bottleneck');
+
+const limiter = new Bottleneck({
+ minTime: config.lookups.HTTP.minTime,
+ maxConcurrent: config.lookups.HTTP.maxConcurrent
+});
+
+module.exports.lookup = limiter.wrap(url => {
+ return new Promise(resolve => {
+ debug('Requesting ' + url + '...');
+ request({
+ url: url,
+ timeout: config.lookups.HTTP.timeoutAfter,
+ followAllRedirects: true,
+ maxRedirects: 5
+ }, (err, response, body) => {
+ if(err) resolve(undefined);
+ else resolve(response);
+ });
+ });
+});
+
+module.exports.getURLScan = (url) => {
+ return new Promise((resolve, reject) => {
+ request('https://urlscan.io/api/v1/search/?q=domain%3A' + url, { json: true }, (err, response, body) => {
+ if(err) {
+ reject(err);
+ } else {
+ resolve(body)
+ }
+ });
+ });
+}
+
+module.exports.getGoogleSafeBrowsing = (url) => {
+ return new Promise((resolve,reject) => {
+ debug("Google SafeBrowsing: %o",url);
+ request({
+ url: 'https://safebrowsing.googleapis.com/v4/threatMatches:find?key=' + encodeURIComponent(config.apiKeys.Google_SafeBrowsing),
+ method: 'POST',
+ headers: {
+ "Content-Type": "application/json"
+ },
+ json: {
+ client: {
+ clientId: "EtherScamDB",
+ clientVersion: "3.0.0"
+ },
+ threatInfo: {
+ threatTypes: ["THREAT_TYPE_UNSPECIFIED", "MALWARE", "SOCIAL_ENGINEERING", "UNWANTED_SOFTWARE", "POTENTIALLY_HARMFUL_APPLICATION"],
+ platformTypes: ["PLATFORM_TYPE_UNSPECIFIED","WINDOWS","LINUX","ANDROID","OSX","IOS","ANY_PLATFORM","ALL_PLATFORMS","CHROME"],
+ threatEntryTypes: ["THREAT_ENTRY_TYPE_UNSPECIFIED", "URL", "EXECUTABLE"],
+ threatEntries: [{
+ url: url
+ }]
+ }
+ }
+ }, (err, response, body) => {
+ debug("%s returned %s %o",url,((response || {}).statusCode || -1),body);
+ if(err) {
+ reject(err);
+ } else if(response.statusCode != 200) {
+ reject("Google SafeBrowsing returned an invalid status code");
+ } else if(body && body.matches && body.matches[0]) {
+ resolve(body.matches[0]);
+ } else {
+ resolve(false);
+ }
+ });
+ });
+}
+
+module.exports.getVirusTotal = (url) => {
+ return new Promise((resolve,reject) => {
+ request({
+ uri: 'https://www.virustotal.com/vtapi/v2/url/report?apikey=' + config.VirusTotal_API_Key + '&resource=http://' + url,
+ json: true
+ }, (err, response, body) => {
+ if(err) {
+ reject(err);
+ } else if(response.statusCode != 200) {
+ reject("VirusTotal returned an invalid status code");
+ } else if(body.response_code == 0) {
+ reject("VirusTotal returned an invalid internal status code");
+ } else {
+ resolve(body);
+ }
+ });
+ });
+}
\ No newline at end of file
diff --git a/src/utils/router.js b/src/utils/router.js
new file mode 100644
index 00000000..e8f878b2
--- /dev/null
+++ b/src/utils/router.js
@@ -0,0 +1,251 @@
+const express = require('express');
+const db = require('./db');
+const generateAbuseReport = require('./abusereport');
+const checkForPhishing = require('eth-phishing-detect');
+const dateFormat = require('dateformat');
+const url = require('url');
+const config = require('./config');
+const github = require('./github');
+const router = express.Router();
+const isIpPrivate = require('private-ip');
+const {getGoogleSafeBrowsing,getURLScan} = require('./lookup');
+const debug = require('debug')('router')
+
+/* Homepage */
+router.get('/(/|index.html)?', (req, res) => res.render('index'));
+
+/* FAQ page */
+router.get('/faq/', (req, res) => res.render('faq'));
+
+/* API documentation page */
+router.get('/api/', (req, res) => res.render('api'));
+
+/* Report pages */
+router.get('/report/', (req, res) => res.render('report'));
+
+router.get('/report/domain/:domain', (req, res) => res.render('report', {
+ domain: req.params.domain
+}));
+
+router.get('/report/address/:address', (req, res) => res.render('report', {
+ address: req.params.address
+}));
+
+/* IP pages */
+router.get('/ip/:ip', async (req, res) => {
+ const entry = db.read()
+ console.log(JSON.stringify(entry.index.ips, null, 2))
+ await res.render('ip', {
+ ip: req.params.ip,
+ isPrivate: isIpPrivate(req.params.ip),
+ related: (entry.index.ips[req.params.ip] || [])
+ })
+});
+
+/* Address pages */
+router.get('/address/:address', async (req, res) => {
+ const entry = await db.read()
+ if(entry.index.whitelistAddresses[req.params.address]) {6
+ res.render('address', {
+ address: req.params.address,
+ related: (entry.index.whitelistAddresses[req.params.address]),
+ type: "verified"
+ })
+ }
+ else if(entry.index.addresses[req.params.address]) {
+ res.render('address', {
+ address: req.params.address,
+ related: (entry.index.addresses[req.params.address] || []),
+ type: "scam"
+ })
+ }
+ else {
+ res.render('address', {
+ address: req.params.address,
+ related: (entry.index.addresses[req.params.address] || []),
+ type: "neutral"
+ })
+ }
+});
+
+/* (dev) Add scam page */
+router.get('/add/', (req,res) => {
+ const {NODE_ENV} = process.env;
+ if(NODE_ENV === 'development') res.render('add');
+ else res.send(403).end();
+});
+
+/* Domain pages */
+router.get('/domain/:url', async (req, res) => {
+ const startTime = Date.now();
+ const {hostname} = url.parse('http://' + req.params.url.replace('http://','').replace('https://'));
+ const scamEntry = db.read().scams.find(scam => scam.getHostname() == hostname);
+ const verifiedEntry = db.read().verified.find(verified => url.parse(verified.url).hostname == hostname);
+
+ const urlScan = await getURLScan(hostname);
+ let googleSafeBrowsing = undefined;
+ let virusTotal = undefined;
+
+ if((scamEntry || !verifiedEntry) && config.apiKeys.Google_SafeBrowsing) googleSafeBrowsing = await getGoogleSafeBrowsing(hostname);
+ if((scamEntry || !verifiedEntry) && config.apiKeys.VirusTotal) virusTotal = await virusTotal(hostname);
+
+ if(verifiedEntry) res.render('domain', { type: 'verified', result: verifiedEntry, domain: hostname, urlScan: urlScan, metamask: false, googleSafeBrowsing: googleSafeBrowsing, virusTotal: virusTotal, startTime: startTime, dateFormat: dateFormat });
+ else if(scamEntry) res.render('domain', { type: 'scam', result: scamEntry, domain: hostname, urlScan: urlScan, metamask: checkForPhishing(hostname), googleSafeBrowsing: googleSafeBrowsing, virusTotal: virusTotal, startTime: startTime, dateFormat: dateFormat, abuseReport: generateAbuseReport(scamEntry) });
+ else res.render('domain', { type: 'neutral', domain: hostname, result: false, urlScan: urlScan, metamask: checkForPhishing(hostname), googleSafeBrowsing: googleSafeBrowsing, virusTotal: virusTotal, addresses: [], startTime: startTime });
+});
+
+/* Scams index */
+router.get('/scams/:page?/:sorting?/', (req, res) => {
+ const MAX_RESULTS_PER_PAGE = 30;
+ const scamList = [];
+ let scams = [...db.read().scams].reverse();
+ let index = [0,MAX_RESULTS_PER_PAGE];
+
+ if(req.params.page && req.params.page != 'all' && (!isFinite(parseInt(req.params.page)) || isNaN(parseInt(req.params.page)) || parseInt(req.params.page) < 1)) {
+ res.status(404).render('404');
+ } else {
+ if (req.params.sorting == 'oldest') scams = db.read().scams;
+ else if (req.params.sorting == 'status') scams = [...db.read().scams].sort((a,b) => (a.status || '').localeCompare(b.status || ''));
+ else if (req.params.sorting == 'category') scams = [...db.read().scams].sort((a,b) => (a.category || '').localeCompare(b.category || ''));
+ else if (req.params.sorting == 'subcategory') scams = [...db.read().scams].sort((a,b) => (a.subcategory || '').localeCompare(b.subcategory || ''));
+ else if (req.params.sorting == 'name') scams = [...db.read().scams].sort((a,b) => a.getHostname().localeCompare(b.getHostname()));
+
+ if (req.params.page == "all") index = [0,scams.length-1];
+ else if(req.params.page) index = [(req.params.page-1) * MAX_RESULTS_PER_PAGE,(req.params.page * MAX_RESULTS_PER_PAGE)];
+
+ for (var i = index[0]; i <= index[1]; i++) {
+ if (scams.hasOwnProperty(i) === false) continue;
+ scamList.push(scams[i]);
+ }
+
+ res.render('scams', {
+ 'page': req.params.page,
+ 'sorting': req.params.sorting,
+ 'total': scams.length.toLocaleString('en-US'),
+ 'active': Object.keys(scams.filter(scam => scam.status === 'Active')).length.toLocaleString('en-US'),
+ 'total_addresses': Object.keys(db.read().index.addresses).length.toLocaleString('en-US'),
+ 'inactive': Object.keys(scams.filter(scam => scam.status === 'Inactive')).length.toLocaleString('en-US'),
+ 'scams': scamList,
+ 'MAX_RESULTS_PER_PAGE': MAX_RESULTS_PER_PAGE,
+ 'scamsLength': scams.length
+ });
+ }
+});
+
+/* Search pages */
+router.get('/search/', (req, res) => res.render('search', { featured: db.read().index.featured }));
+
+/* RSS */
+router.get('/rss/', (req, res) => res.render('rss', { scams: db.read().scams }));
+
+/* API middleware */
+router.use('/api/:type?/:domain?/', (req,res,next) => {
+ res.header('Access-Control-Allow-Origin', '*');
+ next();
+});
+
+router.get('/api/scams', (req, res) => res.json({ success: true, result: db.read().scams }));
+router.get('/api/addresses', (req, res) => res.json({ success: true, result: db.read().index.addresses }));
+router.get('/api/ips', (req, res) => res.json({ success: true, result: db.read().index.ips }));
+router.get('/api/verified', (req, res) => res.json({ success: true, result: db.read().verified }));
+router.get('/api/inactives', (req, res) => res.json({ success: true, result: db.read().index.inactives }));
+router.get('/api/actives', (req, res) => res.json({ success: true, result: db.read().index.actives }));
+router.get('/api/blacklist', (req, res) => res.json(db.read().index.blacklist));
+router.get('/api/whitelist', (req, res) => res.json(db.read().index.whitelist));
+router.get('/api/abusereport/:domain', (req, res) => {
+ const result = db.read().scams.find(scam => scam.getHostname() == url.parse(req.params.domain).hostname || scam.url.replace(/(^\w+:|^)\/\//, '') == req.params.domain);
+ if (result) res.json({ success: false, message: "URL wasn't found"});
+ else res.send({ success: true, result: generateAbuseReport(result)});
+});
+router.get('/api/check/:search', (req,res) => {
+ if (/^0x?[0-9A-Fa-f]{40,42}$/.test(req.params.search)) {
+ /* Searched for an ethereum address */
+ const whitelistAddresses = Object.keys(db.read().index.whitelistAddresses).filter(address => req.params.search.toLowerCase() === address.toLowerCase());
+ const blacklistAddresses = Object.keys(db.read().index.addresses).filter(address => req.params.search.toLowerCase() === address.toLowerCase());
+ if(whitelistAddresses.length > 0) {
+ res.json({
+ success: true,
+ result: 'whitelisted',
+ type: 'address',
+ entries: whitelistAddresses.map(address => db.read().index.whitelistAddresses[address])
+ });
+ } else if(blacklistAddresses.length > 0) {
+ res.json({
+ success: true,
+ result: 'blocked',
+ type: 'address',
+ entries: blacklistAddresses.map(address => db.read().index.addresses[address])
+ });
+ } else {
+ res.json({
+ success: true,
+ result: 'neutral',
+ type: 'address',
+ entries: []
+ });
+ }
+ } else if(/[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/.test(req.params.search)) {
+ /* Searched for a domain */
+ const whitelistURL = db.read().verified.find(entry => (url.parse(req.params.search).hostname || req.params.search) === (url.parse(entry.url).hostname));
+ const blacklistURL = db.read().scams.find(entry => (url.parse(req.params.search).hostname || req.params.search) === entry.getHostname());
+ if(whitelistURL) {
+ res.json({
+ success: true,
+ result: 'verified',
+ type: 'domain',
+ entries: [whitelistURL]
+ });
+ } else if(blacklistURL) {
+ res.json({
+ success: true,
+ result: 'blocked',
+ type: 'domain',
+ entries: [blacklistURL]
+ });
+ } else {
+ res.json({
+ success: true,
+ result: 'neutral',
+ type: 'domain',
+ entries: []
+ });
+ }
+ } else if(/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$|^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$|^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/.test(req.params.search)) {
+ /* Searched for an ip address */
+ const blacklistIP = Object.keys(db.read().index.ips).filter(ip => req.params.search.toLowerCase() === ip.toLowerCase());
+ if(blacklistIP.length > 0) {
+ res.json({
+ success: true,
+ result: 'blocked',
+ type: 'ip',
+ entries: blacklistIP
+ });
+ } else {
+ res.json({
+ success: true,
+ result: 'neutral',
+ type: 'ip',
+ entries: []
+ });
+ }
+ } else {
+ res.json({
+ success: false,
+ message: "Incorrect search type (must be ethereum address / ip address / URL)"
+ });
+ }
+});
+
+/* Incoming Github webhook attempt */
+router.post('/update/', (req, res) => {
+ req.rawBody = '';
+ req.setEncoding('utf8');
+ req.on('data', chunk => req.rawBody += chunk);
+ req.on('end', () => github.webhook(req,res));
+});
+
+/* Safe redirect pages */
+router.get('/redirect/:url', (req,res) => res.render('redirect', { url: req.params.url }));
+
+
+module.exports = router;
diff --git a/src/utils/writeConfig.js b/src/utils/writeConfig.js
new file mode 100644
index 00000000..1c6754bd
--- /dev/null
+++ b/src/utils/writeConfig.js
@@ -0,0 +1,69 @@
+const fs = require('fs-extra');
+
+module.exports = async (options) => {
+ let httpMinTime = null;
+ let httpMaxConcurrent = null;
+ let httpTimeoutAfter = null;
+ let dnsServers = [];
+
+ if(options['http-bottleneck'] == 'fast') {
+ httpMinTime = 0;
+ httpMaxConcurrent = 200;
+ } else if(options['http-bottleneck'] == 'regular') {
+ httpMinTime = 100;
+ httpMaxConcurrent = 20;
+ } else if(options['http-bottleneck'] == 'slow') {
+ httpMinTime = 500;
+ httpMaxConcurrent = 5;
+ }
+
+ if(options['dns-servers'] == 'cloudflare') dnsServers = ['1.1.1.1','1.0.0.1'];
+ else if(options['dns-servers'] == 'google') dnsServers = ['8.8.8.8','8.8.4.4'];
+ else if(options['dns-servers'] == 'opendns') dnsServers = ['208.67.222.222','208.67.220.220'];
+
+ if(options['http-timeout'] == 'highly-accurate') httpTimeoutAfter = null;
+ else if(options['http-timeout'] == 'accurate') httpTimeoutAfter = 15*1000;
+ else if(options['http-timeout'] == 'less-accurate') httpTimeoutAfter = 5*1000;
+
+ const config = {
+ port: parseInt(options.port),
+ announcement: null,
+ interval: {
+ cacheExpiration: 1000 * 60 * parseInt(options['cache-expiration']),
+ cacheRenewCheck: 1000 * 60 * parseInt(options['cache-renewal']),
+ databasePersist: 1000 * parseInt(options['database-persist'])
+ },
+ apiKeys: {
+ Google_SafeBrowsing: options['google-safebrowsing'] || null,
+ Github_WebHook: null,
+ VirusTotal: options.virustotal || null
+ },
+ autoPull: {
+ enabled: (options.pull == "on"),
+ interval: 1000 * 60 * 2,
+ repository: {
+ author: "MrLuit",
+ name: "EtherScamDB",
+ branch: "master"
+ }
+ },
+ lookups: {
+ DNS: {
+ servers: dnsServers,
+ IP: {
+ enabled: (options.mode === "safe" || options.mode == "full")
+ },
+ NS: {
+ enabled: (options.mode === "safe" || options.mode == "full")
+ }
+ },
+ HTTP: {
+ enabled: (options.mode == "full"),
+ minTime: httpMinTime,
+ maxConcurrent: httpMaxConcurrent,
+ timeoutAfter: httpTimeoutAfter
+ }
+ }
+ }
+ await fs.writeJson('./config.json',config,{ spaces: 4 });
+}
\ No newline at end of file
diff --git a/src/views/pages/404.ejs b/src/views/pages/404.ejs
new file mode 100644
index 00000000..8244c862
--- /dev/null
+++ b/src/views/pages/404.ejs
@@ -0,0 +1,18 @@
+
+
+
+ <% include ../partials/header.ejs %>
+
+
+
+ <% include ../partials/navbar.ejs %>
+
+
404
+
This page was not found
+
+
+ <% include ../partials/footer.ejs %>
+
+
\ No newline at end of file
diff --git a/src/views/pages/add.ejs b/src/views/pages/add.ejs
new file mode 100644
index 00000000..18e85822
--- /dev/null
+++ b/src/views/pages/add.ejs
@@ -0,0 +1,54 @@
+
+
+
+ <% include ../partials/header.ejs %>
+
+
+
+ <% include ../partials/footer.ejs %>
+
+
+
+
\ No newline at end of file
diff --git a/src/views/pages/address.ejs b/src/views/pages/address.ejs
new file mode 100644
index 00000000..f48d743f
--- /dev/null
+++ b/src/views/pages/address.ejs
@@ -0,0 +1,52 @@
+
+
+
+ <% include ../partials/header.ejs %>
+
+
+
+ <% include ../partials/navbar.ejs %>
+
+
<%= address %>
+ <% if(related.length == 0) { %>
+
This is an unclassified address. This does not mean that it is safe. It simply means that it hasn't been classified.
+ <% } else if(type == "scam") { %>
+
Warning: Do not send money to this address
+ <% } else if(type == "verified"){ %>
+
This is a verified address
+ <% } %>
+
Balance :
loading...
+
USD Value :
loading...
+
Related to the following domains (<%= related.length %>) :
+ <% if(related.length > 0) { %>
+
+ <% related.forEach(entry => { %>
+
+ <% }); %>
+
+ <% } else { %>
+
(none)
+ <% } %>
+
+
View address on etherscan
+
+
+ <% include ../partials/footer.ejs %>
+
+
+ Please enable JavaScript to view the comments powered by Disqus.
+
+
diff --git a/src/views/pages/api.ejs b/src/views/pages/api.ejs
new file mode 100644
index 00000000..d395bdf2
--- /dev/null
+++ b/src/views/pages/api.ejs
@@ -0,0 +1,133 @@
+
+
+
+ <% include ../partials/header.ejs %>
+
+
+
+ <% include ../partials/navbar.ejs %>
+
+
API
+
+
Check
+
URL :
GET "https://etherscamdb.info/api/check/0xDaa29859836D97C810c7F9D350D4A1B3E8CafC9a/" (can be a domain, ethereum address, or ip address)
+
Response:
+
+
Report
+
Example URL :
https://etherscamdb.info/report/domain/fake-mycrypto.com/
+
Another example URL :
https://etherscamdb.info/report/address/0x0000000000000000000000000000000000000000/
+ All of the values (fake-mycrypto.com and 0x0000000000000000000000000000000000000000) are optional.
+
Scams
+
URL :
GET "https://etherscamdb.info/api/scams/"
+
Response:
+
+
Addresses
+
URL :
GET "https://etherscamdb.info/api/addresses/"
+
Response:
+
+
IPs
+
URL :
GET "https://etherscamdb.info/api/ips/"
+
Response:
+
+
Verified
+
URL :
GET "https://etherscamdb.info/api/verified/"
+
Response:
+
+
Blacklist
+
URL :
GET "https://etherscamdb.info/api/blacklist/"
+
Response:
+
+
Whitelist
+
URL :
GET "https://etherscamdb.info/api/whitelist/"
+
Response:
+
+
+
Inactives
+
URL :
GET "https://etherscamdb.info/api/inactives/"
+
Response:
+
+
+
Actives
+
URL :
GET "https://etherscamdb.info/api/actives/"
+
Response:
+
+
+
Abuse report
+
URL :
GET "https://etherscamdb.info/api/abusereport/changellyli.com/"
+
Response:
+
+
+ <% include ../partials/footer.ejs %>
+
+
+
\ No newline at end of file
diff --git a/src/views/pages/config.ejs b/src/views/pages/config.ejs
new file mode 100644
index 00000000..04390682
--- /dev/null
+++ b/src/views/pages/config.ejs
@@ -0,0 +1,250 @@
+
+
+
+ <% include ../partials/header.ejs %>
+
+
+
+
+
+
+
Configuration
+
+
+ <% if(production) { %>
+
Because your app was launched into production mode, the configuration process cannot be started. Please relaunch into development mode or manually create the config.json
+ <% } else if(done) { %>
+
Your preferred configuration was saved successfully. Please restart this application for changes to apply.
+ <% } else { %>
+
+
+
In which mode would you like EtherScamDB to run?
+
+
+
+ Light (all IP, DNS, and HTTP lookups disabled )
+
+
+
+
+
+ Safe (only IP and DNS lookups enabled )
+
+
+
+
+
+ Full (all IP, DNS and HTTP lookups enabled )
+
+
+
+
+
+
+
How fast would you like http requests to be processed?
+
+
+
+ Fast (no bottleneck)
+
+
+
+
+
+ Regular (allow 20 http requests at a time)
+
+
+
+
+
+ Slow (allow 1 http request at a time)
+
+
+
+
+
+
How accurate would you like http requests to be?
+
+
+
+ Highly accurate (slow ; no timeout)
+
+
+
+
+
+ Accurate (normal ; 15 seconds timeout)
+
+
+
+
+
+ Less accurate (fast ; 5 seconds timeout)
+
+
+
+
+
+
+
+
+ Automatically pull updated data files from Github
+
+
+
+
+ API Keys
+
+
+
+
+
Google Safebrowsing (see here )
+
+
+
+
VirusTotal (see here )
+
+
+
+
+
+
+
+ Timers
+
+
+
+
+
+ Cache expiration time (minutes)
+
+
+
+
+
+
+ Cache renewal check time (minutes)
+
+
+
+
+
+
+ Database persist interval (seconds)
+
+
+
+
+
+
+
+
+
+ Advanced settings
+
+
+
+
Warning: only change these fields if you know what you're doing!
+
+
General
+
+ Port
+
+
+
+
DNS Resolver
+
+
+
+
+ None (local defaults)
+
+
+
+
+
+ Cloudflare (1.1.1.1 and 1.0.0.1)
+
+
+
+
+
+ Google (8.8.8.8 and 8.8.4.4)
+
+
+
+
+
+ OpenDNS (208.67.222.222 and 208.67.220.220)
+
+
+
+
+
+
+
+
+
+ Submit
+ Reset
+
+ <% } %>
+
+
+ <% include ../partials/footer.ejs %>
+
+
+
+
\ No newline at end of file
diff --git a/src/views/pages/domain.ejs b/src/views/pages/domain.ejs
new file mode 100644
index 00000000..f16505ea
--- /dev/null
+++ b/src/views/pages/domain.ejs
@@ -0,0 +1,186 @@
+
+
+
+
+<% include ../partials/header %>
+
+
+
+
+ <% include ../partials/navbar %>
+
+
+
+
+
+
Copy the following url to share with other people:
+
+
+
+
+ Cancel
+
+
+ Copy
+
+
+
+ <% if(typeof abuseReport !== "undefined") { %>
+
+
+
+
+
+
+ Cancel
+
+
+ Copy
+
+
+
+ <% } %>
+
+
<%= domain %>
+
+ <% if(typeof abuseReport !== "undefined") { %>
+
Abuse Report
+ <% } %>
+
Archive
+
+ Improve
+
+
+ Share
+
+
+
+<% if(type == "neutral") { %>
+
This domain has not yet been classified on EtherScamDB
+<% } else if(type == "scam") { %>
+
Warning: This is a likely a malicious domain.
+<% } else if(type == "verified") { %>
+
This is a verified domain.
+<% } %>
+<% if(type == "scam" && result && result.url) { %>
+
URL :
<%= result.url %>
+<% } %>
+<% if(result && result.category && result.subcategory) { %>
+
Category : <%= result.category %> - <%= result.subcategory %>
+<% } else if(result && result.category) { %>
+
Category : <%= result.category %>
+<% } %>
+<% if(result && result.description) { %>
+
Description : <%= result.description %>
+<% } %>
+<% if(result && result.status) { %>
+
Status :
<%= result.status %>
+<% } %>
+<% if(result && result.ip) { %>
+
IP :
<%= result.ip %>
+<% } %>
+
+<% if(typeof metamask !== "undefined") {
+let color;
+if(type == "neutral" && !metamask) color = "orange";
+else if(type == "neutral" && metamask) color = "red";
+else if(type == "neutral" && !metamask) color = "green";
+else if(type == "scam" && !metamask) color = "red";
+else if(type == "scam" && metamask) color = "green";
+%>
+
MetaMask Status:
+<% if(metamask) { %>
+Blocked
+<% } else { %>
+Not yet blocked
+<% } %>
+
+<% } %>
+<% if(googleSafeBrowsing !== undefined) { %>
+<% if(googleSafeBrowsing === false) { %>
+
Google Safe Browsing Status :
Not Blocked Yet
+<% } else { %>
+
Google Safe Browsing Status :
Blocked for <%= googleSafeBrowsing.threatType %>
+<% } %>
+<% } %>
+
+<% if(virusTotal !== undefined) { %>
+<% if(virusTotal.positives == 0) { %>
+
VirusTotal Detections :
<%= virusTotal.positives %>/<%= virusTotal.total %>
+<% } else { %>
+
VirusTotal Detections :
<%= virusTotal.positives %>/<%= virusTotal.total %>
+<% } %>
+<% if (virusTotal.scans.Phishtank.result == "clean site") { %>
+
Phishtank Detected :
Clean Site
+<% } else if(virusTotal.scans.Phishtank.result == "phishing site") { %>
+
Phishtank Detected :
Phishing Site
+<% } else { %>
+
Phishtank Detected :
<%= virusTotal.scans.Phishtank.result %>
+<% } %>
+<% } %>
+<% if(urlScan && urlScan.results && urlScan.results.length > 0) { %>
+
Urlscan Scan Results :
" target="_blank">Link
+<% } %>
+
+
+
+<% if(result && result.nameservers) { %>
+
Nameservers :
+
+ <% result.nameservers.forEach(nameserver => { %>
+
<%= nameserver %>
+ <% }); %>
+
+<% } %>
+
+<% if(result && result.addresses && result.addresses.length > 0) { %>
+
Related addresses :
+
+ <% result.addresses.forEach(address => { %>
+
+ <% }); %>
+
+<% } %>
+
+<% if(urlScan && urlScan.results && urlScan.results.length > 0) { %>
+
Urlscan Screenshot :
+
+<% } %>
+
+
+<% if(!result) { %>
+
This page was built in <%= Date.now()-startTime %> ms
+<% } else if(result.updated == "0") { %>
+
This page was built in <%= Date.now()-startTime %> ms, and never updated
+<% } else { %>
+
This page was built in <%= Date.now()-startTime %> ms, and last updated at <%= dateFormat(result.updated, "UTC:mmm dd yyyy, HH:MM") %> UTC
+<% } %>
+
+
+ <% include ../partials/footer %>
+
+Please enable JavaScript to view the comments powered by Disqus.
+
+
+
+
diff --git a/src/views/pages/faq.ejs b/src/views/pages/faq.ejs
new file mode 100644
index 00000000..18aff88a
--- /dev/null
+++ b/src/views/pages/faq.ejs
@@ -0,0 +1,34 @@
+
+
+
+ <% include ../partials/header.ejs %>
+
+
+ <% include ../partials/navbar.ejs %>
+
+
FAQ
+
How to protect myself against scammers?
+
+
+
Bookmark your crypto sites - Use those bookmarks and only those.
+
Only send funds to trusted addresses - Double-check what address you're sending ETH to. Look up the address at
etherscan.io and check if there are bad reviews
+
Never trust any discord/slack/telegram/reddit message - Don't ever fall for messages that say you can get free ETH or that a hack has occurred.
+
+ MyCrypto has written a great guide on
protecting yourself and your funds .
+
How can I join the fight?
+
+
+
+
Send abuse reports to the registrar, hosting and ssl provider of the scam domains
+
+
+
Can I use the data from this project?
+ Yes, you can either
download the raw data files from Github or take a look at our
API .
+
Are the reports open source? Where do they go?
+
All reports end up in a private Slack to protect people's privacy. The reports can be read by all team members of MyCrypto and they can decide whether the report makes it to the blacklist.
+
Why was the database created?
+
The database was created in 2017 when trying to find a solution to the ethereum scams. Of course grouping all the scams won't make them go away, but it will make identifying them and taking them down easier. It is now being maintained by members of the MyCrypto team.
+
+ <% include ../partials/footer.ejs %>
+
+
\ No newline at end of file
diff --git a/src/views/pages/index.ejs b/src/views/pages/index.ejs
new file mode 100644
index 00000000..def88fe2
--- /dev/null
+++ b/src/views/pages/index.ejs
@@ -0,0 +1,37 @@
+
+
+
+ <% include ../partials/header.ejs %>
+
+
+
+ <% include ../partials/navbar.ejs %>
+
+
+
+
+
+
+
Open-Source
+ The full website is open-source at
Github including all datasets with documentation to use them in your own application.
+
+
+
Knowledge
+ By combining all the information that's available, connections between scams can easily be found.
+
+
+
+
+
Report
+ An easy-to-use report function helps us identifying all the current scams so we can add them to the database.
+
+
+
Donate
+ Support the developers and maintainers of this project by donating ETH or ERC20 tokens to
etherscamdb.eth
+
+
+
+ <% include ../partials/footer.ejs %>
+
+
+
\ No newline at end of file
diff --git a/src/views/pages/ip.ejs b/src/views/pages/ip.ejs
new file mode 100644
index 00000000..b82aa66b
--- /dev/null
+++ b/src/views/pages/ip.ejs
@@ -0,0 +1,42 @@
+
+
+
+ <% include ../partials/header.ejs %>
+
+
+ <% include ../partials/navbar.ejs %>
+
+ <% if(isPrivate) { %>
+
+
+
+
+
This is a private IP address, and is only used in internal network environments. Any abusive activity you see coming from an internal IP is either coming from within your network itself, or is the result of an error or misconfiguration.
+
+
+ <% } %>
+
<%= ip %>
+
Location :
loading...
+
AbuseIPDB: View Report
+
URLScan: View Report
+
Related to the following domains (<%= related.length %>) :
+ <% if(related.length > 0) { %>
+
+ <% related.forEach(entry => { %>
+
+ <% }); %>
+
+ <% } else { %>
+
(none)
+ <% } %>
+
+
+
+ <% include ../partials/footer.ejs %>
+
+
+
\ No newline at end of file
diff --git a/src/views/pages/redirect.ejs b/src/views/pages/redirect.ejs
new file mode 100644
index 00000000..6e6fb004
--- /dev/null
+++ b/src/views/pages/redirect.ejs
@@ -0,0 +1,34 @@
+
+
+
+ <% include ../partials/header.ejs %>
+
+
+
+ <% include ../partials/navbar.ejs %>
+
+
Warning
+
You are about to leave the official website to an untrusted domain.
+
+
Domain: <%= url %>
+
+
+
+
Do not click anything.
+
+
+
Do not fill in any of your information. (And definitely no private keys!)
+
+
+
Wipe your history after you have visited this domain. You don't want a fake website to show up when you type "myetherwa" or "mycry" in your address bar.
+
+
+
+ I understand
+
+
+ <% include ../partials/footer.ejs %>
+
+
+
+
\ No newline at end of file
diff --git a/_layouts/report.html b/src/views/pages/report.ejs
similarity index 92%
rename from _layouts/report.html
rename to src/views/pages/report.ejs
index 62786bc1..ac7f7677 100644
--- a/_layouts/report.html
+++ b/src/views/pages/report.ejs
@@ -1,5 +1,20 @@
-
+
+
+
+<% include ../partials/header %>
+<% if(typeof domain !== "undefined") { %>
+
+<% } else if(typeof address !== "undefined") { %>
+
+<% } else { %>
+
+<% } %>
+
+
+
+ <% include ../partials/navbar %>
+
@@ -362,6 +385,16 @@
Install
+
+ <% include ../partials/footer %>
+ <% if(typeof domain !== "undefined") { %>
+
+<% } else if(typeof address !== "undefined") { %>
+
+<% } else { %>
+
+<% } %>
+
+
+
diff --git a/_layouts/rss.html b/src/views/pages/rss.ejs
similarity index 53%
rename from _layouts/rss.html
rename to src/views/pages/rss.ejs
index b1235b79..2083e9c1 100644
--- a/_layouts/rss.html
+++ b/src/views/pages/rss.ejs
@@ -4,6 +4,12 @@
EtherScamDB
https://etherscamdb.info
An open-source database for all Ethereum and ERC20 scams
- {{ rss.entries }}
+ <% scams.forEach(scam => { %>
+ -
+
<%= scam.name %>
+ https://etherscamdb.info/scam/<%= scam.id %>/
+ <%= scam.category %>
+
+ <% }); %>
\ No newline at end of file
diff --git a/src/views/pages/scams.ejs b/src/views/pages/scams.ejs
new file mode 100644
index 00000000..a32d4a16
--- /dev/null
+++ b/src/views/pages/scams.ejs
@@ -0,0 +1,185 @@
+
+
+
+
+<% include ../partials/header %>
+
+
+
+
+ <% include ../partials/navbar %>
+
+
+
+
+
+ <%= total %>
+
+
+ Total scams
+
+
+
+
+
+
+ <%= active %>
+
+
+ Active scams
+
+
+
+
+
+
+ <%= total_addresses %>
+
+
+ Addresses registered
+
+
+
+
+
+
+ <%= inactive %>
+
+
+ Inactive scams
+
+
+
+
+
Scams
+
+
+
+ <% if(sorting == "category") { %>
+ Category
+ <% } else { %>
+ Category
+ <% } %>
+ <% if(sorting == "subcategory") { %>
+ Subcategory
+ <% } else { %>
+ Subcategory
+ <% } %>
+ <% if(sorting == "status") { %>
+ Status
+ <% } else { %>
+ Status
+ <% } %>
+ <% if(sorting == "name") { %>
+ Name
+ <% } else { %>
+ Name
+ <% } %>
+ Info
+
+
+ <% scams.forEach(scam => { %>
+
+ <% if("category" in scam && scam.category) { %>
+ <% if(scam.category == "Phishing") { %>
+ Phishing
+ <% } else if(scam.category == "Scamming") { %>
+ Scamming
+ <% } else if(scam.category == "Fake ICO") { %>
+ Fake ICO
+ <% } else { %>
+ <%= scam.category %>
+ <% } %>
+ <% } else { %>
+ None
+ <% } %>
+
+ <% if("subcategory" in scam && scam.subcategory) { %>
+ <% if(scam.category == "Wallets") { %>
+ Wallets
+ <% } else { %>
+ <%= scam.subcategory %>
+ <% } %>
+ <% } else { %>
+ None
+ <% } %>
+
+ <% if("status" in scam && scam.status) { %>
+ <% if(scam.status == "Active") { %>
+ Active
+ <% } else if(scam.status == "Inactive") { %>
+ Inactive
+ <% } else if(scam.status == "Suspended") { %>
+ Suspended
+ <% } else if(scam.status == "Offline") { %>
+ Offline
+ <% } %>
+ <% } else { %>
+ Unknown
+ <% } %>
+
+ <% if(scam.getHostname().length > 40) { %>
+ <%= scam.getHostname().substring(0, 40) %>...
+ <% } else { %>
+ <%= scam.getHostname() %>
+ <% } %>
+
+
+
+
+
+ <% }); %>
+
+
+<% if(page !== "all") { %>
+
+<% } %>
+
+
+ <% include ../partials/footer %>
+
+
+
+
\ No newline at end of file
diff --git a/_layouts/search.html b/src/views/pages/search.ejs
similarity index 67%
rename from _layouts/search.html
rename to src/views/pages/search.ejs
index 9a262474..96dc1395 100644
--- a/_layouts/search.html
+++ b/src/views/pages/search.ejs
@@ -1,5 +1,13 @@
-
- Check URL / IP / ETH Address
+
+
+
+ <% include ../partials/header.ejs %>
+
+
+
+ <% include ../partials/navbar.ejs %>
+
+
Check URL / IP / ETH Address
@@ -41,7 +49,20 @@
Trusted domains
- {{ trusted.table }}
+ <% featured.forEach(entry => { %>
+
+
+ <%= entry.name %>
+
+
+ <%= entry.url %>
+
+
+ <% }); %>
-
+
+ <% include ../partials/footer.ejs %>
+
+
+
diff --git a/src/views/partials/footer.ejs b/src/views/partials/footer.ejs
new file mode 100644
index 00000000..fd539018
--- /dev/null
+++ b/src/views/partials/footer.ejs
@@ -0,0 +1,21 @@
+
+
+
\ No newline at end of file
diff --git a/src/views/partials/header.ejs b/src/views/partials/header.ejs
new file mode 100644
index 00000000..66e7b7d2
--- /dev/null
+++ b/src/views/partials/header.ejs
@@ -0,0 +1,17 @@
+
Ethereum Scam Database
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/partials/navbar.ejs b/src/views/partials/navbar.ejs
new file mode 100644
index 00000000..43783d9a
--- /dev/null
+++ b/src/views/partials/navbar.ejs
@@ -0,0 +1,29 @@
+
+<% if(environment === "production" && announcement) { %>
+
+ <%- announcement %>
+
+<% } %>
\ No newline at end of file
diff --git a/_static/css/404.css b/src/views/static/css/404.css
similarity index 100%
rename from _static/css/404.css
rename to src/views/static/css/404.css
diff --git a/_static/css/address.css b/src/views/static/css/address.css
similarity index 100%
rename from _static/css/address.css
rename to src/views/static/css/address.css
diff --git a/_static/css/api.css b/src/views/static/css/api.css
similarity index 100%
rename from _static/css/api.css
rename to src/views/static/css/api.css
diff --git a/_static/css/verified.css b/src/views/static/css/domain.css
similarity index 94%
rename from _static/css/verified.css
rename to src/views/static/css/domain.css
index 78271275..23b7135d 100644
--- a/_static/css/verified.css
+++ b/src/views/static/css/domain.css
@@ -35,8 +35,6 @@
filter: gray;
-webkit-filter: grayscale(1);
filter: grayscale(1);
- width: 100%;
- height: 100%;
border: 2px solid #000;
}
#scam-screenshot:hover {
diff --git a/_static/css/general.css b/src/views/static/css/general.css
similarity index 65%
rename from _static/css/general.css
rename to src/views/static/css/general.css
index 1bf153ef..2f2e999a 100644
--- a/_static/css/general.css
+++ b/src/views/static/css/general.css
@@ -1,7 +1,13 @@
+body {
+ display: flex;
+ min-height: 100vh;
+ flex-direction: column;
+}
+
.ui.body.container {
+ flex: 1;
padding-top: 7em;
- min-height: 100%;
- padding-bottom: 7%;
+ padding-bottom: 7em;
}
.ui.fixed.inverted.menu {
@@ -14,19 +20,10 @@
}
.ui.footer {
- position: absolute;
- left: 0;
- right: 0;
- height: 45px;
- margin-top: -45px !important;
text-align: center;
width: 100%;
}
-.footer-item-container {
- display: inline-flex;
-}
-
#footer-item-img {
height: 75px;
width: 178px;
diff --git a/_static/css/home.css b/src/views/static/css/home.css
similarity index 100%
rename from _static/css/home.css
rename to src/views/static/css/home.css
diff --git a/_static/css/redirect.css b/src/views/static/css/redirect.css
similarity index 100%
rename from _static/css/redirect.css
rename to src/views/static/css/redirect.css
diff --git a/_static/css/report.css b/src/views/static/css/report.css
similarity index 100%
rename from _static/css/report.css
rename to src/views/static/css/report.css
diff --git a/_static/css/reportaddress.css b/src/views/static/css/reportaddress.css
similarity index 80%
rename from _static/css/reportaddress.css
rename to src/views/static/css/reportaddress.css
index 055cec67..82bb653f 100644
--- a/_static/css/reportaddress.css
+++ b/src/views/static/css/reportaddress.css
@@ -1,3 +1,7 @@
+.question1,.question2a,.question2b,.question3,.question4a,.question4b,.question5,.question6,.question7a,.question7b,.question7c,.question8,.question9a,.question9c {
+ display: none;
+}
+
.ui.form {
margin-top: 1%;
}
diff --git a/_static/css/reportdomain.css b/src/views/static/css/reportdomain.css
similarity index 79%
rename from _static/css/reportdomain.css
rename to src/views/static/css/reportdomain.css
index 3af1b2b2..62c5ebb3 100644
--- a/_static/css/reportdomain.css
+++ b/src/views/static/css/reportdomain.css
@@ -1,3 +1,7 @@
+.question1,.question2a,.question2b,.question3,.question4a,.question4b,.question5,.question6,.question7a,.question7b,.question7c,.question8,.question9b,.question9c {
+ display: none;
+}
+
.ui.form {
margin-top: 1%;
}
diff --git a/_static/css/scams.css b/src/views/static/css/scams.css
similarity index 100%
rename from _static/css/scams.css
rename to src/views/static/css/scams.css
diff --git a/_static/css/search.css b/src/views/static/css/search.css
similarity index 100%
rename from _static/css/search.css
rename to src/views/static/css/search.css
diff --git a/_static/favicon.ico b/src/views/static/favicon.ico
similarity index 100%
rename from _static/favicon.ico
rename to src/views/static/favicon.ico
diff --git a/_static/img/adhive.png b/src/views/static/img/adhive.png
similarity index 100%
rename from _static/img/adhive.png
rename to src/views/static/img/adhive.png
diff --git a/_static/img/ankr.png b/src/views/static/img/ankr.png
similarity index 100%
rename from _static/img/ankr.png
rename to src/views/static/img/ankr.png
diff --git a/_static/img/aragon.png b/src/views/static/img/aragon.png
similarity index 100%
rename from _static/img/aragon.png
rename to src/views/static/img/aragon.png
diff --git a/_static/img/bibox.png b/src/views/static/img/bibox.png
similarity index 100%
rename from _static/img/bibox.png
rename to src/views/static/img/bibox.png
diff --git a/_static/img/binance.png b/src/views/static/img/binance.png
similarity index 100%
rename from _static/img/binance.png
rename to src/views/static/img/binance.png
diff --git a/_static/img/bitfinex.png b/src/views/static/img/bitfinex.png
similarity index 100%
rename from _static/img/bitfinex.png
rename to src/views/static/img/bitfinex.png
diff --git a/_static/img/bittrex.png b/src/views/static/img/bittrex.png
similarity index 100%
rename from _static/img/bittrex.png
rename to src/views/static/img/bittrex.png
diff --git a/_static/img/blockchain.info.png b/src/views/static/img/blockchain.info.png
similarity index 100%
rename from _static/img/blockchain.info.png
rename to src/views/static/img/blockchain.info.png
diff --git a/_static/img/changelly.png b/src/views/static/img/changelly.png
similarity index 100%
rename from _static/img/changelly.png
rename to src/views/static/img/changelly.png
diff --git a/_static/img/classicetherwallet.png b/src/views/static/img/classicetherwallet.png
similarity index 100%
rename from _static/img/classicetherwallet.png
rename to src/views/static/img/classicetherwallet.png
diff --git a/_static/img/coinbase.png b/src/views/static/img/coinbase.png
similarity index 100%
rename from _static/img/coinbase.png
rename to src/views/static/img/coinbase.png
diff --git a/_static/img/coindash.png b/src/views/static/img/coindash.png
similarity index 100%
rename from _static/img/coindash.png
rename to src/views/static/img/coindash.png
diff --git a/_static/img/decentraland.png b/src/views/static/img/decentraland.png
similarity index 100%
rename from _static/img/decentraland.png
rename to src/views/static/img/decentraland.png
diff --git a/_static/img/district0x.png b/src/views/static/img/district0x.png
similarity index 100%
rename from _static/img/district0x.png
rename to src/views/static/img/district0x.png
diff --git a/_static/img/dmarket.png b/src/views/static/img/dmarket.png
similarity index 100%
rename from _static/img/dmarket.png
rename to src/views/static/img/dmarket.png
diff --git a/_static/img/electrum.png b/src/views/static/img/electrum.png
similarity index 100%
rename from _static/img/electrum.png
rename to src/views/static/img/electrum.png
diff --git a/_static/img/enigma.png b/src/views/static/img/enigma.png
similarity index 100%
rename from _static/img/enigma.png
rename to src/views/static/img/enigma.png
diff --git a/_static/img/eos.png b/src/views/static/img/eos.png
similarity index 100%
rename from _static/img/eos.png
rename to src/views/static/img/eos.png
diff --git a/_static/img/etherchain.png b/src/views/static/img/etherchain.png
similarity index 100%
rename from _static/img/etherchain.png
rename to src/views/static/img/etherchain.png
diff --git a/_static/img/etherdelta.png b/src/views/static/img/etherdelta.png
similarity index 100%
rename from _static/img/etherdelta.png
rename to src/views/static/img/etherdelta.png
diff --git a/_static/img/ethereum.png b/src/views/static/img/ethereum.png
similarity index 100%
rename from _static/img/ethereum.png
rename to src/views/static/img/ethereum.png
diff --git a/_static/img/etheroll.png b/src/views/static/img/etheroll.png
similarity index 100%
rename from _static/img/etheroll.png
rename to src/views/static/img/etheroll.png
diff --git a/_static/logo/logotype-readme.png b/src/views/static/img/etherscamdb.png
similarity index 100%
rename from _static/logo/logotype-readme.png
rename to src/views/static/img/etherscamdb.png
diff --git a/src/views/static/img/etherscamdb.svg b/src/views/static/img/etherscamdb.svg
new file mode 100644
index 00000000..fef815f5
--- /dev/null
+++ b/src/views/static/img/etherscamdb.svg
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/_static/img/etherscan.png b/src/views/static/img/etherscan.png
similarity index 100%
rename from _static/img/etherscan.png
rename to src/views/static/img/etherscan.png
diff --git a/_static/img/exchange.png b/src/views/static/img/exchange.png
similarity index 100%
rename from _static/img/exchange.png
rename to src/views/static/img/exchange.png
diff --git a/_static/img/fantom.png b/src/views/static/img/fantom.png
similarity index 100%
rename from _static/img/fantom.png
rename to src/views/static/img/fantom.png
diff --git a/src/views/static/img/favicon.png b/src/views/static/img/favicon.png
new file mode 100644
index 00000000..f2f20daa
Binary files /dev/null and b/src/views/static/img/favicon.png differ
diff --git a/_static/img/fintrux.png b/src/views/static/img/fintrux.png
similarity index 100%
rename from _static/img/fintrux.png
rename to src/views/static/img/fintrux.png
diff --git a/_static/img/forkdelta.png b/src/views/static/img/forkdelta.png
similarity index 100%
rename from _static/img/forkdelta.png
rename to src/views/static/img/forkdelta.png
diff --git a/_static/img/golem.png b/src/views/static/img/golem.png
similarity index 100%
rename from _static/img/golem.png
rename to src/views/static/img/golem.png
diff --git a/_static/img/gonetwork.png b/src/views/static/img/gonetwork.png
similarity index 100%
rename from _static/img/gonetwork.png
rename to src/views/static/img/gonetwork.png
diff --git a/_static/img/hederahashgraph.png b/src/views/static/img/hederahashgraph.png
similarity index 100%
rename from _static/img/hederahashgraph.png
rename to src/views/static/img/hederahashgraph.png
diff --git a/_static/img/helbiz.png b/src/views/static/img/helbiz.png
similarity index 100%
rename from _static/img/helbiz.png
rename to src/views/static/img/helbiz.png
diff --git a/_static/img/hero.png b/src/views/static/img/hero.png
similarity index 100%
rename from _static/img/hero.png
rename to src/views/static/img/hero.png
diff --git a/_static/img/hitbtc.png b/src/views/static/img/hitbtc.png
similarity index 100%
rename from _static/img/hitbtc.png
rename to src/views/static/img/hitbtc.png
diff --git a/_static/img/icon.png b/src/views/static/img/icon.png
similarity index 100%
rename from _static/img/icon.png
rename to src/views/static/img/icon.png
diff --git a/_static/img/idex.png b/src/views/static/img/idex.png
similarity index 100%
rename from _static/img/idex.png
rename to src/views/static/img/idex.png
diff --git a/_static/img/indorse.png b/src/views/static/img/indorse.png
similarity index 100%
rename from _static/img/indorse.png
rename to src/views/static/img/indorse.png
diff --git a/_static/img/kickico.png b/src/views/static/img/kickico.png
similarity index 100%
rename from _static/img/kickico.png
rename to src/views/static/img/kickico.png
diff --git a/_static/img/kin.png b/src/views/static/img/kin.png
similarity index 100%
rename from _static/img/kin.png
rename to src/views/static/img/kin.png
diff --git a/_static/img/kraken.png b/src/views/static/img/kraken.png
similarity index 100%
rename from _static/img/kraken.png
rename to src/views/static/img/kraken.png
diff --git a/_static/img/kucoin.png b/src/views/static/img/kucoin.png
similarity index 100%
rename from _static/img/kucoin.png
rename to src/views/static/img/kucoin.png
diff --git a/_static/img/ledgerwallet.png b/src/views/static/img/ledgerwallet.png
similarity index 100%
rename from _static/img/ledgerwallet.png
rename to src/views/static/img/ledgerwallet.png
diff --git a/_static/img/litecoin.png b/src/views/static/img/litecoin.png
similarity index 100%
rename from _static/img/litecoin.png
rename to src/views/static/img/litecoin.png
diff --git a/_static/img/luno.png b/src/views/static/img/luno.png
similarity index 100%
rename from _static/img/luno.png
rename to src/views/static/img/luno.png
diff --git a/_static/img/metamask.png b/src/views/static/img/metamask.png
similarity index 100%
rename from _static/img/metamask.png
rename to src/views/static/img/metamask.png
diff --git a/_static/img/monero.png b/src/views/static/img/monero.png
similarity index 100%
rename from _static/img/monero.png
rename to src/views/static/img/monero.png
diff --git a/_static/img/monetha.png b/src/views/static/img/monetha.png
similarity index 100%
rename from _static/img/monetha.png
rename to src/views/static/img/monetha.png
diff --git a/_static/img/mycrypto.png b/src/views/static/img/mycrypto.png
similarity index 100%
rename from _static/img/mycrypto.png
rename to src/views/static/img/mycrypto.png
diff --git a/_static/img/myetherwallet.png b/src/views/static/img/myetherwallet.png
similarity index 100%
rename from _static/img/myetherwallet.png
rename to src/views/static/img/myetherwallet.png
diff --git a/_static/img/mymonero.png b/src/views/static/img/mymonero.png
similarity index 100%
rename from _static/img/mymonero.png
rename to src/views/static/img/mymonero.png
diff --git a/_static/img/neo.png b/src/views/static/img/neo.png
similarity index 100%
rename from _static/img/neo.png
rename to src/views/static/img/neo.png
diff --git a/_static/img/numerai.png b/src/views/static/img/numerai.png
similarity index 100%
rename from _static/img/numerai.png
rename to src/views/static/img/numerai.png
diff --git a/_static/img/odyssey.png b/src/views/static/img/odyssey.png
similarity index 100%
rename from _static/img/odyssey.png
rename to src/views/static/img/odyssey.png
diff --git a/_static/img/omisego.png b/src/views/static/img/omisego.png
similarity index 100%
rename from _static/img/omisego.png
rename to src/views/static/img/omisego.png
diff --git a/_static/img/orchid.png b/src/views/static/img/orchid.png
similarity index 100%
rename from _static/img/orchid.png
rename to src/views/static/img/orchid.png
diff --git a/_static/img/origin.png b/src/views/static/img/origin.png
similarity index 100%
rename from _static/img/origin.png
rename to src/views/static/img/origin.png
diff --git a/_static/img/poloniex.png b/src/views/static/img/poloniex.png
similarity index 100%
rename from _static/img/poloniex.png
rename to src/views/static/img/poloniex.png
diff --git a/_static/img/powered-by-mycrypto.png b/src/views/static/img/powered-by-mycrypto.png
similarity index 100%
rename from _static/img/powered-by-mycrypto.png
rename to src/views/static/img/powered-by-mycrypto.png
diff --git a/_static/img/quarkchain.png b/src/views/static/img/quarkchain.png
similarity index 100%
rename from _static/img/quarkchain.png
rename to src/views/static/img/quarkchain.png
diff --git a/_static/img/refereum.png b/src/views/static/img/refereum.png
similarity index 100%
rename from _static/img/refereum.png
rename to src/views/static/img/refereum.png
diff --git a/_static/img/ripple.png b/src/views/static/img/ripple.png
similarity index 100%
rename from _static/img/ripple.png
rename to src/views/static/img/ripple.png
diff --git a/_static/img/shapeshift.png b/src/views/static/img/shapeshift.png
similarity index 100%
rename from _static/img/shapeshift.png
rename to src/views/static/img/shapeshift.png
diff --git a/_static/img/sparkster.png b/src/views/static/img/sparkster.png
similarity index 100%
rename from _static/img/sparkster.png
rename to src/views/static/img/sparkster.png
diff --git a/_static/img/starbase.png b/src/views/static/img/starbase.png
similarity index 100%
rename from _static/img/starbase.png
rename to src/views/static/img/starbase.png
diff --git a/_static/img/status.png b/src/views/static/img/status.png
similarity index 100%
rename from _static/img/status.png
rename to src/views/static/img/status.png
diff --git a/_static/img/stellar.png b/src/views/static/img/stellar.png
similarity index 100%
rename from _static/img/stellar.png
rename to src/views/static/img/stellar.png
diff --git a/_static/img/substratum.png b/src/views/static/img/substratum.png
similarity index 100%
rename from _static/img/substratum.png
rename to src/views/static/img/substratum.png
diff --git a/_static/img/switcheo.png b/src/views/static/img/switcheo.png
similarity index 100%
rename from _static/img/switcheo.png
rename to src/views/static/img/switcheo.png
diff --git a/_static/img/telegram.png b/src/views/static/img/telegram.png
similarity index 100%
rename from _static/img/telegram.png
rename to src/views/static/img/telegram.png
diff --git a/_static/img/tenx.png b/src/views/static/img/tenx.png
similarity index 100%
rename from _static/img/tenx.png
rename to src/views/static/img/tenx.png
diff --git a/_static/img/texacon.png b/src/views/static/img/texacon.png
similarity index 100%
rename from _static/img/texacon.png
rename to src/views/static/img/texacon.png
diff --git a/_static/img/tron.png b/src/views/static/img/tron.png
similarity index 100%
rename from _static/img/tron.png
rename to src/views/static/img/tron.png
diff --git a/_static/img/trust-trading.png b/src/views/static/img/trust-trading.png
similarity index 100%
rename from _static/img/trust-trading.png
rename to src/views/static/img/trust-trading.png
diff --git a/_static/img/ubiq.png b/src/views/static/img/ubiq.png
similarity index 100%
rename from _static/img/ubiq.png
rename to src/views/static/img/ubiq.png
diff --git a/_static/img/unocoin.png b/src/views/static/img/unocoin.png
similarity index 100%
rename from _static/img/unocoin.png
rename to src/views/static/img/unocoin.png
diff --git a/_static/img/vechain.png b/src/views/static/img/vechain.png
similarity index 100%
rename from _static/img/vechain.png
rename to src/views/static/img/vechain.png
diff --git a/_static/img/yobit.png b/src/views/static/img/yobit.png
similarity index 100%
rename from _static/img/yobit.png
rename to src/views/static/img/yobit.png
diff --git a/_static/img/zcash.png b/src/views/static/img/zcash.png
similarity index 100%
rename from _static/img/zcash.png
rename to src/views/static/img/zcash.png
diff --git a/_static/img/zeex.png b/src/views/static/img/zeex.png
similarity index 100%
rename from _static/img/zeex.png
rename to src/views/static/img/zeex.png
diff --git a/_static/js/address.js b/src/views/static/js/address.js
similarity index 100%
rename from _static/js/address.js
rename to src/views/static/js/address.js
diff --git a/_static/js/api.js b/src/views/static/js/api.js
similarity index 57%
rename from _static/js/api.js
rename to src/views/static/js/api.js
index ba0c0e27..95f46a14 100644
--- a/_static/js/api.js
+++ b/src/views/static/js/api.js
@@ -1,60 +1,60 @@
window.addEventListener("load", function() {
- $.get("/api/check/0xDaa29859836D97C810c7F9D350D4A1B3E8CafC9a",function(data) {
- data = JSON.stringify(JSON.parse(data), null, 2);
+ $.getJSON("/api/check/0xDaa29859836D97C810c7F9D350D4A1B3E8CafC9a",function(data) {
+ data = JSON.stringify(data, null, 2);
$("#check_loader").remove();
$("#check_segment").css("overflow","scroll");
$(".check_response").html(data);
});
- $.get("/api/scams/",function(data) {
- data = JSON.stringify(JSON.parse(data), null, 2);
+ $.getJSON("/api/scams/",function(data) {
+ data = JSON.stringify(data, null, 2);
$("#scams_loader").remove();
$("#scams_segment").css("overflow","scroll");
$(".scams_response").html(data);
});
- $.get("/api/addresses/",function(data) {
- data = JSON.stringify(JSON.parse(data), null, 2);
+ $.getJSON("/api/addresses/",function(data) {
+ data = JSON.stringify(data, null, 2);
$("#addresses_loader").remove();
$("#addresses_segment").css("overflow","scroll");
$(".addresses_response").html(data);
});
- $.get("/api/ips/",function(data) {
- data = JSON.stringify(JSON.parse(data), null, 2);
+ $.getJSON("/api/ips/",function(data) {
+ data = JSON.stringify(data, null, 2);
$("#ips_loader").remove();
$("#ips_segment").css("overflow","scroll");
$(".ips_response").html(data);
});
- $.get("/api/verified/",function(data) {
- data = JSON.stringify(JSON.parse(data), null, 2);
+ $.getJSON("/api/verified/",function(data) {
+ data = JSON.stringify(data, null, 2);
$("#verified_loader").remove();
$("#verified_segment").css("overflow","scroll");
$(".verified_response").html(data);
});
- $.get("/api/blacklist/",function(data) {
- data = JSON.stringify(JSON.parse(data), null, 2);
+ $.getJSON("/api/blacklist/",function(data) {
+ data = JSON.stringify(data, null, 2);
$("#blacklist_loader").remove();
$("#blacklist_segment").css("overflow","scroll");
$(".blacklist_response").html(data);
});
- $.get("/api/whitelist/",function(data) {
- data = JSON.stringify(JSON.parse(data), null, 2);
+ $.getJSON("/api/whitelist/",function(data) {
+ data = JSON.stringify(data, null, 2);
$("#whitelist_loader").remove();
$("#whitelist_segment").css("overflow","scroll");
$(".whitelist_response").html(data);
});
- $.get("/api/inactives/",function(data) {
- data = JSON.stringify(JSON.parse(data), null, 2);
+ $.getJSON("/api/inactives/",function(data) {
+ data = JSON.stringify(data, null, 2);
$("#inactives_loader").remove();
$("#inactives_segment").css("overflow","scroll");
$(".inactives_response").html(data);
});
- $.get("/api/actives/",function(data) {
- data = JSON.stringify(JSON.parse(data), null, 2);
+ $.getJSON("/api/actives/",function(data) {
+ data = JSON.stringify(data, null, 2);
$("#actives_loader").remove();
$("#actives_segment").css("overflow","scroll");
$(".actives_response").html(data);
});
- $.get("/api/abusereport/changellyli.com",function(data) {
- data = JSON.stringify(JSON.parse(data), null, 2);
+ $.getJSON("/api/abusereport/changellyli.com",function(data) {
+ data = JSON.stringify(data, null, 2);
$("#abusereport_loader").remove();
$("#abusereport_segment").css("overflow","scroll");
$(".abusereport_response").html(data);
diff --git a/_static/js/neutraldomain.js b/src/views/static/js/domain.js
similarity index 100%
rename from _static/js/neutraldomain.js
rename to src/views/static/js/domain.js
diff --git a/_static/js/home.js b/src/views/static/js/home.js
similarity index 100%
rename from _static/js/home.js
rename to src/views/static/js/home.js
diff --git a/_static/js/ip.js b/src/views/static/js/ip.js
similarity index 91%
rename from _static/js/ip.js
rename to src/views/static/js/ip.js
index 8d395c60..26f171a6 100644
--- a/_static/js/ip.js
+++ b/src/views/static/js/ip.js
@@ -1,5 +1,5 @@
window.addEventListener("load", function() {
- $.getJSON("https://freegeoip.net/json/" + $("h1").html(), function(data) {
+ $.getJSON("https://freegeoip.app/json/" + $("h1").html(), function(data) {
flag = '
';
$("#location").html('
' + flag + data.country_name + ' ');
$("#map").html('
');
diff --git a/_static/js/redirect.js b/src/views/static/js/redirect.js
similarity index 100%
rename from _static/js/redirect.js
rename to src/views/static/js/redirect.js
diff --git a/_static/js/report.js b/src/views/static/js/report.js
similarity index 100%
rename from _static/js/report.js
rename to src/views/static/js/report.js
diff --git a/_static/js/reportaddress.js b/src/views/static/js/reportaddress.js
similarity index 100%
rename from _static/js/reportaddress.js
rename to src/views/static/js/reportaddress.js
diff --git a/_static/js/reportdomain.js b/src/views/static/js/reportdomain.js
similarity index 100%
rename from _static/js/reportdomain.js
rename to src/views/static/js/reportdomain.js
diff --git a/_static/js/scams.js b/src/views/static/js/scams.js
similarity index 100%
rename from _static/js/scams.js
rename to src/views/static/js/scams.js
diff --git a/_static/js/search.js b/src/views/static/js/search.js
similarity index 100%
rename from _static/js/search.js
rename to src/views/static/js/search.js
diff --git a/src/views/static/logo/favicon.png b/src/views/static/logo/favicon.png
new file mode 100644
index 00000000..f2f20daa
Binary files /dev/null and b/src/views/static/logo/favicon.png differ
diff --git a/src/views/static/logo/favicon.svg b/src/views/static/logo/favicon.svg
new file mode 100644
index 00000000..9634c54d
--- /dev/null
+++ b/src/views/static/logo/favicon.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/static/logo/logotype-a.svg b/src/views/static/logo/logotype-a.svg
new file mode 100644
index 00000000..fef815f5
--- /dev/null
+++ b/src/views/static/logo/logotype-a.svg
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/static/logo/logotype-b.svg b/src/views/static/logo/logotype-b.svg
new file mode 100644
index 00000000..d80ba583
--- /dev/null
+++ b/src/views/static/logo/logotype-b.svg
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/static/logo/logotype-readme.png b/src/views/static/logo/logotype-readme.png
new file mode 100644
index 00000000..a5d607a4
Binary files /dev/null and b/src/views/static/logo/logotype-readme.png differ
diff --git a/tests/validate_data.js b/tests/validate_data.js
index eb28a7a2..07890882 100644
--- a/tests/validate_data.js
+++ b/tests/validate_data.js
@@ -1,34 +1,27 @@
const assert = require('assert');
const yaml = require('js-yaml');
const fs = require('fs');
+
describe('YAML Validator', function() {
describe('scams.yaml', function() {
it('should contain valid YAML', function(){
assert.doesNotThrow(() => yaml.safeLoad(fs.readFileSync('./_data/scams.yaml', 'utf8')));
});
- it('every entry should have an ID', function() {
- assert.deepEqual(yaml.safeLoad(fs.readFileSync('./_data/scams.yaml', 'utf8')).filter(entry => !('id' in entry)),[]);
- });
- it('every entry should have a name', function() {
- assert.deepEqual(yaml.safeLoad(fs.readFileSync('./_data/scams.yaml', 'utf8')).filter(entry => !('name' in entry)),[]);
- });
it('every entry should have a url', function() {
assert.deepEqual(yaml.safeLoad(fs.readFileSync('./_data/scams.yaml', 'utf8')).filter(entry => !('url' in entry)),[]);
});
- it('every ID should be numeric', function() {
- assert.deepEqual(yaml.safeLoad(fs.readFileSync('./_data/scams.yaml', 'utf8')).filter(entry => isNaN(parseInt(entry.id))),[]);
- });
it('every url should specify its protocol (http:// or https:// or mailto:)', function() {
assert.deepEqual(yaml.safeLoad(fs.readFileSync('./_data/scams.yaml', 'utf8')).filter(entry => !entry.url.startsWith('http://') && !entry.url.startsWith('https://') && !entry.url.startsWith('mailto:')),[]);
});
+ it('every entry should have valid keys (url/category/subcategory/description/addresses)', function() {
+ /* BEFORE migrate.js */ assert.deepEqual(yaml.safeLoad(fs.readFileSync('./_data/scams.yaml', 'utf8')).filter(entry => Object.keys(entry).some(key => !['null','id','name','coin','url','category','subcategory','description','addresses'].includes(key))),[]);
+ /* AFTER migrate.js */ /* assert.deepEqual(yaml.safeLoad(fs.readFileSync('./_data/scams.yaml', 'utf8')).filter(entry => Object.keys(entry).some(key => !['coin','url','category','subcategory','description','addresses'].includes(key))),[]); */
+ });
});
describe('legit_urls.yaml', function() {
it('should contain valid YAML', function(){
assert.doesNotThrow(() => yaml.safeLoad(fs.readFileSync('./_data/legit_urls.yaml', 'utf8')));
});
- it('every entry should have an ID', function() {
- assert.deepEqual(yaml.safeLoad(fs.readFileSync('./_data/legit_urls.yaml', 'utf8')).filter(entry => !('id' in entry)),[]);
- });
it('every entry should have a name', function() {
assert.deepEqual(yaml.safeLoad(fs.readFileSync('./_data/legit_urls.yaml', 'utf8')).filter(entry => !('name' in entry)),[]);
});
@@ -49,9 +42,4 @@ describe('JSON Validator', function() {
assert.doesNotThrow(() => JSON.parse(fs.readFileSync('./_data/twitter.json', 'utf8')));
});
});
- describe('metamaskImports.json', function() {
- it('should contain valid JSON', function(){
- assert.doesNotThrow(() => JSON.parse(fs.readFileSync('./_data/metamaskImports.json', 'utf8')));
- });
- });
});
\ No newline at end of file
diff --git a/update.js b/update.js
deleted file mode 100644
index 17cbe350..00000000
--- a/update.js
+++ /dev/null
@@ -1,210 +0,0 @@
-process.env.UV_THREADPOOL_SIZE = 128;
-const debug = require('debug')('update');
-const dns = require('dns');
-const url = require('url');
-const yaml = require('js-yaml');
-const fs = require('fs');
-const request = require("request");
-const shuffle = require('shuffle-array');
-const config = require('./config');
-
-let scams = yaml.safeLoad(fs.readFileSync('_data/scams.yaml'));
-let urlscan_timeout = 0;
-let scams_checked = 0;
-let requests_pending = 0;
-let new_cache = {
- 'scams': [],
- 'legiturls': [],
- 'blacklist': [],
- 'addresses': {},
- 'whitelistaddresses': {},
- 'ips': {},
- 'whitelist': [],
- 'inactives': [],
- 'actives': [],
- 'updated': (new Date()).getTime()
-};
-
-let blDnsLookup = true;
-
-if (!fs.existsSync('_cache')) {
- fs.mkdirSync('_cache');
-}
-
-yaml.safeLoad(fs.readFileSync('_data/legit_urls.yaml')).sort(function(a, b) {
- return a.name - b.name;
-}).forEach(function(legit_url) {
- new_cache.legiturls.push(legit_url);
-
- new_cache.whitelist.push(url.parse(legit_url.url).hostname.replace("www.", ""));
- new_cache.whitelist.push('www.' + url.parse(legit_url.url).hostname.replace("www.", ""));
- if ('addresses' in legit_url) { // (if 'addresses' exists in legit_urls)
- legit_url.addresses.forEach(function(whitelistaddress) {
- if (!(whitelistaddress.toLowerCase() in new_cache.whitelistaddresses)) {
- new_cache.whitelistaddresses[whitelistaddress.toLowerCase()] = [];
- }
- var currwhitelistindex = whitelistaddress.toLowerCase();
- new_cache.whitelistaddresses[currwhitelistindex] = legit_url;
- for(var i = 0 ; i < new_cache.whitelistaddresses[currwhitelistindex].addresses.length; i++){
- new_cache.whitelistaddresses[currwhitelistindex].addresses[i] = new_cache.whitelistaddresses[currwhitelistindex].addresses[i].toLowerCase();
- }
- });
- }
-});
-setInterval(function() {
- debug(scams_checked + '/' + scams.length + ' (' + requests_pending + ' requests pending)');
-}, 1000);
-
-if('perform_dns_lookup' in config && config.perform_dns_lookup === false) {
- blDnsLookup = false;
- console.log("Not performing DNS lookups due to configuration.\r\nChange \"perform_dns_lookup\" config to true");
-}
-
-scams.forEach(function(scam, index) {
- if ('url' in scam) {
- if (!scam.url.includes('http://') && !scam.url.includes('https://')) {
- debug('Warning! Entry %s doesnt have the url protocol (http or https) specified. Please update!',scam.id);
- scam.url = 'http://' + scam.url;
- }
- if (scam.addresses != null) {
- scam.addresses.forEach(function(address, index) {
- //debug("Casting " + scam.addresses[index] + " as " + scam.addresses[index].toLowerCase())
- scam.addresses[index] = scam.addresses[index].toLowerCase();
- })
- }
- var scam_details = new_cache.scams[new_cache.scams.push(scam) - 1];
- new_cache.blacklist.push(url.parse(scam.url).hostname.replace("www.", ""));
- new_cache.blacklist.push('www.' + url.parse(scam.url).hostname.replace("www.", ""));
-
- // Check to see if we should hit the domain or not
- if(blDnsLookup === false) {
- scam_details.status = "NotChecked";
- scam_details.ip = "0.0.0.0";
-
- if(index == (scams.length-1)) {
- var done_interval = setInterval(function() {
- if (requests_pending == 0) {
- clearInterval(done_interval);
- Object.keys(new_cache.ips).forEach(function(ip) {
- new_cache.blacklist.push(ip);
- });
- fs.writeFileSync("_cache/cache.json", JSON.stringify(new_cache));
- debug("Done");
- process.exit();
- }
- }, 500);
- }
-
- } else {
- dns.lookup(url.parse(scam.url).hostname, (err, address, family) => {
- if (!err) {
- scam_details.ip = address;
- }
- dns.resolveNs(url.parse(scam.url).hostname, (err, addresses) => {
- if (!err) {
- scam_details.nameservers = addresses;
- }
- requests_pending++;
- var r = request(scam.url, {timeout: 5*60*1000}, function(e, response, body) {
- requests_pending--;
- if (e || !([200, 301, 302].includes(response.statusCode))) {
- scam_details.status = 'Offline';
- new_cache.inactives.push(scam);
- } else if (r.uri.href.indexOf('cgi-sys/suspendedpage.cgi') !== -1) {
- scam_details.status = 'Suspended';
- new_cache.inactives.push(scam);
- } else {
- if ('subcategory' in scam && scam.subcategory == 'MyEtherWallet') {
- requests_pending++;
- request('http://' + url.parse(scam.url).hostname.replace("www.", "") + '/js/etherwallet-static.min.js', {timeout: 5*60*1000}, function(e, response, body) {
- requests_pending--;
- if (!e && response.statusCode == 200) {
- scam_details.status = 'Active';
- new_cache.actives.push(scam);
- } else {
- scam_details.status = 'Inactive';
- new_cache.inactives.push(scam);
- }
- });
- } else if ('subcategory' in scam && scam.subcategory == 'MyCrypto') {
- requests_pending++;
- request('http://' + url.parse(scam.url).hostname.replace("www.", "") + '/js/mycrypto-static.min.js', {timeout: 5*60*1000}, function(e, response, body) {
- requests_pending--;
- if (!e && response.statusCode == 200) {
- scam_details.status = 'Active';
- new_cache.actives.push(scam);
- } else {
- scam_details.status = 'Inactive';
- new_cache.inactives.push(scam);
- }
- });
- } else if (body == '') {
- scam_details.status = 'Inactive';
- new_cache.inactives.push(scam);
- } else {
- scam_details.status = 'Active';
- new_cache.actives.push(scam);
- }
- }
- /*if(scam_details.status != 'Offline' && 'Urlscan_API_Key' in config) {
- urlscan_timeout++;
- setTimeout(function() {
- request('https://urlscan.io/api/v1/scan/', { method: 'POST', json: { 'url': scam.url, 'public': 'off' }, headers: { 'API-Key': config.Urlscan_API_Key }}, function(err,response,body) {
- if(err || response.statusCode != 200) {
- debug(err);
- debug('Status code: ' + response.statusCode);
- } else if(body.message != 'Submission successful' || !('api' in body)) {
- debug(body.message);
- } else {
- setTimeout(function() {
- request(body.api, { method: 'POST', json: { 'url': scam.api, 'public': 'off' }, headers: { 'API-Key': config.Urlscan_API_Key }}, function(err,response,body) {
- if(err || response.statusCode != 200) {
- debug(err);
- debug('Status code: ' + response.statusCode);
- } else {
- debug(body);
- }
- });
- }, 2000);
- }
- });
- }, urlscan_timeout * 8000);
- }*/
- if ('ip' in scam_details) {
- if (!(scam_details.ip in new_cache.ips)) {
- new_cache.ips[scam_details.ip] = [];
- }
- new_cache.ips[scam_details.ip] = scam_details;
- }
- if ('addresses' in scam_details) {
- scam_details.addresses.forEach(function(address) {
- if (!(address.toLowerCase() in new_cache.addresses)) {
- new_cache.addresses[address.toLowerCase()] = [];
- }
- //debug(new_cache.addresses);
- new_cache.addresses[address.toLowerCase()] = scam_details;
- });
- }
- scams_checked++;
- if(index == (scams.length-1)) {
- var done_interval = setInterval(function() {
- if (requests_pending == 0) {
- clearInterval(done_interval);
- Object.keys(new_cache.ips).forEach(function(ip) {
- new_cache.blacklist.push(ip);
- });
- fs.writeFileSync("_cache/cache.json", JSON.stringify(new_cache));
- debug("Done");
- process.exit();
- }
- }, 500);
- }
- });
- });
- });
- }
- } else {
- debug("Fatal error: Scam without URL found (%s)",scam.id);
- process.exit();
- }
-});