From 57021f9080ac614acaf0e3b56b26c891d776d372 Mon Sep 17 00:00:00 2001 From: matejcik Date: Fri, 20 Jul 2018 16:38:39 +0200 Subject: [PATCH 01/50] defs: regenerate coins_details with new tokens also make slight tweaks to existing coins_details.py, so that the following diff is prettier --- defs/coins_details.json | 1205 +++++++++++++++++++++++++++++---------- defs/ethereum/tokens | 2 +- tools/coins_details.py | 17 +- 3 files changed, 905 insertions(+), 319 deletions(-) diff --git a/defs/coins_details.json b/defs/coins_details.json index 76494cbe7..763c049e9 100644 --- a/defs/coins_details.json +++ b/defs/coins_details.json @@ -4,7 +4,7 @@ "links": { "Homepage": "https://www.cardano.org" }, - "marketcap_usd": 3324265276, + "marketcap_usd": 4482686788, "name": "Cardano", "shortcut": "ADA", "t1_enabled": "no", @@ -30,7 +30,7 @@ "links": { "Homepage": "https://ellaism.org" }, - "marketcap_usd": 614076, + "marketcap_usd": 674279, "name": "Ellaism", "shortcut": "ELLA", "t1_enabled": "yes", @@ -60,7 +60,7 @@ "links": { "Homepage": "https://ethereumclassic.github.io" }, - "marketcap_usd": 1709000951, + "marketcap_usd": 1726360707, "name": "Ethereum Classic", "shortcut": "ETC", "t1_enabled": "yes", @@ -75,7 +75,7 @@ "links": { "Homepage": "https://www.ethereum.org" }, - "marketcap_usd": 44090870783, + "marketcap_usd": 46802391646, "name": "Ethereum", "shortcut": "ETH", "t1_enabled": "yes", @@ -105,7 +105,7 @@ "links": { "Homepage": "https://www.expanse.tech" }, - "marketcap_usd": 8177837, + "marketcap_usd": 10593934, "name": "Expanse", "shortcut": "EXP", "t1_enabled": "yes", @@ -146,7 +146,7 @@ "links": { "Homepage": "https://ubiqsmart.com" }, - "marketcap_usd": 38000001, + "marketcap_usd": 46821303, "name": "Ubiq", "shortcut": "UBQ", "t1_enabled": "yes", @@ -196,7 +196,7 @@ "links": { "Homepage": "https://tezos.com" }, - "marketcap_usd": 1247867538, + "marketcap_usd": 1300463940, "name": "Tezos", "shortcut": "XTZ", "t1_enabled": "no", @@ -208,7 +208,7 @@ "Github": "https://github.com/Bitcoin-ABC/bitcoin-abc", "Homepage": "https://www.bitcoincash.org/" }, - "marketcap_usd": 12012942923, + "marketcap_usd": 13729622285, "name": "Bitcoin Cash", "shortcut": "BCH", "t1_enabled": "yes", @@ -224,7 +224,7 @@ "Github": "https://github.com/bitcoin/bitcoin", "Homepage": "https://bitcoin.org" }, - "marketcap_usd": 107327263391, + "marketcap_usd": 128315021625, "name": "Bitcoin", "shortcut": "BTC", "t1_enabled": "yes", @@ -240,19 +240,20 @@ "Github": "https://github.com/BTCPrivate/BitcoinPrivate", "Homepage": "https://btcprivate.org" }, - "marketcap_usd": 164328852, + "marketcap_usd": 141676432, "name": "Bitcoin Private", "shortcut": "BTCP", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "coin" + "type": "coin", + "wallet": {} }, "coin:BTG": { "links": { "Github": "https://github.com/BTCGPU/BTCGPU", "Homepage": "https://bitcoingold.org" }, - "marketcap_usd": 513246492, + "marketcap_usd": 508396087, "name": "Bitcoin Gold", "shortcut": "BTG", "t1_enabled": "yes", @@ -267,31 +268,33 @@ "Github": "https://github.com/LIMXTEC/BitCore", "Homepage": "https://bitcore.cc" }, - "marketcap_usd": 24867996, + "marketcap_usd": 27337289, "name": "Bitcore", "shortcut": "BTX", "t1_enabled": "no", "t2_enabled": "no", - "type": "coin" + "type": "coin", + "wallet": {} }, "coin:CRW": { "links": { "Github": "https://github.com/Crowndev/crowncoin", "Homepage": "https://crown.tech" }, - "marketcap_usd": 8021165, + "marketcap_usd": 8967717, "name": "Crown", "shortcut": "CRW", "t1_enabled": "no", "t2_enabled": "no", - "type": "coin" + "type": "coin", + "wallet": {} }, "coin:DASH": { "links": { "Github": "https://github.com/dashpay/dash", "Homepage": "https://www.dash.org" }, - "marketcap_usd": 1848122293, + "marketcap_usd": 2244144313, "name": "Dash", "shortcut": "DASH", "t1_enabled": "yes", @@ -306,24 +309,26 @@ "Github": "https://github.com/decred/dcrd", "Homepage": "https://www.decred.org" }, - "marketcap_usd": 438153911, + "marketcap_usd": 593053427, "name": "Decred", "shortcut": "DCR", "t1_enabled": "yes", "t2_enabled": "no", - "type": "coin" + "type": "coin", + "wallet": {} }, "coin:DGB": { "links": { "Github": "https://github.com/digibyte/digibyte", "Homepage": "https://www.digibyte.co" }, - "marketcap_usd": 410706122, + "marketcap_usd": 472432594, "name": "DigiByte", "shortcut": "DGB", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "coin" + "type": "coin", + "wallet": {} }, "coin:DNR": { "links": { @@ -334,14 +339,15 @@ "shortcut": "DNR", "t1_enabled": "no", "t2_enabled": "no", - "type": "coin" + "type": "coin", + "wallet": {} }, "coin:DOGE": { "links": { "Github": "https://github.com/dogecoin/dogecoin", "Homepage": "https://dogecoin.com" }, - "marketcap_usd": 267928623, + "marketcap_usd": 416955600, "name": "Dogecoin", "shortcut": "DOGE", "t1_enabled": "yes", @@ -356,7 +362,7 @@ "Github": "https://github.com/fujicoin/fujicoin", "Homepage": "https://www.fujicoin.org" }, - "marketcap_usd": 409832, + "marketcap_usd": 871352, "name": "Fujicoin", "shortcut": "FJC", "t1_enabled": "yes", @@ -375,26 +381,28 @@ "shortcut": "FLASH", "t1_enabled": "no", "t2_enabled": "no", - "type": "coin" + "type": "coin", + "wallet": {} }, "coin:FTC": { "links": { "Github": "https://github.com/FeatherCoin/Feathercoin", "Homepage": "https://feathercoin.com" }, - "marketcap_usd": 15883445, + "marketcap_usd": 21594346, "name": "Feathercoin", "shortcut": "FTC", "t1_enabled": "no", "t2_enabled": "no", - "type": "coin" + "type": "coin", + "wallet": {} }, "coin:GRS": { "links": { "Github": "https://github.com/Groestlcoin/groestlcoin", "Homepage": "https://www.groestlcoin.org" }, - "marketcap_usd": 38897934, + "marketcap_usd": 46522748, "name": "Groestlcoin", "shortcut": "GRS", "t1_enabled": "yes", @@ -413,14 +421,15 @@ "shortcut": "KOTO", "t1_enabled": "no", "t2_enabled": "no", - "type": "coin" + "type": "coin", + "wallet": {} }, "coin:LTC": { "links": { "Github": "https://github.com/litecoin-project/litecoin", "Homepage": "https://litecoin.org" }, - "marketcap_usd": 4459203516, + "marketcap_usd": 4882514683, "name": "Litecoin", "shortcut": "LTC", "t1_enabled": "yes", @@ -436,7 +445,7 @@ "Github": "https://github.com/monacoinproject/monacoin", "Homepage": "https://monacoin.org" }, - "marketcap_usd": 126711391, + "marketcap_usd": 136904441, "name": "Monacoin", "shortcut": "MONA", "t1_enabled": "yes", @@ -455,14 +464,15 @@ "shortcut": "MUE", "t1_enabled": "no", "t2_enabled": "no", - "type": "coin" + "type": "coin", + "wallet": {} }, "coin:NMC": { "links": { "Github": "https://github.com/namecoin/namecoin-core", "Homepage": "https://namecoin.org" }, - "marketcap_usd": 18991978, + "marketcap_usd": 13403036, "name": "Namecoin", "shortcut": "NMC", "t1_enabled": "yes", @@ -477,12 +487,13 @@ "Github": "https://github.com/FundacionPesetacoin/PesetacoinCore", "Homepage": "http://pesetacoin.info" }, - "marketcap_usd": 2725156, + "marketcap_usd": 3588805, "name": "Pesetacoin", "shortcut": "PTC", "t1_enabled": "no", "t2_enabled": "no", - "type": "coin" + "type": "coin", + "wallet": {} }, "coin:TAZ": { "hidden": 1, @@ -495,7 +506,8 @@ "shortcut": "TAZ", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "coin" + "type": "coin", + "wallet": {} }, "coin:TBCH": { "hidden": 1, @@ -508,7 +520,20 @@ "shortcut": "TBCH", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "coin" + "type": "coin", + "wallet": {} + }, + "coin:TBTG": { + "links": { + "Github": "https://github.com/BTCGPU/BTCGPU", + "Homepage": "https://bitcoingold.org" + }, + "name": "Bitcoin Gold Testnet", + "shortcut": "TBTG", + "t1_enabled": "no", + "t2_enabled": "no", + "type": "coin", + "wallet": {} }, "coin:TDCR": { "hidden": 1, @@ -521,7 +546,8 @@ "shortcut": "TDCR", "t1_enabled": "yes", "t2_enabled": "no", - "type": "coin" + "type": "coin", + "wallet": {} }, "coin:TEST": { "hidden": 1, @@ -534,7 +560,8 @@ "shortcut": "TEST", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "coin" + "type": "coin", + "wallet": {} }, "coin:TLTC": { "hidden": 1, @@ -547,19 +574,21 @@ "shortcut": "TLTC", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "coin" + "type": "coin", + "wallet": {} }, "coin:TRC": { "links": { "Github": "https://github.com/terracoin/terracoin", "Homepage": "https://terracoin.io" }, - "marketcap_usd": 2114446, + "marketcap_usd": 1977795, "name": "Terracoin", "shortcut": "TRC", "t1_enabled": "no", "t2_enabled": "no", - "type": "coin" + "type": "coin", + "wallet": {} }, "coin:VIA": { "hidden": 1, @@ -567,19 +596,20 @@ "Github": "https://github.com/viacoin", "Homepage": "https://viacoin.org" }, - "marketcap_usd": 23459968, + "marketcap_usd": 28457309, "name": "Viacoin", "shortcut": "VIA", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "coin" + "type": "coin", + "wallet": {} }, "coin:VTC": { "links": { "Github": "https://github.com/vertcoin-project/vertcoin-core", "Homepage": "https://vertcoin.org" }, - "marketcap_usd": 41968042, + "marketcap_usd": 48619898, "name": "Vertcoin", "shortcut": "VTC", "t1_enabled": "yes", @@ -594,19 +624,20 @@ "Github": "https://github.com/myriadcoin/myriadcoin", "Homepage": "https://www.myriadcoin.org" }, - "marketcap_usd": 5670418, + "marketcap_usd": 6334174, "name": "Myriad", "shortcut": "XMY", "t1_enabled": "no", "t2_enabled": "no", - "type": "coin" + "type": "coin", + "wallet": {} }, "coin:XZC": { "links": { "Github": "https://github.com/zcoinofficial/zcoin", "Homepage": "https://zcoin.io" }, - "marketcap_usd": 84786256, + "marketcap_usd": 94586975, "name": "Zcoin", "shortcut": "XZC", "t1_enabled": "yes", @@ -622,7 +653,7 @@ "Github": "https://github.com/zcash/zcash", "Homepage": "z.cash" }, - "marketcap_usd": 693707511, + "marketcap_usd": 855681961, "name": "Zcash", "shortcut": "ZEC", "t1_enabled": "yes", @@ -637,12 +668,13 @@ "Github": "https://github.com/ZencashOfficial/zen", "Homepage": "https://zencash.com" }, - "marketcap_usd": 88163199, + "marketcap_usd": 124100964, "name": "Zencash", "shortcut": "ZEN", "t1_enabled": "no", "t2_enabled": "soon", - "type": "coin" + "type": "coin", + "wallet": {} }, "coin:tDASH": { "hidden": 1, @@ -655,7 +687,8 @@ "shortcut": "tDASH", "t1_enabled": "yes", "t2_enabled": "no", - "type": "coin" + "type": "coin", + "wallet": {} }, "coin:tGRS": { "hidden": 1, @@ -668,7 +701,8 @@ "shortcut": "tGRS", "t1_enabled": "yes", "t2_enabled": "soon", - "type": "coin" + "type": "coin", + "wallet": {} }, "coin:tXZC": { "hidden": 1, @@ -681,7 +715,8 @@ "shortcut": "tXZC", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "coin" + "type": "coin", + "wallet": {} }, "erc20:ella:MINING": { "address": "0x991e7Fe4b05f2b3db1D788e705963f5D647b0044", @@ -791,7 +826,7 @@ "links": { "Homepage": "https://0xbitcoin.org/" }, - "marketcap_usd": 2583891, + "marketcap_usd": 2705930, "name": "0xBitcoin", "network": "eth", "shortcut": "0xBTC", @@ -808,7 +843,7 @@ "links": { "Homepage": "https://firstblood.io" }, - "marketcap_usd": 0, + "marketcap_usd": 13464920, "name": "FirstBlood", "network": "eth", "shortcut": "1ST", @@ -927,7 +962,7 @@ "links": { "Homepage": "http://accelerator.network" }, - "marketcap_usd": 0, + "marketcap_usd": 192471, "name": "Accelerator Network", "network": "eth", "shortcut": "ACC", @@ -962,7 +997,7 @@ "Github": "https://github.com/aditus", "Homepage": "https://aditus.net" }, - "marketcap_usd": 0, + "marketcap_usd": 1904801, "name": "Aditus", "network": "eth", "shortcut": "ADI", @@ -997,7 +1032,7 @@ "links": { "Homepage": "https://adshares.net" }, - "marketcap_usd": 0, + "marketcap_usd": 2202222, "name": "AdShares", "network": "eth", "shortcut": "ADST", @@ -1015,7 +1050,7 @@ "Github": "https://github.com/adchain", "Homepage": "https://adtoken.com" }, - "marketcap_usd": 0, + "marketcap_usd": 9332100, "name": "AdToken", "network": "eth", "shortcut": "ADT", @@ -1051,7 +1086,7 @@ "Github": "https://github.com/aeternity", "Homepage": "https://www.aeternity.com/" }, - "marketcap_usd": 0, + "marketcap_usd": 434471331, "name": "aeternity", "network": "eth", "shortcut": "AE", @@ -1069,7 +1104,7 @@ "Github": "https://github.com/singnet/singnet", "Homepage": "https://singularitynet.io" }, - "marketcap_usd": 0, + "marketcap_usd": 53104928, "name": "SingularityNET", "network": "eth", "shortcut": "AGI", @@ -1087,7 +1122,7 @@ "Github": "https://github.com/aionnetwork", "Homepage": "https://aion.network/" }, - "marketcap_usd": 159620842, + "marketcap_usd": 168020932, "name": "Aion", "network": "eth", "shortcut": "AION", @@ -1104,7 +1139,7 @@ "links": { "Homepage": "https://airtoken.com" }, - "marketcap_usd": 0, + "marketcap_usd": 4410872, "name": "AirToken", "network": "eth", "shortcut": "AIR", @@ -1122,7 +1157,7 @@ "Github": "https://github.com/AigangNetwork", "Homepage": "https://aigang.network/" }, - "marketcap_usd": 0, + "marketcap_usd": 1771964, "name": "Aigang", "network": "eth", "shortcut": "AIX", @@ -1134,6 +1169,23 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:AKC": { + "address": "0x1Ca43a170BaD619322e6f54d46b57e504dB663aA", + "links": { + "Github": "https://github.com/artwook", + "Homepage": "https://artwook.com" + }, + "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": { @@ -1157,7 +1209,7 @@ "Github": "https://github.com/AlisProject", "Homepage": "https://alismedia.jp" }, - "marketcap_usd": 3288797, + "marketcap_usd": 3267287, "name": "ALIS Token", "network": "eth", "shortcut": "ALIS", @@ -1228,7 +1280,7 @@ "Github": "https://github.com/amontech", "Homepage": "https://amon.tech" }, - "marketcap_usd": 0, + "marketcap_usd": 1598707, "name": "Amon", "network": "eth", "shortcut": "AMN", @@ -1278,7 +1330,7 @@ "erc20:eth:ANT": { "address": "0x960b236A07cf122663c4303350609A66A7B288C0", "links": { - "Homepage": "https://aragon.one/network/" + "Homepage": "https://aragon.one/network" }, "marketcap_usd": 0, "name": "ANT", @@ -1298,7 +1350,7 @@ "Github": "https://github.com/Oxchild/crowdsale", "Homepage": "https://apisplatform.io" }, - "marketcap_usd": 18839180, + "marketcap_usd": 26951530, "name": "APIS", "network": "eth", "shortcut": "APIS", @@ -1316,7 +1368,7 @@ "Github": "https://github.com/Aptoide/AppCoins-ethereumj", "Homepage": "https://appcoins.io" }, - "marketcap_usd": 0, + "marketcap_usd": 18715459, "name": "AppCoins", "network": "eth", "shortcut": "APPC", @@ -1333,7 +1385,7 @@ "links": { "Homepage": "https://aigang.network" }, - "marketcap_usd": 0, + "marketcap_usd": 1771964, "name": "AIGang", "network": "eth", "shortcut": "APT", @@ -1349,7 +1401,7 @@ "address": "0xAc709FcB44a43c35F0DA4e3163b117A17F3770f5", "links": { "Github": "https://github.com/swarmcity/ac-token", - "Homepage": "https://arcade.city/" + "Homepage": "https://arcade.city" }, "marketcap_usd": 0, "name": "Arcade", @@ -1368,7 +1420,7 @@ "links": { "Homepage": "https://www.arbitragect.com" }, - "marketcap_usd": 0, + "marketcap_usd": 347247, "name": "ArbitrageCT", "network": "eth", "shortcut": "ARCT", @@ -1473,7 +1525,7 @@ "links": { "Homepage": "https://airswap.io" }, - "marketcap_usd": 0, + "marketcap_usd": 21939300, "name": "Airswap", "network": "eth", "shortcut": "AST", @@ -1680,7 +1732,7 @@ "erc20:eth:BAT": { "address": "0x0D8775F648430679A709E98d2b0Cb6250d2887EF", "links": { - "Homepage": "https://basicattentiontoken.org/" + "Homepage": "https://basicattentiontoken.org" }, "marketcap_usd": 0, "name": "BAT", @@ -1734,7 +1786,7 @@ "address": "0x1e797Ce986C3CFF4472F7D38d5C4aba55DfEFE40", "links": { "Github": "https://github.com/Blockcdnteam", - "Homepage": "https://www.blockcdn.org/" + "Homepage": "https://www.blockcdn.org" }, "marketcap_usd": 0, "name": "BCDN", @@ -1843,7 +1895,7 @@ "Github": "https://github.com/thebeetoken", "Homepage": "https://www.beetoken.com" }, - "marketcap_usd": 0, + "marketcap_usd": 3704273, "name": "Bee Token", "network": "eth", "shortcut": "BEE", @@ -1877,7 +1929,7 @@ "address": "0x8aA33A7899FCC8eA5fBe6A608A109c3893A1B8b2", "links": { "Github": "https://github.com/daocasino", - "Homepage": "https://dao.casino/" + "Homepage": "https://dao.casino" }, "marketcap_usd": 0, "name": "BET", @@ -1891,6 +1943,23 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:BETHER": { + "address": "0x14C926F2290044B647e1Bf2072e67B495eff1905", + "links": { + "Github": "https://github.com/bethereumproject", + "Homepage": "https://www.bethereum.com/" + }, + "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": { @@ -1949,7 +2018,7 @@ "Github": "https://github.com/BankEx", "Homepage": "https://bankex.com/" }, - "marketcap_usd": 0, + "marketcap_usd": 15850616, "name": "BANKEX", "network": "eth", "shortcut": "BKX", @@ -1985,7 +2054,7 @@ "Github": "https://github.com/BlueCrypto", "Homepage": "https://blueprotocol.com/" }, - "marketcap_usd": 0, + "marketcap_usd": 3908915, "name": "Ethereum Blue", "network": "eth", "shortcut": "BLUE", @@ -2018,9 +2087,9 @@ "erc20:eth:BLX (Iconomi)": { "address": "0xE5a7c12972f3bbFe70ed29521C8949b8Af6a0970", "links": { - "Homepage": "https://www.iconomi.net/" + "Homepage": "https://www.iconomi.net" }, - "marketcap_usd": 0, + "marketcap_usd": 64416238, "name": "Iconomi", "network": "eth", "shortcut": "BLX (Iconomi)", @@ -2121,7 +2190,7 @@ "erc20:eth:BNC": { "address": "0xdD6Bf56CA2ada24c683FAC50E37783e55B57AF9F", "links": { - "Homepage": "https://bravenewcoin.com/" + "Homepage": "https://bravenewcoin.com" }, "marketcap_usd": 0, "name": "BNC", @@ -2154,10 +2223,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": 113759781, "name": "Bancor", "network": "eth", "shortcut": "BNT", @@ -2208,7 +2277,7 @@ "links": { "Homepage": "https://bonpay.com" }, - "marketcap_usd": 0, + "marketcap_usd": 1538450, "name": "Bonpay", "network": "eth", "shortcut": "BON", @@ -2292,9 +2361,9 @@ "erc20:eth:BRAT": { "address": "0x9E77D5a1251b6F7D456722A6eaC6D2d5980bd891", "links": { - "Homepage": "http://bro-consortium.io/" + "Homepage": "http://bro-consortium.io" }, - "marketcap_usd": 52824, + "marketcap_usd": 58810, "name": "BRAT", "network": "eth", "shortcut": "BRAT", @@ -2310,9 +2379,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": 35550647, "name": "Bread", "network": "eth", "shortcut": "BRD", @@ -2450,7 +2519,7 @@ "address": "0xdb8646F5b487B5Dd979FAC618350e85018F557d4", "links": { "Github": "https://github.com/bitcoin-token", - "Homepage": "https://btk.community/" + "Homepage": "https://btk.community" }, "marketcap_usd": 0, "name": "Bitcoin Token", @@ -2505,7 +2574,7 @@ "Github": "https://github.com/bytom", "Homepage": "https://bytom.io" }, - "marketcap_usd": 0, + "marketcap_usd": 360079695, "name": "Bytom", "network": "eth", "shortcut": "BTM", @@ -2608,7 +2677,7 @@ "Github": "https://github.com/cryptotwenty", "Homepage": "https://crypto20.com" }, - "marketcap_usd": 34228481, + "marketcap_usd": 42852656, "name": "Crypto20's Token", "network": "eth", "shortcut": "C20", @@ -2722,7 +2791,7 @@ } }, "erc20:eth:CARD": { - "address": "0x1ed2B1eaEd8e968bc36EB90a914660A71827A5E9", + "address": "0xB07ec2c28834B889b1CE527Ca0F19364cD38935c", "links": { "Github": "https://github.com/cardstack", "Homepage": "https://cardstack.com" @@ -2761,7 +2830,7 @@ "links": { "Homepage": "https://cashaa.com" }, - "marketcap_usd": 0, + "marketcap_usd": 14192264, "name": "Cashaa", "network": "eth", "shortcut": "CAS", @@ -2824,6 +2893,23 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:CBIX": { + "address": "0x05C3617cBf1304b9260AA61ec960F115D67beCEA", + "links": { + "Github": "https://github.com/Cubrixio", + "Homepage": "https://cubrix.io" + }, + "name": "Cubrix", + "network": "eth", + "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": { @@ -2947,9 +3033,9 @@ } }, "erc20:eth:CDX": { - "address": "0x2cb101d7dA0ebaA57D3F2fEf46D7FFB7BB64592B", + "address": "0x6fFF3806Bbac52A20e0d79BC538d527f6a22c96b", "links": { - "Homepage": "https://www.carbondollarx.com" + "Homepage": "https://commodityadnetwork.com" }, "marketcap_usd": 0, "name": "CDX", @@ -2980,6 +3066,39 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:CET": { + "address": "0xF660cA1e228e7BE1fA8B4f5583145E31147FB577", + "links": { + "Github": "https://github.com/DICE-Money/", + "Homepage": "https://dice.money/" + }, + "name": "DICE Money Dicet", + "network": "eth", + "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" + }, + "name": "CryptFillCoin", + "network": "eth", + "shortcut": "CFC", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:CFI": { "address": "0x12FEF5e57bF45873Cd9B62E9DBd7BFb99e32D73e", "links": { @@ -3194,7 +3313,7 @@ "links": { "Homepage": "https://cindicator.com" }, - "marketcap_usd": 0, + "marketcap_usd": 45655699, "name": "Cindicator", "network": "eth", "shortcut": "CND", @@ -3301,7 +3420,7 @@ "Github": "https://github.com/CoinvestHQ", "Homepage": "https://coinve.st" }, - "marketcap_usd": 125132, + "marketcap_usd": 125950, "name": "Coinvest V2 Token", "network": "eth", "shortcut": "COIN", @@ -3318,7 +3437,7 @@ "links": { "Homepage": "https://coss.io" }, - "marketcap_usd": 11131308, + "marketcap_usd": 10338104, "name": "Coss Token", "network": "eth", "shortcut": "COSS", @@ -3335,7 +3454,7 @@ "links": { "Homepage": "https://covesting.io/" }, - "marketcap_usd": 0, + "marketcap_usd": 21379225, "name": "Covesting", "network": "eth", "shortcut": "COV", @@ -3371,7 +3490,7 @@ "Github": "https://github.com/aditus", "Homepage": "https://copytrack.io" }, - "marketcap_usd": 0, + "marketcap_usd": 2405879, "name": "COPYTRACK", "network": "eth", "shortcut": "CPY", @@ -3404,7 +3523,7 @@ "erc20:eth:CRB": { "address": "0xAef38fBFBF932D1AeF3B808Bc8fBd8Cd8E1f8BC5", "links": { - "Homepage": "https://www.creditbit.org/" + "Homepage": "https://www.creditbit.org" }, "marketcap_usd": 0, "name": "CRB", @@ -3441,7 +3560,7 @@ "links": { "Homepage": "https://bitbounce.io" }, - "marketcap_usd": 16010757, + "marketcap_usd": 16657319, "name": "Credo / Bitbounce", "network": "eth", "shortcut": "CREDO", @@ -3523,6 +3642,23 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:CTGC": { + "address": "0x9E7D29bd499B6c7da2a5B2EaFCF4A39d3BD845D1", + "links": { + "Github": "https://github.com/ctgcoin/", + "Homepage": "https://www.ctgcoin.org" + }, + "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, @@ -3576,7 +3712,7 @@ "erc20:eth:CVC": { "address": "0x41e5560054824eA6B0732E656E3Ad64E20e94E45", "links": { - "Homepage": "https://www.civic.com/" + "Homepage": "https://www.civic.com" }, "marketcap_usd": 0, "name": "CVC", @@ -3614,7 +3750,7 @@ "Github": "https://github.com/cargoxio", "Homepage": "https://cargox.io" }, - "marketcap_usd": 0, + "marketcap_usd": 4797791, "name": "CargoX", "network": "eth", "shortcut": "CXO", @@ -3629,9 +3765,9 @@ "erc20:eth:CryptoCarbon": { "address": "0xE4c94d45f7Aef7018a5D66f44aF780ec6023378e", "links": { - "Homepage": "https://ccrb.io/" + "Homepage": "https://ccrb.io" }, - "marketcap_usd": 1912153, + "marketcap_usd": 2795928, "name": "CryptoCarbon", "network": "eth", "shortcut": "CryptoCarbon", @@ -3665,7 +3801,7 @@ "links": { "Homepage": "https://dadi.cloud" }, - "marketcap_usd": 9485214, + "marketcap_usd": 8217712, "name": "DADI", "network": "eth", "shortcut": "DADI", @@ -3683,7 +3819,7 @@ "Github": "https://github.com/makerdao", "Homepage": "https://makerdao.com" }, - "marketcap_usd": 52350918, + "marketcap_usd": 54035637, "name": "Dai Stablecoin v1.0", "network": "eth", "shortcut": "DAI", @@ -3700,7 +3836,7 @@ "links": { "Homepage": "http://www.dalecoin.org" }, - "marketcap_usd": 0, + "marketcap_usd": 83644, "name": "DaleCoin", "network": "eth", "shortcut": "DALC", @@ -3733,7 +3869,7 @@ "erc20:eth:DAO": { "address": "0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413", "links": { - "Homepage": "https://blog.daohub.org/" + "Homepage": "https://blog.daohub.org" }, "marketcap_usd": 0, "name": "DAO", @@ -3788,7 +3924,7 @@ "Github": "https://github.com/streamr-dev", "Homepage": "https://www.streamr.com" }, - "marketcap_usd": 171265, + "marketcap_usd": 140182, "name": "DATACoin", "network": "eth", "shortcut": "DATACoin", @@ -3871,6 +4007,24 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:DCC": { + "address": "0xFFa93Aacf49297D51E211817452839052FDFB961", + "links": { + "Github": "https://github.com/DistributedBanking/DCC", + "Homepage": "http://dcc.finance" + }, + "marketcap_usd": 20519240, + "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": { @@ -3894,7 +4048,7 @@ "Github": "https://github.com/Dentacoin", "Homepage": "https://dentacoin.com" }, - "marketcap_usd": 0, + "marketcap_usd": 123029325, "name": "Dentacoin", "network": "eth", "shortcut": "DCN", @@ -3910,7 +4064,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", @@ -3962,9 +4116,9 @@ "erc20:eth:DENT": { "address": "0x3597bfD533a99c9aa083587B074434E61Eb0A258", "links": { - "Homepage": "https://www.dentwireless.com/" + "Homepage": "https://www.dentwireless.com" }, - "marketcap_usd": 43968463, + "marketcap_usd": 35875345, "name": "DENT", "network": "eth", "shortcut": "DENT", @@ -4016,7 +4170,7 @@ "Github": "https://github.com/digipulseio", "Homepage": "https://www.digipulse.io" }, - "marketcap_usd": 0, + "marketcap_usd": 3190500, "name": "DigiPulse", "network": "eth", "shortcut": "DGPT", @@ -4028,12 +4182,30 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:DGS": { + "address": "0x6aEDbF8dFF31437220dF351950Ba2a3362168d1b", + "links": { + "Github": "https://github.com/dragonglasscom", + "Homepage": "https://dragonglass.com/" + }, + "name": "Dragonglass", + "network": "eth", + "shortcut": "DGS", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "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, + "marketcap_usd": 2032107, "name": "DGX", "network": "eth", "shortcut": "DGX", @@ -4045,12 +4217,29 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:DGX1": { + "address": "0x55b9a11c2e8351b4Ffc7b11561148bfaC9977855", + "links": { + "Github": "https://github.com/DigixGlobal", + "Homepage": "https://digix.global" + }, + "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": 7036071, "name": "Etheroll", "network": "eth", "shortcut": "DICE", @@ -4062,6 +4251,21 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:DIP": { + "address": "0xc719d010B63E5bbF2C0551872CD5316ED26AcD83", + "hidden": 1, + "links": {}, + "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": { @@ -4167,9 +4371,9 @@ } }, "erc20:eth:DOW": { - "address": "0xEEF6E90034eEa89E31Eb4B8eaCd323F28A92eaE4", + "address": "0x76974C7B79dC8a6a109Fd71fd7cEb9E40eff5382", "links": { - "Homepage": "https://www.dowico.com" + "Homepage": "https://dowcoin.io/" }, "marketcap_usd": 0, "name": "DOW", @@ -4240,7 +4444,7 @@ "links": { "Homepage": "https://dropil.com" }, - "marketcap_usd": 0, + "marketcap_usd": 109740129, "name": "Dropil", "network": "eth", "shortcut": "DROP (dropil)", @@ -4253,9 +4457,9 @@ } }, "erc20:eth:DRP": { - "address": "0x621d78f2EF2fd937BFca696CabaF9A779F59B3Ed", + "address": "0x2799D90C6d44Cb9Aa5fBC377177F16C33E056b82", "links": { - "Homepage": "https://www.dcorp.it" + "Homepage": "http://drpcoin.com" }, "marketcap_usd": 0, "name": "Dripcoin", @@ -4269,6 +4473,23 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:DRVH": { + "address": "0x62D4c04644314F35868Ba4c65cc27a77681dE7a9", + "links": { + "Github": "https://github.com/TeamDriveholic", + "Homepage": "https://driveholic.com/" + }, + "name": "Driveholic Token", + "network": "eth", + "shortcut": "DRVH", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:DSC": { "address": "0x1e09BD8Cadb441632e441Db3e1D79909EE0A2256", "links": { @@ -4292,7 +4513,7 @@ "Github": "https://github.com/dethertech", "Homepage": "https://dether.io" }, - "marketcap_usd": 0, + "marketcap_usd": 2833670, "name": "dether", "network": "eth", "shortcut": "DTH", @@ -4360,7 +4581,7 @@ "erc20:eth:DTx": { "address": "0x82fdedfB7635441aA5A92791D001fA7388da8025", "links": { - "Homepage": "https://www.digitalticks.com/" + "Homepage": "https://www.digitalticks.com" }, "marketcap_usd": 0, "name": "DigitalTicks", @@ -4375,7 +4596,7 @@ } }, "erc20:eth:DUBI": { - "address": "0x9c6Fa42209169bCeA032e401188a6fc3e9C9f59c", + "address": "0xD4CffeeF10F60eCA581b5E1146B5Aca4194a4C3b", "links": { "Github": "https://github.com/nionis/purpose", "Homepage": "https://prps.io" @@ -4415,7 +4636,7 @@ "Github": "https://github.com/elangindonesia/EagleCoin", "Homepage": "https://eaglepay.io" }, - "marketcap_usd": 0, + "marketcap_usd": 184753, "name": "EagleCoin", "network": "eth", "shortcut": "EAGLE", @@ -4461,6 +4682,22 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:ECP": { + "address": "0xAEA1C18A992984831002D0cf90E291FB52d72649", + "links": { + "Homepage": "https://ecryptotokens.com" + }, + "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": { @@ -4483,7 +4720,7 @@ "links": { "Homepage": "https://edgeless.io" }, - "marketcap_usd": 0, + "marketcap_usd": 33942785, "name": "Edgeless", "network": "eth", "shortcut": "EDG", @@ -4500,7 +4737,7 @@ "links": { "Homepage": "https://eidoo.io" }, - "marketcap_usd": 0, + "marketcap_usd": 28004213, "name": "Eidoo", "network": "eth", "shortcut": "EDO", @@ -4513,7 +4750,7 @@ } }, "erc20:eth:EDU": { - "address": "0x2A22e5cCA00a3D63308fa39f29202eB1b39eEf52", + "address": "0x5b26C5D0772E5bbaC8b3182AE9a13f9BB2D03765", "links": { "Github": "https://github.com/livecodingtvofficial", "Homepage": "https://tokensale.liveedu.tv" @@ -4552,7 +4789,7 @@ "address": "0xf9F0FC7167c311Dd2F1e21E9204F87EBA9012fB2", "links": { "Github": "https://github.com/team-easyhomes", - "Homepage": "https://easyhomes.io/" + "Homepage": "https://easyhomes.io" }, "marketcap_usd": 0, "name": "EasyHomes", @@ -4607,7 +4844,7 @@ "Github": "https://github.com/eltcoin", "Homepage": "http://www.eltcoin.tech/" }, - "marketcap_usd": 509769, + "marketcap_usd": 335480, "name": "ELTCOIN", "network": "eth", "shortcut": "ELTCOIN", @@ -4619,6 +4856,23 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:ELY": { + "address": "0xa95592DCFfA3C080B4B40E459c5f5692F67DB7F8", + "links": { + "Github": "https://github.com/Elysian-ELY", + "Homepage": "https://elycoin.io" + }, + "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": { @@ -4767,7 +5021,7 @@ "links": { "Homepage": "https://eos.io" }, - "marketcap_usd": 6369167440, + "marketcap_usd": 7453167788, "name": "EOS", "network": "eth", "shortcut": "EOS", @@ -4820,7 +5074,7 @@ "links": { "Homepage": "https://www.ethbits.com" }, - "marketcap_usd": 0, + "marketcap_usd": 1559890, "name": "Ethbits", "network": "eth", "shortcut": "ETBS", @@ -4870,7 +5124,7 @@ "address": "0x6927C69fb4daf2043fbB1Cb7b86c5661416bea29", "links": { "Github": "https://github.com/pironmind/EthereumRisen", - "Homepage": "http://ethereumrisen.io/" + "Homepage": "http://ethereumrisen.io" }, "marketcap_usd": 0, "name": "Etheruem Risen", @@ -4995,7 +5249,7 @@ "address": "0x190e569bE071F40c704e15825F285481CB74B6cC", "links": { "Github": "https://github.com/BattleDrome", - "Homepage": "http://www.battledrome.io/" + "Homepage": "http://www.battledrome.io" }, "marketcap_usd": 0, "name": "FAM", @@ -5009,6 +5263,22 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:FAN": { + "address": "0x90162f41886c0946D09999736f1C15c8a105A421", + "links": { + "Homepage": "https://tokensale.fanfare.global" + }, + "name": "Fan Token", + "network": "eth", + "shortcut": "FAN", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:FANX": { "address": "0x7f6715c3FC4740A02F70De85B9FD50ac6001fEd9", "links": { @@ -5062,9 +5332,9 @@ } }, "erc20:eth:FLMC": { - "address": "0x5976F7dac1525eF3277836043bA474a35E6B4272", + "address": "0x04cC783b450b8D11F3C7d00DD03fDF7FB51fE9F2", "links": { - "Homepage": "https://filmscoin.io" + "Homepage": "https://filmscoin.com" }, "marketcap_usd": 0, "name": "Filmscoin", @@ -5153,7 +5423,7 @@ "Github": "https://github.com/FundRequest", "Homepage": "https://fundrequest.io" }, - "marketcap_usd": 0, + "marketcap_usd": 1330223, "name": "FundRequest", "network": "eth", "shortcut": "FND", @@ -5274,7 +5544,7 @@ "links": { "Homepage": "https://funfair.io" }, - "marketcap_usd": 0, + "marketcap_usd": 131098821, "name": "Funfair", "network": "eth", "shortcut": "FUN", @@ -5286,6 +5556,23 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:FXC": { + "address": "0xc92D6E3E64302C59d734f3292E2A13A13D7E1817", + "links": { + "Github": "https://github.com/futuraxproject", + "Homepage": "https://futurax.global" + }, + "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": { @@ -5309,7 +5596,7 @@ "Github": "https://github.com/BlockchainLabsNZ/gambit", "Homepage": "http://gambitcrypto.com" }, - "marketcap_usd": 0, + "marketcap_usd": 6448988, "name": "Gambit", "network": "eth", "shortcut": "GAM", @@ -5360,7 +5647,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", @@ -5450,7 +5737,7 @@ "Github": "https://github.com/daostack", "Homepage": "https://daostack.io" }, - "marketcap_usd": 0, + "marketcap_usd": 7090810, "name": "DAOstack", "network": "eth", "shortcut": "GEN", @@ -5555,7 +5842,7 @@ "links": { "Homepage": "https://golem.network" }, - "marketcap_usd": 240976591, + "marketcap_usd": 298260952, "name": "Golem", "network": "eth", "shortcut": "GNT", @@ -5590,7 +5877,7 @@ "links": { "Homepage": "https://gridplus.io/token-sale" }, - "marketcap_usd": 10909000, + "marketcap_usd": 12329479, "name": "GRID", "network": "eth", "shortcut": "GRID", @@ -5620,6 +5907,22 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:GSE": { + "address": "0xe530441f4f73bDB6DC2fA5aF7c3fC5fD551Ec838", + "links": { + "Homepage": "https://www.gse.network" + }, + "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": { @@ -5642,7 +5945,7 @@ "address": "0x025abAD9e518516fdaAFBDcdB9701b37fb7eF0FA", "links": { "Github": "https://github.com/sprux/BackToEarth", - "Homepage": "https://backto.earth/" + "Homepage": "https://backto.earth" }, "marketcap_usd": 0, "name": "GTKT", @@ -5662,7 +5965,7 @@ "Github": "https://github.com/GIFTO-io", "Homepage": "https://gifto.io/" }, - "marketcap_usd": 0, + "marketcap_usd": 90430369, "name": "Gifto", "network": "eth", "shortcut": "GTO", @@ -5698,7 +6001,7 @@ "Github": "https://github.com/GenesisVision", "Homepage": "https://genesis.vision" }, - "marketcap_usd": 0, + "marketcap_usd": 33487213, "name": "Genesis Vision", "network": "eth", "shortcut": "GVT", @@ -5731,7 +6034,7 @@ "address": "0x22F0AF8D78851b72EE799e05F54A77001586B18A", "links": { "Github": "https://github.com/GxC17Genevieve/GXVC", - "Homepage": "https://genevieveco.io/" + "Homepage": "https://genevieveco.io" }, "marketcap_usd": 0, "name": "Genevieve VC", @@ -5803,7 +6106,7 @@ "Github": "https://github.com/havven/havven", "Homepage": "https://havven.io" }, - "marketcap_usd": 0, + "marketcap_usd": 13898422, "name": "Havven", "network": "eth", "shortcut": "HAV", @@ -5836,7 +6139,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", @@ -5925,7 +6228,7 @@ "links": { "Homepage": "https://github.com/arachnid/hodlcoin" }, - "marketcap_usd": 0, + "marketcap_usd": 245622, "name": "HODLCoin", "network": "eth", "shortcut": "HODL", @@ -5956,12 +6259,12 @@ } }, "erc20:eth:HOT": { - "address": "0x6c6EE5e31d828De241282B9606C8e98Ea48526E2", + "address": "0x9AF839687F6C94542ac5ece2e317dAAE355493A1", "links": { "Github": "https://github.com/Holo-Host", - "Homepage": "https://holo.host/" + "Homepage": "https://thehydrofoundation.com/" }, - "marketcap_usd": 0, + "marketcap_usd": 21011913, "name": "Hydro Protocol", "network": "eth", "shortcut": "HOT", @@ -5996,7 +6299,7 @@ "Github": "https://github.com/HiveProjectLTD", "Homepage": "https://hive-project.net" }, - "marketcap_usd": 0, + "marketcap_usd": 16531725, "name": "Hive Project", "network": "eth", "shortcut": "HVN", @@ -6084,7 +6387,7 @@ "erc20:eth:ICE": { "address": "0x5a84969bb663fb64F6d015DcF9F622Aedc796750", "links": { - "Homepage": "https://idice.io/" + "Homepage": "https://idice.io" }, "marketcap_usd": 0, "name": "ICE", @@ -6134,9 +6437,9 @@ "erc20:eth:ICOS": { "address": "0x014B50466590340D41307Cc54DCee990c8D58aa8", "links": { - "Homepage": "https://icos.icobox.io/" + "Homepage": "https://icos.icobox.io" }, - "marketcap_usd": 5187815, + "marketcap_usd": 4524391, "name": "ICOS", "network": "eth", "shortcut": "ICOS", @@ -6153,7 +6456,7 @@ "links": { "Homepage": "https://www.icon.foundation" }, - "marketcap_usd": 0, + "marketcap_usd": 534678495, "name": "ICON", "network": "eth", "shortcut": "ICX", @@ -6187,7 +6490,7 @@ "links": { "Homepage": "https://investfeed.com" }, - "marketcap_usd": 0, + "marketcap_usd": 5524354, "name": "InvestFeed", "network": "eth", "shortcut": "IFT", @@ -6220,7 +6523,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", @@ -6322,7 +6625,7 @@ "links": { "Homepage": "https://insights.network" }, - "marketcap_usd": 0, + "marketcap_usd": 2461524, "name": "Insights Network", "network": "eth", "shortcut": "INSTAR", @@ -6339,7 +6642,7 @@ "links": { "Homepage": "https://internxt.io" }, - "marketcap_usd": 0, + "marketcap_usd": 2717546, "name": "Internxt", "network": "eth", "shortcut": "INXT", @@ -6356,7 +6659,7 @@ "links": { "Homepage": "https://iost.io/" }, - "marketcap_usd": 0, + "marketcap_usd": 197232840, "name": "IOSToken", "network": "eth", "shortcut": "IOST", @@ -6427,7 +6730,7 @@ "Github": "https://github.com/IoTChainCode", "Homepage": "https://iotchain.io/" }, - "marketcap_usd": 0, + "marketcap_usd": 28559882, "name": "IoT Chain", "network": "eth", "shortcut": "ITC", @@ -6529,7 +6832,7 @@ "erc20:eth:JET": { "address": "0x8727c112C712c4a03371AC87a74dD6aB104Af768", "links": { - "Homepage": "https://jetcoin.io/" + "Homepage": "https://jetcoin.io" }, "marketcap_usd": 0, "name": "JET", @@ -6634,7 +6937,7 @@ "Github": "https://github.com/bihu-id", "Homepage": "https://selfkey.org" }, - "marketcap_usd": 0, + "marketcap_usd": 25785161, "name": "SelfKey", "network": "eth", "shortcut": "KEY", @@ -6650,7 +6953,7 @@ "address": "0x27695E09149AdC738A978e9A678F99E4c39e9eb9", "links": { "Github": "https://github.com/kickico", - "Homepage": "https://www.kickico.com/" + "Homepage": "https://www.kickico.com" }, "marketcap_usd": 0, "name": "KICK", @@ -6670,7 +6973,7 @@ "Github": "https://github.com/kikinteractive/kin-token", "Homepage": "https://kin.kik.com" }, - "marketcap_usd": 104532000, + "marketcap_usd": 154172829, "name": "Kin Foundation", "network": "eth", "shortcut": "KIN", @@ -6688,7 +6991,7 @@ "Github": "https://github.com/KyberNetwork", "Homepage": "https://kyber.network" }, - "marketcap_usd": 0, + "marketcap_usd": 130595886, "name": "Kyber Network", "network": "eth", "shortcut": "KNC", @@ -6759,7 +7062,7 @@ "Github": "https://github.com/latoken", "Homepage": "https://latoken.com/" }, - "marketcap_usd": 0, + "marketcap_usd": 9876825, "name": "LATOKEN", "network": "eth", "shortcut": "LA", @@ -6793,7 +7096,7 @@ "links": { "Homepage": "https://www.leadcoin.network/" }, - "marketcap_usd": 0, + "marketcap_usd": 2998242, "name": "LEADCOIN", "network": "eth", "shortcut": "LDC", @@ -6806,7 +7109,7 @@ } }, "erc20:eth:LEMO": { - "address": "0xd6e354F07319e2474491D8c7c712137bEe6862a2", + "address": "0x60C24407d01782C2175D32fe7C8921ed732371D1", "links": { "Github": "https://github.com/LemoFoundationLtd", "Homepage": "http://www.lemochain.com" @@ -6913,7 +7216,7 @@ "links": { "Homepage": "http://www.lifelabs.io" }, - "marketcap_usd": 11128622, + "marketcap_usd": 12067076, "name": "LIFE", "network": "eth", "shortcut": "LIFE", @@ -7001,7 +7304,7 @@ "Github": "https://github.com/linkercoinfoundation", "Homepage": "https://www.linkercoin.com/en" }, - "marketcap_usd": 0, + "marketcap_usd": 4045247, "name": "Linker Coin", "network": "eth", "shortcut": "LNC-Linker Coin", @@ -7019,7 +7322,7 @@ "Github": "https://github.com/lendingblock", "Homepage": "https://lendingblock.com" }, - "marketcap_usd": 0, + "marketcap_usd": 3214106, "name": "Lendingblock", "network": "eth", "shortcut": "LND", @@ -7036,7 +7339,7 @@ "links": { "Homepage": "https://LockChain.co" }, - "marketcap_usd": 0, + "marketcap_usd": 8593382, "name": "LockChain", "network": "eth", "shortcut": "LOC", @@ -7054,7 +7357,7 @@ "Github": "http://github.com/locipro/loci-coin-sale", "Homepage": "https://locipro.com" }, - "marketcap_usd": 0, + "marketcap_usd": 3584621, "name": "LOCIcoin", "network": "eth", "shortcut": "LOCI", @@ -7100,6 +7403,22 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:LOOK": { + "address": "0x253C7dd074f4BaCb305387F922225A4f737C08bd", + "links": { + "Homepage": "https://lookrev.com" + }, + "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": { @@ -7118,6 +7437,23 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:LOVE": { + "address": "0x5a276Aeb77bCfDAc8Ac6f31BBC7416AE1A85eEF2", + "hidden": 1, + "links": { + "Github": "https://github.com/GNSPS" + }, + "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": { @@ -7209,7 +7545,7 @@ "address": "0xfa05A73FfE78ef8f1a739473e462c54bae6567D9", "links": { "Github": "https://github.com/lunyr", - "Homepage": "https://lunyr.com/" + "Homepage": "https://lunyr.com" }, "marketcap_usd": 0, "name": "LUN", @@ -7261,7 +7597,7 @@ "erc20:eth:MAD": { "address": "0x5B09A0371C1DA44A8E24D36Bf5DEb1141a84d875", "links": { - "Homepage": "https://madnetwork.io/" + "Homepage": "https://madnetwork.io" }, "marketcap_usd": 0, "name": "MAD", @@ -7279,7 +7615,7 @@ "address": "0xe25bCec5D3801cE3a794079BF94adF1B8cCD802D", "links": { "Github": "https://github.com/MatrixAINetwork", - "Homepage": "https://www.matrix.io/" + "Homepage": "https://www.matrix.io" }, "marketcap_usd": 0, "name": "MAN", @@ -7334,7 +7670,7 @@ "Github": "https://github.com/theembermine", "Homepage": "https://embermine.com/" }, - "marketcap_usd": 0, + "marketcap_usd": 408689, "name": "Embers", "network": "eth", "shortcut": "MBRS", @@ -7351,7 +7687,7 @@ "links": { "Homepage": "https://www.mcaplabs.com/" }, - "marketcap_usd": 412103, + "marketcap_usd": 352675, "name": "MCAP", "network": "eth", "shortcut": "MCAP", @@ -7369,7 +7705,7 @@ "Github": "https://github.com/musiconomi/", "Homepage": "https://musiconomi.com/" }, - "marketcap_usd": 0, + "marketcap_usd": 672488, "name": "Musiconomi", "network": "eth", "shortcut": "MCI", @@ -7384,7 +7720,7 @@ "erc20:eth:MCO": { "address": "0xB63B606Ac810a52cCa15e44bB630fd42D8d1d83d", "links": { - "Homepage": "https://mona.co/" + "Homepage": "https://mona.co" }, "marketcap_usd": 0, "name": "MCO", @@ -7469,10 +7805,27 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:MFT": { + "address": "0xDF2C7238198Ad8B389666574f2d8bc411A4b7428", + "links": { + "Github": "https://github.com/MainframeHQ", + "Homepage": "https://mainframe.com" + }, + "name": "Mainframe Token", + "network": "eth", + "shortcut": "MFT", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:MGO": { "address": "0x40395044Ac3c0C57051906dA938B54BD6557F212", "links": { - "Homepage": "https://gamecredits.com/mobilego/" + "Homepage": "https://gamecredits.com/mobilego" }, "marketcap_usd": 0, "name": "MGO", @@ -7575,7 +7928,7 @@ "erc20:eth:MNE": { "address": "0x1a95B271B0535D15fa49932Daba31BA612b52946", "links": { - "Homepage": "https://minereum.com/" + "Homepage": "https://minereum.com" }, "marketcap_usd": 0, "name": "MNE", @@ -7631,7 +7984,7 @@ "Github": "https://github.com/modum-io", "Homepage": "https://modum.io" }, - "marketcap_usd": 0, + "marketcap_usd": 18276794, "name": "Modum", "network": "eth", "shortcut": "MOD", @@ -7700,7 +8053,7 @@ "links": { "Homepage": "https://mothership.cx" }, - "marketcap_usd": 0, + "marketcap_usd": 20596100, "name": "Mothership", "network": "eth", "shortcut": "MSP", @@ -7735,7 +8088,7 @@ "links": { "Homepage": "http://www.monetha.io" }, - "marketcap_usd": 0, + "marketcap_usd": 8560130, "name": "Monetha", "network": "eth", "shortcut": "MTH", @@ -7855,7 +8208,7 @@ "Github": "https://github.com/Merculet", "Homepage": "https://www.merculet.io" }, - "marketcap_usd": 0, + "marketcap_usd": 10808521, "name": "Merculet", "network": "eth", "shortcut": "MVP", @@ -7905,7 +8258,7 @@ "links": { "Homepage": "https://mysterium.network" }, - "marketcap_usd": 0, + "marketcap_usd": 5295629, "name": "Mysterium", "network": "eth", "shortcut": "MYST", @@ -7940,7 +8293,7 @@ "Github": "https://github.com/NANJ-COIN", "Homepage": "https://nanjcoin.com/" }, - "marketcap_usd": 0, + "marketcap_usd": 26021992, "name": "NANJCOIN", "network": "eth", "shortcut": "NANJ", @@ -7994,7 +8347,7 @@ "Github": "https://github.com/polyswarm", "Homepage": "https://polyswarm.io" }, - "marketcap_usd": 0, + "marketcap_usd": 26369273, "name": "Nectar", "network": "eth", "shortcut": "NCT", @@ -8011,7 +8364,7 @@ "links": { "Homepage": "https://neverdie.com" }, - "marketcap_usd": 0, + "marketcap_usd": 761362, "name": "Neverdie", "network": "eth", "shortcut": "NDC", @@ -8062,7 +8415,7 @@ "address": "0xA823E6722006afe99E91c30FF5295052fe6b8E32", "links": { "Github": "https://github.com/neufund", - "Homepage": "https://neufund.org/" + "Homepage": "https://neufund.org" }, "marketcap_usd": 0, "name": "NEU Fund", @@ -8132,7 +8485,9 @@ "erc20:eth:NONE": { "address": "0x643B6870beabee941B9260a0A878bcF4A61Fb0f1", "hidden": 1, - "links": {}, + "links": { + "Github": "https://github.com/walleth/contracts/tree/master/NoneToken" + }, "marketcap_usd": 0, "name": "None", "network": "eth", @@ -8169,7 +8524,7 @@ "Github": "https://github.com/NperProject", "Homepage": "https://nper.io" }, - "marketcap_usd": 3605375, + "marketcap_usd": 4147411, "name": "NPER", "network": "eth", "shortcut": "NPER", @@ -8204,7 +8559,7 @@ "links": { "Homepage": "https://nuls.io" }, - "marketcap_usd": 104203200, + "marketcap_usd": 91802000, "name": "NULS", "network": "eth", "shortcut": "NULS", @@ -8255,7 +8610,7 @@ "links": { "Homepage": "https://beyond-the-void.net" }, - "marketcap_usd": 0, + "marketcap_usd": 5732797, "name": "Nexium", "network": "eth", "shortcut": "NxC", @@ -8289,7 +8644,7 @@ "links": { "Homepage": "https://www.openanx.org/en" }, - "marketcap_usd": 7902573, + "marketcap_usd": 8558190, "name": "OAX", "network": "eth", "shortcut": "OAX", @@ -8320,7 +8675,7 @@ } }, "erc20:eth:OHNI": { - "address": "0x7F2176cEB16dcb648dc924eff617c3dC2BEfd30d", + "address": "0x6f539a9456A5BCb6334A1A41207c3788f5825207", "links": { "Github": "ohnicoin", "Homepage": "http://ohni.us" @@ -8373,11 +8728,28 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:OLT": { + "address": "0x64A60493D888728Cf42616e034a0dfEAe38EFCF0", + "links": { + "Github": "https://github.com/Oneledger", + "Homepage": "https://oneledger.io" + }, + "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", @@ -8391,6 +8763,23 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:OMT": { + "address": "0x047187e53477be70DBe8Ea5B799318f2e165052F", + "links": { + "Github": "https://github.com/OTCMAKER/OMT", + "Homepage": "https://www.otcmaker.com" + }, + "name": "OTCMAKER Token", + "network": "eth", + "shortcut": "OMT", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:ONEK": { "address": "0xB23be73573bC7E03DB6e5dfc62405368716d28a8", "links": { @@ -8467,7 +8856,7 @@ "Github": "https://github.com/OpenSTFoundation", "Homepage": "https://simpletoken.org" }, - "marketcap_usd": 22555656, + "marketcap_usd": 23833953, "name": "Simple Token 'OST'", "network": "eth", "shortcut": "OST", @@ -8479,6 +8868,23 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:OWN": { + "address": "0x170b275CEd089FffAEBFe927F445a350ED9160DC", + "links": { + "Github": "https://github.com/owndata", + "Homepage": "https://owndata.network" + }, + "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": { @@ -8503,7 +8909,7 @@ "Github": "https://github.com/policypalnet", "Homepage": "https://www.policypal.network" }, - "marketcap_usd": 0, + "marketcap_usd": 6698811, "name": "PolicyPal Network", "network": "eth", "shortcut": "PAL", @@ -8589,9 +8995,9 @@ "erc20:eth:PAY": { "address": "0xB97048628DB6B661D4C2aA833e95Dbe1A905B280", "links": { - "Homepage": "http://www.tenx.tech/" + "Homepage": "http://www.tenx.tech" }, - "marketcap_usd": 0, + "marketcap_usd": 112479647, "name": "TenX", "network": "eth", "shortcut": "PAY", @@ -8660,7 +9066,7 @@ "Github": "https://github.com/PeculiumPCL/Peculium", "Homepage": "https://peculium.io" }, - "marketcap_usd": 0, + "marketcap_usd": 3421686, "name": "Peculium", "network": "eth", "shortcut": "PCL", @@ -8780,7 +9186,7 @@ "erc20:eth:PLASMA": { "address": "0x59416A25628A76b4730eC51486114c32E0B582A1", "links": { - "Homepage": "https://plasma.io/" + "Homepage": "https://plasma.io" }, "marketcap_usd": 0, "name": "PLASMA", @@ -8799,7 +9205,7 @@ "links": { "Homepage": "http://www.herocoin.io" }, - "marketcap_usd": 0, + "marketcap_usd": 1954962, "name": "HeroCoin", "network": "eth", "shortcut": "PLAY", @@ -8816,7 +9222,7 @@ "links": { "Homepage": "https://polybius.io" }, - "marketcap_usd": 0, + "marketcap_usd": 11740266, "name": "Polybius", "network": "eth", "shortcut": "PLBT", @@ -8846,6 +9252,23 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:PLS": { + "address": "0xe43ac1714F7394173b15E7CfF31A63d523Ce4fB9", + "links": { + "Github": "https://github.com/bitsuperlab", + "Homepage": "https://dacplay.org" + }, + "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": { @@ -8902,7 +9325,7 @@ "links": { "Homepage": "https://polymath.network" }, - "marketcap_usd": 0, + "marketcap_usd": 109202251, "name": "Polymath Network", "network": "eth", "shortcut": "POLY", @@ -8937,7 +9360,7 @@ "Github": "https://github.com/PoSToken", "Homepage": "https://postoken.org" }, - "marketcap_usd": 0, + "marketcap_usd": 59276, "name": "PoSToken", "network": "eth", "shortcut": "POS", @@ -8971,7 +9394,7 @@ "links": { "Homepage": "https://www.paypie.com" }, - "marketcap_usd": 0, + "marketcap_usd": 19913850, "name": "PayPie", "network": "eth", "shortcut": "PPP", @@ -8988,7 +9411,7 @@ "links": { "Homepage": "https://populous.co" }, - "marketcap_usd": 0, + "marketcap_usd": 246779855, "name": "Populous", "network": "eth", "shortcut": "PPT", @@ -9005,7 +9428,7 @@ "links": { "Homepage": "https://presearch.io" }, - "marketcap_usd": 0, + "marketcap_usd": 19461645, "name": "Presearch", "network": "eth", "shortcut": "PRE", @@ -9058,7 +9481,7 @@ "links": { "Homepage": "https://propy.com" }, - "marketcap_usd": 0, + "marketcap_usd": 12734679, "name": "Propy", "network": "eth", "shortcut": "PRO", @@ -9179,7 +9602,7 @@ "erc20:eth:PTOY": { "address": "0x8Ae4BF2C33a8e667de34B54938B0ccD03Eb8CC06", "links": { - "Homepage": "https://patientory.com/" + "Homepage": "https://patientory.com" }, "marketcap_usd": 0, "name": "PTOY", @@ -9229,6 +9652,23 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:PURC": { + "address": "0xe25ff6Eb959BCE67975778e46A47750C243B6B99", + "links": { + "Github": "https://github.com/seanyc99/PureCarbon-Smart-Contract", + "Homepage": "https://purecarbon.io" + }, + "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": { @@ -9251,7 +9691,7 @@ "links": { "Homepage": "https://liquid.plus" }, - "marketcap_usd": 93920050, + "marketcap_usd": 93416050, "name": "QASH", "network": "eth", "shortcut": "QASH", @@ -9298,6 +9738,23 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:QNT": { + "address": "0x4a220E6096B25EADb88358cb44068A3248254675", + "links": { + "Github": "https://github.com/quantnetwork", + "Homepage": "https://www.quant.network/" + }, + "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": { @@ -9319,7 +9776,7 @@ "address": "0x697beac28B09E122C4332D163985e8a73121b97F", "links": { "Github": "https://github.com/theQRL", - "Homepage": "https://theqrl.org/" + "Homepage": "https://theqrl.org" }, "marketcap_usd": 0, "name": "QRL", @@ -9375,7 +9832,7 @@ "Github": "https://github.com/qtumproject", "Homepage": "https://qtum.org/" }, - "marketcap_usd": 679977040, + "marketcap_usd": 727523386, "name": "Qtum", "network": "eth", "shortcut": "QTUM", @@ -9427,9 +9884,9 @@ "address": "0xF970b8E36e23F7fC3FD752EeA86f8Be8D83375A6", "links": { "Github": "https://github.com/ripio/rcn-token", - "Homepage": "https://ripiocredit.network/" + "Homepage": "https://ripiocredit.network" }, - "marketcap_usd": 0, + "marketcap_usd": 21633782, "name": "Ripio Credit Network", "network": "eth", "shortcut": "RCN", @@ -9498,7 +9955,7 @@ "links": { "Homepage": "https://www.rebellious.io" }, - "marketcap_usd": 5521490, + "marketcap_usd": 5569683, "name": "Rebellious", "network": "eth", "shortcut": "REBL", @@ -9516,7 +9973,7 @@ "Github": "https://github.com/red", "Homepage": "https://ico.red-lang.org" }, - "marketcap_usd": 5221892, + "marketcap_usd": 5504109, "name": "Red Community Token", "network": "eth", "shortcut": "RED", @@ -9547,11 +10004,11 @@ } }, "erc20:eth:REP": { - "address": "0xE94327D07Fc17907b4DB788E5aDf2ed424adDff6", + "address": "0x1985365e9f78359a9B6AD760e32412f4a445E862", "links": { "Homepage": "https://augur.net" }, - "marketcap_usd": 0, + "marketcap_usd": 326795700, "name": "Augur", "network": "eth", "shortcut": "REP", @@ -9568,7 +10025,7 @@ "links": { "Homepage": "https://request.network" }, - "marketcap_usd": 0, + "marketcap_usd": 52258532, "name": "Request Network", "network": "eth", "shortcut": "REQ", @@ -9584,7 +10041,7 @@ "address": "0xf05a9382A4C3F29E2784502754293D88b835109C", "links": { "Github": "https://github.com/rexmls/RexToken", - "Homepage": "https://imbrex.io/" + "Homepage": "https://imbrex.io" }, "marketcap_usd": 0, "name": "REX", @@ -9603,7 +10060,7 @@ "links": { "Homepage": "https://refereum.com" }, - "marketcap_usd": 0, + "marketcap_usd": 8663797, "name": "Refereum", "network": "eth", "shortcut": "RFR", @@ -9615,6 +10072,22 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:RING": { + "address": "0x86E56f3c89a14528858e58B3De48c074538BAf2c", + "links": { + "Homepage": "https://www.evolution.land/" + }, + "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": { @@ -9638,7 +10111,7 @@ "links": { "Homepage": "http://crowdsale.iex.ec" }, - "marketcap_usd": 55162771, + "marketcap_usd": 62044616, "name": "IEx.ec", "network": "eth", "shortcut": "RLC", @@ -9654,7 +10127,7 @@ "address": "0xcCeD5B8288086BE8c38E23567e684C3740be4D48", "links": { "Github": "https://github.com/Smartroulette", - "Homepage": "https://smartplay.tech/" + "Homepage": "https://smartplay.tech" }, "marketcap_usd": 0, "name": "RLT", @@ -9725,7 +10198,7 @@ "Github": "https://github.com/rocketico", "Homepage": "https://rocketico.io" }, - "marketcap_usd": 26204145, + "marketcap_usd": 28384640, "name": "Rocket Token", "network": "eth", "shortcut": "ROCK", @@ -9828,7 +10301,7 @@ "links": { "Homepage": "https://rivetzintl.com" }, - "marketcap_usd": 0, + "marketcap_usd": 6306808, "name": "Rivetz", "network": "eth", "shortcut": "RVT", @@ -9879,7 +10352,7 @@ "links": { "Homepage": "https://saltlending.com" }, - "marketcap_usd": 66071552, + "marketcap_usd": 78529601, "name": "Salt Lending Token", "network": "eth", "shortcut": "SALT", @@ -9896,7 +10369,7 @@ "links": { "Homepage": "https://santiment.net" }, - "marketcap_usd": 0, + "marketcap_usd": 65615434, "name": "Santiment", "network": "eth", "shortcut": "SAN", @@ -9947,7 +10420,7 @@ "links": { "Homepage": "https://sensay.it" }, - "marketcap_usd": 1984182, + "marketcap_usd": 3573944, "name": "Sensay", "network": "eth", "shortcut": "SENSE", @@ -10012,7 +10485,7 @@ } }, "erc20:eth:SGT": { - "address": "0x37427576324fE1f3625c9102674772d7CF71377d", + "address": "0xd248B0D48E44aaF9c49aea0312be7E13a6dc1468", "links": { "Homepage": "https://sgt.selfieyo.com" }, @@ -10031,7 +10504,7 @@ "erc20:eth:SHIT": { "address": "0xEF2E9966eb61BB494E5375d5Df8d67B7dB8A780D", "links": { - "Homepage": "https://www.shitcoin.io/" + "Homepage": "https://www.shitcoin.io" }, "marketcap_usd": 0, "name": "SHIT", @@ -10084,7 +10557,7 @@ "address": "0x2bDC0D42996017fCe214b21607a515DA41A9E0C5", "links": { "Github": "https://github.com/Steamtradenet/smart-contract", - "Homepage": "https://skincoin.org/" + "Homepage": "https://skincoin.org" }, "marketcap_usd": 0, "name": "SKIN", @@ -10155,7 +10628,7 @@ "links": { "Homepage": "http://smartlands.io" }, - "marketcap_usd": 0, + "marketcap_usd": 11415141, "name": "Smartlands", "network": "eth", "shortcut": "SLT", @@ -10167,6 +10640,23 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:SLY": { + "address": "0x7928c8aBF1F74eF9F96D4D0a44e3b4209d360785", + "links": { + "Github": "https://github.com/SELFLLERY", + "Homepage": "https://selfllery.com/" + }, + "name": "Selfllery", + "network": "eth", + "shortcut": "SLY", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:SMART": { "address": "0x6F6DEb5db0C4994A8283A01D6CFeEB27Fc3bBe9C", "links": { @@ -10191,7 +10681,7 @@ "Github": "https://github.com/SmartMeshFoundation", "Homepage": "http://smartnode.org" }, - "marketcap_usd": 0, + "marketcap_usd": 51274091, "name": "SmartMesh", "network": "eth", "shortcut": "SMT", @@ -10260,7 +10750,7 @@ "links": { "Homepage": "https://singulardtv.com" }, - "marketcap_usd": 0, + "marketcap_usd": 22837140, "name": "SingularDTV", "network": "eth", "shortcut": "SNGLS", @@ -10293,7 +10783,7 @@ "address": "0x983F6d60db79ea8cA4eB9968C6aFf8cfA04B3c63", "links": { "Github": "https://github.com/sonm-io", - "Homepage": "https://sonm.com/" + "Homepage": "https://sonm.com" }, "marketcap_usd": 0, "name": "SNM", @@ -10363,7 +10853,7 @@ "links": { "Homepage": "https://spankchain.com" }, - "marketcap_usd": 0, + "marketcap_usd": 21826866, "name": "SpankChain", "network": "eth", "shortcut": "SPANK", @@ -10467,7 +10957,7 @@ "Github": "https://github.com/Sharders", "Homepage": "https://sharder.org" }, - "marketcap_usd": 0, + "marketcap_usd": 6190295, "name": "Sharder", "network": "eth", "shortcut": "SS", @@ -10482,7 +10972,7 @@ "erc20:eth:SSH": { "address": "0x6e2050CBFB3eD8A4d39b64cC9f47E711a03a5a89", "links": { - "Homepage": "https://www.stream.space/" + "Homepage": "https://www.stream.space" }, "marketcap_usd": 0, "name": "StreamShares", @@ -10496,6 +10986,22 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:STABIT": { + "address": "0x4A89cD486fA996ad50c0a63C35c78702f5422a50", + "links": { + "Homepage": "https://stabitcoin.com/" + }, + "name": "StabitCoin", + "network": "eth", + "shortcut": "STABIT", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:STAC": { "address": "0x9a005c9a89BD72a4Bd27721E7a09A3c11D2b03C4", "links": { @@ -10553,7 +11059,7 @@ "links": { "Homepage": "https://stktoken.com" }, - "marketcap_usd": 9640419, + "marketcap_usd": 9916006, "name": "STK Token", "network": "eth", "shortcut": "STK", @@ -10585,10 +11091,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": 57693817, + "marketcap_usd": 65827490, "name": "STORJ", "network": "eth", "shortcut": "STORJ", @@ -10605,7 +11111,7 @@ "links": { "Homepage": "https://www.stormtoken.com" }, - "marketcap_usd": 71653140, + "marketcap_usd": 81414359, "name": "Storm Token", "network": "eth", "shortcut": "STORM", @@ -10641,7 +11147,7 @@ "Github": "https://github.com/Storiqa/", "Homepage": "https://storiqa.com" }, - "marketcap_usd": 0, + "marketcap_usd": 35245408, "name": "Storiqa", "network": "eth", "shortcut": "STQ", @@ -10657,7 +11163,7 @@ "address": "0x46492473755e8dF960F8034877F61732D718CE96", "links": { "Github": "https://github.com/sprux/BackToEarth", - "Homepage": "https://backto.earth/" + "Homepage": "https://backto.earth" }, "marketcap_usd": 0, "name": "STRC", @@ -10694,7 +11200,7 @@ "links": { "Homepage": "https://substratum.net" }, - "marketcap_usd": 0, + "marketcap_usd": 97397261, "name": "Substratum", "network": "eth", "shortcut": "SUB", @@ -10886,7 +11392,7 @@ "Github": "https://github.com/telcoin", "Homepage": "https://www.telco.in" }, - "marketcap_usd": 0, + "marketcap_usd": 33094830, "name": "Telcoin", "network": "eth", "shortcut": "TEL", @@ -10904,7 +11410,7 @@ "Github": "https://github.com/TrueFlip", "Homepage": "https://trueflip.io" }, - "marketcap_usd": 0, + "marketcap_usd": 4312239, "name": "TrueFlip", "network": "eth", "shortcut": "TFL", @@ -10921,7 +11427,7 @@ "links": { "Homepage": "https://www.thetatoken.org/" }, - "marketcap_usd": 0, + "marketcap_usd": 89963068, "name": "Theta Token", "network": "eth", "shortcut": "THETA", @@ -10937,7 +11443,7 @@ "address": "0xfe7B915A0bAA0E79f85c5553266513F7C1c03Ed0", "links": { "Github": "https://github.com/THUGCOIN/THUGCoin", - "Homepage": "https://thugcoin.cash/" + "Homepage": "https://thugcoin.cash" }, "marketcap_usd": 0, "name": "THUG", @@ -10956,7 +11462,7 @@ "links": { "Homepage": "https://chronobank.io" }, - "marketcap_usd": 0, + "marketcap_usd": 7932457, "name": "Chronobank", "network": "eth", "shortcut": "TIME", @@ -10990,7 +11496,7 @@ "links": { "Homepage": "https://www.blocktix.io" }, - "marketcap_usd": 0, + "marketcap_usd": 10873640, "name": "Blocktix", "network": "eth", "shortcut": "TIX", @@ -11007,7 +11513,7 @@ "links": { "Homepage": "https://etherscan.io/token/TokenCard" }, - "marketcap_usd": 0, + "marketcap_usd": 21155308, "name": "TokenCard", "network": "eth", "shortcut": "TKN", @@ -11037,6 +11543,23 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:TOOR": { + "address": "0x8eb965ee9cCFBCE76c0a06264492c0afEfc2826d", + "links": { + "Github": "https://github.com/toorister/toorcoin", + "Homepage": "https://www.toorcoin.com" + }, + "name": "ToorCoin", + "network": "eth", + "shortcut": "TOOR", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:TRC": { "address": "0xcB3F902bf97626391bF8bA87264bbC3DC13469be", "hidden": 1, @@ -11144,7 +11667,7 @@ "links": { "Homepage": "https://taas.fund" }, - "marketcap_usd": 14723245, + "marketcap_usd": 15088511, "name": "Token-as-a-Service", "network": "eth", "shortcut": "TaaS", @@ -11197,7 +11720,7 @@ "links": { "Homepage": "https://uquidcoin.com" }, - "marketcap_usd": 0, + "marketcap_usd": 8930390, "name": "Uquid Coin", "network": "eth", "shortcut": "UQC", @@ -11265,7 +11788,7 @@ "Github": "https://github.com/UniversaBlockchain/universa", "Homepage": "https://www.universa.io/" }, - "marketcap_usd": 0, + "marketcap_usd": 21558807, "name": "Universa", "network": "eth", "shortcut": "UTN-P", @@ -11310,6 +11833,23 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:VDG": { + "address": "0x57C75ECCc8557136D32619a191fBCDc88560d711", + "links": { + "Github": "https://github.com/VeriDocGlobal", + "Homepage": "https://www.veridocglobal.com/" + }, + "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": { @@ -11334,7 +11874,7 @@ "Github": "https://github.com/blockv", "Homepage": "https://blockv.io" }, - "marketcap_usd": 0, + "marketcap_usd": 38615763, "name": "BLOCKv", "network": "eth", "shortcut": "VEE", @@ -11386,7 +11926,7 @@ "Github": "https://github.com/vechain-team", "Homepage": "https://tokensale.vechain.com/en" }, - "marketcap_usd": 0, + "marketcap_usd": 904502518, "name": "Vechain", "network": "eth", "shortcut": "VET", @@ -11416,10 +11956,10 @@ } }, "erc20:eth:VIBEX": { - "address": "0x882448f83d90B2bf477Af2eA79327fDEA1335D93", + "address": "0xe8Ff5C9c75dEb346acAc493C463C8950Be03Dfba", "links": { "Github": "https://github.com/amack2u/VibeHub", - "Homepage": "https://vibehub.io/ico/" + "Homepage": "http://vibehub.io" }, "marketcap_usd": 0, "name": "VIBEX", @@ -11456,7 +11996,7 @@ "Github": "https://github.com/ViceIndustryToken", "Homepage": "https://vicetoken.com/" }, - "marketcap_usd": 0, + "marketcap_usd": 1572575, "name": "Vice Industry Token", "network": "eth", "shortcut": "VIT", @@ -11489,8 +12029,8 @@ "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", @@ -11544,7 +12084,7 @@ "links": { "Homepage": "https://veros.org" }, - "marketcap_usd": 0, + "marketcap_usd": 368631, "name": "Veros", "network": "eth", "shortcut": "VRS", @@ -11579,7 +12119,7 @@ "Github": "https://github.com/waxio", "Homepage": "https://wax.io" }, - "marketcap_usd": 104521623, + "marketcap_usd": 120008204, "name": "WAX", "network": "eth", "shortcut": "WAX", @@ -11631,7 +12171,7 @@ "links": { "Homepage": "https://wepower.network" }, - "marketcap_usd": 0, + "marketcap_usd": 20502348, "name": "WePower", "network": "eth", "shortcut": "WCT", @@ -11737,7 +12277,7 @@ "links": { "Homepage": "https://wings.ai" }, - "marketcap_usd": 17660790, + "marketcap_usd": 20746667, "name": "WINGS", "network": "eth", "shortcut": "WINGS", @@ -11893,7 +12433,7 @@ "links": { "Homepage": "https://www.wacoin.io" }, - "marketcap_usd": 15736632, + "marketcap_usd": 16417389, "name": "WaBi", "network": "eth", "shortcut": "WaBi", @@ -11944,7 +12484,7 @@ "links": { "Homepage": "http://www.xaurum.org" }, - "marketcap_usd": 0, + "marketcap_usd": 4841766, "name": "Xaurum", "network": "eth", "shortcut": "XAUR", @@ -11962,7 +12502,7 @@ "Github": "https://github.com/blitzpredict", "Homepage": "https://www.blitzpredict.io" }, - "marketcap_usd": 0, + "marketcap_usd": 1336047, "name": "BlitzPredict", "network": "eth", "shortcut": "XBP", @@ -12065,7 +12605,7 @@ "erc20:eth:XID": { "address": "0xB110eC7B1dcb8FAB8dEDbf28f53Bc63eA5BEdd84", "links": { - "Homepage": "https://sphereidentity.com/" + "Homepage": "https://sphereidentity.com" }, "marketcap_usd": 0, "name": "XID", @@ -12085,7 +12625,7 @@ "Github": "https://github.com/InkProtocol/", "Homepage": "https://paywithink.com" }, - "marketcap_usd": 0, + "marketcap_usd": 2700360, "name": "Ink Protocol", "network": "eth", "shortcut": "XNK", @@ -12102,7 +12642,7 @@ "links": { "Homepage": "https://xenon.network" }, - "marketcap_usd": 0, + "marketcap_usd": 1301571, "name": "XENON", "network": "eth", "shortcut": "XNN", @@ -12134,7 +12674,7 @@ "erc20:eth:XRL": { "address": "0xB24754bE79281553dc1adC160ddF5Cd9b74361a4", "links": { - "Homepage": "https://rialto.ai/" + "Homepage": "https://rialto.ai" }, "marketcap_usd": 0, "name": "XRL", @@ -12182,12 +12722,29 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:YUP": { + "address": "0xD9A12Cde03a86E800496469858De8581D3A5353d", + "links": { + "Github": "https://github.com/crowdholding/", + "Homepage": "https://www.crowdholding.com" + }, + "name": "YUP", + "network": "eth", + "shortcut": "YUP", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "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", @@ -12207,7 +12764,7 @@ "Github": "https://github.com/zapproject", "Homepage": "https://zap.store" }, - "marketcap_usd": 4519234, + "marketcap_usd": 6056076, "name": "ZAP", "network": "eth", "shortcut": "ZAP", @@ -12224,7 +12781,7 @@ "links": { "Homepage": "https://zsc.io/" }, - "marketcap_usd": 0, + "marketcap_usd": 11213075, "name": "Zeusshield", "network": "eth", "shortcut": "ZCS", @@ -12242,7 +12799,7 @@ "Github": "https://github.com/zilliqa", "Homepage": "https://www.zilliqa.com/" }, - "marketcap_usd": 0, + "marketcap_usd": 562108751, "name": "Zilliqa", "network": "eth", "shortcut": "ZIL", @@ -12275,7 +12832,7 @@ "address": "0xE41d2489571d322189246DaFA5ebDe1F4699F498", "links": { "Github": "https://github.com/0xProject", - "Homepage": "https://0xproject.com/" + "Homepage": "https://0xproject.com" }, "marketcap_usd": 0, "name": "0x Project", @@ -12312,7 +12869,7 @@ "Github": "https://github.com/carVertical", "Homepage": "https://www.carvertical.com" }, - "marketcap_usd": 0, + "marketcap_usd": 8542995, "name": "carVertical", "network": "eth", "shortcut": "cV", @@ -12400,7 +12957,7 @@ "Github": "https://github.com/eosdac", "Homepage": "https://eosdac.io/" }, - "marketcap_usd": 34490099, + "marketcap_usd": 34547518, "name": "eosDAC", "network": "eth", "shortcut": "eosDAC", @@ -12468,7 +13025,7 @@ "address": "0x8667559254241ddeD4d11392f868d72092765367", "hidden": 1, "links": {}, - "marketcap_usd": 395004653, + "marketcap_usd": 434471331, "name": "Aeternity", "network": "kov", "shortcut": "Aeternity", @@ -12499,6 +13056,7 @@ "erc20:rin:AETH": { "address": "0x398A7A69f3c59181A1ffe34bed11DCb5DF863A8a", "links": { + "Github": "https://github.com/akashaProject", "Homepage": "http://akasha.world" }, "marketcap_usd": 0, @@ -12516,6 +13074,7 @@ "erc20:rin:BHNT": { "address": "0xe27826eE778B6F78a49a686dA7D64f6E7b084a4f", "links": { + "Github": "https://github.com/berlin-hack-and-tell", "Homepage": "http://berlin.hackandtell.org" }, "marketcap_usd": 0, @@ -12567,7 +13126,9 @@ "erc20:rin:NONE": { "address": "0x6475A7FA6Ed2D5180F0e0a07c2d951D12C0EDB91", "hidden": 1, - "links": {}, + "links": { + "Github": "https://github.com/walleth/contracts/tree/master/NoneToken" + }, "marketcap_usd": 0, "name": "None", "network": "rin", @@ -12583,7 +13144,9 @@ "erc20:rin:PPD": { "address": "0x12fE174C097F6B3e876B3b060C9061F4B9dEBB80", "hidden": 1, - "links": {}, + "links": { + "Github": "https://github.com/cchen408" + }, "marketcap_usd": 0, "name": "PP Donation", "network": "rin", @@ -12596,9 +13159,27 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:rin:RDN": { + "address": "0x3615757011112560521536258c1E7325Ae3b48AE", + "links": { + "Homepage": "https://github.com/gnosis/dx-examples-liquidity-bots" + }, + "marketcap_usd": 0, + "name": "Raiden", + "network": "rin", + "shortcut": "RDN", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:rin:WALL": { "address": "0x0A057a87CE9C56D7e336B417c79cf30E8d27860B", "links": { + "Github": "https://github.com/walleth", "Homepage": "https://walleth.org" }, "marketcap_usd": 0, @@ -12632,7 +13213,9 @@ "erc20:rop:NONE": { "address": "0xFD5a69A1309595FF5121553F52C8A5B2B1B31031", "hidden": 1, - "links": {}, + "links": { + "Github": "https://github.com/walleth/contracts/tree/master/NoneToken" + }, "marketcap_usd": 0, "name": "None", "network": "rop", @@ -12664,7 +13247,7 @@ "erc20:ubq:CEFS": { "address": "0x08533D6A06CE365298b12Ef92eb407cBA8Aa8273", "links": { - "Homepage": "https://www.cryptopiashares.com/" + "Homepage": "https://www.cryptopiashares.com" }, "marketcap_usd": 0, "name": "CEFS", @@ -12697,9 +13280,9 @@ "erc20:ubq:QWARK": { "address": "0x4b4899a10F3E507DB207b0ee2426029eFa168a67", "links": { - "Homepage": "https://www.qwark.io/" + "Homepage": "https://www.qwark.io" }, - "marketcap_usd": 2077885, + "marketcap_usd": 2520144, "name": "QWARK", "network": "ubq", "shortcut": "QWARK", @@ -12746,7 +13329,7 @@ "links": { "Homepage": "https://www.dimcoin.io" }, - "marketcap_usd": 8450427, + "marketcap_usd": 9312088, "name": "DIMCOIN", "shortcut": "DIM", "t1_enabled": "yes", @@ -12761,7 +13344,7 @@ "links": { "Homepage": "https://www.dimcoin.io" }, - "marketcap_usd": 8450427, + "marketcap_usd": 9312088, "name": "DIM TOKEN", "shortcut": "DIMTOK", "t1_enabled": "yes", @@ -12803,7 +13386,7 @@ "links": { "Homepage": "https://nem.io" }, - "marketcap_usd": 1448937000, + "marketcap_usd": 1572948000, "name": "NEM", "shortcut": "XEM", "t1_enabled": "yes", @@ -12815,11 +13398,11 @@ } }, "info": { - "marketcap_usd": 185677428942, - "t1_coins": 689, - "t2_coins": 688, - "total_marketcap_usd": 250022314394, - "updated_at": 1531492227, - "updated_at_readable": "Fri Jul 13 16:30:27 2018" + "marketcap_usd": 219948273618, + "t1_coins": 690, + "t2_coins": 689, + "total_marketcap_usd": 283970152150, + "updated_at": 1532098768, + "updated_at_readable": "Fri Jul 20 16:59:28 2018" } } \ No newline at end of file diff --git a/defs/ethereum/tokens b/defs/ethereum/tokens index 0b7f34d48..56d9c3c93 160000 --- a/defs/ethereum/tokens +++ b/defs/ethereum/tokens @@ -1 +1 @@ -Subproject commit 0b7f34d48de1376f39e10adbeb5a0191cdffd73c +Subproject commit 56d9c3c9324e30d7f53eda7b8dc3cae76a4da143 diff --git a/tools/coins_details.py b/tools/coins_details.py index 3abff66eb..5438f3823 100755 --- a/tools/coins_details.py +++ b/tools/coins_details.py @@ -53,11 +53,13 @@ def coinmarketcap_info(shortcut): return coin -def update_marketcap(obj, shortcut): - try: - obj['marketcap_usd'] = int(float(coinmarketcap_info(shortcut)['quotes']['USD']['market_cap'])) - except: - pass +def update_marketcap(obj, *shortcuts): + for sym in shortcuts: + try: + obj['marketcap_usd'] = int(float(coinmarketcap_info(sym)['quotes']['USD']['market_cap'])) + return + except: + pass # print("Marketcap info not found for", shortcut) @@ -133,6 +135,7 @@ def update_coins(details): set_default(out, 'links', {}) set_default(out['links'], 'Homepage', coin['website']) set_default(out['links'], 'Github', coin['github']) + set_default(out, 'wallet', {}) update_marketcap(out, coin.get('coinmarketcap_alias', coin['coin_label'])) check_unsupported(details, 'coin:', supported) @@ -181,12 +184,12 @@ def update_erc20(details): out['wallet']['MyCrypto'] = 'https://mycrypto.com' out['wallet']['MyEtherWallet'] = 'https://www.myetherwallet.com' - if t['website']: + if t.get('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'])) + update_marketcap(out, out.get('coinmarketcap_alias'), t['name'], t['symbol']) check_unsupported(details, 'erc20:', supported) From 2a234c1b0014cbdf2496997caf40c35427ccd60a Mon Sep 17 00:00:00 2001 From: matejcik Date: Fri, 20 Jul 2018 16:39:41 +0200 Subject: [PATCH 02/50] defs: change format of support.json --- defs/support.json | 343 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 243 insertions(+), 100 deletions(-) diff --git a/defs/support.json b/defs/support.json index f91962118..63d5dd5fb 100644 --- a/defs/support.json +++ b/defs/support.json @@ -1,102 +1,245 @@ { - "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", - "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", - "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, - "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" - } + "btc:BCH": { + "trezor1": "1.6.2", + "trezor2": "2.0.7", + "connect": true, + "webwallet": true, + "other": { + "Electron Cash": "https://electroncash.org" + } + }, + "btc:BTC": { + "trezor1": "1.5.2", + "trezor2": "2.0.5", + "connect": true, + "webwallet": true, + "other": { + "Electrum": "https://electrum.org" + } + }, + "btc:BTCP": { + "trezor1": "1.6.2", + "trezor2": "2.0.7", + "connect": null, + "webwallet": true, + "other": { + "BTCP Electrum": "https://github.com/BTCPrivate/electrum-btcp" + } + }, + "btc:BTG": { + "trezor1": "1.6.2", + "trezor2": "2.0.7", + "connect": true, + "webwallet": true, + "other": { + "ElectrumG": "https://github.com/BTCGPU/electrum" + } + }, + "btc:DASH": { + "trezor1": "1.5.2", + "trezor2": "2.0.5", + "connect": true, + "webwallet": true, + "other": { + "Dash Electrum": "https://electrum.dash.org" + } + }, + "btc:DCR": { + "connect": null, + "electrum": null, + "trezor1": "1.6.2", + "trezor2": null, + "webwallet": true + }, + "btc:DGB": { + "connect": null, + "electrum": null, + "trezor1": "1.6.0", + "trezor2": "2.0.5", + "webwallet": true + }, + "btc:DOGE": { + "connect": null, + "electrum": null, + "trezor1": "1.5.2", + "trezor2": "2.0.5", + "webwallet": true + }, + "btc:FJC": { + "trezor1": "1.6.1", + "trezor2": "2.0.5", + "connect": null, + "webwallet": true, + "other": { + "Electrum-FJC": "http://www.fujicoin.org/downloads.php" + } + }, + "btc:GRS": { + "trezor1": "1.6.2", + "trezor2": "2.0.8", + "connect": null, + "webwallet": true, + "other": { + "Electrum-GRS": "https://www.groestlcoin.org/groestlcoin-electrum-wallet/" + } + }, + "btc:LTC": { + "trezor1": "1.5.2", + "trezor2": "2.0.5", + "connect": true, + "webwallet": true, + "other": { + "Electrum-LTC": "https://electrum-ltc.org" + } + }, + "btc:MONA": { + "trezor1": "1.6.0", + "trezor2": "2.0.5", + "connect": null, + "webwallet": true, + "other": { + "Electrum-MONA": "https://electrum-mona.org" + } + }, + "btc:NMC": { + "trezor1": "1.5.2", + "trezor2": "2.0.5", + "connect": null, + "webwallet": null, + "other": { + "Electrum-NMC": "https://github.com/namecoin/electrum-nmc" + } + }, + "btc:TAZ": { + "connect": null, + "electrum": null, + "trezor1": "1.6.2", + "trezor2": "2.0.7", + "webwallet": true + }, + "btc:TBCH": { + "connect": null, + "electrum": null, + "trezor1": "1.6.2", + "trezor2": "2.0.7", + "webwallet": null + }, + "btc:TDCR": { + "connect": null, + "electrum": null, + "trezor1": "1.6.2", + "trezor2": null, + "webwallet": true + }, + "btc:TEST": { + "connect": true, + "electrum": null, + "trezor1": "1.5.2", + "trezor2": "2.0.5", + "webwallet": true + }, + "btc:TLTC": { + "connect": null, + "electrum": null, + "trezor1": "1.6.2", + "trezor2": "2.0.7", + "webwallet": true + }, + "btc:VIA": { + "trezor1": "1.6.2", + "trezor2": "2.0.7", + "connect": null, + "webwallet": true, + "other": { + "Vialectrum": "https://vialectrum.org" + } + }, + "btc:VTC": { + "connect": null, + "electrum": null, + "trezor1": "1.6.1", + "trezor2": "2.0.5", + "webwallet": true + }, + "btc:XZC": { + "trezor1": "1.6.2", + "trezor2": "2.0.7", + "connect": null, + "webwallet": true, + "other": { + "Electrum-XZC": "https://github.com/zcoinofficial/electrum-xzc", + "Znode Tool": "https://github.com/yura-pakhuchiy/znode-tool" + } + }, + "btc:ZEC": { + "connect": true, + "electrum": null, + "trezor1": "1.6.2", + "trezor2": "2.0.7", + "webwallet": true + }, + "btc:ZEN": { + "connect": null, + "electrum": null, + "trezor1": null, + "trezor2": "2.0.8", + "webwallet": null + }, + "btc:tDASH": { + "connect": null, + "electrum": null, + "trezor1": "1.6.2", + "trezor2": null, + "webwallet": null + }, + "btc:tGRS": { + "connect": null, + "electrum": null, + "trezor1": "1.6.2", + "trezor2": "2.0.8", + "webwallet": true + }, + "btc:tXZC": { + "connect": null, + "electrum": null, + "trezor1": "1.6.2", + "trezor2": "2.0.7", + "webwallet": null + }, + "network:LSK": { + "trezor1": null, + "trezor2": "2.0.7", + "connect": null, + "webwallet": null + }, + "network:XLM": { + "trezor1": "soon", + "trezor2": "soon", + "connect": null, + "webwallet": null + }, + "network:XTZ": { + "trezor1": null, + "trezor2": "soon", + "connect": null, + "webwallet": null + }, + "network:ADA": { + "trezor1": null, + "trezor2": "soon", + "connect": null, + "webwallet": null + }, + "network:XMR": { + "trezor1": null, + "trezor2": "soon", + "connect": null, + "webwallet": null + }, + "network:XRP": { + "trezor1": null, + "trezor2": "soon", + "connect": null, + "webwallet": null + } } From cebeb81e8c944bea23f64dc7f9b2b5dd30e890a4 Mon Sep 17 00:00:00 2001 From: matejcik Date: Fri, 20 Jul 2018 16:40:20 +0200 Subject: [PATCH 03/50] defs: update and tweak json data, add others.json for Lisk, Stellar etc --- defs/coins_details.override.json | 8 +++++ defs/ethereum/networks.json | 2 +- defs/nem/nem_mosaics.json | 62 +++++++++++++++++++++++++------- defs/others.json | 47 ++++++++++++++++++++++++ 4 files changed, 105 insertions(+), 14 deletions(-) create mode 100644 defs/coins_details.override.json create mode 100644 defs/others.json diff --git a/defs/coins_details.override.json b/defs/coins_details.override.json new file mode 100644 index 000000000..5f0af0da6 --- /dev/null +++ b/defs/coins_details.override.json @@ -0,0 +1,8 @@ +{ + "mosaic:DIMTOK": { + "coinmarketcap_alias": "dimcoin" + }, + "erc20:eth:GNT": { + "coinmarketcap_alias": "golem-network-tokens" + } +} diff --git a/defs/ethereum/networks.json b/defs/ethereum/networks.json index 39be85bf1..396b7a881 100644 --- a/defs/ethereum/networks.json +++ b/defs/ethereum/networks.json @@ -35,7 +35,7 @@ "chain_id": 8, "slip44": 108, "shortcut": "UBQ", - "name": "UBIQ", + "name": "Ubiq", "rskip60": false, "url": "https://ubiqsmart.com" }, 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/others.json b/defs/others.json new file mode 100644 index 000000000..80cd13f0a --- /dev/null +++ b/defs/others.json @@ -0,0 +1,47 @@ +[ + { + "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" + } + } +] From 288445cecc9e18115aa0e46cb6debfb6f8a13c76 Mon Sep 17 00:00:00 2001 From: matejcik Date: Fri, 20 Jul 2018 16:49:45 +0200 Subject: [PATCH 04/50] tools: unified retrieval of coin data, regenerated coins_details --- defs/coins_details.json | 825 +++++++--------------------------------- tools/coin_defs.py | 404 ++++++++++++++++++++ tools/coins_details.py | 513 ++++++++++++------------- 3 files changed, 786 insertions(+), 956 deletions(-) create mode 100755 tools/coin_defs.py diff --git a/defs/coins_details.json b/defs/coins_details.json index 763c049e9..5d2abd7ea 100644 --- a/defs/coins_details.json +++ b/defs/coins_details.json @@ -11,6 +11,21 @@ "t2_enabled": "soon", "type": "coin" }, + "coin2: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" + } + }, "coin2:EGEM": { "links": { "Homepage": "https://egem.io" @@ -56,6 +71,21 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "coin2:ESN": { + "links": { + "Homepage": "https://ethersocial.org" + }, + "marketcap_usd": 0, + "name": "Ethersocial Network", + "shortcut": "ESN", + "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" @@ -91,7 +121,7 @@ "Homepage": "https://ethereumsocial.kr" }, "marketcap_usd": 0, - "name": "EthereumSocial", + "name": "Ethereum Social", "shortcut": "ETSC", "t1_enabled": "yes", "t2_enabled": "yes", @@ -103,7 +133,7 @@ }, "coin2:EXP": { "links": { - "Homepage": "https://www.expanse.tech" + "Homepage": "https://expanse.tech" }, "marketcap_usd": 10593934, "name": "Expanse", @@ -116,11 +146,26 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "coin2:GO": { + "links": { + "Homepage": "https://gochain.io" + }, + "marketcap_usd": 37459560, + "name": "GoChain", + "shortcut": "GO", + "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, + "marketcap_usd": 548473107, "name": "Lisk", "shortcut": "LSK", "t1_enabled": "no", @@ -161,18 +206,19 @@ "links": { "Homepage": "https://www.stellar.org" }, - "marketcap_usd": 5331912521, + "marketcap_usd": 5315301581, "name": "Stellar", "notes": "In development", "shortcut": "XLM", "t1_enabled": "soon", - "t2_enabled": "soon" + "t2_enabled": "soon", + "type": "coin" }, "coin2:XMR": { "links": { "Homepage": "https://getmonero.org" }, - "marketcap_usd": 2831629582, + "marketcap_usd": 2215103721, "name": "Monero", "notes": "In development", "shortcut": "XMR", @@ -184,7 +230,7 @@ "links": { "Homepage": "https://ripple.com" }, - "marketcap_usd": 24313181966, + "marketcap_usd": 18016097427, "name": "Ripple", "notes": "In development", "shortcut": "XRP", @@ -203,10 +249,58 @@ "t2_enabled": "soon", "type": "coin" }, + "coin2: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" + } + }, + "coin2:tETH": { + "hidden": 1, + "links": { + "Homepage": "https://www.ethereum.org" + }, + "marketcap_usd": 0, + "name": "Ethereum Testnet Kovan", + "shortcut": "tETH", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "coin", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "coin2: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" + } + }, "coin:BCH": { "links": { "Github": "https://github.com/Bitcoin-ABC/bitcoin-abc", - "Homepage": "https://www.bitcoincash.org/" + "Homepage": "https://www.bitcoincash.org" }, "marketcap_usd": 13729622285, "name": "Bitcoin Cash", @@ -246,7 +340,9 @@ "t1_enabled": "yes", "t2_enabled": "yes", "type": "coin", - "wallet": {} + "wallet": { + "BTCP Electrum": "https://github.com/BTCPrivate/electrum-btcp" + } }, "coin:BTG": { "links": { @@ -260,6 +356,7 @@ "t2_enabled": "yes", "type": "coin", "wallet": { + "ElectrumG": "https://github.com/BTCGPU/electrum", "Trezor": "https://wallet.trezor.io" } }, @@ -301,6 +398,7 @@ "t2_enabled": "yes", "type": "coin", "wallet": { + "Dash Electrum": "https://electrum.dash.org", "Trezor": "https://wallet.trezor.io" } }, @@ -320,7 +418,7 @@ "coin:DGB": { "links": { "Github": "https://github.com/digibyte/digibyte", - "Homepage": "https://www.digibyte.co" + "Homepage": "https://digibyte.io" }, "marketcap_usd": 472432594, "name": "DigiByte", @@ -345,7 +443,7 @@ "coin:DOGE": { "links": { "Github": "https://github.com/dogecoin/dogecoin", - "Homepage": "https://dogecoin.com" + "Homepage": "http://dogecoin.com" }, "marketcap_usd": 416955600, "name": "Dogecoin", @@ -360,7 +458,7 @@ "coin:FJC": { "links": { "Github": "https://github.com/fujicoin/fujicoin", - "Homepage": "https://www.fujicoin.org" + "Homepage": "http://fujicoin.org" }, "marketcap_usd": 871352, "name": "Fujicoin", @@ -377,6 +475,7 @@ "Github": "https://github.com/flash-coin", "Homepage": "https://www.flashcoin.io" }, + "marketcap_usd": 6262092, "name": "Flashcoin", "shortcut": "FLASH", "t1_enabled": "no", @@ -414,8 +513,8 @@ }, "coin:KOTO": { "links": { - "Github": "https://github.com/koto-dev/koto", - "Homepage": "https://koto.cash" + "Github": "https://github.com/KotoDevelopers/koto", + "Homepage": "https://ko-to.org" }, "name": "Koto", "shortcut": "KOTO", @@ -524,6 +623,7 @@ "wallet": {} }, "coin:TBTG": { + "hidden": 1, "links": { "Github": "https://github.com/BTCGPU/BTCGPU", "Homepage": "https://bitcoingold.org" @@ -591,7 +691,6 @@ "wallet": {} }, "coin:VIA": { - "hidden": 1, "links": { "Github": "https://github.com/viacoin", "Homepage": "https://viacoin.org" @@ -602,7 +701,9 @@ "t1_enabled": "yes", "t2_enabled": "yes", "type": "coin", - "wallet": {} + "wallet": { + "Vialectrum": "https://vialectrum.org" + } }, "coin:VTC": { "links": { @@ -651,7 +752,7 @@ "coin:ZEC": { "links": { "Github": "https://github.com/zcash/zcash", - "Homepage": "z.cash" + "Homepage": "https://z.cash" }, "marketcap_usd": 855681961, "name": "Zcash", @@ -751,23 +852,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:etc:PLAY": { - "address": "0x5acE17f87c7391E5792a7683069A8025B83bbd85", - "links": { - "Homepage": "http://smartbillions.com/" - }, - "marketcap_usd": 0, - "name": "Smart Billions", - "network": "etc", - "shortcut": "PLAY", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:$FFC": { "address": "0x4E84E9e5fb0A972628Cf4568c403167EF1D40431", "links": { @@ -1404,9 +1488,9 @@ "Homepage": "https://arcade.city" }, "marketcap_usd": 0, - "name": "Arcade", + "name": "ARC", "network": "eth", - "shortcut": "ARCD", + "shortcut": "ARC", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -2790,24 +2874,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:CARD": { - "address": "0xB07ec2c28834B889b1CE527Ca0F19364cD38935c", - "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": { @@ -3032,23 +3098,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:CDX": { - "address": "0x6fFF3806Bbac52A20e0d79BC538d527f6a22c96b", - "links": { - "Homepage": "https://commodityadnetwork.com" - }, - "marketcap_usd": 0, - "name": "CDX", - "network": "eth", - "shortcut": "CDX", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:CEEK": { "address": "0xb056c38f6b7Dc4064367403E26424CD2c60655e1", "links": { @@ -3432,23 +3481,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:COSS": { - "address": "0x65292EeadF1426Cd2dF1C4793a3d7519f253913b", - "links": { - "Homepage": "https://coss.io" - }, - "marketcap_usd": 10338104, - "name": "Coss Token", - "network": "eth", - "shortcut": "COSS", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:COV": { "address": "0xE2FB6529EF566a080e6d23dE0bd351311087D567", "links": { @@ -4206,7 +4238,7 @@ "Homepage": "https://digix.global" }, "marketcap_usd": 2032107, - "name": "DGX", + "name": "Digix Gold Token", "network": "eth", "shortcut": "DGX", "t1_enabled": "yes", @@ -4370,23 +4402,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": { @@ -4456,23 +4471,6 @@ "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", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:DRVH": { "address": "0x62D4c04644314F35868Ba4c65cc27a77681dE7a9", "links": { @@ -4595,24 +4593,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": { @@ -4749,24 +4729,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:EDU": { - "address": "0x5b26C5D0772E5bbaC8b3182AE9a13f9BB2D03765", - "links": { - "Github": "https://github.com/livecodingtvofficial", - "Homepage": "https://tokensale.liveedu.tv" - }, - "marketcap_usd": 0, - "name": "EDU", - "network": "eth", - "shortcut": "EDU", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:EGT": { "address": "0x8e1b448EC7aDFc7Fa35FC2e885678bD323176E34", "links": { @@ -5017,7 +4979,6 @@ }, "erc20:eth:EOS": { "address": "0x86Fa049857E0209aa7D9e616F7eb3b3B78ECfdb0", - "hidden": 1, "links": { "Homepage": "https://eos.io" }, @@ -5228,12 +5189,10 @@ }, "erc20:eth:E\u20b9": { "address": "0xb67734521eAbBE9C773729dB73E16CC2dfb20A58", - "hidden": 1, "links": { "Github": "https://github.com/eRupee", "Homepage": "https://erupee.wordpress.com" }, - "marketcap_usd": 0, "name": "eRupee", "network": "eth", "shortcut": "E\u20b9", @@ -5331,23 +5290,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": { @@ -5504,23 +5446,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:FUCK": { - "address": "0xAb16E0d25c06CB376259cc18C1de4ACA57605589", - "links": { - "Homepage": "http://fucktoken.io" - }, - "marketcap_usd": 0, - "name": "Finally Usable Crypto Karma", - "network": "eth", - "shortcut": "FUCK", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:FUEL": { "address": "0xEA38eAa3C86c8F9B751533Ba2E562deb9acDED40", "links": { @@ -5608,24 +5533,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": { @@ -5977,24 +5884,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:GUP": { - "address": "0xf7B098298f7C69Fc14610bf71d5e02c60792894C", - "links": { - "Github": "https://github.com/Matchpool/", - "Homepage": "https://github.com/Matchpool/" - }, - "marketcap_usd": 0, - "name": "GUP", - "network": "eth", - "shortcut": "GUP", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:GVT": { "address": "0x103c3A209da59d3E7C4A89307e66521e081CFDF0", "links": { @@ -6258,24 +6147,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:HOT": { - "address": "0x9AF839687F6C94542ac5ece2e317dAAE355493A1", - "links": { - "Github": "https://github.com/Holo-Host", - "Homepage": "https://thehydrofoundation.com/" - }, - "marketcap_usd": 21011913, - "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": { @@ -6349,12 +6220,10 @@ }, "erc20:eth:Hdp.\u0444": { "address": "0x84543F868eC1b1FAC510d49d13C069f64cD2d5f9", - "hidden": 1, "links": { "Github": "https://github.com/HEDPAY", "Homepage": "http://hedpay.com" }, - "marketcap_usd": 0, "name": "HEdpAY", "network": "eth", "shortcut": "Hdp.\u0444", @@ -6812,23 +6681,6 @@ "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": { @@ -6883,9 +6735,8 @@ }, "erc20:eth:JetCoins": { "address": "0x773450335eD4ec3DB45aF74f34F2c85348645D39", - "links": { - "Homepage": "http://www.jetcoins.trade/" - }, + "hidden": 1, + "links": {}, "marketcap_usd": 0, "name": "JetCoins", "network": "eth", @@ -6898,23 +6749,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, @@ -6931,24 +6765,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:KEY": { - "address": "0x4CC19356f2D37338b9802aa8E8fc58B0373296E7", - "links": { - "Github": "https://github.com/bihu-id", - "Homepage": "https://selfkey.org" - }, - "marketcap_usd": 25785161, - "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": { @@ -7108,24 +6924,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:LEMO": { - "address": "0x60C24407d01782C2175D32fe7C8921ed732371D1", - "links": { - "Github": "https://github.com/LemoFoundationLtd", - "Homepage": "http://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, @@ -7684,9 +7482,8 @@ }, "erc20:eth:MCAP": { "address": "0x93E682107d1E9defB0b5ee701C71707a4B2E46Bc", - "links": { - "Homepage": "https://www.mcaplabs.com/" - }, + "hidden": 1, + "links": {}, "marketcap_usd": 352675, "name": "MCAP", "network": "eth", @@ -8482,24 +8279,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:NONE": { - "address": "0x643B6870beabee941B9260a0A878bcF4A61Fb0f1", - "hidden": 1, - "links": { - "Github": "https://github.com/walleth/contracts/tree/master/NoneToken" - }, - "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": { @@ -8674,24 +8453,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:OHNI": { - "address": "0x6f539a9456A5BCb6334A1A41207c3788f5825207", - "links": { - "Github": "ohnicoin", - "Homepage": "http://ohni.us" - }, - "marketcap_usd": 0, - "name": "Ohni", - "network": "eth", - "shortcut": "OHNI", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:OJX": { "address": "0xBeef546ac8a4e0a80DC1E2d696968Ef54138f1d4", "links": { @@ -8797,24 +8558,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:OPEN": { - "address": "0x69c4BB240cF05D51eeab6985Bab35527d04a8C64", - "links": { - "Github": "https://github.com/OpenMoneyDigital", - "Homepage": "https://openfuture.io" - }, - "marketcap_usd": 0, - "name": "OPEN", - "network": "eth", - "shortcut": "OPEN", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:OPT": { "address": "0x4355fC160f74328f9b383dF2EC589bB3dFd82Ba0", "links": { @@ -9200,23 +8943,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:PLAY": { - "address": "0xE477292f1B3268687A29376116B0ED27A9c76170", - "links": { - "Homepage": "http://www.herocoin.io" - }, - "marketcap_usd": 1954962, - "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": { @@ -9510,24 +9236,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": { @@ -9915,24 +9623,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": { @@ -10003,23 +9693,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:REP": { - "address": "0x1985365e9f78359a9B6AD760e32412f4a445E862", - "links": { - "Homepage": "https://augur.net" - }, - "marketcap_usd": 326795700, - "name": "Augur", - "network": "eth", - "shortcut": "REP", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:REQ": { "address": "0x8f8221aFbB33998d8584A2B05749bA73c37a938a", "links": { @@ -10229,9 +9902,8 @@ }, "erc20:eth:ROUND": { "address": "0x4993CB95c7443bdC06155c5f5688Be9D8f6999a5", - "links": { - "Homepage": "http://roundcoin.org/" - }, + "hidden": 1, + "links": {}, "marketcap_usd": 0, "name": "ROUND", "network": "eth", @@ -10484,23 +10156,6 @@ "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": { @@ -10605,24 +10260,6 @@ "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": { @@ -10675,24 +10312,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:SMT": { - "address": "0x2dCFAAc11c9EebD8C6C42103Fe9e2a6AD237aF27", - "links": { - "Github": "https://github.com/SmartMeshFoundation", - "Homepage": "http://smartnode.org" - }, - "marketcap_usd": 51274091, - "name": "SmartMesh", - "network": "eth", - "shortcut": "SMT", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:SNC": { "address": "0xF4134146AF2d511Dd5EA8cDB1C4AC88C57D60404", "links": { @@ -10951,24 +10570,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:SS": { - "address": "0xbbFF862d906E348E9946Bfb2132ecB157Da3D4b4", - "links": { - "Github": "https://github.com/Sharders", - "Homepage": "https://sharder.org" - }, - "marketcap_usd": 6190295, - "name": "Sharder", - "network": "eth", - "shortcut": "SS", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:SSH": { "address": "0x6e2050CBFB3eD8A4d39b64cC9f47E711a03a5a89", "links": { @@ -11697,24 +11298,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:UMKA": { - "address": "0x8e5afc69f6227A3ad75eD346c8723Bc62ce97123", - "links": { - "Github": "https://github.com/UMKAman", - "Homepage": "https://umka.city" - }, - "marketcap_usd": 0, - "name": "UMKA", - "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": { @@ -11955,24 +11538,6 @@ "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": { @@ -12033,7 +11598,7 @@ "Homepage": "https://vetri.global/" }, "marketcap_usd": 0, - "name": "VLD", + "name": "VETRI", "network": "eth", "shortcut": "VLD", "t1_enabled": "yes", @@ -12218,24 +11783,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": { @@ -12289,23 +11836,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:WOLK": { - "address": "0x728781E75735dc0962Df3a51d7Ef47E798A7107E", - "links": { - "Homepage": "https://www.wolk.com" - }, - "marketcap_usd": 0, - "name": "Wolk Token", - "network": "eth", - "shortcut": "WOLK", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:WORK": { "address": "0xD18e454D844eb0009D32E07A0Cde89E18d64CFb4", "links": { @@ -12741,7 +12271,6 @@ }, "erc20:eth:YUPIE": { "address": "0x0F33bb20a282A7649C7B3AFf644F084a9348e933", - "hidden": 1, "links": { "Github": "https://github.com/crowdholdingico/YupieSmartContract", "Homepage": "https://www.crowdholding.com" @@ -13037,22 +12566,6 @@ "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": { @@ -13106,41 +12619,6 @@ "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": { - "Github": "https://github.com/walleth/contracts/tree/master/NoneToken" - }, - "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, @@ -13159,23 +12637,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:rin:RDN": { - "address": "0x3615757011112560521536258c1E7325Ae3b48AE", - "links": { - "Homepage": "https://github.com/gnosis/dx-examples-liquidity-bots" - }, - "marketcap_usd": 0, - "name": "Raiden", - "network": "rin", - "shortcut": "RDN", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:rin:WALL": { "address": "0x0A057a87CE9C56D7e336B417c79cf30E8d27860B", "links": { @@ -13210,24 +12671,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:rop:NONE": { - "address": "0xFD5a69A1309595FF5121553F52C8A5B2B1B31031", - "hidden": 1, - "links": { - "Github": "https://github.com/walleth/contracts/tree/master/NoneToken" - }, - "marketcap_usd": 0, - "name": "None", - "network": "rop", - "shortcut": "NONE", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:ubq:BEER": { "address": "0xFF3bF057ADF3b0E015b6465331a6236e55688274", "hidden": 1, @@ -13398,11 +12841,11 @@ } }, "info": { - "marketcap_usd": 219948273618, - "t1_coins": 690, - "t2_coins": 689, - "total_marketcap_usd": 283970152150, - "updated_at": 1532098768, - "updated_at_readable": "Fri Jul 20 16:59:28 2018" + "marketcap_usd": 219093401682, + "t1_coins": 700, + "t2_coins": 696, + "total_marketcap_usd": 284131879229, + "updated_at": 1532099100, + "updated_at_readable": "Fri Jul 20 17:05:00 2018" } } \ No newline at end of file diff --git a/tools/coin_defs.py b/tools/coin_defs.py new file mode 100755 index 000000000..0f320f430 --- /dev/null +++ b/tools/coin_defs.py @@ -0,0 +1,404 @@ +#!/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): + 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) + + +# ====== 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("Wrong type (expected: {})".format(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("Value does not match regex {}".format(regex)) + + # check choice + if choice is not None and val not in choice: + raise ValueError("Value not allowed, use one of: {}".format(", ".join(choice))) + + +def check_key(key, types, **kwargs): + def do_check(coin): + if not key in coin: + raise KeyError("{}: Missing key".format(key)) + try: + check_type(coin[key], types, **kwargs) + except Exception as e: + raise ValueError("{}: {}".format(key, e)) from e + + return do_check + + +COIN_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("address_prefix", str, regex=r":$"), + check_key("min_address_length", int), + check_key("max_address_length", int), + check_key("bech32_prefix", str, nullable=True), + check_key("cashaddr_prefix", str, nullable=True), + check_key("bitcore", list, empty=True), + check_key("blockbook", list, empty=True), +] + + +def validate_coin(coin): + errors = [] + for check in COIN_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 get_coins(): + 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="btc:{}".format(coin["coin_shortcut"]), + ) + coins.append(coin) + + return coins + + +def get_ethereum_networks(): + networks = load_json("ethereum", "networks.json") + for network in networks: + network.update(key="eth:{}".format(network["shortcut"])) + return networks + + +def get_erc20_tokens(): + networks = get_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 get_nem_mosaics(): + 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 get_others(): + others = load_json("others.json") + for other in others: + other.update(key="network:{}".format(other["shortcut"])) + return others + + +# ====== support info ====== + +RELEASES_URL = "https://wallet.trezor.io/data/firmware/{}/releases.json" +ETHEREUM_TOKENS = { + "1": "https://raw.githubusercontent.com/trezor/trezor-mcu/v{}/firmware/ethereum_tokens.c", + "2": "https://raw.githubusercontent.com/trezor/trezor-core/v{}/src/apps/ethereum/tokens.py", +} + +TOKEN_MATCH = { + "1": re.compile(r'\{.*" ([^"]+)".*\},'), + "2": re.compile(r'\(.*["\']([^"\']+)["\'].*\),'), +} + + +def latest_releases(): + 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[v] = max(tuple(r["version"]) for r in releases) + return latest + + +def support_info_erc20(coins, versions): + supported_tokens = {} + for trezor, version in versions.items(): + tokens = set() + version_str = ".".join(map(str, version)) + + token_file = requests.get(ETHEREUM_TOKENS[trezor].format(version_str)).text + token_match = TOKEN_MATCH[trezor] + + for line in token_file.split("\n"): + m = token_match.search(line) + if m: + tokens.add(m.group(1)) + + supported_tokens[trezor] = tokens + + support = {} + for coin in coins: + key = coin["key"] + if not key.startswith("erc20:"): + continue + + support[key] = dict( + trezor1="yes" if coin["shortcut"] in supported_tokens["1"] else "soon", + trezor2="yes" if coin["shortcut"] in supported_tokens["2"] else "soon", + ) + + return support + + +def support_info(coins, erc20_versions=None): + support_data = load_json("support.json") + support = {} + for coin in coins: + key = coin["key"] + typ = key.split(":", maxsplit=1)[0] + if key in support_data: + support[key] = support_data[key] + + elif typ in ("nem", "eth"): + support[key] = dict(trezor1="yes", trezor2="yes") + + elif typ == "erc20": + # you must call a separate function to get that + continue + + else: + log.warning("support info missing for {}".format(key)) + support[key] = {} + + if erc20_versions: + erc20 = support_info_erc20(coins, erc20_versions) + erc20.update(support) + return erc20 + else: + return support + + +# ====== data cleanup functions ====== + + +def find_address_collisions(coins): + slip44 = defaultdict(list) + at_p2pkh = defaultdict(list) + at_p2sh = defaultdict(list) + + for name, coin in coins.items(): + s = coin["slip44"] + # ignore m/1 testnets + if not (name.endswith("Testnet") and s == 1): + slip44[s].append(s) + + # skip address types on cashaddr currencies + if coin["cashaddr_prefix"]: + continue + + at_p2pkh[coin["address_type"]].append(name) + at_p2sh[coin["address_type_p2sh"]].append(name) + + def prune(d): + ret = d.copy() + for key in d.keys(): + if len(d[key]) < 2: + del ret[key] + return ret + + return dict( + slip44=prune(slip44), + address_type=prune(at_p2pkh), + address_type_p2sh=prune(at_p2sh), + ) + + +def ensure_mandatory_values(coins): + for coin in coins: + if not all(coin.get(k) for k in ("name", "shortcut", "key")): + raise ValueError(coin) + + +def filter_duplicate_shortcuts(coins): + dup_keys = set() + retained_coins = OrderedDict() + + for coin in coins: + key = coin["shortcut"] + if key in dup_keys: + pass + elif key in retained_coins: + dup_keys.add(key) + del retained_coins[key] + else: + retained_coins[key] = coin + + # modify original list + coins[:] = retained_coins.values() + # return duplicates + return dup_keys + + +def _btc_sort_key(coin): + if coin["name"] in ("Bitcoin", "Testnet"): + return "000000" + coin["name"] + else: + return coin["name"] + + +def get_all(): + all_coins = dict( + btc=get_coins(), + eth=get_ethereum_networks(), + erc20=get_erc20_tokens(), + nem=get_nem_mosaics(), + other=get_others(), + ) + + for k, coins in all_coins.items(): + if k == "btc": + coins.sort(key=_btc_sort_key) + else: + coins.sort(key=lambda c: c["key"].upper()) + + ensure_mandatory_values(coins) + if k != "eth": + dup_keys = filter_duplicate_shortcuts(coins) + if dup_keys: + log.warning( + "{}: removing duplicate symbols: {}".format(k, ", ".join(dup_keys)) + ) + + return all_coins + + +def get_list(): + all_coins = get_all() + return sum(all_coins.values(), []) + + +def get_dict(): + return {coin["key"]: coin for coin in get_list()} diff --git a/tools/coins_details.py b/tools/coins_details.py index 5438f3823..c00111945 100755 --- a/tools/coins_details.py +++ b/tools/coins_details.py @@ -2,360 +2,343 @@ """Fetch information about coins and tokens supported by Trezor and update it in coins_details.json.""" import time import json +import logging import requests -import ethereum_tokens_gen -import build_coins -from distutils.version import LooseVersion +import coin_defs -T1_LATEST='1.6.2' -T2_LATEST='2.0.7' +OPTIONAL_KEYS = ("links", "notes", "wallet") +OVERRIDES = coin_defs.load_json("coins_details.override.json") + +VERSIONS = coin_defs.latest_releases() COINS = {} +log = logging.getLogger(__name__) + + def coinmarketcap_init(): global COINS try: - COINS = json.load(open('coinmarketcap.json', 'r')) + marketcap_json = 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 + pass + # if COINS["1"]["last_updated"] > time.time() - 3600: + # print("Using local cache of coinmarketcap") + # return + + for coin in marketcap_json.values(): + slug = coin["website_slug"] + market_cap = coin["quotes"]["USD"]["market_cap"] + if market_cap is not None: + COINS[slug] = int(float(market_cap)) + + 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)) + url = ( + "https://api.coinmarketcap.com/v2/ticker/?start=%d&convert=USD&limit=100" + % (len(COINS) + 1) + ) data = requests.get(url).json() - COINS.update(data['data']) + COINS.update(data["data"]) if total is None: - total = data['metadata']['num_cryptocurrencies'] + total = data["metadata"]["num_cryptocurrencies"] print("Fetched %d of %d coins" % (len(COINS), total)) time.sleep(1) - json.dump(COINS, open('coinmarketcap.json', 'w'), sort_keys=True, indent=4) + json.dump(COINS, open("coinmarketcap.json", "w"), sort_keys=True, indent=4) -def coinmarketcap_info(shortcut): - global COINS - shortcut = shortcut.replace(' ', '-').lower() +def marketcap(coin): + cap = None - for _id in COINS: - coin = COINS[_id] - # print(shortcut, coin['website_slug']) - if shortcut == coin['website_slug']: - # print(coin) - return coin + if "coinmarketcap_alias" in coin: + cap = COINS.get(coin["coinmarketcap_alias"]) + + if not cap: + slug = coin["name"].replace(" ", "-").lower() + cap = COINS.get(slug) + + if not cap: + cap = COINS.get(coin["shortcut"].lower()) + + return cap -def update_marketcap(obj, *shortcuts): - for sym in shortcuts: - try: - obj['marketcap_usd'] = int(float(coinmarketcap_info(sym)['quotes']['USD']['market_cap'])) - return - except: - pass - # print("Marketcap info not found for", shortcut) +def update_marketcap(coins): + for coin in coins.values(): + cap = marketcap(coin) + if cap: + coin["marketcap_usd"] = cap def coinmarketcap_global(): - url = 'https://api.coinmarketcap.com/v2/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() - - 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)]) + details["info"]["updated_at"] = int(time.time()) + details["info"]["updated_at_readable"] = time.asctime() + + 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) + ] + ) try: - details['info']['total_marketcap_usd'] = int(coinmarketcap_global()['data']['quotes']['USD']['total_market_cap']) + details["info"]["total_marketcap_usd"] = int( + coinmarketcap_global()["data"]["quotes"]["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 + 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(): + 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']) - set_default(out, 'wallet', {}) - update_marketcap(out, coin.get('coinmarketcap_alias', coin['coin_label'])) - - check_unsupported(details, 'coin:', supported) - - -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[str(trezor_version)] + nominal = support.get("trezor" + str(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']) + 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_coins(coins, support_info): + res = {} + for coin in coins: + key = coin["key"] + support = support_info[key] + details = dict( + type="coin", + shortcut=coin["shortcut"], + name=coin["coin_label"], + links=dict(Homepage=coin["website"], Github=coin["github"]), + t1_enabled=_is_supported(support, 1), + t2_enabled=_is_supported(support, 2), + wallet={}, + ) + if _webwallet_support(coin, support): + details["wallet"]["Trezor"] = "https://wallet.trezor.io" + if support.get("other"): + details["wallet"].update(support["other"]) + + # XXX get rid of this in favor of res[key] + res["coin:{}".format(coin["shortcut"])] = details + + return res + + +def update_erc20(coins, support_info): + # TODO skip disabled networks? + res = {} + for coin in coins: + key = coin["key"] + support = support_info[key] + details = dict( + type="erc20", + network=coin["chain"], + address=coin["address"], + shortcut=coin["shortcut"], + name=coin["name"], + links={}, + wallet=dict( + MyCrypto="https://mycrypto.com", + MyEtherWallet="https://www.myetherwallet.com", + ), + t1_enabled=support["trezor1"], + t2_enabled=support["trezor2"], + ) + if coin.get("website"): + details["links"]["Homepage"] = coin["website"] + if coin.get("social", {}).get("github"): + details["links"]["Github"] = coin["social"]["github"] + + res[key] = details + + return res + + +def update_simple(coins, support_info, type): + res = {} + for coin in coins: + key = coin["key"] + support = support_info[key] + + # XXX drop newkey + if type == "mosaic": + newkey = "mosaic:{}".format(coin["shortcut"]) + else: + newkey = "coin2:{}".format(coin["shortcut"]) - if t['chain'] not in networks: - print('Skipping, %s is disabled' % t['chain']) - continue + details = dict( + name=coin["name"], + shortcut=coin["shortcut"], + type=type, + t1_enabled=_is_supported(support, 1), + t2_enabled=_is_supported(support, 2), + ) + for key in OPTIONAL_KEYS: + if key in coin: + details[key] = coin[key] - 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'] + res[newkey] = details - set_default(out, 'shortcut', t['symbol']) - set_default(out, 'name', t['name']) - set_default(out, 'links', {}) - set_default(out, 'wallet', {}) + return res - 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.get('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['name'], 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 update_ethereum_networks(coins, support_info): + res = update_simple(coins, support_info, "coin") + for coin in coins: + newkey = "coin2:{}".format(coin["shortcut"]) + res[newkey]["wallet"] = dict( + MyCrypto="https://mycrypto.com", + MyEtherWallet="https://www.myetherwallet.com", + ) + res[newkey]["links"] = dict(Homepage=coin.get("url")) + return res def check_missing_details(details): - for k in details['coins'].keys(): - coin = details['coins'][k] + for k in details["coins"].keys(): + coin = details["coins"][k] hide = False - if 'links' not in coin: + 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 ("yes", "no", "planned", "soon"): print("%s: Unknown t1_enabled" % k) hide = True - if coin['t2_enabled'] not in ('yes', 'no', 'planned', 'soon'): + if coin["t2_enabled"] not in ("yes", "no", "planned", "soon"): 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: + for k in details["coins"].keys(): + if details["coins"][k].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': {}} +def apply_overrides(coins): + for key, override in OVERRIDES.items(): + if key not in coins: + log.warning("override without coin: {}".format(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) + else: + return new + + coin = coins[key] + recursive_update(coin, override) + + +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) + + defs = coin_defs.get_all() + all_coins = sum(defs.values(), []) + support_info = coin_defs.support_info(all_coins, erc20_versions=VERSIONS) + + coins = {} + coins.update(update_coins(defs["btc"], 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["other"], support_info, "coin")) + + apply_overrides(coins) + update_marketcap(coins) + + details = dict(coins=coins, info={}) 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) + print(json.dumps(details["info"], sort_keys=True, indent=4)) + json.dump(details, open("../defs/coins_details.json", "w"), sort_keys=True, indent=4) + From 9e6b3dba5f8ec88474917cb24cf66cd886e24165 Mon Sep 17 00:00:00 2001 From: matejcik Date: Mon, 23 Jul 2018 16:33:00 +0200 Subject: [PATCH 05/50] tools: coin_defs cleanup * btc-like coins are now called `coins`, with key type `coin`, for consistency with names in other tools * `others` are renamed to `misc` and placed in a separate subdir * added many docstrings that explain the behavior * renamed and privatized many functions --- defs/{others.json => misc/misc.json} | 0 defs/support.json | 106 +++++++++++-------------- tools/coin_defs.py | 113 +++++++++++++++++++++------ 3 files changed, 135 insertions(+), 84 deletions(-) rename defs/{others.json => misc/misc.json} (100%) diff --git a/defs/others.json b/defs/misc/misc.json similarity index 100% rename from defs/others.json rename to defs/misc/misc.json diff --git a/defs/support.json b/defs/support.json index 63d5dd5fb..9c297a463 100644 --- a/defs/support.json +++ b/defs/support.json @@ -1,5 +1,5 @@ { - "btc:BCH": { + "coin:BCH": { "trezor1": "1.6.2", "trezor2": "2.0.7", "connect": true, @@ -8,7 +8,7 @@ "Electron Cash": "https://electroncash.org" } }, - "btc:BTC": { + "coin:BTC": { "trezor1": "1.5.2", "trezor2": "2.0.5", "connect": true, @@ -17,7 +17,7 @@ "Electrum": "https://electrum.org" } }, - "btc:BTCP": { + "coin:BTCP": { "trezor1": "1.6.2", "trezor2": "2.0.7", "connect": null, @@ -26,7 +26,7 @@ "BTCP Electrum": "https://github.com/BTCPrivate/electrum-btcp" } }, - "btc:BTG": { + "coin:BTG": { "trezor1": "1.6.2", "trezor2": "2.0.7", "connect": true, @@ -35,7 +35,7 @@ "ElectrumG": "https://github.com/BTCGPU/electrum" } }, - "btc:DASH": { + "coin:DASH": { "trezor1": "1.5.2", "trezor2": "2.0.5", "connect": true, @@ -44,28 +44,25 @@ "Dash Electrum": "https://electrum.dash.org" } }, - "btc:DCR": { - "connect": null, - "electrum": null, + "coin:DCR": { "trezor1": "1.6.2", "trezor2": null, + "connect": null, "webwallet": true }, - "btc:DGB": { - "connect": null, - "electrum": null, + "coin:DGB": { "trezor1": "1.6.0", "trezor2": "2.0.5", + "connect": null, "webwallet": true }, - "btc:DOGE": { - "connect": null, - "electrum": null, + "coin:DOGE": { "trezor1": "1.5.2", "trezor2": "2.0.5", + "connect": null, "webwallet": true }, - "btc:FJC": { + "coin:FJC": { "trezor1": "1.6.1", "trezor2": "2.0.5", "connect": null, @@ -74,7 +71,7 @@ "Electrum-FJC": "http://www.fujicoin.org/downloads.php" } }, - "btc:GRS": { + "coin:GRS": { "trezor1": "1.6.2", "trezor2": "2.0.8", "connect": null, @@ -83,7 +80,7 @@ "Electrum-GRS": "https://www.groestlcoin.org/groestlcoin-electrum-wallet/" } }, - "btc:LTC": { + "coin:LTC": { "trezor1": "1.5.2", "trezor2": "2.0.5", "connect": true, @@ -92,7 +89,7 @@ "Electrum-LTC": "https://electrum-ltc.org" } }, - "btc:MONA": { + "coin:MONA": { "trezor1": "1.6.0", "trezor2": "2.0.5", "connect": null, @@ -101,7 +98,7 @@ "Electrum-MONA": "https://electrum-mona.org" } }, - "btc:NMC": { + "coin:NMC": { "trezor1": "1.5.2", "trezor2": "2.0.5", "connect": null, @@ -110,42 +107,37 @@ "Electrum-NMC": "https://github.com/namecoin/electrum-nmc" } }, - "btc:TAZ": { - "connect": null, - "electrum": null, + "coin:TAZ": { "trezor1": "1.6.2", "trezor2": "2.0.7", + "connect": null, "webwallet": true }, - "btc:TBCH": { - "connect": null, - "electrum": null, + "coin:TBCH": { "trezor1": "1.6.2", "trezor2": "2.0.7", + "connect": null, "webwallet": null }, - "btc:TDCR": { - "connect": null, - "electrum": null, + "coin:TDCR": { "trezor1": "1.6.2", "trezor2": null, + "connect": null, "webwallet": true }, - "btc:TEST": { - "connect": true, - "electrum": null, + "coin:TEST": { "trezor1": "1.5.2", "trezor2": "2.0.5", + "connect": true, "webwallet": true }, - "btc:TLTC": { - "connect": null, - "electrum": null, + "coin:TLTC": { "trezor1": "1.6.2", "trezor2": "2.0.7", + "connect": null, "webwallet": true }, - "btc:VIA": { + "coin:VIA": { "trezor1": "1.6.2", "trezor2": "2.0.7", "connect": null, @@ -154,14 +146,13 @@ "Vialectrum": "https://vialectrum.org" } }, - "btc:VTC": { - "connect": null, - "electrum": null, + "coin:VTC": { "trezor1": "1.6.1", "trezor2": "2.0.5", + "connect": null, "webwallet": true }, - "btc:XZC": { + "coin:XZC": { "trezor1": "1.6.2", "trezor2": "2.0.7", "connect": null, @@ -171,72 +162,67 @@ "Znode Tool": "https://github.com/yura-pakhuchiy/znode-tool" } }, - "btc:ZEC": { - "connect": true, - "electrum": null, + "coin:ZEC": { "trezor1": "1.6.2", "trezor2": "2.0.7", + "connect": true, "webwallet": true }, - "btc:ZEN": { - "connect": null, - "electrum": null, + "coin:ZEN": { "trezor1": null, "trezor2": "2.0.8", + "connect": null, "webwallet": null }, - "btc:tDASH": { - "connect": null, - "electrum": null, + "coin:tDASH": { "trezor1": "1.6.2", "trezor2": null, + "connect": null, "webwallet": null }, - "btc:tGRS": { - "connect": null, - "electrum": null, + "coin:tGRS": { "trezor1": "1.6.2", "trezor2": "2.0.8", + "connect": null, "webwallet": true }, - "btc:tXZC": { - "connect": null, - "electrum": null, + "coin:tXZC": { "trezor1": "1.6.2", "trezor2": "2.0.7", + "connect": null, "webwallet": null }, - "network:LSK": { + "misc:LSK": { "trezor1": null, "trezor2": "2.0.7", "connect": null, "webwallet": null }, - "network:XLM": { + "misc:XLM": { "trezor1": "soon", "trezor2": "soon", "connect": null, "webwallet": null }, - "network:XTZ": { + "misc:XTZ": { "trezor1": null, "trezor2": "soon", "connect": null, "webwallet": null }, - "network:ADA": { + "misc:ADA": { "trezor1": null, "trezor2": "soon", "connect": null, "webwallet": null }, - "network:XMR": { + "misc:XMR": { "trezor1": null, "trezor2": "soon", "connect": null, "webwallet": null }, - "network:XRP": { + "misc:XRP": { "trezor1": null, "trezor2": "soon", "connect": null, diff --git a/tools/coin_defs.py b/tools/coin_defs.py index 0f320f430..cd532d6d0 100755 --- a/tools/coin_defs.py +++ b/tools/coin_defs.py @@ -20,6 +20,7 @@ DEFS_DIR = os.path.abspath( 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: @@ -72,7 +73,7 @@ def check_key(key, types, **kwargs): return do_check -COIN_CHECKS = [ +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]"), @@ -112,9 +113,9 @@ COIN_CHECKS = [ ] -def validate_coin(coin): +def validate_btc(coin): errors = [] - for check in COIN_CHECKS: + for check in BTC_CHECKS: try: check(coin) except Exception as e: @@ -154,29 +155,32 @@ def validate_coin(coin): # ======= Coin json loaders ======= -def get_coins(): +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="btc:{}".format(coin["coin_shortcut"]), + key="coin:{}".format(coin["coin_shortcut"]), ) coins.append(coin) return coins -def get_ethereum_networks(): +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 get_erc20_tokens(): - networks = get_ethereum_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 "): @@ -203,7 +207,8 @@ def get_erc20_tokens(): return tokens -def get_nem_mosaics(): +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() @@ -211,10 +216,11 @@ def get_nem_mosaics(): return mosaics -def get_others(): - others = load_json("others.json") +def _load_misc(): + """Loads miscellaneous networks from `misc/misc.json`""" + others = load_json("misc/misc.json") for other in others: - other.update(key="network:{}".format(other["shortcut"])) + other.update(key="misc:{}".format(other["shortcut"])) return others @@ -233,6 +239,7 @@ TOKEN_MATCH = { 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") @@ -244,6 +251,20 @@ def latest_releases(): def support_info_erc20(coins, versions): + """Generate support info for ERC20 tokens. + + Takes a dict of Trezor versions as returned from `latest_releases` + and a list of coins as returned from `_get_erc20_tokens` and creates + a supportinfo entry for each listed token. + + Support status is determined by downloading and parsing the definition file + from the appropriate firmware version. If a given token is listed, the support + is marked as "yes". If not, support is marked as "soon", assuming that + it will be included in next release. + + This is currently the only way to get the list of supported tokens. We don't want + to track support individually in support.json. + """ supported_tokens = {} for trezor, version in versions.items(): tokens = set() @@ -273,7 +294,31 @@ def support_info_erc20(coins, versions): return support -def support_info(coins, erc20_versions=None): +def support_info(coins, erc20_versions=None, skip_missing=False): + """Generate Trezor support information. + + Takes a dict of coins and generates a support-info entry for each. + The support-info is a dict with a number of known keys: + `trezor1`, `trezor2`, `webwallet`, `connect`. An optional `other` entry + is a dict of name-url pairs for third-party software. + + For btc-like coins and misc networks, this is taken from `support.json`. + For NEM mosaics and ethereum networks, the support is presumed to be "yes" + for both Trezors. Webwallet and Connect info is not filled out. + + ERC20 tokens are ignored by this function, as if `skip_missing` was true + (see below). However, if you pass the optional `erc20_versions` argument, + it will call `support_info_erc20` for you with given versions. + + In all cases, if the coin is explicitly listed in `support.json`, the info + takes precedence over any other source (be it assumed "yes" for nem/eth, + or downloaded info for erc20). + + If `skip_missing` is `True`, coins for which no support information is available + will not be included in the output. Otherwise, an empty dict will be included + and a warning emitted. "No support information" means that the coin is not + listed in `support.json` and we have no heuristic to determine the support. + """ support_data = load_json("support.json") support = {} for coin in coins: @@ -289,7 +334,7 @@ def support_info(coins, erc20_versions=None): # you must call a separate function to get that continue - else: + elif not skip_missing: log.warning("support info missing for {}".format(key)) support[key] = {} @@ -305,6 +350,10 @@ def support_info(coins, erc20_versions=None): def find_address_collisions(coins): + """Detects collisions in: + - SLIP44 path prefixes + - address type numbers, both for p2pkh and p2sh + """ slip44 = defaultdict(list) at_p2pkh = defaultdict(list) at_p2sh = defaultdict(list) @@ -336,13 +385,17 @@ def find_address_collisions(coins): ) -def ensure_mandatory_values(coins): +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 filter_duplicate_shortcuts(coins): +def _filter_duplicate_shortcuts(coins): + """Removes coins with identical `shortcut`s. + This is used to drop colliding ERC20 tokens. + """ dup_keys = set() retained_coins = OrderedDict() @@ -370,23 +423,33 @@ def _btc_sort_key(coin): def get_all(): + """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. + """ all_coins = dict( - btc=get_coins(), - eth=get_ethereum_networks(), - erc20=get_erc20_tokens(), - nem=get_nem_mosaics(), - other=get_others(), + coins=_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 == "btc": + if k == "coins": coins.sort(key=_btc_sort_key) + elif k == "nem": + # do not sort nem + pass else: coins.sort(key=lambda c: c["key"].upper()) - ensure_mandatory_values(coins) + _ensure_mandatory_values(coins) if k != "eth": - dup_keys = filter_duplicate_shortcuts(coins) + dup_keys = _filter_duplicate_shortcuts(coins) if dup_keys: log.warning( "{}: removing duplicate symbols: {}".format(k, ", ".join(dup_keys)) @@ -396,9 +459,11 @@ def get_all(): def get_list(): + """Return all definitions as a single list of coins.""" all_coins = get_all() return sum(all_coins.values(), []) def get_dict(): + """Return all definitions as a dict indexed by coin keys.""" return {coin["key"]: coin for coin in get_list()} From 3630571a0aca6faa836d35bd2c9afe7e6b242f57 Mon Sep 17 00:00:00 2001 From: matejcik Date: Tue, 24 Jul 2018 13:54:03 +0200 Subject: [PATCH 06/50] tools: add support data and validation to coin_defs also add checks that were not brought over from build_coins.py --- tools/coin_defs.py | 48 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/tools/coin_defs.py b/tools/coin_defs.py index cd532d6d0..52e7e3637 100755 --- a/tools/coin_defs.py +++ b/tools/coin_defs.py @@ -61,10 +61,13 @@ def check_type(val, types, nullable=False, empty=False, regex=None, choice=None) raise ValueError("Value not allowed, use one of: {}".format(", ".join(choice))) -def check_key(key, types, **kwargs): +def check_key(key, types, optional=False, **kwargs): def do_check(coin): - if not key in coin: - raise KeyError("{}: Missing key".format(key)) + if key not in coin: + if optional: + return + else: + raise KeyError("{}: Missing key".format(key)) try: check_type(coin[key], types, **kwargs) except Exception as e: @@ -103,11 +106,11 @@ BTC_CHECKS = [ check_key("dust_limit", int), check_key("blocktime_seconds", int), check_key("signed_message_header", str), - check_key("address_prefix", str, regex=r":$"), + 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, nullable=True), - check_key("cashaddr_prefix", str, nullable=True), + 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), ] @@ -152,6 +155,25 @@ def validate_btc(coin): return errors +SUPPORT_CHECKS = [ + check_key("trezor1", str, nullable=True, regex=r"^soon|planned|\d+\.\d+\.\d+$"), + check_key("trezor2", str, nullable=True, regex=r"^soon|planned|\d+\.\d+\.\d+$"), + check_key("webwallet", bool, nullable=True), + check_key("connect", bool, nullable=True), + check_key("other", dict, optional=True, empty=False), +] + + +def validate_support(support): + errors = [] + for check in SUPPORT_CHECKS: + try: + check(support) + except Exception as e: + errors.append(str(e)) + return errors + + # ======= Coin json loaders ======= @@ -238,6 +260,11 @@ TOKEN_MATCH = { } +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: @@ -319,7 +346,7 @@ def support_info(coins, erc20_versions=None, skip_missing=False): and a warning emitted. "No support information" means that the coin is not listed in `support.json` and we have no heuristic to determine the support. """ - support_data = load_json("support.json") + support_data = get_support_data() support = {} for coin in coins: key = coin["key"] @@ -358,11 +385,12 @@ def find_address_collisions(coins): at_p2pkh = defaultdict(list) at_p2sh = defaultdict(list) - for name, coin in coins.items(): + for coin in coins: + name = coin["name"] s = coin["slip44"] # ignore m/1 testnets if not (name.endswith("Testnet") and s == 1): - slip44[s].append(s) + slip44[s].append(name) # skip address types on cashaddr currencies if coin["cashaddr_prefix"]: @@ -373,7 +401,7 @@ def find_address_collisions(coins): def prune(d): ret = d.copy() - for key in d.keys(): + for key in d: if len(d[key]) < 2: del ret[key] return ret From cd5538bcc5076a79d9bc63d13de3d1606ca5a6c2 Mon Sep 17 00:00:00 2001 From: matejcik Date: Fri, 27 Jul 2018 12:01:21 +0200 Subject: [PATCH 07/50] defs: add support for dogecoin and vertcoin (port of #176) --- defs/support.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/defs/support.json b/defs/support.json index 9c297a463..1a81a0fe4 100644 --- a/defs/support.json +++ b/defs/support.json @@ -59,7 +59,7 @@ "coin:DOGE": { "trezor1": "1.5.2", "trezor2": "2.0.5", - "connect": null, + "connect": true, "webwallet": true }, "coin:FJC": { @@ -149,7 +149,7 @@ "coin:VTC": { "trezor1": "1.6.1", "trezor2": "2.0.5", - "connect": null, + "connect": true, "webwallet": true }, "coin:XZC": { From 44240c95033b645468b100a9af327031ff2b2421 Mon Sep 17 00:00:00 2001 From: matejcik Date: Fri, 27 Jul 2018 12:05:09 +0200 Subject: [PATCH 08/50] tools: add support tool and coin_gen tool support.py - query and modify info in support.json coin_gen.py - generate coins_json, render mako templates, run checks --- tools/coin_gen.py | 264 ++++++++++++++++++++++++++++++++++++++++++++++ tools/support.py | 171 ++++++++++++++++++++++++++++++ 2 files changed, 435 insertions(+) create mode 100755 tools/coin_gen.py create mode 100755 tools/support.py diff --git a/tools/coin_gen.py b/tools/coin_gen.py new file mode 100755 index 000000000..04f775399 --- /dev/null +++ b/tools/coin_gen.py @@ -0,0 +1,264 @@ +#!/usr/bin/env python3 +import io +import json +import re +import sys +import os +import glob + +import click + +import coin_defs + +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: + from hashlib import sha256 + import ed25519 + from PIL import Image + from trezorlib.protobuf import dump_message + from coindef import CoinDef + + CAN_BUILD_DEFS = True +except ImportError: + CAN_BUILD_DEFS = False + + +# ======= Jinja2 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 ascii_filter(s): + return re.sub("[^ -\x7e]", "_", s) + + +MAKO_FILTERS = {"c_str": c_str_filter, "ascii": ascii_filter} + + +def render_file(filename, coins, support_info): + """Opens `filename.j2`, renders the template and stores the result in `filename`.""" + template = mako.template.Template(filename=filename + ".mako") + result = template.render(support_info=support_info, **coins, **MAKO_FILTERS) + with open(filename, "w") as f: + f.write(result) + + +# ====== validation functions ====== + + +def check_support(defs, support_data): + check_passed = True + + for key, support in support_data.items(): + errors = coin_defs.validate_support(support) + if errors: + check_passed = False + print("ERR:", "invalid definition for", key) + print("\n".join(errors)) + + expected_coins = set(coin["key"] for coin in defs["coins"] + defs["misc"]) + + # detect missing support info for expected + for coin in expected_coins: + if coin not in support_data: + check_passed = False + print("ERR: Missing support info for", coin) + + # detect non-matching support info + coin_list = sum(defs.values(), []) + coin_set = set(coin["key"] for coin in coin_list) + for key in support_data: + # detect non-matching support info + if key not in coin_set: + check_passed = False + print("ERR: Support info found for unknown coin", key) + + # detect override - info only, doesn't fail check + if key not in expected_coins: + print("INFO: Override present for coin", key) + + return check_passed + + +def check_btc(coins): + check_passed = True + + for coin in coins: + errors = coin_defs.validate_btc(coin) + if errors: + check_passed = False + print("ERR:", "invalid definition for", coin["name"]) + print("\n".join(errors)) + + collisions = coin_defs.find_address_collisions(coins) + # warning only + for key, dups in collisions.items(): + if dups: + print("WARN: collisions found in", key) + for k, v in dups.items(): + print("-", k, ":", ", ".join(map(str, v))) + + 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 + "/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 + + +# ====== click command handlers ====== + + +@click.group() +def cli(): + pass + + +@cli.command() +@click.option( + "--backend-check/--no-backend-check", + "-b", + help="Also check blockbook/bitcore responses", +) +def check(backend_check): + """Validate coin definitions. + + Checks that every btc-like coin is properly filled out, reports address collisions + and missing support information. + """ + if backend_check and requests is None: + raise click.ClickException("You must install requests for backend check") + + defs = coin_defs.get_all() + all_checks_passed = True + + print("Checking BTC-like coins...") + if not check_btc(defs["coins"]): + all_checks_passed = False + + print("Checking support data...") + if not check_support(defs, coin_defs.get_support_data()): + all_checks_passed = False + + if backend_check: + print("Checking backend responses...") + if not check_backends(defs["coins"]): + 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""" + defs = coin_defs.get_all() + coins = defs["coins"] + support_info = coin_defs.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) + + +@cli.command() +@click.argument("paths", metavar="[path]...", nargs=-1) +def render(paths): + """Generate source code from Jinja2 templates. + + For every "foo.bar.j2" filename passed, runs the template and + saves the result as "foo.bar". + + For every directory name passed, processes all ".j2" files found + in that directory. + + If no arguments are given, processes the current directory. + """ + if not CAN_RENDER: + raise click.ClickException("Please install 'mako' and 'munch'") + + 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) + + defs = coin_defs.get_all() + all_coins = sum(defs.values(), []) + versions = coin_defs.latest_releases() + support_info = coin_defs.support_info(all_coins, erc20_versions=versions) + + # munch dicts - make them attribute-accessable + 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) + + for file in files: + if not file.endswith(".mako"): + click.echo("File {} does not end with .mako".format(file)) + else: + target = file[: -len(".mako")] + click.echo("Rendering {} => {}".format(file, target)) + try: + render_file(target, defs, support_info) + except Exception as e: + click.echo("Error occured: {}".format(e)) + raise + + +if __name__ == "__main__": + cli() diff --git a/tools/support.py b/tools/support.py new file mode 100755 index 000000000..c9659df39 --- /dev/null +++ b/tools/support.py @@ -0,0 +1,171 @@ +#!/usr/bin/env python3 +import os +import sys +import click +import coin_defs +import json + +SUPPORT_INFO = coin_defs.get_support_data() + +MANDATORY_ENTRIES = ("trezor1", "trezor2", "connect", "webwallet") + + +def update_support(key, entry, value): + # template entry + support = {k: None for k in MANDATORY_ENTRIES} + support["other"] = {} + # fill out actual support info, if it exists + support.update(SUPPORT_INFO.get(key, {})) + + if entry in MANDATORY_ENTRIES: + if entry.startswith("trezor") and not value: + value = None + support[entry] = value + else: + support["other"][entry] = value + + for k in support["other"]: + if not support["other"][k]: + del support["other"][k] + + if not support["other"]: + del support["other"] + + SUPPORT_INFO[key] = support + return support + + +def write_support_info(): + with open(os.path.join(coin_defs.DEFS_DIR, "support.json"), "w") as f: + json.dump(SUPPORT_INFO, f, indent=4) + f.write("\n") + + +@click.group() +def cli(): + pass + + +@cli.command() +def rewrite(): + """Regenerate support.json to match predefined structure and field order.""" + for key, coin in SUPPORT_INFO.items(): + d = {"trezor1": None, "trezor2": None, "connect": None, "webwallet": None} + d.update(coin) + if "electrum" in d: + del d["electrum"] + if "other" in d and not d["other"]: + del d["other"] + SUPPORT_INFO[key] = d + + write_support_info() + + +@cli.command() +def check(): + """Check validity of support information. + + The relevant code is actually part of 'coin_gen.py'. It can be invoked from + here for convenience and because it makes sense. But it's preferable to run it + as part of 'coin_gen.py check'. + """ + defs = coin_defs.get_all() + support_data = coin_defs.get_support_data() + import coin_gen + + if not coin_gen.check_support(defs, support_data): + sys.exit(1) + + +@cli.command() +@click.argument("keyword", nargs=-1) +def show(keyword): + """Show support status of specified coins. + + Keywords match against key, name or shortcut (ticker symbol) of coin. If no + keywords are provided, show all supported coins. + + Only coins listed in support.json are considered "supported". That means that + Ethereum networks, ERC20 tokens and NEM mosaics will probably show up wrong. + """ + defs = coin_defs.get_list() + + if keyword: + for coin in defs: + key = coin["key"] + name, shortcut = coin["name"], coin["shortcut"] + for kw in keyword: + kwl = kw.lower() + if kwl == key.lower() or kwl in name.lower() or kwl == shortcut.lower(): + print("{} - {} ({})".format(key, name, shortcut), end=" - ") + if key in SUPPORT_INFO: + print(json.dumps(SUPPORT_INFO[key], indent=4)) + else: + print("no support info") + break + + else: + print(json.dumps(SUPPORT_INFO, indent=4)) + + +@cli.command() +@click.argument("support_key", required=True) +@click.argument( + "entries", nargs=-1, required=True, metavar="entry=value [entry=value]..." +) +@click.option( + "-n", + "--dry-run", + is_flag=True, + help="Only print updated support info, do not write back", +) +def set(support_key, entries, dry_run): + """Set a support info variable. + + Examples: + support.py coin:BTC trezor1=soon trezor2=2.0.7 webwallet=yes connect=no + support.py coin:LTC trezor1=yes "Electrum-LTC=https://electrum-ltc.org" Electrum= + + 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. + """ + coins = coin_defs.get_dict() + if support_key not in coins: + click.echo("Failed to find key {}".format(support_key)) + click.echo("Use 'support.py show' to search for the right one.") + sys.exit(1) + + print("{} - {}".format(support_key, coins[support_key]["name"])) + + for entry in entries: + try: + key, value = entry.split("=", maxsplit=1) + except ValueError: + click.echo("Invalid entry: {}".format(entry)) + sys.exit(2) + + if value in ("yes", "true", "1"): + value = True + elif value in ("no", "false", "2"): + value = False + elif value == "": + value = None + + support = update_support(support_key, key, value) + + print(json.dumps(support, indent=4)) + if not dry_run: + write_support_info() + + +if __name__ == "__main__": + cli() From 1e032d4da572b935df7ea0b99ba1045555f16bdf Mon Sep 17 00:00:00 2001 From: matejcik Date: Fri, 27 Jul 2018 12:04:44 +0200 Subject: [PATCH 09/50] tools: clean up and update coins_details.py, regenerate json --- defs/coins_details.json | 2298 ++++++++++++++++++++------------------- tools/coins_details.py | 223 ++-- 2 files changed, 1272 insertions(+), 1249 deletions(-) diff --git a/defs/coins_details.json b/defs/coins_details.json index 5d2abd7ea..5b530ff7d 100644 --- a/defs/coins_details.json +++ b/defs/coins_details.json @@ -1,308 +1,11 @@ { "coins": { - "coin2:ADA": { - "links": { - "Homepage": "https://www.cardano.org" - }, - "marketcap_usd": 4482686788, - "name": "Cardano", - "shortcut": "ADA", - "t1_enabled": "no", - "t2_enabled": "soon", - "type": "coin" - }, - "coin2: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" - } - }, - "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": 674279, - "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:ESN": { - "links": { - "Homepage": "https://ethersocial.org" - }, - "marketcap_usd": 0, - "name": "Ethersocial Network", - "shortcut": "ESN", - "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": 1726360707, - "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": 46802391646, - "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": "Ethereum Social", - "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://expanse.tech" - }, - "marketcap_usd": 10593934, - "name": "Expanse", - "shortcut": "EXP", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "coin", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, - "coin2:GO": { - "links": { - "Homepage": "https://gochain.io" - }, - "marketcap_usd": 37459560, - "name": "GoChain", - "shortcut": "GO", - "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": 548473107, - "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": 46821303, - "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": 5315301581, - "name": "Stellar", - "notes": "In development", - "shortcut": "XLM", - "t1_enabled": "soon", - "t2_enabled": "soon", - "type": "coin" - }, - "coin2:XMR": { - "links": { - "Homepage": "https://getmonero.org" - }, - "marketcap_usd": 2215103721, - "name": "Monero", - "notes": "In development", - "shortcut": "XMR", - "t1_enabled": "no", - "t2_enabled": "soon", - "type": "coin" - }, - "coin2:XRP": { - "links": { - "Homepage": "https://ripple.com" - }, - "marketcap_usd": 18016097427, - "name": "Ripple", - "notes": "In development", - "shortcut": "XRP", - "t1_enabled": "no", - "t2_enabled": "soon", - "type": "coin" - }, - "coin2:XTZ": { - "links": { - "Homepage": "https://tezos.com" - }, - "marketcap_usd": 1300463940, - "name": "Tezos", - "shortcut": "XTZ", - "t1_enabled": "no", - "t2_enabled": "soon", - "type": "coin" - }, - "coin2: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" - } - }, - "coin2:tETH": { - "hidden": 1, - "links": { - "Homepage": "https://www.ethereum.org" - }, - "marketcap_usd": 0, - "name": "Ethereum Testnet Kovan", - "shortcut": "tETH", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "coin", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, - "coin2: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" - } - }, "coin:BCH": { "links": { "Github": "https://github.com/Bitcoin-ABC/bitcoin-abc", "Homepage": "https://www.bitcoincash.org" }, - "marketcap_usd": 13729622285, + "marketcap_usd": 13742785799, "name": "Bitcoin Cash", "shortcut": "BCH", "t1_enabled": "yes", @@ -318,7 +21,7 @@ "Github": "https://github.com/bitcoin/bitcoin", "Homepage": "https://bitcoin.org" }, - "marketcap_usd": 128315021625, + "marketcap_usd": 136203971319, "name": "Bitcoin", "shortcut": "BTC", "t1_enabled": "yes", @@ -334,7 +37,7 @@ "Github": "https://github.com/BTCPrivate/BitcoinPrivate", "Homepage": "https://btcprivate.org" }, - "marketcap_usd": 141676432, + "marketcap_usd": 149954620, "name": "Bitcoin Private", "shortcut": "BTCP", "t1_enabled": "yes", @@ -349,7 +52,7 @@ "Github": "https://github.com/BTCGPU/BTCGPU", "Homepage": "https://bitcoingold.org" }, - "marketcap_usd": 508396087, + "marketcap_usd": 497959882, "name": "Bitcoin Gold", "shortcut": "BTG", "t1_enabled": "yes", @@ -365,7 +68,7 @@ "Github": "https://github.com/LIMXTEC/BitCore", "Homepage": "https://bitcore.cc" }, - "marketcap_usd": 27337289, + "marketcap_usd": 30064254, "name": "Bitcore", "shortcut": "BTX", "t1_enabled": "no", @@ -378,7 +81,7 @@ "Github": "https://github.com/Crowndev/crowncoin", "Homepage": "https://crown.tech" }, - "marketcap_usd": 8967717, + "marketcap_usd": 6768071, "name": "Crown", "shortcut": "CRW", "t1_enabled": "no", @@ -391,7 +94,7 @@ "Github": "https://github.com/dashpay/dash", "Homepage": "https://www.dash.org" }, - "marketcap_usd": 2244144313, + "marketcap_usd": 1978399572, "name": "Dash", "shortcut": "DASH", "t1_enabled": "yes", @@ -407,7 +110,7 @@ "Github": "https://github.com/decred/dcrd", "Homepage": "https://www.decred.org" }, - "marketcap_usd": 593053427, + "marketcap_usd": 507224924, "name": "Decred", "shortcut": "DCR", "t1_enabled": "yes", @@ -420,7 +123,7 @@ "Github": "https://github.com/digibyte/digibyte", "Homepage": "https://digibyte.io" }, - "marketcap_usd": 472432594, + "marketcap_usd": 420450687, "name": "DigiByte", "shortcut": "DGB", "t1_enabled": "yes", @@ -433,6 +136,7 @@ "Github": "https://github.com/carsenk/denarius", "Homepage": "https://denarius.io" }, + "marketcap_usd": 0, "name": "Denarius", "shortcut": "DNR", "t1_enabled": "no", @@ -445,7 +149,7 @@ "Github": "https://github.com/dogecoin/dogecoin", "Homepage": "http://dogecoin.com" }, - "marketcap_usd": 416955600, + "marketcap_usd": 387724656, "name": "Dogecoin", "shortcut": "DOGE", "t1_enabled": "yes", @@ -460,7 +164,7 @@ "Github": "https://github.com/fujicoin/fujicoin", "Homepage": "http://fujicoin.org" }, - "marketcap_usd": 871352, + "marketcap_usd": 728345, "name": "Fujicoin", "shortcut": "FJC", "t1_enabled": "yes", @@ -475,7 +179,7 @@ "Github": "https://github.com/flash-coin", "Homepage": "https://www.flashcoin.io" }, - "marketcap_usd": 6262092, + "marketcap_usd": 11828430, "name": "Flashcoin", "shortcut": "FLASH", "t1_enabled": "no", @@ -488,7 +192,7 @@ "Github": "https://github.com/FeatherCoin/Feathercoin", "Homepage": "https://feathercoin.com" }, - "marketcap_usd": 21594346, + "marketcap_usd": 17325381, "name": "Feathercoin", "shortcut": "FTC", "t1_enabled": "no", @@ -501,7 +205,7 @@ "Github": "https://github.com/Groestlcoin/groestlcoin", "Homepage": "https://www.groestlcoin.org" }, - "marketcap_usd": 46522748, + "marketcap_usd": 45013544, "name": "Groestlcoin", "shortcut": "GRS", "t1_enabled": "yes", @@ -516,6 +220,7 @@ "Github": "https://github.com/KotoDevelopers/koto", "Homepage": "https://ko-to.org" }, + "marketcap_usd": 0, "name": "Koto", "shortcut": "KOTO", "t1_enabled": "no", @@ -528,7 +233,7 @@ "Github": "https://github.com/litecoin-project/litecoin", "Homepage": "https://litecoin.org" }, - "marketcap_usd": 4882514683, + "marketcap_usd": 4762460123, "name": "Litecoin", "shortcut": "LTC", "t1_enabled": "yes", @@ -544,7 +249,7 @@ "Github": "https://github.com/monacoinproject/monacoin", "Homepage": "https://monacoin.org" }, - "marketcap_usd": 136904441, + "marketcap_usd": 132461117, "name": "Monacoin", "shortcut": "MONA", "t1_enabled": "yes", @@ -559,6 +264,7 @@ "Github": "https://github.com/muecoin/MUECore", "Homepage": "https://www.monetaryunit.org" }, + "marketcap_usd": 0, "name": "MUE", "shortcut": "MUE", "t1_enabled": "no", @@ -571,7 +277,7 @@ "Github": "https://github.com/namecoin/namecoin-core", "Homepage": "https://namecoin.org" }, - "marketcap_usd": 13403036, + "marketcap_usd": 30482980, "name": "Namecoin", "shortcut": "NMC", "t1_enabled": "yes", @@ -586,7 +292,7 @@ "Github": "https://github.com/FundacionPesetacoin/PesetacoinCore", "Homepage": "http://pesetacoin.info" }, - "marketcap_usd": 3588805, + "marketcap_usd": 3421001, "name": "Pesetacoin", "shortcut": "PTC", "t1_enabled": "no", @@ -628,6 +334,7 @@ "Github": "https://github.com/BTCGPU/BTCGPU", "Homepage": "https://bitcoingold.org" }, + "marketcap_usd": 0, "name": "Bitcoin Gold Testnet", "shortcut": "TBTG", "t1_enabled": "no", @@ -661,7 +368,9 @@ "t1_enabled": "yes", "t2_enabled": "yes", "type": "coin", - "wallet": {} + "wallet": { + "Trezor": "https://wallet.trezor.io" + } }, "coin:TLTC": { "hidden": 1, @@ -682,7 +391,7 @@ "Github": "https://github.com/terracoin/terracoin", "Homepage": "https://terracoin.io" }, - "marketcap_usd": 1977795, + "marketcap_usd": 2070984, "name": "Terracoin", "shortcut": "TRC", "t1_enabled": "no", @@ -695,7 +404,7 @@ "Github": "https://github.com/viacoin", "Homepage": "https://viacoin.org" }, - "marketcap_usd": 28457309, + "marketcap_usd": 29527200, "name": "Viacoin", "shortcut": "VIA", "t1_enabled": "yes", @@ -710,7 +419,7 @@ "Github": "https://github.com/vertcoin-project/vertcoin-core", "Homepage": "https://vertcoin.org" }, - "marketcap_usd": 48619898, + "marketcap_usd": 53546930, "name": "Vertcoin", "shortcut": "VTC", "t1_enabled": "yes", @@ -725,7 +434,7 @@ "Github": "https://github.com/myriadcoin/myriadcoin", "Homepage": "https://www.myriadcoin.org" }, - "marketcap_usd": 6334174, + "marketcap_usd": 6517125, "name": "Myriad", "shortcut": "XMY", "t1_enabled": "no", @@ -738,7 +447,7 @@ "Github": "https://github.com/zcoinofficial/zcoin", "Homepage": "https://zcoin.io" }, - "marketcap_usd": 94586975, + "marketcap_usd": 83007553, "name": "Zcoin", "shortcut": "XZC", "t1_enabled": "yes", @@ -754,7 +463,7 @@ "Github": "https://github.com/zcash/zcash", "Homepage": "https://z.cash" }, - "marketcap_usd": 855681961, + "marketcap_usd": 954755674, "name": "Zcash", "shortcut": "ZEC", "t1_enabled": "yes", @@ -769,7 +478,7 @@ "Github": "https://github.com/ZencashOfficial/zen", "Homepage": "https://zencash.com" }, - "marketcap_usd": 124100964, + "marketcap_usd": 125906033, "name": "Zencash", "shortcut": "ZEN", "t1_enabled": "no", @@ -910,7 +619,7 @@ "links": { "Homepage": "https://0xbitcoin.org/" }, - "marketcap_usd": 2705930, + "marketcap_usd": 2187389, "name": "0xBitcoin", "network": "eth", "shortcut": "0xBTC", @@ -927,7 +636,7 @@ "links": { "Homepage": "https://firstblood.io" }, - "marketcap_usd": 13464920, + "marketcap_usd": 12785672, "name": "FirstBlood", "network": "eth", "shortcut": "1ST", @@ -1046,7 +755,7 @@ "links": { "Homepage": "http://accelerator.network" }, - "marketcap_usd": 192471, + "marketcap_usd": 228592, "name": "Accelerator Network", "network": "eth", "shortcut": "ACC", @@ -1081,7 +790,7 @@ "Github": "https://github.com/aditus", "Homepage": "https://aditus.net" }, - "marketcap_usd": 1904801, + "marketcap_usd": 1703030, "name": "Aditus", "network": "eth", "shortcut": "ADI", @@ -1116,7 +825,7 @@ "links": { "Homepage": "https://adshares.net" }, - "marketcap_usd": 2202222, + "marketcap_usd": 2070638, "name": "AdShares", "network": "eth", "shortcut": "ADST", @@ -1134,7 +843,7 @@ "Github": "https://github.com/adchain", "Homepage": "https://adtoken.com" }, - "marketcap_usd": 9332100, + "marketcap_usd": 18658200, "name": "AdToken", "network": "eth", "shortcut": "ADT", @@ -1170,7 +879,7 @@ "Github": "https://github.com/aeternity", "Homepage": "https://www.aeternity.com/" }, - "marketcap_usd": 434471331, + "marketcap_usd": 448485182, "name": "aeternity", "network": "eth", "shortcut": "AE", @@ -1188,7 +897,7 @@ "Github": "https://github.com/singnet/singnet", "Homepage": "https://singularitynet.io" }, - "marketcap_usd": 53104928, + "marketcap_usd": 45404870, "name": "SingularityNET", "network": "eth", "shortcut": "AGI", @@ -1206,7 +915,7 @@ "Github": "https://github.com/aionnetwork", "Homepage": "https://aion.network/" }, - "marketcap_usd": 168020932, + "marketcap_usd": 152498011, "name": "Aion", "network": "eth", "shortcut": "AION", @@ -1223,7 +932,7 @@ "links": { "Homepage": "https://airtoken.com" }, - "marketcap_usd": 4410872, + "marketcap_usd": 4683294, "name": "AirToken", "network": "eth", "shortcut": "AIR", @@ -1241,7 +950,7 @@ "Github": "https://github.com/AigangNetwork", "Homepage": "https://aigang.network/" }, - "marketcap_usd": 1771964, + "marketcap_usd": 1420341, "name": "Aigang", "network": "eth", "shortcut": "AIX", @@ -1259,6 +968,7 @@ "Github": "https://github.com/artwook", "Homepage": "https://artwook.com" }, + "marketcap_usd": 0, "name": "ARTWOOK COIN", "network": "eth", "shortcut": "AKC", @@ -1293,7 +1003,7 @@ "Github": "https://github.com/AlisProject", "Homepage": "https://alismedia.jp" }, - "marketcap_usd": 3267287, + "marketcap_usd": 2806230, "name": "ALIS Token", "network": "eth", "shortcut": "ALIS", @@ -1364,7 +1074,7 @@ "Github": "https://github.com/amontech", "Homepage": "https://amon.tech" }, - "marketcap_usd": 1598707, + "marketcap_usd": 1150968, "name": "Amon", "network": "eth", "shortcut": "AMN", @@ -1434,7 +1144,7 @@ "Github": "https://github.com/Oxchild/crowdsale", "Homepage": "https://apisplatform.io" }, - "marketcap_usd": 26951530, + "marketcap_usd": 26916818, "name": "APIS", "network": "eth", "shortcut": "APIS", @@ -1452,7 +1162,7 @@ "Github": "https://github.com/Aptoide/AppCoins-ethereumj", "Homepage": "https://appcoins.io" }, - "marketcap_usd": 18715459, + "marketcap_usd": 17238858, "name": "AppCoins", "network": "eth", "shortcut": "APPC", @@ -1469,7 +1179,7 @@ "links": { "Homepage": "https://aigang.network" }, - "marketcap_usd": 1771964, + "marketcap_usd": 1420341, "name": "AIGang", "network": "eth", "shortcut": "APT", @@ -1504,7 +1214,7 @@ "links": { "Homepage": "https://www.arbitragect.com" }, - "marketcap_usd": 347247, + "marketcap_usd": 254831, "name": "ArbitrageCT", "network": "eth", "shortcut": "ARCT", @@ -1609,7 +1319,7 @@ "links": { "Homepage": "https://airswap.io" }, - "marketcap_usd": 21939300, + "marketcap_usd": 21286200, "name": "Airswap", "network": "eth", "shortcut": "AST", @@ -1979,7 +1689,7 @@ "Github": "https://github.com/thebeetoken", "Homepage": "https://www.beetoken.com" }, - "marketcap_usd": 3704273, + "marketcap_usd": 3439466, "name": "Bee Token", "network": "eth", "shortcut": "BEE", @@ -2033,6 +1743,7 @@ "Github": "https://github.com/bethereumproject", "Homepage": "https://www.bethereum.com/" }, + "marketcap_usd": 0, "name": "Bethereum", "network": "eth", "shortcut": "BETHER", @@ -2102,7 +1813,7 @@ "Github": "https://github.com/BankEx", "Homepage": "https://bankex.com/" }, - "marketcap_usd": 15850616, + "marketcap_usd": 12829167, "name": "BANKEX", "network": "eth", "shortcut": "BKX", @@ -2138,7 +1849,7 @@ "Github": "https://github.com/BlueCrypto", "Homepage": "https://blueprotocol.com/" }, - "marketcap_usd": 3908915, + "marketcap_usd": 2892679, "name": "Ethereum Blue", "network": "eth", "shortcut": "BLUE", @@ -2173,7 +1884,7 @@ "links": { "Homepage": "https://www.iconomi.net" }, - "marketcap_usd": 64416238, + "marketcap_usd": 54548929, "name": "Iconomi", "network": "eth", "shortcut": "BLX (Iconomi)", @@ -2310,7 +2021,7 @@ "Github": "https://github.com/bancorprotocol", "Homepage": "https://www.bancor.network/discover" }, - "marketcap_usd": 113759781, + "marketcap_usd": 114236636, "name": "Bancor", "network": "eth", "shortcut": "BNT", @@ -2361,7 +2072,7 @@ "links": { "Homepage": "https://bonpay.com" }, - "marketcap_usd": 1538450, + "marketcap_usd": 1381380, "name": "Bonpay", "network": "eth", "shortcut": "BON", @@ -2447,7 +2158,7 @@ "links": { "Homepage": "http://bro-consortium.io" }, - "marketcap_usd": 58810, + "marketcap_usd": 63388, "name": "BRAT", "network": "eth", "shortcut": "BRAT", @@ -2465,7 +2176,7 @@ "Github": "https://github.com/breadwallet", "Homepage": "https://token.breadapp.com/en" }, - "marketcap_usd": 35550647, + "marketcap_usd": 33571968, "name": "Bread", "network": "eth", "shortcut": "BRD", @@ -2658,7 +2369,7 @@ "Github": "https://github.com/bytom", "Homepage": "https://bytom.io" }, - "marketcap_usd": 360079695, + "marketcap_usd": 351149431, "name": "Bytom", "network": "eth", "shortcut": "BTM", @@ -2761,7 +2472,7 @@ "Github": "https://github.com/cryptotwenty", "Homepage": "https://crypto20.com" }, - "marketcap_usd": 42852656, + "marketcap_usd": 41436137, "name": "Crypto20's Token", "network": "eth", "shortcut": "C20", @@ -2896,7 +2607,7 @@ "links": { "Homepage": "https://cashaa.com" }, - "marketcap_usd": 14192264, + "marketcap_usd": 14200361, "name": "Cashaa", "network": "eth", "shortcut": "CAS", @@ -2965,6 +2676,7 @@ "Github": "https://github.com/Cubrixio", "Homepage": "https://cubrix.io" }, + "marketcap_usd": 0, "name": "Cubrix", "network": "eth", "shortcut": "CBIX", @@ -3121,6 +2833,7 @@ "Github": "https://github.com/DICE-Money/", "Homepage": "https://dice.money/" }, + "marketcap_usd": 0, "name": "DICE Money Dicet", "network": "eth", "shortcut": "CET", @@ -3137,6 +2850,7 @@ "links": { "Homepage": "https://cryptfillcoin.com" }, + "marketcap_usd": 0, "name": "CryptFillCoin", "network": "eth", "shortcut": "CFC", @@ -3362,7 +3076,7 @@ "links": { "Homepage": "https://cindicator.com" }, - "marketcap_usd": 45655699, + "marketcap_usd": 42645320, "name": "Cindicator", "network": "eth", "shortcut": "CND", @@ -3469,7 +3183,7 @@ "Github": "https://github.com/CoinvestHQ", "Homepage": "https://coinve.st" }, - "marketcap_usd": 125950, + "marketcap_usd": 138539, "name": "Coinvest V2 Token", "network": "eth", "shortcut": "COIN", @@ -3486,7 +3200,7 @@ "links": { "Homepage": "https://covesting.io/" }, - "marketcap_usd": 21379225, + "marketcap_usd": 19758025, "name": "Covesting", "network": "eth", "shortcut": "COV", @@ -3522,7 +3236,7 @@ "Github": "https://github.com/aditus", "Homepage": "https://copytrack.io" }, - "marketcap_usd": 2405879, + "marketcap_usd": 1801050, "name": "COPYTRACK", "network": "eth", "shortcut": "CPY", @@ -3592,7 +3306,7 @@ "links": { "Homepage": "https://bitbounce.io" }, - "marketcap_usd": 16657319, + "marketcap_usd": 14403918, "name": "Credo / Bitbounce", "network": "eth", "shortcut": "CREDO", @@ -3680,6 +3394,7 @@ "Github": "https://github.com/ctgcoin/", "Homepage": "https://www.ctgcoin.org" }, + "marketcap_usd": 0, "name": "Convenient To Go", "network": "eth", "shortcut": "CTGC", @@ -3782,7 +3497,7 @@ "Github": "https://github.com/cargoxio", "Homepage": "https://cargox.io" }, - "marketcap_usd": 4797791, + "marketcap_usd": 4927779, "name": "CargoX", "network": "eth", "shortcut": "CXO", @@ -3799,7 +3514,7 @@ "links": { "Homepage": "https://ccrb.io" }, - "marketcap_usd": 2795928, + "marketcap_usd": 2485047, "name": "CryptoCarbon", "network": "eth", "shortcut": "CryptoCarbon", @@ -3833,7 +3548,7 @@ "links": { "Homepage": "https://dadi.cloud" }, - "marketcap_usd": 8217712, + "marketcap_usd": 6972897, "name": "DADI", "network": "eth", "shortcut": "DADI", @@ -3851,7 +3566,7 @@ "Github": "https://github.com/makerdao", "Homepage": "https://makerdao.com" }, - "marketcap_usd": 54035637, + "marketcap_usd": 54565947, "name": "Dai Stablecoin v1.0", "network": "eth", "shortcut": "DAI", @@ -3868,7 +3583,7 @@ "links": { "Homepage": "http://www.dalecoin.org" }, - "marketcap_usd": 83644, + "marketcap_usd": 86518, "name": "DaleCoin", "network": "eth", "shortcut": "DALC", @@ -3956,7 +3671,7 @@ "Github": "https://github.com/streamr-dev", "Homepage": "https://www.streamr.com" }, - "marketcap_usd": 140182, + "marketcap_usd": 169556, "name": "DATACoin", "network": "eth", "shortcut": "DATACoin", @@ -4045,7 +3760,7 @@ "Github": "https://github.com/DistributedBanking/DCC", "Homepage": "http://dcc.finance" }, - "marketcap_usd": 20519240, + "marketcap_usd": 22593785, "name": "Distributed Credit Chain", "network": "eth", "shortcut": "DCC", @@ -4080,7 +3795,7 @@ "Github": "https://github.com/Dentacoin", "Homepage": "https://dentacoin.com" }, - "marketcap_usd": 123029325, + "marketcap_usd": 121243831, "name": "Dentacoin", "network": "eth", "shortcut": "DCN", @@ -4150,7 +3865,7 @@ "links": { "Homepage": "https://www.dentwireless.com" }, - "marketcap_usd": 35875345, + "marketcap_usd": 31784946, "name": "DENT", "network": "eth", "shortcut": "DENT", @@ -4202,7 +3917,7 @@ "Github": "https://github.com/digipulseio", "Homepage": "https://www.digipulse.io" }, - "marketcap_usd": 3190500, + "marketcap_usd": 3413071, "name": "DigiPulse", "network": "eth", "shortcut": "DGPT", @@ -4220,6 +3935,7 @@ "Github": "https://github.com/dragonglasscom", "Homepage": "https://dragonglass.com/" }, + "marketcap_usd": 0, "name": "Dragonglass", "network": "eth", "shortcut": "DGS", @@ -4237,7 +3953,7 @@ "Github": "https://github.com/DigixGlobal", "Homepage": "https://digix.global" }, - "marketcap_usd": 2032107, + "marketcap_usd": 2000406, "name": "Digix Gold Token", "network": "eth", "shortcut": "DGX", @@ -4255,6 +3971,7 @@ "Github": "https://github.com/DigixGlobal", "Homepage": "https://digix.global" }, + "marketcap_usd": 0, "name": "Digix Gold Token 1.0", "network": "eth", "shortcut": "DGX1", @@ -4271,7 +3988,7 @@ "links": { "Homepage": "https://etheroll.com" }, - "marketcap_usd": 7036071, + "marketcap_usd": 7422700, "name": "Etheroll", "network": "eth", "shortcut": "DICE", @@ -4287,6 +4004,7 @@ "address": "0xc719d010B63E5bbF2C0551872CD5316ED26AcD83", "hidden": 1, "links": {}, + "marketcap_usd": 0, "name": "Decentralized Insurance Protocol", "network": "eth", "shortcut": "DIP", @@ -4459,7 +4177,7 @@ "links": { "Homepage": "https://dropil.com" }, - "marketcap_usd": 109740129, + "marketcap_usd": 114526762, "name": "Dropil", "network": "eth", "shortcut": "DROP (dropil)", @@ -4477,6 +4195,7 @@ "Github": "https://github.com/TeamDriveholic", "Homepage": "https://driveholic.com/" }, + "marketcap_usd": 0, "name": "Driveholic Token", "network": "eth", "shortcut": "DRVH", @@ -4511,7 +4230,7 @@ "Github": "https://github.com/dethertech", "Homepage": "https://dether.io" }, - "marketcap_usd": 2833670, + "marketcap_usd": 2837715, "name": "dether", "network": "eth", "shortcut": "DTH", @@ -4616,7 +4335,7 @@ "Github": "https://github.com/elangindonesia/EagleCoin", "Homepage": "https://eaglepay.io" }, - "marketcap_usd": 184753, + "marketcap_usd": 154096, "name": "EagleCoin", "network": "eth", "shortcut": "EAGLE", @@ -4667,6 +4386,7 @@ "links": { "Homepage": "https://ecryptotokens.com" }, + "marketcap_usd": 0, "name": "ECRYPTO COIN", "network": "eth", "shortcut": "ECP", @@ -4700,7 +4420,7 @@ "links": { "Homepage": "https://edgeless.io" }, - "marketcap_usd": 33942785, + "marketcap_usd": 32409395, "name": "Edgeless", "network": "eth", "shortcut": "EDG", @@ -4717,7 +4437,7 @@ "links": { "Homepage": "https://eidoo.io" }, - "marketcap_usd": 28004213, + "marketcap_usd": 26001179, "name": "Eidoo", "network": "eth", "shortcut": "EDO", @@ -4806,7 +4526,7 @@ "Github": "https://github.com/eltcoin", "Homepage": "http://www.eltcoin.tech/" }, - "marketcap_usd": 335480, + "marketcap_usd": 334662, "name": "ELTCOIN", "network": "eth", "shortcut": "ELTCOIN", @@ -4824,6 +4544,7 @@ "Github": "https://github.com/Elysian-ELY", "Homepage": "https://elycoin.io" }, + "marketcap_usd": 0, "name": "ELYCOIN", "network": "eth", "shortcut": "ELY", @@ -4982,7 +4703,7 @@ "links": { "Homepage": "https://eos.io" }, - "marketcap_usd": 7453167788, + "marketcap_usd": 7308090147, "name": "EOS", "network": "eth", "shortcut": "EOS", @@ -5035,7 +4756,7 @@ "links": { "Homepage": "https://www.ethbits.com" }, - "marketcap_usd": 1559890, + "marketcap_usd": 1984761, "name": "Ethbits", "network": "eth", "shortcut": "ETBS", @@ -5193,6 +4914,7 @@ "Github": "https://github.com/eRupee", "Homepage": "https://erupee.wordpress.com" }, + "marketcap_usd": 0, "name": "eRupee", "network": "eth", "shortcut": "E\u20b9", @@ -5227,6 +4949,7 @@ "links": { "Homepage": "https://tokensale.fanfare.global" }, + "marketcap_usd": 0, "name": "Fan Token", "network": "eth", "shortcut": "FAN", @@ -5365,7 +5088,7 @@ "Github": "https://github.com/FundRequest", "Homepage": "https://fundrequest.io" }, - "marketcap_usd": 1330223, + "marketcap_usd": 1189807, "name": "FundRequest", "network": "eth", "shortcut": "FND", @@ -5469,7 +5192,7 @@ "links": { "Homepage": "https://funfair.io" }, - "marketcap_usd": 131098821, + "marketcap_usd": 124880359, "name": "Funfair", "network": "eth", "shortcut": "FUN", @@ -5487,6 +5210,7 @@ "Github": "https://github.com/futuraxproject", "Homepage": "https://futurax.global" }, + "marketcap_usd": 0, "name": "FUTURAX", "network": "eth", "shortcut": "FXC", @@ -5521,7 +5245,7 @@ "Github": "https://github.com/BlockchainLabsNZ/gambit", "Homepage": "http://gambitcrypto.com" }, - "marketcap_usd": 6448988, + "marketcap_usd": 5882833, "name": "Gambit", "network": "eth", "shortcut": "GAM", @@ -5644,7 +5368,7 @@ "Github": "https://github.com/daostack", "Homepage": "https://daostack.io" }, - "marketcap_usd": 7090810, + "marketcap_usd": 5478091, "name": "DAOstack", "network": "eth", "shortcut": "GEN", @@ -5749,7 +5473,7 @@ "links": { "Homepage": "https://golem.network" }, - "marketcap_usd": 298260952, + "marketcap_usd": 279952859, "name": "Golem", "network": "eth", "shortcut": "GNT", @@ -5784,7 +5508,7 @@ "links": { "Homepage": "https://gridplus.io/token-sale" }, - "marketcap_usd": 12329479, + "marketcap_usd": 12753939, "name": "GRID", "network": "eth", "shortcut": "GRID", @@ -5819,6 +5543,7 @@ "links": { "Homepage": "https://www.gse.network" }, + "marketcap_usd": 0, "name": "GSENetwork", "network": "eth", "shortcut": "GSE", @@ -5872,7 +5597,7 @@ "Github": "https://github.com/GIFTO-io", "Homepage": "https://gifto.io/" }, - "marketcap_usd": 90430369, + "marketcap_usd": 80119750, "name": "Gifto", "network": "eth", "shortcut": "GTO", @@ -5890,7 +5615,7 @@ "Github": "https://github.com/GenesisVision", "Homepage": "https://genesis.vision" }, - "marketcap_usd": 33487213, + "marketcap_usd": 31044868, "name": "Genesis Vision", "network": "eth", "shortcut": "GVT", @@ -5995,7 +5720,7 @@ "Github": "https://github.com/havven/havven", "Homepage": "https://havven.io" }, - "marketcap_usd": 13898422, + "marketcap_usd": 13299230, "name": "Havven", "network": "eth", "shortcut": "HAV", @@ -6117,7 +5842,7 @@ "links": { "Homepage": "https://github.com/arachnid/hodlcoin" }, - "marketcap_usd": 245622, + "marketcap_usd": 299502, "name": "HODLCoin", "network": "eth", "shortcut": "HODL", @@ -6170,7 +5895,7 @@ "Github": "https://github.com/HiveProjectLTD", "Homepage": "https://hive-project.net" }, - "marketcap_usd": 16531725, + "marketcap_usd": 20154450, "name": "Hive Project", "network": "eth", "shortcut": "HVN", @@ -6224,6 +5949,7 @@ "Github": "https://github.com/HEDPAY", "Homepage": "http://hedpay.com" }, + "marketcap_usd": 0, "name": "HEdpAY", "network": "eth", "shortcut": "Hdp.\u0444", @@ -6308,7 +6034,7 @@ "links": { "Homepage": "https://icos.icobox.io" }, - "marketcap_usd": 4524391, + "marketcap_usd": 4096363, "name": "ICOS", "network": "eth", "shortcut": "ICOS", @@ -6325,7 +6051,7 @@ "links": { "Homepage": "https://www.icon.foundation" }, - "marketcap_usd": 534678495, + "marketcap_usd": 493141981, "name": "ICON", "network": "eth", "shortcut": "ICX", @@ -6359,7 +6085,7 @@ "links": { "Homepage": "https://investfeed.com" }, - "marketcap_usd": 5524354, + "marketcap_usd": 4316662, "name": "InvestFeed", "network": "eth", "shortcut": "IFT", @@ -6494,7 +6220,7 @@ "links": { "Homepage": "https://insights.network" }, - "marketcap_usd": 2461524, + "marketcap_usd": 2851298, "name": "Insights Network", "network": "eth", "shortcut": "INSTAR", @@ -6511,7 +6237,7 @@ "links": { "Homepage": "https://internxt.io" }, - "marketcap_usd": 2717546, + "marketcap_usd": 2494494, "name": "Internxt", "network": "eth", "shortcut": "INXT", @@ -6528,7 +6254,7 @@ "links": { "Homepage": "https://iost.io/" }, - "marketcap_usd": 197232840, + "marketcap_usd": 221739000, "name": "IOSToken", "network": "eth", "shortcut": "IOST", @@ -6599,7 +6325,7 @@ "Github": "https://github.com/IoTChainCode", "Homepage": "https://iotchain.io/" }, - "marketcap_usd": 28559882, + "marketcap_usd": 26750163, "name": "IoT Chain", "network": "eth", "shortcut": "ITC", @@ -6789,7 +6515,7 @@ "Github": "https://github.com/kikinteractive/kin-token", "Homepage": "https://kin.kik.com" }, - "marketcap_usd": 154172829, + "marketcap_usd": 132768463, "name": "Kin Foundation", "network": "eth", "shortcut": "KIN", @@ -6807,7 +6533,7 @@ "Github": "https://github.com/KyberNetwork", "Homepage": "https://kyber.network" }, - "marketcap_usd": 130595886, + "marketcap_usd": 119484736, "name": "Kyber Network", "network": "eth", "shortcut": "KNC", @@ -6843,7 +6569,7 @@ "Github": "https://github.com/Cryptense/", "Homepage": "https://kryll.io/" }, - "marketcap_usd": 0, + "marketcap_usd": 705990, "name": "Kryll", "network": "eth", "shortcut": "KRL", @@ -6878,7 +6604,7 @@ "Github": "https://github.com/latoken", "Homepage": "https://latoken.com/" }, - "marketcap_usd": 9876825, + "marketcap_usd": 8879580, "name": "LATOKEN", "network": "eth", "shortcut": "LA", @@ -6912,7 +6638,7 @@ "links": { "Homepage": "https://www.leadcoin.network/" }, - "marketcap_usd": 2998242, + "marketcap_usd": 2555566, "name": "LEADCOIN", "network": "eth", "shortcut": "LDC", @@ -7014,7 +6740,7 @@ "links": { "Homepage": "http://www.lifelabs.io" }, - "marketcap_usd": 12067076, + "marketcap_usd": 2645178, "name": "LIFE", "network": "eth", "shortcut": "LIFE", @@ -7102,7 +6828,7 @@ "Github": "https://github.com/linkercoinfoundation", "Homepage": "https://www.linkercoin.com/en" }, - "marketcap_usd": 4045247, + "marketcap_usd": 4110499, "name": "Linker Coin", "network": "eth", "shortcut": "LNC-Linker Coin", @@ -7120,7 +6846,7 @@ "Github": "https://github.com/lendingblock", "Homepage": "https://lendingblock.com" }, - "marketcap_usd": 3214106, + "marketcap_usd": 3206403, "name": "Lendingblock", "network": "eth", "shortcut": "LND", @@ -7137,7 +6863,7 @@ "links": { "Homepage": "https://LockChain.co" }, - "marketcap_usd": 8593382, + "marketcap_usd": 8149690, "name": "LockChain", "network": "eth", "shortcut": "LOC", @@ -7155,7 +6881,7 @@ "Github": "http://github.com/locipro/loci-coin-sale", "Homepage": "https://locipro.com" }, - "marketcap_usd": 3584621, + "marketcap_usd": 4748632, "name": "LOCIcoin", "network": "eth", "shortcut": "LOCI", @@ -7206,6 +6932,7 @@ "links": { "Homepage": "https://lookrev.com" }, + "marketcap_usd": 0, "name": "LookRev", "network": "eth", "shortcut": "LOOK", @@ -7241,6 +6968,7 @@ "links": { "Github": "https://github.com/GNSPS" }, + "marketcap_usd": 0, "name": "Love", "network": "eth", "shortcut": "LOVE", @@ -7468,7 +7196,7 @@ "Github": "https://github.com/theembermine", "Homepage": "https://embermine.com/" }, - "marketcap_usd": 408689, + "marketcap_usd": 389738, "name": "Embers", "network": "eth", "shortcut": "MBRS", @@ -7484,7 +7212,7 @@ "address": "0x93E682107d1E9defB0b5ee701C71707a4B2E46Bc", "hidden": 1, "links": {}, - "marketcap_usd": 352675, + "marketcap_usd": 325138, "name": "MCAP", "network": "eth", "shortcut": "MCAP", @@ -7502,7 +7230,7 @@ "Github": "https://github.com/musiconomi/", "Homepage": "https://musiconomi.com/" }, - "marketcap_usd": 672488, + "marketcap_usd": 636259, "name": "Musiconomi", "network": "eth", "shortcut": "MCI", @@ -7608,6 +7336,7 @@ "Github": "https://github.com/MainframeHQ", "Homepage": "https://mainframe.com" }, + "marketcap_usd": 0, "name": "Mainframe Token", "network": "eth", "shortcut": "MFT", @@ -7781,7 +7510,7 @@ "Github": "https://github.com/modum-io", "Homepage": "https://modum.io" }, - "marketcap_usd": 18276794, + "marketcap_usd": 17985321, "name": "Modum", "network": "eth", "shortcut": "MOD", @@ -7850,7 +7579,7 @@ "links": { "Homepage": "https://mothership.cx" }, - "marketcap_usd": 20596100, + "marketcap_usd": 19547360, "name": "Mothership", "network": "eth", "shortcut": "MSP", @@ -7885,7 +7614,7 @@ "links": { "Homepage": "http://www.monetha.io" }, - "marketcap_usd": 8560130, + "marketcap_usd": 7667625, "name": "Monetha", "network": "eth", "shortcut": "MTH", @@ -8005,7 +7734,7 @@ "Github": "https://github.com/Merculet", "Homepage": "https://www.merculet.io" }, - "marketcap_usd": 10808521, + "marketcap_usd": 8246033, "name": "Merculet", "network": "eth", "shortcut": "MVP", @@ -8055,7 +7784,7 @@ "links": { "Homepage": "https://mysterium.network" }, - "marketcap_usd": 5295629, + "marketcap_usd": 4098996, "name": "Mysterium", "network": "eth", "shortcut": "MYST", @@ -8090,7 +7819,7 @@ "Github": "https://github.com/NANJ-COIN", "Homepage": "https://nanjcoin.com/" }, - "marketcap_usd": 26021992, + "marketcap_usd": 26179985, "name": "NANJCOIN", "network": "eth", "shortcut": "NANJ", @@ -8144,7 +7873,7 @@ "Github": "https://github.com/polyswarm", "Homepage": "https://polyswarm.io" }, - "marketcap_usd": 26369273, + "marketcap_usd": 28280604, "name": "Nectar", "network": "eth", "shortcut": "NCT", @@ -8161,7 +7890,7 @@ "links": { "Homepage": "https://neverdie.com" }, - "marketcap_usd": 761362, + "marketcap_usd": 719747, "name": "Neverdie", "network": "eth", "shortcut": "NDC", @@ -8303,7 +8032,7 @@ "Github": "https://github.com/NperProject", "Homepage": "https://nper.io" }, - "marketcap_usd": 4147411, + "marketcap_usd": 3789178, "name": "NPER", "network": "eth", "shortcut": "NPER", @@ -8338,7 +8067,7 @@ "links": { "Homepage": "https://nuls.io" }, - "marketcap_usd": 91802000, + "marketcap_usd": 98932000, "name": "NULS", "network": "eth", "shortcut": "NULS", @@ -8389,7 +8118,7 @@ "links": { "Homepage": "https://beyond-the-void.net" }, - "marketcap_usd": 5732797, + "marketcap_usd": 3208501, "name": "Nexium", "network": "eth", "shortcut": "NxC", @@ -8423,7 +8152,7 @@ "links": { "Homepage": "https://www.openanx.org/en" }, - "marketcap_usd": 8558190, + "marketcap_usd": 8103447, "name": "OAX", "network": "eth", "shortcut": "OAX", @@ -8495,6 +8224,7 @@ "Github": "https://github.com/Oneledger", "Homepage": "https://oneledger.io" }, + "marketcap_usd": 0, "name": "OneLedger Token", "network": "eth", "shortcut": "OLT", @@ -8530,6 +8260,7 @@ "Github": "https://github.com/OTCMAKER/OMT", "Homepage": "https://www.otcmaker.com" }, + "marketcap_usd": 0, "name": "OTCMAKER Token", "network": "eth", "shortcut": "OMT", @@ -8599,7 +8330,7 @@ "Github": "https://github.com/OpenSTFoundation", "Homepage": "https://simpletoken.org" }, - "marketcap_usd": 23833953, + "marketcap_usd": 20921770, "name": "Simple Token 'OST'", "network": "eth", "shortcut": "OST", @@ -8617,6 +8348,7 @@ "Github": "https://github.com/owndata", "Homepage": "https://owndata.network" }, + "marketcap_usd": 0, "name": "OWNDATA", "network": "eth", "shortcut": "OWN", @@ -8652,7 +8384,7 @@ "Github": "https://github.com/policypalnet", "Homepage": "https://www.policypal.network" }, - "marketcap_usd": 6698811, + "marketcap_usd": 5838102, "name": "PolicyPal Network", "network": "eth", "shortcut": "PAL", @@ -8740,7 +8472,7 @@ "links": { "Homepage": "http://www.tenx.tech" }, - "marketcap_usd": 112479647, + "marketcap_usd": 95669125, "name": "TenX", "network": "eth", "shortcut": "PAY", @@ -8809,7 +8541,7 @@ "Github": "https://github.com/PeculiumPCL/Peculium", "Homepage": "https://peculium.io" }, - "marketcap_usd": 3421686, + "marketcap_usd": 3059219, "name": "Peculium", "network": "eth", "shortcut": "PCL", @@ -8948,7 +8680,7 @@ "links": { "Homepage": "https://polybius.io" }, - "marketcap_usd": 11740266, + "marketcap_usd": 10872599, "name": "Polybius", "network": "eth", "shortcut": "PLBT", @@ -8984,6 +8716,7 @@ "Github": "https://github.com/bitsuperlab", "Homepage": "https://dacplay.org" }, + "marketcap_usd": 0, "name": "DACPLAY Token", "network": "eth", "shortcut": "PLS", @@ -9051,7 +8784,7 @@ "links": { "Homepage": "https://polymath.network" }, - "marketcap_usd": 109202251, + "marketcap_usd": 101096231, "name": "Polymath Network", "network": "eth", "shortcut": "POLY", @@ -9086,7 +8819,7 @@ "Github": "https://github.com/PoSToken", "Homepage": "https://postoken.org" }, - "marketcap_usd": 59276, + "marketcap_usd": 57612, "name": "PoSToken", "network": "eth", "shortcut": "POS", @@ -9120,7 +8853,7 @@ "links": { "Homepage": "https://www.paypie.com" }, - "marketcap_usd": 19913850, + "marketcap_usd": 19054283, "name": "PayPie", "network": "eth", "shortcut": "PPP", @@ -9137,7 +8870,7 @@ "links": { "Homepage": "https://populous.co" }, - "marketcap_usd": 246779855, + "marketcap_usd": 206288939, "name": "Populous", "network": "eth", "shortcut": "PPT", @@ -9154,7 +8887,7 @@ "links": { "Homepage": "https://presearch.io" }, - "marketcap_usd": 19461645, + "marketcap_usd": 16088845, "name": "Presearch", "network": "eth", "shortcut": "PRE", @@ -9207,7 +8940,7 @@ "links": { "Homepage": "https://propy.com" }, - "marketcap_usd": 12734679, + "marketcap_usd": 13249565, "name": "Propy", "network": "eth", "shortcut": "PRO", @@ -9366,6 +9099,7 @@ "Github": "https://github.com/seanyc99/PureCarbon-Smart-Contract", "Homepage": "https://purecarbon.io" }, + "marketcap_usd": 0, "name": "PureCarbon", "network": "eth", "shortcut": "PURC", @@ -9399,7 +9133,7 @@ "links": { "Homepage": "https://liquid.plus" }, - "marketcap_usd": 93416050, + "marketcap_usd": 87768100, "name": "QASH", "network": "eth", "shortcut": "QASH", @@ -9452,6 +9186,7 @@ "Github": "https://github.com/quantnetwork", "Homepage": "https://www.quant.network/" }, + "marketcap_usd": 0, "name": "Quant", "network": "eth", "shortcut": "QNT", @@ -9540,7 +9275,7 @@ "Github": "https://github.com/qtumproject", "Homepage": "https://qtum.org/" }, - "marketcap_usd": 727523386, + "marketcap_usd": 683754148, "name": "Qtum", "network": "eth", "shortcut": "QTUM", @@ -9594,7 +9329,7 @@ "Github": "https://github.com/ripio/rcn-token", "Homepage": "https://ripiocredit.network" }, - "marketcap_usd": 21633782, + "marketcap_usd": 21481540, "name": "Ripio Credit Network", "network": "eth", "shortcut": "RCN", @@ -9645,7 +9380,7 @@ "links": { "Homepage": "https://www.rebellious.io" }, - "marketcap_usd": 5569683, + "marketcap_usd": 4840875, "name": "Rebellious", "network": "eth", "shortcut": "REBL", @@ -9663,7 +9398,7 @@ "Github": "https://github.com/red", "Homepage": "https://ico.red-lang.org" }, - "marketcap_usd": 5504109, + "marketcap_usd": 4464525, "name": "Red Community Token", "network": "eth", "shortcut": "RED", @@ -9698,7 +9433,7 @@ "links": { "Homepage": "https://request.network" }, - "marketcap_usd": 52258532, + "marketcap_usd": 45535674, "name": "Request Network", "network": "eth", "shortcut": "REQ", @@ -9733,7 +9468,7 @@ "links": { "Homepage": "https://refereum.com" }, - "marketcap_usd": 8663797, + "marketcap_usd": 29443554, "name": "Refereum", "network": "eth", "shortcut": "RFR", @@ -9750,6 +9485,7 @@ "links": { "Homepage": "https://www.evolution.land/" }, + "marketcap_usd": 0, "name": "Evolution Land Global Token", "network": "eth", "shortcut": "RING", @@ -9784,7 +9520,7 @@ "links": { "Homepage": "http://crowdsale.iex.ec" }, - "marketcap_usd": 62044616, + "marketcap_usd": 49338502, "name": "IEx.ec", "network": "eth", "shortcut": "RLC", @@ -9871,7 +9607,7 @@ "Github": "https://github.com/rocketico", "Homepage": "https://rocketico.io" }, - "marketcap_usd": 28384640, + "marketcap_usd": 30374858, "name": "Rocket Token", "network": "eth", "shortcut": "ROCK", @@ -9973,7 +9709,7 @@ "links": { "Homepage": "https://rivetzintl.com" }, - "marketcap_usd": 6306808, + "marketcap_usd": 4189221, "name": "Rivetz", "network": "eth", "shortcut": "RVT", @@ -10024,7 +9760,7 @@ "links": { "Homepage": "https://saltlending.com" }, - "marketcap_usd": 78529601, + "marketcap_usd": 69113519, "name": "Salt Lending Token", "network": "eth", "shortcut": "SALT", @@ -10041,7 +9777,7 @@ "links": { "Homepage": "https://santiment.net" }, - "marketcap_usd": 65615434, + "marketcap_usd": 60746661, "name": "Santiment", "network": "eth", "shortcut": "SAN", @@ -10092,7 +9828,7 @@ "links": { "Homepage": "https://sensay.it" }, - "marketcap_usd": 3573944, + "marketcap_usd": 2343238, "name": "Sensay", "network": "eth", "shortcut": "SENSE", @@ -10265,7 +10001,7 @@ "links": { "Homepage": "http://smartlands.io" }, - "marketcap_usd": 11415141, + "marketcap_usd": 8767215, "name": "Smartlands", "network": "eth", "shortcut": "SLT", @@ -10283,6 +10019,7 @@ "Github": "https://github.com/SELFLLERY", "Homepage": "https://selfllery.com/" }, + "marketcap_usd": 0, "name": "Selfllery", "network": "eth", "shortcut": "SLY", @@ -10369,7 +10106,7 @@ "links": { "Homepage": "https://singulardtv.com" }, - "marketcap_usd": 22837140, + "marketcap_usd": 20330100, "name": "SingularDTV", "network": "eth", "shortcut": "SNGLS", @@ -10472,7 +10209,7 @@ "links": { "Homepage": "https://spankchain.com" }, - "marketcap_usd": 21826866, + "marketcap_usd": 19072438, "name": "SpankChain", "network": "eth", "shortcut": "SPANK", @@ -10592,6 +10329,7 @@ "links": { "Homepage": "https://stabitcoin.com/" }, + "marketcap_usd": 0, "name": "StabitCoin", "network": "eth", "shortcut": "STABIT", @@ -10660,7 +10398,7 @@ "links": { "Homepage": "https://stktoken.com" }, - "marketcap_usd": 9916006, + "marketcap_usd": 9107909, "name": "STK Token", "network": "eth", "shortcut": "STK", @@ -10695,7 +10433,7 @@ "Github": "https://github.com/Storj", "Homepage": "https://storj.io" }, - "marketcap_usd": 65827490, + "marketcap_usd": 66918951, "name": "STORJ", "network": "eth", "shortcut": "STORJ", @@ -10712,7 +10450,7 @@ "links": { "Homepage": "https://www.stormtoken.com" }, - "marketcap_usd": 81414359, + "marketcap_usd": 72848235, "name": "Storm Token", "network": "eth", "shortcut": "STORM", @@ -10748,7 +10486,7 @@ "Github": "https://github.com/Storiqa/", "Homepage": "https://storiqa.com" }, - "marketcap_usd": 35245408, + "marketcap_usd": 26198882, "name": "Storiqa", "network": "eth", "shortcut": "STQ", @@ -10801,7 +10539,7 @@ "links": { "Homepage": "https://substratum.net" }, - "marketcap_usd": 97397261, + "marketcap_usd": 76760473, "name": "Substratum", "network": "eth", "shortcut": "SUB", @@ -10993,7 +10731,7 @@ "Github": "https://github.com/telcoin", "Homepage": "https://www.telco.in" }, - "marketcap_usd": 33094830, + "marketcap_usd": 28849900, "name": "Telcoin", "network": "eth", "shortcut": "TEL", @@ -11011,7 +10749,7 @@ "Github": "https://github.com/TrueFlip", "Homepage": "https://trueflip.io" }, - "marketcap_usd": 4312239, + "marketcap_usd": 4090098, "name": "TrueFlip", "network": "eth", "shortcut": "TFL", @@ -11028,7 +10766,7 @@ "links": { "Homepage": "https://www.thetatoken.org/" }, - "marketcap_usd": 89963068, + "marketcap_usd": 86247309, "name": "Theta Token", "network": "eth", "shortcut": "THETA", @@ -11049,7 +10787,265 @@ "marketcap_usd": 0, "name": "THUG", "network": "eth", - "shortcut": "THUG", + "shortcut": "THUG", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "erc20:eth:TIME": { + "address": "0x6531f133e6DeeBe7F2dcE5A0441aA7ef330B4e53", + "links": { + "Homepage": "https://chronobank.io" + }, + "marketcap_usd": 8070858, + "name": "Chronobank", + "network": "eth", + "shortcut": "TIME", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "erc20:eth:TIO": { + "address": "0x80BC5512561c7f85A3A9508c7df7901b370Fa1DF", + "links": { + "Homepage": "https://trade.io" + }, + "marketcap_usd": 0, + "name": "TIO", + "network": "eth", + "shortcut": "TIO", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "erc20:eth:TIX": { + "address": "0xEa1f346faF023F974Eb5adaf088BbCdf02d761F4", + "links": { + "Homepage": "https://www.blocktix.io" + }, + "marketcap_usd": 10202800, + "name": "Blocktix", + "network": "eth", + "shortcut": "TIX", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "erc20:eth:TKN": { + "address": "0xaAAf91D9b90dF800Df4F55c205fd6989c977E73a", + "links": { + "Homepage": "https://etherscan.io/token/TokenCard" + }, + "marketcap_usd": 18520799, + "name": "TokenCard", + "network": "eth", + "shortcut": "TKN", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "erc20:eth:TNT": { + "address": "0x08f5a9235B08173b7569F83645d2c7fB55e8cCD8", + "links": { + "Github": "https://github.com/tierion", + "Homepage": "https://tierion.com" + }, + "marketcap_usd": 0, + "name": "Tierion Network Token", + "network": "eth", + "shortcut": "TNT", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "erc20:eth:TOOR": { + "address": "0x8eb965ee9cCFBCE76c0a06264492c0afEfc2826d", + "links": { + "Github": "https://github.com/toorister/toorcoin", + "Homepage": "https://www.toorcoin.com" + }, + "marketcap_usd": 0, + "name": "ToorCoin", + "network": "eth", + "shortcut": "TOOR", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "erc20:eth:TRC": { + "address": "0xcB3F902bf97626391bF8bA87264bbC3DC13469be", + "hidden": 1, + "links": {}, + "marketcap_usd": 0, + "name": "The Real Coin", + "network": "eth", + "shortcut": "TRC", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "erc20:eth:TRCN": { + "address": "0x566Fd7999B1Fc3988022bD38507A48F0bCf22c77", + "links": { + "Homepage": "http://www.therealcoinz.com" + }, + "marketcap_usd": 0, + "name": "The Real Coin", + "network": "eth", + "shortcut": "TRCN", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "erc20:eth:TRST": { + "address": "0xCb94be6f13A1182E4A4B6140cb7bf2025d28e41B", + "links": { + "Github": "https://github.com/WeTrustPlatform", + "Homepage": "https://www.wetrust.io" + }, + "marketcap_usd": 0, + "name": "TRST", + "network": "eth", + "shortcut": "TRST", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "erc20:eth:TRX": { + "address": "0xf230b790E05390FC8295F4d3F60332c93BEd42e2", + "links": { + "Homepage": "https://tronlab.com/en.html" + }, + "marketcap_usd": 0, + "name": "Tron Lab Token", + "network": "eth", + "shortcut": "TRX", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "erc20:eth:TWN": { + "address": "0x2eF1aB8a26187C58BB8aAeB11B2fC6D25C5c0716", + "links": { + "Homepage": "https://ico.theworldnews.net" + }, + "marketcap_usd": 0, + "name": "The World News", + "network": "eth", + "shortcut": "TWN", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "erc20:eth:TWNKL": { + "address": "0xfbd0d1c77B501796A35D86cF91d65D9778EeE695", + "links": { + "Homepage": "https://www.rainbowcurrency.com/" + }, + "marketcap_usd": 0, + "name": "Twinkle", + "network": "eth", + "shortcut": "TWNKL", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "erc20:eth:TaaS": { + "address": "0xE7775A6e9Bcf904eb39DA2b68c5efb4F9360e08C", + "links": { + "Homepage": "https://taas.fund" + }, + "marketcap_usd": 15739703, + "name": "Token-as-a-Service", + "network": "eth", + "shortcut": "TaaS", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "erc20:eth:UKG": { + "address": "0x24692791Bc444c5Cd0b81e3CBCaba4b04Acd1F3B", + "links": { + "Github": "https://github.com/unikoingold/UnikoinGold-UKG-Contract", + "Homepage": "https://unikoingold.com" + }, + "marketcap_usd": 0, + "name": "UnikoinGold", + "network": "eth", + "shortcut": "UKG", + "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": 9677610, + "name": "Uquid Coin", + "network": "eth", + "shortcut": "UQC", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11058,15 +11054,14 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:TIME": { - "address": "0x6531f133e6DeeBe7F2dcE5A0441aA7ef330B4e53", - "links": { - "Homepage": "https://chronobank.io" - }, - "marketcap_usd": 7932457, - "name": "Chronobank", + "erc20:eth:USDM": { + "address": "0xD760ADdFb24D9C01Fe4Bfea7475C5e3636684058", + "hidden": 1, + "links": {}, + "marketcap_usd": 0, + "name": "Mether (USDM)", "network": "eth", - "shortcut": "TIME", + "shortcut": "USDM", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11075,15 +11070,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:TIO": { - "address": "0x80BC5512561c7f85A3A9508c7df7901b370Fa1DF", + "erc20:eth:USDT": { + "address": "0xdAC17F958D2ee523a2206206994597C13D831ec7", "links": { - "Homepage": "https://trade.io" + "Homepage": "https://tether.to" }, "marketcap_usd": 0, - "name": "TIO", + "name": "USD Tether (erc20)", "network": "eth", - "shortcut": "TIO", + "shortcut": "USDT", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11092,15 +11087,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:TIX": { - "address": "0xEa1f346faF023F974Eb5adaf088BbCdf02d761F4", + "erc20:eth:UTK": { + "address": "0x70a72833d6bF7F508C8224CE59ea1Ef3d0Ea3A38", "links": { - "Homepage": "https://www.blocktix.io" + "Homepage": "https://utrust.io" }, - "marketcap_usd": 10873640, - "name": "Blocktix", + "marketcap_usd": 0, + "name": "UTK", "network": "eth", - "shortcut": "TIX", + "shortcut": "UTK", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11109,15 +11104,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:TKN": { - "address": "0xaAAf91D9b90dF800Df4F55c205fd6989c977E73a", + "erc20:eth:UTN-P": { + "address": "0x9e3319636e2126e3c0bc9e3134AEC5e1508A46c7", "links": { - "Homepage": "https://etherscan.io/token/TokenCard" + "Github": "https://github.com/UniversaBlockchain/universa", + "Homepage": "https://www.universa.io/" }, - "marketcap_usd": 21155308, - "name": "TokenCard", + "marketcap_usd": 19633367, + "name": "Universa", "network": "eth", - "shortcut": "TKN", + "shortcut": "UTN-P", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11126,16 +11122,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:TNT": { - "address": "0x08f5a9235B08173b7569F83645d2c7fB55e8cCD8", + "erc20:eth:UUU": { + "address": "0x3543638eD4a9006E4840B105944271Bcea15605D", "links": { - "Github": "https://github.com/tierion", - "Homepage": "https://tierion.com" + "Homepage": "https://u.network/" }, "marketcap_usd": 0, - "name": "Tierion Network Token", + "name": "U Networks", "network": "eth", - "shortcut": "TNT", + "shortcut": "UUU", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11144,48 +11139,50 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:TOOR": { - "address": "0x8eb965ee9cCFBCE76c0a06264492c0afEfc2826d", - "links": { - "Github": "https://github.com/toorister/toorcoin", - "Homepage": "https://www.toorcoin.com" - }, - "name": "ToorCoin", + "erc20:eth:Unicorn": { + "address": "0x89205A3A3b2A69De6Dbf7f01ED13B2108B2c43e7", + "hidden": 1, + "links": {}, + "marketcap_usd": 0, + "name": "Unicorn", "network": "eth", - "shortcut": "TOOR", - "t1_enabled": "soon", - "t2_enabled": "soon", + "shortcut": "Unicorn", + "t1_enabled": "yes", + "t2_enabled": "yes", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:TRC": { - "address": "0xcB3F902bf97626391bF8bA87264bbC3DC13469be", - "hidden": 1, - "links": {}, + "erc20:eth:VDG": { + "address": "0x57C75ECCc8557136D32619a191fBCDc88560d711", + "links": { + "Github": "https://github.com/VeriDocGlobal", + "Homepage": "https://www.veridocglobal.com/" + }, "marketcap_usd": 0, - "name": "The Real Coin", + "name": "VeriDocGlobal", "network": "eth", - "shortcut": "TRC", - "t1_enabled": "yes", - "t2_enabled": "yes", + "shortcut": "VDG", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:TRCN": { - "address": "0x566Fd7999B1Fc3988022bD38507A48F0bCf22c77", + "erc20:eth:VDOC": { + "address": "0x82BD526bDB718C6d4DD2291Ed013A5186cAE2DCa", "links": { - "Homepage": "http://www.therealcoinz.com" + "Github": "https://github.com/BlueBikeSolutions", + "Homepage": "https://www.dutyof.care/token-launch/" }, "marketcap_usd": 0, - "name": "The Real Coin", + "name": "Duty of Care Token", "network": "eth", - "shortcut": "TRCN", + "shortcut": "VDOC", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11194,16 +11191,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:TRST": { - "address": "0xCb94be6f13A1182E4A4B6140cb7bf2025d28e41B", + "erc20:eth:VEE": { + "address": "0x340D2bdE5Eb28c1eed91B2f790723E3B160613B7", "links": { - "Github": "https://github.com/WeTrustPlatform", - "Homepage": "https://www.wetrust.io" + "Github": "https://github.com/blockv", + "Homepage": "https://blockv.io" }, - "marketcap_usd": 0, - "name": "TRST", + "marketcap_usd": 37970723, + "name": "BLOCKv", "network": "eth", - "shortcut": "TRST", + "shortcut": "VEE", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11212,15 +11209,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:TRX": { - "address": "0xf230b790E05390FC8295F4d3F60332c93BEd42e2", + "erc20:eth:VENUS": { + "address": "0xEbeD4fF9fe34413db8fC8294556BBD1528a4DAca", "links": { - "Homepage": "https://tronlab.com/en.html" + "Homepage": "http://venuscoin.net" }, "marketcap_usd": 0, - "name": "Tron Lab Token", + "name": "VENUS", "network": "eth", - "shortcut": "TRX", + "shortcut": "VENUS", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11229,15 +11226,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:TWN": { - "address": "0x2eF1aB8a26187C58BB8aAeB11B2fC6D25C5c0716", + "erc20:eth:VERI": { + "address": "0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374", "links": { - "Homepage": "https://ico.theworldnews.net" + "Homepage": "http://veritas.veritaseum.com/index.php" }, "marketcap_usd": 0, - "name": "The World News", + "name": "Veritas", "network": "eth", - "shortcut": "TWN", + "shortcut": "VERI", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11246,15 +11243,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:TWNKL": { - "address": "0xfbd0d1c77B501796A35D86cF91d65D9778EeE695", + "erc20:eth:VET": { + "address": "0xD850942eF8811f2A866692A623011bDE52a462C1", "links": { - "Homepage": "https://www.rainbowcurrency.com/" + "Github": "https://github.com/vechain-team", + "Homepage": "https://tokensale.vechain.com/en" }, - "marketcap_usd": 0, - "name": "Twinkle", + "marketcap_usd": 1322696366, + "name": "Vechain", "network": "eth", - "shortcut": "TWNKL", + "shortcut": "VET", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11263,15 +11261,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:TaaS": { - "address": "0xE7775A6e9Bcf904eb39DA2b68c5efb4F9360e08C", + "erc20:eth:VIB": { + "address": "0x2C974B2d0BA1716E644c1FC59982a89DDD2fF724", "links": { - "Homepage": "https://taas.fund" + "Homepage": "https://www.viberate.io" }, - "marketcap_usd": 15088511, - "name": "Token-as-a-Service", + "marketcap_usd": 0, + "name": "VIB", "network": "eth", - "shortcut": "TaaS", + "shortcut": "VIB", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11280,16 +11278,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:UKG": { - "address": "0x24692791Bc444c5Cd0b81e3CBCaba4b04Acd1F3B", + "erc20:eth:VIEW": { + "address": "0xF03f8D65BaFA598611C3495124093c56e8F638f0", "links": { - "Github": "https://github.com/unikoingold/UnikoinGold-UKG-Contract", - "Homepage": "https://unikoingold.com" + "Homepage": "https://view.ly/" }, "marketcap_usd": 0, - "name": "UnikoinGold", + "name": "Viewly", "network": "eth", - "shortcut": "UKG", + "shortcut": "VIEW", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11298,15 +11295,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:UQC": { - "address": "0xD01DB73E047855Efb414e6202098C4Be4Cd2423B", + "erc20:eth:VIT": { + "address": "0x23b75Bc7AaF28e2d6628C3f424B3882F8f072a3c", "links": { - "Homepage": "https://uquidcoin.com" + "Github": "https://github.com/ViceIndustryToken", + "Homepage": "https://vicetoken.com/" }, - "marketcap_usd": 8930390, - "name": "Uquid Coin", + "marketcap_usd": 1687601, + "name": "Vice Industry Token", "network": "eth", - "shortcut": "UQC", + "shortcut": "VIT", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11315,14 +11313,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:USDM": { - "address": "0xD760ADdFb24D9C01Fe4Bfea7475C5e3636684058", - "hidden": 1, - "links": {}, + "erc20:eth:VIU": { + "address": "0x519475b31653E46D20cD09F9FdcF3B12BDAcB4f5", + "links": { + "Github": "https://github.com/viuly", + "Homepage": "https://viuly.io" + }, "marketcap_usd": 0, - "name": "Mether (USDM)", + "name": "VIU", "network": "eth", - "shortcut": "USDM", + "shortcut": "VIU", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11331,15 +11331,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:USDT": { - "address": "0xdAC17F958D2ee523a2206206994597C13D831ec7", + "erc20:eth:VLD": { + "address": "0x922aC473A3cC241fD3a0049Ed14536452D58D73c", "links": { - "Homepage": "https://tether.to" + "Github": "https://github.com/vetri-global/", + "Homepage": "https://vetri.global/" }, "marketcap_usd": 0, - "name": "USD Tether (erc20)", + "name": "VETRI", "network": "eth", - "shortcut": "USDT", + "shortcut": "VLD", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11348,15 +11349,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:UTK": { - "address": "0x70a72833d6bF7F508C8224CE59ea1Ef3d0Ea3A38", + "erc20:eth:VOC": { + "address": "0xc3bC9Eb71f75Ec439A6b6C8E8b746fCF5b62F703", "links": { - "Homepage": "https://utrust.io" + "Github": "https://github.com/vormacoin", + "Homepage": "https://vormacoin.io/" }, "marketcap_usd": 0, - "name": "UTK", + "name": "VORMACOIN", "network": "eth", - "shortcut": "UTK", + "shortcut": "VOC", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11365,16 +11367,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:UTN-P": { - "address": "0x9e3319636e2126e3c0bc9e3134AEC5e1508A46c7", + "erc20:eth:VOISE": { + "address": "0x83eEA00D838f92dEC4D1475697B9f4D3537b56E3", "links": { - "Github": "https://github.com/UniversaBlockchain/universa", - "Homepage": "https://www.universa.io/" + "Homepage": "https://voise.it" }, - "marketcap_usd": 21558807, - "name": "Universa", + "marketcap_usd": 0, + "name": "Voise", "network": "eth", - "shortcut": "UTN-P", + "shortcut": "VOISE", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11383,15 +11384,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:UUU": { - "address": "0x3543638eD4a9006E4840B105944271Bcea15605D", + "erc20:eth:VRS": { + "address": "0xeDBaF3c5100302dCddA53269322f3730b1F0416d", "links": { - "Homepage": "https://u.network/" + "Homepage": "https://veros.org" }, - "marketcap_usd": 0, - "name": "U Networks", + "marketcap_usd": 390848, + "name": "Veros", "network": "eth", - "shortcut": "UUU", + "shortcut": "VRS", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11400,14 +11401,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:Unicorn": { - "address": "0x89205A3A3b2A69De6Dbf7f01ED13B2108B2c43e7", - "hidden": 1, - "links": {}, + "erc20:eth:VSL": { + "address": "0x5c543e7AE0A1104f78406C340E9C64FD9fCE5170", + "links": { + "Homepage": "https://www.vdice.io" + }, "marketcap_usd": 0, - "name": "Unicorn", + "name": "Vdice", "network": "eth", - "shortcut": "Unicorn", + "shortcut": "VSL", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11416,33 +11418,33 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:VDG": { - "address": "0x57C75ECCc8557136D32619a191fBCDc88560d711", + "erc20:eth:WAX": { + "address": "0x39Bb259F66E1C59d5ABEF88375979b4D20D98022", "links": { - "Github": "https://github.com/VeriDocGlobal", - "Homepage": "https://www.veridocglobal.com/" + "Github": "https://github.com/waxio", + "Homepage": "https://wax.io" }, - "name": "VeriDocGlobal", + "marketcap_usd": 126705683, + "name": "WAX", "network": "eth", - "shortcut": "VDG", - "t1_enabled": "soon", - "t2_enabled": "soon", + "shortcut": "WAX", + "t1_enabled": "yes", + "t2_enabled": "yes", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:VDOC": { - "address": "0x82BD526bDB718C6d4DD2291Ed013A5186cAE2DCa", + "erc20:eth:WBA": { + "address": "0x74951B677de32D596EE851A233336926e6A2cd09", "links": { - "Github": "https://github.com/BlueBikeSolutions", - "Homepage": "https://www.dutyof.care/token-launch/" + "Homepage": "http://webetcrypto.io/wbc" }, "marketcap_usd": 0, - "name": "Duty of Care Token", + "name": "WeBetCrypto", "network": "eth", - "shortcut": "VDOC", + "shortcut": "WBA", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11451,16 +11453,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:VEE": { - "address": "0x340D2bdE5Eb28c1eed91B2f790723E3B160613B7", + "erc20:eth:WCN": { + "address": "0x8F936fE0faF0604c9C0Ef2406bde0A65365515d6", "links": { - "Github": "https://github.com/blockv", - "Homepage": "https://blockv.io" + "Github": "https://github.com/WorldCoinNetwork", + "Homepage": "https://worldcoin.cash/" }, - "marketcap_usd": 38615763, - "name": "BLOCKv", + "marketcap_usd": 0, + "name": "WorldCoinNetwork", "network": "eth", - "shortcut": "VEE", + "shortcut": "WCN", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11469,15 +11471,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:VENUS": { - "address": "0xEbeD4fF9fe34413db8fC8294556BBD1528a4DAca", + "erc20:eth:WCT": { + "address": "0x6a0A97E47d15aAd1D132a1Ac79a480E3F2079063", "links": { - "Homepage": "http://venuscoin.net" + "Homepage": "https://wepower.network" }, - "marketcap_usd": 0, - "name": "VENUS", + "marketcap_usd": 17623431, + "name": "WePower", "network": "eth", - "shortcut": "VENUS", + "shortcut": "WCT", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11486,15 +11488,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:VERI": { - "address": "0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374", + "erc20:eth:WETH": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "links": { - "Homepage": "http://veritas.veritaseum.com/index.php" + "Homepage": "https://weth.io" }, "marketcap_usd": 0, - "name": "Veritas", + "name": "WETH", "network": "eth", - "shortcut": "VERI", + "shortcut": "WETH", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11503,16 +11505,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:VET": { - "address": "0xD850942eF8811f2A866692A623011bDE52a462C1", + "erc20:eth:WHEN": { + "address": "0xF4FE95603881D0e07954fD7605E0e9a916e42C44", "links": { - "Github": "https://github.com/vechain-team", - "Homepage": "https://tokensale.vechain.com/en" + "Github": "https://github.com/WhenHub", + "Homepage": "https://interface.whenhub.com" }, - "marketcap_usd": 904502518, - "name": "Vechain", + "marketcap_usd": 0, + "name": "WHEN Token", "network": "eth", - "shortcut": "VET", + "shortcut": "WHEN", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11521,15 +11523,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:VIB": { - "address": "0x2C974B2d0BA1716E644c1FC59982a89DDD2fF724", + "erc20:eth:WIC": { + "address": "0x62CD07D414Ec50B68C7EcAa863a23d344f2d062f", "links": { - "Homepage": "https://www.viberate.io" + "Github": "https://github.com/wicknote/wicknote", + "Homepage": "https://wicknote.com" }, "marketcap_usd": 0, - "name": "VIB", + "name": "WickNote", "network": "eth", - "shortcut": "VIB", + "shortcut": "WIC", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11538,15 +11541,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:VIEW": { - "address": "0xF03f8D65BaFA598611C3495124093c56e8F638f0", + "erc20:eth:WILD": { + "address": "0xD3C00772B24D997A812249ca637a921e81357701", "links": { - "Homepage": "https://view.ly/" + "Github": "https://github.com/WildCryptoICO/Wild-Crypto-Token", + "Homepage": "http://www.wildcrypto.com" }, "marketcap_usd": 0, - "name": "Viewly", + "name": "WILD Token", "network": "eth", - "shortcut": "VIEW", + "shortcut": "WILD", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11555,16 +11559,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:VIT": { - "address": "0x23b75Bc7AaF28e2d6628C3f424B3882F8f072a3c", + "erc20:eth:WINGS": { + "address": "0x667088b212ce3d06a1b553a7221E1fD19000d9aF", "links": { - "Github": "https://github.com/ViceIndustryToken", - "Homepage": "https://vicetoken.com/" + "Homepage": "https://wings.ai" }, - "marketcap_usd": 1572575, - "name": "Vice Industry Token", + "marketcap_usd": 19729554, + "name": "WINGS", "network": "eth", - "shortcut": "VIT", + "shortcut": "WINGS", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11573,16 +11576,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:VIU": { - "address": "0x519475b31653E46D20cD09F9FdcF3B12BDAcB4f5", + "erc20:eth:WORK": { + "address": "0xD18e454D844eb0009D32E07A0Cde89E18d64CFb4", "links": { - "Github": "https://github.com/viuly", - "Homepage": "https://viuly.io" + "Github": "https://github.com/workchainio", + "Homepage": "https://workchain.io" }, "marketcap_usd": 0, - "name": "VIU", + "name": "workTOKEN", "network": "eth", - "shortcut": "VIU", + "shortcut": "WORK", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11591,16 +11594,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:VLD": { - "address": "0x922aC473A3cC241fD3a0049Ed14536452D58D73c", + "erc20:eth:WPC": { + "address": "0x62087245087125d3DB5B9A3D713d78E7BBc31e54", "links": { - "Github": "https://github.com/vetri-global/", - "Homepage": "https://vetri.global/" + "Homepage": "http://www.worldpeacecoin.io" }, "marketcap_usd": 0, - "name": "VETRI", + "name": "WorldPeaceCoin", "network": "eth", - "shortcut": "VLD", + "shortcut": "WPC", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11609,16 +11611,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:VOC": { - "address": "0xc3bC9Eb71f75Ec439A6b6C8E8b746fCF5b62F703", + "erc20:eth:WPR": { + "address": "0x4CF488387F035FF08c371515562CBa712f9015d4", "links": { - "Github": "https://github.com/vormacoin", - "Homepage": "https://vormacoin.io/" + "Homepage": "https://wepower.network" }, "marketcap_usd": 0, - "name": "VORMACOIN", + "name": "WePower Token", "network": "eth", - "shortcut": "VOC", + "shortcut": "WPR", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11627,15 +11628,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:VOISE": { - "address": "0x83eEA00D838f92dEC4D1475697B9f4D3537b56E3", + "erc20:eth:WRK": { + "address": "0x71e8d74fF1C923E369D0e70DFb09866629C4DD35", "links": { - "Homepage": "https://voise.it" + "Github": "https://github.com/TMWorkCoin", + "Homepage": "https://workcoin.net/" }, "marketcap_usd": 0, - "name": "Voise", + "name": "WorkCoin", "network": "eth", - "shortcut": "VOISE", + "shortcut": "WRK", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11644,15 +11646,32 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:VRS": { - "address": "0xeDBaF3c5100302dCddA53269322f3730b1F0416d", + "erc20:eth:WTC": { + "address": "0xb7cB1C96dB6B22b0D3d9536E0108d062BD488F74", + "hidden": 1, + "links": {}, + "marketcap_usd": 0, + "name": "Walton", + "network": "eth", + "shortcut": "WTC", + "t1_enabled": "yes", + "t2_enabled": "yes", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, + "erc20:eth:WYS": { + "address": "0xd8950fDeaa10304B7A7Fd03a2FC66BC39f3c711a", "links": { - "Homepage": "https://veros.org" + "Github": "https://github.com/wysker", + "Homepage": "https://www.wystoken.org" }, - "marketcap_usd": 368631, - "name": "Veros", + "marketcap_usd": 0, + "name": "wystoken", "network": "eth", - "shortcut": "VRS", + "shortcut": "WYS", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11661,15 +11680,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:VSL": { - "address": "0x5c543e7AE0A1104f78406C340E9C64FD9fCE5170", + "erc20:eth:WYV": { + "address": "0x056017c55aE7AE32d12AeF7C679dF83A85ca75Ff", "links": { - "Homepage": "https://www.vdice.io" + "Github": "https://github.com/ProjectWyvern", + "Homepage": "https://projectwyvern.com" }, "marketcap_usd": 0, - "name": "Vdice", + "name": "WyvernToken", "network": "eth", - "shortcut": "VSL", + "shortcut": "WYV", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11678,16 +11698,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:WAX": { - "address": "0x39Bb259F66E1C59d5ABEF88375979b4D20D98022", + "erc20:eth:WaBi": { + "address": "0x286BDA1413a2Df81731D4930ce2F862a35A609fE", "links": { - "Github": "https://github.com/waxio", - "Homepage": "https://wax.io" + "Homepage": "https://www.wacoin.io" }, - "marketcap_usd": 120008204, - "name": "WAX", + "marketcap_usd": 13995669, + "name": "WaBi", "network": "eth", - "shortcut": "WAX", + "shortcut": "WaBi", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11696,15 +11715,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:WBA": { - "address": "0x74951B677de32D596EE851A233336926e6A2cd09", + "erc20:eth:WiC": { + "address": "0x5e4ABE6419650CA839Ce5BB7Db422b881a6064bB", "links": { - "Homepage": "http://webetcrypto.io/wbc" + "Homepage": "https://www.cryptowi.com/" }, "marketcap_usd": 0, - "name": "WeBetCrypto", + "name": "Wi Coin", "network": "eth", - "shortcut": "WBA", + "shortcut": "WiC", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11713,16 +11732,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:WCN": { - "address": "0x8F936fE0faF0604c9C0Ef2406bde0A65365515d6", + "erc20:eth:X8X": { + "address": "0x910Dfc18D6EA3D6a7124A6F8B5458F281060fa4c", "links": { - "Github": "https://github.com/WorldCoinNetwork", - "Homepage": "https://worldcoin.cash/" + "Homepage": "https://x8currency.com" }, "marketcap_usd": 0, - "name": "WorldCoinNetwork", + "name": "X8X", "network": "eth", - "shortcut": "WCN", + "shortcut": "X8X", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11731,15 +11749,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:WCT": { - "address": "0x6a0A97E47d15aAd1D132a1Ac79a480E3F2079063", + "erc20:eth:XAUR": { + "address": "0x4DF812F6064def1e5e029f1ca858777CC98D2D81", "links": { - "Homepage": "https://wepower.network" + "Homepage": "http://www.xaurum.org" }, - "marketcap_usd": 20502348, - "name": "WePower", + "marketcap_usd": 4150927, + "name": "Xaurum", "network": "eth", - "shortcut": "WCT", + "shortcut": "XAUR", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11748,15 +11766,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:WETH": { - "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "erc20:eth:XBP": { + "address": "0x28dee01D53FED0Edf5f6E310BF8Ef9311513Ae40", "links": { - "Homepage": "https://weth.io" + "Github": "https://github.com/blitzpredict", + "Homepage": "https://www.blitzpredict.io" }, - "marketcap_usd": 0, - "name": "WETH", + "marketcap_usd": 1206956, + "name": "BlitzPredict", "network": "eth", - "shortcut": "WETH", + "shortcut": "XBP", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11765,16 +11784,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:WHEN": { - "address": "0xF4FE95603881D0e07954fD7605E0e9a916e42C44", + "erc20:eth:XCC": { + "address": "0x4d829f8C92a6691c56300D020c9e0dB984Cfe2BA", "links": { - "Github": "https://github.com/WhenHub", - "Homepage": "https://interface.whenhub.com" + "Github": "https://github.com/coincrowd-it", + "Homepage": "https://www.coincrowd.it" }, "marketcap_usd": 0, - "name": "WHEN Token", + "name": "CoinCrowd", "network": "eth", - "shortcut": "WHEN", + "shortcut": "XCC", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11783,16 +11802,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:WIC": { - "address": "0x62CD07D414Ec50B68C7EcAa863a23d344f2d062f", + "erc20:eth:XFS": { + "address": "0x16aF5bfb4Ae7E475b9aDC3Bf5Cb2f1E6a50d7940", "links": { - "Github": "https://github.com/wicknote/wicknote", - "Homepage": "https://wicknote.com" + "Homepage": "http://fanship.world/" }, "marketcap_usd": 0, - "name": "WickNote", + "name": "Fanship", "network": "eth", - "shortcut": "WIC", + "shortcut": "XFS", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11801,16 +11819,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:WILD": { - "address": "0xD3C00772B24D997A812249ca637a921e81357701", + "erc20:eth:XGG": { + "address": "0xf6b6AA0Ef0f5Edc2C1c5d925477F97eAF66303e7", "links": { - "Github": "https://github.com/WildCryptoICO/Wild-Crypto-Token", - "Homepage": "http://www.wildcrypto.com" + "Github": "https://github.com/GoingGems", + "Homepage": "https://www.going-gems.com" }, "marketcap_usd": 0, - "name": "WILD Token", + "name": "Going Gems", "network": "eth", - "shortcut": "WILD", + "shortcut": "XGG", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11819,15 +11837,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:WINGS": { - "address": "0x667088b212ce3d06a1b553a7221E1fD19000d9aF", + "erc20:eth:XGM": { + "address": "0x533ef0984b2FAA227AcC620C67cce12aA39CD8CD", "links": { - "Homepage": "https://wings.ai" + "Homepage": "https://www.xaurum.org/gamma" }, - "marketcap_usd": 20746667, - "name": "WINGS", + "marketcap_usd": 0, + "name": "XGM", "network": "eth", - "shortcut": "WINGS", + "shortcut": "XGM", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11836,16 +11854,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:WORK": { - "address": "0xD18e454D844eb0009D32E07A0Cde89E18d64CFb4", + "erc20:eth:XGT": { + "address": "0x30f4A3e0aB7a76733D8b60b89DD93c3D0b4c9E2f", "links": { - "Github": "https://github.com/workchainio", - "Homepage": "https://workchain.io" + "Github": "https://github.com/CryptogeneProject/CryptogeneToken", + "Homepage": "https://cryptogene.co" }, "marketcap_usd": 0, - "name": "workTOKEN", + "name": "XGT", "network": "eth", - "shortcut": "WORK", + "shortcut": "XGT", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11854,15 +11872,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:WPC": { - "address": "0x62087245087125d3DB5B9A3D713d78E7BBc31e54", + "erc20:eth:XID": { + "address": "0xB110eC7B1dcb8FAB8dEDbf28f53Bc63eA5BEdd84", "links": { - "Homepage": "http://www.worldpeacecoin.io" + "Homepage": "https://sphereidentity.com" }, "marketcap_usd": 0, - "name": "WorldPeaceCoin", + "name": "XID", "network": "eth", - "shortcut": "WPC", + "shortcut": "XID", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11871,15 +11889,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:WPR": { - "address": "0x4CF488387F035FF08c371515562CBa712f9015d4", + "erc20:eth:XNK": { + "address": "0xBC86727E770de68B1060C91f6BB6945c73e10388", "links": { - "Homepage": "https://wepower.network" + "Github": "https://github.com/InkProtocol/", + "Homepage": "https://paywithink.com" }, - "marketcap_usd": 0, - "name": "WePower Token", + "marketcap_usd": 3160605, + "name": "Ink Protocol", "network": "eth", - "shortcut": "WPR", + "shortcut": "XNK", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11888,16 +11907,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:WRK": { - "address": "0x71e8d74fF1C923E369D0e70DFb09866629C4DD35", + "erc20:eth:XNN": { + "address": "0xab95E915c123fdEd5BDfB6325e35ef5515F1EA69", "links": { - "Github": "https://github.com/TMWorkCoin", - "Homepage": "https://workcoin.net/" + "Homepage": "https://xenon.network" }, - "marketcap_usd": 0, - "name": "WorkCoin", + "marketcap_usd": 1665792, + "name": "XENON", "network": "eth", - "shortcut": "WRK", + "shortcut": "XNN", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11906,14 +11924,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:WTC": { - "address": "0xb7cB1C96dB6B22b0D3d9536E0108d062BD488F74", - "hidden": 1, - "links": {}, + "erc20:eth:XNT": { + "address": "0x572E6f318056ba0C5d47A422653113843D250691", + "links": { + "Homepage": "https://exante.eu" + }, "marketcap_usd": 0, - "name": "Walton", + "name": "XNT", "network": "eth", - "shortcut": "WTC", + "shortcut": "XNT", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11922,16 +11941,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:WYS": { - "address": "0xd8950fDeaa10304B7A7Fd03a2FC66BC39f3c711a", + "erc20:eth:XRL": { + "address": "0xB24754bE79281553dc1adC160ddF5Cd9b74361a4", "links": { - "Github": "https://github.com/wysker", - "Homepage": "https://www.wystoken.org" + "Homepage": "https://rialto.ai" }, "marketcap_usd": 0, - "name": "wystoken", + "name": "XRL", "network": "eth", - "shortcut": "WYS", + "shortcut": "XRL", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11940,16 +11958,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:WYV": { - "address": "0x056017c55aE7AE32d12AeF7C679dF83A85ca75Ff", + "erc20:eth:XSC": { + "address": "0x0F513fFb4926ff82D7F60A05069047AcA295C413", "links": { - "Github": "https://github.com/ProjectWyvern", - "Homepage": "https://projectwyvern.com" + "Homepage": "http://crowdstart.capital" }, "marketcap_usd": 0, - "name": "WyvernToken", + "name": "XSC", "network": "eth", - "shortcut": "WYV", + "shortcut": "XSC", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11958,15 +11975,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:WaBi": { - "address": "0x286BDA1413a2Df81731D4930ce2F862a35A609fE", + "erc20:eth:YEED": { + "address": "0x6F7A4bac3315B5082F793161a22e26666d22717f", "links": { - "Homepage": "https://www.wacoin.io" + "Homepage": "https://yggdrash.io" }, - "marketcap_usd": 16417389, - "name": "WaBi", + "marketcap_usd": 0, + "name": "YEED", "network": "eth", - "shortcut": "WaBi", + "shortcut": "YEED", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11975,32 +11992,34 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:WiC": { - "address": "0x5e4ABE6419650CA839Ce5BB7Db422b881a6064bB", + "erc20:eth:YUP": { + "address": "0xD9A12Cde03a86E800496469858De8581D3A5353d", "links": { - "Homepage": "https://www.cryptowi.com/" + "Github": "https://github.com/crowdholding/", + "Homepage": "https://www.crowdholding.com" }, "marketcap_usd": 0, - "name": "Wi Coin", + "name": "YUP", "network": "eth", - "shortcut": "WiC", - "t1_enabled": "yes", - "t2_enabled": "yes", + "shortcut": "YUP", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:X8X": { - "address": "0x910Dfc18D6EA3D6a7124A6F8B5458F281060fa4c", + "erc20:eth:YUPIE": { + "address": "0x0F33bb20a282A7649C7B3AFf644F084a9348e933", "links": { - "Homepage": "https://x8currency.com" + "Github": "https://github.com/crowdholdingico/YupieSmartContract", + "Homepage": "https://www.crowdholding.com" }, "marketcap_usd": 0, - "name": "X8X", + "name": "YUPIE", "network": "eth", - "shortcut": "X8X", + "shortcut": "YUPIE", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12009,15 +12028,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:XAUR": { - "address": "0x4DF812F6064def1e5e029f1ca858777CC98D2D81", + "erc20:eth:ZAP": { + "address": "0x6781a0F84c7E9e846DCb84A9a5bd49333067b104", "links": { - "Homepage": "http://www.xaurum.org" + "Github": "https://github.com/zapproject", + "Homepage": "https://zap.store" }, - "marketcap_usd": 4841766, - "name": "Xaurum", + "marketcap_usd": 4758475, + "name": "ZAP", "network": "eth", - "shortcut": "XAUR", + "shortcut": "ZAP", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12026,16 +12046,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:XBP": { - "address": "0x28dee01D53FED0Edf5f6E310BF8Ef9311513Ae40", + "erc20:eth:ZCS": { + "address": "0x7A41e0517a5ecA4FdbC7FbebA4D4c47B9fF6DC63", "links": { - "Github": "https://github.com/blitzpredict", - "Homepage": "https://www.blitzpredict.io" + "Homepage": "https://zsc.io/" }, - "marketcap_usd": 1336047, - "name": "BlitzPredict", + "marketcap_usd": 9654553, + "name": "Zeusshield", "network": "eth", - "shortcut": "XBP", + "shortcut": "ZCS", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12044,16 +12063,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:XCC": { - "address": "0x4d829f8C92a6691c56300D020c9e0dB984Cfe2BA", + "erc20:eth:ZIL": { + "address": "0x05f4a42e251f2d52b8ed15E9FEdAacFcEF1FAD27", "links": { - "Github": "https://github.com/coincrowd-it", - "Homepage": "https://www.coincrowd.it" + "Github": "https://github.com/zilliqa", + "Homepage": "https://www.zilliqa.com/" }, - "marketcap_usd": 0, - "name": "CoinCrowd", + "marketcap_usd": 548784076, + "name": "Zilliqa", "network": "eth", - "shortcut": "XCC", + "shortcut": "ZIL", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12062,15 +12081,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:XFS": { - "address": "0x16aF5bfb4Ae7E475b9aDC3Bf5Cb2f1E6a50d7940", + "erc20:eth:ZMN": { + "address": "0x554FFc77F4251a9fB3c0E3590a6a205f8d4e067D", "links": { - "Homepage": "http://fanship.world/" + "Homepage": "https://www.zmine.com" }, "marketcap_usd": 0, - "name": "Fanship", + "name": "ZMINE", "network": "eth", - "shortcut": "XFS", + "shortcut": "ZMN", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12079,16 +12098,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:XGG": { - "address": "0xf6b6AA0Ef0f5Edc2C1c5d925477F97eAF66303e7", + "erc20:eth:ZRX": { + "address": "0xE41d2489571d322189246DaFA5ebDe1F4699F498", "links": { - "Github": "https://github.com/GoingGems", - "Homepage": "https://www.going-gems.com" + "Github": "https://github.com/0xProject", + "Homepage": "https://0xproject.com" }, "marketcap_usd": 0, - "name": "Going Gems", + "name": "0x Project", "network": "eth", - "shortcut": "XGG", + "shortcut": "ZRX", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12097,15 +12116,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:XGM": { - "address": "0x533ef0984b2FAA227AcC620C67cce12aA39CD8CD", + "erc20:eth:ZST": { + "address": "0xe386B139Ed3715Ca4B18Fd52671bDcea1cdFE4b1", "links": { - "Homepage": "https://www.xaurum.org/gamma" + "Homepage": "http://zeus.exchange" }, "marketcap_usd": 0, - "name": "XGM", + "name": "Zeus Exchange", "network": "eth", - "shortcut": "XGM", + "shortcut": "ZST", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12114,16 +12133,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:XGT": { - "address": "0x30f4A3e0aB7a76733D8b60b89DD93c3D0b4c9E2f", + "erc20:eth:cV": { + "address": "0xdA6cb58A0D0C01610a29c5A65c303e13e885887C", "links": { - "Github": "https://github.com/CryptogeneProject/CryptogeneToken", - "Homepage": "https://cryptogene.co" + "Github": "https://github.com/carVertical", + "Homepage": "https://www.carvertical.com" }, - "marketcap_usd": 0, - "name": "XGT", + "marketcap_usd": 9094247, + "name": "carVertical", "network": "eth", - "shortcut": "XGT", + "shortcut": "cV", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12132,15 +12151,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:XID": { - "address": "0xB110eC7B1dcb8FAB8dEDbf28f53Bc63eA5BEdd84", + "erc20:eth:eBCH": { + "address": "0xaFC39788c51f0c1Ff7B55317f3e70299e521Fff6", "links": { - "Homepage": "https://sphereidentity.com" + "Homepage": "https://ebitcoincash.io" }, "marketcap_usd": 0, - "name": "XID", + "name": "eBCH", "network": "eth", - "shortcut": "XID", + "shortcut": "eBCH", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12149,16 +12168,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:XNK": { - "address": "0xBC86727E770de68B1060C91f6BB6945c73e10388", + "erc20:eth:eBTC": { + "address": "0xeB7C20027172E5d143fB030d50f91Cece2D1485D", "links": { - "Github": "https://github.com/InkProtocol/", - "Homepage": "https://paywithink.com" + "Github": "https://github.com/eBTCCommunityTrustToken/eBTC", + "Homepage": "https://ebitcoin.org" }, - "marketcap_usd": 2700360, - "name": "Ink Protocol", + "marketcap_usd": 0, + "name": "eBTC", "network": "eth", - "shortcut": "XNK", + "shortcut": "eBTC", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12167,15 +12186,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:XNN": { - "address": "0xab95E915c123fdEd5BDfB6325e35ef5515F1EA69", + "erc20:eth:eGAS": { + "address": "0xb53A96bcBdD9CF78dfF20BAB6C2be7bAec8f00f8", "links": { - "Homepage": "https://xenon.network" + "Homepage": "http://www.ethgas.stream" }, - "marketcap_usd": 1301571, - "name": "XENON", + "marketcap_usd": 0, + "name": "ETH GAS", "network": "eth", - "shortcut": "XNN", + "shortcut": "eGAS", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12184,15 +12203,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:XNT": { - "address": "0x572E6f318056ba0C5d47A422653113843D250691", + "erc20:eth:eUSD": { + "address": "0x523630976eB6147621B5c31c781eBe2Ec2a806E0", "links": { - "Homepage": "https://exante.eu" + "Github": "https://github.com/havven/havven", + "Homepage": "https://havven.io" }, "marketcap_usd": 0, - "name": "XNT", + "name": "Ether-Backed USD Nomins (erc20)", "network": "eth", - "shortcut": "XNT", + "shortcut": "eUSD", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12201,15 +12221,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:XRL": { - "address": "0xB24754bE79281553dc1adC160ddF5Cd9b74361a4", + "erc20:eth:eosDAC": { + "address": "0x7e9e431a0B8c4D532C745B1043c7FA29a48D4fBa", "links": { - "Homepage": "https://rialto.ai" + "Github": "https://github.com/eosdac", + "Homepage": "https://eosdac.io/" }, - "marketcap_usd": 0, - "name": "XRL", + "marketcap_usd": 23302126, + "name": "eosDAC", "network": "eth", - "shortcut": "XRL", + "shortcut": "eosDAC", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12218,15 +12239,14 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:XSC": { - "address": "0x0F513fFb4926ff82D7F60A05069047AcA295C413", - "links": { - "Homepage": "http://crowdstart.capital" - }, + "erc20:eth:nCash": { + "address": "0x809826cceAb68c387726af962713b64Cb5Cb3CCA", + "hidden": 1, + "links": {}, "marketcap_usd": 0, - "name": "XSC", + "name": "NucleusVision", "network": "eth", - "shortcut": "XSC", + "shortcut": "nCash", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12235,15 +12255,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:YEED": { - "address": "0x6F7A4bac3315B5082F793161a22e26666d22717f", + "erc20:eth:nUSD": { + "address": "0x57Ab1E02fEE23774580C119740129eAC7081e9D3", "links": { - "Homepage": "https://yggdrash.io" + "Github": "https://github.com/havven/havven", + "Homepage": "https://www.havven.io" }, "marketcap_usd": 0, - "name": "YEED", + "name": "Havven-Backed USD Nomins (nUSD)", "network": "eth", - "shortcut": "YEED", + "shortcut": "nUSD", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12252,33 +12273,32 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:YUP": { - "address": "0xD9A12Cde03a86E800496469858De8581D3A5353d", + "erc20:eth:onG": { + "address": "0xd341d1680Eeee3255b8C4c75bCCE7EB57f144dAe", "links": { - "Github": "https://github.com/crowdholding/", - "Homepage": "https://www.crowdholding.com" + "Github": "https://github.com/onGsocial", + "Homepage": "https://ongcoin.io" }, - "name": "YUP", + "marketcap_usd": 0, + "name": "onG", "network": "eth", - "shortcut": "YUP", - "t1_enabled": "soon", - "t2_enabled": "soon", + "shortcut": "onG", + "t1_enabled": "yes", + "t2_enabled": "yes", "type": "erc20", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:YUPIE": { - "address": "0x0F33bb20a282A7649C7B3AFf644F084a9348e933", - "links": { - "Github": "https://github.com/crowdholdingico/YupieSmartContract", - "Homepage": "https://www.crowdholding.com" - }, - "marketcap_usd": 0, - "name": "YUPIE", - "network": "eth", - "shortcut": "YUPIE", + "erc20:kov:Aeternity": { + "address": "0x8667559254241ddeD4d11392f868d72092765367", + "hidden": 1, + "links": {}, + "marketcap_usd": 448485182, + "name": "Aeternity", + "network": "kov", + "shortcut": "Aeternity", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12287,16 +12307,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:ZAP": { - "address": "0x6781a0F84c7E9e846DCb84A9a5bd49333067b104", + "erc20:rin:AETH": { + "address": "0x398A7A69f3c59181A1ffe34bed11DCb5DF863A8a", "links": { - "Github": "https://github.com/zapproject", - "Homepage": "https://zap.store" + "Github": "https://github.com/akashaProject", + "Homepage": "http://akasha.world" }, - "marketcap_usd": 6056076, - "name": "ZAP", - "network": "eth", - "shortcut": "ZAP", + "marketcap_usd": 0, + "name": "AKASHA Tokens", + "network": "rin", + "shortcut": "AETH", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12305,15 +12325,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:ZCS": { - "address": "0x7A41e0517a5ecA4FdbC7FbebA4D4c47B9fF6DC63", + "erc20:rin:BHNT": { + "address": "0xe27826eE778B6F78a49a686dA7D64f6E7b084a4f", "links": { - "Homepage": "https://zsc.io/" + "Github": "https://github.com/berlin-hack-and-tell", + "Homepage": "http://berlin.hackandtell.org" }, - "marketcap_usd": 11213075, - "name": "Zeusshield", - "network": "eth", - "shortcut": "ZCS", + "marketcap_usd": 0, + "name": "Berlin Hack&Tell winner token", + "network": "rin", + "shortcut": "BHNT", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12322,16 +12343,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:ZIL": { - "address": "0x05f4a42e251f2d52b8ed15E9FEdAacFcEF1FAD27", + "erc20:rin:CTGA": { + "address": "0x8B65d4B7ee3FFFA986C577F0F4b70a21BaE3dD54", "links": { - "Github": "https://github.com/zilliqa", - "Homepage": "https://www.zilliqa.com/" + "Homepage": "https://www.ctgcoin.org" }, - "marketcap_usd": 562108751, - "name": "Zilliqa", - "network": "eth", - "shortcut": "ZIL", + "marketcap_usd": 0, + "name": "Convenient To Go", + "network": "rin", + "shortcut": "CTGA", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12340,15 +12360,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:ZMN": { - "address": "0x554FFc77F4251a9fB3c0E3590a6a205f8d4e067D", + "erc20:rin:PPD": { + "address": "0x12fE174C097F6B3e876B3b060C9061F4B9dEBB80", + "hidden": 1, "links": { - "Homepage": "https://www.zmine.com" + "Github": "https://github.com/cchen408" }, "marketcap_usd": 0, - "name": "ZMINE", - "network": "eth", - "shortcut": "ZMN", + "name": "PP Donation", + "network": "rin", + "shortcut": "PPD", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12357,16 +12378,16 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:ZRX": { - "address": "0xE41d2489571d322189246DaFA5ebDe1F4699F498", + "erc20:rin:WALL": { + "address": "0x0A057a87CE9C56D7e336B417c79cf30E8d27860B", "links": { - "Github": "https://github.com/0xProject", - "Homepage": "https://0xproject.com" + "Github": "https://github.com/walleth", + "Homepage": "https://walleth.org" }, "marketcap_usd": 0, - "name": "0x Project", - "network": "eth", - "shortcut": "ZRX", + "name": "WALLETH Community-Token", + "network": "rin", + "shortcut": "WALL", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12375,15 +12396,14 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:ZST": { - "address": "0xe386B139Ed3715Ca4B18Fd52671bDcea1cdFE4b1", - "links": { - "Homepage": "http://zeus.exchange" - }, + "erc20:rop:ILSC": { + "address": "0x6f95a3B682F8e9aacC86D057A6DF88A0E68145A8", + "hidden": 1, + "links": {}, "marketcap_usd": 0, - "name": "Zeus Exchange", - "network": "eth", - "shortcut": "ZST", + "name": "IsraCoin", + "network": "rop", + "shortcut": "ILSC", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12392,16 +12412,14 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:cV": { - "address": "0xdA6cb58A0D0C01610a29c5A65c303e13e885887C", - "links": { - "Github": "https://github.com/carVertical", - "Homepage": "https://www.carvertical.com" - }, - "marketcap_usd": 8542995, - "name": "carVertical", - "network": "eth", - "shortcut": "cV", + "erc20:ubq:BEER": { + "address": "0xFF3bF057ADF3b0E015b6465331a6236e55688274", + "hidden": 1, + "links": {}, + "marketcap_usd": 0, + "name": "BEER", + "network": "ubq", + "shortcut": "BEER", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12410,15 +12428,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:eBCH": { - "address": "0xaFC39788c51f0c1Ff7B55317f3e70299e521Fff6", + "erc20:ubq:CEFS": { + "address": "0x08533D6A06CE365298b12Ef92eb407cBA8Aa8273", "links": { - "Homepage": "https://ebitcoincash.io" + "Homepage": "https://www.cryptopiashares.com" }, "marketcap_usd": 0, - "name": "eBCH", - "network": "eth", - "shortcut": "eBCH", + "name": "CEFS", + "network": "ubq", + "shortcut": "CEFS", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12427,16 +12445,14 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:eBTC": { - "address": "0xeB7C20027172E5d143fB030d50f91Cece2D1485D", - "links": { - "Github": "https://github.com/eBTCCommunityTrustToken/eBTC", - "Homepage": "https://ebitcoin.org" - }, + "erc20:ubq:DOT": { + "address": "0x94aD7e41c1D44022C4F47cb1Ba019Fd1a022c536", + "hidden": 1, + "links": {}, "marketcap_usd": 0, - "name": "eBTC", - "network": "eth", - "shortcut": "eBTC", + "name": "DOT", + "network": "ubq", + "shortcut": "DOT", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12445,15 +12461,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:eGAS": { - "address": "0xb53A96bcBdD9CF78dfF20BAB6C2be7bAec8f00f8", + "erc20:ubq:QWARK": { + "address": "0x4b4899a10F3E507DB207b0ee2426029eFa168a67", "links": { - "Homepage": "http://www.ethgas.stream" + "Homepage": "https://www.qwark.io" }, - "marketcap_usd": 0, - "name": "ETH GAS", - "network": "eth", - "shortcut": "eGAS", + "marketcap_usd": 2592261, + "name": "QWARK", + "network": "ubq", + "shortcut": "QWARK", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12462,16 +12478,15 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:eUSD": { - "address": "0x523630976eB6147621B5c31c781eBe2Ec2a806E0", + "erc20:ubq:RICKS": { + "address": "0x5e1715bB79805Bd672729760B3f7F34D6f485098", "links": { - "Github": "https://github.com/havven/havven", - "Homepage": "https://havven.io" + "Homepage": "https://picklericks.wixsite.com/picklewix" }, "marketcap_usd": 0, - "name": "Ether-Backed USD Nomins (erc20)", - "network": "eth", - "shortcut": "eUSD", + "name": "RICKS", + "network": "ubq", + "shortcut": "RICKS", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -12480,281 +12495,319 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:eosDAC": { - "address": "0x7e9e431a0B8c4D532C745B1043c7FA29a48D4fBa", + "eth:AKA": { "links": { - "Github": "https://github.com/eosdac", - "Homepage": "https://eosdac.io/" + "Homepage": "https://akroma.io" }, - "marketcap_usd": 34547518, - "name": "eosDAC", - "network": "eth", - "shortcut": "eosDAC", + "marketcap_usd": 0, + "name": "Akroma", + "shortcut": "AKA", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "erc20", + "type": "coin", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:nCash": { - "address": "0x809826cceAb68c387726af962713b64Cb5Cb3CCA", - "hidden": 1, - "links": {}, + "eth:CLO": { + "links": { + "Homepage": "https://callisto.network" + }, "marketcap_usd": 0, - "name": "NucleusVision", - "network": "eth", - "shortcut": "nCash", + "name": "Callisto", + "shortcut": "CLO", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "erc20", + "type": "coin", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:nUSD": { - "address": "0x57Ab1E02fEE23774580C119740129eAC7081e9D3", + "eth:EGEM": { "links": { - "Github": "https://github.com/havven/havven", - "Homepage": "https://www.havven.io" + "Homepage": "https://egem.io" }, "marketcap_usd": 0, - "name": "Havven-Backed USD Nomins (nUSD)", - "network": "eth", - "shortcut": "nUSD", + "name": "EtherGem", + "shortcut": "EGEM", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "erc20", + "type": "coin", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:onG": { - "address": "0xd341d1680Eeee3255b8C4c75bCCE7EB57f144dAe", + "eth:ELLA": { "links": { - "Github": "https://github.com/onGsocial", - "Homepage": "https://ongcoin.io" + "Homepage": "https://ellaism.org" }, - "marketcap_usd": 0, - "name": "onG", - "network": "eth", - "shortcut": "onG", + "marketcap_usd": 717389, + "name": "Ellaism", + "shortcut": "ELLA", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "erc20", + "type": "coin", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:kov:Aeternity": { - "address": "0x8667559254241ddeD4d11392f868d72092765367", - "hidden": 1, - "links": {}, - "marketcap_usd": 434471331, - "name": "Aeternity", - "network": "kov", - "shortcut": "Aeternity", + "eth:EOSC": { + "links": { + "Homepage": "https://eos-classic.io" + }, + "marketcap_usd": 0, + "name": "EOS Classic", + "shortcut": "EOSC", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "erc20", + "type": "coin", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:rin:AETH": { - "address": "0x398A7A69f3c59181A1ffe34bed11DCb5DF863A8a", + "eth:ESN": { "links": { - "Github": "https://github.com/akashaProject", - "Homepage": "http://akasha.world" + "Homepage": "https://ethersocial.org" }, "marketcap_usd": 0, - "name": "AKASHA Tokens", - "network": "rin", - "shortcut": "AETH", + "name": "Ethersocial Network", + "shortcut": "ESN", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "erc20", + "type": "coin", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:rin:BHNT": { - "address": "0xe27826eE778B6F78a49a686dA7D64f6E7b084a4f", + "eth:ETC": { "links": { - "Github": "https://github.com/berlin-hack-and-tell", - "Homepage": "http://berlin.hackandtell.org" + "Homepage": "https://ethereumclassic.github.io" }, - "marketcap_usd": 0, - "name": "Berlin Hack&Tell winner token", - "network": "rin", - "shortcut": "BHNT", + "marketcap_usd": 1705863309, + "name": "Ethereum Classic", + "shortcut": "ETC", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "erc20", + "type": "coin", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:rin:CTGA": { - "address": "0x8B65d4B7ee3FFFA986C577F0F4b70a21BaE3dD54", + "eth:ETH": { "links": { - "Homepage": "https://www.ctgcoin.org" + "Homepage": "https://www.ethereum.org" }, - "marketcap_usd": 0, - "name": "Convenient To Go", - "network": "rin", - "shortcut": "CTGA", + "marketcap_usd": 46623589711, + "name": "Ethereum", + "shortcut": "ETH", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "erc20", + "type": "coin", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:rin:PPD": { - "address": "0x12fE174C097F6B3e876B3b060C9061F4B9dEBB80", - "hidden": 1, + "eth:ETSC": { "links": { - "Github": "https://github.com/cchen408" + "Homepage": "https://ethereumsocial.kr" }, "marketcap_usd": 0, - "name": "PP Donation", - "network": "rin", - "shortcut": "PPD", + "name": "Ethereum Social", + "shortcut": "ETSC", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "erc20", + "type": "coin", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:rin:WALL": { - "address": "0x0A057a87CE9C56D7e336B417c79cf30E8d27860B", + "eth:EXP": { "links": { - "Github": "https://github.com/walleth", - "Homepage": "https://walleth.org" + "Homepage": "https://expanse.tech" }, - "marketcap_usd": 0, - "name": "WALLETH Community-Token", - "network": "rin", - "shortcut": "WALL", + "marketcap_usd": 10189865, + "name": "Expanse", + "shortcut": "EXP", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "erc20", + "type": "coin", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:rop:ILSC": { - "address": "0x6f95a3B682F8e9aacC86D057A6DF88A0E68145A8", - "hidden": 1, - "links": {}, - "marketcap_usd": 0, - "name": "IsraCoin", - "network": "rop", - "shortcut": "ILSC", + "eth:GO": { + "links": { + "Homepage": "https://gochain.io" + }, + "marketcap_usd": 32099950, + "name": "GoChain", + "shortcut": "GO", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "erc20", + "type": "coin", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:ubq:BEER": { - "address": "0xFF3bF057ADF3b0E015b6465331a6236e55688274", - "hidden": 1, - "links": {}, + "eth:RSK": { + "links": { + "Homepage": "https://www.rsk.co" + }, "marketcap_usd": 0, - "name": "BEER", - "network": "ubq", - "shortcut": "BEER", + "name": "RSK", + "shortcut": "RSK", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "erc20", + "type": "coin", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:ubq:CEFS": { - "address": "0x08533D6A06CE365298b12Ef92eb407cBA8Aa8273", + "eth:UBQ": { "links": { - "Homepage": "https://www.cryptopiashares.com" + "Homepage": "https://ubiqsmart.com" }, - "marketcap_usd": 0, - "name": "CEFS", - "network": "ubq", - "shortcut": "CEFS", + "marketcap_usd": 50652593, + "name": "Ubiq", + "shortcut": "UBQ", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "erc20", + "type": "coin", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:ubq:DOT": { - "address": "0x94aD7e41c1D44022C4F47cb1Ba019Fd1a022c536", + "eth:tETC": { "hidden": 1, - "links": {}, + "links": { + "Homepage": "https://ethereumclassic.github.io" + }, "marketcap_usd": 0, - "name": "DOT", - "network": "ubq", - "shortcut": "DOT", + "name": "Ethereum Classic Testnet", + "shortcut": "tETC", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "erc20", + "type": "coin", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:ubq:QWARK": { - "address": "0x4b4899a10F3E507DB207b0ee2426029eFa168a67", + "eth:tETH": { + "hidden": 1, "links": { - "Homepage": "https://www.qwark.io" + "Homepage": "https://www.ethereum.org" }, - "marketcap_usd": 2520144, - "name": "QWARK", - "network": "ubq", - "shortcut": "QWARK", + "marketcap_usd": 0, + "name": "Ethereum Testnet Kovan", + "shortcut": "tETH", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "erc20", + "type": "coin", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:ubq:RICKS": { - "address": "0x5e1715bB79805Bd672729760B3f7F34D6f485098", + "eth:tRSK": { + "hidden": 1, "links": { - "Homepage": "https://picklericks.wixsite.com/picklewix" + "Homepage": "https://www.rsk.co" }, "marketcap_usd": 0, - "name": "RICKS", - "network": "ubq", - "shortcut": "RICKS", + "name": "RSK Testnet", + "shortcut": "tRSK", "t1_enabled": "yes", "t2_enabled": "yes", - "type": "erc20", + "type": "coin", "wallet": { "MyCrypto": "https://mycrypto.com", "MyEtherWallet": "https://www.myetherwallet.com" } }, - "mosaic:BREEZE": { + "misc:ADA": { + "links": { + "Homepage": "https://www.cardano.org" + }, + "marketcap_usd": 4176488085, + "name": "Cardano", + "shortcut": "ADA", + "t1_enabled": "no", + "t2_enabled": "soon", + "type": "coin" + }, + "misc:LSK": { + "links": { + "Homepage": "https://lisk.io/" + }, + "marketcap_usd": 523291562, + "name": "Lisk", + "shortcut": "LSK", + "t1_enabled": "no", + "t2_enabled": "yes", + "type": "coin" + }, + "misc:XLM": { + "links": { + "Homepage": "https://www.stellar.org" + }, + "marketcap_usd": 5745967719, + "name": "Stellar", + "notes": "In development", + "shortcut": "XLM", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "coin" + }, + "misc:XMR": { + "links": { + "Homepage": "https://getmonero.org" + }, + "marketcap_usd": 2226986225, + "name": "Monero", + "notes": "In development", + "shortcut": "XMR", + "t1_enabled": "no", + "t2_enabled": "soon", + "type": "coin" + }, + "misc:XRP": { + "links": { + "Homepage": "https://ripple.com" + }, + "marketcap_usd": 17659543494, + "name": "Ripple", + "notes": "In development", + "shortcut": "XRP", + "t1_enabled": "no", + "t2_enabled": "soon", + "type": "coin" + }, + "misc:XTZ": { + "links": { + "Homepage": "https://tezos.com" + }, + "marketcap_usd": 1266086135, + "name": "Tezos", + "shortcut": "XTZ", + "t1_enabled": "no", + "t2_enabled": "soon", + "type": "coin" + }, + "nem:BREEZE": { "links": { "Homepage": "https://breeze.chat" }, @@ -12768,11 +12821,11 @@ "Nano Wallet": "https://nem.io/downloads/" } }, - "mosaic:DIM": { + "nem:DIM": { "links": { "Homepage": "https://www.dimcoin.io" }, - "marketcap_usd": 9312088, + "marketcap_usd": 8656533, "name": "DIMCOIN", "shortcut": "DIM", "t1_enabled": "yes", @@ -12782,12 +12835,11 @@ "Nano Wallet": "https://nem.io/downloads/" } }, - "mosaic:DIMTOK": { - "coinmarketcap_alias": "dimcoin", + "nem:DIMTOK": { "links": { "Homepage": "https://www.dimcoin.io" }, - "marketcap_usd": 9312088, + "marketcap_usd": 0, "name": "DIM TOKEN", "shortcut": "DIMTOK", "t1_enabled": "yes", @@ -12797,7 +12849,7 @@ "Nano Wallet": "https://nem.io/downloads/" } }, - "mosaic:PAC:CHS": { + "nem:PAC:CHS": { "links": { "Homepage": "https://pacnem.com" }, @@ -12811,7 +12863,7 @@ "Nano Wallet": "https://nem.io/downloads/" } }, - "mosaic:PAC:HRT": { + "nem:PAC:HRT": { "links": { "Homepage": "https://pacnem.com" }, @@ -12825,11 +12877,11 @@ "Nano Wallet": "https://nem.io/downloads/" } }, - "mosaic:XEM": { + "nem:XEM": { "links": { "Homepage": "https://nem.io" }, - "marketcap_usd": 1572948000, + "marketcap_usd": 1557342000, "name": "NEM", "shortcut": "XEM", "t1_enabled": "yes", @@ -12841,11 +12893,11 @@ } }, "info": { - "marketcap_usd": 219093401682, - "t1_coins": 700, - "t2_coins": 696, - "total_marketcap_usd": 284131879229, - "updated_at": 1532099100, - "updated_at_readable": "Fri Jul 20 17:05:00 2018" + "marketcap_usd": 225765247536, + "t1_coins": 661, + "t2_coins": 660, + "total_marketcap_usd": 288640246162, + "updated_at": 1532695674, + "updated_at_readable": "Fri Jul 27 14:47:54 2018" } } \ No newline at end of file diff --git a/tools/coins_details.py b/tools/coins_details.py index c00111945..e12d18e55 100755 --- a/tools/coins_details.py +++ b/tools/coins_details.py @@ -1,131 +1,118 @@ #!/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 coin_defs +LOG = logging.getLogger(__name__) + OPTIONAL_KEYS = ("links", "notes", "wallet") -OVERRIDES = coin_defs.load_json("coins_details.override.json") +ALLOWED_SUPPORT_STATUS = ("yes", "no", "planned", "soon") +OVERRIDES = coin_defs.load_json("coins_details.override.json") VERSIONS = coin_defs.latest_releases() -COINS = {} +COINMAKETCAP_CACHE = os.path.join(os.path.dirname(__file__), "coinmarketcap.json") -log = logging.getLogger(__name__) +COINMARKETCAP_TICKERS_URL = ( + "https://api.coinmarketcap.com/v2/ticker/?start={}&convert=USD&limit=100" +) +COINMARKETCAP_GLOBAL_URL = "https://api.coinmarketcap.com/v2/global" def coinmarketcap_init(): - global COINS - try: - marketcap_json = json.load(open("coinmarketcap.json", "r")) - except FileNotFoundError: - pass - else: + mtime = os.path.getmtime(COINMAKETCAP_CACHE) + if mtime > time.time() - 3600: + print("Using cached market cap data") + with open(COINMAKETCAP_CACHE) as f: + return json.load(f) + except Exception: pass - # if COINS["1"]["last_updated"] > time.time() - 3600: - # print("Using local cache of coinmarketcap") - # return - - for coin in marketcap_json.values(): - slug = coin["website_slug"] - market_cap = coin["quotes"]["USD"]["market_cap"] - if market_cap is not None: - COINS[slug] = int(float(market_cap)) - - return print("Updating coins from coinmarketcap") total = None - COINS = {} + ctr = 0 + coin_data = {} - while total is None or len(COINS) < total: - url = ( - "https://api.coinmarketcap.com/v2/ticker/?start=%d&convert=USD&limit=100" - % (len(COINS) + 1) - ) + while total is None or ctr < total: + url = COINMARKETCAP_TICKERS_URL.format(ctr + 1) data = requests.get(url).json() - COINS.update(data["data"]) + if total is None: total = data["metadata"]["num_cryptocurrencies"] + ctr += len(data["data"]) - print("Fetched %d of %d coins" % (len(COINS), total)) + for coin in data["data"].values(): + slug = coin["website_slug"] + market_cap = coin["quotes"]["USD"]["market_cap"] + if market_cap is not None: + coin_data[slug] = int(market_cap) + + print("Fetched {} of {} coins".format(ctr, total)) time.sleep(1) - json.dump(COINS, open("coinmarketcap.json", "w"), sort_keys=True, indent=4) + with open(COINMAKETCAP_CACHE, "w") as f: + json.dump(coin_data, f) + + return coin_data + + +MARKET_CAPS = coinmarketcap_init() def marketcap(coin): cap = None - if "coinmarketcap_alias" in coin: - cap = COINS.get(coin["coinmarketcap_alias"]) - - if not cap: + cap = MARKET_CAPS.get(coin["coinmarketcap_alias"]) + if cap is None: slug = coin["name"].replace(" ", "-").lower() - cap = COINS.get(slug) - - if not cap: - cap = COINS.get(coin["shortcut"].lower()) - + cap = MARKET_CAPS.get(slug) + if cap is None: + cap = MARKET_CAPS.get(coin["shortcut"].lower()) return cap -def update_marketcap(coins): +def update_marketcaps(coins): for coin in coins.values(): - cap = marketcap(coin) - if cap: - coin["marketcap_usd"] = cap + coin["marketcap_usd"] = marketcap(coin) or 0 -def coinmarketcap_global(): - url = "https://api.coinmarketcap.com/v2/global" - ret = requests.get(url) - data = ret.json() - return data - - -def update_info(details): - details["info"]["updated_at"] = int(time.time()) - details["info"]["updated_at_readable"] = time.asctime() +def summary(coins): + 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 = requests.get(COINMARKETCAP_GLOBAL_URL).json() + total_marketcap = int(ret["data"]["quotes"]["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) + 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 _is_supported(support, trezor_version): @@ -174,8 +161,7 @@ def update_coins(coins, support_info): if support.get("other"): details["wallet"].update(support["other"]) - # XXX get rid of this in favor of res[key] - res["coin:{}".format(coin["shortcut"])] = details + res[key] = details return res @@ -216,12 +202,6 @@ def update_simple(coins, support_info, type): key = coin["key"] support = support_info[key] - # XXX drop newkey - if type == "mosaic": - newkey = "mosaic:{}".format(coin["shortcut"]) - else: - newkey = "coin2:{}".format(coin["shortcut"]) - details = dict( name=coin["name"], shortcut=coin["shortcut"], @@ -229,11 +209,11 @@ def update_simple(coins, support_info, type): t1_enabled=_is_supported(support, 1), t2_enabled=_is_supported(support, 2), ) - for key in OPTIONAL_KEYS: - if key in coin: - details[key] = coin[key] + for k in OPTIONAL_KEYS: + if k in coin: + details[k] = coin[k] - res[newkey] = details + res[key] = details return res @@ -241,30 +221,27 @@ def update_simple(coins, support_info, type): def update_ethereum_networks(coins, support_info): res = update_simple(coins, support_info, "coin") for coin in coins: - newkey = "coin2:{}".format(coin["shortcut"]) - res[newkey]["wallet"] = dict( - MyCrypto="https://mycrypto.com", - MyEtherWallet="https://www.myetherwallet.com", + res[coin["key"]].update( + wallet=dict( + MyCrypto="https://mycrypto.com", + MyEtherWallet="https://www.myetherwallet.com", + ), + links=dict(Homepage=coin.get("url")), ) - res[newkey]["links"] = dict(Homepage=coin.get("url")) return res -def check_missing_details(details): - for k in details["coins"].keys(): - coin = details["coins"][k] +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", {}): 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 ( @@ -291,15 +268,16 @@ def check_missing_details(details): 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) def apply_overrides(coins): for key, override in OVERRIDES.items(): if key not in coins: - log.warning("override without coin: {}".format(key)) + LOG.warning("override without coin: {}".format(key)) continue def recursive_update(orig, new): @@ -314,31 +292,24 @@ def apply_overrides(coins): if __name__ == "__main__": - # try: - # details = json.load(open('../defs/coins_details.json', 'r')) - # except FileNotFoundError: - # details = {'coins': {}, 'info': {}} - - coinmarketcap_init() - defs = coin_defs.get_all() all_coins = sum(defs.values(), []) support_info = coin_defs.support_info(all_coins, erc20_versions=VERSIONS) coins = {} - coins.update(update_coins(defs["btc"], support_info)) + coins.update(update_coins(defs["coins"], 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["other"], support_info, "coin")) + coins.update(update_simple(defs["misc"], support_info, "coin")) apply_overrides(coins) - update_marketcap(coins) - - details = dict(coins=coins, info={}) - update_info(details) - check_missing_details(details) + update_marketcaps(coins) + check_missing_data(coins) - print(json.dumps(details["info"], sort_keys=True, indent=4)) - json.dump(details, open("../defs/coins_details.json", "w"), sort_keys=True, indent=4) + info = summary(coins) + details = dict(coins=coins, info=info) + print(json.dumps(info, sort_keys=True, indent=4)) + with open(os.path.join(coin_defs.DEFS_DIR, "coins_details.json"), "w") as f: + json.dump(details, f, sort_keys=True, indent=4) From b5443af4c5bea643181ecabc2a2d5d6290b67287 Mon Sep 17 00:00:00 2001 From: matejcik Date: Mon, 30 Jul 2018 14:25:53 +0200 Subject: [PATCH 10/50] tools: coin_defs renamed to coin_info and interface improved a little --- tools/coin_gen.py | 148 ++++++++++++++++++++++----- tools/{coin_defs.py => coin_info.py} | 71 +++++++++---- tools/coins_details.py | 23 ++--- tools/support.py | 16 +-- 4 files changed, 192 insertions(+), 66 deletions(-) rename tools/{coin_defs.py => coin_info.py} (90%) diff --git a/tools/coin_gen.py b/tools/coin_gen.py index 04f775399..771b0c33f 100755 --- a/tools/coin_gen.py +++ b/tools/coin_gen.py @@ -8,7 +8,7 @@ import glob import click -import coin_defs +import coin_info try: import mako @@ -25,10 +25,13 @@ except ImportError: requests = None try: + import binascii + import struct + import zlib from hashlib import sha256 import ed25519 from PIL import Image - from trezorlib.protobuf import dump_message + from trezorlib import protobuf from coindef import CoinDef CAN_BUILD_DEFS = True @@ -36,7 +39,7 @@ except ImportError: CAN_BUILD_DEFS = False -# ======= Jinja2 management ====== +# ======= Mako management ====== def c_str_filter(b): @@ -70,26 +73,36 @@ def render_file(filename, coins, support_info): # ====== validation functions ====== -def check_support(defs, support_data): +def check_support(defs, support_data, fail_missing=False): check_passed = True + coin_list = defs.as_list() + coin_names = {coin["key"]: coin["name"] for coin in coin_list} + + def coin_name(key): + if key in coin_names: + return "{} ({})".format(key, coin_names[key]) + else: + return "{} ".format(key) for key, support in support_data.items(): - errors = coin_defs.validate_support(support) + errors = coin_info.validate_support(support) if errors: check_passed = False - print("ERR:", "invalid definition for", key) + print("ERR:", "invalid definition for", coin_name(key)) print("\n".join(errors)) - expected_coins = set(coin["key"] for coin in defs["coins"] + defs["misc"]) + expected_coins = set(coin["key"] for coin in defs.coins + defs.misc) # detect missing support info for expected for coin in expected_coins: if coin not in support_data: - check_passed = False - print("ERR: Missing support info for", coin) + if fail_missing: + check_passed = False + print("ERR: Missing support info for", coin_name(coin)) + else: + print("WARN: Missing support info for", coin_name(coin)) # detect non-matching support info - coin_list = sum(defs.values(), []) coin_set = set(coin["key"] for coin in coin_list) for key in support_data: # detect non-matching support info @@ -97,9 +110,9 @@ def check_support(defs, support_data): check_passed = False print("ERR: Support info found for unknown coin", key) - # detect override - info only, doesn't fail check + # detect override - doesn't fail check if key not in expected_coins: - print("INFO: Override present for coin", key) + print("INFO: Override present for coin", coin_name(key)) return check_passed @@ -108,13 +121,13 @@ def check_btc(coins): check_passed = True for coin in coins: - errors = coin_defs.validate_btc(coin) + errors = coin_info.validate_btc(coin) if errors: check_passed = False print("ERR:", "invalid definition for", coin["name"]) print("\n".join(errors)) - collisions = coin_defs.find_address_collisions(coins) + collisions = coin_info.find_address_collisions(coins) # warning only for key, dups in collisions.items(): if dups: @@ -135,7 +148,7 @@ def check_backends(coins): for backend in backends: print("checking", backend, "... ", end="", flush=True) try: - j = requests.get(backend + "/block-index/0").json() + j = requests.get(backend + "/api/block-index/0").json() if j["blockHash"] != genesis_block: raise RuntimeError("genesis block mismatch") except Exception as e: @@ -146,6 +159,59 @@ def check_backends(coins): return check_passed +# ====== 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 ====== @@ -155,12 +221,17 @@ def cli(): @cli.command() +@click.option( + "--check-missing-support/--no-check-missing-support", + "-s", + help="Fail if support info for a coin is missing", +) @click.option( "--backend-check/--no-backend-check", "-b", help="Also check blockbook/bitcore responses", ) -def check(backend_check): +def check(check_missing_support, backend_check): """Validate coin definitions. Checks that every btc-like coin is properly filled out, reports address collisions @@ -169,20 +240,21 @@ def check(backend_check): if backend_check and requests is None: raise click.ClickException("You must install requests for backend check") - defs = coin_defs.get_all() + defs = coin_info.get_all() all_checks_passed = True print("Checking BTC-like coins...") - if not check_btc(defs["coins"]): + if not check_btc(defs.coins): all_checks_passed = False print("Checking support data...") - if not check_support(defs, coin_defs.get_support_data()): + support_data = coin_info.get_support_data() + if not check_support(defs, support_data, fail_missing=check_missing_support): all_checks_passed = False if backend_check: print("Checking backend responses...") - if not check_backends(defs["coins"]): + if not check_backends(defs.coins): all_checks_passed = False if not all_checks_passed: @@ -196,9 +268,8 @@ def check(backend_check): @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""" - defs = coin_defs.get_all() - coins = defs["coins"] - support_info = coin_defs.support_info(coins) + coins = coin_info.get_all().coins + support_info = coin_info.support_info(coins) by_name = {} for coin in coins: coin["support"] = support_info[coin["key"]] @@ -206,6 +277,30 @@ def coins_json(outfile): 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.get_all().coins + 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() @@ -236,10 +331,9 @@ def render(paths): else: files.append(path) - defs = coin_defs.get_all() - all_coins = sum(defs.values(), []) - versions = coin_defs.latest_releases() - support_info = coin_defs.support_info(all_coins, erc20_versions=versions) + defs = coin_info.get_all() + versions = coin_info.latest_releases() + support_info = coin_info.support_info(defs, erc20_versions=versions) # munch dicts - make them attribute-accessable for key, value in defs.items(): diff --git a/tools/coin_defs.py b/tools/coin_info.py similarity index 90% rename from tools/coin_defs.py rename to tools/coin_info.py index 52e7e3637..31237f666 100755 --- a/tools/coin_defs.py +++ b/tools/coin_info.py @@ -30,6 +30,35 @@ def load_json(*path): 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: + `coins` 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["coins"] == info.coins` + """ + + 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 ====== @@ -186,6 +215,7 @@ def _load_btc_coins(): name=coin["coin_name"], shortcut=coin["coin_shortcut"], key="coin:{}".format(coin["coin_shortcut"]), + icon=filename.replace(".json", ".png"), ) coins.append(coin) @@ -324,11 +354,14 @@ def support_info_erc20(coins, versions): def support_info(coins, erc20_versions=None, skip_missing=False): """Generate Trezor support information. - Takes a dict of coins and generates a support-info entry for each. + Takes a collection of coins and generates a support-info entry for each. The support-info is a dict with a number of known keys: `trezor1`, `trezor2`, `webwallet`, `connect`. An optional `other` entry is a dict of name-url pairs for third-party software. + The `coins` argument can be a `CoinsInfo` object, a list or a dict of + coin items. + For btc-like coins and misc networks, this is taken from `support.json`. For NEM mosaics and ethereum networks, the support is presumed to be "yes" for both Trezors. Webwallet and Connect info is not filled out. @@ -346,6 +379,11 @@ def support_info(coins, erc20_versions=None, skip_missing=False): and a warning emitted. "No support information" means that the coin is not listed in `support.json` and we have no heuristic to determine the support. """ + 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: @@ -428,6 +466,10 @@ def _filter_duplicate_shortcuts(coins): retained_coins = OrderedDict() for coin in coins: + if "Testnet" in coin["name"] and coin["shortcut"] == "tETH": + # special case for Ethereum testnets + continue + key = coin["shortcut"] if key in dup_keys: pass @@ -458,7 +500,7 @@ def get_all(): `nem` for NEM mosaics, `misc` for other networks. """ - all_coins = dict( + all_coins = CoinsInfo( coins=_load_btc_coins(), eth=_load_ethereum_networks(), erc20=_load_erc20_tokens(), @@ -476,22 +518,13 @@ def get_all(): coins.sort(key=lambda c: c["key"].upper()) _ensure_mandatory_values(coins) - if k != "eth": - dup_keys = _filter_duplicate_shortcuts(coins) - if dup_keys: - log.warning( - "{}: removing duplicate symbols: {}".format(k, ", ".join(dup_keys)) - ) + dup_keys = _filter_duplicate_shortcuts(coins) + if dup_keys: + if k == "erc20": + severity = logging.INFO + else: + severity = logging.WARNING + dup_str = ", ".join(dup_keys) + log.log(severity, "{}: removing duplicate symbols: {}".format(k, dup_str)) return all_coins - - -def get_list(): - """Return all definitions as a single list of coins.""" - all_coins = get_all() - return sum(all_coins.values(), []) - - -def get_dict(): - """Return all definitions as a dict indexed by coin keys.""" - return {coin["key"]: coin for coin in get_list()} diff --git a/tools/coins_details.py b/tools/coins_details.py index e12d18e55..5c4b407fb 100755 --- a/tools/coins_details.py +++ b/tools/coins_details.py @@ -5,15 +5,15 @@ import time import json import logging import requests -import coin_defs +import coin_info LOG = logging.getLogger(__name__) OPTIONAL_KEYS = ("links", "notes", "wallet") ALLOWED_SUPPORT_STATUS = ("yes", "no", "planned", "soon") -OVERRIDES = coin_defs.load_json("coins_details.override.json") -VERSIONS = coin_defs.latest_releases() +OVERRIDES = coin_info.load_json("coins_details.override.json") +VERSIONS = coin_info.latest_releases() COINMAKETCAP_CACHE = os.path.join(os.path.dirname(__file__), "coinmarketcap.json") @@ -292,16 +292,15 @@ def apply_overrides(coins): if __name__ == "__main__": - defs = coin_defs.get_all() - all_coins = sum(defs.values(), []) - support_info = coin_defs.support_info(all_coins, erc20_versions=VERSIONS) + defs = coin_info.get_all() + support_info = coin_info.support_info(defs, erc20_versions=VERSIONS) coins = {} - coins.update(update_coins(defs["coins"], 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")) + coins.update(update_coins(defs.coins, 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) @@ -311,5 +310,5 @@ if __name__ == "__main__": details = dict(coins=coins, info=info) print(json.dumps(info, sort_keys=True, indent=4)) - with open(os.path.join(coin_defs.DEFS_DIR, "coins_details.json"), "w") as f: + with open(os.path.join(coin_info.DEFS_DIR, "coins_details.json"), "w") as f: json.dump(details, f, sort_keys=True, indent=4) diff --git a/tools/support.py b/tools/support.py index c9659df39..fe610baca 100755 --- a/tools/support.py +++ b/tools/support.py @@ -2,10 +2,10 @@ import os import sys import click -import coin_defs +import coin_info import json -SUPPORT_INFO = coin_defs.get_support_data() +SUPPORT_INFO = coin_info.get_support_data() MANDATORY_ENTRIES = ("trezor1", "trezor2", "connect", "webwallet") @@ -36,7 +36,7 @@ def update_support(key, entry, value): def write_support_info(): - with open(os.path.join(coin_defs.DEFS_DIR, "support.json"), "w") as f: + with open(os.path.join(coin_info.DEFS_DIR, "support.json"), "w") as f: json.dump(SUPPORT_INFO, f, indent=4) f.write("\n") @@ -69,11 +69,11 @@ def check(): here for convenience and because it makes sense. But it's preferable to run it as part of 'coin_gen.py check'. """ - defs = coin_defs.get_all() - support_data = coin_defs.get_support_data() + defs = coin_info.get_all() + support_data = coin_info.get_support_data() import coin_gen - if not coin_gen.check_support(defs, support_data): + if not coin_gen.check_support(defs, support_data, fail_missing=True): sys.exit(1) @@ -88,7 +88,7 @@ def show(keyword): Only coins listed in support.json are considered "supported". That means that Ethereum networks, ERC20 tokens and NEM mosaics will probably show up wrong. """ - defs = coin_defs.get_list() + defs = coin_info.get_all().as_list() if keyword: for coin in defs: @@ -138,7 +138,7 @@ def set(support_key, entries, dry_run): 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. """ - coins = coin_defs.get_dict() + coins = coin_info.get_all().as_dict() if support_key not in coins: click.echo("Failed to find key {}".format(support_key)) click.echo("Use 'support.py show' to search for the right one.") From 7cb9bd9c785f8139dd3cbdcc261096a9a84809e4 Mon Sep 17 00:00:00 2001 From: matejcik Date: Mon, 30 Jul 2018 14:45:01 +0200 Subject: [PATCH 11/50] tools: clean up imports in coin_gen --- tools/coin_gen.py | 66 +++++++++++++++++++++++++++++++++--------- tools/requirements.txt | 13 +++++++++ 2 files changed, 65 insertions(+), 14 deletions(-) create mode 100644 tools/requirements.txt diff --git a/tools/coin_gen.py b/tools/coin_gen.py index 771b0c33f..b29ce577a 100755 --- a/tools/coin_gen.py +++ b/tools/coin_gen.py @@ -5,10 +5,16 @@ import re import sys import os import glob +import binascii +import struct +import zlib +from hashlib import sha256 import click import coin_info +from coindef import CoinDef + try: import mako @@ -25,15 +31,9 @@ except ImportError: requests = None try: - import binascii - import struct - import zlib - from hashlib import sha256 import ed25519 from PIL import Image from trezorlib import protobuf - from coindef import CoinDef - CAN_BUILD_DEFS = True except ImportError: CAN_BUILD_DEFS = False @@ -159,6 +159,29 @@ def check_backends(coins): 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 + + # ====== coindefs generators ====== @@ -222,24 +245,34 @@ def cli(): @cli.command() @click.option( - "--check-missing-support/--no-check-missing-support", + "--missing-support/--no-missing-support", "-s", + default=False, help="Fail if support info for a coin is missing", ) @click.option( - "--backend-check/--no-backend-check", + "--backend/--no-backend", "-b", - help="Also check blockbook/bitcore responses", + default=False, + help="Check blockbook/bitcore responses", ) -def check(check_missing_support, backend_check): +@click.option( + "--icons/--no-icons", + default=True, + help="Check icon files" +) +def check(missing_support, backend, icons): """Validate coin definitions. Checks that every btc-like coin is properly filled out, reports address collisions and missing support information. """ - if backend_check and requests is None: + 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 = coin_info.get_all() all_checks_passed = True @@ -249,10 +282,15 @@ def check(check_missing_support, backend_check): print("Checking support data...") support_data = coin_info.get_support_data() - if not check_support(defs, support_data, fail_missing=check_missing_support): + if not check_support(defs, support_data, fail_missing=missing_support): all_checks_passed = False - if backend_check: + if icons: + print("Checking icon files...") + if not check_icons(defs.coins): + all_checks_passed = False + + if backend: print("Checking backend responses...") if not check_backends(defs.coins): all_checks_passed = False @@ -335,7 +373,7 @@ def render(paths): versions = coin_info.latest_releases() support_info = coin_info.support_info(defs, erc20_versions=versions) - # munch dicts - make them attribute-accessable + # 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(): diff --git a/tools/requirements.txt b/tools/requirements.txt new file mode 100644 index 000000000..f910733ab --- /dev/null +++ b/tools/requirements.txt @@ -0,0 +1,13 @@ +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 From e81d440359a944b2690f6ee0ecad306acd609ab7 Mon Sep 17 00:00:00 2001 From: matejcik Date: Mon, 30 Jul 2018 15:05:02 +0200 Subject: [PATCH 12/50] defs: update erc20 tokens, regenerate coins_details.json --- defs/coins_details.json | 486 +++++++++++++++++-------------- defs/coins_details.override.json | 2 +- defs/ethereum/tokens | 2 +- 3 files changed, 265 insertions(+), 225 deletions(-) diff --git a/defs/coins_details.json b/defs/coins_details.json index 5b530ff7d..06b93c5bc 100644 --- a/defs/coins_details.json +++ b/defs/coins_details.json @@ -5,7 +5,7 @@ "Github": "https://github.com/Bitcoin-ABC/bitcoin-abc", "Homepage": "https://www.bitcoincash.org" }, - "marketcap_usd": 13742785799, + "marketcap_usd": 14034413679, "name": "Bitcoin Cash", "shortcut": "BCH", "t1_enabled": "yes", @@ -21,7 +21,7 @@ "Github": "https://github.com/bitcoin/bitcoin", "Homepage": "https://bitcoin.org" }, - "marketcap_usd": 136203971319, + "marketcap_usd": 139846691999, "name": "Bitcoin", "shortcut": "BTC", "t1_enabled": "yes", @@ -37,7 +37,7 @@ "Github": "https://github.com/BTCPrivate/BitcoinPrivate", "Homepage": "https://btcprivate.org" }, - "marketcap_usd": 149954620, + "marketcap_usd": 139956956, "name": "Bitcoin Private", "shortcut": "BTCP", "t1_enabled": "yes", @@ -52,7 +52,7 @@ "Github": "https://github.com/BTCGPU/BTCGPU", "Homepage": "https://bitcoingold.org" }, - "marketcap_usd": 497959882, + "marketcap_usd": 523433696, "name": "Bitcoin Gold", "shortcut": "BTG", "t1_enabled": "yes", @@ -68,7 +68,7 @@ "Github": "https://github.com/LIMXTEC/BitCore", "Homepage": "https://bitcore.cc" }, - "marketcap_usd": 30064254, + "marketcap_usd": 30853808, "name": "Bitcore", "shortcut": "BTX", "t1_enabled": "no", @@ -81,7 +81,7 @@ "Github": "https://github.com/Crowndev/crowncoin", "Homepage": "https://crown.tech" }, - "marketcap_usd": 6768071, + "marketcap_usd": 9788097, "name": "Crown", "shortcut": "CRW", "t1_enabled": "no", @@ -94,7 +94,7 @@ "Github": "https://github.com/dashpay/dash", "Homepage": "https://www.dash.org" }, - "marketcap_usd": 1978399572, + "marketcap_usd": 1942889524, "name": "Dash", "shortcut": "DASH", "t1_enabled": "yes", @@ -110,7 +110,7 @@ "Github": "https://github.com/decred/dcrd", "Homepage": "https://www.decred.org" }, - "marketcap_usd": 507224924, + "marketcap_usd": 495856582, "name": "Decred", "shortcut": "DCR", "t1_enabled": "yes", @@ -123,7 +123,7 @@ "Github": "https://github.com/digibyte/digibyte", "Homepage": "https://digibyte.io" }, - "marketcap_usd": 420450687, + "marketcap_usd": 427647326, "name": "DigiByte", "shortcut": "DGB", "t1_enabled": "yes", @@ -149,7 +149,7 @@ "Github": "https://github.com/dogecoin/dogecoin", "Homepage": "http://dogecoin.com" }, - "marketcap_usd": 387724656, + "marketcap_usd": 371487254, "name": "Dogecoin", "shortcut": "DOGE", "t1_enabled": "yes", @@ -164,7 +164,7 @@ "Github": "https://github.com/fujicoin/fujicoin", "Homepage": "http://fujicoin.org" }, - "marketcap_usd": 728345, + "marketcap_usd": 745832, "name": "Fujicoin", "shortcut": "FJC", "t1_enabled": "yes", @@ -179,7 +179,7 @@ "Github": "https://github.com/flash-coin", "Homepage": "https://www.flashcoin.io" }, - "marketcap_usd": 11828430, + "marketcap_usd": 10829470, "name": "Flashcoin", "shortcut": "FLASH", "t1_enabled": "no", @@ -192,7 +192,7 @@ "Github": "https://github.com/FeatherCoin/Feathercoin", "Homepage": "https://feathercoin.com" }, - "marketcap_usd": 17325381, + "marketcap_usd": 21246165, "name": "Feathercoin", "shortcut": "FTC", "t1_enabled": "no", @@ -205,7 +205,7 @@ "Github": "https://github.com/Groestlcoin/groestlcoin", "Homepage": "https://www.groestlcoin.org" }, - "marketcap_usd": 45013544, + "marketcap_usd": 45964821, "name": "Groestlcoin", "shortcut": "GRS", "t1_enabled": "yes", @@ -233,7 +233,7 @@ "Github": "https://github.com/litecoin-project/litecoin", "Homepage": "https://litecoin.org" }, - "marketcap_usd": 4762460123, + "marketcap_usd": 4774226092, "name": "Litecoin", "shortcut": "LTC", "t1_enabled": "yes", @@ -249,7 +249,7 @@ "Github": "https://github.com/monacoinproject/monacoin", "Homepage": "https://monacoin.org" }, - "marketcap_usd": 132461117, + "marketcap_usd": 128119443, "name": "Monacoin", "shortcut": "MONA", "t1_enabled": "yes", @@ -277,7 +277,7 @@ "Github": "https://github.com/namecoin/namecoin-core", "Homepage": "https://namecoin.org" }, - "marketcap_usd": 30482980, + "marketcap_usd": 32374353, "name": "Namecoin", "shortcut": "NMC", "t1_enabled": "yes", @@ -292,7 +292,7 @@ "Github": "https://github.com/FundacionPesetacoin/PesetacoinCore", "Homepage": "http://pesetacoin.info" }, - "marketcap_usd": 3421001, + "marketcap_usd": 3356792, "name": "Pesetacoin", "shortcut": "PTC", "t1_enabled": "no", @@ -391,7 +391,7 @@ "Github": "https://github.com/terracoin/terracoin", "Homepage": "https://terracoin.io" }, - "marketcap_usd": 2070984, + "marketcap_usd": 2187227, "name": "Terracoin", "shortcut": "TRC", "t1_enabled": "no", @@ -404,7 +404,7 @@ "Github": "https://github.com/viacoin", "Homepage": "https://viacoin.org" }, - "marketcap_usd": 29527200, + "marketcap_usd": 30564496, "name": "Viacoin", "shortcut": "VIA", "t1_enabled": "yes", @@ -419,7 +419,7 @@ "Github": "https://github.com/vertcoin-project/vertcoin-core", "Homepage": "https://vertcoin.org" }, - "marketcap_usd": 53546930, + "marketcap_usd": 61062807, "name": "Vertcoin", "shortcut": "VTC", "t1_enabled": "yes", @@ -434,7 +434,7 @@ "Github": "https://github.com/myriadcoin/myriadcoin", "Homepage": "https://www.myriadcoin.org" }, - "marketcap_usd": 6517125, + "marketcap_usd": 6347837, "name": "Myriad", "shortcut": "XMY", "t1_enabled": "no", @@ -447,7 +447,7 @@ "Github": "https://github.com/zcoinofficial/zcoin", "Homepage": "https://zcoin.io" }, - "marketcap_usd": 83007553, + "marketcap_usd": 84122050, "name": "Zcoin", "shortcut": "XZC", "t1_enabled": "yes", @@ -463,7 +463,7 @@ "Github": "https://github.com/zcash/zcash", "Homepage": "https://z.cash" }, - "marketcap_usd": 954755674, + "marketcap_usd": 942969596, "name": "Zcash", "shortcut": "ZEC", "t1_enabled": "yes", @@ -478,7 +478,7 @@ "Github": "https://github.com/ZencashOfficial/zen", "Homepage": "https://zencash.com" }, - "marketcap_usd": 125906033, + "marketcap_usd": 125295762, "name": "Zencash", "shortcut": "ZEN", "t1_enabled": "no", @@ -619,7 +619,7 @@ "links": { "Homepage": "https://0xbitcoin.org/" }, - "marketcap_usd": 2187389, + "marketcap_usd": 2562071, "name": "0xBitcoin", "network": "eth", "shortcut": "0xBTC", @@ -636,7 +636,7 @@ "links": { "Homepage": "https://firstblood.io" }, - "marketcap_usd": 12785672, + "marketcap_usd": 12448386, "name": "FirstBlood", "network": "eth", "shortcut": "1ST", @@ -755,7 +755,7 @@ "links": { "Homepage": "http://accelerator.network" }, - "marketcap_usd": 228592, + "marketcap_usd": 207162, "name": "Accelerator Network", "network": "eth", "shortcut": "ACC", @@ -790,7 +790,7 @@ "Github": "https://github.com/aditus", "Homepage": "https://aditus.net" }, - "marketcap_usd": 1703030, + "marketcap_usd": 1522306, "name": "Aditus", "network": "eth", "shortcut": "ADI", @@ -825,7 +825,7 @@ "links": { "Homepage": "https://adshares.net" }, - "marketcap_usd": 2070638, + "marketcap_usd": 2099546, "name": "AdShares", "network": "eth", "shortcut": "ADST", @@ -843,7 +843,7 @@ "Github": "https://github.com/adchain", "Homepage": "https://adtoken.com" }, - "marketcap_usd": 18658200, + "marketcap_usd": 18169162, "name": "AdToken", "network": "eth", "shortcut": "ADT", @@ -879,7 +879,7 @@ "Github": "https://github.com/aeternity", "Homepage": "https://www.aeternity.com/" }, - "marketcap_usd": 448485182, + "marketcap_usd": 477255215, "name": "aeternity", "network": "eth", "shortcut": "AE", @@ -897,7 +897,7 @@ "Github": "https://github.com/singnet/singnet", "Homepage": "https://singularitynet.io" }, - "marketcap_usd": 45404870, + "marketcap_usd": 45481505, "name": "SingularityNET", "network": "eth", "shortcut": "AGI", @@ -915,7 +915,7 @@ "Github": "https://github.com/aionnetwork", "Homepage": "https://aion.network/" }, - "marketcap_usd": 152498011, + "marketcap_usd": 156312044, "name": "Aion", "network": "eth", "shortcut": "AION", @@ -932,7 +932,7 @@ "links": { "Homepage": "https://airtoken.com" }, - "marketcap_usd": 4683294, + "marketcap_usd": 5084029, "name": "AirToken", "network": "eth", "shortcut": "AIR", @@ -950,7 +950,7 @@ "Github": "https://github.com/AigangNetwork", "Homepage": "https://aigang.network/" }, - "marketcap_usd": 1420341, + "marketcap_usd": 1295077, "name": "Aigang", "network": "eth", "shortcut": "AIX", @@ -1003,7 +1003,7 @@ "Github": "https://github.com/AlisProject", "Homepage": "https://alismedia.jp" }, - "marketcap_usd": 2806230, + "marketcap_usd": 3001684, "name": "ALIS Token", "network": "eth", "shortcut": "ALIS", @@ -1074,7 +1074,7 @@ "Github": "https://github.com/amontech", "Homepage": "https://amon.tech" }, - "marketcap_usd": 1150968, + "marketcap_usd": 1054782, "name": "Amon", "network": "eth", "shortcut": "AMN", @@ -1144,7 +1144,7 @@ "Github": "https://github.com/Oxchild/crowdsale", "Homepage": "https://apisplatform.io" }, - "marketcap_usd": 26916818, + "marketcap_usd": 25481250, "name": "APIS", "network": "eth", "shortcut": "APIS", @@ -1162,7 +1162,7 @@ "Github": "https://github.com/Aptoide/AppCoins-ethereumj", "Homepage": "https://appcoins.io" }, - "marketcap_usd": 17238858, + "marketcap_usd": 17304441, "name": "AppCoins", "network": "eth", "shortcut": "APPC", @@ -1179,7 +1179,7 @@ "links": { "Homepage": "https://aigang.network" }, - "marketcap_usd": 1420341, + "marketcap_usd": 1295077, "name": "AIGang", "network": "eth", "shortcut": "APT", @@ -1198,7 +1198,7 @@ "Homepage": "https://arcade.city" }, "marketcap_usd": 0, - "name": "ARC", + "name": "Arcade Token", "network": "eth", "shortcut": "ARC", "t1_enabled": "yes", @@ -1214,7 +1214,7 @@ "links": { "Homepage": "https://www.arbitragect.com" }, - "marketcap_usd": 254831, + "marketcap_usd": 235767, "name": "ArbitrageCT", "network": "eth", "shortcut": "ARCT", @@ -1319,7 +1319,7 @@ "links": { "Homepage": "https://airswap.io" }, - "marketcap_usd": 21286200, + "marketcap_usd": 21923707, "name": "Airswap", "network": "eth", "shortcut": "AST", @@ -1506,6 +1506,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": 5350824, + "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": { @@ -1689,7 +1707,7 @@ "Github": "https://github.com/thebeetoken", "Homepage": "https://www.beetoken.com" }, - "marketcap_usd": 3439466, + "marketcap_usd": 3484443, "name": "Bee Token", "network": "eth", "shortcut": "BEE", @@ -1813,7 +1831,7 @@ "Github": "https://github.com/BankEx", "Homepage": "https://bankex.com/" }, - "marketcap_usd": 12829167, + "marketcap_usd": 14448321, "name": "BANKEX", "network": "eth", "shortcut": "BKX", @@ -1849,7 +1867,7 @@ "Github": "https://github.com/BlueCrypto", "Homepage": "https://blueprotocol.com/" }, - "marketcap_usd": 2892679, + "marketcap_usd": 2867676, "name": "Ethereum Blue", "network": "eth", "shortcut": "BLUE", @@ -1884,7 +1902,7 @@ "links": { "Homepage": "https://www.iconomi.net" }, - "marketcap_usd": 54548929, + "marketcap_usd": 54313273, "name": "Iconomi", "network": "eth", "shortcut": "BLX (Iconomi)", @@ -2021,7 +2039,7 @@ "Github": "https://github.com/bancorprotocol", "Homepage": "https://www.bancor.network/discover" }, - "marketcap_usd": 114236636, + "marketcap_usd": 117725395, "name": "Bancor", "network": "eth", "shortcut": "BNT", @@ -2072,7 +2090,7 @@ "links": { "Homepage": "https://bonpay.com" }, - "marketcap_usd": 1381380, + "marketcap_usd": 1319939, "name": "Bonpay", "network": "eth", "shortcut": "BON", @@ -2158,7 +2176,7 @@ "links": { "Homepage": "http://bro-consortium.io" }, - "marketcap_usd": 63388, + "marketcap_usd": 77904, "name": "BRAT", "network": "eth", "shortcut": "BRAT", @@ -2176,7 +2194,7 @@ "Github": "https://github.com/breadwallet", "Homepage": "https://token.breadapp.com/en" }, - "marketcap_usd": 33571968, + "marketcap_usd": 35196841, "name": "Bread", "network": "eth", "shortcut": "BRD", @@ -2369,7 +2387,7 @@ "Github": "https://github.com/bytom", "Homepage": "https://bytom.io" }, - "marketcap_usd": 351149431, + "marketcap_usd": 343741863, "name": "Bytom", "network": "eth", "shortcut": "BTM", @@ -2472,7 +2490,7 @@ "Github": "https://github.com/cryptotwenty", "Homepage": "https://crypto20.com" }, - "marketcap_usd": 41436137, + "marketcap_usd": 42246643, "name": "Crypto20's Token", "network": "eth", "shortcut": "C20", @@ -2607,7 +2625,7 @@ "links": { "Homepage": "https://cashaa.com" }, - "marketcap_usd": 14200361, + "marketcap_usd": 12039760, "name": "Cashaa", "network": "eth", "shortcut": "CAS", @@ -3076,7 +3094,7 @@ "links": { "Homepage": "https://cindicator.com" }, - "marketcap_usd": 42645320, + "marketcap_usd": 42756186, "name": "Cindicator", "network": "eth", "shortcut": "CND", @@ -3183,7 +3201,7 @@ "Github": "https://github.com/CoinvestHQ", "Homepage": "https://coinve.st" }, - "marketcap_usd": 138539, + "marketcap_usd": 145556, "name": "Coinvest V2 Token", "network": "eth", "shortcut": "COIN", @@ -3195,12 +3213,29 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:CORI": { + "address": "0x725B190Bc077FFde17Cf549AA8ba25e298550B18", + "links": { + "Homepage": "https://corrently.de/token/" + }, + "marketcap_usd": 0, + "name": "Corrently Invest Token", + "network": "eth", + "shortcut": "CORI", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:COV": { "address": "0xE2FB6529EF566a080e6d23dE0bd351311087D567", "links": { "Homepage": "https://covesting.io/" }, - "marketcap_usd": 19758025, + "marketcap_usd": 19053930, "name": "Covesting", "network": "eth", "shortcut": "COV", @@ -3236,7 +3271,7 @@ "Github": "https://github.com/aditus", "Homepage": "https://copytrack.io" }, - "marketcap_usd": 1801050, + "marketcap_usd": 1647004, "name": "COPYTRACK", "network": "eth", "shortcut": "CPY", @@ -3306,7 +3341,7 @@ "links": { "Homepage": "https://bitbounce.io" }, - "marketcap_usd": 14403918, + "marketcap_usd": 16106922, "name": "Credo / Bitbounce", "network": "eth", "shortcut": "CREDO", @@ -3497,7 +3532,7 @@ "Github": "https://github.com/cargoxio", "Homepage": "https://cargox.io" }, - "marketcap_usd": 4927779, + "marketcap_usd": 5508470, "name": "CargoX", "network": "eth", "shortcut": "CXO", @@ -3514,7 +3549,7 @@ "links": { "Homepage": "https://ccrb.io" }, - "marketcap_usd": 2485047, + "marketcap_usd": 2465241, "name": "CryptoCarbon", "network": "eth", "shortcut": "CryptoCarbon", @@ -3548,7 +3583,7 @@ "links": { "Homepage": "https://dadi.cloud" }, - "marketcap_usd": 6972897, + "marketcap_usd": 6397034, "name": "DADI", "network": "eth", "shortcut": "DADI", @@ -3566,7 +3601,7 @@ "Github": "https://github.com/makerdao", "Homepage": "https://makerdao.com" }, - "marketcap_usd": 54565947, + "marketcap_usd": 54947750, "name": "Dai Stablecoin v1.0", "network": "eth", "shortcut": "DAI", @@ -3583,7 +3618,7 @@ "links": { "Homepage": "http://www.dalecoin.org" }, - "marketcap_usd": 86518, + "marketcap_usd": 96967, "name": "DaleCoin", "network": "eth", "shortcut": "DALC", @@ -3671,7 +3706,7 @@ "Github": "https://github.com/streamr-dev", "Homepage": "https://www.streamr.com" }, - "marketcap_usd": 169556, + "marketcap_usd": 105505, "name": "DATACoin", "network": "eth", "shortcut": "DATACoin", @@ -3760,7 +3795,7 @@ "Github": "https://github.com/DistributedBanking/DCC", "Homepage": "http://dcc.finance" }, - "marketcap_usd": 22593785, + "marketcap_usd": 22042740, "name": "Distributed Credit Chain", "network": "eth", "shortcut": "DCC", @@ -3795,7 +3830,7 @@ "Github": "https://github.com/Dentacoin", "Homepage": "https://dentacoin.com" }, - "marketcap_usd": 121243831, + "marketcap_usd": 114423800, "name": "Dentacoin", "network": "eth", "shortcut": "DCN", @@ -3865,7 +3900,7 @@ "links": { "Homepage": "https://www.dentwireless.com" }, - "marketcap_usd": 31784946, + "marketcap_usd": 30123358, "name": "DENT", "network": "eth", "shortcut": "DENT", @@ -3917,7 +3952,7 @@ "Github": "https://github.com/digipulseio", "Homepage": "https://www.digipulse.io" }, - "marketcap_usd": 3413071, + "marketcap_usd": 2775061, "name": "DigiPulse", "network": "eth", "shortcut": "DGPT", @@ -3953,7 +3988,7 @@ "Github": "https://github.com/DigixGlobal", "Homepage": "https://digix.global" }, - "marketcap_usd": 2000406, + "marketcap_usd": 2025076, "name": "Digix Gold Token", "network": "eth", "shortcut": "DGX", @@ -3988,7 +4023,7 @@ "links": { "Homepage": "https://etheroll.com" }, - "marketcap_usd": 7422700, + "marketcap_usd": 7929119, "name": "Etheroll", "network": "eth", "shortcut": "DICE", @@ -4091,7 +4126,7 @@ "Homepage": "https://district0x.io" }, "marketcap_usd": 0, - "name": "DistrictOx", + "name": "District0x Network Token", "network": "eth", "shortcut": "DNT", "t1_enabled": "yes", @@ -4177,7 +4212,7 @@ "links": { "Homepage": "https://dropil.com" }, - "marketcap_usd": 114526762, + "marketcap_usd": 111935208, "name": "Dropil", "network": "eth", "shortcut": "DROP (dropil)", @@ -4230,7 +4265,7 @@ "Github": "https://github.com/dethertech", "Homepage": "https://dether.io" }, - "marketcap_usd": 2837715, + "marketcap_usd": 2794427, "name": "dether", "network": "eth", "shortcut": "DTH", @@ -4335,7 +4370,7 @@ "Github": "https://github.com/elangindonesia/EagleCoin", "Homepage": "https://eaglepay.io" }, - "marketcap_usd": 154096, + "marketcap_usd": 154491, "name": "EagleCoin", "network": "eth", "shortcut": "EAGLE", @@ -4420,7 +4455,7 @@ "links": { "Homepage": "https://edgeless.io" }, - "marketcap_usd": 32409395, + "marketcap_usd": 33666309, "name": "Edgeless", "network": "eth", "shortcut": "EDG", @@ -4437,7 +4472,7 @@ "links": { "Homepage": "https://eidoo.io" }, - "marketcap_usd": 26001179, + "marketcap_usd": 25997263, "name": "Eidoo", "network": "eth", "shortcut": "EDO", @@ -4526,7 +4561,7 @@ "Github": "https://github.com/eltcoin", "Homepage": "http://www.eltcoin.tech/" }, - "marketcap_usd": 334662, + "marketcap_usd": 342443, "name": "ELTCOIN", "network": "eth", "shortcut": "ELTCOIN", @@ -4703,7 +4738,7 @@ "links": { "Homepage": "https://eos.io" }, - "marketcap_usd": 7308090147, + "marketcap_usd": 7298516946, "name": "EOS", "network": "eth", "shortcut": "EOS", @@ -4756,7 +4791,7 @@ "links": { "Homepage": "https://www.ethbits.com" }, - "marketcap_usd": 1984761, + "marketcap_usd": 1809661, "name": "Ethbits", "network": "eth", "shortcut": "ETBS", @@ -5088,7 +5123,7 @@ "Github": "https://github.com/FundRequest", "Homepage": "https://fundrequest.io" }, - "marketcap_usd": 1189807, + "marketcap_usd": 1188860, "name": "FundRequest", "network": "eth", "shortcut": "FND", @@ -5192,7 +5227,7 @@ "links": { "Homepage": "https://funfair.io" }, - "marketcap_usd": 124880359, + "marketcap_usd": 126365312, "name": "Funfair", "network": "eth", "shortcut": "FUN", @@ -5245,7 +5280,7 @@ "Github": "https://github.com/BlockchainLabsNZ/gambit", "Homepage": "http://gambitcrypto.com" }, - "marketcap_usd": 5882833, + "marketcap_usd": 6158034, "name": "Gambit", "network": "eth", "shortcut": "GAM", @@ -5368,7 +5403,7 @@ "Github": "https://github.com/daostack", "Homepage": "https://daostack.io" }, - "marketcap_usd": 5478091, + "marketcap_usd": 5439100, "name": "DAOstack", "network": "eth", "shortcut": "GEN", @@ -5473,7 +5508,7 @@ "links": { "Homepage": "https://golem.network" }, - "marketcap_usd": 279952859, + "marketcap_usd": 280972506, "name": "Golem", "network": "eth", "shortcut": "GNT", @@ -5508,7 +5543,7 @@ "links": { "Homepage": "https://gridplus.io/token-sale" }, - "marketcap_usd": 12753939, + "marketcap_usd": 12981175, "name": "GRID", "network": "eth", "shortcut": "GRID", @@ -5597,7 +5632,7 @@ "Github": "https://github.com/GIFTO-io", "Homepage": "https://gifto.io/" }, - "marketcap_usd": 80119750, + "marketcap_usd": 77346378, "name": "Gifto", "network": "eth", "shortcut": "GTO", @@ -5615,7 +5650,7 @@ "Github": "https://github.com/GenesisVision", "Homepage": "https://genesis.vision" }, - "marketcap_usd": 31044868, + "marketcap_usd": 29228461, "name": "Genesis Vision", "network": "eth", "shortcut": "GVT", @@ -5720,7 +5755,7 @@ "Github": "https://github.com/havven/havven", "Homepage": "https://havven.io" }, - "marketcap_usd": 13299230, + "marketcap_usd": 17195341, "name": "Havven", "network": "eth", "shortcut": "HAV", @@ -5842,7 +5877,7 @@ "links": { "Homepage": "https://github.com/arachnid/hodlcoin" }, - "marketcap_usd": 299502, + "marketcap_usd": 240428, "name": "HODLCoin", "network": "eth", "shortcut": "HODL", @@ -5895,7 +5930,7 @@ "Github": "https://github.com/HiveProjectLTD", "Homepage": "https://hive-project.net" }, - "marketcap_usd": 20154450, + "marketcap_usd": 20232639, "name": "Hive Project", "network": "eth", "shortcut": "HVN", @@ -6034,7 +6069,7 @@ "links": { "Homepage": "https://icos.icobox.io" }, - "marketcap_usd": 4096363, + "marketcap_usd": 3553726, "name": "ICOS", "network": "eth", "shortcut": "ICOS", @@ -6051,7 +6086,7 @@ "links": { "Homepage": "https://www.icon.foundation" }, - "marketcap_usd": 493141981, + "marketcap_usd": 507798617, "name": "ICON", "network": "eth", "shortcut": "ICX", @@ -6085,7 +6120,7 @@ "links": { "Homepage": "https://investfeed.com" }, - "marketcap_usd": 4316662, + "marketcap_usd": 4546572, "name": "InvestFeed", "network": "eth", "shortcut": "IFT", @@ -6220,7 +6255,7 @@ "links": { "Homepage": "https://insights.network" }, - "marketcap_usd": 2851298, + "marketcap_usd": 2492982, "name": "Insights Network", "network": "eth", "shortcut": "INSTAR", @@ -6237,7 +6272,7 @@ "links": { "Homepage": "https://internxt.io" }, - "marketcap_usd": 2494494, + "marketcap_usd": 1892668, "name": "Internxt", "network": "eth", "shortcut": "INXT", @@ -6254,7 +6289,7 @@ "links": { "Homepage": "https://iost.io/" }, - "marketcap_usd": 221739000, + "marketcap_usd": 212517876, "name": "IOSToken", "network": "eth", "shortcut": "IOST", @@ -6319,13 +6354,31 @@ "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:ITC": { "address": "0x5E6b6d9aBAd9093fdc861Ea1600eBa1b355Cd940", "links": { "Github": "https://github.com/IoTChainCode", "Homepage": "https://iotchain.io/" }, - "marketcap_usd": 26750163, + "marketcap_usd": 27009990, "name": "IoT Chain", "network": "eth", "shortcut": "ITC", @@ -6515,7 +6568,7 @@ "Github": "https://github.com/kikinteractive/kin-token", "Homepage": "https://kin.kik.com" }, - "marketcap_usd": 132768463, + "marketcap_usd": 155514660, "name": "Kin Foundation", "network": "eth", "shortcut": "KIN", @@ -6533,7 +6586,7 @@ "Github": "https://github.com/KyberNetwork", "Homepage": "https://kyber.network" }, - "marketcap_usd": 119484736, + "marketcap_usd": 117987320, "name": "Kyber Network", "network": "eth", "shortcut": "KNC", @@ -6569,7 +6622,7 @@ "Github": "https://github.com/Cryptense/", "Homepage": "https://kryll.io/" }, - "marketcap_usd": 705990, + "marketcap_usd": 688382, "name": "Kryll", "network": "eth", "shortcut": "KRL", @@ -6604,7 +6657,7 @@ "Github": "https://github.com/latoken", "Homepage": "https://latoken.com/" }, - "marketcap_usd": 8879580, + "marketcap_usd": 9051088, "name": "LATOKEN", "network": "eth", "shortcut": "LA", @@ -6638,7 +6691,7 @@ "links": { "Homepage": "https://www.leadcoin.network/" }, - "marketcap_usd": 2555566, + "marketcap_usd": 2710164, "name": "LEADCOIN", "network": "eth", "shortcut": "LDC", @@ -6652,8 +6705,10 @@ }, "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", @@ -6740,7 +6795,7 @@ "links": { "Homepage": "http://www.lifelabs.io" }, - "marketcap_usd": 2645178, + "marketcap_usd": 3810614, "name": "LIFE", "network": "eth", "shortcut": "LIFE", @@ -6828,7 +6883,7 @@ "Github": "https://github.com/linkercoinfoundation", "Homepage": "https://www.linkercoin.com/en" }, - "marketcap_usd": 4110499, + "marketcap_usd": 3483072, "name": "Linker Coin", "network": "eth", "shortcut": "LNC-Linker Coin", @@ -6846,7 +6901,7 @@ "Github": "https://github.com/lendingblock", "Homepage": "https://lendingblock.com" }, - "marketcap_usd": 3206403, + "marketcap_usd": 2681371, "name": "Lendingblock", "network": "eth", "shortcut": "LND", @@ -6863,7 +6918,7 @@ "links": { "Homepage": "https://LockChain.co" }, - "marketcap_usd": 8149690, + "marketcap_usd": 8671107, "name": "LockChain", "network": "eth", "shortcut": "LOC", @@ -6881,7 +6936,7 @@ "Github": "http://github.com/locipro/loci-coin-sale", "Homepage": "https://locipro.com" }, - "marketcap_usd": 4748632, + "marketcap_usd": 5205604, "name": "LOCIcoin", "network": "eth", "shortcut": "LOCI", @@ -7196,7 +7251,7 @@ "Github": "https://github.com/theembermine", "Homepage": "https://embermine.com/" }, - "marketcap_usd": 389738, + "marketcap_usd": 333231, "name": "Embers", "network": "eth", "shortcut": "MBRS", @@ -7212,7 +7267,7 @@ "address": "0x93E682107d1E9defB0b5ee701C71707a4B2E46Bc", "hidden": 1, "links": {}, - "marketcap_usd": 325138, + "marketcap_usd": 246689, "name": "MCAP", "network": "eth", "shortcut": "MCAP", @@ -7230,7 +7285,7 @@ "Github": "https://github.com/musiconomi/", "Homepage": "https://musiconomi.com/" }, - "marketcap_usd": 636259, + "marketcap_usd": 531117, "name": "Musiconomi", "network": "eth", "shortcut": "MCI", @@ -7510,7 +7565,7 @@ "Github": "https://github.com/modum-io", "Homepage": "https://modum.io" }, - "marketcap_usd": 17985321, + "marketcap_usd": 16797450, "name": "Modum", "network": "eth", "shortcut": "MOD", @@ -7579,7 +7634,7 @@ "links": { "Homepage": "https://mothership.cx" }, - "marketcap_usd": 19547360, + "marketcap_usd": 18985808, "name": "Mothership", "network": "eth", "shortcut": "MSP", @@ -7614,7 +7669,7 @@ "links": { "Homepage": "http://www.monetha.io" }, - "marketcap_usd": 7667625, + "marketcap_usd": 8282450, "name": "Monetha", "network": "eth", "shortcut": "MTH", @@ -7734,7 +7789,7 @@ "Github": "https://github.com/Merculet", "Homepage": "https://www.merculet.io" }, - "marketcap_usd": 8246033, + "marketcap_usd": 8860323, "name": "Merculet", "network": "eth", "shortcut": "MVP", @@ -7784,7 +7839,7 @@ "links": { "Homepage": "https://mysterium.network" }, - "marketcap_usd": 4098996, + "marketcap_usd": 4143991, "name": "Mysterium", "network": "eth", "shortcut": "MYST", @@ -7819,7 +7874,7 @@ "Github": "https://github.com/NANJ-COIN", "Homepage": "https://nanjcoin.com/" }, - "marketcap_usd": 26179985, + "marketcap_usd": 24125286, "name": "NANJCOIN", "network": "eth", "shortcut": "NANJ", @@ -7873,7 +7928,7 @@ "Github": "https://github.com/polyswarm", "Homepage": "https://polyswarm.io" }, - "marketcap_usd": 28280604, + "marketcap_usd": 26652501, "name": "Nectar", "network": "eth", "shortcut": "NCT", @@ -7890,7 +7945,7 @@ "links": { "Homepage": "https://neverdie.com" }, - "marketcap_usd": 719747, + "marketcap_usd": 737077, "name": "Neverdie", "network": "eth", "shortcut": "NDC", @@ -8032,7 +8087,7 @@ "Github": "https://github.com/NperProject", "Homepage": "https://nper.io" }, - "marketcap_usd": 3789178, + "marketcap_usd": 3629046, "name": "NPER", "network": "eth", "shortcut": "NPER", @@ -8067,7 +8122,7 @@ "links": { "Homepage": "https://nuls.io" }, - "marketcap_usd": 98932000, + "marketcap_usd": 99949482, "name": "NULS", "network": "eth", "shortcut": "NULS", @@ -8118,7 +8173,7 @@ "links": { "Homepage": "https://beyond-the-void.net" }, - "marketcap_usd": 3208501, + "marketcap_usd": 2520441, "name": "Nexium", "network": "eth", "shortcut": "NxC", @@ -8152,7 +8207,7 @@ "links": { "Homepage": "https://www.openanx.org/en" }, - "marketcap_usd": 8103447, + "marketcap_usd": 7876053, "name": "OAX", "network": "eth", "shortcut": "OAX", @@ -8330,7 +8385,7 @@ "Github": "https://github.com/OpenSTFoundation", "Homepage": "https://simpletoken.org" }, - "marketcap_usd": 20921770, + "marketcap_usd": 21093182, "name": "Simple Token 'OST'", "network": "eth", "shortcut": "OST", @@ -8384,7 +8439,7 @@ "Github": "https://github.com/policypalnet", "Homepage": "https://www.policypal.network" }, - "marketcap_usd": 5838102, + "marketcap_usd": 5620794, "name": "PolicyPal Network", "network": "eth", "shortcut": "PAL", @@ -8472,7 +8527,7 @@ "links": { "Homepage": "http://www.tenx.tech" }, - "marketcap_usd": 95669125, + "marketcap_usd": 106796353, "name": "TenX", "network": "eth", "shortcut": "PAY", @@ -8541,7 +8596,7 @@ "Github": "https://github.com/PeculiumPCL/Peculium", "Homepage": "https://peculium.io" }, - "marketcap_usd": 3059219, + "marketcap_usd": 3168638, "name": "Peculium", "network": "eth", "shortcut": "PCL", @@ -8680,7 +8735,7 @@ "links": { "Homepage": "https://polybius.io" }, - "marketcap_usd": 10872599, + "marketcap_usd": 12192473, "name": "Polybius", "network": "eth", "shortcut": "PLBT", @@ -8784,7 +8839,7 @@ "links": { "Homepage": "https://polymath.network" }, - "marketcap_usd": 101096231, + "marketcap_usd": 109207468, "name": "Polymath Network", "network": "eth", "shortcut": "POLY", @@ -8819,7 +8874,7 @@ "Github": "https://github.com/PoSToken", "Homepage": "https://postoken.org" }, - "marketcap_usd": 57612, + "marketcap_usd": 49382, "name": "PoSToken", "network": "eth", "shortcut": "POS", @@ -8853,7 +8908,7 @@ "links": { "Homepage": "https://www.paypie.com" }, - "marketcap_usd": 19054283, + "marketcap_usd": 18973078, "name": "PayPie", "network": "eth", "shortcut": "PPP", @@ -8870,7 +8925,7 @@ "links": { "Homepage": "https://populous.co" }, - "marketcap_usd": 206288939, + "marketcap_usd": 206310332, "name": "Populous", "network": "eth", "shortcut": "PPT", @@ -8887,7 +8942,7 @@ "links": { "Homepage": "https://presearch.io" }, - "marketcap_usd": 16088845, + "marketcap_usd": 16376949, "name": "Presearch", "network": "eth", "shortcut": "PRE", @@ -8940,7 +8995,7 @@ "links": { "Homepage": "https://propy.com" }, - "marketcap_usd": 13249565, + "marketcap_usd": 13823049, "name": "Propy", "network": "eth", "shortcut": "PRO", @@ -9133,7 +9188,7 @@ "links": { "Homepage": "https://liquid.plus" }, - "marketcap_usd": 87768100, + "marketcap_usd": 84608865, "name": "QASH", "network": "eth", "shortcut": "QASH", @@ -9275,7 +9330,7 @@ "Github": "https://github.com/qtumproject", "Homepage": "https://qtum.org/" }, - "marketcap_usd": 683754148, + "marketcap_usd": 672128988, "name": "Qtum", "network": "eth", "shortcut": "QTUM", @@ -9329,7 +9384,7 @@ "Github": "https://github.com/ripio/rcn-token", "Homepage": "https://ripiocredit.network" }, - "marketcap_usd": 21481540, + "marketcap_usd": 25440190, "name": "Ripio Credit Network", "network": "eth", "shortcut": "RCN", @@ -9380,7 +9435,7 @@ "links": { "Homepage": "https://www.rebellious.io" }, - "marketcap_usd": 4840875, + "marketcap_usd": 5352695, "name": "Rebellious", "network": "eth", "shortcut": "REBL", @@ -9398,7 +9453,7 @@ "Github": "https://github.com/red", "Homepage": "https://ico.red-lang.org" }, - "marketcap_usd": 4464525, + "marketcap_usd": 4464577, "name": "Red Community Token", "network": "eth", "shortcut": "RED", @@ -9433,7 +9488,7 @@ "links": { "Homepage": "https://request.network" }, - "marketcap_usd": 45535674, + "marketcap_usd": 45978747, "name": "Request Network", "network": "eth", "shortcut": "REQ", @@ -9468,7 +9523,7 @@ "links": { "Homepage": "https://refereum.com" }, - "marketcap_usd": 29443554, + "marketcap_usd": 25840877, "name": "Refereum", "network": "eth", "shortcut": "RFR", @@ -9520,7 +9575,7 @@ "links": { "Homepage": "http://crowdsale.iex.ec" }, - "marketcap_usd": 49338502, + "marketcap_usd": 53398537, "name": "IEx.ec", "network": "eth", "shortcut": "RLC", @@ -9607,7 +9662,7 @@ "Github": "https://github.com/rocketico", "Homepage": "https://rocketico.io" }, - "marketcap_usd": 30374858, + "marketcap_usd": 32455190, "name": "Rocket Token", "network": "eth", "shortcut": "ROCK", @@ -9709,7 +9764,7 @@ "links": { "Homepage": "https://rivetzintl.com" }, - "marketcap_usd": 4189221, + "marketcap_usd": 4339000, "name": "Rivetz", "network": "eth", "shortcut": "RVT", @@ -9760,7 +9815,7 @@ "links": { "Homepage": "https://saltlending.com" }, - "marketcap_usd": 69113519, + "marketcap_usd": 66104435, "name": "Salt Lending Token", "network": "eth", "shortcut": "SALT", @@ -9777,7 +9832,7 @@ "links": { "Homepage": "https://santiment.net" }, - "marketcap_usd": 60746661, + "marketcap_usd": 62087815, "name": "Santiment", "network": "eth", "shortcut": "SAN", @@ -9828,7 +9883,7 @@ "links": { "Homepage": "https://sensay.it" }, - "marketcap_usd": 2343238, + "marketcap_usd": 2966575, "name": "Sensay", "network": "eth", "shortcut": "SENSE", @@ -10001,7 +10056,7 @@ "links": { "Homepage": "http://smartlands.io" }, - "marketcap_usd": 8767215, + "marketcap_usd": 8303928, "name": "Smartlands", "network": "eth", "shortcut": "SLT", @@ -10106,7 +10161,7 @@ "links": { "Homepage": "https://singulardtv.com" }, - "marketcap_usd": 20330100, + "marketcap_usd": 20751904, "name": "SingularDTV", "network": "eth", "shortcut": "SNGLS", @@ -10209,7 +10264,7 @@ "links": { "Homepage": "https://spankchain.com" }, - "marketcap_usd": 19072438, + "marketcap_usd": 21563556, "name": "SpankChain", "network": "eth", "shortcut": "SPANK", @@ -10398,7 +10453,7 @@ "links": { "Homepage": "https://stktoken.com" }, - "marketcap_usd": 9107909, + "marketcap_usd": 8311428, "name": "STK Token", "network": "eth", "shortcut": "STK", @@ -10433,7 +10488,7 @@ "Github": "https://github.com/Storj", "Homepage": "https://storj.io" }, - "marketcap_usd": 66918951, + "marketcap_usd": 64958549, "name": "STORJ", "network": "eth", "shortcut": "STORJ", @@ -10450,7 +10505,7 @@ "links": { "Homepage": "https://www.stormtoken.com" }, - "marketcap_usd": 72848235, + "marketcap_usd": 74980625, "name": "Storm Token", "network": "eth", "shortcut": "STORM", @@ -10486,7 +10541,7 @@ "Github": "https://github.com/Storiqa/", "Homepage": "https://storiqa.com" }, - "marketcap_usd": 26198882, + "marketcap_usd": 24625207, "name": "Storiqa", "network": "eth", "shortcut": "STQ", @@ -10539,7 +10594,7 @@ "links": { "Homepage": "https://substratum.net" }, - "marketcap_usd": 76760473, + "marketcap_usd": 74850688, "name": "Substratum", "network": "eth", "shortcut": "SUB", @@ -10731,7 +10786,7 @@ "Github": "https://github.com/telcoin", "Homepage": "https://www.telco.in" }, - "marketcap_usd": 28849900, + "marketcap_usd": 27585427, "name": "Telcoin", "network": "eth", "shortcut": "TEL", @@ -10749,7 +10804,7 @@ "Github": "https://github.com/TrueFlip", "Homepage": "https://trueflip.io" }, - "marketcap_usd": 4090098, + "marketcap_usd": 4128882, "name": "TrueFlip", "network": "eth", "shortcut": "TFL", @@ -10766,7 +10821,7 @@ "links": { "Homepage": "https://www.thetatoken.org/" }, - "marketcap_usd": 86247309, + "marketcap_usd": 83275610, "name": "Theta Token", "network": "eth", "shortcut": "THETA", @@ -10801,7 +10856,7 @@ "links": { "Homepage": "https://chronobank.io" }, - "marketcap_usd": 8070858, + "marketcap_usd": 7907275, "name": "Chronobank", "network": "eth", "shortcut": "TIME", @@ -10835,7 +10890,7 @@ "links": { "Homepage": "https://www.blocktix.io" }, - "marketcap_usd": 10202800, + "marketcap_usd": 10102469, "name": "Blocktix", "network": "eth", "shortcut": "TIX", @@ -10852,7 +10907,7 @@ "links": { "Homepage": "https://etherscan.io/token/TokenCard" }, - "marketcap_usd": 18520799, + "marketcap_usd": 18740954, "name": "TokenCard", "network": "eth", "shortcut": "TKN", @@ -11007,7 +11062,7 @@ "links": { "Homepage": "https://taas.fund" }, - "marketcap_usd": 15739703, + "marketcap_usd": 15435932, "name": "Token-as-a-Service", "network": "eth", "shortcut": "TaaS", @@ -11042,7 +11097,7 @@ "links": { "Homepage": "https://uquidcoin.com" }, - "marketcap_usd": 9677610, + "marketcap_usd": 10010897, "name": "Uquid Coin", "network": "eth", "shortcut": "UQC", @@ -11110,7 +11165,7 @@ "Github": "https://github.com/UniversaBlockchain/universa", "Homepage": "https://www.universa.io/" }, - "marketcap_usd": 19633367, + "marketcap_usd": 19413778, "name": "Universa", "network": "eth", "shortcut": "UTN-P", @@ -11197,7 +11252,7 @@ "Github": "https://github.com/blockv", "Homepage": "https://blockv.io" }, - "marketcap_usd": 37970723, + "marketcap_usd": 37098426, "name": "BLOCKv", "network": "eth", "shortcut": "VEE", @@ -11249,7 +11304,7 @@ "Github": "https://github.com/vechain-team", "Homepage": "https://tokensale.vechain.com/en" }, - "marketcap_usd": 1322696366, + "marketcap_usd": 1362675288, "name": "Vechain", "network": "eth", "shortcut": "VET", @@ -11301,7 +11356,7 @@ "Github": "https://github.com/ViceIndustryToken", "Homepage": "https://vicetoken.com/" }, - "marketcap_usd": 1687601, + "marketcap_usd": 1733578, "name": "Vice Industry Token", "network": "eth", "shortcut": "VIT", @@ -11389,7 +11444,7 @@ "links": { "Homepage": "https://veros.org" }, - "marketcap_usd": 390848, + "marketcap_usd": 403874, "name": "Veros", "network": "eth", "shortcut": "VRS", @@ -11424,7 +11479,7 @@ "Github": "https://github.com/waxio", "Homepage": "https://wax.io" }, - "marketcap_usd": 126705683, + "marketcap_usd": 127703971, "name": "WAX", "network": "eth", "shortcut": "WAX", @@ -11476,7 +11531,7 @@ "links": { "Homepage": "https://wepower.network" }, - "marketcap_usd": 17623431, + "marketcap_usd": 18045551, "name": "WePower", "network": "eth", "shortcut": "WCT", @@ -11564,7 +11619,7 @@ "links": { "Homepage": "https://wings.ai" }, - "marketcap_usd": 19729554, + "marketcap_usd": 21674199, "name": "WINGS", "network": "eth", "shortcut": "WINGS", @@ -11703,7 +11758,7 @@ "links": { "Homepage": "https://www.wacoin.io" }, - "marketcap_usd": 13995669, + "marketcap_usd": 13659448, "name": "WaBi", "network": "eth", "shortcut": "WaBi", @@ -11754,7 +11809,7 @@ "links": { "Homepage": "http://www.xaurum.org" }, - "marketcap_usd": 4150927, + "marketcap_usd": 4207927, "name": "Xaurum", "network": "eth", "shortcut": "XAUR", @@ -11772,7 +11827,7 @@ "Github": "https://github.com/blitzpredict", "Homepage": "https://www.blitzpredict.io" }, - "marketcap_usd": 1206956, + "marketcap_usd": 1351192, "name": "BlitzPredict", "network": "eth", "shortcut": "XBP", @@ -11895,7 +11950,7 @@ "Github": "https://github.com/InkProtocol/", "Homepage": "https://paywithink.com" }, - "marketcap_usd": 3160605, + "marketcap_usd": 3150830, "name": "Ink Protocol", "network": "eth", "shortcut": "XNK", @@ -11912,7 +11967,7 @@ "links": { "Homepage": "https://xenon.network" }, - "marketcap_usd": 1665792, + "marketcap_usd": 1079756, "name": "XENON", "network": "eth", "shortcut": "XNN", @@ -12034,7 +12089,7 @@ "Github": "https://github.com/zapproject", "Homepage": "https://zap.store" }, - "marketcap_usd": 4758475, + "marketcap_usd": 4236932, "name": "ZAP", "network": "eth", "shortcut": "ZAP", @@ -12051,7 +12106,7 @@ "links": { "Homepage": "https://zsc.io/" }, - "marketcap_usd": 9654553, + "marketcap_usd": 10032351, "name": "Zeusshield", "network": "eth", "shortcut": "ZCS", @@ -12069,7 +12124,7 @@ "Github": "https://github.com/zilliqa", "Homepage": "https://www.zilliqa.com/" }, - "marketcap_usd": 548784076, + "marketcap_usd": 540082149, "name": "Zilliqa", "network": "eth", "shortcut": "ZIL", @@ -12139,7 +12194,7 @@ "Github": "https://github.com/carVertical", "Homepage": "https://www.carvertical.com" }, - "marketcap_usd": 9094247, + "marketcap_usd": 8721118, "name": "carVertical", "network": "eth", "shortcut": "cV", @@ -12227,7 +12282,7 @@ "Github": "https://github.com/eosdac", "Homepage": "https://eosdac.io/" }, - "marketcap_usd": 23302126, + "marketcap_usd": 22043595, "name": "eosDAC", "network": "eth", "shortcut": "eosDAC", @@ -12295,7 +12350,7 @@ "address": "0x8667559254241ddeD4d11392f868d72092765367", "hidden": 1, "links": {}, - "marketcap_usd": 448485182, + "marketcap_usd": 477255215, "name": "Aeternity", "network": "kov", "shortcut": "Aeternity", @@ -12466,7 +12521,7 @@ "links": { "Homepage": "https://www.qwark.io" }, - "marketcap_usd": 2592261, + "marketcap_usd": 2361859, "name": "QWARK", "network": "ubq", "shortcut": "QWARK", @@ -12544,7 +12599,7 @@ "links": { "Homepage": "https://ellaism.org" }, - "marketcap_usd": 717389, + "marketcap_usd": 658775, "name": "Ellaism", "shortcut": "ELLA", "t1_enabled": "yes", @@ -12589,7 +12644,7 @@ "links": { "Homepage": "https://ethereumclassic.github.io" }, - "marketcap_usd": 1705863309, + "marketcap_usd": 1761482613, "name": "Ethereum Classic", "shortcut": "ETC", "t1_enabled": "yes", @@ -12604,7 +12659,7 @@ "links": { "Homepage": "https://www.ethereum.org" }, - "marketcap_usd": 46623589711, + "marketcap_usd": 46545512287, "name": "Ethereum", "shortcut": "ETH", "t1_enabled": "yes", @@ -12634,7 +12689,7 @@ "links": { "Homepage": "https://expanse.tech" }, - "marketcap_usd": 10189865, + "marketcap_usd": 10327901, "name": "Expanse", "shortcut": "EXP", "t1_enabled": "yes", @@ -12649,7 +12704,7 @@ "links": { "Homepage": "https://gochain.io" }, - "marketcap_usd": 32099950, + "marketcap_usd": 27885658, "name": "GoChain", "shortcut": "GO", "t1_enabled": "yes", @@ -12679,7 +12734,7 @@ "links": { "Homepage": "https://ubiqsmart.com" }, - "marketcap_usd": 50652593, + "marketcap_usd": 51535471, "name": "Ubiq", "shortcut": "UBQ", "t1_enabled": "yes", @@ -12706,22 +12761,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "eth:tETH": { - "hidden": 1, - "links": { - "Homepage": "https://www.ethereum.org" - }, - "marketcap_usd": 0, - "name": "Ethereum Testnet Kovan", - "shortcut": "tETH", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "coin", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "eth:tRSK": { "hidden": 1, "links": { @@ -12742,7 +12781,7 @@ "links": { "Homepage": "https://www.cardano.org" }, - "marketcap_usd": 4176488085, + "marketcap_usd": 4098733811, "name": "Cardano", "shortcut": "ADA", "t1_enabled": "no", @@ -12753,7 +12792,7 @@ "links": { "Homepage": "https://lisk.io/" }, - "marketcap_usd": 523291562, + "marketcap_usd": 538864740, "name": "Lisk", "shortcut": "LSK", "t1_enabled": "no", @@ -12764,7 +12803,7 @@ "links": { "Homepage": "https://www.stellar.org" }, - "marketcap_usd": 5745967719, + "marketcap_usd": 5610860112, "name": "Stellar", "notes": "In development", "shortcut": "XLM", @@ -12776,7 +12815,7 @@ "links": { "Homepage": "https://getmonero.org" }, - "marketcap_usd": 2226986225, + "marketcap_usd": 2134713222, "name": "Monero", "notes": "In development", "shortcut": "XMR", @@ -12788,7 +12827,7 @@ "links": { "Homepage": "https://ripple.com" }, - "marketcap_usd": 17659543494, + "marketcap_usd": 17660224358, "name": "Ripple", "notes": "In development", "shortcut": "XRP", @@ -12800,7 +12839,7 @@ "links": { "Homepage": "https://tezos.com" }, - "marketcap_usd": 1266086135, + "marketcap_usd": 1245008536, "name": "Tezos", "shortcut": "XTZ", "t1_enabled": "no", @@ -12825,7 +12864,7 @@ "links": { "Homepage": "https://www.dimcoin.io" }, - "marketcap_usd": 8656533, + "marketcap_usd": 7813618, "name": "DIMCOIN", "shortcut": "DIM", "t1_enabled": "yes", @@ -12836,10 +12875,11 @@ } }, "nem:DIMTOK": { + "coinmarketcap_alias": "dimcoin", "links": { "Homepage": "https://www.dimcoin.io" }, - "marketcap_usd": 0, + "marketcap_usd": 7813618, "name": "DIM TOKEN", "shortcut": "DIMTOK", "t1_enabled": "yes", @@ -12881,7 +12921,7 @@ "links": { "Homepage": "https://nem.io" }, - "marketcap_usd": 1557342000, + "marketcap_usd": 1559440063, "name": "NEM", "shortcut": "XEM", "t1_enabled": "yes", @@ -12893,11 +12933,11 @@ } }, "info": { - "marketcap_usd": 225765247536, - "t1_coins": 661, - "t2_coins": 660, - "total_marketcap_usd": 288640246162, - "updated_at": 1532695674, - "updated_at_readable": "Fri Jul 27 14:47:54 2018" + "marketcap_usd": 229740155891, + "t1_coins": 662, + "t2_coins": 661, + "total_marketcap_usd": 293416788208, + "updated_at": 1532955716, + "updated_at_readable": "Mon Jul 30 15:01:56 2018" } } \ No newline at end of file diff --git a/defs/coins_details.override.json b/defs/coins_details.override.json index 5f0af0da6..6a422491e 100644 --- a/defs/coins_details.override.json +++ b/defs/coins_details.override.json @@ -1,5 +1,5 @@ { - "mosaic:DIMTOK": { + "nem:DIMTOK": { "coinmarketcap_alias": "dimcoin" }, "erc20:eth:GNT": { diff --git a/defs/ethereum/tokens b/defs/ethereum/tokens index 56d9c3c93..33e5c5dec 160000 --- a/defs/ethereum/tokens +++ b/defs/ethereum/tokens @@ -1 +1 @@ -Subproject commit 56d9c3c9324e30d7f53eda7b8dc3cae76a4da143 +Subproject commit 33e5c5decb94227abe116589c650ddfa66dbe9e5 From 1680eb1cfa6b7261b9f210064c6c84350f08c6b8 Mon Sep 17 00:00:00 2001 From: matejcik Date: Mon, 30 Jul 2018 15:05:19 +0200 Subject: [PATCH 13/50] tools: improve logging in coins_details.py --- tools/coins_details.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tools/coins_details.py b/tools/coins_details.py index 5c4b407fb..6f3259dc6 100755 --- a/tools/coins_details.py +++ b/tools/coins_details.py @@ -5,6 +5,7 @@ import time import json import logging import requests +import sys import coin_info LOG = logging.getLogger(__name__) @@ -20,7 +21,7 @@ COINMAKETCAP_CACHE = os.path.join(os.path.dirname(__file__), "coinmarketcap.json COINMARKETCAP_TICKERS_URL = ( "https://api.coinmarketcap.com/v2/ticker/?start={}&convert=USD&limit=100" ) -COINMARKETCAP_GLOBAL_URL = "https://api.coinmarketcap.com/v2/global" +COINMARKETCAP_GLOBAL_URL = "https://api.coinmarketcap.com/v2/global/" def coinmarketcap_init(): @@ -292,6 +293,13 @@ def apply_overrides(coins): if __name__ == "__main__": + # setup logging + root = logging.getLogger() + root.setLevel(logging.DEBUG) + handler = logging.StreamHandler(sys.stdout) + handler.setLevel(logging.DEBUG) + root.addHandler(handler) + defs = coin_info.get_all() support_info = coin_info.support_info(defs, erc20_versions=VERSIONS) From e4d99939decf97cc573e50dbd9f6af8d0559e43d Mon Sep 17 00:00:00 2001 From: matejcik Date: Mon, 30 Jul 2018 15:06:38 +0200 Subject: [PATCH 14/50] tools: drop obsolete tools `build_coins.py` is replaced by `coin_gen.py coins_json` `gen_ethereum_tokens.py` is replaced by Mako generators in core/mcu --- tools/build_coins.py | 268 ----------------------------------- tools/ethereum_tokens_gen.py | 77 ---------- 2 files changed, 345 deletions(-) delete mode 100755 tools/build_coins.py delete mode 100755 tools/ethereum_tokens_gen.py 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/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) From eed6c0fa43230834b1fe3e3f01b8dee9dd9730d4 Mon Sep 17 00:00:00 2001 From: matejcik Date: Mon, 30 Jul 2018 15:59:14 +0200 Subject: [PATCH 15/50] tools: add README --- tools/README.md | 65 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 tools/README.md diff --git a/tools/README.md b/tools/README.md new file mode 100644 index 000000000..104283136 --- /dev/null +++ b/tools/README.md @@ -0,0 +1,65 @@ +# Tools directory + +### `coin_info.py` + +Central module that extracts information from jsons in `defs/` directory. +Its most important function is `get_all()`. + +### `coin_gen.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 + * support data, i.e., that `support.json` matches the rest of data + +* __`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: + +* __`rewrite`__: regenerates `support.json` in a canonical format, i.e., only + mandatory fields in fixed order. + +* __`check`__: checks validity of support data. This is the same check + that runs as part of `coin_gen.py check`, except missing support data is always + an error. + +* __`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 is required, recommended is 3.6 or higher. From d154fb41340419bd1f39a045f77eb25785caa525 Mon Sep 17 00:00:00 2001 From: matejcik Date: Mon, 30 Jul 2018 16:01:23 +0200 Subject: [PATCH 16/50] travis: update to new tools --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 601ad8809..834c2a27f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,13 +12,13 @@ python: - "3.5" 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/coin_gen.py check notifications: webhooks: From d608294a14c5b0d44fd71aa3a35b48edec7a5fbe Mon Sep 17 00:00:00 2001 From: matejcik Date: Mon, 30 Jul 2018 16:38:39 +0200 Subject: [PATCH 17/50] tools: don't be noisy when support info is missing because we have other tools for that --- tools/coin_info.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/coin_info.py b/tools/coin_info.py index 31237f666..cabe6b9ab 100755 --- a/tools/coin_info.py +++ b/tools/coin_info.py @@ -400,7 +400,7 @@ def support_info(coins, erc20_versions=None, skip_missing=False): continue elif not skip_missing: - log.warning("support info missing for {}".format(key)) + log.info("support info missing for {}".format(key)) support[key] = {} if erc20_versions: From 36469fc8987e4df3398969176dda2170c4a466f0 Mon Sep 17 00:00:00 2001 From: matejcik Date: Mon, 30 Jul 2018 17:28:20 +0200 Subject: [PATCH 18/50] tools: better filtering by support for mako code generators --- tools/coin_gen.py | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/tools/coin_gen.py b/tools/coin_gen.py index b29ce577a..56c5b75fc 100755 --- a/tools/coin_gen.py +++ b/tools/coin_gen.py @@ -34,6 +34,7 @@ try: import ed25519 from PIL import Image from trezorlib import protobuf + CAN_BUILD_DEFS = True except ImportError: CAN_BUILD_DEFS = False @@ -59,13 +60,26 @@ 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} def render_file(filename, coins, support_info): """Opens `filename.j2`, renders the template and stores the result in `filename`.""" template = mako.template.Template(filename=filename + ".mako") - result = template.render(support_info=support_info, **coins, **MAKO_FILTERS) + result = template.render( + support_info=support_info, + supported_on=make_support_filter(support_info), + **coins, + **MAKO_FILTERS + ) with open(filename, "w") as f: f.write(result) @@ -256,11 +270,7 @@ def cli(): default=False, help="Check blockbook/bitcore responses", ) -@click.option( - "--icons/--no-icons", - default=True, - help="Check icon files" -) +@click.option("--icons/--no-icons", default=True, help="Check icon files") def check(missing_support, backend, icons): """Validate coin definitions. @@ -343,7 +353,10 @@ def coindefs(outfile): @cli.command() @click.argument("paths", metavar="[path]...", nargs=-1) -def render(paths): +@click.option( + "--erc20-support/--no-erc20-support", "-e", help="Download ERC20 support info" +) +def render(paths, erc20_support): """Generate source code from Jinja2 templates. For every "foo.bar.j2" filename passed, runs the template and @@ -370,7 +383,10 @@ def render(paths): files.append(path) defs = coin_info.get_all() - versions = coin_info.latest_releases() + if erc20_support: + versions = coin_info.latest_releases() + else: + versions = None support_info = coin_info.support_info(defs, erc20_versions=versions) # munch dicts - make them attribute-accessible From 11a386fed40be70185140285b485f00be16ad388 Mon Sep 17 00:00:00 2001 From: matejcik Date: Mon, 30 Jul 2018 18:10:00 +0200 Subject: [PATCH 19/50] tools: require python 3.6 --- tools/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/README.md b/tools/README.md index 104283136..da935f464 100644 --- a/tools/README.md +++ b/tools/README.md @@ -62,4 +62,4 @@ following subcommands: 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 is required, recommended is 3.6 or higher. +Python 3.6 or higher is required. From 25a706f0422f4bdec659dd628aba3f03f6d6d1a0 Mon Sep 17 00:00:00 2001 From: matejcik Date: Tue, 7 Aug 2018 13:00:30 +0200 Subject: [PATCH 20/50] tools: coin_gen can render into a given filename before, it could only render from `foo.bar.mako` to `foo.bar` --- tools/coin_gen.py | 73 +++++++++++++++++++++++++++++------------------ 1 file changed, 45 insertions(+), 28 deletions(-) diff --git a/tools/coin_gen.py b/tools/coin_gen.py index 56c5b75fc..4cca12092 100755 --- a/tools/coin_gen.py +++ b/tools/coin_gen.py @@ -65,23 +65,26 @@ def make_support_filter(support_info): 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} -def render_file(filename, coins, support_info): - """Opens `filename.j2`, renders the template and stores the result in `filename`.""" - template = mako.template.Template(filename=filename + ".mako") +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 ) - with open(filename, "w") as f: - f.write(result) + dst.write(result) # ====== validation functions ====== @@ -353,35 +356,29 @@ def coindefs(outfile): @cli.command() @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") @click.option( "--erc20-support/--no-erc20-support", "-e", help="Download ERC20 support info" ) -def render(paths, erc20_support): - """Generate source code from Jinja2 templates. +def render(paths, outfile, verbose, erc20_support): + """Generate source code from Mako templates. - For every "foo.bar.j2" filename passed, runs the template and - saves the result as "foo.bar". + 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. - For every directory name passed, processes all ".j2" 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 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) + 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.get_all() if erc20_support: versions = coin_info.latest_releases() @@ -395,17 +392,37 @@ def render(paths, erc20_support): 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")] - click.echo("Rendering {} => {}".format(file, target)) - try: - render_file(target, defs, support_info) - except Exception as e: - click.echo("Error occured: {}".format(e)) - raise + with open(target, "w") as dst: + do_render(file, dst) if __name__ == "__main__": From 8d1400cbd6832fd5046865af3f203b4062e40564 Mon Sep 17 00:00:00 2001 From: matejcik Date: Tue, 7 Aug 2018 13:03:51 +0200 Subject: [PATCH 21/50] ignore .vscode project dir --- .gitignore | 1 + 1 file changed, 1 insertion(+) 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 From 59063e0cc21c4eb407895e45aaee8967be069e3a Mon Sep 17 00:00:00 2001 From: matejcik Date: Wed, 15 Aug 2018 17:30:39 +0200 Subject: [PATCH 22/50] defs: change symbols for Ethereum testnets --- defs/ethereum/networks.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/defs/ethereum/networks.json b/defs/ethereum/networks.json index 396b7a881..4e53bd4f7 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" @@ -74,7 +74,7 @@ { "chain_id": 42, "slip44": 1, - "shortcut": "tETH", + "shortcut": "tKOV", "name": "Ethereum Testnet Kovan", "rskip60": false, "url": "https://www.ethereum.org" From 7ab69b18cd6650793e7bb34254203759672549ea Mon Sep 17 00:00:00 2001 From: matejcik Date: Wed, 15 Aug 2018 17:33:33 +0200 Subject: [PATCH 23/50] tools: support Black-compatible repr format --- tools/coin_gen.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/tools/coin_gen.py b/tools/coin_gen.py index 4cca12092..2de0c0565 100755 --- a/tools/coin_gen.py +++ b/tools/coin_gen.py @@ -56,6 +56,18 @@ def c_str_filter(b): 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) @@ -69,7 +81,11 @@ def make_support_filter(support_info): return supported_on -MAKO_FILTERS = {"c_str": c_str_filter, "ascii": ascii_filter} +MAKO_FILTERS = { + "c_str": c_str_filter, + "ascii": ascii_filter, + "black_repr": black_repr_filter, +} def render_file(src, dst, coins, support_info): @@ -82,7 +98,7 @@ def render_file(src, dst, coins, support_info): support_info=support_info, supported_on=make_support_filter(support_info), **coins, - **MAKO_FILTERS + **MAKO_FILTERS, ) dst.write(result) From 3cfca58c6ad4a9807b8c28d99d19f47cd96683d8 Mon Sep 17 00:00:00 2001 From: matejcik Date: Wed, 15 Aug 2018 17:34:04 +0200 Subject: [PATCH 24/50] tools: drop support check from coin_gen, moved to support.py --- tools/coin_gen.py | 53 +++++------------------------------------------ 1 file changed, 5 insertions(+), 48 deletions(-) diff --git a/tools/coin_gen.py b/tools/coin_gen.py index 2de0c0565..f85bd7f53 100755 --- a/tools/coin_gen.py +++ b/tools/coin_gen.py @@ -106,50 +106,6 @@ def render_file(src, dst, coins, support_info): # ====== validation functions ====== -def check_support(defs, support_data, fail_missing=False): - check_passed = True - coin_list = defs.as_list() - coin_names = {coin["key"]: coin["name"] for coin in coin_list} - - def coin_name(key): - if key in coin_names: - return "{} ({})".format(key, coin_names[key]) - else: - return "{} ".format(key) - - for key, support in support_data.items(): - errors = coin_info.validate_support(support) - if errors: - check_passed = False - print("ERR:", "invalid definition for", coin_name(key)) - print("\n".join(errors)) - - expected_coins = set(coin["key"] for coin in defs.coins + defs.misc) - - # detect missing support info for expected - for coin in expected_coins: - if coin not in support_data: - if fail_missing: - check_passed = False - print("ERR: Missing support info for", coin_name(coin)) - else: - print("WARN: Missing support info for", coin_name(coin)) - - # detect non-matching support info - coin_set = set(coin["key"] for coin in coin_list) - for key in support_data: - # detect non-matching support info - if key not in coin_set: - check_passed = False - print("ERR: Support info found for unknown coin", key) - - # detect override - doesn't fail check - if key not in expected_coins: - print("INFO: Override present for coin", coin_name(key)) - - return check_passed - - def check_btc(coins): check_passed = True @@ -309,10 +265,11 @@ def check(missing_support, backend, icons): if not check_btc(defs.coins): all_checks_passed = False - print("Checking support data...") - support_data = coin_info.get_support_data() - if not check_support(defs, support_data, fail_missing=missing_support): - all_checks_passed = False + # XXX support.py is responsible for checking support data + # print("Checking support data...") + # support_data = coin_info.get_support_data() + # if not check_support(defs, support_data, fail_missing=missing_support): + # all_checks_passed = False if icons: print("Checking icon files...") From f64a09051705d24981b7b4ca72750c40ce81ea40 Mon Sep 17 00:00:00 2001 From: matejcik Date: Wed, 15 Aug 2018 17:34:20 +0200 Subject: [PATCH 25/50] tools: update coin_gen.py to new support format --- tools/coin_gen.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/tools/coin_gen.py b/tools/coin_gen.py index f85bd7f53..c55bcc3ed 100755 --- a/tools/coin_gen.py +++ b/tools/coin_gen.py @@ -331,10 +331,7 @@ def coindefs(outfile): @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") -@click.option( - "--erc20-support/--no-erc20-support", "-e", help="Download ERC20 support info" -) -def render(paths, outfile, verbose, erc20_support): +def render(paths, outfile, verbose): """Generate source code from Mako templates. For every "foo.bar.mako" filename passed, runs the template and @@ -353,11 +350,7 @@ def render(paths, outfile, verbose, erc20_support): # prepare defs defs = coin_info.get_all() - if erc20_support: - versions = coin_info.latest_releases() - else: - versions = None - support_info = coin_info.support_info(defs, erc20_versions=versions) + support_info = coin_info.support_info(defs) # munch dicts - make them attribute-accessible for key, value in defs.items(): From 962178fbeb32fe51e4227abe08b3eacdf6c50a69 Mon Sep 17 00:00:00 2001 From: matejcik Date: Wed, 15 Aug 2018 17:36:24 +0200 Subject: [PATCH 26/50] tools/coin_info.py: use f-strings where appropriate --- tools/coin_info.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tools/coin_info.py b/tools/coin_info.py index cabe6b9ab..452698673 100755 --- a/tools/coin_info.py +++ b/tools/coin_info.py @@ -72,7 +72,7 @@ def check_type(val, types, nullable=False, empty=False, regex=None, choice=None) # check type if not isinstance(val, types): - raise TypeError("Wrong type (expected: {})".format(types)) + raise TypeError(f"Wrong type (expected: {types})") # check empty if isinstance(val, (list, dict)) and not empty and not val: @@ -83,11 +83,12 @@ def check_type(val, types, nullable=False, empty=False, regex=None, choice=None) if types is not str: raise TypeError("Wrong type for regex check") if not re.search(regex, val): - raise ValueError("Value does not match regex {}".format(regex)) + raise ValueError(f"Value does not match regex {regex}") # check choice if choice is not None and val not in choice: - raise ValueError("Value not allowed, use one of: {}".format(", ".join(choice))) + choice_str = ", ".join(choice) + raise ValueError(f"Value not allowed, use one of: {choice_str}") def check_key(key, types, optional=False, **kwargs): @@ -96,11 +97,11 @@ def check_key(key, types, optional=False, **kwargs): if optional: return else: - raise KeyError("{}: Missing key".format(key)) + raise KeyError(f"{key}: Missing key") try: check_type(coin[key], types, **kwargs) except Exception as e: - raise ValueError("{}: {}".format(key, e)) from e + raise ValueError(f"{key}: {e}") from e return do_check From a090388c5f554b24059b547791c6267eb9e8a451 Mon Sep 17 00:00:00 2001 From: matejcik Date: Wed, 15 Aug 2018 18:46:00 +0200 Subject: [PATCH 27/50] tools: rename coin_gen.py to cointool.py --- tools/README.md | 12 ++++-------- tools/{coin_gen.py => cointool.py} | 18 ++++++------------ 2 files changed, 10 insertions(+), 20 deletions(-) rename tools/{coin_gen.py => cointool.py} (97%) diff --git a/tools/README.md b/tools/README.md index da935f464..9a657bb38 100644 --- a/tools/README.md +++ b/tools/README.md @@ -5,7 +5,7 @@ Central module that extracts information from jsons in `defs/` directory. Its most important function is `get_all()`. -### `coin_gen.py` +### `cointool.py` Code and data generator. Has the following functions: @@ -13,7 +13,6 @@ Code and data generator. Has the following functions: * schema validity in `defs/coins/*.json` * availability of bitcore/blockbook backends * icon format - * support data, i.e., that `support.json` matches the rest of data * __`coins_json`__: generates `coins.json` for use in python-trezor, connect and wallet. By default outputs to current directory. @@ -39,12 +38,9 @@ If needed, any value can be overriden in `coins_details.override.json`. Support info management. Ensures `support.json` is in the proper format. Has the following subcommands: -* __`rewrite`__: regenerates `support.json` in a canonical format, i.e., only - mandatory fields in fixed order. - -* __`check`__: checks validity of support data. This is the same check - that runs as part of `coin_gen.py check`, except missing support data is always - an error. +* __`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 diff --git a/tools/coin_gen.py b/tools/cointool.py similarity index 97% rename from tools/coin_gen.py rename to tools/cointool.py index c55bcc3ed..ed70bf131 100755 --- a/tools/coin_gen.py +++ b/tools/cointool.py @@ -233,19 +233,11 @@ def cli(): @cli.command() -@click.option( - "--missing-support/--no-missing-support", - "-s", - default=False, - help="Fail if support info for a coin is missing", -) -@click.option( - "--backend/--no-backend", - "-b", - default=False, - help="Check blockbook/bitcore responses", -) +# fmt: off +@click.option("--missing-support/--no-missing-support", "-s", default=False, help="Fail if support info for a coin is missing") +@click.option("--backend/--no-backend", "-b", default=False, help="Check blockbook/bitcore responses") @click.option("--icons/--no-icons", default=True, help="Check icon files") +# fmt: on def check(missing_support, backend, icons): """Validate coin definitions. @@ -328,9 +320,11 @@ def coindefs(outfile): @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. From 81513f47b6912ddb8545d2830df5ff976da705d4 Mon Sep 17 00:00:00 2001 From: matejcik Date: Wed, 15 Aug 2018 19:00:42 +0200 Subject: [PATCH 28/50] tools: rewrite support.py --- tools/support.py | 372 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 273 insertions(+), 99 deletions(-) diff --git a/tools/support.py b/tools/support.py index fe610baca..b52946301 100755 --- a/tools/support.py +++ b/tools/support.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +import re import os import sys import click @@ -6,125 +7,280 @@ import coin_info import json SUPPORT_INFO = coin_info.get_support_data() +MISSING_MEANS_NO = ("connect", "webwallet") +VERSIONED_SUPPORT_INFO = ("trezor1", "trezor2") -MANDATORY_ENTRIES = ("trezor1", "trezor2", "connect", "webwallet") - - -def update_support(key, entry, value): - # template entry - support = {k: None for k in MANDATORY_ENTRIES} - support["other"] = {} - # fill out actual support info, if it exists - support.update(SUPPORT_INFO.get(key, {})) - - if entry in MANDATORY_ENTRIES: - if entry.startswith("trezor") and not value: - value = None - support[entry] = value - else: - support["other"][entry] = value - - for k in support["other"]: - if not support["other"][k]: - del support["other"][k] - - if not support["other"]: - del support["other"] - - SUPPORT_INFO[key] = support - return support +VERSION_RE = re.compile(r"\d+.\d+.\d+") def write_support_info(): with open(os.path.join(coin_info.DEFS_DIR, "support.json"), "w") as f: - json.dump(SUPPORT_INFO, f, indent=4) + json.dump(SUPPORT_INFO, f, indent=2, sort_keys=True) f.write("\n") +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"): + print(" * DUPLICATE SYMBOL (no support)") + else: + for dev, where in SUPPORT_INFO.items(): + missing_means_no = dev in MISSING_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 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 VERSIONED_SUPPORT_INFO: + values = SUPPORT_INFO[device] + support_set = set() + support_set.update(values["supported"].keys()) + support_set.update(values["unsupported"].keys()) + + result[device] = unsupported = [] + for key, coin in coins_dict.items(): + if coin.get("duplicate"): + continue + if key not in support_set: + unsupported.append(coin) + + return result + + +def find_orphaned_support_keys(coins_dict): + result = {} + for device, values in SUPPORT_INFO.items(): + device_res = {} + for supkey, supvalues in values.items(): + orphans = set() + for coin_key in supvalues.keys(): + if coin_key not in coins_dict: + orphans.add(coin_key) + device_res[supkey] = orphans + result[device] = device_res + + return result + + @click.group() def cli(): pass @cli.command() -def rewrite(): - """Regenerate support.json to match predefined structure and field order.""" - for key, coin in SUPPORT_INFO.items(): - d = {"trezor1": None, "trezor2": None, "connect": None, "webwallet": None} - d.update(coin) - if "electrum" in d: - del d["electrum"] - if "other" in d and not d["other"]: - del d["other"] - SUPPORT_INFO[key] = d +# fmt: off +@click.option("-p", "--prune-orphans", is_flag=True, help="Remove orphaned keys for which there is no corresponding coin info") +@click.option("-t", "--ignore-tokens", is_flag=True, help="Ignore unsupported ERC20 tokens") +# fmt: on +def check(prune_orphans, ignore_tokens): + """Check validity of support information. - write_support_info() + Ensures that `support.json` data is well formed, there are no keys without + corresponding coins, and there are no coins without corresponding keys. + If `--prune-orphans` is specified, orphaned keys (no corresponding coin) + will be deleted from `support.json`. -@cli.command() -def check(): - """Check validity of support information. - - The relevant code is actually part of 'coin_gen.py'. It can be invoked from - here for convenience and because it makes sense. But it's preferable to run it - as part of 'coin_gen.py check'. + 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. """ - defs = coin_info.get_all() - support_data = coin_info.get_support_data() - import coin_gen + coins_dict = coin_info.get_all(deduplicate=False).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 device, values in orphaned.items(): + for supkey, supvalues in values.items(): + for key in supvalues: + print(f"orphaned key {device} -> {supkey} -> {key}") + if prune_orphans: + del SUPPORT_INFO[device][supkey][key] + else: + checks_ok = False + + if prune_orphans: + write_support_info() - if not coin_gen.check_support(defs, support_data, fail_missing=True): + missing = find_unsupported_coins(coins_dict) + for device, values in missing.items(): + if ignore_tokens: + values = [coin for coin in values if not coin["key"].startswith("erc20:")] + if values: + checks_ok = False + print(f"Device {device} has missing support infos:") + for coin in values: + print(f"{coin['key']} - {coin['name']}") + + if not checks_ok: + print("Some checks have failed") sys.exit(1) @cli.command() -@click.argument("keyword", nargs=-1) -def show(keyword): - """Show support status of specified coins. +# fmt: off +@click.argument("version") +@click.option("--git-tag/--no-git-tag", "-g", default=False, help="create a corresponding Git tag") +@click.option("--soon/--no-soon", default=True, help="Release coins marked 'soon'") +@click.option("--missing/--no-missing", default=True, help="Release coins with missing support info") +@click.option("-n", "--dry-run", is_flag=True, help="Do not write changes") +# fmt: on +def release(version, git_tag, soon, missing, dry_run): + """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. + """ + version_tuple = list(map(int, version.split("."))) + device = f"trezor{version_tuple[0]}" - Keywords match against key, name or shortcut (ticker symbol) of coin. If no - keywords are provided, show all supported coins. + print(f"Releasing {device} firmware version {version}") - Only coins listed in support.json are considered "supported". That means that - Ethereum networks, ERC20 tokens and NEM mosaics will probably show up wrong. - """ - defs = coin_info.get_all().as_list() + defs = coin_info.get_all(deduplicate=False) + coin_info.mark_duplicate_shortcuts(defs.as_list()) + coins_dict = defs.as_dict() - if keyword: - for coin in defs: + if missing: + missing_list = find_unsupported_coins(coins_dict)[device] + for coin in missing_list: key = coin["key"] - name, shortcut = coin["name"], coin["shortcut"] - for kw in keyword: - kwl = kw.lower() - if kwl == key.lower() or kwl in name.lower() or kwl == shortcut.lower(): - print("{} - {} ({})".format(key, name, shortcut), end=" - ") - if key in SUPPORT_INFO: - print(json.dumps(SUPPORT_INFO[key], indent=4)) - else: - print("no support info") - break + if coin.get("duplicate"): + print(f"UNsupporting duplicate coin {key} ({coin['name']})") + SUPPORT_INFO[device]["unsupported"][key] = "duplicate key" + else: + print(f"Adding missing {key} ({coin['name']})") + SUPPORT_INFO[device]["supported"][key] = version + + if soon: + soon_list = [ + coins_dict[key] + for key, val in SUPPORT_INFO[device]["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']})") + SUPPORT_INFO[device]["supported"][key] = version + if git_tag: + print("git tag not supported yet") + + if not dry_run: + write_support_info() else: - print(json.dumps(SUPPORT_INFO, indent=4)) + print("No changes written") @cli.command() -@click.argument("support_key", required=True) -@click.argument( - "entries", nargs=-1, required=True, metavar="entry=value [entry=value]..." -) -@click.option( - "-n", - "--dry-run", - is_flag=True, - help="Only print updated support info, do not write back", -) -def set(support_key, entries, dry_run): +@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.get_all(deduplicate=False).as_list() + coin_info.mark_duplicate_shortcuts(defs) + + for coin in defs: + key = coin["key"].lower() + name = coin["name"].lower() + shortcut = coin["shortcut"].lower() + symsplit = shortcut.split(" ", maxsplit=1) + symbol = symsplit[0] + suffix = symsplit[1] if len(symsplit) > 1 else "" + for kw in keyword: + kwl = kw.lower() + if ( + kwl == key + or kwl in name + or kwl == shortcut + or kwl == symbol + or kwl in suffix + ): + 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 coin:BTC trezor1=soon trezor2=2.0.7 webwallet=yes connect=no - support.py coin:LTC trezor1=yes "Electrum-LTC=https://electrum-ltc.org" Electrum= + 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. @@ -138,33 +294,51 @@ def set(support_key, entries, dry_run): 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. """ - coins = coin_info.get_all().as_dict() - if support_key not in coins: - click.echo("Failed to find key {}".format(support_key)) + coins = coin_info.get_all(deduplicate=False).as_dict() + coin_info.mark_duplicate_shortcuts(coins.values()) + 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) - print("{} - {}".format(support_key, coins[support_key]["name"])) + if coins[key].get("duplicate"): + 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: - key, value = entry.split("=", maxsplit=1) + device, value = entry.split("=", maxsplit=1) except ValueError: - click.echo("Invalid entry: {}".format(entry)) + click.echo(f"Invalid entry: {entry}") sys.exit(2) + if device not in SUPPORT_INFO: + raise click.ClickException(f"unknown device: {device}") + + where = SUPPORT_INFO[device] + # clear existing info + where["supported"].pop(key, None) + where["unsupported"].pop(key, None) + if value in ("yes", "true", "1"): - value = True - elif value in ("no", "false", "2"): - value = False + where["supported"][key] = True + elif value in ("no", "false", "0"): + if device in MISSING_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}:") + where["unsupported"][key] = reason elif value == "": - value = None + # do nothing, existing info is cleared + pass + else: + # arbitrary string? + where["supported"][key] = value - support = update_support(support_key, key, value) - - print(json.dumps(support, indent=4)) - if not dry_run: - write_support_info() + print_support(coins[key]) + write_support_info() if __name__ == "__main__": From 6cbc2a94eecd5d29e3d10ce62b93c7010c3de666 Mon Sep 17 00:00:00 2001 From: matejcik Date: Wed, 15 Aug 2018 19:20:15 +0200 Subject: [PATCH 29/50] tools: add better duplicate checking --- tools/cointool.py | 29 ++++++++++++++++++++++++++++- tools/support.py | 13 ++++++++----- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/tools/cointool.py b/tools/cointool.py index ed70bf131..ee05e6183 100755 --- a/tools/cointool.py +++ b/tools/cointool.py @@ -127,6 +127,28 @@ def check_btc(coins): return check_passed +def check_dups(buckets): + check_passed = True + for bucket in buckets.values(): + nontokens = [coin for coin in bucket if not coin["key"].startswith("erc20")] + token_list = [coin["key"] for coin in bucket if coin["key"].startswith("erc20")] + if not nontokens: + continue + if len(nontokens) == 1: + coin = nontokens[0] + print( + f"Coin {coin['key']} ({coin['name']}) is duplicate with", + ", ".join(token_list), + "and that is OK.", + ) + else: + nontoken_list = [f"{coin['key']} ({coin['name']})" for coin in nontokens] + print("Duplicate shortcuts for", ", ".join(nontoken_list)) + check_passed = False + + return check_passed + + def check_backends(coins): check_passed = True for coin in coins: @@ -250,7 +272,8 @@ def check(missing_support, backend, icons): if icons and not CAN_BUILD_DEFS: raise click.ClickException("Missing requirements for icon check") - defs = coin_info.get_all() + defs = coin_info.get_all(deduplicate=False) + buckets = coin_info.mark_duplicate_shortcuts(defs.as_list()) all_checks_passed = True print("Checking BTC-like coins...") @@ -263,6 +286,10 @@ def check(missing_support, backend, icons): # if not check_support(defs, support_data, fail_missing=missing_support): # all_checks_passed = False + print("Checking unexpected duplicates...") + if not check_dups(buckets): + all_checks_passed = False + if icons: print("Checking icon files...") if not check_icons(defs.coins): diff --git a/tools/support.py b/tools/support.py index b52946301..0e90e9617 100755 --- a/tools/support.py +++ b/tools/support.py @@ -42,11 +42,14 @@ def print_support(coin): key, name, shortcut = coin["key"], coin["name"], coin["shortcut"] print(f"{key} - {name} ({shortcut})") if coin.get("duplicate"): - print(" * DUPLICATE SYMBOL (no support)") - else: - for dev, where in SUPPORT_INFO.items(): - missing_means_no = dev in MISSING_MEANS_NO - print(" *", dev, ":", support_value(where, key, missing_means_no)) + if key.startswith("erc20:"): + print(" * DUPLICATE SYMBOL (no support)") + return + else: + print(" * DUPLICATE SYMBOL") + for dev, where in SUPPORT_INFO.items(): + missing_means_no = dev in MISSING_MEANS_NO + print(" *", dev, ":", support_value(where, key, missing_means_no)) # ====== validation functions ====== # From 4726d3259ed80356fed8f8956c4987e18a403119 Mon Sep 17 00:00:00 2001 From: matejcik Date: Wed, 15 Aug 2018 19:22:29 +0200 Subject: [PATCH 30/50] tools: update coin_info to new support method and duplicate checking --- tools/coin_info.py | 206 +++++++++++++++------------------------------ 1 file changed, 69 insertions(+), 137 deletions(-) diff --git a/tools/coin_info.py b/tools/coin_info.py index 452698673..4c3061d72 100755 --- a/tools/coin_info.py +++ b/tools/coin_info.py @@ -185,25 +185,6 @@ def validate_btc(coin): return errors -SUPPORT_CHECKS = [ - check_key("trezor1", str, nullable=True, regex=r"^soon|planned|\d+\.\d+\.\d+$"), - check_key("trezor2", str, nullable=True, regex=r"^soon|planned|\d+\.\d+\.\d+$"), - check_key("webwallet", bool, nullable=True), - check_key("connect", bool, nullable=True), - check_key("other", dict, optional=True, empty=False), -] - - -def validate_support(support): - errors = [] - for check in SUPPORT_CHECKS: - try: - check(support) - except Exception as e: - errors.append(str(e)) - return errors - - # ======= Coin json loaders ======= @@ -280,15 +261,6 @@ def _load_misc(): # ====== support info ====== RELEASES_URL = "https://wallet.trezor.io/data/firmware/{}/releases.json" -ETHEREUM_TOKENS = { - "1": "https://raw.githubusercontent.com/trezor/trezor-mcu/v{}/firmware/ethereum_tokens.c", - "2": "https://raw.githubusercontent.com/trezor/trezor-core/v{}/src/apps/ethereum/tokens.py", -} - -TOKEN_MATCH = { - "1": re.compile(r'\{.*" ([^"]+)".*\},'), - "2": re.compile(r'\(.*["\']([^"\']+)["\'].*\),'), -} def get_support_data(): @@ -308,77 +280,46 @@ def latest_releases(): return latest -def support_info_erc20(coins, versions): - """Generate support info for ERC20 tokens. +def support_info_single(support_data, coin): + """Extract a support dict from `support.json` data. - Takes a dict of Trezor versions as returned from `latest_releases` - and a list of coins as returned from `_get_erc20_tokens` and creates - a supportinfo entry for each listed token. + Returns a dict of support values for each "device", i.e., `support.json` + top-level key. - Support status is determined by downloading and parsing the definition file - from the appropriate firmware version. If a given token is listed, the support - is marked as "yes". If not, support is marked as "soon", assuming that - it will be included in next release. - - This is currently the only way to get the list of supported tokens. We don't want - to track support individually in support.json. + The support value for each device is determined in order of priority: + * if the coin is marked as duplicate, 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" """ - supported_tokens = {} - for trezor, version in versions.items(): - tokens = set() - version_str = ".".join(map(str, version)) - - token_file = requests.get(ETHEREUM_TOKENS[trezor].format(version_str)).text - token_match = TOKEN_MATCH[trezor] - - for line in token_file.split("\n"): - m = token_match.search(line) - if m: - tokens.add(m.group(1)) - - supported_tokens[trezor] = tokens - - support = {} - for coin in coins: - key = coin["key"] - if not key.startswith("erc20:"): - continue - - support[key] = dict( - trezor1="yes" if coin["shortcut"] in supported_tokens["1"] else "soon", - trezor2="yes" if coin["shortcut"] in supported_tokens["2"] else "soon", - ) - - return support + support_info = {} + key = coin["key"] + dup = coin.get("duplicate") + for device, values in support_data.items(): + if dup: + support_value = None + elif key in values["unsupported"]: + support_value = None + elif key in values["supported"]: + support_value = values["supported"][key] + else: + support_value = "soon" + support_info[device] = support_value + return support_info -def support_info(coins, erc20_versions=None, skip_missing=False): +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 a number of known keys: - `trezor1`, `trezor2`, `webwallet`, `connect`. An optional `other` entry - is a dict of name-url pairs for third-party software. + 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. - For btc-like coins and misc networks, this is taken from `support.json`. - For NEM mosaics and ethereum networks, the support is presumed to be "yes" - for both Trezors. Webwallet and Connect info is not filled out. - - ERC20 tokens are ignored by this function, as if `skip_missing` was true - (see below). However, if you pass the optional `erc20_versions` argument, - it will call `support_info_erc20` for you with given versions. - - In all cases, if the coin is explicitly listed in `support.json`, the info - takes precedence over any other source (be it assumed "yes" for nem/eth, - or downloaded info for erc20). - - If `skip_missing` is `True`, coins for which no support information is available - will not be included in the output. Otherwise, an empty dict will be included - and a warning emitted. "No support information" means that the coin is not - listed in `support.json` and we have no heuristic to determine the support. + Support information is taken from `support.json`. """ if isinstance(coins, CoinsInfo): coins = coins.as_list() @@ -388,28 +329,9 @@ def support_info(coins, erc20_versions=None, skip_missing=False): support_data = get_support_data() support = {} for coin in coins: - key = coin["key"] - typ = key.split(":", maxsplit=1)[0] - if key in support_data: - support[key] = support_data[key] + support[coin["key"]] = support_info_single(support_data, coin) - elif typ in ("nem", "eth"): - support[key] = dict(trezor1="yes", trezor2="yes") - - elif typ == "erc20": - # you must call a separate function to get that - continue - - elif not skip_missing: - log.info("support info missing for {}".format(key)) - support[key] = {} - - if erc20_versions: - erc20 = support_info_erc20(coins, erc20_versions) - erc20.update(support) - return erc20 - else: - return support + return support # ====== data cleanup functions ====== @@ -459,31 +381,38 @@ def _ensure_mandatory_values(coins): raise ValueError(coin) -def _filter_duplicate_shortcuts(coins): - """Removes coins with identical `shortcut`s. - This is used to drop colliding ERC20 tokens. +def mark_duplicate_shortcuts(coins): + """Finds coins with identical `shortcut`s. + Updates their keys and sets a `duplicate` field. """ - dup_keys = set() - retained_coins = OrderedDict() + 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: - if "Testnet" in coin["name"] and coin["shortcut"] == "tETH": - # special case for Ethereum testnets - continue + symsplit = coin["shortcut"].split(" ", maxsplit=1) + symbol = symsplit[0] + dup_symbols[symbol].append(coin) + dup_keys[coin["key"]].append(coin) - key = coin["shortcut"] - if key in dup_keys: - pass - elif key in retained_coins: - dup_keys.add(key) - del retained_coins[key] - else: - retained_coins[key] = coin + dup_symbols = dups_only(dup_symbols) + dup_keys = dups_only(dup_keys) - # modify original list - coins[:] = retained_coins.values() - # return duplicates - return dup_keys + # mark duplicate symbols + for values in dup_symbols.values(): + for coin in values: + coin["duplicate"] = True + + # deduplicate keys + for values in dup_keys.values(): + for i, coin in enumerate(values): + # presumably only duplicate symbols can have duplicate keys + assert coin.get("duplicate") + coin["key"] += f":{i}" + + return dup_symbols def _btc_sort_key(coin): @@ -493,13 +422,15 @@ def _btc_sort_key(coin): return coin["name"] -def get_all(): +def get_all(deduplicate=True): """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( coins=_load_btc_coins(), @@ -515,17 +446,18 @@ def get_all(): 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) - dup_keys = _filter_duplicate_shortcuts(coins) - if dup_keys: - if k == "erc20": - severity = logging.INFO - else: - severity = logging.WARNING - dup_str = ", ".join(dup_keys) - log.log(severity, "{}: removing duplicate symbols: {}".format(k, dup_str)) + + if deduplicate: + mark_duplicate_shortcuts(all_coins.as_list()) + all_coins["erc20"] = [ + coin for coin in all_coins["erc20"] if not coin.get("duplicate") + ] return all_coins From a11edef98a7fdb9b5f52cc7bb304d90e5310a2fa Mon Sep 17 00:00:00 2001 From: matejcik Date: Wed, 15 Aug 2018 19:25:27 +0200 Subject: [PATCH 31/50] defs: convert support.json to a format with all the tokens --- defs/support.json | 1710 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 1485 insertions(+), 225 deletions(-) diff --git a/defs/support.json b/defs/support.json index 1a81a0fe4..eb3ab3b1b 100644 --- a/defs/support.json +++ b/defs/support.json @@ -1,231 +1,1491 @@ { - "coin:BCH": { - "trezor1": "1.6.2", - "trezor2": "2.0.7", - "connect": true, - "webwallet": true, - "other": { - "Electron Cash": "https://electroncash.org" - } + "connect": { + "supported": { + "coin:BCH": true, + "coin:BTC": true, + "coin:BTG": true, + "coin:DASH": true, + "coin:DOGE": true, + "coin:LTC": true, + "coin:TEST": true, + "coin:VTC": true, + "coin:ZEC": true }, - "coin:BTC": { - "trezor1": "1.5.2", - "trezor2": "2.0.5", - "connect": true, - "webwallet": true, - "other": { - "Electrum": "https://electrum.org" - } + "unsupported": {} + }, + "trezor1": { + "supported": { + "coin:BCH": "1.6.2", + "coin:BTC": "1.5.2", + "coin:BTCP": "1.6.2", + "coin:BTG": "1.6.2", + "coin:DASH": "1.5.2", + "coin:DCR": "1.6.2", + "coin:DGB": "1.6.0", + "coin:DOGE": "1.5.2", + "coin:FJC": "1.6.1", + "coin:GRS": "1.6.2", + "coin:LTC": "1.5.2", + "coin:MONA": "1.6.0", + "coin:NMC": "1.5.2", + "coin:TAZ": "1.6.2", + "coin:TBCH": "1.6.2", + "coin:TDCR": "1.6.2", + "coin:TEST": "1.5.2", + "coin:TLTC": "1.6.2", + "coin:VIA": "1.6.2", + "coin:VTC": "1.6.1", + "coin:XZC": "1.6.2", + "coin:ZEC": "1.6.2", + "coin:tDASH": "1.6.2", + "coin:tGRS": "1.6.2", + "coin: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: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:CATs (BitClave)_Old": "1.6.2", + "erc20:eth:CC3": "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:DAI": "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:DGD": "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:FANX": "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:FTC": "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:GNT": "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:LIVE": "1.6.2", + "erc20:eth:LNC": "1.6.2", + "erc20:eth:LNC-Linker Coin": "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:MKR": "1.6.2", + "erc20:eth:MKT": "1.6.2", + "erc20:eth:MLN": "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:MTC": "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: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:PTC": "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:SMART": "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:TRC": "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:VENUS": "1.6.2", + "erc20:eth:VERI": "1.6.2", + "erc20:eth:VET": "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:YEED": "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:ZRX": "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": "1.6.2", + "eth:CLO": "1.6.2", + "eth:EGEM": "1.6.2", + "eth:ELLA": "1.6.2", + "eth:EOSC": "1.6.2", + "eth:ESN": "1.6.2", + "eth:ETC": "1.6.2", + "eth:ETH": "1.6.2", + "eth:ETSC": "1.6.2", + "eth:EXP": "1.6.2", + "eth:GO": "1.6.2", + "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" }, - "coin:BTCP": { - "trezor1": "1.6.2", - "trezor2": "2.0.7", - "connect": null, - "webwallet": true, - "other": { - "BTCP Electrum": "https://github.com/BTCPrivate/electrum-btcp" - } - }, - "coin:BTG": { - "trezor1": "1.6.2", - "trezor2": "2.0.7", - "connect": true, - "webwallet": true, - "other": { - "ElectrumG": "https://github.com/BTCGPU/electrum" - } - }, - "coin:DASH": { - "trezor1": "1.5.2", - "trezor2": "2.0.5", - "connect": true, - "webwallet": true, - "other": { - "Dash Electrum": "https://electrum.dash.org" - } - }, - "coin:DCR": { - "trezor1": "1.6.2", - "trezor2": null, - "connect": null, - "webwallet": true - }, - "coin:DGB": { - "trezor1": "1.6.0", - "trezor2": "2.0.5", - "connect": null, - "webwallet": true - }, - "coin:DOGE": { - "trezor1": "1.5.2", - "trezor2": "2.0.5", - "connect": true, - "webwallet": true - }, - "coin:FJC": { - "trezor1": "1.6.1", - "trezor2": "2.0.5", - "connect": null, - "webwallet": true, - "other": { - "Electrum-FJC": "http://www.fujicoin.org/downloads.php" - } - }, - "coin:GRS": { - "trezor1": "1.6.2", - "trezor2": "2.0.8", - "connect": null, - "webwallet": true, - "other": { - "Electrum-GRS": "https://www.groestlcoin.org/groestlcoin-electrum-wallet/" - } - }, - "coin:LTC": { - "trezor1": "1.5.2", - "trezor2": "2.0.5", - "connect": true, - "webwallet": true, - "other": { - "Electrum-LTC": "https://electrum-ltc.org" - } - }, - "coin:MONA": { - "trezor1": "1.6.0", - "trezor2": "2.0.5", - "connect": null, - "webwallet": true, - "other": { - "Electrum-MONA": "https://electrum-mona.org" - } - }, - "coin:NMC": { - "trezor1": "1.5.2", - "trezor2": "2.0.5", - "connect": null, - "webwallet": null, - "other": { - "Electrum-NMC": "https://github.com/namecoin/electrum-nmc" - } - }, - "coin:TAZ": { - "trezor1": "1.6.2", - "trezor2": "2.0.7", - "connect": null, - "webwallet": true - }, - "coin:TBCH": { - "trezor1": "1.6.2", - "trezor2": "2.0.7", - "connect": null, - "webwallet": null - }, - "coin:TDCR": { - "trezor1": "1.6.2", - "trezor2": null, - "connect": null, - "webwallet": true - }, - "coin:TEST": { - "trezor1": "1.5.2", - "trezor2": "2.0.5", - "connect": true, - "webwallet": true - }, - "coin:TLTC": { - "trezor1": "1.6.2", - "trezor2": "2.0.7", - "connect": null, - "webwallet": true - }, - "coin:VIA": { - "trezor1": "1.6.2", - "trezor2": "2.0.7", - "connect": null, - "webwallet": true, - "other": { - "Vialectrum": "https://vialectrum.org" - } - }, - "coin:VTC": { - "trezor1": "1.6.1", - "trezor2": "2.0.5", - "connect": true, - "webwallet": true - }, - "coin:XZC": { - "trezor1": "1.6.2", - "trezor2": "2.0.7", - "connect": null, - "webwallet": true, - "other": { - "Electrum-XZC": "https://github.com/zcoinofficial/electrum-xzc", - "Znode Tool": "https://github.com/yura-pakhuchiy/znode-tool" - } - }, - "coin:ZEC": { - "trezor1": "1.6.2", - "trezor2": "2.0.7", - "connect": true, - "webwallet": true - }, - "coin:ZEN": { - "trezor1": null, - "trezor2": "2.0.8", - "connect": null, - "webwallet": null - }, - "coin:tDASH": { - "trezor1": "1.6.2", - "trezor2": null, - "connect": null, - "webwallet": null - }, - "coin:tGRS": { - "trezor1": "1.6.2", - "trezor2": "2.0.8", - "connect": null, - "webwallet": true - }, - "coin:tXZC": { - "trezor1": "1.6.2", - "trezor2": "2.0.7", - "connect": null, - "webwallet": null - }, - "misc:LSK": { - "trezor1": null, - "trezor2": "2.0.7", - "connect": null, - "webwallet": null - }, - "misc:XLM": { - "trezor1": "soon", - "trezor2": "soon", - "connect": null, - "webwallet": null - }, - "misc:XTZ": { - "trezor1": null, - "trezor2": "soon", - "connect": null, - "webwallet": null - }, - "misc:ADA": { - "trezor1": null, - "trezor2": "soon", - "connect": null, - "webwallet": null - }, - "misc:XMR": { - "trezor1": null, - "trezor2": "soon", - "connect": null, - "webwallet": null + "unsupported": { + "erc20:etc:PLAY": "duplicate key", + "erc20:eth:ATH": "duplicate key", + "erc20:eth:ATH (AIgatha Token)": "duplicate key", + "erc20:eth:BLX (Bullion)": "duplicate key", + "erc20:eth:BLX (Iconomi)": "duplicate key", + "erc20:eth:BTL (Battle)": "duplicate key", + "erc20:eth:BTL (Bitlle)": "duplicate key", + "erc20:eth:CAR": "duplicate key", + "erc20:eth:CAR (CarBlock)": "duplicate key", + "erc20:eth:CAT (BitClave)": "duplicate key", + "erc20:eth:CAT (Blockcat)": "duplicate key", + "erc20:eth:CCC (CryptoCrashCourse)": "duplicate key", + "erc20:eth:CCC (ICONOMI)": "duplicate key", + "erc20:eth:DEPO": "duplicate key", + "erc20:eth:DEPO (Depository Network)": "duplicate key", + "erc20:eth:DROP": "duplicate key", + "erc20:eth:DROP (dropil)": "duplicate key", + "erc20:eth:GUP": "duplicate key", + "erc20:eth:KC": "duplicate key", + "erc20:eth:LINK (Chainlink)": "duplicate key", + "erc20:eth:LINK Platform": "duplicate key", + "erc20:eth:MIT": "duplicate key", + "erc20:eth:MIT (Mychatcoin)": "duplicate key", + "erc20:eth:NONE": "duplicate key", + "erc20:eth:NXX": "duplicate key", + "erc20:eth:NXX OLD": "duplicate key", + "erc20:eth:PLAY": "duplicate key", + "erc20:eth:RDN": "duplicate key", + "erc20:kov:GUP": "duplicate key", + "erc20:rin:KC": "duplicate key", + "erc20:rin:NONE": "duplicate key", + "erc20:rin:RDN": "duplicate key", + "erc20:rop:NONE": "duplicate key" + } + }, + "trezor2": { + "supported": { + "coin:BCH": "2.0.7", + "coin:BTC": "2.0.5", + "coin:BTCP": "2.0.7", + "coin:BTG": "2.0.7", + "coin:DASH": "2.0.5", + "coin:DGB": "2.0.5", + "coin:DOGE": "2.0.5", + "coin:FJC": "2.0.5", + "coin:GRS": "2.0.8", + "coin:LTC": "2.0.5", + "coin:MONA": "2.0.5", + "coin:NMC": "2.0.5", + "coin:TAZ": "2.0.7", + "coin:TBCH": "2.0.7", + "coin:TEST": "2.0.5", + "coin:TLTC": "2.0.7", + "coin:VIA": "2.0.7", + "coin:VTC": "2.0.5", + "coin:XZC": "2.0.7", + "coin:ZEC": "2.0.7", + "coin:ZEN": "2.0.8", + "coin:tGRS": "2.0.8", + "coin: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: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:CATs (BitClave)_Old": "2.0.7", + "erc20:eth:CC3": "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:DAI": "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:DGD": "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:FANX": "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:FTC": "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:GNT": "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:LIVE": "2.0.7", + "erc20:eth:LNC": "2.0.7", + "erc20:eth:LNC-Linker Coin": "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:MKR": "2.0.7", + "erc20:eth:MKT": "2.0.7", + "erc20:eth:MLN": "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:MTC": "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: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:PTC": "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:SMART": "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:TRC": "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:VENUS": "2.0.7", + "erc20:eth:VERI": "2.0.7", + "erc20:eth:VET": "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:YEED": "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:ZRX": "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": "2.0.7", + "eth:CLO": "2.0.7", + "eth:EGEM": "2.0.7", + "eth:ELLA": "2.0.7", + "eth:EOSC": "2.0.7", + "eth:ESN": "2.0.7", + "eth:ETC": "2.0.7", + "eth:ETH": "2.0.7", + "eth:ETSC": "2.0.7", + "eth:EXP": "2.0.7", + "eth:GO": "2.0.7", + "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" }, - "misc:XRP": { - "trezor1": null, - "trezor2": "soon", - "connect": null, - "webwallet": null + "unsupported": { + "erc20:etc:PLAY": "duplicate key", + "erc20:eth:ATH": "duplicate key", + "erc20:eth:ATH (AIgatha Token)": "duplicate key", + "erc20:eth:BLX (Bullion)": "duplicate key", + "erc20:eth:BLX (Iconomi)": "duplicate key", + "erc20:eth:BTL (Battle)": "duplicate key", + "erc20:eth:BTL (Bitlle)": "duplicate key", + "erc20:eth:CAR": "duplicate key", + "erc20:eth:CAR (CarBlock)": "duplicate key", + "erc20:eth:CAT (BitClave)": "duplicate key", + "erc20:eth:CAT (Blockcat)": "duplicate key", + "erc20:eth:CCC (CryptoCrashCourse)": "duplicate key", + "erc20:eth:CCC (ICONOMI)": "duplicate key", + "erc20:eth:DEPO": "duplicate key", + "erc20:eth:DEPO (Depository Network)": "duplicate key", + "erc20:eth:DROP": "duplicate key", + "erc20:eth:DROP (dropil)": "duplicate key", + "erc20:eth:GUP": "duplicate key", + "erc20:eth:KC": "duplicate key", + "erc20:eth:LINK (Chainlink)": "duplicate key", + "erc20:eth:LINK Platform": "duplicate key", + "erc20:eth:MIT": "duplicate key", + "erc20:eth:MIT (Mychatcoin)": "duplicate key", + "erc20:eth:NONE": "duplicate key", + "erc20:eth:NXX": "duplicate key", + "erc20:eth:NXX OLD": "duplicate key", + "erc20:eth:PLAY": "duplicate key", + "erc20:eth:RDN": "duplicate key", + "erc20:kov:GUP": "duplicate key", + "erc20:rin:KC": "duplicate key", + "erc20:rin:NONE": "duplicate key", + "erc20:rin:RDN": "duplicate key", + "erc20:rop:NONE": "duplicate key" } + }, + "webwallet": { + "supported": { + "coin:BCH": true, + "coin:BTC": true, + "coin:BTCP": true, + "coin:BTG": true, + "coin:DASH": true, + "coin:DCR": true, + "coin:DGB": true, + "coin:DOGE": true, + "coin:FJC": true, + "coin:GRS": true, + "coin:LTC": true, + "coin:MONA": true, + "coin:TAZ": true, + "coin:TDCR": true, + "coin:TEST": true, + "coin:TLTC": true, + "coin:VIA": true, + "coin:VTC": true, + "coin:XZC": true, + "coin:ZEC": true, + "coin:tGRS": true + }, + "unsupported": {} + } } From 0d1846d68a142949dfa604320fec361b8e82ef1c Mon Sep 17 00:00:00 2001 From: matejcik Date: Wed, 15 Aug 2018 19:27:25 +0200 Subject: [PATCH 32/50] defs: unsupport recently added Eth chains --- defs/support.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/defs/support.json b/defs/support.json index eb3ab3b1b..0a82eef02 100644 --- a/defs/support.json +++ b/defs/support.json @@ -674,12 +674,12 @@ "erc20:ubq:DOT": "1.6.2", "erc20:ubq:QWARK": "1.6.2", "erc20:ubq:RICKS": "1.6.2", - "eth:AKA": "1.6.2", + "eth:AKA": "soon", "eth:CLO": "1.6.2", "eth:EGEM": "1.6.2", "eth:ELLA": "1.6.2", "eth:EOSC": "1.6.2", - "eth:ESN": "1.6.2", + "eth:ESN": "soon", "eth:ETC": "1.6.2", "eth:ETH": "1.6.2", "eth:ETSC": "1.6.2", @@ -1395,12 +1395,12 @@ "erc20:ubq:DOT": "2.0.7", "erc20:ubq:QWARK": "2.0.7", "erc20:ubq:RICKS": "2.0.7", - "eth:AKA": "2.0.7", + "eth:AKA": "soon", "eth:CLO": "2.0.7", "eth:EGEM": "2.0.7", "eth:ELLA": "2.0.7", "eth:EOSC": "2.0.7", - "eth:ESN": "2.0.7", + "eth:ESN": "soon", "eth:ETC": "2.0.7", "eth:ETH": "2.0.7", "eth:ETSC": "2.0.7", From 5fcbe5135ea735b99e6b46c17720ea9f3e559134 Mon Sep 17 00:00:00 2001 From: matejcik Date: Wed, 15 Aug 2018 19:28:00 +0200 Subject: [PATCH 33/50] defs: move Electrum URLs to override json --- defs/coins_details.override.json | 81 ++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/defs/coins_details.override.json b/defs/coins_details.override.json index 6a422491e..a7ca6f510 100644 --- a/defs/coins_details.override.json +++ b/defs/coins_details.override.json @@ -4,5 +4,86 @@ }, "erc20:eth:GNT": { "coinmarketcap_alias": "golem-network-tokens" + }, + "eth:ESN": { + "t1_support": "soon", + "t2_support": "soon" + }, + "eth:AKA": { + "t1_support": "soon", + "t2_support": "soon" + }, + "eth:ETHO": { + "t1_support": "soon", + "t2_support": "soon" + }, + "eth:MUSI": { + "t1_support": "soon", + "t2_support": "soon" + }, + "eth:PIRL": { + "t1_support": "soon", + "t2_support": "soon" + }, + "coin:BCH": { + "wallet": { + "Electron Cash": "https://electroncash.org" + } + }, + "coin:BTC": { + "wallet": { + "Electrum": "https://electrum.org" + } + }, + "coin:BTCP": { + "wallet": { + "BTCP Electrum": "https://github.com/BTCPrivate/electrum-btcp" + } + }, + "coin:BTG": { + "wallet": { + "ElectrumG": "https://github.com/BTCGPU/electrum" + } + }, + "coin:DASH": { + "wallet": { + "Dash Electrum": "https://electrum.dash.org" + } + }, + "coin:FJC": { + "wallet": { + "Electrum-FJC": "http://www.fujicoin.org/downloads.php" + } + }, + "coin:GRS": { + "wallet": { + "Electrum-GRS": "https://www.groestlcoin.org/groestlcoin-electrum-wallet/" + } + }, + "coin:LTC": { + "wallet": { + "Electrum-LTC": "https://electrum-ltc.org" + } + }, + "coin:MONA": { + "wallet": { + "Electrum-MONA": "https://electrum-mona.org" + } + }, + "coin:NMC": { + "wallet": { + "Electrum-NMC": "https://github.com/namecoin/electrum-nmc" + } + }, + "coin:VIA": { + "wallet": { + "Vialectrum": "https://vialectrum.org" + } + }, + "coin:XZC": { + "wallet": { + "Electrum-XZC": "https://github.com/zcoinofficial/electrum-xzc", + "Znode Tool": "https://github.com/yura-pakhuchiy/znode-tool" + } } } From 1fd1db24776d9bd0fe35bb49b36fc9accadbca24 Mon Sep 17 00:00:00 2001 From: matejcik Date: Wed, 15 Aug 2018 19:36:43 +0200 Subject: [PATCH 34/50] defs: add after-merge coins --- defs/misc/misc.json | 7 ++ defs/support-new.json | 231 ++++++++++++++++++++++++++++++++++++++++++ defs/support.json | 4 + 3 files changed, 242 insertions(+) create mode 100644 defs/support-new.json diff --git a/defs/misc/misc.json b/defs/misc/misc.json index 80cd13f0a..e9783df0a 100644 --- a/defs/misc/misc.json +++ b/defs/misc/misc.json @@ -43,5 +43,12 @@ "links": { "Homepage": "https://tezos.com" } + }, + { + "name": "Ontology", + "shortcut": "ONT", + "links": { + "Homepage": "https://ont.io" + } } ] diff --git a/defs/support-new.json b/defs/support-new.json new file mode 100644 index 000000000..1a81a0fe4 --- /dev/null +++ b/defs/support-new.json @@ -0,0 +1,231 @@ +{ + "coin:BCH": { + "trezor1": "1.6.2", + "trezor2": "2.0.7", + "connect": true, + "webwallet": true, + "other": { + "Electron Cash": "https://electroncash.org" + } + }, + "coin:BTC": { + "trezor1": "1.5.2", + "trezor2": "2.0.5", + "connect": true, + "webwallet": true, + "other": { + "Electrum": "https://electrum.org" + } + }, + "coin:BTCP": { + "trezor1": "1.6.2", + "trezor2": "2.0.7", + "connect": null, + "webwallet": true, + "other": { + "BTCP Electrum": "https://github.com/BTCPrivate/electrum-btcp" + } + }, + "coin:BTG": { + "trezor1": "1.6.2", + "trezor2": "2.0.7", + "connect": true, + "webwallet": true, + "other": { + "ElectrumG": "https://github.com/BTCGPU/electrum" + } + }, + "coin:DASH": { + "trezor1": "1.5.2", + "trezor2": "2.0.5", + "connect": true, + "webwallet": true, + "other": { + "Dash Electrum": "https://electrum.dash.org" + } + }, + "coin:DCR": { + "trezor1": "1.6.2", + "trezor2": null, + "connect": null, + "webwallet": true + }, + "coin:DGB": { + "trezor1": "1.6.0", + "trezor2": "2.0.5", + "connect": null, + "webwallet": true + }, + "coin:DOGE": { + "trezor1": "1.5.2", + "trezor2": "2.0.5", + "connect": true, + "webwallet": true + }, + "coin:FJC": { + "trezor1": "1.6.1", + "trezor2": "2.0.5", + "connect": null, + "webwallet": true, + "other": { + "Electrum-FJC": "http://www.fujicoin.org/downloads.php" + } + }, + "coin:GRS": { + "trezor1": "1.6.2", + "trezor2": "2.0.8", + "connect": null, + "webwallet": true, + "other": { + "Electrum-GRS": "https://www.groestlcoin.org/groestlcoin-electrum-wallet/" + } + }, + "coin:LTC": { + "trezor1": "1.5.2", + "trezor2": "2.0.5", + "connect": true, + "webwallet": true, + "other": { + "Electrum-LTC": "https://electrum-ltc.org" + } + }, + "coin:MONA": { + "trezor1": "1.6.0", + "trezor2": "2.0.5", + "connect": null, + "webwallet": true, + "other": { + "Electrum-MONA": "https://electrum-mona.org" + } + }, + "coin:NMC": { + "trezor1": "1.5.2", + "trezor2": "2.0.5", + "connect": null, + "webwallet": null, + "other": { + "Electrum-NMC": "https://github.com/namecoin/electrum-nmc" + } + }, + "coin:TAZ": { + "trezor1": "1.6.2", + "trezor2": "2.0.7", + "connect": null, + "webwallet": true + }, + "coin:TBCH": { + "trezor1": "1.6.2", + "trezor2": "2.0.7", + "connect": null, + "webwallet": null + }, + "coin:TDCR": { + "trezor1": "1.6.2", + "trezor2": null, + "connect": null, + "webwallet": true + }, + "coin:TEST": { + "trezor1": "1.5.2", + "trezor2": "2.0.5", + "connect": true, + "webwallet": true + }, + "coin:TLTC": { + "trezor1": "1.6.2", + "trezor2": "2.0.7", + "connect": null, + "webwallet": true + }, + "coin:VIA": { + "trezor1": "1.6.2", + "trezor2": "2.0.7", + "connect": null, + "webwallet": true, + "other": { + "Vialectrum": "https://vialectrum.org" + } + }, + "coin:VTC": { + "trezor1": "1.6.1", + "trezor2": "2.0.5", + "connect": true, + "webwallet": true + }, + "coin:XZC": { + "trezor1": "1.6.2", + "trezor2": "2.0.7", + "connect": null, + "webwallet": true, + "other": { + "Electrum-XZC": "https://github.com/zcoinofficial/electrum-xzc", + "Znode Tool": "https://github.com/yura-pakhuchiy/znode-tool" + } + }, + "coin:ZEC": { + "trezor1": "1.6.2", + "trezor2": "2.0.7", + "connect": true, + "webwallet": true + }, + "coin:ZEN": { + "trezor1": null, + "trezor2": "2.0.8", + "connect": null, + "webwallet": null + }, + "coin:tDASH": { + "trezor1": "1.6.2", + "trezor2": null, + "connect": null, + "webwallet": null + }, + "coin:tGRS": { + "trezor1": "1.6.2", + "trezor2": "2.0.8", + "connect": null, + "webwallet": true + }, + "coin:tXZC": { + "trezor1": "1.6.2", + "trezor2": "2.0.7", + "connect": null, + "webwallet": null + }, + "misc:LSK": { + "trezor1": null, + "trezor2": "2.0.7", + "connect": null, + "webwallet": null + }, + "misc:XLM": { + "trezor1": "soon", + "trezor2": "soon", + "connect": null, + "webwallet": null + }, + "misc:XTZ": { + "trezor1": null, + "trezor2": "soon", + "connect": null, + "webwallet": null + }, + "misc:ADA": { + "trezor1": null, + "trezor2": "soon", + "connect": null, + "webwallet": null + }, + "misc:XMR": { + "trezor1": null, + "trezor2": "soon", + "connect": null, + "webwallet": null + }, + "misc:XRP": { + "trezor1": null, + "trezor2": "soon", + "connect": null, + "webwallet": null + } +} diff --git a/defs/support.json b/defs/support.json index 0a82eef02..0c513fc07 100644 --- a/defs/support.json +++ b/defs/support.json @@ -682,9 +682,11 @@ "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:PIRL": "soon", "eth:RSK": "1.6.2", "eth:UBQ": "1.6.2", "eth:tETC": "1.6.2", @@ -1403,9 +1405,11 @@ "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:PIRL": "soon", "eth:RSK": "2.0.7", "eth:UBQ": "2.0.7", "eth:tETC": "2.0.7", From 2c564a74f44f148702583342d91b83b963654110 Mon Sep 17 00:00:00 2001 From: matejcik Date: Wed, 22 Aug 2018 15:30:01 +0200 Subject: [PATCH 35/50] support: up-to-date support info --- defs/support.json | 45 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/defs/support.json b/defs/support.json index 0c513fc07..ff2833e90 100644 --- a/defs/support.json +++ b/defs/support.json @@ -22,23 +22,33 @@ "coin:DASH": "1.5.2", "coin:DCR": "1.6.2", "coin:DGB": "1.6.0", + "coin:DNR": "soon", "coin:DOGE": "1.5.2", "coin:FJC": "1.6.1", + "coin:FLASH": "soon", + "coin:FTC": "soon", "coin:GRS": "1.6.2", + "coin:KOTO": "soon", "coin:LTC": "1.5.2", "coin:MONA": "1.6.0", + "coin:MUE": "soon", "coin:NMC": "1.5.2", + "coin:PTC": "soon", + "coin:SMART": "soon", "coin:TAZ": "1.6.2", "coin:TBCH": "1.6.2", + "coin:TBTG": "soon", "coin:TDCR": "1.6.2", "coin:TEST": "1.5.2", "coin:TLTC": "1.6.2", "coin:VIA": "1.6.2", "coin:VTC": "1.6.1", + "coin:XMY": "soon", "coin:XZC": "1.6.2", "coin:ZEC": "1.6.2", "coin:tDASH": "1.6.2", "coin:tGRS": "1.6.2", + "coin:tSMART": "soon", "coin:tXZC": "1.6.2", "erc20:ella:MINING": "1.6.2", "erc20:etc:BEC": "1.6.2", @@ -367,7 +377,6 @@ "erc20:eth:LIFE": "1.6.2", "erc20:eth:LIVE": "1.6.2", "erc20:eth:LNC": "1.6.2", - "erc20:eth:LNC-Linker Coin": "1.6.2", "erc20:eth:LND": "1.6.2", "erc20:eth:LOC": "1.6.2", "erc20:eth:LOCI": "1.6.2", @@ -601,9 +610,9 @@ "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:VET": "1.6.2", "erc20:eth:VIB": "1.6.2", "erc20:eth:VIEW": "1.6.2", "erc20:eth:VIT": "1.6.2", @@ -686,6 +695,7 @@ "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", @@ -703,6 +713,10 @@ "nem:XEM": "1.6.2" }, "unsupported": { + "coin:BTX": "address_type collides with Bitcoin", + "coin:CRW": "address_type collides with Bitcoin", + "coin:TRC": "address_type collides with Bitcoin", + "coin:ZEN": "not implemented on T1", "erc20:etc:PLAY": "duplicate key", "erc20:eth:ATH": "duplicate key", "erc20:eth:ATH (AIgatha Token)": "duplicate key", @@ -735,7 +749,12 @@ "erc20:rin:KC": "duplicate key", "erc20:rin:NONE": "duplicate key", "erc20:rin:RDN": "duplicate key", - "erc20:rop:NONE": "duplicate key" + "erc20:rop:NONE": "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": { @@ -746,22 +765,33 @@ "coin:BTG": "2.0.7", "coin:DASH": "2.0.5", "coin:DGB": "2.0.5", + "coin:DNR": "soon", "coin:DOGE": "2.0.5", "coin:FJC": "2.0.5", + "coin:FLASH": "soon", + "coin:FTC": "soon", "coin:GRS": "2.0.8", + "coin:KOTO": "soon", "coin:LTC": "2.0.5", "coin:MONA": "2.0.5", + "coin:MUE": "soon", "coin:NMC": "2.0.5", + "coin:PTC": "soon", + "coin:SMART": "soon", "coin:TAZ": "2.0.7", "coin:TBCH": "2.0.7", + "coin:TBTG": "soon", "coin:TEST": "2.0.5", "coin:TLTC": "2.0.7", "coin:VIA": "2.0.7", "coin:VTC": "2.0.5", + "coin:XMY": "soon", "coin:XZC": "2.0.7", "coin:ZEC": "2.0.7", "coin:ZEN": "2.0.8", + "coin:tDASH": "soon", "coin:tGRS": "2.0.8", + "coin:tSMART": "soon", "coin:tXZC": "2.0.7", "erc20:ella:MINING": "2.0.7", "erc20:etc:BEC": "2.0.7", @@ -1090,7 +1120,6 @@ "erc20:eth:LIFE": "2.0.7", "erc20:eth:LIVE": "2.0.7", "erc20:eth:LNC": "2.0.7", - "erc20:eth:LNC-Linker Coin": "2.0.7", "erc20:eth:LND": "2.0.7", "erc20:eth:LOC": "2.0.7", "erc20:eth:LOCI": "2.0.7", @@ -1324,9 +1353,9 @@ "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:VET": "2.0.7", "erc20:eth:VIB": "2.0.7", "erc20:eth:VIEW": "2.0.7", "erc20:eth:VIT": "2.0.7", @@ -1409,6 +1438,7 @@ "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", @@ -1431,6 +1461,11 @@ "nem:XEM": "2.0.7" }, "unsupported": { + "coin:BTX": "address_type collides with Bitcoin", + "coin:CRW": "address_type collides with Bitcoin", + "coin:DCR": "not implemented on Trezor T", + "coin:TDCR": "not implemented on Trezor T", + "coin:TRC": "address_type collides with Bitcoin", "erc20:etc:PLAY": "duplicate key", "erc20:eth:ATH": "duplicate key", "erc20:eth:ATH (AIgatha Token)": "duplicate key", From a00bac9584b5d8ae69a17bbe8fbd05ae3fd5354d Mon Sep 17 00:00:00 2001 From: matejcik Date: Wed, 22 Aug 2018 15:33:26 +0200 Subject: [PATCH 36/50] support: drop "new-style" support data (superseded by original-style) --- defs/support-new.json | 231 ------------------------------------------ 1 file changed, 231 deletions(-) delete mode 100644 defs/support-new.json diff --git a/defs/support-new.json b/defs/support-new.json deleted file mode 100644 index 1a81a0fe4..000000000 --- a/defs/support-new.json +++ /dev/null @@ -1,231 +0,0 @@ -{ - "coin:BCH": { - "trezor1": "1.6.2", - "trezor2": "2.0.7", - "connect": true, - "webwallet": true, - "other": { - "Electron Cash": "https://electroncash.org" - } - }, - "coin:BTC": { - "trezor1": "1.5.2", - "trezor2": "2.0.5", - "connect": true, - "webwallet": true, - "other": { - "Electrum": "https://electrum.org" - } - }, - "coin:BTCP": { - "trezor1": "1.6.2", - "trezor2": "2.0.7", - "connect": null, - "webwallet": true, - "other": { - "BTCP Electrum": "https://github.com/BTCPrivate/electrum-btcp" - } - }, - "coin:BTG": { - "trezor1": "1.6.2", - "trezor2": "2.0.7", - "connect": true, - "webwallet": true, - "other": { - "ElectrumG": "https://github.com/BTCGPU/electrum" - } - }, - "coin:DASH": { - "trezor1": "1.5.2", - "trezor2": "2.0.5", - "connect": true, - "webwallet": true, - "other": { - "Dash Electrum": "https://electrum.dash.org" - } - }, - "coin:DCR": { - "trezor1": "1.6.2", - "trezor2": null, - "connect": null, - "webwallet": true - }, - "coin:DGB": { - "trezor1": "1.6.0", - "trezor2": "2.0.5", - "connect": null, - "webwallet": true - }, - "coin:DOGE": { - "trezor1": "1.5.2", - "trezor2": "2.0.5", - "connect": true, - "webwallet": true - }, - "coin:FJC": { - "trezor1": "1.6.1", - "trezor2": "2.0.5", - "connect": null, - "webwallet": true, - "other": { - "Electrum-FJC": "http://www.fujicoin.org/downloads.php" - } - }, - "coin:GRS": { - "trezor1": "1.6.2", - "trezor2": "2.0.8", - "connect": null, - "webwallet": true, - "other": { - "Electrum-GRS": "https://www.groestlcoin.org/groestlcoin-electrum-wallet/" - } - }, - "coin:LTC": { - "trezor1": "1.5.2", - "trezor2": "2.0.5", - "connect": true, - "webwallet": true, - "other": { - "Electrum-LTC": "https://electrum-ltc.org" - } - }, - "coin:MONA": { - "trezor1": "1.6.0", - "trezor2": "2.0.5", - "connect": null, - "webwallet": true, - "other": { - "Electrum-MONA": "https://electrum-mona.org" - } - }, - "coin:NMC": { - "trezor1": "1.5.2", - "trezor2": "2.0.5", - "connect": null, - "webwallet": null, - "other": { - "Electrum-NMC": "https://github.com/namecoin/electrum-nmc" - } - }, - "coin:TAZ": { - "trezor1": "1.6.2", - "trezor2": "2.0.7", - "connect": null, - "webwallet": true - }, - "coin:TBCH": { - "trezor1": "1.6.2", - "trezor2": "2.0.7", - "connect": null, - "webwallet": null - }, - "coin:TDCR": { - "trezor1": "1.6.2", - "trezor2": null, - "connect": null, - "webwallet": true - }, - "coin:TEST": { - "trezor1": "1.5.2", - "trezor2": "2.0.5", - "connect": true, - "webwallet": true - }, - "coin:TLTC": { - "trezor1": "1.6.2", - "trezor2": "2.0.7", - "connect": null, - "webwallet": true - }, - "coin:VIA": { - "trezor1": "1.6.2", - "trezor2": "2.0.7", - "connect": null, - "webwallet": true, - "other": { - "Vialectrum": "https://vialectrum.org" - } - }, - "coin:VTC": { - "trezor1": "1.6.1", - "trezor2": "2.0.5", - "connect": true, - "webwallet": true - }, - "coin:XZC": { - "trezor1": "1.6.2", - "trezor2": "2.0.7", - "connect": null, - "webwallet": true, - "other": { - "Electrum-XZC": "https://github.com/zcoinofficial/electrum-xzc", - "Znode Tool": "https://github.com/yura-pakhuchiy/znode-tool" - } - }, - "coin:ZEC": { - "trezor1": "1.6.2", - "trezor2": "2.0.7", - "connect": true, - "webwallet": true - }, - "coin:ZEN": { - "trezor1": null, - "trezor2": "2.0.8", - "connect": null, - "webwallet": null - }, - "coin:tDASH": { - "trezor1": "1.6.2", - "trezor2": null, - "connect": null, - "webwallet": null - }, - "coin:tGRS": { - "trezor1": "1.6.2", - "trezor2": "2.0.8", - "connect": null, - "webwallet": true - }, - "coin:tXZC": { - "trezor1": "1.6.2", - "trezor2": "2.0.7", - "connect": null, - "webwallet": null - }, - "misc:LSK": { - "trezor1": null, - "trezor2": "2.0.7", - "connect": null, - "webwallet": null - }, - "misc:XLM": { - "trezor1": "soon", - "trezor2": "soon", - "connect": null, - "webwallet": null - }, - "misc:XTZ": { - "trezor1": null, - "trezor2": "soon", - "connect": null, - "webwallet": null - }, - "misc:ADA": { - "trezor1": null, - "trezor2": "soon", - "connect": null, - "webwallet": null - }, - "misc:XMR": { - "trezor1": null, - "trezor2": "soon", - "connect": null, - "webwallet": null - }, - "misc:XRP": { - "trezor1": null, - "trezor2": "soon", - "connect": null, - "webwallet": null - } -} From 5ad2eb74a03e96afe8de7fd5112040646e6bd4c5 Mon Sep 17 00:00:00 2001 From: matejcik Date: Thu, 23 Aug 2018 13:05:41 +0200 Subject: [PATCH 37/50] coin_info: shuffle knowledge about duplicates, validation and support information --- tools/coin_info.py | 134 +++++++++++++++---------- tools/cointool.py | 216 ++++++++++++++++++++++++++++++++++++----- tools/requirements.txt | 3 + 3 files changed, 278 insertions(+), 75 deletions(-) diff --git a/tools/coin_info.py b/tools/coin_info.py index 4c3061d72..f6f2cf43a 100755 --- a/tools/coin_info.py +++ b/tools/coin_info.py @@ -261,6 +261,8 @@ def _load_misc(): # ====== 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(): @@ -280,6 +282,10 @@ def latest_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. @@ -287,7 +293,7 @@ def support_info_single(support_data, coin): top-level key. The support value for each device is determined in order of priority: - * if the coin is marked as duplicate, all support values are `None` + * 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) @@ -297,12 +303,14 @@ def support_info_single(support_data, coin): key = coin["key"] dup = coin.get("duplicate") for device, values in support_data.items(): - if dup: + 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 @@ -337,43 +345,6 @@ def support_info(coins): # ====== data cleanup functions ====== -def find_address_collisions(coins): - """Detects collisions in: - - SLIP44 path prefixes - - address type numbers, both for p2pkh and p2sh - """ - slip44 = defaultdict(list) - at_p2pkh = defaultdict(list) - at_p2sh = defaultdict(list) - - for coin in coins: - name = coin["name"] - s = coin["slip44"] - # ignore m/1 testnets - if not (name.endswith("Testnet") and s == 1): - slip44[s].append(name) - - # skip address types on cashaddr currencies - if coin["cashaddr_prefix"]: - continue - - at_p2pkh[coin["address_type"]].append(name) - at_p2sh[coin["address_type_p2sh"]].append(name) - - def prune(d): - ret = d.copy() - for key in d: - if len(d[key]) < 2: - del ret[key] - return ret - - return dict( - slip44=prune(slip44), - address_type=prune(at_p2pkh), - address_type_p2sh=prune(at_p2sh), - ) - - def _ensure_mandatory_values(coins): """Checks that every coin has the mandatory fields: name, shortcut, key""" for coin in coins: @@ -381,9 +352,33 @@ def _ensure_mandatory_values(coins): 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) @@ -392,26 +387,50 @@ def mark_duplicate_shortcuts(coins): return {k: v for k, v in dups.items() if len(v) > 1} for coin in coins: - symsplit = coin["shortcut"].split(" ", maxsplit=1) - symbol = symsplit[0] + 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) - # mark duplicate symbols - for values in dup_symbols.values(): - for coin in values: - coin["duplicate"] = True - - # deduplicate keys + # first deduplicate keys so that we can identify overrides for values in dup_keys.values(): for i, coin in enumerate(values): - # presumably only duplicate symbols can have duplicate keys - assert coin.get("duplicate") 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 + + nontokens = [coin for coin in values if not is_token(coin)] + + 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 @@ -461,3 +480,20 @@ def get_all(deduplicate=True): ] return all_coins + + +def search(coins, keyword): + kwl = keyword.lower() + 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/cointool.py b/tools/cointool.py index ee05e6183..6428e71fc 100755 --- a/tools/cointool.py +++ b/tools/cointool.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 import io import json +import logging import re import sys import os @@ -8,6 +9,7 @@ import glob import binascii import struct import zlib +from collections import defaultdict from hashlib import sha256 import click @@ -15,6 +17,10 @@ import click import coin_info from coindef import CoinDef +try: + import termcolor +except ImportError: + termcolor = None try: import mako @@ -40,6 +46,36 @@ 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 ====== @@ -106,46 +142,146 @@ def render_file(src, dst, coins, support_info): # ====== validation functions ====== +def highlight_key(coin, color): + 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) for coin in coins: errors = coin_info.validate_btc(coin) if errors: check_passed = False - print("ERR:", "invalid definition for", coin["name"]) + print_log(logging.ERROR, "invalid definition for", coin["name"]) print("\n".join(errors)) - collisions = coin_info.find_address_collisions(coins) - # warning only - for key, dups in collisions.items(): - if dups: - print("WARN: collisions found in", key) - for k, v in dups.items(): - print("-", k, ":", ", ".join(map(str, v))) + def collision_str(bucket): + 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): + 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")] + + if len(mainnets) > 1: + if len(supported_mainnets) > 1: + if have_bitcoin: + level = logging.ERROR + failed = True + else: + level = logging.WARNING + else: + 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 + + 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): +def check_dups(buckets, show_tok_notok, show_erc20): + def coin_str(coin): + 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 bucket in buckets.values(): - nontokens = [coin for coin in bucket if not coin["key"].startswith("erc20")] - token_list = [coin["key"] for coin in bucket if coin["key"].startswith("erc20")] - if not nontokens: + + for symbol in sorted(buckets.keys()): + bucket = buckets[symbol] + if not bucket: continue - if len(nontokens) == 1: - coin = nontokens[0] - print( - f"Coin {coin['key']} ({coin['name']}) is duplicate with", - ", ".join(token_list), - "and that is OK.", - ) + + 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: - nontoken_list = [f"{coin['key']} ({coin['name']})" for coin in nontokens] - print("Duplicate shortcuts for", ", ".join(nontoken_list)) + level = logging.ERROR check_passed = False + # deciding whether to print + if not nontokens and not show_erc20: + continue + if len(nontokens) == 1 and not show_tok_notok: + 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 @@ -250,8 +386,15 @@ def sign(data): @click.group() -def cli(): - pass +@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() @@ -259,12 +402,24 @@ def cli(): @click.option("--missing-support/--no-missing-support", "-s", default=False, help="Fail if support info for a coin is missing") @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(missing_support, backend, icons): +def check(missing_support, backend, icons, show_duplicates): """Validate coin definitions. Checks that every btc-like coin is properly filled out, reports address collisions and missing support information. + + 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. """ if backend and requests is None: raise click.ClickException("You must install requests for backend check") @@ -286,8 +441,17 @@ def check(missing_support, backend, icons): # if not check_support(defs, support_data, fail_missing=missing_support): # all_checks_passed = False + if show_duplicates == "all": + show_tok_notok = True + show_erc20 = True + elif show_duplicates == "nontoken": + show_tok_notok = True + show_erc20 = False + else: + show_tok_notok = False + show_erc20 = False print("Checking unexpected duplicates...") - if not check_dups(buckets): + if not check_dups(buckets, show_tok_notok, show_erc20): all_checks_passed = False if icons: diff --git a/tools/requirements.txt b/tools/requirements.txt index f910733ab..59cab2694 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -11,3 +11,6 @@ requests>=2.19 # for rendering templates: Mako>=1.0.7 munch>=2.3.2 + +# for pretty colors in checks +termcolor >= 0.1.2 From a3240380c6062b1caa598f9088823cf1c48e8667 Mon Sep 17 00:00:00 2001 From: matejcik Date: Thu, 23 Aug 2018 17:32:50 +0200 Subject: [PATCH 38/50] tools: ERC20 duplicate management --- defs/duplicity_overrides.json | 6 + defs/support.json | 304 +++++++++++++++++++++++----------- tools/support.py | 234 +++++++++++++++++--------- 3 files changed, 373 insertions(+), 171 deletions(-) create mode 100644 defs/duplicity_overrides.json 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/support.json b/defs/support.json index ff2833e90..90d7f1daf 100644 --- a/defs/support.json +++ b/defs/support.json @@ -207,7 +207,6 @@ "erc20:eth:CryptoCarbon": "1.6.2", "erc20:eth:DAB": "1.6.2", "erc20:eth:DADI": "1.6.2", - "erc20:eth:DAI": "1.6.2", "erc20:eth:DALC": "1.6.2", "erc20:eth:DAN": "1.6.2", "erc20:eth:DAO": "1.6.2", @@ -224,7 +223,6 @@ "erc20:eth:DEB": "1.6.2", "erc20:eth:DEEZ": "1.6.2", "erc20:eth:DENT": "1.6.2", - "erc20:eth:DGD": "1.6.2", "erc20:eth:DGPT": "1.6.2", "erc20:eth:DGX": "1.6.2", "erc20:eth:DICE": "1.6.2", @@ -275,7 +273,6 @@ "erc20:eth:EVX": "1.6.2", "erc20:eth:EXMR": "1.6.2", "erc20:eth:FAM": "1.6.2", - "erc20:eth:FANX": "1.6.2", "erc20:eth:FKX": "1.6.2", "erc20:eth:FLIXX": "1.6.2", "erc20:eth:FLP": "1.6.2", @@ -284,7 +281,6 @@ "erc20:eth:FLX": "1.6.2", "erc20:eth:FND": "1.6.2", "erc20:eth:FRD": "1.6.2", - "erc20:eth:FTC": "1.6.2", "erc20:eth:FTR": "1.6.2", "erc20:eth:FTT": "1.6.2", "erc20:eth:FUEL": "1.6.2", @@ -303,7 +299,6 @@ "erc20:eth:GIM": "1.6.2", "erc20:eth:GMT": "1.6.2", "erc20:eth:GNO": "1.6.2", - "erc20:eth:GNT": "1.6.2", "erc20:eth:GOLDX": "1.6.2", "erc20:eth:GRID": "1.6.2", "erc20:eth:GROW": "1.6.2", @@ -376,7 +371,6 @@ "erc20:eth:LIF": "1.6.2", "erc20:eth:LIFE": "1.6.2", "erc20:eth:LIVE": "1.6.2", - "erc20:eth:LNC": "1.6.2", "erc20:eth:LND": "1.6.2", "erc20:eth:LOC": "1.6.2", "erc20:eth:LOCI": "1.6.2", @@ -404,9 +398,7 @@ "erc20:eth:MEST": "1.6.2", "erc20:eth:MFG": "1.6.2", "erc20:eth:MGO": "1.6.2", - "erc20:eth:MKR": "1.6.2", "erc20:eth:MKT": "1.6.2", - "erc20:eth:MLN": "1.6.2", "erc20:eth:MNE": "1.6.2", "erc20:eth:MNT": "1.6.2", "erc20:eth:MNTP": "1.6.2", @@ -415,7 +407,6 @@ "erc20:eth:MRP": "1.6.2", "erc20:eth:MRV": "1.6.2", "erc20:eth:MSP": "1.6.2", - "erc20:eth:MTC": "1.6.2", "erc20:eth:MTH": "1.6.2", "erc20:eth:MTL": "1.6.2", "erc20:eth:MTN": "1.6.2", @@ -491,7 +482,6 @@ "erc20:eth:PRS": "1.6.2", "erc20:eth:PRSP": "1.6.2", "erc20:eth:PT": "1.6.2", - "erc20:eth:PTC": "1.6.2", "erc20:eth:PTOY": "1.6.2", "erc20:eth:PTWO": "1.6.2", "erc20:eth:PUC": "1.6.2", @@ -545,7 +535,6 @@ "erc20:eth:SKO1": "1.6.2", "erc20:eth:SKR": "1.6.2", "erc20:eth:SLT": "1.6.2", - "erc20:eth:SMART": "1.6.2", "erc20:eth:SNC": "1.6.2", "erc20:eth:SND": "1.6.2", "erc20:eth:SNG": "1.6.2", @@ -593,7 +582,6 @@ "erc20:eth:TIX": "1.6.2", "erc20:eth:TKN": "1.6.2", "erc20:eth:TNT": "1.6.2", - "erc20:eth:TRC": "1.6.2", "erc20:eth:TRCN": "1.6.2", "erc20:eth:TRST": "1.6.2", "erc20:eth:TRX": "1.6.2", @@ -654,13 +642,11 @@ "erc20:eth:XNT": "1.6.2", "erc20:eth:XRL": "1.6.2", "erc20:eth:XSC": "1.6.2", - "erc20:eth:YEED": "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:ZRX": "1.6.2", "erc20:eth:ZST": "1.6.2", "erc20:eth:cV": "1.6.2", "erc20:eth:eBCH": "1.6.2", @@ -717,39 +703,111 @@ "coin:CRW": "address_type collides with Bitcoin", "coin:TRC": "address_type collides with Bitcoin", "coin:ZEN": "not implemented on T1", - "erc20:etc:PLAY": "duplicate key", - "erc20:eth:ATH": "duplicate key", - "erc20:eth:ATH (AIgatha Token)": "duplicate key", - "erc20:eth:BLX (Bullion)": "duplicate key", - "erc20:eth:BLX (Iconomi)": "duplicate key", - "erc20:eth:BTL (Battle)": "duplicate key", - "erc20:eth:BTL (Bitlle)": "duplicate key", - "erc20:eth:CAR": "duplicate key", - "erc20:eth:CAR (CarBlock)": "duplicate key", - "erc20:eth:CAT (BitClave)": "duplicate key", - "erc20:eth:CAT (Blockcat)": "duplicate key", - "erc20:eth:CCC (CryptoCrashCourse)": "duplicate key", - "erc20:eth:CCC (ICONOMI)": "duplicate key", - "erc20:eth:DEPO": "duplicate key", - "erc20:eth:DEPO (Depository Network)": "duplicate key", - "erc20:eth:DROP": "duplicate key", - "erc20:eth:DROP (dropil)": "duplicate key", - "erc20:eth:GUP": "duplicate key", - "erc20:eth:KC": "duplicate key", - "erc20:eth:LINK (Chainlink)": "duplicate key", - "erc20:eth:LINK Platform": "duplicate key", - "erc20:eth:MIT": "duplicate key", - "erc20:eth:MIT (Mychatcoin)": "duplicate key", - "erc20:eth:NONE": "duplicate key", - "erc20:eth:NXX": "duplicate key", - "erc20:eth:NXX OLD": "duplicate key", - "erc20:eth:PLAY": "duplicate key", - "erc20:eth:RDN": "duplicate key", - "erc20:kov:GUP": "duplicate key", - "erc20:rin:KC": "duplicate key", - "erc20:rin:NONE": "duplicate key", - "erc20:rin:RDN": "duplicate key", - "erc20:rop:NONE": "duplicate key", + "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", @@ -950,7 +1008,6 @@ "erc20:eth:CryptoCarbon": "2.0.7", "erc20:eth:DAB": "2.0.7", "erc20:eth:DADI": "2.0.7", - "erc20:eth:DAI": "2.0.7", "erc20:eth:DALC": "2.0.7", "erc20:eth:DAN": "2.0.7", "erc20:eth:DAO": "2.0.7", @@ -967,7 +1024,6 @@ "erc20:eth:DEB": "2.0.7", "erc20:eth:DEEZ": "2.0.7", "erc20:eth:DENT": "2.0.7", - "erc20:eth:DGD": "2.0.7", "erc20:eth:DGPT": "2.0.7", "erc20:eth:DGX": "2.0.7", "erc20:eth:DICE": "2.0.7", @@ -1018,7 +1074,6 @@ "erc20:eth:EVX": "2.0.7", "erc20:eth:EXMR": "2.0.7", "erc20:eth:FAM": "2.0.7", - "erc20:eth:FANX": "2.0.7", "erc20:eth:FKX": "2.0.7", "erc20:eth:FLIXX": "2.0.7", "erc20:eth:FLP": "2.0.7", @@ -1027,7 +1082,6 @@ "erc20:eth:FLX": "2.0.7", "erc20:eth:FND": "2.0.7", "erc20:eth:FRD": "2.0.7", - "erc20:eth:FTC": "2.0.7", "erc20:eth:FTR": "2.0.7", "erc20:eth:FTT": "2.0.7", "erc20:eth:FUEL": "2.0.7", @@ -1046,7 +1100,6 @@ "erc20:eth:GIM": "2.0.7", "erc20:eth:GMT": "2.0.7", "erc20:eth:GNO": "2.0.7", - "erc20:eth:GNT": "2.0.7", "erc20:eth:GOLDX": "2.0.7", "erc20:eth:GRID": "2.0.7", "erc20:eth:GROW": "2.0.7", @@ -1119,7 +1172,6 @@ "erc20:eth:LIF": "2.0.7", "erc20:eth:LIFE": "2.0.7", "erc20:eth:LIVE": "2.0.7", - "erc20:eth:LNC": "2.0.7", "erc20:eth:LND": "2.0.7", "erc20:eth:LOC": "2.0.7", "erc20:eth:LOCI": "2.0.7", @@ -1147,9 +1199,7 @@ "erc20:eth:MEST": "2.0.7", "erc20:eth:MFG": "2.0.7", "erc20:eth:MGO": "2.0.7", - "erc20:eth:MKR": "2.0.7", "erc20:eth:MKT": "2.0.7", - "erc20:eth:MLN": "2.0.7", "erc20:eth:MNE": "2.0.7", "erc20:eth:MNT": "2.0.7", "erc20:eth:MNTP": "2.0.7", @@ -1158,7 +1208,6 @@ "erc20:eth:MRP": "2.0.7", "erc20:eth:MRV": "2.0.7", "erc20:eth:MSP": "2.0.7", - "erc20:eth:MTC": "2.0.7", "erc20:eth:MTH": "2.0.7", "erc20:eth:MTL": "2.0.7", "erc20:eth:MTN": "2.0.7", @@ -1234,7 +1283,6 @@ "erc20:eth:PRS": "2.0.7", "erc20:eth:PRSP": "2.0.7", "erc20:eth:PT": "2.0.7", - "erc20:eth:PTC": "2.0.7", "erc20:eth:PTOY": "2.0.7", "erc20:eth:PTWO": "2.0.7", "erc20:eth:PUC": "2.0.7", @@ -1288,7 +1336,6 @@ "erc20:eth:SKO1": "2.0.7", "erc20:eth:SKR": "2.0.7", "erc20:eth:SLT": "2.0.7", - "erc20:eth:SMART": "2.0.7", "erc20:eth:SNC": "2.0.7", "erc20:eth:SND": "2.0.7", "erc20:eth:SNG": "2.0.7", @@ -1336,7 +1383,6 @@ "erc20:eth:TIX": "2.0.7", "erc20:eth:TKN": "2.0.7", "erc20:eth:TNT": "2.0.7", - "erc20:eth:TRC": "2.0.7", "erc20:eth:TRCN": "2.0.7", "erc20:eth:TRST": "2.0.7", "erc20:eth:TRX": "2.0.7", @@ -1397,13 +1443,11 @@ "erc20:eth:XNT": "2.0.7", "erc20:eth:XRL": "2.0.7", "erc20:eth:XSC": "2.0.7", - "erc20:eth:YEED": "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:ZRX": "2.0.7", "erc20:eth:ZST": "2.0.7", "erc20:eth:cV": "2.0.7", "erc20:eth:eBCH": "2.0.7", @@ -1466,39 +1510,111 @@ "coin:DCR": "not implemented on Trezor T", "coin:TDCR": "not implemented on Trezor T", "coin:TRC": "address_type collides with Bitcoin", - "erc20:etc:PLAY": "duplicate key", - "erc20:eth:ATH": "duplicate key", - "erc20:eth:ATH (AIgatha Token)": "duplicate key", - "erc20:eth:BLX (Bullion)": "duplicate key", - "erc20:eth:BLX (Iconomi)": "duplicate key", - "erc20:eth:BTL (Battle)": "duplicate key", - "erc20:eth:BTL (Bitlle)": "duplicate key", - "erc20:eth:CAR": "duplicate key", - "erc20:eth:CAR (CarBlock)": "duplicate key", - "erc20:eth:CAT (BitClave)": "duplicate key", - "erc20:eth:CAT (Blockcat)": "duplicate key", - "erc20:eth:CCC (CryptoCrashCourse)": "duplicate key", - "erc20:eth:CCC (ICONOMI)": "duplicate key", - "erc20:eth:DEPO": "duplicate key", - "erc20:eth:DEPO (Depository Network)": "duplicate key", - "erc20:eth:DROP": "duplicate key", - "erc20:eth:DROP (dropil)": "duplicate key", - "erc20:eth:GUP": "duplicate key", - "erc20:eth:KC": "duplicate key", - "erc20:eth:LINK (Chainlink)": "duplicate key", - "erc20:eth:LINK Platform": "duplicate key", - "erc20:eth:MIT": "duplicate key", - "erc20:eth:MIT (Mychatcoin)": "duplicate key", - "erc20:eth:NONE": "duplicate key", - "erc20:eth:NXX": "duplicate key", - "erc20:eth:NXX OLD": "duplicate key", - "erc20:eth:PLAY": "duplicate key", - "erc20:eth:RDN": "duplicate key", - "erc20:kov:GUP": "duplicate key", - "erc20:rin:KC": "duplicate key", - "erc20:rin:NONE": "duplicate key", - "erc20:rin:RDN": "duplicate key", - "erc20:rop:NONE": "duplicate key" + "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": { diff --git a/tools/support.py b/tools/support.py index 0e90e9617..ddb6efc7a 100755 --- a/tools/support.py +++ b/tools/support.py @@ -7,11 +7,11 @@ import coin_info import json SUPPORT_INFO = coin_info.get_support_data() -MISSING_MEANS_NO = ("connect", "webwallet") -VERSIONED_SUPPORT_INFO = ("trezor1", "trezor2") 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: @@ -19,6 +19,33 @@ def write_support_info(): 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"]: @@ -42,13 +69,13 @@ def print_support(coin): key, name, shortcut = coin["key"], coin["name"], coin["shortcut"] print(f"{key} - {name} ({shortcut})") if coin.get("duplicate"): - if key.startswith("erc20:"): + 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 MISSING_MEANS_NO + missing_means_no = dev in coin_info.MISSING_SUPPORT_MEANS_NO print(" *", dev, ":", support_value(where, key, missing_means_no)) @@ -73,7 +100,7 @@ def check_support_values(): else: for key, value in supported.items(): try: - if device in VERSIONED_SUPPORT_INFO: + if device in coin_info.VERSIONED_SUPPORT_INFO: _check_value_version_soon(value) else: if value is not True: @@ -94,48 +121,113 @@ def check_support_values(): def find_unsupported_coins(coins_dict): result = {} - for device in VERSIONED_SUPPORT_INFO: - values = SUPPORT_INFO[device] - support_set = set() - support_set.update(values["supported"].keys()) - support_set.update(values["unsupported"].keys()) + 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] = unsupported = [] + result[device] = [] for key, coin in coins_dict.items(): if coin.get("duplicate"): continue if key not in support_set: - unsupported.append(coin) + result[device].append(coin) return result def find_orphaned_support_keys(coins_dict): - result = {} - for device, values in SUPPORT_INFO.items(): - device_res = {} - for supkey, supvalues in values.items(): - orphans = set() - for coin_key in supvalues.keys(): - if coin_key not in coins_dict: - orphans.add(coin_key) - device_res[supkey] = orphans - result[device] = device_res + 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() +def fix(): + """Fix expected problems. + + Prunes orphaned keys and ensures that ERC20 duplicate info matches support info. + """ + all_coins = coin_info.get_all(deduplicate=False) + coin_info.mark_duplicate_shortcuts(all_coins.as_list()) + 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) + write_support_info() + + @cli.command() # fmt: off -@click.option("-p", "--prune-orphans", is_flag=True, help="Remove orphaned keys for which there is no corresponding coin info") @click.option("-t", "--ignore-tokens", is_flag=True, help="Ignore unsupported ERC20 tokens") # fmt: on -def check(prune_orphans, ignore_tokens): +def check(ignore_tokens): """Check validity of support information. Ensures that `support.json` data is well formed, there are no keys without @@ -158,28 +250,25 @@ def check(prune_orphans, ignore_tokens): checks_ok = False orphaned = find_orphaned_support_keys(coins_dict) - for device, values in orphaned.items(): - for supkey, supvalues in values.items(): - for key in supvalues: - print(f"orphaned key {device} -> {supkey} -> {key}") - if prune_orphans: - del SUPPORT_INFO[device][supkey][key] - else: - checks_ok = False - - if prune_orphans: - write_support_info() + 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["key"].startswith("erc20:")] + values = [coin for coin in values if not coin_info.is_token(coin)] if values: 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) @@ -189,11 +278,12 @@ def check(prune_orphans, ignore_tokens): # fmt: off @click.argument("version") @click.option("--git-tag/--no-git-tag", "-g", default=False, help="create a corresponding Git tag") -@click.option("--soon/--no-soon", default=True, help="Release coins marked 'soon'") -@click.option("--missing/--no-missing", default=True, help="Release coins with missing support info") +@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'.") # fmt: on -def release(version, git_tag, soon, missing, dry_run): +def release(version, git_tag, release_soon, release_missing, dry_run, soon): """Release a new Trezor firmware. Update support infos so that all coins have a clear support status. @@ -206,33 +296,43 @@ def release(version, git_tag, soon, missing, dry_run): version_tuple = list(map(int, version.split("."))) device = f"trezor{version_tuple[0]}" - print(f"Releasing {device} firmware version {version}") + if soon and git_tag: + raise click.ClickException("Cannot git-tag a 'soon' revision") + + if soon: + version = "soon" + print(f"Moving {device} missing infos to 'soon'") + else: + print(f"Releasing {device} firmware version {version}") defs = coin_info.get_all(deduplicate=False) coin_info.mark_duplicate_shortcuts(defs.as_list()) coins_dict = defs.as_dict() - if missing: + # process those darned ERC20 duplicates + + if release_missing: missing_list = find_unsupported_coins(coins_dict)[device] for coin in missing_list: key = coin["key"] - if coin.get("duplicate"): + if coin.get("duplicate") and coin_info.is_token(coin): print(f"UNsupporting duplicate coin {key} ({coin['name']})") - SUPPORT_INFO[device]["unsupported"][key] = "duplicate key" + set_unsupported(device, key, ERC20_DUPLICATE_KEY) else: print(f"Adding missing {key} ({coin['name']})") - SUPPORT_INFO[device]["supported"][key] = version + set_supported(device, key, version) - if soon: + if not soon and release_soon: + supported, _ = support_dicts(device) soon_list = [ coins_dict[key] - for key, val in SUPPORT_INFO[device]["supported"].items() + for key, val in supported if val == "soon" and key in coins_dict ] for coin in soon_list: key = coin["key"] print(f"Adding soon-released {key} ({coin['name']})") - SUPPORT_INFO[device]["supported"][key] = version + set_supported(device, key, version) if git_tag: print("git tag not supported yet") @@ -253,23 +353,9 @@ def show(keyword): defs = coin_info.get_all(deduplicate=False).as_list() coin_info.mark_duplicate_shortcuts(defs) - for coin in defs: - key = coin["key"].lower() - name = coin["name"].lower() - shortcut = coin["shortcut"].lower() - symsplit = shortcut.split(" ", maxsplit=1) - symbol = symsplit[0] - suffix = symsplit[1] if len(symsplit) > 1 else "" - for kw in keyword: - kwl = kw.lower() - if ( - kwl == key - or kwl in name - or kwl == shortcut - or kwl == symbol - or kwl in suffix - ): - print_support(coin) + for kw in keyword: + for coin in coin_info.search(defs, kw): + print_support(coin) @cli.command(name="set") @@ -304,7 +390,7 @@ def set_support_value(key, entries, reason): click.echo("Use 'support.py show' to search for the right one.") sys.exit(1) - if coins[key].get("duplicate"): + 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.") @@ -319,26 +405,20 @@ def set_support_value(key, entries, reason): if device not in SUPPORT_INFO: raise click.ClickException(f"unknown device: {device}") - where = SUPPORT_INFO[device] - # clear existing info - where["supported"].pop(key, None) - where["unsupported"].pop(key, None) - if value in ("yes", "true", "1"): - where["supported"][key] = True + set_supported(device, key, True) elif value in ("no", "false", "0"): - if device in MISSING_MEANS_NO: + 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}:") - where["unsupported"][key] = reason + set_unsupported(device, key, reason) elif value == "": - # do nothing, existing info is cleared - pass + clear_support(device, key) else: - # arbitrary string? - where["supported"][key] = value + # arbitrary string + set_supported(device, key, value) print_support(coins[key]) write_support_info() From e070b22aa3524e369535d281b11608dfdbf50d02 Mon Sep 17 00:00:00 2001 From: matejcik Date: Thu, 23 Aug 2018 17:50:38 +0200 Subject: [PATCH 39/50] coins_details: update tool, overrides, generated files and upstream token source --- defs/coins_details.json | 1606 +++++++++++++++++------------- defs/coins_details.override.json | 20 - defs/ethereum/tokens | 2 +- defs/support.json | 16 + tools/coins_details.py | 70 +- 5 files changed, 942 insertions(+), 772 deletions(-) diff --git a/defs/coins_details.json b/defs/coins_details.json index 06b93c5bc..6b250823f 100644 --- a/defs/coins_details.json +++ b/defs/coins_details.json @@ -5,7 +5,7 @@ "Github": "https://github.com/Bitcoin-ABC/bitcoin-abc", "Homepage": "https://www.bitcoincash.org" }, - "marketcap_usd": 14034413679, + "marketcap_usd": 9060927775, "name": "Bitcoin Cash", "shortcut": "BCH", "t1_enabled": "yes", @@ -21,7 +21,7 @@ "Github": "https://github.com/bitcoin/bitcoin", "Homepage": "https://bitcoin.org" }, - "marketcap_usd": 139846691999, + "marketcap_usd": 111347645251, "name": "Bitcoin", "shortcut": "BTC", "t1_enabled": "yes", @@ -37,7 +37,7 @@ "Github": "https://github.com/BTCPrivate/BitcoinPrivate", "Homepage": "https://btcprivate.org" }, - "marketcap_usd": 139956956, + "marketcap_usd": 81211090, "name": "Bitcoin Private", "shortcut": "BTCP", "t1_enabled": "yes", @@ -52,7 +52,7 @@ "Github": "https://github.com/BTCGPU/BTCGPU", "Homepage": "https://bitcoingold.org" }, - "marketcap_usd": 523433696, + "marketcap_usd": 316050580, "name": "Bitcoin Gold", "shortcut": "BTG", "t1_enabled": "yes", @@ -68,7 +68,7 @@ "Github": "https://github.com/LIMXTEC/BitCore", "Homepage": "https://bitcore.cc" }, - "marketcap_usd": 30853808, + "marketcap_usd": 19911585, "name": "Bitcore", "shortcut": "BTX", "t1_enabled": "no", @@ -81,7 +81,7 @@ "Github": "https://github.com/Crowndev/crowncoin", "Homepage": "https://crown.tech" }, - "marketcap_usd": 9788097, + "marketcap_usd": 5211934, "name": "Crown", "shortcut": "CRW", "t1_enabled": "no", @@ -94,7 +94,7 @@ "Github": "https://github.com/dashpay/dash", "Homepage": "https://www.dash.org" }, - "marketcap_usd": 1942889524, + "marketcap_usd": 1148041905, "name": "Dash", "shortcut": "DASH", "t1_enabled": "yes", @@ -110,7 +110,7 @@ "Github": "https://github.com/decred/dcrd", "Homepage": "https://www.decred.org" }, - "marketcap_usd": 495856582, + "marketcap_usd": 305128323, "name": "Decred", "shortcut": "DCR", "t1_enabled": "yes", @@ -123,7 +123,7 @@ "Github": "https://github.com/digibyte/digibyte", "Homepage": "https://digibyte.io" }, - "marketcap_usd": 427647326, + "marketcap_usd": 257382920, "name": "DigiByte", "shortcut": "DGB", "t1_enabled": "yes", @@ -139,8 +139,8 @@ "marketcap_usd": 0, "name": "Denarius", "shortcut": "DNR", - "t1_enabled": "no", - "t2_enabled": "no", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "coin", "wallet": {} }, @@ -149,7 +149,7 @@ "Github": "https://github.com/dogecoin/dogecoin", "Homepage": "http://dogecoin.com" }, - "marketcap_usd": 371487254, + "marketcap_usd": 273658182, "name": "Dogecoin", "shortcut": "DOGE", "t1_enabled": "yes", @@ -164,7 +164,7 @@ "Github": "https://github.com/fujicoin/fujicoin", "Homepage": "http://fujicoin.org" }, - "marketcap_usd": 745832, + "marketcap_usd": 515593, "name": "Fujicoin", "shortcut": "FJC", "t1_enabled": "yes", @@ -179,11 +179,11 @@ "Github": "https://github.com/flash-coin", "Homepage": "https://www.flashcoin.io" }, - "marketcap_usd": 10829470, + "marketcap_usd": 5807712, "name": "Flashcoin", "shortcut": "FLASH", - "t1_enabled": "no", - "t2_enabled": "no", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "coin", "wallet": {} }, @@ -192,11 +192,11 @@ "Github": "https://github.com/FeatherCoin/Feathercoin", "Homepage": "https://feathercoin.com" }, - "marketcap_usd": 21246165, + "marketcap_usd": 10600270, "name": "Feathercoin", "shortcut": "FTC", - "t1_enabled": "no", - "t2_enabled": "no", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "coin", "wallet": {} }, @@ -205,7 +205,7 @@ "Github": "https://github.com/Groestlcoin/groestlcoin", "Homepage": "https://www.groestlcoin.org" }, - "marketcap_usd": 45964821, + "marketcap_usd": 41625236, "name": "Groestlcoin", "shortcut": "GRS", "t1_enabled": "yes", @@ -223,8 +223,8 @@ "marketcap_usd": 0, "name": "Koto", "shortcut": "KOTO", - "t1_enabled": "no", - "t2_enabled": "no", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "coin", "wallet": {} }, @@ -233,7 +233,7 @@ "Github": "https://github.com/litecoin-project/litecoin", "Homepage": "https://litecoin.org" }, - "marketcap_usd": 4774226092, + "marketcap_usd": 3258961661, "name": "Litecoin", "shortcut": "LTC", "t1_enabled": "yes", @@ -249,7 +249,7 @@ "Github": "https://github.com/monacoinproject/monacoin", "Homepage": "https://monacoin.org" }, - "marketcap_usd": 128119443, + "marketcap_usd": 96010658, "name": "Monacoin", "shortcut": "MONA", "t1_enabled": "yes", @@ -267,8 +267,8 @@ "marketcap_usd": 0, "name": "MUE", "shortcut": "MUE", - "t1_enabled": "no", - "t2_enabled": "no", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "coin", "wallet": {} }, @@ -277,7 +277,7 @@ "Github": "https://github.com/namecoin/namecoin-core", "Homepage": "https://namecoin.org" }, - "marketcap_usd": 32374353, + "marketcap_usd": 24205722, "name": "Namecoin", "shortcut": "NMC", "t1_enabled": "yes", @@ -292,11 +292,24 @@ "Github": "https://github.com/FundacionPesetacoin/PesetacoinCore", "Homepage": "http://pesetacoin.info" }, - "marketcap_usd": 3356792, + "marketcap_usd": 2061608, "name": "Pesetacoin", "shortcut": "PTC", - "t1_enabled": "no", - "t2_enabled": "no", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "coin", + "wallet": {} + }, + "coin:SMART": { + "links": { + "Github": "https://github.com/SmartCash/Core-Smart", + "Homepage": "https://smarcash.cc" + }, + "marketcap_usd": 49514130, + "name": "SmartCash", + "shortcut": "SMART", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "coin", "wallet": {} }, @@ -337,8 +350,8 @@ "marketcap_usd": 0, "name": "Bitcoin Gold Testnet", "shortcut": "TBTG", - "t1_enabled": "no", - "t2_enabled": "no", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "coin", "wallet": {} }, @@ -391,7 +404,7 @@ "Github": "https://github.com/terracoin/terracoin", "Homepage": "https://terracoin.io" }, - "marketcap_usd": 2187227, + "marketcap_usd": 1511563, "name": "Terracoin", "shortcut": "TRC", "t1_enabled": "no", @@ -404,7 +417,7 @@ "Github": "https://github.com/viacoin", "Homepage": "https://viacoin.org" }, - "marketcap_usd": 30564496, + "marketcap_usd": 19043035, "name": "Viacoin", "shortcut": "VIA", "t1_enabled": "yes", @@ -419,7 +432,7 @@ "Github": "https://github.com/vertcoin-project/vertcoin-core", "Homepage": "https://vertcoin.org" }, - "marketcap_usd": 61062807, + "marketcap_usd": 31582960, "name": "Vertcoin", "shortcut": "VTC", "t1_enabled": "yes", @@ -434,11 +447,11 @@ "Github": "https://github.com/myriadcoin/myriadcoin", "Homepage": "https://www.myriadcoin.org" }, - "marketcap_usd": 6347837, + "marketcap_usd": 4644297, "name": "Myriad", "shortcut": "XMY", - "t1_enabled": "no", - "t2_enabled": "no", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "coin", "wallet": {} }, @@ -447,7 +460,7 @@ "Github": "https://github.com/zcoinofficial/zcoin", "Homepage": "https://zcoin.io" }, - "marketcap_usd": 84122050, + "marketcap_usd": 67426017, "name": "Zcoin", "shortcut": "XZC", "t1_enabled": "yes", @@ -463,7 +476,7 @@ "Github": "https://github.com/zcash/zcash", "Homepage": "https://z.cash" }, - "marketcap_usd": 942969596, + "marketcap_usd": 611353070, "name": "Zcash", "shortcut": "ZEC", "t1_enabled": "yes", @@ -478,7 +491,7 @@ "Github": "https://github.com/ZencashOfficial/zen", "Homepage": "https://zencash.com" }, - "marketcap_usd": 125295762, + "marketcap_usd": 90375887, "name": "Zencash", "shortcut": "ZEN", "t1_enabled": "no", @@ -496,7 +509,7 @@ "name": "Dash Testnet", "shortcut": "tDASH", "t1_enabled": "yes", - "t2_enabled": "no", + "t2_enabled": "soon", "type": "coin", "wallet": {} }, @@ -514,6 +527,20 @@ "type": "coin", "wallet": {} }, + "coin: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": "soon", + "t2_enabled": "soon", + "type": "coin", + "wallet": {} + }, "coin:tXZC": { "hidden": 1, "links": { @@ -545,6 +572,38 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:esn:DGT": { + "address": "0x72ea3508D9d817A91465aBb59bE10FEF9857A055", + "hidden": 1, + "links": {}, + "marketcap_usd": 0, + "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: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, @@ -597,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": { @@ -619,7 +696,7 @@ "links": { "Homepage": "https://0xbitcoin.org/" }, - "marketcap_usd": 2562071, + "marketcap_usd": 1277837, "name": "0xBitcoin", "network": "eth", "shortcut": "0xBTC", @@ -636,7 +713,7 @@ "links": { "Homepage": "https://firstblood.io" }, - "marketcap_usd": 12448386, + "marketcap_usd": 5600207, "name": "FirstBlood", "network": "eth", "shortcut": "1ST", @@ -698,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": { @@ -755,7 +849,7 @@ "links": { "Homepage": "http://accelerator.network" }, - "marketcap_usd": 207162, + "marketcap_usd": 101922, "name": "Accelerator Network", "network": "eth", "shortcut": "ACC", @@ -790,7 +884,7 @@ "Github": "https://github.com/aditus", "Homepage": "https://aditus.net" }, - "marketcap_usd": 1522306, + "marketcap_usd": 551147, "name": "Aditus", "network": "eth", "shortcut": "ADI", @@ -825,7 +919,7 @@ "links": { "Homepage": "https://adshares.net" }, - "marketcap_usd": 2099546, + "marketcap_usd": 2001663, "name": "AdShares", "network": "eth", "shortcut": "ADST", @@ -843,7 +937,7 @@ "Github": "https://github.com/adchain", "Homepage": "https://adtoken.com" }, - "marketcap_usd": 18169162, + "marketcap_usd": 7973488, "name": "AdToken", "network": "eth", "shortcut": "ADT", @@ -879,7 +973,7 @@ "Github": "https://github.com/aeternity", "Homepage": "https://www.aeternity.com/" }, - "marketcap_usd": 477255215, + "marketcap_usd": 225631023, "name": "aeternity", "network": "eth", "shortcut": "AE", @@ -897,7 +991,7 @@ "Github": "https://github.com/singnet/singnet", "Homepage": "https://singularitynet.io" }, - "marketcap_usd": 45481505, + "marketcap_usd": 22605681, "name": "SingularityNET", "network": "eth", "shortcut": "AGI", @@ -915,7 +1009,7 @@ "Github": "https://github.com/aionnetwork", "Homepage": "https://aion.network/" }, - "marketcap_usd": 156312044, + "marketcap_usd": 98801314, "name": "Aion", "network": "eth", "shortcut": "AION", @@ -932,7 +1026,7 @@ "links": { "Homepage": "https://airtoken.com" }, - "marketcap_usd": 5084029, + "marketcap_usd": 2906960, "name": "AirToken", "network": "eth", "shortcut": "AIR", @@ -950,7 +1044,7 @@ "Github": "https://github.com/AigangNetwork", "Homepage": "https://aigang.network/" }, - "marketcap_usd": 1295077, + "marketcap_usd": 613613, "name": "Aigang", "network": "eth", "shortcut": "AIX", @@ -1003,7 +1097,7 @@ "Github": "https://github.com/AlisProject", "Homepage": "https://alismedia.jp" }, - "marketcap_usd": 3001684, + "marketcap_usd": 2026289, "name": "ALIS Token", "network": "eth", "shortcut": "ALIS", @@ -1068,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": 1847196, + "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": 1054782, + "marketcap_usd": 389102, "name": "Amon", "network": "eth", "shortcut": "AMN", @@ -1144,7 +1256,7 @@ "Github": "https://github.com/Oxchild/crowdsale", "Homepage": "https://apisplatform.io" }, - "marketcap_usd": 25481250, + "marketcap_usd": 14512148, "name": "APIS", "network": "eth", "shortcut": "APIS", @@ -1162,7 +1274,7 @@ "Github": "https://github.com/Aptoide/AppCoins-ethereumj", "Homepage": "https://appcoins.io" }, - "marketcap_usd": 17304441, + "marketcap_usd": 8913359, "name": "AppCoins", "network": "eth", "shortcut": "APPC", @@ -1179,7 +1291,7 @@ "links": { "Homepage": "https://aigang.network" }, - "marketcap_usd": 1295077, + "marketcap_usd": 613613, "name": "AIGang", "network": "eth", "shortcut": "APT", @@ -1214,7 +1326,7 @@ "links": { "Homepage": "https://www.arbitragect.com" }, - "marketcap_usd": 235767, + "marketcap_usd": 134561, "name": "ArbitrageCT", "network": "eth", "shortcut": "ARCT", @@ -1319,7 +1431,7 @@ "links": { "Homepage": "https://airswap.io" }, - "marketcap_usd": 21923707, + "marketcap_usd": 12374307, "name": "Airswap", "network": "eth", "shortcut": "AST", @@ -1331,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": { @@ -1512,7 +1589,7 @@ "Github": "https://www.github.com/axpire", "Homepage": "https://www.axpire.io" }, - "marketcap_usd": 5350824, + "marketcap_usd": 4373208, "name": "aXpire", "network": "eth", "shortcut": "AXPR", @@ -1707,7 +1784,7 @@ "Github": "https://github.com/thebeetoken", "Homepage": "https://www.beetoken.com" }, - "marketcap_usd": 3484443, + "marketcap_usd": 1742594, "name": "Bee Token", "network": "eth", "shortcut": "BEE", @@ -1831,7 +1908,7 @@ "Github": "https://github.com/BankEx", "Homepage": "https://bankex.com/" }, - "marketcap_usd": 14448321, + "marketcap_usd": 6012109, "name": "BANKEX", "network": "eth", "shortcut": "BKX", @@ -1867,7 +1944,7 @@ "Github": "https://github.com/BlueCrypto", "Homepage": "https://blueprotocol.com/" }, - "marketcap_usd": 2867676, + "marketcap_usd": 1603825, "name": "Ethereum Blue", "network": "eth", "shortcut": "BLUE", @@ -1902,7 +1979,7 @@ "links": { "Homepage": "https://www.iconomi.net" }, - "marketcap_usd": 54313273, + "marketcap_usd": 44416139, "name": "Iconomi", "network": "eth", "shortcut": "BLX (Iconomi)", @@ -2039,7 +2116,7 @@ "Github": "https://github.com/bancorprotocol", "Homepage": "https://www.bancor.network/discover" }, - "marketcap_usd": 117725395, + "marketcap_usd": 82991724, "name": "Bancor", "network": "eth", "shortcut": "BNT", @@ -2090,7 +2167,7 @@ "links": { "Homepage": "https://bonpay.com" }, - "marketcap_usd": 1319939, + "marketcap_usd": 965311, "name": "Bonpay", "network": "eth", "shortcut": "BON", @@ -2136,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": { @@ -2176,7 +2271,7 @@ "links": { "Homepage": "http://bro-consortium.io" }, - "marketcap_usd": 77904, + "marketcap_usd": 27576, "name": "BRAT", "network": "eth", "shortcut": "BRAT", @@ -2194,7 +2289,7 @@ "Github": "https://github.com/breadwallet", "Homepage": "https://token.breadapp.com/en" }, - "marketcap_usd": 35196841, + "marketcap_usd": 31877319, "name": "Bread", "network": "eth", "shortcut": "BRD", @@ -2346,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": 343741863, + "marketcap_usd": 163797956, "name": "Bytom", "network": "eth", "shortcut": "BTM", @@ -2451,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": { @@ -2490,7 +2566,7 @@ "Github": "https://github.com/cryptotwenty", "Homepage": "https://crypto20.com" }, - "marketcap_usd": 42246643, + "marketcap_usd": 27273273, "name": "Crypto20's Token", "network": "eth", "shortcut": "C20", @@ -2552,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": { @@ -2625,7 +2684,7 @@ "links": { "Homepage": "https://cashaa.com" }, - "marketcap_usd": 12039760, + "marketcap_usd": 9604839, "name": "Cashaa", "network": "eth", "shortcut": "CAS", @@ -3094,7 +3153,7 @@ "links": { "Homepage": "https://cindicator.com" }, - "marketcap_usd": 42756186, + "marketcap_usd": 25058233, "name": "Cindicator", "network": "eth", "shortcut": "CND", @@ -3201,7 +3260,7 @@ "Github": "https://github.com/CoinvestHQ", "Homepage": "https://coinve.st" }, - "marketcap_usd": 145556, + "marketcap_usd": 101879, "name": "Coinvest V2 Token", "network": "eth", "shortcut": "COIN", @@ -3235,7 +3294,7 @@ "links": { "Homepage": "https://covesting.io/" }, - "marketcap_usd": 19053930, + "marketcap_usd": 14548559, "name": "Covesting", "network": "eth", "shortcut": "COV", @@ -3271,7 +3330,7 @@ "Github": "https://github.com/aditus", "Homepage": "https://copytrack.io" }, - "marketcap_usd": 1647004, + "marketcap_usd": 908013, "name": "COPYTRACK", "network": "eth", "shortcut": "CPY", @@ -3341,7 +3400,7 @@ "links": { "Homepage": "https://bitbounce.io" }, - "marketcap_usd": 16106922, + "marketcap_usd": 9682409, "name": "Credo / Bitbounce", "network": "eth", "shortcut": "CREDO", @@ -3353,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": { @@ -3532,7 +3626,7 @@ "Github": "https://github.com/cargoxio", "Homepage": "https://cargox.io" }, - "marketcap_usd": 5508470, + "marketcap_usd": 3571073, "name": "CargoX", "network": "eth", "shortcut": "CXO", @@ -3544,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" }, - "marketcap_usd": 2465241, + "marketcap_usd": 1557193, "name": "CryptoCarbon", "network": "eth", "shortcut": "CryptoCarbon", @@ -3583,7 +3694,7 @@ "links": { "Homepage": "https://dadi.cloud" }, - "marketcap_usd": 6397034, + "marketcap_usd": 7093611, "name": "DADI", "network": "eth", "shortcut": "DADI", @@ -3595,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": 54947750, - "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": 96967, + "marketcap_usd": 35219, "name": "DaleCoin", "network": "eth", "shortcut": "DALC", @@ -3706,7 +3799,7 @@ "Github": "https://github.com/streamr-dev", "Homepage": "https://www.streamr.com" }, - "marketcap_usd": 105505, + "marketcap_usd": 48676, "name": "DATACoin", "network": "eth", "shortcut": "DATACoin", @@ -3795,7 +3888,7 @@ "Github": "https://github.com/DistributedBanking/DCC", "Homepage": "http://dcc.finance" }, - "marketcap_usd": 22042740, + "marketcap_usd": 14545355, "name": "Distributed Credit Chain", "network": "eth", "shortcut": "DCC", @@ -3830,7 +3923,7 @@ "Github": "https://github.com/Dentacoin", "Homepage": "https://dentacoin.com" }, - "marketcap_usd": 114423800, + "marketcap_usd": 117536664, "name": "Dentacoin", "network": "eth", "shortcut": "DCN", @@ -3900,7 +3993,7 @@ "links": { "Homepage": "https://www.dentwireless.com" }, - "marketcap_usd": 30123358, + "marketcap_usd": 42212426, "name": "DENT", "network": "eth", "shortcut": "DENT", @@ -3912,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": 321244, + "name": "DigiPulse", "network": "eth", - "shortcut": "DEPO", + "shortcut": "DGPT", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -3929,51 +4023,34 @@ "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", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, - "erc20:eth:DGPT": { - "address": "0xf6cFe53d6FEbaEEA051f400ff5fc14F0cBBDacA1", - "links": { - "Github": "https://github.com/digipulseio", - "Homepage": "https://www.digipulse.io" - }, - "marketcap_usd": 2775061, - "name": "DigiPulse", - "network": "eth", - "shortcut": "DGPT", - "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:DGS": { - "address": "0x6aEDbF8dFF31437220dF351950Ba2a3362168d1b", + "erc20:eth:DGTX": { + "address": "0x1C83501478f1320977047008496DACBD60Bb15ef", "links": { - "Github": "https://github.com/dragonglasscom", - "Homepage": "https://dragonglass.com/" + "Github": "https://github.com/DigitexFutures", + "Homepage": "https://digitexfutures.com/" }, "marketcap_usd": 0, - "name": "Dragonglass", + "name": "DigitexFutures", "network": "eth", - "shortcut": "DGS", + "shortcut": "DGTX", "t1_enabled": "soon", "t2_enabled": "soon", "type": "erc20", @@ -3988,7 +4065,7 @@ "Github": "https://github.com/DigixGlobal", "Homepage": "https://digix.global" }, - "marketcap_usd": 2025076, + "marketcap_usd": 2320653, "name": "Digix Gold Token", "network": "eth", "shortcut": "DGX", @@ -4023,7 +4100,7 @@ "links": { "Homepage": "https://etheroll.com" }, - "marketcap_usd": 7929119, + "marketcap_usd": 4583040, "name": "Etheroll", "network": "eth", "shortcut": "DICE", @@ -4190,40 +4267,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:DROP": { - "address": "0x3c75226555FC496168d48B88DF83B95F16771F37", - "links": { - "Homepage": "https://droplex.org" - }, - "marketcap_usd": 0, - "name": "Droplex", - "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": 111935208, - "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:DRVH": { "address": "0x62D4c04644314F35868Ba4c65cc27a77681dE7a9", "links": { @@ -4265,7 +4308,7 @@ "Github": "https://github.com/dethertech", "Homepage": "https://dether.io" }, - "marketcap_usd": 2794427, + "marketcap_usd": 2158287, "name": "dether", "network": "eth", "shortcut": "DTH", @@ -4370,7 +4413,7 @@ "Github": "https://github.com/elangindonesia/EagleCoin", "Homepage": "https://eaglepay.io" }, - "marketcap_usd": 154491, + "marketcap_usd": 85158, "name": "EagleCoin", "network": "eth", "shortcut": "EAGLE", @@ -4455,7 +4498,7 @@ "links": { "Homepage": "https://edgeless.io" }, - "marketcap_usd": 33666309, + "marketcap_usd": 26281922, "name": "Edgeless", "network": "eth", "shortcut": "EDG", @@ -4472,7 +4515,7 @@ "links": { "Homepage": "https://eidoo.io" }, - "marketcap_usd": 25997263, + "marketcap_usd": 22786928, "name": "Eidoo", "network": "eth", "shortcut": "EDO", @@ -4484,6 +4527,24 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:EDR": { + "address": "0xc528c28FEC0A90C083328BC45f587eE215760A0F", + "links": { + "Github": "https://github.com/EndorCoin", + "Homepage": "https://www.endor.com" + }, + "marketcap_usd": 0, + "name": "Endor Protocol Token", + "network": "eth", + "shortcut": "EDR", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:EGT": { "address": "0x8e1b448EC7aDFc7Fa35FC2e885678bD323176E34", "links": { @@ -4561,7 +4622,7 @@ "Github": "https://github.com/eltcoin", "Homepage": "http://www.eltcoin.tech/" }, - "marketcap_usd": 342443, + "marketcap_usd": 94070, "name": "ELTCOIN", "network": "eth", "shortcut": "ELTCOIN", @@ -4738,7 +4799,7 @@ "links": { "Homepage": "https://eos.io" }, - "marketcap_usd": 7298516946, + "marketcap_usd": 4378649362, "name": "EOS", "network": "eth", "shortcut": "EOS", @@ -4791,7 +4852,7 @@ "links": { "Homepage": "https://www.ethbits.com" }, - "marketcap_usd": 1809661, + "marketcap_usd": 1264567, "name": "Ethbits", "network": "eth", "shortcut": "ETBS", @@ -4943,6 +5004,22 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:EXY": { + "address": "0x5c743a35E903F6c584514ec617ACEe0611Cf44f3", + "hidden": 1, + "links": {}, + "marketcap_usd": 3128973, + "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", "links": { @@ -4996,23 +5073,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:FANX": { - "address": "0x7f6715c3FC4740A02F70De85B9FD50ac6001fEd9", - "links": { - "Homepage": "http://www.fanx.one/" - }, - "marketcap_usd": 0, - "name": "FANX Token", - "network": "eth", - "shortcut": "FANX", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:FKX": { "address": "0x009e864923b49263c7F10D19B7f8Ab7a9A5AAd33", "links": { @@ -5123,7 +5183,7 @@ "Github": "https://github.com/FundRequest", "Homepage": "https://fundrequest.io" }, - "marketcap_usd": 1188860, + "marketcap_usd": 424114, "name": "FundRequest", "network": "eth", "shortcut": "FND", @@ -5152,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": { @@ -5204,6 +5247,24 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:FTXT": { + "address": "0x41875C2332B0877cDFAA699B641402b7D4642c32", + "links": { + "Github": "https://github.com/futuraxproject", + "Homepage": "https://futurax.global" + }, + "marketcap_usd": 0, + "name": "FUTURAX", + "network": "eth", + "shortcut": "FTXT", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:FUEL": { "address": "0xEA38eAa3C86c8F9B751533Ba2E562deb9acDED40", "links": { @@ -5227,7 +5288,7 @@ "links": { "Homepage": "https://funfair.io" }, - "marketcap_usd": 126365312, + "marketcap_usd": 84604195, "name": "Funfair", "network": "eth", "shortcut": "FUN", @@ -5280,7 +5341,7 @@ "Github": "https://github.com/BlockchainLabsNZ/gambit", "Homepage": "http://gambitcrypto.com" }, - "marketcap_usd": 6158034, + "marketcap_usd": 4463774, "name": "Gambit", "network": "eth", "shortcut": "GAM", @@ -5403,7 +5464,7 @@ "Github": "https://github.com/daostack", "Homepage": "https://daostack.io" }, - "marketcap_usd": 5439100, + "marketcap_usd": 4217214, "name": "DAOstack", "network": "eth", "shortcut": "GEN", @@ -5502,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": 280972506, - "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": { @@ -5543,7 +5586,7 @@ "links": { "Homepage": "https://gridplus.io/token-sale" }, - "marketcap_usd": 12981175, + "marketcap_usd": 5392777, "name": "GRID", "network": "eth", "shortcut": "GRID", @@ -5632,7 +5675,7 @@ "Github": "https://github.com/GIFTO-io", "Homepage": "https://gifto.io/" }, - "marketcap_usd": 77346378, + "marketcap_usd": 40480983, "name": "Gifto", "network": "eth", "shortcut": "GTO", @@ -5644,13 +5687,31 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:GULD": { + "address": "0x9847345de8b614c956146bbea549336d9C8d26b6", + "links": { + "Github": "https://github.com/guldcoin", + "Homepage": "https://guld.io" + }, + "marketcap_usd": 0, + "name": "GULD ERC20", + "network": "eth", + "shortcut": "GULD", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:GVT": { "address": "0x103c3A209da59d3E7C4A89307e66521e081CFDF0", "links": { "Github": "https://github.com/GenesisVision", "Homepage": "https://genesis.vision" }, - "marketcap_usd": 29228461, + "marketcap_usd": 17718606, "name": "Genesis Vision", "network": "eth", "shortcut": "GVT", @@ -5732,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": { @@ -5755,7 +5833,7 @@ "Github": "https://github.com/havven/havven", "Homepage": "https://havven.io" }, - "marketcap_usd": 17195341, + "marketcap_usd": 7598074, "name": "Havven", "network": "eth", "shortcut": "HAV", @@ -5802,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": { @@ -5877,7 +5972,7 @@ "links": { "Homepage": "https://github.com/arachnid/hodlcoin" }, - "marketcap_usd": 240428, + "marketcap_usd": 243671, "name": "HODLCoin", "network": "eth", "shortcut": "HODL", @@ -5930,7 +6025,7 @@ "Github": "https://github.com/HiveProjectLTD", "Homepage": "https://hive-project.net" }, - "marketcap_usd": 20232639, + "marketcap_usd": 11523549, "name": "Hive Project", "network": "eth", "shortcut": "HVN", @@ -6069,7 +6164,7 @@ "links": { "Homepage": "https://icos.icobox.io" }, - "marketcap_usd": 3553726, + "marketcap_usd": 1680040, "name": "ICOS", "network": "eth", "shortcut": "ICOS", @@ -6086,7 +6181,7 @@ "links": { "Homepage": "https://www.icon.foundation" }, - "marketcap_usd": 507798617, + "marketcap_usd": 236874502, "name": "ICON", "network": "eth", "shortcut": "ICX", @@ -6120,7 +6215,7 @@ "links": { "Homepage": "https://investfeed.com" }, - "marketcap_usd": 4546572, + "marketcap_usd": 2272269, "name": "InvestFeed", "network": "eth", "shortcut": "IFT", @@ -6255,7 +6350,7 @@ "links": { "Homepage": "https://insights.network" }, - "marketcap_usd": 2492982, + "marketcap_usd": 1854257, "name": "Insights Network", "network": "eth", "shortcut": "INSTAR", @@ -6272,7 +6367,7 @@ "links": { "Homepage": "https://internxt.io" }, - "marketcap_usd": 1892668, + "marketcap_usd": 1477758, "name": "Internxt", "network": "eth", "shortcut": "INXT", @@ -6289,7 +6384,7 @@ "links": { "Homepage": "https://iost.io/" }, - "marketcap_usd": 212517876, + "marketcap_usd": 111592385, "name": "IOSToken", "network": "eth", "shortcut": "IOST", @@ -6372,13 +6467,31 @@ "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": 27009990, + "marketcap_usd": 11158935, "name": "IoT Chain", "network": "eth", "shortcut": "ITC", @@ -6568,7 +6681,7 @@ "Github": "https://github.com/kikinteractive/kin-token", "Homepage": "https://kin.kik.com" }, - "marketcap_usd": 155514660, + "marketcap_usd": 79653286, "name": "Kin Foundation", "network": "eth", "shortcut": "KIN", @@ -6586,7 +6699,7 @@ "Github": "https://github.com/KyberNetwork", "Homepage": "https://kyber.network" }, - "marketcap_usd": 117987320, + "marketcap_usd": 62120697, "name": "Kyber Network", "network": "eth", "shortcut": "KNC", @@ -6622,7 +6735,7 @@ "Github": "https://github.com/Cryptense/", "Homepage": "https://kryll.io/" }, - "marketcap_usd": 688382, + "marketcap_usd": 505756, "name": "Kryll", "network": "eth", "shortcut": "KRL", @@ -6657,7 +6770,7 @@ "Github": "https://github.com/latoken", "Homepage": "https://latoken.com/" }, - "marketcap_usd": 9051088, + "marketcap_usd": 7006186, "name": "LATOKEN", "network": "eth", "shortcut": "LA", @@ -6691,7 +6804,7 @@ "links": { "Homepage": "https://www.leadcoin.network/" }, - "marketcap_usd": 2710164, + "marketcap_usd": 1098068, "name": "LEADCOIN", "network": "eth", "shortcut": "LDC", @@ -6795,7 +6908,7 @@ "links": { "Homepage": "http://www.lifelabs.io" }, - "marketcap_usd": 3810614, + "marketcap_usd": 3025491, "name": "LIFE", "network": "eth", "shortcut": "LIFE", @@ -6824,24 +6937,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:LINK Platform": { - "address": "0xE2E6D4BE086c6938B53B22144855eef674281639", - "links": { - "Github": "https://github.com/ethlink", - "Homepage": "https://ethereum.link" - }, - "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": { @@ -6859,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": 3483072, - "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": 2681371, + "marketcap_usd": 1454637, "name": "Lendingblock", "network": "eth", "shortcut": "LND", @@ -6918,7 +6977,7 @@ "links": { "Homepage": "https://LockChain.co" }, - "marketcap_usd": 8671107, + "marketcap_usd": 5259245, "name": "LockChain", "network": "eth", "shortcut": "LOC", @@ -6936,7 +6995,7 @@ "Github": "http://github.com/locipro/loci-coin-sale", "Homepage": "https://locipro.com" }, - "marketcap_usd": 5205604, + "marketcap_usd": 1699666, "name": "LOCIcoin", "network": "eth", "shortcut": "LOCI", @@ -7251,7 +7310,7 @@ "Github": "https://github.com/theembermine", "Homepage": "https://embermine.com/" }, - "marketcap_usd": 333231, + "marketcap_usd": 235298, "name": "Embers", "network": "eth", "shortcut": "MBRS", @@ -7267,7 +7326,7 @@ "address": "0x93E682107d1E9defB0b5ee701C71707a4B2E46Bc", "hidden": 1, "links": {}, - "marketcap_usd": 246689, + "marketcap_usd": 256534, "name": "MCAP", "network": "eth", "shortcut": "MCAP", @@ -7285,7 +7344,7 @@ "Github": "https://github.com/musiconomi/", "Homepage": "https://musiconomi.com/" }, - "marketcap_usd": 531117, + "marketcap_usd": 235189, "name": "Musiconomi", "network": "eth", "shortcut": "MCI", @@ -7302,7 +7361,7 @@ "links": { "Homepage": "https://mona.co" }, - "marketcap_usd": 0, + "marketcap_usd": 66988027, "name": "MCO", "network": "eth", "shortcut": "MCO", @@ -7403,66 +7462,32 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:MGO": { - "address": "0x40395044Ac3c0C57051906dA938B54BD6557F212", + "erc20:eth:MFTU": { + "address": "0x05D412CE18F24040bB3Fa45CF2C69e506586D8e8", "links": { - "Homepage": "https://gamecredits.com/mobilego" + "Homepage": "https://mftu.net" }, "marketcap_usd": 0, - "name": "MGO", + "name": "Mainstream For The Underground", "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", - "network": "eth", - "shortcut": "MIT", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, - "erc20:eth:MIT (Mychatcoin)": { - "address": "0xAd8DD4c725dE1D31b9E8F8D146089e9DC6882093", - "links": { - "Homepage": "https://mychatcoin.com" - }, - "marketcap_usd": 0, - "name": "Mychatcoin", - "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", @@ -7489,23 +7514,6 @@ "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": { @@ -7565,7 +7573,7 @@ "Github": "https://github.com/modum-io", "Homepage": "https://modum.io" }, - "marketcap_usd": 16797450, + "marketcap_usd": 20182371, "name": "Modum", "network": "eth", "shortcut": "MOD", @@ -7634,7 +7642,7 @@ "links": { "Homepage": "https://mothership.cx" }, - "marketcap_usd": 18985808, + "marketcap_usd": 12737439, "name": "Mothership", "network": "eth", "shortcut": "MSP", @@ -7646,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": 8282450, + "marketcap_usd": 4341562, "name": "Monetha", "network": "eth", "shortcut": "MTH", @@ -7789,7 +7779,7 @@ "Github": "https://github.com/Merculet", "Homepage": "https://www.merculet.io" }, - "marketcap_usd": 8860323, + "marketcap_usd": 2662907, "name": "Merculet", "network": "eth", "shortcut": "MVP", @@ -7839,7 +7829,7 @@ "links": { "Homepage": "https://mysterium.network" }, - "marketcap_usd": 4143991, + "marketcap_usd": 2416335, "name": "Mysterium", "network": "eth", "shortcut": "MYST", @@ -7874,7 +7864,7 @@ "Github": "https://github.com/NANJ-COIN", "Homepage": "https://nanjcoin.com/" }, - "marketcap_usd": 24125286, + "marketcap_usd": 15109367, "name": "NANJCOIN", "network": "eth", "shortcut": "NANJ", @@ -7928,7 +7918,7 @@ "Github": "https://github.com/polyswarm", "Homepage": "https://polyswarm.io" }, - "marketcap_usd": 26652501, + "marketcap_usd": 23945838, "name": "Nectar", "network": "eth", "shortcut": "NCT", @@ -7945,7 +7935,7 @@ "links": { "Homepage": "https://neverdie.com" }, - "marketcap_usd": 737077, + "marketcap_usd": 956163, "name": "Neverdie", "network": "eth", "shortcut": "NDC", @@ -7980,7 +7970,7 @@ "links": { "Homepage": "https://nimiq.com" }, - "marketcap_usd": 0, + "marketcap_usd": 3001681, "name": "NIMIQ", "network": "eth", "shortcut": "NET", @@ -8087,7 +8077,7 @@ "Github": "https://github.com/NperProject", "Homepage": "https://nper.io" }, - "marketcap_usd": 3629046, + "marketcap_usd": 1600353, "name": "NPER", "network": "eth", "shortcut": "NPER", @@ -8117,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": 99949482, - "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": 54832645, + "name": "NULS", "network": "eth", - "shortcut": "NXX", + "shortcut": "NULS", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -8151,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", @@ -8173,7 +8163,7 @@ "links": { "Homepage": "https://beyond-the-void.net" }, - "marketcap_usd": 2520441, + "marketcap_usd": 1434745, "name": "Nexium", "network": "eth", "shortcut": "NxC", @@ -8207,7 +8197,7 @@ "links": { "Homepage": "https://www.openanx.org/en" }, - "marketcap_usd": 7876053, + "marketcap_usd": 4047027, "name": "OAX", "network": "eth", "shortcut": "OAX", @@ -8237,6 +8227,24 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:ODE": { + "address": "0xbf52F2ab39e26E0951d2a02b49B7702aBe30406a", + "links": { + "Github": "https://github.com/odemio", + "Homepage": "https://odem.io/" + }, + "marketcap_usd": 0, + "name": "ODEM Token", + "network": "eth", + "shortcut": "ODE", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:OJX": { "address": "0xBeef546ac8a4e0a80DC1E2d696968Ef54138f1d4", "links": { @@ -8379,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": 21093182, + "marketcap_usd": 9913162, "name": "Simple Token 'OST'", "network": "eth", "shortcut": "OST", @@ -8403,7 +8429,7 @@ "Github": "https://github.com/owndata", "Homepage": "https://owndata.network" }, - "marketcap_usd": 0, + "marketcap_usd": 984523, "name": "OWNDATA", "network": "eth", "shortcut": "OWN", @@ -8439,7 +8465,7 @@ "Github": "https://github.com/policypalnet", "Homepage": "https://www.policypal.network" }, - "marketcap_usd": 5620794, + "marketcap_usd": 2170673, "name": "PolicyPal Network", "network": "eth", "shortcut": "PAL", @@ -8469,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": { @@ -8527,7 +8570,7 @@ "links": { "Homepage": "http://www.tenx.tech" }, - "marketcap_usd": 106796353, + "marketcap_usd": 63076973, "name": "TenX", "network": "eth", "shortcut": "PAY", @@ -8596,7 +8639,7 @@ "Github": "https://github.com/PeculiumPCL/Peculium", "Homepage": "https://peculium.io" }, - "marketcap_usd": 3168638, + "marketcap_usd": 3038802, "name": "Peculium", "network": "eth", "shortcut": "PCL", @@ -8626,6 +8669,22 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:PEG": { + "address": "0x8Ae56a6850a7cbeaC3c3Ab2cB311e7620167eAC8", + "hidden": 1, + "links": {}, + "marketcap_usd": 0, + "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": { @@ -8735,7 +8794,7 @@ "links": { "Homepage": "https://polybius.io" }, - "marketcap_usd": 12192473, + "marketcap_usd": 6219258, "name": "Polybius", "network": "eth", "shortcut": "PLBT", @@ -8839,7 +8898,7 @@ "links": { "Homepage": "https://polymath.network" }, - "marketcap_usd": 109207468, + "marketcap_usd": 49502153, "name": "Polymath Network", "network": "eth", "shortcut": "POLY", @@ -8874,7 +8933,7 @@ "Github": "https://github.com/PoSToken", "Homepage": "https://postoken.org" }, - "marketcap_usd": 49382, + "marketcap_usd": 39260, "name": "PoSToken", "network": "eth", "shortcut": "POS", @@ -8908,7 +8967,7 @@ "links": { "Homepage": "https://www.paypie.com" }, - "marketcap_usd": 18973078, + "marketcap_usd": 8724949, "name": "PayPie", "network": "eth", "shortcut": "PPP", @@ -8925,7 +8984,7 @@ "links": { "Homepage": "https://populous.co" }, - "marketcap_usd": 206310332, + "marketcap_usd": 175554738, "name": "Populous", "network": "eth", "shortcut": "PPT", @@ -8942,7 +9001,7 @@ "links": { "Homepage": "https://presearch.io" }, - "marketcap_usd": 16376949, + "marketcap_usd": 13802996, "name": "Presearch", "network": "eth", "shortcut": "PRE", @@ -8995,7 +9054,7 @@ "links": { "Homepage": "https://propy.com" }, - "marketcap_usd": 13823049, + "marketcap_usd": 6960977, "name": "Propy", "network": "eth", "shortcut": "PRO", @@ -9077,24 +9136,6 @@ "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": { @@ -9188,7 +9229,7 @@ "links": { "Homepage": "https://liquid.plus" }, - "marketcap_usd": 84608865, + "marketcap_usd": 61234484, "name": "QASH", "network": "eth", "shortcut": "QASH", @@ -9330,7 +9371,7 @@ "Github": "https://github.com/qtumproject", "Homepage": "https://qtum.org/" }, - "marketcap_usd": 672128988, + "marketcap_usd": 360925876, "name": "Qtum", "network": "eth", "shortcut": "QTUM", @@ -9384,7 +9425,7 @@ "Github": "https://github.com/ripio/rcn-token", "Homepage": "https://ripiocredit.network" }, - "marketcap_usd": 25440190, + "marketcap_usd": 9056721, "name": "Ripio Credit Network", "network": "eth", "shortcut": "RCN", @@ -9435,7 +9476,7 @@ "links": { "Homepage": "https://www.rebellious.io" }, - "marketcap_usd": 5352695, + "marketcap_usd": 3165260, "name": "Rebellious", "network": "eth", "shortcut": "REBL", @@ -9453,7 +9494,7 @@ "Github": "https://github.com/red", "Homepage": "https://ico.red-lang.org" }, - "marketcap_usd": 4464577, + "marketcap_usd": 1741390, "name": "Red Community Token", "network": "eth", "shortcut": "RED", @@ -9465,6 +9506,24 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:REDC": { + "address": "0xB563300A3BAc79FC09B93b6F84CE0d4465A2AC27", + "links": { + "Github": "https://github.com/Redcabllc", + "Homepage": "https://redcab.io" + }, + "marketcap_usd": 0, + "name": "RedCab", + "network": "eth", + "shortcut": "REDC", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:REN": { "address": "0x408e41876cCCDC0F92210600ef50372656052a38", "links": { @@ -9488,7 +9547,7 @@ "links": { "Homepage": "https://request.network" }, - "marketcap_usd": 45978747, + "marketcap_usd": 28293402, "name": "Request Network", "network": "eth", "shortcut": "REQ", @@ -9523,7 +9582,7 @@ "links": { "Homepage": "https://refereum.com" }, - "marketcap_usd": 25840877, + "marketcap_usd": 10157537, "name": "Refereum", "network": "eth", "shortcut": "RFR", @@ -9575,7 +9634,7 @@ "links": { "Homepage": "http://crowdsale.iex.ec" }, - "marketcap_usd": 53398537, + "marketcap_usd": 32133012, "name": "IEx.ec", "network": "eth", "shortcut": "RLC", @@ -9627,7 +9686,7 @@ "links": { "Homepage": "http://www.relex.io" }, - "marketcap_usd": 0, + "marketcap_usd": 2367168, "name": "Relex", "network": "eth", "shortcut": "RLX", @@ -9662,7 +9721,7 @@ "Github": "https://github.com/rocketico", "Homepage": "https://rocketico.io" }, - "marketcap_usd": 32455190, + "marketcap_usd": 19503786, "name": "Rocket Token", "network": "eth", "shortcut": "ROCK", @@ -9764,7 +9823,7 @@ "links": { "Homepage": "https://rivetzintl.com" }, - "marketcap_usd": 4339000, + "marketcap_usd": 3197635, "name": "Rivetz", "network": "eth", "shortcut": "RVT", @@ -9815,7 +9874,7 @@ "links": { "Homepage": "https://saltlending.com" }, - "marketcap_usd": 66104435, + "marketcap_usd": 30053034, "name": "Salt Lending Token", "network": "eth", "shortcut": "SALT", @@ -9832,7 +9891,7 @@ "links": { "Homepage": "https://santiment.net" }, - "marketcap_usd": 62087815, + "marketcap_usd": 36400681, "name": "Santiment", "network": "eth", "shortcut": "SAN", @@ -9883,7 +9942,7 @@ "links": { "Homepage": "https://sensay.it" }, - "marketcap_usd": 2966575, + "marketcap_usd": 1895678, "name": "Sensay", "network": "eth", "shortcut": "SENSE", @@ -10056,7 +10115,7 @@ "links": { "Homepage": "http://smartlands.io" }, - "marketcap_usd": 8303928, + "marketcap_usd": 7836431, "name": "Smartlands", "network": "eth", "shortcut": "SLT", @@ -10086,24 +10145,6 @@ "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:SNC": { "address": "0xF4134146AF2d511Dd5EA8cDB1C4AC88C57D60404", "links": { @@ -10161,7 +10202,7 @@ "links": { "Homepage": "https://singulardtv.com" }, - "marketcap_usd": 20751904, + "marketcap_usd": 13317288, "name": "SingularDTV", "network": "eth", "shortcut": "SNGLS", @@ -10264,7 +10305,7 @@ "links": { "Homepage": "https://spankchain.com" }, - "marketcap_usd": 21563556, + "marketcap_usd": 14482485, "name": "SpankChain", "network": "eth", "shortcut": "SPANK", @@ -10453,7 +10494,7 @@ "links": { "Homepage": "https://stktoken.com" }, - "marketcap_usd": 8311428, + "marketcap_usd": 3618184, "name": "STK Token", "network": "eth", "shortcut": "STK", @@ -10488,7 +10529,7 @@ "Github": "https://github.com/Storj", "Homepage": "https://storj.io" }, - "marketcap_usd": 64958549, + "marketcap_usd": 36791912, "name": "STORJ", "network": "eth", "shortcut": "STORJ", @@ -10505,7 +10546,7 @@ "links": { "Homepage": "https://www.stormtoken.com" }, - "marketcap_usd": 74980625, + "marketcap_usd": 34619988, "name": "Storm Token", "network": "eth", "shortcut": "STORM", @@ -10541,7 +10582,7 @@ "Github": "https://github.com/Storiqa/", "Homepage": "https://storiqa.com" }, - "marketcap_usd": 24625207, + "marketcap_usd": 15383152, "name": "Storiqa", "network": "eth", "shortcut": "STQ", @@ -10594,7 +10635,7 @@ "links": { "Homepage": "https://substratum.net" }, - "marketcap_usd": 74850688, + "marketcap_usd": 50880482, "name": "Substratum", "network": "eth", "shortcut": "SUB", @@ -10786,7 +10827,7 @@ "Github": "https://github.com/telcoin", "Homepage": "https://www.telco.in" }, - "marketcap_usd": 27585427, + "marketcap_usd": 20233035, "name": "Telcoin", "network": "eth", "shortcut": "TEL", @@ -10804,7 +10845,7 @@ "Github": "https://github.com/TrueFlip", "Homepage": "https://trueflip.io" }, - "marketcap_usd": 4128882, + "marketcap_usd": 3085871, "name": "TrueFlip", "network": "eth", "shortcut": "TFL", @@ -10821,7 +10862,7 @@ "links": { "Homepage": "https://www.thetatoken.org/" }, - "marketcap_usd": 83275610, + "marketcap_usd": 55785156, "name": "Theta Token", "network": "eth", "shortcut": "THETA", @@ -10851,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": 7907275, + "marketcap_usd": 4325207, "name": "Chronobank", "network": "eth", "shortcut": "TIME", @@ -10890,7 +10949,7 @@ "links": { "Homepage": "https://www.blocktix.io" }, - "marketcap_usd": 10102469, + "marketcap_usd": 4868991, "name": "Blocktix", "network": "eth", "shortcut": "TIX", @@ -10907,7 +10966,7 @@ "links": { "Homepage": "https://etherscan.io/token/TokenCard" }, - "marketcap_usd": 18740954, + "marketcap_usd": 10971348, "name": "TokenCard", "network": "eth", "shortcut": "TKN", @@ -10955,22 +11014,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:TRC": { - "address": "0xcB3F902bf97626391bF8bA87264bbC3DC13469be", - "hidden": 1, - "links": {}, - "marketcap_usd": 0, - "name": "The Real Coin", - "network": "eth", - "shortcut": "TRC", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:TRCN": { "address": "0x566Fd7999B1Fc3988022bD38507A48F0bCf22c77", "links": { @@ -11023,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": { @@ -11062,7 +11122,7 @@ "links": { "Homepage": "https://taas.fund" }, - "marketcap_usd": 15435932, + "marketcap_usd": 7357318, "name": "Token-as-a-Service", "network": "eth", "shortcut": "TaaS", @@ -11097,7 +11157,7 @@ "links": { "Homepage": "https://uquidcoin.com" }, - "marketcap_usd": 10010897, + "marketcap_usd": 6746339, "name": "Uquid Coin", "network": "eth", "shortcut": "UQC", @@ -11165,7 +11225,7 @@ "Github": "https://github.com/UniversaBlockchain/universa", "Homepage": "https://www.universa.io/" }, - "marketcap_usd": 19413778, + "marketcap_usd": 12764433, "name": "Universa", "network": "eth", "shortcut": "UTN-P", @@ -11252,7 +11312,7 @@ "Github": "https://github.com/blockv", "Homepage": "https://blockv.io" }, - "marketcap_usd": 37098426, + "marketcap_usd": 19072775, "name": "BLOCKv", "network": "eth", "shortcut": "VEE", @@ -11264,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": 782640001, + "name": "Vechain", "network": "eth", - "shortcut": "VENUS", + "shortcut": "VEN", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11281,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", @@ -11298,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": 1362675288, - "name": "Vechain", + "marketcap_usd": 0, + "name": "Veritas", "network": "eth", - "shortcut": "VET", + "shortcut": "VERI", "t1_enabled": "yes", "t2_enabled": "yes", "type": "erc20", @@ -11336,9 +11396,10 @@ "erc20:eth:VIEW": { "address": "0xF03f8D65BaFA598611C3495124093c56e8F638f0", "links": { + "Github": "https://github.com/Viewly/", "Homepage": "https://view.ly/" }, - "marketcap_usd": 0, + "marketcap_usd": 1000485, "name": "Viewly", "network": "eth", "shortcut": "VIEW", @@ -11356,7 +11417,7 @@ "Github": "https://github.com/ViceIndustryToken", "Homepage": "https://vicetoken.com/" }, - "marketcap_usd": 1733578, + "marketcap_usd": 1589755, "name": "Vice Industry Token", "network": "eth", "shortcut": "VIT", @@ -11444,7 +11505,7 @@ "links": { "Homepage": "https://veros.org" }, - "marketcap_usd": 403874, + "marketcap_usd": 165759, "name": "Veros", "network": "eth", "shortcut": "VRS", @@ -11479,7 +11540,7 @@ "Github": "https://github.com/waxio", "Homepage": "https://wax.io" }, - "marketcap_usd": 127703971, + "marketcap_usd": 64605085, "name": "WAX", "network": "eth", "shortcut": "WAX", @@ -11531,7 +11592,7 @@ "links": { "Homepage": "https://wepower.network" }, - "marketcap_usd": 18045551, + "marketcap_usd": 9820655, "name": "WePower", "network": "eth", "shortcut": "WCT", @@ -11619,7 +11680,7 @@ "links": { "Homepage": "https://wings.ai" }, - "marketcap_usd": 21674199, + "marketcap_usd": 12900277, "name": "WINGS", "network": "eth", "shortcut": "WINGS", @@ -11631,6 +11692,40 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:eth:WMK": { + "address": "0xBFbe5332f172d77811bC6c272844f3e54A7B23bB", + "links": { + "Github": "https://github.com/WemarkSource", + "Homepage": "https://www.wemark.com" + }, + "marketcap_usd": 0, + "name": "WemarkToken", + "network": "eth", + "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", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:eth:WORK": { "address": "0xD18e454D844eb0009D32E07A0Cde89E18d64CFb4", "links": { @@ -11758,7 +11853,7 @@ "links": { "Homepage": "https://www.wacoin.io" }, - "marketcap_usd": 13659448, + "marketcap_usd": 6851710, "name": "WaBi", "network": "eth", "shortcut": "WaBi", @@ -11809,7 +11904,7 @@ "links": { "Homepage": "http://www.xaurum.org" }, - "marketcap_usd": 4207927, + "marketcap_usd": 4338705, "name": "Xaurum", "network": "eth", "shortcut": "XAUR", @@ -11827,7 +11922,7 @@ "Github": "https://github.com/blitzpredict", "Homepage": "https://www.blitzpredict.io" }, - "marketcap_usd": 1351192, + "marketcap_usd": 692032, "name": "BlitzPredict", "network": "eth", "shortcut": "XBP", @@ -11950,7 +12045,7 @@ "Github": "https://github.com/InkProtocol/", "Homepage": "https://paywithink.com" }, - "marketcap_usd": 3150830, + "marketcap_usd": 2461097, "name": "Ink Protocol", "network": "eth", "shortcut": "XNK", @@ -11967,7 +12062,7 @@ "links": { "Homepage": "https://xenon.network" }, - "marketcap_usd": 1079756, + "marketcap_usd": 834757, "name": "XENON", "network": "eth", "shortcut": "XNN", @@ -12030,23 +12125,6 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, - "erc20:eth:YEED": { - "address": "0x6F7A4bac3315B5082F793161a22e26666d22717f", - "links": { - "Homepage": "https://yggdrash.io" - }, - "marketcap_usd": 0, - "name": "YEED", - "network": "eth", - "shortcut": "YEED", - "t1_enabled": "yes", - "t2_enabled": "yes", - "type": "erc20", - "wallet": { - "MyCrypto": "https://mycrypto.com", - "MyEtherWallet": "https://www.myetherwallet.com" - } - }, "erc20:eth:YUP": { "address": "0xD9A12Cde03a86E800496469858De8581D3A5353d", "links": { @@ -12089,7 +12167,7 @@ "Github": "https://github.com/zapproject", "Homepage": "https://zap.store" }, - "marketcap_usd": 4236932, + "marketcap_usd": 2015738, "name": "ZAP", "network": "eth", "shortcut": "ZAP", @@ -12106,7 +12184,7 @@ "links": { "Homepage": "https://zsc.io/" }, - "marketcap_usd": 10032351, + "marketcap_usd": 4758614, "name": "Zeusshield", "network": "eth", "shortcut": "ZCS", @@ -12124,7 +12202,7 @@ "Github": "https://github.com/zilliqa", "Homepage": "https://www.zilliqa.com/" }, - "marketcap_usd": 540082149, + "marketcap_usd": 265939621, "name": "Zilliqa", "network": "eth", "shortcut": "ZIL", @@ -12141,7 +12219,7 @@ "links": { "Homepage": "https://www.zmine.com" }, - "marketcap_usd": 0, + "marketcap_usd": 5118618, "name": "ZMINE", "network": "eth", "shortcut": "ZMN", @@ -12153,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": { @@ -12194,7 +12254,7 @@ "Github": "https://github.com/carVertical", "Homepage": "https://www.carvertical.com" }, - "marketcap_usd": 8721118, + "marketcap_usd": 4535812, "name": "carVertical", "network": "eth", "shortcut": "cV", @@ -12282,7 +12342,7 @@ "Github": "https://github.com/eosdac", "Homepage": "https://eosdac.io/" }, - "marketcap_usd": 22043595, + "marketcap_usd": 15635243, "name": "eosDAC", "network": "eth", "shortcut": "eosDAC", @@ -12316,7 +12376,7 @@ "Github": "https://github.com/havven/havven", "Homepage": "https://www.havven.io" }, - "marketcap_usd": 0, + "marketcap_usd": 1150426, "name": "Havven-Backed USD Nomins (nUSD)", "network": "eth", "shortcut": "nUSD", @@ -12350,7 +12410,7 @@ "address": "0x8667559254241ddeD4d11392f868d72092765367", "hidden": 1, "links": {}, - "marketcap_usd": 477255215, + "marketcap_usd": 225631023, "name": "Aeternity", "network": "kov", "shortcut": "Aeternity", @@ -12451,6 +12511,22 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "erc20:rop:*PLASMA": { + "address": "0x95D7321EdCe519419ba1DbC60A89bAfbF55EAC0D", + "hidden": 1, + "links": {}, + "marketcap_usd": 0, + "name": "*PLASMA", + "network": "rop", + "shortcut": "*PLASMA", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "erc20", + "wallet": { + "MyCrypto": "https://mycrypto.com", + "MyEtherWallet": "https://www.myetherwallet.com" + } + }, "erc20:rop:ILSC": { "address": "0x6f95a3B682F8e9aacC86D057A6DF88A0E68145A8", "hidden": 1, @@ -12521,7 +12597,7 @@ "links": { "Homepage": "https://www.qwark.io" }, - "marketcap_usd": 2361859, + "marketcap_usd": 1677629, "name": "QWARK", "network": "ubq", "shortcut": "QWARK", @@ -12554,11 +12630,11 @@ "links": { "Homepage": "https://akroma.io" }, - "marketcap_usd": 0, + "marketcap_usd": 728296, "name": "Akroma", "shortcut": "AKA", - "t1_enabled": "yes", - "t2_enabled": "yes", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "coin", "wallet": { "MyCrypto": "https://mycrypto.com", @@ -12584,7 +12660,7 @@ "links": { "Homepage": "https://egem.io" }, - "marketcap_usd": 0, + "marketcap_usd": 192203, "name": "EtherGem", "shortcut": "EGEM", "t1_enabled": "yes", @@ -12599,7 +12675,7 @@ "links": { "Homepage": "https://ellaism.org" }, - "marketcap_usd": 658775, + "marketcap_usd": 360888, "name": "Ellaism", "shortcut": "ELLA", "t1_enabled": "yes", @@ -12632,8 +12708,8 @@ "marketcap_usd": 0, "name": "Ethersocial Network", "shortcut": "ESN", - "t1_enabled": "yes", - "t2_enabled": "yes", + "t1_enabled": "soon", + "t2_enabled": "soon", "type": "coin", "wallet": { "MyCrypto": "https://mycrypto.com", @@ -12644,7 +12720,7 @@ "links": { "Homepage": "https://ethereumclassic.github.io" }, - "marketcap_usd": 1761482613, + "marketcap_usd": 1278880937, "name": "Ethereum Classic", "shortcut": "ETC", "t1_enabled": "yes", @@ -12659,7 +12735,7 @@ "links": { "Homepage": "https://www.ethereum.org" }, - "marketcap_usd": 46545512287, + "marketcap_usd": 27833386307, "name": "Ethereum", "shortcut": "ETH", "t1_enabled": "yes", @@ -12670,6 +12746,21 @@ "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" @@ -12689,7 +12780,7 @@ "links": { "Homepage": "https://expanse.tech" }, - "marketcap_usd": 10327901, + "marketcap_usd": 4806464, "name": "Expanse", "shortcut": "EXP", "t1_enabled": "yes", @@ -12704,7 +12795,7 @@ "links": { "Homepage": "https://gochain.io" }, - "marketcap_usd": 27885658, + "marketcap_usd": 14231960, "name": "GoChain", "shortcut": "GO", "t1_enabled": "yes", @@ -12715,6 +12806,36 @@ "MyEtherWallet": "https://www.myetherwallet.com" } }, + "eth:MUSIC": { + "links": { + "Homepage": "https://musicoin.org" + }, + "marketcap_usd": 2943759, + "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": 2822315, + "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" @@ -12734,7 +12855,7 @@ "links": { "Homepage": "https://ubiqsmart.com" }, - "marketcap_usd": 51535471, + "marketcap_usd": 22728959, "name": "Ubiq", "shortcut": "UBQ", "t1_enabled": "yes", @@ -12761,6 +12882,54 @@ "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": { @@ -12781,7 +12950,7 @@ "links": { "Homepage": "https://www.cardano.org" }, - "marketcap_usd": 4098733811, + "marketcap_usd": 2364387688, "name": "Cardano", "shortcut": "ADA", "t1_enabled": "no", @@ -12792,18 +12961,29 @@ "links": { "Homepage": "https://lisk.io/" }, - "marketcap_usd": 538864740, + "marketcap_usd": 436815772, "name": "Lisk", "shortcut": "LSK", "t1_enabled": "no", "t2_enabled": "yes", "type": "coin" }, + "misc:ONT": { + "links": { + "Homepage": "https://ont.io" + }, + "marketcap_usd": 386602114, + "name": "Ontology", + "shortcut": "ONT", + "t1_enabled": "soon", + "t2_enabled": "soon", + "type": "coin" + }, "misc:XLM": { "links": { "Homepage": "https://www.stellar.org" }, - "marketcap_usd": 5610860112, + "marketcap_usd": 3962284892, "name": "Stellar", "notes": "In development", "shortcut": "XLM", @@ -12815,7 +12995,7 @@ "links": { "Homepage": "https://getmonero.org" }, - "marketcap_usd": 2134713222, + "marketcap_usd": 1479564823, "name": "Monero", "notes": "In development", "shortcut": "XMR", @@ -12827,7 +13007,7 @@ "links": { "Homepage": "https://ripple.com" }, - "marketcap_usd": 17660224358, + "marketcap_usd": 12725565953, "name": "Ripple", "notes": "In development", "shortcut": "XRP", @@ -12839,7 +13019,7 @@ "links": { "Homepage": "https://tezos.com" }, - "marketcap_usd": 1245008536, + "marketcap_usd": 781308598, "name": "Tezos", "shortcut": "XTZ", "t1_enabled": "no", @@ -12864,7 +13044,7 @@ "links": { "Homepage": "https://www.dimcoin.io" }, - "marketcap_usd": 7813618, + "marketcap_usd": 5723308, "name": "DIMCOIN", "shortcut": "DIM", "t1_enabled": "yes", @@ -12879,7 +13059,7 @@ "links": { "Homepage": "https://www.dimcoin.io" }, - "marketcap_usd": 7813618, + "marketcap_usd": 5723308, "name": "DIM TOKEN", "shortcut": "DIMTOK", "t1_enabled": "yes", @@ -12921,7 +13101,7 @@ "links": { "Homepage": "https://nem.io" }, - "marketcap_usd": 1559440063, + "marketcap_usd": 868084827, "name": "NEM", "shortcut": "XEM", "t1_enabled": "yes", @@ -12933,11 +13113,11 @@ } }, "info": { - "marketcap_usd": 229740155891, - "t1_coins": 662, - "t2_coins": 661, - "total_marketcap_usd": 293416788208, - "updated_at": 1532955716, - "updated_at_readable": "Mon Jul 30 15:01:56 2018" + "marketcap_usd": 166220074097, + "t1_coins": 635, + "t2_coins": 634, + "total_marketcap_usd": 208809779508, + "updated_at": 1535039635, + "updated_at_readable": "Thu Aug 23 17:53:55 2018" } } \ No newline at end of file diff --git a/defs/coins_details.override.json b/defs/coins_details.override.json index a7ca6f510..39c581c81 100644 --- a/defs/coins_details.override.json +++ b/defs/coins_details.override.json @@ -5,26 +5,6 @@ "erc20:eth:GNT": { "coinmarketcap_alias": "golem-network-tokens" }, - "eth:ESN": { - "t1_support": "soon", - "t2_support": "soon" - }, - "eth:AKA": { - "t1_support": "soon", - "t2_support": "soon" - }, - "eth:ETHO": { - "t1_support": "soon", - "t2_support": "soon" - }, - "eth:MUSI": { - "t1_support": "soon", - "t2_support": "soon" - }, - "eth:PIRL": { - "t1_support": "soon", - "t2_support": "soon" - }, "coin:BCH": { "wallet": { "Electron Cash": "https://electroncash.org" diff --git a/defs/ethereum/tokens b/defs/ethereum/tokens index 33e5c5dec..44826a687 160000 --- a/defs/ethereum/tokens +++ b/defs/ethereum/tokens @@ -1 +1 @@ -Subproject commit 33e5c5decb94227abe116589c650ddfa66dbe9e5 +Subproject commit 44826a687a155bc0bb5e121370a07f5a95689d09 diff --git a/defs/support.json b/defs/support.json index 90d7f1daf..79e730baf 100644 --- a/defs/support.json +++ b/defs/support.json @@ -122,6 +122,8 @@ "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", @@ -161,8 +163,12 @@ "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", @@ -370,6 +376,7 @@ "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", @@ -434,6 +441,7 @@ "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", @@ -923,6 +931,8 @@ "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", @@ -962,8 +972,12 @@ "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", @@ -1171,6 +1185,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", @@ -1235,6 +1250,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", diff --git a/tools/coins_details.py b/tools/coins_details.py index 6f3259dc6..8822fa1ec 100755 --- a/tools/coins_details.py +++ b/tools/coins_details.py @@ -143,78 +143,67 @@ def _webwallet_support(coin, support): return any(".trezor.io" in url for url in coin["blockbook"] + coin["bitcore"]) -def update_coins(coins, support_info): +def update_simple(coins, support_info, type): res = {} for coin in coins: key = coin["key"] support = support_info[key] + details = dict( - type="coin", + name=coin["name"], shortcut=coin["shortcut"], - name=coin["coin_label"], - links=dict(Homepage=coin["website"], Github=coin["github"]), + type=type, t1_enabled=_is_supported(support, 1), t2_enabled=_is_supported(support, 2), + ) + for k in OPTIONAL_KEYS: + if k in coin: + details[k] = coin[k] + + res[key] = details + + return res + + +def update_coins(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" - if support.get("other"): - details["wallet"].update(support["other"]) - res[key] = details + res[key].update(details) return res def update_erc20(coins, support_info): # TODO skip disabled networks? - res = {} + res = update_simple(coins, support_info, "erc20") for coin in coins: key = coin["key"] - support = support_info[key] details = dict( - type="erc20", network=coin["chain"], address=coin["address"], shortcut=coin["shortcut"], - name=coin["name"], links={}, wallet=dict( MyCrypto="https://mycrypto.com", MyEtherWallet="https://www.myetherwallet.com", ), - t1_enabled=support["trezor1"], - t2_enabled=support["trezor2"], ) if coin.get("website"): details["links"]["Homepage"] = coin["website"] if coin.get("social", {}).get("github"): details["links"]["Github"] = coin["social"]["github"] - res[key] = details - - return res - - -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, 1), - t2_enabled=_is_supported(support, 2), - ) - for k in OPTIONAL_KEYS: - if k in coin: - details[k] = coin[k] - - res[key] = details + res[key].update(details) return res @@ -222,13 +211,16 @@ def update_simple(coins, support_info, type): def update_ethereum_networks(coins, support_info): res = update_simple(coins, support_info, "coin") for coin in coins: - res[coin["key"]].update( + 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 @@ -236,6 +228,7 @@ def check_missing_data(coins): for k, coin in coins.items(): hide = False + print(coin) if "Homepage" not in coin.get("links", {}): print("%s: Missing homepage" % k) hide = True @@ -285,6 +278,7 @@ def apply_overrides(coins): 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 @@ -301,7 +295,7 @@ if __name__ == "__main__": root.addHandler(handler) defs = coin_info.get_all() - support_info = coin_info.support_info(defs, erc20_versions=VERSIONS) + support_info = coin_info.support_info(defs) coins = {} coins.update(update_coins(defs.coins, support_info)) From 70d1ae268ddf9e0527b1465144851d083c3e55e9 Mon Sep 17 00:00:00 2001 From: matejcik Date: Thu, 23 Aug 2018 18:10:06 +0200 Subject: [PATCH 40/50] support: move some responsibility away from support.py check --- tools/support.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/tools/support.py b/tools/support.py index ddb6efc7a..cd0b3763c 100755 --- a/tools/support.py +++ b/tools/support.py @@ -226,21 +226,25 @@ def fix(): @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): +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 `--prune-orphans` is specified, orphaned keys (no corresponding coin) - will be deleted from `support.json`. - 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. """ - coins_dict = coin_info.get_all(deduplicate=False).as_dict() + all_coins = coin_info.get_all(deduplicate=False) + coin_info.mark_duplicate_shortcuts(all_coins.as_list()) + coins_dict = all_coins.as_dict() checks_ok = True errors = check_support_values() @@ -259,7 +263,8 @@ def check(ignore_tokens): if ignore_tokens: values = [coin for coin in values if not coin_info.is_token(coin)] if values: - checks_ok = False + 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']}") From 1a01c5d6866b02b32c21cbda139546abc0606dac Mon Sep 17 00:00:00 2001 From: matejcik Date: Thu, 23 Aug 2018 18:32:12 +0200 Subject: [PATCH 41/50] travis: run new checks --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 834c2a27f..486451106 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ cache: - $HOME/.cache/pip python: - - "3.5" + - "3.6" install: - pip install demjson @@ -18,7 +18,8 @@ install: script: - jsonlint defs/*.json - jsonlint defs/*/*.json - - python tools/coin_gen.py check + - python tools/cointool.py check + - python tools/support.py check --ignore-tokens --ignore-missing notifications: webhooks: From 4dbfc220b4315408a1bf641f3ab0f8c2bbf08cea Mon Sep 17 00:00:00 2001 From: matejcik Date: Thu, 23 Aug 2018 19:09:35 +0200 Subject: [PATCH 42/50] cointool: explain and improve address collision check --- tools/cointool.py | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/tools/cointool.py b/tools/cointool.py index 6428e71fc..b6e150763 100755 --- a/tools/cointool.py +++ b/tools/cointool.py @@ -204,15 +204,18 @@ def check_btc(coins): 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 len(supported_mainnets) > 1: - if have_bitcoin: - level = logging.ERROR - failed = True - else: - level = logging.WARNING + 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)) @@ -420,6 +423,16 @@ def check(missing_support, backend, icons, show_duplicates): 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 code 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") @@ -435,12 +448,6 @@ def check(missing_support, backend, icons, show_duplicates): if not check_btc(defs.coins): all_checks_passed = False - # XXX support.py is responsible for checking support data - # print("Checking support data...") - # support_data = coin_info.get_support_data() - # if not check_support(defs, support_data, fail_missing=missing_support): - # all_checks_passed = False - if show_duplicates == "all": show_tok_notok = True show_erc20 = True From f152ca9b79f525b532b5d7ac2ff5524517a349b4 Mon Sep 17 00:00:00 2001 From: matejcik Date: Thu, 23 Aug 2018 19:09:54 +0200 Subject: [PATCH 43/50] cointool: check non-uniform keys (e.g. someone adding a "description" field to the defs json) --- tools/cointool.py | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/tools/cointool.py b/tools/cointool.py index b6e150763..b5fbad2aa 100755 --- a/tools/cointool.py +++ b/tools/cointool.py @@ -332,6 +332,37 @@ def check_icons(coins): 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 ====== @@ -411,8 +442,12 @@ def cli(colors): def check(missing_support, backend, icons, show_duplicates): """Validate coin definitions. - Checks that every btc-like coin is properly filled out, reports address collisions - and missing support information. + 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 @@ -471,6 +506,13 @@ def check(missing_support, backend, icons, show_duplicates): if not check_backends(defs.coins): 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) From 98c2fdc6dfb9ad39fc4623c330f6f96a53e9d843 Mon Sep 17 00:00:00 2001 From: matejcik Date: Thu, 23 Aug 2018 19:32:28 +0200 Subject: [PATCH 44/50] cointool: improve and document some more intricate parts of checks --- tools/cointool.py | 60 +++++++++++++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/tools/cointool.py b/tools/cointool.py index b5fbad2aa..6d96836fc 100755 --- a/tools/cointool.py +++ b/tools/cointool.py @@ -143,6 +143,7 @@ def render_file(src, dst, coins, support_info): 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) @@ -166,6 +167,7 @@ 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: @@ -174,6 +176,7 @@ def check_btc(coins): 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"] @@ -192,6 +195,13 @@ def check_btc(coins): 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")] @@ -227,6 +237,7 @@ def check_btc(coins): 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...") @@ -242,8 +253,20 @@ def check_btc(coins): return check_passed -def check_dups(buckets, show_tok_notok, show_erc20): +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: @@ -275,9 +298,7 @@ def check_dups(buckets, show_tok_notok, show_erc20): check_passed = False # deciding whether to print - if not nontokens and not show_erc20: - continue - if len(nontokens) == 1 and not show_tok_notok: + if level < print_at_level: continue if symbol == "_override": @@ -433,13 +454,12 @@ def cli(colors): @cli.command() # fmt: off -@click.option("--missing-support/--no-missing-support", "-s", default=False, help="Fail if support info for a coin is missing") @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(missing_support, backend, icons, show_duplicates): +def check(backend, icons, show_duplicates): """Validate coin definitions. Checks that every btc-like coin is properly filled out, reports duplicate symbols, @@ -450,18 +470,21 @@ def check(missing_support, backend, icons, show_duplicates): 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. + + - 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 code 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` + 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. @@ -484,16 +507,13 @@ def check(missing_support, backend, icons, show_duplicates): all_checks_passed = False if show_duplicates == "all": - show_tok_notok = True - show_erc20 = True + dup_level = logging.DEBUG elif show_duplicates == "nontoken": - show_tok_notok = True - show_erc20 = False + dup_level = logging.INFO else: - show_tok_notok = False - show_erc20 = False + dup_level = logging.ERROR print("Checking unexpected duplicates...") - if not check_dups(buckets, show_tok_notok, show_erc20): + if not check_dups(buckets, dup_level): all_checks_passed = False if icons: From 0abfb6cd9183c36ede1b52f43ab5c79b6eac88dd Mon Sep 17 00:00:00 2001 From: matejcik Date: Fri, 24 Aug 2018 15:20:25 +0200 Subject: [PATCH 45/50] coin_info: tweak API for less repetition --- tools/coin_info.py | 34 +++++++++++++++++++++++++--------- tools/coins_details.py | 6 +++--- tools/cointool.py | 9 ++++----- 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/tools/coin_info.py b/tools/coin_info.py index f6f2cf43a..db5713b21 100755 --- a/tools/coin_info.py +++ b/tools/coin_info.py @@ -278,7 +278,7 @@ def latest_releases(): latest = {} for v in ("1", "2"): releases = requests.get(RELEASES_URL.format(v)).json() - latest[v] = max(tuple(r["version"]) for r in releases) + latest["trezor" + v] = max(tuple(r["version"]) for r in releases) return latest @@ -421,8 +421,6 @@ def mark_duplicate_shortcuts(coins): # they *still* keep duplicate status (and possibly are deleted). continue - nontokens = [coin for coin in values if not is_token(coin)] - for coin in values: # allow overrides to skip this; if not listed in overrides, assume True is_dup = overrides.get(coin["key"], True) @@ -441,7 +439,7 @@ def _btc_sort_key(coin): return coin["name"] -def get_all(deduplicate=True): +def collect_coin_info(): """Returns all definition as dict organized by coin type. `coins` for btc-like coins, `eth` for ethereum networks, @@ -473,17 +471,35 @@ def get_all(deduplicate=True): _ensure_mandatory_values(coins) - if deduplicate: - mark_duplicate_shortcuts(all_coins.as_list()) - all_coins["erc20"] = [ - coin for coin in all_coins["erc20"] if not coin.get("duplicate") - ] + 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() diff --git a/tools/coins_details.py b/tools/coins_details.py index 8822fa1ec..711bbb278 100755 --- a/tools/coins_details.py +++ b/tools/coins_details.py @@ -153,8 +153,8 @@ def update_simple(coins, support_info, type): name=coin["name"], shortcut=coin["shortcut"], type=type, - t1_enabled=_is_supported(support, 1), - t2_enabled=_is_supported(support, 2), + t1_enabled=_is_supported(support, "trezor1"), + t2_enabled=_is_supported(support, "trezor2"), ) for k in OPTIONAL_KEYS: if k in coin: @@ -294,7 +294,7 @@ if __name__ == "__main__": handler.setLevel(logging.DEBUG) root.addHandler(handler) - defs = coin_info.get_all() + defs = coin_info.coin_info() support_info = coin_info.support_info(defs) coins = {} diff --git a/tools/cointool.py b/tools/cointool.py index 6d96836fc..a3e4b4df1 100755 --- a/tools/cointool.py +++ b/tools/cointool.py @@ -498,8 +498,7 @@ def check(backend, icons, show_duplicates): if icons and not CAN_BUILD_DEFS: raise click.ClickException("Missing requirements for icon check") - defs = coin_info.get_all(deduplicate=False) - buckets = coin_info.mark_duplicate_shortcuts(defs.as_list()) + defs, buckets = coin_info.coin_info_with_duplicates() all_checks_passed = True print("Checking BTC-like coins...") @@ -544,7 +543,7 @@ def check(backend, icons, show_duplicates): @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.get_all().coins + coins = coin_info.coin_info().coins support_info = coin_info.support_info(coins) by_name = {} for coin in coins: @@ -564,7 +563,7 @@ def coindefs(outfile): This is currently unused but should enable us to add new coins without having to update firmware. """ - coins = coin_info.get_all().coins + coins = coin_info.coin_info().coins coindefs = {} for coin in coins: key = coin["key"] @@ -603,7 +602,7 @@ def render(paths, outfile, verbose): raise click.ClickException("Option -o can only be used with single input file") # prepare defs - defs = coin_info.get_all() + defs = coin_info.coin_info() support_info = coin_info.support_info(defs) # munch dicts - make them attribute-accessible From 15a971764af670e17bb3a1bbc96d2f6d8b7f012d Mon Sep 17 00:00:00 2001 From: matejcik Date: Fri, 24 Aug 2018 15:21:11 +0200 Subject: [PATCH 46/50] support: finish `support.py release` flow --- tools/support.py | 120 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 92 insertions(+), 28 deletions(-) diff --git a/tools/support.py b/tools/support.py index cd0b3763c..9e4314924 100755 --- a/tools/support.py +++ b/tools/support.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 import re import os +import subprocess import sys import click import coin_info @@ -204,13 +205,13 @@ def cli(): @cli.command() -def fix(): +@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.get_all(deduplicate=False) - coin_info.mark_duplicate_shortcuts(all_coins.as_list()) + all_coins, _ = coin_info.coin_info_with_duplicates() coins_dict = all_coins.as_dict() orphaned = find_orphaned_support_keys(coins_dict) @@ -220,7 +221,8 @@ def fix(): clear_support(device, orphan) process_erc20(coins_dict) - write_support_info() + if not dry_run: + write_support_info() @cli.command() @@ -242,8 +244,7 @@ def check(ignore_tokens, ignore_missing): support info, but will not fail when missing coins are found. This is useful in Travis. """ - all_coins = coin_info.get_all(deduplicate=False) - coin_info.mark_duplicate_shortcuts(all_coins.as_list()) + all_coins, _ = coin_info.coin_info_with_duplicates() coins_dict = all_coins.as_dict() checks_ok = True @@ -281,14 +282,27 @@ def check(ignore_tokens, ignore_missing): @cli.command() # fmt: off -@click.argument("version") -@click.option("--git-tag/--no-git-tag", "-g", default=False, help="create a corresponding Git tag") +@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("-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 -def release(version, git_tag, release_soon, release_missing, dry_run, soon): +@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. @@ -297,41 +311,87 @@ def release(version, git_tag, release_soon, release_missing, dry_run, soon): released firmware version. Optionally tags the repository with the given version. - """ - version_tuple = list(map(int, version.split("."))) - device = f"trezor{version_tuple[0]}" + `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.get_all(deduplicate=False) - coin_info.mark_duplicate_shortcuts(defs.as_list()) + defs, _ = coin_info.coin_info_with_duplicates() coins_dict = defs.as_dict() - # process those darned ERC20 duplicates + # 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"] - if coin.get("duplicate") and coin_info.is_token(coin): - print(f"UNsupporting duplicate coin {key} ({coin['name']})") - set_unsupported(device, key, ERC20_DUPLICATE_KEY) - else: - print(f"Adding missing {key} ({coin['name']})") - set_supported(device, key, version) + # 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 + for key, val in supported.items() if val == "soon" and key in coins_dict ] for coin in soon_list: @@ -339,8 +399,13 @@ def release(version, git_tag, release_soon, release_missing, dry_run, soon): print(f"Adding soon-released {key} ({coin['name']})") set_supported(device, key, version) + tagname = f"{device}-{version}" if git_tag: - print("git tag not supported yet") + 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() @@ -355,8 +420,7 @@ def show(keyword): Keywords match against key, name or shortcut (ticker symbol) of coin. """ - defs = coin_info.get_all(deduplicate=False).as_list() - coin_info.mark_duplicate_shortcuts(defs) + defs = coin_info.coin_info_with_duplicates() for kw in keyword: for coin in coin_info.search(defs, kw): @@ -388,8 +452,8 @@ def set_support_value(key, entries, reason): 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. """ - coins = coin_info.get_all(deduplicate=False).as_dict() - coin_info.mark_duplicate_shortcuts(coins.values()) + 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.") From a903b996c8ce2234fd0031c0e12c7532f73d83a2 Mon Sep 17 00:00:00 2001 From: matejcik Date: Fri, 24 Aug 2018 15:29:48 +0200 Subject: [PATCH 47/50] support: fix bug in support.py show --- tools/support.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/support.py b/tools/support.py index 9e4314924..0d0ab5390 100755 --- a/tools/support.py +++ b/tools/support.py @@ -420,7 +420,7 @@ def show(keyword): Keywords match against key, name or shortcut (ticker symbol) of coin. """ - defs = coin_info.coin_info_with_duplicates() + defs, _ = coin_info.coin_info_with_duplicates() for kw in keyword: for coin in coin_info.search(defs, kw): From 467b41efda3cfcbe3acec91f636c2f8d5ee4c4f5 Mon Sep 17 00:00:00 2001 From: matejcik Date: Fri, 24 Aug 2018 15:42:06 +0200 Subject: [PATCH 48/50] defs/tools: rename "coins" to "bitcoin" --- defs/{coins => bitcoin}/bcash.json | 0 defs/{coins => bitcoin}/bcash.png | Bin defs/{coins => bitcoin}/bcash_testnet.json | 0 defs/{coins => bitcoin}/bcash_testnet.png | Bin defs/{coins => bitcoin}/bgold.json | 0 defs/{coins => bitcoin}/bgold.png | Bin defs/{coins => bitcoin}/bgold_testnet.json | 0 defs/{coins => bitcoin}/bgold_testnet.png | Bin defs/{coins => bitcoin}/bitcoin.json | 0 defs/{coins => bitcoin}/bitcoin.png | Bin defs/{coins => bitcoin}/bitcoin_testnet.json | 0 defs/{coins => bitcoin}/bitcoin_testnet.png | Bin defs/{coins => bitcoin}/bitcore.json | 0 defs/{coins => bitcoin}/bitcore.png | Bin defs/{coins => bitcoin}/bprivate.json | 0 defs/{coins => bitcoin}/bprivate.png | Bin defs/{coins => bitcoin}/crown.json | 0 defs/{coins => bitcoin}/crown.png | Bin defs/{coins => bitcoin}/dash.json | 0 defs/{coins => bitcoin}/dash.png | Bin defs/{coins => bitcoin}/dash_testnet.json | 0 defs/{coins => bitcoin}/dash_testnet.png | Bin defs/{coins => bitcoin}/decred.json | 0 defs/{coins => bitcoin}/decred.png | Bin defs/{coins => bitcoin}/decred_testnet.json | 0 defs/{coins => bitcoin}/decred_testnet.png | Bin defs/{coins => bitcoin}/denarius.json | 0 defs/{coins => bitcoin}/denarius.png | Bin defs/{coins => bitcoin}/digibyte.json | 0 defs/{coins => bitcoin}/digibyte.png | Bin defs/{coins => bitcoin}/dogecoin.json | 0 defs/{coins => bitcoin}/dogecoin.png | Bin defs/{coins => bitcoin}/feathercoin.json | 0 defs/{coins => bitcoin}/feathercoin.png | Bin defs/{coins => bitcoin}/flashcoin.json | 0 defs/{coins => bitcoin}/flashcoin.png | Bin defs/{coins => bitcoin}/fujicoin.json | 0 defs/{coins => bitcoin}/fujicoin.png | Bin defs/{coins => bitcoin}/groestlcoin.json | 0 defs/{coins => bitcoin}/groestlcoin.png | Bin .../groestlcoin_testnet.json | 0 .../groestlcoin_testnet.png | Bin defs/{coins => bitcoin}/koto.json | 0 defs/{coins => bitcoin}/koto.png | Bin defs/{coins => bitcoin}/litecoin.json | 0 defs/{coins => bitcoin}/litecoin.png | Bin defs/{coins => bitcoin}/litecoin_testnet.json | 0 defs/{coins => bitcoin}/litecoin_testnet.png | Bin defs/{coins => bitcoin}/monacoin.json | 0 defs/{coins => bitcoin}/monacoin.png | Bin defs/{coins => bitcoin}/monetaryunit.json | 0 defs/{coins => bitcoin}/monetaryunit.png | Bin defs/{coins => bitcoin}/myriad.json | 0 defs/{coins => bitcoin}/myriad.png | Bin defs/{coins => bitcoin}/namecoin.json | 0 defs/{coins => bitcoin}/namecoin.png | Bin defs/{coins => bitcoin}/pesetacoin.json | 0 defs/{coins => bitcoin}/pesetacoin.png | Bin defs/{coins => bitcoin}/smartcash.json | 0 defs/{coins => bitcoin}/smartcash.png | Bin .../{coins => bitcoin}/smartcash_testnet.json | 0 defs/{coins => bitcoin}/smartcash_testnet.png | Bin defs/{coins => bitcoin}/terracoin.json | 0 defs/{coins => bitcoin}/terracoin.png | Bin defs/{coins => bitcoin}/vertcoin.json | 0 defs/{coins => bitcoin}/vertcoin.png | Bin defs/{coins => bitcoin}/viacoin.json | 0 defs/{coins => bitcoin}/viacoin.png | Bin defs/{coins => bitcoin}/zcash.json | 0 defs/{coins => bitcoin}/zcash.png | Bin defs/{coins => bitcoin}/zcash_testnet.json | 0 defs/{coins => bitcoin}/zcash_testnet.png | Bin defs/{coins => bitcoin}/zcoin.json | 0 defs/{coins => bitcoin}/zcoin.png | Bin defs/{coins => bitcoin}/zcoin_testnet.json | 0 defs/{coins => bitcoin}/zcoin_testnet.png | Bin defs/{coins => bitcoin}/zencash.json | 0 defs/{coins => bitcoin}/zencash.png | Bin defs/coins | 1 + defs/coins/tools/build_coins.py | 1 - defs/coins_details.override.json | 24 +- defs/support.json | 216 +++++++++--------- tools/coin_info.py | 10 +- tools/coins_details.py | 4 +- tools/cointool.py | 10 +- 85 files changed, 133 insertions(+), 133 deletions(-) rename defs/{coins => bitcoin}/bcash.json (100%) rename defs/{coins => bitcoin}/bcash.png (100%) rename defs/{coins => bitcoin}/bcash_testnet.json (100%) rename defs/{coins => bitcoin}/bcash_testnet.png (100%) rename defs/{coins => bitcoin}/bgold.json (100%) rename defs/{coins => bitcoin}/bgold.png (100%) rename defs/{coins => bitcoin}/bgold_testnet.json (100%) rename defs/{coins => bitcoin}/bgold_testnet.png (100%) rename defs/{coins => bitcoin}/bitcoin.json (100%) rename defs/{coins => bitcoin}/bitcoin.png (100%) rename defs/{coins => bitcoin}/bitcoin_testnet.json (100%) rename defs/{coins => bitcoin}/bitcoin_testnet.png (100%) rename defs/{coins => bitcoin}/bitcore.json (100%) rename defs/{coins => bitcoin}/bitcore.png (100%) rename defs/{coins => bitcoin}/bprivate.json (100%) rename defs/{coins => bitcoin}/bprivate.png (100%) rename defs/{coins => bitcoin}/crown.json (100%) rename defs/{coins => bitcoin}/crown.png (100%) rename defs/{coins => bitcoin}/dash.json (100%) rename defs/{coins => bitcoin}/dash.png (100%) rename defs/{coins => bitcoin}/dash_testnet.json (100%) rename defs/{coins => bitcoin}/dash_testnet.png (100%) rename defs/{coins => bitcoin}/decred.json (100%) rename defs/{coins => bitcoin}/decred.png (100%) rename defs/{coins => bitcoin}/decred_testnet.json (100%) rename defs/{coins => bitcoin}/decred_testnet.png (100%) rename defs/{coins => bitcoin}/denarius.json (100%) rename defs/{coins => bitcoin}/denarius.png (100%) rename defs/{coins => bitcoin}/digibyte.json (100%) rename defs/{coins => bitcoin}/digibyte.png (100%) rename defs/{coins => bitcoin}/dogecoin.json (100%) rename defs/{coins => bitcoin}/dogecoin.png (100%) rename defs/{coins => bitcoin}/feathercoin.json (100%) rename defs/{coins => bitcoin}/feathercoin.png (100%) rename defs/{coins => bitcoin}/flashcoin.json (100%) rename defs/{coins => bitcoin}/flashcoin.png (100%) rename defs/{coins => bitcoin}/fujicoin.json (100%) rename defs/{coins => bitcoin}/fujicoin.png (100%) rename defs/{coins => bitcoin}/groestlcoin.json (100%) rename defs/{coins => bitcoin}/groestlcoin.png (100%) rename defs/{coins => bitcoin}/groestlcoin_testnet.json (100%) rename defs/{coins => bitcoin}/groestlcoin_testnet.png (100%) rename defs/{coins => bitcoin}/koto.json (100%) rename defs/{coins => bitcoin}/koto.png (100%) rename defs/{coins => bitcoin}/litecoin.json (100%) rename defs/{coins => bitcoin}/litecoin.png (100%) rename defs/{coins => bitcoin}/litecoin_testnet.json (100%) rename defs/{coins => bitcoin}/litecoin_testnet.png (100%) rename defs/{coins => bitcoin}/monacoin.json (100%) rename defs/{coins => bitcoin}/monacoin.png (100%) rename defs/{coins => bitcoin}/monetaryunit.json (100%) rename defs/{coins => bitcoin}/monetaryunit.png (100%) rename defs/{coins => bitcoin}/myriad.json (100%) rename defs/{coins => bitcoin}/myriad.png (100%) rename defs/{coins => bitcoin}/namecoin.json (100%) rename defs/{coins => bitcoin}/namecoin.png (100%) rename defs/{coins => bitcoin}/pesetacoin.json (100%) rename defs/{coins => bitcoin}/pesetacoin.png (100%) rename defs/{coins => bitcoin}/smartcash.json (100%) rename defs/{coins => bitcoin}/smartcash.png (100%) rename defs/{coins => bitcoin}/smartcash_testnet.json (100%) rename defs/{coins => bitcoin}/smartcash_testnet.png (100%) rename defs/{coins => bitcoin}/terracoin.json (100%) rename defs/{coins => bitcoin}/terracoin.png (100%) rename defs/{coins => bitcoin}/vertcoin.json (100%) rename defs/{coins => bitcoin}/vertcoin.png (100%) rename defs/{coins => bitcoin}/viacoin.json (100%) rename defs/{coins => bitcoin}/viacoin.png (100%) rename defs/{coins => bitcoin}/zcash.json (100%) rename defs/{coins => bitcoin}/zcash.png (100%) rename defs/{coins => bitcoin}/zcash_testnet.json (100%) rename defs/{coins => bitcoin}/zcash_testnet.png (100%) rename defs/{coins => bitcoin}/zcoin.json (100%) rename defs/{coins => bitcoin}/zcoin.png (100%) rename defs/{coins => bitcoin}/zcoin_testnet.json (100%) rename defs/{coins => bitcoin}/zcoin_testnet.png (100%) rename defs/{coins => bitcoin}/zencash.json (100%) rename defs/{coins => bitcoin}/zencash.png (100%) create mode 120000 defs/coins delete mode 120000 defs/coins/tools/build_coins.py 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.override.json b/defs/coins_details.override.json index 39c581c81..671be8bd8 100644 --- a/defs/coins_details.override.json +++ b/defs/coins_details.override.json @@ -5,62 +5,62 @@ "erc20:eth:GNT": { "coinmarketcap_alias": "golem-network-tokens" }, - "coin:BCH": { + "bitcoin:BCH": { "wallet": { "Electron Cash": "https://electroncash.org" } }, - "coin:BTC": { + "bitcoin:BTC": { "wallet": { "Electrum": "https://electrum.org" } }, - "coin:BTCP": { + "bitcoin:BTCP": { "wallet": { "BTCP Electrum": "https://github.com/BTCPrivate/electrum-btcp" } }, - "coin:BTG": { + "bitcoin:BTG": { "wallet": { "ElectrumG": "https://github.com/BTCGPU/electrum" } }, - "coin:DASH": { + "bitcoin:DASH": { "wallet": { "Dash Electrum": "https://electrum.dash.org" } }, - "coin:FJC": { + "bitcoin:FJC": { "wallet": { "Electrum-FJC": "http://www.fujicoin.org/downloads.php" } }, - "coin:GRS": { + "bitcoin:GRS": { "wallet": { "Electrum-GRS": "https://www.groestlcoin.org/groestlcoin-electrum-wallet/" } }, - "coin:LTC": { + "bitcoin:LTC": { "wallet": { "Electrum-LTC": "https://electrum-ltc.org" } }, - "coin:MONA": { + "bitcoin:MONA": { "wallet": { "Electrum-MONA": "https://electrum-mona.org" } }, - "coin:NMC": { + "bitcoin:NMC": { "wallet": { "Electrum-NMC": "https://github.com/namecoin/electrum-nmc" } }, - "coin:VIA": { + "bitcoin:VIA": { "wallet": { "Vialectrum": "https://vialectrum.org" } }, - "coin:XZC": { + "bitcoin:XZC": { "wallet": { "Electrum-XZC": "https://github.com/zcoinofficial/electrum-xzc", "Znode Tool": "https://github.com/yura-pakhuchiy/znode-tool" diff --git a/defs/support.json b/defs/support.json index 79e730baf..8f3ac2b30 100644 --- a/defs/support.json +++ b/defs/support.json @@ -1,55 +1,55 @@ { "connect": { "supported": { - "coin:BCH": true, - "coin:BTC": true, - "coin:BTG": true, - "coin:DASH": true, - "coin:DOGE": true, - "coin:LTC": true, - "coin:TEST": true, - "coin:VTC": true, - "coin:ZEC": true + "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": { - "coin:BCH": "1.6.2", - "coin:BTC": "1.5.2", - "coin:BTCP": "1.6.2", - "coin:BTG": "1.6.2", - "coin:DASH": "1.5.2", - "coin:DCR": "1.6.2", - "coin:DGB": "1.6.0", - "coin:DNR": "soon", - "coin:DOGE": "1.5.2", - "coin:FJC": "1.6.1", - "coin:FLASH": "soon", - "coin:FTC": "soon", - "coin:GRS": "1.6.2", - "coin:KOTO": "soon", - "coin:LTC": "1.5.2", - "coin:MONA": "1.6.0", - "coin:MUE": "soon", - "coin:NMC": "1.5.2", - "coin:PTC": "soon", - "coin:SMART": "soon", - "coin:TAZ": "1.6.2", - "coin:TBCH": "1.6.2", - "coin:TBTG": "soon", - "coin:TDCR": "1.6.2", - "coin:TEST": "1.5.2", - "coin:TLTC": "1.6.2", - "coin:VIA": "1.6.2", - "coin:VTC": "1.6.1", - "coin:XMY": "soon", - "coin:XZC": "1.6.2", - "coin:ZEC": "1.6.2", - "coin:tDASH": "1.6.2", - "coin:tGRS": "1.6.2", - "coin:tSMART": "soon", - "coin:tXZC": "1.6.2", + "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", @@ -707,10 +707,10 @@ "nem:XEM": "1.6.2" }, "unsupported": { - "coin:BTX": "address_type collides with Bitcoin", - "coin:CRW": "address_type collides with Bitcoin", - "coin:TRC": "address_type collides with Bitcoin", - "coin:ZEN": "not implemented on T1", + "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", @@ -825,40 +825,40 @@ }, "trezor2": { "supported": { - "coin:BCH": "2.0.7", - "coin:BTC": "2.0.5", - "coin:BTCP": "2.0.7", - "coin:BTG": "2.0.7", - "coin:DASH": "2.0.5", - "coin:DGB": "2.0.5", - "coin:DNR": "soon", - "coin:DOGE": "2.0.5", - "coin:FJC": "2.0.5", - "coin:FLASH": "soon", - "coin:FTC": "soon", - "coin:GRS": "2.0.8", - "coin:KOTO": "soon", - "coin:LTC": "2.0.5", - "coin:MONA": "2.0.5", - "coin:MUE": "soon", - "coin:NMC": "2.0.5", - "coin:PTC": "soon", - "coin:SMART": "soon", - "coin:TAZ": "2.0.7", - "coin:TBCH": "2.0.7", - "coin:TBTG": "soon", - "coin:TEST": "2.0.5", - "coin:TLTC": "2.0.7", - "coin:VIA": "2.0.7", - "coin:VTC": "2.0.5", - "coin:XMY": "soon", - "coin:XZC": "2.0.7", - "coin:ZEC": "2.0.7", - "coin:ZEN": "2.0.8", - "coin:tDASH": "soon", - "coin:tGRS": "2.0.8", - "coin:tSMART": "soon", - "coin:tXZC": "2.0.7", + "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", @@ -1521,11 +1521,11 @@ "nem:XEM": "2.0.7" }, "unsupported": { - "coin:BTX": "address_type collides with Bitcoin", - "coin:CRW": "address_type collides with Bitcoin", - "coin:DCR": "not implemented on Trezor T", - "coin:TDCR": "not implemented on Trezor T", - "coin:TRC": "address_type collides with Bitcoin", + "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", @@ -1635,27 +1635,27 @@ }, "webwallet": { "supported": { - "coin:BCH": true, - "coin:BTC": true, - "coin:BTCP": true, - "coin:BTG": true, - "coin:DASH": true, - "coin:DCR": true, - "coin:DGB": true, - "coin:DOGE": true, - "coin:FJC": true, - "coin:GRS": true, - "coin:LTC": true, - "coin:MONA": true, - "coin:TAZ": true, - "coin:TDCR": true, - "coin:TEST": true, - "coin:TLTC": true, - "coin:VIA": true, - "coin:VTC": true, - "coin:XZC": true, - "coin:ZEC": true, - "coin:tGRS": true + "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/coin_info.py b/tools/coin_info.py index db5713b21..4c4617ba4 100755 --- a/tools/coin_info.py +++ b/tools/coin_info.py @@ -37,13 +37,13 @@ class CoinsInfo(dict): """Collection of information about all known kinds of coins. It contains the following lists: - `coins` for btc-like coins, + `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["coins"] == info.coins` + Accessible as a dict or by attribute: `info["misc"] == info.misc` """ def as_list(self): @@ -196,7 +196,7 @@ def _load_btc_coins(): coin.update( name=coin["coin_name"], shortcut=coin["coin_shortcut"], - key="coin:{}".format(coin["coin_shortcut"]), + key="bitcoin:{}".format(coin["coin_shortcut"]), icon=filename.replace(".json", ".png"), ) coins.append(coin) @@ -450,7 +450,7 @@ def collect_coin_info(): Automatically removes duplicate symbols from the result. """ all_coins = CoinsInfo( - coins=_load_btc_coins(), + bitcoin=_load_btc_coins(), eth=_load_ethereum_networks(), erc20=_load_erc20_tokens(), nem=_load_nem_mosaics(), @@ -458,7 +458,7 @@ def collect_coin_info(): ) for k, coins in all_coins.items(): - if k == "coins": + if k == "bitcoin": coins.sort(key=_btc_sort_key) elif k == "nem": # do not sort nem diff --git a/tools/coins_details.py b/tools/coins_details.py index 711bbb278..f28748a5e 100755 --- a/tools/coins_details.py +++ b/tools/coins_details.py @@ -165,7 +165,7 @@ def update_simple(coins, support_info, type): return res -def update_coins(coins, support_info): +def update_bitcoin(coins, support_info): res = update_simple(coins, support_info, "coin") for coin in coins: key = coin["key"] @@ -298,7 +298,7 @@ if __name__ == "__main__": support_info = coin_info.support_info(defs) coins = {} - coins.update(update_coins(defs.coins, support_info)) + 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")) diff --git a/tools/cointool.py b/tools/cointool.py index a3e4b4df1..09e86e039 100755 --- a/tools/cointool.py +++ b/tools/cointool.py @@ -502,7 +502,7 @@ def check(backend, icons, show_duplicates): all_checks_passed = True print("Checking BTC-like coins...") - if not check_btc(defs.coins): + if not check_btc(defs.bitcoin): all_checks_passed = False if show_duplicates == "all": @@ -517,12 +517,12 @@ def check(backend, icons, show_duplicates): if icons: print("Checking icon files...") - if not check_icons(defs.coins): + if not check_icons(defs.bitcoin): all_checks_passed = False if backend: print("Checking backend responses...") - if not check_backends(defs.coins): + if not check_backends(defs.bitcoin): all_checks_passed = False print("Checking key uniformity...") @@ -543,7 +543,7 @@ def check(backend, icons, show_duplicates): @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().coins + coins = coin_info.coin_info().bitcoin support_info = coin_info.support_info(coins) by_name = {} for coin in coins: @@ -563,7 +563,7 @@ def coindefs(outfile): This is currently unused but should enable us to add new coins without having to update firmware. """ - coins = coin_info.coin_info().coins + coins = coin_info.coin_info().bitcoin coindefs = {} for coin in coins: key = coin["key"] From a80a3ac6f2afd27e570696dac9e108e2c275aa97 Mon Sep 17 00:00:00 2001 From: matejcik Date: Fri, 24 Aug 2018 17:01:54 +0200 Subject: [PATCH 49/50] coins_details: update to new CMC API, improve script, refresh data --- defs/coins_details.json | 504 ++++++++++++++++++++-------------------- tools/coins_details.py | 96 ++++---- 2 files changed, 307 insertions(+), 293 deletions(-) diff --git a/defs/coins_details.json b/defs/coins_details.json index 6b250823f..b04182da8 100644 --- a/defs/coins_details.json +++ b/defs/coins_details.json @@ -1,11 +1,11 @@ { "coins": { - "coin:BCH": { + "bitcoin:BCH": { "links": { "Github": "https://github.com/Bitcoin-ABC/bitcoin-abc", "Homepage": "https://www.bitcoincash.org" }, - "marketcap_usd": 9060927775, + "marketcap_usd": 9137924262, "name": "Bitcoin Cash", "shortcut": "BCH", "t1_enabled": "yes", @@ -16,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": 111347645251, + "marketcap_usd": 113093093543, "name": "Bitcoin", "shortcut": "BTC", "t1_enabled": "yes", @@ -32,12 +32,12 @@ "Trezor": "https://wallet.trezor.io" } }, - "coin:BTCP": { + "bitcoin:BTCP": { "links": { "Github": "https://github.com/BTCPrivate/BitcoinPrivate", "Homepage": "https://btcprivate.org" }, - "marketcap_usd": 81211090, + "marketcap_usd": 87763522, "name": "Bitcoin Private", "shortcut": "BTCP", "t1_enabled": "yes", @@ -47,12 +47,12 @@ "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": 316050580, + "marketcap_usd": 325590507, "name": "Bitcoin Gold", "shortcut": "BTG", "t1_enabled": "yes", @@ -63,12 +63,12 @@ "Trezor": "https://wallet.trezor.io" } }, - "coin:BTX": { + "bitcoin:BTX": { "links": { "Github": "https://github.com/LIMXTEC/BitCore", "Homepage": "https://bitcore.cc" }, - "marketcap_usd": 19911585, + "marketcap_usd": 20100741, "name": "Bitcore", "shortcut": "BTX", "t1_enabled": "no", @@ -76,12 +76,12 @@ "type": "coin", "wallet": {} }, - "coin:CRW": { + "bitcoin:CRW": { "links": { "Github": "https://github.com/Crowndev/crowncoin", "Homepage": "https://crown.tech" }, - "marketcap_usd": 5211934, + "marketcap_usd": 5188447, "name": "Crown", "shortcut": "CRW", "t1_enabled": "no", @@ -89,12 +89,12 @@ "type": "coin", "wallet": {} }, - "coin:DASH": { + "bitcoin:DASH": { "links": { "Github": "https://github.com/dashpay/dash", "Homepage": "https://www.dash.org" }, - "marketcap_usd": 1148041905, + "marketcap_usd": 1152175202, "name": "Dash", "shortcut": "DASH", "t1_enabled": "yes", @@ -105,12 +105,12 @@ "Trezor": "https://wallet.trezor.io" } }, - "coin:DCR": { + "bitcoin:DCR": { "links": { "Github": "https://github.com/decred/dcrd", "Homepage": "https://www.decred.org" }, - "marketcap_usd": 305128323, + "marketcap_usd": 302406692, "name": "Decred", "shortcut": "DCR", "t1_enabled": "yes", @@ -118,12 +118,12 @@ "type": "coin", "wallet": {} }, - "coin:DGB": { + "bitcoin:DGB": { "links": { "Github": "https://github.com/digibyte/digibyte", "Homepage": "https://digibyte.io" }, - "marketcap_usd": 257382920, + "marketcap_usd": 271399167, "name": "DigiByte", "shortcut": "DGB", "t1_enabled": "yes", @@ -131,7 +131,7 @@ "type": "coin", "wallet": {} }, - "coin:DNR": { + "bitcoin:DNR": { "links": { "Github": "https://github.com/carsenk/denarius", "Homepage": "https://denarius.io" @@ -144,12 +144,12 @@ "type": "coin", "wallet": {} }, - "coin:DOGE": { + "bitcoin:DOGE": { "links": { "Github": "https://github.com/dogecoin/dogecoin", "Homepage": "http://dogecoin.com" }, - "marketcap_usd": 273658182, + "marketcap_usd": 274733481, "name": "Dogecoin", "shortcut": "DOGE", "t1_enabled": "yes", @@ -159,12 +159,12 @@ "Trezor": "https://wallet.trezor.io" } }, - "coin:FJC": { + "bitcoin:FJC": { "links": { "Github": "https://github.com/fujicoin/fujicoin", "Homepage": "http://fujicoin.org" }, - "marketcap_usd": 515593, + "marketcap_usd": 525183, "name": "Fujicoin", "shortcut": "FJC", "t1_enabled": "yes", @@ -174,12 +174,12 @@ "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": 5807712, + "marketcap_usd": 5896831, "name": "Flashcoin", "shortcut": "FLASH", "t1_enabled": "soon", @@ -187,12 +187,12 @@ "type": "coin", "wallet": {} }, - "coin:FTC": { + "bitcoin:FTC": { "links": { "Github": "https://github.com/FeatherCoin/Feathercoin", "Homepage": "https://feathercoin.com" }, - "marketcap_usd": 10600270, + "marketcap_usd": 11252804, "name": "Feathercoin", "shortcut": "FTC", "t1_enabled": "soon", @@ -200,12 +200,12 @@ "type": "coin", "wallet": {} }, - "coin:GRS": { + "bitcoin:GRS": { "links": { "Github": "https://github.com/Groestlcoin/groestlcoin", "Homepage": "https://www.groestlcoin.org" }, - "marketcap_usd": 41625236, + "marketcap_usd": 43522762, "name": "Groestlcoin", "shortcut": "GRS", "t1_enabled": "yes", @@ -215,7 +215,7 @@ "Electrum-GRS": "https://www.groestlcoin.org/groestlcoin-electrum-wallet/" } }, - "coin:KOTO": { + "bitcoin:KOTO": { "links": { "Github": "https://github.com/KotoDevelopers/koto", "Homepage": "https://ko-to.org" @@ -228,12 +228,12 @@ "type": "coin", "wallet": {} }, - "coin:LTC": { + "bitcoin:LTC": { "links": { "Github": "https://github.com/litecoin-project/litecoin", "Homepage": "https://litecoin.org" }, - "marketcap_usd": 3258961661, + "marketcap_usd": 3266595707, "name": "Litecoin", "shortcut": "LTC", "t1_enabled": "yes", @@ -244,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": 96010658, + "marketcap_usd": 95510557, "name": "Monacoin", "shortcut": "MONA", "t1_enabled": "yes", @@ -259,7 +259,7 @@ "Electrum-MONA": "https://electrum-mona.org" } }, - "coin:MUE": { + "bitcoin:MUE": { "links": { "Github": "https://github.com/muecoin/MUECore", "Homepage": "https://www.monetaryunit.org" @@ -272,12 +272,12 @@ "type": "coin", "wallet": {} }, - "coin:NMC": { + "bitcoin:NMC": { "links": { "Github": "https://github.com/namecoin/namecoin-core", "Homepage": "https://namecoin.org" }, - "marketcap_usd": 24205722, + "marketcap_usd": 20470325, "name": "Namecoin", "shortcut": "NMC", "t1_enabled": "yes", @@ -287,12 +287,12 @@ "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": 2061608, + "marketcap_usd": 2218954, "name": "Pesetacoin", "shortcut": "PTC", "t1_enabled": "soon", @@ -300,12 +300,12 @@ "type": "coin", "wallet": {} }, - "coin:SMART": { + "bitcoin:SMART": { "links": { "Github": "https://github.com/SmartCash/Core-Smart", "Homepage": "https://smarcash.cc" }, - "marketcap_usd": 49514130, + "marketcap_usd": 47714944, "name": "SmartCash", "shortcut": "SMART", "t1_enabled": "soon", @@ -313,7 +313,7 @@ "type": "coin", "wallet": {} }, - "coin:TAZ": { + "bitcoin:TAZ": { "hidden": 1, "links": { "Github": "https://github.com/zcash/zcash", @@ -327,7 +327,7 @@ "type": "coin", "wallet": {} }, - "coin:TBCH": { + "bitcoin:TBCH": { "hidden": 1, "links": { "Github": "https://github.com/Bitcoin-ABC/bitcoin-abc", @@ -341,7 +341,7 @@ "type": "coin", "wallet": {} }, - "coin:TBTG": { + "bitcoin:TBTG": { "hidden": 1, "links": { "Github": "https://github.com/BTCGPU/BTCGPU", @@ -355,7 +355,7 @@ "type": "coin", "wallet": {} }, - "coin:TDCR": { + "bitcoin:TDCR": { "hidden": 1, "links": { "Github": "https://github.com/decred/dcrd", @@ -369,7 +369,7 @@ "type": "coin", "wallet": {} }, - "coin:TEST": { + "bitcoin:TEST": { "hidden": 1, "links": { "Github": "https://github.com/bitcoin/bitcoin", @@ -385,7 +385,7 @@ "Trezor": "https://wallet.trezor.io" } }, - "coin:TLTC": { + "bitcoin:TLTC": { "hidden": 1, "links": { "Github": "https://github.com/litecoin-project/litecoin", @@ -399,12 +399,12 @@ "type": "coin", "wallet": {} }, - "coin:TRC": { + "bitcoin:TRC": { "links": { "Github": "https://github.com/terracoin/terracoin", "Homepage": "https://terracoin.io" }, - "marketcap_usd": 1511563, + "marketcap_usd": 1688794, "name": "Terracoin", "shortcut": "TRC", "t1_enabled": "no", @@ -412,12 +412,12 @@ "type": "coin", "wallet": {} }, - "coin:VIA": { + "bitcoin:VIA": { "links": { "Github": "https://github.com/viacoin", "Homepage": "https://viacoin.org" }, - "marketcap_usd": 19043035, + "marketcap_usd": 20021749, "name": "Viacoin", "shortcut": "VIA", "t1_enabled": "yes", @@ -427,12 +427,12 @@ "Vialectrum": "https://vialectrum.org" } }, - "coin:VTC": { + "bitcoin:VTC": { "links": { "Github": "https://github.com/vertcoin-project/vertcoin-core", "Homepage": "https://vertcoin.org" }, - "marketcap_usd": 31582960, + "marketcap_usd": 31642995, "name": "Vertcoin", "shortcut": "VTC", "t1_enabled": "yes", @@ -442,12 +442,12 @@ "Trezor": "https://wallet.trezor.io" } }, - "coin:XMY": { + "bitcoin:XMY": { "links": { "Github": "https://github.com/myriadcoin/myriadcoin", "Homepage": "https://www.myriadcoin.org" }, - "marketcap_usd": 4644297, + "marketcap_usd": 4413486, "name": "Myriad", "shortcut": "XMY", "t1_enabled": "soon", @@ -455,12 +455,12 @@ "type": "coin", "wallet": {} }, - "coin:XZC": { + "bitcoin:XZC": { "links": { "Github": "https://github.com/zcoinofficial/zcoin", "Homepage": "https://zcoin.io" }, - "marketcap_usd": 67426017, + "marketcap_usd": 69876887, "name": "Zcoin", "shortcut": "XZC", "t1_enabled": "yes", @@ -471,12 +471,12 @@ "Znode Tool": "https://github.com/yura-pakhuchiy/znode-tool" } }, - "coin:ZEC": { + "bitcoin:ZEC": { "links": { "Github": "https://github.com/zcash/zcash", "Homepage": "https://z.cash" }, - "marketcap_usd": 611353070, + "marketcap_usd": 618009538, "name": "Zcash", "shortcut": "ZEC", "t1_enabled": "yes", @@ -486,12 +486,12 @@ "Trezor": "https://wallet.trezor.io" } }, - "coin:ZEN": { + "bitcoin:ZEN": { "links": { "Github": "https://github.com/ZencashOfficial/zen", "Homepage": "https://zencash.com" }, - "marketcap_usd": 90375887, + "marketcap_usd": 92278630, "name": "Zencash", "shortcut": "ZEN", "t1_enabled": "no", @@ -499,7 +499,7 @@ "type": "coin", "wallet": {} }, - "coin:tDASH": { + "bitcoin:tDASH": { "hidden": 1, "links": { "Github": "https://github.com/dashpay/dash", @@ -513,7 +513,7 @@ "type": "coin", "wallet": {} }, - "coin:tGRS": { + "bitcoin:tGRS": { "hidden": 1, "links": { "Github": "https://github.com/Groestlcoin/groestlcoin", @@ -527,7 +527,7 @@ "type": "coin", "wallet": {} }, - "coin:tSMART": { + "bitcoin:tSMART": { "hidden": 1, "links": { "Github": "https://github.com/SmartCash/Core-Smart", @@ -541,7 +541,7 @@ "type": "coin", "wallet": {} }, - "coin:tXZC": { + "bitcoin:tXZC": { "hidden": 1, "links": { "Github": "https://github.com/zcoinofficial/zcoin", @@ -696,7 +696,7 @@ "links": { "Homepage": "https://0xbitcoin.org/" }, - "marketcap_usd": 1277837, + "marketcap_usd": 1282370, "name": "0xBitcoin", "network": "eth", "shortcut": "0xBTC", @@ -713,7 +713,7 @@ "links": { "Homepage": "https://firstblood.io" }, - "marketcap_usd": 5600207, + "marketcap_usd": 5842090, "name": "FirstBlood", "network": "eth", "shortcut": "1ST", @@ -849,7 +849,7 @@ "links": { "Homepage": "http://accelerator.network" }, - "marketcap_usd": 101922, + "marketcap_usd": 103709, "name": "Accelerator Network", "network": "eth", "shortcut": "ACC", @@ -884,7 +884,7 @@ "Github": "https://github.com/aditus", "Homepage": "https://aditus.net" }, - "marketcap_usd": 551147, + "marketcap_usd": 632365, "name": "Aditus", "network": "eth", "shortcut": "ADI", @@ -919,7 +919,7 @@ "links": { "Homepage": "https://adshares.net" }, - "marketcap_usd": 2001663, + "marketcap_usd": 2049749, "name": "AdShares", "network": "eth", "shortcut": "ADST", @@ -937,7 +937,7 @@ "Github": "https://github.com/adchain", "Homepage": "https://adtoken.com" }, - "marketcap_usd": 7973488, + "marketcap_usd": 8188525, "name": "AdToken", "network": "eth", "shortcut": "ADT", @@ -973,7 +973,7 @@ "Github": "https://github.com/aeternity", "Homepage": "https://www.aeternity.com/" }, - "marketcap_usd": 225631023, + "marketcap_usd": 232368933, "name": "aeternity", "network": "eth", "shortcut": "AE", @@ -991,7 +991,7 @@ "Github": "https://github.com/singnet/singnet", "Homepage": "https://singularitynet.io" }, - "marketcap_usd": 22605681, + "marketcap_usd": 24009832, "name": "SingularityNET", "network": "eth", "shortcut": "AGI", @@ -1009,7 +1009,7 @@ "Github": "https://github.com/aionnetwork", "Homepage": "https://aion.network/" }, - "marketcap_usd": 98801314, + "marketcap_usd": 108849984, "name": "Aion", "network": "eth", "shortcut": "AION", @@ -1026,7 +1026,7 @@ "links": { "Homepage": "https://airtoken.com" }, - "marketcap_usd": 2906960, + "marketcap_usd": 3300916, "name": "AirToken", "network": "eth", "shortcut": "AIR", @@ -1044,7 +1044,7 @@ "Github": "https://github.com/AigangNetwork", "Homepage": "https://aigang.network/" }, - "marketcap_usd": 613613, + "marketcap_usd": 609344, "name": "Aigang", "network": "eth", "shortcut": "AIX", @@ -1097,7 +1097,7 @@ "Github": "https://github.com/AlisProject", "Homepage": "https://alismedia.jp" }, - "marketcap_usd": 2026289, + "marketcap_usd": 2202941, "name": "ALIS Token", "network": "eth", "shortcut": "ALIS", @@ -1168,7 +1168,7 @@ "Github": "https://github.com/amlt-by-coinfirm", "Homepage": "https://amlt.coinfirm.io/" }, - "marketcap_usd": 1847196, + "marketcap_usd": 1861792, "name": "AMLT", "network": "eth", "shortcut": "AMLT", @@ -1186,7 +1186,7 @@ "Github": "https://github.com/amontech", "Homepage": "https://amon.tech" }, - "marketcap_usd": 389102, + "marketcap_usd": 415222, "name": "Amon", "network": "eth", "shortcut": "AMN", @@ -1256,7 +1256,7 @@ "Github": "https://github.com/Oxchild/crowdsale", "Homepage": "https://apisplatform.io" }, - "marketcap_usd": 14512148, + "marketcap_usd": 13028449, "name": "APIS", "network": "eth", "shortcut": "APIS", @@ -1274,7 +1274,7 @@ "Github": "https://github.com/Aptoide/AppCoins-ethereumj", "Homepage": "https://appcoins.io" }, - "marketcap_usd": 8913359, + "marketcap_usd": 8396156, "name": "AppCoins", "network": "eth", "shortcut": "APPC", @@ -1291,7 +1291,7 @@ "links": { "Homepage": "https://aigang.network" }, - "marketcap_usd": 613613, + "marketcap_usd": 609344, "name": "AIGang", "network": "eth", "shortcut": "APT", @@ -1326,7 +1326,7 @@ "links": { "Homepage": "https://www.arbitragect.com" }, - "marketcap_usd": 134561, + "marketcap_usd": 136089, "name": "ArbitrageCT", "network": "eth", "shortcut": "ARCT", @@ -1431,7 +1431,7 @@ "links": { "Homepage": "https://airswap.io" }, - "marketcap_usd": 12374307, + "marketcap_usd": 13376207, "name": "Airswap", "network": "eth", "shortcut": "AST", @@ -1589,7 +1589,7 @@ "Github": "https://www.github.com/axpire", "Homepage": "https://www.axpire.io" }, - "marketcap_usd": 4373208, + "marketcap_usd": 4232286, "name": "aXpire", "network": "eth", "shortcut": "AXPR", @@ -1784,7 +1784,7 @@ "Github": "https://github.com/thebeetoken", "Homepage": "https://www.beetoken.com" }, - "marketcap_usd": 1742594, + "marketcap_usd": 1975546, "name": "Bee Token", "network": "eth", "shortcut": "BEE", @@ -1908,7 +1908,7 @@ "Github": "https://github.com/BankEx", "Homepage": "https://bankex.com/" }, - "marketcap_usd": 6012109, + "marketcap_usd": 6511393, "name": "BANKEX", "network": "eth", "shortcut": "BKX", @@ -1944,7 +1944,7 @@ "Github": "https://github.com/BlueCrypto", "Homepage": "https://blueprotocol.com/" }, - "marketcap_usd": 1603825, + "marketcap_usd": 1692252, "name": "Ethereum Blue", "network": "eth", "shortcut": "BLUE", @@ -1979,7 +1979,7 @@ "links": { "Homepage": "https://www.iconomi.net" }, - "marketcap_usd": 44416139, + "marketcap_usd": 45789936, "name": "Iconomi", "network": "eth", "shortcut": "BLX (Iconomi)", @@ -2116,7 +2116,7 @@ "Github": "https://github.com/bancorprotocol", "Homepage": "https://www.bancor.network/discover" }, - "marketcap_usd": 82991724, + "marketcap_usd": 83919779, "name": "Bancor", "network": "eth", "shortcut": "BNT", @@ -2167,7 +2167,7 @@ "links": { "Homepage": "https://bonpay.com" }, - "marketcap_usd": 965311, + "marketcap_usd": 1034517, "name": "Bonpay", "network": "eth", "shortcut": "BON", @@ -2271,7 +2271,7 @@ "links": { "Homepage": "http://bro-consortium.io" }, - "marketcap_usd": 27576, + "marketcap_usd": 16945, "name": "BRAT", "network": "eth", "shortcut": "BRAT", @@ -2289,7 +2289,7 @@ "Github": "https://github.com/breadwallet", "Homepage": "https://token.breadapp.com/en" }, - "marketcap_usd": 31877319, + "marketcap_usd": 32166081, "name": "Bread", "network": "eth", "shortcut": "BRD", @@ -2447,7 +2447,7 @@ "Github": "https://github.com/bytom", "Homepage": "https://bytom.io" }, - "marketcap_usd": 163797956, + "marketcap_usd": 182156841, "name": "Bytom", "network": "eth", "shortcut": "BTM", @@ -2566,7 +2566,7 @@ "Github": "https://github.com/cryptotwenty", "Homepage": "https://crypto20.com" }, - "marketcap_usd": 27273273, + "marketcap_usd": 27200698, "name": "Crypto20's Token", "network": "eth", "shortcut": "C20", @@ -2684,7 +2684,7 @@ "links": { "Homepage": "https://cashaa.com" }, - "marketcap_usd": 9604839, + "marketcap_usd": 11049607, "name": "Cashaa", "network": "eth", "shortcut": "CAS", @@ -3153,7 +3153,7 @@ "links": { "Homepage": "https://cindicator.com" }, - "marketcap_usd": 25058233, + "marketcap_usd": 25262263, "name": "Cindicator", "network": "eth", "shortcut": "CND", @@ -3260,7 +3260,7 @@ "Github": "https://github.com/CoinvestHQ", "Homepage": "https://coinve.st" }, - "marketcap_usd": 101879, + "marketcap_usd": 89814, "name": "Coinvest V2 Token", "network": "eth", "shortcut": "COIN", @@ -3294,7 +3294,7 @@ "links": { "Homepage": "https://covesting.io/" }, - "marketcap_usd": 14548559, + "marketcap_usd": 15546534, "name": "Covesting", "network": "eth", "shortcut": "COV", @@ -3330,7 +3330,7 @@ "Github": "https://github.com/aditus", "Homepage": "https://copytrack.io" }, - "marketcap_usd": 908013, + "marketcap_usd": 940467, "name": "COPYTRACK", "network": "eth", "shortcut": "CPY", @@ -3400,7 +3400,7 @@ "links": { "Homepage": "https://bitbounce.io" }, - "marketcap_usd": 9682409, + "marketcap_usd": 11146751, "name": "Credo / Bitbounce", "network": "eth", "shortcut": "CREDO", @@ -3626,7 +3626,7 @@ "Github": "https://github.com/cargoxio", "Homepage": "https://cargox.io" }, - "marketcap_usd": 3571073, + "marketcap_usd": 4051146, "name": "CargoX", "network": "eth", "shortcut": "CXO", @@ -3660,7 +3660,7 @@ "links": { "Homepage": "https://ccrb.io" }, - "marketcap_usd": 1557193, + "marketcap_usd": 1854299, "name": "CryptoCarbon", "network": "eth", "shortcut": "CryptoCarbon", @@ -3694,7 +3694,7 @@ "links": { "Homepage": "https://dadi.cloud" }, - "marketcap_usd": 7093611, + "marketcap_usd": 7334671, "name": "DADI", "network": "eth", "shortcut": "DADI", @@ -3711,7 +3711,7 @@ "links": { "Homepage": "http://www.dalecoin.org" }, - "marketcap_usd": 35219, + "marketcap_usd": 36587, "name": "DaleCoin", "network": "eth", "shortcut": "DALC", @@ -3799,7 +3799,7 @@ "Github": "https://github.com/streamr-dev", "Homepage": "https://www.streamr.com" }, - "marketcap_usd": 48676, + "marketcap_usd": 49496, "name": "DATACoin", "network": "eth", "shortcut": "DATACoin", @@ -3888,7 +3888,7 @@ "Github": "https://github.com/DistributedBanking/DCC", "Homepage": "http://dcc.finance" }, - "marketcap_usd": 14545355, + "marketcap_usd": 14762972, "name": "Distributed Credit Chain", "network": "eth", "shortcut": "DCC", @@ -3923,7 +3923,7 @@ "Github": "https://github.com/Dentacoin", "Homepage": "https://dentacoin.com" }, - "marketcap_usd": 117536664, + "marketcap_usd": 119350093, "name": "Dentacoin", "network": "eth", "shortcut": "DCN", @@ -3993,7 +3993,7 @@ "links": { "Homepage": "https://www.dentwireless.com" }, - "marketcap_usd": 42212426, + "marketcap_usd": 43165155, "name": "DENT", "network": "eth", "shortcut": "DENT", @@ -4011,7 +4011,7 @@ "Github": "https://github.com/digipulseio", "Homepage": "https://www.digipulse.io" }, - "marketcap_usd": 321244, + "marketcap_usd": 303281, "name": "DigiPulse", "network": "eth", "shortcut": "DGPT", @@ -4065,7 +4065,7 @@ "Github": "https://github.com/DigixGlobal", "Homepage": "https://digix.global" }, - "marketcap_usd": 2320653, + "marketcap_usd": 2336269, "name": "Digix Gold Token", "network": "eth", "shortcut": "DGX", @@ -4100,7 +4100,7 @@ "links": { "Homepage": "https://etheroll.com" }, - "marketcap_usd": 4583040, + "marketcap_usd": 4821454, "name": "Etheroll", "network": "eth", "shortcut": "DICE", @@ -4308,7 +4308,7 @@ "Github": "https://github.com/dethertech", "Homepage": "https://dether.io" }, - "marketcap_usd": 2158287, + "marketcap_usd": 2184097, "name": "dether", "network": "eth", "shortcut": "DTH", @@ -4413,7 +4413,7 @@ "Github": "https://github.com/elangindonesia/EagleCoin", "Homepage": "https://eaglepay.io" }, - "marketcap_usd": 85158, + "marketcap_usd": 103304, "name": "EagleCoin", "network": "eth", "shortcut": "EAGLE", @@ -4498,7 +4498,7 @@ "links": { "Homepage": "https://edgeless.io" }, - "marketcap_usd": 26281922, + "marketcap_usd": 26375465, "name": "Edgeless", "network": "eth", "shortcut": "EDG", @@ -4515,7 +4515,7 @@ "links": { "Homepage": "https://eidoo.io" }, - "marketcap_usd": 22786928, + "marketcap_usd": 24809606, "name": "Eidoo", "network": "eth", "shortcut": "EDO", @@ -4622,7 +4622,7 @@ "Github": "https://github.com/eltcoin", "Homepage": "http://www.eltcoin.tech/" }, - "marketcap_usd": 94070, + "marketcap_usd": 101963, "name": "ELTCOIN", "network": "eth", "shortcut": "ELTCOIN", @@ -4799,7 +4799,7 @@ "links": { "Homepage": "https://eos.io" }, - "marketcap_usd": 4378649362, + "marketcap_usd": 4406564332, "name": "EOS", "network": "eth", "shortcut": "EOS", @@ -4852,7 +4852,7 @@ "links": { "Homepage": "https://www.ethbits.com" }, - "marketcap_usd": 1264567, + "marketcap_usd": 1071935, "name": "Ethbits", "network": "eth", "shortcut": "ETBS", @@ -5008,7 +5008,7 @@ "address": "0x5c743a35E903F6c584514ec617ACEe0611Cf44f3", "hidden": 1, "links": {}, - "marketcap_usd": 3128973, + "marketcap_usd": 3341333, "name": "Experty", "network": "eth", "shortcut": "EXY", @@ -5183,7 +5183,7 @@ "Github": "https://github.com/FundRequest", "Homepage": "https://fundrequest.io" }, - "marketcap_usd": 424114, + "marketcap_usd": 436959, "name": "FundRequest", "network": "eth", "shortcut": "FND", @@ -5288,7 +5288,7 @@ "links": { "Homepage": "https://funfair.io" }, - "marketcap_usd": 84604195, + "marketcap_usd": 83784745, "name": "Funfair", "network": "eth", "shortcut": "FUN", @@ -5341,7 +5341,7 @@ "Github": "https://github.com/BlockchainLabsNZ/gambit", "Homepage": "http://gambitcrypto.com" }, - "marketcap_usd": 4463774, + "marketcap_usd": 4540717, "name": "Gambit", "network": "eth", "shortcut": "GAM", @@ -5464,7 +5464,7 @@ "Github": "https://github.com/daostack", "Homepage": "https://daostack.io" }, - "marketcap_usd": 4217214, + "marketcap_usd": 4069602, "name": "DAOstack", "network": "eth", "shortcut": "GEN", @@ -5586,7 +5586,7 @@ "links": { "Homepage": "https://gridplus.io/token-sale" }, - "marketcap_usd": 5392777, + "marketcap_usd": 7586168, "name": "GRID", "network": "eth", "shortcut": "GRID", @@ -5675,7 +5675,7 @@ "Github": "https://github.com/GIFTO-io", "Homepage": "https://gifto.io/" }, - "marketcap_usd": 40480983, + "marketcap_usd": 43157978, "name": "Gifto", "network": "eth", "shortcut": "GTO", @@ -5711,7 +5711,7 @@ "Github": "https://github.com/GenesisVision", "Homepage": "https://genesis.vision" }, - "marketcap_usd": 17718606, + "marketcap_usd": 18476548, "name": "Genesis Vision", "network": "eth", "shortcut": "GVT", @@ -5833,7 +5833,7 @@ "Github": "https://github.com/havven/havven", "Homepage": "https://havven.io" }, - "marketcap_usd": 7598074, + "marketcap_usd": 8074565, "name": "Havven", "network": "eth", "shortcut": "HAV", @@ -5972,7 +5972,7 @@ "links": { "Homepage": "https://github.com/arachnid/hodlcoin" }, - "marketcap_usd": 243671, + "marketcap_usd": 258639, "name": "HODLCoin", "network": "eth", "shortcut": "HODL", @@ -6025,7 +6025,7 @@ "Github": "https://github.com/HiveProjectLTD", "Homepage": "https://hive-project.net" }, - "marketcap_usd": 11523549, + "marketcap_usd": 11450973, "name": "Hive Project", "network": "eth", "shortcut": "HVN", @@ -6164,7 +6164,7 @@ "links": { "Homepage": "https://icos.icobox.io" }, - "marketcap_usd": 1680040, + "marketcap_usd": 1834276, "name": "ICOS", "network": "eth", "shortcut": "ICOS", @@ -6181,7 +6181,7 @@ "links": { "Homepage": "https://www.icon.foundation" }, - "marketcap_usd": 236874502, + "marketcap_usd": 252661135, "name": "ICON", "network": "eth", "shortcut": "ICX", @@ -6215,7 +6215,7 @@ "links": { "Homepage": "https://investfeed.com" }, - "marketcap_usd": 2272269, + "marketcap_usd": 2444515, "name": "InvestFeed", "network": "eth", "shortcut": "IFT", @@ -6350,7 +6350,7 @@ "links": { "Homepage": "https://insights.network" }, - "marketcap_usd": 1854257, + "marketcap_usd": 1815725, "name": "Insights Network", "network": "eth", "shortcut": "INSTAR", @@ -6367,7 +6367,7 @@ "links": { "Homepage": "https://internxt.io" }, - "marketcap_usd": 1477758, + "marketcap_usd": 2262594, "name": "Internxt", "network": "eth", "shortcut": "INXT", @@ -6384,7 +6384,7 @@ "links": { "Homepage": "https://iost.io/" }, - "marketcap_usd": 111592385, + "marketcap_usd": 114256334, "name": "IOSToken", "network": "eth", "shortcut": "IOST", @@ -6491,7 +6491,7 @@ "Github": "https://github.com/IoTChainCode", "Homepage": "https://iotchain.io/" }, - "marketcap_usd": 11158935, + "marketcap_usd": 11570618, "name": "IoT Chain", "network": "eth", "shortcut": "ITC", @@ -6681,7 +6681,7 @@ "Github": "https://github.com/kikinteractive/kin-token", "Homepage": "https://kin.kik.com" }, - "marketcap_usd": 79653286, + "marketcap_usd": 84001995, "name": "Kin Foundation", "network": "eth", "shortcut": "KIN", @@ -6699,7 +6699,7 @@ "Github": "https://github.com/KyberNetwork", "Homepage": "https://kyber.network" }, - "marketcap_usd": 62120697, + "marketcap_usd": 67389590, "name": "Kyber Network", "network": "eth", "shortcut": "KNC", @@ -6735,7 +6735,7 @@ "Github": "https://github.com/Cryptense/", "Homepage": "https://kryll.io/" }, - "marketcap_usd": 505756, + "marketcap_usd": 518539, "name": "Kryll", "network": "eth", "shortcut": "KRL", @@ -6770,7 +6770,7 @@ "Github": "https://github.com/latoken", "Homepage": "https://latoken.com/" }, - "marketcap_usd": 7006186, + "marketcap_usd": 7078045, "name": "LATOKEN", "network": "eth", "shortcut": "LA", @@ -6804,7 +6804,7 @@ "links": { "Homepage": "https://www.leadcoin.network/" }, - "marketcap_usd": 1098068, + "marketcap_usd": 1067444, "name": "LEADCOIN", "network": "eth", "shortcut": "LDC", @@ -6908,7 +6908,7 @@ "links": { "Homepage": "http://www.lifelabs.io" }, - "marketcap_usd": 3025491, + "marketcap_usd": 2913824, "name": "LIFE", "network": "eth", "shortcut": "LIFE", @@ -6960,7 +6960,7 @@ "Github": "https://github.com/lendingblock", "Homepage": "https://lendingblock.com" }, - "marketcap_usd": 1454637, + "marketcap_usd": 1461818, "name": "Lendingblock", "network": "eth", "shortcut": "LND", @@ -6977,7 +6977,7 @@ "links": { "Homepage": "https://LockChain.co" }, - "marketcap_usd": 5259245, + "marketcap_usd": 5203577, "name": "LockChain", "network": "eth", "shortcut": "LOC", @@ -6995,7 +6995,7 @@ "Github": "http://github.com/locipro/loci-coin-sale", "Homepage": "https://locipro.com" }, - "marketcap_usd": 1699666, + "marketcap_usd": 1790128, "name": "LOCIcoin", "network": "eth", "shortcut": "LOCI", @@ -7310,7 +7310,7 @@ "Github": "https://github.com/theembermine", "Homepage": "https://embermine.com/" }, - "marketcap_usd": 235298, + "marketcap_usd": 196722, "name": "Embers", "network": "eth", "shortcut": "MBRS", @@ -7326,7 +7326,7 @@ "address": "0x93E682107d1E9defB0b5ee701C71707a4B2E46Bc", "hidden": 1, "links": {}, - "marketcap_usd": 256534, + "marketcap_usd": 284290, "name": "MCAP", "network": "eth", "shortcut": "MCAP", @@ -7361,7 +7361,7 @@ "links": { "Homepage": "https://mona.co" }, - "marketcap_usd": 66988027, + "marketcap_usd": 67092556, "name": "MCO", "network": "eth", "shortcut": "MCO", @@ -7467,7 +7467,7 @@ "links": { "Homepage": "https://mftu.net" }, - "marketcap_usd": 0, + "marketcap_usd": 67294, "name": "Mainstream For The Underground", "network": "eth", "shortcut": "MFTU", @@ -7573,7 +7573,7 @@ "Github": "https://github.com/modum-io", "Homepage": "https://modum.io" }, - "marketcap_usd": 20182371, + "marketcap_usd": 21046716, "name": "Modum", "network": "eth", "shortcut": "MOD", @@ -7642,7 +7642,7 @@ "links": { "Homepage": "https://mothership.cx" }, - "marketcap_usd": 12737439, + "marketcap_usd": 12972327, "name": "Mothership", "network": "eth", "shortcut": "MSP", @@ -7659,7 +7659,7 @@ "links": { "Homepage": "http://www.monetha.io" }, - "marketcap_usd": 4341562, + "marketcap_usd": 4592888, "name": "Monetha", "network": "eth", "shortcut": "MTH", @@ -7779,7 +7779,7 @@ "Github": "https://github.com/Merculet", "Homepage": "https://www.merculet.io" }, - "marketcap_usd": 2662907, + "marketcap_usd": 3215651, "name": "Merculet", "network": "eth", "shortcut": "MVP", @@ -7829,7 +7829,7 @@ "links": { "Homepage": "https://mysterium.network" }, - "marketcap_usd": 2416335, + "marketcap_usd": 2448689, "name": "Mysterium", "network": "eth", "shortcut": "MYST", @@ -7864,7 +7864,7 @@ "Github": "https://github.com/NANJ-COIN", "Homepage": "https://nanjcoin.com/" }, - "marketcap_usd": 15109367, + "marketcap_usd": 13822722, "name": "NANJCOIN", "network": "eth", "shortcut": "NANJ", @@ -7918,7 +7918,7 @@ "Github": "https://github.com/polyswarm", "Homepage": "https://polyswarm.io" }, - "marketcap_usd": 23945838, + "marketcap_usd": 23345676, "name": "Nectar", "network": "eth", "shortcut": "NCT", @@ -7935,7 +7935,7 @@ "links": { "Homepage": "https://neverdie.com" }, - "marketcap_usd": 956163, + "marketcap_usd": 1408408, "name": "Neverdie", "network": "eth", "shortcut": "NDC", @@ -7970,7 +7970,7 @@ "links": { "Homepage": "https://nimiq.com" }, - "marketcap_usd": 3001681, + "marketcap_usd": 2846290, "name": "NIMIQ", "network": "eth", "shortcut": "NET", @@ -8077,7 +8077,7 @@ "Github": "https://github.com/NperProject", "Homepage": "https://nper.io" }, - "marketcap_usd": 1600353, + "marketcap_usd": 1946971, "name": "NPER", "network": "eth", "shortcut": "NPER", @@ -8129,7 +8129,7 @@ "links": { "Homepage": "https://nuls.io" }, - "marketcap_usd": 54832645, + "marketcap_usd": 57534322, "name": "NULS", "network": "eth", "shortcut": "NULS", @@ -8163,7 +8163,7 @@ "links": { "Homepage": "https://beyond-the-void.net" }, - "marketcap_usd": 1434745, + "marketcap_usd": 1502535, "name": "Nexium", "network": "eth", "shortcut": "NxC", @@ -8197,7 +8197,7 @@ "links": { "Homepage": "https://www.openanx.org/en" }, - "marketcap_usd": 4047027, + "marketcap_usd": 4270504, "name": "OAX", "network": "eth", "shortcut": "OAX", @@ -8411,7 +8411,7 @@ "Github": "https://github.com/OpenSTFoundation", "Homepage": "https://simpletoken.org" }, - "marketcap_usd": 9913162, + "marketcap_usd": 10613704, "name": "Simple Token 'OST'", "network": "eth", "shortcut": "OST", @@ -8429,7 +8429,7 @@ "Github": "https://github.com/owndata", "Homepage": "https://owndata.network" }, - "marketcap_usd": 984523, + "marketcap_usd": 0, "name": "OWNDATA", "network": "eth", "shortcut": "OWN", @@ -8465,7 +8465,7 @@ "Github": "https://github.com/policypalnet", "Homepage": "https://www.policypal.network" }, - "marketcap_usd": 2170673, + "marketcap_usd": 2141433, "name": "PolicyPal Network", "network": "eth", "shortcut": "PAL", @@ -8570,7 +8570,7 @@ "links": { "Homepage": "http://www.tenx.tech" }, - "marketcap_usd": 63076973, + "marketcap_usd": 62355151, "name": "TenX", "network": "eth", "shortcut": "PAY", @@ -8639,7 +8639,7 @@ "Github": "https://github.com/PeculiumPCL/Peculium", "Homepage": "https://peculium.io" }, - "marketcap_usd": 3038802, + "marketcap_usd": 2664106, "name": "Peculium", "network": "eth", "shortcut": "PCL", @@ -8794,7 +8794,7 @@ "links": { "Homepage": "https://polybius.io" }, - "marketcap_usd": 6219258, + "marketcap_usd": 6461014, "name": "Polybius", "network": "eth", "shortcut": "PLBT", @@ -8898,7 +8898,7 @@ "links": { "Homepage": "https://polymath.network" }, - "marketcap_usd": 49502153, + "marketcap_usd": 50284550, "name": "Polymath Network", "network": "eth", "shortcut": "POLY", @@ -8933,7 +8933,7 @@ "Github": "https://github.com/PoSToken", "Homepage": "https://postoken.org" }, - "marketcap_usd": 39260, + "marketcap_usd": 38380, "name": "PoSToken", "network": "eth", "shortcut": "POS", @@ -8967,7 +8967,7 @@ "links": { "Homepage": "https://www.paypie.com" }, - "marketcap_usd": 8724949, + "marketcap_usd": 8815917, "name": "PayPie", "network": "eth", "shortcut": "PPP", @@ -8984,7 +8984,7 @@ "links": { "Homepage": "https://populous.co" }, - "marketcap_usd": 175554738, + "marketcap_usd": 171844299, "name": "Populous", "network": "eth", "shortcut": "PPT", @@ -9001,7 +9001,7 @@ "links": { "Homepage": "https://presearch.io" }, - "marketcap_usd": 13802996, + "marketcap_usd": 14026316, "name": "Presearch", "network": "eth", "shortcut": "PRE", @@ -9054,7 +9054,7 @@ "links": { "Homepage": "https://propy.com" }, - "marketcap_usd": 6960977, + "marketcap_usd": 6902460, "name": "Propy", "network": "eth", "shortcut": "PRO", @@ -9229,7 +9229,7 @@ "links": { "Homepage": "https://liquid.plus" }, - "marketcap_usd": 61234484, + "marketcap_usd": 72836470, "name": "QASH", "network": "eth", "shortcut": "QASH", @@ -9371,7 +9371,7 @@ "Github": "https://github.com/qtumproject", "Homepage": "https://qtum.org/" }, - "marketcap_usd": 360925876, + "marketcap_usd": 366378124, "name": "Qtum", "network": "eth", "shortcut": "QTUM", @@ -9425,7 +9425,7 @@ "Github": "https://github.com/ripio/rcn-token", "Homepage": "https://ripiocredit.network" }, - "marketcap_usd": 9056721, + "marketcap_usd": 9254671, "name": "Ripio Credit Network", "network": "eth", "shortcut": "RCN", @@ -9476,7 +9476,7 @@ "links": { "Homepage": "https://www.rebellious.io" }, - "marketcap_usd": 3165260, + "marketcap_usd": 3233934, "name": "Rebellious", "network": "eth", "shortcut": "REBL", @@ -9494,7 +9494,7 @@ "Github": "https://github.com/red", "Homepage": "https://ico.red-lang.org" }, - "marketcap_usd": 1741390, + "marketcap_usd": 1688379, "name": "Red Community Token", "network": "eth", "shortcut": "RED", @@ -9547,7 +9547,7 @@ "links": { "Homepage": "https://request.network" }, - "marketcap_usd": 28293402, + "marketcap_usd": 29734347, "name": "Request Network", "network": "eth", "shortcut": "REQ", @@ -9582,7 +9582,7 @@ "links": { "Homepage": "https://refereum.com" }, - "marketcap_usd": 10157537, + "marketcap_usd": 10158717, "name": "Refereum", "network": "eth", "shortcut": "RFR", @@ -9634,7 +9634,7 @@ "links": { "Homepage": "http://crowdsale.iex.ec" }, - "marketcap_usd": 32133012, + "marketcap_usd": 35286600, "name": "IEx.ec", "network": "eth", "shortcut": "RLC", @@ -9686,7 +9686,7 @@ "links": { "Homepage": "http://www.relex.io" }, - "marketcap_usd": 2367168, + "marketcap_usd": 2059935, "name": "Relex", "network": "eth", "shortcut": "RLX", @@ -9721,7 +9721,7 @@ "Github": "https://github.com/rocketico", "Homepage": "https://rocketico.io" }, - "marketcap_usd": 19503786, + "marketcap_usd": 21680674, "name": "Rocket Token", "network": "eth", "shortcut": "ROCK", @@ -9823,7 +9823,7 @@ "links": { "Homepage": "https://rivetzintl.com" }, - "marketcap_usd": 3197635, + "marketcap_usd": 3259734, "name": "Rivetz", "network": "eth", "shortcut": "RVT", @@ -9874,7 +9874,7 @@ "links": { "Homepage": "https://saltlending.com" }, - "marketcap_usd": 30053034, + "marketcap_usd": 30970033, "name": "Salt Lending Token", "network": "eth", "shortcut": "SALT", @@ -9891,7 +9891,7 @@ "links": { "Homepage": "https://santiment.net" }, - "marketcap_usd": 36400681, + "marketcap_usd": 37144371, "name": "Santiment", "network": "eth", "shortcut": "SAN", @@ -9942,7 +9942,7 @@ "links": { "Homepage": "https://sensay.it" }, - "marketcap_usd": 1895678, + "marketcap_usd": 1909749, "name": "Sensay", "network": "eth", "shortcut": "SENSE", @@ -10115,7 +10115,7 @@ "links": { "Homepage": "http://smartlands.io" }, - "marketcap_usd": 7836431, + "marketcap_usd": 7817290, "name": "Smartlands", "network": "eth", "shortcut": "SLT", @@ -10202,7 +10202,7 @@ "links": { "Homepage": "https://singulardtv.com" }, - "marketcap_usd": 13317288, + "marketcap_usd": 13356599, "name": "SingularDTV", "network": "eth", "shortcut": "SNGLS", @@ -10305,7 +10305,7 @@ "links": { "Homepage": "https://spankchain.com" }, - "marketcap_usd": 14482485, + "marketcap_usd": 13755901, "name": "SpankChain", "network": "eth", "shortcut": "SPANK", @@ -10494,7 +10494,7 @@ "links": { "Homepage": "https://stktoken.com" }, - "marketcap_usd": 3618184, + "marketcap_usd": 4352499, "name": "STK Token", "network": "eth", "shortcut": "STK", @@ -10529,7 +10529,7 @@ "Github": "https://github.com/Storj", "Homepage": "https://storj.io" }, - "marketcap_usd": 36791912, + "marketcap_usd": 38370023, "name": "STORJ", "network": "eth", "shortcut": "STORJ", @@ -10546,7 +10546,7 @@ "links": { "Homepage": "https://www.stormtoken.com" }, - "marketcap_usd": 34619988, + "marketcap_usd": 36387909, "name": "Storm Token", "network": "eth", "shortcut": "STORM", @@ -10582,7 +10582,7 @@ "Github": "https://github.com/Storiqa/", "Homepage": "https://storiqa.com" }, - "marketcap_usd": 15383152, + "marketcap_usd": 14984412, "name": "Storiqa", "network": "eth", "shortcut": "STQ", @@ -10635,7 +10635,7 @@ "links": { "Homepage": "https://substratum.net" }, - "marketcap_usd": 50880482, + "marketcap_usd": 56199828, "name": "Substratum", "network": "eth", "shortcut": "SUB", @@ -10827,7 +10827,7 @@ "Github": "https://github.com/telcoin", "Homepage": "https://www.telco.in" }, - "marketcap_usd": 20233035, + "marketcap_usd": 18839716, "name": "Telcoin", "network": "eth", "shortcut": "TEL", @@ -10845,7 +10845,7 @@ "Github": "https://github.com/TrueFlip", "Homepage": "https://trueflip.io" }, - "marketcap_usd": 3085871, + "marketcap_usd": 3253929, "name": "TrueFlip", "network": "eth", "shortcut": "TFL", @@ -10862,7 +10862,7 @@ "links": { "Homepage": "https://www.thetatoken.org/" }, - "marketcap_usd": 55785156, + "marketcap_usd": 69141560, "name": "Theta Token", "network": "eth", "shortcut": "THETA", @@ -10915,7 +10915,7 @@ "links": { "Homepage": "https://chronobank.io" }, - "marketcap_usd": 4325207, + "marketcap_usd": 4457546, "name": "Chronobank", "network": "eth", "shortcut": "TIME", @@ -10949,7 +10949,7 @@ "links": { "Homepage": "https://www.blocktix.io" }, - "marketcap_usd": 4868991, + "marketcap_usd": 5045841, "name": "Blocktix", "network": "eth", "shortcut": "TIX", @@ -10966,7 +10966,7 @@ "links": { "Homepage": "https://etherscan.io/token/TokenCard" }, - "marketcap_usd": 10971348, + "marketcap_usd": 10979046, "name": "TokenCard", "network": "eth", "shortcut": "TKN", @@ -11122,7 +11122,7 @@ "links": { "Homepage": "https://taas.fund" }, - "marketcap_usd": 7357318, + "marketcap_usd": 6990027, "name": "Token-as-a-Service", "network": "eth", "shortcut": "TaaS", @@ -11157,7 +11157,7 @@ "links": { "Homepage": "https://uquidcoin.com" }, - "marketcap_usd": 6746339, + "marketcap_usd": 6846702, "name": "Uquid Coin", "network": "eth", "shortcut": "UQC", @@ -11225,7 +11225,7 @@ "Github": "https://github.com/UniversaBlockchain/universa", "Homepage": "https://www.universa.io/" }, - "marketcap_usd": 12764433, + "marketcap_usd": 12287840, "name": "Universa", "network": "eth", "shortcut": "UTN-P", @@ -11312,7 +11312,7 @@ "Github": "https://github.com/blockv", "Homepage": "https://blockv.io" }, - "marketcap_usd": 19072775, + "marketcap_usd": 19228486, "name": "BLOCKv", "network": "eth", "shortcut": "VEE", @@ -11330,7 +11330,7 @@ "Github": "https://github.com/vechain-team", "Homepage": "https://tokensale.vechain.com/en" }, - "marketcap_usd": 782640001, + "marketcap_usd": 791401262, "name": "Vechain", "network": "eth", "shortcut": "VEN", @@ -11399,7 +11399,7 @@ "Github": "https://github.com/Viewly/", "Homepage": "https://view.ly/" }, - "marketcap_usd": 1000485, + "marketcap_usd": 795402, "name": "Viewly", "network": "eth", "shortcut": "VIEW", @@ -11417,7 +11417,7 @@ "Github": "https://github.com/ViceIndustryToken", "Homepage": "https://vicetoken.com/" }, - "marketcap_usd": 1589755, + "marketcap_usd": 1667855, "name": "Vice Industry Token", "network": "eth", "shortcut": "VIT", @@ -11505,7 +11505,7 @@ "links": { "Homepage": "https://veros.org" }, - "marketcap_usd": 165759, + "marketcap_usd": 208801, "name": "Veros", "network": "eth", "shortcut": "VRS", @@ -11540,7 +11540,7 @@ "Github": "https://github.com/waxio", "Homepage": "https://wax.io" }, - "marketcap_usd": 64605085, + "marketcap_usd": 66381362, "name": "WAX", "network": "eth", "shortcut": "WAX", @@ -11592,7 +11592,7 @@ "links": { "Homepage": "https://wepower.network" }, - "marketcap_usd": 9820655, + "marketcap_usd": 10228971, "name": "WePower", "network": "eth", "shortcut": "WCT", @@ -11680,7 +11680,7 @@ "links": { "Homepage": "https://wings.ai" }, - "marketcap_usd": 12900277, + "marketcap_usd": 12843654, "name": "WINGS", "network": "eth", "shortcut": "WINGS", @@ -11853,7 +11853,7 @@ "links": { "Homepage": "https://www.wacoin.io" }, - "marketcap_usd": 6851710, + "marketcap_usd": 7160318, "name": "WaBi", "network": "eth", "shortcut": "WaBi", @@ -11904,7 +11904,7 @@ "links": { "Homepage": "http://www.xaurum.org" }, - "marketcap_usd": 4338705, + "marketcap_usd": 4221839, "name": "Xaurum", "network": "eth", "shortcut": "XAUR", @@ -11922,7 +11922,7 @@ "Github": "https://github.com/blitzpredict", "Homepage": "https://www.blitzpredict.io" }, - "marketcap_usd": 692032, + "marketcap_usd": 702192, "name": "BlitzPredict", "network": "eth", "shortcut": "XBP", @@ -12045,7 +12045,7 @@ "Github": "https://github.com/InkProtocol/", "Homepage": "https://paywithink.com" }, - "marketcap_usd": 2461097, + "marketcap_usd": 2714381, "name": "Ink Protocol", "network": "eth", "shortcut": "XNK", @@ -12062,7 +12062,7 @@ "links": { "Homepage": "https://xenon.network" }, - "marketcap_usd": 834757, + "marketcap_usd": 887202, "name": "XENON", "network": "eth", "shortcut": "XNN", @@ -12167,7 +12167,7 @@ "Github": "https://github.com/zapproject", "Homepage": "https://zap.store" }, - "marketcap_usd": 2015738, + "marketcap_usd": 1918141, "name": "ZAP", "network": "eth", "shortcut": "ZAP", @@ -12184,7 +12184,7 @@ "links": { "Homepage": "https://zsc.io/" }, - "marketcap_usd": 4758614, + "marketcap_usd": 4787352, "name": "Zeusshield", "network": "eth", "shortcut": "ZCS", @@ -12202,7 +12202,7 @@ "Github": "https://github.com/zilliqa", "Homepage": "https://www.zilliqa.com/" }, - "marketcap_usd": 265939621, + "marketcap_usd": 283511706, "name": "Zilliqa", "network": "eth", "shortcut": "ZIL", @@ -12219,7 +12219,7 @@ "links": { "Homepage": "https://www.zmine.com" }, - "marketcap_usd": 5118618, + "marketcap_usd": 5250393, "name": "ZMINE", "network": "eth", "shortcut": "ZMN", @@ -12254,7 +12254,7 @@ "Github": "https://github.com/carVertical", "Homepage": "https://www.carvertical.com" }, - "marketcap_usd": 4535812, + "marketcap_usd": 4641550, "name": "carVertical", "network": "eth", "shortcut": "cV", @@ -12342,7 +12342,7 @@ "Github": "https://github.com/eosdac", "Homepage": "https://eosdac.io/" }, - "marketcap_usd": 15635243, + "marketcap_usd": 15561717, "name": "eosDAC", "network": "eth", "shortcut": "eosDAC", @@ -12376,7 +12376,7 @@ "Github": "https://github.com/havven/havven", "Homepage": "https://www.havven.io" }, - "marketcap_usd": 1150426, + "marketcap_usd": 1155975, "name": "Havven-Backed USD Nomins (nUSD)", "network": "eth", "shortcut": "nUSD", @@ -12410,7 +12410,7 @@ "address": "0x8667559254241ddeD4d11392f868d72092765367", "hidden": 1, "links": {}, - "marketcap_usd": 225631023, + "marketcap_usd": 232368933, "name": "Aeternity", "network": "kov", "shortcut": "Aeternity", @@ -12597,7 +12597,7 @@ "links": { "Homepage": "https://www.qwark.io" }, - "marketcap_usd": 1677629, + "marketcap_usd": 1838322, "name": "QWARK", "network": "ubq", "shortcut": "QWARK", @@ -12630,7 +12630,7 @@ "links": { "Homepage": "https://akroma.io" }, - "marketcap_usd": 728296, + "marketcap_usd": 708616, "name": "Akroma", "shortcut": "AKA", "t1_enabled": "soon", @@ -12660,7 +12660,7 @@ "links": { "Homepage": "https://egem.io" }, - "marketcap_usd": 192203, + "marketcap_usd": 200422, "name": "EtherGem", "shortcut": "EGEM", "t1_enabled": "yes", @@ -12675,7 +12675,7 @@ "links": { "Homepage": "https://ellaism.org" }, - "marketcap_usd": 360888, + "marketcap_usd": 359582, "name": "Ellaism", "shortcut": "ELLA", "t1_enabled": "yes", @@ -12720,7 +12720,7 @@ "links": { "Homepage": "https://ethereumclassic.github.io" }, - "marketcap_usd": 1278880937, + "marketcap_usd": 1291168227, "name": "Ethereum Classic", "shortcut": "ETC", "t1_enabled": "yes", @@ -12735,7 +12735,7 @@ "links": { "Homepage": "https://www.ethereum.org" }, - "marketcap_usd": 27833386307, + "marketcap_usd": 28117892357, "name": "Ethereum", "shortcut": "ETH", "t1_enabled": "yes", @@ -12780,7 +12780,7 @@ "links": { "Homepage": "https://expanse.tech" }, - "marketcap_usd": 4806464, + "marketcap_usd": 4812366, "name": "Expanse", "shortcut": "EXP", "t1_enabled": "yes", @@ -12795,7 +12795,7 @@ "links": { "Homepage": "https://gochain.io" }, - "marketcap_usd": 14231960, + "marketcap_usd": 15095961, "name": "GoChain", "shortcut": "GO", "t1_enabled": "yes", @@ -12810,7 +12810,7 @@ "links": { "Homepage": "https://musicoin.org" }, - "marketcap_usd": 2943759, + "marketcap_usd": 3047841, "name": "Musicoin", "shortcut": "MUSIC", "t1_enabled": "soon", @@ -12825,7 +12825,7 @@ "links": { "Homepage": "https://pirl.io" }, - "marketcap_usd": 2822315, + "marketcap_usd": 2883556, "name": "Pirl", "shortcut": "PIRL", "t1_enabled": "soon", @@ -12855,7 +12855,7 @@ "links": { "Homepage": "https://ubiqsmart.com" }, - "marketcap_usd": 22728959, + "marketcap_usd": 22538702, "name": "Ubiq", "shortcut": "UBQ", "t1_enabled": "yes", @@ -12950,7 +12950,7 @@ "links": { "Homepage": "https://www.cardano.org" }, - "marketcap_usd": 2364387688, + "marketcap_usd": 2393273266, "name": "Cardano", "shortcut": "ADA", "t1_enabled": "no", @@ -12961,7 +12961,7 @@ "links": { "Homepage": "https://lisk.io/" }, - "marketcap_usd": 436815772, + "marketcap_usd": 529722990, "name": "Lisk", "shortcut": "LSK", "t1_enabled": "no", @@ -12972,7 +12972,7 @@ "links": { "Homepage": "https://ont.io" }, - "marketcap_usd": 386602114, + "marketcap_usd": 392083677, "name": "Ontology", "shortcut": "ONT", "t1_enabled": "soon", @@ -12983,7 +12983,7 @@ "links": { "Homepage": "https://www.stellar.org" }, - "marketcap_usd": 3962284892, + "marketcap_usd": 4027996135, "name": "Stellar", "notes": "In development", "shortcut": "XLM", @@ -12995,7 +12995,7 @@ "links": { "Homepage": "https://getmonero.org" }, - "marketcap_usd": 1479564823, + "marketcap_usd": 1470898316, "name": "Monero", "notes": "In development", "shortcut": "XMR", @@ -13007,7 +13007,7 @@ "links": { "Homepage": "https://ripple.com" }, - "marketcap_usd": 12725565953, + "marketcap_usd": 12796422030, "name": "Ripple", "notes": "In development", "shortcut": "XRP", @@ -13019,7 +13019,7 @@ "links": { "Homepage": "https://tezos.com" }, - "marketcap_usd": 781308598, + "marketcap_usd": 796546269, "name": "Tezos", "shortcut": "XTZ", "t1_enabled": "no", @@ -13044,7 +13044,7 @@ "links": { "Homepage": "https://www.dimcoin.io" }, - "marketcap_usd": 5723308, + "marketcap_usd": 5693343, "name": "DIMCOIN", "shortcut": "DIM", "t1_enabled": "yes", @@ -13059,7 +13059,7 @@ "links": { "Homepage": "https://www.dimcoin.io" }, - "marketcap_usd": 5723308, + "marketcap_usd": 5693343, "name": "DIM TOKEN", "shortcut": "DIMTOK", "t1_enabled": "yes", @@ -13101,7 +13101,7 @@ "links": { "Homepage": "https://nem.io" }, - "marketcap_usd": 868084827, + "marketcap_usd": 905209375, "name": "NEM", "shortcut": "XEM", "t1_enabled": "yes", @@ -13113,11 +13113,11 @@ } }, "info": { - "marketcap_usd": 166220074097, + "marketcap_usd": 168706565383, "t1_coins": 635, "t2_coins": 634, - "total_marketcap_usd": 208809779508, - "updated_at": 1535039635, - "updated_at_readable": "Thu Aug 23 17:53:55 2018" + "total_marketcap_usd": 210960655566, + "updated_at": 1535122394, + "updated_at_readable": "Fri Aug 24 16:53:14 2018" } } \ No newline at end of file diff --git a/tools/coins_details.py b/tools/coins_details.py index f28748a5e..c824605c7 100755 --- a/tools/coins_details.py +++ b/tools/coins_details.py @@ -8,6 +8,8 @@ import requests import sys import coin_info +import click + LOG = logging.getLogger(__name__) OPTIONAL_KEYS = ("links", "notes", "wallet") @@ -17,54 +19,55 @@ OVERRIDES = coin_info.load_json("coins_details.override.json") VERSIONS = coin_info.latest_releases() COINMAKETCAP_CACHE = os.path.join(os.path.dirname(__file__), "coinmarketcap.json") +COINMARKETCAP_API_BASE = "https://pro-api.coinmarketcap.com/v1/" + +MARKET_CAPS = {} + + +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() -COINMARKETCAP_TICKERS_URL = ( - "https://api.coinmarketcap.com/v2/ticker/?start={}&convert=USD&limit=100" -) -COINMARKETCAP_GLOBAL_URL = "https://api.coinmarketcap.com/v2/global/" +def coinmarketcap_init(api_key, refresh=None): + global MARKET_CAPS -def coinmarketcap_init(): + force_refresh = refresh is True + disable_refresh = refresh is False try: mtime = os.path.getmtime(COINMAKETCAP_CACHE) - if mtime > time.time() - 3600: + 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: - return json.load(f) - except Exception: - pass + 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 - print("Updating coins from coinmarketcap") - total = None - ctr = 0 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) - while total is None or ctr < total: - url = COINMARKETCAP_TICKERS_URL.format(ctr + 1) - data = requests.get(url).json() - - if total is None: - total = data["metadata"]["num_cryptocurrencies"] - ctr += len(data["data"]) - - for coin in data["data"].values(): - slug = coin["website_slug"] - market_cap = coin["quotes"]["USD"]["market_cap"] - if market_cap is not None: - coin_data[slug] = int(market_cap) - - print("Fetched {} of {} coins".format(ctr, total)) - time.sleep(1) + MARKET_CAPS = coin_data with open(COINMAKETCAP_CACHE, "w") as f: - json.dump(coin_data, f) + json.dump(coinmarketcap_data, f) return coin_data -MARKET_CAPS = coinmarketcap_init() - - def marketcap(coin): cap = None if "coinmarketcap_alias" in coin: @@ -82,7 +85,7 @@ def update_marketcaps(coins): coin["marketcap_usd"] = marketcap(coin) or 0 -def summary(coins): +def summary(coins, api_key): t1_coins = 0 t2_coins = 0 supported_marketcap = 0 @@ -101,8 +104,8 @@ def summary(coins): total_marketcap = None try: - ret = requests.get(COINMARKETCAP_GLOBAL_URL).json() - total_marketcap = int(ret["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 @@ -117,8 +120,8 @@ def summary(coins): def _is_supported(support, trezor_version): - version = VERSIONS[str(trezor_version)] - nominal = support.get("trezor" + str(trezor_version)) + version = VERSIONS[trezor_version] + nominal = support.get(trezor_version) if nominal is None: return "no" elif isinstance(nominal, bool): @@ -228,7 +231,6 @@ def check_missing_data(coins): for k, coin in coins.items(): hide = False - print(coin) if "Homepage" not in coin.get("links", {}): print("%s: Missing homepage" % k) hide = True @@ -271,7 +273,7 @@ def check_missing_data(coins): def apply_overrides(coins): for key, override in OVERRIDES.items(): if key not in coins: - LOG.warning("override without coin: {}".format(key)) + LOG.warning(f"override without coin: {key}") continue def recursive_update(orig, new): @@ -286,7 +288,13 @@ def apply_overrides(coins): recursive_update(coin, override) -if __name__ == "__main__": +@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) @@ -294,6 +302,8 @@ if __name__ == "__main__": 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) @@ -308,9 +318,13 @@ if __name__ == "__main__": update_marketcaps(coins) check_missing_data(coins) - info = summary(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() From 334c5eed32bc768cfb8ba6887fbea3438656cad0 Mon Sep 17 00:00:00 2001 From: matejcik Date: Fri, 24 Aug 2018 17:11:00 +0200 Subject: [PATCH 50/50] support: fix duplicate checking bug, update data after merge --- defs/coins_details.json | 21 ++++++++++++++++++--- defs/support.json | 2 ++ tools/support.py | 2 +- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/defs/coins_details.json b/defs/coins_details.json index b04182da8..e768e856e 100644 --- a/defs/coins_details.json +++ b/defs/coins_details.json @@ -12641,6 +12641,21 @@ "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" @@ -13116,8 +13131,8 @@ "marketcap_usd": 168706565383, "t1_coins": 635, "t2_coins": 634, - "total_marketcap_usd": 210960655566, - "updated_at": 1535122394, - "updated_at_readable": "Fri Aug 24 16:53:14 2018" + "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/support.json b/defs/support.json index 8f3ac2b30..d961fce26 100644 --- a/defs/support.json +++ b/defs/support.json @@ -678,6 +678,7 @@ "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", @@ -1487,6 +1488,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", diff --git a/tools/support.py b/tools/support.py index 0d0ab5390..969b5d5e6 100755 --- a/tools/support.py +++ b/tools/support.py @@ -129,7 +129,7 @@ def find_unsupported_coins(coins_dict): result[device] = [] for key, coin in coins_dict.items(): - if coin.get("duplicate"): + if coin.get("duplicate") and coin_info.is_token(coin): continue if key not in support_set: result[device].append(coin)