diff --git a/.gitignore b/.gitignore index c8bfd1acb..e08caae12 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +/.vscode __pycache__/ defs/coins/tools/coins.json defs/coins/tools/coindefs.json diff --git a/.travis.yml b/.travis.yml index 601ad8809..486451106 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,16 +9,17 @@ cache: - $HOME/.cache/pip python: - - "3.5" + - "3.6" install: - - pip install ed25519 Pillow demjson - - pip install --no-deps trezor + - pip install demjson + - pip install -r tools/requirements.txt script: - jsonlint defs/*.json - jsonlint defs/*/*.json - - python tools/build_coins.py --defs + - python tools/cointool.py check + - python tools/support.py check --ignore-tokens --ignore-missing notifications: webhooks: diff --git a/defs/coins/bcash.json b/defs/bitcoin/bcash.json similarity index 100% rename from defs/coins/bcash.json rename to defs/bitcoin/bcash.json diff --git a/defs/coins/bcash.png b/defs/bitcoin/bcash.png similarity index 100% rename from defs/coins/bcash.png rename to defs/bitcoin/bcash.png diff --git a/defs/coins/bcash_testnet.json b/defs/bitcoin/bcash_testnet.json similarity index 100% rename from defs/coins/bcash_testnet.json rename to defs/bitcoin/bcash_testnet.json diff --git a/defs/coins/bcash_testnet.png b/defs/bitcoin/bcash_testnet.png similarity index 100% rename from defs/coins/bcash_testnet.png rename to defs/bitcoin/bcash_testnet.png diff --git a/defs/coins/bgold.json b/defs/bitcoin/bgold.json similarity index 100% rename from defs/coins/bgold.json rename to defs/bitcoin/bgold.json diff --git a/defs/coins/bgold.png b/defs/bitcoin/bgold.png similarity index 100% rename from defs/coins/bgold.png rename to defs/bitcoin/bgold.png diff --git a/defs/coins/bgold_testnet.json b/defs/bitcoin/bgold_testnet.json similarity index 100% rename from defs/coins/bgold_testnet.json rename to defs/bitcoin/bgold_testnet.json diff --git a/defs/coins/bgold_testnet.png b/defs/bitcoin/bgold_testnet.png similarity index 100% rename from defs/coins/bgold_testnet.png rename to defs/bitcoin/bgold_testnet.png diff --git a/defs/coins/bitcoin.json b/defs/bitcoin/bitcoin.json similarity index 100% rename from defs/coins/bitcoin.json rename to defs/bitcoin/bitcoin.json diff --git a/defs/coins/bitcoin.png b/defs/bitcoin/bitcoin.png similarity index 100% rename from defs/coins/bitcoin.png rename to defs/bitcoin/bitcoin.png diff --git a/defs/coins/bitcoin_testnet.json b/defs/bitcoin/bitcoin_testnet.json similarity index 100% rename from defs/coins/bitcoin_testnet.json rename to defs/bitcoin/bitcoin_testnet.json diff --git a/defs/coins/bitcoin_testnet.png b/defs/bitcoin/bitcoin_testnet.png similarity index 100% rename from defs/coins/bitcoin_testnet.png rename to defs/bitcoin/bitcoin_testnet.png diff --git a/defs/coins/bitcore.json b/defs/bitcoin/bitcore.json similarity index 100% rename from defs/coins/bitcore.json rename to defs/bitcoin/bitcore.json diff --git a/defs/coins/bitcore.png b/defs/bitcoin/bitcore.png similarity index 100% rename from defs/coins/bitcore.png rename to defs/bitcoin/bitcore.png diff --git a/defs/coins/bprivate.json b/defs/bitcoin/bprivate.json similarity index 100% rename from defs/coins/bprivate.json rename to defs/bitcoin/bprivate.json diff --git a/defs/coins/bprivate.png b/defs/bitcoin/bprivate.png similarity index 100% rename from defs/coins/bprivate.png rename to defs/bitcoin/bprivate.png diff --git a/defs/coins/crown.json b/defs/bitcoin/crown.json similarity index 100% rename from defs/coins/crown.json rename to defs/bitcoin/crown.json diff --git a/defs/coins/crown.png b/defs/bitcoin/crown.png similarity index 100% rename from defs/coins/crown.png rename to defs/bitcoin/crown.png diff --git a/defs/coins/dash.json b/defs/bitcoin/dash.json similarity index 100% rename from defs/coins/dash.json rename to defs/bitcoin/dash.json diff --git a/defs/coins/dash.png b/defs/bitcoin/dash.png similarity index 100% rename from defs/coins/dash.png rename to defs/bitcoin/dash.png diff --git a/defs/coins/dash_testnet.json b/defs/bitcoin/dash_testnet.json similarity index 100% rename from defs/coins/dash_testnet.json rename to defs/bitcoin/dash_testnet.json diff --git a/defs/coins/dash_testnet.png b/defs/bitcoin/dash_testnet.png similarity index 100% rename from defs/coins/dash_testnet.png rename to defs/bitcoin/dash_testnet.png diff --git a/defs/coins/decred.json b/defs/bitcoin/decred.json similarity index 100% rename from defs/coins/decred.json rename to defs/bitcoin/decred.json diff --git a/defs/coins/decred.png b/defs/bitcoin/decred.png similarity index 100% rename from defs/coins/decred.png rename to defs/bitcoin/decred.png diff --git a/defs/coins/decred_testnet.json b/defs/bitcoin/decred_testnet.json similarity index 100% rename from defs/coins/decred_testnet.json rename to defs/bitcoin/decred_testnet.json diff --git a/defs/coins/decred_testnet.png b/defs/bitcoin/decred_testnet.png similarity index 100% rename from defs/coins/decred_testnet.png rename to defs/bitcoin/decred_testnet.png diff --git a/defs/coins/denarius.json b/defs/bitcoin/denarius.json similarity index 100% rename from defs/coins/denarius.json rename to defs/bitcoin/denarius.json diff --git a/defs/coins/denarius.png b/defs/bitcoin/denarius.png similarity index 100% rename from defs/coins/denarius.png rename to defs/bitcoin/denarius.png diff --git a/defs/coins/digibyte.json b/defs/bitcoin/digibyte.json similarity index 100% rename from defs/coins/digibyte.json rename to defs/bitcoin/digibyte.json diff --git a/defs/coins/digibyte.png b/defs/bitcoin/digibyte.png similarity index 100% rename from defs/coins/digibyte.png rename to defs/bitcoin/digibyte.png diff --git a/defs/coins/dogecoin.json b/defs/bitcoin/dogecoin.json similarity index 100% rename from defs/coins/dogecoin.json rename to defs/bitcoin/dogecoin.json diff --git a/defs/coins/dogecoin.png b/defs/bitcoin/dogecoin.png similarity index 100% rename from defs/coins/dogecoin.png rename to defs/bitcoin/dogecoin.png diff --git a/defs/coins/feathercoin.json b/defs/bitcoin/feathercoin.json similarity index 100% rename from defs/coins/feathercoin.json rename to defs/bitcoin/feathercoin.json diff --git a/defs/coins/feathercoin.png b/defs/bitcoin/feathercoin.png similarity index 100% rename from defs/coins/feathercoin.png rename to defs/bitcoin/feathercoin.png diff --git a/defs/coins/flashcoin.json b/defs/bitcoin/flashcoin.json similarity index 100% rename from defs/coins/flashcoin.json rename to defs/bitcoin/flashcoin.json diff --git a/defs/coins/flashcoin.png b/defs/bitcoin/flashcoin.png similarity index 100% rename from defs/coins/flashcoin.png rename to defs/bitcoin/flashcoin.png diff --git a/defs/coins/fujicoin.json b/defs/bitcoin/fujicoin.json similarity index 100% rename from defs/coins/fujicoin.json rename to defs/bitcoin/fujicoin.json diff --git a/defs/coins/fujicoin.png b/defs/bitcoin/fujicoin.png similarity index 100% rename from defs/coins/fujicoin.png rename to defs/bitcoin/fujicoin.png diff --git a/defs/coins/groestlcoin.json b/defs/bitcoin/groestlcoin.json similarity index 100% rename from defs/coins/groestlcoin.json rename to defs/bitcoin/groestlcoin.json diff --git a/defs/coins/groestlcoin.png b/defs/bitcoin/groestlcoin.png similarity index 100% rename from defs/coins/groestlcoin.png rename to defs/bitcoin/groestlcoin.png diff --git a/defs/coins/groestlcoin_testnet.json b/defs/bitcoin/groestlcoin_testnet.json similarity index 100% rename from defs/coins/groestlcoin_testnet.json rename to defs/bitcoin/groestlcoin_testnet.json diff --git a/defs/coins/groestlcoin_testnet.png b/defs/bitcoin/groestlcoin_testnet.png similarity index 100% rename from defs/coins/groestlcoin_testnet.png rename to defs/bitcoin/groestlcoin_testnet.png diff --git a/defs/coins/koto.json b/defs/bitcoin/koto.json similarity index 100% rename from defs/coins/koto.json rename to defs/bitcoin/koto.json diff --git a/defs/coins/koto.png b/defs/bitcoin/koto.png similarity index 100% rename from defs/coins/koto.png rename to defs/bitcoin/koto.png diff --git a/defs/coins/litecoin.json b/defs/bitcoin/litecoin.json similarity index 100% rename from defs/coins/litecoin.json rename to defs/bitcoin/litecoin.json diff --git a/defs/coins/litecoin.png b/defs/bitcoin/litecoin.png similarity index 100% rename from defs/coins/litecoin.png rename to defs/bitcoin/litecoin.png diff --git a/defs/coins/litecoin_testnet.json b/defs/bitcoin/litecoin_testnet.json similarity index 100% rename from defs/coins/litecoin_testnet.json rename to defs/bitcoin/litecoin_testnet.json diff --git a/defs/coins/litecoin_testnet.png b/defs/bitcoin/litecoin_testnet.png similarity index 100% rename from defs/coins/litecoin_testnet.png rename to defs/bitcoin/litecoin_testnet.png diff --git a/defs/coins/monacoin.json b/defs/bitcoin/monacoin.json similarity index 100% rename from defs/coins/monacoin.json rename to defs/bitcoin/monacoin.json diff --git a/defs/coins/monacoin.png b/defs/bitcoin/monacoin.png similarity index 100% rename from defs/coins/monacoin.png rename to defs/bitcoin/monacoin.png diff --git a/defs/coins/monetaryunit.json b/defs/bitcoin/monetaryunit.json similarity index 100% rename from defs/coins/monetaryunit.json rename to defs/bitcoin/monetaryunit.json diff --git a/defs/coins/monetaryunit.png b/defs/bitcoin/monetaryunit.png similarity index 100% rename from defs/coins/monetaryunit.png rename to defs/bitcoin/monetaryunit.png diff --git a/defs/coins/myriad.json b/defs/bitcoin/myriad.json similarity index 100% rename from defs/coins/myriad.json rename to defs/bitcoin/myriad.json diff --git a/defs/coins/myriad.png b/defs/bitcoin/myriad.png similarity index 100% rename from defs/coins/myriad.png rename to defs/bitcoin/myriad.png diff --git a/defs/coins/namecoin.json b/defs/bitcoin/namecoin.json similarity index 100% rename from defs/coins/namecoin.json rename to defs/bitcoin/namecoin.json diff --git a/defs/coins/namecoin.png b/defs/bitcoin/namecoin.png similarity index 100% rename from defs/coins/namecoin.png rename to defs/bitcoin/namecoin.png diff --git a/defs/coins/pesetacoin.json b/defs/bitcoin/pesetacoin.json similarity index 100% rename from defs/coins/pesetacoin.json rename to defs/bitcoin/pesetacoin.json diff --git a/defs/coins/pesetacoin.png b/defs/bitcoin/pesetacoin.png similarity index 100% rename from defs/coins/pesetacoin.png rename to defs/bitcoin/pesetacoin.png diff --git a/defs/coins/smartcash.json b/defs/bitcoin/smartcash.json similarity index 100% rename from defs/coins/smartcash.json rename to defs/bitcoin/smartcash.json diff --git a/defs/coins/smartcash.png b/defs/bitcoin/smartcash.png similarity index 100% rename from defs/coins/smartcash.png rename to defs/bitcoin/smartcash.png diff --git a/defs/coins/smartcash_testnet.json b/defs/bitcoin/smartcash_testnet.json similarity index 100% rename from defs/coins/smartcash_testnet.json rename to defs/bitcoin/smartcash_testnet.json diff --git a/defs/coins/smartcash_testnet.png b/defs/bitcoin/smartcash_testnet.png similarity index 100% rename from defs/coins/smartcash_testnet.png rename to defs/bitcoin/smartcash_testnet.png diff --git a/defs/coins/terracoin.json b/defs/bitcoin/terracoin.json similarity index 100% rename from defs/coins/terracoin.json rename to defs/bitcoin/terracoin.json diff --git a/defs/coins/terracoin.png b/defs/bitcoin/terracoin.png similarity index 100% rename from defs/coins/terracoin.png rename to defs/bitcoin/terracoin.png diff --git a/defs/coins/vertcoin.json b/defs/bitcoin/vertcoin.json similarity index 100% rename from defs/coins/vertcoin.json rename to defs/bitcoin/vertcoin.json diff --git a/defs/coins/vertcoin.png b/defs/bitcoin/vertcoin.png similarity index 100% rename from defs/coins/vertcoin.png rename to defs/bitcoin/vertcoin.png diff --git a/defs/coins/viacoin.json b/defs/bitcoin/viacoin.json similarity index 100% rename from defs/coins/viacoin.json rename to defs/bitcoin/viacoin.json diff --git a/defs/coins/viacoin.png b/defs/bitcoin/viacoin.png similarity index 100% rename from defs/coins/viacoin.png rename to defs/bitcoin/viacoin.png diff --git a/defs/coins/zcash.json b/defs/bitcoin/zcash.json similarity index 100% rename from defs/coins/zcash.json rename to defs/bitcoin/zcash.json diff --git a/defs/coins/zcash.png b/defs/bitcoin/zcash.png similarity index 100% rename from defs/coins/zcash.png rename to defs/bitcoin/zcash.png diff --git a/defs/coins/zcash_testnet.json b/defs/bitcoin/zcash_testnet.json similarity index 100% rename from defs/coins/zcash_testnet.json rename to defs/bitcoin/zcash_testnet.json diff --git a/defs/coins/zcash_testnet.png b/defs/bitcoin/zcash_testnet.png similarity index 100% rename from defs/coins/zcash_testnet.png rename to defs/bitcoin/zcash_testnet.png diff --git a/defs/coins/zcoin.json b/defs/bitcoin/zcoin.json similarity index 100% rename from defs/coins/zcoin.json rename to defs/bitcoin/zcoin.json diff --git a/defs/coins/zcoin.png b/defs/bitcoin/zcoin.png similarity index 100% rename from defs/coins/zcoin.png rename to defs/bitcoin/zcoin.png diff --git a/defs/coins/zcoin_testnet.json b/defs/bitcoin/zcoin_testnet.json similarity index 100% rename from defs/coins/zcoin_testnet.json rename to defs/bitcoin/zcoin_testnet.json diff --git a/defs/coins/zcoin_testnet.png b/defs/bitcoin/zcoin_testnet.png similarity index 100% rename from defs/coins/zcoin_testnet.png rename to defs/bitcoin/zcoin_testnet.png diff --git a/defs/coins/zencash.json b/defs/bitcoin/zencash.json similarity index 100% rename from defs/coins/zencash.json rename to defs/bitcoin/zencash.json diff --git a/defs/coins/zencash.png b/defs/bitcoin/zencash.png similarity index 100% rename from defs/coins/zencash.png rename to defs/bitcoin/zencash.png diff --git a/defs/coins b/defs/coins new file mode 120000 index 000000000..f3c139563 --- /dev/null +++ b/defs/coins @@ -0,0 +1 @@ +bitcoin \ No newline at end of file diff --git a/defs/coins/tools/build_coins.py b/defs/coins/tools/build_coins.py deleted file mode 120000 index 78034573b..000000000 --- a/defs/coins/tools/build_coins.py +++ /dev/null @@ -1 +0,0 @@ -../../../tools/build_coins.py \ No newline at end of file diff --git a/defs/coins_details.json b/defs/coins_details.json index 012f78595..e768e856e 100644 --- a/defs/coins_details.json +++ b/defs/coins_details.json @@ -1,214 +1,11 @@ { "coins": { - "coin2:ADA": { - "links": { - "Homepage": "https://www.cardano.org" - }, - "marketcap_usd": 2331894624, - "name": "Cardano", - "shortcut": "ADA", - "t1_enabled": "no", - "t2_enabled": "soon", - "type": "coin" - }, - "coin2:EGEM": { - "links": { - "Homepage": "https://egem.io" - }, - "marketcap_usd": 0, - "name": "EtherGem", - "shortcut": "EGEM", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "coin", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, - "coin2:ELLA": { - "links": { - "Homepage": "https://ellaism.org" - }, - "marketcap_usd": 355162, - "name": "Ellaism", - "shortcut": "ELLA", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "coin", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, - "coin2:EOSC": { - "links": { - "Homepage": "https://eos-classic.io" - }, - "marketcap_usd": 0, - "name": "EOS Classic", - "shortcut": "EOSC", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "coin", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, - "coin2:ETC": { - "links": { - "Homepage": "https://ethereumclassic.github.io" - }, - "marketcap_usd": 1271054141, - "name": "Ethereum Classic", - "shortcut": "ETC", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "coin", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, - "coin2:ETH": { - "links": { - "Homepage": "https://www.ethereum.org" - }, - "marketcap_usd": 27689390191, - "name": "Ethereum", - "shortcut": "ETH", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "coin", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, - "coin2:ETSC": { - "links": { - "Homepage": "https://ethereumsocial.kr" - }, - "marketcap_usd": 0, - "name": "EthereumSocial", - "shortcut": "ETSC", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "coin", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, - "coin2:EXP": { - "links": { - "Homepage": "https://www.expanse.tech" - }, - "marketcap_usd": 4764280, - "name": "Expanse", - "shortcut": "EXP", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "coin", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, - "coin2:LSK": { - "links": { - "Homepage": "https://lisk.io/" - }, - "marketcap_usd": 997454377, - "name": "Lisk", - "shortcut": "LSK", - "t1_enabled": "no", - "t2_enabled": "yes", - "type": "coin" - }, - "coin2:RSK": { - "links": { - "Homepage": "https://www.rsk.co" - }, - "marketcap_usd": 0, - "name": "RSK", - "shortcut": "RSK", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "coin", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, - "coin2:UBQ": { - "links": { - "Homepage": "https://ubiqsmart.com" - }, - "marketcap_usd": 22429900, - "name": "Ubiq", - "shortcut": "UBQ", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "coin", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, - "coin2:XLM": { - "links": { - "Homepage": "https://www.stellar.org" - }, - "marketcap_usd": 5331912521, - "name": "Stellar", - "notes": "In development", - "shortcut": "XLM", - "t1_enabled": "soon", - "t2_enabled": "soon" - }, - "coin2:XMR": { - "links": { - "Homepage": "https://getmonero.org" - }, - "marketcap_usd": 2831629582, - "name": "Monero", - "notes": "In development", - "shortcut": "XMR", - "t1_enabled": "no", - "t2_enabled": "soon", - "type": "coin" - }, - "coin2:XRP": { - "links": { - "Homepage": "https://ripple.com" - }, - "marketcap_usd": 24313181966, - "name": "Ripple", - "notes": "In development", - "shortcut": "XRP", - "t1_enabled": "no", - "t2_enabled": "soon", - "type": "coin" - }, - "coin2:XTZ": { - "links": { - "Homepage": "https://tezos.com" - }, - "marketcap_usd": 782851566, - "name": "Tezos", - "shortcut": "XTZ", - "t1_enabled": "no", - "t2_enabled": "soon", - "type": "coin" - }, - "coin:BCH": { + "bitcoin:BCH": { "links": { "Github": "https://github.com/Bitcoin-ABC/bitcoin-abc", - "Homepage": "https://www.bitcoincash.org/" + "Homepage": "https://www.bitcoincash.org" }, - "marketcap_usd": 9007945692, + "marketcap_usd": 9137924262, "name": "Bitcoin Cash", "shortcut": "BCH", "t1_enabled": "yes", @@ -219,12 +16,12 @@ "Trezor": "https://wallet.trezor.io" } }, - "coin:BTC": { + "bitcoin:BTC": { "links": { "Github": "https://github.com/bitcoin/bitcoin", "Homepage": "https://bitcoin.org" }, - "marketcap_usd": 110981096268, + "marketcap_usd": 113093093543, "name": "Bitcoin", "shortcut": "BTC", "t1_enabled": "yes", @@ -235,113 +32,124 @@ "Trezor": "https://wallet.trezor.io" } }, - "coin:BTCP": { + "bitcoin:BTCP": { "links": { "Github": "https://github.com/BTCPrivate/BitcoinPrivate", "Homepage": "https://btcprivate.org" }, - "marketcap_usd": 77677196, + "marketcap_usd": 87763522, "name": "Bitcoin Private", "shortcut": "BTCP", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "coin" + "type": "coin", + "wallet": { + "BTCP Electrum": "https://github.com/BTCPrivate/electrum-btcp" + } }, - "coin:BTG": { + "bitcoin:BTG": { "links": { "Github": "https://github.com/BTCGPU/BTCGPU", "Homepage": "https://bitcoingold.org" }, - "marketcap_usd": 313484413, + "marketcap_usd": 325590507, "name": "Bitcoin Gold", "shortcut": "BTG", "t1_enabled": "yes", "t2_enabled": "yes", "type": "coin", "wallet": { + "ElectrumG": "https://github.com/BTCGPU/electrum", "Trezor": "https://wallet.trezor.io" } }, - "coin:BTX": { + "bitcoin:BTX": { "links": { "Github": "https://github.com/LIMXTEC/BitCore", "Homepage": "https://bitcore.cc" }, - "marketcap_usd": 19852774, + "marketcap_usd": 20100741, "name": "Bitcore", "shortcut": "BTX", "t1_enabled": "no", "t2_enabled": "no", - "type": "coin" + "type": "coin", + "wallet": {} }, - "coin:CRW": { + "bitcoin:CRW": { "links": { "Github": "https://github.com/Crowndev/crowncoin", "Homepage": "https://crown.tech" }, - "marketcap_usd": 5254661, + "marketcap_usd": 5188447, "name": "Crown", "shortcut": "CRW", "t1_enabled": "no", "t2_enabled": "no", - "type": "coin" + "type": "coin", + "wallet": {} }, - "coin:DASH": { + "bitcoin:DASH": { "links": { "Github": "https://github.com/dashpay/dash", "Homepage": "https://www.dash.org" }, - "marketcap_usd": 1144270654, + "marketcap_usd": 1152175202, "name": "Dash", "shortcut": "DASH", "t1_enabled": "yes", "t2_enabled": "yes", "type": "coin", "wallet": { + "Dash Electrum": "https://electrum.dash.org", "Trezor": "https://wallet.trezor.io" } }, - "coin:DCR": { + "bitcoin:DCR": { "links": { "Github": "https://github.com/decred/dcrd", "Homepage": "https://www.decred.org" }, - "marketcap_usd": 305325939, + "marketcap_usd": 302406692, "name": "Decred", "shortcut": "DCR", "t1_enabled": "yes", "t2_enabled": "no", - "type": "coin" + "type": "coin", + "wallet": {} }, - "coin:DGB": { + "bitcoin:DGB": { "links": { "Github": "https://github.com/digibyte/digibyte", - "Homepage": "https://www.digibyte.co" + "Homepage": "https://digibyte.io" }, - "marketcap_usd": 252279457, + "marketcap_usd": 271399167, "name": "DigiByte", "shortcut": "DGB", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "coin" + "type": "coin", + "wallet": {} }, - "coin:DNR": { + "bitcoin:DNR": { "links": { "Github": "https://github.com/carsenk/denarius", "Homepage": "https://denarius.io" }, + "marketcap_usd": 0, "name": "Denarius", "shortcut": "DNR", - "t1_enabled": "no", - "t2_enabled": "no", - "type": "coin" + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "coin", + "wallet": {} }, - "coin:DOGE": { + "bitcoin:DOGE": { "links": { "Github": "https://github.com/dogecoin/dogecoin", - "Homepage": "https://dogecoin.com" + "Homepage": "http://dogecoin.com" }, - "marketcap_usd": 270040625, + "marketcap_usd": 274733481, "name": "Dogecoin", "shortcut": "DOGE", "t1_enabled": "yes", @@ -351,12 +159,12 @@ "Trezor": "https://wallet.trezor.io" } }, - "coin:FJC": { + "bitcoin:FJC": { "links": { "Github": "https://github.com/fujicoin/fujicoin", - "Homepage": "https://www.fujicoin.org" + "Homepage": "http://fujicoin.org" }, - "marketcap_usd": 530745, + "marketcap_usd": 525183, "name": "Fujicoin", "shortcut": "FJC", "t1_enabled": "yes", @@ -366,35 +174,38 @@ "Electrum-FJC": "http://www.fujicoin.org/downloads.php" } }, - "coin:FLASH": { + "bitcoin:FLASH": { "links": { "Github": "https://github.com/flash-coin", "Homepage": "https://www.flashcoin.io" }, + "marketcap_usd": 5896831, "name": "Flashcoin", "shortcut": "FLASH", - "t1_enabled": "no", - "t2_enabled": "no", - "type": "coin" + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "coin", + "wallet": {} }, - "coin:FTC": { + "bitcoin:FTC": { "links": { "Github": "https://github.com/FeatherCoin/Feathercoin", "Homepage": "https://feathercoin.com" }, - "marketcap_usd": 10650928, + "marketcap_usd": 11252804, "name": "Feathercoin", "shortcut": "FTC", - "t1_enabled": "no", - "t2_enabled": "no", - "type": "coin" + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "coin", + "wallet": {} }, - "coin:GRS": { + "bitcoin:GRS": { "links": { "Github": "https://github.com/Groestlcoin/groestlcoin", "Homepage": "https://www.groestlcoin.org" }, - "marketcap_usd": 41154108, + "marketcap_usd": 43522762, "name": "Groestlcoin", "shortcut": "GRS", "t1_enabled": "yes", @@ -404,23 +215,25 @@ "Electrum-GRS": "https://www.groestlcoin.org/groestlcoin-electrum-wallet/" } }, - "coin:KOTO": { + "bitcoin:KOTO": { "links": { - "Github": "https://github.com/koto-dev/koto", - "Homepage": "https://koto.cash" + "Github": "https://github.com/KotoDevelopers/koto", + "Homepage": "https://ko-to.org" }, + "marketcap_usd": 0, "name": "Koto", "shortcut": "KOTO", "t1_enabled": "soon", "t2_enabled": "soon", - "type": "coin" + "type": "coin", + "wallet": {} }, - "coin:LTC": { + "bitcoin:LTC": { "links": { "Github": "https://github.com/litecoin-project/litecoin", "Homepage": "https://litecoin.org" }, - "marketcap_usd": 3208674425, + "marketcap_usd": 3266595707, "name": "Litecoin", "shortcut": "LTC", "t1_enabled": "yes", @@ -431,12 +244,12 @@ "Trezor": "https://wallet.trezor.io" } }, - "coin:MONA": { + "bitcoin:MONA": { "links": { "Github": "https://github.com/monacoinproject/monacoin", "Homepage": "https://monacoin.org" }, - "marketcap_usd": 96748199, + "marketcap_usd": 95510557, "name": "Monacoin", "shortcut": "MONA", "t1_enabled": "yes", @@ -446,23 +259,25 @@ "Electrum-MONA": "https://electrum-mona.org" } }, - "coin:MUE": { + "bitcoin:MUE": { "links": { "Github": "https://github.com/muecoin/MUECore", "Homepage": "https://www.monetaryunit.org" }, + "marketcap_usd": 0, "name": "MUE", "shortcut": "MUE", - "t1_enabled": "no", - "t2_enabled": "no", - "type": "coin" + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "coin", + "wallet": {} }, - "coin:NMC": { + "bitcoin:NMC": { "links": { "Github": "https://github.com/namecoin/namecoin-core", "Homepage": "https://namecoin.org" }, - "marketcap_usd": 22080408, + "marketcap_usd": 20470325, "name": "Namecoin", "shortcut": "NMC", "t1_enabled": "yes", @@ -472,31 +287,33 @@ "Electrum-NMC": "https://github.com/namecoin/electrum-nmc" } }, - "coin:PTC": { + "bitcoin:PTC": { "links": { "Github": "https://github.com/FundacionPesetacoin/PesetacoinCore", "Homepage": "http://pesetacoin.info" }, - "marketcap_usd": 2115005, + "marketcap_usd": 2218954, "name": "Pesetacoin", "shortcut": "PTC", - "t1_enabled": "no", - "t2_enabled": "no", - "type": "coin" + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "coin", + "wallet": {} }, - "coin:SMART": { + "bitcoin:SMART": { "links": { "Github": "https://github.com/SmartCash/Core-Smart", "Homepage": "https://smarcash.cc" }, - "marketcap_usd": 49447266, + "marketcap_usd": 47714944, "name": "SmartCash", "shortcut": "SMART", - "t1_enabled": "no", - "t2_enabled": "no", - "type": "coin" + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "coin", + "wallet": {} }, - "coin:TAZ": { + "bitcoin:TAZ": { "hidden": 1, "links": { "Github": "https://github.com/zcash/zcash", @@ -507,9 +324,10 @@ "shortcut": "TAZ", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "coin" + "type": "coin", + "wallet": {} }, - "coin:TBCH": { + "bitcoin:TBCH": { "hidden": 1, "links": { "Github": "https://github.com/Bitcoin-ABC/bitcoin-abc", @@ -520,20 +338,24 @@ "shortcut": "TBCH", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "coin" + "type": "coin", + "wallet": {} }, - "coin:TBTG": { + "bitcoin:TBTG": { + "hidden": 1, "links": { "Github": "https://github.com/BTCGPU/BTCGPU", "Homepage": "https://bitcoingold.org" }, + "marketcap_usd": 0, "name": "Bitcoin Gold Testnet", "shortcut": "TBTG", - "t1_enabled": "no", - "t2_enabled": "no", - "type": "coin" + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "coin", + "wallet": {} }, - "coin:TDCR": { + "bitcoin:TDCR": { "hidden": 1, "links": { "Github": "https://github.com/decred/dcrd", @@ -544,9 +366,10 @@ "shortcut": "TDCR", "t1_enabled": "yes", "t2_enabled": "no", - "type": "coin" + "type": "coin", + "wallet": {} }, - "coin:TEST": { + "bitcoin:TEST": { "hidden": 1, "links": { "Github": "https://github.com/bitcoin/bitcoin", @@ -557,9 +380,12 @@ "shortcut": "TEST", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "coin" + "type": "coin", + "wallet": { + "Trezor": "https://wallet.trezor.io" + } }, - "coin:TLTC": { + "bitcoin:TLTC": { "hidden": 1, "links": { "Github": "https://github.com/litecoin-project/litecoin", @@ -570,39 +396,43 @@ "shortcut": "TLTC", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "coin" + "type": "coin", + "wallet": {} }, - "coin:TRC": { + "bitcoin:TRC": { "links": { "Github": "https://github.com/terracoin/terracoin", "Homepage": "https://terracoin.io" }, - "marketcap_usd": 1590308, + "marketcap_usd": 1688794, "name": "Terracoin", "shortcut": "TRC", "t1_enabled": "no", "t2_enabled": "no", - "type": "coin" + "type": "coin", + "wallet": {} }, - "coin:VIA": { - "hidden": 1, + "bitcoin:VIA": { "links": { "Github": "https://github.com/viacoin", "Homepage": "https://viacoin.org" }, - "marketcap_usd": 18380760, + "marketcap_usd": 20021749, "name": "Viacoin", "shortcut": "VIA", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "coin" + "type": "coin", + "wallet": { + "Vialectrum": "https://vialectrum.org" + } }, - "coin:VTC": { + "bitcoin:VTC": { "links": { "Github": "https://github.com/vertcoin-project/vertcoin-core", "Homepage": "https://vertcoin.org" }, - "marketcap_usd": 31274762, + "marketcap_usd": 31642995, "name": "Vertcoin", "shortcut": "VTC", "t1_enabled": "yes", @@ -612,24 +442,25 @@ "Trezor": "https://wallet.trezor.io" } }, - "coin:XMY": { + "bitcoin:XMY": { "links": { "Github": "https://github.com/myriadcoin/myriadcoin", "Homepage": "https://www.myriadcoin.org" }, - "marketcap_usd": 4633554, + "marketcap_usd": 4413486, "name": "Myriad", "shortcut": "XMY", - "t1_enabled": "no", - "t2_enabled": "no", - "type": "coin" + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "coin", + "wallet": {} }, - "coin:XZC": { + "bitcoin:XZC": { "links": { "Github": "https://github.com/zcoinofficial/zcoin", "Homepage": "https://zcoin.io" }, - "marketcap_usd": 67441672, + "marketcap_usd": 69876887, "name": "Zcoin", "shortcut": "XZC", "t1_enabled": "yes", @@ -640,12 +471,12 @@ "Znode Tool": "https://github.com/yura-pakhuchiy/znode-tool" } }, - "coin:ZEC": { + "bitcoin:ZEC": { "links": { "Github": "https://github.com/zcash/zcash", - "Homepage": "z.cash" + "Homepage": "https://z.cash" }, - "marketcap_usd": 604016893, + "marketcap_usd": 618009538, "name": "Zcash", "shortcut": "ZEC", "t1_enabled": "yes", @@ -655,19 +486,20 @@ "Trezor": "https://wallet.trezor.io" } }, - "coin:ZEN": { + "bitcoin:ZEN": { "links": { "Github": "https://github.com/ZencashOfficial/zen", "Homepage": "https://zencash.com" }, - "marketcap_usd": 89933742, + "marketcap_usd": 92278630, "name": "Zencash", "shortcut": "ZEN", "t1_enabled": "no", "t2_enabled": "soon", - "type": "coin" + "type": "coin", + "wallet": {} }, - "coin:tDASH": { + "bitcoin:tDASH": { "hidden": 1, "links": { "Github": "https://github.com/dashpay/dash", @@ -677,10 +509,11 @@ "name": "Dash Testnet", "shortcut": "tDASH", "t1_enabled": "yes", - "t2_enabled": "no", - "type": "coin" + "t2_enabled": "soon", + "type": "coin", + "wallet": {} }, - "coin:tGRS": { + "bitcoin:tGRS": { "hidden": 1, "links": { "Github": "https://github.com/Groestlcoin/groestlcoin", @@ -691,20 +524,24 @@ "shortcut": "tGRS", "t1_enabled": "yes", "t2_enabled": "soon", - "type": "coin" + "type": "coin", + "wallet": {} }, - "coin:tSMART": { + "bitcoin:tSMART": { + "hidden": 1, "links": { "Github": "https://github.com/SmartCash/Core-Smart", "Homepage": "https://smartcash.cc" }, + "marketcap_usd": 0, "name": "SmartCash Testnet", "shortcut": "tSMART", - "t1_enabled": "no", - "t2_enabled": "no", - "type": "coin" + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "coin", + "wallet": {} }, - "coin:tXZC": { + "bitcoin:tXZC": { "hidden": 1, "links": { "Github": "https://github.com/zcoinofficial/zcoin", @@ -715,7 +552,8 @@ "shortcut": "tXZC", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "coin" + "type": "coin", + "wallet": {} }, "erc20:ella:MINING": { "address": "0x991e7Fe4b05f2b3db1D788e705963f5D647b0044", @@ -734,31 +572,46 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:etc:BEC": { - "address": "0x085fb4f24031EAedbC2B611AA528f22343eB52Db", + "erc20:esn:DGT": { + "address": "0x72ea3508D9d817A91465aBb59bE10FEF9857A055", "hidden": 1, "links": {}, "marketcap_usd": 0, - "name": "BEC", - "network": "etc", - "shortcut": "BEC", - "t1_enabled": "yes", - "t2_enabled": "yes", + "name": "DGT", + "network": "esn", + "shortcut": "DGT", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:etc:PLAY": { - "address": "0x5acE17f87c7391E5792a7683069A8025B83bbd85", - "links": { - "Homepage": "http://smartbillions.com/" - }, + "erc20:esn:TOPM": { + "address": "0x0146B9dCd9FB2ABC1b5B136C28D20d0037526961", + "hidden": 1, + "links": {}, + "marketcap_usd": 0, + "name": "TOPM", + "network": "esn", + "shortcut": "TOPM", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "erc20:etc:BEC": { + "address": "0x085fb4f24031EAedbC2B611AA528f22343eB52Db", + "hidden": 1, + "links": {}, "marketcap_usd": 0, - "name": "Smart Billions", + "name": "BEC", "network": "etc", - "shortcut": "PLAY", + "shortcut": "BEC", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -803,6 +656,24 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:$HUR": { + "address": "0xCDB7eCFd3403Eef3882c65B761ef9B5054890a47", + "links": { + "Github": "https://github.com/HurifyPlatform", + "Homepage": "https://hurify.co/" + }, + "marketcap_usd": 0, + "name": "$Hurify Token", + "network": "eth", + "shortcut": "$HUR", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:$TEAK": { "address": "0x7DD7F56D697Cc0f2b52bD55C057f378F1fE6Ab4b", "links": { @@ -825,7 +696,7 @@ "links": { "Homepage": "https://0xbitcoin.org/" }, - "marketcap_usd": 1293986, + "marketcap_usd": 1282370, "name": "0xBitcoin", "network": "eth", "shortcut": "0xBTC", @@ -842,7 +713,7 @@ "links": { "Homepage": "https://firstblood.io" }, - "marketcap_usd": 0, + "marketcap_usd": 5842090, "name": "FirstBlood", "network": "eth", "shortcut": "1ST", @@ -904,6 +775,23 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:3LT": { + "address": "0x430241368c1D293fdA21DBa8Bb7aF32007c59109", + "links": { + "Homepage": "https://3lt.io" + }, + "marketcap_usd": 0, + "name": "TrillionToken", + "network": "eth", + "shortcut": "3LT", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:A18": { "address": "0xBDe8f7820b5544a49D34F9dDeaCAbEDC7C0B5adc", "links": { @@ -961,7 +849,7 @@ "links": { "Homepage": "http://accelerator.network" }, - "marketcap_usd": 0, + "marketcap_usd": 103709, "name": "Accelerator Network", "network": "eth", "shortcut": "ACC", @@ -996,7 +884,7 @@ "Github": "https://github.com/aditus", "Homepage": "https://aditus.net" }, - "marketcap_usd": 0, + "marketcap_usd": 632365, "name": "Aditus", "network": "eth", "shortcut": "ADI", @@ -1031,7 +919,7 @@ "links": { "Homepage": "https://adshares.net" }, - "marketcap_usd": 0, + "marketcap_usd": 2049749, "name": "AdShares", "network": "eth", "shortcut": "ADST", @@ -1049,7 +937,7 @@ "Github": "https://github.com/adchain", "Homepage": "https://adtoken.com" }, - "marketcap_usd": 0, + "marketcap_usd": 8188525, "name": "AdToken", "network": "eth", "shortcut": "ADT", @@ -1085,7 +973,7 @@ "Github": "https://github.com/aeternity", "Homepage": "https://www.aeternity.com/" }, - "marketcap_usd": 0, + "marketcap_usd": 232368933, "name": "aeternity", "network": "eth", "shortcut": "AE", @@ -1103,7 +991,7 @@ "Github": "https://github.com/singnet/singnet", "Homepage": "https://singularitynet.io" }, - "marketcap_usd": 0, + "marketcap_usd": 24009832, "name": "SingularityNET", "network": "eth", "shortcut": "AGI", @@ -1121,7 +1009,7 @@ "Github": "https://github.com/aionnetwork", "Homepage": "https://aion.network/" }, - "marketcap_usd": 95696749, + "marketcap_usd": 108849984, "name": "Aion", "network": "eth", "shortcut": "AION", @@ -1138,7 +1026,7 @@ "links": { "Homepage": "https://airtoken.com" }, - "marketcap_usd": 0, + "marketcap_usd": 3300916, "name": "AirToken", "network": "eth", "shortcut": "AIR", @@ -1156,7 +1044,7 @@ "Github": "https://github.com/AigangNetwork", "Homepage": "https://aigang.network/" }, - "marketcap_usd": 0, + "marketcap_usd": 609344, "name": "Aigang", "network": "eth", "shortcut": "AIX", @@ -1168,6 +1056,24 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:AKC": { + "address": "0x1Ca43a170BaD619322e6f54d46b57e504dB663aA", + "links": { + "Github": "https://github.com/artwook", + "Homepage": "https://artwook.com" + }, + "marketcap_usd": 0, + "name": "ARTWOOK COIN", + "network": "eth", + "shortcut": "AKC", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:ALCO": { "address": "0x181a63746d3Adcf356CBc73aCE22832FFBB1EE5A", "links": { @@ -1191,7 +1097,7 @@ "Github": "https://github.com/AlisProject", "Homepage": "https://alismedia.jp" }, - "marketcap_usd": 2002968, + "marketcap_usd": 2202941, "name": "ALIS Token", "network": "eth", "shortcut": "ALIS", @@ -1256,13 +1162,31 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:AMLT": { + "address": "0xCA0e7269600d353F70b14Ad118A49575455C0f2f", + "links": { + "Github": "https://github.com/amlt-by-coinfirm", + "Homepage": "https://amlt.coinfirm.io/" + }, + "marketcap_usd": 1861792, + "name": "AMLT", + "network": "eth", + "shortcut": "AMLT", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:AMN": { "address": "0x737F98AC8cA59f2C68aD658E3C3d8C8963E40a4c", "links": { "Github": "https://github.com/amontech", "Homepage": "https://amon.tech" }, - "marketcap_usd": 0, + "marketcap_usd": 415222, "name": "Amon", "network": "eth", "shortcut": "AMN", @@ -1312,7 +1236,7 @@ "erc20:eth:ANT": { "address": "0x960b236A07cf122663c4303350609A66A7B288C0", "links": { - "Homepage": "https://aragon.one/network/" + "Homepage": "https://aragon.one/network" }, "marketcap_usd": 0, "name": "ANT", @@ -1332,7 +1256,7 @@ "Github": "https://github.com/Oxchild/crowdsale", "Homepage": "https://apisplatform.io" }, - "marketcap_usd": 11658184, + "marketcap_usd": 13028449, "name": "APIS", "network": "eth", "shortcut": "APIS", @@ -1350,7 +1274,7 @@ "Github": "https://github.com/Aptoide/AppCoins-ethereumj", "Homepage": "https://appcoins.io" }, - "marketcap_usd": 0, + "marketcap_usd": 8396156, "name": "AppCoins", "network": "eth", "shortcut": "APPC", @@ -1367,7 +1291,7 @@ "links": { "Homepage": "https://aigang.network" }, - "marketcap_usd": 0, + "marketcap_usd": 609344, "name": "AIGang", "network": "eth", "shortcut": "APT", @@ -1383,12 +1307,12 @@ "address": "0xAc709FcB44a43c35F0DA4e3163b117A17F3770f5", "links": { "Github": "https://github.com/swarmcity/ac-token", - "Homepage": "https://arcade.city/" + "Homepage": "https://arcade.city" }, "marketcap_usd": 0, - "name": "Arcade", + "name": "Arcade Token", "network": "eth", - "shortcut": "ARCD", + "shortcut": "ARC", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -1402,7 +1326,7 @@ "links": { "Homepage": "https://www.arbitragect.com" }, - "marketcap_usd": 0, + "marketcap_usd": 136089, "name": "ArbitrageCT", "network": "eth", "shortcut": "ARCT", @@ -1507,7 +1431,7 @@ "links": { "Homepage": "https://airswap.io" }, - "marketcap_usd": 0, + "marketcap_usd": 13376207, "name": "Airswap", "network": "eth", "shortcut": "AST", @@ -1519,41 +1443,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:ATH": { - "address": "0x17052d51E954592C1046320c2371AbaB6C73Ef10", - "links": { - "Homepage": "https://athenianwarriortoken.com" - }, - "marketcap_usd": 0, - "name": "Athenian Warrior Token", - "network": "eth", - "shortcut": "ATH", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, - "erc20:eth:ATH (AIgatha Token)": { - "address": "0x1543d0F83489e82A1344DF6827B23d541F235A50", - "links": { - "Github": "https://github.com/AIgatha", - "Homepage": "https://aigatha.com" - }, - "marketcap_usd": 0, - "name": "AIgatha Token", - "network": "eth", - "shortcut": "ATH (AIgatha Token)", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:ATL": { "address": "0x78B7FADA55A64dD895D8c8c35779DD8b67fA8a05", "links": { @@ -1694,6 +1583,24 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:AXPR": { + "address": "0xC39E626A04C5971D770e319760D7926502975e47", + "links": { + "Github": "https://www.github.com/axpire", + "Homepage": "https://www.axpire.io" + }, + "marketcap_usd": 4232286, + "name": "aXpire", + "network": "eth", + "shortcut": "AXPR", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:BANX": { "address": "0xF87F0D9153fea549c728Ad61cb801595a68b73de", "links": { @@ -1714,7 +1621,7 @@ "erc20:eth:BAT": { "address": "0x0D8775F648430679A709E98d2b0Cb6250d2887EF", "links": { - "Homepage": "https://basicattentiontoken.org/" + "Homepage": "https://basicattentiontoken.org" }, "marketcap_usd": 0, "name": "BAT", @@ -1768,7 +1675,7 @@ "address": "0x1e797Ce986C3CFF4472F7D38d5C4aba55DfEFE40", "links": { "Github": "https://github.com/Blockcdnteam", - "Homepage": "https://www.blockcdn.org/" + "Homepage": "https://www.blockcdn.org" }, "marketcap_usd": 0, "name": "BCDN", @@ -1877,7 +1784,7 @@ "Github": "https://github.com/thebeetoken", "Homepage": "https://www.beetoken.com" }, - "marketcap_usd": 0, + "marketcap_usd": 1975546, "name": "Bee Token", "network": "eth", "shortcut": "BEE", @@ -1911,7 +1818,7 @@ "address": "0x8aA33A7899FCC8eA5fBe6A608A109c3893A1B8b2", "links": { "Github": "https://github.com/daocasino", - "Homepage": "https://dao.casino/" + "Homepage": "https://dao.casino" }, "marketcap_usd": 0, "name": "BET", @@ -1925,6 +1832,24 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:BETHER": { + "address": "0x14C926F2290044B647e1Bf2072e67B495eff1905", + "links": { + "Github": "https://github.com/bethereumproject", + "Homepage": "https://www.bethereum.com/" + }, + "marketcap_usd": 0, + "name": "Bethereum", + "network": "eth", + "shortcut": "BETHER", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:BETR": { "address": "0x763186eB8d4856D536eD4478302971214FEbc6A9", "links": { @@ -1983,7 +1908,7 @@ "Github": "https://github.com/BankEx", "Homepage": "https://bankex.com/" }, - "marketcap_usd": 0, + "marketcap_usd": 6511393, "name": "BANKEX", "network": "eth", "shortcut": "BKX", @@ -2019,7 +1944,7 @@ "Github": "https://github.com/BlueCrypto", "Homepage": "https://blueprotocol.com/" }, - "marketcap_usd": 0, + "marketcap_usd": 1692252, "name": "Ethereum Blue", "network": "eth", "shortcut": "BLUE", @@ -2052,9 +1977,9 @@ "erc20:eth:BLX (Iconomi)": { "address": "0xE5a7c12972f3bbFe70ed29521C8949b8Af6a0970", "links": { - "Homepage": "https://www.iconomi.net/" + "Homepage": "https://www.iconomi.net" }, - "marketcap_usd": 0, + "marketcap_usd": 45789936, "name": "Iconomi", "network": "eth", "shortcut": "BLX (Iconomi)", @@ -2155,7 +2080,7 @@ "erc20:eth:BNC": { "address": "0xdD6Bf56CA2ada24c683FAC50E37783e55B57AF9F", "links": { - "Homepage": "https://bravenewcoin.com/" + "Homepage": "https://bravenewcoin.com" }, "marketcap_usd": 0, "name": "BNC", @@ -2188,10 +2113,10 @@ "erc20:eth:BNT": { "address": "0x1F573D6Fb3F13d689FF844B4cE37794d79a7FF1C", "links": { - "Github": "https://github.com/bancorprotocol/", + "Github": "https://github.com/bancorprotocol", "Homepage": "https://www.bancor.network/discover" }, - "marketcap_usd": 0, + "marketcap_usd": 83919779, "name": "Bancor", "network": "eth", "shortcut": "BNT", @@ -2242,7 +2167,7 @@ "links": { "Homepage": "https://bonpay.com" }, - "marketcap_usd": 0, + "marketcap_usd": 1034517, "name": "Bonpay", "network": "eth", "shortcut": "BON", @@ -2288,6 +2213,24 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:BOX": { + "address": "0xe1A178B681BD05964d3e3Ed33AE731577d9d96dD", + "links": { + "Github": "https://github.com/boxproject", + "Homepage": "https://box.la/" + }, + "marketcap_usd": 0, + "name": "BOX Token", + "network": "eth", + "shortcut": "BOX", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:BPT": { "address": "0x327682779bAB2BF4d1337e8974ab9dE8275A7Ca8", "links": { @@ -2326,9 +2269,9 @@ "erc20:eth:BRAT": { "address": "0x9E77D5a1251b6F7D456722A6eaC6D2d5980bd891", "links": { - "Homepage": "http://bro-consortium.io/" + "Homepage": "http://bro-consortium.io" }, - "marketcap_usd": 27522, + "marketcap_usd": 16945, "name": "BRAT", "network": "eth", "shortcut": "BRAT", @@ -2344,9 +2287,9 @@ "address": "0x558EC3152e2eb2174905cd19AeA4e34A23DE9aD6", "links": { "Github": "https://github.com/breadwallet", - "Homepage": "https://token.breadapp.com/en/" + "Homepage": "https://token.breadapp.com/en" }, - "marketcap_usd": 0, + "marketcap_usd": 32166081, "name": "Bread", "network": "eth", "shortcut": "BRD", @@ -2484,7 +2427,7 @@ "address": "0xdb8646F5b487B5Dd979FAC618350e85018F557d4", "links": { "Github": "https://github.com/bitcoin-token", - "Homepage": "https://btk.community/" + "Homepage": "https://btk.community" }, "marketcap_usd": 0, "name": "Bitcoin Token", @@ -2498,48 +2441,13 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:BTL (Battle)": { - "address": "0x2accaB9cb7a48c3E82286F0b2f8798D201F4eC3f", - "links": { - "Github": "https://github.com/Neurone/persians", - "Homepage": "http://persians.network" - }, - "marketcap_usd": 0, - "name": "BTL (Battle)", - "network": "eth", - "shortcut": "BTL (Battle)", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, - "erc20:eth:BTL (Bitlle)": { - "address": "0x92685E93956537c25Bb75D5d47fca4266dd628B8", - "links": { - "Homepage": "https://bitlle.com" - }, - "marketcap_usd": 0, - "name": "Bitlle Token", - "network": "eth", - "shortcut": "BTL (Bitlle)", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:BTM": { "address": "0xcB97e65F07DA24D46BcDD078EBebd7C6E6E3d750", "links": { "Github": "https://github.com/bytom", "Homepage": "https://bytom.io" }, - "marketcap_usd": 0, + "marketcap_usd": 182156841, "name": "Bytom", "network": "eth", "shortcut": "BTM", @@ -2603,6 +2511,22 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:BTZ": { + "address": "0xE5f867dE1EA81346df5181b8b48DD6B0BB3357B0", + "hidden": 1, + "links": {}, + "marketcap_usd": 0, + "name": "BTZ by Bunz", + "network": "eth", + "shortcut": "BTZ", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:BUC": { "address": "0xCa3c18a65b802eC267f8f4802545e7F53D24C75e", "links": { @@ -2642,7 +2566,7 @@ "Github": "https://github.com/cryptotwenty", "Homepage": "https://crypto20.com" }, - "marketcap_usd": 27052771, + "marketcap_usd": 27200698, "name": "Crypto20's Token", "network": "eth", "shortcut": "C20", @@ -2704,23 +2628,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:CAR": { - "address": "0x423e4322CDDa29156b49a17dfbd2aCC4b280600D", - "links": { - "Homepage": "https://mycarcoin.com" - }, - "marketcap_usd": 0, - "name": "Car Sharing Community", - "network": "eth", - "shortcut": "CAR", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:CARB": { "address": "0xA517a46Baad6B054A76bD19c46844f717fe69fea", "links": { @@ -2755,24 +2662,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:CARD": { - "address": "0x1ed2B1eaEd8e968bc36EB90a914660A71827A5E9", - "links": { - "Github": "https://github.com/cardstack", - "Homepage": "https://cardstack.com" - }, - "marketcap_usd": 0, - "name": "Cardstack Token", - "network": "eth", - "shortcut": "CARD", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:CARE": { "address": "0xbF18F246B9301F231e9561B35A3879769BB46375", "links": { @@ -2795,7 +2684,7 @@ "links": { "Homepage": "https://cashaa.com" }, - "marketcap_usd": 0, + "marketcap_usd": 11049607, "name": "Cashaa", "network": "eth", "shortcut": "CAS", @@ -2858,18 +2747,36 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:CC3": { - "address": "0xc166038705FFBAb3794185b3a9D925632A1DF37D", + "erc20:eth:CBIX": { + "address": "0x05C3617cBf1304b9260AA61ec960F115D67beCEA", "links": { - "Homepage": "https://coalcoin.tech/en" + "Github": "https://github.com/Cubrixio", + "Homepage": "https://cubrix.io" }, "marketcap_usd": 0, - "name": "Coal Coin", + "name": "Cubrix", "network": "eth", - "shortcut": "CC3", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", + "shortcut": "CBIX", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "erc20:eth:CC3": { + "address": "0xc166038705FFBAb3794185b3a9D925632A1DF37D", + "links": { + "Homepage": "https://coalcoin.tech/en" + }, + "marketcap_usd": 0, + "name": "Coal Coin", + "network": "eth", + "shortcut": "CC3", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" @@ -2980,15 +2887,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:CDX": { - "address": "0x6fFF3806Bbac52A20e0d79BC538d527f6a22c96b", + "erc20:eth:CEEK": { + "address": "0xb056c38f6b7Dc4064367403E26424CD2c60655e1", "links": { - "Homepage": "https://commodityadnetwork.com" + "Homepage": "https://www.ceek.com/" }, "marketcap_usd": 0, - "name": "CDX", + "name": "CEEK VR Token", "network": "eth", - "shortcut": "CDX", + "shortcut": "CEEK", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -2997,17 +2904,35 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:CEEK": { - "address": "0xb056c38f6b7Dc4064367403E26424CD2c60655e1", + "erc20:eth:CET": { + "address": "0xF660cA1e228e7BE1fA8B4f5583145E31147FB577", "links": { - "Homepage": "https://www.ceek.com/" + "Github": "https://github.com/DICE-Money/", + "Homepage": "https://dice.money/" }, "marketcap_usd": 0, - "name": "CEEK VR Token", + "name": "DICE Money Dicet", "network": "eth", - "shortcut": "CEEK", - "t1_enabled": "yes", - "t2_enabled": "yes", + "shortcut": "CET", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "erc20:eth:CFC": { + "address": "0x5Dff89a2caa4D76bc286F74D67Bd718eb834da61", + "links": { + "Homepage": "https://cryptfillcoin.com" + }, + "marketcap_usd": 0, + "name": "CryptFillCoin", + "network": "eth", + "shortcut": "CFC", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", @@ -3228,7 +3153,7 @@ "links": { "Homepage": "https://cindicator.com" }, - "marketcap_usd": 0, + "marketcap_usd": 25262263, "name": "Cindicator", "network": "eth", "shortcut": "CND", @@ -3335,7 +3260,7 @@ "Github": "https://github.com/CoinvestHQ", "Homepage": "https://coinve.st" }, - "marketcap_usd": 88111, + "marketcap_usd": 89814, "name": "Coinvest V2 Token", "network": "eth", "shortcut": "COIN", @@ -3347,17 +3272,17 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:COSS": { - "address": "0x65292EeadF1426Cd2dF1C4793a3d7519f253913b", + "erc20:eth:CORI": { + "address": "0x725B190Bc077FFde17Cf549AA8ba25e298550B18", "links": { - "Homepage": "https://coss.io" + "Homepage": "https://corrently.de/token/" }, - "marketcap_usd": 6114435, - "name": "Coss Token", + "marketcap_usd": 0, + "name": "Corrently Invest Token", "network": "eth", - "shortcut": "COSS", - "t1_enabled": "yes", - "t2_enabled": "yes", + "shortcut": "CORI", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", @@ -3369,7 +3294,7 @@ "links": { "Homepage": "https://covesting.io/" }, - "marketcap_usd": 0, + "marketcap_usd": 15546534, "name": "Covesting", "network": "eth", "shortcut": "COV", @@ -3405,7 +3330,7 @@ "Github": "https://github.com/aditus", "Homepage": "https://copytrack.io" }, - "marketcap_usd": 0, + "marketcap_usd": 940467, "name": "COPYTRACK", "network": "eth", "shortcut": "CPY", @@ -3438,7 +3363,7 @@ "erc20:eth:CRB": { "address": "0xAef38fBFBF932D1AeF3B808Bc8fBd8Cd8E1f8BC5", "links": { - "Homepage": "https://www.creditbit.org/" + "Homepage": "https://www.creditbit.org" }, "marketcap_usd": 0, "name": "CRB", @@ -3475,7 +3400,7 @@ "links": { "Homepage": "https://bitbounce.io" }, - "marketcap_usd": 9624659, + "marketcap_usd": 11146751, "name": "Credo / Bitbounce", "network": "eth", "shortcut": "CREDO", @@ -3487,6 +3412,41 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:CRGO": { + "address": "0xf49CDD50aD408d387d611F88A647179C3de3492b", + "links": { + "Github": "https://github.com/CargoCoinRepo/Cargo-Coin", + "Homepage": "https://thecargocoin.com" + }, + "marketcap_usd": 0, + "name": "CargoCoin", + "network": "eth", + "shortcut": "CRGO", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "erc20:eth:CRMT": { + "address": "0x9238bfB781A55eACC3Cf05F7DF94038c198CD9B9", + "links": { + "Homepage": "https://www.cremit.co" + }, + "marketcap_usd": 0, + "name": "Cremit", + "network": "eth", + "shortcut": "CRMT", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:CRPT": { "address": "0x80A7E048F37A50500351C204Cb407766fA3baE7f", "links": { @@ -3557,6 +3517,24 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:CTGC": { + "address": "0x9E7D29bd499B6c7da2a5B2EaFCF4A39d3BD845D1", + "links": { + "Github": "https://github.com/ctgcoin/", + "Homepage": "https://www.ctgcoin.org" + }, + "marketcap_usd": 0, + "name": "Convenient To Go", + "network": "eth", + "shortcut": "CTGC", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:CTL": { "address": "0xBf4cFD7d1eDeeEA5f6600827411B41A21eB08abd", "hidden": 1, @@ -3610,7 +3588,7 @@ "erc20:eth:CVC": { "address": "0x41e5560054824eA6B0732E656E3Ad64E20e94E45", "links": { - "Homepage": "https://www.civic.com/" + "Homepage": "https://www.civic.com" }, "marketcap_usd": 0, "name": "CVC", @@ -3648,7 +3626,7 @@ "Github": "https://github.com/cargoxio", "Homepage": "https://cargox.io" }, - "marketcap_usd": 0, + "marketcap_usd": 4051146, "name": "CargoX", "network": "eth", "shortcut": "CXO", @@ -3660,12 +3638,29 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:CYFM": { + "address": "0x3f06B5D78406cD97bdf10f5C420B241D32759c80", + "links": { + "Homepage": "https://cyberfmradio.com" + }, + "marketcap_usd": 0, + "name": "CyberFM", + "network": "eth", + "shortcut": "CYFM", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:CryptoCarbon": { "address": "0xE4c94d45f7Aef7018a5D66f44aF780ec6023378e", "links": { - "Homepage": "https://ccrb.io/" + "Homepage": "https://ccrb.io" }, - "marketcap_usd": 1654590, + "marketcap_usd": 1854299, "name": "CryptoCarbon", "network": "eth", "shortcut": "CryptoCarbon", @@ -3699,7 +3694,7 @@ "links": { "Homepage": "https://dadi.cloud" }, - "marketcap_usd": 7732887, + "marketcap_usd": 7334671, "name": "DADI", "network": "eth", "shortcut": "DADI", @@ -3711,30 +3706,12 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:DAI": { - "address": "0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359", - "links": { - "Github": "https://github.com/makerdao", - "Homepage": "https://makerdao.com" - }, - "marketcap_usd": 47753729, - "name": "Dai Stablecoin v1.0", - "network": "eth", - "shortcut": "DAI", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:DALC": { "address": "0x07D9e49Ea402194bf48A8276dAfB16E4eD633317", "links": { "Homepage": "http://www.dalecoin.org" }, - "marketcap_usd": 0, + "marketcap_usd": 36587, "name": "DaleCoin", "network": "eth", "shortcut": "DALC", @@ -3767,7 +3744,7 @@ "erc20:eth:DAO": { "address": "0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413", "links": { - "Homepage": "https://blog.daohub.org/" + "Homepage": "https://blog.daohub.org" }, "marketcap_usd": 0, "name": "DAO", @@ -3822,7 +3799,7 @@ "Github": "https://github.com/streamr-dev", "Homepage": "https://www.streamr.com" }, - "marketcap_usd": 48668, + "marketcap_usd": 49496, "name": "DATACoin", "network": "eth", "shortcut": "DATACoin", @@ -3905,6 +3882,24 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:DCC": { + "address": "0xFFa93Aacf49297D51E211817452839052FDFB961", + "links": { + "Github": "https://github.com/DistributedBanking/DCC", + "Homepage": "http://dcc.finance" + }, + "marketcap_usd": 14762972, + "name": "Distributed Credit Chain", + "network": "eth", + "shortcut": "DCC", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:DCL": { "address": "0x399A0e6FbEb3d74c85357439f4c8AeD9678a5cbF", "links": { @@ -3928,7 +3923,7 @@ "Github": "https://github.com/Dentacoin", "Homepage": "https://dentacoin.com" }, - "marketcap_usd": 0, + "marketcap_usd": 119350093, "name": "Dentacoin", "network": "eth", "shortcut": "DCN", @@ -3944,7 +3939,7 @@ "address": "0xcC4eF9EEAF656aC1a2Ab886743E98e97E090ed38", "links": { "Github": "https://github.com/digitaldevelopersfund/ddf", - "Homepage": "https://www.digitaldevelopersfund.com/" + "Homepage": "https://www.digitaldevelopersfund.com" }, "marketcap_usd": 0, "name": "DDF", @@ -3996,9 +3991,9 @@ "erc20:eth:DENT": { "address": "0x3597bfD533a99c9aa083587B074434E61Eb0A258", "links": { - "Homepage": "https://www.dentwireless.com/" + "Homepage": "https://www.dentwireless.com" }, - "marketcap_usd": 40895269, + "marketcap_usd": 43165155, "name": "DENT", "network": "eth", "shortcut": "DENT", @@ -4010,15 +4005,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:DEPO": { - "address": "0x7cF271966F36343Bf0150F25E5364f7961c58201", + "erc20:eth:DGPT": { + "address": "0xf6cFe53d6FEbaEEA051f400ff5fc14F0cBBDacA1", "links": { - "Homepage": "https://aridika.com" + "Github": "https://github.com/digipulseio", + "Homepage": "https://www.digipulse.io" }, - "marketcap_usd": 0, - "name": "CRYPTODEPOZIT", + "marketcap_usd": 303281, + "name": "DigiPulse", "network": "eth", - "shortcut": "DEPO", + "shortcut": "DGPT", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -4027,35 +4023,36 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:DGD": { - "address": "0xE0B7927c4aF23765Cb51314A0E0521A9645F0E2A", + "erc20:eth:DGS": { + "address": "0x6aEDbF8dFF31437220dF351950Ba2a3362168d1b", "links": { - "Homepage": "https://www.dgx.io" + "Github": "https://github.com/dragonglasscom", + "Homepage": "https://dragonglass.com/" }, "marketcap_usd": 0, - "name": "Digix DAO", + "name": "Dragonglass", "network": "eth", - "shortcut": "DGD", - "t1_enabled": "yes", - "t2_enabled": "yes", + "shortcut": "DGS", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:DGPT": { - "address": "0xf6cFe53d6FEbaEEA051f400ff5fc14F0cBBDacA1", + "erc20:eth:DGTX": { + "address": "0x1C83501478f1320977047008496DACBD60Bb15ef", "links": { - "Github": "https://github.com/digipulseio", - "Homepage": "https://www.digipulse.io" + "Github": "https://github.com/DigitexFutures", + "Homepage": "https://digitexfutures.com/" }, "marketcap_usd": 0, - "name": "DigiPulse", + "name": "DigitexFutures", "network": "eth", - "shortcut": "DGPT", - "t1_enabled": "yes", - "t2_enabled": "yes", + "shortcut": "DGTX", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", @@ -4063,12 +4060,13 @@ } }, "erc20:eth:DGX": { - "address": "0x55b9a11c2e8351b4Ffc7b11561148bfaC9977855", + "address": "0x4f3AfEC4E5a3F2A6a1A411DEF7D7dFe50eE057bF", "links": { - "Homepage": "https://www.dgx.io" + "Github": "https://github.com/DigixGlobal", + "Homepage": "https://digix.global" }, - "marketcap_usd": 0, - "name": "DGX", + "marketcap_usd": 2336269, + "name": "Digix Gold Token", "network": "eth", "shortcut": "DGX", "t1_enabled": "yes", @@ -4079,12 +4077,30 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:DGX1": { + "address": "0x55b9a11c2e8351b4Ffc7b11561148bfaC9977855", + "links": { + "Github": "https://github.com/DigixGlobal", + "Homepage": "https://digix.global" + }, + "marketcap_usd": 0, + "name": "Digix Gold Token 1.0", + "network": "eth", + "shortcut": "DGX1", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:DICE": { "address": "0x2e071D2966Aa7D8dECB1005885bA1977D6038A65", "links": { "Homepage": "https://etheroll.com" }, - "marketcap_usd": 0, + "marketcap_usd": 4821454, "name": "Etheroll", "network": "eth", "shortcut": "DICE", @@ -4096,6 +4112,22 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:DIP": { + "address": "0xc719d010B63E5bbF2C0551872CD5316ED26AcD83", + "hidden": 1, + "links": {}, + "marketcap_usd": 0, + "name": "Decentralized Insurance Protocol", + "network": "eth", + "shortcut": "DIP", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:DIVX": { "address": "0x13f11C9905A08ca76e3e853bE63D4f0944326C72", "links": { @@ -4171,7 +4203,7 @@ "Homepage": "https://district0x.io" }, "marketcap_usd": 0, - "name": "DistrictOx", + "name": "District0x Network Token", "network": "eth", "shortcut": "DNT", "t1_enabled": "yes", @@ -4200,23 +4232,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:DOW": { - "address": "0x76974C7B79dC8a6a109Fd71fd7cEb9E40eff5382", - "links": { - "Homepage": "https://dowcoin.io/" - }, - "marketcap_usd": 0, - "name": "DOW", - "network": "eth", - "shortcut": "DOW", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:DPP": { "address": "0x01b3Ec4aAe1B8729529BEB4965F27d008788B0EB", "links": { @@ -4252,51 +4267,18 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:DROP": { - "address": "0x3c75226555FC496168d48B88DF83B95F16771F37", + "erc20:eth:DRVH": { + "address": "0x62D4c04644314F35868Ba4c65cc27a77681dE7a9", "links": { - "Homepage": "https://droplex.org" + "Github": "https://github.com/TeamDriveholic", + "Homepage": "https://driveholic.com/" }, "marketcap_usd": 0, - "name": "Droplex", + "name": "Driveholic Token", "network": "eth", - "shortcut": "DROP", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, - "erc20:eth:DROP (dropil)": { - "address": "0x4672bAD527107471cB5067a887f4656D585a8A31", - "links": { - "Homepage": "https://dropil.com" - }, - "marketcap_usd": 0, - "name": "Dropil", - "network": "eth", - "shortcut": "DROP (dropil)", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, - "erc20:eth:DRP": { - "address": "0x2799D90C6d44Cb9Aa5fBC377177F16C33E056b82", - "links": { - "Homepage": "http://drpcoin.com" - }, - "marketcap_usd": 0, - "name": "Dripcoin", - "network": "eth", - "shortcut": "DRP", - "t1_enabled": "yes", - "t2_enabled": "yes", + "shortcut": "DRVH", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", @@ -4326,7 +4308,7 @@ "Github": "https://github.com/dethertech", "Homepage": "https://dether.io" }, - "marketcap_usd": 0, + "marketcap_usd": 2184097, "name": "dether", "network": "eth", "shortcut": "DTH", @@ -4394,7 +4376,7 @@ "erc20:eth:DTx": { "address": "0x82fdedfB7635441aA5A92791D001fA7388da8025", "links": { - "Homepage": "https://www.digitalticks.com/" + "Homepage": "https://www.digitalticks.com" }, "marketcap_usd": 0, "name": "DigitalTicks", @@ -4408,24 +4390,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:DUBI": { - "address": "0xD4CffeeF10F60eCA581b5E1146B5Aca4194a4C3b", - "links": { - "Github": "https://github.com/nionis/purpose", - "Homepage": "https://prps.io" - }, - "marketcap_usd": 0, - "name": "Decentralized Universal Basic Income", - "network": "eth", - "shortcut": "DUBI", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:Devcon2 Token": { "address": "0xdd94De9cFE063577051A5eb7465D08317d8808B6", "links": { @@ -4449,7 +4413,7 @@ "Github": "https://github.com/elangindonesia/EagleCoin", "Homepage": "https://eaglepay.io" }, - "marketcap_usd": 0, + "marketcap_usd": 103304, "name": "EagleCoin", "network": "eth", "shortcut": "EAGLE", @@ -4495,6 +4459,23 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:ECP": { + "address": "0xAEA1C18A992984831002D0cf90E291FB52d72649", + "links": { + "Homepage": "https://ecryptotokens.com" + }, + "marketcap_usd": 0, + "name": "ECRYPTO COIN", + "network": "eth", + "shortcut": "ECP", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:EDC": { "address": "0xFA1DE2Ee97e4c10C94C91Cb2b5062b89Fb140b82", "links": { @@ -4517,7 +4498,7 @@ "links": { "Homepage": "https://edgeless.io" }, - "marketcap_usd": 0, + "marketcap_usd": 26375465, "name": "Edgeless", "network": "eth", "shortcut": "EDG", @@ -4534,7 +4515,7 @@ "links": { "Homepage": "https://eidoo.io" }, - "marketcap_usd": 0, + "marketcap_usd": 24809606, "name": "Eidoo", "network": "eth", "shortcut": "EDO", @@ -4546,18 +4527,18 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:EDU": { - "address": "0x5b26C5D0772E5bbaC8b3182AE9a13f9BB2D03765", + "erc20:eth:EDR": { + "address": "0xc528c28FEC0A90C083328BC45f587eE215760A0F", "links": { - "Github": "https://github.com/livecodingtvofficial", - "Homepage": "https://tokensale.liveedu.tv" + "Github": "https://github.com/EndorCoin", + "Homepage": "https://www.endor.com" }, "marketcap_usd": 0, - "name": "EDU", + "name": "Endor Protocol Token", "network": "eth", - "shortcut": "EDU", - "t1_enabled": "yes", - "t2_enabled": "yes", + "shortcut": "EDR", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", @@ -4586,7 +4567,7 @@ "address": "0xf9F0FC7167c311Dd2F1e21E9204F87EBA9012fB2", "links": { "Github": "https://github.com/team-easyhomes", - "Homepage": "https://easyhomes.io/" + "Homepage": "https://easyhomes.io" }, "marketcap_usd": 0, "name": "EasyHomes", @@ -4641,7 +4622,7 @@ "Github": "https://github.com/eltcoin", "Homepage": "http://www.eltcoin.tech/" }, - "marketcap_usd": 89524, + "marketcap_usd": 101963, "name": "ELTCOIN", "network": "eth", "shortcut": "ELTCOIN", @@ -4653,11 +4634,29 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:EMON": { - "address": "0xb67b88a25708a35AE7c2d736D398D268CE4f7F83", + "erc20:eth:ELY": { + "address": "0xa95592DCFfA3C080B4B40E459c5f5692F67DB7F8", "links": { - "Github": "https://github.com/etheremon/smartcontract", - "Homepage": "https://www.etheremon.com/" + "Github": "https://github.com/Elysian-ELY", + "Homepage": "https://elycoin.io" + }, + "marketcap_usd": 0, + "name": "ELYCOIN", + "network": "eth", + "shortcut": "ELY", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "erc20:eth:EMON": { + "address": "0xb67b88a25708a35AE7c2d736D398D268CE4f7F83", + "links": { + "Github": "https://github.com/etheremon/smartcontract", + "Homepage": "https://www.etheremon.com/" }, "marketcap_usd": 0, "name": "Etheremon", @@ -4797,11 +4796,10 @@ }, "erc20:eth:EOS": { "address": "0x86Fa049857E0209aa7D9e616F7eb3b3B78ECfdb0", - "hidden": 1, "links": { "Homepage": "https://eos.io" }, - "marketcap_usd": 4313452179, + "marketcap_usd": 4406564332, "name": "EOS", "network": "eth", "shortcut": "EOS", @@ -4854,7 +4852,7 @@ "links": { "Homepage": "https://www.ethbits.com" }, - "marketcap_usd": 0, + "marketcap_usd": 1071935, "name": "Ethbits", "network": "eth", "shortcut": "ETBS", @@ -4904,7 +4902,7 @@ "address": "0x6927C69fb4daf2043fbB1Cb7b86c5661416bea29", "links": { "Github": "https://github.com/pironmind/EthereumRisen", - "Homepage": "http://ethereumrisen.io/" + "Homepage": "http://ethereumrisen.io" }, "marketcap_usd": 0, "name": "Etheruem Risen", @@ -5006,9 +5004,24 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:EXY": { + "address": "0x5c743a35E903F6c584514ec617ACEe0611Cf44f3", + "hidden": 1, + "links": {}, + "marketcap_usd": 3341333, + "name": "Experty", + "network": "eth", + "shortcut": "EXY", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:E\u20b9": { "address": "0xb67734521eAbBE9C773729dB73E16CC2dfb20A58", - "hidden": 1, "links": { "Github": "https://github.com/eRupee", "Homepage": "https://erupee.wordpress.com" @@ -5029,7 +5042,7 @@ "address": "0x190e569bE071F40c704e15825F285481CB74B6cC", "links": { "Github": "https://github.com/BattleDrome", - "Homepage": "http://www.battledrome.io/" + "Homepage": "http://www.battledrome.io" }, "marketcap_usd": 0, "name": "FAM", @@ -5043,17 +5056,17 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:FANX": { - "address": "0x7f6715c3FC4740A02F70De85B9FD50ac6001fEd9", + "erc20:eth:FAN": { + "address": "0x90162f41886c0946D09999736f1C15c8a105A421", "links": { - "Homepage": "http://www.fanx.one/" + "Homepage": "https://tokensale.fanfare.global" }, "marketcap_usd": 0, - "name": "FANX Token", + "name": "Fan Token", "network": "eth", - "shortcut": "FANX", - "t1_enabled": "yes", - "t2_enabled": "yes", + "shortcut": "FAN", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", @@ -5095,23 +5108,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:FLMC": { - "address": "0x04cC783b450b8D11F3C7d00DD03fDF7FB51fE9F2", - "links": { - "Homepage": "https://filmscoin.com" - }, - "marketcap_usd": 0, - "name": "Filmscoin", - "network": "eth", - "shortcut": "FLMC", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:FLP": { "address": "0x3a1Bda28AdB5B0a812a7CF10A1950c920F79BcD3", "links": { @@ -5187,7 +5183,7 @@ "Github": "https://github.com/FundRequest", "Homepage": "https://fundrequest.io" }, - "marketcap_usd": 0, + "marketcap_usd": 436959, "name": "FundRequest", "network": "eth", "shortcut": "FND", @@ -5216,23 +5212,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:FTC": { - "address": "0xe6f74dcfa0E20883008d8C16b6d9a329189D0C30", - "links": { - "Homepage": "https://ftccoins.org/en" - }, - "marketcap_usd": 0, - "name": "FTC", - "network": "eth", - "shortcut": "FTC", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:FTR": { "address": "0x2023DCf7c438c8C8C0B0F28dBaE15520B4f3Ee20", "links": { @@ -5268,17 +5247,18 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:FUCK": { - "address": "0xAb16E0d25c06CB376259cc18C1de4ACA57605589", + "erc20:eth:FTXT": { + "address": "0x41875C2332B0877cDFAA699B641402b7D4642c32", "links": { - "Homepage": "http://fucktoken.io" + "Github": "https://github.com/futuraxproject", + "Homepage": "https://futurax.global" }, "marketcap_usd": 0, - "name": "Finally Usable Crypto Karma", + "name": "FUTURAX", "network": "eth", - "shortcut": "FUCK", - "t1_enabled": "yes", - "t2_enabled": "yes", + "shortcut": "FTXT", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", @@ -5308,7 +5288,7 @@ "links": { "Homepage": "https://funfair.io" }, - "marketcap_usd": 0, + "marketcap_usd": 83784745, "name": "Funfair", "network": "eth", "shortcut": "FUN", @@ -5320,6 +5300,24 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:FXC": { + "address": "0xc92D6E3E64302C59d734f3292E2A13A13D7E1817", + "links": { + "Github": "https://github.com/futuraxproject", + "Homepage": "https://futurax.global" + }, + "marketcap_usd": 0, + "name": "FUTURAX", + "network": "eth", + "shortcut": "FXC", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:FYN": { "address": "0x88FCFBc22C6d3dBaa25aF478C578978339BDe77a", "links": { @@ -5343,7 +5341,7 @@ "Github": "https://github.com/BlockchainLabsNZ/gambit", "Homepage": "http://gambitcrypto.com" }, - "marketcap_usd": 0, + "marketcap_usd": 4540717, "name": "Gambit", "network": "eth", "shortcut": "GAM", @@ -5355,24 +5353,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:GANA": { - "address": "0x6754e21b9EAa053c62d7854dD6561ae451B0cBCf", - "links": { - "Github": "https://github.com/GanaProject", - "Homepage": "https://ganacoin.io" - }, - "marketcap_usd": 0, - "name": "GANA", - "network": "eth", - "shortcut": "GANA", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:GAVEL": { "address": "0x708876f486e448Ee89eB332bFbC8E593553058b9", "links": { @@ -5394,7 +5374,7 @@ "address": "0x7585F835ae2d522722d2684323a0ba83401f32f5", "links": { "Github": "https://github.com/myHelloGold/Foundation", - "Homepage": "https://www.hellogold.org/" + "Homepage": "https://www.hellogold.org" }, "marketcap_usd": 0, "name": "GBT", @@ -5484,7 +5464,7 @@ "Github": "https://github.com/daostack", "Homepage": "https://daostack.io" }, - "marketcap_usd": 0, + "marketcap_usd": 4069602, "name": "DAOstack", "network": "eth", "shortcut": "GEN", @@ -5583,24 +5563,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:GNT": { - "address": "0xa74476443119A942dE498590Fe1f2454d7D4aC0d", - "coinmarketcap_alias": "golem-network-tokens", - "links": { - "Homepage": "https://golem.network" - }, - "marketcap_usd": 138878773, - "name": "Golem", - "network": "eth", - "shortcut": "GNT", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:GOLDX": { "address": "0xeAb43193CF0623073Ca89DB9B712796356FA7414", "links": { @@ -5624,7 +5586,7 @@ "links": { "Homepage": "https://gridplus.io/token-sale" }, - "marketcap_usd": 5756767, + "marketcap_usd": 7586168, "name": "GRID", "network": "eth", "shortcut": "GRID", @@ -5654,6 +5616,23 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:GSE": { + "address": "0xe530441f4f73bDB6DC2fA5aF7c3fC5fD551Ec838", + "links": { + "Homepage": "https://www.gse.network" + }, + "marketcap_usd": 0, + "name": "GSENetwork", + "network": "eth", + "shortcut": "GSE", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:GTC": { "address": "0xB70835D7822eBB9426B56543E391846C107bd32C", "links": { @@ -5676,7 +5655,7 @@ "address": "0x025abAD9e518516fdaAFBDcdB9701b37fb7eF0FA", "links": { "Github": "https://github.com/sprux/BackToEarth", - "Homepage": "https://backto.earth/" + "Homepage": "https://backto.earth" }, "marketcap_usd": 0, "name": "GTKT", @@ -5696,7 +5675,7 @@ "Github": "https://github.com/GIFTO-io", "Homepage": "https://gifto.io/" }, - "marketcap_usd": 0, + "marketcap_usd": 43157978, "name": "Gifto", "network": "eth", "shortcut": "GTO", @@ -5708,18 +5687,18 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:GUP": { - "address": "0xf7B098298f7C69Fc14610bf71d5e02c60792894C", + "erc20:eth:GULD": { + "address": "0x9847345de8b614c956146bbea549336d9C8d26b6", "links": { - "Github": "https://github.com/Matchpool/", - "Homepage": "https://github.com/Matchpool/" + "Github": "https://github.com/guldcoin", + "Homepage": "https://guld.io" }, "marketcap_usd": 0, - "name": "GUP", + "name": "GULD ERC20", "network": "eth", - "shortcut": "GUP", - "t1_enabled": "yes", - "t2_enabled": "yes", + "shortcut": "GULD", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", @@ -5732,7 +5711,7 @@ "Github": "https://github.com/GenesisVision", "Homepage": "https://genesis.vision" }, - "marketcap_usd": 0, + "marketcap_usd": 18476548, "name": "Genesis Vision", "network": "eth", "shortcut": "GVT", @@ -5765,7 +5744,7 @@ "address": "0x22F0AF8D78851b72EE799e05F54A77001586B18A", "links": { "Github": "https://github.com/GxC17Genevieve/GXVC", - "Homepage": "https://genevieveco.io/" + "Homepage": "https://genevieveco.io" }, "marketcap_usd": 0, "name": "Genevieve VC", @@ -5814,6 +5793,23 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:HAPPY": { + "address": "0x5A567e28dbFa2bBD3ef13C0a01be114745349657", + "links": { + "Homepage": "https://btr.works" + }, + "marketcap_usd": 0, + "name": "Happiness", + "network": "eth", + "shortcut": "HAPPY", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:HAT": { "address": "0x9002D4485b7594e3E850F0a206713B305113f69e", "links": { @@ -5837,7 +5833,7 @@ "Github": "https://github.com/havven/havven", "Homepage": "https://havven.io" }, - "marketcap_usd": 0, + "marketcap_usd": 8074565, "name": "Havven", "network": "eth", "shortcut": "HAV", @@ -5870,7 +5866,7 @@ "address": "0xba2184520A1cC49a6159c57e61E1844E085615B6", "links": { "Github": "https://github.com/myHelloGold/Foundation", - "Homepage": "https://www.hellogold.org/" + "Homepage": "https://www.hellogold.org" }, "marketcap_usd": 0, "name": "HGT", @@ -5884,6 +5880,23 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:HIBT": { + "address": "0x9bb1Db1445b83213a56d90d331894b3f26218e4e", + "links": { + "Homepage": "https://www.hibtc.com/" + }, + "marketcap_usd": 0, + "name": "HiBTC Token", + "network": "eth", + "shortcut": "HIBT", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:HIG": { "address": "0xa9240fBCAC1F0b9A6aDfB04a53c8E3B0cC1D1444", "links": { @@ -5959,7 +5972,7 @@ "links": { "Homepage": "https://github.com/arachnid/hodlcoin" }, - "marketcap_usd": 0, + "marketcap_usd": 258639, "name": "HODLCoin", "network": "eth", "shortcut": "HODL", @@ -5989,24 +6002,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:HOT": { - "address": "0x9AF839687F6C94542ac5ece2e317dAAE355493A1", - "links": { - "Github": "https://github.com/Holo-Host", - "Homepage": "https://thehydrofoundation.com/" - }, - "marketcap_usd": 0, - "name": "Hydro Protocol", - "network": "eth", - "shortcut": "HOT", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:HST": { "address": "0x554C20B7c486beeE439277b4540A434566dC4C02", "links": { @@ -6030,7 +6025,7 @@ "Github": "https://github.com/HiveProjectLTD", "Homepage": "https://hive-project.net" }, - "marketcap_usd": 0, + "marketcap_usd": 11450973, "name": "Hive Project", "network": "eth", "shortcut": "HVN", @@ -6080,7 +6075,6 @@ }, "erc20:eth:Hdp.\u0444": { "address": "0x84543F868eC1b1FAC510d49d13C069f64cD2d5f9", - "hidden": 1, "links": { "Github": "https://github.com/HEDPAY", "Homepage": "http://hedpay.com" @@ -6118,7 +6112,7 @@ "erc20:eth:ICE": { "address": "0x5a84969bb663fb64F6d015DcF9F622Aedc796750", "links": { - "Homepage": "https://idice.io/" + "Homepage": "https://idice.io" }, "marketcap_usd": 0, "name": "ICE", @@ -6168,9 +6162,9 @@ "erc20:eth:ICOS": { "address": "0x014B50466590340D41307Cc54DCee990c8D58aa8", "links": { - "Homepage": "https://icos.icobox.io/" + "Homepage": "https://icos.icobox.io" }, - "marketcap_usd": 1680321, + "marketcap_usd": 1834276, "name": "ICOS", "network": "eth", "shortcut": "ICOS", @@ -6187,7 +6181,7 @@ "links": { "Homepage": "https://www.icon.foundation" }, - "marketcap_usd": 0, + "marketcap_usd": 252661135, "name": "ICON", "network": "eth", "shortcut": "ICX", @@ -6221,7 +6215,7 @@ "links": { "Homepage": "https://investfeed.com" }, - "marketcap_usd": 0, + "marketcap_usd": 2444515, "name": "InvestFeed", "network": "eth", "shortcut": "IFT", @@ -6254,7 +6248,7 @@ "address": "0x88AE96845e157558ef59e9Ff90E766E22E480390", "links": { "Github": "https://github.com/mitchellfchan/IKB", - "Homepage": "http://www.mitchellfchan.com/" + "Homepage": "http://www.mitchellfchan.com" }, "marketcap_usd": 0, "name": "IKB", @@ -6356,7 +6350,7 @@ "links": { "Homepage": "https://insights.network" }, - "marketcap_usd": 0, + "marketcap_usd": 1815725, "name": "Insights Network", "network": "eth", "shortcut": "INSTAR", @@ -6373,7 +6367,7 @@ "links": { "Homepage": "https://internxt.io" }, - "marketcap_usd": 0, + "marketcap_usd": 2262594, "name": "Internxt", "network": "eth", "shortcut": "INXT", @@ -6390,7 +6384,7 @@ "links": { "Homepage": "https://iost.io/" }, - "marketcap_usd": 0, + "marketcap_usd": 114256334, "name": "IOSToken", "network": "eth", "shortcut": "IOST", @@ -6455,13 +6449,49 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:IQN": { + "address": "0x0DB8D8b76BC361bAcbB72E2C491E06085A97Ab31", + "links": { + "Github": "https://github.com/iqeon", + "Homepage": "https://iqeon.io/" + }, + "marketcap_usd": 0, + "name": "IQeon", + "network": "eth", + "shortcut": "IQN", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "erc20:eth:IST34": { + "address": "0x0cF713b11C9b986EC40D65bD4F7fbd50F6ff2d64", + "links": { + "Github": "https://github.com/IST34Token", + "Homepage": "https://hiperteknoloji.org" + }, + "marketcap_usd": 0, + "name": "IST34 Token", + "network": "eth", + "shortcut": "IST34", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:ITC": { "address": "0x5E6b6d9aBAd9093fdc861Ea1600eBa1b355Cd940", "links": { "Github": "https://github.com/IoTChainCode", "Homepage": "https://iotchain.io/" }, - "marketcap_usd": 0, + "marketcap_usd": 11570618, "name": "IoT Chain", "network": "eth", "shortcut": "ITC", @@ -6543,27 +6573,10 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:JBX": { - "address": "0x884e3902C4d5cFA86de4aCE7A96AA91EbC25C0Ff", - "links": { - "Homepage": "https://www.jboxcoin.org" - }, - "marketcap_usd": 0, - "name": "JBX", - "network": "eth", - "shortcut": "JBX", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:JET": { "address": "0x8727c112C712c4a03371AC87a74dD6aB104Af768", "links": { - "Homepage": "https://jetcoin.io/" + "Homepage": "https://jetcoin.io" }, "marketcap_usd": 0, "name": "JET", @@ -6614,9 +6627,8 @@ }, "erc20:eth:JetCoins": { "address": "0x773450335eD4ec3DB45aF74f34F2c85348645D39", - "links": { - "Homepage": "http://www.jetcoins.trade/" - }, + "hidden": 1, + "links": {}, "marketcap_usd": 0, "name": "JetCoins", "network": "eth", @@ -6629,23 +6641,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:KC": { - "address": "0x0D6DD9f68d24EC1d5fE2174f3EC8DAB52B52BaF5", - "links": { - "Homepage": "https://www.kmcc.io" - }, - "marketcap_usd": 0, - "name": "KMCC", - "network": "eth", - "shortcut": "KC", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:KEE": { "address": "0x72D32ac1c5E66BfC5b08806271f8eEF915545164", "hidden": 1, @@ -6662,29 +6657,11 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:KEY": { - "address": "0x4CC19356f2D37338b9802aa8E8fc58B0373296E7", - "links": { - "Github": "https://github.com/bihu-id", - "Homepage": "https://selfkey.org" - }, - "marketcap_usd": 0, - "name": "SelfKey", - "network": "eth", - "shortcut": "KEY", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:KICK": { "address": "0x27695E09149AdC738A978e9A678F99E4c39e9eb9", "links": { "Github": "https://github.com/kickico", - "Homepage": "https://www.kickico.com/" + "Homepage": "https://www.kickico.com" }, "marketcap_usd": 0, "name": "KICK", @@ -6704,7 +6681,7 @@ "Github": "https://github.com/kikinteractive/kin-token", "Homepage": "https://kin.kik.com" }, - "marketcap_usd": 80460303, + "marketcap_usd": 84001995, "name": "Kin Foundation", "network": "eth", "shortcut": "KIN", @@ -6722,7 +6699,7 @@ "Github": "https://github.com/KyberNetwork", "Homepage": "https://kyber.network" }, - "marketcap_usd": 0, + "marketcap_usd": 67389590, "name": "Kyber Network", "network": "eth", "shortcut": "KNC", @@ -6758,7 +6735,7 @@ "Github": "https://github.com/Cryptense/", "Homepage": "https://kryll.io/" }, - "marketcap_usd": 0, + "marketcap_usd": 518539, "name": "Kryll", "network": "eth", "shortcut": "KRL", @@ -6793,7 +6770,7 @@ "Github": "https://github.com/latoken", "Homepage": "https://latoken.com/" }, - "marketcap_usd": 0, + "marketcap_usd": 7078045, "name": "LATOKEN", "network": "eth", "shortcut": "LA", @@ -6827,7 +6804,7 @@ "links": { "Homepage": "https://www.leadcoin.network/" }, - "marketcap_usd": 0, + "marketcap_usd": 1067444, "name": "LEADCOIN", "network": "eth", "shortcut": "LDC", @@ -6839,28 +6816,12 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:LEMO": { - "address": "0xB5AE848EdB296C21259b7467331467d2647eEcDf", - "links": { - "Github": "https://github.com/LemoFoundationLtd", - "Homepage": "https://www.lemochain.com" - }, - "marketcap_usd": 0, - "name": "Lemo", - "network": "eth", - "shortcut": "LEMO", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:LEND": { "address": "0x80fB784B7eD66730e8b1DBd9820aFD29931aab03", - "hidden": 1, - "links": {}, + "links": { + "Github": "https://github.com/ETHLend", + "Homepage": "https://ethlend.io/" + }, "marketcap_usd": 0, "name": "EHTLend", "network": "eth", @@ -6947,7 +6908,7 @@ "links": { "Homepage": "http://www.lifelabs.io" }, - "marketcap_usd": 3016175, + "marketcap_usd": 2913824, "name": "LIFE", "network": "eth", "shortcut": "LIFE", @@ -6976,31 +6937,13 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:LINK Platform": { - "address": "0xE2E6D4BE086c6938B53B22144855eef674281639", + "erc20:eth:LIVE": { + "address": "0x24A77c1F17C547105E14813e517be06b0040aa76", "links": { - "Github": "https://github.com/ethlink", - "Homepage": "https://ethereum.link" + "Homepage": "https://livestars.io" }, "marketcap_usd": 0, - "name": "Link Platform", - "network": "eth", - "shortcut": "LINK Platform", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, - "erc20:eth:LIVE": { - "address": "0x24A77c1F17C547105E14813e517be06b0040aa76", - "links": { - "Homepage": "https://livestars.io" - }, - "marketcap_usd": 0, - "name": "LIVE Token", + "name": "LIVE Token", "network": "eth", "shortcut": "LIVE", "t1_enabled": "yes", @@ -7011,49 +6954,13 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:LNC": { - "address": "0x63e634330A20150DbB61B15648bC73855d6CCF07", - "links": { - "Github": "https://github.com/Blocklancer/Blocklancer-Contracts", - "Homepage": "https://blocklancer.net" - }, - "marketcap_usd": 0, - "name": "Lancer Token", - "network": "eth", - "shortcut": "LNC", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, - "erc20:eth:LNC-Linker Coin": { - "address": "0x6BEB418Fc6E1958204aC8baddCf109B8E9694966", - "links": { - "Github": "https://github.com/linkercoinfoundation", - "Homepage": "https://www.linkercoin.com/en" - }, - "marketcap_usd": 0, - "name": "Linker Coin", - "network": "eth", - "shortcut": "LNC-Linker Coin", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:LND": { "address": "0x0947b0e6D821378805c9598291385CE7c791A6B2", "links": { "Github": "https://github.com/lendingblock", "Homepage": "https://lendingblock.com" }, - "marketcap_usd": 0, + "marketcap_usd": 1461818, "name": "Lendingblock", "network": "eth", "shortcut": "LND", @@ -7070,7 +6977,7 @@ "links": { "Homepage": "https://LockChain.co" }, - "marketcap_usd": 0, + "marketcap_usd": 5203577, "name": "LockChain", "network": "eth", "shortcut": "LOC", @@ -7088,7 +6995,7 @@ "Github": "http://github.com/locipro/loci-coin-sale", "Homepage": "https://locipro.com" }, - "marketcap_usd": 0, + "marketcap_usd": 1790128, "name": "LOCIcoin", "network": "eth", "shortcut": "LOCI", @@ -7134,6 +7041,23 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:LOOK": { + "address": "0x253C7dd074f4BaCb305387F922225A4f737C08bd", + "links": { + "Homepage": "https://lookrev.com" + }, + "marketcap_usd": 0, + "name": "LookRev", + "network": "eth", + "shortcut": "LOOK", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:LOOM": { "address": "0xA4e8C3Ec456107eA67d3075bF9e3DF3A75823DB0", "links": { @@ -7152,6 +7076,24 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:LOVE": { + "address": "0x5a276Aeb77bCfDAc8Ac6f31BBC7416AE1A85eEF2", + "hidden": 1, + "links": { + "Github": "https://github.com/GNSPS" + }, + "marketcap_usd": 0, + "name": "Love", + "network": "eth", + "shortcut": "LOVE", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:LPT": { "address": "0x58b6A8A3302369DAEc383334672404Ee733aB239", "links": { @@ -7243,7 +7185,7 @@ "address": "0xfa05A73FfE78ef8f1a739473e462c54bae6567D9", "links": { "Github": "https://github.com/lunyr", - "Homepage": "https://lunyr.com/" + "Homepage": "https://lunyr.com" }, "marketcap_usd": 0, "name": "LUN", @@ -7295,7 +7237,7 @@ "erc20:eth:MAD": { "address": "0x5B09A0371C1DA44A8E24D36Bf5DEb1141a84d875", "links": { - "Homepage": "https://madnetwork.io/" + "Homepage": "https://madnetwork.io" }, "marketcap_usd": 0, "name": "MAD", @@ -7313,7 +7255,7 @@ "address": "0xe25bCec5D3801cE3a794079BF94adF1B8cCD802D", "links": { "Github": "https://github.com/MatrixAINetwork", - "Homepage": "https://www.matrix.io/" + "Homepage": "https://www.matrix.io" }, "marketcap_usd": 0, "name": "MAN", @@ -7368,7 +7310,7 @@ "Github": "https://github.com/theembermine", "Homepage": "https://embermine.com/" }, - "marketcap_usd": 0, + "marketcap_usd": 196722, "name": "Embers", "network": "eth", "shortcut": "MBRS", @@ -7382,10 +7324,9 @@ }, "erc20:eth:MCAP": { "address": "0x93E682107d1E9defB0b5ee701C71707a4B2E46Bc", - "links": { - "Homepage": "https://www.mcaplabs.com/" - }, - "marketcap_usd": 241270, + "hidden": 1, + "links": {}, + "marketcap_usd": 284290, "name": "MCAP", "network": "eth", "shortcut": "MCAP", @@ -7403,7 +7344,7 @@ "Github": "https://github.com/musiconomi/", "Homepage": "https://musiconomi.com/" }, - "marketcap_usd": 0, + "marketcap_usd": 235189, "name": "Musiconomi", "network": "eth", "shortcut": "MCI", @@ -7418,9 +7359,9 @@ "erc20:eth:MCO": { "address": "0xB63B606Ac810a52cCa15e44bB630fd42D8d1d83d", "links": { - "Homepage": "https://mona.co/" + "Homepage": "https://mona.co" }, - "marketcap_usd": 66817500, + "marketcap_usd": 67092556, "name": "MCO", "network": "eth", "shortcut": "MCO", @@ -7503,66 +7444,50 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:MGO": { - "address": "0x40395044Ac3c0C57051906dA938B54BD6557F212", + "erc20:eth:MFT": { + "address": "0xDF2C7238198Ad8B389666574f2d8bc411A4b7428", "links": { - "Homepage": "https://gamecredits.com/mobilego/" + "Github": "https://github.com/MainframeHQ", + "Homepage": "https://mainframe.com" }, "marketcap_usd": 0, - "name": "MGO", - "network": "eth", - "shortcut": "MGO", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, - "erc20:eth:MIT": { - "address": "0xe23cd160761f63FC3a1cF78Aa034b6cdF97d3E0C", - "hidden": 1, - "links": {}, - "marketcap_usd": 0, - "name": "MIT", + "name": "Mainframe Token", "network": "eth", - "shortcut": "MIT", - "t1_enabled": "yes", - "t2_enabled": "yes", + "shortcut": "MFT", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:MIT (Mychatcoin)": { - "address": "0xAd8DD4c725dE1D31b9E8F8D146089e9DC6882093", + "erc20:eth:MFTU": { + "address": "0x05D412CE18F24040bB3Fa45CF2C69e506586D8e8", "links": { - "Homepage": "https://mychatcoin.com" + "Homepage": "https://mftu.net" }, - "marketcap_usd": 0, - "name": "Mychatcoin", + "marketcap_usd": 67294, + "name": "Mainstream For The Underground", "network": "eth", - "shortcut": "MIT (Mychatcoin)", - "t1_enabled": "yes", - "t2_enabled": "yes", + "shortcut": "MFTU", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:MKR": { - "address": "0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2", + "erc20:eth:MGO": { + "address": "0x40395044Ac3c0C57051906dA938B54BD6557F212", "links": { - "Github": "https://github.com/makerdao", - "Homepage": "https://makerdao.com" + "Homepage": "https://gamecredits.com/mobilego" }, "marketcap_usd": 0, - "name": "MakerDAO", + "name": "MGO", "network": "eth", - "shortcut": "MKR", + "shortcut": "MGO", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -7589,27 +7514,10 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:MLN": { - "address": "0xBEB9eF514a379B997e0798FDcC901Ee474B6D9A1", - "links": { - "Homepage": "https://melonport.com" - }, - "marketcap_usd": 0, - "name": "Melonport", - "network": "eth", - "shortcut": "MLN", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:MNE": { "address": "0x1a95B271B0535D15fa49932Daba31BA612b52946", "links": { - "Homepage": "https://minereum.com/" + "Homepage": "https://minereum.com" }, "marketcap_usd": 0, "name": "MNE", @@ -7665,7 +7573,7 @@ "Github": "https://github.com/modum-io", "Homepage": "https://modum.io" }, - "marketcap_usd": 0, + "marketcap_usd": 21046716, "name": "Modum", "network": "eth", "shortcut": "MOD", @@ -7734,7 +7642,7 @@ "links": { "Homepage": "https://mothership.cx" }, - "marketcap_usd": 0, + "marketcap_usd": 12972327, "name": "Mothership", "network": "eth", "shortcut": "MSP", @@ -7746,30 +7654,12 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:MTC": { - "address": "0x905E337c6c8645263D3521205Aa37bf4d034e745", - "links": { - "Github": "https://github.com/Docademic", - "Homepage": "https://ico.docademic.com/" - }, - "marketcap_usd": 0, - "name": "Medical Token Currency", - "network": "eth", - "shortcut": "MTC", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:MTH": { "address": "0xaF4DcE16Da2877f8c9e00544c93B62Ac40631F16", "links": { "Homepage": "http://www.monetha.io" }, - "marketcap_usd": 0, + "marketcap_usd": 4592888, "name": "Monetha", "network": "eth", "shortcut": "MTH", @@ -7889,7 +7779,7 @@ "Github": "https://github.com/Merculet", "Homepage": "https://www.merculet.io" }, - "marketcap_usd": 0, + "marketcap_usd": 3215651, "name": "Merculet", "network": "eth", "shortcut": "MVP", @@ -7939,7 +7829,7 @@ "links": { "Homepage": "https://mysterium.network" }, - "marketcap_usd": 0, + "marketcap_usd": 2448689, "name": "Mysterium", "network": "eth", "shortcut": "MYST", @@ -7974,7 +7864,7 @@ "Github": "https://github.com/NANJ-COIN", "Homepage": "https://nanjcoin.com/" }, - "marketcap_usd": 0, + "marketcap_usd": 13822722, "name": "NANJCOIN", "network": "eth", "shortcut": "NANJ", @@ -8028,7 +7918,7 @@ "Github": "https://github.com/polyswarm", "Homepage": "https://polyswarm.io" }, - "marketcap_usd": 0, + "marketcap_usd": 23345676, "name": "Nectar", "network": "eth", "shortcut": "NCT", @@ -8045,7 +7935,7 @@ "links": { "Homepage": "https://neverdie.com" }, - "marketcap_usd": 0, + "marketcap_usd": 1408408, "name": "Neverdie", "network": "eth", "shortcut": "NDC", @@ -8080,7 +7970,7 @@ "links": { "Homepage": "https://nimiq.com" }, - "marketcap_usd": 0, + "marketcap_usd": 2846290, "name": "NIMIQ", "network": "eth", "shortcut": "NET", @@ -8096,7 +7986,7 @@ "address": "0xA823E6722006afe99E91c30FF5295052fe6b8E32", "links": { "Github": "https://github.com/neufund", - "Homepage": "https://neufund.org/" + "Homepage": "https://neufund.org" }, "marketcap_usd": 0, "name": "NEU Fund", @@ -8163,22 +8053,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:NONE": { - "address": "0x643B6870beabee941B9260a0A878bcF4A61Fb0f1", - "hidden": 1, - "links": {}, - "marketcap_usd": 0, - "name": "None", - "network": "eth", - "shortcut": "NONE", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:NOX": { "address": "0xeC46f8207D766012454c408De210BCBc2243E71c", "links": { @@ -8203,7 +8077,7 @@ "Github": "https://github.com/NperProject", "Homepage": "https://nper.io" }, - "marketcap_usd": 1585502, + "marketcap_usd": 1946971, "name": "NPER", "network": "eth", "shortcut": "NPER", @@ -8233,32 +8107,32 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:NULS": { - "address": "0xB91318F35Bdb262E9423Bc7c7c2A3A93DD93C92C", + "erc20:eth:NUG": { + "address": "0x245ef47D4d0505ECF3Ac463F4d81f41ADE8f1fd1", "links": { - "Homepage": "https://nuls.io" + "Homepage": "https://nuggets.life/" }, - "marketcap_usd": 54157954, - "name": "NULS", + "marketcap_usd": 0, + "name": "Nuggets Token", "network": "eth", - "shortcut": "NULS", - "t1_enabled": "yes", - "t2_enabled": "yes", + "shortcut": "NUG", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:NXX": { - "address": "0x7627de4B93263a6a7570b8dAfa64bae812e5c394", + "erc20:eth:NULS": { + "address": "0xB91318F35Bdb262E9423Bc7c7c2A3A93DD93C92C", "links": { - "Homepage": "https://www.nexxuscoin.com" + "Homepage": "https://nuls.io" }, - "marketcap_usd": 0, - "name": "NXX", + "marketcap_usd": 57534322, + "name": "NULS", "network": "eth", - "shortcut": "NXX", + "shortcut": "NULS", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -8267,15 +8141,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:NXX OLD": { - "address": "0x5c6183d10A00CD747a6Dbb5F658aD514383e9419", + "erc20:eth:NXX": { + "address": "0x7627de4B93263a6a7570b8dAfa64bae812e5c394", "links": { "Homepage": "https://www.nexxuscoin.com" }, "marketcap_usd": 0, - "name": "NXX OLD", + "name": "NXX", "network": "eth", - "shortcut": "NXX OLD", + "shortcut": "NXX", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -8289,7 +8163,7 @@ "links": { "Homepage": "https://beyond-the-void.net" }, - "marketcap_usd": 0, + "marketcap_usd": 1502535, "name": "Nexium", "network": "eth", "shortcut": "NxC", @@ -8323,7 +8197,7 @@ "links": { "Homepage": "https://www.openanx.org/en" }, - "marketcap_usd": 3974363, + "marketcap_usd": 4270504, "name": "OAX", "network": "eth", "shortcut": "OAX", @@ -8353,18 +8227,18 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:OHNI": { - "address": "0x6f539a9456A5BCb6334A1A41207c3788f5825207", + "erc20:eth:ODE": { + "address": "0xbf52F2ab39e26E0951d2a02b49B7702aBe30406a", "links": { - "Github": "ohnicoin", - "Homepage": "http://ohni.us" + "Github": "https://github.com/odemio", + "Homepage": "https://odem.io/" }, "marketcap_usd": 0, - "name": "Ohni", + "name": "ODEM Token", "network": "eth", - "shortcut": "OHNI", - "t1_enabled": "yes", - "t2_enabled": "yes", + "shortcut": "ODE", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", @@ -8407,11 +8281,29 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:OLT": { + "address": "0x64A60493D888728Cf42616e034a0dfEAe38EFCF0", + "links": { + "Github": "https://github.com/Oneledger", + "Homepage": "https://oneledger.io" + }, + "marketcap_usd": 0, + "name": "OneLedger Token", + "network": "eth", + "shortcut": "OLT", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:OMG": { "address": "0xd26114cd6EE289AccF82350c8d8487fedB8A0C07", "links": { "Github": "https://github.com/omisego", - "Homepage": "https://omisego.network/" + "Homepage": "https://omisego.network" }, "marketcap_usd": 0, "name": "OMG", @@ -8425,33 +8317,33 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:ONEK": { - "address": "0xB23be73573bC7E03DB6e5dfc62405368716d28a8", + "erc20:eth:OMT": { + "address": "0x047187e53477be70DBe8Ea5B799318f2e165052F", "links": { - "Homepage": "http://onek.one" + "Github": "https://github.com/OTCMAKER/OMT", + "Homepage": "https://www.otcmaker.com" }, "marketcap_usd": 0, - "name": "One K Token", + "name": "OTCMAKER Token", "network": "eth", - "shortcut": "ONEK", - "t1_enabled": "yes", - "t2_enabled": "yes", + "shortcut": "OMT", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:OPEN": { - "address": "0x69c4BB240cF05D51eeab6985Bab35527d04a8C64", + "erc20:eth:ONEK": { + "address": "0xB23be73573bC7E03DB6e5dfc62405368716d28a8", "links": { - "Github": "https://github.com/OpenMoneyDigital", - "Homepage": "https://openfuture.io" + "Homepage": "http://onek.one" }, "marketcap_usd": 0, - "name": "OPEN", + "name": "One K Token", "network": "eth", - "shortcut": "OPEN", + "shortcut": "ONEK", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -8495,13 +8387,31 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:ORCA": { + "address": "0x6F59e0461Ae5E2799F1fB3847f05a63B16d0DbF8", + "links": { + "Github": "https://github.com/orcaalliance", + "Homepage": "https://www.orcaalliance.eu" + }, + "marketcap_usd": 0, + "name": "ORCA Token", + "network": "eth", + "shortcut": "ORCA", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:OST": { "address": "0x2C4e8f2D746113d0696cE89B35F0d8bF88E0AEcA", "links": { "Github": "https://github.com/OpenSTFoundation", "Homepage": "https://simpletoken.org" }, - "marketcap_usd": 9783116, + "marketcap_usd": 10613704, "name": "Simple Token 'OST'", "network": "eth", "shortcut": "OST", @@ -8513,6 +8423,24 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:OWN": { + "address": "0x170b275CEd089FffAEBFe927F445a350ED9160DC", + "links": { + "Github": "https://github.com/owndata", + "Homepage": "https://owndata.network" + }, + "marketcap_usd": 0, + "name": "OWNDATA", + "network": "eth", + "shortcut": "OWN", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:Ox Fina": { "address": "0x65A15014964F2102Ff58647e16a16a6B9E14bCF6", "links": { @@ -8537,7 +8465,7 @@ "Github": "https://github.com/policypalnet", "Homepage": "https://www.policypal.network" }, - "marketcap_usd": 0, + "marketcap_usd": 2141433, "name": "PolicyPal Network", "network": "eth", "shortcut": "PAL", @@ -8567,6 +8495,23 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:PASS": { + "address": "0x77761e63C05aeE6648FDaeaa9B94248351AF9bCd", + "links": { + "Homepage": "http://www.wisepass.co" + }, + "marketcap_usd": 0, + "name": "PASS Token", + "network": "eth", + "shortcut": "PASS", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:PAT": { "address": "0xBB1fA4FdEB3459733bF67EbC6f893003fA976a82", "links": { @@ -8623,9 +8568,9 @@ "erc20:eth:PAY": { "address": "0xB97048628DB6B661D4C2aA833e95Dbe1A905B280", "links": { - "Homepage": "http://www.tenx.tech/" + "Homepage": "http://www.tenx.tech" }, - "marketcap_usd": 0, + "marketcap_usd": 62355151, "name": "TenX", "network": "eth", "shortcut": "PAY", @@ -8694,7 +8639,7 @@ "Github": "https://github.com/PeculiumPCL/Peculium", "Homepage": "https://peculium.io" }, - "marketcap_usd": 0, + "marketcap_usd": 2664106, "name": "Peculium", "network": "eth", "shortcut": "PCL", @@ -8724,14 +8669,30 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:PET": { - "address": "0x5884969Ec0480556E11d119980136a4C17eDDEd1", - "links": { - "Github": "https://github.com/Pethereum", - "Homepage": "https://pethereum.org/" - }, + "erc20:eth:PEG": { + "address": "0x8Ae56a6850a7cbeaC3c3Ab2cB311e7620167eAC8", + "hidden": 1, + "links": {}, "marketcap_usd": 0, - "name": "PETHEREUM", + "name": "PEG Network Token", + "network": "eth", + "shortcut": "PEG", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "erc20:eth:PET": { + "address": "0x5884969Ec0480556E11d119980136a4C17eDDEd1", + "links": { + "Github": "https://github.com/Pethereum", + "Homepage": "https://pethereum.org/" + }, + "marketcap_usd": 0, + "name": "PETHEREUM", "network": "eth", "shortcut": "PET", "t1_enabled": "yes", @@ -8814,7 +8775,7 @@ "erc20:eth:PLASMA": { "address": "0x59416A25628A76b4730eC51486114c32E0B582A1", "links": { - "Homepage": "https://plasma.io/" + "Homepage": "https://plasma.io" }, "marketcap_usd": 0, "name": "PLASMA", @@ -8828,29 +8789,12 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:PLAY": { - "address": "0xE477292f1B3268687A29376116B0ED27A9c76170", - "links": { - "Homepage": "http://www.herocoin.io" - }, - "marketcap_usd": 0, - "name": "HeroCoin", - "network": "eth", - "shortcut": "PLAY", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:PLBT": { "address": "0x0AfFa06e7Fbe5bC9a764C979aA66E8256A631f02", "links": { "Homepage": "https://polybius.io" }, - "marketcap_usd": 0, + "marketcap_usd": 6461014, "name": "Polybius", "network": "eth", "shortcut": "PLBT", @@ -8880,6 +8824,24 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:PLS": { + "address": "0xe43ac1714F7394173b15E7CfF31A63d523Ce4fB9", + "links": { + "Github": "https://github.com/bitsuperlab", + "Homepage": "https://dacplay.org" + }, + "marketcap_usd": 0, + "name": "DACPLAY Token", + "network": "eth", + "shortcut": "PLS", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:PLU": { "address": "0xD8912C10681D8B21Fd3742244f44658dBA12264E", "links": { @@ -8936,7 +8898,7 @@ "links": { "Homepage": "https://polymath.network" }, - "marketcap_usd": 0, + "marketcap_usd": 50284550, "name": "Polymath Network", "network": "eth", "shortcut": "POLY", @@ -8971,7 +8933,7 @@ "Github": "https://github.com/PoSToken", "Homepage": "https://postoken.org" }, - "marketcap_usd": 0, + "marketcap_usd": 38380, "name": "PoSToken", "network": "eth", "shortcut": "POS", @@ -9005,7 +8967,7 @@ "links": { "Homepage": "https://www.paypie.com" }, - "marketcap_usd": 0, + "marketcap_usd": 8815917, "name": "PayPie", "network": "eth", "shortcut": "PPP", @@ -9022,7 +8984,7 @@ "links": { "Homepage": "https://populous.co" }, - "marketcap_usd": 0, + "marketcap_usd": 171844299, "name": "Populous", "network": "eth", "shortcut": "PPT", @@ -9039,7 +9001,7 @@ "links": { "Homepage": "https://presearch.io" }, - "marketcap_usd": 0, + "marketcap_usd": 14026316, "name": "Presearch", "network": "eth", "shortcut": "PRE", @@ -9092,7 +9054,7 @@ "links": { "Homepage": "https://propy.com" }, - "marketcap_usd": 0, + "marketcap_usd": 6902460, "name": "Propy", "network": "eth", "shortcut": "PRO", @@ -9121,24 +9083,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:PRPS": { - "address": "0x7641b2Ca9DDD58adDf6e3381c1F994Aac5f1A32f", - "links": { - "Github": "https://github.com/nionis/purpose", - "Homepage": "https://prps.io" - }, - "marketcap_usd": 0, - "name": "Purpose", - "network": "eth", - "shortcut": "PRPS", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:PRS": { "address": "0x163733bcc28dbf26B41a8CfA83e369b5B3af741b", "links": { @@ -9192,28 +9136,10 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:PTC": { - "address": "0x2a8E98e256f32259b5E5Cb55Dd63C8e891950666", - "links": { - "Github": "https://github.com/ParrotCoin", - "Homepage": "http://parrotcoin.club" - }, - "marketcap_usd": 0, - "name": "ParrotCoin", - "network": "eth", - "shortcut": "PTC", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:PTOY": { "address": "0x8Ae4BF2C33a8e667de34B54938B0ccD03Eb8CC06", "links": { - "Homepage": "https://patientory.com/" + "Homepage": "https://patientory.com" }, "marketcap_usd": 0, "name": "PTOY", @@ -9263,6 +9189,24 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:PURC": { + "address": "0xe25ff6Eb959BCE67975778e46A47750C243B6B99", + "links": { + "Github": "https://github.com/seanyc99/PureCarbon-Smart-Contract", + "Homepage": "https://purecarbon.io" + }, + "marketcap_usd": 0, + "name": "PureCarbon", + "network": "eth", + "shortcut": "PURC", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:PXT": { "address": "0xc14830E53aA344E8c14603A91229A0b925b0B262", "links": { @@ -9285,7 +9229,7 @@ "links": { "Homepage": "https://liquid.plus" }, - "marketcap_usd": 61957775, + "marketcap_usd": 72836470, "name": "QASH", "network": "eth", "shortcut": "QASH", @@ -9332,6 +9276,24 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:QNT": { + "address": "0x4a220E6096B25EADb88358cb44068A3248254675", + "links": { + "Github": "https://github.com/quantnetwork", + "Homepage": "https://www.quant.network/" + }, + "marketcap_usd": 0, + "name": "Quant", + "network": "eth", + "shortcut": "QNT", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:QRG": { "address": "0xFFAA5ffc455d9131f8A2713A741fD1960330508B", "links": { @@ -9353,7 +9315,7 @@ "address": "0x697beac28B09E122C4332D163985e8a73121b97F", "links": { "Github": "https://github.com/theQRL", - "Homepage": "https://theqrl.org/" + "Homepage": "https://theqrl.org" }, "marketcap_usd": 0, "name": "QRL", @@ -9409,7 +9371,7 @@ "Github": "https://github.com/qtumproject", "Homepage": "https://qtum.org/" }, - "marketcap_usd": 362621157, + "marketcap_usd": 366378124, "name": "Qtum", "network": "eth", "shortcut": "QTUM", @@ -9461,9 +9423,9 @@ "address": "0xF970b8E36e23F7fC3FD752EeA86f8Be8D83375A6", "links": { "Github": "https://github.com/ripio/rcn-token", - "Homepage": "https://ripiocredit.network/" + "Homepage": "https://ripiocredit.network" }, - "marketcap_usd": 0, + "marketcap_usd": 9254671, "name": "Ripio Credit Network", "network": "eth", "shortcut": "RCN", @@ -9492,24 +9454,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:RDN": { - "address": "0x255Aa6DF07540Cb5d3d297f0D0D4D84cb52bc8e6", - "links": { - "Github": "https://github.com/raiden-network/raiden/", - "Homepage": "https://raiden.network" - }, - "marketcap_usd": 0, - "name": "Raiden Network", - "network": "eth", - "shortcut": "RDN", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:REA": { "address": "0x767bA2915EC344015a7938E3eEDfeC2785195D05", "links": { @@ -9532,7 +9476,7 @@ "links": { "Homepage": "https://www.rebellious.io" }, - "marketcap_usd": 3144506, + "marketcap_usd": 3233934, "name": "Rebellious", "network": "eth", "shortcut": "REBL", @@ -9550,7 +9494,7 @@ "Github": "https://github.com/red", "Homepage": "https://ico.red-lang.org" }, - "marketcap_usd": 1775767, + "marketcap_usd": 1688379, "name": "Red Community Token", "network": "eth", "shortcut": "RED", @@ -9562,33 +9506,34 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:REN": { - "address": "0x408e41876cCCDC0F92210600ef50372656052a38", + "erc20:eth:REDC": { + "address": "0xB563300A3BAc79FC09B93b6F84CE0d4465A2AC27", "links": { - "Github": "https://github.com/republicprotocol", - "Homepage": "https://republicprotocol.com" + "Github": "https://github.com/Redcabllc", + "Homepage": "https://redcab.io" }, "marketcap_usd": 0, - "name": "Republic Token", + "name": "RedCab", "network": "eth", - "shortcut": "REN", - "t1_enabled": "yes", - "t2_enabled": "yes", + "shortcut": "REDC", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:REP": { - "address": "0xE94327D07Fc17907b4DB788E5aDf2ed424adDff6", + "erc20:eth:REN": { + "address": "0x408e41876cCCDC0F92210600ef50372656052a38", "links": { - "Homepage": "https://augur.net" + "Github": "https://github.com/republicprotocol", + "Homepage": "https://republicprotocol.com" }, "marketcap_usd": 0, - "name": "Augur", + "name": "Republic Token", "network": "eth", - "shortcut": "REP", + "shortcut": "REN", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -9602,7 +9547,7 @@ "links": { "Homepage": "https://request.network" }, - "marketcap_usd": 0, + "marketcap_usd": 29734347, "name": "Request Network", "network": "eth", "shortcut": "REQ", @@ -9618,7 +9563,7 @@ "address": "0xf05a9382A4C3F29E2784502754293D88b835109C", "links": { "Github": "https://github.com/rexmls/RexToken", - "Homepage": "https://imbrex.io/" + "Homepage": "https://imbrex.io" }, "marketcap_usd": 0, "name": "REX", @@ -9637,7 +9582,7 @@ "links": { "Homepage": "https://refereum.com" }, - "marketcap_usd": 0, + "marketcap_usd": 10158717, "name": "Refereum", "network": "eth", "shortcut": "RFR", @@ -9649,6 +9594,23 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:RING": { + "address": "0x86E56f3c89a14528858e58B3De48c074538BAf2c", + "links": { + "Homepage": "https://www.evolution.land/" + }, + "marketcap_usd": 0, + "name": "Evolution Land Global Token", + "network": "eth", + "shortcut": "RING", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:RIPT": { "address": "0xdd007278B667F6bef52fD0a4c23604aA1f96039a", "links": { @@ -9672,7 +9634,7 @@ "links": { "Homepage": "http://crowdsale.iex.ec" }, - "marketcap_usd": 29800533, + "marketcap_usd": 35286600, "name": "IEx.ec", "network": "eth", "shortcut": "RLC", @@ -9688,7 +9650,7 @@ "address": "0xcCeD5B8288086BE8c38E23567e684C3740be4D48", "links": { "Github": "https://github.com/Smartroulette", - "Homepage": "https://smartplay.tech/" + "Homepage": "https://smartplay.tech" }, "marketcap_usd": 0, "name": "RLT", @@ -9724,7 +9686,7 @@ "links": { "Homepage": "http://www.relex.io" }, - "marketcap_usd": 0, + "marketcap_usd": 2059935, "name": "Relex", "network": "eth", "shortcut": "RLX", @@ -9759,7 +9721,7 @@ "Github": "https://github.com/rocketico", "Homepage": "https://rocketico.io" }, - "marketcap_usd": 19369120, + "marketcap_usd": 21680674, "name": "Rocket Token", "network": "eth", "shortcut": "ROCK", @@ -9790,9 +9752,8 @@ }, "erc20:eth:ROUND": { "address": "0x4993CB95c7443bdC06155c5f5688Be9D8f6999a5", - "links": { - "Homepage": "http://roundcoin.org/" - }, + "hidden": 1, + "links": {}, "marketcap_usd": 0, "name": "ROUND", "network": "eth", @@ -9862,7 +9823,7 @@ "links": { "Homepage": "https://rivetzintl.com" }, - "marketcap_usd": 0, + "marketcap_usd": 3259734, "name": "Rivetz", "network": "eth", "shortcut": "RVT", @@ -9913,7 +9874,7 @@ "links": { "Homepage": "https://saltlending.com" }, - "marketcap_usd": 29290084, + "marketcap_usd": 30970033, "name": "Salt Lending Token", "network": "eth", "shortcut": "SALT", @@ -9930,7 +9891,7 @@ "links": { "Homepage": "https://santiment.net" }, - "marketcap_usd": 0, + "marketcap_usd": 37144371, "name": "Santiment", "network": "eth", "shortcut": "SAN", @@ -9981,7 +9942,7 @@ "links": { "Homepage": "https://sensay.it" }, - "marketcap_usd": 1891609, + "marketcap_usd": 1909749, "name": "Sensay", "network": "eth", "shortcut": "SENSE", @@ -10045,27 +10006,10 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:SGT": { - "address": "0xd248B0D48E44aaF9c49aea0312be7E13a6dc1468", - "links": { - "Homepage": "https://sgt.selfieyo.com" - }, - "marketcap_usd": 0, - "name": "SGT", - "network": "eth", - "shortcut": "SGT", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:SHIT": { "address": "0xEF2E9966eb61BB494E5375d5Df8d67B7dB8A780D", "links": { - "Homepage": "https://www.shitcoin.io/" + "Homepage": "https://www.shitcoin.io" }, "marketcap_usd": 0, "name": "SHIT", @@ -10118,7 +10062,7 @@ "address": "0x2bDC0D42996017fCe214b21607a515DA41A9E0C5", "links": { "Github": "https://github.com/Steamtradenet/smart-contract", - "Homepage": "https://skincoin.org/" + "Homepage": "https://skincoin.org" }, "marketcap_usd": 0, "name": "SKIN", @@ -10166,30 +10110,12 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:SKRP": { - "address": "0x6E34d8d84764D40f6D7b39cd569Fd017bF53177D", - "links": { - "Github": "https://github.com/SkrapsIO", - "Homepage": "https://skraps.io" - }, - "marketcap_usd": 0, - "name": "Skraps", - "network": "eth", - "shortcut": "SKRP", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:SLT": { "address": "0x7A5fF295Dc8239d5C2374E4D894202aAF029Cab6", "links": { "Homepage": "http://smartlands.io" }, - "marketcap_usd": 0, + "marketcap_usd": 7817290, "name": "Smartlands", "network": "eth", "shortcut": "SLT", @@ -10201,36 +10127,18 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:SMART": { - "address": "0x6F6DEb5db0C4994A8283A01D6CFeEB27Fc3bBe9C", - "links": { - "Github": "https://github.com/SmartBillions/SmartBillions", - "Homepage": "http://smartbillions.com" - }, - "marketcap_usd": 0, - "name": "Smart Billions", - "network": "eth", - "shortcut": "SMART", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, - "erc20:eth:SMT": { - "address": "0x2dCFAAc11c9EebD8C6C42103Fe9e2a6AD237aF27", + "erc20:eth:SLY": { + "address": "0x7928c8aBF1F74eF9F96D4D0a44e3b4209d360785", "links": { - "Github": "https://github.com/SmartMeshFoundation", - "Homepage": "http://smartnode.org" + "Github": "https://github.com/SELFLLERY", + "Homepage": "https://selfllery.com/" }, "marketcap_usd": 0, - "name": "SmartMesh", + "name": "Selfllery", "network": "eth", - "shortcut": "SMT", - "t1_enabled": "yes", - "t2_enabled": "yes", + "shortcut": "SLY", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", @@ -10294,7 +10202,7 @@ "links": { "Homepage": "https://singulardtv.com" }, - "marketcap_usd": 0, + "marketcap_usd": 13356599, "name": "SingularDTV", "network": "eth", "shortcut": "SNGLS", @@ -10327,7 +10235,7 @@ "address": "0x983F6d60db79ea8cA4eB9968C6aFf8cfA04B3c63", "links": { "Github": "https://github.com/sonm-io", - "Homepage": "https://sonm.com/" + "Homepage": "https://sonm.com" }, "marketcap_usd": 0, "name": "SNM", @@ -10397,7 +10305,7 @@ "links": { "Homepage": "https://spankchain.com" }, - "marketcap_usd": 0, + "marketcap_usd": 13755901, "name": "SpankChain", "network": "eth", "shortcut": "SPANK", @@ -10495,16 +10403,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:SS": { - "address": "0xbbFF862d906E348E9946Bfb2132ecB157Da3D4b4", + "erc20:eth:SSH": { + "address": "0x6e2050CBFB3eD8A4d39b64cC9f47E711a03a5a89", "links": { - "Github": "https://github.com/Sharders", - "Homepage": "https://sharder.org" + "Homepage": "https://www.stream.space" }, "marketcap_usd": 0, - "name": "Sharder", + "name": "StreamShares", "network": "eth", - "shortcut": "SS", + "shortcut": "SSH", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -10513,17 +10420,17 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:SSH": { - "address": "0x6e2050CBFB3eD8A4d39b64cC9f47E711a03a5a89", + "erc20:eth:STABIT": { + "address": "0x4A89cD486fA996ad50c0a63C35c78702f5422a50", "links": { - "Homepage": "https://www.stream.space/" + "Homepage": "https://stabitcoin.com/" }, "marketcap_usd": 0, - "name": "StreamShares", + "name": "StabitCoin", "network": "eth", - "shortcut": "SSH", - "t1_enabled": "yes", - "t2_enabled": "yes", + "shortcut": "STABIT", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", @@ -10587,7 +10494,7 @@ "links": { "Homepage": "https://stktoken.com" }, - "marketcap_usd": 3721179, + "marketcap_usd": 4352499, "name": "STK Token", "network": "eth", "shortcut": "STK", @@ -10619,10 +10526,10 @@ "erc20:eth:STORJ": { "address": "0xB64ef51C888972c908CFacf59B47C1AfBC0Ab8aC", "links": { - "Github": "https://github.com/Storj/", - "Homepage": "https://storj.io/" + "Github": "https://github.com/Storj", + "Homepage": "https://storj.io" }, - "marketcap_usd": 36500673, + "marketcap_usd": 38370023, "name": "STORJ", "network": "eth", "shortcut": "STORJ", @@ -10639,7 +10546,7 @@ "links": { "Homepage": "https://www.stormtoken.com" }, - "marketcap_usd": 34397209, + "marketcap_usd": 36387909, "name": "Storm Token", "network": "eth", "shortcut": "STORM", @@ -10675,7 +10582,7 @@ "Github": "https://github.com/Storiqa/", "Homepage": "https://storiqa.com" }, - "marketcap_usd": 0, + "marketcap_usd": 14984412, "name": "Storiqa", "network": "eth", "shortcut": "STQ", @@ -10691,7 +10598,7 @@ "address": "0x46492473755e8dF960F8034877F61732D718CE96", "links": { "Github": "https://github.com/sprux/BackToEarth", - "Homepage": "https://backto.earth/" + "Homepage": "https://backto.earth" }, "marketcap_usd": 0, "name": "STRC", @@ -10728,7 +10635,7 @@ "links": { "Homepage": "https://substratum.net" }, - "marketcap_usd": 0, + "marketcap_usd": 56199828, "name": "Substratum", "network": "eth", "shortcut": "SUB", @@ -10920,7 +10827,7 @@ "Github": "https://github.com/telcoin", "Homepage": "https://www.telco.in" }, - "marketcap_usd": 0, + "marketcap_usd": 18839716, "name": "Telcoin", "network": "eth", "shortcut": "TEL", @@ -10938,7 +10845,7 @@ "Github": "https://github.com/TrueFlip", "Homepage": "https://trueflip.io" }, - "marketcap_usd": 0, + "marketcap_usd": 3253929, "name": "TrueFlip", "network": "eth", "shortcut": "TFL", @@ -10955,7 +10862,7 @@ "links": { "Homepage": "https://www.thetatoken.org/" }, - "marketcap_usd": 0, + "marketcap_usd": 69141560, "name": "Theta Token", "network": "eth", "shortcut": "THETA", @@ -10971,7 +10878,7 @@ "address": "0xfe7B915A0bAA0E79f85c5553266513F7C1c03Ed0", "links": { "Github": "https://github.com/THUGCOIN/THUGCoin", - "Homepage": "https://thugcoin.cash/" + "Homepage": "https://thugcoin.cash" }, "marketcap_usd": 0, "name": "THUG", @@ -10985,12 +10892,30 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:TICO": { + "address": "0xa5dB1d6F7A0D5Bccc17d0bFD39D7AF32d5E5EDc6", + "links": { + "Github": "https://github.com/Topinvestmentcoin/Topinvestmentcoin-", + "Homepage": "https://www.topinvestmentcoin.online/" + }, + "marketcap_usd": 0, + "name": "Topinvestmentcoin", + "network": "eth", + "shortcut": "TICO", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:TIME": { "address": "0x6531f133e6DeeBe7F2dcE5A0441aA7ef330B4e53", "links": { "Homepage": "https://chronobank.io" }, - "marketcap_usd": 0, + "marketcap_usd": 4457546, "name": "Chronobank", "network": "eth", "shortcut": "TIME", @@ -11024,7 +10949,7 @@ "links": { "Homepage": "https://www.blocktix.io" }, - "marketcap_usd": 0, + "marketcap_usd": 5045841, "name": "Blocktix", "network": "eth", "shortcut": "TIX", @@ -11041,7 +10966,7 @@ "links": { "Homepage": "https://etherscan.io/token/TokenCard" }, - "marketcap_usd": 0, + "marketcap_usd": 10979046, "name": "TokenCard", "network": "eth", "shortcut": "TKN", @@ -11071,16 +10996,18 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:TRC": { - "address": "0xcB3F902bf97626391bF8bA87264bbC3DC13469be", - "hidden": 1, - "links": {}, + "erc20:eth:TOOR": { + "address": "0x8eb965ee9cCFBCE76c0a06264492c0afEfc2826d", + "links": { + "Github": "https://github.com/toorister/toorcoin", + "Homepage": "https://www.toorcoin.com" + }, "marketcap_usd": 0, - "name": "The Real Coin", + "name": "ToorCoin", "network": "eth", - "shortcut": "TRC", - "t1_enabled": "yes", - "t2_enabled": "yes", + "shortcut": "TOOR", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", @@ -11139,6 +11066,23 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:TSW": { + "address": "0x6B87999bE87358065bBdE41e8a0fe0B7b1cd2514", + "links": { + "Homepage": "https://www.teslawatt.com" + }, + "marketcap_usd": 0, + "name": "TeslaWatt", + "network": "eth", + "shortcut": "TSW", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:TWN": { "address": "0x2eF1aB8a26187C58BB8aAeB11B2fC6D25C5c0716", "links": { @@ -11178,7 +11122,7 @@ "links": { "Homepage": "https://taas.fund" }, - "marketcap_usd": 7250511, + "marketcap_usd": 6990027, "name": "Token-as-a-Service", "network": "eth", "shortcut": "TaaS", @@ -11208,33 +11152,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:UMKA": { - "address": "0x8e5afc69f6227A3ad75eD346c8723Bc62ce97123", + "erc20:eth:UQC": { + "address": "0xD01DB73E047855Efb414e6202098C4Be4Cd2423B", "links": { - "Github": "https://github.com/UMKAman", - "Homepage": "https://umka.city" + "Homepage": "https://uquidcoin.com" }, - "marketcap_usd": 0, - "name": "UMKA", + "marketcap_usd": 6846702, + "name": "Uquid Coin", "network": "eth", - "shortcut": "UMKA", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, - "erc20:eth:UQC": { - "address": "0xD01DB73E047855Efb414e6202098C4Be4Cd2423B", - "links": { - "Homepage": "https://uquidcoin.com" - }, - "marketcap_usd": 0, - "name": "Uquid Coin", - "network": "eth", - "shortcut": "UQC", + "shortcut": "UQC", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11299,7 +11225,7 @@ "Github": "https://github.com/UniversaBlockchain/universa", "Homepage": "https://www.universa.io/" }, - "marketcap_usd": 0, + "marketcap_usd": 12287840, "name": "Universa", "network": "eth", "shortcut": "UTN-P", @@ -11344,6 +11270,24 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:VDG": { + "address": "0x57C75ECCc8557136D32619a191fBCDc88560d711", + "links": { + "Github": "https://github.com/VeriDocGlobal", + "Homepage": "https://www.veridocglobal.com/" + }, + "marketcap_usd": 0, + "name": "VeriDocGlobal", + "network": "eth", + "shortcut": "VDG", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:VDOC": { "address": "0x82BD526bDB718C6d4DD2291Ed013A5186cAE2DCa", "links": { @@ -11368,7 +11312,7 @@ "Github": "https://github.com/blockv", "Homepage": "https://blockv.io" }, - "marketcap_usd": 0, + "marketcap_usd": 19228486, "name": "BLOCKv", "network": "eth", "shortcut": "VEE", @@ -11380,15 +11324,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:VENUS": { - "address": "0xEbeD4fF9fe34413db8fC8294556BBD1528a4DAca", + "erc20:eth:VEN": { + "address": "0xD850942eF8811f2A866692A623011bDE52a462C1", "links": { - "Homepage": "http://venuscoin.net" + "Github": "https://github.com/vechain-team", + "Homepage": "https://tokensale.vechain.com/en" }, - "marketcap_usd": 0, - "name": "VENUS", + "marketcap_usd": 791401262, + "name": "Vechain", "network": "eth", - "shortcut": "VENUS", + "shortcut": "VEN", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11397,15 +11342,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:VERI": { - "address": "0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374", + "erc20:eth:VENUS": { + "address": "0xEbeD4fF9fe34413db8fC8294556BBD1528a4DAca", "links": { - "Homepage": "http://veritas.veritaseum.com/index.php" + "Homepage": "http://venuscoin.net" }, "marketcap_usd": 0, - "name": "Veritas", + "name": "VENUS", "network": "eth", - "shortcut": "VERI", + "shortcut": "VENUS", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11414,16 +11359,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:VET": { - "address": "0xD850942eF8811f2A866692A623011bDE52a462C1", + "erc20:eth:VERI": { + "address": "0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374", "links": { - "Github": "https://github.com/vechain-team", - "Homepage": "https://tokensale.vechain.com/en" + "Homepage": "http://veritas.veritaseum.com/index.php" }, "marketcap_usd": 0, - "name": "Vechain", + "name": "Veritas", "network": "eth", - "shortcut": "VEN", + "shortcut": "VERI", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11449,30 +11393,13 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:VIBEX": { - "address": "0xe8Ff5C9c75dEb346acAc493C463C8950Be03Dfba", - "links": { - "Github": "https://github.com/amack2u/VibeHub", - "Homepage": "http://vibehub.io" - }, - "marketcap_usd": 0, - "name": "VIBEX", - "network": "eth", - "shortcut": "VIBEX", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:VIEW": { "address": "0xF03f8D65BaFA598611C3495124093c56e8F638f0", "links": { + "Github": "https://github.com/Viewly/", "Homepage": "https://view.ly/" }, - "marketcap_usd": 944174, + "marketcap_usd": 795402, "name": "Viewly", "network": "eth", "shortcut": "VIEW", @@ -11490,7 +11417,7 @@ "Github": "https://github.com/ViceIndustryToken", "Homepage": "https://vicetoken.com/" }, - "marketcap_usd": 0, + "marketcap_usd": 1667855, "name": "Vice Industry Token", "network": "eth", "shortcut": "VIT", @@ -11523,11 +11450,11 @@ "erc20:eth:VLD": { "address": "0x922aC473A3cC241fD3a0049Ed14536452D58D73c", "links": { - "Github": "https://github.com/valid-global/", - "Homepage": "https://valid.global/" + "Github": "https://github.com/vetri-global/", + "Homepage": "https://vetri.global/" }, "marketcap_usd": 0, - "name": "VLD", + "name": "VETRI", "network": "eth", "shortcut": "VLD", "t1_enabled": "yes", @@ -11578,7 +11505,7 @@ "links": { "Homepage": "https://veros.org" }, - "marketcap_usd": 0, + "marketcap_usd": 208801, "name": "Veros", "network": "eth", "shortcut": "VRS", @@ -11613,7 +11540,7 @@ "Github": "https://github.com/waxio", "Homepage": "https://wax.io" }, - "marketcap_usd": 64208582, + "marketcap_usd": 66381362, "name": "WAX", "network": "eth", "shortcut": "WAX", @@ -11665,7 +11592,7 @@ "links": { "Homepage": "https://wepower.network" }, - "marketcap_usd": 0, + "marketcap_usd": 10228971, "name": "WePower", "network": "eth", "shortcut": "WCT", @@ -11712,24 +11639,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:WHO": { - "address": "0xe200641890772FCe8eE6EDc5354cCEa30ac92F49", - "links": { - "Github": "https://github.com/chrisbsd/whohas", - "Homepage": "https://whohas.io" - }, - "marketcap_usd": 0, - "name": "WhoHas", - "network": "eth", - "shortcut": "WHO", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:WIC": { "address": "0x62CD07D414Ec50B68C7EcAa863a23d344f2d062f", "links": { @@ -11771,7 +11680,7 @@ "links": { "Homepage": "https://wings.ai" }, - "marketcap_usd": 12580458, + "marketcap_usd": 12843654, "name": "WINGS", "network": "eth", "shortcut": "WINGS", @@ -11783,17 +11692,34 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:WOLK": { - "address": "0x728781E75735dc0962Df3a51d7Ef47E798A7107E", + "erc20:eth:WMK": { + "address": "0xBFbe5332f172d77811bC6c272844f3e54A7B23bB", "links": { - "Homepage": "https://www.wolk.com" + "Github": "https://github.com/WemarkSource", + "Homepage": "https://www.wemark.com" }, "marketcap_usd": 0, - "name": "Wolk Token", + "name": "WemarkToken", "network": "eth", - "shortcut": "WOLK", - "t1_enabled": "yes", - "t2_enabled": "yes", + "shortcut": "WMK", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "erc20:eth:WNK": { + "address": "0xd73A66B8FB26Be8B0AcD7c52Bd325054Ac7d468b", + "hidden": 1, + "links": {}, + "marketcap_usd": 0, + "name": "Woonk", + "network": "eth", + "shortcut": "WNK", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", @@ -11927,7 +11853,7 @@ "links": { "Homepage": "https://www.wacoin.io" }, - "marketcap_usd": 6865815, + "marketcap_usd": 7160318, "name": "WaBi", "network": "eth", "shortcut": "WaBi", @@ -11978,7 +11904,7 @@ "links": { "Homepage": "http://www.xaurum.org" }, - "marketcap_usd": 0, + "marketcap_usd": 4221839, "name": "Xaurum", "network": "eth", "shortcut": "XAUR", @@ -11996,7 +11922,7 @@ "Github": "https://github.com/blitzpredict", "Homepage": "https://www.blitzpredict.io" }, - "marketcap_usd": 0, + "marketcap_usd": 702192, "name": "BlitzPredict", "network": "eth", "shortcut": "XBP", @@ -12099,7 +12025,7 @@ "erc20:eth:XID": { "address": "0xB110eC7B1dcb8FAB8dEDbf28f53Bc63eA5BEdd84", "links": { - "Homepage": "https://sphereidentity.com/" + "Homepage": "https://sphereidentity.com" }, "marketcap_usd": 0, "name": "XID", @@ -12119,7 +12045,7 @@ "Github": "https://github.com/InkProtocol/", "Homepage": "https://paywithink.com" }, - "marketcap_usd": 0, + "marketcap_usd": 2714381, "name": "Ink Protocol", "network": "eth", "shortcut": "XNK", @@ -12136,7 +12062,7 @@ "links": { "Homepage": "https://xenon.network" }, - "marketcap_usd": 0, + "marketcap_usd": 887202, "name": "XENON", "network": "eth", "shortcut": "XNN", @@ -12168,7 +12094,7 @@ "erc20:eth:XRL": { "address": "0xB24754bE79281553dc1adC160ddF5Cd9b74361a4", "links": { - "Homepage": "https://rialto.ai/" + "Homepage": "https://rialto.ai" }, "marketcap_usd": 0, "name": "XRL", @@ -12199,17 +12125,18 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:YEED": { - "address": "0x6F7A4bac3315B5082F793161a22e26666d22717f", + "erc20:eth:YUP": { + "address": "0xD9A12Cde03a86E800496469858De8581D3A5353d", "links": { - "Homepage": "https://yggdrash.io" + "Github": "https://github.com/crowdholding/", + "Homepage": "https://www.crowdholding.com" }, "marketcap_usd": 0, - "name": "YEED", + "name": "YUP", "network": "eth", - "shortcut": "YEED", - "t1_enabled": "yes", - "t2_enabled": "yes", + "shortcut": "YUP", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", @@ -12218,10 +12145,9 @@ }, "erc20:eth:YUPIE": { "address": "0x0F33bb20a282A7649C7B3AFf644F084a9348e933", - "hidden": 1, "links": { "Github": "https://github.com/crowdholdingico/YupieSmartContract", - "Homepage": "https://www.crowdholding.com/" + "Homepage": "https://www.crowdholding.com" }, "marketcap_usd": 0, "name": "YUPIE", @@ -12241,7 +12167,7 @@ "Github": "https://github.com/zapproject", "Homepage": "https://zap.store" }, - "marketcap_usd": 2019515, + "marketcap_usd": 1918141, "name": "ZAP", "network": "eth", "shortcut": "ZAP", @@ -12258,7 +12184,7 @@ "links": { "Homepage": "https://zsc.io/" }, - "marketcap_usd": 0, + "marketcap_usd": 4787352, "name": "Zeusshield", "network": "eth", "shortcut": "ZCS", @@ -12276,7 +12202,7 @@ "Github": "https://github.com/zilliqa", "Homepage": "https://www.zilliqa.com/" }, - "marketcap_usd": 0, + "marketcap_usd": 283511706, "name": "Zilliqa", "network": "eth", "shortcut": "ZIL", @@ -12293,7 +12219,7 @@ "links": { "Homepage": "https://www.zmine.com" }, - "marketcap_usd": 0, + "marketcap_usd": 5250393, "name": "ZMINE", "network": "eth", "shortcut": "ZMN", @@ -12305,24 +12231,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:ZRX": { - "address": "0xE41d2489571d322189246DaFA5ebDe1F4699F498", - "links": { - "Github": "https://github.com/0xProject", - "Homepage": "https://0xproject.com/" - }, - "marketcap_usd": 0, - "name": "0x Project", - "network": "eth", - "shortcut": "ZRX", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:ZST": { "address": "0xe386B139Ed3715Ca4B18Fd52671bDcea1cdFE4b1", "links": { @@ -12346,7 +12254,7 @@ "Github": "https://github.com/carVertical", "Homepage": "https://www.carvertical.com" }, - "marketcap_usd": 0, + "marketcap_usd": 4641550, "name": "carVertical", "network": "eth", "shortcut": "cV", @@ -12434,7 +12342,7 @@ "Github": "https://github.com/eosdac", "Homepage": "https://eosdac.io/" }, - "marketcap_usd": 16039860, + "marketcap_usd": 15561717, "name": "eosDAC", "network": "eth", "shortcut": "eosDAC", @@ -12468,7 +12376,7 @@ "Github": "https://github.com/havven/havven", "Homepage": "https://www.havven.io" }, - "marketcap_usd": 1153295, + "marketcap_usd": 1155975, "name": "Havven-Backed USD Nomins (nUSD)", "network": "eth", "shortcut": "nUSD", @@ -12502,7 +12410,7 @@ "address": "0x8667559254241ddeD4d11392f868d72092765367", "hidden": 1, "links": {}, - "marketcap_usd": 225680814, + "marketcap_usd": 232368933, "name": "Aeternity", "network": "kov", "shortcut": "Aeternity", @@ -12514,25 +12422,10 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:kov:GUP": { - "address": "0x3C67f7D4decF7795225f51b54134F81137385f83", - "hidden": 1, - "links": {}, - "marketcap_usd": 0, - "name": "GUP", - "network": "kov", - "shortcut": "GUP", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:rin:AETH": { "address": "0x398A7A69f3c59181A1ffe34bed11DCb5DF863A8a", "links": { + "Github": "https://github.com/akashaProject", "Homepage": "http://akasha.world" }, "marketcap_usd": 0, @@ -12550,6 +12443,7 @@ "erc20:rin:BHNT": { "address": "0xe27826eE778B6F78a49a686dA7D64f6E7b084a4f", "links": { + "Github": "https://github.com/berlin-hack-and-tell", "Homepage": "http://berlin.hackandtell.org" }, "marketcap_usd": 0, @@ -12581,43 +12475,12 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:rin:KC": { - "address": "0x275A5B346599b56917e7B1C9de019DCf9EaD861a", - "links": { - "Homepage": "https://baseblock.io/" - }, - "marketcap_usd": 0, - "name": "Karma Token", - "network": "rin", - "shortcut": "KC", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, - "erc20:rin:NONE": { - "address": "0x6475A7FA6Ed2D5180F0e0a07c2d951D12C0EDB91", - "hidden": 1, - "links": {}, - "marketcap_usd": 0, - "name": "None", - "network": "rin", - "shortcut": "NONE", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:rin:PPD": { "address": "0x12fE174C097F6B3e876B3b060C9061F4B9dEBB80", "hidden": 1, - "links": {}, + "links": { + "Github": "https://github.com/cchen408" + }, "marketcap_usd": 0, "name": "PP Donation", "network": "rin", @@ -12633,6 +12496,7 @@ "erc20:rin:WALL": { "address": "0x0A057a87CE9C56D7e336B417c79cf30E8d27860B", "links": { + "Github": "https://github.com/walleth", "Homepage": "https://walleth.org" }, "marketcap_usd": 0, @@ -12647,30 +12511,30 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:rop:ILSC": { - "address": "0x6f95a3B682F8e9aacC86D057A6DF88A0E68145A8", + "erc20:rop:*PLASMA": { + "address": "0x95D7321EdCe519419ba1DbC60A89bAfbF55EAC0D", "hidden": 1, "links": {}, "marketcap_usd": 0, - "name": "IsraCoin", + "name": "*PLASMA", "network": "rop", - "shortcut": "ILSC", - "t1_enabled": "yes", - "t2_enabled": "yes", + "shortcut": "*PLASMA", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:rop:NONE": { - "address": "0xFD5a69A1309595FF5121553F52C8A5B2B1B31031", + "erc20:rop:ILSC": { + "address": "0x6f95a3B682F8e9aacC86D057A6DF88A0E68145A8", "hidden": 1, "links": {}, "marketcap_usd": 0, - "name": "None", + "name": "IsraCoin", "network": "rop", - "shortcut": "NONE", + "shortcut": "ILSC", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12698,7 +12562,7 @@ "erc20:ubq:CEFS": { "address": "0x08533D6A06CE365298b12Ef92eb407cBA8Aa8273", "links": { - "Homepage": "https://www.cryptopiashares.com/" + "Homepage": "https://www.cryptopiashares.com" }, "marketcap_usd": 0, "name": "CEFS", @@ -12731,9 +12595,9 @@ "erc20:ubq:QWARK": { "address": "0x4b4899a10F3E507DB207b0ee2426029eFa168a67", "links": { - "Homepage": "https://www.qwark.io/" + "Homepage": "https://www.qwark.io" }, - "marketcap_usd": 1694018, + "marketcap_usd": 1838322, "name": "QWARK", "network": "ubq", "shortcut": "QWARK", @@ -12762,7 +12626,422 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "mosaic:BREEZE": { + "eth:AKA": { + "links": { + "Homepage": "https://akroma.io" + }, + "marketcap_usd": 708616, + "name": "Akroma", + "shortcut": "AKA", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "coin", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "eth:ATH": { + "links": { + "Homepage": "https://atheios.com" + }, + "marketcap_usd": 0, + "name": "Atheios", + "shortcut": "ATH", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "coin", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "eth:CLO": { + "links": { + "Homepage": "https://callisto.network" + }, + "marketcap_usd": 0, + "name": "Callisto", + "shortcut": "CLO", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "coin", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "eth:EGEM": { + "links": { + "Homepage": "https://egem.io" + }, + "marketcap_usd": 200422, + "name": "EtherGem", + "shortcut": "EGEM", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "coin", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "eth:ELLA": { + "links": { + "Homepage": "https://ellaism.org" + }, + "marketcap_usd": 359582, + "name": "Ellaism", + "shortcut": "ELLA", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "coin", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "eth:EOSC": { + "links": { + "Homepage": "https://eos-classic.io" + }, + "marketcap_usd": 0, + "name": "EOS Classic", + "shortcut": "EOSC", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "coin", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "eth:ESN": { + "links": { + "Homepage": "https://ethersocial.org" + }, + "marketcap_usd": 0, + "name": "Ethersocial Network", + "shortcut": "ESN", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "coin", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "eth:ETC": { + "links": { + "Homepage": "https://ethereumclassic.github.io" + }, + "marketcap_usd": 1291168227, + "name": "Ethereum Classic", + "shortcut": "ETC", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "coin", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "eth:ETH": { + "links": { + "Homepage": "https://www.ethereum.org" + }, + "marketcap_usd": 28117892357, + "name": "Ethereum", + "shortcut": "ETH", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "coin", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "eth:ETHO": { + "links": { + "Homepage": "https://ether1.org" + }, + "marketcap_usd": 0, + "name": "Ether-1", + "shortcut": "ETHO", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "coin", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "eth:ETSC": { + "links": { + "Homepage": "https://ethereumsocial.kr" + }, + "marketcap_usd": 0, + "name": "Ethereum Social", + "shortcut": "ETSC", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "coin", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "eth:EXP": { + "links": { + "Homepage": "https://expanse.tech" + }, + "marketcap_usd": 4812366, + "name": "Expanse", + "shortcut": "EXP", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "coin", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "eth:GO": { + "links": { + "Homepage": "https://gochain.io" + }, + "marketcap_usd": 15095961, + "name": "GoChain", + "shortcut": "GO", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "coin", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "eth:MUSIC": { + "links": { + "Homepage": "https://musicoin.org" + }, + "marketcap_usd": 3047841, + "name": "Musicoin", + "shortcut": "MUSIC", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "coin", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "eth:PIRL": { + "links": { + "Homepage": "https://pirl.io" + }, + "marketcap_usd": 2883556, + "name": "Pirl", + "shortcut": "PIRL", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "coin", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "eth:RSK": { + "links": { + "Homepage": "https://www.rsk.co" + }, + "marketcap_usd": 0, + "name": "RSK", + "shortcut": "RSK", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "coin", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "eth:UBQ": { + "links": { + "Homepage": "https://ubiqsmart.com" + }, + "marketcap_usd": 22538702, + "name": "Ubiq", + "shortcut": "UBQ", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "coin", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "eth:tETC": { + "hidden": 1, + "links": { + "Homepage": "https://ethereumclassic.github.io" + }, + "marketcap_usd": 0, + "name": "Ethereum Classic Testnet", + "shortcut": "tETC", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "coin", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "eth:tKOV": { + "hidden": 1, + "links": { + "Homepage": "https://www.ethereum.org" + }, + "marketcap_usd": 0, + "name": "Ethereum Testnet Kovan", + "shortcut": "tKOV", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "coin", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "eth:tRIN": { + "hidden": 1, + "links": { + "Homepage": "https://www.ethereum.org" + }, + "marketcap_usd": 0, + "name": "Ethereum Testnet Rinkeby", + "shortcut": "tRIN", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "coin", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "eth:tROP": { + "hidden": 1, + "links": { + "Homepage": "https://www.ethereum.org" + }, + "marketcap_usd": 0, + "name": "Ethereum Testnet Ropsten", + "shortcut": "tROP", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "coin", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "eth:tRSK": { + "hidden": 1, + "links": { + "Homepage": "https://www.rsk.co" + }, + "marketcap_usd": 0, + "name": "RSK Testnet", + "shortcut": "tRSK", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "coin", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "misc:ADA": { + "links": { + "Homepage": "https://www.cardano.org" + }, + "marketcap_usd": 2393273266, + "name": "Cardano", + "shortcut": "ADA", + "t1_enabled": "no", + "t2_enabled": "soon", + "type": "coin" + }, + "misc:LSK": { + "links": { + "Homepage": "https://lisk.io/" + }, + "marketcap_usd": 529722990, + "name": "Lisk", + "shortcut": "LSK", + "t1_enabled": "no", + "t2_enabled": "yes", + "type": "coin" + }, + "misc:ONT": { + "links": { + "Homepage": "https://ont.io" + }, + "marketcap_usd": 392083677, + "name": "Ontology", + "shortcut": "ONT", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "coin" + }, + "misc:XLM": { + "links": { + "Homepage": "https://www.stellar.org" + }, + "marketcap_usd": 4027996135, + "name": "Stellar", + "notes": "In development", + "shortcut": "XLM", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "coin" + }, + "misc:XMR": { + "links": { + "Homepage": "https://getmonero.org" + }, + "marketcap_usd": 1470898316, + "name": "Monero", + "notes": "In development", + "shortcut": "XMR", + "t1_enabled": "no", + "t2_enabled": "soon", + "type": "coin" + }, + "misc:XRP": { + "links": { + "Homepage": "https://ripple.com" + }, + "marketcap_usd": 12796422030, + "name": "Ripple", + "notes": "In development", + "shortcut": "XRP", + "t1_enabled": "no", + "t2_enabled": "soon", + "type": "coin" + }, + "misc:XTZ": { + "links": { + "Homepage": "https://tezos.com" + }, + "marketcap_usd": 796546269, + "name": "Tezos", + "shortcut": "XTZ", + "t1_enabled": "no", + "t2_enabled": "soon", + "type": "coin" + }, + "nem:BREEZE": { "links": { "Homepage": "https://breeze.chat" }, @@ -12776,11 +13055,11 @@ "Nano Wallet": "https://nem.io/downloads/" } }, - "mosaic:DIM": { + "nem:DIM": { "links": { "Homepage": "https://www.dimcoin.io" }, - "marketcap_usd": 5751412, + "marketcap_usd": 5693343, "name": "DIMCOIN", "shortcut": "DIM", "t1_enabled": "yes", @@ -12790,12 +13069,12 @@ "Nano Wallet": "https://nem.io/downloads/" } }, - "mosaic:DIMTOK": { + "nem:DIMTOK": { "coinmarketcap_alias": "dimcoin", "links": { "Homepage": "https://www.dimcoin.io" }, - "marketcap_usd": 5751412, + "marketcap_usd": 5693343, "name": "DIM TOKEN", "shortcut": "DIMTOK", "t1_enabled": "yes", @@ -12805,7 +13084,7 @@ "Nano Wallet": "https://nem.io/downloads/" } }, - "mosaic:PAC:CHS": { + "nem:PAC:CHS": { "links": { "Homepage": "https://pacnem.com" }, @@ -12819,7 +13098,7 @@ "Nano Wallet": "https://nem.io/downloads/" } }, - "mosaic:PAC:HRT": { + "nem:PAC:HRT": { "links": { "Homepage": "https://pacnem.com" }, @@ -12833,11 +13112,11 @@ "Nano Wallet": "https://nem.io/downloads/" } }, - "mosaic:XEM": { + "nem:XEM": { "links": { "Homepage": "https://nem.io" }, - "marketcap_usd": 874888375, + "marketcap_usd": 905209375, "name": "NEM", "shortcut": "XEM", "t1_enabled": "yes", @@ -12849,11 +13128,11 @@ } }, "info": { - "marketcap_usd": 163168706395, - "t1_coins": 689, - "t2_coins": 688, - "total_marketcap_usd": 207808113932, - "updated_at": 1535021696, - "updated_at_readable": "Thu Aug 23 12:54:56 2018" + "marketcap_usd": 168706565383, + "t1_coins": 635, + "t2_coins": 634, + "total_marketcap_usd": 210612300355, + "updated_at": 1535123434, + "updated_at_readable": "Fri Aug 24 17:10:34 2018" } } \ No newline at end of file diff --git a/defs/coins_details.override.json b/defs/coins_details.override.json new file mode 100644 index 000000000..671be8bd8 --- /dev/null +++ b/defs/coins_details.override.json @@ -0,0 +1,69 @@ +{ + "nem:DIMTOK": { + "coinmarketcap_alias": "dimcoin" + }, + "erc20:eth:GNT": { + "coinmarketcap_alias": "golem-network-tokens" + }, + "bitcoin:BCH": { + "wallet": { + "Electron Cash": "https://electroncash.org" + } + }, + "bitcoin:BTC": { + "wallet": { + "Electrum": "https://electrum.org" + } + }, + "bitcoin:BTCP": { + "wallet": { + "BTCP Electrum": "https://github.com/BTCPrivate/electrum-btcp" + } + }, + "bitcoin:BTG": { + "wallet": { + "ElectrumG": "https://github.com/BTCGPU/electrum" + } + }, + "bitcoin:DASH": { + "wallet": { + "Dash Electrum": "https://electrum.dash.org" + } + }, + "bitcoin:FJC": { + "wallet": { + "Electrum-FJC": "http://www.fujicoin.org/downloads.php" + } + }, + "bitcoin:GRS": { + "wallet": { + "Electrum-GRS": "https://www.groestlcoin.org/groestlcoin-electrum-wallet/" + } + }, + "bitcoin:LTC": { + "wallet": { + "Electrum-LTC": "https://electrum-ltc.org" + } + }, + "bitcoin:MONA": { + "wallet": { + "Electrum-MONA": "https://electrum-mona.org" + } + }, + "bitcoin:NMC": { + "wallet": { + "Electrum-NMC": "https://github.com/namecoin/electrum-nmc" + } + }, + "bitcoin:VIA": { + "wallet": { + "Vialectrum": "https://vialectrum.org" + } + }, + "bitcoin:XZC": { + "wallet": { + "Electrum-XZC": "https://github.com/zcoinofficial/electrum-xzc", + "Znode Tool": "https://github.com/yura-pakhuchiy/znode-tool" + } + } +} diff --git a/defs/duplicity_overrides.json b/defs/duplicity_overrides.json new file mode 100644 index 000000000..a4a535a42 --- /dev/null +++ b/defs/duplicity_overrides.json @@ -0,0 +1,6 @@ +{ + "erc20:eth:BTL (Battle)": true, + "erc20:eth:BTL (Bitlle)": true, + "erc20:eth:LINK Platform": true, + "erc20:eth:NXX": false +} diff --git a/defs/ethereum/networks.json b/defs/ethereum/networks.json index cb9938ae4..031872ea9 100644 --- a/defs/ethereum/networks.json +++ b/defs/ethereum/networks.json @@ -18,7 +18,7 @@ { "chain_id": 3, "slip44": 1, - "shortcut": "tETH", + "shortcut": "tROP", "name": "Ethereum Testnet Ropsten", "rskip60": false, "url": "https://www.ethereum.org" @@ -26,7 +26,7 @@ { "chain_id": 4, "slip44": 1, - "shortcut": "tETH", + "shortcut": "tRIN", "name": "Ethereum Testnet Rinkeby", "rskip60": false, "url": "https://www.ethereum.org" @@ -35,7 +35,7 @@ "chain_id": 8, "slip44": 108, "shortcut": "UBQ", - "name": "UBIQ", + "name": "Ubiq", "rskip60": false, "url": "https://ubiqsmart.com" }, @@ -74,7 +74,7 @@ { "chain_id": 42, "slip44": 1, - "shortcut": "tETH", + "shortcut": "tKOV", "name": "Ethereum Testnet Kovan", "rskip60": false, "url": "https://www.ethereum.org" diff --git a/defs/ethereum/tokens b/defs/ethereum/tokens index 0b7f34d48..44826a687 160000 --- a/defs/ethereum/tokens +++ b/defs/ethereum/tokens @@ -1 +1 @@ -Subproject commit 0b7f34d48de1376f39e10adbeb5a0191cdffd73c +Subproject commit 44826a687a155bc0bb5e121370a07f5a95689d09 diff --git a/defs/misc/misc.json b/defs/misc/misc.json new file mode 100644 index 000000000..e9783df0a --- /dev/null +++ b/defs/misc/misc.json @@ -0,0 +1,54 @@ +[ + { + "name": "Lisk", + "shortcut": "LSK", + "links": { + "Homepage": "https://lisk.io/" + } + }, + { + "name": "Stellar", + "notes": "In development", + "shortcut": "XLM", + "links": { + "Homepage": "https://www.stellar.org" + } + }, + { + "name": "Monero", + "shortcut": "XMR", + "notes": "In development", + "links": { + "Homepage": "https://getmonero.org" + } + }, + { + "name": "Ripple", + "shortcut": "XRP", + "notes": "In development", + "links": { + "Homepage": "https://ripple.com" + } + }, + { + "name": "Cardano", + "shortcut": "ADA", + "links": { + "Homepage": "https://www.cardano.org" + } + }, + { + "name": "Tezos", + "shortcut": "XTZ", + "links": { + "Homepage": "https://tezos.com" + } + }, + { + "name": "Ontology", + "shortcut": "ONT", + "links": { + "Homepage": "https://ont.io" + } + } +] diff --git a/defs/nem/nem_mosaics.json b/defs/nem/nem_mosaics.json index 83ec417ce..c4ca8a06f 100644 --- a/defs/nem/nem_mosaics.json +++ b/defs/nem/nem_mosaics.json @@ -1,14 +1,20 @@ [ { - "name": "XEM", - "ticker": " XEM", + "name": "NEM", + "ticker": "XEM", "namespace": "nem", "mosaic": "xem", - "divisibility": 6 + "divisibility": 6, + "links": { + "Homepage": "https://nem.io" + }, + "wallet": { + "Nano Wallet": "https://nem.io/downloads/" + } }, { "name": "DIMCOIN", - "ticker": " DIM", + "ticker": "DIM", "namespace": "dim", "mosaic": "coin", "divisibility": 6, @@ -18,41 +24,65 @@ "levy_mosaic": "coin", "networks": [ 104 - ] + ], + "links": { + "Homepage": "https://www.dimcoin.io" + }, + "wallet": { + "Nano Wallet": "https://nem.io/downloads/" + } }, { "name": "DIM TOKEN", - "ticker": " DIMTOK", + "ticker": "DIMTOK", "namespace": "dim", "mosaic": "token", "divisibility": 6, "networks": [ 104 - ] + ], + "links": { + "Homepage": "https://www.dimcoin.io" + }, + "wallet": { + "Nano Wallet": "https://nem.io/downloads/" + } }, { "name": "Breeze Token", - "ticker": " BREEZE", + "ticker": "BREEZE", "namespace": "breeze", "mosaic": "breeze-token", "divisibility": 0, "networks": [ 104 - ] + ], + "links": { + "Homepage": "https://breeze.chat" + }, + "wallet": { + "Nano Wallet": "https://nem.io/downloads/" + } }, { "name": "PacNEM Game Credits", - "ticker": " PAC:HRT", + "ticker": "PAC:HRT", "namespace": "pacnem", "mosaic": "heart", "divisibility": 0, "networks": [ 104 - ] + ], + "links": { + "Homepage": "https://pacnem.com" + }, + "wallet": { + "Nano Wallet": "https://nem.io/downloads/" + } }, { "name": "PacNEM Score Tokens", - "ticker": " PAC:CHS", + "ticker": "PAC:CHS", "namespace": "pacnem", "mosaic": "cheese", "divisibility": 6, @@ -62,6 +92,12 @@ "levy_mosaic": "xem", "networks": [ 104 - ] + ], + "links": { + "Homepage": "https://pacnem.com" + }, + "wallet": { + "Nano Wallet": "https://nem.io/downloads/" + } } ] diff --git a/defs/support.json b/defs/support.json index 0b65f69cd..d961fce26 100644 --- a/defs/support.json +++ b/defs/support.json @@ -1,105 +1,1664 @@ { - "trezor1": { - "Bitcoin": "1.5.2", - "Testnet": "1.5.2", - "Bcash": "1.6.2", - "Bcash Testnet": "1.6.2", - "Bgold": "1.6.2", - "Bprivate": "1.6.2", - "Dash": "1.5.2", - "Dash Testnet": "1.6.2", - "Decred": "1.6.2", - "Decred Testnet": "1.6.2", - "DigiByte": "1.6.0", - "Dogecoin": "1.5.2", - "Fujicoin": "1.6.1", - "Groestlcoin": "1.6.2", - "Groestlcoin Testnet": "1.6.2", - "Koto": "1.6.3", - "Litecoin": "1.5.2", - "Litecoin Testnet": "1.6.2", - "Monacoin": "1.6.0", - "Namecoin": "1.5.2", - "Vertcoin": "1.6.1", - "Viacoin": "1.6.2", - "Zcash": "1.6.2", - "Zcash Testnet": "1.6.2", - "Zcoin": "1.6.2", - "Zcoin Testnet": "1.6.2" - }, - "trezor2": { - "Bitcoin": "2.0.5", - "Testnet": "2.0.5", - "Bcash": "2.0.7", - "Bcash Testnet": "2.0.7", - "Bgold": "2.0.7", - "Bprivate": "2.0.7", - "Dash": "2.0.5", - "DigiByte": "2.0.5", - "Dogecoin": "2.0.5", - "Fujicoin": "2.0.5", - "Groestlcoin": "2.0.8", - "Groestlcoin Testnet": "2.0.8", - "Koto": "2.0.8", - "Litecoin": "2.0.5", - "Litecoin Testnet": "2.0.7", - "Monacoin": "2.0.5", - "Namecoin": "2.0.5", - "Vertcoin": "2.0.5", - "Viacoin": "2.0.7", - "Zcash": "2.0.7", - "Zcash Testnet": "2.0.7", - "Zcoin": "2.0.7", - "Zcoin Testnet": "2.0.7", - "Zencash": "2.0.8" - }, - "connect": { - "Bitcoin": true, - "Testnet": true, - "Bcash": true, - "Bgold": true, - "Dash": true, - "Litecoin": true, - "Zcash": true, - "Dogecoin": true, - "Vertcoin": true - }, - "webwallet": { - "Bitcoin": true, - "Testnet": true, - "Bcash": true, - "Bgold": true, - "Bprivate": true, - "Dash": true, - "Decred": true, - "Decred Testnet": true, - "DigiByte": true, - "Dogecoin": true, - "Fujicoin": true, - "Groestlcoin": true, - "Groestlcoin Testnet": true, - "Koto": true, - "Litecoin": true, - "Litecoin Testnet": true, - "Monacoin": true, - "Vertcoin": true, - "Viacoin": true, - "Zcash": true, - "Zcash Testnet": true, - "Zcoin": true - }, - "electrum": { - "Bitcoin": "https://electrum.org", - "Bcash": "https://electroncash.org", - "Bgold": "https://github.com/BTCGPU/electrum", - "Bprivate": "https://github.com/BTCPrivate/electrum-btcp", - "Dash": "https://electrum.dash.org", - "Groestlcoin": "https://www.groestlcoin.org/groestlcoin-electrum-wallet/", - "Koto": "https://electrum.kotocoin.info", - "Litecoin": "https://electrum-ltc.org", - "Monacoin": "https://electrum-mona.org", - "Namecoin": "https://github.com/namecoin/electrum-nmc", - "Viacoin": "https://vialectrum.org", - "Zcoin": "https://github.com/zcoinofficial/electrum-xzc" - } + "connect": { + "supported": { + "bitcoin:BCH": true, + "bitcoin:BTC": true, + "bitcoin:BTG": true, + "bitcoin:DASH": true, + "bitcoin:DOGE": true, + "bitcoin:LTC": true, + "bitcoin:TEST": true, + "bitcoin:VTC": true, + "bitcoin:ZEC": true + }, + "unsupported": {} + }, + "trezor1": { + "supported": { + "bitcoin:BCH": "1.6.2", + "bitcoin:BTC": "1.5.2", + "bitcoin:BTCP": "1.6.2", + "bitcoin:BTG": "1.6.2", + "bitcoin:DASH": "1.5.2", + "bitcoin:DCR": "1.6.2", + "bitcoin:DGB": "1.6.0", + "bitcoin:DNR": "soon", + "bitcoin:DOGE": "1.5.2", + "bitcoin:FJC": "1.6.1", + "bitcoin:FLASH": "soon", + "bitcoin:FTC": "soon", + "bitcoin:GRS": "1.6.2", + "bitcoin:KOTO": "soon", + "bitcoin:LTC": "1.5.2", + "bitcoin:MONA": "1.6.0", + "bitcoin:MUE": "soon", + "bitcoin:NMC": "1.5.2", + "bitcoin:PTC": "soon", + "bitcoin:SMART": "soon", + "bitcoin:TAZ": "1.6.2", + "bitcoin:TBCH": "1.6.2", + "bitcoin:TBTG": "soon", + "bitcoin:TDCR": "1.6.2", + "bitcoin:TEST": "1.5.2", + "bitcoin:TLTC": "1.6.2", + "bitcoin:VIA": "1.6.2", + "bitcoin:VTC": "1.6.1", + "bitcoin:XMY": "soon", + "bitcoin:XZC": "1.6.2", + "bitcoin:ZEC": "1.6.2", + "bitcoin:tDASH": "1.6.2", + "bitcoin:tGRS": "1.6.2", + "bitcoin:tSMART": "soon", + "bitcoin:tXZC": "1.6.2", + "erc20:ella:MINING": "1.6.2", + "erc20:etc:BEC": "1.6.2", + "erc20:eth:$FFC": "1.6.2", + "erc20:eth:$FXY": "1.6.2", + "erc20:eth:$TEAK": "1.6.2", + "erc20:eth:0xBTC": "1.6.2", + "erc20:eth:1ST": "1.6.2", + "erc20:eth:1WO": "1.6.2", + "erc20:eth:2DC": "1.6.2", + "erc20:eth:300": "1.6.2", + "erc20:eth:A18": "1.6.2", + "erc20:eth:ABT": "1.6.2", + "erc20:eth:ABYSS": "1.6.2", + "erc20:eth:ACC": "1.6.2", + "erc20:eth:ADH": "1.6.2", + "erc20:eth:ADI": "1.6.2", + "erc20:eth:ADL": "1.6.2", + "erc20:eth:ADST": "1.6.2", + "erc20:eth:ADT": "1.6.2", + "erc20:eth:ADX": "1.6.2", + "erc20:eth:AE": "1.6.2", + "erc20:eth:AGI": "1.6.2", + "erc20:eth:AION": "1.6.2", + "erc20:eth:AIR": "1.6.2", + "erc20:eth:AIX": "1.6.2", + "erc20:eth:ALCO": "1.6.2", + "erc20:eth:ALIS": "1.6.2", + "erc20:eth:ALTS": "1.6.2", + "erc20:eth:AMB": "1.6.2", + "erc20:eth:AMIS": "1.6.2", + "erc20:eth:AMN": "1.6.2", + "erc20:eth:AMO": "1.6.2", + "erc20:eth:AMTC": "1.6.2", + "erc20:eth:ANT": "1.6.2", + "erc20:eth:APIS": "1.6.2", + "erc20:eth:APPC": "1.6.2", + "erc20:eth:APT": "1.6.2", + "erc20:eth:ARC": "1.6.2", + "erc20:eth:ARCT": "1.6.2", + "erc20:eth:ARD": "1.6.2", + "erc20:eth:ARN": "1.6.2", + "erc20:eth:ART": "1.6.2", + "erc20:eth:ARX": "1.6.2", + "erc20:eth:ARXT": "1.6.2", + "erc20:eth:AST": "1.6.2", + "erc20:eth:ATL": "1.6.2", + "erc20:eth:ATMI": "1.6.2", + "erc20:eth:ATT": "1.6.2", + "erc20:eth:ATTN": "1.6.2", + "erc20:eth:AVA": "1.6.2", + "erc20:eth:AVT": "1.6.2", + "erc20:eth:AX1": "1.6.2", + "erc20:eth:AXP": "1.6.2", + "erc20:eth:BANX": "1.6.2", + "erc20:eth:BAT": "1.6.2", + "erc20:eth:BBK": "1.6.2", + "erc20:eth:BCBC": "1.6.2", + "erc20:eth:BCDN": "1.6.2", + "erc20:eth:BCDT": "1.6.2", + "erc20:eth:BCL": "1.6.2", + "erc20:eth:BCPT": "1.6.2", + "erc20:eth:BCV": "1.6.2", + "erc20:eth:BDG": "1.6.2", + "erc20:eth:BEE": "1.6.2", + "erc20:eth:BERRY": "1.6.2", + "erc20:eth:BET": "1.6.2", + "erc20:eth:BETR": "1.6.2", + "erc20:eth:BKB": "1.6.2", + "erc20:eth:BKRx": "1.6.2", + "erc20:eth:BKX": "1.6.2", + "erc20:eth:BLT": "1.6.2", + "erc20:eth:BLUE": "1.6.2", + "erc20:eth:BLX (Bullion)": "1.6.2", + "erc20:eth:BLX (Iconomi)": "1.6.2", + "erc20:eth:BLZ": "1.6.2", + "erc20:eth:BMC": "1.6.2", + "erc20:eth:BMT": "1.6.2", + "erc20:eth:BMX": "1.6.2", + "erc20:eth:BNB": "1.6.2", + "erc20:eth:BNC": "1.6.2", + "erc20:eth:BNFT": "1.6.2", + "erc20:eth:BNT": "1.6.2", + "erc20:eth:BNTY": "1.6.2", + "erc20:eth:BOB": "1.6.2", + "erc20:eth:BON": "1.6.2", + "erc20:eth:BOP": "1.6.2", + "erc20:eth:BOU": "1.6.2", + "erc20:eth:BPT": "1.6.2", + "erc20:eth:BQX": "1.6.2", + "erc20:eth:BRAT": "1.6.2", + "erc20:eth:BRD": "1.6.2", + "erc20:eth:BSDC": "1.6.2", + "erc20:eth:BST": "1.6.2", + "erc20:eth:BTCE": "1.6.2", + "erc20:eth:BTCL": "1.6.2", + "erc20:eth:BTE": "1.6.2", + "erc20:eth:BTH": "1.6.2", + "erc20:eth:BTHR": "1.6.2", + "erc20:eth:BTK": "1.6.2", + "erc20:eth:BTM": "1.6.2", + "erc20:eth:BTQ": "1.6.2", + "erc20:eth:BTT": "1.6.2", + "erc20:eth:BTTX": "1.6.2", + "erc20:eth:BUC": "1.6.2", + "erc20:eth:BeerCoin": "1.6.2", + "erc20:eth:C20": "1.6.2", + "erc20:eth:C8": "1.6.2", + "erc20:eth:CAG": "1.6.2", + "erc20:eth:CAN": "1.6.2", + "erc20:eth:CARB": "1.6.2", + "erc20:eth:CARCO": "1.6.2", + "erc20:eth:CARE": "1.6.2", + "erc20:eth:CAS": "1.6.2", + "erc20:eth:CAT (BitClave)": "1.6.2", + "erc20:eth:CAT (Blockcat)": "1.6.2", + "erc20:eth:CATs (BitClave)_Old": "1.6.2", + "erc20:eth:CC3": "1.6.2", + "erc20:eth:CCC (CryptoCrashCourse)": "1.6.2", + "erc20:eth:CCC (ICONOMI)": "1.6.2", + "erc20:eth:CCLC": "1.6.2", + "erc20:eth:CCS": "1.6.2", + "erc20:eth:CDL": "1.6.2", + "erc20:eth:CDT": "1.6.2", + "erc20:eth:CEEK": "1.6.2", + "erc20:eth:CFI": "1.6.2", + "erc20:eth:CFTY": "1.6.2", + "erc20:eth:CHSB": "1.6.2", + "erc20:eth:CK": "1.6.2", + "erc20:eth:CLB": "1.6.2", + "erc20:eth:CLL": "1.6.2", + "erc20:eth:CLN": "1.6.2", + "erc20:eth:CLP": "1.6.2", + "erc20:eth:CMBT": "1.6.2", + "erc20:eth:CMC": "1.6.2", + "erc20:eth:CMT": "1.6.2", + "erc20:eth:CNB": "1.6.2", + "erc20:eth:CND": "1.6.2", + "erc20:eth:CO2": "1.6.2", + "erc20:eth:CO2Bit": "1.6.2", + "erc20:eth:COB": "1.6.2", + "erc20:eth:COFI": "1.6.2", + "erc20:eth:COIL": "1.6.2", + "erc20:eth:COIN": "1.6.2", + "erc20:eth:COV": "1.6.2", + "erc20:eth:CPEX": "1.6.2", + "erc20:eth:CPY": "1.6.2", + "erc20:eth:CR7": "1.6.2", + "erc20:eth:CRB": "1.6.2", + "erc20:eth:CRED": "1.6.2", + "erc20:eth:CREDO": "1.6.2", + "erc20:eth:CRPT": "1.6.2", + "erc20:eth:CRT": "1.6.2", + "erc20:eth:CTF": "1.6.2", + "erc20:eth:CTG": "1.6.2", + "erc20:eth:CTL": "1.6.2", + "erc20:eth:CTT": "1.6.2", + "erc20:eth:CTX": "1.6.2", + "erc20:eth:CVC": "1.6.2", + "erc20:eth:CXC": "1.6.2", + "erc20:eth:CXO": "1.6.2", + "erc20:eth:CryptoCarbon": "1.6.2", + "erc20:eth:DAB": "1.6.2", + "erc20:eth:DADI": "1.6.2", + "erc20:eth:DALC": "1.6.2", + "erc20:eth:DAN": "1.6.2", + "erc20:eth:DAO": "1.6.2", + "erc20:eth:DAT": "1.6.2", + "erc20:eth:DATABroker": "1.6.2", + "erc20:eth:DATACoin": "1.6.2", + "erc20:eth:DAV": "1.6.2", + "erc20:eth:DAXT": "1.6.2", + "erc20:eth:DAY": "1.6.2", + "erc20:eth:DCA": "1.6.2", + "erc20:eth:DCL": "1.6.2", + "erc20:eth:DCN": "1.6.2", + "erc20:eth:DDF": "1.6.2", + "erc20:eth:DEB": "1.6.2", + "erc20:eth:DEEZ": "1.6.2", + "erc20:eth:DENT": "1.6.2", + "erc20:eth:DGPT": "1.6.2", + "erc20:eth:DGX": "1.6.2", + "erc20:eth:DICE": "1.6.2", + "erc20:eth:DIVX": "1.6.2", + "erc20:eth:DKP": "1.6.2", + "erc20:eth:DLT": "1.6.2", + "erc20:eth:DMT": "1.6.2", + "erc20:eth:DNT": "1.6.2", + "erc20:eth:DNX": "1.6.2", + "erc20:eth:DPP": "1.6.2", + "erc20:eth:DRGN": "1.6.2", + "erc20:eth:DSC": "1.6.2", + "erc20:eth:DTH": "1.6.2", + "erc20:eth:DTR": "1.6.2", + "erc20:eth:DTT": "1.6.2", + "erc20:eth:DTX": "1.6.2", + "erc20:eth:DTx": "1.6.2", + "erc20:eth:Devcon2 Token": "1.6.2", + "erc20:eth:EAGLE": "1.6.2", + "erc20:eth:ECN": "1.6.2", + "erc20:eth:ECO2": "1.6.2", + "erc20:eth:EDC": "1.6.2", + "erc20:eth:EDG": "1.6.2", + "erc20:eth:EDO": "1.6.2", + "erc20:eth:EGT": "1.6.2", + "erc20:eth:EHT": "1.6.2", + "erc20:eth:ELF": "1.6.2", + "erc20:eth:ELIX": "1.6.2", + "erc20:eth:ELTCOIN": "1.6.2", + "erc20:eth:EMON": "1.6.2", + "erc20:eth:EMONT": "1.6.2", + "erc20:eth:EMT": "1.6.2", + "erc20:eth:EMV": "1.6.2", + "erc20:eth:ENC": "1.6.2", + "erc20:eth:ENG": "1.6.2", + "erc20:eth:ENJ": "1.6.2", + "erc20:eth:ENTRP": "1.6.2", + "erc20:eth:EOS": "1.6.2", + "erc20:eth:EPX": "1.6.2", + "erc20:eth:ESZ": "1.6.2", + "erc20:eth:ETBS": "1.6.2", + "erc20:eth:ETCH": "1.6.2", + "erc20:eth:ETHB": "1.6.2", + "erc20:eth:ETR": "1.6.2", + "erc20:eth:EURT": "1.6.2", + "erc20:eth:EVE": "1.6.2", + "erc20:eth:EVN": "1.6.2", + "erc20:eth:EVX": "1.6.2", + "erc20:eth:EXMR": "1.6.2", + "erc20:eth:FAM": "1.6.2", + "erc20:eth:FKX": "1.6.2", + "erc20:eth:FLIXX": "1.6.2", + "erc20:eth:FLP": "1.6.2", + "erc20:eth:FLR": "1.6.2", + "erc20:eth:FLUZ": "1.6.2", + "erc20:eth:FLX": "1.6.2", + "erc20:eth:FND": "1.6.2", + "erc20:eth:FRD": "1.6.2", + "erc20:eth:FTR": "1.6.2", + "erc20:eth:FTT": "1.6.2", + "erc20:eth:FUEL": "1.6.2", + "erc20:eth:FUN": "1.6.2", + "erc20:eth:FYN": "1.6.2", + "erc20:eth:GAM": "1.6.2", + "erc20:eth:GAVEL": "1.6.2", + "erc20:eth:GBT": "1.6.2", + "erc20:eth:GBX": "1.6.2", + "erc20:eth:GCP": "1.6.2", + "erc20:eth:GEE": "1.6.2", + "erc20:eth:GELD": "1.6.2", + "erc20:eth:GEN": "1.6.2", + "erc20:eth:GET": "1.6.2", + "erc20:eth:GIF": "1.6.2", + "erc20:eth:GIM": "1.6.2", + "erc20:eth:GMT": "1.6.2", + "erc20:eth:GNO": "1.6.2", + "erc20:eth:GOLDX": "1.6.2", + "erc20:eth:GRID": "1.6.2", + "erc20:eth:GROW": "1.6.2", + "erc20:eth:GTC": "1.6.2", + "erc20:eth:GTKT": "1.6.2", + "erc20:eth:GTO": "1.6.2", + "erc20:eth:GVT": "1.6.2", + "erc20:eth:GXC": "1.6.2", + "erc20:eth:GXVC": "1.6.2", + "erc20:eth:GZE": "1.6.2", + "erc20:eth:GZR": "1.6.2", + "erc20:eth:HAT": "1.6.2", + "erc20:eth:HAV": "1.6.2", + "erc20:eth:HDG": "1.6.2", + "erc20:eth:HGT": "1.6.2", + "erc20:eth:HIG": "1.6.2", + "erc20:eth:HKG": "1.6.2", + "erc20:eth:HKY": "1.6.2", + "erc20:eth:HMQ": "1.6.2", + "erc20:eth:HODL": "1.6.2", + "erc20:eth:HORSE": "1.6.2", + "erc20:eth:HST": "1.6.2", + "erc20:eth:HVN": "1.6.2", + "erc20:eth:HYDRO": "1.6.2", + "erc20:eth:Hdp": "1.6.2", + "erc20:eth:IAD": "1.6.2", + "erc20:eth:ICE": "1.6.2", + "erc20:eth:ICN": "1.6.2", + "erc20:eth:ICO": "1.6.2", + "erc20:eth:ICOS": "1.6.2", + "erc20:eth:ICX": "1.6.2", + "erc20:eth:IDEA": "1.6.2", + "erc20:eth:IFT": "1.6.2", + "erc20:eth:IIC": "1.6.2", + "erc20:eth:IKB": "1.6.2", + "erc20:eth:IMC": "1.6.2", + "erc20:eth:IMT": "1.6.2", + "erc20:eth:IND": "1.6.2", + "erc20:eth:INRM": "1.6.2", + "erc20:eth:INS": "1.6.2", + "erc20:eth:INSTAR": "1.6.2", + "erc20:eth:INXT": "1.6.2", + "erc20:eth:IOST": "1.6.2", + "erc20:eth:IOTX": "1.6.2", + "erc20:eth:IPL": "1.6.2", + "erc20:eth:IPSX": "1.6.2", + "erc20:eth:ITC": "1.6.2", + "erc20:eth:ITT": "1.6.2", + "erc20:eth:IXT": "1.6.2", + "erc20:eth:IoT": "1.6.2", + "erc20:eth:J8T": "1.6.2", + "erc20:eth:JET": "1.6.2", + "erc20:eth:JNT": "1.6.2", + "erc20:eth:JOY": "1.6.2", + "erc20:eth:JetCoins": "1.6.2", + "erc20:eth:KEE": "1.6.2", + "erc20:eth:KICK": "1.6.2", + "erc20:eth:KIN": "1.6.2", + "erc20:eth:KNC": "1.6.2", + "erc20:eth:KPR": "1.6.2", + "erc20:eth:KRL": "1.6.2", + "erc20:eth:KZN": "1.6.2", + "erc20:eth:LA": "1.6.2", + "erc20:eth:LALA": "1.6.2", + "erc20:eth:LDC": "1.6.2", + "erc20:eth:LEND": "1.6.2", + "erc20:eth:LFR": "1.6.2", + "erc20:eth:LGO": "1.6.2", + "erc20:eth:LGR": "1.6.2", + "erc20:eth:LIF": "1.6.2", + "erc20:eth:LIFE": "1.6.2", + "erc20:eth:LINK (Chainlink)": "1.6.2", + "erc20:eth:LIVE": "1.6.2", + "erc20:eth:LND": "1.6.2", + "erc20:eth:LOC": "1.6.2", + "erc20:eth:LOCI": "1.6.2", + "erc20:eth:LOCUS": "1.6.2", + "erc20:eth:LOK": "1.6.2", + "erc20:eth:LOOM": "1.6.2", + "erc20:eth:LPT": "1.6.2", + "erc20:eth:LRC": "1.6.2", + "erc20:eth:LUC": "1.6.2", + "erc20:eth:LUCK": "1.6.2", + "erc20:eth:LUM": "1.6.2", + "erc20:eth:LUN": "1.6.2", + "erc20:eth:LYS": "1.6.2", + "erc20:eth:M-ETH": "1.6.2", + "erc20:eth:MAD": "1.6.2", + "erc20:eth:MAN": "1.6.2", + "erc20:eth:MANA": "1.6.2", + "erc20:eth:MART": "1.6.2", + "erc20:eth:MBRS": "1.6.2", + "erc20:eth:MCAP": "1.6.2", + "erc20:eth:MCI": "1.6.2", + "erc20:eth:MCO": "1.6.2", + "erc20:eth:MDA": "1.6.2", + "erc20:eth:MESH": "1.6.2", + "erc20:eth:MEST": "1.6.2", + "erc20:eth:MFG": "1.6.2", + "erc20:eth:MGO": "1.6.2", + "erc20:eth:MKT": "1.6.2", + "erc20:eth:MNE": "1.6.2", + "erc20:eth:MNT": "1.6.2", + "erc20:eth:MNTP": "1.6.2", + "erc20:eth:MOD": "1.6.2", + "erc20:eth:MRL": "1.6.2", + "erc20:eth:MRP": "1.6.2", + "erc20:eth:MRV": "1.6.2", + "erc20:eth:MSP": "1.6.2", + "erc20:eth:MTH": "1.6.2", + "erc20:eth:MTL": "1.6.2", + "erc20:eth:MTN": "1.6.2", + "erc20:eth:MTR": "1.6.2", + "erc20:eth:MTRc": "1.6.2", + "erc20:eth:MTX": "1.6.2", + "erc20:eth:MUXE": "1.6.2", + "erc20:eth:MVP": "1.6.2", + "erc20:eth:MWAT": "1.6.2", + "erc20:eth:MYD": "1.6.2", + "erc20:eth:MYST": "1.6.2", + "erc20:eth:NAC": "1.6.2", + "erc20:eth:NANJ": "1.6.2", + "erc20:eth:NAVI": "1.6.2", + "erc20:eth:NBAI": "1.6.2", + "erc20:eth:NCT": "1.6.2", + "erc20:eth:NDC": "1.6.2", + "erc20:eth:NEC": "1.6.2", + "erc20:eth:NET": "1.6.2", + "erc20:eth:NEU": "1.6.2", + "erc20:eth:NGC": "1.6.2", + "erc20:eth:NIMFA": "1.6.2", + "erc20:eth:NMR": "1.6.2", + "erc20:eth:NOX": "1.6.2", + "erc20:eth:NPER": "1.6.2", + "erc20:eth:NPXS": "1.6.2", + "erc20:eth:NULS": "1.6.2", + "erc20:eth:NXX": "1.6.2", + "erc20:eth:NxC": "1.6.2", + "erc20:eth:OAK": "1.6.2", + "erc20:eth:OAX": "1.6.2", + "erc20:eth:OCC": "1.6.2", + "erc20:eth:OJX": "1.6.2", + "erc20:eth:OLD_MKR": "1.6.2", + "erc20:eth:OMG": "1.6.2", + "erc20:eth:ONEK": "1.6.2", + "erc20:eth:OPT": "1.6.2", + "erc20:eth:ORBS": "1.6.2", + "erc20:eth:OST": "1.6.2", + "erc20:eth:Ox Fina": "1.6.2", + "erc20:eth:PAL": "1.6.2", + "erc20:eth:PARETO": "1.6.2", + "erc20:eth:PAT": "1.6.2", + "erc20:eth:PATENTS": "1.6.2", + "erc20:eth:PATH": "1.6.2", + "erc20:eth:PAY": "1.6.2", + "erc20:eth:PBL": "1.6.2", + "erc20:eth:PBT": "1.6.2", + "erc20:eth:PCH": "1.6.2", + "erc20:eth:PCL": "1.6.2", + "erc20:eth:PCLOLD": "1.6.2", + "erc20:eth:PET": "1.6.2", + "erc20:eth:PETRO": "1.6.2", + "erc20:eth:PEXT": "1.6.2", + "erc20:eth:PIPL": "1.6.2", + "erc20:eth:PIX": "1.6.2", + "erc20:eth:PLASMA": "1.6.2", + "erc20:eth:PLBT": "1.6.2", + "erc20:eth:PLR": "1.6.2", + "erc20:eth:PLU": "1.6.2", + "erc20:eth:POE": "1.6.2", + "erc20:eth:POIN": "1.6.2", + "erc20:eth:POLY": "1.6.2", + "erc20:eth:POOL": "1.6.2", + "erc20:eth:POS": "1.6.2", + "erc20:eth:POWR": "1.6.2", + "erc20:eth:PPP": "1.6.2", + "erc20:eth:PPT": "1.6.2", + "erc20:eth:PRE": "1.6.2", + "erc20:eth:PRG": "1.6.2", + "erc20:eth:PRL": "1.6.2", + "erc20:eth:PRO": "1.6.2", + "erc20:eth:PRON": "1.6.2", + "erc20:eth:PRS": "1.6.2", + "erc20:eth:PRSP": "1.6.2", + "erc20:eth:PT": "1.6.2", + "erc20:eth:PTOY": "1.6.2", + "erc20:eth:PTWO": "1.6.2", + "erc20:eth:PUC": "1.6.2", + "erc20:eth:PXT": "1.6.2", + "erc20:eth:QASH": "1.6.2", + "erc20:eth:QAU": "1.6.2", + "erc20:eth:QBX": "1.6.2", + "erc20:eth:QRG": "1.6.2", + "erc20:eth:QRL": "1.6.2", + "erc20:eth:QSP": "1.6.2", + "erc20:eth:QTQ": "1.6.2", + "erc20:eth:QTUM": "1.6.2", + "erc20:eth:RAO": "1.6.2", + "erc20:eth:RBLX": "1.6.2", + "erc20:eth:RCN": "1.6.2", + "erc20:eth:RCT": "1.6.2", + "erc20:eth:REA": "1.6.2", + "erc20:eth:REBL": "1.6.2", + "erc20:eth:RED": "1.6.2", + "erc20:eth:REN": "1.6.2", + "erc20:eth:REQ": "1.6.2", + "erc20:eth:REX": "1.6.2", + "erc20:eth:RFR": "1.6.2", + "erc20:eth:RIPT": "1.6.2", + "erc20:eth:RLC": "1.6.2", + "erc20:eth:RLT": "1.6.2", + "erc20:eth:RLTY": "1.6.2", + "erc20:eth:RLX": "1.6.2", + "erc20:eth:RNDR": "1.6.2", + "erc20:eth:ROCK": "1.6.2", + "erc20:eth:ROK": "1.6.2", + "erc20:eth:ROUND": "1.6.2", + "erc20:eth:RPL": "1.6.2", + "erc20:eth:RTN": "1.6.2", + "erc20:eth:RVL": "1.6.2", + "erc20:eth:RVT": "1.6.2", + "erc20:eth:S-A-PAT": "1.6.2", + "erc20:eth:S-ETH": "1.6.2", + "erc20:eth:SALT": "1.6.2", + "erc20:eth:SAN": "1.6.2", + "erc20:eth:SCANDI": "1.6.2", + "erc20:eth:SCL": "1.6.2", + "erc20:eth:SENSE": "1.6.2", + "erc20:eth:SET": "1.6.2", + "erc20:eth:SEXY": "1.6.2", + "erc20:eth:SGEL": "1.6.2", + "erc20:eth:SHIT": "1.6.2", + "erc20:eth:SIFT": "1.6.2", + "erc20:eth:SIG": "1.6.2", + "erc20:eth:SKIN": "1.6.2", + "erc20:eth:SKO1": "1.6.2", + "erc20:eth:SKR": "1.6.2", + "erc20:eth:SLT": "1.6.2", + "erc20:eth:SNC": "1.6.2", + "erc20:eth:SND": "1.6.2", + "erc20:eth:SNG": "1.6.2", + "erc20:eth:SNGLS": "1.6.2", + "erc20:eth:SNIP": "1.6.2", + "erc20:eth:SNM": "1.6.2", + "erc20:eth:SNOV": "1.6.2", + "erc20:eth:SNT": "1.6.2", + "erc20:eth:SOL": "1.6.2", + "erc20:eth:SPANK": "1.6.2", + "erc20:eth:SPARC": "1.6.2", + "erc20:eth:SPARTA": "1.6.2", + "erc20:eth:SPF": "1.6.2", + "erc20:eth:SPN": "1.6.2", + "erc20:eth:SRN": "1.6.2", + "erc20:eth:SSH": "1.6.2", + "erc20:eth:STAC": "1.6.2", + "erc20:eth:STAR": "1.6.2", + "erc20:eth:STC": "1.6.2", + "erc20:eth:STK": "1.6.2", + "erc20:eth:STN": "1.6.2", + "erc20:eth:STORJ": "1.6.2", + "erc20:eth:STORM": "1.6.2", + "erc20:eth:STP": "1.6.2", + "erc20:eth:STQ": "1.6.2", + "erc20:eth:STRC": "1.6.2", + "erc20:eth:STX": "1.6.2", + "erc20:eth:SUB": "1.6.2", + "erc20:eth:SWM": "1.6.2", + "erc20:eth:SWT": "1.6.2", + "erc20:eth:SXDT": "1.6.2", + "erc20:eth:SXUT": "1.6.2", + "erc20:eth:SYN": "1.6.2", + "erc20:eth:SenSatorI": "1.6.2", + "erc20:eth:TAU": "1.6.2", + "erc20:eth:TBC2": "1.6.2", + "erc20:eth:TBT": "1.6.2", + "erc20:eth:TDH": "1.6.2", + "erc20:eth:TEL": "1.6.2", + "erc20:eth:TFL": "1.6.2", + "erc20:eth:THETA": "1.6.2", + "erc20:eth:THUG": "1.6.2", + "erc20:eth:TIME": "1.6.2", + "erc20:eth:TIO": "1.6.2", + "erc20:eth:TIX": "1.6.2", + "erc20:eth:TKN": "1.6.2", + "erc20:eth:TNT": "1.6.2", + "erc20:eth:TRCN": "1.6.2", + "erc20:eth:TRST": "1.6.2", + "erc20:eth:TRX": "1.6.2", + "erc20:eth:TWN": "1.6.2", + "erc20:eth:TWNKL": "1.6.2", + "erc20:eth:TaaS": "1.6.2", + "erc20:eth:UKG": "1.6.2", + "erc20:eth:UQC": "1.6.2", + "erc20:eth:USDM": "1.6.2", + "erc20:eth:USDT": "1.6.2", + "erc20:eth:UTK": "1.6.2", + "erc20:eth:UTN-P": "1.6.2", + "erc20:eth:UUU": "1.6.2", + "erc20:eth:Unicorn": "1.6.2", + "erc20:eth:VDOC": "1.6.2", + "erc20:eth:VEE": "1.6.2", + "erc20:eth:VEN": "1.6.2", + "erc20:eth:VENUS": "1.6.2", + "erc20:eth:VERI": "1.6.2", + "erc20:eth:VIB": "1.6.2", + "erc20:eth:VIEW": "1.6.2", + "erc20:eth:VIT": "1.6.2", + "erc20:eth:VIU": "1.6.2", + "erc20:eth:VLD": "1.6.2", + "erc20:eth:VOC": "1.6.2", + "erc20:eth:VOISE": "1.6.2", + "erc20:eth:VRS": "1.6.2", + "erc20:eth:VSL": "1.6.2", + "erc20:eth:WAX": "1.6.2", + "erc20:eth:WBA": "1.6.2", + "erc20:eth:WCN": "1.6.2", + "erc20:eth:WCT": "1.6.2", + "erc20:eth:WETH": "1.6.2", + "erc20:eth:WHEN": "1.6.2", + "erc20:eth:WIC": "1.6.2", + "erc20:eth:WILD": "1.6.2", + "erc20:eth:WINGS": "1.6.2", + "erc20:eth:WORK": "1.6.2", + "erc20:eth:WPC": "1.6.2", + "erc20:eth:WPR": "1.6.2", + "erc20:eth:WRK": "1.6.2", + "erc20:eth:WTC": "1.6.2", + "erc20:eth:WYS": "1.6.2", + "erc20:eth:WYV": "1.6.2", + "erc20:eth:WaBi": "1.6.2", + "erc20:eth:WiC": "1.6.2", + "erc20:eth:X8X": "1.6.2", + "erc20:eth:XAUR": "1.6.2", + "erc20:eth:XBP": "1.6.2", + "erc20:eth:XCC": "1.6.2", + "erc20:eth:XFS": "1.6.2", + "erc20:eth:XGG": "1.6.2", + "erc20:eth:XGM": "1.6.2", + "erc20:eth:XGT": "1.6.2", + "erc20:eth:XID": "1.6.2", + "erc20:eth:XNK": "1.6.2", + "erc20:eth:XNN": "1.6.2", + "erc20:eth:XNT": "1.6.2", + "erc20:eth:XRL": "1.6.2", + "erc20:eth:XSC": "1.6.2", + "erc20:eth:YUPIE": "1.6.2", + "erc20:eth:ZAP": "1.6.2", + "erc20:eth:ZCS": "1.6.2", + "erc20:eth:ZIL": "1.6.2", + "erc20:eth:ZMN": "1.6.2", + "erc20:eth:ZST": "1.6.2", + "erc20:eth:cV": "1.6.2", + "erc20:eth:eBCH": "1.6.2", + "erc20:eth:eBTC": "1.6.2", + "erc20:eth:eGAS": "1.6.2", + "erc20:eth:eUSD": "1.6.2", + "erc20:eth:eosDAC": "1.6.2", + "erc20:eth:nCash": "1.6.2", + "erc20:eth:nUSD": "1.6.2", + "erc20:eth:onG": "1.6.2", + "erc20:kov:Aeternity": "1.6.2", + "erc20:rin:AETH": "1.6.2", + "erc20:rin:BHNT": "1.6.2", + "erc20:rin:CTGA": "1.6.2", + "erc20:rin:PPD": "1.6.2", + "erc20:rin:WALL": "1.6.2", + "erc20:rop:ILSC": "1.6.2", + "erc20:ubq:BEER": "1.6.2", + "erc20:ubq:CEFS": "1.6.2", + "erc20:ubq:DOT": "1.6.2", + "erc20:ubq:QWARK": "1.6.2", + "erc20:ubq:RICKS": "1.6.2", + "eth:AKA": "soon", + "eth:ATH": "soon", + "eth:CLO": "1.6.2", + "eth:EGEM": "1.6.2", + "eth:ELLA": "1.6.2", + "eth:EOSC": "1.6.2", + "eth:ESN": "soon", + "eth:ETC": "1.6.2", + "eth:ETH": "1.6.2", + "eth:ETHO": "soon", + "eth:ETSC": "1.6.2", + "eth:EXP": "1.6.2", + "eth:GO": "1.6.2", + "eth:MUSIC": "soon", + "eth:PIRL": "soon", + "eth:RSK": "1.6.2", + "eth:UBQ": "1.6.2", + "eth:tETC": "1.6.2", + "eth:tKOV": "1.6.2", + "eth:tRIN": "1.6.2", + "eth:tROP": "1.6.2", + "eth:tRSK": "1.6.2", + "misc:XLM": "soon", + "nem:BREEZE": "1.6.2", + "nem:DIM": "1.6.2", + "nem:DIMTOK": "1.6.2", + "nem:PAC:CHS": "1.6.2", + "nem:PAC:HRT": "1.6.2", + "nem:XEM": "1.6.2" + }, + "unsupported": { + "bitcoin:BTX": "address_type collides with Bitcoin", + "bitcoin:CRW": "address_type collides with Bitcoin", + "bitcoin:TRC": "address_type collides with Bitcoin", + "bitcoin:ZEN": "not implemented on T1", + "erc20:etc:PLAY": "(AUTO) duplicate key", + "erc20:eth:ATH": "(AUTO) duplicate key", + "erc20:eth:ATH (AIgatha Token)": "(AUTO) duplicate key", + "erc20:eth:BTL (Battle)": "(AUTO) duplicate key", + "erc20:eth:BTL (Bitlle)": "(AUTO) duplicate key", + "erc20:eth:CAR": "(AUTO) duplicate key", + "erc20:eth:CAR (CarBlock)": "(AUTO) duplicate key", + "erc20:eth:CARD:0": "(AUTO) duplicate key", + "erc20:eth:CARD:1": "(AUTO) duplicate key", + "erc20:eth:CDX:0": "(AUTO) duplicate key", + "erc20:eth:CDX:1": "(AUTO) duplicate key", + "erc20:eth:COSS:0": "(AUTO) duplicate key", + "erc20:eth:COSS:1": "(AUTO) duplicate key", + "erc20:eth:DAI": "(AUTO) duplicate key", + "erc20:eth:DEPO": "(AUTO) duplicate key", + "erc20:eth:DEPO (Depository Network)": "(AUTO) duplicate key", + "erc20:eth:DGD": "(AUTO) duplicate key", + "erc20:eth:DOW:0": "(AUTO) duplicate key", + "erc20:eth:DOW:1": "(AUTO) duplicate key", + "erc20:eth:DROP": "(AUTO) duplicate key", + "erc20:eth:DROP (dropil)": "(AUTO) duplicate key", + "erc20:eth:DRP:0": "(AUTO) duplicate key", + "erc20:eth:DRP:1": "(AUTO) duplicate key", + "erc20:eth:DUBI:0": "(AUTO) duplicate key", + "erc20:eth:DUBI:1": "(AUTO) duplicate key", + "erc20:eth:EDU:0": "(AUTO) duplicate key", + "erc20:eth:EDU:1": "(AUTO) duplicate key", + "erc20:eth:FANX:0": "(AUTO) duplicate key", + "erc20:eth:FANX:1": "(AUTO) duplicate key", + "erc20:eth:FLMC:0": "(AUTO) duplicate key", + "erc20:eth:FLMC:1": "(AUTO) duplicate key", + "erc20:eth:FTC": "(AUTO) duplicate key", + "erc20:eth:FUCK:0": "(AUTO) duplicate key", + "erc20:eth:FUCK:1": "(AUTO) duplicate key", + "erc20:eth:GANA:0": "(AUTO) duplicate key", + "erc20:eth:GANA:1": "(AUTO) duplicate key", + "erc20:eth:GNT": "(AUTO) duplicate key", + "erc20:eth:GUP": "(AUTO) duplicate key", + "erc20:eth:HOT:0": "(AUTO) duplicate key", + "erc20:eth:HOT:1": "(AUTO) duplicate key", + "erc20:eth:JBX:0": "(AUTO) duplicate key", + "erc20:eth:JBX:1": "(AUTO) duplicate key", + "erc20:eth:KC": "(AUTO) duplicate key", + "erc20:eth:KEY:0": "(AUTO) duplicate key", + "erc20:eth:KEY:1": "(AUTO) duplicate key", + "erc20:eth:LEMO:0": "(AUTO) duplicate key", + "erc20:eth:LEMO:1": "(AUTO) duplicate key", + "erc20:eth:LEMO:2": "(AUTO) duplicate key", + "erc20:eth:LINK Platform": "(AUTO) duplicate key", + "erc20:eth:LNC": "(AUTO) duplicate key", + "erc20:eth:LNC (Linker Coin)": "(AUTO) duplicate key", + "erc20:eth:MIT": "(AUTO) duplicate key", + "erc20:eth:MIT (Mychatcoin)": "(AUTO) duplicate key", + "erc20:eth:MKR": "(AUTO) duplicate key", + "erc20:eth:MLN": "(AUTO) duplicate key", + "erc20:eth:MTC:0": "(AUTO) duplicate key", + "erc20:eth:MTC:1": "(AUTO) duplicate key", + "erc20:eth:NONE": "(AUTO) duplicate key", + "erc20:eth:NXX OLD": "(AUTO) duplicate key", + "erc20:eth:OHNI:0": "(AUTO) duplicate key", + "erc20:eth:OHNI:1": "(AUTO) duplicate key", + "erc20:eth:OPEN:0": "(AUTO) duplicate key", + "erc20:eth:OPEN:1": "(AUTO) duplicate key", + "erc20:eth:PLAY": "(AUTO) duplicate key", + "erc20:eth:PRPS:0": "(AUTO) duplicate key", + "erc20:eth:PRPS:1": "(AUTO) duplicate key", + "erc20:eth:PTC": "(AUTO) duplicate key", + "erc20:eth:RDN": "(AUTO) duplicate key", + "erc20:eth:REP:0": "(AUTO) duplicate key", + "erc20:eth:REP:1": "(AUTO) duplicate key", + "erc20:eth:SGT:0": "(AUTO) duplicate key", + "erc20:eth:SGT:1": "(AUTO) duplicate key", + "erc20:eth:SKRP:0": "(AUTO) duplicate key", + "erc20:eth:SKRP:1": "(AUTO) duplicate key", + "erc20:eth:SKRP:2": "(AUTO) duplicate key", + "erc20:eth:SMART": "(AUTO) duplicate key", + "erc20:eth:SMT:0": "(AUTO) duplicate key", + "erc20:eth:SMT:1": "(AUTO) duplicate key", + "erc20:eth:SMT:2": "(AUTO) duplicate key", + "erc20:eth:SS:0": "(AUTO) duplicate key", + "erc20:eth:SS:1": "(AUTO) duplicate key", + "erc20:eth:TRC": "(AUTO) duplicate key", + "erc20:eth:UMKA:0": "(AUTO) duplicate key", + "erc20:eth:UMKA:1": "(AUTO) duplicate key", + "erc20:eth:VIBEX:0": "(AUTO) duplicate key", + "erc20:eth:VIBEX:1": "(AUTO) duplicate key", + "erc20:eth:WHO:0": "(AUTO) duplicate key", + "erc20:eth:WHO:1": "(AUTO) duplicate key", + "erc20:eth:WOLK:0": "(AUTO) duplicate key", + "erc20:eth:WOLK:1": "(AUTO) duplicate key", + "erc20:eth:YEED:0": "(AUTO) duplicate key", + "erc20:eth:YEED:1": "(AUTO) duplicate key", + "erc20:eth:ZRX": "(AUTO) duplicate key", + "erc20:kov:DAI": "(AUTO) duplicate key", + "erc20:kov:DGD": "(AUTO) duplicate key", + "erc20:kov:GNT": "(AUTO) duplicate key", + "erc20:kov:GUP": "(AUTO) duplicate key", + "erc20:kov:MKR": "(AUTO) duplicate key", + "erc20:kov:MLN": "(AUTO) duplicate key", + "erc20:kov:REP": "(AUTO) duplicate key", + "erc20:kov:ZRX": "(AUTO) duplicate key", + "erc20:rin:KC": "(AUTO) duplicate key", + "erc20:rin:NONE": "(AUTO) duplicate key", + "erc20:rin:RDN": "(AUTO) duplicate key", + "erc20:rop:NONE": "(AUTO) duplicate key", + "misc:ADA": "not implemented on T1", + "misc:LSK": "not implemented on T1", + "misc:XMR": "not implemented on T1", + "misc:XRP": "not implemented on T1", + "misc:XTZ": "not implemented on T1" + } + }, + "trezor2": { + "supported": { + "bitcoin:BCH": "2.0.7", + "bitcoin:BTC": "2.0.5", + "bitcoin:BTCP": "2.0.7", + "bitcoin:BTG": "2.0.7", + "bitcoin:DASH": "2.0.5", + "bitcoin:DGB": "2.0.5", + "bitcoin:DNR": "soon", + "bitcoin:DOGE": "2.0.5", + "bitcoin:FJC": "2.0.5", + "bitcoin:FLASH": "soon", + "bitcoin:FTC": "soon", + "bitcoin:GRS": "2.0.8", + "bitcoin:KOTO": "soon", + "bitcoin:LTC": "2.0.5", + "bitcoin:MONA": "2.0.5", + "bitcoin:MUE": "soon", + "bitcoin:NMC": "2.0.5", + "bitcoin:PTC": "soon", + "bitcoin:SMART": "soon", + "bitcoin:TAZ": "2.0.7", + "bitcoin:TBCH": "2.0.7", + "bitcoin:TBTG": "soon", + "bitcoin:TEST": "2.0.5", + "bitcoin:TLTC": "2.0.7", + "bitcoin:VIA": "2.0.7", + "bitcoin:VTC": "2.0.5", + "bitcoin:XMY": "soon", + "bitcoin:XZC": "2.0.7", + "bitcoin:ZEC": "2.0.7", + "bitcoin:ZEN": "2.0.8", + "bitcoin:tDASH": "soon", + "bitcoin:tGRS": "2.0.8", + "bitcoin:tSMART": "soon", + "bitcoin:tXZC": "2.0.7", + "erc20:ella:MINING": "2.0.7", + "erc20:etc:BEC": "2.0.7", + "erc20:eth:$FFC": "2.0.7", + "erc20:eth:$FXY": "2.0.7", + "erc20:eth:$TEAK": "2.0.7", + "erc20:eth:0xBTC": "2.0.7", + "erc20:eth:1ST": "2.0.7", + "erc20:eth:1WO": "2.0.7", + "erc20:eth:2DC": "2.0.7", + "erc20:eth:300": "2.0.7", + "erc20:eth:A18": "2.0.7", + "erc20:eth:ABT": "2.0.7", + "erc20:eth:ABYSS": "2.0.7", + "erc20:eth:ACC": "2.0.7", + "erc20:eth:ADH": "2.0.7", + "erc20:eth:ADI": "2.0.7", + "erc20:eth:ADL": "2.0.7", + "erc20:eth:ADST": "2.0.7", + "erc20:eth:ADT": "2.0.7", + "erc20:eth:ADX": "2.0.7", + "erc20:eth:AE": "2.0.7", + "erc20:eth:AGI": "2.0.7", + "erc20:eth:AION": "2.0.7", + "erc20:eth:AIR": "2.0.7", + "erc20:eth:AIX": "2.0.7", + "erc20:eth:ALCO": "2.0.7", + "erc20:eth:ALIS": "2.0.7", + "erc20:eth:ALTS": "2.0.7", + "erc20:eth:AMB": "2.0.7", + "erc20:eth:AMIS": "2.0.7", + "erc20:eth:AMN": "2.0.7", + "erc20:eth:AMO": "2.0.7", + "erc20:eth:AMTC": "2.0.7", + "erc20:eth:ANT": "2.0.7", + "erc20:eth:APIS": "2.0.7", + "erc20:eth:APPC": "2.0.7", + "erc20:eth:APT": "2.0.7", + "erc20:eth:ARC": "2.0.7", + "erc20:eth:ARCT": "2.0.7", + "erc20:eth:ARD": "2.0.7", + "erc20:eth:ARN": "2.0.7", + "erc20:eth:ART": "2.0.7", + "erc20:eth:ARX": "2.0.7", + "erc20:eth:ARXT": "2.0.7", + "erc20:eth:AST": "2.0.7", + "erc20:eth:ATL": "2.0.7", + "erc20:eth:ATMI": "2.0.7", + "erc20:eth:ATT": "2.0.7", + "erc20:eth:ATTN": "2.0.7", + "erc20:eth:AVA": "2.0.7", + "erc20:eth:AVT": "2.0.7", + "erc20:eth:AX1": "2.0.7", + "erc20:eth:AXP": "2.0.7", + "erc20:eth:BANX": "2.0.7", + "erc20:eth:BAT": "2.0.7", + "erc20:eth:BBK": "2.0.7", + "erc20:eth:BCBC": "2.0.7", + "erc20:eth:BCDN": "2.0.7", + "erc20:eth:BCDT": "2.0.7", + "erc20:eth:BCL": "2.0.7", + "erc20:eth:BCPT": "2.0.7", + "erc20:eth:BCV": "2.0.7", + "erc20:eth:BDG": "2.0.7", + "erc20:eth:BEE": "2.0.7", + "erc20:eth:BERRY": "2.0.7", + "erc20:eth:BET": "2.0.7", + "erc20:eth:BETR": "2.0.7", + "erc20:eth:BKB": "2.0.7", + "erc20:eth:BKRx": "2.0.7", + "erc20:eth:BKX": "2.0.7", + "erc20:eth:BLT": "2.0.7", + "erc20:eth:BLUE": "2.0.7", + "erc20:eth:BLX (Bullion)": "2.0.7", + "erc20:eth:BLX (Iconomi)": "2.0.7", + "erc20:eth:BLZ": "2.0.7", + "erc20:eth:BMC": "2.0.7", + "erc20:eth:BMT": "2.0.7", + "erc20:eth:BMX": "2.0.7", + "erc20:eth:BNB": "2.0.7", + "erc20:eth:BNC": "2.0.7", + "erc20:eth:BNFT": "2.0.7", + "erc20:eth:BNT": "2.0.7", + "erc20:eth:BNTY": "2.0.7", + "erc20:eth:BOB": "2.0.7", + "erc20:eth:BON": "2.0.7", + "erc20:eth:BOP": "2.0.7", + "erc20:eth:BOU": "2.0.7", + "erc20:eth:BPT": "2.0.7", + "erc20:eth:BQX": "2.0.7", + "erc20:eth:BRAT": "2.0.7", + "erc20:eth:BRD": "2.0.7", + "erc20:eth:BSDC": "2.0.7", + "erc20:eth:BST": "2.0.7", + "erc20:eth:BTCE": "2.0.7", + "erc20:eth:BTCL": "2.0.7", + "erc20:eth:BTE": "2.0.7", + "erc20:eth:BTH": "2.0.7", + "erc20:eth:BTHR": "2.0.7", + "erc20:eth:BTK": "2.0.7", + "erc20:eth:BTM": "2.0.7", + "erc20:eth:BTQ": "2.0.7", + "erc20:eth:BTT": "2.0.7", + "erc20:eth:BTTX": "2.0.7", + "erc20:eth:BUC": "2.0.7", + "erc20:eth:BeerCoin": "2.0.7", + "erc20:eth:C20": "2.0.7", + "erc20:eth:C8": "2.0.7", + "erc20:eth:CAG": "2.0.7", + "erc20:eth:CAN": "2.0.7", + "erc20:eth:CARB": "2.0.7", + "erc20:eth:CARCO": "2.0.7", + "erc20:eth:CARE": "2.0.7", + "erc20:eth:CAS": "2.0.7", + "erc20:eth:CAT (BitClave)": "2.0.7", + "erc20:eth:CAT (Blockcat)": "2.0.7", + "erc20:eth:CATs (BitClave)_Old": "2.0.7", + "erc20:eth:CC3": "2.0.7", + "erc20:eth:CCC (CryptoCrashCourse)": "2.0.7", + "erc20:eth:CCC (ICONOMI)": "2.0.7", + "erc20:eth:CCLC": "2.0.7", + "erc20:eth:CCS": "2.0.7", + "erc20:eth:CDL": "2.0.7", + "erc20:eth:CDT": "2.0.7", + "erc20:eth:CEEK": "2.0.7", + "erc20:eth:CFI": "2.0.7", + "erc20:eth:CFTY": "2.0.7", + "erc20:eth:CHSB": "2.0.7", + "erc20:eth:CK": "2.0.7", + "erc20:eth:CLB": "2.0.7", + "erc20:eth:CLL": "2.0.7", + "erc20:eth:CLN": "2.0.7", + "erc20:eth:CLP": "2.0.7", + "erc20:eth:CMBT": "2.0.7", + "erc20:eth:CMC": "2.0.7", + "erc20:eth:CMT": "2.0.7", + "erc20:eth:CNB": "2.0.7", + "erc20:eth:CND": "2.0.7", + "erc20:eth:CO2": "2.0.7", + "erc20:eth:CO2Bit": "2.0.7", + "erc20:eth:COB": "2.0.7", + "erc20:eth:COFI": "2.0.7", + "erc20:eth:COIL": "2.0.7", + "erc20:eth:COIN": "2.0.7", + "erc20:eth:COV": "2.0.7", + "erc20:eth:CPEX": "2.0.7", + "erc20:eth:CPY": "2.0.7", + "erc20:eth:CR7": "2.0.7", + "erc20:eth:CRB": "2.0.7", + "erc20:eth:CRED": "2.0.7", + "erc20:eth:CREDO": "2.0.7", + "erc20:eth:CRPT": "2.0.7", + "erc20:eth:CRT": "2.0.7", + "erc20:eth:CTF": "2.0.7", + "erc20:eth:CTG": "2.0.7", + "erc20:eth:CTL": "2.0.7", + "erc20:eth:CTT": "2.0.7", + "erc20:eth:CTX": "2.0.7", + "erc20:eth:CVC": "2.0.7", + "erc20:eth:CXC": "2.0.7", + "erc20:eth:CXO": "2.0.7", + "erc20:eth:CryptoCarbon": "2.0.7", + "erc20:eth:DAB": "2.0.7", + "erc20:eth:DADI": "2.0.7", + "erc20:eth:DALC": "2.0.7", + "erc20:eth:DAN": "2.0.7", + "erc20:eth:DAO": "2.0.7", + "erc20:eth:DAT": "2.0.7", + "erc20:eth:DATABroker": "2.0.7", + "erc20:eth:DATACoin": "2.0.7", + "erc20:eth:DAV": "2.0.7", + "erc20:eth:DAXT": "2.0.7", + "erc20:eth:DAY": "2.0.7", + "erc20:eth:DCA": "2.0.7", + "erc20:eth:DCL": "2.0.7", + "erc20:eth:DCN": "2.0.7", + "erc20:eth:DDF": "2.0.7", + "erc20:eth:DEB": "2.0.7", + "erc20:eth:DEEZ": "2.0.7", + "erc20:eth:DENT": "2.0.7", + "erc20:eth:DGPT": "2.0.7", + "erc20:eth:DGX": "2.0.7", + "erc20:eth:DICE": "2.0.7", + "erc20:eth:DIVX": "2.0.7", + "erc20:eth:DKP": "2.0.7", + "erc20:eth:DLT": "2.0.7", + "erc20:eth:DMT": "2.0.7", + "erc20:eth:DNT": "2.0.7", + "erc20:eth:DNX": "2.0.7", + "erc20:eth:DPP": "2.0.7", + "erc20:eth:DRGN": "2.0.7", + "erc20:eth:DSC": "2.0.7", + "erc20:eth:DTH": "2.0.7", + "erc20:eth:DTR": "2.0.7", + "erc20:eth:DTT": "2.0.7", + "erc20:eth:DTX": "2.0.7", + "erc20:eth:DTx": "2.0.7", + "erc20:eth:Devcon2 Token": "2.0.7", + "erc20:eth:EAGLE": "2.0.7", + "erc20:eth:ECN": "2.0.7", + "erc20:eth:ECO2": "2.0.7", + "erc20:eth:EDC": "2.0.7", + "erc20:eth:EDG": "2.0.7", + "erc20:eth:EDO": "2.0.7", + "erc20:eth:EGT": "2.0.7", + "erc20:eth:EHT": "2.0.7", + "erc20:eth:ELF": "2.0.7", + "erc20:eth:ELIX": "2.0.7", + "erc20:eth:ELTCOIN": "2.0.7", + "erc20:eth:EMON": "2.0.7", + "erc20:eth:EMONT": "2.0.7", + "erc20:eth:EMT": "2.0.7", + "erc20:eth:EMV": "2.0.7", + "erc20:eth:ENC": "2.0.7", + "erc20:eth:ENG": "2.0.7", + "erc20:eth:ENJ": "2.0.7", + "erc20:eth:ENTRP": "2.0.7", + "erc20:eth:EOS": "2.0.7", + "erc20:eth:EPX": "2.0.7", + "erc20:eth:ESZ": "2.0.7", + "erc20:eth:ETBS": "2.0.7", + "erc20:eth:ETCH": "2.0.7", + "erc20:eth:ETHB": "2.0.7", + "erc20:eth:ETR": "2.0.7", + "erc20:eth:EURT": "2.0.7", + "erc20:eth:EVE": "2.0.7", + "erc20:eth:EVN": "2.0.7", + "erc20:eth:EVX": "2.0.7", + "erc20:eth:EXMR": "2.0.7", + "erc20:eth:FAM": "2.0.7", + "erc20:eth:FKX": "2.0.7", + "erc20:eth:FLIXX": "2.0.7", + "erc20:eth:FLP": "2.0.7", + "erc20:eth:FLR": "2.0.7", + "erc20:eth:FLUZ": "2.0.7", + "erc20:eth:FLX": "2.0.7", + "erc20:eth:FND": "2.0.7", + "erc20:eth:FRD": "2.0.7", + "erc20:eth:FTR": "2.0.7", + "erc20:eth:FTT": "2.0.7", + "erc20:eth:FUEL": "2.0.7", + "erc20:eth:FUN": "2.0.7", + "erc20:eth:FYN": "2.0.7", + "erc20:eth:GAM": "2.0.7", + "erc20:eth:GAVEL": "2.0.7", + "erc20:eth:GBT": "2.0.7", + "erc20:eth:GBX": "2.0.7", + "erc20:eth:GCP": "2.0.7", + "erc20:eth:GEE": "2.0.7", + "erc20:eth:GELD": "2.0.7", + "erc20:eth:GEN": "2.0.7", + "erc20:eth:GET": "2.0.7", + "erc20:eth:GIF": "2.0.7", + "erc20:eth:GIM": "2.0.7", + "erc20:eth:GMT": "2.0.7", + "erc20:eth:GNO": "2.0.7", + "erc20:eth:GOLDX": "2.0.7", + "erc20:eth:GRID": "2.0.7", + "erc20:eth:GROW": "2.0.7", + "erc20:eth:GTC": "2.0.7", + "erc20:eth:GTKT": "2.0.7", + "erc20:eth:GTO": "2.0.7", + "erc20:eth:GVT": "2.0.7", + "erc20:eth:GXC": "2.0.7", + "erc20:eth:GXVC": "2.0.7", + "erc20:eth:GZE": "2.0.7", + "erc20:eth:GZR": "2.0.7", + "erc20:eth:HAT": "2.0.7", + "erc20:eth:HAV": "2.0.7", + "erc20:eth:HDG": "2.0.7", + "erc20:eth:HGT": "2.0.7", + "erc20:eth:HIG": "2.0.7", + "erc20:eth:HKG": "2.0.7", + "erc20:eth:HKY": "2.0.7", + "erc20:eth:HMQ": "2.0.7", + "erc20:eth:HODL": "2.0.7", + "erc20:eth:HORSE": "2.0.7", + "erc20:eth:HST": "2.0.7", + "erc20:eth:HVN": "2.0.7", + "erc20:eth:HYDRO": "2.0.7", + "erc20:eth:Hdp": "2.0.7", + "erc20:eth:IAD": "2.0.7", + "erc20:eth:ICE": "2.0.7", + "erc20:eth:ICN": "2.0.7", + "erc20:eth:ICO": "2.0.7", + "erc20:eth:ICOS": "2.0.7", + "erc20:eth:ICX": "2.0.7", + "erc20:eth:IDEA": "2.0.7", + "erc20:eth:IFT": "2.0.7", + "erc20:eth:IIC": "2.0.7", + "erc20:eth:IKB": "2.0.7", + "erc20:eth:IMC": "2.0.7", + "erc20:eth:IMT": "2.0.7", + "erc20:eth:IND": "2.0.7", + "erc20:eth:INRM": "2.0.7", + "erc20:eth:INS": "2.0.7", + "erc20:eth:INSTAR": "2.0.7", + "erc20:eth:INXT": "2.0.7", + "erc20:eth:IOST": "2.0.7", + "erc20:eth:IOTX": "2.0.7", + "erc20:eth:IPL": "2.0.7", + "erc20:eth:IPSX": "2.0.7", + "erc20:eth:ITC": "2.0.7", + "erc20:eth:ITT": "2.0.7", + "erc20:eth:IXT": "2.0.7", + "erc20:eth:IoT": "2.0.7", + "erc20:eth:J8T": "2.0.7", + "erc20:eth:JET": "2.0.7", + "erc20:eth:JNT": "2.0.7", + "erc20:eth:JOY": "2.0.7", + "erc20:eth:JetCoins": "2.0.7", + "erc20:eth:KEE": "2.0.7", + "erc20:eth:KICK": "2.0.7", + "erc20:eth:KIN": "2.0.7", + "erc20:eth:KNC": "2.0.7", + "erc20:eth:KPR": "2.0.7", + "erc20:eth:KRL": "2.0.7", + "erc20:eth:KZN": "2.0.7", + "erc20:eth:LA": "2.0.7", + "erc20:eth:LALA": "2.0.7", + "erc20:eth:LDC": "2.0.7", + "erc20:eth:LEND": "2.0.7", + "erc20:eth:LFR": "2.0.7", + "erc20:eth:LGO": "2.0.7", + "erc20:eth:LGR": "2.0.7", + "erc20:eth:LIF": "2.0.7", + "erc20:eth:LIFE": "2.0.7", + "erc20:eth:LINK (Chainlink)": "2.0.7", + "erc20:eth:LIVE": "2.0.7", + "erc20:eth:LND": "2.0.7", + "erc20:eth:LOC": "2.0.7", + "erc20:eth:LOCI": "2.0.7", + "erc20:eth:LOCUS": "2.0.7", + "erc20:eth:LOK": "2.0.7", + "erc20:eth:LOOM": "2.0.7", + "erc20:eth:LPT": "2.0.7", + "erc20:eth:LRC": "2.0.7", + "erc20:eth:LUC": "2.0.7", + "erc20:eth:LUCK": "2.0.7", + "erc20:eth:LUM": "2.0.7", + "erc20:eth:LUN": "2.0.7", + "erc20:eth:LYS": "2.0.7", + "erc20:eth:M-ETH": "2.0.7", + "erc20:eth:MAD": "2.0.7", + "erc20:eth:MAN": "2.0.7", + "erc20:eth:MANA": "2.0.7", + "erc20:eth:MART": "2.0.7", + "erc20:eth:MBRS": "2.0.7", + "erc20:eth:MCAP": "2.0.7", + "erc20:eth:MCI": "2.0.7", + "erc20:eth:MCO": "2.0.7", + "erc20:eth:MDA": "2.0.7", + "erc20:eth:MESH": "2.0.7", + "erc20:eth:MEST": "2.0.7", + "erc20:eth:MFG": "2.0.7", + "erc20:eth:MGO": "2.0.7", + "erc20:eth:MKT": "2.0.7", + "erc20:eth:MNE": "2.0.7", + "erc20:eth:MNT": "2.0.7", + "erc20:eth:MNTP": "2.0.7", + "erc20:eth:MOD": "2.0.7", + "erc20:eth:MRL": "2.0.7", + "erc20:eth:MRP": "2.0.7", + "erc20:eth:MRV": "2.0.7", + "erc20:eth:MSP": "2.0.7", + "erc20:eth:MTH": "2.0.7", + "erc20:eth:MTL": "2.0.7", + "erc20:eth:MTN": "2.0.7", + "erc20:eth:MTR": "2.0.7", + "erc20:eth:MTRc": "2.0.7", + "erc20:eth:MTX": "2.0.7", + "erc20:eth:MUXE": "2.0.7", + "erc20:eth:MVP": "2.0.7", + "erc20:eth:MWAT": "2.0.7", + "erc20:eth:MYD": "2.0.7", + "erc20:eth:MYST": "2.0.7", + "erc20:eth:NAC": "2.0.7", + "erc20:eth:NANJ": "2.0.7", + "erc20:eth:NAVI": "2.0.7", + "erc20:eth:NBAI": "2.0.7", + "erc20:eth:NCT": "2.0.7", + "erc20:eth:NDC": "2.0.7", + "erc20:eth:NEC": "2.0.7", + "erc20:eth:NET": "2.0.7", + "erc20:eth:NEU": "2.0.7", + "erc20:eth:NGC": "2.0.7", + "erc20:eth:NIMFA": "2.0.7", + "erc20:eth:NMR": "2.0.7", + "erc20:eth:NOX": "2.0.7", + "erc20:eth:NPER": "2.0.7", + "erc20:eth:NPXS": "2.0.7", + "erc20:eth:NULS": "2.0.7", + "erc20:eth:NXX": "2.0.7", + "erc20:eth:NxC": "2.0.7", + "erc20:eth:OAK": "2.0.7", + "erc20:eth:OAX": "2.0.7", + "erc20:eth:OCC": "2.0.7", + "erc20:eth:OJX": "2.0.7", + "erc20:eth:OLD_MKR": "2.0.7", + "erc20:eth:OMG": "2.0.7", + "erc20:eth:ONEK": "2.0.7", + "erc20:eth:OPT": "2.0.7", + "erc20:eth:ORBS": "2.0.7", + "erc20:eth:OST": "2.0.7", + "erc20:eth:Ox Fina": "2.0.7", + "erc20:eth:PAL": "2.0.7", + "erc20:eth:PARETO": "2.0.7", + "erc20:eth:PAT": "2.0.7", + "erc20:eth:PATENTS": "2.0.7", + "erc20:eth:PATH": "2.0.7", + "erc20:eth:PAY": "2.0.7", + "erc20:eth:PBL": "2.0.7", + "erc20:eth:PBT": "2.0.7", + "erc20:eth:PCH": "2.0.7", + "erc20:eth:PCL": "2.0.7", + "erc20:eth:PCLOLD": "2.0.7", + "erc20:eth:PET": "2.0.7", + "erc20:eth:PETRO": "2.0.7", + "erc20:eth:PEXT": "2.0.7", + "erc20:eth:PIPL": "2.0.7", + "erc20:eth:PIX": "2.0.7", + "erc20:eth:PLASMA": "2.0.7", + "erc20:eth:PLBT": "2.0.7", + "erc20:eth:PLR": "2.0.7", + "erc20:eth:PLU": "2.0.7", + "erc20:eth:POE": "2.0.7", + "erc20:eth:POIN": "2.0.7", + "erc20:eth:POLY": "2.0.7", + "erc20:eth:POOL": "2.0.7", + "erc20:eth:POS": "2.0.7", + "erc20:eth:POWR": "2.0.7", + "erc20:eth:PPP": "2.0.7", + "erc20:eth:PPT": "2.0.7", + "erc20:eth:PRE": "2.0.7", + "erc20:eth:PRG": "2.0.7", + "erc20:eth:PRL": "2.0.7", + "erc20:eth:PRO": "2.0.7", + "erc20:eth:PRON": "2.0.7", + "erc20:eth:PRS": "2.0.7", + "erc20:eth:PRSP": "2.0.7", + "erc20:eth:PT": "2.0.7", + "erc20:eth:PTOY": "2.0.7", + "erc20:eth:PTWO": "2.0.7", + "erc20:eth:PUC": "2.0.7", + "erc20:eth:PXT": "2.0.7", + "erc20:eth:QASH": "2.0.7", + "erc20:eth:QAU": "2.0.7", + "erc20:eth:QBX": "2.0.7", + "erc20:eth:QRG": "2.0.7", + "erc20:eth:QRL": "2.0.7", + "erc20:eth:QSP": "2.0.7", + "erc20:eth:QTQ": "2.0.7", + "erc20:eth:QTUM": "2.0.7", + "erc20:eth:RAO": "2.0.7", + "erc20:eth:RBLX": "2.0.7", + "erc20:eth:RCN": "2.0.7", + "erc20:eth:RCT": "2.0.7", + "erc20:eth:REA": "2.0.7", + "erc20:eth:REBL": "2.0.7", + "erc20:eth:RED": "2.0.7", + "erc20:eth:REN": "2.0.7", + "erc20:eth:REQ": "2.0.7", + "erc20:eth:REX": "2.0.7", + "erc20:eth:RFR": "2.0.7", + "erc20:eth:RIPT": "2.0.7", + "erc20:eth:RLC": "2.0.7", + "erc20:eth:RLT": "2.0.7", + "erc20:eth:RLTY": "2.0.7", + "erc20:eth:RLX": "2.0.7", + "erc20:eth:RNDR": "2.0.7", + "erc20:eth:ROCK": "2.0.7", + "erc20:eth:ROK": "2.0.7", + "erc20:eth:ROUND": "2.0.7", + "erc20:eth:RPL": "2.0.7", + "erc20:eth:RTN": "2.0.7", + "erc20:eth:RVL": "2.0.7", + "erc20:eth:RVT": "2.0.7", + "erc20:eth:S-A-PAT": "2.0.7", + "erc20:eth:S-ETH": "2.0.7", + "erc20:eth:SALT": "2.0.7", + "erc20:eth:SAN": "2.0.7", + "erc20:eth:SCANDI": "2.0.7", + "erc20:eth:SCL": "2.0.7", + "erc20:eth:SENSE": "2.0.7", + "erc20:eth:SET": "2.0.7", + "erc20:eth:SEXY": "2.0.7", + "erc20:eth:SGEL": "2.0.7", + "erc20:eth:SHIT": "2.0.7", + "erc20:eth:SIFT": "2.0.7", + "erc20:eth:SIG": "2.0.7", + "erc20:eth:SKIN": "2.0.7", + "erc20:eth:SKO1": "2.0.7", + "erc20:eth:SKR": "2.0.7", + "erc20:eth:SLT": "2.0.7", + "erc20:eth:SNC": "2.0.7", + "erc20:eth:SND": "2.0.7", + "erc20:eth:SNG": "2.0.7", + "erc20:eth:SNGLS": "2.0.7", + "erc20:eth:SNIP": "2.0.7", + "erc20:eth:SNM": "2.0.7", + "erc20:eth:SNOV": "2.0.7", + "erc20:eth:SNT": "2.0.7", + "erc20:eth:SOL": "2.0.7", + "erc20:eth:SPANK": "2.0.7", + "erc20:eth:SPARC": "2.0.7", + "erc20:eth:SPARTA": "2.0.7", + "erc20:eth:SPF": "2.0.7", + "erc20:eth:SPN": "2.0.7", + "erc20:eth:SRN": "2.0.7", + "erc20:eth:SSH": "2.0.7", + "erc20:eth:STAC": "2.0.7", + "erc20:eth:STAR": "2.0.7", + "erc20:eth:STC": "2.0.7", + "erc20:eth:STK": "2.0.7", + "erc20:eth:STN": "2.0.7", + "erc20:eth:STORJ": "2.0.7", + "erc20:eth:STORM": "2.0.7", + "erc20:eth:STP": "2.0.7", + "erc20:eth:STQ": "2.0.7", + "erc20:eth:STRC": "2.0.7", + "erc20:eth:STX": "2.0.7", + "erc20:eth:SUB": "2.0.7", + "erc20:eth:SWM": "2.0.7", + "erc20:eth:SWT": "2.0.7", + "erc20:eth:SXDT": "2.0.7", + "erc20:eth:SXUT": "2.0.7", + "erc20:eth:SYN": "2.0.7", + "erc20:eth:SenSatorI": "2.0.7", + "erc20:eth:TAU": "2.0.7", + "erc20:eth:TBC2": "2.0.7", + "erc20:eth:TBT": "2.0.7", + "erc20:eth:TDH": "2.0.7", + "erc20:eth:TEL": "2.0.7", + "erc20:eth:TFL": "2.0.7", + "erc20:eth:THETA": "2.0.7", + "erc20:eth:THUG": "2.0.7", + "erc20:eth:TIME": "2.0.7", + "erc20:eth:TIO": "2.0.7", + "erc20:eth:TIX": "2.0.7", + "erc20:eth:TKN": "2.0.7", + "erc20:eth:TNT": "2.0.7", + "erc20:eth:TRCN": "2.0.7", + "erc20:eth:TRST": "2.0.7", + "erc20:eth:TRX": "2.0.7", + "erc20:eth:TWN": "2.0.7", + "erc20:eth:TWNKL": "2.0.7", + "erc20:eth:TaaS": "2.0.7", + "erc20:eth:UKG": "2.0.7", + "erc20:eth:UQC": "2.0.7", + "erc20:eth:USDM": "2.0.7", + "erc20:eth:USDT": "2.0.7", + "erc20:eth:UTK": "2.0.7", + "erc20:eth:UTN-P": "2.0.7", + "erc20:eth:UUU": "2.0.7", + "erc20:eth:Unicorn": "2.0.7", + "erc20:eth:VDOC": "2.0.7", + "erc20:eth:VEE": "2.0.7", + "erc20:eth:VEN": "2.0.7", + "erc20:eth:VENUS": "2.0.7", + "erc20:eth:VERI": "2.0.7", + "erc20:eth:VIB": "2.0.7", + "erc20:eth:VIEW": "2.0.7", + "erc20:eth:VIT": "2.0.7", + "erc20:eth:VIU": "2.0.7", + "erc20:eth:VLD": "2.0.7", + "erc20:eth:VOC": "2.0.7", + "erc20:eth:VOISE": "2.0.7", + "erc20:eth:VRS": "2.0.7", + "erc20:eth:VSL": "2.0.7", + "erc20:eth:WAX": "2.0.7", + "erc20:eth:WBA": "2.0.7", + "erc20:eth:WCN": "2.0.7", + "erc20:eth:WCT": "2.0.7", + "erc20:eth:WETH": "2.0.7", + "erc20:eth:WHEN": "2.0.7", + "erc20:eth:WIC": "2.0.7", + "erc20:eth:WILD": "2.0.7", + "erc20:eth:WINGS": "2.0.7", + "erc20:eth:WORK": "2.0.7", + "erc20:eth:WPC": "2.0.7", + "erc20:eth:WPR": "2.0.7", + "erc20:eth:WRK": "2.0.7", + "erc20:eth:WTC": "2.0.7", + "erc20:eth:WYS": "2.0.7", + "erc20:eth:WYV": "2.0.7", + "erc20:eth:WaBi": "2.0.7", + "erc20:eth:WiC": "2.0.7", + "erc20:eth:X8X": "2.0.7", + "erc20:eth:XAUR": "2.0.7", + "erc20:eth:XBP": "2.0.7", + "erc20:eth:XCC": "2.0.7", + "erc20:eth:XFS": "2.0.7", + "erc20:eth:XGG": "2.0.7", + "erc20:eth:XGM": "2.0.7", + "erc20:eth:XGT": "2.0.7", + "erc20:eth:XID": "2.0.7", + "erc20:eth:XNK": "2.0.7", + "erc20:eth:XNN": "2.0.7", + "erc20:eth:XNT": "2.0.7", + "erc20:eth:XRL": "2.0.7", + "erc20:eth:XSC": "2.0.7", + "erc20:eth:YUPIE": "2.0.7", + "erc20:eth:ZAP": "2.0.7", + "erc20:eth:ZCS": "2.0.7", + "erc20:eth:ZIL": "2.0.7", + "erc20:eth:ZMN": "2.0.7", + "erc20:eth:ZST": "2.0.7", + "erc20:eth:cV": "2.0.7", + "erc20:eth:eBCH": "2.0.7", + "erc20:eth:eBTC": "2.0.7", + "erc20:eth:eGAS": "2.0.7", + "erc20:eth:eUSD": "2.0.7", + "erc20:eth:eosDAC": "2.0.7", + "erc20:eth:nCash": "2.0.7", + "erc20:eth:nUSD": "2.0.7", + "erc20:eth:onG": "2.0.7", + "erc20:kov:Aeternity": "2.0.7", + "erc20:rin:AETH": "2.0.7", + "erc20:rin:BHNT": "2.0.7", + "erc20:rin:CTGA": "2.0.7", + "erc20:rin:PPD": "2.0.7", + "erc20:rin:WALL": "2.0.7", + "erc20:rop:ILSC": "2.0.7", + "erc20:ubq:BEER": "2.0.7", + "erc20:ubq:CEFS": "2.0.7", + "erc20:ubq:DOT": "2.0.7", + "erc20:ubq:QWARK": "2.0.7", + "erc20:ubq:RICKS": "2.0.7", + "eth:AKA": "soon", + "eth:ATH": "soon", + "eth:CLO": "2.0.7", + "eth:EGEM": "2.0.7", + "eth:ELLA": "2.0.7", + "eth:EOSC": "2.0.7", + "eth:ESN": "soon", + "eth:ETC": "2.0.7", + "eth:ETH": "2.0.7", + "eth:ETHO": "soon", + "eth:ETSC": "2.0.7", + "eth:EXP": "2.0.7", + "eth:GO": "2.0.7", + "eth:MUSIC": "soon", + "eth:PIRL": "soon", + "eth:RSK": "2.0.7", + "eth:UBQ": "2.0.7", + "eth:tETC": "2.0.7", + "eth:tKOV": "2.0.7", + "eth:tRIN": "2.0.7", + "eth:tROP": "2.0.7", + "eth:tRSK": "2.0.7", + "misc:ADA": "soon", + "misc:LSK": "2.0.7", + "misc:XLM": "soon", + "misc:XMR": "soon", + "misc:XRP": "soon", + "misc:XTZ": "soon", + "nem:BREEZE": "2.0.7", + "nem:DIM": "2.0.7", + "nem:DIMTOK": "2.0.7", + "nem:PAC:CHS": "2.0.7", + "nem:PAC:HRT": "2.0.7", + "nem:XEM": "2.0.7" + }, + "unsupported": { + "bitcoin:BTX": "address_type collides with Bitcoin", + "bitcoin:CRW": "address_type collides with Bitcoin", + "bitcoin:DCR": "not implemented on Trezor T", + "bitcoin:TDCR": "not implemented on Trezor T", + "bitcoin:TRC": "address_type collides with Bitcoin", + "erc20:etc:PLAY": "(AUTO) duplicate key", + "erc20:eth:ATH": "(AUTO) duplicate key", + "erc20:eth:ATH (AIgatha Token)": "(AUTO) duplicate key", + "erc20:eth:BTL (Battle)": "(AUTO) duplicate key", + "erc20:eth:BTL (Bitlle)": "(AUTO) duplicate key", + "erc20:eth:CAR": "(AUTO) duplicate key", + "erc20:eth:CAR (CarBlock)": "(AUTO) duplicate key", + "erc20:eth:CARD:0": "(AUTO) duplicate key", + "erc20:eth:CARD:1": "(AUTO) duplicate key", + "erc20:eth:CDX:0": "(AUTO) duplicate key", + "erc20:eth:CDX:1": "(AUTO) duplicate key", + "erc20:eth:COSS:0": "(AUTO) duplicate key", + "erc20:eth:COSS:1": "(AUTO) duplicate key", + "erc20:eth:DAI": "(AUTO) duplicate key", + "erc20:eth:DEPO": "(AUTO) duplicate key", + "erc20:eth:DEPO (Depository Network)": "(AUTO) duplicate key", + "erc20:eth:DGD": "(AUTO) duplicate key", + "erc20:eth:DOW:0": "(AUTO) duplicate key", + "erc20:eth:DOW:1": "(AUTO) duplicate key", + "erc20:eth:DROP": "(AUTO) duplicate key", + "erc20:eth:DROP (dropil)": "(AUTO) duplicate key", + "erc20:eth:DRP:0": "(AUTO) duplicate key", + "erc20:eth:DRP:1": "(AUTO) duplicate key", + "erc20:eth:DUBI:0": "(AUTO) duplicate key", + "erc20:eth:DUBI:1": "(AUTO) duplicate key", + "erc20:eth:EDU:0": "(AUTO) duplicate key", + "erc20:eth:EDU:1": "(AUTO) duplicate key", + "erc20:eth:FANX:0": "(AUTO) duplicate key", + "erc20:eth:FANX:1": "(AUTO) duplicate key", + "erc20:eth:FLMC:0": "(AUTO) duplicate key", + "erc20:eth:FLMC:1": "(AUTO) duplicate key", + "erc20:eth:FTC": "(AUTO) duplicate key", + "erc20:eth:FUCK:0": "(AUTO) duplicate key", + "erc20:eth:FUCK:1": "(AUTO) duplicate key", + "erc20:eth:GANA:0": "(AUTO) duplicate key", + "erc20:eth:GANA:1": "(AUTO) duplicate key", + "erc20:eth:GNT": "(AUTO) duplicate key", + "erc20:eth:GUP": "(AUTO) duplicate key", + "erc20:eth:HOT:0": "(AUTO) duplicate key", + "erc20:eth:HOT:1": "(AUTO) duplicate key", + "erc20:eth:JBX:0": "(AUTO) duplicate key", + "erc20:eth:JBX:1": "(AUTO) duplicate key", + "erc20:eth:KC": "(AUTO) duplicate key", + "erc20:eth:KEY:0": "(AUTO) duplicate key", + "erc20:eth:KEY:1": "(AUTO) duplicate key", + "erc20:eth:LEMO:0": "(AUTO) duplicate key", + "erc20:eth:LEMO:1": "(AUTO) duplicate key", + "erc20:eth:LEMO:2": "(AUTO) duplicate key", + "erc20:eth:LINK Platform": "(AUTO) duplicate key", + "erc20:eth:LNC": "(AUTO) duplicate key", + "erc20:eth:LNC (Linker Coin)": "(AUTO) duplicate key", + "erc20:eth:MIT": "(AUTO) duplicate key", + "erc20:eth:MIT (Mychatcoin)": "(AUTO) duplicate key", + "erc20:eth:MKR": "(AUTO) duplicate key", + "erc20:eth:MLN": "(AUTO) duplicate key", + "erc20:eth:MTC:0": "(AUTO) duplicate key", + "erc20:eth:MTC:1": "(AUTO) duplicate key", + "erc20:eth:NONE": "(AUTO) duplicate key", + "erc20:eth:NXX OLD": "(AUTO) duplicate key", + "erc20:eth:OHNI:0": "(AUTO) duplicate key", + "erc20:eth:OHNI:1": "(AUTO) duplicate key", + "erc20:eth:OPEN:0": "(AUTO) duplicate key", + "erc20:eth:OPEN:1": "(AUTO) duplicate key", + "erc20:eth:PLAY": "(AUTO) duplicate key", + "erc20:eth:PRPS:0": "(AUTO) duplicate key", + "erc20:eth:PRPS:1": "(AUTO) duplicate key", + "erc20:eth:PTC": "(AUTO) duplicate key", + "erc20:eth:RDN": "(AUTO) duplicate key", + "erc20:eth:REP:0": "(AUTO) duplicate key", + "erc20:eth:REP:1": "(AUTO) duplicate key", + "erc20:eth:SGT:0": "(AUTO) duplicate key", + "erc20:eth:SGT:1": "(AUTO) duplicate key", + "erc20:eth:SKRP:0": "(AUTO) duplicate key", + "erc20:eth:SKRP:1": "(AUTO) duplicate key", + "erc20:eth:SKRP:2": "(AUTO) duplicate key", + "erc20:eth:SMART": "(AUTO) duplicate key", + "erc20:eth:SMT:0": "(AUTO) duplicate key", + "erc20:eth:SMT:1": "(AUTO) duplicate key", + "erc20:eth:SMT:2": "(AUTO) duplicate key", + "erc20:eth:SS:0": "(AUTO) duplicate key", + "erc20:eth:SS:1": "(AUTO) duplicate key", + "erc20:eth:TRC": "(AUTO) duplicate key", + "erc20:eth:UMKA:0": "(AUTO) duplicate key", + "erc20:eth:UMKA:1": "(AUTO) duplicate key", + "erc20:eth:VIBEX:0": "(AUTO) duplicate key", + "erc20:eth:VIBEX:1": "(AUTO) duplicate key", + "erc20:eth:WHO:0": "(AUTO) duplicate key", + "erc20:eth:WHO:1": "(AUTO) duplicate key", + "erc20:eth:WOLK:0": "(AUTO) duplicate key", + "erc20:eth:WOLK:1": "(AUTO) duplicate key", + "erc20:eth:YEED:0": "(AUTO) duplicate key", + "erc20:eth:YEED:1": "(AUTO) duplicate key", + "erc20:eth:ZRX": "(AUTO) duplicate key", + "erc20:kov:DAI": "(AUTO) duplicate key", + "erc20:kov:DGD": "(AUTO) duplicate key", + "erc20:kov:GNT": "(AUTO) duplicate key", + "erc20:kov:GUP": "(AUTO) duplicate key", + "erc20:kov:MKR": "(AUTO) duplicate key", + "erc20:kov:MLN": "(AUTO) duplicate key", + "erc20:kov:REP": "(AUTO) duplicate key", + "erc20:kov:ZRX": "(AUTO) duplicate key", + "erc20:rin:KC": "(AUTO) duplicate key", + "erc20:rin:NONE": "(AUTO) duplicate key", + "erc20:rin:RDN": "(AUTO) duplicate key", + "erc20:rop:NONE": "(AUTO) duplicate key" + } + }, + "webwallet": { + "supported": { + "bitcoin:BCH": true, + "bitcoin:BTC": true, + "bitcoin:BTCP": true, + "bitcoin:BTG": true, + "bitcoin:DASH": true, + "bitcoin:DCR": true, + "bitcoin:DGB": true, + "bitcoin:DOGE": true, + "bitcoin:FJC": true, + "bitcoin:GRS": true, + "bitcoin:LTC": true, + "bitcoin:MONA": true, + "bitcoin:TAZ": true, + "bitcoin:TDCR": true, + "bitcoin:TEST": true, + "bitcoin:TLTC": true, + "bitcoin:VIA": true, + "bitcoin:VTC": true, + "bitcoin:XZC": true, + "bitcoin:ZEC": true, + "bitcoin:tGRS": true + }, + "unsupported": {} + } } diff --git a/tools/README.md b/tools/README.md new file mode 100644 index 000000000..9a657bb38 --- /dev/null +++ b/tools/README.md @@ -0,0 +1,61 @@ +# Tools directory + +### `coin_info.py` + +Central module that extracts information from jsons in `defs/` directory. +Its most important function is `get_all()`. + +### `cointool.py` + +Code and data generator. Has the following functions: + +* __`check`__: runs validations. Currently, that is: + * schema validity in `defs/coins/*.json` + * availability of bitcore/blockbook backends + * icon format + +* __`coins_json`__: generates `coins.json` for use in python-trezor, connect + and wallet. By default outputs to current directory. + +* __`coindefs`__: generates `coindefs.json`, intended future format for sending + coin definitions to Trezor. + +* __`render`__: for every `filename.ext.mako` passed (or for all found in directory), + renders the Mako template with coin definitions and stores as corresponding + `filename.ext`. This is used to generate code in trezor-mcu and trezor-core. + +### `coins_details.py` + +Regenerates `defs/coins_details.json`, which is a catalog of coins for https://trezor.io/coins. + +All information is generated from coin definitions in `defs/`, support info is +taken either from `support.json`, or assumed (see `coin_info.support_info()`). + +If needed, any value can be overriden in `coins_details.override.json`. + +### `support.py` + +Support info management. Ensures `support.json` is in the proper format. Has the +following subcommands: + +* __`check`__: checks validity of support data. Ensures that data is valid, + there are no orphaned keys in `support.json`, no known coins have missing + support info, etc. + +* __`show `__: searches coin database, matching key (`coin:BTC`), + name ("Bitcoin") or shortcut / ticker symbol ("BTC"). Displays all coins that match + and their support info, if found. + +* __`set [symbol=value]...`__: updates support info for coin key (`coin:BTC`, + can be found with `support.py show`). Basic `symbol`s are: `trezor1 trezor2 + connect webwallet`. Anything else is considered a link name: + `"Electrum=https://electrum.org"` + Allowed `value`s are `yes`, `no`, `soon`, `planned`, URLs and firmware version + numbers. Empty value (`trezor1=`) clears the respective symbol. + +### `requirements.txt` + +List of Python requiremens for all tools in `pip` format. Set up your environment with +`pip3 install -r requirements.txt`, or `pipenv install -r requirements.txt`. + +Python 3.6 or higher is required. diff --git a/tools/build_coins.py b/tools/build_coins.py deleted file mode 100755 index 498f8f403..000000000 --- a/tools/build_coins.py +++ /dev/null @@ -1,268 +0,0 @@ -#!/usr/bin/env python3 - -# This script generates coins.json files from the definitions in defs/ -# -# - `./build_coins.py` generates a big file with everything -# - `./build_coins.py XXX` generates a file with coins supported by XXX -# for example: `./build_coins.py webwallet` or `./build_coins.py trezor1` -# - `./build_coins.py XXX --defs` also adds protobuf definitions with TOIF icon -# -# generated file is coins.json in current directory, -# and coindefs.json if --def is enabled - -import json -import glob -import re -import os -import sys - - -BUILD_DEFS = '--defs' in sys.argv -if BUILD_DEFS: - from binascii import unhexlify - from hashlib import sha256 - import ed25519 - from PIL import Image - from trezorlib.protobuf import dump_message - from coindef import CoinDef - BUILD_DEFS = True - -TEST_BACKEND = '--test-backend' in sys.argv -if TEST_BACKEND: - import requests - - -def check_type(val, types, nullable=False, empty=False, regex=None, choice=None): # noqa:E501 - # check nullable - if nullable and val is None: - return True - # check empty - try: - if not empty and len(val) == 0: - return False - except TypeError: - pass - # check regex - if regex is not None: - if types is not str: - return False - m = re.match(regex, val) - if not m: - return False - # check choice - if choice is not None: - if val not in choice: - return False - # check type - if isinstance(types, list): - return True in [isinstance(val, t) for t in types] - else: - return isinstance(val, types) - - -def get_hash_genesis_block(api): - r = requests.get(api + '/api/block-index/0') - j = r.json() - return j['blockHash'] - - -def validate_coin(coin): - assert check_type(coin['coin_name'], str, regex=r'^[A-Z]') - assert check_type(coin['coin_shortcut'], str, regex=r'^[A-Zt][A-Z][A-Z]+$') - assert check_type(coin['coin_label'], str, regex=r'^[A-Z]') - assert check_type(coin['website'], str, regex=r'^http.*[^/]$') - assert check_type(coin['github'], str, regex=r'^https://github.com/.*[^/]$') # noqa:E501 - assert check_type(coin['maintainer'], str) - assert check_type(coin['curve_name'], str, choice=['secp256k1', 'secp256k1_decred', 'secp256k1_groestl']) # noqa:E501 - assert check_type(coin['address_type'], int) - assert check_type(coin['address_type_p2sh'], int) - assert coin['address_type'] != coin['address_type_p2sh'] - assert check_type(coin['maxfee_kb'], int) - assert check_type(coin['minfee_kb'], int) - assert coin['maxfee_kb'] >= coin['minfee_kb'] - assert check_type(coin['hash_genesis_block'], str, regex=r'^[0-9a-f]{64}$') - assert check_type(coin['xprv_magic'], int) - assert check_type(coin['xpub_magic'], int) - assert check_type(coin['xpub_magic_segwit_p2sh'], int, nullable=True) - assert check_type(coin['xpub_magic_segwit_native'], int, nullable=True) - assert coin['xprv_magic'] != coin['xpub_magic'] - assert coin['xprv_magic'] != coin['xpub_magic_segwit_p2sh'] - assert coin['xprv_magic'] != coin['xpub_magic_segwit_native'] - assert coin['xpub_magic'] != coin['xpub_magic_segwit_p2sh'] - assert coin['xpub_magic'] != coin['xpub_magic_segwit_native'] - assert coin['xpub_magic_segwit_p2sh'] is None or coin['xpub_magic_segwit_native'] is None or coin['xpub_magic_segwit_p2sh'] != coin['xpub_magic_segwit_native'] # noqa:E501 - assert check_type(coin['slip44'], int) - assert check_type(coin['segwit'], bool) - assert check_type(coin['decred'], bool) - assert check_type(coin['fork_id'], int, nullable=True) - assert check_type(coin['force_bip143'], bool) - assert check_type(coin['bip115'], bool) - assert check_type(coin['version_group_id'], int, nullable=True) - assert check_type(coin['default_fee_b'], dict) - assert check_type(coin['dust_limit'], int) - assert check_type(coin['blocktime_seconds'], int) - assert check_type(coin['signed_message_header'], str) - assert check_type(coin['uri_prefix'], str, regex=r'^[a-z]+$') - assert check_type(coin['min_address_length'], int) - assert check_type(coin['max_address_length'], int) - assert coin['max_address_length'] >= coin['min_address_length'] - assert check_type(coin['bech32_prefix'], str, regex=r'^[a-z]+$', nullable=True) - assert check_type(coin['cashaddr_prefix'], str, regex=r'^[a-z]+$', nullable=True) - assert check_type(coin['bitcore'], list, empty=True) - for bc in coin['bitcore']: - assert not bc.endswith('/') - if TEST_BACKEND: - assert get_hash_genesis_block(bc) == coin['hash_genesis_block'] - assert check_type(coin['blockbook'], list, empty=True) - for bb in coin['blockbook']: - assert not bb.endswith('/') - if TEST_BACKEND: - assert get_hash_genesis_block(bb) == coin['hash_genesis_block'] - - -def validate_icon(icon): - assert icon.size == (96, 96) - assert icon.mode == 'RGBA' - - -class Writer: - - def __init__(self): - self.buf = bytearray() - - def write(self, buf): - self.buf.extend(buf) - - -def serialize(coin, icon): - c = dict(coin) - c['signed_message_header'] = c['signed_message_header'].encode() - c['hash_genesis_block'] = unhexlify(c['hash_genesis_block']) - c['icon'] = icon - msg = CoinDef(**c) - w = Writer() - dump_message(w, msg) - return bytes(w.buf) - - -def sign(data): - h = sha256(data).digest() - sign_key = ed25519.SigningKey(b'A' * 32) - return sign_key.sign(h) - - -# conversion copied from trezor-core/tools/png2toi -# TODO: extract into common module in python-trezor -def convert_icon(icon): - import struct - import zlib - w, h = 32, 32 - icon = icon.resize((w, h), Image.LANCZOS) - # remove alpha channel, replace with black - bg = Image.new('RGBA', icon.size, (0, 0, 0, 255)) - icon = Image.alpha_composite(bg, icon) - # process pixels - pix = icon.load() - data = bytes() - for j in range(h): - for i in range(w): - r, g, b, _ = pix[i, j] - c = ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | ((b & 0xF8) >> 3) - data += struct.pack('>H', c) - z = zlib.compressobj(level=9, wbits=10) - zdata = z.compress(data) + z.flush() - zdata = zdata[2:-4] # strip header and checksum - return zdata - - -def process_json(fn): - print(os.path.basename(fn), end=' ... ') - j = json.load(open(fn)) - validate_coin(j) - if BUILD_DEFS: - i = Image.open(fn.replace('.json', '.png')) - validate_icon(i) - ser = serialize(j, convert_icon(i)) - sig = sign(ser) - definition = (sig + ser).hex() - print('OK') - return j, definition - else: - print('OK') - return j, None - - -def process(for_device=None): - scriptdir = os.path.dirname(os.path.realpath(__file__)) - - support_json = json.load(open(scriptdir + '/../defs/support.json')) - if for_device is not None: - support_list = support_json[for_device].keys() - else: - support_list = None - - coins = {} - defs = {} - for fn in glob.glob(scriptdir + '/../defs/coins/*.json'): - c, d = process_json(fn) - n = c['coin_name'] - c['support'] = {} - for s in support_json.keys(): - c['support'][s] = support_json[s][n] if n in support_json[s] else None # noqa:E501 - if support_list is None or n in support_list: - coins[n] = c - defs[n] = d - - return (coins, defs) - - -if __name__ == '__main__': - if len(sys.argv) > 1 and not sys.argv[1].startswith('-'): - for_device = sys.argv[1] - else: - for_device = None - - (coins, defs) = process(for_device) - - json.dump(coins, open('coins.json', 'w'), indent=4, sort_keys=True) - if BUILD_DEFS: - json.dump(defs, open('coindefs.json', 'w'), indent=4, sort_keys=True) - - # check for colliding address versions - at_p2pkh = {} - at_p2sh = {} - slip44 = {} - - for n, c in coins.items(): - s = c['slip44'] - if s not in slip44: - slip44[s] = [] - if not(n.endswith('Testnet') and s == 1): - slip44[s].append(n) - if c['cashaddr_prefix']: # skip cashaddr currencies - continue - a1, a2 = c['address_type'], c['address_type_p2sh'] - if a1 not in at_p2pkh: - at_p2pkh[a1] = [] - if a2 not in at_p2sh: - at_p2sh[a2] = [] - at_p2pkh[a1].append(n) - at_p2sh[a2].append(n) - - print() - print('Colliding address_types for P2PKH:') - for k, v in at_p2pkh.items(): - if len(v) >= 2: - print('-', k, ':', ','.join(v)) - - print() - print('Colliding address_types for P2SH:') - for k, v in at_p2sh.items(): - if len(v) >= 2: - print('-', k, ':', ','.join(v)) - - print() - print('Colliding SLIP44 constants:') - for k, v in slip44.items(): - if len(v) >= 2: - print('-', k, ':', ','.join(v)) diff --git a/tools/coin_info.py b/tools/coin_info.py new file mode 100755 index 000000000..4c4617ba4 --- /dev/null +++ b/tools/coin_info.py @@ -0,0 +1,515 @@ +#!/usr/bin/env python3 +from binascii import unhexlify +from collections import defaultdict, OrderedDict +import re +import os +import json +import glob +import logging + +try: + import requests +except ImportError: + requests = None + +log = logging.getLogger(__name__) + +DEFS_DIR = os.path.abspath( + os.environ.get("DEFS_DIR") or os.path.join(os.path.dirname(__file__), "..", "defs") +) + + +def load_json(*path): + """Convenience function to load a JSON file from DEFS_DIR.""" + if len(path) == 1 and path[0].startswith("/"): + filename = path[0] + else: + filename = os.path.join(DEFS_DIR, *path) + + with open(filename) as f: + return json.load(f, object_pairs_hook=OrderedDict) + + +# ====== CoinsInfo ====== + + +class CoinsInfo(dict): + """Collection of information about all known kinds of coins. + + It contains the following lists: + `bitcoin` for btc-like coins, + `eth` for ethereum networks, + `erc20` for ERC20 tokens, + `nem` for NEM mosaics, + `misc` for other networks. + + Accessible as a dict or by attribute: `info["misc"] == info.misc` + """ + + def as_list(self): + return sum(self.values(), []) + + def as_dict(self): + return {coin["key"]: coin for coin in self.as_list()} + + def __getattr__(self, attr): + if attr in self: + return self[attr] + else: + raise AttributeError(attr) + + +# ====== coin validation ====== + + +def check_type(val, types, nullable=False, empty=False, regex=None, choice=None): + # check nullable + if val is None: + if nullable: + return + else: + raise ValueError("Missing required value") + + # check type + if not isinstance(val, types): + raise TypeError(f"Wrong type (expected: {types})") + + # check empty + if isinstance(val, (list, dict)) and not empty and not val: + raise ValueError("Empty collection") + + # check regex + if regex is not None: + if types is not str: + raise TypeError("Wrong type for regex check") + if not re.search(regex, val): + raise ValueError(f"Value does not match regex {regex}") + + # check choice + if choice is not None and val not in choice: + choice_str = ", ".join(choice) + raise ValueError(f"Value not allowed, use one of: {choice_str}") + + +def check_key(key, types, optional=False, **kwargs): + def do_check(coin): + if key not in coin: + if optional: + return + else: + raise KeyError(f"{key}: Missing key") + try: + check_type(coin[key], types, **kwargs) + except Exception as e: + raise ValueError(f"{key}: {e}") from e + + return do_check + + +BTC_CHECKS = [ + check_key("coin_name", str, regex=r"^[A-Z]"), + check_key("coin_shortcut", str, regex=r"^t?[A-Z]{3,}$"), + check_key("coin_label", str, regex=r"^[A-Z]"), + check_key("website", str, regex=r"^http.*[^/]$"), + check_key("github", str, regex=r"^https://github.com/.*[^/]$"), + check_key("maintainer", str), + check_key( + "curve_name", str, choice=["secp256k1", "secp256k1_decred", "secp256k1_groestl"] + ), + check_key("address_type", int), + check_key("address_type_p2sh", int), + check_key("maxfee_kb", int), + check_key("minfee_kb", int), + check_key("hash_genesis_block", str, regex=r"^[0-9a-f]{64}$"), + check_key("xprv_magic", int), + check_key("xpub_magic", int), + check_key("xpub_magic_segwit_p2sh", int, nullable=True), + check_key("xpub_magic_segwit_native", int, nullable=True), + check_key("slip44", int), + check_key("segwit", bool), + check_key("decred", bool), + check_key("fork_id", int, nullable=True), + check_key("force_bip143", bool), + check_key("bip115", bool), + check_key("version_group_id", int, nullable=True), + check_key("default_fee_b", dict), + check_key("dust_limit", int), + check_key("blocktime_seconds", int), + check_key("signed_message_header", str), + check_key("uri_prefix", str, regex=r"^[a-z]+$"), + check_key("min_address_length", int), + check_key("max_address_length", int), + check_key("bech32_prefix", str, regex=r"^[a-z]+$", nullable=True), + check_key("cashaddr_prefix", str, regex=r"^[a-z]+$", nullable=True), + check_key("bitcore", list, empty=True), + check_key("blockbook", list, empty=True), +] + + +def validate_btc(coin): + errors = [] + for check in BTC_CHECKS: + try: + check(coin) + except Exception as e: + errors.append(str(e)) + + magics = [ + coin[k] + for k in ( + "xprv_magic", + "xpub_magic", + "xpub_magic_segwit_p2sh", + "xpub_magic_segwit_native", + ) + if coin[k] is not None + ] + # each of those must be unique + # therefore length of list == length of set of unique values + if len(magics) != len(set(magics)): + errors.append("XPUB/XPRV magic numbers must be unique") + + if coin["address_type"] == coin["address_type_p2sh"]: + errors.append("address_type must be distinct from address_type_p2sh") + + if not coin["maxfee_kb"] >= coin["minfee_kb"]: + errors.append("max fee must not be smaller than min fee") + + if not coin["max_address_length"] >= coin["min_address_length"]: + errors.append("max address length must not be smaller than min address length") + + for bc in coin["bitcore"] + coin["blockbook"]: + if bc.endswith("/"): + errors.append("make sure URLs don't end with '/'") + + return errors + + +# ======= Coin json loaders ======= + + +def _load_btc_coins(): + """Load btc-like coins from `coins/*.json`""" + coins = [] + for filename in glob.glob(os.path.join(DEFS_DIR, "coins", "*.json")): + coin = load_json(filename) + coin.update( + name=coin["coin_name"], + shortcut=coin["coin_shortcut"], + key="bitcoin:{}".format(coin["coin_shortcut"]), + icon=filename.replace(".json", ".png"), + ) + coins.append(coin) + + return coins + + +def _load_ethereum_networks(): + """Load ethereum networks from `ethereum/networks.json`""" + networks = load_json("ethereum", "networks.json") + for network in networks: + network.update(key="eth:{}".format(network["shortcut"])) + return networks + + +def _load_erc20_tokens(): + """Load ERC20 tokens from `ethereum/tokens` submodule.""" + networks = _load_ethereum_networks() + tokens = [] + for network in networks: + if network["name"].startswith("Ethereum Testnet "): + idx = len("Ethereum Testnet ") + chain = network["name"][idx : idx + 3] + else: + chain = network["shortcut"] + chain = chain.lower() + if not chain: + continue + + chain_path = os.path.join(DEFS_DIR, "ethereum", "tokens", "tokens", chain) + for filename in glob.glob(os.path.join(chain_path, "*.json")): + token = load_json(filename) + token.update( + chain=chain, + chain_id=network["chain_id"], + address_bytes=unhexlify(token["address"][2:]), + shortcut=token["symbol"], + key="erc20:{}:{}".format(chain, token["symbol"]), + ) + tokens.append(token) + + return tokens + + +def _load_nem_mosaics(): + """Loads NEM mosaics from `nem/nem_mosaics.json`""" + mosaics = load_json("nem", "nem_mosaics.json") + for mosaic in mosaics: + shortcut = mosaic["ticker"].strip() + mosaic.update(shortcut=shortcut, key="nem:{}".format(shortcut)) + return mosaics + + +def _load_misc(): + """Loads miscellaneous networks from `misc/misc.json`""" + others = load_json("misc/misc.json") + for other in others: + other.update(key="misc:{}".format(other["shortcut"])) + return others + + +# ====== support info ====== + +RELEASES_URL = "https://wallet.trezor.io/data/firmware/{}/releases.json" +MISSING_SUPPORT_MEANS_NO = ("connect", "webwallet") +VERSIONED_SUPPORT_INFO = ("trezor1", "trezor2") + + +def get_support_data(): + """Get raw support data from `support.json`.""" + return load_json("support.json") + + +def latest_releases(): + """Get latest released firmware versions for Trezor 1 and 2""" + if not requests: + raise RuntimeError("requests library is required for getting release info") + + latest = {} + for v in ("1", "2"): + releases = requests.get(RELEASES_URL.format(v)).json() + latest["trezor" + v] = max(tuple(r["version"]) for r in releases) + return latest + + +def is_token(coin): + return coin["key"].startswith("erc20:") + + +def support_info_single(support_data, coin): + """Extract a support dict from `support.json` data. + + Returns a dict of support values for each "device", i.e., `support.json` + top-level key. + + The support value for each device is determined in order of priority: + * if the coin is a duplicate ERC20 token, all support values are `None` + * if the coin has an entry in `unsupported`, its support is `None` + * if the coin has an entry in `supported` its support is that entry + (usually a version string, or `True` for connect/webwallet) + * otherwise support is presumed "soon" + """ + support_info = {} + key = coin["key"] + dup = coin.get("duplicate") + for device, values in support_data.items(): + if dup and is_token(coin): + support_value = None + elif key in values["unsupported"]: + support_value = None + elif key in values["supported"]: + support_value = values["supported"][key] + elif device in MISSING_SUPPORT_MEANS_NO: + support_value = None + else: + support_value = "soon" + support_info[device] = support_value + return support_info + + +def support_info(coins): + """Generate Trezor support information. + + Takes a collection of coins and generates a support-info entry for each. + The support-info is a dict with keys based on `support.json` keys. + These are usually: "trezor1", "trezor2", "connect" and "webwallet". + + The `coins` argument can be a `CoinsInfo` object, a list or a dict of + coin items. + + Support information is taken from `support.json`. + """ + if isinstance(coins, CoinsInfo): + coins = coins.as_list() + elif isinstance(coins, dict): + coins = coins.values() + + support_data = get_support_data() + support = {} + for coin in coins: + support[coin["key"]] = support_info_single(support_data, coin) + + return support + + +# ====== data cleanup functions ====== + + +def _ensure_mandatory_values(coins): + """Checks that every coin has the mandatory fields: name, shortcut, key""" + for coin in coins: + if not all(coin.get(k) for k in ("name", "shortcut", "key")): + raise ValueError(coin) + + +def symbol_from_shortcut(shortcut): + symsplit = shortcut.split(" ", maxsplit=1) + return symsplit[0], symsplit[1] if len(symsplit) > 1 else "" + + +def mark_duplicate_shortcuts(coins): + """Finds coins with identical `shortcut`s. + Updates their keys and sets a `duplicate` field. + + The logic is a little crazy. + + The result of this function is a dictionary of _buckets_, each of which is + indexed by the duplicated symbol, or `_override`. The `_override` bucket will + contain all coins that are set to `true` in `duplicity_overrides.json`. These + will _always_ be marked as duplicate (and later possibly deleted if they're ERC20). + + The rest will disambiguate based on the full shortcut. + (i.e., when `shortcut` is `BTL (Battle)`, the `symbol` is just `BTL`). + If _all tokens_ in the bucket have shortcuts with distinct suffixes, e.g., + `CAT (BitClave)` and `CAT (Blockcat)`, we DO NOT mark them as duplicate. + These will then be supported and included in outputs. + + If even one token in the bucket _does not_ have a distinct suffix, e.g., + `MIT` and `MIT (Mychatcoin)`, the whole bucket is marked as duplicate. + + If a token is set to `false` in `duplicity_overrides.json`, it will NOT + be marked as duplicate in this step, even if it is part of a "bad" bucket. + """ + dup_symbols = defaultdict(list) + dup_keys = defaultdict(list) + + def dups_only(dups): + return {k: v for k, v in dups.items() if len(v) > 1} + + for coin in coins: + symbol, _ = symbol_from_shortcut(coin["shortcut"]) + dup_symbols[symbol].append(coin) + dup_keys[coin["key"]].append(coin) + + dup_symbols = dups_only(dup_symbols) + dup_keys = dups_only(dup_keys) + + # first deduplicate keys so that we can identify overrides + for values in dup_keys.values(): + for i, coin in enumerate(values): + coin["key"] += f":{i}" + + # load overrides and put them into their own bucket + overrides = load_json("duplicity_overrides.json") + override_bucket = [] + for coin in coins: + if overrides.get(coin["key"], False): + coin["duplicate"] = True + override_bucket.append(coin) + + # mark duplicate symbols + for values in dup_symbols.values(): + splits = (symbol_from_shortcut(coin["shortcut"]) for coin in values) + suffixes = {suffix for _, suffix in splits} + # if 1. all suffixes are distinct and 2. none of them are empty + if len(suffixes) == len(values) and all(suffixes): + # Allow the whole bucket. + # For all intents and purposes these should be considered non-dups + # So we won't mark them as dups here + # But they still have their own bucket, and also overrides can + # explicitly mark them as duplicate one step before, in which case + # they *still* keep duplicate status (and possibly are deleted). + continue + + for coin in values: + # allow overrides to skip this; if not listed in overrides, assume True + is_dup = overrides.get(coin["key"], True) + if is_dup: + coin["duplicate"] = True + # again: still in dups, but not marked as duplicate and not deleted + + dup_symbols["_override"] = override_bucket + return dup_symbols + + +def _btc_sort_key(coin): + if coin["name"] in ("Bitcoin", "Testnet"): + return "000000" + coin["name"] + else: + return coin["name"] + + +def collect_coin_info(): + """Returns all definition as dict organized by coin type. + `coins` for btc-like coins, + `eth` for ethereum networks, + `erc20` for ERC20 tokens, + `nem` for NEM mosaics, + `misc` for other networks. + + Automatically removes duplicate symbols from the result. + """ + all_coins = CoinsInfo( + bitcoin=_load_btc_coins(), + eth=_load_ethereum_networks(), + erc20=_load_erc20_tokens(), + nem=_load_nem_mosaics(), + misc=_load_misc(), + ) + + for k, coins in all_coins.items(): + if k == "bitcoin": + coins.sort(key=_btc_sort_key) + elif k == "nem": + # do not sort nem + pass + elif k == "eth": + # sort ethereum networks by chain_id + coins.sort(key=lambda c: c["chain_id"]) + else: + coins.sort(key=lambda c: c["key"].upper()) + + _ensure_mandatory_values(coins) + + return all_coins + + +def coin_info_with_duplicates(): + """Collects coin info, detects duplicates but does not remove them. + + Returns the CoinsInfo object and duplicate buckets. + """ + all_coins = collect_coin_info() + buckets = mark_duplicate_shortcuts(all_coins.as_list()) + return all_coins, buckets + + +def coin_info(): + """Collects coin info, marks and prunes duplicate ERC20 symbols, fills out support + info and returns the result. + """ + all_coins, _ = coin_info_with_duplicates() + all_coins["erc20"] = [ + coin for coin in all_coins["erc20"] if not coin.get("duplicate") + ] + return all_coins + + +def search(coins, keyword): + kwl = keyword.lower() + if isinstance(coins, CoinsInfo): + coins = coins.as_list() + + for coin in coins: + key = coin["key"].lower() + name = coin["name"].lower() + shortcut = coin["shortcut"].lower() + symbol, suffix = symbol_from_shortcut(shortcut) + if ( + kwl == key + or kwl in name + or kwl == shortcut + or kwl == symbol + or kwl in suffix + ): + yield coin diff --git a/tools/coins_details.py b/tools/coins_details.py index 3abff66eb..c824605c7 100755 --- a/tools/coins_details.py +++ b/tools/coins_details.py @@ -1,358 +1,330 @@ #!/usr/bin/env python3 """Fetch information about coins and tokens supported by Trezor and update it in coins_details.json.""" +import os import time import json +import logging import requests -import ethereum_tokens_gen -import build_coins -from distutils.version import LooseVersion +import sys +import coin_info -T1_LATEST='1.6.2' -T2_LATEST='2.0.7' +import click -COINS = {} +LOG = logging.getLogger(__name__) -def coinmarketcap_init(): - global COINS +OPTIONAL_KEYS = ("links", "notes", "wallet") +ALLOWED_SUPPORT_STATUS = ("yes", "no", "planned", "soon") - try: - COINS = json.load(open('coinmarketcap.json', 'r')) - except FileNotFoundError: - pass - else: - if COINS["1"]["last_updated"] > time.time() - 3600: - print("Using local cache of coinmarketcap") - return - - print("Updating coins from coinmarketcap") - total = None - COINS = {} - - while total is None or len(COINS) < total: - url = 'https://api.coinmarketcap.com/v2/ticker/?start=%d&convert=USD&limit=100' % (len(COINS)) - data = requests.get(url).json() - COINS.update(data['data']) - if total is None: - total = data['metadata']['num_cryptocurrencies'] +OVERRIDES = coin_info.load_json("coins_details.override.json") +VERSIONS = coin_info.latest_releases() - print("Fetched %d of %d coins" % (len(COINS), total)) - time.sleep(1) +COINMAKETCAP_CACHE = os.path.join(os.path.dirname(__file__), "coinmarketcap.json") +COINMARKETCAP_API_BASE = "https://pro-api.coinmarketcap.com/v1/" - json.dump(COINS, open('coinmarketcap.json', 'w'), sort_keys=True, indent=4) +MARKET_CAPS = {} -def coinmarketcap_info(shortcut): - global COINS - shortcut = shortcut.replace(' ', '-').lower() +def coinmarketcap_call(endpoint, api_key, params=None): + url = COINMARKETCAP_API_BASE + endpoint + r = requests.get(url, params=params, headers={"X-CMC_PRO_API_KEY": api_key}) + r.raise_for_status() + return r.json() - for _id in COINS: - coin = COINS[_id] - # print(shortcut, coin['website_slug']) - if shortcut == coin['website_slug']: - # print(coin) - return coin +def coinmarketcap_init(api_key, refresh=None): + global MARKET_CAPS -def update_marketcap(obj, shortcut): + force_refresh = refresh is True + disable_refresh = refresh is False try: - obj['marketcap_usd'] = int(float(coinmarketcap_info(shortcut)['quotes']['USD']['market_cap'])) - except: - pass - # print("Marketcap info not found for", shortcut) - - -def coinmarketcap_global(): - url = 'https://api.coinmarketcap.com/v2/global' - ret = requests.get(url) - data = ret.json() - return data - - -def set_default(obj, key, default_value): - obj[key] = obj.setdefault(key, default_value) - - -def update_info(details): - details['info']['updated_at'] = int(time.time()) - details['info']['updated_at_readable'] = time.asctime() + mtime = os.path.getmtime(COINMAKETCAP_CACHE) + cache_is_fresh = mtime > time.time() - 3600 + if disable_refresh or (cache_is_fresh and not force_refresh): + print("Using cached market cap data") + with open(COINMAKETCAP_CACHE) as f: + coinmarketcap_data = json.load(f) + else: + print("Fetching market cap data") + coinmarketcap_data = coinmarketcap_call( + "cryptocurrency/listings/latest", + api_key, + params={"limit": 5000, "convert": "USD"}, + ) + except Exception as e: + raise RuntimeError("market cap data unavailable") from e + + coin_data = {} + for coin in coinmarketcap_data["data"]: + slug = coin["slug"] + market_cap = coin["quote"]["USD"]["market_cap"] + if market_cap is not None: + coin_data[slug] = int(market_cap) + + MARKET_CAPS = coin_data + + with open(COINMAKETCAP_CACHE, "w") as f: + json.dump(coinmarketcap_data, f) + + return coin_data + + +def marketcap(coin): + cap = None + if "coinmarketcap_alias" in coin: + cap = MARKET_CAPS.get(coin["coinmarketcap_alias"]) + if cap is None: + slug = coin["name"].replace(" ", "-").lower() + cap = MARKET_CAPS.get(slug) + if cap is None: + cap = MARKET_CAPS.get(coin["shortcut"].lower()) + return cap + + +def update_marketcaps(coins): + for coin in coins.values(): + coin["marketcap_usd"] = marketcap(coin) or 0 + + +def summary(coins, api_key): + t1_coins = 0 + t2_coins = 0 + supported_marketcap = 0 + for coin in coins.values(): + if coin.get("hidden"): + continue - details['info']['t1_coins'] = len([True for _, c in details['coins'].items() if c.get('t1_enabled') == 'yes' and not c.get('hidden', False)]) - details['info']['t2_coins'] = len([True for _, c in details['coins'].items() if c.get('t2_enabled') == 'yes' and not c.get('hidden', False)]) + t1_enabled = coin["t1_enabled"] == "yes" + t2_enabled = coin["t2_enabled"] == "yes" + if t1_enabled: + t1_coins += 1 + if t2_enabled: + t2_coins += 1 + if t1_enabled or t2_enabled: + supported_marketcap += coin.get("marketcap_usd", 0) + total_marketcap = None try: - details['info']['total_marketcap_usd'] = int(coinmarketcap_global()['data']['quotes']['USD']['total_market_cap']) + ret = coinmarketcap_call("global-metrics/quotes/latest", api_key) + total_marketcap = int(ret["data"]["quote"]["USD"]["total_market_cap"]) except: pass - marketcap = 0 - for k, c in details['coins'].items(): - if c['t1_enabled'] == 'yes' or c['t2_enabled'] == 'yes': - marketcap += details['coins'][k].setdefault('marketcap_usd', 0) - details['info']['marketcap_usd'] = marketcap - - -def check_unsupported(details, prefix, supported): - for k in details['coins'].keys(): - if not k.startswith(prefix): - continue - if k not in supported: - print("%s not supported by Trezor? (Possible manual entry)" % k) - - -def update_coins(details): - (coins, _) = build_coins.process(None) - firmware = json.load(open('../defs/support.json', 'r')) - - supported = [] - for key, coin in coins.items(): - - t1_enabled = 'no' - if key in firmware['trezor1']: - if LooseVersion(firmware['trezor1'][key]) <= LooseVersion(T1_LATEST): - t1_enabled = 'yes' - else: - t1_enabled = 'soon' - - t2_enabled = 'no' - if key in firmware['trezor2']: - if LooseVersion(firmware['trezor2'][key]) <= LooseVersion(T2_LATEST): - t2_enabled = 'yes' - else: - t2_enabled = 'soon' - - # print("Updating", coin['coin_label'], coin['coin_shortcut']) - key = "coin:%s" % coin['coin_shortcut'] - supported.append(key) - out = details['coins'].setdefault(key, {}) - out['type'] = 'coin' - out['t1_enabled'] = t1_enabled - out['t2_enabled'] = t2_enabled - - set_default(out, 'shortcut', coin['coin_shortcut']) - set_default(out, 'name', coin['coin_label']) - set_default(out, 'links', {}) - set_default(out['links'], 'Homepage', coin['website']) - set_default(out['links'], 'Github', coin['github']) - update_marketcap(out, coin.get('coinmarketcap_alias', coin['coin_label'])) - - check_unsupported(details, 'coin:', supported) - + return dict( + updated_at=int(time.time()), + updated_at_readable=time.asctime(), + t1_coins=t1_coins, + t2_coins=t2_coins, + marketcap_usd=supported_marketcap, + total_marketcap_usd=total_marketcap, + ) -def update_erc20(details): - networks = [x[0] for x in ethereum_tokens_gen.networks] - LATEST_T1 = 'https://raw.githubusercontent.com/trezor/trezor-mcu/v%s/firmware/ethereum_tokens.c' % T1_LATEST - LATEST_T2 = 'https://raw.githubusercontent.com/trezor/trezor-core/v%s/src/apps/ethereum/tokens.py' % T2_LATEST +def _is_supported(support, trezor_version): + version = VERSIONS[trezor_version] + nominal = support.get(trezor_version) + if nominal is None: + return "no" + elif isinstance(nominal, bool): + return "yes" if nominal else "no" - tokens = ethereum_tokens_gen.get_tokens() - tokens_t1 = requests.get(LATEST_T1).text - tokens_t2 = requests.get(LATEST_T2).text - - supported = [] - for t in tokens: - # print('Updating', t['symbol']) - - if t['chain'] not in networks: - print('Skipping, %s is disabled' % t['chain']) - continue - - key = "erc20:%s:%s" % (t['chain'], t['symbol']) - supported.append(key) - out = details['coins'].setdefault(key, {}) - out['type'] = 'erc20' - out['network'] = t['chain'] - out['address'] = t['address'] - - set_default(out, 'shortcut', t['symbol']) - set_default(out, 'name', t['name']) - set_default(out, 'links', {}) - set_default(out, 'wallet', {}) - - if "\" %s\"" % t['symbol'] in tokens_t1: - out['t1_enabled'] = 'yes' - else: - out['t1_enabled'] = 'soon' - - if "'%s'" % t['symbol'] in tokens_t2: - out['t2_enabled'] = 'yes' - else: - out['t2_enabled'] = 'soon' - - out['wallet']['MyCrypto'] = 'https://mycrypto.com' - out['wallet']['MyEtherWallet'] = 'https://www.myetherwallet.com' - - if t['website']: - out['links']['Homepage'] = t['website'] - if t.get('social', {}).get('github', None): - out['links']['Github'] = t['social']['github'] - - update_marketcap(out, out.get('coinmarketcap_alias', t['symbol'])) - - check_unsupported(details, 'erc20:', supported) - - -def update_ethereum(details): - out = details['coins'].setdefault('coin2:ETH', {}) - out['type'] = 'coin' - set_default(out, 'shortcut', 'ETH') - set_default(out, 'name', 'Ethereum') - set_default(out, 't1_enabled', 'yes') - set_default(out, 't2_enabled', 'yes') - update_marketcap(out, 'ethereum') - - out = details['coins'].setdefault('coin2:ETC', {}) - out['type'] = 'coin' - set_default(out, 'shortcut', 'ETC') - set_default(out, 'name', 'Ethereum Classic') - set_default(out, 't1_enabled', 'yes') - set_default(out, 't2_enabled', 'yes') - update_marketcap(out, 'ethereum-classic') - - out = details['coins'].setdefault('coin2:RSK', {}) - out['type'] = 'coin' - set_default(out, 'shortcut', 'RSK') - set_default(out, 'name', 'Rootstock') - set_default(out, 't1_enabled', 'yes') - set_default(out, 't2_enabled', 'yes') - update_marketcap(out, 'rootstock') - - out = details['coins'].setdefault('coin2:EXP', {}) - out['type'] = 'coin' - set_default(out, 'shortcut', 'EXP') - set_default(out, 'name', 'Expanse') - set_default(out, 't1_enabled', 'yes') - set_default(out, 't2_enabled', 'yes') - update_marketcap(out, 'expanse') - - out = details['coins'].setdefault('coin2:UBQ', {}) - out['type'] = 'coin' - set_default(out, 'shortcut', 'UBQ') - set_default(out, 'name', 'Ubiq') - set_default(out, 't1_enabled', 'yes') - set_default(out, 't2_enabled', 'yes') - update_marketcap(out, 'ubiq') - - out = details['coins'].setdefault('coin2:ELLA', {}) - out['type'] = 'coin' - set_default(out, 'shortcut', 'ELLA') - set_default(out, 'name', 'Ellaism') - set_default(out, 't1_enabled', 'yes') - set_default(out, 't2_enabled', 'yes') - update_marketcap(out, 'ellaism') - - out = details['coins'].setdefault('coin2:EGEM', {}) - out['type'] = 'coin' - set_default(out, 'shortcut', 'EGEM') - set_default(out, 'name', 'EtherGem') - set_default(out, 't1_enabled', 'yes') - set_default(out, 't2_enabled', 'yes') - update_marketcap(out, 'egem') - - out = details['coins'].setdefault('coin2:ETSC', {}) - out['type'] = 'coin' - set_default(out, 'shortcut', 'ETSC') - set_default(out, 'name', 'Ethereum Social') - set_default(out, 't1_enabled', 'yes') - set_default(out, 't2_enabled', 'yes') - update_marketcap(out, 'etsc') - - out = details['coins'].setdefault('coin2:EOSC', {}) - out['type'] = 'coin' - set_default(out, 'shortcut', 'EOSC') - set_default(out, 'name', 'EOS Classic') - set_default(out, 't1_enabled', 'yes') - set_default(out, 't2_enabled', 'yes') - update_marketcap(out, 'eosc') - - out = details['coins'].setdefault('coin2:ADA', {}) - out['type'] = 'coin' - set_default(out, 'shortcut', 'ADA') - set_default(out, 'name', 'Cardano') - set_default(out, 't1_enabled', 'no') - set_default(out, 't2_enabled', 'soon') - update_marketcap(out, 'cardano') - - out = details['coins'].setdefault('coin2:XTZ', {}) - out['type'] = 'coin' - set_default(out, 'shortcut', 'XTZ') - set_default(out, 'name', 'Tezos') - set_default(out, 't1_enabled', 'no') - set_default(out, 't2_enabled', 'soon') - update_marketcap(out, 'tezos') - - -def update_mosaics(details): - d = json.load(open('../defs/nem/nem_mosaics.json')) - supported = [] - for mosaic in d: - # print('Updating', mosaic['name'], mosaic['ticker']) - - key = "mosaic:%s" % mosaic['ticker'].strip() - supported.append(key) - out = details['coins'].setdefault(key, {}) - out['type'] = 'mosaic' - set_default(out, 'shortcut', mosaic['ticker'].strip()) - set_default(out, 'name', mosaic['name']) - set_default(out, 't1_enabled', 'yes') - set_default(out, 't2_enabled', 'yes') - - update_marketcap(out, out.get('coinmarketcap_alias', out['name'])) - - check_unsupported(details, 'mosaic:', supported) - - -def check_missing_details(details): - for k in details['coins'].keys(): - coin = details['coins'][k] + try: + nominal_version = tuple(map(int, nominal.split("."))) + return "yes" if nominal_version <= version else "soon" + except ValueError: + return nominal + + +def _webwallet_support(coin, support): + """Check the "webwallet" support property. + If set, check that at least one of the backends run on trezor.io. + If yes, assume we support the coin in our wallet. + Otherwise it's probably working with a custom backend, which means don't + link to our wallet. + """ + if not support.get("webwallet"): + return False + return any(".trezor.io" in url for url in coin["blockbook"] + coin["bitcore"]) + + +def update_simple(coins, support_info, type): + res = {} + for coin in coins: + key = coin["key"] + support = support_info[key] + + details = dict( + name=coin["name"], + shortcut=coin["shortcut"], + type=type, + t1_enabled=_is_supported(support, "trezor1"), + t2_enabled=_is_supported(support, "trezor2"), + ) + for k in OPTIONAL_KEYS: + if k in coin: + details[k] = coin[k] + + res[key] = details + + return res + + +def update_bitcoin(coins, support_info): + res = update_simple(coins, support_info, "coin") + for coin in coins: + key = coin["key"] + support = support_info[key] + details = dict( + name=coin["coin_label"], + links=dict(Homepage=coin["website"], Github=coin["github"]), + wallet={}, + ) + if _webwallet_support(coin, support): + details["wallet"]["Trezor"] = "https://wallet.trezor.io" + + res[key].update(details) + + return res + + +def update_erc20(coins, support_info): + # TODO skip disabled networks? + res = update_simple(coins, support_info, "erc20") + for coin in coins: + key = coin["key"] + details = dict( + network=coin["chain"], + address=coin["address"], + shortcut=coin["shortcut"], + links={}, + wallet=dict( + MyCrypto="https://mycrypto.com", + MyEtherWallet="https://www.myetherwallet.com", + ), + ) + if coin.get("website"): + details["links"]["Homepage"] = coin["website"] + if coin.get("social", {}).get("github"): + details["links"]["Github"] = coin["social"]["github"] + + res[key].update(details) + + return res + + +def update_ethereum_networks(coins, support_info): + res = update_simple(coins, support_info, "coin") + for coin in coins: + key = coin["key"] + details = dict( + wallet=dict( + MyCrypto="https://mycrypto.com", + MyEtherWallet="https://www.myetherwallet.com", + ), + links=dict(Homepage=coin.get("url")), + ) + res[key].update(details) + + return res + + +def check_missing_data(coins): + for k, coin in coins.items(): hide = False - if 'links' not in coin: - print("%s: Missing links" % k) - hide = True - if 'Homepage' not in coin.get('links', {}): + if "Homepage" not in coin.get("links", {}): print("%s: Missing homepage" % k) hide = True - if coin['t1_enabled'] not in ('yes', 'no', 'planned', 'soon'): + if coin["t1_enabled"] not in ALLOWED_SUPPORT_STATUS: print("%s: Unknown t1_enabled" % k) hide = True - if coin['t2_enabled'] not in ('yes', 'no', 'planned', 'soon'): + if coin["t2_enabled"] not in ALLOWED_SUPPORT_STATUS: print("%s: Unknown t2_enabled" % k) hide = True - if 'Trezor' in coin.get('wallet', {}) and coin['wallet']['Trezor'] != 'https://wallet.trezor.io': + if ( + "Trezor" in coin.get("wallet", {}) + and coin["wallet"]["Trezor"] != "https://wallet.trezor.io" + ): print("%s: Strange URL for Trezor Wallet" % k) hide = True - if len(coin.get('wallet', {})) == 0: + if len(coin.get("wallet", {})) == 0: print("%s: Missing wallet" % k) + if "Testnet" in coin["name"]: + print("%s: Hiding testnet" % k) + hide = True + if hide: - if coin.get('hidden') != 1: + if coin.get("hidden") != 1: print("%s: HIDING COIN!" % k) # If any of important detail is missing, hide coin from list - coin['hidden'] = 1 + coin["hidden"] = 1 - if not hide and coin.get('hidden'): + if not hide and coin.get("hidden"): print("%s: Details are OK, but coin is still hidden" % k) - for k in details['coins'].keys(): - if details['coins'][k].get('hidden') == 1: + # summary of hidden coins + for k, coin in coins.items(): + if coin.get("hidden") == 1: print("%s: Coin is hidden" % k) -if __name__ == '__main__': - try: - details = json.load(open('../defs/coins_details.json', 'r')) - except FileNotFoundError: - details = {'coins': {}, 'info': {}} - - coinmarketcap_init() - update_coins(details) - update_erc20(details) - update_ethereum(details) - update_mosaics(details) - update_info(details) - check_missing_details(details) - - print(json.dumps(details['info'], sort_keys=True, indent=4)) - json.dump(details, open('../defs/coins_details.json', 'w'), sort_keys=True, indent=4) +def apply_overrides(coins): + for key, override in OVERRIDES.items(): + if key not in coins: + LOG.warning(f"override without coin: {key}") + continue + + def recursive_update(orig, new): + if isinstance(new, dict) and isinstance(orig, dict): + for k, v in new.items(): + orig[k] = recursive_update(orig.get(k), v) + return orig + else: + return new + + coin = coins[key] + recursive_update(coin, override) + + +@click.command() +# fmt: off +@click.option("-r", "--refresh", "refresh", flag_value=True, help="Force refresh market cap info") +@click.option("-R", "--no-refresh", "refresh", flag_value=False, help="Force use cached market cap info") +@click.option("-A", "--api-key", required=True, envvar="COINMARKETCAP_API_KEY", help="Coinmarketcap API key") +# fmt: on +def main(refresh, api_key): + # setup logging + root = logging.getLogger() + root.setLevel(logging.DEBUG) + handler = logging.StreamHandler(sys.stdout) + handler.setLevel(logging.DEBUG) + root.addHandler(handler) + + coinmarketcap_init(api_key, refresh=refresh) + + defs = coin_info.coin_info() + support_info = coin_info.support_info(defs) + + coins = {} + coins.update(update_bitcoin(defs.bitcoin, support_info)) + coins.update(update_erc20(defs.erc20, support_info)) + coins.update(update_ethereum_networks(defs.eth, support_info)) + coins.update(update_simple(defs.nem, support_info, "mosaic")) + coins.update(update_simple(defs.misc, support_info, "coin")) + + apply_overrides(coins) + update_marketcaps(coins) + check_missing_data(coins) + + info = summary(coins, api_key) + details = dict(coins=coins, info=info) + + print(json.dumps(info, sort_keys=True, indent=4)) + with open(os.path.join(coin_info.DEFS_DIR, "coins_details.json"), "w") as f: + json.dump(details, f, sort_keys=True, indent=4) + + +if __name__ == "__main__": + main() diff --git a/tools/cointool.py b/tools/cointool.py new file mode 100755 index 000000000..09e86e039 --- /dev/null +++ b/tools/cointool.py @@ -0,0 +1,648 @@ +#!/usr/bin/env python3 +import io +import json +import logging +import re +import sys +import os +import glob +import binascii +import struct +import zlib +from collections import defaultdict +from hashlib import sha256 + +import click + +import coin_info +from coindef import CoinDef + +try: + import termcolor +except ImportError: + termcolor = None + +try: + import mako + import mako.template + from munch import Munch + + CAN_RENDER = True +except ImportError: + CAN_RENDER = False + +try: + import requests +except ImportError: + requests = None + +try: + import ed25519 + from PIL import Image + from trezorlib import protobuf + + CAN_BUILD_DEFS = True +except ImportError: + CAN_BUILD_DEFS = False + + +# ======= Crayon colors ====== +USE_COLORS = False + + +def crayon(color, string, bold=False, dim=False): + if not termcolor or not USE_COLORS: + return string + else: + if bold: + attrs = ["bold"] + elif dim: + attrs = ["dark"] + else: + attrs = [] + return termcolor.colored(string, color, attrs=attrs) + + +def print_log(level, *args, **kwargs): + prefix = logging.getLevelName(level) + if level == logging.DEBUG: + prefix = crayon("blue", prefix, bold=False) + elif level == logging.INFO: + prefix = crayon("blue", prefix, bold=True) + elif level == logging.WARNING: + prefix = crayon("red", prefix, bold=False) + elif level == logging.ERROR: + prefix = crayon("red", prefix, bold=True) + print(prefix, *args, **kwargs) + + +# ======= Mako management ====== + + +def c_str_filter(b): + if b is None: + return "NULL" + + def hexescape(c): + return r"\x{:02x}".format(c) + + if isinstance(b, bytes): + return '"' + "".join(map(hexescape, b)) + '"' + else: + return json.dumps(b) + + +def black_repr_filter(val): + if isinstance(val, str): + if '"' in val: + return repr(val) + else: + return c_str_filter(val) + elif isinstance(val, bytes): + return "b" + c_str_filter(val) + else: + return repr(val) + + +def ascii_filter(s): + return re.sub("[^ -\x7e]", "_", s) + + +def make_support_filter(support_info): + def supported_on(device, coins): + for coin in coins: + if support_info[coin.key].get(device): + yield coin + + return supported_on + + +MAKO_FILTERS = { + "c_str": c_str_filter, + "ascii": ascii_filter, + "black_repr": black_repr_filter, +} + + +def render_file(src, dst, coins, support_info): + """Renders `src` template into `dst`. + + `src` is a filename, `dst` is an open file object. + """ + template = mako.template.Template(filename=src) + result = template.render( + support_info=support_info, + supported_on=make_support_filter(support_info), + **coins, + **MAKO_FILTERS, + ) + dst.write(result) + + +# ====== validation functions ====== + + +def highlight_key(coin, color): + """Return a colorful string where the SYMBOL part is bold.""" + keylist = coin["key"].split(":") + if keylist[-1].isdigit(): + keylist[-2] = crayon(color, keylist[-2], bold=True) + else: + keylist[-1] = crayon(color, keylist[-1], bold=True) + key = crayon(color, ":".join(keylist)) + name = crayon(None, f"({coin['name']})", dim=True) + return f"{key} {name}" + + +def find_address_collisions(coins, field): + """Detects collisions in a given field. Returns buckets of colliding coins.""" + collisions = defaultdict(list) + for coin in coins: + value = coin[field] + collisions[value].append(coin) + return {k: v for k, v in collisions.items() if len(v) > 1} + + +def check_btc(coins): + check_passed = True + support_infos = coin_info.support_info(coins) + + # validate individual coin data + for coin in coins: + errors = coin_info.validate_btc(coin) + if errors: + check_passed = False + print_log(logging.ERROR, "invalid definition for", coin["name"]) + print("\n".join(errors)) + + def collision_str(bucket): + """Generate a colorful string out of a bucket of colliding coins.""" + coin_strings = [] + for coin in bucket: + name = coin["name"] + prefix = "" + if name.endswith("Testnet"): + color = "green" + elif name == "Bitcoin": + color = "red" + elif coin.get("unsupported"): + color = "grey" + prefix = crayon("blue", "(X)", bold=True) + else: + color = "blue" + hl = highlight_key(coin, color) + coin_strings.append(prefix + hl) + return ", ".join(coin_strings) + + def print_collision_buckets(buckets, prefix): + """Intelligently print collision buckets. + + For each bucket, if there are any collision with a mainnet, print it. + If the collision is with unsupported networks or testnets, it's just INFO. + If the collision is with supported mainnets, it's WARNING. + If the collision with any supported network includes Bitcoin, it's an ERROR. + """ + failed = False + for key, bucket in buckets.items(): + mainnets = [c for c in bucket if not c["name"].endswith("Testnet")] + + have_bitcoin = False + for coin in mainnets: + if coin["name"] == "Bitcoin": + have_bitcoin = True + if all(v is None for k,v in support_infos[coin["key"]].items()): + coin["unsupported"] = True + + supported_mainnets = [c for c in mainnets if not c.get("unsupported")] + supported_networks = [c for c in bucket if not c.get("unsupported")] + + if len(mainnets) > 1: + if have_bitcoin and len(supported_networks) > 1: + # ANY collision with Bitcoin is bad + level = logging.ERROR + failed = True + elif len(supported_mainnets) > 1: + # collision between supported networks is still pretty bad + level = logging.WARNING + else: + # collision between some unsupported networks is OK + level = logging.INFO + print_log(level, f"prefix {key}:", collision_str(bucket)) + + return failed + + # slip44 collisions + print("Checking SLIP44 prefix collisions...") + slip44 = find_address_collisions(coins, "slip44") + if print_collision_buckets(slip44, "key"): + check_passed = False + + # only check address_type on coins that don't use cashaddr + nocashaddr = [coin for coin in coins if not coin.get("cashaddr_prefix")] + + print("Checking address_type collisions...") + address_type = find_address_collisions(nocashaddr, "address_type") + if print_collision_buckets(address_type, "address type"): + check_passed = False + + print("Checking address_type_p2sh collisions...") + address_type_p2sh = find_address_collisions(nocashaddr, "address_type_p2sh") + # we ignore failed checks on P2SH, because reasons + print_collision_buckets(address_type_p2sh, "address type") + + return check_passed + + +def check_dups(buckets, print_at_level=logging.ERROR): + """Analyze and pretty-print results of `coin_info.mark_duplicate_shortcuts`. + + `print_at_level` can be one of logging levels. + + The results are buckets of colliding symbols. + If the collision is only between ERC20 tokens, it's DEBUG. + If the collision includes one non-token, it's INFO. + If the collision includes more than one non-token, it's ERROR and printed always. + """ + def coin_str(coin): + """Colorize coins. Tokens are cyan, nontokens are red. Coins that are NOT + marked duplicate get a green asterisk. + """ + if coin_info.is_token(coin): + color = "cyan" + else: + color = "red" + highlighted = highlight_key(coin, color) + if not coin.get("duplicate"): + prefix = crayon("green", "*", bold=True) + else: + prefix = "" + return f"{prefix}{highlighted}" + + check_passed = True + + for symbol in sorted(buckets.keys()): + bucket = buckets[symbol] + if not bucket: + continue + + nontokens = [coin for coin in bucket if not coin_info.is_token(coin)] + + # string generation + dup_str = ", ".join(coin_str(coin) for coin in bucket) + if not nontokens: + level = logging.DEBUG + elif len(nontokens) == 1: + level = logging.INFO + else: + level = logging.ERROR + check_passed = False + + # deciding whether to print + if level < print_at_level: + continue + + if symbol == "_override": + print_log(level, "force-set duplicates:", dup_str) + else: + print_log(level, f"duplicate symbol {symbol}:", dup_str) + + return check_passed + + +def check_backends(coins): + check_passed = True + for coin in coins: + genesis_block = coin.get("hash_genesis_block") + if not genesis_block: + continue + backends = coin.get("blockbook", []) + coin.get("bitcore", []) + for backend in backends: + print("checking", backend, "... ", end="", flush=True) + try: + j = requests.get(backend + "/api/block-index/0").json() + if j["blockHash"] != genesis_block: + raise RuntimeError("genesis block mismatch") + except Exception as e: + print(e) + check_passed = False + else: + print("OK") + return check_passed + + +def check_icons(coins): + check_passed = True + for coin in coins: + key = coin["key"] + icon_file = coin.get("icon") + if not icon_file: + print(key, ": missing icon") + check_passed = False + continue + + try: + icon = Image.open(icon_file) + except Exception: + print(key, ": failed to open icon file", icon_file) + check_passed = False + continue + + if icon.size != (96, 96) or icon.mode != "RGBA": + print(key, ": bad icon format (must be RGBA 96x96)") + check_passed = False + return check_passed + + +IGNORE_NONUNIFORM_KEYS = frozenset(("unsupported", "duplicate", "notes")) + + +def check_key_uniformity(coins): + keysets = defaultdict(list) + for coin in coins: + keyset = frozenset(coin.keys()) | IGNORE_NONUNIFORM_KEYS + keysets[keyset].append(coin) + + if len(keysets) <= 1: + return True + + buckets = list(keysets.values()) + buckets.sort(key=lambda x: len(x)) + majority = buckets[-1] + rest = sum(buckets[:-1], []) + reference_keyset = set(majority[0].keys()) + + for coin in rest: + key = coin["key"] + keyset = set(coin.keys()) + missing = ", ".join(reference_keyset - keyset) + if missing: + print_log(logging.ERROR, f"coin {key} has missing keys: {missing}") + additional = ", ".join(keyset - reference_keyset) + if additional: + print_log(logging.ERROR, f"coin {key} has superfluous keys: {additional}") + + return False + + +# ====== coindefs generators ====== + + +def convert_icon(icon): + """Convert PIL icon to TOIF format""" + # TODO: move this to python-trezor at some point + DIM = 32 + icon = icon.resize((DIM, DIM), Image.LANCZOS) + # remove alpha channel, replace with black + bg = Image.new("RGBA", icon.size, (0, 0, 0, 255)) + icon = Image.alpha_composite(bg, icon) + # process pixels + pix = icon.load() + data = bytes() + for y in range(DIM): + for x in range(DIM): + r, g, b, _ = pix[x, y] + c = ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | ((b & 0xF8) >> 3) + data += struct.pack(">H", c) + z = zlib.compressobj(level=9, wbits=10) + zdata = z.compress(data) + z.flush() + zdata = zdata[2:-4] # strip header and checksum + return zdata + + +def coindef_from_dict(coin): + proto = CoinDef() + for fname, _, fflags in CoinDef.FIELDS.values(): + val = coin.get(fname) + if val is None and fflags & protobuf.FLAG_REPEATED: + val = [] + elif fname == "signed_message_header": + val = val.encode("utf-8") + elif fname == "hash_genesis_block": + val = binascii.unhexlify(val) + setattr(proto, fname, val) + + return proto + + +def serialize_coindef(proto, icon): + proto.icon = icon + buf = io.BytesIO() + protobuf.dump_message(buf, proto) + return buf.getvalue() + + +def sign(data): + h = sha256(data).digest() + sign_key = ed25519.SigningKey(b"A" * 32) + return sign_key.sign(h) + + +# ====== click command handlers ====== + + +@click.group() +@click.option( + "--colors/--no-colors", + "-c/-C", + default=sys.stdout.isatty(), + help="Force colored output on/off", +) +def cli(colors): + global USE_COLORS + USE_COLORS = colors + + +@cli.command() +# fmt: off +@click.option("--backend/--no-backend", "-b", default=False, help="Check blockbook/bitcore responses") +@click.option("--icons/--no-icons", default=True, help="Check icon files") +@click.option("-d", "--show-duplicates", type=click.Choice(("all", "nontoken", "errors")), + default="errors", help="How much information about duplicate shortcuts should be shown.") +# fmt: on +def check(backend, icons, show_duplicates): + """Validate coin definitions. + + Checks that every btc-like coin is properly filled out, reports duplicate symbols, + missing or invalid icons, backend responses, and uniform key information -- + i.e., that all coins of the same type have the same fields in their JSON data. + + Uniformity check ignores NEM mosaics and ERC20 tokens, where non-uniformity is + expected. + + The `--show-duplicates` option can be set to: + + - all: all shortcut collisions are shown, including colliding ERC20 tokens + + - nontoken: only collisions that affect non-ERC20 coins are shown + + - errors: only collisions between non-ERC20 tokens are shown. This is the default, + as a collision between two or more non-ERC20 tokens is an error. + + In the output, duplicate ERC tokens will be shown in cyan; duplicate non-tokens + in red. An asterisk (*) next to symbol name means that even though it was detected + as duplicate, it is still included in results. + + The collision detection checks that SLIP44 numbers don't collide between different + mainnets (testnet collisions are allowed), that `address_prefix` doesn't collide + with Bitcoin (other collisions are reported as warnings). `address_prefix_p2sh` + is also checked but we have a bunch of collisions there and can't do much + about them, so it's not an error. + + In the collision checks, Bitcoin is shown in red, other mainnets in blue, + testnets in green and unsupported networks in gray, marked with `(X)` for + non-colored output. + """ + if backend and requests is None: + raise click.ClickException("You must install requests for backend check") + + if icons and not CAN_BUILD_DEFS: + raise click.ClickException("Missing requirements for icon check") + + defs, buckets = coin_info.coin_info_with_duplicates() + all_checks_passed = True + + print("Checking BTC-like coins...") + if not check_btc(defs.bitcoin): + all_checks_passed = False + + if show_duplicates == "all": + dup_level = logging.DEBUG + elif show_duplicates == "nontoken": + dup_level = logging.INFO + else: + dup_level = logging.ERROR + print("Checking unexpected duplicates...") + if not check_dups(buckets, dup_level): + all_checks_passed = False + + if icons: + print("Checking icon files...") + if not check_icons(defs.bitcoin): + all_checks_passed = False + + if backend: + print("Checking backend responses...") + if not check_backends(defs.bitcoin): + all_checks_passed = False + + print("Checking key uniformity...") + for cointype, coinlist in defs.items(): + if cointype in ("erc20", "nem"): + continue + if not check_key_uniformity(coinlist): + all_checks_passed = False + + if not all_checks_passed: + print("Some checks failed.") + sys.exit(1) + else: + print("Everything is OK.") + + +@cli.command() +@click.option("-o", "--outfile", type=click.File(mode="w"), default="./coins.json") +def coins_json(outfile): + """Generate coins.json for consumption in python-trezor and Connect/Wallet""" + coins = coin_info.coin_info().bitcoin + support_info = coin_info.support_info(coins) + by_name = {} + for coin in coins: + coin["support"] = support_info[coin["key"]] + by_name[coin["name"]] = coin + + with outfile: + json.dump(by_name, outfile, indent=4, sort_keys=True) + outfile.write("\n") + + +@cli.command() +@click.option("-o", "--outfile", type=click.File(mode="w"), default="./coindefs.json") +def coindefs(outfile): + """Generate signed coin definitions for python-trezor and others + + This is currently unused but should enable us to add new coins without having to + update firmware. + """ + coins = coin_info.coin_info().bitcoin + coindefs = {} + for coin in coins: + key = coin["key"] + icon = Image.open(coin["icon"]) + ser = serialize_coindef(coindef_from_dict(coin), convert_icon(icon)) + sig = sign(ser) + definition = binascii.hexlify(sig + ser).decode("ascii") + coindefs[key] = definition + + with outfile: + json.dump(coindefs, outfile, indent=4, sort_keys=True) + outfile.write("\n") + + +@cli.command() +# fmt: off +@click.argument("paths", metavar="[path]...", nargs=-1) +@click.option("-o", "--outfile", type=click.File("w"), help="Alternate output file") +@click.option("-v", "--verbose", is_flag=True, help="Print rendered file names") +# fmt: on +def render(paths, outfile, verbose): + """Generate source code from Mako templates. + + For every "foo.bar.mako" filename passed, runs the template and + saves the result as "foo.bar". For every directory name passed, + processes all ".mako" files found in that directory. + + If `-o` is specified, renders a single file into the specified outfile. + + If no arguments are given, processes the current directory. + """ + if not CAN_RENDER: + raise click.ClickException("Please install 'mako' and 'munch'") + + if outfile and (len(paths) != 1 or not os.path.isfile(paths[0])): + raise click.ClickException("Option -o can only be used with single input file") + + # prepare defs + defs = coin_info.coin_info() + support_info = coin_info.support_info(defs) + + # munch dicts - make them attribute-accessible + for key, value in defs.items(): + defs[key] = [Munch(coin) for coin in value] + for key, value in support_info.items(): + support_info[key] = Munch(value) + + def do_render(src, dst): + if verbose: + click.echo("Rendering {} => {}".format(src, dst)) + render_file(src, dst, defs, support_info) + + # single in-out case + if outfile: + do_render(paths[0], outfile) + return + + # find files in directories + if not paths: + paths = ["."] + + files = [] + for path in paths: + if not os.path.exists(path): + click.echo("Path {} does not exist".format(path)) + elif os.path.isdir(path): + files += glob.glob(os.path.join(path, "*.mako")) + else: + files.append(path) + + # render each file + for file in files: + if not file.endswith(".mako"): + click.echo("File {} does not end with .mako".format(file)) + else: + target = file[: -len(".mako")] + with open(target, "w") as dst: + do_render(file, dst) + + +if __name__ == "__main__": + cli() diff --git a/tools/ethereum_tokens_gen.py b/tools/ethereum_tokens_gen.py deleted file mode 100755 index 0b2577d2d..000000000 --- a/tools/ethereum_tokens_gen.py +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env python3 -import sys -import os -import json -import re - - -def get_tokens(): - tokens = [] - for s, i in networks: - try: - files = os.scandir('../defs/ethereum/tokens/tokens/%s' % s) - except FileNotFoundError: - continue - - for f in files: - if not f.path.endswith('.json'): - continue - - # print('Processing', f.path) - data = json.load(open(f.path, 'r')) - data['chain'] = s - data['chain_id'] = i - tokens.append(data) - - return tokens - - -def print_tokens(tokens, python=False): - count = 0 - for t in sorted(tokens, key=lambda x: x['chain'] + x['symbol'].upper()): - address, name, symbol, decimal, chain, chain_id = t['address'], t['name'], t['symbol'], int(t['decimals']), t['chain'], t['chain_id'] # noqa:E501 - address = '\\x'.join([address[i:i + 2] for i in range(0, len(address), 2)])[2:].lower() # noqa:E501 - ascii_only = re.match(r'^[ -\x7F]+$', symbol) is not None - if not ascii_only: # skip Unicode symbols, they are stupid - continue - name = name.strip() - count += 1 - if python: - print(" (%d, b'%s', '%s', %d), # %s / %s" % (chain_id, address, symbol, decimal, chain, name)) # noqa:E501 - else: - print('\t{%2d, "%s", " %s", %d}, // %s / %s' % (chain_id, address, symbol, decimal, chain, name)) # noqa:E501 - return count - - -# disabled are networks with no tokens defined in ethereum-lists/tokens repo - -networks = [ - ('ella', 64), - ('etc', 61), - ('eth', 1), - ('kov', 42), - ('rin', 4), - ('rop', 3), - ('ubq', 8), -] - - -def generate_c(tokens): - count = print_tokens(tokens) - print('-' * 32) - print('#define TOKENS_COUNT %d' % count) - - -def generate_python(tokens): - print('tokens = [') - print_tokens(tokens, python=True) - print(']') - - -if __name__ == '__main__': - tokens = get_tokens() - - if len(sys.argv) > 1 and sys.argv[1] == '--python': - generate_python(tokens) - else: - generate_c(tokens) diff --git a/tools/requirements.txt b/tools/requirements.txt new file mode 100644 index 000000000..59cab2694 --- /dev/null +++ b/tools/requirements.txt @@ -0,0 +1,16 @@ +click>=6 + +# for `coin_gen coindefs` and checking icons: +ed25519>=1.4 +Pillow>=5.2.0 +trezor>=0.10 + +# for checking backends, generating coins_details.json +requests>=2.19 + +# for rendering templates: +Mako>=1.0.7 +munch>=2.3.2 + +# for pretty colors in checks +termcolor >= 0.1.2 diff --git a/tools/support.py b/tools/support.py new file mode 100755 index 000000000..969b5d5e6 --- /dev/null +++ b/tools/support.py @@ -0,0 +1,497 @@ +#!/usr/bin/env python3 +import re +import os +import subprocess +import sys +import click +import coin_info +import json + +SUPPORT_INFO = coin_info.get_support_data() + +VERSION_RE = re.compile(r"\d+.\d+.\d+") + +ERC20_DUPLICATE_KEY = "(AUTO) duplicate key" + + +def write_support_info(): + with open(os.path.join(coin_info.DEFS_DIR, "support.json"), "w") as f: + json.dump(SUPPORT_INFO, f, indent=2, sort_keys=True) + f.write("\n") + + +def support_dicts(device): + return SUPPORT_INFO[device]["supported"], SUPPORT_INFO[device]["unsupported"] + + +def all_support_dicts(): + for device in SUPPORT_INFO: + yield (device, *support_dicts(device)) + + +def clear_support(device, key): + supported, unsupported = support_dicts(device) + supported.pop(key, None) + unsupported.pop(key, None) + + +def set_supported(device, key, value): + clear_support(device, key) + supported, _ = support_dicts(device) + supported[key] = value + + +def set_unsupported(device, key, value): + clear_support(device, key) + _, unsupported = support_dicts(device) + unsupported[key] = value + + +def print_support(coin): + def support_value(where, key, missing_means_no=False): + if "supported" in where and key in where["supported"]: + val = where["supported"][key] + if val is True: + return "YES" + elif val == "soon": + return "SOON" + elif VERSION_RE.match(val): + return f"YES since {val}" + else: + return f"BAD VALUE {val}" + elif "unsupported" in where and key in where["unsupported"]: + val = where["unsupported"][key] + return f"NO (reason: {val})" + elif missing_means_no: + return "NO" + else: + return "support info missing" + + key, name, shortcut = coin["key"], coin["name"], coin["shortcut"] + print(f"{key} - {name} ({shortcut})") + if coin.get("duplicate"): + if coin_info.is_token(coin): + print(" * DUPLICATE SYMBOL (no support)") + return + else: + print(" * DUPLICATE SYMBOL") + for dev, where in SUPPORT_INFO.items(): + missing_means_no = dev in coin_info.MISSING_SUPPORT_MEANS_NO + print(" *", dev, ":", support_value(where, key, missing_means_no)) + + +# ====== validation functions ====== # + + +def check_support_values(): + def _check_value_version_soon(val): + if not isinstance(value, str): + raise ValueError(f"non-str value: {value}") + + is_version = VERSION_RE.match(value) + is_soon = value == "soon" + if not (is_version or is_soon): + raise ValueError(f"expected version or 'soon', found '{value}'") + + errors = [] + for device, values in SUPPORT_INFO.items(): + supported = values.get("supported") + if not isinstance(supported, dict): + errors.append(f"Missing 'supported' dict for {device}") + else: + for key, value in supported.items(): + try: + if device in coin_info.VERSIONED_SUPPORT_INFO: + _check_value_version_soon(value) + else: + if value is not True: + raise ValueError(f"only allowed is True, but found {value}") + except Exception as e: + errors.append(f"{device}.supported.{key}: {e}") + + unsupported = values.get("unsupported") + if not isinstance(unsupported, dict): + errors.append(f"Missing 'supported' dict for {device}") + else: + for key, value in unsupported.items(): + if not isinstance(value, str) or not value: + errors.append(f"{device}.unsupported.{key}: missing reason") + + return errors + + +def find_unsupported_coins(coins_dict): + result = {} + for device in coin_info.VERSIONED_SUPPORT_INFO: + supported, unsupported = support_dicts(device) + support_set = set(supported.keys()) + support_set.update(unsupported.keys()) + + result[device] = [] + for key, coin in coins_dict.items(): + if coin.get("duplicate") and coin_info.is_token(coin): + continue + if key not in support_set: + result[device].append(coin) + + return result + + +def find_orphaned_support_keys(coins_dict): + orphans = set() + for _, supported, unsupported in all_support_dicts(): + orphans.update(key for key in supported if key not in coins_dict) + orphans.update(key for key in unsupported if key not in coins_dict) + + return orphans + + +def find_supported_duplicate_tokens(coins_dict): + result = [] + for _, supported, _ in all_support_dicts(): + for key in supported: + if not key.startswith("erc20:"): + continue + if coins_dict.get(key, {}).get("duplicate"): + result.append(key) + return result + + +def process_erc20(coins_dict): + """Make sure that: + * orphaned ERC20 support info is cleared out + * duplicate ERC20 tokens are not listed as supported + * non-duplicate ERC20 tokens are cleared out from the unsupported list + """ + erc20_dict = { + key: coin.get("duplicate", False) + for key, coin in coins_dict.items() + if coin_info.is_token(coin) + } + for device, supported, unsupported in all_support_dicts(): + nondups = set() + dups = set(key for key, value in erc20_dict.items() if value) + for key in supported: + if key not in erc20_dict: + continue + if not erc20_dict[key]: + dups.discard(key) + + for key in unsupported: + if key not in erc20_dict: + continue + # ignore dups that are unsupported now + dups.discard(key) + + if not erc20_dict[key] and unsupported[key] == ERC20_DUPLICATE_KEY: + # remove duplicate status + nondups.add(key) + + for key in dups: + if device in coin_info.MISSING_SUPPORT_MEANS_NO: + clear_support(device, key) + else: + print(f"ERC20 on {device}: adding duplicate {key}") + set_unsupported(device, key, ERC20_DUPLICATE_KEY) + + for key in nondups: + print(f"ERC20 on {device}: clearing non-duplicate {key}") + clear_support(device, key) + + +@click.group() +def cli(): + pass + + +@cli.command() +@click.option("-n", "--dry-run", is_flag=True, help="Do not write changes") +def fix(dry_run): + """Fix expected problems. + + Prunes orphaned keys and ensures that ERC20 duplicate info matches support info. + """ + all_coins, _ = coin_info.coin_info_with_duplicates() + coins_dict = all_coins.as_dict() + + orphaned = find_orphaned_support_keys(coins_dict) + for orphan in orphaned: + print(f"pruning orphan {orphan}") + for device in SUPPORT_INFO: + clear_support(device, orphan) + + process_erc20(coins_dict) + if not dry_run: + write_support_info() + + +@cli.command() +# fmt: off +@click.option("-t", "--ignore-tokens", is_flag=True, help="Ignore unsupported ERC20 tokens") +@click.option("-m", "--ignore-missing", is_flag=True, help="Do not fail on missing supportinfo") +# fmt: on +def check(ignore_tokens, ignore_missing): + """Check validity of support information. + + Ensures that `support.json` data is well formed, there are no keys without + corresponding coins, and there are no coins without corresponding keys. + + If `--ignore-tokens` is specified, the check will ignore ERC20 tokens + without support info. This is useful because there is usually a lot of ERC20 + tokens. + + If `--ignore-missing` is specified, the check will display coins with missing + support info, but will not fail when missing coins are found. This is + useful in Travis. + """ + all_coins, _ = coin_info.coin_info_with_duplicates() + coins_dict = all_coins.as_dict() + checks_ok = True + + errors = check_support_values() + if errors: + for error in errors: + print(error) + checks_ok = False + + orphaned = find_orphaned_support_keys(coins_dict) + for orphan in orphaned: + print(f"orphaned key {orphan}") + checks_ok = False + + missing = find_unsupported_coins(coins_dict) + for device, values in missing.items(): + if ignore_tokens: + values = [coin for coin in values if not coin_info.is_token(coin)] + if values: + if not ignore_missing: + checks_ok = False + print(f"Device {device} has missing support infos:") + for coin in values: + print(f"{coin['key']} - {coin['name']}") + + supported_dups = find_supported_duplicate_tokens(coins_dict) + for coin in supported_dups: + checks_ok = False + print(f"Token {coin['key']} ({coin['name']}) is duplicate but supported") + + if not checks_ok: + print("Some checks have failed") + sys.exit(1) + + +@cli.command() +# fmt: off +@click.argument("device") +@click.option("-r", "--version", help="Set explicit version string (default: guess from latest release)") +@click.option("--git-tag/--no-git-tag", "-g", default=False, help="Create a corresponding Git tag") +@click.option("--release-soon/--no-release-soon", default=True, help="Release coins marked 'soon'") +@click.option("--release-missing/--no-release-missing", default=True, help="Release coins with missing support info") +@click.option("-n", "--dry-run", is_flag=True, help="Do not write changes") +@click.option("-s", "--soon", is_flag=True, help="Only set missing support-infos to be released 'soon'") +@click.option("-f", "--force", is_flag=True, help="Proceed even with bad version/device info") +# fmt: on +@click.pass_context +def release( + ctx, + device: str, + version, + git_tag, + release_soon, + release_missing, + dry_run, + soon, + force, +): + """Release a new Trezor firmware. + + Update support infos so that all coins have a clear support status. + By default, marks duplicate tokens as unsupported, and all coins that either + don't have support info, or they are supported "soon", are set to the + released firmware version. + + Optionally tags the repository with the given version. + + `device` can be "1", "2", or a string matching `support.json` key. Version + is autodetected by downloading a list of latest releases and incrementing + micro version by one, or you can specify `--version` explicitly. + """ + # check condition(s) + if soon and git_tag: + raise click.ClickException("Cannot git-tag a 'soon' revision") + + # process `device` + if device.isnumeric(): + device = f"trezor{device}" + + if not force and device not in coin_info.VERSIONED_SUPPORT_INFO: + raise click.ClickException( + f"Non-releasable device {device} (support info is not versioned). " + "Use --force to proceed anyway." + ) + + if not soon: + # guess `version` if not given + if not version: + versions = coin_info.latest_releases() + latest_version = versions.get(device) + if latest_version is None: + raise click.ClickException( + "Failed to guess version. " + "Please use --version to specify it explicitly." + ) + else: + latest_version = list(latest_version) + latest_version[-1] += 1 + version = ".".join(str(n) for n in latest_version) + + # process `version` + try: + version_numbers = list(map(int, version.split("."))) + expected_device = f"trezor{version_numbers[0]}" + if not force and device != expected_device: + raise click.ClickException( + f"Device {device} should not be version {version}. " + "Use --force to proceed anyway." + ) + except ValueError as e: + if not force: + raise click.ClickException( + f"Failed to parse '{version}' as a version. " + "Use --force to proceed anyway." + ) from e + + if soon: + version = "soon" + print(f"Moving {device} missing infos to 'soon'") + else: + print(f"Releasing {device} firmware version {version}") + + defs, _ = coin_info.coin_info_with_duplicates() + coins_dict = defs.as_dict() + + # Invoke data fixup as dry-run. That will modify data internally but won't write + # changes. We will write changes at the end based on our own `dry_run` value. + print("Fixing up data...") + ctx.invoke(fix, dry_run=True) + + # process missing (not listed) supportinfos + if release_missing: + missing_list = find_unsupported_coins(coins_dict)[device] + for coin in missing_list: + key = coin["key"] + # we should have no unprocessed dup tokens at this point + assert not (coin.get("duplicate") and coin_info.is_token(coin)) + print(f"Adding missing {key} ({coin['name']})") + set_supported(device, key, version) + + # if we're releasing, process coins marked "soon" + # (`not soon` because `soon` means set release version to "soon") + if not soon and release_soon: + supported, _ = support_dicts(device) + soon_list = [ + coins_dict[key] + for key, val in supported.items() + if val == "soon" and key in coins_dict + ] + for coin in soon_list: + key = coin["key"] + print(f"Adding soon-released {key} ({coin['name']})") + set_supported(device, key, version) + + tagname = f"{device}-{version}" + if git_tag: + if dry_run: + print(f"Would tag current commit with {tagname}") + else: + print(f"Tagging current commit with {tagname}") + subprocess.check_call(["git", "tag", tagname]) + + if not dry_run: + write_support_info() + else: + print("No changes written") + + +@cli.command() +@click.argument("keyword", nargs=-1, required=True) +def show(keyword): + """Show support status of specified coins. + + Keywords match against key, name or shortcut (ticker symbol) of coin. + """ + defs, _ = coin_info.coin_info_with_duplicates() + + for kw in keyword: + for coin in coin_info.search(defs, kw): + print_support(coin) + + +@cli.command(name="set") +# fmt: off +@click.argument("key", required=True) +@click.argument("entries", nargs=-1, required=True, metavar="entry=value [entry=value]...") +@click.option("-r", "--reason", help="Reason for not supporting") +# fmt: on +def set_support_value(key, entries, reason): + """Set a support info variable. + + Examples: + support.py set coin:BTC trezor1=soon trezor2=2.0.7 webwallet=yes connect=no + support.py set coin:LTC trezor1=yes connect= + + Setting a variable to "yes", "true" or "1" sets support to true. + Setting a variable to "no", "false" or "0" sets support to false. + (or null, in case of trezor1/2) + Setting variable to empty ("trezor1=") will set to null, or clear the entry. + Setting to "soon", "planned", "2.1.1" etc. will set the literal string. + + Entries that are always present: + trezor1 trezor2 webwallet connect + + Entries with other names will be inserted into "others". This is a good place + to store links to 3rd party software, such as Electrum forks or claim tools. + """ + defs, _ = coin_info.coin_info_with_duplicates() + coins = defs.as_dict() + if key not in coins: + click.echo(f"Failed to find key {key}") + click.echo("Use 'support.py show' to search for the right one.") + sys.exit(1) + + if coins[key].get("duplicate") and coin_info.is_token(coins[key]): + shortcut = coins[key]["shortcut"] + click.echo(f"Note: shortcut {shortcut} is a duplicate.") + click.echo(f"Coin will NOT be listed regardless of support.json status.") + + for entry in entries: + try: + device, value = entry.split("=", maxsplit=1) + except ValueError: + click.echo(f"Invalid entry: {entry}") + sys.exit(2) + + if device not in SUPPORT_INFO: + raise click.ClickException(f"unknown device: {device}") + + if value in ("yes", "true", "1"): + set_supported(device, key, True) + elif value in ("no", "false", "0"): + if device in coin_info.MISSING_SUPPORT_MEANS_NO: + click.echo("Setting explicitly unsupported for {device}.") + click.echo("Perhaps you meant removing support, i.e., '{device}=' ?") + if not reason: + reason = click.prompt(f"Enter reason for not supporting on {device}:") + set_unsupported(device, key, reason) + elif value == "": + clear_support(device, key) + else: + # arbitrary string + set_supported(device, key, value) + + print_support(coins[key]) + write_support_info() + + +if __name__ == "__main__": + cli()