From 9f928e4014d85c9dfc9571191e70114322c22147 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Thu, 17 May 2018 14:32:30 +0200 Subject: [PATCH 01/21] Use mycrypto script to import all tokens as JSON --- package.json | 10 +- scripts/travis.sh | 2 +- scripts/updateTokens/README.md | 7 + scripts/updateTokens/index.ts | 1 + scripts/updateTokens/tsconfig.json | 7 + scripts/updateTokens/types/CommitStatus.ts | 31 + scripts/updateTokens/types/GitCommit.ts | 90 + scripts/updateTokens/types/Token.ts | 6 + scripts/updateTokens/types/TokensJson.ts | 20 + scripts/updateTokens/update-tokens-utils.ts | 145 + scripts/updateTokens/update-tokens.ts | 85 + src/assets/tokens/eth.json | 3212 +++++++++++++++++++ yarn.lock | 44 +- 13 files changed, 3649 insertions(+), 11 deletions(-) create mode 100644 scripts/updateTokens/README.md create mode 100644 scripts/updateTokens/index.ts create mode 100644 scripts/updateTokens/tsconfig.json create mode 100644 scripts/updateTokens/types/CommitStatus.ts create mode 100644 scripts/updateTokens/types/GitCommit.ts create mode 100644 scripts/updateTokens/types/Token.ts create mode 100644 scripts/updateTokens/types/TokensJson.ts create mode 100644 scripts/updateTokens/update-tokens-utils.ts create mode 100644 scripts/updateTokens/update-tokens.ts create mode 100644 src/assets/tokens/eth.json diff --git a/package.json b/package.json index f96d9dd7..464cbb0d 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,7 @@ "API", "Light", "Light Client", - "Parity", - "Promise" + "Parity" ], "homepage": "./", "parity": { @@ -32,17 +31,18 @@ "build-electron": "webpack --config electron/webpack.config.js", "build-js": "react-app-rewired build", "electron": "npm run build && electron build/electron.js --light", - "lint": "semistandard 'src/**/*.js' 'electron/**/*.js' --parser babel-eslint", + "lint": "semistandard 'src/**/*.js' 'electron/**/*.js' 'scripts/*.js' --parser babel-eslint", "prebuild": "rimraf build/", "start": "npm-run-all -p watch-css start-js", "start-electron": "electron electron/ --ui-dev --light --ws-origins all", "start-js": "react-app-rewired start", "test": "echo Skipped.", + "update-tokens": "ts-node --project scripts/updateTokens/tsconfig.json scripts/updateTokens", "watch-css": "npm run build-css -- --watch --recursive" }, "dependencies": { "@parity/api": "^2.1.22", - "@parity/light.js": "https://github.com/parity-js/light.js#c531c68b5268a1bf7aba1f43424f440b2bde7828", + "@parity/light.js": "https://github.com/parity-js/light.js#369b6c72b3dc3c6cdf22e333aa4053d01b357a19", "axios": "^0.18.0", "commander": "^2.15.1", "electron": "^2.0.0", @@ -68,6 +68,8 @@ "react-app-rewired": "^1.5.2", "rimraf": "^2.6.2", "semistandard": "^12.0.1", + "ts-node": "^6.0.3", + "typescript": "^2.8.3", "webpack": "^4.7.0", "webpack-cli": "^2.1.2" } diff --git a/scripts/travis.sh b/scripts/travis.sh index 89ee713a..10408190 100755 --- a/scripts/travis.sh +++ b/scripts/travis.sh @@ -1,7 +1,7 @@ #!/bin/bash # Copyright 2015-2018 Parity Technologies (UK) Ltd. # This file is part of Parity. - +# # SPDX-License-Identifier: MIT set -e diff --git a/scripts/updateTokens/README.md b/scripts/updateTokens/README.md new file mode 100644 index 00000000..dba63f84 --- /dev/null +++ b/scripts/updateTokens/README.md @@ -0,0 +1,7 @@ +# Update Tokens Script + +This folder contains a script which will fetch all the tokens from https://github.com/ethereum-lists/tokens, and output all the tokens in a nice JSON file. + +This entire folder has been taken from https://github.com/MyCryptoHQ/MyCrypto/tree/574c628e6189de5b7848c4c10258bc22f42b337c/scripts. Thank you MyCrypto for this. + +Please also see [this PR](https://github.com/MyCryptoHQ/MyCrypto/pull/1247) for a description of this script. diff --git a/scripts/updateTokens/index.ts b/scripts/updateTokens/index.ts new file mode 100644 index 00000000..543a2c86 --- /dev/null +++ b/scripts/updateTokens/index.ts @@ -0,0 +1 @@ +require('./update-tokens'); diff --git a/scripts/updateTokens/tsconfig.json b/scripts/updateTokens/tsconfig.json new file mode 100644 index 00000000..7d4c94ef --- /dev/null +++ b/scripts/updateTokens/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "lib": [ + "es2015" + ] + } +} \ No newline at end of file diff --git a/scripts/updateTokens/types/CommitStatus.ts b/scripts/updateTokens/types/CommitStatus.ts new file mode 100644 index 00000000..8ec09992 --- /dev/null +++ b/scripts/updateTokens/types/CommitStatus.ts @@ -0,0 +1,31 @@ +export interface Creator { + login: string; + id: number; + avatar_url: string; + gravatar_id: string; + url: string; + html_url: string; + followers_url: string; + following_url: string; + gists_url: string; + starred_url: string; + subscriptions_url: string; + organizations_url: string; + repos_url: string; + events_url: string; + received_events_url: string; + type: string; + site_admin: boolean; +} + +export interface CommitStatus { + url: string; + id: number; + state: string; + description: string; + target_url: string; + context: string; + created_at: Date; + updated_at: Date; + creator: Creator; +} diff --git a/scripts/updateTokens/types/GitCommit.ts b/scripts/updateTokens/types/GitCommit.ts new file mode 100644 index 00000000..5b876e3e --- /dev/null +++ b/scripts/updateTokens/types/GitCommit.ts @@ -0,0 +1,90 @@ +export interface Author { + name: string; + email: string; + date: Date; +} + +export interface Committer { + name: string; + email: string; + date: Date; +} + +export interface Tree { + sha: string; + url: string; +} + +export interface Verification { + verified: boolean; + reason: string; + signature?: any; + payload?: any; +} + +export interface Commit { + author: Author; + committer: Committer; + message: string; + tree: Tree; + url: string; + comment_count: number; + verification: Verification; +} + +export interface Author2 { + login: string; + id: number; + avatar_url: string; + gravatar_id: string; + url: string; + html_url: string; + followers_url: string; + following_url: string; + gists_url: string; + starred_url: string; + subscriptions_url: string; + organizations_url: string; + repos_url: string; + events_url: string; + received_events_url: string; + type: string; + site_admin: boolean; +} + +export interface Committer2 { + login: string; + id: number; + avatar_url: string; + gravatar_id: string; + url: string; + html_url: string; + followers_url: string; + following_url: string; + gists_url: string; + starred_url: string; + subscriptions_url: string; + organizations_url: string; + repos_url: string; + events_url: string; + received_events_url: string; + type: string; + site_admin: boolean; +} + +export interface Parent { + sha: string; + url: string; + html_url: string; +} + +export interface GitCommit { + sha: string; + commit: Commit; + url: string; + html_url: string; + comments_url: string; + author: Author2; + committer: Committer2; + parents: Parent[]; +} diff --git a/scripts/updateTokens/types/Token.ts b/scripts/updateTokens/types/Token.ts new file mode 100644 index 00000000..6d4a9a10 --- /dev/null +++ b/scripts/updateTokens/types/Token.ts @@ -0,0 +1,6 @@ +export interface Token { + address: string; + symbol: string; + decimal: number; + error?: string | null; +} diff --git a/scripts/updateTokens/types/TokensJson.ts b/scripts/updateTokens/types/TokensJson.ts new file mode 100644 index 00000000..b7da1b7b --- /dev/null +++ b/scripts/updateTokens/types/TokensJson.ts @@ -0,0 +1,20 @@ +export interface RawTokenJSON { + name?: string; + symbol?: string; + address?: string; + decimals?: number | string; +} + +export interface ValidatedTokenJSON { + name: string; + symbol: string; + address: string; + decimals: number | string; +} + +export interface NormalizedTokenJSON { + name: string; + symbol: string; + address: string; + decimal: number; +} diff --git a/scripts/updateTokens/update-tokens-utils.ts b/scripts/updateTokens/update-tokens-utils.ts new file mode 100644 index 00000000..24351079 --- /dev/null +++ b/scripts/updateTokens/update-tokens-utils.ts @@ -0,0 +1,145 @@ +import { + RawTokenJSON, + ValidatedTokenJSON, + NormalizedTokenJSON +} from './types/TokensJson'; +import { Token } from './types/Token'; +interface StrIdx { + [key: string]: T; +} + +function processTokenJson(tokensJson: RawTokenJSON[]): Token[] { + const normalizedTokens = tokensJson + .map(validateTokenJSON) + .map(normalizeTokenJSON); + checkForDuplicateAddresses(normalizedTokens); + return handleDuplicateSymbols(normalizedTokens).map( + ({ name: _, ...rest }) => rest + ); +} + +function validateTokenJSON(token: RawTokenJSON): ValidatedTokenJSON { + const isValid = (t: RawTokenJSON): t is ValidatedTokenJSON => + !!(t.address && (t.decimals || t.decimals === 0) && t.name && t.symbol); + + if (isValid(token)) { + return token; + } + throw Error(`Token failed validation, missing part of schema + Symbol: ${token.symbol} + Name: ${token.name} + Address: ${token.address} + Decimals: ${token.decimals}`); +} + +function normalizeTokenJSON(token: ValidatedTokenJSON): NormalizedTokenJSON { + const { address, decimals, symbol, name } = token; + const t: NormalizedTokenJSON = { address, symbol, decimal: +decimals, name }; + return t; +} + +/** + * + * @description Checks for any duplicated addresses and halts the program if so + * @param {NormalizedTokenJSON[]} tokens + */ +function checkForDuplicateAddresses(tokens: NormalizedTokenJSON[]) { + const map: StrIdx = {}; + const errors: string[] = []; + for (const token of tokens) { + const { address } = token; + // We might want to strip hex prefixes here, and make all characters lowercase + if (map[address]) { + errors.push( + `Token ${token.symbol} has a duplicate address of ${token.address}` + ); + } + map[address] = true; + } + + if (errors.length) { + const err = errors.join('\n'); + throw Error(err); + } +} + +/** + * + * @description Finds any duplicated names in the fetched token json + * @param {NormalizedTokenJSON[]} tokens + * @returns + */ +function getDuplicatedNames(tokens: NormalizedTokenJSON[]) { + const checkedNames: StrIdx = {}; + const duplicatedNames: StrIdx = {}; + for (const token of tokens) { + const { name } = token; + if (checkedNames[name]) { + duplicatedNames[name] = true; + } + checkedNames[name] = true; + } + return duplicatedNames; +} + +/** + * + * @description Handles any tokens with duplicated symbols by placing them in a map with each value being a bucket + * of other tokens with the same symbol, then renaming them appropriately so they do not conflict anymore + * @param {NormalizedTokenJSON[]} tokens + * @returns + */ +function handleDuplicateSymbols(tokens: NormalizedTokenJSON[]) { + // start by building a map of symbols => tokens + const map = new Map(); + for (const token of tokens) { + const { symbol } = token; + const v = map.get(symbol); + if (v) { + map.set(symbol, [...v, token]); + } else { + map.set(symbol, [token]); + } + } + const duplicatedNames = getDuplicatedNames(tokens); + const dedupedTokens: NormalizedTokenJSON[] = []; + map.forEach(tokenBucket => + dedupedTokens.push(...renameSymbolCollisions(tokenBucket, duplicatedNames)) + ); + return dedupedTokens; +} + +/** + * + * @description Any token collisions are handled in this manner: + * 1) If the name isnt a duplicate, the token symbol is prefixed with the token name + * 2) if it is a duplicate, then we simply use the token index + 1 (so we dont start at 0) + * @param {NormalizedTokenJSON[]} tokens + * @param {StrIdx} duplicatedNames + * @returns + */ +function renameSymbolCollisions( + tokens: NormalizedTokenJSON[], + duplicatedNames: StrIdx +) { + const renamedTokens: NormalizedTokenJSON[] = []; + if (tokens.length === 1) { + return tokens; + } + + return tokens.reduce((prev, curr, idx) => { + const newName = `${curr.symbol} (${duplicatedNames[curr.name] + ? idx + 1 + : curr.name})`; + const tokenToInsert: NormalizedTokenJSON = { + ...curr, + symbol: newName + }; + console.warn( + `WARN: "${curr.symbol}" has a duplicate symbol, renaming to "${newName}"` + ); + return [...prev, tokenToInsert]; + }, renamedTokens); +} + +module.exports = { processTokenJson }; diff --git a/scripts/updateTokens/update-tokens.ts b/scripts/updateTokens/update-tokens.ts new file mode 100644 index 00000000..fdaa1689 --- /dev/null +++ b/scripts/updateTokens/update-tokens.ts @@ -0,0 +1,85 @@ +import { GitCommit } from './types/GitCommit'; +import { CommitStatus } from './types/CommitStatus'; +import { RawTokenJSON } from './types/TokensJson'; + +const { processTokenJson } = require('./update-tokens-utils'); +const https = require('https'); +const fs = require('fs'); +const path = require('path'); + +function httpsGet(opts: any): Promise { + return new Promise(resolve => { + https.get(opts, (res: any) => { + let body = ''; + res.setEncoding('utf8'); + res.on('data', (data: any) => (body += data)); + res.on('end', () => { + resolve(body); + }); + }); + }); +} + +function githubApi(pathTail: string): Promise { + return httpsGet({ + hostname: 'api.github.com', + path: `/repos/ethereum-lists/tokens${pathTail}`, + headers: { + 'user-agent': 'node', + 'content-type': 'application/json; charset=utf-8' + } + }).then(body => JSON.parse(body)); +} + +async function run() { + // First we fetch the latest commit from ethereum-lists/tokens + console.log('Fetching ethereum-lists/tokens commits...'); + const commits = await githubApi('/commits'); + const commit = commits[0]; + + // Then we fetch its build status + console.log('Fetching commits statuses...'); + const statuses = await githubApi(`/statuses/${commit.sha}`); + + // Fetch the IPFS link, which is a page of links to other IPFS links + console.log('Fetching IPFS output HTML...'); + const ipfsUrl = statuses.find(status => status.target_url.includes('ipfs')); + if (!ipfsUrl) { + throw Error('ipfs url not found'); + } + const ipfsTargetUrl = ipfsUrl.target_url; + const ipfsHtml = await httpsGet(ipfsTargetUrl); + + // Get the IPFS url for the eth tokens json. Regexxing HTML hurts, but w/e + console.log('Fetching IPFS ETH Tokens JSON...'); + const tokenUrlMatch = ipfsHtml.match( + /output\/minified\/eth\.json<\/a>/ + ); + if (!tokenUrlMatch) { + throw Error('No match found for token url'); + } + const tokensUrl = tokenUrlMatch[1]; + const tokensJson: RawTokenJSON[] = JSON.parse(await httpsGet(tokensUrl)); + + // Format the json to match our format in common/config/tokens/eth.json + const tokens = processTokenJson(tokensJson); + + // Write to the file + console.log('Writing Tokens JSON to common/config/tokens/eth.json...'); + const filePath = path.resolve(__dirname, '../../src/assets/tokens/eth.json'); + fs.writeFile( + filePath, + JSON.stringify(tokens, null, 2), + 'utf8', + (err: any) => { + if (err) { + console.error(err); + throw new Error('Failed to write tokens json to file, see above error'); + } + + console.log('Succesfully imported', tokens.length, 'tokens!'); + } + ); +} + +run(); diff --git a/src/assets/tokens/eth.json b/src/assets/tokens/eth.json new file mode 100644 index 00000000..e285c718 --- /dev/null +++ b/src/assets/tokens/eth.json @@ -0,0 +1,3212 @@ +[ + { + "address": "0x4CEdA7906a5Ed2179785Cd3A40A69ee8bc99C466", + "symbol": "AION", + "decimal": 8 + }, + { + "address": "0x667088b212ce3d06a1b553a7221E1fD19000d9aF", + "symbol": "WINGS", + "decimal": 18 + }, + { + "address": "0xf6cFe53d6FEbaEEA051f400ff5fc14F0cBBDacA1", + "symbol": "DGPT", + "decimal": 18 + }, + { + "address": "0xf230b790E05390FC8295F4d3F60332c93BEd42e2", + "symbol": "TRX", + "decimal": 6 + }, + { + "address": "0x408e41876cCCDC0F92210600ef50372656052a38", + "symbol": "REN", + "decimal": 18 + }, + { + "address": "0x37427576324fE1f3625c9102674772d7CF71377d", + "symbol": "SGT (SelfieYo Gold Token)", + "decimal": 18 + }, + { + "address": "0xd248B0D48E44aaF9c49aea0312be7E13a6dc1468", + "symbol": "SGT (SGT)", + "decimal": 1 + }, + { + "address": "0x78B7FADA55A64dD895D8c8c35779DD8b67fA8a05", + "symbol": "ATL", + "decimal": 18 + }, + { + "address": "0xFAd572db566E5234AC9Fc3d570c4EdC0050eAA92", + "symbol": "BTH", + "decimal": 18 + }, + { + "address": "0x78fE18e41f436e1981a3a60D1557c8a7a9370461", + "symbol": "SCANDI", + "decimal": 2 + }, + { + "address": "0x84543F868eC1b1FAC510d49d13C069f64cD2d5f9", + "symbol": "Hdp.ф", + "decimal": 18 + }, + { + "address": "0xaeC2E87E0A235266D9C5ADc9DEb4b2E29b54D009", + "symbol": "SNGLS", + "decimal": 0 + }, + { + "address": "0x515669d308f887Fd83a471C7764F5d084886D34D", + "symbol": "MUXE", + "decimal": 18 + }, + { + "address": "0x025abAD9e518516fdaAFBDcdB9701b37fb7eF0FA", + "symbol": "GTKT", + "decimal": 0 + }, + { + "address": "0xb0D926c1BC3d78064F3e1075D5bD9A24F35Ae6C5", + "symbol": "ARXT", + "decimal": 18 + }, + { + "address": "0x46492473755e8dF960F8034877F61732D718CE96", + "symbol": "STRC", + "decimal": 8 + }, + { + "address": "0x2a8E98e256f32259b5E5Cb55Dd63C8e891950666", + "symbol": "PTC", + "decimal": 18 + }, + { + "address": "0x41e5560054824eA6B0732E656E3Ad64E20e94E45", + "symbol": "CVC", + "decimal": 8 + }, + { + "address": "0x4162178B78D6985480A308B2190EE5517460406D", + "symbol": "CLN", + "decimal": 18 + }, + { + "address": "0x6BEB418Fc6E1958204aC8baddCf109B8E9694966", + "symbol": "LNC-Linker Coin", + "decimal": 18 + }, + { + "address": "0xBf4cFD7d1eDeeEA5f6600827411B41A21eB08abd", + "symbol": "CTL", + "decimal": 2 + }, + { + "address": "0x7A41e0517a5ecA4FdbC7FbebA4D4c47B9fF6DC63", + "symbol": "ZCS", + "decimal": 18 + }, + { + "address": "0xbe99B09709fc753b09BCf557A992F6605D5997B0", + "symbol": "RLTY", + "decimal": 8 + }, + { + "address": "0x4A42d2c580f83dcE404aCad18dab26Db11a1750E", + "symbol": "RLX", + "decimal": 18 + }, + { + "address": "0x54b293226000ccBFC04DF902eEC567CB4C35a903", + "symbol": "RTN", + "decimal": 18 + }, + { + "address": "0xD8912C10681D8B21Fd3742244f44658dBA12264E", + "symbol": "PLU", + "decimal": 18 + }, + { + "address": "0x3a1Bda28AdB5B0a812a7CF10A1950c920F79BcD3", + "symbol": "FLP", + "decimal": 18 + }, + { + "address": "0x814CAfd4782d2e728170FDA68257983F03321c58", + "symbol": "IDEA", + "decimal": 0 + }, + { + "address": "0x2ccbFF3A042c68716Ed2a2Cb0c544A9f1d1935E1", + "symbol": "DMT", + "decimal": 8 + }, + { + "address": "0xF6B55acBBC49f4524Aa48D19281A9A77c54DE10f", + "symbol": "WOLK (Wolk Token)", + "decimal": 18 + }, + { + "address": "0x728781E75735dc0962Df3a51d7Ef47E798A7107E", + "symbol": "WOLK (WOLK)", + "decimal": 18 + }, + { + "address": "0x190e569bE071F40c704e15825F285481CB74B6cC", + "symbol": "FAM", + "decimal": 12 + }, + { + "address": "0x105d97ef2E723f1cfb24519Bc6fF15a6D091a3F1", + "symbol": "UMKA", + "decimal": 4 + }, + { + "address": "0x694404595e3075A942397F466AAcD462FF1a7BD0", + "symbol": "PATENTS", + "decimal": 18 + }, + { + "address": "0x16B0E62aC13a2fAeD36D18bce2356d25Ab3CfAD3", + "symbol": "BTQ", + "decimal": 18 + }, + { + "address": "0x07e3c70653548B04f0A75970C1F81B4CBbFB606f", + "symbol": "DLT", + "decimal": 18 + }, + { + "address": "0x5c6183d10A00CD747a6Dbb5F658aD514383e9419", + "symbol": "NXX OLD", + "decimal": 8 + }, + { + "address": "0x7367A68039d4704f30BfBF6d948020C3B07DFC59", + "symbol": "BCBC", + "decimal": 18 + }, + { + "address": "0x5CA9a71B1d01849C0a95490Cc00559717fCF0D1d", + "symbol": "AE", + "decimal": 18 + }, + { + "address": "0x0D6DD9f68d24EC1d5fE2174f3EC8DAB52B52BaF5", + "symbol": "KC", + "decimal": 18 + }, + { + "address": "0x607F4C5BB672230e8672085532f7e901544a7375", + "symbol": "RLC", + "decimal": 9 + }, + { + "address": "0x6754e21b9EAa053c62d7854dD6561ae451B0cBCf", + "symbol": "GANA", + "decimal": 18 + }, + { + "address": "0xC5bBaE50781Be1669306b9e001EFF57a2957b09d", + "symbol": "GTO", + "decimal": 5 + }, + { + "address": "0x9e88613418cF03dCa54D6a2cf6Ad934A78C7A17A", + "symbol": "SWM", + "decimal": 18 + }, + { + "address": "0x0d88eD6E74bbFD96B831231638b66C05571e824F", + "symbol": "AVT", + "decimal": 18 + }, + { + "address": "0xd26114cd6EE289AccF82350c8d8487fedB8A0C07", + "symbol": "OMG", + "decimal": 18 + }, + { + "address": "0xf9F7c29CFdf19FCf1f2AA6B84aA367Bcf1bD1676", + "symbol": "DTT", + "decimal": 18 + }, + { + "address": "0x78Eb8DC641077F049f910659b6d580E80dC4d237", + "symbol": "SMT (Social Media Market)", + "decimal": 8 + }, + { + "address": "0x55F93985431Fc9304077687a35A1BA103dC1e081", + "symbol": "SMT (SmartMesh)", + "decimal": 18 + }, + { + "address": "0x2dCFAAc11c9EebD8C6C42103Fe9e2a6AD237aF27", + "symbol": "SMT (Smart Node)", + "decimal": 18 + }, + { + "address": "0x82125AFe01819Dff1535D0D6276d57045291B6c0", + "symbol": "MRL", + "decimal": 18 + }, + { + "address": "0x7DD7F56D697Cc0f2b52bD55C057f378F1fE6Ab4b", + "symbol": "$TEAK", + "decimal": 18 + }, + { + "address": "0x68e14bb5A45B9681327E16E528084B9d962C1a39", + "symbol": "CATs (BitClave)_Old", + "decimal": 18 + }, + { + "address": "0x986EE2B944c42D017F52Af21c4c69B84DBeA35d8", + "symbol": "BMX", + "decimal": 18 + }, + { + "address": "0xBA5F11b16B155792Cf3B2E6880E8706859A8AEB6", + "symbol": "ARN", + "decimal": 8 + }, + { + "address": "0x464eBE77c293E473B48cFe96dDCf88fcF7bFDAC0", + "symbol": "KRL", + "decimal": 18 + }, + { + "address": "0x1014613E2B3CBc4d575054D4982E580d9b99d7B1", + "symbol": "BCV", + "decimal": 8 + }, + { + "address": "0xd94F2778e2B3913C53637Ae60647598bE588c570", + "symbol": "PRPS (1)", + "decimal": 18 + }, + { + "address": "0x7641b2Ca9DDD58adDf6e3381c1F994Aac5f1A32f", + "symbol": "PRPS (2)", + "decimal": 18 + }, + { + "address": "0xdd94De9cFE063577051A5eb7465D08317d8808B6", + "symbol": "Devcon2 Token", + "decimal": 0 + }, + { + "address": "0xaFC39788c51f0c1Ff7B55317f3e70299e521Fff6", + "symbol": "eBCH", + "decimal": 8 + }, + { + "address": "0xB8c77482e45F1F44dE1745F52C74426C631bDD52", + "symbol": "BNB", + "decimal": 18 + }, + { + "address": "0x773450335eD4ec3DB45aF74f34F2c85348645D39", + "symbol": "JetCoins", + "decimal": 18 + }, + { + "address": "0xF813F3902bBc00A6DCe378634d3B79D84F9803d7", + "symbol": "PATH", + "decimal": 18 + }, + { + "address": "0x64CdF819d3E75Ac8eC217B3496d7cE167Be42e80", + "symbol": "IPL", + "decimal": 18 + }, + { + "address": "0x7F1E2C7d6A69bf34824D72C53B4550E895C0D8C2", + "symbol": "BOP", + "decimal": 8 + }, + { + "address": "0x2023DCf7c438c8C8C0B0F28dBaE15520B4f3Ee20", + "symbol": "FTR", + "decimal": 18 + }, + { + "address": "0x8d80de8A78198396329dfA769aD54d24bF90E7aa", + "symbol": "NAC", + "decimal": 18 + }, + { + "address": "0xAcfa209Fb73bF3Dd5bBfb1101B9Bc999C49062a5", + "symbol": "BCDT", + "decimal": 18 + }, + { + "address": "0x4672bAD527107471cB5067a887f4656D585a8A31", + "symbol": "DROP (dropil)", + "decimal": 18 + }, + { + "address": "0x13f11C9905A08ca76e3e853bE63D4f0944326C72", + "symbol": "DIVX", + "decimal": 18 + }, + { + "address": "0xe25bCec5D3801cE3a794079BF94adF1B8cCD802D", + "symbol": "MAN", + "decimal": 18 + }, + { + "address": "0x5adc961D6AC3f7062D2eA45FEFB8D8167d44b190", + "symbol": "DTH", + "decimal": 18 + }, + { + "address": "0x86Fa049857E0209aa7D9e616F7eb3b3B78ECfdb0", + "symbol": "EOS", + "decimal": 18 + }, + { + "address": "0x009e864923b49263c7F10D19B7f8Ab7a9A5AAd33", + "symbol": "FKX", + "decimal": 18 + }, + { + "address": "0xb67b88a25708a35AE7c2d736D398D268CE4f7F83", + "symbol": "EMON", + "decimal": 8 + }, + { + "address": "0x7A5fF295Dc8239d5C2374E4D894202aAF029Cab6", + "symbol": "SLT", + "decimal": 3 + }, + { + "address": "0xFc2C4D8f95002C14eD0a7aA65102Cac9e5953b5E", + "symbol": "RBLX", + "decimal": 18 + }, + { + "address": "0xB4EFd85c19999D84251304bDA99E90B92300Bd93", + "symbol": "RPL", + "decimal": 18 + }, + { + "address": "0xEA38eAa3C86c8F9B751533Ba2E562deb9acDED40", + "symbol": "FUEL", + "decimal": 18 + }, + { + "address": "0xDd74a7A3769fA72561B3A69e65968F49748c690c", + "symbol": "ETCH", + "decimal": 18 + }, + { + "address": "0xf04a8ac553FceDB5BA99A64799155826C136b0Be", + "symbol": "FLIXX", + "decimal": 18 + }, + { + "address": "0x181a63746d3Adcf356CBc73aCE22832FFBB1EE5A", + "symbol": "ALCO", + "decimal": 8 + }, + { + "address": "0x5B2e4a700dfBc560061e957edec8F6EeEb74a320", + "symbol": "INS", + "decimal": 10 + }, + { + "address": "0xE0B7927c4aF23765Cb51314A0E0521A9645F0E2A", + "symbol": "DGD", + "decimal": 9 + }, + { + "address": "0xfdcc07Ab60660de533b5Ad26e1457b565a9D59Bd", + "symbol": "MART", + "decimal": 18 + }, + { + "address": "0xEe609fE292128Cad03b786DBb9Bc2634Ccdbe7fC", + "symbol": "POS", + "decimal": 18 + }, + { + "address": "0xfa05A73FfE78ef8f1a739473e462c54bae6567D9", + "symbol": "LUN", + "decimal": 18 + }, + { + "address": "0x21f0F0fD3141Ee9E11B3d7f13a1028CD515f459c", + "symbol": "MRP", + "decimal": 18 + }, + { + "address": "0xe6f74dcfa0E20883008d8C16b6d9a329189D0C30", + "symbol": "FTC", + "decimal": 2 + }, + { + "address": "0xa1ccc166faf0E998b3E33225A1A0301B1C86119D", + "symbol": "SGEL", + "decimal": 18 + }, + { + "address": "0xaEc98A708810414878c3BCDF46Aad31dEd4a4557", + "symbol": "300", + "decimal": 18 + }, + { + "address": "0x16662F73dF3e79e54c6c5938b4313f92C524C120", + "symbol": "IIC", + "decimal": 18 + }, + { + "address": "0xF970b8E36e23F7fC3FD752EeA86f8Be8D83375A6", + "symbol": "RCN", + "decimal": 18 + }, + { + "address": "0x23b75Bc7AaF28e2d6628C3f424B3882F8f072a3c", + "symbol": "VIT", + "decimal": 18 + }, + { + "address": "0xa8006C4ca56F24d6836727D106349320dB7fEF82", + "symbol": "INXT", + "decimal": 8 + }, + { + "address": "0x672a1AD4f667FB18A333Af13667aa0Af1F5b5bDD", + "symbol": "CRED", + "decimal": 18 + }, + { + "address": "0x38c87AA89B2B8cD9B95b736e1Fa7b612EA972169", + "symbol": "AMO", + "decimal": 18 + }, + { + "address": "0xd7631787B4dCc87b1254cfd1e5cE48e96823dEe8", + "symbol": "SCL", + "decimal": 8 + }, + { + "address": "0x55b9a11c2e8351b4Ffc7b11561148bfaC9977855", + "symbol": "DGX", + "decimal": 9 + }, + { + "address": "0x26E75307Fc0C021472fEb8F727839531F112f317", + "symbol": "C20", + "decimal": 18 + }, + { + "address": "0xab95E915c123fdEd5BDfB6325e35ef5515F1EA69", + "symbol": "XNN", + "decimal": 18 + }, + { + "address": "0x2a3Aa9ECA41E720Ed46B5A70D6C37EfA47f768Ac", + "symbol": "RCT", + "decimal": 18 + }, + { + "address": "0x08f5a9235B08173b7569F83645d2c7fB55e8cCD8", + "symbol": "TNT", + "decimal": 8 + }, + { + "address": "0x163733bcc28dbf26B41a8CfA83e369b5B3af741b", + "symbol": "PRS", + "decimal": 18 + }, + { + "address": "0x7FCE2856899a6806eeEf70807985fc7554C66340", + "symbol": "CLP", + "decimal": 9 + }, + { + "address": "0x419c4dB4B9e25d6Db2AD9691ccb832C8D9fDA05E", + "symbol": "DRGN", + "decimal": 18 + }, + { + "address": "0x1245ef80F4d9e02ED9425375e8F649B9221b31D8", + "symbol": "ARCT", + "decimal": 8 + }, + { + "address": "0x818Fc6C2Ec5986bc6E2CBf00939d90556aB12ce5", + "symbol": "KIN", + "decimal": 18 + }, + { + "address": "0x6aEB95F06CDA84cA345c2dE0F3B7f96923a44f4c", + "symbol": "BERRY", + "decimal": 14 + }, + { + "address": "0xB110eC7B1dcb8FAB8dEDbf28f53Bc63eA5BEdd84", + "symbol": "XID", + "decimal": 8 + }, + { + "address": "0xCd4b4b0F3284a33AC49C67961EC6e111708318Cf", + "symbol": "AX1", + "decimal": 5 + }, + { + "address": "0xdAC17F958D2ee523a2206206994597C13D831ec7", + "symbol": "USDT", + "decimal": 6 + }, + { + "address": "0x4D8fc1453a0F359e99c9675954e656D80d996FbF", + "symbol": "BEE", + "decimal": 18 + }, + { + "address": "0x4994e81897a920c0FEA235eb8CEdEEd3c6fFF697", + "symbol": "SKO1", + "decimal": 18 + }, + { + "address": "0x07D9e49Ea402194bf48A8276dAfB16E4eD633317", + "symbol": "DALC", + "decimal": 8 + }, + { + "address": "0x671AbBe5CE652491985342e85428EB1b07bC6c64", + "symbol": "QAU", + "decimal": 8 + }, + { + "address": "0x75Aa7B0d02532f3833b66c7f0Ad35376d373ddF8", + "symbol": "ARD", + "decimal": 18 + }, + { + "address": "0xE477292f1B3268687A29376116B0ED27A9c76170", + "symbol": "PLAY", + "decimal": 18 + }, + { + "address": "0x9a642d6b3368ddc662CA244bAdf32cDA716005BC", + "symbol": "QTUM", + "decimal": 18 + }, + { + "address": "0x080aa07E2C7185150d7e4DA98838A8d2feac3dfC", + "symbol": "BTT", + "decimal": 0 + }, + { + "address": "0x9fC0583220eB44fAeE9e2dc1E63F39204DDD9090", + "symbol": "2DC", + "decimal": 18 + }, + { + "address": "0x0E8d6b471e332F140e7d9dbB99E5E3822F728DA6", + "symbol": "ABYSS", + "decimal": 18 + }, + { + "address": "0xC87c5dD86A3d567fF28701886fB0745aaa898da4", + "symbol": "CTG", + "decimal": 18 + }, + { + "address": "0xfbd0d1c77B501796A35D86cF91d65D9778EeE695", + "symbol": "TWNKL", + "decimal": 3 + }, + { + "address": "0x2AEC18c5500f21359CE1BEA5Dc1777344dF4C0Dc", + "symbol": "FTT", + "decimal": 18 + }, + { + "address": "0xf333b2Ace992ac2bBD8798bF57Bc65a06184afBa", + "symbol": "SND", + "decimal": 0 + }, + { + "address": "0x65Be44C747988fBF606207698c944Df4442efE19", + "symbol": "FUCK (Finally Usable Crypto Karma)", + "decimal": 4 + }, + { + "address": "0xAb16E0d25c06CB376259cc18C1de4ACA57605589", + "symbol": "FUCK (FinallyUsableCryptoKarma)", + "decimal": 4 + }, + { + "address": "0x509A38b7a1cC0dcd83Aa9d06214663D9eC7c7F4a", + "symbol": "BST", + "decimal": 18 + }, + { + "address": "0x006BeA43Baa3f7A6f765F14f10A1a1b08334EF45", + "symbol": "STX", + "decimal": 18 + }, + { + "address": "0x12B306fA98F4CbB8d4457FdFf3a0A0a56f07cCdf", + "symbol": "SXDT", + "decimal": 18 + }, + { + "address": "0x2C3C1F05187dBa7A5f2Dd47Dca57281C4d4F183F", + "symbol": "QTQ", + "decimal": 18 + }, + { + "address": "0x5B09A0371C1DA44A8E24D36Bf5DEb1141a84d875", + "symbol": "MAD", + "decimal": 18 + }, + { + "address": "0x595832F8FC6BF59c85C527fEC3740A1b7a361269", + "symbol": "POWR", + "decimal": 6 + }, + { + "address": "0x42d6622deCe394b54999Fbd73D108123806f6a18", + "symbol": "SPANK", + "decimal": 18 + }, + { + "address": "0x014B50466590340D41307Cc54DCee990c8D58aa8", + "symbol": "ICOS", + "decimal": 6 + }, + { + "address": "0x5884969Ec0480556E11d119980136a4C17eDDEd1", + "symbol": "PET", + "decimal": 18 + }, + { + "address": "0x4DC3643DbC642b72C158E7F3d2ff232df61cb6CE", + "symbol": "AMB", + "decimal": 18 + }, + { + "address": "0xA9877b1e05D035899131DBd1e403825166D09f92", + "symbol": "MNT", + "decimal": 18 + }, + { + "address": "0xcB3F902bf97626391bF8bA87264bbC3DC13469be", + "symbol": "TRC", + "decimal": 18 + }, + { + "address": "0x1a95B271B0535D15fa49932Daba31BA612b52946", + "symbol": "MNE", + "decimal": 8 + }, + { + "address": "0x519475b31653E46D20cD09F9FdcF3B12BDAcB4f5", + "symbol": "VIU", + "decimal": 18 + }, + { + "address": "0x05f4a42e251f2d52b8ed15E9FEdAacFcEF1FAD27", + "symbol": "ZIL", + "decimal": 12 + }, + { + "address": "0xD4CffeeF10F60eCA581b5E1146B5Aca4194a4C3b", + "symbol": "DUBI (1)", + "decimal": 18 + }, + { + "address": "0x9c6Fa42209169bCeA032e401188a6fc3e9C9f59c", + "symbol": "DUBI (2)", + "decimal": 18 + }, + { + "address": "0x3a26746Ddb79B1B8e4450e3F4FFE3285A307387E", + "symbol": "ETHB", + "decimal": 8 + }, + { + "address": "0x68AA3F232dA9bdC2343465545794ef3eEa5209BD", + "symbol": "MSP", + "decimal": 18 + }, + { + "address": "0x6f539a9456A5BCb6334A1A41207c3788f5825207", + "symbol": "OHNI (Ohni)", + "decimal": 18 + }, + { + "address": "0x7F2176cEB16dcb648dc924eff617c3dC2BEfd30d", + "symbol": "OHNI (OHNI)", + "decimal": 0 + }, + { + "address": "0x0947b0e6D821378805c9598291385CE7c791A6B2", + "symbol": "LND", + "decimal": 18 + }, + { + "address": "0x04cC783b450b8D11F3C7d00DD03fDF7FB51fE9F2", + "symbol": "FLMC (1)", + "decimal": 18 + }, + { + "address": "0x5976F7dac1525eF3277836043bA474a35E6B4272", + "symbol": "FLMC (2)", + "decimal": 0 + }, + { + "address": "0xe3818504c1B32bF1557b16C238B2E01Fd3149C17", + "symbol": "PLR", + "decimal": 18 + }, + { + "address": "0x4cE6B362Bc77A24966Dda9078f9cEF81b3B886a7", + "symbol": "NPER", + "decimal": 18 + }, + { + "address": "0x27695E09149AdC738A978e9A678F99E4c39e9eb9", + "symbol": "KICK", + "decimal": 8 + }, + { + "address": "0xA40106134c5bF4c41411554e6db99B95A15ed9d8", + "symbol": "ROCK", + "decimal": 18 + }, + { + "address": "0xa7f976C360ebBeD4465c2855684D1AAE5271eFa9", + "symbol": "TFL", + "decimal": 8 + }, + { + "address": "0x1961B3331969eD52770751fC718ef530838b6dEE", + "symbol": "BDG", + "decimal": 18 + }, + { + "address": "0xb45d7Bc4cEBcAB98aD09BABDF8C818B2292B672c", + "symbol": "HODL", + "decimal": 18 + }, + { + "address": "0xAB6CF87a50F17d7F5E1FEaf81B6fE9FfBe8EBF84", + "symbol": "MRV", + "decimal": 18 + }, + { + "address": "0x08d32b0da63e2C3bcF8019c9c5d849d7a9d791e6", + "symbol": "DCN", + "decimal": 0 + }, + { + "address": "0x6e2050CBFB3eD8A4d39b64cC9f47E711a03a5a89", + "symbol": "SSH", + "decimal": 18 + }, + { + "address": "0x59416A25628A76b4730eC51486114c32E0B582A1", + "symbol": "PLASMA", + "decimal": 6 + }, + { + "address": "0xcbCC0F036ED4788F63FC0fEE32873d6A7487b908", + "symbol": "HMQ", + "decimal": 8 + }, + { + "address": "0x151202C9c18e495656f372281F493EB7698961D5", + "symbol": "DEB", + "decimal": 18 + }, + { + "address": "0xBE11eEb186e624b8f26A5045575a1340E4054552", + "symbol": "CCC (ICONOMI)", + "decimal": 18 + }, + { + "address": "0x075c60EE2cD308ff47873b38Bd9A0Fa5853382c4", + "symbol": "DEEZ", + "decimal": 18 + }, + { + "address": "0x638AC149eA8EF9a1286C41B977017AA7359E6Cfa", + "symbol": "ALTS", + "decimal": 18 + }, + { + "address": "0x8F936fE0faF0604c9C0Ef2406bde0A65365515d6", + "symbol": "WCN", + "decimal": 18 + }, + { + "address": "0xFA1a856Cfa3409CFa145Fa4e20Eb270dF3EB21ab", + "symbol": "IOST", + "decimal": 18 + }, + { + "address": "0x5BC7e5f0Ab8b2E10D2D0a3F21739FCe62459aeF3", + "symbol": "ENTRP", + "decimal": 18 + }, + { + "address": "0x5B0751713b2527d7f002c0c4e2a37e1219610A6B", + "symbol": "HORSE", + "decimal": 18 + }, + { + "address": "0xA3149E0fA0061A9007fAf307074cdCd290f0e2Fd", + "symbol": "PRON", + "decimal": 8 + }, + { + "address": "0x618E75Ac90b12c6049Ba3b27f5d5F8651b0037F6", + "symbol": "QASH", + "decimal": 6 + }, + { + "address": "0xB15fE5a123e647ba594CEa7A1E648646f95EB4AA", + "symbol": "SS (1)", + "decimal": 18 + }, + { + "address": "0xbbFF862d906E348E9946Bfb2132ecB157Da3D4b4", + "symbol": "SS (2)", + "decimal": 18 + }, + { + "address": "0x0Cf0Ee63788A0849fE5297F3407f701E122cC023", + "symbol": "DATACoin", + "decimal": 18 + }, + { + "address": "0xB802b24E0637c2B87D2E8b7784C055BBE921011a", + "symbol": "EMV", + "decimal": 2 + }, + { + "address": "0x9E77D5a1251b6F7D456722A6eaC6D2d5980bd891", + "symbol": "BRAT", + "decimal": 8 + }, + { + "address": "0x22E5F62D0FA19974749faa194e3d3eF6d89c08d7", + "symbol": "IMT", + "decimal": 0 + }, + { + "address": "0x103c3A209da59d3E7C4A89307e66521e081CFDF0", + "symbol": "GVT", + "decimal": 18 + }, + { + "address": "0xEa1f346faF023F974Eb5adaf088BbCdf02d761F4", + "symbol": "TIX", + "decimal": 18 + }, + { + "address": "0xF629cBd94d3791C9250152BD8dfBDF380E2a3B9c", + "symbol": "ENJ", + "decimal": 18 + }, + { + "address": "0x4545750F39aF6Be4F237B6869D4EccA928Fd5A85", + "symbol": "CTF", + "decimal": 18 + }, + { + "address": "0x2bDC0D42996017fCe214b21607a515DA41A9E0C5", + "symbol": "SKIN", + "decimal": 6 + }, + { + "address": "0x2108E62D335Bbdc89eC3E9d8582F18DCFB0cDFf4", + "symbol": "CARCO", + "decimal": 8 + }, + { + "address": "0x17f8aFB63DfcDcC90ebE6e84F060Cc306A98257D", + "symbol": "NBAI", + "decimal": 18 + }, + { + "address": "0x6710c63432A2De02954fc0f851db07146a6c0312", + "symbol": "MFG", + "decimal": 18 + }, + { + "address": "0x65A15014964F2102Ff58647e16a16a6B9E14bCF6", + "symbol": "Ox Fina", + "decimal": 3 + }, + { + "address": "0x17F93475d2A978f527c3f7c44aBf44AdfBa60D5C", + "symbol": "ECO2", + "decimal": 2 + }, + { + "address": "0x7654915A1b82D6D2D0AFc37c52Af556eA8983c7E", + "symbol": "IFT", + "decimal": 18 + }, + { + "address": "0x3136eF851592aCf49CA4C825131E364170FA32b3", + "symbol": "COFI", + "decimal": 18 + }, + { + "address": "0x7585F835ae2d522722d2684323a0ba83401f32f5", + "symbol": "GBT", + "decimal": 18 + }, + { + "address": "0xB70835D7822eBB9426B56543E391846C107bd32C", + "symbol": "GTC", + "decimal": 18 + }, + { + "address": "0xc72fe8e3Dd5BeF0F9f31f259399F301272eF2a2D", + "symbol": "INSTAR", + "decimal": 18 + }, + { + "address": "0xeDBaF3c5100302dCddA53269322f3730b1F0416d", + "symbol": "VRS", + "decimal": 5 + }, + { + "address": "0x2799D90C6d44Cb9Aa5fBC377177F16C33E056b82", + "symbol": "DRP (Dripcoin)", + "decimal": 0 + }, + { + "address": "0x621d78f2EF2fd937BFca696CabaF9A779F59B3Ed", + "symbol": "DRP (DCorp)", + "decimal": 2 + }, + { + "address": "0x0Aaf561eFF5BD9c8F911616933F84166A17cfE0C", + "symbol": "JBX", + "decimal": 0 + }, + { + "address": "0x949bEd886c739f1A3273629b3320db0C5024c719", + "symbol": "AMIS", + "decimal": 9 + }, + { + "address": "0xeD247980396B10169BB1d36f6e278eD16700a60f", + "symbol": "AVA", + "decimal": 4 + }, + { + "address": "0x21aE23B882A340A22282162086bC98D3E2B73018", + "symbol": "LOK", + "decimal": 18 + }, + { + "address": "0xd780Ae2Bf04cD96E577D3D014762f831d97129d0", + "symbol": "EVN", + "decimal": 18 + }, + { + "address": "0x4355fC160f74328f9b383dF2EC589bB3dFd82Ba0", + "symbol": "OPT", + "decimal": 18 + }, + { + "address": "0xC66eA802717bFb9833400264Dd12c2bCeAa34a6d", + "symbol": "OLD_MKR", + "decimal": 18 + }, + { + "address": "0xE50365f5D679CB98a1dd62D6F6e58e59321BcdDf", + "symbol": "LA", + "decimal": 18 + }, + { + "address": "0x7e9e431a0B8c4D532C745B1043c7FA29a48D4fBa", + "symbol": "eosDAC", + "decimal": 18 + }, + { + "address": "0xb5C33F965C8899D255c34CDD2A3efA8AbCbB3DeA", + "symbol": "KPR", + "decimal": 18 + }, + { + "address": "0x1B9743f556D65e757c4c650B4555bAF354cB8bd3", + "symbol": "ETBS", + "decimal": 12 + }, + { + "address": "0xaE4f56F072c34C0a65B3ae3E4DB797D831439D93", + "symbol": "GIM", + "decimal": 8 + }, + { + "address": "0x12FEF5e57bF45873Cd9B62E9DBd7BFb99e32D73e", + "symbol": "CFI", + "decimal": 18 + }, + { + "address": "0x24A77c1F17C547105E14813e517be06b0040aa76", + "symbol": "LIVE", + "decimal": 18 + }, + { + "address": "0x5B8D43FfdE4a2982B9A5387cDF21D54Ead64Ac8d", + "symbol": "MEST", + "decimal": 18 + }, + { + "address": "0xeB7C20027172E5d143fB030d50f91Cece2D1485D", + "symbol": "eBTC", + "decimal": 8 + }, + { + "address": "0x8727c112C712c4a03371AC87a74dD6aB104Af768", + "symbol": "JET", + "decimal": 18 + }, + { + "address": "0x44197A4c44D6A059297cAf6be4F7e172BD56Caaf", + "symbol": "ELTCOIN", + "decimal": 8 + }, + { + "address": "0x10B123FdDde003243199aaD03522065dC05827A0", + "symbol": "SYN", + "decimal": 18 + }, + { + "address": "0xdd007278B667F6bef52fD0a4c23604aA1f96039a", + "symbol": "RIPT", + "decimal": 8 + }, + { + "address": "0xe386B139Ed3715Ca4B18Fd52671bDcea1cdFE4b1", + "symbol": "ZST", + "decimal": 8 + }, + { + "address": "0x23aE3C5B39B12f0693e05435EeaA1e51d8c61530", + "symbol": "APT", + "decimal": 18 + }, + { + "address": "0xAbdf147870235FcFC34153828c769A70B3FAe01F", + "symbol": "EURT", + "decimal": 6 + }, + { + "address": "0xcfb98637bcae43C13323EAa1731cED2B716962fD", + "symbol": "NET", + "decimal": 18 + }, + { + "address": "0x1F573D6Fb3F13d689FF844B4cE37794d79a7FF1C", + "symbol": "BNT", + "decimal": 18 + }, + { + "address": "0x5c543e7AE0A1104f78406C340E9C64FD9fCE5170", + "symbol": "VSL", + "decimal": 18 + }, + { + "address": "0xdd974D5C2e2928deA5F71b9825b8b646686BD200", + "symbol": "KNC", + "decimal": 18 + }, + { + "address": "0x8a187D5285d316bcBC9ADafc08b51d70a0d8e000", + "symbol": "SIFT", + "decimal": 0 + }, + { + "address": "0xfcA47962D45ADFdfd1Ab2D972315dB4ce7CCf094", + "symbol": "IXT", + "decimal": 8 + }, + { + "address": "0x88FCFBc22C6d3dBaa25aF478C578978339BDe77a", + "symbol": "FYN", + "decimal": 18 + }, + { + "address": "0x9B70740e708a083C6fF38Df52297020f5DfAa5EE", + "symbol": "DAN", + "decimal": 10 + }, + { + "address": "0x58bf7df57d9DA7113c4cCb49d8463D4908C735cb", + "symbol": "SPARC", + "decimal": 18 + }, + { + "address": "0x327682779bAB2BF4d1337e8974ab9dE8275A7Ca8", + "symbol": "BPT", + "decimal": 18 + }, + { + "address": "0xfDBc1aDc26F0F8f8606a5d63b7D3a3CD21c22B23", + "symbol": "1WO", + "decimal": 8 + }, + { + "address": "0x66497A283E0a007bA3974e837784C6AE323447de", + "symbol": "PT", + "decimal": 18 + }, + { + "address": "0xcC4eF9EEAF656aC1a2Ab886743E98e97E090ed38", + "symbol": "DDF", + "decimal": 18 + }, + { + "address": "0xF70a642bD387F94380fFb90451C2c81d4Eb82CBc", + "symbol": "STAR", + "decimal": 18 + }, + { + "address": "0x2C974B2d0BA1716E644c1FC59982a89DDD2fF724", + "symbol": "VIB", + "decimal": 18 + }, + { + "address": "0x72D32ac1c5E66BfC5b08806271f8eEF915545164", + "symbol": "KEE", + "decimal": 0 + }, + { + "address": "0x6888a16eA9792c15A4DCF2f6C623D055c8eDe792", + "symbol": "SIG", + "decimal": 18 + }, + { + "address": "0xDF347911910b6c9A4286bA8E2EE5ea4a39eB2134", + "symbol": "BOB", + "decimal": 18 + }, + { + "address": "0x4F4f0Db4de903B88f2B1a2847971E231D54F8fd3", + "symbol": "GEE", + "decimal": 8 + }, + { + "address": "0x72dD4b6bd852A3AA172Be4d6C5a6dbEc588cf131", + "symbol": "NGC", + "decimal": 18 + }, + { + "address": "0xE3Fa177AcecfB86721Cf6f9f4206bd3Bd672D7d5", + "symbol": "CTT", + "decimal": 18 + }, + { + "address": "0x92685E93956537c25Bb75D5d47fca4266dd628B8", + "symbol": "BTL (Bitlle)", + "decimal": 4 + }, + { + "address": "0xdD41fBd1Ae95C5D9B198174A28e04Be6b3d1aa27", + "symbol": "LYS", + "decimal": 8 + }, + { + "address": "0xf3Db5Fa2C66B7aF3Eb0C0b782510816cbe4813b8", + "symbol": "EVX", + "decimal": 4 + }, + { + "address": "0x4cA74185532DC1789527194e5B9c866dD33F4E82", + "symbol": "SenSatorI", + "decimal": 18 + }, + { + "address": "0xc3bC9Eb71f75Ec439A6b6C8E8b746fCF5b62F703", + "symbol": "VOC", + "decimal": 18 + }, + { + "address": "0xe8Ff5C9c75dEb346acAc493C463C8950Be03Dfba", + "symbol": "VIBEX (VIBEX)", + "decimal": 18 + }, + { + "address": "0x882448f83d90B2bf477Af2eA79327fDEA1335D93", + "symbol": "VIBEX (VIBEX Exchange Token)", + "decimal": 18 + }, + { + "address": "0x422866a8F0b032c5cf1DfBDEf31A20F4509562b0", + "symbol": "ADST", + "decimal": 0 + }, + { + "address": "0x697beac28B09E122C4332D163985e8a73121b97F", + "symbol": "QRL", + "decimal": 8 + }, + { + "address": "0x1F54638b7737193FFd86c19Ec51907A7c41755D8", + "symbol": "SOL", + "decimal": 6 + }, + { + "address": "0x123aB195DD38B1b40510d467a6a359b201af056f", + "symbol": "LGO", + "decimal": 8 + }, + { + "address": "0xAd8DD4c725dE1D31b9E8F8D146089e9DC6882093", + "symbol": "MIT (Mychatcoin)", + "decimal": 6 + }, + { + "address": "0xA89b5934863447f6E4Fc53B315a93e873bdA69a3", + "symbol": "LUM", + "decimal": 18 + }, + { + "address": "0xEB9951021698B42e4399f9cBb6267Aa35F82D59D", + "symbol": "LIF", + "decimal": 18 + }, + { + "address": "0xDf6Ef343350780BF8C3410BF062e0C015B1DD671", + "symbol": "BMC", + "decimal": 8 + }, + { + "address": "0x910Dfc18D6EA3D6a7124A6F8B5458F281060fa4c", + "symbol": "X8X", + "decimal": 18 + }, + { + "address": "0xD01DB73E047855Efb414e6202098C4Be4Cd2423B", + "symbol": "UQC", + "decimal": 18 + }, + { + "address": "0x765f0C16D1Ddc279295c1a7C24B0883F62d33F75", + "symbol": "DTX", + "decimal": 18 + }, + { + "address": "0x599346779e90fc3F5F997b5ea715349820F91571", + "symbol": "STN", + "decimal": 4 + }, + { + "address": "0x70b147E01E9285E7cE68B9BA437Fe3a9190E756a", + "symbol": "FLX", + "decimal": 18 + }, + { + "address": "0x554FFc77F4251a9fB3c0E3590a6a205f8d4e067D", + "symbol": "ZMN", + "decimal": 18 + }, + { + "address": "0x888666CA69E0f178DED6D75b5726Cee99A87D698", + "symbol": "ICN", + "decimal": 18 + }, + { + "address": "0x27054b13b1B798B345b591a4d22e6562d47eA75a", + "symbol": "AST", + "decimal": 4 + }, + { + "address": "0x1e797Ce986C3CFF4472F7D38d5C4aba55DfEFE40", + "symbol": "BCDN", + "decimal": 15 + }, + { + "address": "0x65292EeadF1426Cd2dF1C4793a3d7519f253913b", + "symbol": "COSS (1)", + "decimal": 18 + }, + { + "address": "0x9e96604445Ec19fFed9a5e8dd7B50a29C899A10C", + "symbol": "COSS (2)", + "decimal": 18 + }, + { + "address": "0x5102791cA02FC3595398400BFE0e33d7B6C82267", + "symbol": "LDC", + "decimal": 18 + }, + { + "address": "0xB91318F35Bdb262E9423Bc7c7c2A3A93DD93C92C", + "symbol": "NULS", + "decimal": 18 + }, + { + "address": "0x98F5e9b7F0e33956C0443E81bF7deB8B5b1ed545", + "symbol": "SEXY", + "decimal": 18 + }, + { + "address": "0x44F588aEeB8C44471439D1270B3603c66a9262F1", + "symbol": "SNIP", + "decimal": 18 + }, + { + "address": "0x93E682107d1E9defB0b5ee701C71707a4B2E46Bc", + "symbol": "MCAP", + "decimal": 8 + }, + { + "address": "0xb53A96bcBdD9CF78dfF20BAB6C2be7bAec8f00f8", + "symbol": "eGAS", + "decimal": 8 + }, + { + "address": "0xA517a46Baad6B054A76bD19c46844f717fe69fea", + "symbol": "CARB", + "decimal": 8 + }, + { + "address": "0xFA1DE2Ee97e4c10C94C91Cb2b5062b89Fb140b82", + "symbol": "EDC", + "decimal": 6 + }, + { + "address": "0xDDe12a12A6f67156e0DA672be05c374e1B0a3e57", + "symbol": "JOY", + "decimal": 6 + }, + { + "address": "0xEF68e7C694F40c8202821eDF525dE3782458639f", + "symbol": "LRC", + "decimal": 18 + }, + { + "address": "0xc42209aCcC14029c1012fB5680D95fBd6036E2a0", + "symbol": "PPP", + "decimal": 18 + }, + { + "address": "0xd4fa1460F537bb9085d22C7bcCB5DD450Ef28e3a", + "symbol": "PPT", + "decimal": 8 + }, + { + "address": "0x41f615E24fAbd2b097a320E9E6c1f448cb40521c", + "symbol": "RVL", + "decimal": 18 + }, + { + "address": "0x7f6715c3FC4740A02F70De85B9FD50ac6001fEd9", + "symbol": "FANX", + "decimal": 18 + }, + { + "address": "0xa74476443119A942dE498590Fe1f2454d7D4aC0d", + "symbol": "GNT", + "decimal": 18 + }, + { + "address": "0xf44745fBd41F6A1ba151df190db0564c5fCc4410", + "symbol": "CPY", + "decimal": 18 + }, + { + "address": "0xc14830E53aA344E8c14603A91229A0b925b0B262", + "symbol": "PXT", + "decimal": 8 + }, + { + "address": "0x76974C7B79dC8a6a109Fd71fd7cEb9E40eff5382", + "symbol": "DOW (1)", + "decimal": 18 + }, + { + "address": "0xEEF6E90034eEa89E31Eb4B8eaCd323F28A92eaE4", + "symbol": "DOW (2)", + "decimal": 18 + }, + { + "address": "0x9541FD8B9b5FA97381783783CeBF2F5fA793C262", + "symbol": "KZN", + "decimal": 8 + }, + { + "address": "0x994f0DffdbaE0BbF09b652D6f11A493fd33F42B9", + "symbol": "EAGLE", + "decimal": 18 + }, + { + "address": "0x340D2bdE5Eb28c1eed91B2f790723E3B160613B7", + "symbol": "VEE", + "decimal": 18 + }, + { + "address": "0xD0a4b8946Cb52f0661273bfbC6fD0E0C75Fc6433", + "symbol": "STORM", + "decimal": 18 + }, + { + "address": "0xe3831c5A982B279A198456D577cfb90424cb6340", + "symbol": "IMC", + "decimal": 6 + }, + { + "address": "0x45245bc59219eeaAF6cD3f382e078A461FF9De7B", + "symbol": "BKX", + "decimal": 18 + }, + { + "address": "0xeC46f8207D766012454c408De210BCBc2243E71c", + "symbol": "NOX", + "decimal": 18 + }, + { + "address": "0xF4FE95603881D0e07954fD7605E0e9a916e42C44", + "symbol": "WHEN", + "decimal": 18 + }, + { + "address": "0x3EDD235C3E840C1F29286B2e39370a255C7B6fdb", + "symbol": "CMBT", + "decimal": 8 + }, + { + "address": "0xa33e729bf4fdeb868B534e1f20523463D9C46bEe", + "symbol": "ICO", + "decimal": 10 + }, + { + "address": "0xc166038705FFBAb3794185b3a9D925632A1DF37D", + "symbol": "CC3", + "decimal": 18 + }, + { + "address": "0x0C91B015AbA6f7B4738dcD36E7410138b29ADC29", + "symbol": "COIL", + "decimal": 8 + }, + { + "address": "0x85e076361cc813A908Ff672F9BAd1541474402b2", + "symbol": "TEL", + "decimal": 2 + }, + { + "address": "0x62087245087125d3DB5B9A3D713d78E7BBc31e54", + "symbol": "WPC", + "decimal": 18 + }, + { + "address": "0x8Ae4BF2C33a8e667de34B54938B0ccD03Eb8CC06", + "symbol": "PTOY", + "decimal": 8 + }, + { + "address": "0x7d4b8Cce0591C9044a22ee543533b72E976E36C3", + "symbol": "CAG", + "decimal": 18 + }, + { + "address": "0x81c9151de0C8bafCd325a57E3dB5a5dF1CEBf79c", + "symbol": "DAT", + "decimal": 18 + }, + { + "address": "0x1063ce524265d5a3A624f4914acd573dD89ce988", + "symbol": "AIX", + "decimal": 18 + }, + { + "address": "0x6c6EE5e31d828De241282B9606C8e98Ea48526E2", + "symbol": "HOT (HoloToken)", + "decimal": 18 + }, + { + "address": "0x9AF839687F6C94542ac5ece2e317dAAE355493A1", + "symbol": "HOT (Hydro Protocol)", + "decimal": 18 + }, + { + "address": "0x6927C69fb4daf2043fbB1Cb7b86c5661416bea29", + "symbol": "ETR", + "decimal": 18 + }, + { + "address": "0xba2184520A1cC49a6159c57e61E1844E085615B6", + "symbol": "HGT", + "decimal": 8 + }, + { + "address": "0x983F6d60db79ea8cA4eB9968C6aFf8cfA04B3c63", + "symbol": "SNM", + "decimal": 18 + }, + { + "address": "0xfdFE8b7aB6CF1bD1E3d14538Ef40686296C42052", + "symbol": "SKRP (1)", + "decimal": 18 + }, + { + "address": "0x324A48eBCbB46e61993931eF9D35F6697CD2901b", + "symbol": "SKRP (2)", + "decimal": 18 + }, + { + "address": "0x6E34d8d84764D40f6D7b39cd569Fd017bF53177D", + "symbol": "SKRP (3)", + "decimal": 18 + }, + { + "address": "0x423e4322CDDa29156b49a17dfbd2aCC4b280600D", + "symbol": "CAR", + "decimal": 9 + }, + { + "address": "0xb2F7EB1f2c37645bE61d73953035360e768D81E6", + "symbol": "COB", + "decimal": 18 + }, + { + "address": "0x662aBcAd0b7f345AB7FfB1b1fbb9Df7894f18e66", + "symbol": "CTX", + "decimal": 18 + }, + { + "address": "0xf0Ee6b27b759C9893Ce4f094b49ad28fd15A23e4", + "symbol": "ENG", + "decimal": 8 + }, + { + "address": "0x1844b21593262668B7248d0f57a220CaaBA46ab9", + "symbol": "PRL", + "decimal": 18 + }, + { + "address": "0x63e634330A20150DbB61B15648bC73855d6CCF07", + "symbol": "LNC", + "decimal": 18 + }, + { + "address": "0x767bA2915EC344015a7938E3eEDfeC2785195D05", + "symbol": "REA", + "decimal": 18 + }, + { + "address": "0xB9e7F8568e08d5659f5D29C4997173d84CdF2607", + "symbol": "SWT", + "decimal": 18 + }, + { + "address": "0xBDC5bAC39Dbe132B1E030e898aE3830017D7d969", + "symbol": "SNOV", + "decimal": 18 + }, + { + "address": "0x1EC8fE51a9B6A3a6C427D17d9ECC3060fbc4a45c", + "symbol": "S-A-PAT", + "decimal": 18 + }, + { + "address": "0xf6b6AA0Ef0f5Edc2C1c5d925477F97eAF66303e7", + "symbol": "XGG", + "decimal": 8 + }, + { + "address": "0x3618516F45CD3c913F81F9987AF41077932Bc40d", + "symbol": "PCL", + "decimal": 8 + }, + { + "address": "0x6339784d9478dA43106A429196772A029C2f177d", + "symbol": "ATTN", + "decimal": 18 + }, + { + "address": "0x399A0e6FbEb3d74c85357439f4c8AeD9678a5cbF", + "symbol": "DCL", + "decimal": 3 + }, + { + "address": "0xEBf2F9E8De960f64ec0fDCDa6Cb282423133347B", + "symbol": "CNB", + "decimal": 8 + }, + { + "address": "0x5Af2Be193a6ABCa9c8817001F45744777Db30756", + "symbol": "BQX", + "decimal": 8 + }, + { + "address": "0xd341d1680Eeee3255b8C4c75bCCE7EB57f144dAe", + "symbol": "onG", + "decimal": 18 + }, + { + "address": "0x0a9A9ce600D08BF9b76F49FA4e7b38A67EBEB1E6", + "symbol": "GROW", + "decimal": 8 + }, + { + "address": "0xF26ef5E0545384b7Dcc0f297F2674189586830DF", + "symbol": "BSDC", + "decimal": 18 + }, + { + "address": "0xBA187B09fFA8DDdc80d2571eD3cbC4Be0Af69E0c", + "symbol": "DKP", + "decimal": 18 + }, + { + "address": "0x572E6f318056ba0C5d47A422653113843D250691", + "symbol": "XNT", + "decimal": 0 + }, + { + "address": "0x6781a0F84c7E9e846DCb84A9a5bd49333067b104", + "symbol": "ZAP", + "decimal": 18 + }, + { + "address": "0xBDe8f7820b5544a49D34F9dDeaCAbEDC7C0B5adc", + "symbol": "A18", + "decimal": 0 + }, + { + "address": "0xE7775A6e9Bcf904eb39DA2b68c5efb4F9360e08C", + "symbol": "TaaS", + "decimal": 6 + }, + { + "address": "0x4993CB95c7443bdC06155c5f5688Be9D8f6999a5", + "symbol": "ROUND", + "decimal": 18 + }, + { + "address": "0x0235fE624e044A05eeD7A43E16E3083bc8A4287A", + "symbol": "OCC", + "decimal": 18 + }, + { + "address": "0xeC18f898B4076A3E18f1089D33376CC380BDe61D", + "symbol": "PETRO", + "decimal": 18 + }, + { + "address": "0xf028ADEe51533b1B47BEaa890fEb54a457f51E89", + "symbol": "BMT", + "decimal": 18 + }, + { + "address": "0x286BDA1413a2Df81731D4930ce2F862a35A609fE", + "symbol": "WaBi", + "decimal": 18 + }, + { + "address": "0x20F7A3DdF244dc9299975b4Da1C39F8D5D75f05A", + "symbol": "SPN", + "decimal": 6 + }, + { + "address": "0xE5a7c12972f3bbFe70ed29521C8949b8Af6a0970", + "symbol": "BLX (Iconomi)", + "decimal": 18 + }, + { + "address": "0x7cF271966F36343Bf0150F25E5364f7961c58201", + "symbol": "DEPO", + "decimal": 0 + }, + { + "address": "0x5F53f7A8075614b699Baad0bC2c899f4bAd8FBBF", + "symbol": "REBL", + "decimal": 18 + }, + { + "address": "0xC64500DD7B0f1794807e67802F8Abbf5F8Ffb054", + "symbol": "LOCUS", + "decimal": 18 + }, + { + "address": "0x83eEA00D838f92dEC4D1475697B9f4D3537b56E3", + "symbol": "VOISE", + "decimal": 8 + }, + { + "address": "0x6F7A4bac3315B5082F793161a22e26666d22717f", + "symbol": "YEED", + "decimal": 18 + }, + { + "address": "0xC2C63F23ec5E97efbD7565dF9Ec764FDc7d4e91d", + "symbol": "BOU", + "decimal": 18 + }, + { + "address": "0x0F5D2fB29fb7d3CFeE444a200298f468908cC942", + "symbol": "MANA", + "decimal": 18 + }, + { + "address": "0xEf6B4cE8C9Bc83744fbcdE2657b32eC18790458A", + "symbol": "PUC", + "decimal": 0 + }, + { + "address": "0xfFe8196bc259E8dEDc544d935786Aa4709eC3E64", + "symbol": "HDG", + "decimal": 18 + }, + { + "address": "0x83cee9e086A77e492eE0bB93C2B0437aD6fdECCc", + "symbol": "MNTP", + "decimal": 18 + }, + { + "address": "0xBEB9eF514a379B997e0798FDcC901Ee474B6D9A1", + "symbol": "MLN", + "decimal": 18 + }, + { + "address": "0x386Faa4703a34a7Fdb19Bec2e14Fd427C9638416", + "symbol": "DCA", + "decimal": 18 + }, + { + "address": "0x8a77e40936BbC27e80E9a3F526368C967869c86D", + "symbol": "MVP", + "decimal": 18 + }, + { + "address": "0x9E46A38F5DaaBe8683E10793b06749EEF7D733d1", + "symbol": "NCT", + "decimal": 18 + }, + { + "address": "0xE41d2489571d322189246DaFA5ebDe1F4699F498", + "symbol": "ZRX", + "decimal": 18 + }, + { + "address": "0x12480E24eb5bec1a9D4369CaB6a80caD3c0A377A", + "symbol": "SUB", + "decimal": 2 + }, + { + "address": "0xaE73B38d1c9A8b274127ec30160a4927C4d71824", + "symbol": "STK", + "decimal": 18 + }, + { + "address": "0x58ca3065C0F24C7c96Aee8d6056b5B5deCf9c2f8", + "symbol": "GXC", + "decimal": 10 + }, + { + "address": "0x708876f486e448Ee89eB332bFbC8E593553058b9", + "symbol": "GAVEL", + "decimal": 18 + }, + { + "address": "0xEF2E9966eb61BB494E5375d5Df8d67B7dB8A780D", + "symbol": "SHIT", + "decimal": 0 + }, + { + "address": "0xaF4DcE16Da2877f8c9e00544c93B62Ac40631F16", + "symbol": "MTH", + "decimal": 5 + }, + { + "address": "0xdab0C31BF34C897Fb0Fe90D12EC9401caf5c36Ec", + "symbol": "DAB", + "decimal": 0 + }, + { + "address": "0xAf30D2a7E90d7DC361c8C4585e9BB7D2F6f15bc7", + "symbol": "1ST", + "decimal": 18 + }, + { + "address": "0xFcD862985628b254061F7A918035B80340D045d3", + "symbol": "GIF", + "decimal": 18 + }, + { + "address": "0x922aC473A3cC241fD3a0049Ed14536452D58D73c", + "symbol": "VLD", + "decimal": 18 + }, + { + "address": "0xfeDAE5642668f8636A11987Ff386bfd215F942EE", + "symbol": "PAL", + "decimal": 18 + }, + { + "address": "0xdA6cb58A0D0C01610a29c5A65c303e13e885887C", + "symbol": "cV", + "decimal": 18 + }, + { + "address": "0x8eB24319393716668D768dCEC29356ae9CfFe285", + "symbol": "AGI", + "decimal": 8 + }, + { + "address": "0xbc1234552EBea32B5121190356bBa6D3Bb225bb5", + "symbol": "BCL", + "decimal": 18 + }, + { + "address": "0x419D0d8BdD9aF5e606Ae2232ed285Aff190E711b", + "symbol": "FUN", + "decimal": 8 + }, + { + "address": "0xe06eda7435bA749b047380CEd49121ddE93334Ae", + "symbol": "SET", + "decimal": 0 + }, + { + "address": "0x0D262e5dC4A06a0F1c90cE79C7a60C09DfC884E4", + "symbol": "J8T", + "decimal": 8 + }, + { + "address": "0x61725f3db4004AFE014745B21DAb1E1677CC328b", + "symbol": "DAXT", + "decimal": 18 + }, + { + "address": "0x523630976eB6147621B5c31c781eBe2Ec2a806E0", + "symbol": "eUSD", + "decimal": 18 + }, + { + "address": "0xF433089366899D83a9f26A773D59ec7eCF30355e", + "symbol": "MTL", + "decimal": 8 + }, + { + "address": "0xeAb43193CF0623073Ca89DB9B712796356FA7414", + "symbol": "GOLDX", + "decimal": 18 + }, + { + "address": "0x4DF47B4969B2911C966506E3592c41389493953b", + "symbol": "FND", + "decimal": 18 + }, + { + "address": "0x960b236A07cf122663c4303350609A66A7B288C0", + "symbol": "ANT", + "decimal": 18 + }, + { + "address": "0x13F1b7FDFbE1fc66676D56483e21B1ecb40b58E2", + "symbol": "ACC", + "decimal": 18 + }, + { + "address": "0xd4c435F5B09F855C3317c8524Cb1F586E42795fa", + "symbol": "CND", + "decimal": 18 + }, + { + "address": "0xf9F0FC7167c311Dd2F1e21E9204F87EBA9012fB2", + "symbol": "EHT", + "decimal": 8 + }, + { + "address": "0x4E0603e2A27A30480E5e3a4Fe548e29EF12F64bE", + "symbol": "CREDO", + "decimal": 18 + }, + { + "address": "0xc9De4B7F0C3d991e967158E4D4bFA4b51Ec0b114", + "symbol": "ROK", + "decimal": 18 + }, + { + "address": "0x88aC94D5d175130347Fc95E109d77AC09dbF5ab7", + "symbol": "HKY", + "decimal": 18 + }, + { + "address": "0x2467AA6B5A2351416fD4C3DeF8462d841feeecEC", + "symbol": "QBX", + "decimal": 18 + }, + { + "address": "0x5dbe296F97B23C4A6AA6183D73e574D02bA5c719", + "symbol": "LUC", + "decimal": 18 + }, + { + "address": "0xF4c07b1865bC326A3c01339492Ca7538FD038Cc0", + "symbol": "PBT", + "decimal": 4 + }, + { + "address": "0x1e09BD8Cadb441632e441Db3e1D79909EE0A2256", + "symbol": "DSC", + "decimal": 1 + }, + { + "address": "0x056017c55aE7AE32d12AeF7C679dF83A85ca75Ff", + "symbol": "WYV", + "decimal": 18 + }, + { + "address": "0xfF18DBc487b4c2E3222d115952bABfDa8BA52F5F", + "symbol": "LIFE", + "decimal": 18 + }, + { + "address": "0x0AbdAce70D3790235af448C88547603b945604ea", + "symbol": "DNT", + "decimal": 18 + }, + { + "address": "0xF67451Dc8421F0e0afEB52faa8101034ed081Ed9", + "symbol": "GAM", + "decimal": 8 + }, + { + "address": "0xcB97e65F07DA24D46BcDD078EBebd7C6E6E3d750", + "symbol": "BTM", + "decimal": 8 + }, + { + "address": "0x588047365dF5BA589F923604AAC23d673555c623", + "symbol": "NAVI", + "decimal": 18 + }, + { + "address": "0x5a84969bb663fb64F6d015DcF9F622Aedc796750", + "symbol": "ICE", + "decimal": 18 + }, + { + "address": "0x51DB5Ad35C671a87207d88fC11d593AC0C8415bd", + "symbol": "MDA", + "decimal": 18 + }, + { + "address": "0xFb2f26F266Fb2805a387230f2aa0a331b4d96Fba", + "symbol": "DADI", + "decimal": 18 + }, + { + "address": "0x1B5f21ee98eed48d292e8e2d3Ed82b40a9728A22", + "symbol": "DATABroker", + "decimal": 18 + }, + { + "address": "0x3883f5e181fccaF8410FA61e12b59BAd963fb645", + "symbol": "THETA", + "decimal": 18 + }, + { + "address": "0xcCeD5B8288086BE8c38E23567e684C3740be4D48", + "symbol": "RLT", + "decimal": 10 + }, + { + "address": "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d", + "symbol": "CK", + "decimal": 0 + }, + { + "address": "0x48e5413b73add2434e47504E2a22d14940dBFe78", + "symbol": "INRM", + "decimal": 3 + }, + { + "address": "0x1e49fF77c355A3e38D6651ce8404AF0E48c5395f", + "symbol": "MTRc", + "decimal": 18 + }, + { + "address": "0x1d462414fe14cf489c7A21CaC78509f4bF8CD7c0", + "symbol": "CAN", + "decimal": 6 + }, + { + "address": "0xE814aeE960a85208C3dB542C53E7D4a6C8D5f60F", + "symbol": "DAY", + "decimal": 18 + }, + { + "address": "0xb3Bd49E28f8F832b8d1E246106991e546c323502", + "symbol": "GMT", + "decimal": 18 + }, + { + "address": "0x2e071D2966Aa7D8dECB1005885bA1977D6038A65", + "symbol": "DICE", + "decimal": 16 + }, + { + "address": "0x744d70FDBE2Ba4CF95131626614a1763DF805B9E", + "symbol": "SNT", + "decimal": 18 + }, + { + "address": "0x69c4BB240cF05D51eeab6985Bab35527d04a8C64", + "symbol": "OPEN (1)", + "decimal": 8 + }, + { + "address": "0xe9dE1C630753A15d7021Cc563429c21d4887506F", + "symbol": "OPEN (2)", + "decimal": 8 + }, + { + "address": "0x1a7a8BD9106F2B8D977E08582DC7d24c723ab0DB", + "symbol": "APPC", + "decimal": 18 + }, + { + "address": "0x8f8221aFbB33998d8584A2B05749bA73c37a938a", + "symbol": "REQ", + "decimal": 18 + }, + { + "address": "0x82BD526bDB718C6d4DD2291Ed013A5186cAE2DCa", + "symbol": "VDOC", + "decimal": 18 + }, + { + "address": "0xba9d4199faB4f26eFE3551D490E3821486f135Ba", + "symbol": "CHSB", + "decimal": 8 + }, + { + "address": "0xe23cd160761f63FC3a1cF78Aa034b6cdF97d3E0C", + "symbol": "MIT", + "decimal": 18 + }, + { + "address": "0xD0D6D6C5Fe4a677D343cC433536BB717bAe167dD", + "symbol": "ADT", + "decimal": 9 + }, + { + "address": "0xa02e3bB9cEbc03952601B3724B4940e0845BeBcf", + "symbol": "BTHR", + "decimal": 18 + }, + { + "address": "0x954b5De09A55e59755aCBda29e1Eb74A45D30175", + "symbol": "FLUZ", + "decimal": 18 + }, + { + "address": "0xF87F0D9153fea549c728Ad61cb801595a68b73de", + "symbol": "BANX", + "decimal": 18 + }, + { + "address": "0x1234567461d3f8Db7496581774Bd869C83D51c93", + "symbol": "CAT (BitClave)", + "decimal": 18 + }, + { + "address": "0xf85fEea2FdD81d51177F6b8F35F0e6734Ce45F5F", + "symbol": "CMT", + "decimal": 18 + }, + { + "address": "0xE2E6D4BE086c6938B53B22144855eef674281639", + "symbol": "LINK Platform", + "decimal": 18 + }, + { + "address": "0xd0929d411954c47438dc1d871dd6081F5C5e149c", + "symbol": "RFR", + "decimal": 4 + }, + { + "address": "0x4156D3342D5c385a87D264F90653733592000581", + "symbol": "SALT", + "decimal": 8 + }, + { + "address": "0x7C5A0CE9267ED19B22F8cae653F198e3E8daf098", + "symbol": "SAN", + "decimal": 18 + }, + { + "address": "0x82fdedfB7635441aA5A92791D001fA7388da8025", + "symbol": "DTx", + "decimal": 18 + }, + { + "address": "0x8eFFd494eB698cc399AF6231fCcd39E08fd20B15", + "symbol": "PIX", + "decimal": 0 + }, + { + "address": "0xb67734521eAbBE9C773729dB73E16CC2dfb20A58", + "symbol": "E₹", + "decimal": 2 + }, + { + "address": "0x80BC5512561c7f85A3A9508c7df7901b370Fa1DF", + "symbol": "TIO", + "decimal": 18 + }, + { + "address": "0x9501BFc48897DCEEadf73113EF635d2fF7ee4B97", + "symbol": "EMT", + "decimal": 18 + }, + { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "decimal": 18 + }, + { + "address": "0x6a0A97E47d15aAd1D132a1Ac79a480E3F2079063", + "symbol": "WCT", + "decimal": 18 + }, + { + "address": "0x7F585B9130c64e9e9F470b618A7badD03D79cA7E", + "symbol": "CR7", + "decimal": 18 + }, + { + "address": "0xB97048628DB6B661D4C2aA833e95Dbe1A905B280", + "symbol": "PAY", + "decimal": 18 + }, + { + "address": "0x6fFF3806Bbac52A20e0d79BC538d527f6a22c96b", + "symbol": "CDX", + "decimal": 18 + }, + { + "address": "0x2eb86e8fC520E0F6Bb5D9Af08F924fe70558Ab89", + "symbol": "LGR", + "decimal": 8 + }, + { + "address": "0xe8780B48bdb05F928697A5e8155f672ED91462F7", + "symbol": "CAS", + "decimal": 18 + }, + { + "address": "0xc798cd1c49db0E297312E4c682752668CE1dB2AD", + "symbol": "LFR", + "decimal": 5 + }, + { + "address": "0xd348e07A2806505B856123045d27aeeD90924b50", + "symbol": "CCLC", + "decimal": 8 + }, + { + "address": "0xE94327D07Fc17907b4DB788E5aDf2ed424adDff6", + "symbol": "REP", + "decimal": 18 + }, + { + "address": "0x4d829f8C92a6691c56300D020c9e0dB984Cfe2BA", + "symbol": "XCC", + "decimal": 18 + }, + { + "address": "0x5e4ABE6419650CA839Ce5BB7Db422b881a6064bB", + "symbol": "WiC", + "decimal": 18 + }, + { + "address": "0x779B7b713C86e3E6774f5040D9cCC2D43ad375F8", + "symbol": "POOL", + "decimal": 8 + }, + { + "address": "0xEA610B1153477720748DC13ED378003941d84fAB", + "symbol": "ALIS", + "decimal": 18 + }, + { + "address": "0x22F0AF8D78851b72EE799e05F54A77001586B18A", + "symbol": "GXVC", + "decimal": 10 + }, + { + "address": "0x8a854288a5976036A725879164Ca3e91d30c6A1B", + "symbol": "GET", + "decimal": 18 + }, + { + "address": "0x4c382F8E09615AC86E08CE58266CC227e7d4D913", + "symbol": "SKR", + "decimal": 6 + }, + { + "address": "0x45e42D659D9f9466cD5DF622506033145a9b89Bc", + "symbol": "NxC", + "decimal": 3 + }, + { + "address": "0x0D8775F648430679A709E98d2b0Cb6250d2887EF", + "symbol": "BAT", + "decimal": 18 + }, + { + "address": "0xB23be73573bC7E03DB6e5dfc62405368716d28a8", + "symbol": "ONEK", + "decimal": 18 + }, + { + "address": "0x4470BB87d77b963A013DB939BE332f927f2b992e", + "symbol": "ADX", + "decimal": 4 + }, + { + "address": "0x28577A6d31559bd265Ce3ADB62d0458550F7b8a7", + "symbol": "CCC (CryptoCrashCourse)", + "decimal": 18 + }, + { + "address": "0xea5f88E54d982Cbb0c441cde4E79bC305e5b43Bc", + "symbol": "PARETO", + "decimal": 18 + }, + { + "address": "0x2C4e8f2D746113d0696cE89B35F0d8bF88E0AEcA", + "symbol": "OST", + "decimal": 18 + }, + { + "address": "0x226bb599a12C826476e3A771454697EA52E9E220", + "symbol": "PRO", + "decimal": 8 + }, + { + "address": "0x14F37B574242D366558dB61f3335289a5035c506", + "symbol": "HKG", + "decimal": 3 + }, + { + "address": "0x0C04d4f331DA8dF75f9E2e271E3f3F1494C66C36", + "symbol": "PRSP", + "decimal": 9 + }, + { + "address": "0x0e0989b1f9B8A38983c2BA8053269Ca62Ec9B195", + "symbol": "POE", + "decimal": 8 + }, + { + "address": "0xAef38fBFBF932D1AeF3B808Bc8fBd8Cd8E1f8BC5", + "symbol": "CRB", + "decimal": 8 + }, + { + "address": "0x73dD069c299A5d691E9836243BcaeC9c8C1D8734", + "symbol": "BTE", + "decimal": 8 + }, + { + "address": "0x30f4A3e0aB7a76733D8b60b89DD93c3D0b4c9E2f", + "symbol": "XGT", + "decimal": 18 + }, + { + "address": "0x84936cF7630AA3e27Dd9AfF968b140d5AEE49F5a", + "symbol": "AMTC", + "decimal": 8 + }, + { + "address": "0x9a005c9a89BD72a4Bd27721E7a09A3c11D2b03C4", + "symbol": "STAC", + "decimal": 18 + }, + { + "address": "0xfe7B915A0bAA0E79f85c5553266513F7C1c03Ed0", + "symbol": "THUG", + "decimal": 18 + }, + { + "address": "0xC0Eb85285d83217CD7c891702bcbC0FC401E2D9D", + "symbol": "HVN", + "decimal": 8 + }, + { + "address": "0xD850942eF8811f2A866692A623011bDE52a462C1", + "symbol": "VET", + "decimal": 18 + }, + { + "address": "0x12B19D3e2ccc14Da04FAe33e63652ce469b3F2FD", + "symbol": "GRID", + "decimal": 12 + }, + { + "address": "0x71e8d74fF1C923E369D0e70DFb09866629C4DD35", + "symbol": "WRK", + "decimal": 18 + }, + { + "address": "0x12fCd6463E66974cF7bBC24FFC4d40d6bE458283", + "symbol": "GBX", + "decimal": 18 + }, + { + "address": "0x7728dFEF5aBd468669EB7f9b48A7f70a501eD29D", + "symbol": "PRG", + "decimal": 6 + }, + { + "address": "0x8aA33A7899FCC8eA5fBe6A608A109c3893A1B8b2", + "symbol": "BET", + "decimal": 18 + }, + { + "address": "0xBC86727E770de68B1060C91f6BB6945c73e10388", + "symbol": "XNK", + "decimal": 18 + }, + { + "address": "0x177d39AC676ED1C67A2b268AD7F1E58826E5B0af", + "symbol": "CDT", + "decimal": 18 + }, + { + "address": "0xd6e354F07319e2474491D8c7c712137bEe6862a2", + "symbol": "LEMO", + "decimal": 0 + }, + { + "address": "0xcE59d29b09aAE565fEEEf8E52f47c3CD5368C663", + "symbol": "BLX (Bullion)", + "decimal": 18 + }, + { + "address": "0x3f4B726668da46f5e0E75aA5D478ACEc9f38210F", + "symbol": "M-ETH", + "decimal": 18 + }, + { + "address": "0x55648De19836338549130B1af587F16beA46F66B", + "symbol": "PBL", + "decimal": 18 + }, + { + "address": "0xE9fF07809CCff05daE74990e25831d0Bc5cbe575", + "symbol": "Hdp", + "decimal": 18 + }, + { + "address": "0xcFD6Ae8BF13f42DE14867351eAff7A8A3b9FbBe7", + "symbol": "SNG", + "decimal": 8 + }, + { + "address": "0x957c30aB0426e0C93CD8241E2c60392d08c6aC8e", + "symbol": "MOD", + "decimal": 0 + }, + { + "address": "0x315cE59FAFd3A8d562b7Ec1C8542382d2710b06c", + "symbol": "CCS", + "decimal": 18 + }, + { + "address": "0xAFe60511341a37488de25Bef351952562E31fCc1", + "symbol": "TBT", + "decimal": 8 + }, + { + "address": "0x9e3319636e2126e3c0bc9e3134AEC5e1508A46c7", + "symbol": "UTN-P", + "decimal": 18 + }, + { + "address": "0x24083Bb30072643C3bB90B44B7285860a755e687", + "symbol": "GELD", + "decimal": 18 + }, + { + "address": "0x0AfFa06e7Fbe5bC9a764C979aA66E8256A631f02", + "symbol": "PLBT", + "decimal": 6 + }, + { + "address": "0xE69a353b3152Dd7b706ff7dD40fe1d18b7802d31", + "symbol": "ADH", + "decimal": 18 + }, + { + "address": "0x6810e776880C02933D47DB1b9fc05908e5386b96", + "symbol": "GNO", + "decimal": 18 + }, + { + "address": "0x9c23D67AEA7B95D80942e3836BCDF7E708A747C2", + "symbol": "LOCI", + "decimal": 18 + }, + { + "address": "0xdb0F69306FF8F949f258E83f6b87ee5D052d0b23", + "symbol": "GCP", + "decimal": 18 + }, + { + "address": "0xD3C00772B24D997A812249ca637a921e81357701", + "symbol": "WILD", + "decimal": 18 + }, + { + "address": "0xA54ddC7B3CcE7FC8b1E3Fa0256D0DB80D2c10970", + "symbol": "NDC", + "decimal": 18 + }, + { + "address": "0xb5A5F22694352C15B00323844aD545ABb2B11028", + "symbol": "ICX", + "decimal": 18 + }, + { + "address": "0xf05a9382A4C3F29E2784502754293D88b835109C", + "symbol": "REX", + "decimal": 18 + }, + { + "address": "0x0886949c1b8C412860c4264Ceb8083d1365e86CF", + "symbol": "BTCE", + "decimal": 8 + }, + { + "address": "0x0F33bb20a282A7649C7B3AFf644F084a9348e933", + "symbol": "YUPIE", + "decimal": 18 + }, + { + "address": "0x558EC3152e2eb2174905cd19AeA4e34A23DE9aD6", + "symbol": "BRD", + "decimal": 18 + }, + { + "address": "0xaAAf91D9b90dF800Df4F55c205fd6989c977E73a", + "symbol": "TKN", + "decimal": 8 + }, + { + "address": "0xCc80C051057B774cD75067Dc48f8987C4Eb97A5e", + "symbol": "NEC", + "decimal": 18 + }, + { + "address": "0x1c4481750daa5Ff521A2a7490d9981eD46465Dbd", + "symbol": "BCPT", + "decimal": 18 + }, + { + "address": "0x9aeFBE0b3C3ba9Eab262CB9856E8157AB7648e09", + "symbol": "FLR", + "decimal": 18 + }, + { + "address": "0x0AF44e2784637218dD1D32A322D44e603A8f0c6A", + "symbol": "MTX", + "decimal": 18 + }, + { + "address": "0xdD6Bf56CA2ada24c683FAC50E37783e55B57AF9F", + "symbol": "BNC", + "decimal": 12 + }, + { + "address": "0x255Aa6DF07540Cb5d3d297f0D0D4D84cb52bc8e6", + "symbol": "RDN", + "decimal": 18 + }, + { + "address": "0x5512e1D6A7BE424b4323126B4f9E86D023F95764", + "symbol": "PTWO", + "decimal": 18 + }, + { + "address": "0x62CD07D414Ec50B68C7EcAa863a23d344f2d062f", + "symbol": "WIC", + "decimal": 0 + }, + { + "address": "0x55c2A0C171D920843560594dE3d6EEcC09eFc098", + "symbol": "PEXT", + "decimal": 4 + }, + { + "address": "0x2eF1aB8a26187C58BB8aAeB11B2fC6D25C5c0716", + "symbol": "TWN", + "decimal": 18 + }, + { + "address": "0x7627de4B93263a6a7570b8dAfa64bae812e5c394", + "symbol": "NXX", + "decimal": 8 + }, + { + "address": "0x107c4504cd79C5d2696Ea0030a8dD4e92601B82e", + "symbol": "BLT", + "decimal": 18 + }, + { + "address": "0xe8A1Df958bE379045E2B46a31A98B93A2eCDfDeD", + "symbol": "ESZ", + "decimal": 18 + }, + { + "address": "0xb6EE9668771a79be7967ee29a63D4184F8097143", + "symbol": "CXO", + "decimal": 18 + }, + { + "address": "0xdA2C424Fc98c741c2d4ef2f42897CEfed897CA75", + "symbol": "BNFT", + "decimal": 9 + }, + { + "address": "0x41dBECc1cdC5517C6f76f6a6E836aDbEe2754DE3", + "symbol": "MTN", + "decimal": 18 + }, + { + "address": "0x001F0aA5dA15585e5b2305DbaB2bac425ea71007", + "symbol": "IPSX", + "decimal": 18 + }, + { + "address": "0x2134057C0b461F898D375Cead652Acae62b59541", + "symbol": "CXC", + "decimal": 18 + }, + { + "address": "0x70a72833d6bF7F508C8224CE59ea1Ef3d0Ea3A38", + "symbol": "UTK", + "decimal": 18 + }, + { + "address": "0x763186eB8d4856D536eD4478302971214FEbc6A9", + "symbol": "BETR", + "decimal": 18 + }, + { + "address": "0x6531f133e6DeeBe7F2dcE5A0441aA7ef330B4e53", + "symbol": "TIME", + "decimal": 8 + }, + { + "address": "0x53148Bb4551707edF51a1e8d7A93698d18931225", + "symbol": "PCLOLD", + "decimal": 8 + }, + { + "address": "0xecd570bBf74761b960Fa04Cc10fe2c4e86FfDA36", + "symbol": "STP", + "decimal": 8 + }, + { + "address": "0x2C82c73d5B34AA015989462b2948cd616a37641F", + "symbol": "SXUT", + "decimal": 18 + }, + { + "address": "0x1776e1F26f98b1A5dF9cD347953a26dd3Cb46671", + "symbol": "NMR", + "decimal": 18 + }, + { + "address": "0x3c75226555FC496168d48B88DF83B95F16771F37", + "symbol": "DROP", + "decimal": 0 + }, + { + "address": "0xF03f8D65BaFA598611C3495124093c56e8F638f0", + "symbol": "VIEW", + "decimal": 18 + }, + { + "address": "0x43F6a1BE992deE408721748490772B15143CE0a7", + "symbol": "POIN", + "decimal": 0 + }, + { + "address": "0xB24754bE79281553dc1adC160ddF5Cd9b74361a4", + "symbol": "XRL", + "decimal": 9 + }, + { + "address": "0xf8e386EDa857484f5a12e4B5DAa9984E06E73705", + "symbol": "IND", + "decimal": 18 + }, + { + "address": "0xd2d6158683aeE4Cc838067727209a0aAF4359de3", + "symbol": "BNTY", + "decimal": 18 + }, + { + "address": "0x7705FaA34B16EB6d77Dfc7812be2367ba6B0248e", + "symbol": "ARX", + "decimal": 8 + }, + { + "address": "0x88A3E4F35D64aAD41A6d4030ac9AFE4356cB84fA", + "symbol": "PRE", + "decimal": 18 + }, + { + "address": "0xc98e0639c6d2EC037A615341c369666B110e80E5", + "symbol": "EXMR", + "decimal": 8 + }, + { + "address": "0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374", + "symbol": "VERI", + "decimal": 18 + }, + { + "address": "0x08711D3B02C8758F2FB3ab4e80228418a7F8e39c", + "symbol": "EDG", + "decimal": 0 + }, + { + "address": "0xbf2179859fc6D5BEE9Bf9158632Dc51678a4100e", + "symbol": "ELF", + "decimal": 18 + }, + { + "address": "0x24AEF3BF1A47561500f9430D74Ed4097C47F51F2", + "symbol": "SPARTA", + "decimal": 4 + }, + { + "address": "0x74951B677de32D596EE851A233336926e6A2cd09", + "symbol": "WBA", + "decimal": 7 + }, + { + "address": "0x99ea4dB9EE77ACD40B119BD1dC4E33e1C070b80d", + "symbol": "QSP", + "decimal": 18 + }, + { + "address": "0x5e3346444010135322268a4630d2ED5F8D09446c", + "symbol": "LOC", + "decimal": 18 + }, + { + "address": "0xB2Bfeb70B903F1BAaC7f2ba2c62934C7e5B974C4", + "symbol": "BKB", + "decimal": 8 + }, + { + "address": "0x9992eC3cF6A55b00978cdDF2b27BC6882d88D1eC", + "symbol": "POLY", + "decimal": 18 + }, + { + "address": "0x3eb91D237e491E0DEE8582c402D85CB440fb6b54", + "symbol": "S-ETH", + "decimal": 18 + }, + { + "address": "0x923108a439C4e8C2315c4f6521E5cE95B44e9B4c", + "symbol": "EVE", + "decimal": 18 + }, + { + "address": "0x138A8752093F4f9a79AaeDF48d4B9248fab93c9C", + "symbol": "MCI", + "decimal": 18 + }, + { + "address": "0x8a95ca448A52C0ADf0054bB3402dC5e09CD6B232", + "symbol": "CDL", + "decimal": 18 + }, + { + "address": "0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2", + "symbol": "MKR", + "decimal": 18 + }, + { + "address": "0x3cf9E0c385a5ABEC9FD2a71790AA344C4e8E3570", + "symbol": "BKRx", + "decimal": 18 + }, + { + "address": "0x3597bfD533a99c9aa083587B074434E61Eb0A258", + "symbol": "DENT", + "decimal": 8 + }, + { + "address": "0x88AE96845e157558ef59e9Ff90E766E22E480390", + "symbol": "IKB", + "decimal": 0 + }, + { + "address": "0xB64ef51C888972c908CFacf59B47C1AfBC0Ab8aC", + "symbol": "STORJ", + "decimal": 8 + }, + { + "address": "0xe26517A9967299453d3F1B48Aa005E6127e67210", + "symbol": "NIMFA", + "decimal": 18 + }, + { + "address": "0xE64509F0bf07ce2d29A7eF19A8A9bc065477C1B4", + "symbol": "PIPL", + "decimal": 8 + }, + { + "address": "0xd234BF2410a0009dF9c3C63b610c09738f18ccD7", + "symbol": "DTR", + "decimal": 8 + }, + { + "address": "0xdb8646F5b487B5Dd979FAC618350e85018F557d4", + "symbol": "BTK", + "decimal": 18 + }, + { + "address": "0xB4b1D2C217EC0776584CE08D3DD98F90EDedA44b", + "symbol": "CO2", + "decimal": 18 + }, + { + "address": "0x68d57c9a1C35f63E2c83eE8e49A64e9d70528D25", + "symbol": "SRN", + "decimal": 18 + }, + { + "address": "0x737F98AC8cA59f2C68aD658E3C3d8C8963E40a4c", + "symbol": "AMN", + "decimal": 18 + }, + { + "address": "0x0aeF06DcCCC531e581f0440059E6FfCC206039EE", + "symbol": "ITT", + "decimal": 8 + }, + { + "address": "0x8C65e992297d5f092A756dEf24F4781a280198Ff", + "symbol": "GZE", + "decimal": 18 + }, + { + "address": "0xa578aCc0cB7875781b7880903F4594D13cFa8B98", + "symbol": "ECN", + "decimal": 2 + }, + { + "address": "0x85089389C14Bd9c77FC2b8F0c3d1dC3363Bf06Ef", + "symbol": "SPF", + "decimal": 18 + }, + { + "address": "0xEbeD4fF9fe34413db8fC8294556BBD1528a4DAca", + "symbol": "VENUS", + "decimal": 3 + }, + { + "address": "0x7e667525521cF61352e2E01b50FaaaE7Df39749a", + "symbol": "CMC", + "decimal": 18 + }, + { + "address": "0x0996bFb5D057faa237640E2506BE7B4f9C46de0B", + "symbol": "RNDR", + "decimal": 18 + }, + { + "address": "0x4C0fBE1BB46612915E7967d2C3213cd4d87257AD", + "symbol": "APIS", + "decimal": 18 + }, + { + "address": "0x6745fAB6801e376cD24F03572B9C9B0D4EdDDCcf", + "symbol": "SENSE", + "decimal": 8 + }, + { + "address": "0x4CF488387F035FF08c371515562CBa712f9015d4", + "symbol": "WPR", + "decimal": 18 + }, + { + "address": "0x543Ff227F64Aa17eA132Bf9886cAb5DB55DCAddf", + "symbol": "GEN", + "decimal": 18 + }, + { + "address": "0xD760ADdFb24D9C01Fe4Bfea7475C5e3636684058", + "symbol": "USDM", + "decimal": 2 + }, + { + "address": "0xF4134146AF2d511Dd5EA8cDB1C4AC88C57D60404", + "symbol": "SNC", + "decimal": 18 + }, + { + "address": "0xFACCD5Fc83c3E4C3c1AC1EF35D15adf06bCF209C", + "symbol": "TBC2", + "decimal": 8 + }, + { + "address": "0xA4e8C3Ec456107eA67d3075bF9e3DF3A75823DB0", + "symbol": "LOOM", + "decimal": 18 + }, + { + "address": "0xB63B606Ac810a52cCa15e44bB630fd42D8d1d83d", + "symbol": "MCO", + "decimal": 8 + }, + { + "address": "0x01F2AcF2914860331C1Cb1a9AcecDa7475e06Af8", + "symbol": "MESH", + "decimal": 18 + }, + { + "address": "0xfec0cF7fE078a500abf15F1284958F22049c2C7e", + "symbol": "ART", + "decimal": 18 + }, + { + "address": "0x7FC408011165760eE31bE2BF20dAf450356692Af", + "symbol": "MTR", + "decimal": 8 + }, + { + "address": "0x95dAaaB98046846bF4B2853e23cba236fa394A31", + "symbol": "EMONT", + "decimal": 8 + }, + { + "address": "0x514910771AF9Ca656af840dff83E8264EcF986CA", + "symbol": "LINK (Chainlink)", + "decimal": 18 + }, + { + "address": "0xCb94be6f13A1182E4A4B6140cb7bf2025d28e41B", + "symbol": "TRST", + "decimal": 6 + }, + { + "address": "0x28dee01D53FED0Edf5f6E310BF8Ef9311513Ae40", + "symbol": "XBP", + "decimal": 18 + }, + { + "address": "0x6F6DEb5db0C4994A8283A01D6CFeEB27Fc3bBe9C", + "symbol": "SMART", + "decimal": 0 + }, + { + "address": "0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413", + "symbol": "DAO", + "decimal": 16 + }, + { + "address": "0x533ef0984b2FAA227AcC620C67cce12aA39CD8CD", + "symbol": "XGM", + "decimal": 8 + }, + { + "address": "0xa5Fd1A791C4dfcaacC963D4F73c6Ae5824149eA7", + "symbol": "JNT", + "decimal": 18 + }, + { + "address": "0x701C244b988a513c945973dEFA05de933b23Fe1D", + "symbol": "OAX", + "decimal": 18 + }, + { + "address": "0x0ABeFb7611Cb3A01EA3FaD85f33C3C934F8e2cF4", + "symbol": "FRD", + "decimal": 18 + }, + { + "address": "0xA823E6722006afe99E91c30FF5295052fe6b8E32", + "symbol": "NEU", + "decimal": 18 + }, + { + "address": "0x887834D3b8D450B6bAB109c252Df3DA286d73CE4", + "symbol": "ATT", + "decimal": 18 + }, + { + "address": "0xC34B21f6F8e51cC965c2393B3ccFa3b82BEb2403", + "symbol": "IoT", + "decimal": 6 + }, + { + "address": "0x4DF812F6064def1e5e029f1ca858777CC98D2D81", + "symbol": "XAUR", + "decimal": 8 + }, + { + "address": "0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359", + "symbol": "DAI", + "decimal": 18 + }, + { + "address": "0xfcAC7A7515e9A9d7619fA77A1fa738111f66727e", + "symbol": "PCH", + "decimal": 18 + }, + { + "address": "0x9002D4485b7594e3E850F0a206713B305113f69e", + "symbol": "HAT", + "decimal": 18 + }, + { + "address": "0xf7B098298f7C69Fc14610bf71d5e02c60792894C", + "symbol": "GUP", + "decimal": 3 + }, + { + "address": "0x554C20B7c486beeE439277b4540A434566dC4C02", + "symbol": "HST", + "decimal": 18 + }, + { + "address": "0xe200641890772FCe8eE6EDc5354cCEa30ac92F49", + "symbol": "WHO (1)", + "decimal": 18 + }, + { + "address": "0xe933c0Cd9784414d5F278C114904F5A84b396919", + "symbol": "WHO (2)", + "decimal": 18 + }, + { + "address": "0x6425c6BE902d692AE2db752B3c268AFAdb099D3b", + "symbol": "MWAT", + "decimal": 18 + }, + { + "address": "0x01b3Ec4aAe1B8729529BEB4965F27d008788B0EB", + "symbol": "DPP", + "decimal": 18 + }, + { + "address": "0x35BAA72038F127f9f8C8f9B491049f64f377914d", + "symbol": "EPX", + "decimal": 4 + }, + { + "address": "0xE43E2041dc3786e166961eD9484a5539033d10fB", + "symbol": "DNX", + "decimal": 18 + }, + { + "address": "0x8810C63470d38639954c6B41AaC545848C46484a", + "symbol": "ADI", + "decimal": 18 + }, + { + "address": "0xF0da1186a4977226b9135d0613ee72e229EC3F4d", + "symbol": "CRT", + "decimal": 18 + }, + { + "address": "0xfD107B473AB90e8Fbd89872144a3DC92C40Fa8C9", + "symbol": "LALA", + "decimal": 18 + }, + { + "address": "0x629aEe55ed49581C33ab27f9403F7992A289ffd5", + "symbol": "STC", + "decimal": 18 + }, + { + "address": "0x3dC9a42fa7Afe57BE03c58fD7F4411b1E466C508", + "symbol": "CLL", + "decimal": 18 + }, + { + "address": "0x3d1BA9be9f66B8ee101911bC36D3fB562eaC2244", + "symbol": "RVT", + "decimal": 18 + }, + { + "address": "0xCeD4E93198734dDaFf8492d525Bd258D49eb388E", + "symbol": "EDO", + "decimal": 18 + }, + { + "address": "0x9af2c6B1A28D3d6BC084bd267F70e90d49741D5B", + "symbol": "AXP", + "decimal": 8 + }, + { + "address": "0xf7e983781609012307f2514f63D526D83D24F466", + "symbol": "MYD", + "decimal": 16 + }, + { + "address": "0x386467F1f3ddbE832448650418311a479EECFC57", + "symbol": "MBRS", + "decimal": 0 + }, + { + "address": "0x17052d51E954592C1046320c2371AbaB6C73Ef10", + "symbol": "ATH", + "decimal": 18 + }, + { + "address": "0xFB12e3CcA983B9f59D90912Fd17F8D745A8B2953", + "symbol": "LUCK", + "decimal": 0 + }, + { + "address": "0x0F513fFb4926ff82D7F60A05069047AcA295C413", + "symbol": "XSC", + "decimal": 18 + }, + { + "address": "0x566Fd7999B1Fc3988022bD38507A48F0bCf22c77", + "symbol": "TRCN", + "decimal": 18 + }, + { + "address": "0x5b26C5D0772E5bbaC8b3182AE9a13f9BB2D03765", + "symbol": "EDU", + "decimal": 8 + }, + { + "address": "0xa645264C5603E96c3b0B078cdab68733794B0A71", + "symbol": "MYST", + "decimal": 8 + }, + { + "address": "0xB98d4C97425d9908E66E53A6fDf673ACcA0BE986", + "symbol": "ABT", + "decimal": 18 + }, + { + "address": "0xCa3c18a65b802eC267f8f4802545e7F53D24C75e", + "symbol": "BUC", + "decimal": 18 + }, + { + "address": "0xE4c94d45f7Aef7018a5D66f44aF780ec6023378e", + "symbol": "CryptoCarbon", + "decimal": 6 + }, + { + "address": "0x39Bb259F66E1C59d5ABEF88375979b4D20D98022", + "symbol": "WAX", + "decimal": 8 + }, + { + "address": "0x40395044Ac3c0C57051906dA938B54BD6557F212", + "symbol": "MGO", + "decimal": 8 + }, + { + "address": "0x80A7E048F37A50500351C204Cb407766fA3baE7f", + "symbol": "CRPT", + "decimal": 18 + }, + { + "address": "0x89205A3A3b2A69De6Dbf7f01ED13B2108B2c43e7", + "symbol": "Unicorn", + "decimal": 0 + }, + { + "address": "0x5E6b6d9aBAd9093fdc861Ea1600eBa1b355Cd940", + "symbol": "ITC", + "decimal": 18 + }, + { + "address": "0x2accaB9cb7a48c3E82286F0b2f8798D201F4eC3f", + "symbol": "BTL (Battle)", + "decimal": 18 + }, + { + "address": "0x27Dce1eC4d3f72C3E457Cc50354f1F975dDEf488", + "symbol": "AIR", + "decimal": 8 + }, + { + "address": "0xF244176246168F24e3187f7288EdbCA29267739b", + "symbol": "HAV", + "decimal": 18 + }, + { + "address": "0xc8C6A31A4A806d3710A7B38b7B296D2fABCCDBA8", + "symbol": "ELIX", + "decimal": 18 + }, + { + "address": "0xc27A2F05fa577a83BA0fDb4c38443c0718356501", + "symbol": "TAU", + "decimal": 18 + }, + { + "address": "0x56ba2Ee7890461f463F7be02aAC3099f6d5811A8", + "symbol": "CAT (Blockcat)", + "decimal": 18 + }, + { + "address": "0x74C1E4b8caE59269ec1D85D3D4F324396048F4ac", + "symbol": "BeerCoin", + "decimal": 0 + }, + { + "address": "0xCc34366E3842cA1BD36c1f324d15257960fCC801", + "symbol": "BON", + "decimal": 18 + }, + { + "address": "0x24692791Bc444c5Cd0b81e3CBCaba4b04Acd1F3B", + "symbol": "UKG", + "decimal": 18 + }, + { + "address": "0xa9240fBCAC1F0b9A6aDfB04a53c8E3B0cC1D1444", + "symbol": "HIG", + "decimal": 18 + }, + { + "address": "0x4CC19356f2D37338b9802aa8E8fc58B0373296E7", + "symbol": "KEY (SelfKey)", + "decimal": 18 + }, + { + "address": "0x4Cd988AfBad37289BAAf53C13e98E2BD46aAEa8c", + "symbol": "KEY (BihuKey)", + "decimal": 18 + }, + { + "address": "0xAc709FcB44a43c35F0DA4e3163b117A17F3770f5", + "symbol": "ARC", + "decimal": 18 + } +] \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index c3d682be..bda4610f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -47,8 +47,8 @@ js-tokens "^3.0.0" "@babel/runtime@^7.0.0-beta.46": - version "7.0.0-beta.46" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0-beta.46.tgz#466a9c0498f6d12d054a185981eef742d59d4871" + version "7.0.0-beta.47" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0-beta.47.tgz#273f5e71629e80f6cbcd7507503848615e59f7e0" dependencies: core-js "^2.5.3" regenerator-runtime "^0.11.1" @@ -122,9 +122,9 @@ version "2.1.6" resolved "https://registry.yarnpkg.com/@parity/jsonrpc/-/jsonrpc-2.1.6.tgz#260bbe7dfcec18d59f0bf1668dfd6021452d6452" -"@parity/light.js@https://github.com/parity-js/light.js#c531c68b5268a1bf7aba1f43424f440b2bde7828": +"@parity/light.js@https://github.com/parity-js/light.js#369b6c72b3dc3c6cdf22e333aa4053d01b357a19": version "1.0.0" - resolved "https://github.com/parity-js/light.js#c531c68b5268a1bf7aba1f43424f440b2bde7828" + resolved "https://github.com/parity-js/light.js#369b6c72b3dc3c6cdf22e333aa4053d01b357a19" dependencies: "@babel/runtime" "^7.0.0-beta.46" "@parity/api" "^2.1.22" @@ -2583,7 +2583,7 @@ detect-port-alt@1.1.6: address "^1.0.1" debug "^2.6.0" -diff@^3.2.0, diff@^3.3.1, diff@^3.5.0: +diff@^3.1.0, diff@^3.2.0, diff@^3.3.1, diff@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" @@ -5636,6 +5636,10 @@ make-dir@^1.0.0, make-dir@^1.1.0: dependencies: pify "^3.0.0" +make-error@^1.1.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.4.tgz#19978ed575f9e9545d2ff8c13e33b5d18a67d535" + makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" @@ -8187,6 +8191,13 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" +source-map-support@^0.5.3: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" @@ -8201,7 +8212,7 @@ source-map@^0.4.2, source-map@^0.4.4: dependencies: amdefine ">=0.0.4" -source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -8756,6 +8767,19 @@ trim-right@^1.0.1: dependencies: glob "^6.0.4" +ts-node@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-6.0.3.tgz#28bf74bcad134fad17f7469dad04638ece03f0f4" + dependencies: + arrify "^1.0.0" + chalk "^2.3.0" + diff "^3.1.0" + make-error "^1.1.1" + minimist "^1.2.0" + mkdirp "^0.5.1" + source-map-support "^0.5.3" + yn "^2.0.0" + tslib@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8" @@ -8801,6 +8825,10 @@ typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" +typescript@^2.8.3: + version "2.8.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.3.tgz#5d817f9b6f31bb871835f4edf0089f21abe6c170" + ua-parser-js@^0.7.9: version "0.7.17" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" @@ -9626,3 +9654,7 @@ yeoman-generator@^2.0.4: text-table "^0.2.0" through2 "^2.0.0" yeoman-environment "^2.0.5" + +yn@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" -- GitLab From a59075d48e73cc821cdb706835910aa93c272747 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Thu, 17 May 2018 15:44:52 +0200 Subject: [PATCH 02/21] Update to new light.js --- package.json | 2 +- src/Accounts/Accounts.js | 42 ++++++--------- .../CreateAccountStep1/CreateAccountStep1.js | 47 ++++++++-------- src/hoc/hoc.js | 42 +++++++++++++-- src/hoc/propsProxy.js | 53 +++++++++++++++++++ yarn.lock | 4 +- 6 files changed, 136 insertions(+), 54 deletions(-) create mode 100644 src/hoc/propsProxy.js diff --git a/package.json b/package.json index 464cbb0d..ada3bd82 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ }, "dependencies": { "@parity/api": "^2.1.22", - "@parity/light.js": "https://github.com/parity-js/light.js#369b6c72b3dc3c6cdf22e333aa4053d01b357a19", + "@parity/light.js": "https://github.com/parity-js/light.js#0c57c29de42122b0f07ff82dfaf38b48863d8d2e", "axios": "^0.18.0", "commander": "^2.15.1", "electron": "^2.0.0", diff --git a/src/Accounts/Accounts.js b/src/Accounts/Accounts.js index bb12defd..815cd87b 100644 --- a/src/Accounts/Accounts.js +++ b/src/Accounts/Accounts.js @@ -4,54 +4,46 @@ // SPDX-License-Identifier: MIT import React, { Component } from 'react'; -import { allAccountsInfo$, setDefaultAccount$ } from '@parity/light.js'; +import { accountsInfo$ } from '@parity/light.js'; import Blockies from 'react-blockies'; +import { inject, observer } from 'mobx-react'; import { Link } from 'react-router-dom'; import light from '../hoc'; +@inject('parityStore') +@observer @light({ - allAccountsInfo: allAccountsInfo$ + accountsInfo: accountsInfo$ }) class Accounts extends Component { - componentWillUnmount () { - if (this.subscription) { - this.subscription.unsubscribe(); - } - } - - handleClick = ({ - currentTarget: { - dataset: { address } - } - }) => { + handleClick = ({ currentTarget: { dataset: { address } } }) => { + const { parityStore: { api } } = this.props; // Set default account to the clicked one, and go to Tokens on complete - this.subscription = setDefaultAccount$(address).subscribe(null, null, () => - this.props.history.push('/tokens') - ); + this.subscription = api.parity + .setNewDappsDefaultAddress(address) + .then(() => this.props.history.push('/tokens')); }; render () { - const { allAccountsInfo } = this.props; + const { accountsInfo } = this.props; return (
- {allAccountsInfo ? ( -
; export default BalanceLayout; diff --git a/src/Tokens/NewToken/NewToken.js b/src/Tokens/NewToken/NewToken.js new file mode 100644 index 00000000..4df9774b --- /dev/null +++ b/src/Tokens/NewToken/NewToken.js @@ -0,0 +1,100 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. +// +// SPDX-License-Identifier: MIT + +import React, { Component } from 'react'; +import { chainName$ } from '@parity/light.js'; +import debounce from 'lodash/debounce'; +import { inject, observer } from 'mobx-react'; + +import light from '../../hoc'; +import NewTokenItem from './NewTokenItem'; + +@inject('tokensStore') +@observer +@light({ + chainName: chainName$ +}) +class NewToken extends Component { + state = { db: null, dbMap: null, matches: [], search: '' }; + + calculateMatches = debounce(() => { + const { db, search } = this.state; + const matches = + db && search + ? db.filter( + ({ name, symbol }) => + name.toLowerCase().includes(search.toLowerCase()) || + symbol.toLowerCase().includes(search.toLowerCase()) + ) + : []; + this.setState({ matches }); + }, 500); + + componentDidMount () { + if (this.props.chainName) { + this.fetchTokensDb(); + } + } + + componentDidUpdate (prevProps) { + if (this.props.chainName && !prevProps.chainName) { + this.fetchTokensDb(); + } + } + + fetchTokensDb = async () => { + if (this.state.db) { + // Don't fetch again if it's already fetched + return; + } + + // We only fetch this huge json if the user visits this NewToken page. We + // try to avoid it as much as possible. All other tokens info (used in the + // homepage) are stored in localStorage. + let db; + try { + db = await import(`../../assets/tokens/${this.props.chainName}.json`); + } catch (e) { + db = await import(`../../assets/tokens/foundation.json`); + } + + // We create a address=>token mapping here + const dbMap = {}; + db.forEach(token => (dbMap[token.address] = token)); + + // Commit this into the state + this.setState({ db, dbMap }); + }; + + handleSearch = ({ target: { value } }) => { + this.setState({ search: value }); + this.calculateMatches(); + }; + + render () { + const { db, matches, search } = this.state; + + return ( +
+ + {db && + search && +
+
    + {matches.map(token => + + )} +
+
} +
+ ); + } +} + +export default NewToken; diff --git a/src/Tokens/NewToken/NewTokenItem/NewTokenItem.js b/src/Tokens/NewToken/NewTokenItem/NewTokenItem.js new file mode 100644 index 00000000..049622ac --- /dev/null +++ b/src/Tokens/NewToken/NewTokenItem/NewTokenItem.js @@ -0,0 +1,52 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. +// +// SPDX-License-Identifier: MIT + +import React, { Component } from 'react'; +import { inject, observer } from 'mobx-react'; +import { withRouter } from 'react-router-dom'; + +@inject('tokensStore') +@observer +@withRouter +class NewTokenItem extends Component { + handleAddToken = () => { + const { history, token, tokensStore } = this.props; + tokensStore.addToken(token.address, token); + history.goBack(); + }; + + handleRemoveToken = () => { + const { history, token, tokensStore } = this.props; + tokensStore.removeToken(token.address); + history.goBack(); + }; + + render () { + const { token, tokensStore: { tokens } } = this.props; + + return ( +
  • +
    +
    + {token.symbol} +
    +
    + {token.name} +
    +
    + + {token.symbol} + +
    + {tokens.has(token.address) + ? + : } +
    +
  • + ); + } +} + +export default NewTokenItem; diff --git a/src/Tokens/NewToken/NewTokenItem/index.js b/src/Tokens/NewToken/NewTokenItem/index.js new file mode 100644 index 00000000..0e444fba --- /dev/null +++ b/src/Tokens/NewToken/NewTokenItem/index.js @@ -0,0 +1,8 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. +// +// SPDX-License-Identifier: MIT + +import NewTokenItem from './NewTokenItem'; + +export default NewTokenItem; diff --git a/src/Tokens/NewToken/index.js b/src/Tokens/NewToken/index.js new file mode 100644 index 00000000..59270b25 --- /dev/null +++ b/src/Tokens/NewToken/index.js @@ -0,0 +1,8 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. +// +// SPDX-License-Identifier: MIT + +import NewToken from './NewToken'; + +export default NewToken; diff --git a/src/Tokens/Tokens.js b/src/Tokens/Tokens.js index e7e07911..28ad550f 100644 --- a/src/Tokens/Tokens.js +++ b/src/Tokens/Tokens.js @@ -5,40 +5,50 @@ import React, { Component } from 'react'; import { inject, observer } from 'mobx-react'; -import { Redirect } from 'react-router-dom'; +import { Link, Redirect, Route, Switch } from 'react-router-dom'; import EthBalance from './EthBalance'; +import NewToken from './NewToken'; import TokenBalance from './TokenBalance'; @inject('parityStore', 'tokensStore') @observer class Tokens extends Component { render () { - const { - parityStore: { isApiConnected }, - tokensStore: { tokens } - } = this.props; + const { parityStore: { isApiConnected } } = this.props; if (!isApiConnected) { return ; } + return ( + + + + + ); + } + + renderTokensList = () => { + const { tokensStore: { tokens } } = this.props; + return (
      - {Array.from(tokens.keys()).map(key => ( + {Array.from(tokens.keys()).map(key =>
    • - {key === 'ETH' ? ( - - ) : ( - - )} + {key === 'ETH' + ? + : }
    • - ))} + )} +
    • + Add Token +
    ); - } + }; } export default Tokens; diff --git a/src/stores/tokensStore.js b/src/stores/tokensStore.js index f3939a2b..88f2ebbc 100644 --- a/src/stores/tokensStore.js +++ b/src/stores/tokensStore.js @@ -19,35 +19,24 @@ class TokensStore { if (!value) { this.addToken('ETH', { - image: ethereumIcon, + logo: ethereumIcon, name: 'Ethereum', symbol: 'ETH' }); - // TODO Remove this testing values - this.addToken('ABC', { - image: 'https://s2.coinmarketcap.com/static/img/coins/64x64/1.png', - name: 'Abc Token', - symbol: 'ABC' - }); - this.addToken('DEF', { - image: 'https://s2.coinmarketcap.com/static/img/coins/64x64/1.png', - name: 'Def Token', - symbol: 'DEF' - }); } else { this.tokens.replace(value); } } @action - addToken = (key, token) => { - this.tokens.set(key, token); + addToken = (address, token) => { + this.tokens.set(address, token); this.updateLS(); }; @action - removeToken = key => { - this.tokens.delete(key); + removeToken = address => { + this.tokens.delete(address); this.updateLS(); }; -- GitLab From cb2e708adaf1240d721f9c1ee1dbed475e63e122 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 18 May 2018 11:53:16 +0200 Subject: [PATCH 07/21] Clean code --- src/Send/Send.js | 10 ++--- src/Tokens/BalanceLayout/BalanceLayout.js | 8 ++-- src/Tokens/EthBalance/EthBalance.js | 15 +++---- src/Tokens/NewToken/NewToken.js | 49 ++++++++++++++--------- src/Tokens/TokenBalance/TokenBalance.js | 2 +- src/Tokens/Tokens.js | 14 +++---- src/stores/tokensStore.js | 16 +++++++- 7 files changed, 67 insertions(+), 47 deletions(-) diff --git a/src/Send/Send.js b/src/Send/Send.js index 5861f6a3..6c02d3f1 100644 --- a/src/Send/Send.js +++ b/src/Send/Send.js @@ -4,19 +4,15 @@ // SPDX-License-Identifier: MIT import React, { Component } from 'react'; -import { balanceOf$, defaultAccount$ } from '@parity/light.js'; -import { map, switchMap } from 'rxjs/operators'; +import { defaultAccount$, myBalance$ } from '@parity/light.js'; +import { map } from 'rxjs/operators'; import { fromWei, toWei } from '@parity/api/lib/util/wei'; import ethereumIcon from '../assets/img/tokens/ethereum.png'; import light from '../hoc'; @light({ - balance: () => - defaultAccount$().pipe( - switchMap(balanceOf$), - map(value => +fromWei(value.toString())) - ), + balance: () => myBalance$().pipe(map(value => +fromWei(value.toString()))), me: defaultAccount$ }) class Send extends Component { diff --git a/src/Tokens/BalanceLayout/BalanceLayout.js b/src/Tokens/BalanceLayout/BalanceLayout.js index 07ea338f..3a49f3f6 100644 --- a/src/Tokens/BalanceLayout/BalanceLayout.js +++ b/src/Tokens/BalanceLayout/BalanceLayout.js @@ -5,17 +5,17 @@ import React from 'react'; -const BalanceLayout = ({ balance, logo, name, symbol }) => +const BalanceLayout = ({ balance, token }) =>
    - {symbol} + {token.symbol}
    - {name} + {token.name}
    {Number.isFinite(balance) ? balance.toFixed(2) : '...'}{' '} - {symbol} + {token.symbol}
    ; diff --git a/src/Tokens/EthBalance/EthBalance.js b/src/Tokens/EthBalance/EthBalance.js index beaca486..f81fc749 100644 --- a/src/Tokens/EthBalance/EthBalance.js +++ b/src/Tokens/EthBalance/EthBalance.js @@ -4,22 +4,23 @@ // SPDX-License-Identifier: MIT import React, { Component } from 'react'; -import { balanceOf$, defaultAccount$ } from '@parity/light.js'; +import { myBalance$ } from '@parity/light.js'; import { fromWei } from '@parity/api/lib/util/wei'; import { Link } from 'react-router-dom'; -import { map, switchMap } from 'rxjs/operators'; +import { map } from 'rxjs/operators'; +import PropTypes from 'prop-types'; import BalanceLayout from '../BalanceLayout'; import light from '../../hoc'; @light({ - balance: () => - defaultAccount$().pipe( - switchMap(balanceOf$), - map(value => +fromWei(value.toString())) - ) + balance: () => myBalance$().pipe(map(value => +fromWei(value.toString()))) }) class EthBalance extends Component { + static propTypes = { + token: PropTypes.object.isRequired + }; + render () { return ( diff --git a/src/Tokens/NewToken/NewToken.js b/src/Tokens/NewToken/NewToken.js index 4df9774b..401c07d5 100644 --- a/src/Tokens/NewToken/NewToken.js +++ b/src/Tokens/NewToken/NewToken.js @@ -17,18 +17,29 @@ import NewTokenItem from './NewTokenItem'; chainName: chainName$ }) class NewToken extends Component { - state = { db: null, dbMap: null, matches: [], search: '' }; + state = { + db: null, + dbMap: null, + matches: this.props.tokensStore.tokensArrayWithoutEth, + search: '' + }; calculateMatches = debounce(() => { + const { tokensStore: { tokensArrayWithoutEth } } = this.props; const { db, search } = this.state; - const matches = - db && search - ? db.filter( - ({ name, symbol }) => - name.toLowerCase().includes(search.toLowerCase()) || - symbol.toLowerCase().includes(search.toLowerCase()) - ) - : []; + + if (search.length <= 1) { + this.setState({ matches: tokensArrayWithoutEth }); + return; + } + + const matches = db + ? db.filter( + ({ name, symbol }) => + name.toLowerCase().includes(search.toLowerCase()) || + symbol.toLowerCase().includes(search.toLowerCase()) + ) + : []; this.setState({ matches }); }, 500); @@ -74,24 +85,22 @@ class NewToken extends Component { }; render () { - const { db, matches, search } = this.state; + const { matches, search } = this.state; return (
    - {db && - search && -
    -
      - {matches.map(token => - - )} -
    -
    } +
    +
      + {matches.map(token => + + )} +
    +
    ); } diff --git a/src/Tokens/TokenBalance/TokenBalance.js b/src/Tokens/TokenBalance/TokenBalance.js index 3c0bd52d..1238927a 100644 --- a/src/Tokens/TokenBalance/TokenBalance.js +++ b/src/Tokens/TokenBalance/TokenBalance.js @@ -10,7 +10,7 @@ import BalanceLayout from '../BalanceLayout'; class TokenBalance extends Component { static propTypes = { - token: PropTypes.string.isRequired + token: PropTypes.object.isRequired }; render () { diff --git a/src/Tokens/Tokens.js b/src/Tokens/Tokens.js index 28ad550f..57e55b9c 100644 --- a/src/Tokens/Tokens.js +++ b/src/Tokens/Tokens.js @@ -30,20 +30,20 @@ class Tokens extends Component { } renderTokensList = () => { - const { tokensStore: { tokens } } = this.props; + const { tokensStore: { tokensArray } } = this.props; return (
      - {Array.from(tokens.keys()).map(key => -
    • - {key === 'ETH' - ? - : } + {tokensArray.map(token => +
    • + {token.address === 'ETH' + ? + : }
    • )}
    • - Add Token + Add/Remove Token
    diff --git a/src/stores/tokensStore.js b/src/stores/tokensStore.js index 88f2ebbc..c64929ac 100644 --- a/src/stores/tokensStore.js +++ b/src/stores/tokensStore.js @@ -3,7 +3,7 @@ // // SPDX-License-Identifier: MIT -import { action, observable } from 'mobx'; +import { action, computed, observable } from 'mobx'; import store from 'store'; import ethereumIcon from '../assets/img/tokens/ethereum.png'; @@ -18,7 +18,9 @@ class TokensStore { const value = store.get(LS_KEY); if (!value) { + // We consider Ethereum as a token, with address 'ETH' this.addToken('ETH', { + address: 'ETH', logo: ethereumIcon, name: 'Ethereum', symbol: 'ETH' @@ -40,6 +42,18 @@ class TokensStore { this.updateLS(); }; + @computed + get tokensArray () { + return Array.from(this.tokens.values()); + } + + @computed + get tokensArrayWithoutEth () { + return Array.from(this.tokens.values()).filter( + ({ address }) => address !== 'ETH' // Ethereum is the only token without address, has 'ETH' instead + ); + } + updateLS = () => store.set(LS_KEY, this.tokens); } -- GitLab From b40cf790d0b53993f4948bc19a9fc84c4f588e29 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 18 May 2018 12:39:12 +0200 Subject: [PATCH 08/21] One LS key per chain for tokens --- src/stores/tokensStore.js | 60 ++++++++++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 13 deletions(-) diff --git a/src/stores/tokensStore.js b/src/stores/tokensStore.js index c64929ac..e199aab2 100644 --- a/src/stores/tokensStore.js +++ b/src/stores/tokensStore.js @@ -7,26 +7,27 @@ import { action, computed, observable } from 'mobx'; import store from 'store'; import ethereumIcon from '../assets/img/tokens/ethereum.png'; +import parityStore from './parityStore'; -const LS_PREFIX = '__paritylight::'; -const LS_KEY = `${LS_PREFIX}tokens`; +const LS_PREFIX = '__paritylight::tokens'; class TokensStore { @observable tokens = new Map(); constructor () { - const value = store.get(LS_KEY); + this.api = parityStore.api; - if (!value) { - // We consider Ethereum as a token, with address 'ETH' - this.addToken('ETH', { - address: 'ETH', - logo: ethereumIcon, - name: 'Ethereum', - symbol: 'ETH' - }); + if (parityStore.isApiConnected) { + this.init(); } else { - this.tokens.replace(value); + // TODO This .on() is not working, so we poll every second + // this.api.on('connected', this.init); + this.interval = setInterval(() => { + if (parityStore.isApiConnected) { + this.init(); + clearInterval(this.interval); + } + }, 1000); } } @@ -36,6 +37,34 @@ class TokensStore { this.updateLS(); }; + init = async () => { + // Set the localStorage key, we have one key per chain, in this format: + // __paritylight::tokens::kovan + try { + const chainName = await this.api.parity.chain(); + this.lsKey = `${LS_PREFIX}::${chainName}`; + } catch (e) { + console.error(e); + // Fallback to main net + this.lsKey = `${LS_PREFIX}::foundation`; + } + + // Now we fetch the tokens from the localStorage + const tokens = store.get(this.lsKey); + if (!tokens) { + // If there's nothing in the localStorage, we add be default only + // Ethereum. We consider Ethereum as a token, with address 'ETH' + this.addToken('ETH', { + address: 'ETH', + logo: ethereumIcon, + name: 'Ethereum', + symbol: 'ETH' + }); + } else { + this.tokens.replace(tokens); + } + }; + @action removeToken = address => { this.tokens.delete(address); @@ -54,7 +83,12 @@ class TokensStore { ); } - updateLS = () => store.set(LS_KEY, this.tokens); + updateLS = () => { + if (!this.lsKey) { + return; + } + store.set(this.lsKey, this.tokens); + }; } export default new TokensStore(); -- GitLab From 9238588f9a1256ea80acc8b6fc0c76025d53dbf7 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 18 May 2018 14:18:33 +0200 Subject: [PATCH 09/21] Make tokens the default apge --- src/Accounts/Accounts.js | 73 +++++++++++-------- src/Accounts/CreateAccount/CreateAccount.js | 2 +- .../CreateAccountStep1/CreateAccountStep1.js | 12 +-- .../CreateAccountStep5/CreateAccountStep5.js | 11 +-- src/App/App.js | 32 ++++---- src/App/ProtectedRoute/ProtectedRoute.js | 33 +++++---- src/Loading/Loading.js | 8 +- src/Receive/Receive.js | 8 +- src/Tokens/Tokens.js | 40 +++++----- 9 files changed, 111 insertions(+), 108 deletions(-) diff --git a/src/Accounts/Accounts.js b/src/Accounts/Accounts.js index daf8c283..a471fa4a 100644 --- a/src/Accounts/Accounts.js +++ b/src/Accounts/Accounts.js @@ -7,8 +7,9 @@ import React, { Component } from 'react'; import { accountsInfo$ } from '@parity/light.js'; import Blockies from 'react-blockies'; import { inject, observer } from 'mobx-react'; -import { Link } from 'react-router-dom'; +import { Link, Route, Switch } from 'react-router-dom'; +import CreateAccount from './CreateAccount/CreateAccount'; import light from '../hoc'; @inject('parityStore') @@ -25,55 +26,65 @@ class Accounts extends Component { .then(() => this.props.history.push('/tokens')); }; - render() { + render () { + return ( + + + + + ); + } + + // TODO We can put this into a separate Component + renderAccounts = () => { const { accountsInfo } = this.props; return (
    -