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

-
Return to homepage
\ 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
- -
- - - 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?

-
-
Use cold storage - Buy a Ledger Nano S or a Trezor
-
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?

-
-
Report scams to us here
-
Report scams to Google: https://safebrowsing.google.com/safebrowsing/report_phish/?hl=en
-
Send abuse reports to the registrar, hosting and ssl provider of the scam domains
-
Install the EtherSecurityLookup extension on your browser
-
-

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 @@ - - -

EtherScamDB logo type-a

-
-
-

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. -
- -
- 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.name }}

-
-{{ neutral.notification }} -{{ neutral.url }}
-{{ neutral.googlethreat }} -{{ neutral.virustotal }} -{{ neutral.phishtank }} -{{ neutral.urlscan }}
-{{ neutral.urlscreenshot }} - -
- -{{ page.built }} - - - 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 @@ - - - -
-

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.

-
-
- -
- - \ 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?

-
-
-
-
-
- Address: -
- -
-
-
- -
-
-
-
-
-

Please specify a reason for your report

-
-
-
-
- -
-
-
- -
-
-
-

Captcha

-
-
-
-
-
-
-
-
-
-
-
Sending
-
-
-
-

Thanks for your report

-

Your report has been sent. In the meanwhile, you can learn how to protect yourself and others in the future:

-
-
-
-

- Read Protecting Yourself and Your Funds by MyCrypto

-
-
- -
-
- -
- -
- -
-
- -
-
- -
-
-
- - - 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?

-
-
-
-
-
- Domain: -
- -
-
-
- -
-
-
-
-
-

Please specify a reason for your report

-
-
-
-
- -
-
-
- -
-
-
-

Captcha

-
-
-
-
-
-
-
-
-
-
-
Sending
-
-
-
-

Thanks for your report

-

Your report has been sent. In the meanwhile, you can learn how to protect yourself and others in the future:

-
-
-
-

- Read Protecting Yourself and Your Funds by MyCrypto

-
-
- -
-
- -
- -
- -
-
- -
-
- -
-
-
- - - 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 @@ - - - -
-

{{ 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 }} - - - \ 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 @@ - - - -
-

{{ 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.tip }} -
-
-
- -{{ scam.urlscreenshot }} - -

- -
- -{{ page.built }} - - - 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

- - - - - - - - - - {{ scams.table }} - -
CategorySubcategoryStatusTitleInfo
- -{{ 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.name }}

-
-{{ verified.notification }} -{{ verified.url }} -{{ verified.description }}
-{{ verified.googlethreat }} -{{ verified.virustotal }} -{{ verified.phishtank }} -{{ verified.urlscan }}
-{{ verified.addresses }}
-{{ verified.urlscreenshot }} - -
- -{{ page.built }} - - - 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 += '
' + address + '
'; - }); - 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 += ''; - 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'; - 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 }}", "
Screenshot of website
"); - 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 }}", "
Screenshot of website
"); - 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 }}", "
Screenshot of website
"); - 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 += ''; - 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'; - 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 %> +
    + <% 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 %> + + +
    +
    +

    Add scam

    +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    +
    Add
    +
    Reset
    +
    +
    +
    + <% 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 %> + + + + + 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 { %> +
    +
    + +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    + +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    + API Keys +
    +
    + +
    +
    +
    +
    + Timers +
    +
    + +
    +
    +
    +
    + Advanced settings +
    +
    + +
    +
    +
    +
    +
    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 %> +
    + + <% if(typeof abuseReport !== "undefined") { %> + + <% } %> +
    +

    <%= domain %>

    +
    + <% if(typeof abuseReport !== "undefined") { %> + + <% } %> + Archive + + Improve + + +
    +
    +<% 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 %> + + + + + + 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?

    +
    +
    Use cold storage - Buy a Ledger Nano S or a Trezor
    +
    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?

    +
    +
    Report scams to us here
    + +
    Send abuse reports to the registrar, hosting and ssl provider of the scam domains
    +
    Install the EtherSecurityLookup extension on your browser
    +
    +

    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. +
    + +
    +
    + <% 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) { %> +
    + +
    +
    + Warning +
    +

    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.

    +
    +
    +
    + +
    +
    + <% 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 %> +

    Report

    @@ -244,7 +259,11 @@

    What malicious domain would you like to report?

    Domain:
    + <% if(typeof domain !== "undefined") { %> + + <% } else { %> + <% } %>
    @@ -267,7 +286,11 @@

    What malicious address would you like to report?

    Address:
    + <% if(typeof address !== "undefined") { %> + + <% } else { %> + <% } %>
    + <% 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") { %> + + <% } else { %> + + <% } %> + <% if(sorting == "subcategory") { %> + + <% } else { %> + + <% } %> + <% if(sorting == "status") { %> + + <% } else { %> + + <% } %> + <% if(sorting == "name") { %> + + <% } else { %> + + <% } %> + + + + <% scams.forEach(scam => { %> + + <% if("category" in scam && scam.category) { %> + <% if(scam.category == "Phishing") { %> + + <% } else if(scam.category == "Scamming") { %> + + <% } else if(scam.category == "Fake ICO") { %> + + <% } else { %> + + <% } %> + <% } else { %> + + <% } %> + + <% if("subcategory" in scam && scam.subcategory) { %> + <% if(scam.category == "Wallets") { %> + + <% } else { %> + + <% } %> + <% } else { %> + + <% } %> + + <% if("status" in scam && scam.status) { %> + <% if(scam.status == "Active") { %> + + <% } else if(scam.status == "Inactive") { %> + + <% } else if(scam.status == "Suspended") { %> + + <% } else if(scam.status == "Offline") { %> + + <% } %> + <% } else { %> + + <% } %> + + <% if(scam.getHostname().length > 40) { %> + + <% } else { %> + + <% } %> + + + + <% }); %> + +
    CategoryCategorySubcategorySubcategoryStatusStatusNameNameInfo
    Phishing Scamming Fake ICO <%= scam.category %> None Wallets <%= scam.subcategory %> None Active Inactive Suspended OfflineUnknown<%= scam.getHostname().substring(0, 40) %>...<%= 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(); - } -});