diff --git a/.github/bors.toml b/.github/bors.toml index f523611baf..b2571776cc 100644 --- a/.github/bors.toml +++ b/.github/bors.toml @@ -1,4 +1,4 @@ -status = ["lint", "unit-tests", "integration", "testkit"] +status = ["lint", "unit-tests", "integration", "testkit", "circuit-tests"] delete_merged_branches = true update_base_for_deletes = true timeout_sec = 7200 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fb408892b2..6df3dc2c34 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -65,8 +65,8 @@ jobs: ci_run zk db basic-setup ci_run zk run yarn - - name: liquidity-token - run: docker-compose -f docker-compose-runner.yml restart dev-liquidity-token-watcher + - name: restart dev-liquidity-token-watcher and dev-ticker + run: docker-compose -f docker-compose-runner.yml restart dev-liquidity-token-watcher dev-ticker - name: contracts-unit-tests run: ci_run zk test contracts @@ -102,8 +102,8 @@ jobs: ci_run zk dummy-prover enable --no-redeploy ci_run zk init - - name: liquidity-token - run: docker-compose -f docker-compose-runner.yml restart dev-liquidity-token-watcher + - name: restart dev-liquidity-token-watcher and dev-ticker + run: docker-compose -f docker-compose-runner.yml restart dev-liquidity-token-watcher dev-ticker - name: run-services run: | @@ -116,7 +116,9 @@ jobs: run: ci_run zk test i server - name: integration-api - run: ci_run zk test i api + run: | + ci_run zk test i api + ci_run zk test i api-docs - name: integration-zcli run: ci_run zk test i zcli diff --git a/.github/workflows/deploy-apps.yml b/.github/workflows/deploy-apps.yml index cc4a6e11cb..3f91b7e9f4 100644 --- a/.github/workflows/deploy-apps.yml +++ b/.github/workflows/deploy-apps.yml @@ -4,7 +4,7 @@ on: deployment: env: - DEPLOY_APPS: -l name=server -l name=prover -l name=explorer + DEPLOY_APPS: -l name=server -l name=prover jobs: pre: @@ -89,7 +89,7 @@ jobs: with: repository: matter-labs/helm-infra path: helm-infra - ref: breaking-secrets + ref: new-health-and-conf token: ${{ secrets.GH_TOKEN }} - if: ${{ needs.pre.outputs.isTag == 'true' }} diff --git a/.github/workflows/deploy-stage.yml b/.github/workflows/deploy-stage.yml index 268c87c09e..070724ec45 100644 --- a/.github/workflows/deploy-stage.yml +++ b/.github/workflows/deploy-stage.yml @@ -42,7 +42,7 @@ jobs: echo $(pwd)/bin >> $GITHUB_PATH - name: init run: | - cargo sqlx --version || cargo install --version=0.2.0 sqlx-cli + cargo sqlx --version || cargo install sqlx-cli zk zk run yarn cp etc/tokens/{test,localhost}.json @@ -53,11 +53,9 @@ jobs: docker login -u ${{ secrets.DOCKER_USER }} -p ${{ secrets.DOCKER_PASSWORD }} zk docker push rust - + ## !!! TODO: fix stage and enable deployments back. + ## !!! TODO: breaking deployment is not supported. # deploy: - # ## TODO: fix stage and enable deployments back. - # ## NOTE: breaking deployment is not supported. - # name: Deploy to the Stage enviroment # runs-on: [k8s, deployer, stage] # needs: [pre, build-images] diff --git a/Cargo.lock b/Cargo.lock index 614feab0b0..224beb083f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "actix" version = "0.10.0" @@ -4009,27 +4011,6 @@ dependencies = [ "bitflags", ] -[[package]] -name = "regen-root-hash" -version = "1.0.0" -dependencies = [ - "anyhow", - "bigdecimal", - "ethabi", - "hex", - "num", - "once_cell", - "serde", - "serde_json", - "structopt", - "tokio 0.2.25", - "zksync_circuit", - "zksync_crypto", - "zksync_storage", - "zksync_types", - "zksync_utils", -] - [[package]] name = "regex" version = "1.5.4" @@ -6162,6 +6143,7 @@ dependencies = [ "vlog", "web3", "zksync_api_client", + "zksync_api_types", "zksync_balancer", "zksync_config", "zksync_contracts", @@ -6188,6 +6170,26 @@ dependencies = [ "serde", "serde_json", "thiserror", + "zksync_api_types", + "zksync_config", + "zksync_crypto", + "zksync_types", + "zksync_utils", +] + +[[package]] +name = "zksync_api_types" +version = "1.0.0" +dependencies = [ + "bigdecimal", + "chrono", + "either", + "hex", + "num", + "serde", + "serde_json", + "thiserror", + "zksync_config", "zksync_crypto", "zksync_types", "zksync_utils", @@ -6278,6 +6280,7 @@ dependencies = [ "tokio 0.2.25", "vlog", "web3", + "zksync_api_types", "zksync_balancer", "zksync_config", "zksync_contracts", @@ -6626,6 +6629,7 @@ dependencies = [ "thiserror", "tokio 0.2.25", "vlog", + "zksync_api_types", "zksync_basic_types", "zksync_config", "zksync_crypto", diff --git a/Cargo.toml b/Cargo.toml index 974e6a5cc3..b90d90340b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,6 @@ members = [ "core/bin/server", "core/bin/prover", "core/bin/parse_pub_data", - "core/bin/regen-root-hash", "core/bin/block_revert", # Server micro-services @@ -35,6 +34,7 @@ members = [ "core/lib/contracts", "core/lib/api_client", "core/lib/notifier", + "core/lib/api_types", "core/lib/balancer", # Test infrastructure diff --git a/bin/api_docs b/bin/api_docs new file mode 100755 index 0000000000..d5702463fb --- /dev/null +++ b/bin/api_docs @@ -0,0 +1,9 @@ +#!/bin/bash + +if [ -z "$1" ]; then + cd $ZKSYNC_HOME + yarn && yarn api-docs build +else + # can't start this with yarn since it has quirks with `--` as an argument + node -- $ZKSYNC_HOME/infrastructure/api-docs/build/index.js "$@" +fi diff --git a/changelog/core.md b/changelog/core.md index bfbd750fc5..31c4f03d01 100644 --- a/changelog/core.md +++ b/changelog/core.md @@ -6,6 +6,8 @@ All notable changes to the core components will be documented in this file. ### Removed +- (`api_server`): REST API v1.0. + ### Changed - (`loadtest`): `zksync_fee` has been moved to `[main_wallet]` section from the `[network]` section. @@ -16,6 +18,7 @@ All notable changes to the core components will be documented in this file. - (`api_server`): Make `submit_txs_batch` send only one signature request. - Fast withdrawals now can trigger aggregated block execution. - Replaced `anyhow` errors with typed errors in `lib/state`, `lib/crypto` and `lib/types`. +- (`fee-ticker`): Batch fee now includes `zkp_fee` and `gas_fee`. ### Added @@ -30,6 +33,11 @@ All notable changes to the core components will be documented in this file. - (`api_server`): Support for accounts that don't have to pay fees (e.g. network service accounts) was added. - Added `BlockMetadata` structure and corresponding table to track block data that is not related to protocol. - (`block_revert`): CLI that calls `revertBlocks` smart contract function and updates the database respectively. +- (`api_server`): Added REST API v0.2. +- (`api_client`): Client for REST API v0.2. +- (`api_types`): Crate for storing types that are used in API. +- Added hashes for batches and additional hashes for priority operations. +- Added `ForcedExit` fee type to REST API v0.2 and JSON RPC API. ### Fixed diff --git a/changelog/infrastructure.md b/changelog/infrastructure.md index 097a50e20b..825e5a3fad 100644 --- a/changelog/infrastructure.md +++ b/changelog/infrastructure.md @@ -15,9 +15,12 @@ components, the logs will have the following format: ### Added +- (`api-docs`): tool for generating and testing API documentation. Docs are generated from a bunch of .apib files where + API endpoints and their inputs/outputs are defined. - (`token_list_manager`): CLI for updating to new version of a previously saved list of trusted tokens. - - (`loadnext`): Crate, a new implementation of the loadtest for zkSync. +- (`api-docs`): tool for generating and testing API documentation. Docs are generated from a bunch of .apib files where + API endpoints and their inputs/outputs are defined. ### Fixed diff --git a/changelog/js-sdk.md b/changelog/js-sdk.md index 35084d03a8..00858a5fc6 100644 --- a/changelog/js-sdk.md +++ b/changelog/js-sdk.md @@ -8,10 +8,25 @@ All notable changes to `zksync.js` will be documented in this file. - Methods for working with NFTs. You can read more [here](https://zksync.io/dev/nfts.html). - Methods for working with atomic swaps/limit orders. You can read more [here](https://zksync.io/dev/swaps.html). +- `RestProvider` class, that is used for querying REST API v0.2. +- `SyncProvider` interface: common interface for API v0.2 `RestProvider` and JSON RPC `Provider`. +- Types for REST API v0.2. + +- `RestProvider` class, that is used for queriing REST API v0.2. +- `SyncProvider` interface: common interface for API v0.2 `RestProvider` and JSON RPC `Provider`. +- Types for REST API v0.2. ### Changed +- Changed type of `provider` field in `Wallet` class from `Provider` to `SyncProvider`. +- `ForcedExit` fee type is used for `ForcedExit` transactions instead of `Withdraw` fee type. - `zksync-crypto` to support atomic swaps/limit orders functionality. +- Changed type of `provider` field in `Wallet` class from `Provider` to `SyncProvider`. +- `ForcedExit` fee type is used for `ForcedExit` transactions instead of `Withdraw` fee type. + +### Deprecated + +### Fixed ## Version 0.10.9 (13.04.2021) diff --git a/contracts/scripts/submit-hash-regenesis.ts b/contracts/scripts/submit-hash-regenesis.ts deleted file mode 100644 index 024c3d26cd..0000000000 --- a/contracts/scripts/submit-hash-regenesis.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { ArgumentParser } from 'argparse'; -import { ethers, Wallet } from 'ethers'; -import * as fs from 'fs'; -import * as path from 'path'; -import { web3Provider } from './utils'; -import { readProductionContracts } from '../src.ts/deploy'; - -const testConfigPath = path.join(process.env.ZKSYNC_HOME as string, `etc/test_config/constant`); -const ethTestConfig = JSON.parse(fs.readFileSync(`${testConfigPath}/eth.json`, { encoding: 'utf-8' })); -const testContracts = readProductionContracts(); - -async function main() { - const parser = new ArgumentParser({ - version: '0.0.1', - addHelp: true, - description: 'Submit signatures for regenesesis' - }); - parser.addArgument('--masterPrivateKey'); - parser.addArgument('--contractAddress'); - parser.addArgument('--oldRootHash'); - parser.addArgument('--newRootHash'); - - const args = parser.parseArgs(process.argv.slice(2)); - - const provider = web3Provider(); - - const wallet = args.deployerPrivateKey - ? new Wallet(args.deployerPrivateKey, provider) - : Wallet.fromMnemonic( - process.env.MNEMONIC ? process.env.MNEMONIC : ethTestConfig.mnemonic, - "m/44'/60'/0'/0/1" - ).connect(provider); - - const contractAddress = args.contractAddress || process.env.MISC_REGENESIS_MULTISIG_ADDRESS; - - const contract = new ethers.Contract(contractAddress, testContracts.regenesisMultisig.abi, wallet); - - const oldRootHash = args.oldRootHash; - const newRootHash = args.newRootHash; - console.log('Submitting signatures...'); - console.log('Sender address: ', wallet.address); - console.log('Contract address: ', contractAddress); - console.log('OldHash: ', oldRootHash); - console.log('NewHash: ', newRootHash); - const tx = await contract.submitHash(oldRootHash, newRootHash, { - gasLimit: 500000 - }); - - await tx.wait(); - - console.log('New hash submitted successfully'); -} - -main() - .then(() => process.exit(0)) - .catch((err) => { - console.error('Error:', err.message || err); - process.exit(1); - }) - .finally(() => {}); diff --git a/contracts/scripts/submit-regenesis-upgrade.ts b/contracts/scripts/submit-regenesis-upgrade.ts deleted file mode 100644 index c1cdd2ce97..0000000000 --- a/contracts/scripts/submit-regenesis-upgrade.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { ArgumentParser } from 'argparse'; -import { deployContract } from 'ethereum-waffle'; -import { Contract, ethers, Wallet } from 'ethers'; -import * as fs from 'fs'; -import * as path from 'path'; -import { web3Provider, storedBlockInfoParam } from './utils'; -import { readProductionContracts } from '../src.ts/deploy'; - -const testConfigPath = path.join(process.env.ZKSYNC_HOME as string, `etc/test_config/constant`); -const ethTestConfig = JSON.parse(fs.readFileSync(`${testConfigPath}/eth.json`, { encoding: 'utf-8' })); -const testContracts = readProductionContracts(); - -async function startUpgrade(wallet: ethers.Wallet, upgradeGatekeeper: Contract) { - console.log('Deploying new Governance target...'); - const newTargetGov = await deployContract(wallet, testContracts.governance, [], { - gasLimit: 6500000 - }); - - console.log(`CONTRACTS_GOVERNANCE_TARGET_ADDR=${newTargetGov.address}`); - console.log('Deploying new Verifier target...'); - const newTargetVerifier = await deployContract(wallet, testContracts.verifier, [], { - gasLimit: 6500000 - }); - - console.log(`CONTRACTS_VERIFIER_TARGET_ADDR=${newTargetVerifier.address}`); - const newTargetZkSync = await deployContract(wallet, testContracts.zkSync, [], { - gasLimit: 6500000 - }); - - console.log(`CONTRACTS_CONTRACT_TARGET_ADDR=${newTargetZkSync.address}`); - console.log('Starting upgrade...'); - await ( - await upgradeGatekeeper.startUpgrade( - [newTargetGov.address, newTargetVerifier.address, newTargetZkSync.address], - { - gasLimit: 500000 - } - ) - ).wait(); - console.log('Upgrade has been successfully started.'); -} - -async function startPreparation(upgradeGatekeeper: Contract) { - console.log('Trying to start preparation...'); - while (parseInt(await upgradeGatekeeper.upgradeStatus()) !== 2 /*Preparation*/) { - await new Promise((r) => setTimeout(r, 1000)); - await (await upgradeGatekeeper.startPreparation({ gasLimit: 300000 })).wait(); - } - console.log('Upgrade preparation has been successfully started'); -} - -async function finishUpgrade(upgradeGatekeeper: Contract, lastBlockInfo: string) { - const blockInfo = JSON.parse(lastBlockInfo); - const upgradeData = ethers.utils.defaultAbiCoder.encode([storedBlockInfoParam()], [blockInfo]); - - console.log('Finishing upgrade'); - await (await upgradeGatekeeper.finishUpgrade([[], [], upgradeData], { gasLimit: 3000000 })).wait(); - console.log('The upgrade has finished'); -} - -async function cancelUpgrade(upgradeGatekeeper: Contract) { - await ( - await upgradeGatekeeper.cancelUpgrade({ - gasLimit: 500000 - }) - ).wait(); -} - -async function main() { - const parser = new ArgumentParser({ - version: '0.0.1', - addHelp: true, - description: 'Contract upgrade' - }); - parser.addArgument('--masterPrivateKey'); - parser.addArgument('--upgradeGatekeeperAddress'); - parser.addArgument('--lastBlockInfo'); - parser.addArgument('--startUpgrade'); - parser.addArgument('--finishUpgrade'); - parser.addArgument('--startPreparation'); - parser.addArgument('--cancelUpgrade'); - const args = parser.parseArgs(process.argv.slice(2)); - - const provider = web3Provider(); - const wallet = args.deployerPrivateKey - ? new Wallet(args.deployerPrivateKey, provider) - : Wallet.fromMnemonic( - process.env.MNEMONIC ? process.env.MNEMONIC : ethTestConfig.mnemonic, - "m/44'/60'/0'/0/1" - ).connect(provider); - - const upgradeGatekeeper = new ethers.Contract( - args.upgradeGatekeeperAddress, - testContracts.upgradeGatekeeper.abi, - wallet - ); - - if (!args.startUpgrade && !args.startPreparation && !args.finishUpgrade && !args.cancelUpgrade) { - console.log(`Please supply at least one of the following flags: - --startUpgrade, - --startPreparation, - --finishUpgrade - `); - return; - } - - if (args.startUpgrade) { - await startUpgrade(wallet, upgradeGatekeeper); - } - - if (args.startPreparation) { - await startPreparation(upgradeGatekeeper); - } - - if (args.finishUpgrade) { - await finishUpgrade(upgradeGatekeeper, args.lastBlockInfo); - } - - if (args.cancelUpgrade) { - await cancelUpgrade(upgradeGatekeeper); - } -} - -main() - .then(() => process.exit(0)) - .catch((err) => { - console.error('Error:', err.message || err); - process.exit(1); - }) - .finally(() => {}); diff --git a/contracts/scripts/upgrade-testnet.ts b/contracts/scripts/upgrade-testnet.ts index 811318ef08..d4417d531a 100644 --- a/contracts/scripts/upgrade-testnet.ts +++ b/contracts/scripts/upgrade-testnet.ts @@ -26,7 +26,8 @@ async function main() { }); parser.addArgument('--initArgs', { required: false, - help: 'Upgrade function parameters comma-separated, RLP serialized in hex (Governance,Verifier,ZkSync): 0xaa..aa,0xbb..bb,0xcc..c or zero by default.', + help: + 'Upgrade function parameters comma-separated, RLP serialized in hex (Governance,Verifier,ZkSync): 0xaa..aa,0xbb..bb,0xcc..c or zero by default.', defaultValue: '0x,0x,0x' }); parser.addArgument('--cancelPreviousUpgrade', { diff --git a/core/bin/block_revert/src/main.rs b/core/bin/block_revert/src/main.rs index 538b65d200..0c49114505 100644 --- a/core/bin/block_revert/src/main.rs +++ b/core/bin/block_revert/src/main.rs @@ -19,6 +19,12 @@ async fn revert_blocks_in_storage( ) -> anyhow::Result<()> { let mut transaction = storage.start_transaction().await?; + transaction + .chain() + .mempool_schema() + .return_executed_txs_to_mempool(last_block) + .await?; + println!("`mempool_txs`, `executed_transactions` tables are updated"); transaction .chain() .block_schema() @@ -34,7 +40,7 @@ async fn revert_blocks_in_storage( transaction .chain() .block_schema() - .remove_account_tree_cache(last_block) + .remove_new_account_tree_cache(last_block) .await?; println!("`account_tree_cache` table is cleaned"); @@ -110,13 +116,6 @@ async fn revert_blocks_in_storage( .await?; println!("`eth_parameters` table is updated"); - transaction - .chain() - .mempool_schema() - .return_executed_txs_to_mempool(last_block) - .await?; - println!("`mempool_txs`, `executed_transactions` tables are updated"); - transaction.commit().await?; println!("Blocks were reverted in storage"); diff --git a/core/bin/data_restore/src/tests/mod.rs b/core/bin/data_restore/src/tests/mod.rs index c626730d5a..ee484e64f2 100644 --- a/core/bin/data_restore/src/tests/mod.rs +++ b/core/bin/data_restore/src/tests/mod.rs @@ -85,6 +85,7 @@ fn create_deposit(from: Address, to: Address, amount: u32) -> ExecutedOperations deadline_block: 0, eth_hash: H256::zero(), eth_block: 0, + eth_block_index: None, }; let executed_deposit_op = ExecutedPriorityOp { priority_op: priority_operation, diff --git a/core/bin/data_restore/src/tree_state.rs b/core/bin/data_restore/src/tree_state.rs index 3dd60f1f01..c96888b522 100644 --- a/core/bin/data_restore/src/tree_state.rs +++ b/core/bin/data_restore/src/tree_state.rs @@ -507,6 +507,7 @@ impl TreeState { deadline_block: 0, eth_hash: H256::zero(), eth_block: 0, + eth_block_index: None, }, block_index, created_at: chrono::Utc::now(), diff --git a/core/bin/regen-root-hash/Cargo.toml b/core/bin/regen-root-hash/Cargo.toml deleted file mode 100644 index 3739c79163..0000000000 --- a/core/bin/regen-root-hash/Cargo.toml +++ /dev/null @@ -1,32 +0,0 @@ -[package] -name = "regen-root-hash" -version = "1.0.0" -edition = "2018" -authors = ["The Matter Labs Team "] -homepage = "https://zksync.io/" -repository = "https://github.com/matter-labs/zksync" -license = "Apache-2.0" -keywords = ["blockchain", "zksync"] -categories = ["cryptography"] -publish = false # We don't want to publish our binaries. -readme = "README.md" - -[dependencies] -zksync_crypto = { path = "../../lib/crypto", version = "1.0" } -zksync_types = { path = "../../lib/types", version = "1.0" } -zksync_utils = { path = "../../lib/utils", version = "1.0" } -zksync_circuit = { path = "../../lib/circuit", version = "1.0" } -zksync_storage = { path = "../../lib/storage", version = "1.0" } -ethabi = "14.0.0" - -once_cell = "1.4" -anyhow = "1.0" -bigdecimal = { version = "0.2.0", features = ["serde"]} -num = { version = "0.3.1", features = ["serde"] } -hex = "0.4" -structopt = "0.3.20" - -serde = { version = "1.0", features = ["derive"] } -serde_json = { version = "1.0.0" } - -tokio = { version = "0.2", features = ["full"] } diff --git a/core/bin/regen-root-hash/README.md b/core/bin/regen-root-hash/README.md deleted file mode 100644 index 8b59fa7d06..0000000000 --- a/core/bin/regen-root-hash/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# Tool for regenerating root hash - -This tool takes the JSON dump of `accounts` and `balances` from the zkSync database. - -It regenerates the `OldRootHash` which is equal to the root hash of the account tree when each of the account state -subtrees has a depth of 11 and verifies that is the correct one. It also generates the `NewRootHash` which is equal to -the root hash of the account tree when each of the account state subtrees has a depth of 32. After re-verification that -the contents of the new tree are equivalent to the ones in the old tree, the following message is signed: -`OldRootHash:{OldRootHash},NewRootHash:{NewRootHash}`. - -Run `cargo run -- --help` to get the help of the cli arguments that the program takes. - -Note that the re-verification process is computation heavy, so running under `release` mode is recommended. Example of -using the tool: - -```sh -> cargo run --release -- -a ./sample/accounts -b ./sample/balances -h 0x2bd61f42837c0fa77fc113b3b341c520edb1ffadefc48c2b907901aaaf42b906 -p 0xd03f45dc6e06aa9a0fc53189a2a89561c42dc4ffffc13881d64401cd0beb604a - -OldHash: 0x2bd61f42837c0fa77fc113b3b341c520edb1ffadefc48c2b907901aaaf42b906 -NewHash: 0x2a9b50e17ece607c8c88b1833426fd9e60332685b94a1534fcf26948e373604c - -Signing prefixed message: OldRootHash:0x2bd61f42837c0fa77fc113b3b341c520edb1ffadefc48c2b907901aaaf42b906,NewRootHash:0x2a9b50e17ece607c8c88b1833426fd9e60332685b94a1534fcf26948e373604c - -Signature: 0x21ab9c91f12cc30146e7383d520002ec844eb614c888bb8c9deb628c95e516ed1061083996a80364a40b38125a9e380e64656293ed8b8591a4de9b064a235d901c -``` diff --git a/core/bin/regen-root-hash/command.sql b/core/bin/regen-root-hash/command.sql deleted file mode 100644 index 80c2ebeca5..0000000000 --- a/core/bin/regen-root-hash/command.sql +++ /dev/null @@ -1,17 +0,0 @@ -/* - -In order for json to be outputted properly the following params should be added to -the psql - -\t -\pset format unaligned - -This command should be run in the psql to get the json of the account balances - -*/ - -/* To get the content for the accounts file */ -SELECT json_agg(t) FROM (SELECT * FROM accounts) t; - -/* To get the content for the balances file */ -SELECT json_agg(t) FROM (SELECT account_id, coin_id, balance::VARCHAR FROM balances) t; diff --git a/core/bin/regen-root-hash/sample/accounts b/core/bin/regen-root-hash/sample/accounts deleted file mode 100644 index e2e2978ec1..0000000000 --- a/core/bin/regen-root-hash/sample/accounts +++ /dev/null @@ -1,18 +0,0 @@ -[{"id":8,"last_block":18,"nonce":14,"address":"\\x45a3eb4785253214f24c1a670a0954cc6dbde193","pubkey_hash":"\\xba3f5098b941f22fdf8aae966bfc6f2effc1759d"}, - {"id":10,"last_block":18,"nonce":0,"address":"\\xac1ae0d7168c08f377bf0fb6dd871b14fa76550e","pubkey_hash":"\\x0000000000000000000000000000000000000000"}, - {"id":15,"last_block":21,"nonce":0,"address":"\\xea44d51e8688b0fd108fd7b926dea05bb96f8536","pubkey_hash":"\\x0000000000000000000000000000000000000000"}, - {"id":3,"last_block":3,"nonce":0,"address":"\\x009fbbc45974f9326747fb8d3a57122a85137cdb","pubkey_hash":"\\x0000000000000000000000000000000000000000"}, - {"id":12,"last_block":16,"nonce":0,"address":"\\x1e231a592263f4a212ffd50623ce0c9a511eeed5","pubkey_hash":"\\x0000000000000000000000000000000000000000"}, - {"id":16,"last_block":22,"nonce":4,"address":"\\x7f7463ed06bf9429f6a5e8ed4731e9b9ab7666cf","pubkey_hash":"\\x9731d7fdf9f02d627a7c0c7f168c23876e12c355"}, - {"id":9,"last_block":12,"nonce":1,"address":"\\x37e0711c9363f623b1a4fb8736627eb6167ec515","pubkey_hash":"\\xa773a118c29bcb9c0961c2efe3c833953c531cae"}, - {"id":17,"last_block":23,"nonce":2,"address":"\\x490bc1d83abe7978660294e4fc005ee1263e2572","pubkey_hash":"\\x70f050f97ad413b309cb2842ef23ff87c252ce22"}, - {"id":11,"last_block":23,"nonce":9,"address":"\\xa28d2a14270b4c2e6c7bd3a4af95a33ccc62380b","pubkey_hash":"\\xa4e32de6e7c855a8e54cf86b67389a6a74ec93f8"}, - {"id":7,"last_block":6,"nonce":3,"address":"\\x1833c9539c92d4c7a98015080dc8820c9c88394f","pubkey_hash":"\\x3fdfaea88ad77bcb54de12d23761de766a687373"}, - {"id":13,"last_block":16,"nonce":6,"address":"\\x40888f7182365df7b006fb28ef2ea336a2d2d7a1","pubkey_hash":"\\xf07767370c52ca977d6051b3a61651f8cf67ece5"}, - {"id":0,"last_block":23,"nonce":0,"address":"\\xde03a0b5963f75f1c8485b355ff6d30f3093bde7","pubkey_hash":"\\x0000000000000000000000000000000000000000"}, - {"id":1,"last_block":30,"nonce":1,"address":"\\xe1fab3efd74a77c23b426c302d96372140ff7d0c","pubkey_hash":"\\x244d8d64e0ebc8a19f307d03716003e467053c49"}, - {"id":5,"last_block":7,"nonce":0,"address":"\\x7aa00cd7e80fcf8a451e127db20e3cd165986f97","pubkey_hash":"\\x0000000000000000000000000000000000000000"}, - {"id":6,"last_block":7,"nonce":6,"address":"\\x1bf7e10e52b183fa36edf27eb6f77a765b934cfb","pubkey_hash":"\\xb56cd8f108f2e5d5a3048be0359fabd2901f329d"}, - {"id":4,"last_block":7,"nonce":9,"address":"\\x5c06ae35c31a2f65b08d097d4ee24544b2711edd","pubkey_hash":"\\x8bcad3eb64d4d5468fd1926506875e8e49126cef"}, - {"id":2,"last_block":8,"nonce":9,"address":"\\x21da835aa463e09dc5a2dfdcccdc35a10120e82e","pubkey_hash":"\\x1c62107643167319872408c5f4cb8cfe8d40acb5"}, - {"id":14,"last_block":15,"nonce":3,"address":"\\x36217352e9e115eb71972094d8f8dd32b1609e04","pubkey_hash":"\\x5f0a1fcbecda2ed107cfea6281b43023caecb200"}] diff --git a/core/bin/regen-root-hash/sample/balances b/core/bin/regen-root-hash/sample/balances deleted file mode 100644 index 0285dfdd72..0000000000 --- a/core/bin/regen-root-hash/sample/balances +++ /dev/null @@ -1,21 +0,0 @@ -[{"account_id":8,"coin_id":2,"balance":"3539999999999999999142"}, - {"account_id":10,"coin_id":2,"balance":"0"}, - {"account_id":3,"coin_id":0,"balance":"10000000000000000000"}, - {"account_id":15,"coin_id":2,"balance":"0"}, - {"account_id":9,"coin_id":2,"balance":"19999999999999999934"}, - {"account_id":7,"coin_id":0,"balance":"99999951800000000000"}, - {"account_id":16,"coin_id":2,"balance":"1969999999999999999868"}, - {"account_id":6,"coin_id":2,"balance":"1999999999999999999934"}, - {"account_id":17,"coin_id":2,"balance":"1989999999999999999912"}, - {"account_id":11,"coin_id":2,"balance":"109999999999999999670"}, - {"account_id":0,"coin_id":2,"balance":"1782"}, - {"account_id":5,"coin_id":0,"balance":"0"}, - {"account_id":14,"coin_id":2,"balance":"99999999999999999890"}, - {"account_id":6,"coin_id":0,"balance":"99999942100000000000"}, - {"account_id":1,"coin_id":0,"balance":"8000000000000000000"}, - {"account_id":4,"coin_id":0,"balance":"69999855290000000000"}, - {"account_id":2,"coin_id":0,"balance":"3569999730200000000000"}, - {"account_id":13,"coin_id":0,"balance":"1999999971100000000000"}, - {"account_id":0,"coin_id":0,"balance":"549510000000000"}, - {"account_id":12,"coin_id":2,"balance":"0"}, - {"account_id":13,"coin_id":2,"balance":"99999999999999999868"}] diff --git a/core/bin/regen-root-hash/src/account.rs b/core/bin/regen-root-hash/src/account.rs deleted file mode 100644 index 9e08cad0b2..0000000000 --- a/core/bin/regen-root-hash/src/account.rs +++ /dev/null @@ -1,193 +0,0 @@ -use zksync_crypto::{ - circuit::{ - account::{Balance, CircuitAccount, CircuitBalanceTree}, - utils::eth_address_to_fr, - }, - franklin_crypto::bellman::pairing::ff::Field, - pairing::ff::PrimeField, - params::{MIN_NFT_TOKEN_ID, NFT_STORAGE_ACCOUNT_ADDRESS, NFT_TOKEN_ID}, - primitives::GetBits, - Engine, Fr, -}; - -use crate::hasher::{verify_accounts_equal, CustomMerkleTree, BALANCE_TREE_11, BALANCE_TREE_32}; -use num::BigUint; -use serde::{Deserialize, Serialize}; -use std::fs; -use std::{collections::HashMap, convert::TryInto}; -use zksync_types::{account::Account, Address, Nonce, PubKeyHash, TokenId}; -use zksync_utils::BigUintSerdeAsRadix10Str; - -pub fn get_balance_tree(depth: usize) -> CircuitBalanceTree { - match depth { - 11 => BALANCE_TREE_11.clone(), - 32 => BALANCE_TREE_32.clone(), - _ => panic!("Depth {} is not supported", depth), - } -} - -// Unfortunately we need to reimplement the structs for CircuitAccount for different tree depths -macro_rules! custom_circuit_account { - ($(#[$attr:meta])* $name:ident, $balance_tree:literal) => { - $(#[$attr])* - pub struct $name(pub CircuitAccount); - - impl Default for $name { - fn default() -> Self { - let subtree = get_balance_tree($balance_tree); - let circuit_account = CircuitAccount { - nonce: Fr::zero(), - pub_key_hash: Fr::zero(), - address: Fr::zero(), - subtree - }; - - Self(circuit_account) - } - } - - impl GetBits for $name { - fn get_bits_le(&self) -> Vec { - self.0.get_bits_le() - } - } - - impl CircuitAccountWrapper for $name { - fn from_account(account: Account) -> Self { - let mut circuit_account = Self::default().0; - - let balances: Vec<_> = account - .get_nonzero_balances() - .iter() - .map(|(token_id, balance)| { - ( - *token_id, - Balance { - value: Fr::from_str(&balance.0.to_string()).unwrap(), - }, - ) - }) - .collect(); - - for (token_id, balance) in balances.into_iter() { - circuit_account.subtree.insert(*token_id, balance); - } - - circuit_account.nonce = Fr::from_str(&account.nonce.to_string()).unwrap(); - circuit_account.pub_key_hash = account.pub_key_hash.to_fr(); - circuit_account.address = eth_address_to_fr(&account.address); - - Self(circuit_account) - } - - fn get_inner(&self) -> CircuitAccount { - self.0.clone() - } - } - - }; -} - -custom_circuit_account!(CircuitAccountDepth11, 11); - -custom_circuit_account!(CircuitAccountDepth32, 32); - -pub trait CircuitAccountWrapper: Sync + Default + GetBits { - fn from_account(account: Account) -> Self; - fn get_inner(&self) -> CircuitAccount; -} - -#[derive(Debug, Deserialize)] -pub struct StorageAccount { - pub id: i64, - pub last_block: i64, - pub nonce: i64, - pub address: String, - pub pubkey_hash: String, -} - -#[derive(Debug, Serialize, Deserialize)] -pub struct StorageBalance { - pub account_id: i64, - pub coin_id: i32, - #[serde(with = "BigUintSerdeAsRadix10Str")] - pub balance: BigUint, -} - -impl TryInto for StorageAccount { - type Error = anyhow::Error; - - fn try_into(self) -> anyhow::Result { - let pub_key_hash_bytes = hex::decode(&self.pubkey_hash)?; - let pub_key_hash = PubKeyHash::from_bytes(&pub_key_hash_bytes)?; - - let address_bytes = hex::decode(&self.address)?; - let address = Address::from_slice(&address_bytes); - - let nonce = Nonce(self.nonce as u32); - - let mut result = Account::default_with_address(&address); - result.nonce = nonce; - result.pub_key_hash = pub_key_hash; - - Ok(result) - } -} - -pub fn read_accounts( - path_to_accounts: String, - path_to_balances: String, -) -> anyhow::Result> { - let accounts_content = fs::read_to_string(path_to_accounts)?; - // \\x is a technical symbol added by Postgres to indicate hex - let accounts_content = accounts_content.replace(r#"\\x"#, ""); - - let balances_content = fs::read_to_string(path_to_balances)?; - - let stored_accounts: Vec = serde_json::from_str(&accounts_content)?; - let stored_balances: Vec = serde_json::from_str(&balances_content)?; - - let mut account_map: HashMap = HashMap::new(); - for stored_account in stored_accounts { - account_map.insert(stored_account.id, stored_account.try_into()?); - } - - for stored_balance in stored_balances { - let account = account_map.get_mut(&stored_balance.account_id).unwrap(); - let balance: BigUint = stored_balance.balance.to_string().parse().unwrap(); - - account.set_balance(TokenId(stored_balance.coin_id as u32), balance); - } - - let accounts: Vec<(i64, Account)> = account_map.drain().collect(); - - Ok(accounts) -} - -pub fn verify_empty( - index: u32, - tree: &CustomMerkleTree, -) -> anyhow::Result<()> { - let account = tree.get(index); - match account { - Some(inner) => { - let zero_account = T::default(); - verify_accounts_equal(index, &zero_account, inner)?; - Ok(()) - } - None => Ok(()), - } -} - -pub fn get_nft_account() -> Account { - let mut nft_account = Account::default_with_address(&NFT_STORAGE_ACCOUNT_ADDRESS); - nft_account.set_balance(NFT_TOKEN_ID, BigUint::from(MIN_NFT_TOKEN_ID)); - - nft_account -} - -pub fn get_nft_circuit_account() -> CircuitAccountDepth32 { - let nft_account = get_nft_account(); - - CircuitAccountDepth32::from_account(nft_account) -} diff --git a/core/bin/regen-root-hash/src/db_migrate.rs b/core/bin/regen-root-hash/src/db_migrate.rs deleted file mode 100644 index ef03fbb80a..0000000000 --- a/core/bin/regen-root-hash/src/db_migrate.rs +++ /dev/null @@ -1,341 +0,0 @@ -use serde::Serialize; -use std::collections::HashMap; -use std::convert::TryInto; -use zksync_crypto::{ - params::{MIN_NFT_TOKEN_ID, NFT_STORAGE_ACCOUNT_ADDRESS, NFT_STORAGE_ACCOUNT_ID, NFT_TOKEN_ID}, - Fr, -}; -use zksync_storage::StorageProcessor; -use zksync_storage::{ - chain::account::{ - records::{ - StorageAccountCreation, - StorageAccountUpdate, - // To remove confusion with the StorageBalance in the `account.rs` - StorageBalance as DbStorageBalance, - }, - restore_account::restore_account, - }, - diff::StorageAccountDiff, - BigDecimal, -}; -use zksync_types::{Account, AccountUpdate, BlockNumber, Token}; - -use crate::{account::CircuitAccountWrapper, hasher::CustomMerkleTree, utils::fr_to_hex}; - -pub async fn get_verified_block_number( - storage: &mut StorageProcessor<'_>, -) -> anyhow::Result { - let last_commited_block = storage - .chain() - .block_schema() - .get_last_committed_block() - .await?; - let last_verifed_block = storage - .chain() - .block_schema() - .get_last_verified_block() - .await?; - let last_verified_confirmed_block = storage - .chain() - .block_schema() - .get_last_verified_confirmed_block() - .await?; - let pending_block_exists = storage - .chain() - .block_schema() - .pending_block_exists() - .await?; - - let the_block_after_last = storage - .chain() - .block_schema() - .get_block(last_verified_confirmed_block + 1) - .await?; - - assert!(the_block_after_last.is_none(), "The block is not last"); - - assert!( - last_commited_block == last_verifed_block, - "There are committed, but not verified blocks" - ); - assert!( - last_commited_block == last_verified_confirmed_block, - "There are verified unconfirmed blocks" - ); - assert!(!pending_block_exists, "There exists a pending block"); - - Ok(last_verified_confirmed_block) -} - -pub async fn read_accounts_from_db() -> anyhow::Result> { - let mut storage_processor = StorageProcessor::establish_connection().await?; - let mut transaction = storage_processor.start_transaction().await?; - - let stored_accounts = transaction - .chain() - .account_schema() - .get_all_accounts() - .await?; - let stored_balances = transaction - .chain() - .account_schema() - .get_all_balances() - .await?; - - let mut accounts_balances: HashMap> = HashMap::new(); - - for stored_account in stored_accounts.iter() { - accounts_balances.insert(stored_account.id, vec![]); - } - - for stored_balance in stored_balances { - let balances_vec = accounts_balances - .get_mut(&stored_balance.account_id) - .unwrap(); - balances_vec.push(stored_balance); - } - - let mut accounts = vec![]; - for stored_account in stored_accounts { - let account_balances = accounts_balances.get(&stored_account.id).unwrap(); - - let account = restore_account(&stored_account, account_balances.to_vec()); - - accounts.push((account.0 .0 as i64, account.1)); - } - - Ok(accounts) -} - -pub async fn add_nft_special_token(storage: &mut StorageProcessor<'_>) -> anyhow::Result<()> { - storage - .tokens_schema() - .store_token(Token { - id: NFT_TOKEN_ID, - symbol: "SPECIAL".to_string(), - address: *NFT_STORAGE_ACCOUNT_ADDRESS, - decimals: 18, - is_nft: true, // TODO: ZKS-635 - }) - .await?; - Ok(()) -} - -pub async fn commit_nft_special_account( - storage: &mut StorageProcessor<'_>, - block_number: BlockNumber, - update_order_id: usize, -) -> anyhow::Result { - let (mut special_account, db_create_special_account) = - Account::create_account(NFT_STORAGE_ACCOUNT_ID, *NFT_STORAGE_ACCOUNT_ADDRESS); - special_account.set_balance(NFT_TOKEN_ID, num::BigUint::from(MIN_NFT_TOKEN_ID)); - - let db_set_special_account_balance = AccountUpdate::UpdateBalance { - old_nonce: special_account.nonce, - new_nonce: special_account.nonce, - balance_update: ( - NFT_TOKEN_ID, - num::BigUint::from(0u64), - num::BigUint::from(MIN_NFT_TOKEN_ID), - ), - }; - - storage - .chain() - .state_schema() - .commit_state_update( - block_number, - &[ - db_create_special_account[0usize].clone(), - (NFT_STORAGE_ACCOUNT_ID, db_set_special_account_balance), - ], - update_order_id, - ) - .await?; - - Ok(special_account) -} - -pub async fn apply_nft_storage_account( - storage: &mut StorageProcessor<'_>, - special_account: Account, - block_number: BlockNumber, - update_order_id: usize, -) -> anyhow::Result<()> { - let account_id: i64 = NFT_STORAGE_ACCOUNT_ID.0.try_into().unwrap(); - let nonce: i64 = special_account.nonce.0.try_into().unwrap(); - let block_number: i64 = block_number.0.try_into().unwrap(); - let update_order_id: i32 = update_order_id.try_into().unwrap(); - let coin_id: i32 = NFT_TOKEN_ID.0.try_into().unwrap(); - - let storage_account_creation = StorageAccountCreation { - account_id, - is_create: true, - block_number, - address: NFT_STORAGE_ACCOUNT_ADDRESS.as_bytes().to_vec(), - nonce, - update_order_id, - }; - - let storage_balance_update = StorageAccountUpdate { - // This value is not used for our pursposes and will not be stored anywhere - // so can put whatever we want here - balance_update_id: 0, - account_id, - block_number, - coin_id, - old_balance: BigDecimal::from(0u64), - new_balance: BigDecimal::from(MIN_NFT_TOKEN_ID), - old_nonce: nonce, - new_nonce: nonce, - update_order_id: update_order_id + 1, - }; - - let create_diff = StorageAccountDiff::Create(storage_account_creation); - let upd_balance_diff = StorageAccountDiff::BalanceUpdate(storage_balance_update); - - storage - .chain() - .state_schema() - .apply_storage_account_diff(create_diff) - .await?; - storage - .chain() - .state_schema() - .apply_storage_account_diff(upd_balance_diff) - .await?; - - Ok(()) -} - -pub async fn insert_nft_account( - storage: &mut StorageProcessor<'_>, - block_number: BlockNumber, -) -> anyhow::Result<()> { - let mut transaction = storage.start_transaction().await?; - - add_nft_special_token(&mut transaction).await?; - - // This number is only used for sorting when applying the block - // Since we are overridining the existing block - // we could enter here any number we want - let update_order_id = 1000; - - let special_account = - commit_nft_special_account(&mut transaction, block_number, update_order_id).await?; - - // Applying account - - apply_nft_storage_account( - &mut transaction, - special_account, - block_number, - update_order_id, - ) - .await?; - - transaction.commit().await?; - - Ok(()) -} - -pub async fn migrage_db_for_nft( - past_root_hash: Fr, - new_tree: CustomMerkleTree, -) -> anyhow::Result<()> { - let mut storage_processor = StorageProcessor::establish_connection().await?; - let mut transaction = storage_processor.start_transaction().await?; - - println!("Retrieving data about the last block..."); - let block_number = get_verified_block_number(&mut transaction).await?; - let last_block = transaction - .chain() - .block_schema() - .get_block(block_number) - .await? - .expect("The block does not exist"); - assert_eq!( - last_block.new_root_hash, past_root_hash, - "The past root hash is not correct" - ); - - println!("The last block's hash is correct. Setting the new root hash..."); - - let new_root_hash = new_tree.root_hash(); - - transaction - .chain() - .block_schema() - .change_block_root_hash(block_number, new_root_hash) - .await?; - - println!("The new root hash is set. Inserting nft account."); - insert_nft_account(&mut transaction, block_number).await?; - - println!("Delete account tree cache for the last block."); - transaction - .chain() - .block_schema() - .reset_account_tree_cache(block_number) - .await?; - - let tree_cache = new_tree.get_internals(); - let tree_cache = serde_json::to_value(tree_cache)?; - transaction - .chain() - .block_schema() - .store_account_tree_cache(block_number, tree_cache) - .await?; - - transaction.commit().await?; - println!("DB migration complete."); - - Ok(()) -} - -#[derive(Serialize)] -#[serde(rename_all = "camelCase")] -struct StoredBlockInfo { - block_number: u32, - priority_operations: u64, - pending_onchain_operations_hash: String, - timestamp: u64, - state_hash: String, - commitment: String, -} - -pub async fn get_last_block_info() -> anyhow::Result { - let mut storage_processor = StorageProcessor::establish_connection().await?; - - let last_block_number = get_verified_block_number(&mut storage_processor).await?; - - let block = storage_processor - .chain() - .block_schema() - .get_block(last_block_number) - .await? - .unwrap(); - - let priority_op_hash = block - .get_onchain_operations_block_info() - .1 - .as_bytes() - .to_vec(); - let priority_op_hash = hex::encode(&priority_op_hash); - - let commitment_str = hex::encode(block.block_commitment.as_bytes()); - - let last_block_info = StoredBlockInfo { - block_number: *block.block_number, - priority_operations: block.number_of_processed_prior_ops(), - pending_onchain_operations_hash: format!("0x{}", priority_op_hash), - timestamp: block.timestamp, - state_hash: format!("0x{}", fr_to_hex(block.new_root_hash)), - commitment: format!("0x{}", commitment_str), - }; - - let info_str = serde_json::ser::to_string(&last_block_info)?; - - Ok(info_str) -} diff --git a/core/bin/regen-root-hash/src/hasher.rs b/core/bin/regen-root-hash/src/hasher.rs deleted file mode 100644 index 9110657e64..0000000000 --- a/core/bin/regen-root-hash/src/hasher.rs +++ /dev/null @@ -1,120 +0,0 @@ -use zksync_crypto::{ - circuit::account::{Balance, CircuitBalanceTree}, - merkle_tree::RescueHasher, - merkle_tree::SparseMerkleTree, - primitives::GetBits, - Engine, Fr, -}; - -use crate::account::CircuitAccountWrapper; -use once_cell::sync::Lazy; -use zksync_types::Account; - -pub static BALANCE_TREE_32: Lazy = Lazy::new(|| SparseMerkleTree::new(32)); -pub static BALANCE_TREE_11: Lazy = Lazy::new(|| SparseMerkleTree::new(11)); - -pub const NUMBER_OF_OLD_TOKENS: u32 = 2u32.pow(11); - -pub type CustomMerkleTree = SparseMerkleTree>; - -pub fn get_state(accounts: &[(i64, Account)]) -> CustomMerkleTree { - let mut account_state_tree: CustomMerkleTree = SparseMerkleTree::new(32); - - for (id, account) in accounts { - let circuit_account = T::from_account(account.clone()); - - account_state_tree.insert(*id as u32, circuit_account); - } - - account_state_tree -} - -type GenericSparseMerkeTree = SparseMerkleTree>; - -pub fn verify_identical_trees( - first_tree: &GenericSparseMerkeTree, - second_tree: &GenericSparseMerkeTree, - elements_to_check: u32, - verify_equality: fn(u32, &T, &S) -> anyhow::Result<()>, -) -> anyhow::Result<()> { - for index in 0..=elements_to_check { - let first_tree_element = first_tree.get(index); - let second_tree_element = second_tree.get(index); - - match (first_tree_element, second_tree_element) { - (Some(first), Some(second)) => verify_equality(index, first, second)?, - (Some(_), None) => { - return Err(anyhow::format_err!( - "The second tree does not contain {}", - index - )) - } - (None, Some(_)) => { - return Err(anyhow::format_err!( - "The first tree does not contain {}", - index - )) - } - (None, None) => continue, // None of the trees contain the element. That is ok - } - } - - Ok(()) -} - -pub fn verify_identical_balances( - index: u32, - first_balance: &Balance, - second_balance: &Balance, -) -> anyhow::Result<()> { - if first_balance.value == second_balance.value { - Ok(()) - } else { - Err(anyhow::format_err!( - "Balance {} differs: first: {}, second:{}", - index, - first_balance.value, - second_balance.value - )) - } -} - -pub fn verify_accounts_equal( - index: u32, - first_account: &T, - second_account: &S, -) -> anyhow::Result<()> { - let first_account = first_account.get_inner(); - let second_account = second_account.get_inner(); - - if first_account.nonce != second_account.nonce { - return Err(anyhow::format_err!( - "The account {} have different nonces", - index - )); - } - if first_account.pub_key_hash != second_account.pub_key_hash { - return Err(anyhow::format_err!( - "The account {} have different pubKeyHash", - index - )); - } - if first_account.address != second_account.address { - return Err(anyhow::format_err!( - "The account {} have different address", - index - )); - } - - verify_identical_trees( - &first_account.subtree, - &second_account.subtree, - // It is better to hardcode the account tree size in one place - // than to create a function which takes this as a param and returns another function - NUMBER_OF_OLD_TOKENS, - verify_identical_balances, - ) - .map_err(|err| anyhow::format_err!("Account {}: {}", index, err))?; - - Ok(()) -} diff --git a/core/bin/regen-root-hash/src/main.rs b/core/bin/regen-root-hash/src/main.rs deleted file mode 100644 index 76e7ad11e7..0000000000 --- a/core/bin/regen-root-hash/src/main.rs +++ /dev/null @@ -1,120 +0,0 @@ -mod account; -mod db_migrate; -mod hasher; -#[cfg(test)] -mod tests; -mod utils; - -use account::{ - get_nft_circuit_account, read_accounts, verify_empty, CircuitAccountDepth11, - CircuitAccountDepth32, -}; - -use structopt::StructOpt; -use utils::{fr_to_hex, get_tx_data}; -use zksync_circuit::witness::utils::fr_from_bytes; - -use hasher::{get_state, verify_accounts_equal, verify_identical_trees}; -use zksync_crypto::params::NFT_STORAGE_ACCOUNT_ID; - -use crate::db_migrate::read_accounts_from_db; -use crate::db_migrate::{get_last_block_info, migrage_db_for_nft}; - -#[derive(Debug, StructOpt)] -pub struct Params { - /// The current root hash (balance subtree depth 11) - #[structopt(short = "h", env = "CURRENT_ROOT_HASH")] - pub current_root_hash: Option, - - /// A flag to tell that we want to migrate the db - #[structopt(long = "db-migrate")] - pub db_migrate: bool, - - /// A flag that indicates that the new tree will not be - /// double-checked. Shoult NOT be used in production - #[structopt(long = "no-double-check")] - pub no_double_check: bool, - - /// Only retrieve StoredBlockInfo about the last block - #[structopt(long = "last-block-info")] - pub last_block_info: bool, - - /// The path to the JSON dump of the accounts table - #[structopt(short = "a", env = "ACCOUNTS_DUMP")] - pub accounts_dump: Option, - - /// The path to the JSON dump of the accounts table - #[structopt(short = "b", env = "BALANCES_DUMP")] - pub balances_dump: Option, -} - -#[tokio::main] -async fn main() -> anyhow::Result<()> { - let params = Params::from_args(); - - if params.last_block_info { - let last_block_info = get_last_block_info().await?; - println!("{}", last_block_info); - return Ok(()); - } - - let current_root_hash = params.current_root_hash.unwrap(); - // Removing 0x... - let current_root_hash = current_root_hash[2..].to_owned(); - - let accounts = if params.db_migrate { - read_accounts_from_db().await? - } else { - let accounts_dump = params - .accounts_dump - .expect("The accounts dump should be provided if we are not interacting wirh db"); - let balances_dump = params - .balances_dump - .expect("The balances dump should be provided if we are not interacting wirh db"); - read_accounts(accounts_dump, balances_dump)? - }; - - let current_hash_bytes = hex::decode(current_root_hash).unwrap(); - let current_hash_fr = fr_from_bytes(current_hash_bytes); - - let old_tree = get_state::(&accounts); - - // Verifying that the nft account is empty - verify_empty(NFT_STORAGE_ACCOUNT_ID.0, &old_tree).unwrap(); - - let old_hash = old_tree.root_hash(); - println!("OldHash: 0x{}", fr_to_hex(old_hash)); - - assert_eq!( - old_hash, current_hash_fr, - "The recalculated hash is not equal to the current one." - ); - - let mut new_tree = get_state::(&accounts); - - if params.no_double_check { - println!("Skipping re-verification of the trees. This should not be used in production."); - } else { - // Verify that each of the u32::MAX accounts has the same accounts in both trees - verify_identical_trees(&old_tree, &new_tree, u32::MAX, verify_accounts_equal).unwrap(); - } - - // The new tree will also contain the NFT_STORAGE_ACCOUNT - let nft_account = get_nft_circuit_account(); - new_tree.insert(NFT_STORAGE_ACCOUNT_ID.0, nft_account); - let new_hash = new_tree.root_hash(); - println!("NewHash: 0x{}", fr_to_hex(new_hash)); - - if params.db_migrate { - println!("Migrating the database to enable NFTs"); - migrage_db_for_nft(old_hash, new_tree).await?; - } else { - let calldata = get_tx_data(old_hash, new_hash); - println!( - "The calldata of the call to regenesis multisig is 0x{}", - calldata - ); - } - - Ok(()) -} diff --git a/core/bin/regen-root-hash/src/tests.rs b/core/bin/regen-root-hash/src/tests.rs deleted file mode 100644 index 4cfa6c93fa..0000000000 --- a/core/bin/regen-root-hash/src/tests.rs +++ /dev/null @@ -1,25 +0,0 @@ -use zksync_circuit::witness::utils::fr_from_bytes; - -use crate::account::{read_accounts, CircuitAccountDepth11}; -use crate::hasher::get_state; - -#[test] -fn test_sample_tree_hashing() { - let accounts = read_accounts( - String::from("./sample/accounts"), - String::from("./sample/balances"), - ) - .unwrap(); - - let expected_hash_str = "2bd61f42837c0fa77fc113b3b341c520edb1ffadefc48c2b907901aaaf42b906"; - let expected_hash_bytes = hex::decode(expected_hash_str).unwrap(); - let expected_hash = fr_from_bytes(expected_hash_bytes); - - let tree = get_state::(&accounts); - let root_hash = tree.root_hash(); - - assert_eq!( - root_hash, expected_hash, - "The recalculated hash is not equal to the current one." - ); -} diff --git a/core/bin/regen-root-hash/src/utils.rs b/core/bin/regen-root-hash/src/utils.rs deleted file mode 100644 index 42d900e63c..0000000000 --- a/core/bin/regen-root-hash/src/utils.rs +++ /dev/null @@ -1,64 +0,0 @@ -use ethabi::Contract; -use std::fs; -use std::io; -use std::str::FromStr; -use zksync_crypto::{ - ff::{PrimeField, PrimeFieldRepr}, - Fr, -}; - -const REGEN_MULTISIG_CONTRACT: &str = - "contracts/artifacts/cache/solpp-generated-contracts/RegenesisMultisig.sol/RegenesisMultisig.json"; - -fn read_file_to_json_value(path: &str) -> io::Result { - let zksync_home = std::env::var("ZKSYNC_HOME").unwrap_or_else(|_| ".".into()); - let path = std::path::Path::new(&zksync_home).join(path); - let contents = fs::read_to_string(path).unwrap(); - let val = serde_json::Value::from_str(&contents).unwrap(); - Ok(val) -} - -pub fn fr_to_bytes(scalar: Fr) -> Vec { - let mut be_bytes = [0u8; 32]; - scalar - .into_repr() - .write_be(be_bytes.as_mut()) - .expect("Write commit bytes"); - - be_bytes.to_vec() -} - -pub fn fr_to_hex(scalar: Fr) -> String { - let be_bytes = fr_to_bytes(scalar); - - hex::encode(be_bytes) -} - -pub fn regen_multisig_contract() -> Contract { - let abi_string = read_file_to_json_value(REGEN_MULTISIG_CONTRACT) - .expect("couldn't read REGEN_MULTISIG_CONTRACT") - .get("abi") - .expect("couldn't get abi from REGEN_MULTISIG_CONTRACT") - .to_string(); - Contract::load(abi_string.as_bytes()).expect("regenesis multiisg contract abi") -} - -// Returns hex-encoded tx data for contract call -pub fn get_tx_data(old_hash: Fr, new_hash: Fr) -> String { - let regen_multisig_contract = regen_multisig_contract(); - - let function = regen_multisig_contract - .function("approveHash") - .expect("no submitHash function"); - - let input_tokens = vec![ - ethabi::Token::FixedBytes(fr_to_bytes(old_hash)), - ethabi::Token::FixedBytes(fr_to_bytes(new_hash)), - ]; - - let calldata = function - .encode_input(&input_tokens) - .expect("Failed to encode bytes"); - - hex::encode(&calldata) -} diff --git a/core/bin/zksync_api/Cargo.toml b/core/bin/zksync_api/Cargo.toml index 21c31d9f61..9837f1fdc8 100644 --- a/core/bin/zksync_api/Cargo.toml +++ b/core/bin/zksync_api/Cargo.toml @@ -25,6 +25,7 @@ zksync_contracts = { path = "../../lib/contracts", version = "1.0" } zksync_eth_client = { path = "../../lib/eth_client", version = "1.0" } zksync_eth_signer = { path = "../../lib/eth_signer", version = "1.0" } zksync_api_client = { path = "../../lib/api_client", version = "0.1" } +zksync_api_types = { path = "../../lib/api_types", version = "1.0" } zksync_prometheus_exporter = { path = "../../lib/prometheus_exporter", version = "1.0" } zksync_balancer = { path = "../../lib/balancer", version = "1.0" } zksync_gateway_watcher = { path = "../../lib/gateway_watcher", version = "1.0" } diff --git a/core/bin/zksync_api/benches/criterion/lib.rs b/core/bin/zksync_api/benches/criterion/lib.rs index 04f5b7bbcd..dfd76b9d85 100644 --- a/core/bin/zksync_api/benches/criterion/lib.rs +++ b/core/bin/zksync_api/benches/criterion/lib.rs @@ -2,41 +2,43 @@ use criterion::{criterion_group, criterion_main, Criterion}; use ethabi::Address; use reqwest::{blocking::Client, StatusCode}; -use zksync_api_client::rest::v1::{IncomingTxBatchForFee, IncomingTxForFee}; -use zksync_types::{TokenLike, TxFeeTypes}; +use zksync_api_types::v02::fee::{ + ApiTxFeeTypes, BatchFeeRequest, TxFeeRequest, TxInBatchFeeRequest, +}; +use zksync_types::{TokenId, TokenLike}; -fn generate_transactions(number: usize) -> IncomingTxBatchForFee { - let mut tx_types = vec![]; - let mut addresses = vec![]; +fn generate_transactions(number: usize) -> BatchFeeRequest { + let mut transactions = Vec::new(); for _ in 0..number { - tx_types.push(TxFeeTypes::Withdraw); - addresses.push(Address::random()); + transactions.push(TxInBatchFeeRequest { + tx_type: ApiTxFeeTypes::Withdraw, + address: Address::random(), + }); } - IncomingTxBatchForFee { - tx_types, - addresses, - token_like: TokenLike::Symbol("wBTC".to_string()), + BatchFeeRequest { + transactions, + token_like: TokenLike::Id(TokenId(2)), // id of wBTC on localhost } } -fn get_txs_batch_fee(client: Client, url: String, transaction: IncomingTxBatchForFee) { +fn get_txs_batch_fee(client: Client, url: String, batch_fee_request: BatchFeeRequest) { let res = client - .post(format!("{}/api/v1/transactions/fee/batch", url).as_str()) - .json(&transaction) + .post(format!("{}/api/v0.2/fee/batch", url).as_str()) + .json(&batch_fee_request) .send() .unwrap(); assert_eq!(res.status(), StatusCode::OK) } fn get_txs_fee(client: Client, url: String) { - let transaction = IncomingTxForFee { - tx_type: TxFeeTypes::Withdraw, + let transaction = TxFeeRequest { + tx_type: ApiTxFeeTypes::Withdraw, address: Address::random(), - token_like: TokenLike::Symbol("wBTC".to_string()), + token_like: TokenLike::Id(TokenId(2)), // id of wBTC on localhost }; let res = client - .post(format!("{}/api/v1/transactions/fee", url).as_str()) + .post(format!("{}/api/v0.2/fee", url).as_str()) .json(&transaction) .send() .unwrap(); @@ -47,7 +49,7 @@ fn bench_fee(c: &mut Criterion) { let url = std::env::var("API_REST_URL").unwrap(); let client = reqwest::blocking::Client::new(); let transaction = generate_transactions(100); - c.bench_function("get_txs_batch_fee_new_version", |b| { + c.bench_function("get_txs_batch_fee", |b| { b.iter(|| get_txs_batch_fee(client.clone(), url.clone(), transaction.clone())) }); c.bench_function("get_txs_fee", |b| { diff --git a/core/bin/zksync_api/src/api_server/admin_server.rs b/core/bin/zksync_api/src/api_server/admin_server.rs index 39829d1f23..108415de1b 100644 --- a/core/bin/zksync_api/src/api_server/admin_server.rs +++ b/core/bin/zksync_api/src/api_server/admin_server.rs @@ -99,18 +99,14 @@ async fn add_token( let id = match token_request.id { Some(id) => id, None => { - let last_token_id = storage - .tokens_schema() - .get_last_token_id() - .await - .map_err(|e| { - vlog::warn!( - "failed get number of token from database in progress request: {}", - e - ); - actix_web::error::ErrorInternalServerError("storage layer error") - })?; - let next_available_id = last_token_id.0 + 1; + let last_token_id = storage.tokens_schema().get_count().await.map_err(|e| { + vlog::warn!( + "failed get number of token from database in progress request: {}", + e + ); + actix_web::error::ErrorInternalServerError("storage layer error") + })?; + let next_available_id = last_token_id + 1; TokenId(next_available_id) } diff --git a/core/bin/zksync_api/src/api_server/event_notify/state.rs b/core/bin/zksync_api/src/api_server/event_notify/state.rs index 9d5303b098..a1b9dac3a2 100644 --- a/core/bin/zksync_api/src/api_server/event_notify/state.rs +++ b/core/bin/zksync_api/src/api_server/event_notify/state.rs @@ -204,6 +204,7 @@ impl NotifierState { .account_schema() .last_committed_state_for_account(id) .await? + .1 } ActionType::VERIFY => { storage diff --git a/core/bin/zksync_api/src/api_server/helpers.rs b/core/bin/zksync_api/src/api_server/helpers.rs index af8958f58e..757c7b21d8 100644 --- a/core/bin/zksync_api/src/api_server/helpers.rs +++ b/core/bin/zksync_api/src/api_server/helpers.rs @@ -5,7 +5,7 @@ // External uses // Workspace uses -use zksync_types::{tx::TxHash, H256}; +use zksync_types::H256; use zksync_utils::remove_prefix; // Local uses @@ -20,14 +20,3 @@ pub fn try_parse_hash(query: &str) -> Result { Ok(H256::from_slice(&slice)) } - -pub fn try_parse_tx_hash(query: &str) -> Result { - const HASH_SIZE: usize = 32; // 32 bytes - - let mut slice = [0_u8; HASH_SIZE]; - - let tx_hex = remove_prefix(query); - hex::decode_to_slice(&tx_hex, &mut slice)?; - - Ok(TxHash::from_slice(&slice).unwrap()) -} diff --git a/core/bin/zksync_api/src/api_server/mod.rs b/core/bin/zksync_api/src/api_server/mod.rs index 0bfefdd530..b42c4a95ad 100644 --- a/core/bin/zksync_api/src/api_server/mod.rs +++ b/core/bin/zksync_api/src/api_server/mod.rs @@ -4,9 +4,6 @@ //! `mod rpc_server` - JSON rpc via HTTP (for request reply functions) //! `mod rpc_subscriptions` - JSON rpc via WebSocket (for request reply functions and subscriptions) -// Public uses -pub use rest::v1; - // External uses use futures::channel::mpsc; // Workspace uses diff --git a/core/bin/zksync_api/src/api_server/rest/v1/error.rs b/core/bin/zksync_api/src/api_server/rest/forced_exit_requests/error.rs similarity index 56% rename from core/bin/zksync_api/src/api_server/rest/v1/error.rs rename to core/bin/zksync_api/src/api_server/rest/forced_exit_requests/error.rs index 3379a3da9d..300cbedd1e 100644 --- a/core/bin/zksync_api/src/api_server/rest/v1/error.rs +++ b/core/bin/zksync_api/src/api_server/rest/forced_exit_requests/error.rs @@ -6,20 +6,20 @@ use actix_web::{dev::Body, http::HeaderValue, HttpResponse, ResponseError}; use reqwest::{header::CONTENT_TYPE, StatusCode}; // Workspace uses -pub use zksync_api_client::rest::v1::ErrorBody; - +use zksync_api_client::rest::error::ErrorBody; // Local uses +use crate::api_server::tx_sender::SubmitError; /// An HTTP error structure. #[derive(Debug)] -pub struct Error { +pub struct ApiError { /// HTTP error code. pub http_code: StatusCode, /// HTTP error content serialized into JSON. pub body: ErrorBody, } -impl Error { +impl ApiError { /// Creates a new Error with the BAD_REQUEST (400) status code. pub fn bad_request(title: impl Display) -> Self { Self::with_code(StatusCode::BAD_REQUEST, title) @@ -30,11 +30,6 @@ impl Error { Self::with_code(StatusCode::INTERNAL_SERVER_ERROR, title) } - /// Creates a new Error with the NOT_IMPLEMENTED (501) status code. - pub fn not_implemented(title: impl Display) -> Self { - Self::with_code(StatusCode::NOT_IMPLEMENTED, title) - } - /// Creates a new Error with the NOT_FOUND (404) status code. pub fn not_found(title: impl Display) -> Self { Self::with_code(StatusCode::NOT_FOUND, title) @@ -50,18 +45,6 @@ impl Error { } } - /// Sets error title. - pub fn title(mut self, title: impl Display) -> Self { - self.body.title = title.to_string(); - self - } - - /// Sets error details. - pub fn detail(mut self, detail: impl Display) -> Self { - self.body.detail = detail.to_string(); - self - } - /// Sets error specific code. pub fn code(mut self, code: u64) -> Self { self.body.code = Some(code); @@ -69,13 +52,13 @@ impl Error { } } -impl Display for Error { +impl Display for ApiError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{} ({})", self.body, self.http_code) } } -impl ResponseError for Error { +impl ResponseError for ApiError { fn status_code(&self) -> reqwest::StatusCode { self.http_code } @@ -94,3 +77,50 @@ impl ResponseError for Error { } } } + +#[derive(Debug, Clone, Copy)] +pub enum SumbitErrorCode { + AccountCloseDisabled = 101, + InvalidParams = 102, + UnsupportedFastProcessing = 103, + IncorrectTx = 104, + TxAdd = 105, + InappropriateFeeToken = 106, + + Internal = 110, + CommunicationCoreServer = 111, + Other = 112, +} + +impl SumbitErrorCode { + fn from_err(err: &SubmitError) -> Self { + match err { + SubmitError::AccountCloseDisabled => Self::AccountCloseDisabled, + SubmitError::InvalidParams(_) => Self::InvalidParams, + SubmitError::UnsupportedFastProcessing => Self::UnsupportedFastProcessing, + SubmitError::IncorrectTx(_) => Self::IncorrectTx, + SubmitError::TxAdd(_) => Self::TxAdd, + SubmitError::InappropriateFeeToken => Self::InappropriateFeeToken, + SubmitError::CommunicationCoreServer(_) => Self::CommunicationCoreServer, + SubmitError::Internal(_) => Self::Internal, + SubmitError::Other(_) => Self::Other, + } + } + + fn as_code(self) -> u64 { + self as u64 + } +} + +impl From for ApiError { + fn from(inner: SubmitError) -> Self { + let internal_code = SumbitErrorCode::from_err(&inner).as_code(); + + if let SubmitError::Internal(err) = &inner { + ApiError::internal(err) + } else { + ApiError::bad_request(inner) + } + .code(internal_code) + } +} diff --git a/core/bin/zksync_api/src/api_server/rest/forced_exit_requests/mod.rs b/core/bin/zksync_api/src/api_server/rest/forced_exit_requests/mod.rs index 73a3475309..6bb32ef44e 100644 --- a/core/bin/zksync_api/src/api_server/rest/forced_exit_requests/mod.rs +++ b/core/bin/zksync_api/src/api_server/rest/forced_exit_requests/mod.rs @@ -2,17 +2,19 @@ use actix_web::{web, Scope}; // Workspace uses -pub use zksync_api_client::rest::v1::{ - Client, ClientError, FastProcessingQuery, IncomingTx, IncomingTxBatch, Pagination, - PaginationQuery, Receipt, TxData, MAX_LIMIT, -}; +pub use zksync_api_client::rest::client::{Client, ClientError}; use zksync_config::ZkSyncConfig; use zksync_storage::ConnectionPool; // Local uses use crate::api_server::forced_exit_checker::ForcedExitChecker; +use error::ApiError; + +mod error; mod v01; +pub type JsonResult = std::result::Result, ApiError>; + pub(crate) fn api_scope(connection_pool: ConnectionPool, config: &ZkSyncConfig) -> Scope { let fe_age_checker = ForcedExitChecker::new(&config); web::scope("/api/forced_exit_requests").service(v01::api_scope( diff --git a/core/bin/zksync_api/src/api_server/rest/forced_exit_requests/v01.rs b/core/bin/zksync_api/src/api_server/rest/forced_exit_requests/v01.rs index ef999d31d5..5f5dda76ba 100644 --- a/core/bin/zksync_api/src/api_server/rest/forced_exit_requests/v01.rs +++ b/core/bin/zksync_api/src/api_server/rest/forced_exit_requests/v01.rs @@ -17,9 +17,6 @@ use std::{convert::TryInto, ops::Add}; pub use zksync_api_client::rest::forced_exit_requests::{ ForcedExitRegisterRequest, ForcedExitRequestStatus, }; -pub use zksync_api_client::rest::v1::{ - FastProcessingQuery, IncomingTx, IncomingTxBatch, Receipt, TxData, -}; use zksync_api_client::rest::forced_exit_requests::ConfigInfo; use zksync_config::ZkSyncConfig; @@ -33,8 +30,7 @@ use zksync_types::{ }; // Local uses -use crate::api_server::rest::v1::{Error as ApiError, JsonResult}; - +use super::{error::ApiError, JsonResult}; use crate::api_server::forced_exit_checker::ForcedExitAccountAgeChecker; /// Shared data between `/api/forced_exit_requests/v0.1/` endpoints. @@ -255,14 +251,16 @@ mod tests { use num::BigUint; - use zksync_api_client::rest::v1::Client; + use zksync_api_client::rest::client::Client; use zksync_config::ForcedExitRequestsConfig; use zksync_storage::ConnectionPool; use zksync_types::{Address, TokenId}; use super::*; - use crate::api_server::forced_exit_checker::DummyForcedExitChecker; - use crate::api_server::v1::test_utils::TestServerConfig; + use crate::api_server::{ + forced_exit_checker::DummyForcedExitChecker, + rest::v02::{test_utils::TestServerConfig, SharedData}, + }; struct TestServer { api_server: actix_web::test::TestServer, @@ -274,14 +272,17 @@ mod tests { async fn from_config(cfg: TestServerConfig) -> anyhow::Result<(Client, Self)> { let pool = cfg.pool.clone(); - let (api_client, api_server) = - cfg.start_server_with_scope(String::from("api/forced_exit_requests"), move |cfg| { + let (api_client, api_server) = cfg.start_server_with_scope( + String::from("api/forced_exit_requests"), + move |cfg| { api_scope( cfg.pool.clone(), &cfg.config, Box::new(DummyForcedExitChecker {}), ) - }); + }, + Option::::None, + ); Ok((api_client, Self { api_server, pool })) } diff --git a/core/bin/zksync_api/src/api_server/rest/helpers.rs b/core/bin/zksync_api/src/api_server/rest/helpers.rs index 7e1a62a122..c553c3daf7 100644 --- a/core/bin/zksync_api/src/api_server/rest/helpers.rs +++ b/core/bin/zksync_api/src/api_server/rest/helpers.rs @@ -1,6 +1,5 @@ //! Utilities for the REST API. -use crate::core_api_client::EthBlockId; use actix_web::{HttpResponse, Result as ActixResult}; use std::collections::HashMap; use zksync_storage::chain::{ @@ -29,7 +28,6 @@ pub fn block_verified(block: &StorageBlockDetails) -> bool { pub fn deposit_op_to_tx_by_hash( tokens: &HashMap, op: &PriorityOp, - eth_block: EthBlockId, ) -> Option { match &op.data { ZkSyncPriorityOp::Deposit(deposit) => { @@ -54,7 +52,7 @@ pub fn deposit_op_to_tx_by_hash( "token": token_symbol }, "type": "Deposit", - "eth_block_number": eth_block, + "eth_block_number": op.eth_block, }); Some(TxByHashResponse { diff --git a/core/bin/zksync_api/src/api_server/rest/mod.rs b/core/bin/zksync_api/src/api_server/rest/mod.rs index fb86a46a26..0c4888c704 100644 --- a/core/bin/zksync_api/src/api_server/rest/mod.rs +++ b/core/bin/zksync_api/src/api_server/rest/mod.rs @@ -17,7 +17,6 @@ mod forced_exit_requests; mod helpers; mod v01; pub mod v02; -pub mod v1; async fn start_server( api_v01: ApiV01, @@ -28,16 +27,6 @@ async fn start_server( HttpServer::new(move || { let api_v01 = api_v01.clone(); - let api_v1_scope = { - let tx_sender = TxSender::new( - api_v01.connection_pool.clone(), - sign_verifier.clone(), - fee_ticker.clone(), - &api_v01.config, - ); - v1::api_scope(tx_sender, &api_v01.config) - }; - let forced_exit_requests_api_scope = forced_exit_requests::api_scope(api_v01.connection_pool.clone(), &api_v01.config); @@ -54,7 +43,6 @@ async fn start_server( .wrap(Cors::new().send_wildcard().max_age(3600).finish()) .wrap(vlog::actix_middleware()) .service(api_v01.into_scope()) - .service(api_v1_scope) .service(forced_exit_requests_api_scope) .service(api_v02_scope) // Endpoint needed for js isReachable diff --git a/core/bin/zksync_api/src/api_server/rest/v01/api_decl.rs b/core/bin/zksync_api/src/api_server/rest/v01/api_decl.rs index 6471c48c88..2b0df4f9a5 100644 --- a/core/bin/zksync_api/src/api_server/rest/v01/api_decl.rs +++ b/core/bin/zksync_api/src/api_server/rest/v01/api_decl.rs @@ -5,10 +5,11 @@ use crate::{ helpers::*, v01::{caches::Caches, network_status::SharedNetworkStatus}, }, - core_api_client::{CoreApiClient, EthBlockId}, + core_api_client::CoreApiClient, }; use actix_web::{web, HttpResponse, Result as ActixResult}; use futures::channel::mpsc; +use zksync_api_types::PriorityOpLookupQuery; use zksync_config::ZkSyncConfig; use zksync_storage::{ chain::{ @@ -201,7 +202,7 @@ impl ApiV01 { if let Ok(block_details) = transaction .chain() .block_schema() - .load_block_range(block_id, 1) + .load_block_range_desc(block_id, 1) .await { // Unverified blocks can still change, so we can't cache them. @@ -228,7 +229,7 @@ impl ApiV01 { let mut blocks = storage .chain() .block_schema() - .load_block_range(block_id, 1) + .load_block_range_desc(block_id, 1) .await .map_err(|err| { vlog::warn!("Internal Server Error: '{}'; input: {}", err, *block_id); @@ -274,7 +275,9 @@ impl ApiV01 { pub(crate) async fn get_unconfirmed_op_by_hash( &self, eth_tx_hash: H256, - ) -> Result, anyhow::Error> { - self.api_client.get_unconfirmed_op(eth_tx_hash).await + ) -> Result, anyhow::Error> { + self.api_client + .get_unconfirmed_op(PriorityOpLookupQuery::ByEthHash(eth_tx_hash)) + .await } } diff --git a/core/bin/zksync_api/src/api_server/rest/v01/api_impl.rs b/core/bin/zksync_api/src/api_server/rest/v01/api_impl.rs index 78437cd90c..19cafde5ad 100644 --- a/core/bin/zksync_api/src/api_server/rest/v01/api_impl.rs +++ b/core/bin/zksync_api/src/api_server/rest/v01/api_impl.rs @@ -12,6 +12,7 @@ use crate::api_server::{ }, }; use actix_web::{web, HttpResponse, Result as ActixResult}; +use chrono::Duration; use num::{rational::Ratio, BigUint, FromPrimitive}; use std::time::Instant; use zksync_storage::chain::operations_ext::SearchDirection; @@ -379,7 +380,7 @@ impl ApiV01 { // If eth watcher has a priority op with given hash, transform it // to TxByHashResponse and assign it to res. - if let Some((eth_block, priority_op)) = unconfirmed_op { + if let Some(priority_op) = unconfirmed_op { let tokens = self_ .access_storage() .await? @@ -391,7 +392,7 @@ impl ApiV01 { HttpResponse::InternalServerError().finish() })?; - res = deposit_op_to_tx_by_hash(&tokens, &priority_op, eth_block); + res = deposit_op_to_tx_by_hash(&tokens, &priority_op); } metrics::histogram!("api.v01.tx_by_hash", start.elapsed()); @@ -441,7 +442,7 @@ impl ApiV01 { let resp = storage .chain() .block_schema() - .load_block_range(BlockNumber(max_block), limit) + .load_block_range_desc(BlockNumber(max_block), limit) .await .map_err(|err| { vlog::warn!( @@ -512,14 +513,29 @@ impl ApiV01 { pub async fn withdrawal_processing_time(self_: web::Data) -> ActixResult { let start = Instant::now(); + let mut storage = self_.access_storage().await?; + let block_number = storage + .chain() + .block_schema() + .get_last_saved_block() + .await + .expect("Database error"); + let block = storage + .chain() + .block_schema() + .get_block(block_number) + .await + .expect("Database error") + .expect("Should exist"); let state_keeper_config = &self_.config.chain.state_keeper; + let average_proof_generating_time = Duration::minutes(30); + let normal = block.timestamp_utc() + + Duration::from_std(state_keeper_config.block_execute_deadline()).unwrap() + + average_proof_generating_time * 2i32; + let fast = block.timestamp_utc() + average_proof_generating_time * 2i32; let processing_time = WithdrawalProcessingTimeResponse { - normal: (state_keeper_config.miniblock_iteration_interval() - * state_keeper_config.miniblock_iterations as u32) - .as_secs(), - fast: (state_keeper_config.miniblock_iteration_interval() - * state_keeper_config.fast_block_miniblock_iterations as u32) - .as_secs(), + normal: normal.timestamp() as u64, + fast: fast.timestamp() as u64, }; metrics::histogram!("api.v01.withdrawal_processing_time", start.elapsed()); diff --git a/core/bin/zksync_api/src/api_server/rest/v01/network_status.rs b/core/bin/zksync_api/src/api_server/rest/v01/network_status.rs index 452872f5a4..7ea783a74a 100644 --- a/core/bin/zksync_api/src/api_server/rest/v01/network_status.rs +++ b/core/bin/zksync_api/src/api_server/rest/v01/network_status.rs @@ -38,7 +38,7 @@ impl SharedNetworkStatus { let mut runtime = Runtime::new().expect("tokio runtime creation"); let state_update_task = async move { - let mut timer = time::interval(Duration::from_millis(1000)); + let mut timer = time::interval(Duration::from_millis(30000)); loop { timer.tick().await; diff --git a/core/bin/zksync_api/src/api_server/rest/v02/account.rs b/core/bin/zksync_api/src/api_server/rest/v02/account.rs new file mode 100644 index 0000000000..a42712d495 --- /dev/null +++ b/core/bin/zksync_api/src/api_server/rest/v02/account.rs @@ -0,0 +1,674 @@ +//! Account part of API implementation. + +// Built-in uses +use std::collections::BTreeMap; +use std::str::FromStr; + +// External uses +use actix_web::{web, Scope}; + +// Workspace uses +use zksync_api_types::v02::{ + account::{Account, AccountAddressOrId, AccountState}, + pagination::{ + parse_query, AccountTxsRequest, ApiEither, Paginated, PaginationQuery, PendingOpsRequest, + }, + transaction::{Transaction, TxHashSerializeWrapper}, +}; +use zksync_crypto::params::{MIN_NFT_TOKEN_ID, NFT_TOKEN_ID_VAL}; +use zksync_storage::{ConnectionPool, StorageProcessor}; +use zksync_types::{tx::TxHash, AccountId, Address, BlockNumber, SerialId}; + +// Local uses +use super::{ + error::{Error, InvalidDataError}, + paginate_trait::Paginate, + response::ApiResult, +}; +use crate::{ + api_try, core_api_client::CoreApiClient, fee_ticker::PriceError, + utils::token_db_cache::TokenDBCache, +}; + +/// Shared data between `api/v02/accounts` endpoints. +#[derive(Clone)] +struct ApiAccountData { + pool: ConnectionPool, + tokens: TokenDBCache, + core_api_client: CoreApiClient, +} + +impl ApiAccountData { + fn new(pool: ConnectionPool, tokens: TokenDBCache, core_api_client: CoreApiClient) -> Self { + Self { + pool, + tokens, + core_api_client, + } + } + + async fn get_id_by_address_or_id( + &self, + account_address_or_id: AccountAddressOrId, + ) -> Result, Error> { + match account_address_or_id { + AccountAddressOrId::Id(account_id) => Ok(Some(account_id)), + AccountAddressOrId::Address(address) => { + let mut storage = self.pool.access_storage().await.map_err(Error::storage)?; + let account_id = storage + .chain() + .account_schema() + .account_id_by_address(address) + .await + .map_err(Error::storage)?; + Ok(account_id) + } + } + } + + async fn get_address_by_address_or_id( + &self, + account_address_or_id: AccountAddressOrId, + ) -> Result { + match account_address_or_id { + AccountAddressOrId::Id(account_id) => { + let mut storage = self.pool.access_storage().await.map_err(Error::storage)?; + let address = storage + .chain() + .account_schema() + .account_address_by_id(account_id) + .await + .map_err(Error::storage)?; + address.ok_or_else(|| Error::from(InvalidDataError::AccountNotFound)) + } + AccountAddressOrId::Address(address) => Ok(address), + } + } + + fn parse_account_id_or_address( + &self, + account_address_or_id: &str, + ) -> Result { + if let Ok(account_id) = u32::from_str(account_address_or_id) { + Ok(AccountAddressOrId::Id(AccountId(account_id))) + } else { + let address_str = if let Some(address_str) = account_address_or_id.strip_prefix("0x") { + address_str + } else { + account_address_or_id + }; + + if let Ok(address) = Address::from_str(address_str) { + Ok(AccountAddressOrId::Address(address)) + } else { + Err(Error::from(InvalidDataError::InvalidAccountIdOrAddress)) + } + } + } + + async fn api_account( + &self, + account: zksync_types::Account, + account_id: AccountId, + last_update_in_block: BlockNumber, + storage: &mut StorageProcessor<'_>, + ) -> Result { + let mut balances = BTreeMap::new(); + let mut nfts = BTreeMap::new(); + for (token_id, balance) in account.get_nonzero_balances() { + match token_id.0 { + NFT_TOKEN_ID_VAL => { + // Don't include special token to balances or nfts + } + MIN_NFT_TOKEN_ID..=NFT_TOKEN_ID_VAL => { + // https://github.com/rust-lang/rust/issues/37854 + // Exclusive range is an experimental feature, but we have already checked the last value in the previous step + nfts.insert( + token_id, + self.tokens + .get_nft_by_id(storage, token_id) + .await + .map_err(Error::storage)? + .ok_or_else(|| Error::from(PriceError::token_not_found(token_id)))? + .into(), + ); + } + _ => { + let token_symbol = self + .tokens + .token_symbol(storage, token_id) + .await + .map_err(Error::storage)? + .ok_or_else(|| Error::from(PriceError::token_not_found(token_id)))?; + balances.insert(token_symbol, balance); + } + } + } + let minted_nfts = account + .minted_nfts + .iter() + .map(|(id, nft)| (*id, nft.clone().into())) + .collect(); + + let account_type = storage + .chain() + .account_schema() + .account_type_by_id(account_id) + .await + .map_err(Error::storage)? + .map(|t| t.into()); + Ok(Account { + account_id, + address: account.address, + nonce: account.nonce, + pub_key_hash: account.pub_key_hash, + last_update_in_block, + balances, + account_type, + nfts, + minted_nfts, + }) + } + + async fn account_committed_info( + &self, + account_id: AccountId, + ) -> Result, Error> { + let mut storage = self.pool.access_storage().await.map_err(Error::storage)?; + let mut transaction = storage.start_transaction().await.map_err(Error::storage)?; + let account = transaction + .chain() + .account_schema() + .last_committed_state_for_account(account_id) + .await + .map_err(Error::storage)? + .1; + let result = if let Some(account) = account { + let last_block = transaction + .chain() + .account_schema() + .last_committed_block_with_update_for_acc(account_id) + .await + .map_err(Error::storage)?; + Ok(Some( + self.api_account(account, account_id, last_block, &mut transaction) + .await?, + )) + } else { + Ok(None) + }; + transaction.commit().await.map_err(Error::storage)?; + result + } + + async fn account_finalized_info( + &self, + account_id: AccountId, + ) -> Result, Error> { + let mut storage = self.pool.access_storage().await.map_err(Error::storage)?; + let mut transaction = storage.start_transaction().await.map_err(Error::storage)?; + let (last_block, account) = transaction + .chain() + .account_schema() + .account_and_last_block(account_id) + .await + .map_err(Error::storage)?; + let result = if let Some(account) = account { + Ok(Some( + self.api_account( + account, + account_id, + BlockNumber(last_block as u32), + &mut transaction, + ) + .await?, + )) + } else { + Ok(None) + }; + transaction.commit().await.map_err(Error::storage)?; + result + } + + async fn account_full_info(&self, account_id: AccountId) -> Result { + let mut storage = self.pool.access_storage().await.map_err(Error::storage)?; + let mut transaction = storage.start_transaction().await.map_err(Error::storage)?; + let (finalized_state, committed_state) = transaction + .chain() + .account_schema() + .last_committed_state_for_account(account_id) + .await + .map_err(Error::storage)?; + let finalized = if let Some(account) = finalized_state.1 { + Some( + self.api_account( + account, + account_id, + BlockNumber(finalized_state.0 as u32), + &mut transaction, + ) + .await?, + ) + } else { + None + }; + let committed = if let Some(account) = committed_state { + let last_block = transaction + .chain() + .account_schema() + .last_committed_block_with_update_for_acc(account_id) + .await + .map_err(Error::storage)?; + Some( + self.api_account(account, account_id, last_block, &mut transaction) + .await?, + ) + } else { + None + }; + transaction.commit().await.map_err(Error::storage)?; + Ok(AccountState { + committed, + finalized, + }) + } + + async fn account_txs( + &self, + query: PaginationQuery>, + address: Address, + ) -> Result, Error> { + let mut storage = self.pool.access_storage().await.map_err(Error::storage)?; + let new_query = PaginationQuery { + from: AccountTxsRequest { + address, + tx_hash: query.from, + }, + limit: query.limit, + direction: query.direction, + }; + storage.paginate_checked(&new_query).await + } + + /// Pending deposits can be matched only with addresses, + /// while pending full exits can be matched only with account ids. + /// If the account isn't created yet it doesn't have an id + /// but we can still find pending deposits for its address that is why account_id is Option. + async fn account_pending_txs( + &self, + query: PaginationQuery>, + address: Address, + account_id: Option, + ) -> Result, Error> { + let new_query = PaginationQuery { + from: PendingOpsRequest { + address, + account_id, + serial_id: query.from, + }, + limit: query.limit, + direction: query.direction, + }; + let mut client = self.core_api_client.clone(); + client.paginate_checked(&new_query).await + } +} + +async fn account_committed_info( + data: web::Data, + web::Path(account_id_or_address): web::Path, +) -> ApiResult> { + let address_or_id = api_try!(data.parse_account_id_or_address(&account_id_or_address)); + let account_id = api_try!(data.get_id_by_address_or_id(address_or_id).await); + if let Some(account_id) = account_id { + data.account_committed_info(account_id).await.into() + } else { + ApiResult::Ok(None) + } +} + +async fn account_finalized_info( + data: web::Data, + web::Path(account_id_or_address): web::Path, +) -> ApiResult> { + let address_or_id = api_try!(data.parse_account_id_or_address(&account_id_or_address)); + let account_id = api_try!(data.get_id_by_address_or_id(address_or_id).await); + if let Some(account_id) = account_id { + data.account_finalized_info(account_id).await.into() + } else { + ApiResult::Ok(None) + } +} + +async fn account_full_info( + data: web::Data, + web::Path(account_id_or_address): web::Path, +) -> ApiResult { + let address_or_id = api_try!(data.parse_account_id_or_address(&account_id_or_address)); + let account_id = api_try!(data.get_id_by_address_or_id(address_or_id).await); + if let Some(account_id) = account_id { + data.account_full_info(account_id).await.into() + } else { + ApiResult::Ok(AccountState { + committed: None, + finalized: None, + }) + } +} + +async fn account_txs( + data: web::Data, + web::Path(account_id_or_address): web::Path, + web::Query(query): web::Query>, +) -> ApiResult> { + let query = api_try!(parse_query(query).map_err(Error::from)); + let address_or_id = api_try!(data.parse_account_id_or_address(&account_id_or_address)); + let address = api_try!(data.get_address_by_address_or_id(address_or_id).await); + data.account_txs(query, address).await.into() +} + +async fn account_pending_txs( + data: web::Data, + web::Path(account_id_or_address): web::Path, + web::Query(query): web::Query>, +) -> ApiResult> { + let query = api_try!(parse_query(query).map_err(Error::from)); + let address_or_id = api_try!(data.parse_account_id_or_address(&account_id_or_address)); + let address = api_try!( + data.get_address_by_address_or_id(address_or_id.clone()) + .await + ); + let account_id = api_try!(data.get_id_by_address_or_id(address_or_id).await); + data.account_pending_txs(query, address, account_id) + .await + .into() +} + +pub fn api_scope( + pool: ConnectionPool, + tokens: TokenDBCache, + core_api_client: CoreApiClient, +) -> Scope { + let data = ApiAccountData::new(pool, tokens, core_api_client); + + web::scope("accounts") + .data(data) + .route( + "{account_id_or_address}/committed", + web::get().to(account_committed_info), + ) + .route( + "{account_id_or_address}/finalized", + web::get().to(account_finalized_info), + ) + .route("{account_id_or_address}", web::get().to(account_full_info)) + .route( + "{account_id_or_address}/transactions", + web::get().to(account_txs), + ) + .route( + "{account_id_or_address}/transactions/pending", + web::get().to(account_pending_txs), + ) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::api_server::rest::v02::{ + test_utils::{deserialize_response_result, TestServerConfig}, + SharedData, + }; + use actix_web::{web::Json, App}; + use chrono::Utc; + use serde::Deserialize; + use serde_json::json; + use std::sync::Arc; + use tokio::sync::Mutex; + use zksync_api_client::rest::client::Client; + use zksync_api_types::v02::{ + pagination::{PaginationDirection, PaginationQuery, PendingOpsRequest}, + transaction::{L1Transaction, TransactionData}, + ApiVersion, + }; + use zksync_storage::StorageProcessor; + use zksync_types::{AccountId, Address, H256}; + + type PendingOpsHandle = Arc>; + + fn create_pending_ops_handle() -> PendingOpsHandle { + Arc::new(Mutex::new(json!({ + "list": [], + "pagination": { + "from": 1, + "limit": 1, + "direction": "newer", + "count": 0 + } + }))) + } + + #[derive(Debug, Deserialize)] + struct PendingOpsFlattenRequest { + pub address: Address, + pub account_id: Option, + pub serial_id: String, + pub limit: u32, + pub direction: PaginationDirection, + } + + fn get_unconfirmed_ops_loopback( + ops_handle: PendingOpsHandle, + ) -> (CoreApiClient, actix_web::test::TestServer) { + async fn get_ops( + data: web::Data, + web::Query(_query): web::Query, + ) -> Json { + Json(data.lock().await.clone()) + } + + let server = actix_web::test::start(move || { + App::new().service( + web::scope("unconfirmed_ops") + .data(ops_handle.clone()) + .route("", web::get().to(get_ops)), + ) + }); + + let url = server.url("").trim_end_matches('/').to_owned(); + (CoreApiClient::new(url), server) + } + + struct TestServer { + core_server: actix_web::test::TestServer, + api_server: actix_web::test::TestServer, + pool: ConnectionPool, + pending_ops: PendingOpsHandle, + } + + impl TestServer { + async fn new() -> anyhow::Result<(Client, Self)> { + let cfg = TestServerConfig::default(); + cfg.fill_database().await?; + + let pending_ops = create_pending_ops_handle(); + let (core_client, core_server) = get_unconfirmed_ops_loopback(pending_ops.clone()); + + let pool = cfg.pool.clone(); + + let shared_data = SharedData { + net: cfg.config.chain.eth.network, + api_version: ApiVersion::V02, + }; + let (api_client, api_server) = cfg.start_server( + move |cfg: &TestServerConfig| { + api_scope(cfg.pool.clone(), TokenDBCache::new(), core_client.clone()) + }, + Some(shared_data), + ); + + Ok(( + api_client, + Self { + core_server, + api_server, + pool, + pending_ops, + }, + )) + } + + async fn account_id_and_tx_hash( + storage: &mut StorageProcessor<'_>, + block: BlockNumber, + ) -> anyhow::Result<(AccountId, TxHash)> { + let transactions = storage + .chain() + .block_schema() + .get_block_transactions(block) + .await?; + + let tx = &transactions[1]; + let op = tx.op.as_object().unwrap(); + + let id = if op.contains_key("accountId") { + serde_json::from_value(op["accountId"].clone()).unwrap() + } else { + serde_json::from_value(op["creatorId"].clone()).unwrap() + }; + Ok((id, TxHash::from_str(&tx.tx_hash).unwrap())) + } + + async fn stop(self) { + self.api_server.stop().await; + self.core_server.stop().await; + } + } + + #[actix_rt::test] + #[cfg_attr( + not(feature = "api_test"), + ignore = "Use `zk test rust-api` command to perform this test" + )] + async fn unconfirmed_deposits_loopback() -> anyhow::Result<()> { + let (client, server) = get_unconfirmed_ops_loopback(create_pending_ops_handle()); + client + .get_unconfirmed_ops(&PaginationQuery { + from: PendingOpsRequest { + address: Address::default(), + account_id: Some(AccountId::default()), + serial_id: ApiEither::from(0), + }, + limit: 0, + direction: PaginationDirection::Newer, + }) + .await?; + + server.stop().await; + Ok(()) + } + + #[actix_rt::test] + #[cfg_attr( + not(feature = "api_test"), + ignore = "Use `zk test rust-api` command to perform this test" + )] + async fn accounts_scope() -> anyhow::Result<()> { + let (client, server) = TestServer::new().await?; + + // Get account information. + let (account_id, tx_hash) = TestServer::account_id_and_tx_hash( + &mut server.pool.access_storage().await?, + BlockNumber(1), + ) + .await?; + + let response = client + .account_info(&account_id.to_string(), "committed") + .await?; + let account_committed_info_by_id: Account = deserialize_response_result(response)?; + + let address = account_committed_info_by_id.address; + let response = client + .account_info(&format!("{:?}", address), "committed") + .await?; + let account_committed_info_by_address: Account = deserialize_response_result(response)?; + assert_eq!( + account_committed_info_by_id, + account_committed_info_by_address + ); + + let response = client + .account_info(&format!("{:?}", address), "finalized") + .await?; + let account_finalized_info: Option = deserialize_response_result(response)?; + + let response = client.account_full_info(&format!("{:?}", address)).await?; + let account_full_info: AccountState = deserialize_response_result(response)?; + assert_eq!( + account_full_info.committed, + Some(account_committed_info_by_id) + ); + assert_eq!(account_full_info.finalized, account_finalized_info); + + let query = PaginationQuery { + from: ApiEither::from(tx_hash), + limit: 1, + direction: PaginationDirection::Newer, + }; + let response = client.account_txs(&query, &account_id.to_string()).await?; + let txs: Paginated = deserialize_response_result(response)?; + assert_eq!(txs.list[0].tx_hash, tx_hash); + // Provide unconfirmed pending ops. + *server.pending_ops.lock().await = json!({ + "list": [ + { + "txHash": TxHash::from_slice(&[0u8; 32]), + "blockNumber": Option::::None, + "op": { + "type": "Deposit", + "from": Address::default(), + "tokenId": 0, + "amount": "100500", + "to": address, + "accountId": Option::::None, + "ethHash": H256::from_slice(&[0u8; 32]), + "id": 10, + "txHash": TxHash::from_slice(&[0u8; 32]) + }, + "status": "queued", + "failReason": Option::::None, + "createdAt": Utc::now() + } + ], + "pagination": { + "from": 1, + "limit": 1, + "count": 1, + "direction": "newer" + } + }); + + let query = PaginationQuery { + from: ApiEither::from(1), + limit: 1, + direction: PaginationDirection::Newer, + }; + let response = client + .account_pending_txs(&query, &account_id.to_string()) + .await?; + let txs: Paginated = deserialize_response_result(response)?; + match &txs.list[0].op { + TransactionData::L1(tx) => match tx { + L1Transaction::Deposit(deposit) => { + assert_eq!(deposit.id, 10); + } + _ => panic!("should return deposit"), + }, + _ => panic!("account_pending_txs returned L2 tx"), + } + + server.stop().await; + Ok(()) + } +} diff --git a/core/bin/zksync_api/src/api_server/rest/v02/block.rs b/core/bin/zksync_api/src/api_server/rest/v02/block.rs new file mode 100644 index 0000000000..10a844abbf --- /dev/null +++ b/core/bin/zksync_api/src/api_server/rest/v02/block.rs @@ -0,0 +1,286 @@ +//! Block part of API implementation. + +// Built-in uses +use std::str::FromStr; + +// External uses +use actix_web::{web, Scope}; + +// Workspace uses +use zksync_api_types::v02::{ + block::{BlockInfo, BlockStatus}, + pagination::{parse_query, ApiEither, BlockAndTxHash, Paginated, PaginationQuery}, + transaction::{Transaction, TxHashSerializeWrapper}, +}; +use zksync_crypto::{convert::FeConvert, Fr}; +use zksync_storage::{chain::block::records::StorageBlockDetails, ConnectionPool, QueryResult}; +use zksync_types::{tx::TxHash, BlockNumber, H256}; + +// Local uses +use super::{ + error::{Error, InvalidDataError}, + paginate_trait::Paginate, + response::ApiResult, +}; +use crate::{api_try, utils::block_details_cache::BlockDetailsCache}; + +pub fn block_info_from_details(details: StorageBlockDetails) -> BlockInfo { + let status = if details.is_verified() { + BlockStatus::Finalized + } else { + BlockStatus::Committed + }; + BlockInfo { + block_number: BlockNumber(details.block_number as u32), + new_state_root: Fr::from_bytes(&details.new_state_root).unwrap_or_else(|err| { + panic!( + "Database provided an incorrect new_state_root field: {:?}, an error occurred {}", + details.new_state_root, err + ) + }), + block_size: details.block_size as u64, + commit_tx_hash: details.commit_tx_hash.map(|bytes| H256::from_slice(&bytes)), + verify_tx_hash: details.verify_tx_hash.map(|bytes| H256::from_slice(&bytes)), + committed_at: details.committed_at, + finalized_at: details.verified_at, + status, + } +} + +/// Shared data between `api/v0.2/blocks` endpoints. +#[derive(Debug, Clone)] +struct ApiBlockData { + pool: ConnectionPool, + verified_blocks_cache: BlockDetailsCache, +} + +impl ApiBlockData { + fn new(pool: ConnectionPool, verified_blocks_cache: BlockDetailsCache) -> Self { + Self { + pool, + verified_blocks_cache, + } + } + + /// Returns information about block with the specified number. + /// + /// This method caches some of the verified blocks. + async fn block_info(&self, block_number: BlockNumber) -> Result, Error> { + let details = self + .verified_blocks_cache + .get(&self.pool, block_number) + .await + .map_err(Error::storage)?; + if let Some(details) = details { + Ok(Some(block_info_from_details(details))) + } else { + Ok(None) + } + } + + async fn get_block_number_by_position( + &self, + block_position: &str, + ) -> Result { + if let Ok(number) = u32::from_str(block_position) { + Ok(BlockNumber(number)) + } else { + match block_position { + "lastCommitted" => self + .get_last_committed_block_number() + .await + .map_err(Error::storage), + "lastFinalized" => self + .get_last_finalized_block_number() + .await + .map_err(Error::storage), + _ => Err(Error::from(InvalidDataError::InvalidBlockPosition)), + } + } + } + + async fn block_page( + &self, + query: PaginationQuery>, + ) -> Result, Error> { + let mut storage = self.pool.access_storage().await.map_err(Error::storage)?; + storage.paginate_checked(&query).await + } + + async fn transaction_page( + &self, + block_number: BlockNumber, + query: PaginationQuery>, + ) -> Result, Error> { + let mut storage = self.pool.access_storage().await.map_err(Error::storage)?; + + let new_query = PaginationQuery { + from: BlockAndTxHash { + block_number, + tx_hash: query.from, + }, + limit: query.limit, + direction: query.direction, + }; + + storage.paginate_checked(&new_query).await + } + + async fn get_last_committed_block_number(&self) -> QueryResult { + let mut storage = self.pool.access_storage().await?; + storage + .chain() + .block_schema() + .get_last_committed_confirmed_block() + .await + } + + async fn get_last_finalized_block_number(&self) -> QueryResult { + let mut storage = self.pool.access_storage().await?; + storage + .chain() + .block_schema() + .get_last_verified_confirmed_block() + .await + } +} + +// Server implementation + +async fn block_pagination( + data: web::Data, + web::Query(query): web::Query>, +) -> ApiResult> { + let query = api_try!(parse_query(query).map_err(Error::from)); + data.block_page(query).await.into() +} + +// TODO: take `block_position` as enum. +// Currently actix path extractor doesn't work with enums: https://github.com/actix/actix-web/issues/318 (ZKS-628) +async fn block_by_position( + data: web::Data, + web::Path(block_position): web::Path, +) -> ApiResult> { + let block_number = api_try!(data.get_block_number_by_position(&block_position).await); + data.block_info(block_number).await.into() +} + +async fn block_transactions( + data: web::Data, + web::Path(block_position): web::Path, + web::Query(query): web::Query>, +) -> ApiResult> { + let block_number = api_try!(data.get_block_number_by_position(&block_position).await); + let query = api_try!(parse_query(query).map_err(Error::from)); + data.transaction_page(block_number, query).await.into() +} + +pub fn api_scope(pool: ConnectionPool, cache: BlockDetailsCache) -> Scope { + let data = ApiBlockData::new(pool, cache); + + web::scope("blocks") + .data(data) + .route("", web::get().to(block_pagination)) + .route("{block_position}", web::get().to(block_by_position)) + .route( + "{block_position}/transactions", + web::get().to(block_transactions), + ) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::api_server::rest::v02::{ + test_utils::{deserialize_response_result, TestServerConfig}, + SharedData, + }; + use zksync_api_types::v02::{ + pagination::PaginationDirection, transaction::TransactionData, ApiVersion, + }; + + #[actix_rt::test] + #[cfg_attr( + not(feature = "api_test"), + ignore = "Use `zk test rust-api` command to perform this test" + )] + async fn blocks_scope() -> anyhow::Result<()> { + let cfg = TestServerConfig::default(); + cfg.fill_database().await?; + + let shared_data = SharedData { + net: cfg.config.chain.eth.network, + api_version: ApiVersion::V02, + }; + let (client, server) = cfg.start_server( + |cfg: &TestServerConfig| api_scope(cfg.pool.clone(), BlockDetailsCache::new(10)), + Some(shared_data), + ); + + let query = PaginationQuery { + from: ApiEither::from(BlockNumber(1)), + limit: 3, + direction: PaginationDirection::Newer, + }; + let expected_blocks: Paginated = { + let mut storage = cfg.pool.access_storage().await?; + storage + .paginate_checked(&query) + .await + .map_err(|err| anyhow::anyhow!(err.message))? + }; + + let response = client.block_by_position("2").await?; + let block: BlockInfo = deserialize_response_result(response)?; + assert_eq!(block, expected_blocks.list[1]); + + let response = client.block_pagination(&query).await?; + let paginated: Paginated = deserialize_response_result(response)?; + assert_eq!(paginated, expected_blocks); + + let block_number = BlockNumber(3); + let expected_txs = { + let mut storage = cfg.pool.access_storage().await?; + storage + .chain() + .block_schema() + .get_block_transactions(block_number) + .await? + }; + assert!(expected_txs.len() >= 3); + let tx_hash_str = expected_txs.first().unwrap().tx_hash.as_str(); + let tx_hash = TxHash::from_str(tx_hash_str).unwrap(); + + let query = PaginationQuery { + from: ApiEither::from(tx_hash), + limit: 2, + direction: PaginationDirection::Older, + }; + + let response = client + .block_transactions(&query, &*block_number.to_string()) + .await?; + let paginated: Paginated = deserialize_response_result(response)?; + assert_eq!(paginated.pagination.count as usize, expected_txs.len()); + assert_eq!(paginated.pagination.limit, query.limit); + assert_eq!(paginated.list.len(), query.limit as usize); + assert_eq!(paginated.pagination.direction, PaginationDirection::Older); + assert_eq!(paginated.pagination.from, tx_hash); + + for (tx, expected_tx) in paginated.list.into_iter().zip(expected_txs) { + assert_eq!( + tx.tx_hash.to_string().replace("sync-tx:", "0x"), + expected_tx.tx_hash + ); + assert_eq!(tx.created_at, Some(expected_tx.created_at)); + assert_eq!(*tx.block_number.unwrap(), expected_tx.block_number as u32); + assert_eq!(tx.fail_reason, expected_tx.fail_reason); + if matches!(tx.op, TransactionData::L2(_)) { + assert_eq!(serde_json::to_value(tx.op).unwrap(), expected_tx.op); + } + } + + server.stop().await; + Ok(()) + } +} diff --git a/core/bin/zksync_api/src/api_server/rest/v02/config.rs b/core/bin/zksync_api/src/api_server/rest/v02/config.rs index c80298f7b8..28f9d08ea2 100644 --- a/core/bin/zksync_api/src/api_server/rest/v02/config.rs +++ b/core/bin/zksync_api/src/api_server/rest/v02/config.rs @@ -4,33 +4,30 @@ // External uses use actix_web::{web, Scope}; -use serde::Serialize; +use serde::{Deserialize, Serialize}; + // Workspace uses +use zksync_api_types::v02::ZksyncVersion; use zksync_config::ZkSyncConfig; use zksync_types::{network::Network, Address}; // Local uses use super::response::ApiResult; -#[derive(Serialize, Debug, Clone, Copy)] -#[serde(rename_all = "snake_case")] -enum ZksyncVersion { - ContractV4, -} - -/// Shared data between `api/v02/config` endpoints. -#[derive(Serialize, Debug, Clone, Copy)] -struct ApiConfigData { +/// Shared data between `api/v0.2/config` endpoints. +#[derive(Deserialize, Serialize, Debug, Clone, Copy, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct ApiConfigData { network: Network, contract: Address, gov_contract: Address, deposit_confirmations: u64, zksync_version: ZksyncVersion, - // TODO: server_version + // TODO: server_version (ZKS-627) } impl ApiConfigData { - fn new(config: &ZkSyncConfig) -> Self { + pub fn new(config: &ZkSyncConfig) -> Self { Self { network: config.chain.eth.network, contract: config.contracts.contract_addr, @@ -42,8 +39,9 @@ impl ApiConfigData { } // Server implementation + async fn config_endpoint(data: web::Data) -> ApiResult { - (*data.into_inner()).into() + ApiResult::Ok(*data.into_inner()) } pub fn api_scope(config: &ZkSyncConfig) -> Scope { @@ -53,3 +51,37 @@ pub fn api_scope(config: &ZkSyncConfig) -> Scope { .data(data) .route("", web::get().to(config_endpoint)) } + +#[cfg(test)] +mod tests { + use super::*; + use crate::api_server::rest::v02::{ + test_utils::{deserialize_response_result, TestServerConfig}, + SharedData, + }; + use zksync_api_types::v02::ApiVersion; + + #[actix_rt::test] + #[cfg_attr( + not(feature = "api_test"), + ignore = "Use `zk test rust-api` command to perform this test" + )] + async fn config_scope() -> anyhow::Result<()> { + let cfg = TestServerConfig::default(); + + let shared_data = SharedData { + net: cfg.config.chain.eth.network, + api_version: ApiVersion::V02, + }; + let (client, server) = cfg.start_server( + |cfg: &TestServerConfig| api_scope(&cfg.config), + Some(shared_data), + ); + let response = client.config().await?; + let api_config: ApiConfigData = deserialize_response_result(response)?; + assert_eq!(api_config, ApiConfigData::new(&cfg.config)); + + server.stop().await; + Ok(()) + } +} diff --git a/core/bin/zksync_api/src/api_server/rest/v02/error.rs b/core/bin/zksync_api/src/api_server/rest/v02/error.rs index 49e68ef86c..8d336dc980 100644 --- a/core/bin/zksync_api/src/api_server/rest/v02/error.rs +++ b/core/bin/zksync_api/src/api_server/rest/v02/error.rs @@ -1,19 +1,51 @@ -use serde::Serialize; +// Built-in uses +use std::fmt::{Display, Formatter}; + +// External uses +use serde::{Deserialize, Serialize}; use serde_repr::Serialize_repr; -use std::fmt::Formatter; +use thiserror::Error; + +// Workspace uses +use zksync_api_types::v02::pagination::{UnknownFromParameter, MAX_LIMIT}; -#[derive(Serialize_repr)] -#[repr(u8)] +// Local uses +use crate::{api_server::tx_sender::SubmitError, fee_ticker::PriceError}; + +#[derive(Serialize_repr, Debug, Deserialize)] +#[repr(u16)] pub enum ErrorCode { - Unreacheable = 0, + UnreacheableError = 0, + CoreApiError = 100, + TokenZeroPriceError = 200, + InvalidCurrency = 201, + InvalidBlockPosition = 202, + InvalidAccountIdOrAddress = 203, + AccountNotFound = 204, + TransactionNotFound = 205, + PaginationLimitTooBig = 206, + QueryDeserializationError = 207, + StorageError = 300, + TokenNotFound = 500, + ExternalApiError = 501, + InternalError = 600, + AccountCloseDisabled = 601, + InvalidParams = 602, + UnsupportedFastProcessing = 603, + IncorrectTx = 604, + TxAddError = 605, + InappropriateFeeToken = 606, + CommunicationCoreServer = 607, + Other = 60_000, } /// Error object in a response -#[derive(Serialize)] +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] pub struct Error { - error_type: String, - code: ErrorCode, - message: String, + pub error_type: String, + pub code: ErrorCode, + pub message: String, } /// Trait that can be used to map custom errors to the object. @@ -40,24 +72,142 @@ where } } -pub struct UnreachableError; +impl Error { + pub fn storage(err: impl Display) -> Error { + Error::from(StorageError::new(err)) + } + + pub fn core_api(err: impl Display) -> Error { + Error::from(CoreApiError::new(err)) + } +} + +#[derive(Error, Debug)] +pub enum InvalidDataError { + #[error("Cannot show price in zero price token")] + TokenZeroPriceError, + #[error("Cannot parse block position. There are only block_number, last_committed, last_finalized options")] + InvalidBlockPosition, + #[error("Cannot parse account id or address")] + InvalidAccountIdOrAddress, + #[error("Account is not found")] + AccountNotFound, + #[error("Cannot parse currency. There are only token_id, usd options")] + InvalidCurrency, + #[error("Transaction is not found")] + TransactionNotFound, + #[error("Limit for pagination should be less than or equal to {}", MAX_LIMIT)] + PaginationLimitTooBig, +} + +impl ApiError for InvalidDataError { + fn error_type(&self) -> String { + String::from("invalidDataError") + } + + fn code(&self) -> ErrorCode { + match self { + Self::TokenZeroPriceError => ErrorCode::TokenZeroPriceError, + Self::InvalidBlockPosition => ErrorCode::InvalidBlockPosition, + Self::InvalidAccountIdOrAddress => ErrorCode::InvalidAccountIdOrAddress, + Self::AccountNotFound => ErrorCode::AccountNotFound, + Self::InvalidCurrency => ErrorCode::InvalidCurrency, + Self::TransactionNotFound => ErrorCode::TransactionNotFound, + Self::PaginationLimitTooBig => ErrorCode::PaginationLimitTooBig, + } + } +} + +#[derive(Debug)] +pub struct StorageError(String); + +impl StorageError { + pub fn new(title: impl Display) -> Self { + Self(title.to_string()) + } +} -impl std::fmt::Display for UnreachableError { +impl Display for StorageError { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!( - f, - "Unreachable error; you should never see this message, \ - please contact us at https://github.com/matter-labs/zksync with a report" - ) + f.write_str(&self.0) + } +} + +impl ApiError for StorageError { + fn error_type(&self) -> String { + String::from("storageError") + } + + fn code(&self) -> ErrorCode { + ErrorCode::StorageError + } +} + +#[derive(Debug)] +pub struct CoreApiError(String); + +impl CoreApiError { + pub fn new(title: impl Display) -> Self { + Self(title.to_string()) + } +} + +impl Display for CoreApiError { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.write_str(&self.0) + } +} + +impl ApiError for CoreApiError { + fn error_type(&self) -> String { + String::from("coreApiError") + } + + fn code(&self) -> ErrorCode { + ErrorCode::CoreApiError + } +} + +impl ApiError for SubmitError { + fn error_type(&self) -> String { + String::from("submitError") + } + + fn code(&self) -> ErrorCode { + match self { + Self::AccountCloseDisabled => ErrorCode::AccountCloseDisabled, + Self::InvalidParams(_) => ErrorCode::InvalidParams, + Self::UnsupportedFastProcessing => ErrorCode::UnsupportedFastProcessing, + Self::IncorrectTx(_) => ErrorCode::IncorrectTx, + Self::TxAdd(_) => ErrorCode::TxAddError, + Self::InappropriateFeeToken => ErrorCode::InappropriateFeeToken, + Self::CommunicationCoreServer(_) => ErrorCode::CommunicationCoreServer, + Self::Internal(_) => ErrorCode::InternalError, + Self::Other(_) => ErrorCode::Other, + } + } +} + +impl ApiError for PriceError { + fn error_type(&self) -> String { + String::from("tokenError") + } + + fn code(&self) -> ErrorCode { + match self { + Self::TokenNotFound(_) => ErrorCode::TokenNotFound, + Self::ApiError(_) => ErrorCode::ExternalApiError, + Self::DBError(_) => ErrorCode::StorageError, + } } } -impl ApiError for UnreachableError { +impl ApiError for UnknownFromParameter { fn error_type(&self) -> String { - String::from("api_error") + String::from("invalidDataError") } fn code(&self) -> ErrorCode { - ErrorCode::Unreacheable + ErrorCode::QueryDeserializationError } } diff --git a/core/bin/zksync_api/src/api_server/rest/v02/fee.rs b/core/bin/zksync_api/src/api_server/rest/v02/fee.rs new file mode 100644 index 0000000000..ead3a6dfba --- /dev/null +++ b/core/bin/zksync_api/src/api_server/rest/v02/fee.rs @@ -0,0 +1,135 @@ +//! Fee part of API implementation. + +// Built-in uses + +// External uses +use actix_web::{ + web::{self, Json}, + Scope, +}; + +// Workspace uses +use zksync_api_types::v02::fee::{ApiFee, BatchFeeRequest, TxFeeRequest}; + +// Local uses +use super::{error::Error, response::ApiResult}; +use crate::api_server::tx_sender::TxSender; + +/// Shared data between `api/v0.2/fee` endpoints. +#[derive(Clone)] +struct ApiFeeData { + tx_sender: TxSender, +} + +impl ApiFeeData { + fn new(tx_sender: TxSender) -> Self { + Self { tx_sender } + } +} + +async fn get_tx_fee( + data: web::Data, + Json(body): Json, +) -> ApiResult { + data.tx_sender + .get_txs_fee_in_wei(body.tx_type.into(), body.address, body.token_like) + .await + .map_err(Error::from) + .map(ApiFee::from) + .into() +} + +async fn get_batch_fee( + data: web::Data, + Json(body): Json, +) -> ApiResult { + let txs = body + .transactions + .into_iter() + .map(|tx| (tx.tx_type.into(), tx.address)) + .collect(); + data.tx_sender + .get_txs_batch_fee_in_wei(txs, body.token_like) + .await + .map_err(Error::from) + .map(ApiFee::from) + .into() +} + +pub fn api_scope(tx_sender: TxSender) -> Scope { + let data = ApiFeeData::new(tx_sender); + + web::scope("fee") + .data(data) + .route("", web::post().to(get_tx_fee)) + .route("/batch", web::post().to(get_batch_fee)) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::api_server::rest::v02::{ + test_utils::{ + deserialize_response_result, dummy_fee_ticker, dummy_sign_verifier, TestServerConfig, + }, + SharedData, + }; + use num::BigUint; + use zksync_api_types::v02::{ + fee::{ApiTxFeeTypes, TxInBatchFeeRequest}, + ApiVersion, + }; + use zksync_types::{tokens::TokenLike, Address, TokenId}; + + #[actix_rt::test] + #[cfg_attr( + not(feature = "api_test"), + ignore = "Use `zk test rust-api` command to perform this test" + )] + async fn fee_scope() -> anyhow::Result<()> { + let cfg = TestServerConfig::default(); + + let shared_data = SharedData { + net: cfg.config.chain.eth.network, + api_version: ApiVersion::V02, + }; + let (client, server) = cfg.start_server( + move |cfg: &TestServerConfig| { + api_scope(TxSender::new( + cfg.pool.clone(), + dummy_sign_verifier(), + dummy_fee_ticker(&[]), + &cfg.config, + )) + }, + Some(shared_data), + ); + + let tx_type = ApiTxFeeTypes::Withdraw; + let address = Address::default(); + let token_like = TokenLike::Id(TokenId(1)); + + let response = client + .get_txs_fee(tx_type, address, token_like.clone()) + .await?; + let api_fee: ApiFee = deserialize_response_result(response)?; + assert_eq!(api_fee.gas_fee, BigUint::from(1u32)); + assert_eq!(api_fee.zkp_fee, BigUint::from(1u32)); + assert_eq!(api_fee.total_fee, BigUint::from(2u32)); + + let tx = TxInBatchFeeRequest { + tx_type: ApiTxFeeTypes::Withdraw, + address: Address::default(), + }; + let txs = vec![tx.clone(), tx.clone(), tx]; + + let response = client.get_batch_fee(txs, token_like).await?; + let api_batch_fee: ApiFee = deserialize_response_result(response)?; + assert_eq!(api_batch_fee.gas_fee, BigUint::from(3u32)); + assert_eq!(api_batch_fee.zkp_fee, BigUint::from(3u32)); + assert_eq!(api_batch_fee.total_fee, BigUint::from(6u32)); + + server.stop().await; + Ok(()) + } +} diff --git a/core/bin/zksync_api/src/api_server/rest/v02/mod.rs b/core/bin/zksync_api/src/api_server/rest/v02/mod.rs index e501ec6f55..e1883646c4 100644 --- a/core/bin/zksync_api/src/api_server/rest/v02/mod.rs +++ b/core/bin/zksync_api/src/api_server/rest/v02/mod.rs @@ -3,35 +3,58 @@ use actix_web::{ web::{self}, Scope, }; -use serde::Serialize; // Workspace uses +use zksync_api_types::v02::ApiVersion; use zksync_config::ZkSyncConfig; use zksync_types::network::Network; // Local uses use crate::api_server::tx_sender::TxSender; +mod account; +mod block; mod config; mod error; +mod fee; +mod paginate_impl; +mod paginate_trait; mod response; +mod status; +#[cfg(test)] +pub mod test_utils; +mod token; +mod transaction; -#[derive(Serialize, Clone, Copy)] -#[serde(rename_all = "snake_case")] -pub enum ApiVersion { - V02, -} - +#[derive(Debug, Clone, Copy)] pub struct SharedData { pub net: Network, pub api_version: ApiVersion, } -pub(crate) fn api_scope(_tx_sender: TxSender, zk_config: &ZkSyncConfig) -> Scope { +pub(crate) fn api_scope(tx_sender: TxSender, zk_config: &ZkSyncConfig) -> Scope { web::scope("/api/v0.2") .data(SharedData { net: zk_config.chain.eth.network, api_version: ApiVersion::V02, }) + .service(account::api_scope( + tx_sender.pool.clone(), + tx_sender.tokens.clone(), + tx_sender.core_api_client.clone(), + )) + .service(block::api_scope( + tx_sender.pool.clone(), + tx_sender.blocks.clone(), + )) .service(config::api_scope(&zk_config)) + .service(fee::api_scope(tx_sender.clone())) + .service(status::api_scope(tx_sender.pool.clone())) + .service(token::api_scope( + &zk_config, + tx_sender.pool.clone(), + tx_sender.tokens.clone(), + tx_sender.ticker_requests.clone(), + )) + .service(transaction::api_scope(tx_sender)) } diff --git a/core/bin/zksync_api/src/api_server/rest/v02/paginate_impl.rs b/core/bin/zksync_api/src/api_server/rest/v02/paginate_impl.rs new file mode 100644 index 0000000000..145fd5e44d --- /dev/null +++ b/core/bin/zksync_api/src/api_server/rest/v02/paginate_impl.rs @@ -0,0 +1,280 @@ +// Built-in uses + +// External uses + +// Workspace uses +use zksync_api_types::{ + v02::{ + block::BlockInfo, + pagination::{ + AccountTxsRequest, ApiEither, BlockAndTxHash, Paginated, PaginationQuery, + PendingOpsRequest, + }, + transaction::{Transaction, TxHashSerializeWrapper}, + }, + Either, +}; +use zksync_storage::StorageProcessor; +use zksync_types::{BlockNumber, SerialId, Token, TokenId}; + +// Local uses +use super::{ + block::block_info_from_details, + error::{Error, InvalidDataError}, + paginate_trait::Paginate, +}; +use crate::core_api_client::CoreApiClient; + +#[async_trait::async_trait] +impl Paginate> for StorageProcessor<'_> { + type OutputObj = Token; + type OutputId = TokenId; + + async fn paginate( + &mut self, + query: &PaginationQuery>, + ) -> Result, Error> { + let mut transaction = self.start_transaction().await.map_err(Error::storage)?; + + let token_id = match query.from.inner { + Either::Left(token_id) => token_id, + Either::Right(_) => TokenId( + transaction + .tokens_schema() + .get_count() + .await + .map_err(Error::storage)?, + ), + }; + + let query = PaginationQuery { + from: token_id, + limit: query.limit, + direction: query.direction, + }; + + let tokens = transaction + .tokens_schema() + .load_token_page(&query) + .await + .map_err(Error::storage)?; + let count = transaction + .tokens_schema() + .get_count() + .await + .map_err(Error::storage)?; + transaction.commit().await.map_err(Error::storage)?; + + Ok(Paginated::new( + tokens, + query.from, + query.limit, + query.direction, + count, + )) + } +} + +#[async_trait::async_trait] +impl Paginate> for StorageProcessor<'_> { + type OutputObj = BlockInfo; + type OutputId = BlockNumber; + + async fn paginate( + &mut self, + query: &PaginationQuery>, + ) -> Result, Error> { + let mut transaction = self.start_transaction().await.map_err(Error::storage)?; + + let last_block = transaction + .chain() + .block_schema() + .get_last_committed_confirmed_block() + .await + .map_err(Error::storage)?; + + let block_number = match query.from.inner { + Either::Left(block_number) => block_number, + Either::Right(_) => last_block, + }; + + let query = PaginationQuery { + from: block_number, + limit: query.limit, + direction: query.direction, + }; + + let blocks = transaction + .chain() + .block_schema() + .load_block_page(&query) + .await + .map_err(Error::storage)?; + let blocks: Vec = blocks.into_iter().map(block_info_from_details).collect(); + + transaction.commit().await.map_err(Error::storage)?; + + Ok(Paginated::new( + blocks, + query.from, + query.limit, + query.direction, + *last_block, + )) + } +} + +#[async_trait::async_trait] +impl Paginate for StorageProcessor<'_> { + type OutputObj = Transaction; + type OutputId = TxHashSerializeWrapper; + + async fn paginate( + &mut self, + query: &PaginationQuery, + ) -> Result, Error> { + let mut transaction = self.start_transaction().await.map_err(Error::storage)?; + + let tx_hash = match query.from.tx_hash.inner { + Either::Left(tx_hash) => tx_hash, + Either::Right(_) => { + if let Some(tx_hash) = transaction + .chain() + .operations_ext_schema() + .get_block_last_tx_hash(query.from.block_number) + .await + .map_err(Error::storage)? + { + tx_hash + } else { + return Ok(Paginated::new( + Vec::new(), + Default::default(), + query.limit, + query.direction, + 0, + )); + } + } + }; + + let query = PaginationQuery { + from: BlockAndTxHash { + block_number: query.from.block_number, + tx_hash: ApiEither::from(tx_hash), + }, + limit: query.limit, + direction: query.direction, + }; + + let txs = transaction + .chain() + .block_schema() + .get_block_transactions_page(&query) + .await + .map_err(Error::storage)? + .ok_or_else(|| Error::from(InvalidDataError::TransactionNotFound))?; + let count = transaction + .chain() + .block_schema() + .get_block_transactions_count(query.from.block_number) + .await + .map_err(Error::storage)?; + + transaction.commit().await.map_err(Error::storage)?; + + Ok(Paginated::new( + txs, + TxHashSerializeWrapper(tx_hash), + query.limit, + query.direction, + count, + )) + } +} + +#[async_trait::async_trait] +impl Paginate for StorageProcessor<'_> { + type OutputObj = Transaction; + type OutputId = TxHashSerializeWrapper; + + async fn paginate( + &mut self, + query: &PaginationQuery, + ) -> Result, Error> { + let mut transaction = self.start_transaction().await.map_err(Error::storage)?; + + let tx_hash = match query.from.tx_hash.inner { + Either::Left(tx_hash) => tx_hash, + Either::Right(_) => { + if let Some(tx_hash) = transaction + .chain() + .operations_ext_schema() + .get_account_last_tx_hash(query.from.address) + .await + .map_err(Error::storage)? + { + tx_hash + } else { + return Ok(Paginated::new( + Vec::new(), + Default::default(), + query.limit, + query.direction, + 0, + )); + } + } + }; + + let query = PaginationQuery { + from: AccountTxsRequest { + address: query.from.address, + tx_hash: ApiEither::from(tx_hash), + }, + limit: query.limit, + direction: query.direction, + }; + + let txs = transaction + .chain() + .operations_ext_schema() + .get_account_transactions(&query) + .await + .map_err(Error::storage)? + .ok_or_else(|| Error::from(InvalidDataError::TransactionNotFound))?; + let count = transaction + .chain() + .operations_ext_schema() + .get_account_transactions_count(query.from.address) + .await + .map_err(Error::storage)?; + + transaction.commit().await.map_err(Error::storage)?; + + Ok(Paginated::new( + txs, + TxHashSerializeWrapper(tx_hash), + query.limit, + query.direction, + count, + )) + } +} + +#[async_trait::async_trait] +impl Paginate for CoreApiClient { + type OutputObj = Transaction; + type OutputId = SerialId; + + async fn paginate( + &mut self, + query: &PaginationQuery, + ) -> Result, Error> { + let result = self + .get_unconfirmed_ops(&query) + .await + .map_err(Error::core_api)?; + Ok(result) + } +} diff --git a/core/bin/zksync_api/src/api_server/rest/v02/paginate_trait.rs b/core/bin/zksync_api/src/api_server/rest/v02/paginate_trait.rs new file mode 100644 index 0000000000..dee8649364 --- /dev/null +++ b/core/bin/zksync_api/src/api_server/rest/v02/paginate_trait.rs @@ -0,0 +1,32 @@ +// Built-in uses + +// External uses +use serde::Serialize; + +// Workspace uses +use zksync_api_types::v02::pagination::{Paginated, PaginationQuery, MAX_LIMIT}; + +// Local uses +use super::error::{Error, InvalidDataError}; + +#[async_trait::async_trait] +pub trait Paginate { + type OutputObj: Serialize; + type OutputId: Serialize; + + async fn paginate( + &mut self, + query: &PaginationQuery, + ) -> Result, Error>; + + async fn paginate_checked( + &mut self, + query: &PaginationQuery, + ) -> Result, Error> { + if query.limit > MAX_LIMIT { + Err(Error::from(InvalidDataError::PaginationLimitTooBig)) + } else { + self.paginate(query).await + } + } +} diff --git a/core/bin/zksync_api/src/api_server/rest/v02/response.rs b/core/bin/zksync_api/src/api_server/rest/v02/response.rs index 20d66cd61c..76fd75a36e 100644 --- a/core/bin/zksync_api/src/api_server/rest/v02/response.rs +++ b/core/bin/zksync_api/src/api_server/rest/v02/response.rs @@ -1,54 +1,32 @@ -use actix_web::web::Data; -use actix_web::{Error, HttpRequest, HttpResponse, Responder}; -use chrono::{DateTime, Utc}; -use futures::future::{ready, Ready}; -use qstring::QString; -use serde::Serialize; -use serde_json::Value; +// Built-in uses use std::collections::HashMap; +use std::convert::From; -use zksync_types::network::Network; - -use crate::api_server::rest::v02::error::UnreachableError; -use crate::api_server::rest::v02::{error, ApiVersion, SharedData}; - -#[derive(Serialize)] -#[serde(rename_all = "snake_case")] -enum ResultStatus { - Success, - Error, -} +// External uses +use actix_web::{web::Data, Error as ActixError, HttpRequest, HttpResponse, Responder}; +use chrono::Utc; +use futures::future::{ready, Ready}; +use qstring::QString; +use serde::{Deserialize, Serialize}; -#[derive(Serialize)] -struct Request { - network: Network, - api_version: ApiVersion, - resource: String, - #[serde(skip_serializing_if = "HashMap::is_empty")] - args: HashMap, - timestamp: DateTime, -} +// Workspace uses +use zksync_api_types::v02::{Request, Response, ResultStatus}; -#[derive(Serialize)] -struct Response { - request: Request, - status: ResultStatus, - #[serde(skip_serializing_if = "Option::is_none")] - error: Option, - #[serde(skip_serializing_if = "Option::is_none")] - result: Option, -} +// Local uses +use super::{error::Error, SharedData}; -// TODO: remove #[allow(dead_code)] after adding endpoint that can return an error. (ZKS-572) -#[allow(dead_code)] -pub enum ApiResult { +// This struct is needed to wrap all api responses is `Response` struct by implementing `Responder` trait for it. +// We can't use simple `Result`, because `actix-web` has already `Responder` implementation for it. +// Because of this we can't use '?' operator in implementations of endpoints. +#[derive(Debug, Deserialize, Serialize)] +pub enum ApiResult { Ok(R), - Error(E), + Error(Error), } -impl Responder for ApiResult { - type Error = Error; - type Future = Ready>; +impl Responder for ApiResult { + type Error = ActixError; + type Future = Ready>; fn respond_to(self, req: &HttpRequest) -> Self::Future { let data = req @@ -82,7 +60,7 @@ impl Responder for ApiResult { request, status: ResultStatus::Error, result: None, - error: Some(err.into()), + error: Some(serde_json::to_value(err).unwrap()), }, }; @@ -94,8 +72,29 @@ impl Responder for ApiResult { } } -impl From for ApiResult { - fn from(res: R) -> Self { - Self::Ok(res) +impl From for ApiResult { + fn from(err: Error) -> Self { + Self::Error(err) + } +} + +impl From> for ApiResult { + fn from(result: Result) -> Self { + match result { + Ok(ok) => Self::Ok(ok), + Err(err) => Self::Error(err), + } } } + +#[macro_export] +macro_rules! api_try { + ($e:expr) => { + match $e { + Ok(res) => res, + Err(err) => { + return ApiResult::from(err); + } + }; + }; +} diff --git a/core/bin/zksync_api/src/api_server/rest/v02/status.rs b/core/bin/zksync_api/src/api_server/rest/v02/status.rs new file mode 100644 index 0000000000..0556b25eef --- /dev/null +++ b/core/bin/zksync_api/src/api_server/rest/v02/status.rs @@ -0,0 +1,138 @@ +//! Status part of API implementation. + +// Built-in uses + +// External uses +use actix_web::{web, Scope}; + +// Workspace uses +use zksync_api_types::v02::status::NetworkStatus; +use zksync_storage::ConnectionPool; + +// Local uses +use super::{error::Error, response::ApiResult}; +use crate::api_try; + +/// Shared data between `api/v0.2/networkStatus` endpoints. +#[derive(Debug, Clone)] +pub struct ApiStatusData { + pool: ConnectionPool, +} + +impl ApiStatusData { + pub fn new(pool: ConnectionPool) -> Self { + Self { pool } + } +} + +// Server implementation + +async fn get_status(data: web::Data) -> ApiResult { + let mut storage = api_try!(data.pool.access_storage().await.map_err(Error::storage)); + let mut transaction = api_try!(storage.start_transaction().await.map_err(Error::storage)); + + let last_committed = api_try!(transaction + .chain() + .block_schema() + .get_last_committed_confirmed_block() + .await + .map_err(Error::storage)); + let finalized = api_try!(transaction + .chain() + .block_schema() + .get_last_verified_confirmed_block() + .await + .map_err(Error::storage)); + let total_transactions = api_try!(transaction + .chain() + .stats_schema() + .count_total_transactions() + .await + .map_err(Error::storage)); + let mempool_size = api_try!(transaction + .chain() + .mempool_schema() + .get_mempool_size() + .await + .map_err(Error::storage)); + api_try!(transaction.commit().await.map_err(Error::storage)); + + Ok(NetworkStatus { + last_committed, + finalized, + total_transactions, + mempool_size, + }) + .into() +} + +pub fn api_scope(pool: ConnectionPool) -> Scope { + let data = ApiStatusData::new(pool); + + web::scope("networkStatus") + .data(data) + .route("", web::get().to(get_status)) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::api_server::rest::v02::{ + test_utils::{deserialize_response_result, TestServerConfig}, + SharedData, + }; + use zksync_api_types::v02::ApiVersion; + + #[actix_rt::test] + #[cfg_attr( + not(feature = "api_test"), + ignore = "Use `zk test rust-api` command to perform this test" + )] + async fn status_scope() -> anyhow::Result<()> { + let cfg = TestServerConfig::default(); + cfg.fill_database().await?; + + let shared_data = SharedData { + net: cfg.config.chain.eth.network, + api_version: ApiVersion::V02, + }; + let (client, server) = cfg.start_server( + |cfg: &TestServerConfig| api_scope(cfg.pool.clone()), + Some(shared_data), + ); + + let expected_status = { + let mut storage = cfg.pool.access_storage().await?; + let last_committed = storage + .chain() + .block_schema() + .get_last_committed_block() + .await?; + let finalized = storage + .chain() + .block_schema() + .get_last_verified_confirmed_block() + .await?; + let total_transactions = storage + .chain() + .stats_schema() + .count_total_transactions() + .await?; + let mempool_size = storage.chain().mempool_schema().get_mempool_size().await?; + NetworkStatus { + last_committed, + finalized, + total_transactions, + mempool_size, + } + }; + + let response = client.status().await?; + let status: NetworkStatus = deserialize_response_result(response)?; + + assert_eq!(expected_status, status); + + server.stop().await; + Ok(()) + } +} diff --git a/core/bin/zksync_api/src/api_server/rest/v1/test_utils.rs b/core/bin/zksync_api/src/api_server/rest/v02/test_utils.rs similarity index 81% rename from core/bin/zksync_api/src/api_server/rest/v1/test_utils.rs rename to core/bin/zksync_api/src/api_server/rest/v02/test_utils.rs index 0002c27c7c..19ccf0c824 100644 --- a/core/bin/zksync_api/src/api_server/rest/v1/test_utils.rs +++ b/core/bin/zksync_api/src/api_server/rest/v02/test_utils.rs @@ -1,14 +1,22 @@ //! API testing helpers. // Built-in uses +use std::collections::HashMap; +use std::str::FromStr; // External uses use actix_web::{web, App, Scope}; +use bigdecimal::BigDecimal; use chrono::Utc; +use futures::{channel::mpsc, StreamExt}; +use num::BigUint; use once_cell::sync::Lazy; +use serde::de::DeserializeOwned; use tokio::sync::Mutex; // Workspace uses +use zksync_api_client::rest::client::Client; +use zksync_api_types::v02::Response; use zksync_config::ZkSyncConfig; use zksync_crypto::rand::{SeedableRng, XorShiftRng}; use zksync_storage::{ @@ -17,7 +25,7 @@ use zksync_storage::{ prover::ProverSchema, test_data::{ dummy_ethereum_tx_hash, gen_acc_random_updates, gen_sample_block, - gen_unique_aggregated_operation_with_txs, get_sample_aggregated_proof, + gen_unique_aggregated_operation_with_txs, generate_nft, get_sample_aggregated_proof, get_sample_single_proof, BLOCK_SIZE_CHUNKS, }, ConnectionPool, @@ -29,15 +37,16 @@ use zksync_types::{ operations::{ChangePubKeyOp, TransferToNewOp}, prover::ProverJobType, tx::ChangePubKeyType, - AccountId, AccountMap, Address, BlockNumber, Deposit, DepositOp, ExecutedOperations, - ExecutedPriorityOp, ExecutedTx, FullExit, FullExitOp, MintNFTOp, Nonce, PriorityOp, Token, - TokenId, Transfer, TransferOp, ZkSyncOp, ZkSyncTx, H256, + AccountId, AccountMap, Address, BatchFee, BlockNumber, Deposit, DepositOp, ExecutedOperations, + ExecutedPriorityOp, ExecutedTx, Fee, FullExit, FullExitOp, MintNFTOp, Nonce, OutputFeeType, + PriorityOp, Token, TokenId, TokenLike, Transfer, TransferOp, ZkSyncOp, ZkSyncTx, H256, }; // Local uses -use super::Client; -use std::str::FromStr; -use zksync_storage::test_data::generate_nft; +use crate::{ + fee_ticker::{ResponseBatchFee, ResponseFee, TickerRequest}, + signature_checker::{VerifiedTx, VerifySignatureRequest}, +}; /// Serial ID of the verified priority operation. pub const VERIFIED_OP_SERIAL_ID: u64 = 10; @@ -72,17 +81,26 @@ pub struct TestTransactions { } impl TestServerConfig { - pub fn start_server_with_scope( + pub fn start_server_with_scope( &self, scope: String, scope_factory: F, + shared_data: Option, ) -> (Client, actix_web::test::TestServer) where F: Fn(&TestServerConfig) -> Scope + Clone + Send + 'static, + D: Clone + Send + 'static, { let this = self.clone(); let server = actix_web::test::start(move || { - App::new().service(web::scope(scope.as_ref()).service(scope_factory(&this))) + let app = App::new(); + let shared_data = shared_data.clone(); + let app = if let Some(shared_data) = shared_data { + app.data(shared_data) + } else { + app + }; + app.service(web::scope(scope.as_ref()).service(scope_factory(&this))) }); let url = server.url("").trim_end_matches('/').to_owned(); @@ -91,11 +109,16 @@ impl TestServerConfig { (client, server) } - pub fn start_server(&self, scope_factory: F) -> (Client, actix_web::test::TestServer) + pub fn start_server( + &self, + scope_factory: F, + shared_data: Option, + ) -> (Client, actix_web::test::TestServer) where F: Fn(&TestServerConfig) -> Scope + Clone + Send + 'static, + D: Clone + Send + 'static, { - self.start_server_with_scope(String::from("/api/v1"), scope_factory) + self.start_server_with_scope(String::from("/api/v0.2"), scope_factory, shared_data) } /// Creates several transactions and the corresponding executed operations. @@ -328,6 +351,11 @@ impl TestServerConfig { // Required since we use `EthereumSchema` in this test. storage.ethereum_schema().initialize_eth_data().await?; + storage + .config_schema() + .store_config(Address::default(), Address::default(), Address::default()) + .await?; + // Insert PHNX token storage .tokens_schema() @@ -564,6 +592,11 @@ impl TestServerConfig { .ethereum_schema() .confirm_eth_tx(ð_tx_hash) .await?; + storage + .chain() + .state_schema() + .apply_state_update(block_number) + .await?; } } @@ -586,6 +619,8 @@ impl TestServerConfig { .to_vec(), eth_block: 10, created_at: chrono::Utc::now(), + eth_block_index: Some(1), + tx_hash: Default::default(), }, // Committed priority operation. NewExecutedPriorityOperation { @@ -605,6 +640,8 @@ impl TestServerConfig { .to_vec(), eth_block: 14, created_at: chrono::Utc::now(), + eth_block_index: Some(1), + tx_hash: Default::default(), }, ]; @@ -663,6 +700,7 @@ pub fn dummy_deposit_op( deadline_block: 0, eth_hash: H256::default(), eth_block: 10, + eth_block_index: Some(1), }, op: deposit_op, block_index, @@ -698,9 +736,103 @@ pub fn dummy_full_exit_op( deadline_block: 0, eth_hash: H256::default(), eth_block: 10, + eth_block_index: Some(1), }, op: deposit_op, block_index, created_at: Utc::now(), } } + +pub fn deserialize_response_result(response: Response) -> anyhow::Result { + match response.result { + Some(result) => { + let result = serde_json::from_value(result)?; + Ok(result) + } + None => { + if response.error.is_some() { + anyhow::bail!("Response returned error: {:?}", response); + } else { + let result = serde_json::from_str("null")?; + Ok(result) + } + } + } +} + +pub fn dummy_sign_verifier() -> mpsc::Sender { + let (sender, mut receiver) = mpsc::channel::(10); + + actix_rt::spawn(async move { + while let Some(item) = receiver.next().await { + let verified = VerifiedTx::unverified(item.data.get_tx_variant()); + item.response + .send(Ok(verified)) + .expect("Unable to send response"); + } + }); + + sender +} + +pub fn dummy_fee_ticker(prices: &[(TokenLike, BigDecimal)]) -> mpsc::Sender { + let (sender, mut receiver) = mpsc::channel(10); + + let prices: HashMap<_, _> = prices.iter().cloned().collect(); + actix_rt::spawn(async move { + while let Some(item) = receiver.next().await { + match item { + TickerRequest::GetTxFee { response, .. } => { + let normal_fee = Fee::new( + OutputFeeType::Withdraw, + BigUint::from(1_u64).into(), + BigUint::from(1_u64).into(), + 1_u64.into(), + 1_u64.into(), + ); + + let res = Ok(ResponseFee { normal_fee }); + + response.send(res).expect("Unable to send response"); + } + TickerRequest::GetTokenPrice { + token, response, .. + } => { + let msg = if let Some(price) = prices.get(&token) { + Ok(price.clone()) + } else { + Ok(BigDecimal::from(0u64)) + }; + + response.send(msg).expect("Unable to send response"); + } + TickerRequest::IsTokenAllowed { token, response } => { + // For test purposes, PHNX token is not allowed. + let is_phnx = match token { + TokenLike::Id(id) => *id == 1, + TokenLike::Symbol(sym) => sym == "PHNX", + TokenLike::Address(_) => unreachable!(), + }; + response.send(Ok(!is_phnx)).unwrap_or_default(); + } + TickerRequest::GetBatchTxFee { + response, + transactions, + .. + } => { + let normal_fee = BatchFee::new( + BigUint::from(transactions.len()).into(), + BigUint::from(transactions.len()).into(), + ); + + let res = Ok(ResponseBatchFee { normal_fee }); + + response.send(res).expect("Unable to send response"); + } + } + } + }); + + sender +} diff --git a/core/bin/zksync_api/src/api_server/rest/v02/token.rs b/core/bin/zksync_api/src/api_server/rest/v02/token.rs new file mode 100644 index 0000000000..e8ed57335a --- /dev/null +++ b/core/bin/zksync_api/src/api_server/rest/v02/token.rs @@ -0,0 +1,431 @@ +//! Tokens part of API implementation. + +// Built-in uses +use std::str::FromStr; + +// External uses +use actix_web::{ + web::{self}, + Scope, +}; +use bigdecimal::{BigDecimal, Zero}; +use futures::{ + channel::{mpsc, oneshot}, + prelude::*, +}; +use num::{rational::Ratio, BigUint, FromPrimitive}; + +// Workspace uses +use zksync_api_types::v02::{ + pagination::{parse_query, ApiEither, Paginated, PaginationQuery}, + token::{ApiNFT, ApiToken, TokenPrice}, +}; +use zksync_config::ZkSyncConfig; +use zksync_storage::{ConnectionPool, StorageProcessor}; +use zksync_types::{Token, TokenId, TokenLike}; + +// Local uses +use super::{ + error::{Error, InvalidDataError}, + paginate_trait::Paginate, + response::ApiResult, +}; +use crate::{ + api_try, + fee_ticker::{PriceError, TickerRequest, TokenPriceRequestType}, + utils::token_db_cache::TokenDBCache, +}; + +/// Shared data between `api/v0.2/tokens` endpoints. +#[derive(Clone)] +struct ApiTokenData { + min_market_volume: Ratio, + fee_ticker: mpsc::Sender, + tokens: TokenDBCache, + pool: ConnectionPool, +} + +impl ApiTokenData { + fn new( + config: &ZkSyncConfig, + pool: ConnectionPool, + tokens: TokenDBCache, + fee_ticker: mpsc::Sender, + ) -> Self { + Self { + min_market_volume: Ratio::from( + BigUint::from_f64(config.ticker.liquidity_volume) + .expect("TickerConfig::liquidity_volume must be positive"), + ), + pool, + tokens, + fee_ticker, + } + } + + async fn is_token_enabled_for_fees( + &self, + storage: &mut StorageProcessor<'_>, + token_id: TokenId, + ) -> Result { + let result = storage + .tokens_schema() + .filter_tokens_by_market_volume(vec![token_id], &self.min_market_volume) + .await + .map_err(Error::storage)?; + Ok(!result.is_empty()) + } + + async fn token_page( + &self, + query: PaginationQuery>, + ) -> Result, Error> { + let mut storage = self.pool.access_storage().await.map_err(Error::storage)?; + let paginated_tokens: Result, Error> = + storage.paginate_checked(&query).await; + match paginated_tokens { + Ok(paginated_tokens) => { + let tokens_to_check: Vec = + paginated_tokens.list.iter().map(|token| token.id).collect(); + let tokens_enabled_for_fees = storage + .tokens_schema() + .filter_tokens_by_market_volume(tokens_to_check, &self.min_market_volume) + .await + .map_err(Error::storage)?; + let list = paginated_tokens + .list + .into_iter() + .map(|token| { + let eligibility = tokens_enabled_for_fees.contains(&token.id); + ApiToken::from_token_and_eligibility(token, eligibility) + }) + .collect(); + Ok(Paginated::new( + list, + paginated_tokens.pagination.from, + paginated_tokens.pagination.limit, + paginated_tokens.pagination.direction, + paginated_tokens.pagination.count, + )) + } + Err(err) => Err(err), + } + } + + async fn token(&self, token_like: TokenLike) -> Result { + let mut storage = self.pool.access_storage().await.map_err(Error::storage)?; + + let token = self + .tokens + .get_token(&mut storage, token_like) + .await + .map_err(Error::storage)?; + if let Some(token) = token { + Ok(token) + } else { + Err(Error::from(PriceError::token_not_found( + "Token not found in storage", + ))) + } + } + + async fn api_token(&self, token_like: TokenLike) -> Result { + let token = self.token(token_like).await?; + let mut storage = self.pool.access_storage().await.map_err(Error::storage)?; + let enabled_for_fees = self + .is_token_enabled_for_fees(&mut storage, token.id) + .await?; + Ok(ApiToken::from_token_and_eligibility( + token, + enabled_for_fees, + )) + } + + async fn token_price_usd(&self, token: TokenLike) -> Result { + let (price_sender, price_receiver) = oneshot::channel(); + self.fee_ticker + .clone() + .send(TickerRequest::GetTokenPrice { + token, + response: price_sender, + req_type: TokenPriceRequestType::USDForOneToken, + }) + .await + .map_err(Error::storage)?; + + let price_result = price_receiver.await.map_err(Error::storage)?; + price_result.map_err(Error::from) + } + + // TODO: take `currency` as enum. (ZKS-628) + async fn token_price_in( + &self, + first_token: TokenLike, + currency: &str, + ) -> Result { + if let Ok(second_token_id) = u32::from_str(currency) { + let second_token = TokenLike::from(TokenId(second_token_id)); + let first_usd_price = self.token_price_usd(first_token).await; + let second_usd_price = self.token_price_usd(second_token).await; + match (first_usd_price, second_usd_price) { + (Ok(first_usd_price), Ok(second_usd_price)) => { + if second_usd_price.is_zero() { + Err(Error::from(InvalidDataError::TokenZeroPriceError)) + } else { + Ok(first_usd_price / second_usd_price) + } + } + (Err(err), _) => Err(err), + (_, Err(err)) => Err(err), + } + } else { + match currency { + "usd" => self.token_price_usd(first_token).await, + _ => Err(Error::from(InvalidDataError::InvalidCurrency)), + } + } + } +} + +// Server implementation + +async fn token_pagination( + data: web::Data, + web::Query(query): web::Query>, +) -> ApiResult> { + let query = api_try!(parse_query(query).map_err(Error::from)); + data.token_page(query).await.into() +} + +async fn token_by_id_or_address( + data: web::Data, + web::Path(token_like_string): web::Path, +) -> ApiResult { + let token_like = TokenLike::parse(&token_like_string); + let token_like = match token_like { + TokenLike::Symbol(_) => { + return Error::from(PriceError::token_not_found( + "Could not parse token as id or address", + )) + .into(); + } + _ => token_like, + }; + + data.api_token(token_like).await.into() +} + +// TODO: take `currency` as enum. +// Currently actix path extractor doesn't work with enums: https://github.com/actix/actix-web/issues/318 (ZKS-628) +async fn token_price( + data: web::Data, + web::Path((token_like_string, currency)): web::Path<(String, String)>, +) -> ApiResult { + let first_token = TokenLike::parse(&token_like_string); + let first_token = match first_token { + TokenLike::Symbol(_) => { + return Error::from(PriceError::token_not_found( + "Could not parse token as id or address", + )) + .into(); + } + _ => first_token, + }; + + let price = api_try!(data.token_price_in(first_token.clone(), ¤cy).await); + let token = api_try!(data.token(first_token).await); + + ApiResult::Ok(TokenPrice { + token_id: token.id, + token_symbol: token.symbol, + price_in: currency, + decimals: token.decimals, + price, + }) +} + +async fn get_nft( + data: web::Data, + web::Path(id): web::Path, +) -> ApiResult> { + let mut storage = api_try!(data.pool.access_storage().await.map_err(Error::storage)); + let nft = api_try!(storage + .tokens_schema() + .get_nft_with_factories(id) + .await + .map_err(Error::storage)); + ApiResult::Ok(nft) +} + +pub fn api_scope( + config: &ZkSyncConfig, + pool: ConnectionPool, + tokens_db: TokenDBCache, + fee_ticker: mpsc::Sender, +) -> Scope { + let data = ApiTokenData::new(config, pool, tokens_db, fee_ticker); + + web::scope("tokens") + .data(data) + .route("", web::get().to(token_pagination)) + .route( + "{token_id_or_address}", + web::get().to(token_by_id_or_address), + ) + .route( + "{token_id_or_address}/priceIn/{currency}", + web::get().to(token_price), + ) + .route("nft/{id}", web::get().to(get_nft)) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::api_server::rest::v02::{ + test_utils::{deserialize_response_result, dummy_fee_ticker, TestServerConfig}, + SharedData, + }; + use zksync_api_types::v02::{pagination::PaginationDirection, ApiVersion}; + use zksync_types::Address; + + async fn is_token_enabled_for_fees( + storage: &mut StorageProcessor<'_>, + token_id: TokenId, + config: &ZkSyncConfig, + ) -> anyhow::Result { + let market_volume = TokenDBCache::get_token_market_volume(storage, token_id).await?; + let min_market_volume = Ratio::from( + BigUint::from_f64(config.ticker.liquidity_volume) + .expect("TickerConfig::liquidity_volume must be positive"), + ); + Ok(market_volume + .map(|volume| volume.market_volume.ge(&min_market_volume)) + .unwrap_or(false)) + } + + #[actix_rt::test] + #[cfg_attr( + not(feature = "api_test"), + ignore = "Use `zk test rust-api` command to perform this test" + )] + async fn tokens_scope() -> anyhow::Result<()> { + let cfg = TestServerConfig::default(); + cfg.fill_database().await?; + + let prices = [ + (TokenLike::Id(TokenId(1)), 10_u64.into()), + (TokenLike::Id(TokenId(15)), 10_500_u64.into()), + (Address::default().into(), 1_u64.into()), + ]; + let fee_ticker = dummy_fee_ticker(&prices); + + let shared_data = SharedData { + net: cfg.config.chain.eth.network, + api_version: ApiVersion::V02, + }; + let (client, server) = cfg.start_server( + move |cfg| { + api_scope( + &cfg.config, + cfg.pool.clone(), + TokenDBCache::new(), + fee_ticker.clone(), + ) + }, + Some(shared_data), + ); + + let token_like = TokenLike::Id(TokenId(1)); + let response = client.token_by_id(&token_like).await?; + let api_token: ApiToken = deserialize_response_result(response)?; + + let expected_token = { + let mut storage = cfg.pool.access_storage().await?; + storage + .tokens_schema() + .get_token(token_like) + .await? + .unwrap() + }; + let expected_enabled_for_fees = { + let mut storage = cfg.pool.access_storage().await?; + is_token_enabled_for_fees(&mut storage, TokenId(1), &cfg.config).await? + }; + let expected_api_token = + ApiToken::from_token_and_eligibility(expected_token, expected_enabled_for_fees); + assert_eq!(api_token, expected_api_token); + + let query = PaginationQuery { + from: ApiEither::from(TokenId(15)), + limit: 2, + direction: PaginationDirection::Older, + }; + let response = client.token_pagination(&query).await?; + let pagination: Paginated = deserialize_response_result(response)?; + + let expected_pagination = { + let mut storage = cfg.pool.access_storage().await?; + let paginated_tokens: Paginated = storage + .paginate_checked(&query) + .await + .map_err(|err| anyhow::anyhow!(err.message))?; + let mut list = Vec::new(); + for token in paginated_tokens.list { + let enabled_for_fees = + is_token_enabled_for_fees(&mut storage, token.id, &cfg.config).await?; + list.push(ApiToken::from_token_and_eligibility( + token, + enabled_for_fees, + )); + } + Paginated::new( + list, + paginated_tokens.pagination.from, + paginated_tokens.pagination.limit, + paginated_tokens.pagination.direction, + paginated_tokens.pagination.count, + ) + }; + assert_eq!(pagination, expected_pagination); + + let token_like = TokenLike::Id(TokenId(1)); + let token = { + let mut storage = cfg.pool.access_storage().await?; + storage + .tokens_schema() + .get_token(token_like.clone()) + .await? + .unwrap() + }; + let mut expected_token_price = TokenPrice { + token_id: token.id, + token_symbol: token.symbol, + price_in: String::from("15"), + decimals: token.decimals, + price: BigDecimal::from_u32(10).unwrap() / BigDecimal::from_u32(10500).unwrap(), + }; + + let response = client.token_price(&token_like, "15").await?; + let price_in_token: TokenPrice = deserialize_response_result(response)?; + assert_eq!(price_in_token, expected_token_price); + + expected_token_price.price_in = String::from("usd"); + expected_token_price.price = BigDecimal::from_u32(10).unwrap(); + + let response = client.token_price(&token_like, "usd").await?; + let price_in_usd: TokenPrice = deserialize_response_result(response)?; + assert_eq!(price_in_usd, expected_token_price); + + let response = client.token_price(&token_like, "333").await?; + assert!(response.error.is_some()); + + let id = TokenId(65542); + let response = client.nft_by_id(id).await?; + let nft: ApiNFT = deserialize_response_result(response)?; + assert_eq!(nft.id, id); + + server.stop().await; + Ok(()) + } +} diff --git a/core/bin/zksync_api/src/api_server/rest/v02/transaction.rs b/core/bin/zksync_api/src/api_server/rest/v02/transaction.rs new file mode 100644 index 0000000000..3fbb016b71 --- /dev/null +++ b/core/bin/zksync_api/src/api_server/rest/v02/transaction.rs @@ -0,0 +1,416 @@ +//! Transactions part of API implementation. + +// Built-in uses + +// External uses +use actix_web::{ + web::{self, Json}, + Scope, +}; + +// Workspace uses +use zksync_api_types::{ + v02::transaction::{ + ApiTxBatch, IncomingTxBatch, L1Receipt, L1Transaction, Receipt, SubmitBatchResponse, + Transaction, TransactionData, TxData, TxHashSerializeWrapper, TxInBlockStatus, + }, + PriorityOpLookupQuery, TxWithSignature, +}; +use zksync_types::{tx::TxHash, EthBlockId}; + +// Local uses +use super::{error::Error, response::ApiResult}; +use crate::api_server::tx_sender::TxSender; + +/// Shared data between `api/v0.2/transactions` endpoints. +#[derive(Clone)] +struct ApiTransactionData { + tx_sender: TxSender, +} + +impl ApiTransactionData { + fn new(tx_sender: TxSender) -> Self { + Self { tx_sender } + } + + async fn tx_status(&self, tx_hash: TxHash) -> Result, Error> { + let mut storage = self + .tx_sender + .pool + .access_storage() + .await + .map_err(Error::storage)?; + if let Some(receipt) = storage + .chain() + .operations_ext_schema() + .tx_receipt_api_v02(tx_hash.as_ref()) + .await + .map_err(Error::storage)? + { + Ok(Some(receipt)) + } else if let Some(op) = self + .tx_sender + .core_api_client + .get_unconfirmed_op(PriorityOpLookupQuery::ByAnyHash(tx_hash)) + .await + .map_err(Error::core_api)? + { + Ok(Some(Receipt::L1(L1Receipt { + status: TxInBlockStatus::Queued, + eth_block: EthBlockId(op.eth_block), + rollup_block: None, + id: op.serial_id, + }))) + } else { + Ok(None) + } + } + + async fn tx_data(&self, tx_hash: TxHash) -> Result, Error> { + let mut storage = self + .tx_sender + .pool + .access_storage() + .await + .map_err(Error::storage)?; + if let Some(data) = storage + .chain() + .operations_ext_schema() + .tx_data_api_v02(tx_hash.as_ref()) + .await + .map_err(Error::storage)? + { + Ok(Some(data)) + } else if let Some(op) = self + .tx_sender + .core_api_client + .get_unconfirmed_op(PriorityOpLookupQuery::ByAnyHash(tx_hash)) + .await + .map_err(Error::core_api)? + { + let tx_hash = op.tx_hash(); + let tx = Transaction { + tx_hash, + block_number: None, + op: TransactionData::L1(L1Transaction::from_pending_op( + op.data, + op.eth_hash, + op.serial_id, + tx_hash, + )), + status: TxInBlockStatus::Queued, + fail_reason: None, + created_at: None, + }; + + Ok(Some(TxData { + tx, + eth_signature: None, + })) + } else { + Ok(None) + } + } + + async fn get_batch(&self, batch_hash: TxHash) -> Result, Error> { + let mut storage = self + .tx_sender + .pool + .access_storage() + .await + .map_err(Error::storage)?; + storage + .chain() + .operations_ext_schema() + .get_batch_info(batch_hash) + .await + .map_err(Error::storage) + } +} + +// Server implementation + +async fn tx_status( + data: web::Data, + web::Path(tx_hash): web::Path, +) -> ApiResult> { + data.tx_status(tx_hash).await.into() +} + +async fn tx_data( + data: web::Data, + web::Path(tx_hash): web::Path, +) -> ApiResult> { + data.tx_data(tx_hash).await.into() +} + +async fn submit_tx( + data: web::Data, + Json(body): Json, +) -> ApiResult { + let tx_hash = data + .tx_sender + .submit_tx(body.tx, body.signature) + .await + .map_err(Error::from); + + tx_hash.map(TxHashSerializeWrapper).into() +} + +async fn submit_batch( + data: web::Data, + Json(body): Json, +) -> ApiResult { + let response = data + .tx_sender + .submit_txs_batch(body.txs, body.signature) + .await + .map_err(Error::from); + response.into() +} + +async fn get_batch( + data: web::Data, + web::Path(batch_hash): web::Path, +) -> ApiResult> { + data.get_batch(batch_hash).await.into() +} + +pub fn api_scope(tx_sender: TxSender) -> Scope { + let data = ApiTransactionData::new(tx_sender); + + web::scope("transactions") + .data(data) + .route("", web::post().to(submit_tx)) + .route("{tx_hash}", web::get().to(tx_status)) + .route("{tx_hash}/data", web::get().to(tx_data)) + .route("/batches", web::post().to(submit_batch)) + .route("/batches/{batch_hash}", web::get().to(get_batch)) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + api_server::rest::v02::{ + test_utils::{ + deserialize_response_result, dummy_fee_ticker, dummy_sign_verifier, + TestServerConfig, TestTransactions, + }, + SharedData, + }, + core_api_client::CoreApiClient, + }; + use actix_web::App; + use std::str::FromStr; + use zksync_api_types::v02::{ + transaction::{L2Receipt, TxHashSerializeWrapper}, + ApiVersion, + }; + use zksync_types::{ + tokens::Token, + tx::{ + EthBatchSignData, EthBatchSignatures, PackedEthSignature, TxEthSignature, + TxEthSignatureVariant, + }, + BlockNumber, SignedZkSyncTx, TokenId, + }; + + fn submit_txs_loopback() -> (CoreApiClient, actix_web::test::TestServer) { + async fn send_tx(_tx: Json) -> Json> { + Json(Ok(())) + } + + async fn send_txs_batch( + _txs: Json<(Vec, Vec)>, + ) -> Json> { + Json(Ok(())) + } + + async fn get_unconfirmed_op(_query: Json) -> Json> { + Json(None) + } + + let server = actix_web::test::start(move || { + App::new() + .route("new_tx", web::post().to(send_tx)) + .route("new_txs_batch", web::post().to(send_txs_batch)) + .route("unconfirmed_op", web::post().to(get_unconfirmed_op)) + }); + + let url = server.url("").trim_end_matches('/').to_owned(); + + (CoreApiClient::new(url), server) + } + + #[actix_rt::test] + #[cfg_attr( + not(feature = "api_test"), + ignore = "Use `zk test rust-api` command to perform this test" + )] + async fn transactions_scope() -> anyhow::Result<()> { + let (core_client, core_server) = submit_txs_loopback(); + + let cfg = TestServerConfig::default(); + cfg.fill_database().await?; + + let shared_data = SharedData { + net: cfg.config.chain.eth.network, + api_version: ApiVersion::V02, + }; + let (client, server) = cfg.start_server( + move |cfg: &TestServerConfig| { + api_scope(TxSender::with_client( + core_client.clone(), + cfg.pool.clone(), + dummy_sign_verifier(), + dummy_fee_ticker(&[]), + &cfg.config, + )) + }, + Some(shared_data), + ); + + let tx = TestServerConfig::gen_zk_txs(100_u64).txs[0].0.clone(); + let response = client + .submit_tx(tx.clone(), TxEthSignatureVariant::Single(None)) + .await?; + let tx_hash: TxHash = deserialize_response_result(response)?; + assert_eq!(tx.hash(), tx_hash); + + let TestTransactions { acc, txs } = TestServerConfig::gen_zk_txs(1_00); + let eth = Token::new(TokenId(0), Default::default(), "ETH", 18); + let (good_batch, expected_tx_hashes): (Vec<_>, Vec<_>) = txs + .into_iter() + .map(|(tx, _op)| { + let tx_hash = tx.hash(); + ( + TxWithSignature { + tx, + signature: TxEthSignatureVariant::Single(None), + }, + tx_hash, + ) + }) + .unzip(); + let expected_batch_hash = TxHash::batch_hash(&expected_tx_hashes); + let expected_response = SubmitBatchResponse { + transaction_hashes: expected_tx_hashes + .into_iter() + .map(TxHashSerializeWrapper) + .collect(), + batch_hash: expected_batch_hash, + }; + + let txs = good_batch + .iter() + .zip(std::iter::repeat(eth)) + .map(|(tx, token)| (tx.tx.clone(), token, tx.tx.account())) + .collect::>(); + let batch_signature = { + let eth_private_key = acc + .try_get_eth_private_key() + .expect("Should have ETH private key"); + let batch_message = EthBatchSignData::get_batch_sign_message(txs); + let eth_sig = PackedEthSignature::sign(eth_private_key, &batch_message).unwrap(); + let single_signature = TxEthSignature::EthereumSignature(eth_sig); + + EthBatchSignatures::Single(single_signature) + }; + + let response = client + .submit_batch(good_batch.clone(), Some(batch_signature)) + .await?; + let submit_batch_response: SubmitBatchResponse = deserialize_response_result(response)?; + assert_eq!(submit_batch_response, expected_response); + + { + let mut storage = cfg.pool.access_storage().await?; + let txs: Vec<_> = good_batch + .into_iter() + .map(|tx| SignedZkSyncTx { + tx: tx.tx, + eth_sign_data: None, + }) + .collect(); + storage + .chain() + .mempool_schema() + .insert_batch(&txs, Vec::new()) + .await?; + }; + + let response = client.get_batch(submit_batch_response.batch_hash).await?; + let batch: ApiTxBatch = deserialize_response_result(response)?; + assert_eq!(batch.batch_hash, submit_batch_response.batch_hash); + assert_eq!( + batch.transaction_hashes, + submit_batch_response.transaction_hashes + ); + assert_eq!(batch.batch_status.last_state, TxInBlockStatus::Queued); + + let tx_hash = { + let mut storage = cfg.pool.access_storage().await?; + + let transactions = storage + .chain() + .block_schema() + .get_block_transactions(BlockNumber(1)) + .await?; + + TxHash::from_str(&transactions[0].tx_hash).unwrap() + }; + let response = client.tx_status(tx_hash).await?; + let tx_status: Receipt = deserialize_response_result(response)?; + let expected_tx_status = Receipt::L2(L2Receipt { + tx_hash, + rollup_block: Some(BlockNumber(1)), + status: TxInBlockStatus::Finalized, + fail_reason: None, + }); + assert_eq!(tx_status, expected_tx_status); + + let response = client.tx_data(tx_hash).await?; + let tx_data: Option = deserialize_response_result(response)?; + assert_eq!(tx_data.unwrap().tx.tx_hash, tx_hash); + + let pending_tx_hash = { + let mut storage = cfg.pool.access_storage().await?; + + let tx = TestServerConfig::gen_zk_txs(1_u64).txs[0].0.clone(); + let tx_hash = tx.hash(); + storage + .chain() + .mempool_schema() + .insert_tx(&SignedZkSyncTx { + tx, + eth_sign_data: None, + }) + .await?; + + tx_hash + }; + let response = client.tx_status(pending_tx_hash).await?; + let tx_status: Receipt = deserialize_response_result(response)?; + let expected_tx_status = Receipt::L2(L2Receipt { + tx_hash: pending_tx_hash, + rollup_block: None, + status: TxInBlockStatus::Queued, + fail_reason: None, + }); + assert_eq!(tx_status, expected_tx_status); + + let response = client.tx_data(pending_tx_hash).await?; + let tx_data: Option = deserialize_response_result(response)?; + assert_eq!(tx_data.unwrap().tx.tx_hash, pending_tx_hash); + + let tx = TestServerConfig::gen_zk_txs(1_u64).txs[0].0.clone(); + let response = client.tx_data(tx.hash()).await?; + let tx_data: Option = deserialize_response_result(response)?; + assert!(tx_data.is_none()); + + server.stop().await; + core_server.stop().await; + Ok(()) + } +} diff --git a/core/bin/zksync_api/src/api_server/rest/v1/accounts/mod.rs b/core/bin/zksync_api/src/api_server/rest/v1/accounts/mod.rs deleted file mode 100644 index 36f20b9069..0000000000 --- a/core/bin/zksync_api/src/api_server/rest/v1/accounts/mod.rs +++ /dev/null @@ -1,327 +0,0 @@ -//! Accounts part of API implementation. - -// Built-in uses - -// External uses -use actix_web::{ - web::{self, Json}, - Scope, -}; - -// Workspace uses -use zksync_storage::{ConnectionPool, QueryResult, StorageProcessor}; -use zksync_types::{AccountId, Address, BlockNumber, TokenId}; - -// Local uses -use crate::{core_api_client::CoreApiClient, utils::token_db_cache::TokenDBCache}; - -use super::{ApiError, JsonResult}; -use zksync_config::ZkSyncConfig; - -use self::types::{ - convert::{ - depositing_balances_from_pending_ops, op_receipt_from_response, - pending_account_op_receipt_from_priority_op, search_direction_as_storage, - tx_receipt_from_response, validate_receipts_query, - }, - AccountReceiptsQuery, SearchDirection, -}; -// Public uses -pub use self::types::{ - convert::account_state_from_storage, AccountInfo, AccountOpReceipt, AccountQuery, - AccountReceipts, AccountState, AccountTxReceipt, DepositingBalances, DepositingFunds, - PendingAccountOpReceipt, TxLocation, -}; - -#[cfg(test)] -mod tests; -mod types; - -fn unable_to_find_token(token_id: TokenId) -> anyhow::Error { - anyhow::anyhow!("Unable to find token with ID {}", *token_id) -} - -// Additional parser because actix-web doesn't understand enums in path extractor. -fn parse_account_query(query: String) -> Result { - query.parse().map_err(|err| { - ApiError::bad_request("Must be specified either an account ID or an account address.") - .detail(format!("An error occurred: {}", err)) - }) -} - -/// Shared data between `api/v1/accounts` endpoints. -#[derive(Clone)] -struct ApiAccountsData { - pool: ConnectionPool, - tokens: TokenDBCache, - core_api_client: CoreApiClient, - confirmations_for_eth_event: BlockNumber, -} - -impl ApiAccountsData { - fn new( - pool: ConnectionPool, - tokens: TokenDBCache, - core_api_client: CoreApiClient, - confirmations_for_eth_event: BlockNumber, - ) -> Self { - Self { - pool, - tokens, - core_api_client, - confirmations_for_eth_event, - } - } - - async fn access_storage(&self) -> QueryResult> { - self.pool.access_storage().await.map_err(From::from) - } - - async fn find_account_address(&self, query: String) -> Result { - let query = parse_account_query(query)?; - self.account_address(query) - .await - .map_err(ApiError::internal)? - .ok_or_else(|| { - ApiError::bad_request("Unable to find account.") - .detail(format!("Given account {:?} is absent", query)) - }) - } - - async fn account_id( - storage: &mut StorageProcessor<'_>, - query: AccountQuery, - ) -> QueryResult> { - match query { - AccountQuery::Id(id) => Ok(Some(id)), - AccountQuery::Address(address) => { - storage - .chain() - .account_schema() - .account_id_by_address(address) - .await - } - } - } - - async fn account_address(&self, query: AccountQuery) -> QueryResult> { - match query { - AccountQuery::Id(id) => { - let mut storage = self.access_storage().await?; - storage - .chain() - .account_schema() - .account_address_by_id(id) - .await - } - AccountQuery::Address(address) => Ok(Some(address)), - } - } - - async fn account_info(&self, query: AccountQuery) -> QueryResult> { - let mut storage = self.access_storage().await?; - let account_id = if let Some(id) = Self::account_id(&mut storage, query).await? { - id - } else { - return Ok(None); - }; - - let account_state = storage - .chain() - .account_schema() - .account_state_by_id(account_id) - .await?; - - let (account_id, account) = if let Some(state) = account_state.committed { - state - } else { - // This account has not been committed. - return Ok(None); - }; - - let committed = account_state_from_storage(&mut storage, &self.tokens, &account).await?; - let verified = match account_state.verified { - Some((_id, account)) => { - account_state_from_storage(&mut storage, &self.tokens, &account).await? - } - None => AccountState::default(), - }; - - let depositing = { - let ongoing_ops = self - .core_api_client - .get_unconfirmed_deposits(account.address) - .await?; - - depositing_balances_from_pending_ops( - &mut storage, - &self.tokens, - ongoing_ops, - self.confirmations_for_eth_event, - ) - .await? - }; - - let info = AccountInfo { - address: account.address, - id: account_id, - committed, - verified, - depositing, - }; - - Ok(Some(info)) - } - - async fn tx_receipts( - &self, - address: Address, - location: TxLocation, - direction: SearchDirection, - limit: u32, - ) -> QueryResult> { - let mut storage = self.access_storage().await?; - - let items = storage - .chain() - .operations_ext_schema() - .get_account_transactions_receipts( - address, - *location.block as u64, - location.index, - search_direction_as_storage(direction), - limit as u64, - ) - .await?; - - Ok(items.into_iter().map(tx_receipt_from_response).collect()) - } - - async fn op_receipts( - &self, - address: Address, - location: TxLocation, - direction: SearchDirection, - limit: u32, - ) -> QueryResult> { - let mut storage = self.access_storage().await?; - - let items = storage - .chain() - .operations_ext_schema() - .get_account_operations_receipts( - address, - *location.block as u64, - location.index.unwrap_or_default(), - search_direction_as_storage(direction), - limit as u64, - ) - .await?; - - Ok(items.into_iter().map(op_receipt_from_response).collect()) - } - - async fn pending_op_receipts( - &self, - address: Address, - ) -> QueryResult> { - let ongoing_ops = self.core_api_client.get_unconfirmed_ops(address).await?; - - let receipts = ongoing_ops - .into_iter() - .map(pending_account_op_receipt_from_priority_op) - .collect(); - - Ok(receipts) - } -} - -// Server implementation - -async fn account_info( - data: web::Data, - web::Path(query): web::Path, -) -> JsonResult> { - let query = parse_account_query(query)?; - - data.account_info(query) - .await - .map(Json) - .map_err(ApiError::internal) -} - -async fn account_tx_receipts( - data: web::Data, - web::Path(account_query): web::Path, - web::Query(location_query): web::Query, -) -> JsonResult> { - let (location, direction, limit) = validate_receipts_query(location_query)?; - let address = data.find_account_address(account_query).await?; - - let receipts = data - .tx_receipts(address, location, direction, *limit) - .await - .map_err(ApiError::internal)?; - - Ok(Json(receipts)) -} - -async fn account_op_receipts( - data: web::Data, - web::Path(account_query): web::Path, - web::Query(location_query): web::Query, -) -> JsonResult> { - let (location, direction, limit) = validate_receipts_query(location_query)?; - let address = data.find_account_address(account_query).await?; - - let receipts = data - .op_receipts(address, location, direction, *limit) - .await - .map_err(ApiError::internal)?; - - Ok(Json(receipts)) -} - -async fn account_pending_receipts( - data: web::Data, - web::Path(account_query): web::Path, -) -> JsonResult> { - let address = data.find_account_address(account_query).await?; - - let receipts = data - .pending_op_receipts(address) - .await - .map_err(ApiError::internal)?; - - Ok(Json(receipts)) -} - -pub fn api_scope( - pool: ConnectionPool, - config: &ZkSyncConfig, - tokens: TokenDBCache, - core_api_client: CoreApiClient, -) -> Scope { - let data = ApiAccountsData::new( - pool, - tokens, - core_api_client, - BlockNumber(config.eth_watch.confirmations_for_eth_event as u32), - ); - - web::scope("accounts") - .data(data) - .route("{id}", web::get().to(account_info)) - .route( - "{id}/transactions/receipts", - web::get().to(account_tx_receipts), - ) - .route( - "{id}/operations/receipts", - web::get().to(account_op_receipts), - ) - .route( - "{id}/operations/pending", - web::get().to(account_pending_receipts), - ) -} diff --git a/core/bin/zksync_api/src/api_server/rest/v1/accounts/tests.rs b/core/bin/zksync_api/src/api_server/rest/v1/accounts/tests.rs index f020633636..e69de29bb2 100644 --- a/core/bin/zksync_api/src/api_server/rest/v1/accounts/tests.rs +++ b/core/bin/zksync_api/src/api_server/rest/v1/accounts/tests.rs @@ -1,517 +0,0 @@ -// Built-in uses -use std::sync::Arc; - -// External uses -use actix_web::{ - web::{self, Json}, - App, -}; -use serde_json::json; -use tokio::sync::Mutex; - -// Workspace uses -use zksync_storage::{ - chain::operations_ext::records::{AccountOpReceiptResponse, AccountTxReceiptResponse}, - ConnectionPool, StorageProcessor, -}; -use zksync_types::{tx::TxHash, AccountId, Address, BlockNumber, ExecutedOperations, H256}; - -// Local uses -use crate::{ - api_server::v1::{ - test_utils::{dummy_deposit_op, TestServerConfig}, - transactions::Receipt, - Client, - }, - core_api_client::CoreApiClient, - utils::token_db_cache::TokenDBCache, -}; - -use super::{ - api_scope, - types::{ - convert::{op_receipt_from_response, tx_receipt_from_response}, - AccountOpReceipt, AccountReceipts, AccountTxReceipt, - }, -}; - -type PendingOpsHandle = Arc>; - -fn create_pending_ops_handle() -> PendingOpsHandle { - Arc::new(Mutex::new(json!([]))) -} - -fn get_unconfirmed_ops_loopback( - ops_handle: PendingOpsHandle, - deposits_handle: PendingOpsHandle, -) -> (CoreApiClient, actix_web::test::TestServer) { - async fn get_ops( - data: web::Data, - _path: web::Path, - ) -> Json { - Json(data.lock().await.clone()) - } - - let server = actix_web::test::start(move || { - let ops_handle = ops_handle.clone(); - let deposits_handle = deposits_handle.clone(); - App::new() - .service( - web::scope("unconfirmed_ops") - .data(ops_handle) - .route("{address}", web::get().to(get_ops)), - ) - .service( - web::scope("unconfirmed_deposits") - .data(deposits_handle) - .route("{address}", web::get().to(get_ops)), - ) - }); - - let url = server.url("").trim_end_matches('/').to_owned(); - (CoreApiClient::new(url), server) -} - -struct TestServer { - core_server: actix_web::test::TestServer, - api_server: actix_web::test::TestServer, - pool: ConnectionPool, - pending_ops: PendingOpsHandle, - pending_deposits: PendingOpsHandle, -} - -impl TestServer { - async fn new() -> anyhow::Result<(Client, Self)> { - let cfg = TestServerConfig::default(); - cfg.fill_database().await?; - - let pending_ops = create_pending_ops_handle(); - let pending_deposits = create_pending_ops_handle(); - let (core_client, core_server) = - get_unconfirmed_ops_loopback(pending_ops.clone(), pending_deposits.clone()); - - let pool = cfg.pool.clone(); - - let (api_client, api_server) = cfg.start_server(move |cfg| { - api_scope( - cfg.pool.clone(), - &cfg.config, - TokenDBCache::new(), - core_client.clone(), - ) - }); - - Ok(( - api_client, - Self { - core_server, - api_server, - pool, - pending_ops, - pending_deposits, - }, - )) - } - - async fn account_id( - storage: &mut StorageProcessor<'_>, - block: BlockNumber, - ) -> anyhow::Result { - let transactions = storage - .chain() - .block_schema() - .get_block_transactions(block) - .await?; - - let tx = &transactions[1]; - let op = tx.op.as_object().unwrap(); - - let id = if op.contains_key("accountId") { - serde_json::from_value(op["accountId"].clone()).unwrap() - } else { - serde_json::from_value(op["creatorId"].clone()).unwrap() - }; - Ok(id) - } - - async fn stop(self) { - self.api_server.stop().await; - self.core_server.stop().await; - } -} - -#[actix_rt::test] -#[cfg_attr( - not(feature = "api_test"), - ignore = "Use `zk test rust-api` command to perform this test" -)] -async fn unconfirmed_deposits_loopback() -> anyhow::Result<()> { - let (client, server) = - get_unconfirmed_ops_loopback(create_pending_ops_handle(), create_pending_ops_handle()); - - client.get_unconfirmed_deposits(Address::default()).await?; - client.get_unconfirmed_ops(Address::default()).await?; - - server.stop().await; - Ok(()) -} - -#[actix_rt::test] -#[cfg_attr( - not(feature = "api_test"), - ignore = "Use `zk test rust-api` command to perform this test" -)] -async fn accounts_scope() -> anyhow::Result<()> { - let (client, server) = TestServer::new().await?; - - // Get account information. - let account_id = - TestServer::account_id(&mut server.pool.access_storage().await?, BlockNumber(1)).await?; - - let account_info = client.account_info(account_id).await?.unwrap(); - let address = account_info.address; - assert_eq!(client.account_info(address).await?, Some(account_info)); - - // Provide unconfirmed pending deposits. - *server.pending_deposits.lock().await = json!([ - { - "serial_id": 1, - "data": { - "type": "Deposit", - "account_id": account_id, - "amount": "100500", - "from": Address::default(), - "to": address, - "token": 0, - }, - "deadline_block": 10, - "eth_hash": vec![0u8; 32], - "eth_block": 5, - }, - ]); - - // Check account information about unconfirmed deposits. - let account_info = client.account_info(account_id).await?.unwrap(); - - let depositing_balances = &account_info.depositing.balances["ETH"]; - assert_eq!(*depositing_balances.expected_accept_block, 5); - assert_eq!(depositing_balances.amount.0, 100_500_u64.into()); - - // Get account transaction receipts. - let receipts = client - .account_tx_receipts( - address, - AccountReceipts::newer_than(BlockNumber(0), None), - 10, - ) - .await?; - - assert_eq!(receipts[0].index, None); - assert_eq!( - receipts[0].receipt, - Receipt::Rejected { - reason: Some("Unknown token".to_string()) - } - ); - assert_eq!(receipts[2].index, Some(3)); - assert_eq!( - receipts[2].receipt, - Receipt::Verified { - block: BlockNumber(1) - } - ); - - // Get a reversed list of receipts with requests from the end. - let receipts: Vec<_> = receipts.into_iter().rev().collect(); - assert_eq!( - client - .account_tx_receipts(address, AccountReceipts::Latest, 10) - .await?, - receipts - ); - assert_eq!( - client - .account_tx_receipts( - address, - AccountReceipts::older_than(BlockNumber(10), Some(0)), - 10 - ) - .await?, - receipts - ); - - // Save priority operation in block. - let deposit_op = dummy_deposit_op(address, account_id, 10234, 1); - server - .pool - .access_storage() - .await? - .chain() - .block_schema() - .save_block_transactions( - BlockNumber(1), - vec![ExecutedOperations::PriorityOp(Box::new(deposit_op))], - ) - .await?; - - // Get account operation receipts. - let receipts = client - .account_op_receipts( - address, - AccountReceipts::newer_than(BlockNumber(1), Some(0)), - 10, - ) - .await?; - - assert_eq!( - receipts[0], - AccountOpReceipt { - hash: H256::default(), - index: 1, - receipt: Receipt::Verified { - block: BlockNumber(1) - } - } - ); - assert_eq!( - client - .account_op_receipts( - address, - AccountReceipts::newer_than(BlockNumber(1), Some(0)), - 10 - ) - .await?, - receipts - ); - assert_eq!( - client - .account_op_receipts( - address, - AccountReceipts::older_than(BlockNumber(2), Some(0)), - 10 - ) - .await?, - receipts - ); - assert_eq!( - client - .account_op_receipts( - account_id, - AccountReceipts::newer_than(BlockNumber(1), Some(0)), - 10 - ) - .await?, - receipts - ); - assert_eq!( - client - .account_op_receipts( - account_id, - AccountReceipts::older_than(BlockNumber(2), Some(0)), - 10 - ) - .await?, - receipts - ); - - // Get account pending receipts. - *server.pending_ops.lock().await = json!([ - { - "serial_id": 1, - "data": { - "type": "Deposit", - "account_id": account_id, - "amount": "100500", - "from": Address::default(), - "to": address, - "token": 0, - }, - "deadline_block": 10, - "eth_hash": vec![0u8; 32], - "eth_block": 5, - }, - { - "serial_id": 2, - "data": { - "type": "FullExit", - "account_id": account_id, - "eth_address": Address::default(), - "token": 0 - }, - "deadline_block": 0, - "eth_hash": vec![1u8; 32], - "eth_block": 5 - } - ]); - let pending_receipts = client.account_pending_ops(account_id).await?; - - assert_eq!(pending_receipts[0].eth_block, 5); - assert_eq!(pending_receipts[0].hash, [0u8; 32].into()); - assert_eq!(pending_receipts[1].eth_block, 5); - assert_eq!(pending_receipts[1].hash, [1u8; 32].into()); - - server.stop().await; - Ok(()) -} - -#[test] -fn account_tx_response_to_receipt() { - fn empty_hash() -> Vec { - TxHash::default().as_ref().to_vec() - } - - let cases = vec![ - ( - AccountTxReceiptResponse { - block_index: Some(1), - block_number: 1, - success: true, - fail_reason: None, - commit_tx_hash: None, - verify_tx_hash: None, - tx_hash: empty_hash(), - }, - AccountTxReceipt { - index: Some(1), - hash: TxHash::default(), - receipt: Receipt::Executed, - }, - ), - ( - AccountTxReceiptResponse { - block_index: None, - block_number: 1, - success: true, - fail_reason: None, - commit_tx_hash: None, - verify_tx_hash: None, - tx_hash: empty_hash(), - }, - AccountTxReceipt { - index: None, - hash: TxHash::default(), - receipt: Receipt::Executed, - }, - ), - ( - AccountTxReceiptResponse { - block_index: Some(1), - block_number: 1, - success: false, - fail_reason: Some("Oops".to_string()), - commit_tx_hash: None, - verify_tx_hash: None, - tx_hash: empty_hash(), - }, - AccountTxReceipt { - index: Some(1), - hash: TxHash::default(), - receipt: Receipt::Rejected { - reason: Some("Oops".to_string()), - }, - }, - ), - ( - AccountTxReceiptResponse { - block_index: Some(1), - block_number: 1, - success: true, - fail_reason: None, - commit_tx_hash: Some(empty_hash()), - verify_tx_hash: None, - tx_hash: empty_hash(), - }, - AccountTxReceipt { - index: Some(1), - hash: TxHash::default(), - receipt: Receipt::Committed { - block: BlockNumber(1), - }, - }, - ), - ( - AccountTxReceiptResponse { - block_index: Some(1), - block_number: 1, - success: true, - fail_reason: None, - commit_tx_hash: Some(empty_hash()), - verify_tx_hash: Some(empty_hash()), - tx_hash: empty_hash(), - }, - AccountTxReceipt { - index: Some(1), - hash: TxHash::default(), - receipt: Receipt::Verified { - block: BlockNumber(1), - }, - }, - ), - ]; - - for (resp, expected_receipt) in cases { - let actual_receipt = tx_receipt_from_response(resp); - assert_eq!(actual_receipt, expected_receipt); - } -} - -#[test] -fn account_op_response_to_receipt() { - fn empty_hash() -> Vec { - H256::default().as_bytes().to_vec() - } - - let cases = vec![ - ( - AccountOpReceiptResponse { - block_index: 1, - block_number: 1, - commit_tx_hash: None, - verify_tx_hash: None, - eth_hash: empty_hash(), - }, - AccountOpReceipt { - index: 1, - hash: H256::default(), - receipt: Receipt::Executed, - }, - ), - ( - AccountOpReceiptResponse { - block_index: 1, - block_number: 1, - commit_tx_hash: Some(empty_hash()), - verify_tx_hash: None, - eth_hash: empty_hash(), - }, - AccountOpReceipt { - index: 1, - hash: H256::default(), - receipt: Receipt::Committed { - block: BlockNumber(1), - }, - }, - ), - ( - AccountOpReceiptResponse { - block_index: 1, - block_number: 1, - commit_tx_hash: Some(empty_hash()), - verify_tx_hash: Some(empty_hash()), - eth_hash: empty_hash(), - }, - AccountOpReceipt { - index: 1, - hash: H256::default(), - receipt: Receipt::Verified { - block: BlockNumber(1), - }, - }, - ), - ]; - - for (resp, expected_receipt) in cases { - let actual_receipt = op_receipt_from_response(resp); - assert_eq!(actual_receipt, expected_receipt); - } -} diff --git a/core/bin/zksync_api/src/api_server/rest/v1/accounts/types.rs b/core/bin/zksync_api/src/api_server/rest/v1/accounts/types.rs index aa31f665bd..e69de29bb2 100644 --- a/core/bin/zksync_api/src/api_server/rest/v1/accounts/types.rs +++ b/core/bin/zksync_api/src/api_server/rest/v1/accounts/types.rs @@ -1,229 +0,0 @@ -//! Data transfer objects used in the accounts API implementation - -// Built-in uses -use std::collections::BTreeMap; - -// Workspace uses -pub use zksync_api_client::rest::v1::accounts::{ - AccountInfo, AccountOpReceipt, AccountQuery, AccountReceipts, AccountReceiptsQuery, - AccountState, AccountTxReceipt, DepositingBalances, DepositingFunds, PendingAccountOpReceipt, - SearchDirection, TxLocation, -}; -use zksync_storage::{ - chain::operations_ext::{ - records::{AccountOpReceiptResponse, AccountTxReceiptResponse}, - SearchDirection as StorageSearchDirection, - }, - QueryResult, StorageProcessor, -}; -use zksync_types::{tx::TxHash, Account, BlockNumber, PriorityOp, ZkSyncPriorityOp, H256}; - -// Local uses -use crate::{api_server::v1::MAX_LIMIT, utils::token_db_cache::TokenDBCache}; - -use super::{ - super::{transactions::Receipt, ApiError}, - unable_to_find_token, -}; - -pub(super) mod convert { - use std::collections::HashMap; - use zksync_crypto::params::{MIN_NFT_TOKEN_ID, NFT_TOKEN_ID_VAL}; - - use super::*; - - pub async fn account_state_from_storage( - storage: &mut StorageProcessor<'_>, - tokens: &TokenDBCache, - account: &Account, - ) -> QueryResult { - let mut balances = BTreeMap::new(); - let mut nfts = HashMap::new(); - for (token_id, balance) in account.get_nonzero_balances() { - match token_id.0 { - NFT_TOKEN_ID_VAL => { - // Don't include special token to balances or nfts - } - MIN_NFT_TOKEN_ID..=NFT_TOKEN_ID_VAL => { - // https://github.com/rust-lang/rust/issues/37854 - // Exclusive range is an experimental feature, but we have already checked the last value in the previous step - nfts.insert( - token_id, - tokens - .get_nft_by_id(storage, token_id) - .await? - .ok_or_else(|| unable_to_find_token(token_id))? - .into(), - ); - } - _ => { - let token_symbol = tokens - .token_symbol(storage, token_id) - .await? - .ok_or_else(|| unable_to_find_token(token_id))?; - balances.insert(token_symbol, balance); - } - } - } - let minted_nfts = account - .minted_nfts - .iter() - .map(|(id, nft)| (*id, nft.clone().into())) - .collect(); - - Ok(AccountState { - balances, - nfts, - minted_nfts, - nonce: account.nonce, - pub_key_hash: account.pub_key_hash, - }) - } - - pub fn search_direction_as_storage(direction: SearchDirection) -> StorageSearchDirection { - match direction { - SearchDirection::Older => StorageSearchDirection::Older, - SearchDirection::Newer => StorageSearchDirection::Newer, - } - } - - pub async fn depositing_balances_from_pending_ops( - storage: &mut StorageProcessor<'_>, - tokens: &TokenDBCache, - ongoing_ops: Vec, - confirmations_for_eth_event: BlockNumber, - ) -> QueryResult { - let mut balances = BTreeMap::new(); - - for op in ongoing_ops { - let received_on_block = op.eth_block; - let (amount, token_id) = match op.data { - ZkSyncPriorityOp::Deposit(deposit) => (deposit.amount, deposit.token), - ZkSyncPriorityOp::FullExit(other) => { - panic!("Incorrect input for DepositingBalances: {:?}", other); - } - }; - - let token_symbol = tokens - .token_symbol(storage, token_id) - .await? - .ok_or_else(|| unable_to_find_token(token_id))?; - - let expected_accept_block = confirmations_for_eth_event + (received_on_block as u32); - - let balance = balances - .entry(token_symbol) - .or_insert_with(DepositingFunds::default); - - balance.amount.0 += amount; - - // `balance.expected_accept_block` should be the greatest block number among - // all the deposits for a certain token. - if expected_accept_block > balance.expected_accept_block { - balance.expected_accept_block = expected_accept_block; - } - } - - Ok(DepositingBalances { balances }) - } - - pub fn validate_receipts_query( - query: AccountReceiptsQuery, - ) -> Result<(TxLocation, SearchDirection, BlockNumber), ApiError> { - if *query.limit == 0 && *query.limit > MAX_LIMIT { - return Err(ApiError::bad_request("Incorrect limit") - .detail(format!("Limit should be between {} and {}", 1, MAX_LIMIT))); - } - - let (location, direction) = match (query.block, query.index, query.direction) { - // Just try to fetch latest transactions. - (None, None, None) => ( - TxLocation { - block: BlockNumber(u32::MAX), - index: None, - }, - SearchDirection::Older, - ), - (Some(block), index, Some(direction)) => (TxLocation { block, index }, direction), - - _ => { - return Err(ApiError::bad_request("Incorrect transaction location") - .detail("All parameters must be passed: block, index, direction.")) - } - }; - - Ok((location, direction, query.limit)) - } - - pub fn tx_receipt_from_response(inner: AccountTxReceiptResponse) -> AccountTxReceipt { - let block = BlockNumber(inner.block_number as u32); - let index = inner.block_index.map(|x| x as u32); - let hash = TxHash::from_slice(&inner.tx_hash).unwrap_or_else(|| { - panic!( - "Database provided an incorrect tx_hash field: {}", - hex::encode(&inner.tx_hash) - ) - }); - - if !inner.success { - return AccountTxReceipt { - index, - hash, - receipt: Receipt::Rejected { - reason: inner.fail_reason, - }, - }; - } - - let receipt = match ( - inner.commit_tx_hash.is_some(), - inner.verify_tx_hash.is_some(), - ) { - (false, false) => Receipt::Executed, - (true, false) => Receipt::Committed { block }, - (true, true) => Receipt::Verified { block }, - (false, true) => panic!( - "Database provided an incorrect account tx reciept: {:?}", - inner - ), - }; - - AccountTxReceipt { - index, - receipt, - hash, - } - } - - pub fn op_receipt_from_response(inner: AccountOpReceiptResponse) -> AccountOpReceipt { - let block = BlockNumber(inner.block_number as u32); - let index = inner.block_index as u32; - let hash = H256::from_slice(&inner.eth_hash); - - let receipt = match ( - inner.commit_tx_hash.is_some(), - inner.verify_tx_hash.is_some(), - ) { - (false, false) => Receipt::Executed, - (true, false) => Receipt::Committed { block }, - (true, true) => Receipt::Verified { block }, - (false, true) => panic!( - "Database provided an incorrect account tx receipt: {:?}", - inner - ), - }; - - AccountOpReceipt { - index, - receipt, - hash, - } - } - - pub fn pending_account_op_receipt_from_priority_op(op: PriorityOp) -> PendingAccountOpReceipt { - PendingAccountOpReceipt { - eth_block: op.eth_block, - hash: op.eth_hash, - } - } -} diff --git a/core/bin/zksync_api/src/api_server/rest/v1/blocks.rs b/core/bin/zksync_api/src/api_server/rest/v1/blocks.rs deleted file mode 100644 index 19840cb063..0000000000 --- a/core/bin/zksync_api/src/api_server/rest/v1/blocks.rs +++ /dev/null @@ -1,286 +0,0 @@ -//! Blocks part of API implementation. - -// Built-in uses - -// External uses -use actix_web::{ - web::{self, Json}, - Scope, -}; - -// Workspace uses -pub use zksync_api_client::rest::v1::{BlockInfo, TransactionInfo}; -use zksync_crypto::{convert::FeConvert, Fr}; -use zksync_storage::{chain::block::records, ConnectionPool, QueryResult}; -use zksync_types::{tx::TxHash, BlockNumber}; - -// Local uses -use super::{Error as ApiError, JsonResult, Pagination, PaginationQuery}; -use crate::{ - api_server::helpers::try_parse_tx_hash, utils::block_details_cache::BlockDetailsCache, -}; - -/// Shared data between `api/v1/blocks` endpoints. -#[derive(Debug, Clone)] -struct ApiBlocksData { - pool: ConnectionPool, - /// Verified blocks cache. - verified_blocks: BlockDetailsCache, -} - -impl ApiBlocksData { - fn new(pool: ConnectionPool, verified_blocks: BlockDetailsCache) -> Self { - Self { - pool, - verified_blocks, - } - } - - /// Returns information about block with the specified number. - /// - /// This method caches some of the verified blocks. - async fn block_info( - &self, - block_number: BlockNumber, - ) -> QueryResult> { - self.verified_blocks.get(&self.pool, block_number).await - } - - /// Returns the block range up to the given block number. - /// - /// Note that this method doesn't use cache and always requests blocks from the database - async fn blocks_range( - &self, - max_block: Option, - limit: u32, - ) -> QueryResult> { - let max_block = max_block.unwrap_or(BlockNumber(u32::MAX)); - - let mut storage = self.pool.access_storage().await?; - storage - .chain() - .block_schema() - .load_block_range(max_block, limit) - .await - } - - /// Return transactions stored in the block with the specified number. - async fn block_transactions( - &self, - block_number: BlockNumber, - ) -> QueryResult> { - let mut storage = self.pool.access_storage().await?; - storage - .chain() - .block_schema() - .get_block_transactions(block_number) - .await - } -} - -pub(super) mod convert { - use zksync_api_client::rest::v1::PaginationQueryError; - - use super::*; - - pub fn block_info_from_details(inner: records::StorageBlockDetails) -> BlockInfo { - BlockInfo { - block_number: BlockNumber(inner.block_number as u32), - new_state_root: Fr::from_bytes(&inner.new_state_root).unwrap_or_else(|err| { - panic!( - "Database provided an incorrect new_state_root field: {:?}, an error occurred {}", - inner.new_state_root, err - ) - }), - block_size: inner.block_size as u64, - commit_tx_hash: inner.commit_tx_hash.map(|bytes| { - TxHash::from_slice(&bytes).unwrap_or_else(|| { - panic!( - "Database provided an incorrect commit_tx_hash field: {:?}", - hex::encode(bytes) - ) - }) - }), - verify_tx_hash: inner.verify_tx_hash.map(|bytes| { - TxHash::from_slice(&bytes).unwrap_or_else(|| { - panic!( - "Database provided an incorrect verify_tx_hash field: {:?}", - hex::encode(bytes) - ) - }) - }), - committed_at: inner.committed_at, - verified_at: inner.verified_at, - } - } - - pub fn transaction_info_from_transaction_item( - inner: records::BlockTransactionItem, - ) -> TransactionInfo { - TransactionInfo { - tx_hash: try_parse_tx_hash(&inner.tx_hash).unwrap_or_else(|err| { - panic!( - "Database provided an incorrect transaction hash: {:?}, an error occurred: {}", - inner.tx_hash, err - ) - }), - block_number: BlockNumber(inner.block_number as u32), - op: inner.op, - success: inner.success, - fail_reason: inner.fail_reason, - created_at: inner.created_at, - } - } - - impl From for ApiError { - fn from(err: PaginationQueryError) -> Self { - ApiError::bad_request("Incorrect pagination query").detail(err.detail) - } - } -} - -// Server implementation - -async fn block_by_id( - data: web::Data, - web::Path(block_number): web::Path, -) -> JsonResult> { - Ok(Json( - data.block_info(block_number) - .await - .map_err(ApiError::internal)? - .map(convert::block_info_from_details), - )) -} - -async fn block_transactions( - data: web::Data, - web::Path(block_number): web::Path, -) -> JsonResult> { - let transactions = data - .block_transactions(block_number) - .await - .map_err(ApiError::internal)?; - - Ok(Json( - transactions - .into_iter() - .map(convert::transaction_info_from_transaction_item) - .collect(), - )) -} - -async fn blocks_range( - data: web::Data, - web::Query(pagination): web::Query, -) -> JsonResult> { - let (pagination, limit) = pagination.into_inner()?; - let max = pagination.into_max(limit)?; - - let range = data - .blocks_range(max, limit) - .await - .map_err(ApiError::internal)?; - // Handle edge case when "after + limit" greater than the total blocks count. - // TODO Handle this case directly in the `storage` crate. (ZKS-124) - let range = if let Pagination::After(after) = pagination { - range - .into_iter() - .filter(|block| block.block_number > *after as i64) - .map(convert::block_info_from_details) - .collect() - } else { - range - .into_iter() - .map(convert::block_info_from_details) - .collect() - }; - - Ok(Json(range)) -} - -pub fn api_scope(pool: ConnectionPool, cache: BlockDetailsCache) -> Scope { - let data = ApiBlocksData::new(pool, cache); - - web::scope("blocks") - .data(data) - .route("", web::get().to(blocks_range)) - .route("{id}", web::get().to(block_by_id)) - .route("{id}/transactions", web::get().to(block_transactions)) -} - -#[cfg(test)] -mod tests { - use super::{super::test_utils::TestServerConfig, *}; - - #[actix_rt::test] - #[cfg_attr( - not(feature = "api_test"), - ignore = "Use `zk test rust-api` command to perform this test" - )] - async fn test_blocks_scope() -> anyhow::Result<()> { - let cfg = TestServerConfig::default(); - cfg.fill_database().await?; - - let (client, server) = - cfg.start_server(|cfg| api_scope(cfg.pool.clone(), BlockDetailsCache::new(10))); - - // Block requests part - let blocks: Vec = { - let mut storage = cfg.pool.access_storage().await?; - - let blocks = storage - .chain() - .block_schema() - .load_block_range(BlockNumber(10), 10) - .await?; - - blocks - .into_iter() - .map(convert::block_info_from_details) - .collect() - }; - - assert_eq!( - client.block_by_id(BlockNumber(1)).await?.unwrap(), - blocks[7] - ); - assert_eq!(client.blocks_range(Pagination::Last, 10).await?, blocks); - assert_eq!( - client - .blocks_range(Pagination::Before(BlockNumber(2)), 5) - .await?, - &blocks[7..8] - ); - assert_eq!( - client - .blocks_range(Pagination::After(BlockNumber(7)), 5) - .await?, - &blocks[0..1] - ); - - // Transaction requests part. - let expected_txs: Vec = { - let mut storage = cfg.pool.access_storage().await?; - - let transactions = storage - .chain() - .block_schema() - .get_block_transactions(BlockNumber(1)) - .await?; - - transactions - .into_iter() - .map(convert::transaction_info_from_transaction_item) - .collect() - }; - assert_eq!( - client.block_transactions(BlockNumber(1)).await?, - expected_txs - ); - assert_eq!(client.block_transactions(BlockNumber(6)).await?, vec![]); - - server.stop().await; - Ok(()) - } -} diff --git a/core/bin/zksync_api/src/api_server/rest/v1/config.rs b/core/bin/zksync_api/src/api_server/rest/v1/config.rs deleted file mode 100644 index 57cc773d8b..0000000000 --- a/core/bin/zksync_api/src/api_server/rest/v1/config.rs +++ /dev/null @@ -1,96 +0,0 @@ -//! Config part of API implementation. - -// Built-in uses - -// External uses -use actix_web::{web, Scope}; - -// Workspace uses -use zksync_api_client::rest::v1::Contracts; -use zksync_config::ZkSyncConfig; -use zksync_types::{network::Network, Address}; - -// Local uses -use super::Json; - -/// Shared data between `api/v1/config` endpoints. -#[derive(Debug, Clone)] -struct ApiConfigData { - contract_address: Address, - deposit_confirmations: u64, - network: Network, -} - -impl ApiConfigData { - fn new(config: &ZkSyncConfig) -> Self { - Self { - contract_address: config.contracts.contract_addr, - deposit_confirmations: config.eth_watch.confirmations_for_eth_event, - network: config.chain.eth.network, - } - } -} - -// Server implementation - -async fn contracts(data: web::Data) -> Json { - Json(Contracts { - contract: data.contract_address, - }) -} - -async fn deposit_confirmations(data: web::Data) -> Json { - Json(data.deposit_confirmations) -} - -async fn network(data: web::Data) -> Json { - Json(data.network) -} - -pub fn api_scope(config: &ZkSyncConfig) -> Scope { - let data = ApiConfigData::new(config); - - web::scope("config") - .data(data) - .route("contracts", web::get().to(contracts)) - .route("network", web::get().to(network)) - .route( - "deposit_confirmations", - web::get().to(deposit_confirmations), - ) -} - -#[cfg(test)] -mod tests { - use super::{super::test_utils::TestServerConfig, *}; - - #[actix_rt::test] - #[cfg_attr( - not(feature = "api_test"), - ignore = "Use `zk test rust-api` command to perform this test" - )] - async fn test_config_scope() -> anyhow::Result<()> { - let cfg = TestServerConfig::default(); - let (client, server) = cfg.start_server(|cfg| api_scope(&cfg.config)); - - assert_eq!( - client.deposit_confirmations().await?, - cfg.config.eth_watch.confirmations_for_eth_event - ); - - assert_eq!( - client.network().await?, - cfg.config.chain.eth.network.to_string() - ); - assert_eq!( - client.contracts().await?, - Contracts { - contract: cfg.config.contracts.contract_addr - }, - ); - - server.stop().await; - - Ok(()) - } -} diff --git a/core/bin/zksync_api/src/api_server/rest/v1/mod.rs b/core/bin/zksync_api/src/api_server/rest/v1/mod.rs deleted file mode 100644 index 1eaeb56b1f..0000000000 --- a/core/bin/zksync_api/src/api_server/rest/v1/mod.rs +++ /dev/null @@ -1,56 +0,0 @@ -//! First stable API implementation. - -// External uses -use actix_web::{ - web::{self, Json}, - Scope, -}; - -pub use Error as ApiError; -// Workspace uses -pub use zksync_api_client::rest::v1::{ - Client, ClientError, Pagination, PaginationQuery, MAX_LIMIT, -}; -use zksync_config::ZkSyncConfig; - -// Local uses -use crate::api_server::tx_sender::TxSender; - -// Public uses -pub use self::error::{Error, ErrorBody}; - -pub(crate) mod accounts; -mod blocks; -mod config; -pub mod error; -mod operations; -mod search; -#[cfg(test)] -pub mod test_utils; -mod tokens; -mod transactions; - -pub type JsonResult = std::result::Result, Error>; - -pub(crate) fn api_scope(tx_sender: TxSender, zk_config: &ZkSyncConfig) -> Scope { - web::scope("/api/v1") - .service(accounts::api_scope( - tx_sender.pool.clone(), - zk_config, - tx_sender.tokens.clone(), - tx_sender.core_api_client.clone(), - )) - .service(config::api_scope(&zk_config)) - .service(blocks::api_scope( - tx_sender.pool.clone(), - tx_sender.blocks.clone(), - )) - .service(transactions::api_scope(tx_sender.clone())) - .service(operations::api_scope(tx_sender.pool.clone())) - .service(search::api_scope(tx_sender.pool.clone())) - .service(tokens::api_scope( - tx_sender.pool.clone(), - tx_sender.tokens, - tx_sender.ticker_requests, - )) -} diff --git a/core/bin/zksync_api/src/api_server/rest/v1/operations.rs b/core/bin/zksync_api/src/api_server/rest/v1/operations.rs deleted file mode 100644 index f5fbd7a9e7..0000000000 --- a/core/bin/zksync_api/src/api_server/rest/v1/operations.rs +++ /dev/null @@ -1,283 +0,0 @@ -//! Operations part of API implementation. - -// Built-in uses - -// External uses -use actix_web::{ - web::{self, Json}, - Scope, -}; - -// Workspace uses -use zksync_api_client::rest::v1::{ - PriorityOpData, PriorityOpQuery, PriorityOpQueryError, PriorityOpReceipt, -}; -use zksync_storage::{ - chain::operations::records::StoredExecutedPriorityOperation, ConnectionPool, QueryResult, - StorageProcessor, -}; -use zksync_types::{BlockNumber, H256}; - -// Local uses -use super::{transactions::Receipt, Error as ApiError, JsonResult}; - -/// Shared data between `api/v1/operations` endpoints. -#[derive(Debug, Clone)] -struct ApiOperationsData { - pool: ConnectionPool, -} - -impl ApiOperationsData { - pub fn new(pool: ConnectionPool) -> Self { - Self { pool } - } - - pub async fn priority_op_data( - &self, - query: PriorityOpQuery, - ) -> QueryResult> { - let mut storage = self.pool.access_storage().await?; - - let executed_op = executed_priority_op_for_query(query, &mut storage).await?; - Ok(executed_op.map(convert::priority_op_data_from_stored)) - } - - pub async fn priority_op( - &self, - query: PriorityOpQuery, - ) -> QueryResult> { - let mut storage = self.pool.access_storage().await?; - - let executed_op = executed_priority_op_for_query(query, &mut storage).await?; - let executed_op = if let Some(executed_op) = executed_op { - executed_op - } else { - return Ok(None); - }; - - let blocks = storage - .chain() - .block_schema() - .load_block_range(BlockNumber(executed_op.block_number as u32), 1) - .await?; - - let block_info = blocks - .into_iter() - .next() - .expect("Database provided an incorrect priority op receipt"); - - let block = BlockNumber(block_info.block_number as u32); - let index = executed_op.block_index as u32; - - let receipt = if block_info.verify_tx_hash.is_some() { - PriorityOpReceipt { - status: Receipt::Verified { block }, - index: Some(index), - } - } else if block_info.commit_tx_hash.is_some() { - PriorityOpReceipt { - status: Receipt::Committed { block }, - index: Some(index), - } - } else { - PriorityOpReceipt { - status: Receipt::Executed, - index: None, - } - }; - - Ok(Some(receipt)) - } -} - -async fn executed_priority_op_for_query( - query: PriorityOpQuery, - storage: &mut StorageProcessor<'_>, -) -> QueryResult> { - let mut schema = storage.chain().operations_schema(); - - match query { - PriorityOpQuery::Id(serial_id) => { - schema - .get_executed_priority_operation(serial_id as u32) - .await - } - PriorityOpQuery::Hash(eth_hash) => { - schema - .get_executed_priority_operation_by_hash(eth_hash.as_bytes()) - .await - } - } -} - -mod convert { - use super::*; - - pub fn priority_op_data_from_stored(v: StoredExecutedPriorityOperation) -> PriorityOpData { - PriorityOpData { - data: serde_json::from_value(v.operation.clone()).unwrap_or_else(|err| - panic!( - "Database provided an incorrect priority operation data: {:?}, an error occurred: {}", - v.operation, err - ) - ), - eth_hash: H256::from_slice(&v.eth_hash), - serial_id: v.priority_op_serialid as u64, - } - } - - impl From for ApiError { - fn from(err: PriorityOpQueryError) -> Self { - ApiError::bad_request("Cannot parse PrioorityOpQuery").detail(err.detail) - } - } -} - -// Server implementation - -async fn priority_op( - data: web::Data, - web::Path(path): web::Path, -) -> JsonResult> { - let query = PriorityOpQuery::from_path(path)?; - - let receipt = data.priority_op(query).await.map_err(ApiError::internal)?; - Ok(Json(receipt)) -} - -async fn priority_op_data( - data: web::Data, - web::Path(path): web::Path, -) -> JsonResult> { - let query = PriorityOpQuery::from_path(path)?; - - let data = data - .priority_op_data(query) - .await - .map_err(ApiError::internal)?; - Ok(Json(data)) -} - -pub fn api_scope(pool: ConnectionPool) -> Scope { - let data = ApiOperationsData::new(pool); - - web::scope("operations") - .data(data) - .route("{id}", web::get().to(priority_op)) - .route("{id}/data", web::get().to(priority_op_data)) -} - -#[cfg(test)] -mod tests { - use zksync_storage::test_data::dummy_ethereum_tx_hash; - use zksync_types::{AccountId, Address}; - - use crate::api_server::v1::test_utils::{dummy_deposit_op, dummy_full_exit_op}; - - use super::{ - super::test_utils::{TestServerConfig, COMMITTED_OP_SERIAL_ID, VERIFIED_OP_SERIAL_ID}, - *, - }; - - #[actix_rt::test] - #[cfg_attr( - not(feature = "api_test"), - ignore = "Use `zk test rust-api` command to perform this test" - )] - async fn operations_scope() -> anyhow::Result<()> { - let cfg = TestServerConfig::default(); - cfg.fill_database().await?; - - let (client, server) = cfg.start_server(|cfg| api_scope(cfg.pool.clone())); - - // Check verified priority operation. - - let verified_op_hash = dummy_ethereum_tx_hash(VERIFIED_OP_SERIAL_ID as i64); - - let expected_receipt = PriorityOpReceipt { - index: Some(2), - status: Receipt::Verified { - block: BlockNumber(2), - }, - }; - assert_eq!( - client.priority_op(VERIFIED_OP_SERIAL_ID).await?.as_ref(), - Some(&expected_receipt) - ); - assert_eq!( - client.priority_op(verified_op_hash).await?.as_ref(), - Some(&expected_receipt) - ); - - let expected_data = PriorityOpData { - data: dummy_deposit_op(Address::default(), AccountId(1), 15, 2).op, - serial_id: VERIFIED_OP_SERIAL_ID, - eth_hash: verified_op_hash, - }; - - assert_eq!( - client - .priority_op_data(VERIFIED_OP_SERIAL_ID) - .await? - .as_ref() - .unwrap() - .serial_id, - expected_data.serial_id - ); - assert_eq!( - client - .priority_op_data(verified_op_hash) - .await? - .unwrap() - .eth_hash, - expected_data.eth_hash - ); - - // Check committed priority operation. - let committed_eth_hash = dummy_ethereum_tx_hash(COMMITTED_OP_SERIAL_ID as i64); - - let expected_receipt = PriorityOpReceipt { - index: Some(1), - status: Receipt::Committed { - block: BlockNumber(4), - }, - }; - assert_eq!( - client.priority_op(COMMITTED_OP_SERIAL_ID).await?.as_ref(), - Some(&expected_receipt) - ); - assert_eq!( - client.priority_op(committed_eth_hash).await?.as_ref(), - Some(&expected_receipt) - ); - - let expected_data = PriorityOpData { - data: dummy_full_exit_op(AccountId(1), Address::default(), 16, 3).op, - serial_id: COMMITTED_OP_SERIAL_ID, - eth_hash: committed_eth_hash, - }; - assert_eq!( - client - .priority_op_data(COMMITTED_OP_SERIAL_ID) - .await? - .unwrap() - .eth_hash, - expected_data.eth_hash - ); - assert_eq!( - client - .priority_op_data(committed_eth_hash) - .await? - .unwrap() - .serial_id, - expected_data.serial_id - ); - - // Try to get non-existing priority operation. - assert!(client.priority_op(1000).await?.is_none()); - assert!(client.priority_op(H256::default()).await?.is_none()); - - server.stop().await; - Ok(()) - } -} diff --git a/core/bin/zksync_api/src/api_server/rest/v1/search.rs b/core/bin/zksync_api/src/api_server/rest/v1/search.rs deleted file mode 100644 index 8931e5136e..0000000000 --- a/core/bin/zksync_api/src/api_server/rest/v1/search.rs +++ /dev/null @@ -1,116 +0,0 @@ -//! Search part of API implementation. - -// Built-in uses - -// External uses -use actix_web::{ - web::{self, Json}, - Scope, -}; - -// Workspace uses -use zksync_api_client::rest::v1::BlockSearchQuery; -use zksync_storage::{ConnectionPool, QueryResult}; - -// Local uses -use super::{ - blocks::{convert::block_info_from_details, BlockInfo}, - Error as ApiError, JsonResult, -}; - -/// Shared data between `api/v1/search` endpoints. -#[derive(Clone)] -struct ApiSearchData { - pool: ConnectionPool, -} - -impl ApiSearchData { - fn new(pool: ConnectionPool) -> Self { - Self { pool } - } - - async fn search_block(&self, query: String) -> QueryResult> { - let mut storage = self.pool.access_storage().await?; - - let block = storage - .chain() - .block_schema() - .find_block_by_height_or_hash(query) - .await; - - Ok(block.map(block_info_from_details)) - } -} - -// Server implementation - -async fn block_search( - data: web::Data, - web::Query(query): web::Query, -) -> JsonResult> { - let block_info = data - .search_block(query.query) - .await - .map_err(ApiError::internal)?; - - Ok(Json(block_info)) -} - -pub fn api_scope(pool: ConnectionPool) -> Scope { - let data = ApiSearchData::new(pool); - - web::scope("search") - .data(data) - .route("", web::get().to(block_search)) -} - -#[cfg(test)] -mod tests { - use super::{super::test_utils::TestServerConfig, *}; - use zksync_types::BlockNumber; - - #[actix_rt::test] - #[cfg_attr( - not(feature = "api_test"), - ignore = "Use `zk test rust-api` command to perform this test" - )] - async fn search_scope() -> anyhow::Result<()> { - let cfg = TestServerConfig::default(); - cfg.fill_database().await?; - - let (client, server) = cfg.start_server(move |cfg| api_scope(cfg.pool.clone())); - - // Search for the existing block by number. - let block_info = client - .search_block(BlockNumber(1)) - .await? - .expect("block should be exist"); - // Search for the existing block by root hash. - assert_eq!( - client - .search_block(block_info.new_state_root) - .await? - .unwrap(), - block_info - ); - // Search for the existing block by committed tx hash. - assert_eq!( - client - .search_block(block_info.commit_tx_hash.unwrap()) - .await? - .unwrap(), - block_info - ); - // Search for the existing block by verified tx hash. - assert_eq!( - client - .search_block(block_info.verify_tx_hash.unwrap()) - .await? - .unwrap(), - block_info - ); - - server.stop().await; - Ok(()) - } -} diff --git a/core/bin/zksync_api/src/api_server/rest/v1/tokens.rs b/core/bin/zksync_api/src/api_server/rest/v1/tokens.rs deleted file mode 100644 index 63894dce5c..0000000000 --- a/core/bin/zksync_api/src/api_server/rest/v1/tokens.rs +++ /dev/null @@ -1,288 +0,0 @@ -//! Tokens part of API implementation. - -// Built-in uses - -// External uses -use actix_web::{ - web::{self, Json}, - Scope, -}; -use bigdecimal::BigDecimal; -use futures::{ - channel::{mpsc, oneshot}, - prelude::*, -}; - -// Workspace uses -use zksync_api_client::rest::v1::{TokenPriceKind, TokenPriceQuery}; -use zksync_storage::{ConnectionPool, QueryResult}; -use zksync_types::{Token, TokenLike}; - -use crate::{ - fee_ticker::{PriceError, TickerRequest, TokenPriceRequestType}, - utils::token_db_cache::TokenDBCache, -}; - -// Local uses -use super::{ApiError, JsonResult}; - -/// Shared data between `api/v1/tokens` endpoints. -#[derive(Clone)] -struct ApiTokensData { - fee_ticker: mpsc::Sender, - tokens: TokenDBCache, - pool: ConnectionPool, -} - -impl ApiTokensData { - fn new( - pool: ConnectionPool, - tokens: TokenDBCache, - fee_ticker: mpsc::Sender, - ) -> Self { - Self { - fee_ticker, - tokens, - pool, - } - } - - async fn tokens(&self) -> QueryResult> { - let mut storage = self.pool.access_storage().await?; - - let tokens = storage.tokens_schema().load_tokens().await?; - - // Provide tokens in a predictable order. - let mut tokens: Vec<_> = tokens.into_iter().map(|(_k, v)| v).collect(); - tokens.sort_unstable_by_key(|token| token.id); - - Ok(tokens) - } - - async fn token(&self, token_like: TokenLike) -> QueryResult> { - let mut storage = self.pool.access_storage().await?; - - self.tokens.get_token(&mut storage, token_like).await - } - - async fn token_price_usd(&self, token: TokenLike) -> QueryResult> { - let (price_sender, price_receiver) = oneshot::channel(); - self.fee_ticker - .clone() - .send(TickerRequest::GetTokenPrice { - token, - response: price_sender, - req_type: TokenPriceRequestType::USDForOneToken, - }) - .await?; - - match price_receiver.await? { - Ok(price) => Ok(Some(price)), - Err(PriceError::TokenNotFound(_)) => Ok(None), - Err(PriceError::DBError(err)) => Err(anyhow::format_err!(err)), - Err(PriceError::ApiError(err)) => Err(anyhow::format_err!(err)), - } - } -} - -// Server implementation - -async fn tokens(data: web::Data) -> JsonResult> { - let tokens = data.tokens().await.map_err(ApiError::internal)?; - - Ok(Json(tokens)) -} - -async fn token_by_id( - data: web::Data, - web::Path(token_like): web::Path, -) -> JsonResult> { - let token_like = TokenLike::parse(&token_like); - - let token = data.token(token_like).await.map_err(ApiError::internal)?; - Ok(Json(token)) -} - -async fn token_price( - data: web::Data, - web::Path(token_like): web::Path, - web::Query(token_query): web::Query, -) -> JsonResult> { - let token_like = TokenLike::parse(&token_like); - - let price = match token_query.kind { - TokenPriceKind::Currency => data - .token_price_usd(token_like) - .await - .map_err(ApiError::internal)?, - - TokenPriceKind::Token => { - return Err(ApiError::not_implemented( - "price in tokens not yet implemented", - )) - } - }; - - Ok(Json(price)) -} - -pub fn api_scope( - pool: ConnectionPool, - tokens_db: TokenDBCache, - fee_ticker: mpsc::Sender, -) -> Scope { - let data = ApiTokensData::new(pool, tokens_db, fee_ticker); - - web::scope("tokens") - .data(data) - .route("", web::get().to(tokens)) - .route("{id}", web::get().to(token_by_id)) - .route("{id}/price", web::get().to(token_price)) -} - -#[cfg(test)] -mod tests { - use std::collections::HashMap; - - use zksync_types::{Address, TokenId}; - - use super::{super::test_utils::TestServerConfig, *}; - - use zksync_api_client::rest::v1::ClientError; - - fn dummy_fee_ticker(prices: &[(TokenLike, BigDecimal)]) -> mpsc::Sender { - let (sender, mut receiver) = mpsc::channel(10); - - let prices: HashMap<_, _> = prices.iter().cloned().collect(); - actix_rt::spawn(async move { - while let Some(item) = receiver.next().await { - match item { - TickerRequest::GetTokenPrice { - token, - response, - req_type, - } => { - assert_eq!( - req_type, - TokenPriceRequestType::USDForOneToken, - "Unsupported price request type" - ); - - let msg = if let Some(price) = prices.get(&token) { - Ok(price.clone()) - } else { - Err(PriceError::token_not_found(format!( - "Token not found: {:?}", - token - ))) - }; - - response.send(msg).expect("Unable to send response"); - } - _ => unreachable!("Unsupported request"), - } - } - }); - - sender - } - - #[actix_rt::test] - #[cfg_attr( - not(feature = "api_test"), - ignore = "Use `zk test rust-api` command to perform this test" - )] - async fn test_tokens_scope() -> anyhow::Result<()> { - let cfg = TestServerConfig::default(); - cfg.fill_database().await?; - - let prices = [ - (TokenLike::Id(TokenId(1)), 10_u64.into()), - (TokenLike::Id(TokenId(15)), 10_500_u64.into()), - ("ETH".into(), 0_u64.into()), - (Address::default().into(), 1_u64.into()), - ]; - let fee_ticker = dummy_fee_ticker(&prices); - - let (client, server) = cfg.start_server(move |cfg| { - api_scope(cfg.pool.clone(), TokenDBCache::new(), fee_ticker.clone()) - }); - - // Fee requests - for (token, expected_price) in &prices { - let actual_price = client.token_price(token, TokenPriceKind::Currency).await?; - - assert_eq!( - actual_price.as_ref(), - Some(expected_price), - "Price does not match" - ); - } - assert_eq!( - client - .token_price(&TokenLike::Id(TokenId(2)), TokenPriceKind::Currency) - .await?, - None - ); - let error = client - .token_price(&TokenLike::Id(TokenId(2)), TokenPriceKind::Token) - .await - .unwrap_err(); - assert!( - matches!(error, ClientError::BadRequest { .. }), - "Incorrect error type: got {:?} instead of BadRequest", - error - ); - // Tokens requests - let expected_tokens = { - let mut storage = cfg.pool.access_storage().await?; - - let mut tokens: Vec<_> = storage - .tokens_schema() - .load_tokens() - .await? - .values() - .cloned() - .collect(); - tokens.sort_unstable_by(|lhs, rhs| lhs.id.cmp(&rhs.id)); - tokens - }; - - assert_eq!(client.tokens().await?, expected_tokens); - - let expected_token = &expected_tokens[0]; - assert_eq!( - &client - .token_by_id(&TokenLike::Id(TokenId(0))) - .await? - .unwrap(), - expected_token - ); - assert_eq!( - &client - .token_by_id(&TokenLike::parse( - "0x0000000000000000000000000000000000000000" - )) - .await? - .unwrap(), - expected_token - ); - assert_eq!( - &client - .token_by_id(&TokenLike::parse( - "0000000000000000000000000000000000000000" - )) - .await? - .unwrap(), - expected_token - ); - assert_eq!( - &client.token_by_id(&TokenLike::parse("ETH")).await?.unwrap(), - expected_token - ); - assert_eq!(client.token_by_id(&TokenLike::parse("XM")).await?, None); - - server.stop().await; - Ok(()) - } -} diff --git a/core/bin/zksync_api/src/api_server/rest/v1/transactions.rs b/core/bin/zksync_api/src/api_server/rest/v1/transactions.rs index ae0bec3936..e69de29bb2 100644 --- a/core/bin/zksync_api/src/api_server/rest/v1/transactions.rs +++ b/core/bin/zksync_api/src/api_server/rest/v1/transactions.rs @@ -1,978 +0,0 @@ -//! Transactions part of API implementation. - -// Built-in uses - -// External uses -use actix_web::{ - web::{self, Json}, - Scope, -}; - -// Workspace uses -pub use zksync_api_client::rest::v1::{ - FastProcessingQuery, IncomingTx, IncomingTxBatch, IncomingTxBatchForFee, IncomingTxForFee, - Receipt, TxData, -}; -use zksync_storage::{ - chain::operations_ext::records::TxReceiptResponse, QueryResult, StorageProcessor, -}; -use zksync_types::{ - tx::{TxEthSignatureVariant, TxHash}, - BatchFee, BlockNumber, Fee, SignedZkSyncTx, -}; -// Local uses -use super::{Error as ApiError, JsonResult, Pagination, PaginationQuery}; -use crate::api_server::rpc_server::types::TxWithSignature; -use crate::api_server::tx_sender::{SubmitError, TxSender}; - -#[derive(Debug, Clone, Copy)] -pub enum SumbitErrorCode { - AccountCloseDisabled = 101, - InvalidParams = 102, - UnsupportedFastProcessing = 103, - IncorrectTx = 104, - TxAdd = 105, - InappropriateFeeToken = 106, - - Internal = 110, - CommunicationCoreServer = 111, - Other = 112, -} - -impl SumbitErrorCode { - fn from_err(err: &SubmitError) -> Self { - match err { - SubmitError::AccountCloseDisabled => Self::AccountCloseDisabled, - SubmitError::InvalidParams(_) => Self::InvalidParams, - SubmitError::UnsupportedFastProcessing => Self::UnsupportedFastProcessing, - SubmitError::IncorrectTx(_) => Self::IncorrectTx, - SubmitError::TxAdd(_) => Self::TxAdd, - SubmitError::InappropriateFeeToken => Self::InappropriateFeeToken, - SubmitError::CommunicationCoreServer(_) => Self::CommunicationCoreServer, - SubmitError::Internal(_) => Self::Internal, - SubmitError::Other(_) => Self::Other, - } - } - - fn as_code(self) -> u64 { - self as u64 - } -} - -impl From for ApiError { - fn from(inner: SubmitError) -> Self { - let internal_code = SumbitErrorCode::from_err(&inner).as_code(); - - if let SubmitError::Internal(err) = &inner { - ApiError::internal(err) - } else { - ApiError::bad_request(inner) - } - .code(internal_code) - } -} - -/// Shared data between `api/v1/transactions` endpoints. -#[derive(Clone)] -struct ApiTransactionsData { - tx_sender: TxSender, -} - -impl ApiTransactionsData { - fn new(tx_sender: TxSender) -> Self { - Self { tx_sender } - } - - async fn tx_receipt( - storage: &mut StorageProcessor<'_>, - tx_hash: TxHash, - ) -> QueryResult> { - storage - .chain() - .operations_ext_schema() - .tx_receipt(tx_hash.as_ref()) - .await - } - - async fn tx_status(&self, tx_hash: TxHash) -> QueryResult> { - let mut storage = self.tx_sender.pool.access_storage().await?; - - let tx_receipt = { - if let Some(tx_receipt) = Self::tx_receipt(&mut storage, tx_hash).await? { - tx_receipt - } else { - let tx_in_mempool = storage - .chain() - .mempool_schema() - .contains_tx(tx_hash) - .await?; - - let tx_receipt = if tx_in_mempool { - Some(Receipt::Pending) - } else { - None - }; - return Ok(tx_receipt); - } - }; - - let block_number = BlockNumber(tx_receipt.block_number as u32); - // Check the cases where we don't need to get block details. - if !tx_receipt.success { - return Ok(Some(Receipt::Rejected { - reason: tx_receipt.fail_reason, - })); - } - - if tx_receipt.verified { - return Ok(Some(Receipt::Verified { - block: block_number, - })); - } - - // To distinguish committed and executed transaction we have to examine - // the transaction's block. - // - // TODO `load_block_range` possibly is too heavy operation and we should write - // specific request in the storage schema. (Task number ????) - let block = storage - .chain() - .block_schema() - .load_block_range(block_number, 1) - .await? - .into_iter() - .next(); - - let is_committed = block - .filter(|block| block.commit_tx_hash.is_some()) - .is_some(); - - let tx_receipt = if is_committed { - Receipt::Committed { - block: block_number, - } - } else { - Receipt::Executed - }; - - Ok(Some(tx_receipt)) - } - - async fn tx_data(&self, tx_hash: TxHash) -> QueryResult> { - let mut storage = self.tx_sender.pool.access_storage().await?; - - let operation = storage - .chain() - .operations_schema() - .get_executed_operation(tx_hash.as_ref()) - .await?; - - if let Some(op) = operation { - let signed_tx = SignedZkSyncTx { - tx: serde_json::from_value(op.tx)?, - eth_sign_data: op.eth_sign_data.map(serde_json::from_value).transpose()?, - }; - - Ok(Some(signed_tx)) - } else { - // Check memory pool for pending transactions. - storage.chain().mempool_schema().get_tx(tx_hash).await - } - } -} - -// Server implementation - -async fn tx_status( - data: web::Data, - web::Path(tx_hash): web::Path, -) -> JsonResult> { - let tx_status = data.tx_status(tx_hash).await.map_err(ApiError::internal)?; - - Ok(Json(tx_status)) -} - -async fn tx_data( - data: web::Data, - web::Path(tx_hash): web::Path, -) -> JsonResult> { - let tx_data = data.tx_data(tx_hash).await.map_err(ApiError::internal)?; - - Ok(Json(tx_data.map(TxData::from))) -} - -async fn tx_receipt_by_id( - data: web::Data, - web::Path((tx_hash, receipt_id)): web::Path<(TxHash, u32)>, -) -> JsonResult> { - // At the moment we store only last receipt, so this endpoint is just only a stub. - if receipt_id > 0 { - return Ok(Json(None)); - } - - let tx_status = data.tx_status(tx_hash).await.map_err(ApiError::internal)?; - - Ok(Json(tx_status)) -} - -async fn tx_receipts( - data: web::Data, - web::Path(tx_hash): web::Path, - web::Query(pagination): web::Query, -) -> JsonResult> { - let (pagination, _limit) = pagination.into_inner()?; - // At the moment we store only last receipt, so this endpoint is just only a stub. - let is_some = match pagination { - Pagination::Before(before) if *before < 1 => false, - Pagination::After(_after) => false, - _ => true, - }; - - if is_some { - let tx_status = data.tx_status(tx_hash).await.map_err(ApiError::internal)?; - - Ok(Json(tx_status.into_iter().collect())) - } else { - Ok(Json(vec![])) - } -} - -async fn submit_tx( - data: web::Data, - Json(body): Json, - web::Query(query): web::Query, -) -> JsonResult { - let tx_hash = data - .tx_sender - .submit_tx(body.tx, body.signature, query.fast_processing) - .await - .map_err(ApiError::from)?; - - Ok(Json(tx_hash)) -} - -async fn submit_tx_batch( - data: web::Data, - Json(body): Json, -) -> JsonResult> { - let txs = body - .txs - .into_iter() - .map(|tx| TxWithSignature { - tx, - signature: TxEthSignatureVariant::Single(None), - }) - .collect(); - - let signatures = body.signature; - let tx_hashes = data - .tx_sender - .submit_txs_batch(txs, Some(signatures)) - .await - .map_err(ApiError::from)?; - - Ok(Json(tx_hashes)) -} - -async fn get_txs_fee_in_wei( - data: web::Data, - Json(body): Json, -) -> JsonResult { - let fee = data - .tx_sender - .get_txs_fee_in_wei(body.tx_type, body.address, body.token_like) - .await?; - Ok(Json(fee)) -} - -async fn get_txs_batch_fee_in_wei( - data: web::Data, - Json(body): Json, -) -> JsonResult { - let txs = body - .tx_types - .into_iter() - .zip(body.addresses.into_iter()) - .collect(); - let fee = data - .tx_sender - .get_txs_batch_fee_in_wei(txs, body.token_like) - .await - .map_err(ApiError::from)?; - - Ok(Json(fee)) -} - -pub fn api_scope(tx_sender: TxSender) -> Scope { - let data = ApiTransactionsData::new(tx_sender); - - web::scope("transactions") - .data(data) - .route("{tx_hash}", web::get().to(tx_status)) - .route("{tx_hash}/data", web::get().to(tx_data)) - .route( - "{tx_hash}/receipts/{receipt_id}", - web::get().to(tx_receipt_by_id), - ) - .route("{tx_hash}/receipts", web::get().to(tx_receipts)) - .route("submit", web::post().to(submit_tx)) - .route("submit/batch", web::post().to(submit_tx_batch)) - .route("fee/batch", web::post().to(get_txs_batch_fee_in_wei)) - .route("fee", web::post().to(get_txs_fee_in_wei)) -} - -#[cfg(test)] -mod tests { - use actix_web::App; - use bigdecimal::BigDecimal; - use futures::{channel::mpsc, StreamExt}; - use num::rational::Ratio; - use num::BigUint; - - use zksync_api_client::rest::v1::Client; - use zksync_storage::ConnectionPool; - use zksync_test_account::ZkSyncAccount; - use zksync_types::{ - tokens::{Token, TokenLike}, - tx::{EthBatchSignData, EthBatchSignatures, PackedEthSignature, TxEthSignature}, - AccountId, BlockNumber, Fee, Nonce, - OutputFeeType::Withdraw, - TokenId, ZkSyncTx, - }; - - use crate::{ - api_server::helpers::try_parse_tx_hash, - core_api_client::CoreApiClient, - fee_ticker::{ResponseBatchFee, ResponseFee, TickerRequest}, - signature_checker::{VerifiedTx, VerifySignatureRequest}, - }; - - use super::super::test_utils::{TestServerConfig, TestTransactions}; - use super::*; - - fn submit_txs_loopback() -> (CoreApiClient, actix_web::test::TestServer) { - async fn send_tx(_tx: Json) -> Json> { - Json(Ok(())) - } - - async fn send_txs_batch( - _txs: Json<(Vec, Vec)>, - ) -> Json> { - Json(Ok(())) - } - - let server = actix_web::test::start(move || { - App::new() - .route("new_tx", web::post().to(send_tx)) - .route("new_txs_batch", web::post().to(send_txs_batch)) - }); - - let url = server.url("").trim_end_matches('/').to_owned(); - - (CoreApiClient::new(url), server) - } - - fn dummy_fee_ticker() -> mpsc::Sender { - let (sender, mut receiver) = mpsc::channel(10); - - actix_rt::spawn(async move { - while let Some(item) = receiver.next().await { - match item { - TickerRequest::GetTxFee { response, .. } => { - let normal_fee = Fee::new( - Withdraw, - BigUint::from(1_u64).into(), - BigUint::from(1_u64).into(), - 1_u64.into(), - 1_u64.into(), - ); - - let subsidy_fee = normal_fee.clone(); - - let res = Ok(ResponseFee { - normal_fee, - subsidy_fee, - subsidy_size_usd: Ratio::from_integer(0u32.into()), - }); - - response.send(res).expect("Unable to send response"); - } - TickerRequest::GetTokenPrice { response, .. } => { - let price = Ok(BigDecimal::from(1_u64)); - - response.send(price).expect("Unable to send response"); - } - TickerRequest::IsTokenAllowed { token, response } => { - // For test purposes, PHNX token is not allowed. - let is_phnx = match token { - TokenLike::Id(id) => *id == 1, - TokenLike::Symbol(sym) => sym == "PHNX", - TokenLike::Address(_) => unreachable!(), - }; - response.send(Ok(!is_phnx)).unwrap_or_default(); - } - TickerRequest::GetBatchTxFee { - response, - transactions, - .. - } => { - let normal_fee = BatchFee { - total_fee: BigUint::from(transactions.len()), - }; - let subsidy_fee = normal_fee.clone(); - - let res = Ok(ResponseBatchFee { - normal_fee, - subsidy_fee, - subsidy_size_usd: Ratio::from_integer(0u32.into()), - }); - - response.send(res).expect("Unable to send response"); - } - } - } - }); - - sender - } - - fn dummy_sign_verifier() -> mpsc::Sender { - let (sender, mut receiver) = mpsc::channel::(10); - - actix_rt::spawn(async move { - while let Some(item) = receiver.next().await { - let verified = VerifiedTx::unverified(item.data.get_tx_variant()); - item.response - .send(Ok(verified)) - .expect("Unable to send response"); - } - }); - - sender - } - - struct TestServer { - core_server: actix_web::test::TestServer, - api_server: actix_web::test::TestServer, - #[allow(dead_code)] - pool: ConnectionPool, - } - - impl TestServer { - async fn new() -> anyhow::Result<(Client, Self)> { - let (core_client, core_server) = submit_txs_loopback(); - - let mut cfg = TestServerConfig::default(); - cfg.config - .api - .common - .fee_free_accounts - .push(AccountId(0xfee)); - let pool = cfg.pool.clone(); - cfg.fill_database().await?; - - let sign_verifier = dummy_sign_verifier(); - let fee_ticker = dummy_fee_ticker(); - - let (api_client, api_server) = cfg.start_server(move |cfg| { - api_scope(TxSender::with_client( - core_client.clone(), - cfg.pool.clone(), - sign_verifier.clone(), - fee_ticker.clone(), - &cfg.config, - )) - }); - - Ok(( - api_client, - Self { - core_server, - api_server, - pool, - }, - )) - } - - async fn stop(self) { - self.api_server.stop().await; - self.core_server.stop().await; - } - } - - #[actix_rt::test] - #[cfg_attr( - not(feature = "api_test"), - ignore = "Use `zk test rust-api` command to perform this test" - )] - async fn test_rust_api() -> anyhow::Result<()> { - // TODO: ZKS-561 - test_transactions_scope().await?; - test_bad_fee_token().await?; - test_fast_processing_flag().await?; - test_fee_free_accounts().await?; - Ok(()) - } - - #[actix_rt::test] - #[cfg_attr( - not(feature = "api_test"), - ignore = "Use `zk test rust-api` command to perform this test" - )] - async fn test_submit_txs_loopback() -> anyhow::Result<()> { - let (core_client, core_server) = submit_txs_loopback(); - - let signed_tx = SignedZkSyncTx { - tx: TestServerConfig::gen_zk_txs(0).txs[0].0.clone(), - eth_sign_data: None, - }; - - core_client.send_tx(signed_tx.clone()).await??; - core_client - .send_txs_batch(vec![signed_tx], vec![]) - .await??; - - core_server.stop().await; - Ok(()) - } - - async fn test_transactions_scope() -> anyhow::Result<()> { - let (client, server) = TestServer::new().await?; - - let committed_tx_hash = { - let mut storage = server.pool.access_storage().await?; - - let transactions = storage - .chain() - .block_schema() - .get_block_transactions(BlockNumber(1)) - .await?; - - try_parse_tx_hash(&transactions[0].tx_hash).unwrap() - }; - - // Tx receipt by ID. - let unknown_tx_hash = TxHash::default(); - assert!(client - .tx_receipt_by_id(committed_tx_hash, 0) - .await? - .is_some()); - assert!(client - .tx_receipt_by_id(committed_tx_hash, 1) - .await? - .is_none()); - assert!(client.tx_receipt_by_id(unknown_tx_hash, 0).await?.is_none()); - - // Tx receipts. - let queries = vec![ - ( - (committed_tx_hash, Pagination::Before(BlockNumber(1)), 1), - vec![Receipt::Verified { - block: BlockNumber(1), - }], - ), - ( - (committed_tx_hash, Pagination::Last, 1), - vec![Receipt::Verified { - block: BlockNumber(1), - }], - ), - ( - (committed_tx_hash, Pagination::Before(BlockNumber(2)), 1), - vec![Receipt::Verified { - block: BlockNumber(1), - }], - ), - ( - (committed_tx_hash, Pagination::After(BlockNumber(0)), 1), - vec![], - ), - ((unknown_tx_hash, Pagination::Last, 1), vec![]), - ]; - - for (query, expected_response) in queries { - let actual_response = client.tx_receipts(query.0, query.1, query.2).await?; - - assert_eq!( - actual_response, - expected_response, - "tx: {} from: {:?} limit: {:?}", - query.0.to_string(), - query.1, - query.2 - ); - } - - // Tx status and data for committed transaction. - assert_eq!( - client.tx_status(committed_tx_hash).await?, - Some(Receipt::Verified { - block: BlockNumber(1) - }) - ); - assert_eq!( - SignedZkSyncTx::from(client.tx_data(committed_tx_hash).await?.unwrap()).hash(), - committed_tx_hash - ); - - // Tx status and data for pending transaction. - let tx_hash = { - let mut storage = server.pool.access_storage().await?; - - let tx = TestServerConfig::gen_zk_txs(1_u64).txs[0].0.clone(); - let tx_hash = tx.hash(); - storage - .chain() - .mempool_schema() - .insert_tx(&SignedZkSyncTx { - tx, - eth_sign_data: None, - }) - .await?; - - tx_hash - }; - assert_eq!(client.tx_status(tx_hash).await?, Some(Receipt::Pending)); - assert_eq!( - SignedZkSyncTx::from(client.tx_data(tx_hash).await?.unwrap()).hash(), - tx_hash - ); - - // Tx status for unknown transaction. - let tx_hash = TestServerConfig::gen_zk_txs(1_u64).txs[1].0.hash(); - assert_eq!(client.tx_status(tx_hash).await?, None); - assert!(client.tx_data(tx_hash).await?.is_none()); - - // Submit correct transaction. - let tx = TestServerConfig::gen_zk_txs(1_00).txs[0].0.clone(); - let expected_tx_hash = tx.hash(); - assert_eq!( - client - .submit_tx(tx, TxEthSignatureVariant::Single(None), None) - .await?, - expected_tx_hash - ); - - // Submit transaction without fee. - let tx = TestServerConfig::gen_zk_txs(0).txs[0].0.clone(); - assert!(client - .submit_tx(tx, TxEthSignatureVariant::Single(None), None) - .await - .unwrap_err() - .to_string() - .contains("Transaction fee is too low")); - - // Submit correct transactions batch. - let TestTransactions { acc, txs } = TestServerConfig::gen_zk_txs(1_00); - let eth = Token::new(TokenId(0), Default::default(), "ETH", 18); - let (good_batch, tx_hashes): (Vec<_>, Vec<_>) = txs - .into_iter() - .map(|(tx, _op)| { - let tx_hash = tx.hash(); - (tx, tx_hash) - }) - .unzip(); - - let txs = good_batch - .iter() - .zip(std::iter::repeat(eth)) - .map(|(tx, token)| (tx.clone(), token, tx.account())) - .collect::>(); - let batch_signature = { - let eth_private_key = acc - .try_get_eth_private_key() - .expect("Should have ETH private key"); - let batch_message = EthBatchSignData::get_batch_sign_message(txs); - let eth_sig = PackedEthSignature::sign(eth_private_key, &batch_message).unwrap(); - let single_signature = TxEthSignature::EthereumSignature(eth_sig); - - EthBatchSignatures::Single(single_signature) - }; - - assert_eq!( - client.submit_tx_batch(good_batch, batch_signature).await?, - tx_hashes - ); - - server.stop().await; - Ok(()) - } - - /// This test checks the following criteria: - /// - /// - Attempt to pay fees in an inappropriate token fails for single txs. - /// - Attempt to pay fees in an inappropriate token fails for single batch. - /// - Batch with an inappropriate token still can be processed if the fee is covered with a common token. - async fn test_bad_fee_token() -> anyhow::Result<()> { - let (client, server) = TestServer::new().await?; - - let from = ZkSyncAccount::rand(); - from.set_account_id(Some(AccountId(0xdead))); - let to = ZkSyncAccount::rand(); - - // Submit transaction with a fee token that is not allowed. - - let (tx, eth_sig) = from.sign_transfer( - TokenId(1), - "PHNX", - 100u64.into(), - 100u64.into(), - &to.address, - Some(Nonce(0)), - false, - Default::default(), - ); - let transfer_bad_token = ZkSyncTx::Transfer(Box::new(tx)); - assert!(client - .submit_tx( - transfer_bad_token.clone(), - TxEthSignatureVariant::Single(eth_sig.map(TxEthSignature::EthereumSignature)), - None - ) - .await - .unwrap_err() - .to_string() - .contains("Chosen token is not suitable for paying fees")); - - // Prepare batch and make the same mistake. - let bad_token = Token::new(TokenId(1), Default::default(), "PHNX", 18); - let bad_batch = vec![transfer_bad_token.clone(), transfer_bad_token]; - let txs = bad_batch - .iter() - .zip(std::iter::repeat(bad_token)) - .map(|(tx, token)| (tx.clone(), token, tx.account())) - .collect::>(); - let batch_signature = { - let batch_message = EthBatchSignData::get_batch_sign_message(txs); - let eth_private_key = from - .try_get_eth_private_key() - .expect("should have eth private key"); - let eth_sig = PackedEthSignature::sign(eth_private_key, &batch_message).unwrap(); - let single_signature = TxEthSignature::EthereumSignature(eth_sig); - - EthBatchSignatures::Single(single_signature) - }; - - assert!(client - .submit_tx_batch(bad_batch, batch_signature) - .await - .unwrap_err() - .to_string() - .contains("Chosen token is not suitable for paying fees")); - - // Finally, prepare the batch in which fee is covered by the supported token. - let (tx, _) = from.sign_transfer( - TokenId(1), - "PHNX", - 100u64.into(), - 0u64.into(), // Note that fee is zero, which is OK. - &to.address, - Some(Nonce(0)), - false, - Default::default(), - ); - let phnx_transfer = ZkSyncTx::Transfer(Box::new(tx)); - let phnx_transfer_hash = phnx_transfer.hash(); - let (tx, _) = from.sign_transfer( - TokenId(0), - "ETH", - 0u64.into(), - 200u64.into(), // Here we pay fees for both transfers in ETH. - &to.address, - Some(Nonce(0)), - false, - Default::default(), - ); - let fee_tx = ZkSyncTx::Transfer(Box::new(tx)); - let fee_tx_hash = fee_tx.hash(); - - let eth = Token::new(TokenId(0), Default::default(), "ETH", 18); - let good_batch = vec![phnx_transfer, fee_tx]; - let good_batch_hashes = vec![phnx_transfer_hash, fee_tx_hash]; - let txs = good_batch - .iter() - .zip(std::iter::repeat(eth)) - .map(|(tx, token)| (tx.clone(), token, tx.account())) - .collect::>(); - let batch_signature = { - let batch_message = EthBatchSignData::get_batch_sign_message(txs); - let eth_private_key = from - .try_get_eth_private_key() - .expect("should have eth private key"); - let eth_sig = PackedEthSignature::sign(eth_private_key, &batch_message).unwrap(); - let single_signature = TxEthSignature::EthereumSignature(eth_sig); - - EthBatchSignatures::Single(single_signature) - }; - - assert_eq!( - client.submit_tx_batch(good_batch, batch_signature).await?, - good_batch_hashes - ); - - server.stop().await; - Ok(()) - } - - /// This test checks the following: - /// - /// Fee free account can pay zero fee in single tx. - /// Not a fee free account can't pay zero fee in single tx. - async fn test_fee_free_accounts() -> anyhow::Result<()> { - let (client, server) = TestServer::new().await?; - - let from1 = ZkSyncAccount::rand(); - from1.set_account_id(Some(AccountId(0xfee))); - let to1 = ZkSyncAccount::rand(); - - // Submit transaction with a zero fee by the fee free account - let (tx1, eth_sig1) = from1.sign_transfer( - TokenId(0), - "ETH", - 0u64.into(), - 0u64.into(), - &to1.address, - Some(Nonce(0)), - false, - Default::default(), - ); - let transfer1 = ZkSyncTx::Transfer(Box::new(tx1)); - client - .submit_tx( - transfer1.clone(), - TxEthSignatureVariant::Single(eth_sig1.map(TxEthSignature::EthereumSignature)), - None, - ) - .await - .expect("fee free account transaction fails"); - - let from2 = ZkSyncAccount::rand(); - from2.set_account_id(Some(AccountId(0xbee))); - let to2 = ZkSyncAccount::rand(); - - // Submit transaction with a zero fee not by the fee free account - let (tx2, eth_sig2) = from2.sign_transfer( - TokenId(0), - "ETH", - 0u64.into(), - 0u64.into(), - &to2.address, - Some(Nonce(0)), - false, - Default::default(), - ); - let transfer2 = ZkSyncTx::Transfer(Box::new(tx2)); - client - .submit_tx( - transfer2.clone(), - TxEthSignatureVariant::Single(eth_sig2.map(TxEthSignature::EthereumSignature)), - None, - ) - .await - .unwrap_err() - .to_string() - .contains("Transaction fee is too low"); - - server.stop().await; - Ok(()) - } - - /// This test checks the following criteria: - /// - /// - Attempt to submit non-withdraw transaction with the enabled fast-processing. - /// - Attempt to submit non-withdraw transaction with the disabled fast-processing. - /// - Attempt to submit withdraw transaction with the enabled fast-processing. - async fn test_fast_processing_flag() -> anyhow::Result<()> { - let (client, server) = TestServer::new().await?; - - let from = ZkSyncAccount::rand(); - from.set_account_id(Some(AccountId(0xdead))); - let to = ZkSyncAccount::rand(); - - // Submit non-withdraw transaction with the enabled fast-processing. - let (tx, eth_sig) = from.sign_transfer( - TokenId(0), - "ETH", - 10_u64.into(), - 10_u64.into(), - &to.address, - None, - false, - Default::default(), - ); - client - .submit_tx( - ZkSyncTx::Transfer(Box::new(tx.clone())), - TxEthSignatureVariant::Single( - eth_sig.clone().map(TxEthSignature::EthereumSignature), - ), - Some(true), - ) - .await - .unwrap_err(); - // Submit with the disabled fast-processing. - client - .submit_tx( - ZkSyncTx::Transfer(Box::new(tx.clone())), - TxEthSignatureVariant::Single( - eth_sig.clone().map(TxEthSignature::EthereumSignature), - ), - Some(false), - ) - .await?; - // Submit without fast-processing flag. - client - .submit_tx( - ZkSyncTx::Transfer(Box::new(tx)), - TxEthSignatureVariant::Single( - eth_sig.clone().map(TxEthSignature::EthereumSignature), - ), - None, - ) - .await?; - - // Submit withdraw transaction with the enabled fast-processing. - let (tx, eth_sig) = from.sign_withdraw( - TokenId(0), - "ETH", - 100u64.into(), - 10u64.into(), - &to.address, - None, - false, - Default::default(), - ); - client - .submit_tx( - ZkSyncTx::Withdraw(Box::new(tx.clone())), - TxEthSignatureVariant::Single( - eth_sig.clone().map(TxEthSignature::EthereumSignature), - ), - Some(true), - ) - .await?; - // Submit with the disabled fast-processing. - client - .submit_tx( - ZkSyncTx::Withdraw(Box::new(tx.clone())), - TxEthSignatureVariant::Single( - eth_sig.clone().map(TxEthSignature::EthereumSignature), - ), - Some(false), - ) - .await?; - // Submit without fast-processing flag. - client - .submit_tx( - ZkSyncTx::Withdraw(Box::new(tx)), - TxEthSignatureVariant::Single( - eth_sig.clone().map(TxEthSignature::EthereumSignature), - ), - None, - ) - .await?; - - server.stop().await; - Ok(()) - } -} diff --git a/core/bin/zksync_api/src/api_server/rpc_server/rpc_impl.rs b/core/bin/zksync_api/src/api_server/rpc_server/rpc_impl.rs index 65d7bf6aed..cce7a68da4 100644 --- a/core/bin/zksync_api/src/api_server/rpc_server/rpc_impl.rs +++ b/core/bin/zksync_api/src/api_server/rpc_server/rpc_impl.rs @@ -4,12 +4,14 @@ use std::time::Instant; use bigdecimal::BigDecimal; use jsonrpc_core::{Error, Result}; // Workspace uses -use zksync_api_client::rest::v1::accounts::ApiNFT; +use zksync_api_types::{ + v02::{fee::ApiTxFeeTypes, token::ApiNFT}, + TxWithSignature, +}; use zksync_types::{ tx::{EthBatchSignatures, TxEthSignatureVariant, TxHash}, - Address, BatchFee, Fee, Token, TokenId, TokenLike, TxFeeTypes, ZkSyncTx, + Address, Fee, Token, TokenId, TokenLike, TotalFee, TxFeeTypes, ZkSyncTx, }; - // Local uses use crate::{api_server::tx_sender::SubmitError, fee_ticker::TokenPriceRequestType}; @@ -23,12 +25,24 @@ impl RpcApp { let account_state = self.get_account_state(address).await?; let depositing_ops = self.get_ongoing_deposits_impl(address).await?; + let mut storage = self.access_storage().await?; let depositing = DepositingAccountBalances::from_pending_ops( - &mut self.access_storage().await?, + &mut storage, &self.tx_sender.tokens, depositing_ops, ) .await?; + let account_type = if let Some(account_id) = account_state.account_id { + storage + .chain() + .account_schema() + .account_type_by_id(account_id) + .await + .map_err(|_| Error::internal_error())? + .map(|t| t.into()) + } else { + None + }; metrics::histogram!("api.rpc.account_info", start.elapsed()); Ok(AccountInfoResp { @@ -37,6 +51,7 @@ impl RpcApp { committed: account_state.committed, verified: account_state.verified, depositing, + account_type, }) } @@ -93,6 +108,7 @@ impl RpcApp { }) } + #[allow(deprecated)] pub async fn _impl_tx_submit( self, tx: Box, @@ -102,7 +118,7 @@ impl RpcApp { let start = Instant::now(); let result = self .tx_sender - .submit_tx(*tx, *signature, fast_processing) + .submit_tx_with_separate_fp(*tx, *signature, fast_processing) .await .map_err(Error::from); metrics::histogram!("api.rpc.tx_submit", start.elapsed()); @@ -115,11 +131,18 @@ impl RpcApp { eth_signatures: Option, ) -> Result> { let start = Instant::now(); - let result = self + let result: Result> = self .tx_sender .submit_txs_batch(txs, eth_signatures) .await - .map_err(Error::from); + .map_err(Error::from) + .map(|response| { + response + .transaction_hashes + .into_iter() + .map(|tx_hash| tx_hash.0) + .collect() + }); metrics::histogram!("api.rpc.submit_txs_batch", start.elapsed()); result } @@ -157,7 +180,7 @@ impl RpcApp { pub async fn _impl_get_nft(self, id: TokenId) -> Result> { let start = Instant::now(); let mut storage = self.access_storage().await?; - let result = storage + let nft = storage .tokens_schema() .get_nft_with_factories(id) .await @@ -167,7 +190,7 @@ impl RpcApp { })?; metrics::histogram!("api.rpc.get_nft", start.elapsed()); - Ok(result.map(|nft| nft.into())) + Ok(nft) } pub async fn _impl_tokens(self) -> Result> { @@ -195,7 +218,7 @@ impl RpcApp { pub async fn _impl_get_tx_fee( self, - tx_type: TxFeeTypes, + tx_type: ApiTxFeeTypes, address: Address, token: TokenLike, ) -> Result { @@ -205,29 +228,19 @@ impl RpcApp { if !token_allowed { return Err(SubmitError::InappropriateFeeToken.into()); } - let result = Self::ticker_request(ticker.clone(), tx_type, address, token.clone()).await?; - - let token = self.tx_sender.token_info_from_id(token).await?; - let allowed_subsidy = self - .tx_sender - .subsidy_accumulator - .get_allowed_subsidy(&token.address); - let fee = if allowed_subsidy >= result.subsidy_size_usd { - result.subsidy_fee - } else { - result.normal_fee - }; + let result = + Self::ticker_request(ticker.clone(), tx_type.into(), address, token.clone()).await?; metrics::histogram!("api.rpc.get_tx_fee", start.elapsed()); - Ok(fee) + Ok(result.normal_fee) } pub async fn _impl_get_txs_batch_fee_in_wei( self, - tx_types: Vec, + tx_types: Vec, addresses: Vec
, token: TokenLike, - ) -> Result { + ) -> Result { let start = Instant::now(); if tx_types.len() != addresses.len() { return Err(Error { @@ -243,23 +256,18 @@ impl RpcApp { return Err(SubmitError::InappropriateFeeToken.into()); } - let transactions: Vec<(TxFeeTypes, Address)> = - (tx_types.iter().cloned().zip(addresses.iter().cloned())).collect(); + let transactions: Vec<(TxFeeTypes, Address)> = (tx_types + .iter() + .cloned() + .map(|fee_type| fee_type.into()) + .zip(addresses.iter().cloned())) + .collect(); let result = Self::ticker_batch_fee_request(ticker, transactions, token.clone()).await?; - let token = self.tx_sender.token_info_from_id(token).await?; - let allowed_subsidy = self - .tx_sender - .subsidy_accumulator - .get_allowed_subsidy(&token.address); - let fee = if allowed_subsidy >= result.subsidy_size_usd { - result.subsidy_fee - } else { - result.normal_fee - }; - metrics::histogram!("api.rpc.get_txs_batch_fee_in_wei", start.elapsed()); - Ok(fee) + Ok(TotalFee { + total_fee: result.normal_fee.total_fee, + }) } pub async fn _impl_get_token_price(self, token: TokenLike) -> Result { diff --git a/core/bin/zksync_api/src/api_server/rpc_server/rpc_trait.rs b/core/bin/zksync_api/src/api_server/rpc_server/rpc_trait.rs index 9e81148658..31fc4d131a 100644 --- a/core/bin/zksync_api/src/api_server/rpc_server/rpc_trait.rs +++ b/core/bin/zksync_api/src/api_server/rpc_server/rpc_trait.rs @@ -6,11 +6,14 @@ use jsonrpc_core::Error; use jsonrpc_derive::rpc; // Workspace uses -use zksync_api_client::rest::v1::accounts::ApiNFT; +use zksync_api_types::{ + v02::{fee::ApiTxFeeTypes, token::ApiNFT}, + TxWithSignature, +}; use zksync_crypto::params::ZKSYNC_VERSION; use zksync_types::{ tx::{EthBatchSignatures, TxEthSignatureVariant, TxHash}, - Address, BatchFee, Fee, Token, TokenId, TokenLike, TxFeeTypes, ZkSyncTx, + Address, Fee, Token, TokenId, TokenLike, TotalFee, ZkSyncTx, }; // Local uses @@ -55,19 +58,19 @@ pub trait Rpc { #[rpc(name = "get_tx_fee", returns = "Fee")] fn get_tx_fee( &self, - tx_type: TxFeeTypes, + tx_type: ApiTxFeeTypes, _address: Address, token_like: TokenLike, ) -> FutureResp; // _addresses argument is left for the backward compatibility. - #[rpc(name = "get_txs_batch_fee_in_wei", returns = "BatchFee")] + #[rpc(name = "get_txs_batch_fee_in_wei", returns = "TotalFee")] fn get_txs_batch_fee_in_wei( &self, - tx_types: Vec, + tx_types: Vec, _addresses: Vec
, token_like: TokenLike, - ) -> FutureResp; + ) -> FutureResp; #[rpc(name = "get_token_price", returns = "BigDecimal")] fn get_token_price(&self, token_like: TokenLike) -> FutureResp; @@ -161,7 +164,7 @@ impl Rpc for RpcApp { fn get_tx_fee( &self, - tx_type: TxFeeTypes, + tx_type: ApiTxFeeTypes, address: Address, token_like: TokenLike, ) -> FutureResp { @@ -178,10 +181,10 @@ impl Rpc for RpcApp { fn get_txs_batch_fee_in_wei( &self, - tx_types: Vec, + tx_types: Vec, addresses: Vec
, token_like: TokenLike, - ) -> FutureResp { + ) -> FutureResp { let handle = self.runtime_handle.clone(); let self_ = self.clone(); let resp = async move { diff --git a/core/bin/zksync_api/src/api_server/rpc_server/types.rs b/core/bin/zksync_api/src/api_server/rpc_server/types.rs index 66ce33a169..ee26f891cf 100644 --- a/core/bin/zksync_api/src/api_server/rpc_server/types.rs +++ b/core/bin/zksync_api/src/api_server/rpc_server/types.rs @@ -6,28 +6,16 @@ use num::{BigUint, ToPrimitive}; use serde::{Deserialize, Serialize}; // Workspace uses +use zksync_api_types::v02::{account::EthAccountType, token::NFT}; +use zksync_crypto::params::{MIN_NFT_TOKEN_ID, NFT_TOKEN_ID_VAL}; use zksync_storage::StorageProcessor; use zksync_types::{ - tx::TxEthSignatureVariant, Account, AccountId, Address, Nonce, PriorityOp, PubKeyHash, TokenId, - ZkSyncPriorityOp, ZkSyncTx, + Account, AccountId, Address, Nonce, PriorityOp, PubKeyHash, TokenId, ZkSyncPriorityOp, }; use zksync_utils::{BigUintSerdeAsRadix10Str, BigUintSerdeWrapper}; -// This wrong dependency, but the whole data about account info stored in this place -use zksync_api_client::rest::v1::accounts::NFT; - // Local uses -use crate::{ - api_server::v1::accounts::account_state_from_storage, utils::token_db_cache::TokenDBCache, -}; - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct TxWithSignature { - pub tx: ZkSyncTx, - #[serde(default)] - pub signature: TxEthSignatureVariant, -} +use crate::utils::token_db_cache::TokenDBCache; #[derive(Debug, Clone, Serialize, Deserialize, Default)] #[serde(rename_all = "camelCase")] @@ -45,20 +33,48 @@ impl ResponseAccountState { tokens: &TokenDBCache, account: Account, ) -> Result { - let inner = account_state_from_storage(storage, tokens, &account) - .await - .map_err(|_| Error::internal_error())?; - - // Old code used `HashMap` as well and didn't rely on the particular order, - // so here we use `HashMap` as well for the consistency. - let balances: HashMap<_, _> = inner.balances.into_iter().collect(); + let mut balances = HashMap::new(); + let mut nfts = HashMap::new(); + for (token_id, balance) in account.get_nonzero_balances() { + match token_id.0 { + NFT_TOKEN_ID_VAL => { + // Don't include special token to balances or nfts + } + MIN_NFT_TOKEN_ID..=NFT_TOKEN_ID_VAL => { + // https://github.com/rust-lang/rust/issues/37854 + // Exclusive range is an experimental feature, but we have already checked the last value in the previous step + nfts.insert( + token_id, + tokens + .get_nft_by_id(storage, token_id) + .await + .map_err(|_| Error::internal_error())? + .ok_or_else(Error::internal_error)? + .into(), + ); + } + _ => { + let token_symbol = tokens + .token_symbol(storage, token_id) + .await + .map_err(|_| Error::internal_error())? + .ok_or_else(Error::internal_error)?; + balances.insert(token_symbol, balance); + } + } + } + let minted_nfts = account + .minted_nfts + .iter() + .map(|(id, nft)| (*id, nft.clone().into())) + .collect(); Ok(Self { balances, - nfts: inner.nfts, - minted_nfts: inner.minted_nfts, - nonce: inner.nonce, - pub_key_hash: inner.pub_key_hash, + nfts, + minted_nfts, + nonce: account.nonce, + pub_key_hash: account.pub_key_hash, }) } } @@ -132,6 +148,7 @@ pub struct AccountInfoResp { pub depositing: DepositingAccountBalances, pub committed: ResponseAccountState, pub verified: ResponseAccountState, + pub account_type: Option, } #[derive(Debug, Serialize, Deserialize, Clone)] diff --git a/core/bin/zksync_api/src/api_server/tx_sender.rs b/core/bin/zksync_api/src/api_server/tx_sender.rs index f032578d3d..9712ee2797 100644 --- a/core/bin/zksync_api/src/api_server/tx_sender.rs +++ b/core/bin/zksync_api/src/api_server/tx_sender.rs @@ -2,7 +2,6 @@ // Built-in uses use std::iter::FromIterator; -use std::sync::{Arc, RwLock}; use std::{ collections::{HashMap, HashSet}, fmt::Display, @@ -11,16 +10,19 @@ use std::{ // External uses use bigdecimal::BigDecimal; -use chrono::Utc; use futures::{ channel::{mpsc, oneshot}, prelude::*, }; use itertools::izip; -use num::{bigint::ToBigInt, rational::Ratio, BigUint, CheckedSub, Zero}; +use num::{bigint::ToBigInt, BigUint, Zero}; use thiserror::Error; // Workspace uses +use zksync_api_types::{ + v02::transaction::{SubmitBatchResponse, TxHashSerializeWrapper}, + TxWithSignature, +}; use zksync_config::ZkSyncConfig; use zksync_storage::{chain::account::records::EthAccountType, ConnectionPool}; use zksync_types::{ @@ -30,12 +32,10 @@ use zksync_types::{ }, AccountId, Address, BatchFee, Fee, Token, TokenId, TokenLike, TxFeeTypes, ZkSyncTx, H160, }; -use zksync_utils::ratio_to_big_decimal; // Local uses use crate::{ api_server::forced_exit_checker::{ForcedExitAccountAgeChecker, ForcedExitChecker}, - api_server::rpc_server::types::TxWithSignature, core_api_client::CoreApiClient, fee_ticker::{ResponseBatchFee, ResponseFee, TickerRequest, TokenPriceRequestType}, signature_checker::{ @@ -62,75 +62,6 @@ pub struct TxSender { // Limit the number of both transactions and Ethereum signatures per batch. pub max_number_of_transactions_per_batch: usize, pub max_number_of_authors_per_batch: usize, - - pub subsidy_accumulator: SubsidyAccumulator, -} - -/// Used to store paid subsidy and daily limit -#[derive(Debug)] -pub struct SubsidyAccumulator { - /// Subsidy limit for token address in USD (e.g. 1 -> 1 USD) - daily_limits: HashMap>, - /// Paid subsidy per token, dated by time when first subsidy is paid - #[allow(clippy::type_complexity)] - limit_used: Arc, chrono::DateTime)>>>, -} - -impl Clone for SubsidyAccumulator { - fn clone(&self) -> Self { - Self { - daily_limits: self.daily_limits.clone(), - limit_used: Arc::clone(&self.limit_used), - } - } -} - -impl SubsidyAccumulator { - pub fn new(daily_limits: HashMap>) -> Self { - Self { - daily_limits, - limit_used: Arc::new(RwLock::new(HashMap::new())), - } - } - - pub fn get_allowed_subsidy(&self, token_address: &Address) -> Ratio { - let limit = self - .daily_limits - .get(token_address) - .cloned() - .unwrap_or_else(|| Ratio::from_integer(0u32.into())); - let used = self.limit_used.read().expect("subsidy counter rlock"); - let subsidy_used = used - .get(token_address) - .map(|(subs, _)| subs.clone()) - .unwrap_or_else(|| Ratio::from_integer(0u32.into())); - limit - .checked_sub(&subsidy_used) - .unwrap_or_else(|| Ratio::from_integer(0u32.into())) - } - - pub fn get_total_paid_subsidy(&self, token_address: &Address) -> Ratio { - let used = self.limit_used.read().expect("subsidy counter rlock"); - used.get(token_address) - .map(|(subs, _)| subs.clone()) - .unwrap_or_else(|| Ratio::from_integer(0u32.into())) - } - - pub fn add_used_subsidy(&self, token_address: &Address, subsidy_amount: Ratio) { - let mut used = self.limit_used.write().expect("subsidy counter wlock"); - let new_value = if let Some((mut old_amount, creation_time)) = used.remove(token_address) { - if Utc::now().signed_duration_since(creation_time) >= chrono::Duration::days(1) { - (Ratio::from_integer(0u32.into()), Utc::now()) - } else { - old_amount += subsidy_amount; - (old_amount, creation_time) - } - } else { - (Ratio::from_integer(0u32.into()), Utc::now()) - }; - - used.insert(*token_address, new_value); - } } #[derive(Debug, Error)] @@ -216,8 +147,6 @@ impl TxSender { let max_number_of_authors_per_batch = config.api.common.max_number_of_authors_per_batch as usize; - let subsidy_accumulator = SubsidyAccumulator::new(config.ticker.get_subsidy_limits()); - Self { core_api_client, pool: connection_pool, @@ -231,7 +160,6 @@ impl TxSender { fee_free_accounts: HashSet::from_iter(config.api.common.fee_free_accounts.clone()), max_number_of_transactions_per_batch, max_number_of_authors_per_batch, - subsidy_accumulator, } } @@ -317,21 +245,15 @@ impl TxSender { Ok(()) } - pub async fn submit_tx( + // This method is left for RPC API + #[deprecated(note = "Use the submit_tx function instead")] + pub async fn submit_tx_with_separate_fp( &self, mut tx: ZkSyncTx, signature: TxEthSignatureVariant, fast_processing: Option, ) -> Result { - if tx.is_close() { - return Err(SubmitError::AccountCloseDisabled); - } - - if let ZkSyncTx::ForcedExit(forced_exit) = &tx { - self.check_forced_exit(forced_exit).await?; - } - - let fast_processing = fast_processing.unwrap_or_default(); // `None` => false + let fast_processing = fast_processing.unwrap_or(false); if fast_processing && !tx.is_withdraw() { return Err(SubmitError::UnsupportedFastProcessing); } @@ -344,16 +266,27 @@ impl TxSender { )); } - // `fast` field is not used in serializing (as it's an internal server option, - // not the actual transaction part), so we have to set it manually depending on - // the RPC method input. withdraw.fast = fast_processing; } + self.submit_tx(tx, signature).await + } + + pub async fn submit_tx( + &self, + tx: ZkSyncTx, + signature: TxEthSignatureVariant, + ) -> Result { + if tx.is_close() { + return Err(SubmitError::AccountCloseDisabled); + } + + if let ZkSyncTx::ForcedExit(forced_exit) = &tx { + self.check_forced_exit(forced_exit).await?; + } + // Resolve the token. let token = self.token_info_from_id(tx.token_id()).await?; - let allowed_subsidy = self.subsidy_accumulator.get_allowed_subsidy(&token.address); - let mut paid_subsidy = Ratio::from_integer(0u32.into()); let msg_to_sign = tx .get_ethereum_sign_message(token.clone()) .map(String::into_bytes); @@ -396,24 +329,9 @@ impl TxSender { .into(); let provided_fee: BigDecimal = provided_fee.to_bigint().unwrap().into(); // Scaling the fee required since the price may change between signing the transaction and sending it to the server. - let scaled_provided_fee = scale_user_fee_up(provided_fee.clone()); + let scaled_provided_fee = scale_user_fee_up(provided_fee); if required_fee >= scaled_provided_fee && should_enforce_fee { - let max_subsidy = required_fee_data.get_max_subsidy(&allowed_subsidy); - - if max_subsidy >= &required_fee - &scaled_provided_fee { - paid_subsidy += required_fee_data.subsidy_size_usd - } else { - vlog::error!( - "User provided fee is too low, required: {}, provided: {} (scaled: {}); difference {}, token: {:?}", - required_fee.to_string(), - provided_fee.to_string(), - scaled_provided_fee.to_string(), - (&required_fee - &scaled_provided_fee).to_string(), - token - ); - - return Err(SubmitError::TxAdd(TxAddError::TxFeeTooLow)); - } + return Err(SubmitError::TxAdd(TxAddError::TxFeeTooLow)); } } @@ -445,7 +363,6 @@ impl TxSender { .await?; } - let tx_hash = verified_tx.tx.hash(); // Send verified transactions to the mempool. self.core_api_client .send_tx(verified_tx) @@ -453,24 +370,6 @@ impl TxSender { .map_err(SubmitError::communication_core_server)? .map_err(SubmitError::TxAdd)?; // if everything is OK, return the transactions hashes. - if paid_subsidy > Ratio::from_integer(0u32.into()) { - let paid_subsidy_dec = ratio_to_big_decimal(&paid_subsidy, 6).to_string(); - let total_paid_subsidy = ratio_to_big_decimal( - &self - .subsidy_accumulator - .get_total_paid_subsidy(&token.address), - 6, - ); - vlog::info!( - "Paid subsidy for tx, tx: {}, token: {}, subsidy_tx: {} USD, subsidy_token_total: {} USD", - tx_hash.to_string(), - &token.address, - paid_subsidy_dec, - total_paid_subsidy - ); - self.subsidy_accumulator - .add_used_subsidy(&token.address, paid_subsidy); - } Ok(tx.hash()) } @@ -478,7 +377,7 @@ impl TxSender { &self, txs: Vec, eth_signatures: Option, - ) -> Result, SubmitError> { + ) -> Result { // Bring the received signatures into a vector for simplified work. let eth_signatures = EthBatchSignatures::api_arg_to_vec(eth_signatures); @@ -556,7 +455,6 @@ impl TxSender { } } - let mut subsidy_paid = None; // Only one token in batch if token_fees.len() == 1 { let (batch_token, fee_paid) = token_fees.into_iter().next().unwrap(); @@ -572,22 +470,13 @@ impl TxSender { BigDecimal::from(batch_token_fee.normal_fee.total_fee.to_bigint().unwrap()); // Not enough fee - if required_normal_fee >= user_provided_fee { - let allowed_subsidy = self.subsidy_accumulator.get_allowed_subsidy(&batch_token); - let max_subsidy = batch_token_fee.get_max_subsidy(&allowed_subsidy); - let required_subsidy = &required_normal_fee - &user_provided_fee; - // check if subsidy can be used - if max_subsidy >= required_subsidy { - subsidy_paid = Some((batch_token, batch_token_fee.subsidy_size_usd)); - } else { - vlog::error!( - "User provided batch fee in token is too low, required: {}, provided (scaled): {} (subsidy: {})", - required_normal_fee.to_string(), - user_provided_fee.to_string(), - max_subsidy.to_string(), - ); - return Err(SubmitError::TxAdd(TxAddError::TxBatchFeeTooLow)); - } + if required_normal_fee > user_provided_fee { + vlog::error!( + "User provided batch fee in token is too low, required: {}, provided (scaled): {}", + required_normal_fee.to_string(), + user_provided_fee.to_string(), + ); + return Err(SubmitError::TxAdd(TxAddError::TxBatchFeeTooLow)); } } else { // Calculate required fee for ethereum token @@ -612,7 +501,7 @@ impl TxSender { // Scaling the fee required since the price may change between signing the transaction and sending it to the server. let scaled_provided_fee_in_usd = scale_user_fee_up(provided_total_usd_fee.clone()); - if required_total_usd_fee >= scaled_provided_fee_in_usd { + if required_total_usd_fee > scaled_provided_fee_in_usd { vlog::error!( "User provided batch fee is too low, required: {}, provided: {} (scaled: {}); difference {}", &required_total_usd_fee, @@ -696,25 +585,6 @@ impl TxSender { } verified_txs.extend(verified_batch.into_iter()); - if let Some((subsidy_token, subsidy_paid)) = subsidy_paid { - let paid_subsidy_dec = ratio_to_big_decimal(&subsidy_paid, 6); - let total_paid_subsidy = ratio_to_big_decimal( - &self - .subsidy_accumulator - .get_total_paid_subsidy(&subsidy_token), - 6, - ); - - vlog::info!( - "Paid subsidy for batch: token: {}, , subsidy_tx: {} USD, subsidy_token_total: {} USD", - subsidy_token, - paid_subsidy_dec, - total_paid_subsidy - ); - self.subsidy_accumulator - .add_used_subsidy(&subsidy_token, subsidy_paid); - } - let tx_hashes: Vec = verified_txs.iter().map(|tx| tx.tx.hash()).collect(); // Send verified transactions to the mempool. self.core_api_client @@ -723,7 +593,11 @@ impl TxSender { .map_err(SubmitError::communication_core_server)? .map_err(SubmitError::TxAdd)?; - Ok(tx_hashes) + let batch_hash = TxHash::batch_hash(&tx_hashes); + Ok(SubmitBatchResponse { + transaction_hashes: tx_hashes.into_iter().map(TxHashSerializeWrapper).collect(), + batch_hash, + }) } pub async fn get_txs_fee_in_wei( @@ -739,19 +613,7 @@ impl TxSender { token.clone(), ) .await?; - - if resp_fee.subsidy_fee.total_fee == resp_fee.normal_fee.total_fee { - return Ok(resp_fee.normal_fee); - } - - let token = self.token_info_from_id(token).await?; - - let allowed_subsidy = self.subsidy_accumulator.get_allowed_subsidy(&token.address); - if allowed_subsidy >= resp_fee.subsidy_size_usd { - Ok(resp_fee.subsidy_fee) - } else { - Ok(resp_fee.normal_fee) - } + Ok(resp_fee.normal_fee) } pub async fn get_txs_batch_fee_in_wei( @@ -765,19 +627,7 @@ impl TxSender { token.clone(), ) .await?; - - if resp_fee.normal_fee.total_fee == resp_fee.subsidy_fee.total_fee { - return Ok(resp_fee.normal_fee); - } - - let token = self.token_info_from_id(token).await?; - - let allowed_subsidy = self.subsidy_accumulator.get_allowed_subsidy(&token.address); - if allowed_subsidy >= resp_fee.subsidy_size_usd { - Ok(resp_fee.subsidy_fee) - } else { - Ok(resp_fee.normal_fee) - } + Ok(resp_fee.normal_fee) } /// For forced exits, we must check that target account exists for more diff --git a/core/bin/zksync_api/src/bin/dev-ticker-server.rs b/core/bin/zksync_api/src/bin/dev-ticker-server.rs index 7cef170ef8..5b22496fb7 100644 --- a/core/bin/zksync_api/src/bin/dev-ticker-server.rs +++ b/core/bin/zksync_api/src/bin/dev-ticker-server.rs @@ -9,9 +9,11 @@ use bigdecimal::BigDecimal; use chrono::{SecondsFormat, Utc}; use serde::{Deserialize, Serialize}; use serde_json::json; +use std::{collections::HashMap, fs::read_to_string, path::Path}; use std::{convert::TryFrom, time::Duration}; use structopt::StructOpt; use zksync_crypto::rand::{thread_rng, Rng}; +use zksync_types::Address; #[derive(Debug, Serialize, Deserialize)] struct CoinMarketCapTokenQuery { @@ -20,7 +22,7 @@ struct CoinMarketCapTokenQuery { macro_rules! make_sloppy { ($f: ident) => {{ - |query| async { + |query, data| async { if thread_rng().gen_range(0, 100) < 5 { vlog::debug!("`{}` has been errored", stringify!($f)); return Ok(HttpResponse::InternalServerError().finish()); @@ -42,7 +44,7 @@ macro_rules! make_sloppy { ); tokio::time::delay_for(duration).await; - let resp = $f(query).await; + let resp = $f(query, data).await; resp } }}; @@ -50,6 +52,7 @@ macro_rules! make_sloppy { async fn handle_coinmarketcap_token_price_query( query: web::Query, + _data: web::Data>, ) -> Result { let symbol = query.symbol.clone(); let base_price = match symbol.as_str() { @@ -82,36 +85,62 @@ async fn handle_coinmarketcap_token_price_query( Ok(HttpResponse::Ok().json(resp)) } -async fn handle_coingecko_token_list(_req: HttpRequest) -> Result { - let resp = json!([ - {"id": "ethereum", "symbol": "eth", "name": "Ethereum"}, - {"id": "dai", "symbol":"dai", "name": "Dai"}, - {"id": "glm", "symbol":"glm", "name": "Golem"}, - {"id": "tglm", "symbol":"tglm", "name": "Golem"}, - {"id": "usdc", "symbol":"usdc", "name": "usdc"}, - {"id": "usdt", "symbol":"usdt", "name": "usdt"}, - {"id": "tusd", "symbol":"tusd", "name": "tusd"}, - {"id": "link", "symbol":"link", "name": "link"}, - {"id": "ht", "symbol":"ht", "name": "ht"}, - {"id": "omg", "symbol":"omg", "name": "omg"}, - {"id": "trb", "symbol":"trb", "name": "trb"}, - {"id": "zrx", "symbol":"zrx", "name": "zrx"}, - {"id": "rep", "symbol":"rep", "name": "rep"}, - {"id": "storj", "symbol":"storj", "name": "storj"}, - {"id": "nexo", "symbol":"nexo", "name": "nexo"}, - {"id": "mco", "symbol":"mco", "name": "mco"}, - {"id": "knc", "symbol":"knc", "name": "knc"}, - {"id": "lamb", "symbol":"lamb", "name": "lamb"}, - {"id": "xem", "symbol":"xem", "name": "xem"}, - {"id": "phnx", "symbol":"phnx", "name": "Golem"}, - {"id": "basic-attention-token", "symbol": "bat", "name": "Basic Attention Token"}, - {"id": "wrapped-bitcoin", "symbol": "wbtc", "name": "Wrapped Bitcoin"}, - ]); +#[derive(Debug, Deserialize)] +struct Token { + pub address: Address, + pub decimals: u8, + pub symbol: String, +} - Ok(HttpResponse::Ok().json(resp)) +#[derive(Serialize, Deserialize, Clone, Debug)] +struct TokenData { + id: String, + symbol: String, + name: String, + platforms: HashMap, +} + +fn load_tokens(path: impl AsRef) -> Vec { + if let Ok(text) = read_to_string(path) { + let tokens: Vec = serde_json::from_str(&text).unwrap(); + let tokens_data: Vec = tokens + .into_iter() + .map(|token| { + let symbol = token.symbol.to_lowercase(); + let mut platforms = HashMap::new(); + platforms.insert(String::from("ethereum"), token.address); + let id = match symbol.as_str() { + "eth" => String::from("ethereum"), + "wbtc" => String::from("wrapped-bitcoin"), + "bat" => String::from("basic-attention-token"), + _ => symbol.clone(), + }; + + TokenData { + id, + symbol: symbol.clone(), + name: symbol, + platforms, + } + }) + .collect(); + tokens_data + } else { + Vec::new() + } +} + +async fn handle_coingecko_token_list( + _req: HttpRequest, + data: web::Data>, +) -> Result { + Ok(HttpResponse::Ok().json((*data.into_inner()).clone())) } -async fn handle_coingecko_token_price_query(req: HttpRequest) -> Result { +async fn handle_coingecko_token_price_query( + req: HttpRequest, + _data: web::Data>, +) -> Result { let coin_id = req.match_info().get("coin_id"); let base_price = match coin_id { Some("ethereum") => BigDecimal::from(200), @@ -133,8 +162,17 @@ async fn handle_coingecko_token_price_query(req: HttpRequest) -> Result actix_web::Scope { + let localhost_tokens = load_tokens(&"etc/tokens/localhost.json"); + let rinkeby_tokens = load_tokens(&"etc/tokens/rinkeby.json"); + let ropsten_tokens = load_tokens(&"etc/tokens/ropsten.json"); + let data: Vec = localhost_tokens + .into_iter() + .chain(rinkeby_tokens.into_iter()) + .chain(ropsten_tokens.into_iter()) + .collect(); if sloppy_mode { web::scope("/") + .data(data) .route( "/cryptocurrency/quotes/latest", web::get().to(make_sloppy!(handle_coinmarketcap_token_price_query)), @@ -149,6 +187,7 @@ fn main_scope(sloppy_mode: bool) -> actix_web::Scope { ) } else { web::scope("/") + .data(data) .route( "/cryptocurrency/quotes/latest", web::get().to(handle_coinmarketcap_token_price_query), diff --git a/core/bin/zksync_api/src/core_api_client.rs b/core/bin/zksync_api/src/core_api_client.rs index 079cf927da..84e3fbea4a 100644 --- a/core/bin/zksync_api/src/core_api_client.rs +++ b/core/bin/zksync_api/src/core_api_client.rs @@ -1,5 +1,12 @@ +use zksync_api_types::{ + v02::{ + pagination::{Paginated, PaginationQuery, PendingOpsRequest}, + transaction::Transaction, + }, + PriorityOpLookupQuery, +}; pub use zksync_types::EthBlockId; -use zksync_types::{tx::TxEthSignature, Address, PriorityOp, SignedZkSyncTx, H256}; +use zksync_types::{tx::TxEthSignature, Address, PriorityOp, SignedZkSyncTx}; use crate::tx_error::TxAddError; @@ -49,23 +56,34 @@ impl CoreApiClient { self.get(&endpoint).await } - /// Queries information about unconfirmed priority operations for a certain address from a Core. - pub async fn get_unconfirmed_ops(&self, address: Address) -> anyhow::Result> { - let endpoint = format!("{}/unconfirmed_ops/0x{}", self.addr, hex::encode(address)); + /// Queries information about unconfirmed priority operations for a certain account from a Core. + pub async fn get_unconfirmed_ops( + &self, + query: &PaginationQuery, + ) -> anyhow::Result> { + let endpoint = format!( + "{}/unconfirmed_ops?address=0x{}&account_id={}&serial_id={}&limit={}&direction={}", + self.addr, + hex::encode(query.from.address), + serde_json::to_string(&query.from.account_id).unwrap(), + serde_json::to_string(&query.from.serial_id) + .unwrap() + .replace("\"", ""), + query.limit, + serde_json::to_string(&query.direction) + .unwrap() + .replace("\"", "") + ); self.get(&endpoint).await } /// Queries information about unconfirmed priority operation from a Core. pub async fn get_unconfirmed_op( &self, - eth_tx_hash: H256, - ) -> anyhow::Result> { - let endpoint = format!( - "{}/unconfirmed_op/0x{}", - self.addr, - hex::encode(eth_tx_hash) - ); - self.get(&endpoint).await + query: PriorityOpLookupQuery, + ) -> anyhow::Result> { + let endpoint = format!("{}/unconfirmed_op", self.addr,); + self.post(&endpoint, query).await } async fn get(&self, url: &str) -> anyhow::Result { diff --git a/core/bin/zksync_api/src/eth_checker.rs b/core/bin/zksync_api/src/eth_checker.rs index 3c1e003e98..19522afe90 100644 --- a/core/bin/zksync_api/src/eth_checker.rs +++ b/core/bin/zksync_api/src/eth_checker.rs @@ -141,7 +141,7 @@ mod tests { .await .expect("Check failed"); - assert_eq!(result, true, "Signature is incorrect"); + assert!(result, "Signature is incorrect"); } /// This test checks that the actual signature data taken from diff --git a/core/bin/zksync_api/src/fee_ticker/constants.rs b/core/bin/zksync_api/src/fee_ticker/constants.rs index d0380afbf0..96fe01ee02 100644 --- a/core/bin/zksync_api/src/fee_ticker/constants.rs +++ b/core/bin/zksync_api/src/fee_ticker/constants.rs @@ -39,17 +39,3 @@ pub(crate) const BASE_MINT_NFT_COST: u64 = VerifyCost::MINT_NFT_COST pub(crate) const BASE_SWAP_COST: u64 = CommitCost::SWAP_COST + VerifyCost::SWAP_COST + AMORTIZED_COST_PER_CHUNK * (SwapOp::CHUNKS as u64); - -// The Subsidized cost of operations. -// Represent the cost of performing operations after recursion is introduced to mainnet. -pub(crate) const SUBSIDY_TRANSFER_COST: u64 = BASE_TRANSFER_COST * 5 / 100; -pub(crate) const SUBSIDY_TRANSFER_TO_NEW_COST: u64 = BASE_TRANSFER_TO_NEW_COST * 5 / 100; -pub(crate) const SUBSIDY_WITHDRAW_COST: u64 = BASE_WITHDRAW_COST; -pub(crate) const SUBSIDY_WITHDRAW_NFT_COST: u64 = BASE_WITHDRAW_NFT_COST; -pub(crate) const SUBSIDY_SWAP_COST: u64 = BASE_SWAP_COST; -pub(crate) const SUBSIDY_CHANGE_PUBKEY_OFFCHAIN_COST: u64 = BASE_CHANGE_PUBKEY_OFFCHAIN_COST; -pub(crate) const SUBSIDY_CHANGE_PUBKEY_ONCHAIN_COST: u64 = BASE_CHANGE_PUBKEY_ONCHAIN_COST; -pub(crate) const SUBSIDY_OLD_CHANGE_PUBKEY_OFFCHAIN_COST: u64 = - BASE_OLD_CHANGE_PUBKEY_OFFCHAIN_COST; -pub(crate) const SUBSIDY_CHANGE_PUBKEY_CREATE2_COST: u64 = BASE_CHANGE_PUBKEY_CREATE2_COST; -pub(crate) const SUBSIDY_MINT_NFT_COST: u64 = BASE_MINT_NFT_COST; diff --git a/core/bin/zksync_api/src/fee_ticker/mod.rs b/core/bin/zksync_api/src/fee_ticker/mod.rs index 258e8d7eea..71fff744a7 100644 --- a/core/bin/zksync_api/src/fee_ticker/mod.rs +++ b/core/bin/zksync_api/src/fee_ticker/mod.rs @@ -16,10 +16,9 @@ use futures::{ StreamExt, }; use num::{ - bigint::ToBigInt, rational::Ratio, traits::{Inv, Pow}, - BigUint, CheckedDiv, CheckedSub, Zero, + BigUint, CheckedDiv, Zero, }; use serde::{Deserialize, Serialize}; use thiserror::Error; @@ -38,6 +37,7 @@ use zksync_types::{ use zksync_utils::ratio_to_big_decimal; // Local deps +use crate::fee_ticker::constants::AMORTIZED_COST_PER_CHUNK; use crate::fee_ticker::{ ticker_api::{ coingecko::CoinGeckoAPI, coinmarkercap::CoinMarketCapAPI, FeeTickerAPI, TickerApi, @@ -50,6 +50,7 @@ use crate::fee_ticker::{ }, }; use crate::utils::token_db_cache::TokenDBCache; +use zksync_types::gas_counter::GasCounter; mod constants; mod ticker_api; @@ -65,7 +66,6 @@ static TICKER_CHANNEL_SIZE: usize = 32000; #[derive(Debug, Serialize, Deserialize, Clone)] pub struct GasOperationsCost { standard_cost: HashMap, - subsidize_cost: HashMap, } impl GasOperationsCost { @@ -74,12 +74,8 @@ impl GasOperationsCost { // size, resulting in us paying more gas than for bigger block. let standard_fast_withdrawal_cost = (constants::BASE_WITHDRAW_COST as f64 * fast_processing_coeff) as u32; - let subsidy_fast_withdrawal_cost = - (constants::SUBSIDY_WITHDRAW_COST as f64 * fast_processing_coeff) as u32; let standard_fast_withdrawal_nft_cost = (constants::BASE_WITHDRAW_NFT_COST as f64 * fast_processing_coeff) as u32; - let subsidy_fast_withdrawal_nft_cost = - (constants::SUBSIDY_WITHDRAW_NFT_COST as f64 * fast_processing_coeff) as u32; let standard_cost = vec![ ( @@ -143,74 +139,7 @@ impl GasOperationsCost { .into_iter() .collect::>(); - let subsidize_cost = vec![ - ( - OutputFeeType::Transfer, - constants::SUBSIDY_TRANSFER_COST.into(), - ), - ( - OutputFeeType::TransferToNew, - constants::SUBSIDY_TRANSFER_TO_NEW_COST.into(), - ), - ( - OutputFeeType::Withdraw, - constants::SUBSIDY_WITHDRAW_COST.into(), - ), - ( - OutputFeeType::FastWithdraw, - subsidy_fast_withdrawal_cost.into(), - ), - (OutputFeeType::Swap, constants::SUBSIDY_SWAP_COST.into()), - ( - OutputFeeType::WithdrawNFT, - constants::SUBSIDY_WITHDRAW_NFT_COST.into(), - ), - ( - OutputFeeType::FastWithdrawNFT, - subsidy_fast_withdrawal_nft_cost.into(), - ), - ( - OutputFeeType::ChangePubKey(ChangePubKeyFeeTypeArg::PreContracts4Version { - onchain_pubkey_auth: false, - }), - constants::SUBSIDY_OLD_CHANGE_PUBKEY_OFFCHAIN_COST.into(), - ), - ( - OutputFeeType::ChangePubKey(ChangePubKeyFeeTypeArg::PreContracts4Version { - onchain_pubkey_auth: true, - }), - constants::SUBSIDY_CHANGE_PUBKEY_ONCHAIN_COST.into(), - ), - ( - OutputFeeType::ChangePubKey(ChangePubKeyFeeTypeArg::ContractsV4Version( - ChangePubKeyType::Onchain, - )), - constants::SUBSIDY_CHANGE_PUBKEY_ONCHAIN_COST.into(), - ), - ( - OutputFeeType::ChangePubKey(ChangePubKeyFeeTypeArg::ContractsV4Version( - ChangePubKeyType::ECDSA, - )), - constants::SUBSIDY_CHANGE_PUBKEY_OFFCHAIN_COST.into(), - ), - ( - OutputFeeType::ChangePubKey(ChangePubKeyFeeTypeArg::ContractsV4Version( - ChangePubKeyType::CREATE2, - )), - constants::SUBSIDY_CHANGE_PUBKEY_CREATE2_COST.into(), - ), - ( - OutputFeeType::MintNFT, - constants::SUBSIDY_MINT_NFT_COST.into(), - ), - ] - .into_iter() - .collect::>(); - - Self { - standard_cost, - subsidize_cost, - } + Self { standard_cost } } } @@ -219,8 +148,8 @@ pub struct TickerConfig { zkp_cost_chunk_usd: Ratio, gas_cost_tx: GasOperationsCost, tokens_risk_factors: HashMap>, - not_subsidized_tokens: HashSet
, scale_fee_coefficient: Ratio, + max_blocks_to_aggregate: u32, } #[derive(Debug, PartialEq, Eq)] @@ -232,65 +161,11 @@ pub enum TokenPriceRequestType { #[derive(Debug)] pub struct ResponseFee { pub normal_fee: Fee, - pub subsidy_fee: Fee, - pub subsidy_size_usd: Ratio, -} - -fn get_max_subsidy( - max_subsidy_usd: &Ratio, - subsidy_usd: &Ratio, - normal_fee_token: &BigUint, - subsidy_fee_token: &BigUint, -) -> BigDecimal { - if max_subsidy_usd > subsidy_usd { - let subsidy_uint = normal_fee_token - .checked_sub(subsidy_fee_token) - .unwrap_or_else(|| { - vlog::error!( - "Subisdy fee is bigger then normal fee, subsidy: {:?}, noraml_fee: {:?}", - subsidy_fee_token, - normal_fee_token - ); - 0u32.into() - }); - - BigDecimal::from( - subsidy_uint - .to_bigint() - .expect("biguint should convert to bigint"), - ) - } else { - BigDecimal::from(0) - } -} - -impl ResponseFee { - pub fn get_max_subsidy(&self, allowed_subsidy: &Ratio) -> BigDecimal { - get_max_subsidy( - allowed_subsidy, - &self.subsidy_size_usd, - &self.normal_fee.total_fee, - &self.subsidy_fee.total_fee, - ) - } } #[derive(Debug)] pub struct ResponseBatchFee { pub normal_fee: BatchFee, - pub subsidy_fee: BatchFee, - pub subsidy_size_usd: Ratio, -} - -impl ResponseBatchFee { - pub fn get_max_subsidy(&self, allowed_subsidy: &Ratio) -> BigDecimal { - get_max_subsidy( - allowed_subsidy, - &self.subsidy_size_usd, - &self.normal_fee.total_fee, - &self.subsidy_fee.total_fee, - ) - } } #[derive(Debug)] @@ -384,11 +259,14 @@ pub fn run_ticker_task( zkp_cost_chunk_usd: Ratio::from_integer(BigUint::from(10u32).pow(3u32)).inv(), gas_cost_tx: GasOperationsCost::from_constants(config.ticker.fast_processing_coeff), tokens_risk_factors: HashMap::new(), - not_subsidized_tokens: HashSet::from_iter(config.ticker.not_subsidized_tokens.clone()), scale_fee_coefficient: Ratio::new( BigUint::from(config.ticker.scale_fee_percent), BigUint::from(100u32), ), + max_blocks_to_aggregate: std::cmp::max( + config.chain.state_keeper.max_aggregated_blocks_to_commit, + config.chain.state_keeper.max_aggregated_blocks_to_execute, + ) as u32, }; let cache = (db_pool.clone(), TokenDBCache::new()); @@ -565,41 +443,22 @@ impl FeeTicker FeeTicker FeeTicker anyhow::Result> { @@ -683,7 +530,7 @@ impl FeeTicker (OutputFeeType, (BigUint, BigUint), BigUint) { + ) -> (OutputFeeType, BigUint, BigUint) { let (fee_type, op_chunks) = match tx_type { TxFeeTypes::Withdraw => (OutputFeeType::Withdraw, WithdrawOp::CHUNKS), TxFeeTypes::FastWithdraw => (OutputFeeType::FastWithdraw, WithdrawOp::CHUNKS), @@ -702,23 +549,57 @@ impl FeeTicker (OutputFeeType::MintNFT, MintNFTOp::CHUNKS), }; - // Convert chunks amount to `BigUint`. - let op_chunks = BigUint::from(op_chunks); - let gas_tx_amount = ( + let gas_tx_amount = if matches!( + fee_type, + OutputFeeType::FastWithdraw | OutputFeeType::FastWithdrawNFT + ) { + self.calculate_fast_withdrawal_gas_cost(op_chunks).await + } else { self.config .gas_cost_tx .standard_cost .get(&fee_type) .cloned() - .unwrap(), - self.config - .gas_cost_tx - .subsidize_cost - .get(&fee_type) - .cloned() - .unwrap(), - ); + .unwrap() + }; + + // Convert chunks amount to `BigUint`. + let op_chunks = BigUint::from(op_chunks); + (fee_type, gas_tx_amount, op_chunks) } + async fn calculate_fast_withdrawal_gas_cost(&mut self, chunk_size: usize) -> BigUint { + let future_blocks = self.info.blocks_in_future_aggregated_operations().await; + let remaining_pending_chunks = self.info.remaining_chunks_in_pending_block().await; + let additional_cost = remaining_pending_chunks.map_or(0, |chunks| { + if chunk_size > chunks { + 0 + } else { + chunks * AMORTIZED_COST_PER_CHUNK as usize + } + }); + + // We have to calculate how much from base price for operations has already paid in blocks and add remain cost to fast withdrawal operation + let commit_cost = calculate_cost( + GasCounter::BASE_COMMIT_BLOCKS_TX_COST, + self.config.max_blocks_to_aggregate, + future_blocks.blocks_to_commit, + ); + let execute_cost = calculate_cost( + GasCounter::BASE_EXECUTE_BLOCKS_TX_COST, + self.config.max_blocks_to_aggregate, + future_blocks.blocks_to_execute, + ); + let proof_cost = calculate_cost( + GasCounter::BASE_PROOF_BLOCKS_TX_COST, + self.config.max_blocks_to_aggregate, + future_blocks.blocks_to_prove, + ); + BigUint::from(commit_cost + execute_cost + proof_cost + additional_cost) + } +} + +fn calculate_cost(base_cost: usize, max_blocks: u32, future_blocks: u32) -> usize { + base_cost - (base_cost / max_blocks as usize) * future_blocks.rem_euclid(max_blocks) as usize } diff --git a/core/bin/zksync_api/src/fee_ticker/tests.rs b/core/bin/zksync_api/src/fee_ticker/tests.rs index a296964a41..35e625f745 100644 --- a/core/bin/zksync_api/src/fee_ticker/tests.rs +++ b/core/bin/zksync_api/src/fee_ticker/tests.rs @@ -20,6 +20,7 @@ use crate::fee_ticker::{ }; use super::*; +use crate::fee_ticker::ticker_info::BlocksInFutureAggregatedOperations; const TEST_FAST_WITHDRAW_COEFF: f64 = 10.0; @@ -89,20 +90,14 @@ impl TestToken { Self::new(TokenId(4), 0.0, Some(0.9), 18, Address::default()) } - fn subsidized_tokens() -> Vec { - vec![Self::eth(), Self::cheap(), Self::expensive()] - } - - fn unsubsidized_tokens() -> Vec { - vec![Self::hex(), Self::zero_price()] - } - fn all_tokens() -> Vec { - let mut all_tokens = Vec::new(); - all_tokens.extend_from_slice(&Self::subsidized_tokens()); - all_tokens.extend_from_slice(&Self::unsubsidized_tokens()); - - all_tokens + vec![ + Self::eth(), + Self::cheap(), + Self::expensive(), + Self::hex(), + Self::zero_price(), + ] } } @@ -118,12 +113,8 @@ fn get_test_ticker_config() -> TickerConfig { t.risk_factor.map(|risk| (id, risk)) }) .collect(), - not_subsidized_tokens: vec![ - Address::from_str("34083bbd70d394110487feaa087da875a54624ec").unwrap(), - ] - .into_iter() - .collect(), scale_fee_coefficient: Ratio::new(BigUint::from(150u32), BigUint::from(100u32)), + max_blocks_to_aggregate: 5, } } @@ -163,7 +154,23 @@ impl FeeTickerAPI for MockApiProvider { } } -struct MockTickerInfo; +struct MockTickerInfo { + pub future_blocks: BlocksInFutureAggregatedOperations, + pub remaining_chunks: Option, +} + +impl Default for MockTickerInfo { + fn default() -> Self { + Self { + future_blocks: BlocksInFutureAggregatedOperations { + blocks_to_commit: 0, + blocks_to_prove: 0, + blocks_to_execute: 0, + }, + remaining_chunks: None, + } + } +} #[async_trait] impl FeeTickerInfo for MockTickerInfo { @@ -171,6 +178,16 @@ impl FeeTickerInfo for MockTickerInfo { // Always false for simplicity. false } + + async fn blocks_in_future_aggregated_operations( + &mut self, + ) -> BlocksInFutureAggregatedOperations { + self.future_blocks.clone() + } + + async fn remaining_chunks_in_pending_block(&mut self) -> Option { + self.remaining_chunks + } } fn format_with_dot(num: &Ratio, precision: usize) -> String { @@ -191,12 +208,12 @@ struct ErrorTickerApi; #[async_trait::async_trait] impl TokenPriceAPI for ErrorTickerApi { - async fn get_price(&self, _token_symbol: &str) -> Result { + async fn get_price(&self, _token: &Token) -> Result { Err(PriceError::token_not_found("Wrong token")) } } -fn run_server() -> (String, AbortHandle) { +fn run_server(token_address: Address) -> (String, AbortHandle) { let mut url = None; let mut server = None; for i in 9000..9999 { @@ -210,10 +227,15 @@ fn run_server() -> (String, AbortHandle) { HttpResponse::MethodNotAllowed() })), ) - .service(web::resource("/api/v3/coins/list").to(|| { + .service(web::resource("/api/v3/coins/list").to(move || { + let mut platforms = HashMap::new(); + platforms.insert( + String::from("ethereum"), + serde_json::Value::String(serde_json::to_string(&token_address).unwrap()), + ); HttpResponse::Ok().json(CoinGeckoTokenList(vec![CoinGeckoTokenInfo { - id: "DAI".to_string(), - symbol: "DAI".to_string(), + id: "dai".to_string(), + platforms, }])) })) }) @@ -246,36 +268,43 @@ fn test_ticker_formula() { let config = get_test_ticker_config(); let mut ticker = FeeTicker::new( MockApiProvider, - MockTickerInfo, + MockTickerInfo::default(), mpsc::channel(1).1, config, validator, ); - let mut get_token_fee_in_usd = - |tx_type: TxFeeTypes, token: TokenLike, address: Address| -> Ratio { - let fee_in_token = - block_on(ticker.get_fee_from_ticker_in_wei(tx_type, token.clone(), address)) - .expect("failed to get fee in token"); - let token_precision = block_on(MockApiProvider.get_token(token.clone())) - .unwrap() - .decimals; - let batched_fee_in_token = block_on( - ticker.get_batch_from_ticker_in_wei(token.clone(), vec![(tx_type, address)]), - ) - .expect("failed to get batched fee for token"); - assert_eq!( - fee_in_token.normal_fee.total_fee, - batched_fee_in_token.normal_fee.total_fee - ); + let mut get_token_fee_in_usd = |tx_type: TxFeeTypes, + token: TokenLike, + address: Address, + future_blocks: Option, + remaining_chunks: Option| + -> Ratio { + if let Some(blocks) = future_blocks { + ticker.info.future_blocks = blocks; + } + ticker.info.remaining_chunks = remaining_chunks; + let fee_in_token = + block_on(ticker.get_fee_from_ticker_in_wei(tx_type, token.clone(), address)) + .expect("failed to get fee in token"); + let token_precision = block_on(MockApiProvider.get_token(token.clone())) + .unwrap() + .decimals; + let batched_fee_in_token = + block_on(ticker.get_batch_from_ticker_in_wei(token.clone(), vec![(tx_type, address)])) + .expect("failed to get batched fee for token"); + assert_eq!( + fee_in_token.normal_fee.total_fee, + batched_fee_in_token.normal_fee.total_fee + ); - // Fee in usd - (block_on(MockApiProvider.get_last_quote(token)) - .expect("failed to get fee in usd") - .usd_price - / BigUint::from(10u32).pow(u32::from(token_precision))) - * fee_in_token.normal_fee.total_fee - }; + // Fee in usd + (block_on(MockApiProvider.get_last_quote(token)) + .expect("failed to get fee in usd") + .usd_price + / BigUint::from(10u32).pow(u32::from(token_precision))) + * fee_in_token.normal_fee.total_fee + }; let get_relative_diff = |a: &Ratio, b: &Ratio| -> BigDecimal { let max = std::cmp::max(a.clone(), b.clone()); @@ -283,22 +312,32 @@ fn test_ticker_formula() { ratio_to_big_decimal(&((&max - &min) / min), 6) }; - let expected_price_of_eth_token_transfer_usd = - get_token_fee_in_usd(TxFeeTypes::Transfer, TokenId(0).into(), Address::default()); - let expected_price_of_eth_token_withdraw_usd = - get_token_fee_in_usd(TxFeeTypes::Withdraw, TokenId(0).into(), Address::default()); - let expected_price_of_eth_token_fast_withdraw_usd = get_token_fee_in_usd( - TxFeeTypes::FastWithdraw, + let expected_price_of_eth_token_transfer_usd = get_token_fee_in_usd( + TxFeeTypes::Transfer, TokenId(0).into(), Address::default(), + None, + None, + ); + let expected_price_of_eth_token_withdraw_usd = get_token_fee_in_usd( + TxFeeTypes::Withdraw, + TokenId(0).into(), + Address::default(), + None, + None, ); // Cost of the transfer and withdraw in USD should be the same for all tokens up to +/- 3 digits // (mantissa len == 11) let threshold = BigDecimal::from_str("0.01").unwrap(); - for token in TestToken::subsidized_tokens() { - let transfer_fee = - get_token_fee_in_usd(TxFeeTypes::Transfer, token.id.into(), Address::default()); + for token in &[TestToken::eth(), TestToken::expensive()] { + let transfer_fee = get_token_fee_in_usd( + TxFeeTypes::Transfer, + token.id.into(), + Address::default(), + None, + None, + ); let expected_fee = expected_price_of_eth_token_transfer_usd.clone() * token.risk_factor(); let transfer_diff = get_relative_diff(&transfer_fee, &expected_fee); assert!( @@ -310,8 +349,13 @@ fn test_ticker_formula() { transfer_diff, &threshold ); - let withdraw_fee = - get_token_fee_in_usd(TxFeeTypes::Withdraw, token.id.into(), Address::default()); + let withdraw_fee = get_token_fee_in_usd( + TxFeeTypes::Withdraw, + token.id.into(), + Address::default(), + None, + None, + ); let expected_fee = expected_price_of_eth_token_withdraw_usd.clone() * token.risk_factor(); let withdraw_diff = get_relative_diff(&withdraw_fee, &expected_fee); assert!( @@ -323,15 +367,43 @@ fn test_ticker_formula() { withdraw_diff, &threshold ); - let fast_withdraw_fee = get_token_fee_in_usd( + let mut last_fast_withdraw_fee = get_token_fee_in_usd( TxFeeTypes::FastWithdraw, token.id.into(), Address::default(), + Some(BlocksInFutureAggregatedOperations { + blocks_to_commit: 0, + blocks_to_prove: 0, + blocks_to_execute: 0, + }), + None, ); - let expected_fee = - expected_price_of_eth_token_fast_withdraw_usd.clone() * token.risk_factor(); - let fast_withdraw_diff = get_relative_diff(&fast_withdraw_fee, &expected_fee); - assert!( + + for i in 1..5 { + let future_blocks = BlocksInFutureAggregatedOperations { + blocks_to_commit: i, + blocks_to_prove: i, + blocks_to_execute: i, + }; + let fast_withdraw_fee = get_token_fee_in_usd( + TxFeeTypes::FastWithdraw, + token.id.into(), + Address::default(), + Some(future_blocks.clone()), + None, + ); + + let expected_price_of_eth_token_fast_withdraw_usd = get_token_fee_in_usd( + TxFeeTypes::FastWithdraw, + TokenId(0).into(), + Address::default(), + Some(future_blocks.clone()), + None, + ); + let expected_fee = + expected_price_of_eth_token_fast_withdraw_usd.clone() * token.risk_factor(); + let fast_withdraw_diff = get_relative_diff(&fast_withdraw_fee, &expected_fee); + assert!( fast_withdraw_diff <= threshold.clone(), "token fast withdraw fee is above eth fee threshold: <{:?}: {}, ETH: {}, diff: {}, threshold: {}>", token.id, @@ -339,9 +411,104 @@ fn test_ticker_formula() { format_with_dot(&expected_fee, 6), fast_withdraw_diff, &threshold ); - assert!( - fast_withdraw_fee > withdraw_fee, - "Fast withdraw fee must be greater than usual withdraw fee" + + assert!( + fast_withdraw_fee > withdraw_fee, + "Fast withdraw fee must be greater than usual withdraw fee" + ); + + assert!( + fast_withdraw_fee < last_fast_withdraw_fee, + "Fast withdraw should depend on number of future blocks" + ); + last_fast_withdraw_fee = fast_withdraw_fee; + } + + let fast_withdraw_fee_for_6_block = get_token_fee_in_usd( + TxFeeTypes::FastWithdraw, + token.id.into(), + Address::default(), + Some(BlocksInFutureAggregatedOperations { + blocks_to_commit: 6, + blocks_to_prove: 6, + blocks_to_execute: 6, + }), + None, + ); + + let fast_withdraw_fee_for_1_block = get_token_fee_in_usd( + TxFeeTypes::FastWithdraw, + token.id.into(), + Address::default(), + Some(BlocksInFutureAggregatedOperations { + blocks_to_commit: 1, + blocks_to_prove: 1, + blocks_to_execute: 1, + }), + None, + ); + + assert_eq!( + fast_withdraw_fee_for_1_block, fast_withdraw_fee_for_6_block, + "Fee should be the same because 5 blocks should aggregate independent" + ); + + let mut last_fast_withdraw_fee = get_token_fee_in_usd( + TxFeeTypes::FastWithdraw, + token.id.into(), + Address::default(), + Some(BlocksInFutureAggregatedOperations { + blocks_to_commit: 1, + blocks_to_prove: 2, + blocks_to_execute: 3, + }), + Some(50), + ); + for i in 2..=4 { + let fast_withdraw_fee = get_token_fee_in_usd( + TxFeeTypes::FastWithdraw, + token.id.into(), + Address::default(), + Some(BlocksInFutureAggregatedOperations { + blocks_to_commit: 1, + blocks_to_prove: 2, + blocks_to_execute: 3, + }), + Some((50 * i) as usize), + ); + assert!( + fast_withdraw_fee > last_fast_withdraw_fee, + "Fast withdraw should depend on remaining chunks" + ); + last_fast_withdraw_fee = fast_withdraw_fee; + } + let not_enough_chunks_fee = get_token_fee_in_usd( + TxFeeTypes::FastWithdraw, + token.id.into(), + Address::default(), + Some(BlocksInFutureAggregatedOperations { + blocks_to_commit: 1, + blocks_to_prove: 2, + blocks_to_execute: 3, + }), + Some(1), + ); + + let no_pending_block_fee = get_token_fee_in_usd( + TxFeeTypes::FastWithdraw, + token.id.into(), + Address::default(), + Some(BlocksInFutureAggregatedOperations { + blocks_to_commit: 1, + blocks_to_prove: 2, + blocks_to_execute: 3, + }), + None, + ); + + assert_eq!( + not_enough_chunks_fee, no_pending_block_fee, + "Fee should be the same because we have to add one full block for this withdraw in both options" ); } } @@ -360,7 +527,7 @@ fn test_zero_price_token_fee() { let config = get_test_ticker_config(); let mut ticker = FeeTicker::new( MockApiProvider, - MockTickerInfo, + MockTickerInfo::default(), mpsc::channel(1).1, config, validator, @@ -387,7 +554,14 @@ fn test_zero_price_token_fee() { #[ignore] // It's ignore because we can't initialize coingecko in current way with block async fn test_error_coingecko_api() { - let (address, handler) = run_server(); + let token = Token { + id: TokenId(1), + address: Address::random(), + symbol: String::from("DAI"), + decimals: 18, + is_nft: false, + }; + let (address, handler) = run_server(token.address); let client = reqwest::ClientBuilder::new() .timeout(CONNECTION_TIMEOUT) .connect_timeout(CONNECTION_TIMEOUT) @@ -402,26 +576,31 @@ async fn test_error_coingecko_api() { FakeTokenWatcher, ); let connection_pool = ConnectionPool::new(Some(1)); - connection_pool - .access_storage() - .await - .unwrap() - .tokens_schema() - .update_historical_ticker_price( - TokenId(1), - TokenPrice { - usd_price: big_decimal_to_ratio(&BigDecimal::from(10)).unwrap(), - last_updated: chrono::offset::Utc::now(), - }, - ) - .await - .unwrap(); + { + let mut storage = connection_pool.access_storage().await.unwrap(); + storage + .tokens_schema() + .store_token(token.clone()) + .await + .unwrap(); + storage + .tokens_schema() + .update_historical_ticker_price( + token.id, + TokenPrice { + usd_price: big_decimal_to_ratio(&BigDecimal::from(10)).unwrap(), + last_updated: chrono::offset::Utc::now(), + }, + ) + .await + .unwrap(); + } let ticker_api = TickerApi::new(connection_pool, coingecko); let config = get_test_ticker_config(); let mut ticker = FeeTicker::new( ticker_api, - MockTickerInfo, + MockTickerInfo::default(), mpsc::channel(1).1, config, validator, @@ -430,13 +609,13 @@ async fn test_error_coingecko_api() { ticker .get_fee_from_ticker_in_wei( TxFeeTypes::FastWithdraw, - TokenId(1).into(), + token.id.into(), Address::default(), ) .await .unwrap(); ticker - .get_token_price(TokenId(1).into(), TokenPriceRequestType::USDForOneWei) + .get_token_price(token.id.into(), TokenPriceRequestType::USDForOneWei) .await .unwrap(); } @@ -473,7 +652,7 @@ async fn test_error_api() { let config = get_test_ticker_config(); let mut ticker = FeeTicker::new( ticker_api, - MockTickerInfo, + MockTickerInfo::default(), mpsc::channel(1).1, config, validator, diff --git a/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs b/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs index e6b625daab..a708cc6ba6 100644 --- a/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs +++ b/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs @@ -7,21 +7,22 @@ use num::BigUint; use reqwest::Url; use serde::{Deserialize, Serialize}; use std::collections::HashMap; +use std::str::FromStr; use std::time::Instant; -use zksync_types::TokenPrice; -use zksync_utils::UnsignedRatioSerializeAsDecimal; +use zksync_types::{Address, Token, TokenPrice}; +use zksync_utils::{remove_prefix, UnsignedRatioSerializeAsDecimal}; #[derive(Debug, Clone)] pub struct CoinGeckoAPI { base_url: Url, client: reqwest::Client, - token_ids: HashMap, + token_ids: HashMap, } impl CoinGeckoAPI { pub fn new(client: reqwest::Client, base_url: Url) -> anyhow::Result { let token_list_url = base_url - .join("api/v3/coins/list") + .join("api/v3/coins/list?include_platform=true") .expect("failed to join URL path"); let token_list = reqwest::blocking::get(token_list_url) @@ -30,8 +31,19 @@ impl CoinGeckoAPI { let mut token_ids = HashMap::new(); for token in token_list.0 { - token_ids.insert(token.symbol, token.id); + if let Some(address_value) = token.platforms.get("ethereum") { + if let Some(address_str) = address_value.as_str() { + let address_str = remove_prefix(address_str); + if let Ok(address) = Address::from_str(address_str) { + token_ids.insert(address, token.id); + } + } + } } + + // Add ETH manually because coingecko API doesn't return address for it. + token_ids.insert(Address::default(), String::from("ethereum")); + Ok(Self { base_url, client, @@ -42,34 +54,29 @@ impl CoinGeckoAPI { #[async_trait] impl TokenPriceAPI for CoinGeckoAPI { - async fn get_price(&self, token_symbol: &str) -> Result { + async fn get_price(&self, token: &Token) -> Result { let start = Instant::now(); - let token_lowercase_symbol = token_symbol.to_lowercase(); - let token_id = self - .token_ids - .get(&token_lowercase_symbol) - .or_else(|| self.token_ids.get(token_symbol)) - .unwrap_or(&token_lowercase_symbol); - // TODO ZKS-595. Uncomment this code - // .ok_or_else(|| { - // PriceError::token_not_found(format!( - // "Token '{}' is not listed on CoinGecko", - // token_symbol - // )) - // })?; + let token_id = self.token_ids.get(&token.address).ok_or_else(|| { + PriceError::token_not_found(format!( + "Token '{}, {:?}' is not listed on CoinGecko", + token.symbol, token.address + )) + })?; let market_chart_url = self .base_url .join(format!("api/v3/coins/{}/market_chart", token_id).as_str()) .expect("failed to join URL path"); - // If we use 2 day interval we will get hourly prices and not minute by minute which makes - // response faster and smaller let market_chart = self .client .get(market_chart_url) .timeout(REQUEST_TIMEOUT) - .query(&[("vs_currency", "usd"), ("days", "2")]) + .query(&[ + ("vs_currency", "usd"), + ("days", "1"), + ("interval", "hourly"), + ]) .send() .await .map_err(|err| PriceError::api_error(format!("CoinGecko API request failed: {}", err)))? @@ -83,9 +90,12 @@ impl TokenPriceAPI for CoinGeckoAPI { .ok_or_else(|| PriceError::api_error("CoinGecko returned empty price data"))? .0; + // Take prices over the last 6 hours let usd_prices = market_chart .prices .into_iter() + .rev() + .take(6) .map(|token_price| token_price.1); // We use max price for ETH token because we spend ETH with each commit and collect token @@ -93,10 +103,16 @@ impl TokenPriceAPI for CoinGeckoAPI { // Theoretically we should use min and max price for ETH in our ticker formula when we // calculate fee for tx with ETH token. Practically if we use only max price foe ETH it is fine because // we don't need to sell this token lnd price only affects ZKP cost of such tx which is negligible. - let usd_price = if token_symbol == "ETH" { + // For other tokens we use average price + let usd_price = if token.id.0 == 0 { usd_prices.max() } else { - usd_prices.min() + let len = usd_prices.len(); + if len == 0 { + None + } else { + Some(usd_prices.sum::>() / BigUint::from(len)) + } }; let usd_price = usd_price .ok_or_else(|| PriceError::api_error("CoinGecko returned empty price data"))?; @@ -117,7 +133,7 @@ impl TokenPriceAPI for CoinGeckoAPI { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct CoinGeckoTokenInfo { pub(crate) id: String, - pub(crate) symbol: String, + pub(crate) platforms: HashMap, } #[derive(Debug, Clone, Serialize, Deserialize)] @@ -137,6 +153,7 @@ pub struct CoinGeckoMarketChart { #[cfg(test)] mod tests { use super::*; + use zksync_types::TokenId; use zksync_utils::parse_env; #[tokio::test] @@ -144,7 +161,8 @@ mod tests { let ticker_url = parse_env("FEE_TICKER_COINGECKO_BASE_URL"); let client = reqwest::Client::new(); let api = CoinGeckoAPI::new(client, ticker_url).unwrap(); - api.get_price("ETH") + let token = Token::new(TokenId(0), Default::default(), "ETH", 18); + api.get_price(&token) .await .expect("Failed to get data from ticker"); } diff --git a/core/bin/zksync_api/src/fee_ticker/ticker_api/coinmarkercap.rs b/core/bin/zksync_api/src/fee_ticker/ticker_api/coinmarkercap.rs index a263a8bbbe..2eede509ef 100644 --- a/core/bin/zksync_api/src/fee_ticker/ticker_api/coinmarkercap.rs +++ b/core/bin/zksync_api/src/fee_ticker/ticker_api/coinmarkercap.rs @@ -9,7 +9,7 @@ use serde::{Deserialize, Serialize}; // Workspace deps use super::{TokenPriceAPI, REQUEST_TIMEOUT}; use crate::fee_ticker::PriceError; -use zksync_types::{TokenLike, TokenPrice}; +use zksync_types::{Token, TokenLike, TokenPrice}; use zksync_utils::UnsignedRatioSerializeAsDecimal; #[derive(Debug)] @@ -26,7 +26,8 @@ impl CoinMarketCapAPI { #[async_trait] impl TokenPriceAPI for CoinMarketCapAPI { - async fn get_price(&self, token_symbol: &str) -> Result { + async fn get_price(&self, token: &Token) -> Result { + let token_symbol = token.symbol.as_str(); let request_url = self .base_url .join(&format!( @@ -84,6 +85,7 @@ pub(super) struct CoinmarketCapResponse { mod test { use super::*; use std::str::FromStr; + use zksync_types::TokenId; use zksync_utils::parse_env; #[test] @@ -97,8 +99,9 @@ mod test { let ticker_url = parse_env("FEE_TICKER_COINMARKETCAP_BASE_URL"); let client = reqwest::Client::new(); let api = CoinMarketCapAPI::new(client, ticker_url); + let token = Token::new(TokenId(0), Default::default(), "ETH", 18); runtime - .block_on(api.get_price("ETH")) + .block_on(api.get_price(&token)) .expect("Failed to get data from ticker"); } diff --git a/core/bin/zksync_api/src/fee_ticker/ticker_api/mod.rs b/core/bin/zksync_api/src/fee_ticker/ticker_api/mod.rs index 97666c71b5..be6a0d3104 100644 --- a/core/bin/zksync_api/src/fee_ticker/ticker_api/mod.rs +++ b/core/bin/zksync_api/src/fee_ticker/ticker_api/mod.rs @@ -25,7 +25,7 @@ pub const CONNECTION_TIMEOUT: Duration = Duration::from_millis(700); #[async_trait] pub trait TokenPriceAPI { - async fn get_price(&self, token_symbol: &str) -> Result; + async fn get_price(&self, token: &Token) -> Result; } /// Api responsible for querying for TokenPrices @@ -232,7 +232,7 @@ impl FeeTickerAPI for TickerApi { return Ok(cached_value); } - let api_price = self.token_price_api.get_price(&token.symbol).await; + let api_price = self.token_price_api.get_price(&token).await; match api_price { Ok(api_price) => { diff --git a/core/bin/zksync_api/src/fee_ticker/ticker_info.rs b/core/bin/zksync_api/src/fee_ticker/ticker_info.rs index 05f1977b9a..9eb93ff40b 100644 --- a/core/bin/zksync_api/src/fee_ticker/ticker_info.rs +++ b/core/bin/zksync_api/src/fee_ticker/ticker_info.rs @@ -5,6 +5,7 @@ use async_trait::async_trait; // Workspace deps use zksync_storage::ConnectionPool; +use zksync_types::aggregated_operations::AggregatedActionType; use zksync_types::Address; // Local deps @@ -14,6 +15,12 @@ pub trait FeeTickerInfo { /// Check whether account exists in the zkSync network or not. /// Returns `true` if account does not yet exist in the zkSync network. async fn is_account_new(&mut self, address: Address) -> bool; + + async fn blocks_in_future_aggregated_operations( + &mut self, + ) -> BlocksInFutureAggregatedOperations; + + async fn remaining_chunks_in_pending_block(&mut self) -> Option; } #[derive(Clone)] @@ -27,6 +34,13 @@ impl TickerInfo { } } +#[derive(Debug, Clone)] +pub struct BlocksInFutureAggregatedOperations { + pub blocks_to_commit: u32, + pub blocks_to_prove: u32, + pub blocks_to_execute: u32, +} + #[async_trait] impl FeeTickerInfo for TickerInfo { async fn is_account_new(&mut self, address: Address) -> bool { @@ -46,4 +60,62 @@ impl FeeTickerInfo for TickerInfo { // If account is `Some(_)` then it's not new. account_state.committed.is_none() } + + async fn blocks_in_future_aggregated_operations( + &mut self, + ) -> BlocksInFutureAggregatedOperations { + let mut storage = self + .db + .access_storage() + .await + .expect("Unable to establish connection to db"); + + let last_block = storage + .chain() + .block_schema() + .get_last_saved_block() + .await + .expect("Unable to query account state from the database"); + let last_committed_block = storage + .chain() + .operations_schema() + .get_last_block_by_aggregated_action(AggregatedActionType::CommitBlocks, None) + .await + .expect("Unable to query block from the database"); + let last_proven_block = storage + .chain() + .operations_schema() + .get_last_block_by_aggregated_action( + AggregatedActionType::PublishProofBlocksOnchain, + None, + ) + .await + .expect("Unable to query block state from the database"); + let last_executed_block = storage + .chain() + .operations_schema() + .get_last_block_by_aggregated_action(AggregatedActionType::ExecuteBlocks, None) + .await + .expect("Unable to query block from the database"); + BlocksInFutureAggregatedOperations { + blocks_to_commit: *last_block - *last_committed_block, + blocks_to_prove: *last_block - *last_proven_block, + blocks_to_execute: *last_block - *last_executed_block, + } + } + + async fn remaining_chunks_in_pending_block(&mut self) -> Option { + let mut storage = self + .db + .access_storage() + .await + .expect("Unable to establish connection to db"); + let block = storage + .chain() + .block_schema() + .load_pending_block() + .await + .expect("Error loading pending block"); + block.map(|block| block.chunks_left) + } } diff --git a/core/bin/zksync_api/src/fee_ticker/validator/mod.rs b/core/bin/zksync_api/src/fee_ticker/validator/mod.rs index dedb958548..5b8fe52186 100644 --- a/core/bin/zksync_api/src/fee_ticker/validator/mod.rs +++ b/core/bin/zksync_api/src/fee_ticker/validator/mod.rs @@ -337,9 +337,9 @@ mod tests { .token_allowed(TokenLike::Address(eth_address)) .await .unwrap(); - assert_eq!(dai_allowed, true); - assert_eq!(phnx_allowed, false); - assert_eq!(eth_allowed, true); + assert!(dai_allowed); + assert!(!phnx_allowed); + assert!(eth_allowed); assert!(validator.tokens.get(&dai_token_address).unwrap().allowed); assert!(!validator.tokens.get(&phnx_token_address).unwrap().allowed); } diff --git a/core/bin/zksync_api/src/utils/block_details_cache.rs b/core/bin/zksync_api/src/utils/block_details_cache.rs index 64155d7b50..ff0bb534df 100644 --- a/core/bin/zksync_api/src/utils/block_details_cache.rs +++ b/core/bin/zksync_api/src/utils/block_details_cache.rs @@ -30,7 +30,7 @@ impl BlockDetailsCache { let blocks = storage .chain() .block_schema() - .load_block_range(block_number, 1) + .load_block_range_desc(block_number, 1) .await?; if let Some(block) = blocks.into_iter().next() { diff --git a/core/bin/zksync_core/Cargo.toml b/core/bin/zksync_core/Cargo.toml index c87eefdacc..5d729f6883 100644 --- a/core/bin/zksync_core/Cargo.toml +++ b/core/bin/zksync_core/Cargo.toml @@ -14,6 +14,7 @@ publish = false # We don't want to publish our binaries. zksync_state = { path = "../../lib/state", version = "1.0" } zksync_types = { path = "../../lib/types", version = "1.0" } zksync_notifier = { path = "../../lib/notifier", version = "1.0" } +zksync_api_types = { path = "../../lib/api_types", version = "1.0" } zksync_storage = { path = "../../lib/storage", version = "1.0" } zksync_crypto = { path = "../../lib/crypto", version = "1.0" } diff --git a/core/bin/zksync_core/src/committer/aggregated_committer.rs b/core/bin/zksync_core/src/committer/aggregated_committer.rs index 43b0e799fd..20d30b37c1 100644 --- a/core/bin/zksync_core/src/committer/aggregated_committer.rs +++ b/core/bin/zksync_core/src/committer/aggregated_committer.rs @@ -218,7 +218,7 @@ async fn is_fast_processing_requested( break; } } - return Ok(fast_processing); + Ok(fast_processing) } async fn create_aggregated_commits_storage( diff --git a/core/bin/zksync_core/src/eth_watch/mod.rs b/core/bin/zksync_core/src/eth_watch/mod.rs index 28be6a3c54..c1df041c87 100644 --- a/core/bin/zksync_core/src/eth_watch/mod.rs +++ b/core/bin/zksync_core/src/eth_watch/mod.rs @@ -6,6 +6,7 @@ //! Number of confirmations is configured using the `CONFIRMATIONS_FOR_ETH_EVENT` environment variable. // Built-in deps +use std::collections::HashMap; use std::time::{Duration, Instant}; // External uses @@ -14,21 +15,30 @@ use futures::{ SinkExt, StreamExt, }; +pub use client::{get_web3_block_number, EthHttpClient}; +use itertools::Itertools; use tokio::{task::JoinHandle, time}; use web3::types::{Address, BlockNumber}; // Workspace deps +use zksync_api_types::{ + v02::{ + pagination::{Paginated, PaginationDirection, PaginationQuery, PendingOpsRequest}, + transaction::{L1Transaction, Transaction, TransactionData, TxInBlockStatus}, + }, + Either, +}; +use zksync_config::ZkSyncConfig; use zksync_crypto::params::PRIORITY_EXPIRATION; -use zksync_types::{NewTokenEvent, PriorityOp, RegisterNFTFactoryEvent, ZkSyncPriorityOp}; +use zksync_eth_client::ethereum_gateway::EthereumGateway; +use zksync_types::{ + tx::TxHash, NewTokenEvent, Nonce, PriorityOp, PubKeyHash, RegisterNFTFactoryEvent, + ZkSyncPriorityOp, H256, +}; // Local deps use self::{client::EthClient, eth_state::ETHState, received_ops::sift_outdated_ops}; -pub use client::{get_web3_block_number, EthHttpClient}; -use zksync_config::ZkSyncConfig; - -use zksync_eth_client::ethereum_gateway::EthereumGateway; - mod client; mod eth_state; mod received_ops; @@ -58,6 +68,10 @@ pub enum WatcherMode { #[derive(Debug)] pub enum EthWatchRequest { PollETHNode, + GetPriorityOpBySerialId { + serial_id: u64, + resp: oneshot::Sender>, + }, GetPriorityQueueOps { op_start_id: u64, max_chunks: usize, @@ -68,11 +82,19 @@ pub enum EthWatchRequest { resp: oneshot::Sender>, }, GetUnconfirmedOps { - address: Address, - resp: oneshot::Sender>, + query: PaginationQuery, + resp: oneshot::Sender>, + }, + GetUnconfirmedOpByEthHash { + eth_hash: H256, + resp: oneshot::Sender>, + }, + GetUnconfirmedOpByTxHash { + tx_hash: TxHash, + resp: oneshot::Sender>, }, - GetUnconfirmedOpByHash { - eth_hash: Vec, + GetUnconfirmedOpByAnyHash { + hash: TxHash, resp: oneshot::Sender>, }, GetNewTokens { @@ -83,6 +105,12 @@ pub enum EthWatchRequest { last_eth_block: Option, resp: oneshot::Sender>, }, + IsPubkeyChangeAuthorized { + address: Address, + nonce: Nonce, + pubkey_hash: PubKeyHash, + resp: oneshot::Sender, + }, } pub struct EthWatch { @@ -129,6 +157,7 @@ impl EthWatch { async fn process_new_blocks(&mut self, last_ethereum_block: u64) -> anyhow::Result<()> { debug_assert!(self.eth_state.last_ethereum_block() < last_ethereum_block); + debug_assert!(self.eth_state.last_ethereum_block() < last_ethereum_block); // We have to process every block between the current and previous known values. // This is crucial since `eth_watch` may enter the backoff mode in which it will skip many blocks. @@ -144,9 +173,24 @@ impl EthWatch { // Extend the existing priority operations with the new ones. let mut priority_queue = sift_outdated_ops(self.eth_state.priority_queue()); + for (serial_id, op) in updated_state.priority_queue() { priority_queue.insert(*serial_id, op.clone()); } + + // Check for gaps in priority queue. If some event is missing we skip this `ETHState` update. + let mut priority_op_ids: Vec<_> = priority_queue.keys().cloned().collect(); + priority_op_ids.sort_unstable(); + for i in 0..priority_op_ids.len().saturating_sub(1) { + let gap = priority_op_ids[i + 1] - priority_op_ids[i]; + anyhow::ensure!( + gap == 1, + "Gap in priority op queue: gap={}, priority_op_before_gap={}", + gap, + priority_op_ids[i] + ); + } + // Extend the existing token events with the new ones. let mut new_tokens = self.eth_state.new_tokens().to_vec(); for token in updated_state.new_tokens() { @@ -180,10 +224,10 @@ impl EthWatch { let new_state = self .update_eth_state(last_ethereum_block, PRIORITY_EXPIRATION) .await?; + self.set_new_state(new_state); vlog::debug!("ETH state: {:#?}", self.eth_state); - Ok(()) } @@ -198,7 +242,7 @@ impl EthWatch { new_block_with_accepted_events.saturating_sub(unprocessed_blocks_amount); let unconfirmed_queue = self.get_unconfirmed_ops(current_ethereum_block).await?; - let priority_queue = self + let priority_queue: HashMap = self .client .get_priority_op_events( BlockNumber::Number(previous_block_with_accepted_events.into()), @@ -223,15 +267,32 @@ impl EthWatch { ) .await?; - let new_state = ETHState::new( + let mut new_priority_op_ids: Vec<_> = priority_queue.keys().cloned().collect(); + new_priority_op_ids.sort_unstable(); + vlog::debug!( + "Updating eth state: block_range=[{},{}], new_priority_ops={:?}", + previous_block_with_accepted_events, + new_block_with_accepted_events, + new_priority_op_ids + ); + + let mut new_priority_op_ids: Vec<_> = priority_queue.keys().cloned().collect(); + new_priority_op_ids.sort_unstable(); + vlog::debug!( + "Updating eth state: block_range=[{},{}], new_priority_ops={:?}", + previous_block_with_accepted_events, + new_block_with_accepted_events, + new_priority_op_ids + ); + + let state = ETHState::new( current_ethereum_block, unconfirmed_queue, priority_queue, new_tokens, new_register_nft_factory_events, ); - - Ok(new_state) + Ok(state) } fn get_register_factory_event( @@ -283,11 +344,41 @@ impl EthWatch { result } - fn find_ongoing_op_by_hash(&self, eth_hash: &[u8]) -> Option { + async fn is_new_pubkey_hash_authorized( + &self, + address: Address, + nonce: Nonce, + pub_key_hash: &PubKeyHash, + ) -> anyhow::Result { + let auth_fact_reset_time = self.client.get_auth_fact_reset_time(address, nonce).await?; + if auth_fact_reset_time != 0 { + return Ok(false); + } + let auth_fact = self.client.get_auth_fact(address, nonce).await?; + Ok(auth_fact.as_slice() == tiny_keccak::keccak256(&pub_key_hash.data[..])) + } + + fn find_ongoing_op_by_eth_hash(&self, eth_hash: H256) -> Option { + self.eth_state + .unconfirmed_queue() + .iter() + .find(|op| op.eth_hash == eth_hash) + .cloned() + } + + fn find_ongoing_op_by_tx_hash(&self, tx_hash: TxHash) -> Option { self.eth_state .unconfirmed_queue() .iter() - .find(|op| op.eth_hash.as_bytes() == eth_hash) + .find(|op| op.tx_hash() == tx_hash) + .cloned() + } + + fn find_ongoing_op_by_any_hash(&self, hash: TxHash) -> Option { + self.eth_state + .unconfirmed_queue() + .iter() + .find(|op| op.tx_hash() == hash || op.eth_hash.as_ref() == hash.as_ref()) .cloned() } @@ -306,19 +397,83 @@ impl EthWatch { .collect() } - fn get_ongoing_ops_for(&self, address: Address) -> Vec { - self.eth_state + fn get_ongoing_ops_for( + &self, + query: PaginationQuery, + ) -> Paginated { + let all_ops = self + .eth_state .unconfirmed_queue() .iter() .filter(|op| match &op.data { ZkSyncPriorityOp::Deposit(deposit) => { - // Address may be set to sender. - deposit.from == address + // Address may be set to recipient. + deposit.to == query.from.address + } + ZkSyncPriorityOp::FullExit(full_exit) => query + .from + .account_id + .map(|account_id| account_id == full_exit.account_id) + .unwrap_or(false), + }); + let count = all_ops.clone().count(); + let from_serial_id = match query.from.serial_id.inner { + Either::Left(id) => id, + Either::Right(_) => { + if let Some(op) = all_ops.clone().max_by_key(|op| op.serial_id) { + op.serial_id + } else { + return Paginated::new( + Vec::new(), + Default::default(), + query.limit, + query.direction, + 0, + ); + } + } + }; + let ops: Vec = match query.direction { + PaginationDirection::Newer => all_ops + .sorted_by_key(|op| op.serial_id) + .filter(|op| op.serial_id >= from_serial_id) + .take(query.limit as usize) + .cloned() + .collect(), + PaginationDirection::Older => all_ops + .sorted_by(|a, b| b.serial_id.cmp(&a.serial_id)) + .filter(|op| op.serial_id <= from_serial_id) + .take(query.limit as usize) + .cloned() + .collect(), + }; + let txs: Vec = ops + .into_iter() + .map(|op| { + let tx_hash = op.tx_hash(); + let tx = L1Transaction::from_pending_op( + op.data.clone(), + op.eth_hash, + op.serial_id, + tx_hash, + ); + Transaction { + tx_hash, + block_number: None, + op: TransactionData::L1(tx), + status: TxInBlockStatus::Queued, + fail_reason: None, + created_at: None, } - ZkSyncPriorityOp::FullExit(full_exit) => full_exit.eth_address == address, }) - .cloned() - .collect() + .collect(); + Paginated::new( + txs, + from_serial_id, + query.limit, + query.direction, + count as u32, + ) } async fn poll_eth_node(&mut self) -> anyhow::Result<()> { @@ -429,12 +584,20 @@ impl EthWatch { let deposits_for_address = self.get_ongoing_deposits_for(address); resp.send(deposits_for_address).ok(); } - EthWatchRequest::GetUnconfirmedOps { address, resp } => { - let deposits_for_address = self.get_ongoing_ops_for(address); - resp.send(deposits_for_address).ok(); + EthWatchRequest::GetUnconfirmedOps { query, resp } => { + let unconfirmed_ops = self.get_ongoing_ops_for(query); + resp.send(unconfirmed_ops).ok(); + } + EthWatchRequest::GetUnconfirmedOpByEthHash { eth_hash, resp } => { + let unconfirmed_op = self.find_ongoing_op_by_eth_hash(eth_hash); + resp.send(unconfirmed_op).unwrap_or_default(); + } + EthWatchRequest::GetUnconfirmedOpByTxHash { tx_hash, resp } => { + let unconfirmed_op = self.find_ongoing_op_by_tx_hash(tx_hash); + resp.send(unconfirmed_op).unwrap_or_default(); } - EthWatchRequest::GetUnconfirmedOpByHash { eth_hash, resp } => { - let unconfirmed_op = self.find_ongoing_op_by_hash(ð_hash); + EthWatchRequest::GetUnconfirmedOpByAnyHash { hash, resp } => { + let unconfirmed_op = self.find_ongoing_op_by_any_hash(hash); resp.send(unconfirmed_op).unwrap_or_default(); } EthWatchRequest::GetNewTokens { @@ -450,6 +613,27 @@ impl EthWatch { resp.send(self.get_register_factory_event(last_eth_block)) .ok(); } + EthWatchRequest::IsPubkeyChangeAuthorized { + address, + nonce, + pubkey_hash, + resp, + } => { + let authorized = self + .is_new_pubkey_hash_authorized(address, nonce, &pubkey_hash) + .await + .unwrap_or(false); + resp.send(authorized).unwrap_or_default(); + } + EthWatchRequest::GetPriorityOpBySerialId { serial_id, resp } => { + resp.send( + self.eth_state + .priority_queue() + .get(&serial_id) + .map(|received_op| received_op.as_ref().clone()), + ) + .unwrap_or_default(); + } } } } diff --git a/core/bin/zksync_core/src/eth_watch/tests.rs b/core/bin/zksync_core/src/eth_watch/tests.rs index 6d49d6577a..d949e429a5 100644 --- a/core/bin/zksync_core/src/eth_watch/tests.rs +++ b/core/bin/zksync_core/src/eth_watch/tests.rs @@ -3,9 +3,12 @@ use std::collections::HashMap; use web3::types::{Address, BlockNumber}; +use zksync_api_types::v02::pagination::{ + ApiEither, PaginationDirection, PaginationQuery, PendingOpsRequest, +}; use zksync_types::{ AccountId, Deposit, FullExit, NewTokenEvent, Nonce, PriorityOp, RegisterNFTFactoryEvent, - TokenId, ZkSyncPriorityOp, + TokenId, ZkSyncPriorityOp, H256, }; use crate::eth_watch::{client::EthClient, EthWatch}; @@ -129,46 +132,49 @@ async fn test_operation_queues() { let from_addr = [1u8; 20].into(); let to_addr = [2u8; 20].into(); - client - .add_operations(&[ - PriorityOp { - serial_id: 0, - data: ZkSyncPriorityOp::Deposit(Deposit { - from: from_addr, - token: TokenId(0), - amount: Default::default(), - to: to_addr, - }), - deadline_block: 0, - eth_hash: [2; 32].into(), - eth_block: 4, - }, - PriorityOp { - serial_id: 1, - data: ZkSyncPriorityOp::Deposit(Deposit { - from: Default::default(), - token: TokenId(0), - amount: Default::default(), - to: Default::default(), - }), - deadline_block: 0, - eth_hash: [3; 32].into(), - eth_block: 3, - }, - PriorityOp { - serial_id: 2, - data: ZkSyncPriorityOp::FullExit(FullExit { - account_id: AccountId(1), - eth_address: from_addr, - token: TokenId(0), - is_legacy: false, - }), - deadline_block: 0, - eth_block: 4, - eth_hash: [4; 32].into(), - }, - ]) - .await; + let priority_ops = vec![ + PriorityOp { + serial_id: 0, + data: ZkSyncPriorityOp::Deposit(Deposit { + from: from_addr, + token: TokenId(0), + amount: Default::default(), + to: to_addr, + }), + deadline_block: 0, + eth_hash: [2; 32].into(), + eth_block: 4, + eth_block_index: Some(1), + }, + PriorityOp { + serial_id: 1, + data: ZkSyncPriorityOp::Deposit(Deposit { + from: Default::default(), + token: TokenId(0), + amount: Default::default(), + to: Default::default(), + }), + deadline_block: 0, + eth_hash: [3; 32].into(), + eth_block: 3, + eth_block_index: Some(1), + }, + PriorityOp { + serial_id: 2, + data: ZkSyncPriorityOp::FullExit(FullExit { + account_id: AccountId(1), + eth_address: from_addr, + token: TokenId(0), + is_legacy: false, + }), + deadline_block: 0, + eth_block: 4, + eth_hash: [4; 32].into(), + eth_block_index: Some(2), + }, + ]; + + client.add_operations(&priority_ops).await; let mut watcher = create_watcher(client); watcher.poll_eth_node().await.unwrap(); @@ -186,17 +192,37 @@ async fn test_operation_queues() { assert_eq!(unconfirmed_queue[1].serial_id, 2); priority_queues.get(&1).unwrap(); - watcher.find_ongoing_op_by_hash(&[2u8; 32]).unwrap(); + watcher + .find_ongoing_op_by_eth_hash(H256::from_slice(&[2u8; 32])) + .unwrap(); // Make sure that the old behavior of the pending deposits getter has not changed. let deposits = watcher.get_ongoing_deposits_for(to_addr); assert_eq!(deposits.len(), 1); - // Check that the new pending operations getter shows only deposits with the same `from` address. - let ops = watcher.get_ongoing_ops_for(from_addr); - - assert_eq!(ops[0].serial_id, 0); - assert_eq!(ops[1].serial_id, 2); - assert!(watcher.get_ongoing_ops_for(to_addr).is_empty()); + // Check that the new pending operations getter shows only deposits with the same `to` address. + let ops = watcher.get_ongoing_ops_for(PaginationQuery { + from: PendingOpsRequest { + address: to_addr, + account_id: Some(AccountId(1)), + serial_id: ApiEither::from(0), + }, + limit: 2, + direction: PaginationDirection::Newer, + }); + assert_eq!(ops.list[0].tx_hash, priority_ops[0].tx_hash()); + assert_eq!(ops.list[1].tx_hash, priority_ops[2].tx_hash()); + assert!(watcher + .get_ongoing_ops_for(PaginationQuery { + from: PendingOpsRequest { + address: from_addr, + account_id: Some(AccountId(0)), + serial_id: ApiEither::from(0) + }, + limit: 3, + direction: PaginationDirection::Newer + }) + .list + .is_empty()); } /// This test simulates the situation when eth watch module did not poll Ethereum node for some time @@ -221,6 +247,7 @@ async fn test_operation_queues_time_lag() { deadline_block: 0, eth_hash: [2; 32].into(), eth_block: 1, // <- First operation goes to the first block. + eth_block_index: Some(1), }, PriorityOp { serial_id: 1, @@ -233,6 +260,7 @@ async fn test_operation_queues_time_lag() { deadline_block: 0, eth_hash: [3; 32].into(), eth_block: 100, // <-- Note 100th block, it will set the network block to 100. + eth_block_index: Some(1), }, PriorityOp { serial_id: 2, @@ -245,6 +273,7 @@ async fn test_operation_queues_time_lag() { deadline_block: 0, eth_hash: [3; 32].into(), eth_block: 110, // <-- This operation will get to the unconfirmed queue. + eth_block_index: Some(1), }, ]) .await; @@ -288,6 +317,7 @@ async fn test_restore_and_poll() { deadline_block: 0, eth_hash: [2; 32].into(), eth_block: 4, + eth_block_index: Some(1), }, PriorityOp { serial_id: 1, @@ -300,6 +330,7 @@ async fn test_restore_and_poll() { deadline_block: 0, eth_hash: [3; 32].into(), eth_block: 3, + eth_block_index: Some(1), }, ]) .await; @@ -319,6 +350,7 @@ async fn test_restore_and_poll() { deadline_block: 0, eth_hash: [2; 32].into(), eth_block: 5, + eth_block_index: Some(1), }, PriorityOp { serial_id: 4, @@ -331,6 +363,7 @@ async fn test_restore_and_poll() { deadline_block: 0, eth_hash: [3; 32].into(), eth_block: 5, + eth_block_index: Some(2), }, ]) .await; @@ -342,7 +375,9 @@ async fn test_restore_and_poll() { assert_eq!(unconfirmed_queue.len(), 2); assert_eq!(unconfirmed_queue[0].serial_id, 3); priority_queues.get(&1).unwrap(); - watcher.find_ongoing_op_by_hash(&[2u8; 32]).unwrap(); + watcher + .find_ongoing_op_by_eth_hash(H256::from_slice(&[2u8; 32])) + .unwrap(); let deposits = watcher.get_ongoing_deposits_for([2u8; 20].into()); assert_eq!(deposits.len(), 1); } @@ -364,6 +399,7 @@ async fn test_restore_and_poll_time_lag() { deadline_block: 0, eth_hash: [2; 32].into(), eth_block: 1, + eth_block_index: Some(1), }, PriorityOp { serial_id: 1, @@ -376,6 +412,7 @@ async fn test_restore_and_poll_time_lag() { deadline_block: 0, eth_hash: [3; 32].into(), eth_block: 100, + eth_block_index: Some(1), }, ]) .await; diff --git a/core/bin/zksync_core/src/lib.rs b/core/bin/zksync_core/src/lib.rs index 63c9f3d589..fb41118aa8 100644 --- a/core/bin/zksync_core/src/lib.rs +++ b/core/bin/zksync_core/src/lib.rs @@ -135,7 +135,6 @@ pub async fn run_core( config.chain.state_keeper.block_chunk_sizes.clone(), config.chain.state_keeper.miniblock_iterations as usize, config.chain.state_keeper.fast_block_miniblock_iterations as usize, - config.chain.state_keeper.last_tx_signer_data(), ); let state_keeper_task = start_state_keeper(state_keeper, pending_block); diff --git a/core/bin/zksync_core/src/mempool/mempool_transactions_queue.rs b/core/bin/zksync_core/src/mempool/mempool_transactions_queue.rs index 210c11571e..c75c3bf986 100644 --- a/core/bin/zksync_core/src/mempool/mempool_transactions_queue.rs +++ b/core/bin/zksync_core/src/mempool/mempool_transactions_queue.rs @@ -1,6 +1,6 @@ use std::cmp::Ordering; use std::collections::{BinaryHeap, VecDeque}; -use zksync_types::mempool::SignedTxVariant; +use zksync_types::mempool::{RevertedTxVariant, SignedTxVariant}; #[derive(Debug, Clone)] struct MempoolPendingTransaction { @@ -34,20 +34,39 @@ impl PartialOrd for MempoolPendingTransaction { #[derive(Debug, Clone)] pub struct MempoolTransactionsQueue { - // transactions ready for execution + /// Reverted transactions queue that must be used before processing any other transactions. + /// Transactions in this queue are marked by the revert block tool with `next_priority_op_id` + /// in order to preserve the order of reverted priority operations. + /// + /// The queue is only accessible for popping elements. + reverted_txs: VecDeque, + /// Transactions ready for execution. ready_txs: VecDeque, - // transactions that are not ready yet because of the `valid_from` field + /// Transactions that are not ready yet because of the `valid_from` field. pending_txs: BinaryHeap, } impl MempoolTransactionsQueue { - pub fn new() -> Self { + pub fn new(reverted_txs: VecDeque) -> Self { Self { + reverted_txs, ready_txs: VecDeque::new(), pending_txs: BinaryHeap::new(), } } + /// Returns a reference to the front element of the reverted queue, or `None` + /// if the queue is empty. + pub fn reverted_queue_front(&self) -> Option<&RevertedTxVariant> { + self.reverted_txs.front() + } + + /// Removes the first element from the reverted queue and returns it , or `None` + /// if the queue is empty. + pub fn reverted_queue_pop_front(&mut self) -> Option { + self.reverted_txs.pop_front() + } + pub fn pop_front(&mut self) -> Option { self.ready_txs.pop_front() } @@ -149,6 +168,7 @@ mod tests { #[test] fn test_mempool_transactions_queue() { let mut transactions_queue = MempoolTransactionsQueue { + reverted_txs: VecDeque::new(), ready_txs: VecDeque::new(), pending_txs: BinaryHeap::new(), }; diff --git a/core/bin/zksync_core/src/mempool/mod.rs b/core/bin/zksync_core/src/mempool/mod.rs index 9d622dcafd..740c4766ed 100644 --- a/core/bin/zksync_core/src/mempool/mod.rs +++ b/core/bin/zksync_core/src/mempool/mod.rs @@ -96,6 +96,10 @@ pub struct ProposedBlock { } impl ProposedBlock { + pub fn new() -> Self { + Self::default() + } + pub fn is_empty(&self) -> bool { self.priority_ops.is_empty() && self.txs.is_empty() } @@ -198,17 +202,18 @@ impl MempoolState { // Load transactions that were not yet processed and are awaiting in the // mempool. - let all_mempool_txs = transaction + let (mempool_txs, reverted_txs) = transaction .chain() .mempool_schema() .load_txs() .await .expect("Attempt to restore mempool txs from DB failed"); + let (mempool_size, reverted_queue_size) = (mempool_txs.len(), reverted_txs.len()); - // Transactions can become ready when knowing the block timestamp - let mut transactions_queue = MempoolTransactionsQueue::new(); + // Initialize the queue with reverted transactions loaded from the database. + let mut transactions_queue = MempoolTransactionsQueue::new(reverted_txs); - for tx in all_mempool_txs.clone() { + for tx in mempool_txs { transactions_queue.add_tx_variant(tx); } @@ -218,8 +223,8 @@ impl MempoolState { .expect("mempool db transaction commit"); vlog::info!( - "{} transactions were restored from the persistent mempool storage", - all_mempool_txs.len() + "{} transactions were restored from the persistent mempool storage, reverted queue size: {}", + mempool_size, reverted_queue_size ); Self { @@ -253,12 +258,89 @@ struct MempoolBlocksHandler { } impl MempoolBlocksHandler { + async fn select_reverted_operations( + &mut self, + current_unprocessed_priority_op: u64, + ) -> (usize, ProposedBlock) { + let mut chunks_left = self.max_block_size_chunks; + let mut proposed_block = ProposedBlock::new(); + let mut next_serial_id = current_unprocessed_priority_op; + + let mut mempool_state = self.mempool_state.write().await; + // Peek into the reverted queue. + let reverted_tx = match mempool_state.transactions_queue.reverted_queue_front() { + Some(reverted_tx) => reverted_tx, + None => return (chunks_left, proposed_block), + }; + // First, fill the block with missing priority operations. + // Unlike transactions, they are requested from the Eth watch. + while next_serial_id < reverted_tx.next_priority_op_id { + let (sender, receiver) = oneshot::channel(); + self.eth_watch_req + .send(EthWatchRequest::GetPriorityOpBySerialId { + serial_id: next_serial_id, + resp: sender, + }) + .await + .expect("Eth watch requests receiver is dropped"); + let priority_op = receiver + .await + .expect("Failed to receive priority operation from Eth watch") + .expect("Operation not found in the priority queue"); + // If the operation doesn't fit, return the proposed block. + if priority_op.data.chunks() <= chunks_left { + chunks_left -= priority_op.data.chunks(); + proposed_block.priority_ops.push(priority_op); + next_serial_id += 1; + } else { + return (chunks_left, proposed_block); + } + } + + while let Some(reverted_tx) = mempool_state.transactions_queue.reverted_queue_front() { + // To prevent state keeper from executing priority operations + // out of order, we finish the miniblock if the serial id counter + // is greater than the current one. Such transactions will be included + // on the next block proposer request. + if next_serial_id < reverted_tx.next_priority_op_id { + break; + } + // If the transaction fits into the block, pop it from the queue. + let required_chunks = mempool_state.required_chunks(reverted_tx.as_ref()); + if required_chunks <= chunks_left { + chunks_left -= required_chunks; + let reverted_tx = mempool_state + .transactions_queue + .reverted_queue_pop_front() + .unwrap(); + proposed_block.txs.push(reverted_tx.into_inner()); + } else { + break; + } + } + + (chunks_left, proposed_block) + } + async fn propose_new_block( &mut self, current_unprocessed_priority_op: u64, block_timestamp: u64, ) -> ProposedBlock { let start = std::time::Instant::now(); + // Try to exhaust the reverted transactions queue. Most of the time it + // will be empty unless the server is restarted after reverting blocks. + let (chunks_left, reverted_block) = self + .select_reverted_operations(current_unprocessed_priority_op) + .await; + if !reverted_block.is_empty() { + vlog::debug!( + "Proposing new block with reverted operations, chunks used: {}", + self.max_block_size_chunks - chunks_left + ); + return reverted_block; + } + let (chunks_left, priority_ops) = self .select_priority_ops(current_unprocessed_priority_op) .await; diff --git a/core/bin/zksync_core/src/private_api.rs b/core/bin/zksync_core/src/private_api.rs index e4819bfe35..5cf24d4c4d 100644 --- a/core/bin/zksync_core/src/private_api.rs +++ b/core/bin/zksync_core/src/private_api.rs @@ -13,9 +13,14 @@ use futures::{ channel::{mpsc, oneshot}, sink::SinkExt, }; -use std::thread; +use serde::Deserialize; +use std::{str::FromStr, thread}; +use zksync_api_types::{ + v02::pagination::{ApiEither, PaginationDirection, PaginationQuery, PendingOpsRequest}, + PriorityOpLookupQuery, +}; use zksync_config::configs::api::PrivateApi; -use zksync_types::{tx::TxEthSignature, Address, SignedZkSyncTx, H256}; +use zksync_types::{tx::TxEthSignature, AccountId, Address, SignedZkSyncTx}; use zksync_utils::panic_notify::ThreadPanicNotify; #[derive(Debug, Clone)] @@ -94,15 +99,40 @@ async fn unconfirmed_deposits( Ok(HttpResponse::Ok().json(response)) } -/// Obtains information about unconfirmed operations known for a certain address. -#[actix_web::get("/unconfirmed_ops/{address}")] +#[derive(Debug, Deserialize)] +struct PendingOpsFlattenRequest { + pub address: Address, + pub account_id: Option, + pub serial_id: String, + pub limit: u32, + pub direction: PaginationDirection, +} + +/// Obtains information about unconfirmed operations known for a certain account. +/// Pending deposits can be matched only with addresses, +/// while pending full exits can be matched only with account ids. +/// If the account isn't created yet it doesn't have an id +/// but we can still find pending deposits for its address that is why account_id is Option. +#[actix_web::get("/unconfirmed_ops")] async fn unconfirmed_ops( data: web::Data, - web::Path(address): web::Path
, + web::Query(params): web::Query, ) -> actix_web::Result { let (sender, receiver) = oneshot::channel(); + // Serializing enum query parameters doesn't work, so parse it separately. + let serial_id = ApiEither::from_str(¶ms.serial_id) + .map_err(|_| HttpResponse::InternalServerError().finish())?; + let query = PaginationQuery { + from: PendingOpsRequest { + address: params.address, + account_id: params.account_id, + serial_id, + }, + limit: params.limit, + direction: params.direction, + }; let item = EthWatchRequest::GetUnconfirmedOps { - address, + query, resp: sender, }; let mut eth_watch_sender = data.eth_watch_req_sender.clone(); @@ -118,16 +148,25 @@ async fn unconfirmed_ops( Ok(HttpResponse::Ok().json(response)) } -/// Obtains information about unconfirmed deposits known for a certain address. -#[actix_web::get("/unconfirmed_op/{tx_hash}")] +/// Returns information about unconfirmed operation. +#[actix_web::post("/unconfirmed_op")] async fn unconfirmed_op( data: web::Data, - web::Path(eth_hash): web::Path, + web::Json(query): web::Json, ) -> actix_web::Result { let (sender, receiver) = oneshot::channel(); - let item = EthWatchRequest::GetUnconfirmedOpByHash { - eth_hash: eth_hash.as_ref().to_vec(), - resp: sender, + let item = match query { + PriorityOpLookupQuery::ByEthHash(eth_hash) => EthWatchRequest::GetUnconfirmedOpByEthHash { + eth_hash, + resp: sender, + }, + PriorityOpLookupQuery::BySyncHash(tx_hash) => EthWatchRequest::GetUnconfirmedOpByTxHash { + tx_hash, + resp: sender, + }, + PriorityOpLookupQuery::ByAnyHash(hash) => { + EthWatchRequest::GetUnconfirmedOpByAnyHash { hash, resp: sender } + } }; let mut eth_watch_sender = data.eth_watch_req_sender.clone(); eth_watch_sender diff --git a/core/bin/zksync_core/src/state_keeper/mod.rs b/core/bin/zksync_core/src/state_keeper/mod.rs index a7a0d31142..e45241cad2 100644 --- a/core/bin/zksync_core/src/state_keeper/mod.rs +++ b/core/bin/zksync_core/src/state_keeper/mod.rs @@ -10,13 +10,8 @@ use itertools::Itertools; use tokio::task::JoinHandle; // Workspace uses use zksync_crypto::{ - convert::FeConvert, ff::{self, PrimeField, PrimeFieldRepr}, - params::{ - ETH_TOKEN_ID, MIN_NFT_TOKEN_ID, NFT_STORAGE_ACCOUNT_ADDRESS, NFT_STORAGE_ACCOUNT_ID, - NFT_TOKEN_ID, - }, - PrivateKey, + params::{MIN_NFT_TOKEN_ID, NFT_STORAGE_ACCOUNT_ADDRESS, NFT_STORAGE_ACCOUNT_ID, NFT_TOKEN_ID}, }; use zksync_state::state::{CollectedFee, OpSuccess, ZkSyncState}; use zksync_storage::ConnectionPool; @@ -26,11 +21,10 @@ use zksync_types::{ PendingBlock as SendablePendingBlock, }, gas_counter::GasCounter, - helpers::reverse_updates, mempool::SignedTxVariant, tx::{TxHash, ZkSyncTx}, Account, AccountId, AccountTree, AccountUpdate, AccountUpdates, Address, BlockNumber, - PriorityOp, SignedZkSyncTx, Token, TokenId, Transfer, TransferOp, H256, NFT, + PriorityOp, SignedZkSyncTx, Token, TokenId, H256, NFT, }; // Local uses use crate::{ @@ -82,16 +76,12 @@ impl PendingBlock { available_chunks_sizes: &[usize], previous_block_root_hash: H256, timestamp: u64, - should_include_last_transfer: bool, ) -> Self { // TransferOp chunks are subtracted to reserve space for last transfer. - let mut chunks_left = *available_chunks_sizes + let chunks_left = *available_chunks_sizes .iter() .max() .expect("Expected at least one block chunks size"); - if should_include_last_transfer { - chunks_left -= TransferOp::CHUNKS; - } Self { success_operations: Vec::new(), failed_txs: Vec::new(), @@ -140,9 +130,6 @@ pub struct ZkSyncStateKeeper { success_txs_pending_len: usize, /// Amount of failed transactions in the pending block at the last pending block synchronization step. failed_txs_pending_len: usize, - - /// ZK sync account that is used to create last transfer before sealing block (e.g. to change block hash) - tx_signer: Option<(Address, PrivateKey)>, } #[derive(Debug, Clone)] @@ -413,7 +400,6 @@ impl ZkSyncStateKeeper { available_block_chunk_sizes: Vec, max_miniblock_iterations: usize, fast_miniblock_iterations: usize, - tx_signer: Option<(Address, PrivateKey)>, ) -> Self { assert!(!available_block_chunk_sizes.is_empty()); @@ -453,7 +439,6 @@ impl ZkSyncStateKeeper { &available_block_chunk_sizes, previous_root_hash, system_time_timestamp(), - tx_signer.is_some(), ), available_block_chunk_sizes, max_miniblock_iterations, @@ -461,7 +446,6 @@ impl ZkSyncStateKeeper { success_txs_pending_len: 0, failed_txs_pending_len: 0, - tx_signer, }; let root = keeper.state.root_hash(); @@ -1053,10 +1037,6 @@ impl ZkSyncStateKeeper { .account_updates .extend(fee_updates.into_iter()); - // This last tx does not pay any fee - if let Err(e) = self.execute_transfer_to_change_block_hash() { - vlog::error!("Failed to execute transfer to change block hash: {}", e); - } let mut pending_block = std::mem::replace( &mut self.pending_block, PendingBlock::new( @@ -1064,7 +1044,6 @@ impl ZkSyncStateKeeper { &self.available_block_chunk_sizes, H256::default(), system_time_timestamp(), - self.tx_signer.is_some(), ), ); // Once block is sealed, we refresh the counters for the next block. @@ -1203,102 +1182,7 @@ impl ZkSyncStateKeeper { unprocessed_priority_op: self.current_unprocessed_priority_op, } } - - /// Should be applied after fee is collected when block is being sealed. - fn execute_transfer_to_change_block_hash(&mut self) -> anyhow::Result<()> { - let (signer_id, signer_account, signer_pk) = { - let (address, pk) = if let Some((address, pk)) = self.tx_signer.as_ref() { - (address, pk) - } else { - return Ok(()); - }; - let (id, account) = self.state.get_account_by_address(&address).ok_or_else(|| { - anyhow::format_err!("Signer account is not in the tree: {:?}", address) - })?; - (id, account, pk) - }; - let (target_id, target_account) = { - ( - self.fee_account_id, - self.state - .get_account(self.fee_account_id) - .expect("Fee account must be present in the tree"), - ) - }; - - let mut tx_value = 0u32; - let mut first_byte = self.state.root_hash().to_bytes()[0]; - while first_byte > 0x1F { - tx_value += 1; - anyhow::ensure!( - signer_account.get_balance(ETH_TOKEN_ID) > tx_value.into(), - "Not enough balance on signer account" - ); - - let expected_updates = vec![ - ( - signer_id, - AccountUpdate::UpdateBalance { - old_nonce: signer_account.nonce, - new_nonce: signer_account.nonce + 1, - balance_update: ( - ETH_TOKEN_ID, - signer_account.get_balance(ETH_TOKEN_ID), - signer_account.get_balance(ETH_TOKEN_ID) - tx_value, - ), - }, - ), - ( - target_id, - AccountUpdate::UpdateBalance { - old_nonce: target_account.nonce, - new_nonce: target_account.nonce, - balance_update: ( - ETH_TOKEN_ID, - target_account.get_balance(ETH_TOKEN_ID), - target_account.get_balance(ETH_TOKEN_ID) + tx_value, - ), - }, - ), - ]; - self.state.apply_account_updates(expected_updates.clone()); - - first_byte = self.state.root_hash().to_bytes()[0]; - - let reverse_updates = { - let mut rev_updates = expected_updates; - reverse_updates(&mut rev_updates); - rev_updates - }; - self.state.apply_account_updates(reverse_updates); - } - - if tx_value == 0 { - return Ok(()); - } - - let transfer = Transfer::new_signed( - signer_id, - signer_account.address, - target_account.address, - ETH_TOKEN_ID, - tx_value.into(), - 0u32.into(), - signer_account.nonce, - Default::default(), - &signer_pk, - )?; - - self.apply_tx(&SignedZkSyncTx { - tx: transfer.into(), - eth_sign_data: None, - }) - .map_err(|_| anyhow::format_err!("Transaction execution failed"))?; - - Ok(()) - } } - #[must_use] pub fn start_state_keeper( sk: ZkSyncStateKeeper, diff --git a/core/bin/zksync_core/src/state_keeper/tests.rs b/core/bin/zksync_core/src/state_keeper/tests.rs index 90e5a16e3c..2244c8828d 100644 --- a/core/bin/zksync_core/src/state_keeper/tests.rs +++ b/core/bin/zksync_core/src/state_keeper/tests.rs @@ -37,7 +37,6 @@ impl StateKeeperTester { vec![available_chunk_size], max_iterations, fast_iterations, - None, ); Self { @@ -146,7 +145,7 @@ fn create_account_and_fast_withdrawal>( ) } -#[allow(clippy::clippy::too_many_arguments)] +#[allow(clippy::too_many_arguments)] fn create_account_and_withdrawal_impl>( tester: &mut StateKeeperTester, token_id: TokenId, @@ -194,6 +193,7 @@ pub fn create_deposit(token: TokenId, amount: impl Into) -> PriorityOp deadline_block: 0, eth_hash: H256::zero(), eth_block: 0, + eth_block_index: None, } } @@ -253,7 +253,6 @@ fn test_create_incorrect_state_keeper() { vec![1, 2, 2], // `available_block_chunk_sizes` must be strictly increasing. MAX_ITERATIONS, FAST_ITERATIONS, - None, ); } @@ -338,8 +337,8 @@ mod apply_tx { let pending_block = tester.state_keeper.pending_block; assert!(result.is_ok()); - assert_eq!(old_pending_block.fast_processing_required, false); - assert_eq!(pending_block.fast_processing_required, true); + assert!(!old_pending_block.fast_processing_required); + assert!(pending_block.fast_processing_required); } /// Checks if withdrawal that will fail is processed correctly diff --git a/core/bin/zksync_core/src/token_handler.rs b/core/bin/zksync_core/src/token_handler.rs index b2a40010d3..b130920823 100644 --- a/core/bin/zksync_core/src/token_handler.rs +++ b/core/bin/zksync_core/src/token_handler.rs @@ -19,7 +19,7 @@ use zksync_notifier::Notifier; use zksync_storage::{tokens::StoreTokenError, ConnectionPool, StorageProcessor}; use zksync_types::{ tokens::{NewTokenEvent, Token, TokenInfo}, - Address, + Address, TokenId, }; // Local uses use crate::eth_watch::EthWatchRequest; @@ -81,7 +81,7 @@ impl TokenHandler { let mut transaction = storage.start_transaction().await?; let mut token_schema = transaction.tokens_schema(); - let last_token_id = token_schema.get_last_token_id().await?; + let last_token_id = TokenId(token_schema.get_count().await?); let mut new_tokens = Vec::new(); for token_event in tokens { diff --git a/core/bin/zksync_eth_sender/src/lib.rs b/core/bin/zksync_eth_sender/src/lib.rs index 12ea95650d..ecaec583ac 100644 --- a/core/bin/zksync_eth_sender/src/lib.rs +++ b/core/bin/zksync_eth_sender/src/lib.rs @@ -184,6 +184,9 @@ impl ETHSender { /// Main routine of `ETHSender`. pub async fn run(mut self) { + // `eth_sender` must perform some of the activities only once per block change. + // Having `0` as an initial value is to ensure that on the first iteration we will run all the activities. + let mut last_used_block = 0; loop { // We perform a loading routine every X seconds. tokio::time::delay_for(self.options.sender.tx_poll_period()).await; @@ -195,7 +198,7 @@ impl ETHSender { if self.options.sender.is_enabled { // ...and proceed them. - self.proceed_next_operations().await; + last_used_block = self.proceed_next_operations(last_used_block).await; // Update the gas adjuster to maintain the up-to-date max gas price limit. self.gas_adjuster .keep_updated(&self.ethereum, &self.db) @@ -242,13 +245,21 @@ impl ETHSender { /// 1. Pops all the available transactions from the `TxQueue` and sends them. /// 2. Sifts all the ongoing operations, filtering the completed ones and /// managing the rest (e.g. by sending a supplement txs for stuck operations). - async fn proceed_next_operations(&mut self) { + /// + /// It returns ethereum block number for which these things were done. + async fn proceed_next_operations(&mut self, last_used_block: u64) -> u64 { let start = Instant::now(); - // Queue for storing all the operations that were not finished at this iteration. - let mut new_ongoing_ops = VecDeque::new(); + + let current_block = match self.ethereum.block_number().await { + Ok(current_block) => current_block.as_u64(), + Err(e) => { + Self::process_error(e).await; + return last_used_block; + } + }; while let Some(tx) = self.tx_queue.pop_front() { - if let Err(e) = self.initialize_operation(tx.clone()).await { + if let Err(e) = self.initialize_operation(tx.clone(), current_block).await { Self::process_error(e).await; // Return the unperformed operation to the queue, since failing the // operation initialization means that it was not stored in the database. @@ -261,40 +272,53 @@ impl ETHSender { } } - // Commit the next operations (if any). - while let Some(mut current_op) = self.ongoing_ops.pop_front() { - // We perform a commitment step here. In case of error, we suppose that this is some - // network issue which won't appear the next time, so we report the situation to the - // log and consider the operation pending (meaning that we won't process it on this - // step, but will try to do so on the next one). - let commitment = match self.perform_commitment_step(&mut current_op).await { - Ok(commitment) => commitment, - Err(e) => { - Self::process_error(e).await; - OperationCommitment::Pending - } - }; + // In `perform_commitment_step` we request the states of transactions. We have requested + // states for the block with number `last_used_block` on the previous call of + // `proceed_next_operations`, so if the block number hasn't changed we shouldn't request + // states because it would be spare requests. + // The ongoing operations list would be the same for the next step + if last_used_block != current_block { + // Queue for storing all the operations that were not finished at this iteration. + let mut new_ongoing_ops = VecDeque::new(); + + // Commit the next operations (if any). + while let Some(mut current_op) = self.ongoing_ops.pop_front() { + // We perform a commitment step here. In case of error, we suppose that this is some + // network issue which won't appear the next time, so we report the situation to the + // log and consider the operation pending (meaning that we won't process it on this + // step, but will try to do so on the next one). + let commitment = match self + .perform_commitment_step(&mut current_op, current_block) + .await + { + Ok(commitment) => commitment, + Err(e) => { + Self::process_error(e).await; + OperationCommitment::Pending + } + }; - match commitment { - OperationCommitment::Committed => { - // Free a slot for the next tx in the queue. - self.tx_queue.report_commitment(); - } - OperationCommitment::Pending => { - // Poll this operation on the next iteration. - new_ongoing_ops.push_back(current_op); + match commitment { + OperationCommitment::Committed => { + // Free a slot for the next tx in the queue. + self.tx_queue.report_commitment(); + } + OperationCommitment::Pending => { + // Poll this operation on the next iteration. + new_ongoing_ops.push_back(current_op); + } } } + assert!( + self.ongoing_ops.is_empty(), + "Ongoing ops queue should be empty after draining" + ); + // Store the ongoing operations for the next round. + self.ongoing_ops = new_ongoing_ops; } - assert!( - self.ongoing_ops.is_empty(), - "Ongoing ops queue should be empty after draining" - ); - - // Store the ongoing operations for the next round. - self.ongoing_ops = new_ongoing_ops; metrics::histogram!("eth_sender.proceed_next_operations", start.elapsed()); + current_block } async fn process_error(err: anyhow::Error) { @@ -312,9 +336,8 @@ impl ETHSender { } /// Stores the new operation in the database and sends the corresponding transaction. - async fn initialize_operation(&mut self, tx: TxData) -> anyhow::Result<()> { - let current_block = self.ethereum.block_number().await?; - let deadline_block = self.get_deadline_block(current_block.as_u64()); + async fn initialize_operation(&mut self, tx: TxData, current_block: u64) -> anyhow::Result<()> { + let deadline_block = self.get_deadline_block(current_block); let gas_price = self .gas_adjuster .get_gas_price(&self.ethereum, None) @@ -423,6 +446,7 @@ impl ETHSender { async fn perform_commitment_step( &mut self, op: &mut ETHOperation, + current_block: u64, ) -> anyhow::Result { let start = Instant::now(); assert!( @@ -430,8 +454,6 @@ impl ETHSender { "OperationETHState should have at least one transaction" ); - let current_block = self.ethereum.block_number().await?; - // Check statuses of existing transactions. // Go through every transaction in a loop. We will exit this method early // if there will be discovered a pending or successfully committed transaction. @@ -443,7 +465,7 @@ impl ETHSender { }; match self - .check_transaction_state(mode, op, *tx_hash, current_block.as_u64()) + .check_transaction_state(mode, op, *tx_hash, current_block) .await? { TxCheckOutcome::Pending => { @@ -509,7 +531,7 @@ impl ETHSender { // Reaching this point will mean that the latest transaction got stuck. // We should create another tx based on it, and send it. - let deadline_block = self.get_deadline_block(current_block.as_u64()); + let deadline_block = self.get_deadline_block(current_block); // Raw tx contents are the same for every transaction, so we just // create a new one from the old one with updated parameters. let new_tx = self.create_supplement_tx(deadline_block, op).await?; @@ -570,7 +592,10 @@ impl ETHSender { tx_hash: H256, current_block: u64, ) -> anyhow::Result { - let status = self.ethereum.get_tx_status(tx_hash).await?; + let status = self + .ethereum + .get_tx_status(tx_hash, Some(current_block)) + .await?; let outcome = match status { // Successful execution. diff --git a/core/bin/zksync_eth_sender/src/tests/mod.rs b/core/bin/zksync_eth_sender/src/tests/mod.rs index ddcf87f986..4f42a059c9 100644 --- a/core/bin/zksync_eth_sender/src/tests/mod.rs +++ b/core/bin/zksync_eth_sender/src/tests/mod.rs @@ -256,7 +256,7 @@ async fn operation_commitment_workflow() { // Retrieve it there and then process. eth_sender.load_new_operations().await.unwrap(); - eth_sender.proceed_next_operations().await; + eth_sender.proceed_next_operations(0).await; // Now we should see that transaction is stored in the database and sent to the Ethereum. let deadline_block = eth_sender.get_deadline_block( @@ -297,7 +297,7 @@ async fn operation_commitment_workflow() { .add_successfull_execution(expected_tx.used_tx_hashes[0], WAIT_CONFIRMATIONS) .await; - eth_sender.proceed_next_operations().await; + eth_sender.proceed_next_operations(0).await; // Check that operation is confirmed. expected_tx.confirmed = true; @@ -325,7 +325,7 @@ async fn stuck_transaction() { .unwrap(); eth_sender.load_new_operations().await.unwrap(); - eth_sender.proceed_next_operations().await; + eth_sender.proceed_next_operations(0).await; let eth_op_id = 0; let nonce = 0; @@ -367,7 +367,7 @@ async fn stuck_transaction() { .set_block_number(block_number) .await .unwrap(); - eth_sender.proceed_next_operations().await; + eth_sender.proceed_next_operations(0).await; // Check that new transaction is sent (and created based on the previous stuck tx). let expected_sent_tx = eth_sender @@ -402,7 +402,7 @@ async fn stuck_transaction() { .unwrap() .add_successfull_execution(stuck_tx.used_tx_hashes[1], WAIT_CONFIRMATIONS) .await; - eth_sender.proceed_next_operations().await; + eth_sender.proceed_next_operations(0).await; // Check that operation is confirmed (we set the final hash to the second sent tx). stuck_tx.confirmed = true; @@ -517,7 +517,7 @@ async fn operations_order() { for mut tx in expected_txs.into_iter() { let current_tx_hash = tx.used_tx_hashes[0]; - eth_sender.proceed_next_operations().await; + eth_sender.proceed_next_operations(0).await; // Check that current expected tx is stored. eth_sender.db.assert_stored(&tx).await; @@ -535,7 +535,7 @@ async fn operations_order() { .unwrap() .add_successfull_execution(current_tx_hash, WAIT_CONFIRMATIONS) .await; - eth_sender.proceed_next_operations().await; + eth_sender.proceed_next_operations(0).await; // Update the fields in the tx and check if it's confirmed. tx.confirmed = true; @@ -580,7 +580,7 @@ async fn transaction_failure() { .await; eth_sender.load_new_operations().await.unwrap(); - eth_sender.proceed_next_operations().await; + eth_sender.proceed_next_operations(0).await; eth_sender .ethereum @@ -588,7 +588,7 @@ async fn transaction_failure() { .unwrap() .add_failed_execution(&failing_tx.used_tx_hashes[0], WAIT_CONFIRMATIONS) .await; - eth_sender.proceed_next_operations().await; + eth_sender.proceed_next_operations(0).await; } /// Check that after recovering state with several non-processed operations @@ -681,7 +681,7 @@ async fn restore_state() { // We do process operations restored from the DB though. // The rest of this test is the same as in `operation_commitment_workflow`. - eth_sender.proceed_next_operations().await; + eth_sender.proceed_next_operations(0).await; let deadline_block = eth_sender.get_deadline_block( eth_sender @@ -712,7 +712,7 @@ async fn restore_state() { .unwrap() .add_successfull_execution(expected_tx.used_tx_hashes[0], WAIT_CONFIRMATIONS) .await; - eth_sender.proceed_next_operations().await; + eth_sender.proceed_next_operations(0).await; expected_tx.confirmed = true; expected_tx.final_hash = Some(expected_tx.used_tx_hashes[0]); @@ -738,7 +738,7 @@ async fn confirmations_independence() { .unwrap(); eth_sender.load_new_operations().await.unwrap(); - eth_sender.proceed_next_operations().await; + eth_sender.proceed_next_operations(0).await; let eth_op_id = 0; let nonce = 0; @@ -779,7 +779,7 @@ async fn confirmations_independence() { .set_block_number(block_number) .await .unwrap(); - eth_sender.proceed_next_operations().await; + eth_sender.proceed_next_operations(0).await; let next_tx = eth_sender .create_supplement_tx( @@ -812,7 +812,7 @@ async fn confirmations_independence() { .unwrap() .add_successfull_execution(stuck_tx.used_tx_hashes[0], WAIT_CONFIRMATIONS) .await; - eth_sender.proceed_next_operations().await; + eth_sender.proceed_next_operations(0).await; // Check that operation is confirmed (we set the final hash to the *first* sent tx). stuck_tx.confirmed = true; @@ -930,7 +930,7 @@ async fn concurrent_operations_order() { eth_sender.load_new_operations().await.unwrap(); // Call `proceed_next_operations`. Several txs should be sent. - eth_sender.proceed_next_operations().await; + eth_sender.proceed_next_operations(0).await; let commit_tx = &txs[0]; let verify_tx = &txs[1]; @@ -959,7 +959,7 @@ async fn concurrent_operations_order() { } // Call `proceed_next_operations` again. Both txs should become confirmed. - eth_sender.proceed_next_operations().await; + eth_sender.proceed_next_operations(0).await; for &tx in &[commit_tx, verify_tx, execute_tx] { let mut tx = tx.clone(); diff --git a/core/bin/zksync_eth_sender/src/tests/test_data.rs b/core/bin/zksync_eth_sender/src/tests/test_data.rs index 04344f7ab1..955d4acf81 100644 --- a/core/bin/zksync_eth_sender/src/tests/test_data.rs +++ b/core/bin/zksync_eth_sender/src/tests/test_data.rs @@ -37,6 +37,7 @@ fn gen_aggregated_operation( deadline_block: 0, eth_hash: H256::zero(), eth_block: 0, + eth_block_index: None, }, op: ZkSyncOp::FullExit(Box::new(FullExitOp { priority_op, diff --git a/core/bin/zksync_forced_exit_requests/src/core_interaction_wrapper.rs b/core/bin/zksync_forced_exit_requests/src/core_interaction_wrapper.rs index 7399961656..0debcf4c69 100644 --- a/core/bin/zksync_forced_exit_requests/src/core_interaction_wrapper.rs +++ b/core/bin/zksync_forced_exit_requests/src/core_interaction_wrapper.rs @@ -73,7 +73,8 @@ impl CoreInteractionWrapper for MempoolCoreInteractionWrapper { let sender_state = account_schema .last_committed_state_for_account(account_id) - .await?; + .await? + .1; Ok(sender_state.map(|state| state.nonce)) } diff --git a/core/bin/zksync_witness_generator/src/database.rs b/core/bin/zksync_witness_generator/src/database.rs index a2970e368e..9d5497bef8 100644 --- a/core/bin/zksync_witness_generator/src/database.rs +++ b/core/bin/zksync_witness_generator/src/database.rs @@ -17,6 +17,8 @@ use zksync_types::{ // Local uses use crate::DatabaseInterface; +const NUMBER_OF_STORED_ACCOUNT_TREE_CACHE: u32 = 300; + /// The actual database wrapper. /// This structure uses `StorageProcessor` to interact with an existing database. #[derive(Debug, Clone)] @@ -260,6 +262,12 @@ impl DatabaseInterface for Database { .store_account_tree_cache(block, tree_cache) .await?; + connection + .chain() + .block_schema() + .remove_old_account_tree_cache(block - NUMBER_OF_STORED_ACCOUNT_TREE_CACHE) + .await?; + Ok(()) } diff --git a/core/bin/zksync_witness_generator/src/tests/mock.rs b/core/bin/zksync_witness_generator/src/tests/mock.rs index 63167818bf..0191ba4738 100644 --- a/core/bin/zksync_witness_generator/src/tests/mock.rs +++ b/core/bin/zksync_witness_generator/src/tests/mock.rs @@ -382,10 +382,9 @@ impl DatabaseInterface for MockDatabase { ) -> anyhow::Result<()> { let witness_str = serde_json::to_string(&witness).expect("Failed to serialize witness"); let mut block_witness = self.block_witness.write().await; - let is_block_not_saved_yet = block_witness + let is_block_not_saved_yet = !block_witness .iter() - .find(|witness| witness.block == *block as i64) - .is_none(); + .any(|witness| witness.block == *block as i64); if is_block_not_saved_yet { block_witness.push(StorageBlockWitness { diff --git a/core/bin/zksync_witness_generator/src/tests/prover_server.rs b/core/bin/zksync_witness_generator/src/tests/prover_server.rs index 91b1317517..68b09460e4 100644 --- a/core/bin/zksync_witness_generator/src/tests/prover_server.rs +++ b/core/bin/zksync_witness_generator/src/tests/prover_server.rs @@ -172,6 +172,7 @@ pub async fn get_test_block() -> Block { deadline_block: 2, eth_hash: H256::zero(), eth_block: 10, + eth_block_index: Some(1), }, block_index: 1, created_at: chrono::Utc::now(), diff --git a/core/lib/api_client/Cargo.toml b/core/lib/api_client/Cargo.toml index ff262241bb..2387dc50cd 100644 --- a/core/lib/api_client/Cargo.toml +++ b/core/lib/api_client/Cargo.toml @@ -10,9 +10,11 @@ keywords = ["blockchain", "zksync"] categories = ["cryptography"] [dependencies] -zksync_types = { path = "../../lib/types", version = "1.0" } -zksync_utils = { path = "../../lib/utils", version = "1.0" } -zksync_crypto = { path = "../../lib/crypto", version = "1.0" } +zksync_api_types = { path = "../api_types", version = "1.0" } +zksync_types = { path = "../types", version = "1.0" } +zksync_utils = { path = "../utils", version = "1.0" } +zksync_crypto = { path = "../crypto", version = "1.0" } +zksync_config = { path = "../config", version = "1.0" } serde = "1.0.90" serde_json = "1.0.0" diff --git a/core/lib/api_client/src/rest/v1/client.rs b/core/lib/api_client/src/rest/client.rs similarity index 81% rename from core/lib/api_client/src/rest/v1/client.rs rename to core/lib/api_client/src/rest/client.rs index 733934ef81..56400e5f75 100644 --- a/core/lib/api_client/src/rest/v1/client.rs +++ b/core/lib/api_client/src/rest/client.rs @@ -5,19 +5,6 @@ use reqwest::StatusCode; use serde::{de::DeserializeOwned, ser::Serialize}; use thiserror::Error; -// Public uses -pub use super::{ - accounts::{ - AccountInfo, AccountQuery, AccountReceipts, AccountState, DepositingBalances, - DepositingFunds, - }, - blocks::{BlockInfo, TransactionInfo}, - config::Contracts, - operations::{PriorityOpData, PriorityOpQuery, PriorityOpReceipt}, - tokens::TokenPriceKind, - transactions::{Receipt, TxData}, - Pagination, -}; // Local uses use super::error::ErrorBody; @@ -52,8 +39,6 @@ pub struct Client { url: String, } -const API_V1_SCOPE: &str = "/api/v1/"; - impl Client { /// Creates a new REST API client with the specified Url. pub fn new(url: String) -> Self { @@ -67,11 +52,6 @@ impl Client { [&self.url, scope, method].concat() } - /// Constructs GET request for the specified method. - pub(crate) fn get(&self, method: impl AsRef) -> ClientRequestBuilder { - self.get_with_scope(API_V1_SCOPE, method) - } - pub(crate) fn get_with_scope( &self, scope: impl AsRef, @@ -84,11 +64,6 @@ impl Client { } } - /// Constructs POST request for the specified method. - pub(crate) fn post(&self, method: impl AsRef) -> ClientRequestBuilder { - self.post_with_scope(API_V1_SCOPE, method) - } - pub(crate) fn post_with_scope( &self, scope: impl AsRef, diff --git a/core/lib/api_client/src/rest/v1/error.rs b/core/lib/api_client/src/rest/error.rs similarity index 100% rename from core/lib/api_client/src/rest/v1/error.rs rename to core/lib/api_client/src/rest/error.rs diff --git a/core/lib/api_client/src/rest/forced_exit_requests/mod.rs b/core/lib/api_client/src/rest/forced_exit_requests/mod.rs index eb38fb4c3f..d2add9ff2d 100644 --- a/core/lib/api_client/src/rest/forced_exit_requests/mod.rs +++ b/core/lib/api_client/src/rest/forced_exit_requests/mod.rs @@ -12,8 +12,7 @@ use zksync_utils::BigUintSerdeAsRadix10Str; use num::BigUint; // Local uses -use crate::rest::v1::Client; -use crate::rest::v1::ClientResult; +use crate::rest::client::{Client, Result as ClientResult}; // Data transfer objects. #[derive(Serialize, Deserialize, PartialEq, Debug)] diff --git a/core/lib/api_client/src/rest/mod.rs b/core/lib/api_client/src/rest/mod.rs index cf50baa86b..19e2508ac3 100644 --- a/core/lib/api_client/src/rest/mod.rs +++ b/core/lib/api_client/src/rest/mod.rs @@ -1,2 +1,4 @@ +pub mod client; +pub mod error; pub mod forced_exit_requests; -pub mod v1; +pub mod v02; diff --git a/core/lib/api_client/src/rest/v02/account.rs b/core/lib/api_client/src/rest/v02/account.rs new file mode 100644 index 0000000000..f62617dcc8 --- /dev/null +++ b/core/lib/api_client/src/rest/v02/account.rs @@ -0,0 +1,59 @@ +use crate::rest::client::{Client, Result}; + +use zksync_api_types::v02::{ + pagination::{ApiEither, PaginationQuery}, + Response, +}; +use zksync_types::{tx::TxHash, SerialId}; + +impl Client { + pub async fn account_info( + &self, + account_id_or_address: &str, + state_type: &str, + ) -> Result { + self.get_with_scope( + super::API_V02_SCOPE, + &format!("accounts/{}/{}", account_id_or_address, state_type), + ) + .send() + .await + } + + pub async fn account_full_info(&self, account_id_or_address: &str) -> Result { + self.get_with_scope( + super::API_V02_SCOPE, + &format!("accounts/{}", account_id_or_address), + ) + .send() + .await + } + + pub async fn account_txs( + &self, + pagination_query: &PaginationQuery>, + account_id_or_address: &str, + ) -> Result { + self.get_with_scope( + super::API_V02_SCOPE, + &format!("accounts/{}/transactions", account_id_or_address), + ) + .query(&pagination_query) + .send() + .await + } + + pub async fn account_pending_txs( + &self, + pagination_query: &PaginationQuery>, + account_id_or_address: &str, + ) -> Result { + self.get_with_scope( + super::API_V02_SCOPE, + &format!("accounts/{}/transactions/pending", account_id_or_address), + ) + .query(pagination_query) + .send() + .await + } +} diff --git a/core/lib/api_client/src/rest/v02/block.rs b/core/lib/api_client/src/rest/v02/block.rs new file mode 100644 index 0000000000..56ac513860 --- /dev/null +++ b/core/lib/api_client/src/rest/v02/block.rs @@ -0,0 +1,39 @@ +use crate::rest::client::{Client, Result}; + +use zksync_api_types::v02::{ + pagination::{ApiEither, PaginationQuery}, + Response, +}; +use zksync_types::{tx::TxHash, BlockNumber}; + +impl Client { + pub async fn block_by_position(&self, block_position: &str) -> Result { + self.get_with_scope(super::API_V02_SCOPE, &format!("blocks/{}", block_position)) + .send() + .await + } + + pub async fn block_transactions( + &self, + pagination_query: &PaginationQuery>, + block_position: &str, + ) -> Result { + self.get_with_scope( + super::API_V02_SCOPE, + &format!("blocks/{}/transactions", block_position), + ) + .query(&pagination_query) + .send() + .await + } + + pub async fn block_pagination( + &self, + pagination_query: &PaginationQuery>, + ) -> Result { + self.get_with_scope(super::API_V02_SCOPE, "blocks") + .query(pagination_query) + .send() + .await + } +} diff --git a/core/lib/api_client/src/rest/v02/config.rs b/core/lib/api_client/src/rest/v02/config.rs new file mode 100644 index 0000000000..64e31d817d --- /dev/null +++ b/core/lib/api_client/src/rest/v02/config.rs @@ -0,0 +1,10 @@ +use crate::rest::client::{Client, Result}; +use zksync_api_types::v02::Response; + +impl Client { + pub async fn config(&self) -> Result { + self.get_with_scope(super::API_V02_SCOPE, "config") + .send() + .await + } +} diff --git a/core/lib/api_client/src/rest/v02/fee.rs b/core/lib/api_client/src/rest/v02/fee.rs new file mode 100644 index 0000000000..650a9e3b4f --- /dev/null +++ b/core/lib/api_client/src/rest/v02/fee.rs @@ -0,0 +1,39 @@ +// Local uses +use crate::rest::client::{Client, Result}; +use zksync_api_types::v02::{ + fee::{ApiTxFeeTypes, BatchFeeRequest, TxFeeRequest, TxInBatchFeeRequest}, + Response, +}; +use zksync_types::{Address, TokenLike}; + +impl Client { + pub async fn get_txs_fee( + &self, + tx_type: ApiTxFeeTypes, + address: Address, + token_like: TokenLike, + ) -> Result { + self.post_with_scope(super::API_V02_SCOPE, "fee") + .body(&TxFeeRequest { + tx_type, + address, + token_like, + }) + .send() + .await + } + + pub async fn get_batch_fee( + &self, + transactions: Vec, + token_like: TokenLike, + ) -> Result { + self.post_with_scope(super::API_V02_SCOPE, "fee/batch") + .body(&BatchFeeRequest { + transactions, + token_like, + }) + .send() + .await + } +} diff --git a/core/lib/api_client/src/rest/v02/mod.rs b/core/lib/api_client/src/rest/v02/mod.rs new file mode 100644 index 0000000000..14f7deb4bc --- /dev/null +++ b/core/lib/api_client/src/rest/v02/mod.rs @@ -0,0 +1,9 @@ +pub mod account; +pub mod block; +pub mod config; +pub mod fee; +pub mod status; +pub mod token; +pub mod transaction; + +const API_V02_SCOPE: &str = "/api/v0.2/"; diff --git a/core/lib/api_client/src/rest/v02/status.rs b/core/lib/api_client/src/rest/v02/status.rs new file mode 100644 index 0000000000..8f5aa57b93 --- /dev/null +++ b/core/lib/api_client/src/rest/v02/status.rs @@ -0,0 +1,10 @@ +use crate::rest::client::{Client, Result}; +use zksync_api_types::v02::Response; + +impl Client { + pub async fn status(&self) -> Result { + self.get_with_scope(super::API_V02_SCOPE, "networkStatus") + .send() + .await + } +} diff --git a/core/lib/api_client/src/rest/v02/token.rs b/core/lib/api_client/src/rest/v02/token.rs new file mode 100644 index 0000000000..15a91c986d --- /dev/null +++ b/core/lib/api_client/src/rest/v02/token.rs @@ -0,0 +1,39 @@ +use crate::rest::client::{Client, Result}; +use zksync_api_types::v02::{ + pagination::{ApiEither, PaginationQuery}, + Response, +}; +use zksync_types::{TokenId, TokenLike}; + +impl Client { + pub async fn token_pagination( + &self, + pagination_query: &PaginationQuery>, + ) -> Result { + self.get_with_scope(super::API_V02_SCOPE, "tokens") + .query(&pagination_query) + .send() + .await + } + + pub async fn token_by_id(&self, token: &TokenLike) -> Result { + self.get_with_scope(super::API_V02_SCOPE, &format!("tokens/{}", token)) + .send() + .await + } + + pub async fn token_price(&self, token: &TokenLike, token_id_or_usd: &str) -> Result { + self.get_with_scope( + super::API_V02_SCOPE, + &format!("tokens/{}/priceIn/{}", token, token_id_or_usd), + ) + .send() + .await + } + + pub async fn nft_by_id(&self, id: TokenId) -> Result { + self.get_with_scope(super::API_V02_SCOPE, &format!("tokens/nft/{}", id)) + .send() + .await + } +} diff --git a/core/lib/api_client/src/rest/v02/transaction.rs b/core/lib/api_client/src/rest/v02/transaction.rs new file mode 100644 index 0000000000..4590783cc7 --- /dev/null +++ b/core/lib/api_client/src/rest/v02/transaction.rs @@ -0,0 +1,57 @@ +use crate::rest::client::{Client, Result}; +use zksync_api_types::{ + v02::{transaction::IncomingTxBatch, Response}, + TxWithSignature, +}; +use zksync_types::tx::{EthBatchSignatures, TxEthSignatureVariant, TxHash, ZkSyncTx}; + +impl Client { + pub async fn submit_tx( + &self, + tx: ZkSyncTx, + signature: TxEthSignatureVariant, + ) -> Result { + self.post_with_scope(super::API_V02_SCOPE, "transactions") + .body(&TxWithSignature { tx, signature }) + .send() + .await + } + + pub async fn submit_batch( + &self, + txs: Vec, + signature: Option, + ) -> Result { + self.post_with_scope(super::API_V02_SCOPE, "transactions/batches") + .body(&IncomingTxBatch { txs, signature }) + .send() + .await + } + + pub async fn tx_status(&self, tx_hash: TxHash) -> Result { + self.get_with_scope( + super::API_V02_SCOPE, + &format!("transactions/{}", tx_hash.to_string()), + ) + .send() + .await + } + + pub async fn tx_data(&self, tx_hash: TxHash) -> Result { + self.get_with_scope( + super::API_V02_SCOPE, + &format!("transactions/{}/data", tx_hash.to_string()), + ) + .send() + .await + } + + pub async fn get_batch(&self, batch_hash: TxHash) -> Result { + self.get_with_scope( + super::API_V02_SCOPE, + &format!("transactions/batches/{}", batch_hash.to_string()), + ) + .send() + .await + } +} diff --git a/core/lib/api_client/src/rest/v1/accounts.rs b/core/lib/api_client/src/rest/v1/accounts.rs index 5a2137b80f..e69de29bb2 100644 --- a/core/lib/api_client/src/rest/v1/accounts.rs +++ b/core/lib/api_client/src/rest/v1/accounts.rs @@ -1,365 +0,0 @@ -//! Accounts API client implementation - -// Built-in uses -use std::{ - collections::{BTreeMap, HashMap}, - fmt::Display, - str::FromStr, -}; - -// External uses -use serde::{Deserialize, Serialize}; - -// Workspace uses -use zksync_types::{ - tx::TxHash, AccountId, Address, BlockNumber, Nonce, PriorityOp, PubKeyHash, TokenId, H256, -}; -use zksync_utils::{remove_prefix, BigUintSerdeWrapper}; - -// Local uses -use super::{ - client::{Client, ClientError}, - transactions::Receipt, -}; - -// Data transfer objects - -/// Account search query. -#[derive(Debug, Serialize, Copy, Clone, PartialEq, Eq, Ord, PartialOrd, Hash)] -#[serde(untagged, rename_all = "camelCase")] -pub enum AccountQuery { - /// Search account by ID. - Id(AccountId), - /// Search account by address. - Address(Address), -} - -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Default)] -#[serde(rename_all = "camelCase")] -pub struct NFT { - id: TokenId, - content_hash: H256, - creator_id: AccountId, - creator_address: Address, - serial_id: u32, - address: Address, - symbol: String, -} - -impl From for NFT { - fn from(val: zksync_types::NFT) -> Self { - Self { - id: val.id, - content_hash: val.content_hash, - creator_id: val.creator_id, - creator_address: val.creator_address, - serial_id: val.serial_id, - address: val.address, - symbol: val.symbol, - } - } -} - -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Default)] -#[serde(rename_all = "camelCase")] -pub struct ApiNFT { - id: TokenId, - content_hash: H256, - creator_id: AccountId, - creator_address: Address, - serial_id: u32, - address: Address, - symbol: String, - current_factory: Address, - withdrawn_factory: Option
, -} - -impl From for ApiNFT { - fn from(val: zksync_types::tokens::ApiNFT) -> Self { - Self { - id: val.id, - content_hash: val.content_hash, - creator_id: val.creator_id, - creator_address: val.creator_address, - serial_id: val.serial_id, - address: val.address, - symbol: val.symbol, - current_factory: val.current_factory, - withdrawn_factory: val.withdrawn_factory, - } - } -} - -/// Account state at the time of the zkSync block commit or verification. -/// This means that each account has various states. -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Default)] -#[serde(rename_all = "camelCase")] -pub struct AccountState { - /// Account wallet balances. - pub balances: BTreeMap, - pub nfts: HashMap, - pub minted_nfts: HashMap, - /// zkSync account nonce. - pub nonce: Nonce, - /// Hash of the account's owner public key. - pub pub_key_hash: PubKeyHash, -} - -/// Pending amount for the deposit. -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Default)] -#[serde(rename_all = "camelCase")] -pub struct DepositingFunds { - /// Amount in wei. - pub amount: BigUintSerdeWrapper, - /// The greatest block number among all the deposits for a certain token. - pub expected_accept_block: BlockNumber, -} - -/// Depositing balances -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Default)] -#[serde(rename_all = "camelCase")] -pub struct DepositingBalances { - /// The amount of deposits by token symbols. - pub balances: BTreeMap, -} - -/// Account summary info in the zkSync network. -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)] -#[serde(rename_all = "camelCase")] -pub struct AccountInfo { - /// Account address. - pub address: Address, - /// Unique identifier of the account in the zkSync network. - pub id: AccountId, - /// Account state in accordance with the actual committed block. - pub committed: AccountState, - /// Account state in accordance with the actual verified block. - pub verified: AccountState, - /// Unconfirmed account deposits. - pub depositing: DepositingBalances, -} - -/// The unique transaction location, which is describes by a pair: -/// (block number, transaction index in it). -#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq)] -#[serde(rename_all = "camelCase")] -pub struct TxLocation { - /// The block containing the transaction. - pub block: BlockNumber, - /// Transaction index in block. Absent for rejected transactions. - pub index: Option, -} - -/// Account receipts search options. -#[derive(Debug, Clone, Copy, PartialEq)] -pub enum AccountReceipts { - /// Search for older receipts starting from a given location. - Older(TxLocation), - /// Search for newer receipts starting from a given location. - Newer(TxLocation), - /// Search for latest receipts. - Latest, -} - -impl AccountReceipts { - pub fn newer_than(block: BlockNumber, index: Option) -> Self { - Self::Newer(TxLocation { block, index }) - } - - pub fn older_than(block: BlockNumber, index: Option) -> Self { - Self::Older(TxLocation { block, index }) - } -} - -/// Direction to perform search of transactions to. -#[derive(Debug, Deserialize, Serialize, Copy, Clone, PartialEq)] -#[serde(rename_all = "camelCase")] -pub enum SearchDirection { - /// Find transactions older than specified one. - Older, - /// Find transactions newer than specified one. - Newer, -} - -#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq)] -#[serde(rename_all = "camelCase")] -pub struct AccountReceiptsQuery { - pub block: Option, - pub index: Option, - pub direction: Option, - pub limit: BlockNumber, -} - -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)] -#[serde(rename_all = "camelCase")] -pub struct AccountTxReceipt { - pub index: Option, - #[serde(flatten)] - pub receipt: Receipt, - pub hash: TxHash, -} - -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)] -#[serde(rename_all = "camelCase")] -pub struct AccountOpReceipt { - pub index: u32, - #[serde(flatten)] - pub receipt: Receipt, - pub hash: H256, -} - -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)] -#[serde(rename_all = "camelCase")] -pub struct PendingAccountOpReceipt { - pub eth_block: u64, - pub hash: H256, -} - -impl From for AccountQuery { - fn from(v: AccountId) -> Self { - Self::Id(v) - } -} - -impl From
for AccountQuery { - fn from(v: Address) -> Self { - Self::Address(v) - } -} - -impl Display for AccountQuery { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - AccountQuery::Id(id) => id.fmt(f), - AccountQuery::Address(address) => write!(f, "{:x}", address), - } - } -} - -impl FromStr for AccountQuery { - type Err = String; - - fn from_str(s: &str) -> Result { - if let Ok(id) = s.parse() { - return Ok(Self::Id(AccountId(id))); - } - - let s = remove_prefix(s); - s.parse().map(Self::Address).map_err(|e| e.to_string()) - } -} - -impl Display for SearchDirection { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - SearchDirection::Older => "older".fmt(f), - SearchDirection::Newer => "newer".fmt(f), - } - } -} - -impl FromStr for SearchDirection { - type Err = String; - - fn from_str(s: &str) -> Result { - match s { - "older" => Ok(Self::Older), - "newer" => Ok(Self::Newer), - other => Err(format!("Unknown search direction: {}", other)), - } - } -} - -impl AccountReceiptsQuery { - pub fn new(from: AccountReceipts, limit: u32) -> Self { - match from { - AccountReceipts::Older(location) => { - Self::from_parts(location, SearchDirection::Older, limit) - } - - AccountReceipts::Newer(location) => { - Self::from_parts(location, SearchDirection::Newer, limit) - } - - AccountReceipts::Latest => Self::from_parts( - TxLocation { - // TODO: use `zksync_storage::MAX_BLOCK_NUMBER` instead - block: BlockNumber(u32::MAX), - index: None, - }, - SearchDirection::Older, - limit, - ), - } - } - - fn from_parts(location: TxLocation, direction: SearchDirection, limit: u32) -> Self { - Self { - direction: Some(direction), - block: Some(location.block), - index: location.index, - limit: BlockNumber(limit), - } - } -} - -impl PendingAccountOpReceipt { - pub fn from_priority_op(op: PriorityOp) -> Self { - Self { - eth_block: op.eth_block, - hash: op.eth_hash, - } - } -} - -/// Accounts API part. -impl Client { - /// Gets account information - pub async fn account_info( - &self, - account: impl Into, - ) -> Result, ClientError> { - let account = account.into(); - - self.get(&format!("accounts/{}", account)).send().await - } - - pub async fn account_tx_receipts( - &self, - account: impl Into, - from: AccountReceipts, - limit: u32, - ) -> Result, ClientError> { - let account = account.into(); - - self.get(&format!("accounts/{}/transactions/receipts", account)) - .query(&AccountReceiptsQuery::new(from, limit)) - .send() - .await - } - - pub async fn account_op_receipts( - &self, - account: impl Into, - from: AccountReceipts, - limit: u32, - ) -> Result, ClientError> { - let account = account.into(); - - self.get(&format!("accounts/{}/operations/receipts", account)) - .query(&AccountReceiptsQuery::new(from, limit)) - .send() - .await - } - - pub async fn account_pending_ops( - &self, - account: impl Into, - ) -> Result, ClientError> { - let account = account.into(); - - self.get(&format!("accounts/{}/operations/pending", account)) - .send() - .await - } -} diff --git a/core/lib/api_client/src/rest/v1/blocks.rs b/core/lib/api_client/src/rest/v1/blocks.rs deleted file mode 100644 index 08dadca155..0000000000 --- a/core/lib/api_client/src/rest/v1/blocks.rs +++ /dev/null @@ -1,77 +0,0 @@ -//! Blocks part of API implementation. - -// Built-in uses - -// External uses -use chrono::{DateTime, Utc}; -use serde::{Deserialize, Serialize}; -use serde_json::Value; - -// Workspace uses -use zksync_crypto::{serialization::FrSerde, Fr}; -use zksync_types::{tx::TxHash, BlockNumber}; - -// Local uses -use super::{ - client::{self, Client}, - Pagination, -}; - -// Data transfer objects. - -#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)] -#[serde(rename_all = "camelCase")] -pub struct BlockInfo { - pub block_number: BlockNumber, - #[serde(with = "FrSerde")] - pub new_state_root: Fr, - pub block_size: u64, - pub commit_tx_hash: Option, - pub verify_tx_hash: Option, - pub committed_at: DateTime, - pub verified_at: Option>, -} - -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -#[serde(rename_all = "camelCase")] -pub struct TransactionInfo { - pub tx_hash: TxHash, - pub block_number: BlockNumber, - pub op: Value, - pub success: Option, - pub fail_reason: Option, - pub created_at: DateTime, -} - -/// Blocks API part. -impl Client { - /// Returns information about block with the specified number or null if block doesn't exist. - pub async fn block_by_id( - &self, - block_number: BlockNumber, - ) -> client::Result> { - self.get(&format!("blocks/{}", *block_number)).send().await - } - - /// Returns information about transactions of the block with the specified number. - pub async fn block_transactions( - &self, - block_number: BlockNumber, - ) -> client::Result> { - self.get(&format!("blocks/{}/transactions", *block_number)) - .send() - .await - } - - /// Returns information about several blocks in a range. - pub async fn blocks_range( - &self, - from: Pagination, - limit: u32, - ) -> client::Result> { - self.get("blocks") - .query(&from.into_query(limit)) - .send() - .await - } -} diff --git a/core/lib/api_client/src/rest/v1/config.rs b/core/lib/api_client/src/rest/v1/config.rs deleted file mode 100644 index 1bd60f91cb..0000000000 --- a/core/lib/api_client/src/rest/v1/config.rs +++ /dev/null @@ -1,35 +0,0 @@ -//! Config part of API implementation. - -// Built-in uses - -// External uses -use serde::{Deserialize, Serialize}; - -// Workspace uses -use zksync_types::Address; - -// Local uses -use super::client::{self, Client}; - -// Data transfer objects. - -#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)] -#[serde(rename_all = "camelCase")] -pub struct Contracts { - pub contract: Address, -} - -/// Configuration API part. -impl Client { - pub async fn contracts(&self) -> client::Result { - self.get("config/contracts").send().await - } - - pub async fn deposit_confirmations(&self) -> client::Result { - self.get("config/deposit_confirmations").send().await - } - - pub async fn network(&self) -> client::Result { - self.get("config/network").send().await - } -} diff --git a/core/lib/api_client/src/rest/v1/mod.rs b/core/lib/api_client/src/rest/v1/mod.rs deleted file mode 100644 index eeb6b01ebf..0000000000 --- a/core/lib/api_client/src/rest/v1/mod.rs +++ /dev/null @@ -1,180 +0,0 @@ -//! First stable API implementation client. - -// External uses -use serde::{Deserialize, Serialize}; - -// Workspace uses -use zksync_types::BlockNumber; - -// Public uses -pub use self::{ - blocks::{BlockInfo, TransactionInfo}, - client::{Client, ClientError, Result as ClientResult}, - config::Contracts, - error::ErrorBody, - operations::{PriorityOpData, PriorityOpQuery, PriorityOpQueryError, PriorityOpReceipt}, - search::BlockSearchQuery, - tokens::{TokenPriceKind, TokenPriceQuery}, - transactions::{ - FastProcessingQuery, IncomingTx, IncomingTxBatch, IncomingTxBatchForFee, IncomingTxForFee, - Receipt, TxData, - }, -}; - -// Local uses -pub mod accounts; -mod blocks; -mod client; -mod config; -mod error; -mod operations; -mod search; -mod tokens; -mod transactions; - -/// Maximum limit value in the requests. -pub const MAX_LIMIT: u32 = 100; - -/// Internal pagination query representation in according to spec: -/// -/// `?limit=..&[before={id}|after={id}]` where: -/// -/// - `limit` parameter is required -/// - if `before=#id` is set; returns `limit` objects before object with `id` (not including `id`) -/// - if `after=#id` is set; returns `limit` objects after object with `id` (not including `id`) -/// - if neither is set; returns last `limit` objects -#[derive(Debug, Serialize, Deserialize, Copy, Clone, PartialEq, Default)] -pub struct PaginationQuery { - before: Option, - after: Option, - limit: u32, -} - -/// Pagination request parameter. -/// -/// Used together with the limit parameter to perform pagination. -#[derive(Debug, Serialize, Deserialize, Copy, Clone, PartialEq)] -pub enum Pagination { - /// Request to return some items before specified (not including itself). - Before(BlockNumber), - /// Request to return some items after specified (not including itself) - After(BlockNumber), - /// Request to return some last items. - Last, -} - -#[derive(Debug)] -pub struct PaginationQueryError { - pub detail: String, -} - -impl PaginationQueryError { - fn with_detail(detail: String) -> Self { - Self { detail } - } -} - -impl PaginationQuery { - /// Parses the original query into a pair `(pagination, limit)`. - pub fn into_inner(self) -> Result<(Pagination, u32), PaginationQueryError> { - let (pagination, limit) = match self { - Self { - before: Some(before), - after: None, - limit, - } => Ok((Pagination::Before(before), limit)), - - Self { - before: None, - after: Some(after), - limit, - } => Ok((Pagination::After(after), limit)), - - Self { - before: None, - after: None, - limit, - } => Ok((Pagination::Last, limit)), - - _ => Err(PaginationQueryError::with_detail( - "Pagination query contains both `before` and `after` values.".into(), - )), - }?; - - if limit == 0 { - return Err(PaginationQueryError::with_detail( - "Limit should be greater than zero".into(), - )); - } - - if limit > MAX_LIMIT { - return Err(PaginationQueryError::with_detail(format!( - "Limit should be lower than {}", - MAX_LIMIT - ))); - } - - Ok((pagination, limit)) - } -} - -impl Pagination { - /// Converts `(pagination, limit)` pair into the `(max, limit)` pair to perform database queries. - /// - /// # Panics - /// - /// - if limit is zero. - pub fn into_max(self, limit: u32) -> Result, PaginationQueryError> { - assert!(limit > 0, "Limit should be greater than zero"); - - match self { - Pagination::Before(before) => { - if *before < 1 { - return Err(PaginationQueryError::with_detail( - "Before should be greater than zero".into(), - )); - } - - Ok(Some(BlockNumber(*before - 1))) - } - Pagination::After(after) => Ok(Some(BlockNumber(*after + limit + 1))), - Pagination::Last => Ok(None), - } - } - - /// Converts `(pagination, limit)` pair into the query. - fn into_query(self, limit: u32) -> PaginationQuery { - match self { - Pagination::Before(before) => PaginationQuery { - before: Some(before), - limit, - ..PaginationQuery::default() - }, - Pagination::After(after) => PaginationQuery { - after: Some(after), - limit, - ..PaginationQuery::default() - }, - Pagination::Last => PaginationQuery { - limit, - ..PaginationQuery::default() - }, - } - } -} - -#[test] -fn pagination_before_max_limit() { - let pagination = Pagination::Before(BlockNumber(10)); - - let max = pagination.into_max(10).unwrap(); - assert_eq!(max, Some(BlockNumber(9))) -} - -#[test] -fn pagination_after_max_limit() { - let pagination = Pagination::After(BlockNumber(10)); - - let max = pagination.into_max(10).unwrap(); - assert_eq!(max, Some(BlockNumber(21))) -} diff --git a/core/lib/api_client/src/rest/v1/operations.rs b/core/lib/api_client/src/rest/v1/operations.rs deleted file mode 100644 index 3db767fa7b..0000000000 --- a/core/lib/api_client/src/rest/v1/operations.rs +++ /dev/null @@ -1,123 +0,0 @@ -//! Operations part of API implementation. - -// Built-in uses -use std::{fmt::Display, str::FromStr}; - -// External uses -use serde::{Deserialize, Serialize}; - -// Local uses -use super::{ - client::{Client, ClientError}, - transactions::Receipt, -}; - -// Workspace uses -use zksync_types::{ZkSyncOp, H256}; - -// Data transfer objects. - -/// Priority op search query. -#[derive(Debug, Serialize, Copy, Clone, PartialEq, Eq, Ord, PartialOrd, Hash)] -#[serde(untagged, rename_all = "camelCase")] -pub enum PriorityOpQuery { - /// Search priority operation by serial ID. - Id(u64), - /// Search priority operation by hash. - Hash(H256), -} - -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)] -#[serde(rename_all = "camelCase")] -pub struct PriorityOpReceipt { - #[serde(flatten)] - pub status: Receipt, - pub index: Option, -} - -#[derive(Debug, Deserialize, Serialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct PriorityOpData { - pub data: ZkSyncOp, - pub eth_hash: H256, - pub serial_id: u64, -} - -impl From for PriorityOpQuery { - fn from(v: u64) -> Self { - Self::Id(v) - } -} - -impl From for PriorityOpQuery { - fn from(v: H256) -> Self { - Self::Hash(v) - } -} - -impl Display for PriorityOpQuery { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::Id(id) => id.fmt(f), - Self::Hash(hash) => write!(f, "{:x}", hash), - } - } -} - -impl FromStr for PriorityOpQuery { - type Err = String; - - fn from_str(s: &str) -> Result { - if let Ok(id) = s.parse::() { - return Ok(Self::Id(id)); - } - - s.parse::().map(Self::Hash).map_err(|e| e.to_string()) - } -} - -#[derive(Debug)] -pub struct PriorityOpQueryError { - pub detail: String, -} - -impl PriorityOpQueryError { - fn with_detail(detail: String) -> Self { - Self { detail } - } -} - -impl PriorityOpQuery { - /// Additional parser because actix-web doesn't understand enums in path extractor. - pub fn from_path(path: String) -> Result { - path.parse().map_err(|err| { - PriorityOpQueryError::with_detail(format!( - "Must be specified either a serial ID or a priority operation hash: {}", - err - )) - }) - } -} - -/// Operations API part. -impl Client { - /// Gets priority operation receipt. - pub async fn priority_op( - &self, - query: impl Into, - ) -> Result, ClientError> { - self.get(&format!("operations/{}", query.into())) - .send() - .await - } - - /// Gets priority operation receipt. - pub async fn priority_op_data( - &self, - query: impl Into, - ) -> Result, ClientError> { - self.get(&format!("operations/{}/data", query.into())) - .send() - .await - } -} diff --git a/core/lib/api_client/src/rest/v1/search.rs b/core/lib/api_client/src/rest/v1/search.rs deleted file mode 100644 index 7804b76911..0000000000 --- a/core/lib/api_client/src/rest/v1/search.rs +++ /dev/null @@ -1,67 +0,0 @@ -//! Search part of API implementation. - -// Built-in uses - -// External uses -use serde::{Deserialize, Serialize}; - -// Workspace uses -use zksync_crypto::{convert::FeConvert, Fr}; -use zksync_types::{tx::TxHash, BlockNumber}; - -// Local uses -use super::{ - blocks::BlockInfo, - client::{self, Client}, -}; - -// Data transfer objects. - -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)] -#[serde(rename_all = "camelCase")] -pub struct BlockSearchQuery { - pub query: String, -} - -impl From for BlockSearchQuery { - /// Convert the block number into the search query. - fn from(inner: BlockNumber) -> Self { - Self { - query: inner.to_string(), - } - } -} - -impl From for BlockSearchQuery { - /// Converts the state root hash of the block into the search query. - fn from(inner: Fr) -> Self { - Self { - query: inner.to_hex(), - } - } -} - -impl From for BlockSearchQuery { - /// Converts the commit/verify Ethereum transaction hash into the search query. - fn from(inner: TxHash) -> Self { - Self { - // Serialize without prefix. - query: hex::encode(inner), - } - } -} - -/// Search API part. -impl Client { - /// Performs a block search with an uncertain query, which can be either of: - /// - /// - Hash of commit/verify Ethereum transaction for the block. - /// - The state root hash of the block. - /// - The number of the block. - pub async fn search_block( - &self, - query: impl Into, - ) -> client::Result> { - self.get("search").query(&query.into()).send().await - } -} diff --git a/core/lib/api_client/src/rest/v1/tokens.rs b/core/lib/api_client/src/rest/v1/tokens.rs deleted file mode 100644 index a897c52db1..0000000000 --- a/core/lib/api_client/src/rest/v1/tokens.rs +++ /dev/null @@ -1,51 +0,0 @@ -//! Tokens part of API implementation. - -// Built-in uses - -// External uses -use bigdecimal::BigDecimal; -use serde::{Deserialize, Serialize}; - -// Workspace uses -use zksync_types::{Token, TokenLike}; - -// Local uses -use super::client::{self, Client}; - -// Data transfer objects. - -#[derive(Debug, Deserialize, Serialize, Copy, Clone, PartialEq)] -#[serde(rename_all = "camelCase")] -pub enum TokenPriceKind { - Currency, - Token, -} - -#[derive(Debug, Deserialize, Serialize, Copy, Clone, PartialEq)] -#[serde(rename_all = "camelCase")] -pub struct TokenPriceQuery { - #[serde(rename = "in")] - pub kind: TokenPriceKind, -} - -/// Tokens API part. -impl Client { - pub async fn tokens(&self) -> client::Result> { - self.get("tokens").send().await - } - - pub async fn token_by_id(&self, token: &TokenLike) -> client::Result> { - self.get(&format!("tokens/{}", token)).send().await - } - - pub async fn token_price( - &self, - token: &TokenLike, - kind: TokenPriceKind, - ) -> client::Result> { - self.get(&format!("tokens/{}/price", token)) - .query(&TokenPriceQuery { kind }) - .send() - .await - } -} diff --git a/core/lib/api_client/src/rest/v1/transactions.rs b/core/lib/api_client/src/rest/v1/transactions.rs index 43bfe063a2..e69de29bb2 100644 --- a/core/lib/api_client/src/rest/v1/transactions.rs +++ b/core/lib/api_client/src/rest/v1/transactions.rs @@ -1,210 +0,0 @@ -//! Transactions part of API implementation. - -// Built-in uses - -// External uses -use serde::{Deserialize, Serialize}; - -// Workspace uses -use zksync_types::{ - tx::{EthBatchSignatures, EthSignData, TxEthSignatureVariant, TxHash}, - Address, BatchFee, BlockNumber, Fee, SignedZkSyncTx, TokenLike, TxFeeTypes, ZkSyncTx, -}; - -// Local uses -use super::{client::Client, client::ClientError, Pagination}; - -// Data transfer objects. - -#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Copy)] -#[serde(rename_all = "camelCase")] -pub struct FastProcessingQuery { - pub fast_processing: Option, -} - -/// This structure has the same layout as [`SignedZkSyncTx`], -/// the only difference is that it uses "camelCase" for serialization. -/// -/// [`SignedZkSyncTx`]: zksync_types::SignedZkSyncTx -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct TxData { - /// Underlying zkSync transaction. - pub tx: ZkSyncTx, - /// Tuple of the Ethereum signature and the message - /// which user should have signed with their private key. - /// Can be `None` if the Ethereum signature is not required. - pub eth_sign_data: Option, -} - -/// This struct has the same layout as `SignedZkSyncTx`, expect that it used -/// `TxEthSignature` directly instead of `EthSignData`. -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct IncomingTx { - pub tx: ZkSyncTx, - pub signature: TxEthSignatureVariant, -} - -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct IncomingTxForFee { - pub tx_type: TxFeeTypes, - pub address: Address, - pub token_like: TokenLike, -} - -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct IncomingTxBatchForFee { - pub tx_types: Vec, - pub addresses: Vec
, - pub token_like: TokenLike, -} - -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct IncomingTxBatch { - pub txs: Vec, - pub signature: EthBatchSignatures, -} - -/// Transaction (or priority operation) receipt. -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)] -#[serde(tag = "status", rename_all = "camelCase")] -pub enum Receipt { - /// The transaction is awaiting execution in the memorypool. - Pending, - /// The transaction has been executed, but the block containing this transaction has not - /// yet been committed. - Executed, - /// The block which contains this transaction has been committed. - Committed { block: BlockNumber }, - /// The block which contains this transaction has been verified. - Verified { block: BlockNumber }, - /// The transaction has been rejected for some reasons. - Rejected { reason: Option }, -} - -impl From for SignedZkSyncTx { - fn from(inner: TxData) -> Self { - Self { - tx: inner.tx, - eth_sign_data: inner.eth_sign_data, - } - } -} - -impl From for TxData { - fn from(inner: SignedZkSyncTx) -> Self { - Self { - tx: inner.tx, - eth_sign_data: inner.eth_sign_data, - } - } -} - -/// Transactions API part. -impl Client { - /// Sends a new transaction to the memory pool. - pub async fn submit_tx( - &self, - tx: ZkSyncTx, - signature: TxEthSignatureVariant, - fast_processing: Option, - ) -> Result { - self.post("transactions/submit") - .query(&FastProcessingQuery { fast_processing }) - .body(&IncomingTx { tx, signature }) - .send() - .await - } - - /// Get fee for single transaction. - pub async fn get_txs_fee( - &self, - tx_type: TxFeeTypes, - address: Address, - token_like: TokenLike, - ) -> Result { - self.post("transactions/fee") - .body(&IncomingTxForFee { - tx_type, - address, - token_like, - }) - .send() - .await - } - - /// Get txs fee for batch. - pub async fn get_batched_txs_fee( - &self, - tx_types: Vec, - addresses: Vec
, - token_like: TokenLike, - ) -> Result { - self.post("transactions/fee/batch") - .body(&IncomingTxBatchForFee { - tx_types, - addresses, - token_like, - }) - .send() - .await - } - - /// Sends a new transactions batch to the memory pool. - pub async fn submit_tx_batch( - &self, - txs: Vec, - signature: EthBatchSignatures, - ) -> Result, ClientError> { - self.post("transactions/submit/batch") - .body(&IncomingTxBatch { txs, signature }) - .send() - .await - } - - /// Gets actual transaction receipt. - pub async fn tx_status(&self, tx_hash: TxHash) -> Result, ClientError> { - self.get(&format!("transactions/{}", tx_hash.to_string())) - .send() - .await - } - - /// Gets transaction content. - pub async fn tx_data(&self, tx_hash: TxHash) -> Result, ClientError> { - self.get(&format!("transactions/{}/data", tx_hash.to_string())) - .send() - .await - } - - /// Gets transaction receipt by ID. - pub async fn tx_receipt_by_id( - &self, - tx_hash: TxHash, - receipt_id: u32, - ) -> Result, ClientError> { - self.get(&format!( - "transactions/{}/receipts/{}", - tx_hash.to_string(), - receipt_id - )) - .send() - .await - } - - /// Gets transaction receipts. - pub async fn tx_receipts( - &self, - tx_hash: TxHash, - from: Pagination, - limit: u32, - ) -> Result, ClientError> { - self.get(&format!("transactions/{}/receipts", tx_hash.to_string())) - .query(&from.into_query(limit)) - .send() - .await - } -} diff --git a/core/lib/api_types/Cargo.toml b/core/lib/api_types/Cargo.toml new file mode 100644 index 0000000000..801a473ebb --- /dev/null +++ b/core/lib/api_types/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "zksync_api_types" +version = "1.0.0" +edition = "2018" +authors = ["The Matter Labs Team "] +homepage = "https://zksync.io/" +repository = "https://github.com/matter-labs/zksync" +license = "Apache-2.0" +keywords = ["blockchain", "zksync"] +categories = ["cryptography"] + +[dependencies] +zksync_types = { path = "../types", version = "1.0" } +zksync_utils = { path = "../utils", version = "1.0" } +zksync_crypto = { path = "../crypto", version = "1.0" } +zksync_config = { path = "../config", version = "1.0" } + +serde = "1.0" +serde_json = "1.0" +chrono = { version = "0.4", features = ["serde", "rustc-serialize"] } +hex = "0.4" +num = "0.3" +bigdecimal = { version = "0.2.0", features = ["serde"]} +either = "1.6.1" +thiserror = "1.0" diff --git a/core/lib/api_types/src/lib.rs b/core/lib/api_types/src/lib.rs new file mode 100644 index 0000000000..8abc9bf279 --- /dev/null +++ b/core/lib/api_types/src/lib.rs @@ -0,0 +1,27 @@ +pub use either::Either; +use serde::{Deserialize, Serialize}; +use zksync_types::{ + tx::{TxEthSignatureVariant, TxHash}, + ZkSyncTx, H256, +}; + +pub mod v02; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct TxWithSignature { + pub tx: ZkSyncTx, + #[serde(default)] + pub signature: TxEthSignatureVariant, +} + +/// Combined identifier of the priority operations for the lookup. +#[derive(Debug, Serialize, Deserialize)] +pub enum PriorityOpLookupQuery { + /// Query priority operation using zkSync hash, which is calculated based on the priority operation metadata. + BySyncHash(TxHash), + /// Query priority operation using the corresponding Ethereum transaction hash. + ByEthHash(H256), + /// Query priority operation using any of both hashes. + ByAnyHash(TxHash), +} diff --git a/core/lib/api_types/src/v02/account.rs b/core/lib/api_types/src/v02/account.rs new file mode 100644 index 0000000000..dfb040d207 --- /dev/null +++ b/core/lib/api_types/src/v02/account.rs @@ -0,0 +1,42 @@ +use std::collections::BTreeMap; + +use serde::{Deserialize, Serialize}; + +use zksync_types::{AccountId, Address, BlockNumber, Nonce, PubKeyHash, TokenId}; +use zksync_utils::BigUintSerdeWrapper; + +use super::token::NFT; + +#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)] +#[serde(rename_all = "camelCase")] +pub struct AccountState { + pub committed: Option, + pub finalized: Option, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)] +#[serde(rename_all = "camelCase")] +pub struct Account { + pub account_id: AccountId, + pub address: Address, + pub nonce: Nonce, + pub pub_key_hash: PubKeyHash, + pub last_update_in_block: BlockNumber, + pub balances: BTreeMap, + pub nfts: BTreeMap, + pub minted_nfts: BTreeMap, + pub account_type: Option, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)] +#[serde(rename_all = "camelCase")] +pub enum AccountAddressOrId { + Address(Address), + Id(AccountId), +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)] +pub enum EthAccountType { + Owned, + CREATE2, +} diff --git a/core/lib/api_types/src/v02/block.rs b/core/lib/api_types/src/v02/block.rs new file mode 100644 index 0000000000..2b38b75307 --- /dev/null +++ b/core/lib/api_types/src/v02/block.rs @@ -0,0 +1,25 @@ +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; +use zksync_crypto::{serialization::FrSerde, Fr}; +use zksync_types::{BlockNumber, H256}; + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Copy)] +#[serde(rename_all = "camelCase")] +pub enum BlockStatus { + Committed, + Finalized, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)] +#[serde(rename_all = "camelCase")] +pub struct BlockInfo { + pub block_number: BlockNumber, + #[serde(with = "FrSerde")] + pub new_state_root: Fr, + pub block_size: u64, + pub commit_tx_hash: Option, + pub verify_tx_hash: Option, + pub committed_at: DateTime, + pub finalized_at: Option>, + pub status: BlockStatus, +} diff --git a/core/lib/api_types/src/v02/fee.rs b/core/lib/api_types/src/v02/fee.rs new file mode 100644 index 0000000000..6d50666d81 --- /dev/null +++ b/core/lib/api_types/src/v02/fee.rs @@ -0,0 +1,94 @@ +use num::BigUint; +use serde::{Deserialize, Serialize}; +use zksync_types::{tokens::ChangePubKeyFeeTypeArg, Address, BatchFee, Fee, TokenLike, TxFeeTypes}; +use zksync_utils::BigUintSerdeAsRadix10Str; + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +pub struct ApiFee { + #[serde(with = "BigUintSerdeAsRadix10Str")] + pub gas_fee: BigUint, + #[serde(with = "BigUintSerdeAsRadix10Str")] + pub zkp_fee: BigUint, + #[serde(with = "BigUintSerdeAsRadix10Str")] + pub total_fee: BigUint, +} + +impl From for ApiFee { + fn from(fee: Fee) -> Self { + ApiFee { + gas_fee: fee.gas_fee, + zkp_fee: fee.zkp_fee, + total_fee: fee.total_fee, + } + } +} + +impl From for ApiFee { + fn from(fee: BatchFee) -> Self { + ApiFee { + gas_fee: fee.gas_fee, + zkp_fee: fee.zkp_fee, + total_fee: fee.total_fee, + } + } +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub enum ApiTxFeeTypes { + /// Fee for the `Withdraw` transaction. + Withdraw, + /// Fee for the `Withdraw` operation that requires fast processing. + FastWithdraw, + /// Fee for the `Transfer` operation. + Transfer, + /// Fee for the `ChangePubKey` operation. + ChangePubKey(ChangePubKeyFeeTypeArg), + /// Fee for the `ForcedExit` transaction. + ForcedExit, + /// Fee for the `MintNFT` transaction. + MintNFT, + /// Fee for the `WithdrawNFT` transaction. + WithdrawNFT, + /// Fee for the `WithdrawNFT` operation that requires fast processing. + FastWithdrawNFT, + /// Fee for the `Swap` operation + Swap, +} + +impl From for TxFeeTypes { + fn from(fee_type: ApiTxFeeTypes) -> TxFeeTypes { + match fee_type { + ApiTxFeeTypes::Withdraw | ApiTxFeeTypes::ForcedExit => TxFeeTypes::Withdraw, + ApiTxFeeTypes::FastWithdraw => TxFeeTypes::FastWithdraw, + ApiTxFeeTypes::Transfer => TxFeeTypes::Transfer, + ApiTxFeeTypes::ChangePubKey(cpk_arg) => TxFeeTypes::ChangePubKey(cpk_arg), + ApiTxFeeTypes::MintNFT => TxFeeTypes::MintNFT, + ApiTxFeeTypes::WithdrawNFT => TxFeeTypes::WithdrawNFT, + ApiTxFeeTypes::FastWithdrawNFT => TxFeeTypes::FastWithdrawNFT, + ApiTxFeeTypes::Swap => TxFeeTypes::Swap, + } + } +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +pub struct TxFeeRequest { + pub tx_type: ApiTxFeeTypes, + pub address: Address, + pub token_like: TokenLike, +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +pub struct TxInBatchFeeRequest { + pub tx_type: ApiTxFeeTypes, + pub address: Address, +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +pub struct BatchFeeRequest { + pub transactions: Vec, + pub token_like: TokenLike, +} diff --git a/core/lib/api_types/src/v02/mod.rs b/core/lib/api_types/src/v02/mod.rs new file mode 100644 index 0000000000..65f5073786 --- /dev/null +++ b/core/lib/api_types/src/v02/mod.rs @@ -0,0 +1,51 @@ +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; +use serde_json::Value; +use std::collections::HashMap; +use zksync_types::network::Network; + +pub mod account; +pub mod block; +pub mod fee; +pub mod pagination; +pub mod status; +pub mod token; +pub mod transaction; + +#[derive(Deserialize, Serialize, Debug, Clone, Copy, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub enum ZksyncVersion { + ContractV4, +} + +#[derive(Debug, Serialize, Deserialize, Clone, Copy)] +#[serde(rename_all = "camelCase")] +pub enum ApiVersion { + V02, +} + +#[derive(Debug, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub enum ResultStatus { + Success, + Error, +} + +#[derive(Debug, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct Request { + pub network: Network, + pub api_version: ApiVersion, + pub resource: String, + pub args: HashMap, + pub timestamp: DateTime, +} + +#[derive(Debug, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct Response { + pub request: Request, + pub status: ResultStatus, + pub error: Option, + pub result: Option, +} diff --git a/core/lib/api_types/src/v02/pagination.rs b/core/lib/api_types/src/v02/pagination.rs new file mode 100644 index 0000000000..f7960f1ddc --- /dev/null +++ b/core/lib/api_types/src/v02/pagination.rs @@ -0,0 +1,139 @@ +use either::Either; +use serde::{Deserialize, Serialize, Serializer}; +use std::str::FromStr; +use thiserror::Error; +use zksync_types::{tx::TxHash, AccountId, Address, BlockNumber, SerialId}; + +pub const MAX_LIMIT: u32 = 100; + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Copy)] +#[serde(rename_all = "camelCase")] +pub enum PaginationDirection { + Newer, + Older, +} + +/// The struct for defining `latest` option in pagination query +#[derive(Debug)] +pub struct Latest; + +impl Serialize for Latest { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + String::serialize(&"latest".to_string(), serializer) + } +} + +#[derive(Debug, Error, PartialEq)] +#[error("Cannot parse `from` query parameter: {0}")] +pub struct UnknownFromParameter(pub String); + +#[derive(Debug, Serialize)] +#[serde(transparent)] +pub struct ApiEither { + #[serde(with = "either::serde_untagged")] + pub inner: Either, +} + +impl FromStr for ApiEither { + type Err = UnknownFromParameter; + + fn from_str(s: &str) -> Result { + match s { + "latest" => Ok(ApiEither { + inner: Either::Right(Latest), + }), + _ => { + if let Ok(value) = T::from_str(s) { + Ok(ApiEither::from(value)) + } else { + Err(UnknownFromParameter(s.to_string())) + } + } + } + } +} + +impl From for ApiEither { + fn from(value: T) -> ApiEither { + ApiEither { + inner: Either::Left(value), + } + } +} + +pub fn parse_query( + query: PaginationQuery, +) -> Result>, UnknownFromParameter> { + let from = FromStr::from_str(&query.from)?; + Ok(PaginationQuery { + from, + limit: query.limit, + direction: query.direction, + }) +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct PaginationQuery { + pub from: Id, + pub limit: u32, + pub direction: PaginationDirection, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct PaginationDetails { + pub from: F, + pub limit: u32, + pub direction: PaginationDirection, + pub count: u32, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct Paginated { + pub list: Vec, + pub pagination: PaginationDetails, +} + +impl Paginated { + pub fn new( + list: Vec, + from: F, + limit: u32, + direction: PaginationDirection, + count: u32, + ) -> Self { + Self { + list, + pagination: PaginationDetails { + from, + limit, + direction, + count, + }, + } + } +} + +#[derive(Debug, Serialize)] +pub struct BlockAndTxHash { + pub block_number: BlockNumber, + pub tx_hash: ApiEither, +} + +#[derive(Debug, Serialize)] +pub struct PendingOpsRequest { + pub address: Address, + pub account_id: Option, + pub serial_id: ApiEither, +} + +#[derive(Debug, Serialize)] +pub struct AccountTxsRequest { + pub address: Address, + pub tx_hash: ApiEither, +} diff --git a/core/lib/api_types/src/v02/status.rs b/core/lib/api_types/src/v02/status.rs new file mode 100644 index 0000000000..c10b7ddff0 --- /dev/null +++ b/core/lib/api_types/src/v02/status.rs @@ -0,0 +1,11 @@ +use serde::{Deserialize, Serialize}; +use zksync_types::BlockNumber; + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct NetworkStatus { + pub last_committed: BlockNumber, + pub finalized: BlockNumber, + pub total_transactions: u32, + pub mempool_size: u32, +} diff --git a/core/lib/api_types/src/v02/token.rs b/core/lib/api_types/src/v02/token.rs new file mode 100644 index 0000000000..a31ee61fdf --- /dev/null +++ b/core/lib/api_types/src/v02/token.rs @@ -0,0 +1,75 @@ +use bigdecimal::BigDecimal; +use serde::{Deserialize, Serialize}; +use zksync_types::{AccountId, Address, Token, TokenId, H256}; + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct ApiToken { + pub id: TokenId, + pub address: Address, + pub symbol: String, + pub decimals: u8, + pub enabled_for_fees: bool, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct TokenPrice { + pub token_id: TokenId, + pub token_symbol: String, + pub price_in: String, + pub decimals: u8, + pub price: BigDecimal, +} + +impl ApiToken { + pub fn from_token_and_eligibility(token: Token, eligibility: bool) -> Self { + ApiToken { + id: token.id, + address: token.address, + symbol: token.symbol, + decimals: token.decimals, + enabled_for_fees: eligibility, + } + } +} + +#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Default)] +#[serde(rename_all = "camelCase")] +pub struct NFT { + pub id: TokenId, + pub content_hash: H256, + pub creator_id: AccountId, + pub creator_address: Address, + pub serial_id: u32, + pub address: Address, + pub symbol: String, +} + +impl From for NFT { + fn from(val: zksync_types::NFT) -> Self { + Self { + id: val.id, + content_hash: val.content_hash, + creator_id: val.creator_id, + creator_address: val.creator_address, + serial_id: val.serial_id, + address: val.address, + symbol: val.symbol, + } + } +} + +#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Default)] +#[serde(rename_all = "camelCase")] +pub struct ApiNFT { + pub id: TokenId, + pub content_hash: H256, + pub creator_id: AccountId, + pub creator_address: Address, + pub serial_id: u32, + pub address: Address, + pub symbol: String, + pub current_factory: Address, + pub withdrawn_factory: Option
, +} diff --git a/core/lib/api_types/src/v02/transaction.rs b/core/lib/api_types/src/v02/transaction.rs new file mode 100644 index 0000000000..2b58f21f41 --- /dev/null +++ b/core/lib/api_types/src/v02/transaction.rs @@ -0,0 +1,248 @@ +use crate::{v02::block::BlockStatus, TxWithSignature}; +use chrono::{DateTime, Utc}; +use num::BigUint; +use serde::{Deserialize, Serialize}; +use zksync_types::{ + tx::{ + ChangePubKey, Close, EthBatchSignatures, ForcedExit, MintNFT, Swap, Transfer, TxHash, + Withdraw, WithdrawNFT, + }, + AccountId, Address, BlockNumber, EthBlockId, SerialId, TokenId, ZkSyncOp, ZkSyncPriorityOp, + H256, +}; +use zksync_utils::{BigUintSerdeAsRadix10Str, ZeroPrefixHexSerde}; + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +pub struct IncomingTxBatch { + pub txs: Vec, + pub signature: Option, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Copy)] +#[serde(rename_all = "camelCase")] +pub enum TxInBlockStatus { + Queued, + Committed, + Finalized, + Rejected, +} + +impl From for TxInBlockStatus { + fn from(status: BlockStatus) -> Self { + match status { + BlockStatus::Committed => TxInBlockStatus::Committed, + BlockStatus::Finalized => TxInBlockStatus::Finalized, + } + } +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct TxData { + pub tx: Transaction, + pub eth_signature: Option, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct L1Receipt { + pub status: TxInBlockStatus, + pub eth_block: EthBlockId, + pub rollup_block: Option, + pub id: SerialId, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct L2Receipt { + #[serde(serialize_with = "ZeroPrefixHexSerde::serialize")] + pub tx_hash: TxHash, + pub rollup_block: Option, + pub status: TxInBlockStatus, + pub fail_reason: Option, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(untagged)] +pub enum Receipt { + L1(L1Receipt), + L2(L2Receipt), +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Transaction { + #[serde(serialize_with = "ZeroPrefixHexSerde::serialize")] + pub tx_hash: TxHash, + pub block_number: Option, + pub op: TransactionData, + pub status: TxInBlockStatus, + pub fail_reason: Option, + pub created_at: Option>, +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(untagged)] +pub enum TransactionData { + L1(L1Transaction), + L2(L2Transaction), +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(tag = "type")] +pub enum L2Transaction { + Transfer(Box), + Withdraw(Box), + #[doc(hidden)] + Close(Box), + ChangePubKey(Box), + ForcedExit(Box), + MintNFT(Box), + Swap(Box), + WithdrawNFT(Box), +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ForcedExitData { + #[serde(flatten)] + pub tx: ForcedExit, + pub eth_tx_hash: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct WithdrawData { + #[serde(flatten)] + pub tx: Withdraw, + pub eth_tx_hash: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct WithdrawNFTData { + #[serde(flatten)] + pub tx: WithdrawNFT, + pub eth_tx_hash: Option, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(tag = "type")] +pub enum L1Transaction { + Deposit(ApiDeposit), + FullExit(ApiFullExit), +} + +impl L1Transaction { + pub fn from_executed_op( + op: ZkSyncOp, + eth_hash: H256, + id: SerialId, + tx_hash: TxHash, + ) -> Option { + match op { + ZkSyncOp::Deposit(deposit) => Some(Self::Deposit(ApiDeposit { + from: deposit.priority_op.from, + token_id: deposit.priority_op.token, + amount: deposit.priority_op.amount, + to: deposit.priority_op.to, + account_id: Some(deposit.account_id), + eth_hash, + id, + tx_hash, + })), + ZkSyncOp::FullExit(deposit) => Some(Self::FullExit(ApiFullExit { + token_id: deposit.priority_op.token, + account_id: deposit.priority_op.account_id, + eth_hash, + id, + tx_hash, + })), + _ => None, + } + } + + pub fn from_pending_op( + op: ZkSyncPriorityOp, + eth_hash: H256, + id: SerialId, + tx_hash: TxHash, + ) -> Self { + match op { + ZkSyncPriorityOp::Deposit(deposit) => Self::Deposit(ApiDeposit { + from: deposit.from, + token_id: deposit.token, + amount: deposit.amount, + to: deposit.to, + account_id: None, + eth_hash, + id, + tx_hash, + }), + ZkSyncPriorityOp::FullExit(deposit) => Self::FullExit(ApiFullExit { + token_id: deposit.token, + account_id: deposit.account_id, + eth_hash, + id, + tx_hash, + }), + } + } +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct ApiDeposit { + pub from: Address, + pub token_id: TokenId, + #[serde(with = "BigUintSerdeAsRadix10Str")] + pub amount: BigUint, + pub to: Address, + pub account_id: Option, + pub eth_hash: H256, + pub id: SerialId, + #[serde(serialize_with = "ZeroPrefixHexSerde::serialize")] + pub tx_hash: TxHash, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct ApiFullExit { + pub account_id: AccountId, + pub token_id: TokenId, + pub eth_hash: H256, + pub id: SerialId, + #[serde(serialize_with = "ZeroPrefixHexSerde::serialize")] + pub tx_hash: TxHash, +} + +#[derive(Clone, Debug, Serialize, Deserialize, Default, Ord, PartialOrd, Eq, PartialEq, Hash)] +pub struct TxHashSerializeWrapper( + #[serde(serialize_with = "ZeroPrefixHexSerde::serialize")] pub TxHash, +); + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct SubmitBatchResponse { + pub transaction_hashes: Vec, + #[serde(serialize_with = "ZeroPrefixHexSerde::serialize")] + pub batch_hash: TxHash, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct ApiTxBatch { + #[serde(serialize_with = "ZeroPrefixHexSerde::serialize")] + pub batch_hash: TxHash, + pub transaction_hashes: Vec, + pub created_at: DateTime, + pub batch_status: BatchStatus, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct BatchStatus { + pub updated_at: DateTime, + pub last_state: TxInBlockStatus, +} diff --git a/core/lib/circuit/src/witness/change_pubkey_offchain.rs b/core/lib/circuit/src/witness/change_pubkey_offchain.rs index de7ad623f0..fe75a200cb 100644 --- a/core/lib/circuit/src/witness/change_pubkey_offchain.rs +++ b/core/lib/circuit/src/witness/change_pubkey_offchain.rs @@ -64,7 +64,7 @@ impl Witness for ChangePubkeyOffChainWitness { let change_pubkey_data = ChangePubkeyOffChainData { account_id: *change_pubkey_offchain.account_id, address: eth_address_to_fr(&change_pubkey_offchain.tx.account), - new_pubkey_hash: change_pubkey_offchain.tx.new_pk_hash.to_fr(), + new_pubkey_hash: change_pubkey_offchain.tx.new_pk_hash.as_fr(), fee_token: *change_pubkey_offchain.tx.fee_token as u32, fee: change_pubkey_offchain.tx.fee.to_u128().unwrap(), nonce: fr_from(change_pubkey_offchain.tx.nonce), diff --git a/core/lib/config/src/configs/chain.rs b/core/lib/config/src/configs/chain.rs index e677d0c55e..c05e030c18 100644 --- a/core/lib/config/src/configs/chain.rs +++ b/core/lib/config/src/configs/chain.rs @@ -3,7 +3,6 @@ use serde::Deserialize; /// Built-in uses use std::time::Duration; // Local uses -use zksync_crypto::{convert::FeConvert, priv_key_from_fs, Fs, PrivateKey}; use zksync_types::network::Network; use zksync_types::Address; @@ -89,9 +88,6 @@ pub struct StateKeeper { pub block_prove_deadline: u64, pub block_execute_deadline: u64, pub max_aggregated_tx_gas: usize, - pub last_tx_signer_used: bool, - pub last_tx_signer_address: Address, - pub last_tx_signer_private_key: String, } impl StateKeeper { @@ -111,17 +107,6 @@ impl StateKeeper { pub fn block_execute_deadline(&self) -> Duration { Duration::from_secs(self.block_execute_deadline) } - - pub fn last_tx_signer_data(&self) -> Option<(Address, PrivateKey)> { - if self.last_tx_signer_used { - let fs = Fs::from_hex(&self.last_tx_signer_private_key) - .expect("failed to parse private key"); - let pk = priv_key_from_fs(fs); - Some((self.last_tx_signer_address, pk)) - } else { - None - } - } } #[cfg(test)] @@ -156,9 +141,6 @@ mod tests { block_prove_deadline: 3_000, block_execute_deadline: 4_000, max_aggregated_tx_gas: 4_000_000, - last_tx_signer_used: false, - last_tx_signer_private_key: "0xaabbeecc".into(), - last_tx_signer_address: addr("da03a0b5963f75f1c8485b355ff6d30f3093bde7"), }, } } @@ -187,9 +169,6 @@ CHAIN_STATE_KEEPER_BLOCK_COMMIT_DEADLINE="300" CHAIN_STATE_KEEPER_BLOCK_PROVE_DEADLINE="3000" CHAIN_STATE_KEEPER_BLOCK_EXECUTE_DEADLINE="4000" CHAIN_STATE_KEEPER_MAX_AGGREGATED_TX_GAS="4000000" -CHAIN_STATE_KEEPER_LAST_TX_SIGNER_USED="false" -CHAIN_STATE_KEEPER_LAST_TX_SIGNER_ADDRESS="0xda03a0b5963f75f1c8485b355ff6d30f3093bde7" -CHAIN_STATE_KEEPER_LAST_TX_SIGNER_PRIVATE_KEY="0xaabbeecc" "#; set_env(config); diff --git a/core/lib/config/src/configs/ticker.rs b/core/lib/config/src/configs/ticker.rs index 7de6324846..0ed54fc3cb 100644 --- a/core/lib/config/src/configs/ticker.rs +++ b/core/lib/config/src/configs/ticker.rs @@ -1,8 +1,4 @@ -// Built-in uses -use std::collections::HashMap; // External uses -use num::rational::Ratio; -use num::BigUint; use serde::Deserialize; // Workspace uses use zksync_types::Address; @@ -40,11 +36,6 @@ pub struct TickerConfig { pub token_market_update_time: u64, /// Number of tickers for load balancing. pub number_of_ticker_actors: u8, - /// List of tokens for which subsidies are disabled. - pub not_subsidized_tokens: Vec
, - /// List of tokens for which subsidies are disabled. - subsidized_tokens: Vec
, - subsidized_tokens_limits: Vec, } impl TickerConfig { @@ -58,28 +49,8 @@ impl TickerConfig { TokenPriceSource::CoinGecko => self.coingecko_base_url.as_ref(), TokenPriceSource::CoinMarketCap => self.coinmarketcap_base_url.as_ref(), }; - (self.token_price_source, url) } - - pub fn get_subsidy_limits(&self) -> HashMap> { - assert_eq!( - self.subsidized_tokens.len(), - self.subsidized_tokens_limits.len(), - "Number of subsidized tokens and limits shoult be equal" - ); - - self.subsidized_tokens - .iter() - .cloned() - .zip( - self.subsidized_tokens_limits - .iter() - .cloned() - .map(Ratio::from_integer), - ) - .collect() - } } #[cfg(test)] @@ -100,12 +71,6 @@ mod tests { unconditionally_valid_tokens: vec![addr("0000000000000000000000000000000000000000")], token_market_update_time: 120, number_of_ticker_actors: 4, - not_subsidized_tokens: vec![ - addr("2b591e99afe9f32eaa6214f7b7629768c40eeb39"), - addr("34083bbd70d394110487feaa087da875a54624ec"), - ], - subsidized_tokens: vec![addr("0bc529c00c6401aef6d220be8c6ea1667f6ad93e")], - subsidized_tokens_limits: vec![156u32.into()], } } @@ -117,13 +82,11 @@ FEE_TICKER_COINMARKETCAP_BASE_URL="http://127.0.0.1:9876" FEE_TICKER_COINGECKO_BASE_URL="http://127.0.0.1:9876" FEE_TICKER_FAST_PROCESSING_COEFF="10" FEE_TICKER_UNISWAP_URL=http://127.0.0.1:9975/graphql -FEE_TICKER_NOT_SUBSIDIZED_TOKENS="0x2b591e99afe9f32eaa6214f7b7629768c40eeb39,0x34083bbd70d394110487feaa087da875a54624ec" FEE_TICKER_AVAILABLE_LIQUIDITY_SECONDS=1000 FEE_TICKER_TOKEN_MARKET_UPDATE_TIME=120 FEE_TICKER_UNCONDITIONALLY_VALID_TOKENS="0x0000000000000000000000000000000000000000" FEE_TICKER_LIQUIDITY_VOLUME=100 FEE_TICKER_NUMBER_OF_TICKER_ACTORS="4" -FEE_TICKER_SUBSIDIZED_TOKENS="0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e" FEE_TICKER_SUBSIDIZED_TOKENS_LIMITS=156 FEE_TICKER_SCALE_FEE_PERCENT=100 "#; diff --git a/core/lib/eth_client/src/clients/http_client.rs b/core/lib/eth_client/src/clients/http_client.rs index d101aeb71d..9f462f9096 100644 --- a/core/lib/eth_client/src/clients/http_client.rs +++ b/core/lib/eth_client/src/clients/http_client.rs @@ -126,7 +126,7 @@ impl ETHDirectClient { pub async fn block_number(&self) -> Result { let start = Instant::now(); let block_number = self.inner.web3.eth().block_number().await?; - metrics::histogram!("eth_client.direct.current_nonce", start.elapsed()); + metrics::histogram!("eth_client.direct.block_number", start.elapsed()); Ok(block_number) } @@ -374,7 +374,11 @@ impl ETHDirectClient { Ok(res) } - pub async fn get_tx_status(&self, hash: H256) -> anyhow::Result> { + pub async fn get_tx_status( + &self, + hash: H256, + current_block: Option, + ) -> anyhow::Result> { let start = Instant::now(); let receipt = self.tx_receipt(hash).await?; @@ -384,11 +388,11 @@ impl ETHDirectClient { status: Some(status), .. }) => { - let confirmations = self - .block_number() - .await? - .saturating_sub(tx_block_number) - .as_u64(); + let current_block = match current_block { + Some(current_block) => current_block, + None => self.block_number().await?.as_u64(), + }; + let confirmations = current_block.saturating_sub(tx_block_number.as_u64()); let success = status.as_u64() == 1; // Set the receipt only for failures. diff --git a/core/lib/eth_client/src/clients/mock.rs b/core/lib/eth_client/src/clients/mock.rs index 739e7af2db..455bc929f4 100644 --- a/core/lib/eth_client/src/clients/mock.rs +++ b/core/lib/eth_client/src/clients/mock.rs @@ -98,7 +98,11 @@ impl MockEthereum { }; self.inner.tx_statuses.write().await.insert(*hash, status); } - pub async fn get_tx_status(&self, hash: H256) -> anyhow::Result> { + pub async fn get_tx_status( + &self, + hash: H256, + _current_block: Option, + ) -> anyhow::Result> { Ok(self.inner.tx_statuses.read().await.get(&hash).cloned()) } diff --git a/core/lib/eth_client/src/clients/multiplexer.rs b/core/lib/eth_client/src/clients/multiplexer.rs index c49edb06e9..427d295928 100644 --- a/core/lib/eth_client/src/clients/multiplexer.rs +++ b/core/lib/eth_client/src/clients/multiplexer.rs @@ -206,8 +206,9 @@ impl MultiplexerEthereumClient { pub async fn get_tx_status( &self, hash: H256, + current_block: Option, ) -> Result, anyhow::Error> { - multiple_call!(self, get_tx_status(hash)); + multiple_call!(self, get_tx_status(hash, current_block)); } pub async fn logs(&self, filter: Filter) -> anyhow::Result> { diff --git a/core/lib/eth_client/src/ethereum_gateway.rs b/core/lib/eth_client/src/ethereum_gateway.rs index dabfce9f0e..6e70a78ed0 100644 --- a/core/lib/eth_client/src/ethereum_gateway.rs +++ b/core/lib/eth_client/src/ethereum_gateway.rs @@ -182,8 +182,12 @@ impl EthereumGateway { delegate_call!(self.allowance(token_address, erc20_abi)) } - pub async fn get_tx_status(&self, hash: H256) -> anyhow::Result> { - delegate_call!(self.get_tx_status(hash)) + pub async fn get_tx_status( + &self, + hash: H256, + current_block: Option, + ) -> anyhow::Result> { + delegate_call!(self.get_tx_status(hash, current_block)) } /// Encodes the transaction data (smart contract method and its input) to the bytes diff --git a/core/lib/state/src/handler/error.rs b/core/lib/state/src/handler/error.rs index d17b77b0f5..f218adcbaf 100644 --- a/core/lib/state/src/handler/error.rs +++ b/core/lib/state/src/handler/error.rs @@ -56,6 +56,8 @@ pub enum ForcedExitOpError { InvalidTokenId, #[error("Target account is not locked; forced exit is forbidden")] TargetAccountNotLocked, + #[error("Target account is invalid")] + InvalidTargetAccount, #[error("Nonce mismatch")] NonceMismatch, #[error("Initiator account: Not enough balance to cover fees")] diff --git a/core/lib/state/src/handler/forced_exit.rs b/core/lib/state/src/handler/forced_exit.rs index 3ca00d38ba..29ec76d03d 100644 --- a/core/lib/state/src/handler/forced_exit.rs +++ b/core/lib/state/src/handler/forced_exit.rs @@ -1,6 +1,8 @@ use std::time::Instant; use zksync_crypto::params; -use zksync_types::{AccountUpdate, AccountUpdates, ForcedExit, ForcedExitOp, PubKeyHash, ZkSyncOp}; +use zksync_types::{ + AccountUpdate, AccountUpdates, Address, ForcedExit, ForcedExitOp, PubKeyHash, ZkSyncOp, +}; use zksync_utils::BigUintSerdeWrapper; use crate::{ @@ -54,6 +56,10 @@ impl TxHandler for ZkSyncState { account.pub_key_hash == PubKeyHash::default(), ForcedExitOpError::TargetAccountNotLocked ); + invariant!( + account.address != Address::default(), + ForcedExitOpError::InvalidTargetAccount + ); // Obtain the token balance to be withdrawn. let account_balance = self diff --git a/core/lib/storage/Cargo.toml b/core/lib/storage/Cargo.toml index 69af42d0ce..079e44a7f0 100644 --- a/core/lib/storage/Cargo.toml +++ b/core/lib/storage/Cargo.toml @@ -14,6 +14,7 @@ default = [] db_test = [] [dependencies] +zksync_api_types = { path = "../api_types", version = "1.0" } zksync_types = { path = "../types", version = "1.0" } zksync_crypto = { path = "../crypto", version = "1.0" } zksync_utils = { path = "../utils", version = "1.0" } diff --git a/core/lib/storage/migrations/2021-04-12-144535_priority_ops_and_batches_hash/down.sql b/core/lib/storage/migrations/2021-04-12-144535_priority_ops_and_batches_hash/down.sql new file mode 100644 index 0000000000..dc54ecc518 --- /dev/null +++ b/core/lib/storage/migrations/2021-04-12-144535_priority_ops_and_batches_hash/down.sql @@ -0,0 +1,5 @@ +ALTER TABLE executed_priority_operations + DROP COLUMN IF EXISTS eth_block_index; +ALTER TABLE executed_priority_operations + DROP COLUMN IF EXISTS tx_hash; +DROP TABLE IF EXISTS txs_batches_hashes; diff --git a/core/lib/storage/migrations/2021-04-12-144535_priority_ops_and_batches_hash/up.sql b/core/lib/storage/migrations/2021-04-12-144535_priority_ops_and_batches_hash/up.sql new file mode 100644 index 0000000000..09991f4557 --- /dev/null +++ b/core/lib/storage/migrations/2021-04-12-144535_priority_ops_and_batches_hash/up.sql @@ -0,0 +1,10 @@ +ALTER TABLE executed_priority_operations + ADD eth_block_index bigint; + +ALTER TABLE executed_priority_operations + ADD tx_hash bytea NOT NULL DEFAULT ''::bytea; + +CREATE TABLE txs_batches_hashes ( + batch_id BIGSERIAL PRIMARY KEY, + batch_hash bytea NOT NULL +); diff --git a/core/lib/storage/migrations/2021-06-04-114545_hash_indices_for_txs_tables/down.sql b/core/lib/storage/migrations/2021-06-04-114545_hash_indices_for_txs_tables/down.sql new file mode 100644 index 0000000000..8e3528f890 --- /dev/null +++ b/core/lib/storage/migrations/2021-06-04-114545_hash_indices_for_txs_tables/down.sql @@ -0,0 +1,17 @@ +CREATE INDEX IF NOT EXISTS executed_transactions_hash_index + ON "executed_transactions" USING btree (tx_hash); +DROP INDEX IF EXISTS executed_transactions_tx_hash_idx; + +CREATE INDEX IF NOT EXISTS executed_priority_operations_from_account_index + ON "executed_priority_operations" USING btree (from_account); +CREATE INDEX IF NOT EXISTS executed_priority_operations_to_account_index + ON "executed_priority_operations" USING btree (to_account); +CREATE INDEX IF NOT EXISTS executed_priority_operations_eth_hash_index + ON "executed_priority_operations" USING btree (eth_hash); +DROP INDEX IF EXISTS executed_priority_operations_from_account_idx; +DROP INDEX IF EXISTS executed_priority_operations_to_account_idx; +DROP INDEX IF EXISTS executed_priority_operations_eth_hash_idx; + +CREATE INDEX IF NOT EXISTS mempool_txs_hash_index + ON "mempool_txs" USING btree (tx_hash); +DROP INDEX IF EXISTS mempool_txs_tx_hash_idx; diff --git a/core/lib/storage/migrations/2021-06-04-114545_hash_indices_for_txs_tables/up.sql b/core/lib/storage/migrations/2021-06-04-114545_hash_indices_for_txs_tables/up.sql new file mode 100644 index 0000000000..09f8eab1e4 --- /dev/null +++ b/core/lib/storage/migrations/2021-06-04-114545_hash_indices_for_txs_tables/up.sql @@ -0,0 +1,17 @@ +DROP INDEX IF EXISTS executed_transactions_hash_index; +CREATE INDEX IF NOT EXISTS executed_transactions_tx_hash_idx + ON "executed_transactions" USING hash (tx_hash); + +DROP INDEX IF EXISTS executed_priority_operations_from_account_index; +DROP INDEX IF EXISTS executed_priority_operations_to_account_index; +DROP INDEX IF EXISTS executed_priority_operations_eth_hash_index; +CREATE INDEX IF NOT EXISTS executed_priority_operations_from_account_idx + ON "executed_priority_operations" USING hash (from_account); +CREATE INDEX IF NOT EXISTS executed_priority_operations_to_account_idx + ON "executed_priority_operations" USING hash (to_account); +CREATE INDEX IF NOT EXISTS executed_priority_operations_eth_hash_idx + ON "executed_priority_operations" USING hash (eth_hash); + +DROP INDEX IF EXISTS mempool_txs_hash_index; +CREATE INDEX IF NOT EXISTS mempool_txs_tx_hash_idx + ON "mempool_txs" USING hash (tx_hash); diff --git a/core/lib/storage/migrations/2021-06-29-223011_reverted_ops_order/down.sql b/core/lib/storage/migrations/2021-06-29-223011_reverted_ops_order/down.sql new file mode 100644 index 0000000000..b0538d5866 --- /dev/null +++ b/core/lib/storage/migrations/2021-06-29-223011_reverted_ops_order/down.sql @@ -0,0 +1 @@ +ALTER TABLE mempool_txs DROP COLUMN next_priority_op_serial_id; diff --git a/core/lib/storage/migrations/2021-06-29-223011_reverted_ops_order/up.sql b/core/lib/storage/migrations/2021-06-29-223011_reverted_ops_order/up.sql new file mode 100644 index 0000000000..ca688c13c9 --- /dev/null +++ b/core/lib/storage/migrations/2021-06-29-223011_reverted_ops_order/up.sql @@ -0,0 +1,3 @@ +-- To prevent mempool from filling blocks with reverted priority operations +-- out of order, we keep a track of them. +ALTER TABLE mempool_txs ADD COLUMN next_priority_op_serial_id BIGINT DEFAULT NULL; diff --git a/core/lib/storage/sqlx-data.json b/core/lib/storage/sqlx-data.json index 4d1d44f179..69755ac809 100644 --- a/core/lib/storage/sqlx-data.json +++ b/core/lib/storage/sqlx-data.json @@ -42,65 +42,6 @@ ] } }, - "016aecf9d717ed60a6b650315e6209463f60f9ccfe842fddb97795bf55746fe9": { - "query": "\n WITH block_details AS (\n WITH aggr_comm AS (\n SELECT \n aggregate_operations.created_at, \n eth_operations.final_hash, \n commit_aggregated_blocks_binding.block_number \n FROM aggregate_operations\n INNER JOIN commit_aggregated_blocks_binding ON aggregate_operations.id = commit_aggregated_blocks_binding.op_id\n INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id\n INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id\n WHERE aggregate_operations.confirmed = true \n )\n , aggr_exec as (\n SELECT \n aggregate_operations.created_at, \n eth_operations.final_hash, \n execute_aggregated_blocks_binding.block_number \n FROM aggregate_operations\n INNER JOIN execute_aggregated_blocks_binding ON aggregate_operations.id = execute_aggregated_blocks_binding.op_id\n INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id\n INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id\n WHERE aggregate_operations.confirmed = true \n )\n SELECT\n blocks.number AS details_block_number,\n committed.final_hash AS commit_tx_hash,\n verified.final_hash AS verify_tx_hash\n FROM blocks\n INNER JOIN aggr_comm committed ON blocks.number = committed.block_number\n LEFT JOIN aggr_exec verified ON blocks.number = verified.block_number\n )\n SELECT\n block_number, \n block_index as \"block_index?\",\n tx_hash,\n success,\n fail_reason as \"fail_reason?\",\n details.commit_tx_hash as \"commit_tx_hash?\",\n details.verify_tx_hash as \"verify_tx_hash?\"\n FROM executed_transactions\n LEFT JOIN block_details details ON details.details_block_number = executed_transactions.block_number\n WHERE (\n (primary_account_address = $1 OR from_account = $1 OR to_account = $1)\n AND (\n block_number = $2 AND (\n COALESCE(block_index, -1) >= $3\n ) OR (\n block_number > $2\n )\n )\n )\n ORDER BY block_number ASC, COALESCE(block_index, -1) ASC\n LIMIT $4\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "block_number", - "type_info": "Int8" - }, - { - "ordinal": 1, - "name": "block_index?", - "type_info": "Int4" - }, - { - "ordinal": 2, - "name": "tx_hash", - "type_info": "Bytea" - }, - { - "ordinal": 3, - "name": "success", - "type_info": "Bool" - }, - { - "ordinal": 4, - "name": "fail_reason?", - "type_info": "Text" - }, - { - "ordinal": 5, - "name": "commit_tx_hash?", - "type_info": "Bytea" - }, - { - "ordinal": 6, - "name": "verify_tx_hash?", - "type_info": "Bytea" - } - ], - "parameters": { - "Left": [ - "Bytea", - "Int8", - "Int4", - "Int8" - ] - }, - "nullable": [ - false, - true, - false, - false, - true, - true, - true - ] - } - }, "04069d09246f16a6d03be04decaa05456556dc05b964adea34742af0eaef91aa": { "query": "\n SELECT * FROM tokens\n WHERE symbol = $1\n LIMIT 1\n ", "describe": { @@ -161,6 +102,20 @@ "nullable": [] } }, + "0713d87afe5e398f68014f617cbef4653110ddda1d2cd793a2095bb113478231": { + "query": "\n INSERT INTO nft_factory ( creator_id, factory_address, creator_address )\n VALUES ( $1, $2, $3 )\n ON CONFLICT ( creator_id )\n DO UPDATE\n SET factory_address = $2\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Text", + "Text" + ] + }, + "nullable": [] + } + }, "088013a67d0b8118980a606386ff38b394a26abfed0f209d17a6a583a297679b": { "query": "\n SELECT * FROM account_creates\n WHERE account_id = $1 AND block_number > $2\n ", "describe": { @@ -387,6 +342,63 @@ "nullable": [] } }, + "0e08e4712d3e2b359bde63476ff591939e97e877e7d5bcf1eb65345969c9ff21": { + "query": "\n WITH aggr_comm AS (\n SELECT \n aggregate_operations.created_at, \n eth_operations.final_hash, \n commit_aggregated_blocks_binding.block_number \n FROM aggregate_operations\n INNER JOIN commit_aggregated_blocks_binding ON aggregate_operations.id = commit_aggregated_blocks_binding.op_id\n INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id\n INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id\n WHERE aggregate_operations.confirmed = true \n ),\n aggr_exec as (\n SELECT \n aggregate_operations.created_at, \n eth_operations.final_hash, \n execute_aggregated_blocks_binding.block_number \n FROM aggregate_operations\n INNER JOIN execute_aggregated_blocks_binding ON aggregate_operations.id = execute_aggregated_blocks_binding.op_id\n INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id\n INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id\n WHERE aggregate_operations.confirmed = true \n )\n SELECT\n blocks.number AS \"block_number!\",\n blocks.root_hash AS \"new_state_root!\",\n blocks.block_size AS \"block_size!\",\n committed.final_hash AS \"commit_tx_hash?\",\n verified.final_hash AS \"verify_tx_hash?\",\n committed.created_at AS \"committed_at!\",\n verified.created_at AS \"verified_at?\"\n FROM blocks\n INNER JOIN aggr_comm committed ON blocks.number = committed.block_number\n LEFT JOIN aggr_exec verified ON blocks.number = verified.block_number\n WHERE\n blocks.number <= $1\n ORDER BY blocks.number DESC\n LIMIT $2;\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "block_number!", + "type_info": "Int8" + }, + { + "ordinal": 1, + "name": "new_state_root!", + "type_info": "Bytea" + }, + { + "ordinal": 2, + "name": "block_size!", + "type_info": "Int8" + }, + { + "ordinal": 3, + "name": "commit_tx_hash?", + "type_info": "Bytea" + }, + { + "ordinal": 4, + "name": "verify_tx_hash?", + "type_info": "Bytea" + }, + { + "ordinal": 5, + "name": "committed_at!", + "type_info": "Timestamptz" + }, + { + "ordinal": 6, + "name": "verified_at?", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": [ + "Int8", + "Int8" + ] + }, + "nullable": [ + false, + false, + false, + true, + true, + false, + false + ] + } + }, "0e390d0f58d24733d76253da2e4d9c9a0f5c96702d164fe3ad64af8aec43ee49": { "query": "\n SELECT * FROM account_balance_updates\n WHERE account_id = $1 AND block_number > $2\n ", "describe": { @@ -528,6 +540,32 @@ "nullable": [] } }, + "1401ea10d9e110da48aac1ebfa7aeb855c273adf34f6ee92b0fdaaf7de603049": { + "query": "\n SELECT tx_hash, created_at\n FROM mempool_txs\n INNER JOIN txs_batches_hashes\n ON txs_batches_hashes.batch_id = mempool_txs.batch_id\n WHERE batch_hash = $1\n ORDER BY id ASC\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "tx_hash", + "type_info": "Text" + }, + { + "ordinal": 1, + "name": "created_at", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": [ + "Bytea" + ] + }, + "nullable": [ + false, + false + ] + } + }, "1453c487619584da255ac032a521e5813934324f443d07d77cbf894e071202b5": { "query": "SELECT * FROM mint_nft_updates", "describe": { @@ -732,65 +770,6 @@ "nullable": [] } }, - "1a3122983ff3dc5c9a1b6e2b5d68f10e93f9db6aac216c105157048ea5b802ed": { - "query": "\n WITH block_details AS (\n WITH aggr_comm AS (\n SELECT \n aggregate_operations.created_at, \n eth_operations.final_hash, \n commit_aggregated_blocks_binding.block_number \n FROM aggregate_operations\n INNER JOIN commit_aggregated_blocks_binding ON aggregate_operations.id = commit_aggregated_blocks_binding.op_id\n INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id\n INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id\n WHERE aggregate_operations.confirmed = true \n )\n , aggr_exec as (\n SELECT \n aggregate_operations.created_at, \n eth_operations.final_hash, \n execute_aggregated_blocks_binding.block_number \n FROM aggregate_operations\n INNER JOIN execute_aggregated_blocks_binding ON aggregate_operations.id = execute_aggregated_blocks_binding.op_id\n INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id\n INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id\n WHERE aggregate_operations.confirmed = true \n )\n SELECT\n blocks.number AS details_block_number,\n committed.final_hash AS commit_tx_hash,\n verified.final_hash AS verify_tx_hash\n FROM blocks\n INNER JOIN aggr_comm committed ON blocks.number = committed.block_number\n LEFT JOIN aggr_exec verified ON blocks.number = verified.block_number\n )\n SELECT\n block_number, \n block_index as \"block_index?\",\n tx_hash,\n success,\n fail_reason as \"fail_reason?\",\n details.commit_tx_hash as \"commit_tx_hash?\",\n details.verify_tx_hash as \"verify_tx_hash?\"\n FROM executed_transactions\n LEFT JOIN block_details details ON details.details_block_number = executed_transactions.block_number\n WHERE (\n (primary_account_address = $1 OR from_account = $1 OR to_account = $1)\n AND (\n block_number = $2 AND (\n COALESCE(block_index, -1) <= $3\n ) OR (\n block_number < $2\n )\n )\n )\n ORDER BY block_number DESC, COALESCE(block_index, -1) DESC\n LIMIT $4\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "block_number", - "type_info": "Int8" - }, - { - "ordinal": 1, - "name": "block_index?", - "type_info": "Int4" - }, - { - "ordinal": 2, - "name": "tx_hash", - "type_info": "Bytea" - }, - { - "ordinal": 3, - "name": "success", - "type_info": "Bool" - }, - { - "ordinal": 4, - "name": "fail_reason?", - "type_info": "Text" - }, - { - "ordinal": 5, - "name": "commit_tx_hash?", - "type_info": "Bytea" - }, - { - "ordinal": 6, - "name": "verify_tx_hash?", - "type_info": "Bytea" - } - ], - "parameters": { - "Left": [ - "Bytea", - "Int8", - "Int4", - "Int8" - ] - }, - "nullable": [ - false, - true, - false, - false, - true, - true, - true - ] - } - }, "1a8ff6100bfc7521b3728c817a4014355e09d6ca1c251bbcee6f7cf013b6800d": { "query": "SELECT * FROM mint_nft_updates WHERE block_number > $1 AND block_number <= $2 ", "describe": { @@ -860,20 +839,54 @@ ] } }, - "1ce3fbb6c510621c830b0b4679d51fb2ac4379a474d7ee7074500d786102fcd3": { - "query": "INSERT INTO mempool_txs (tx_hash, tx, eth_sign_data, created_at, batch_id)\n SELECT u.tx_hash, u.tx, u.eth_sign_data, $4, $5\n FROM UNNEST ($1::text[], $2::jsonb[], $3::jsonb[])\n AS u(tx_hash, tx, eth_sign_data)", + "1d4884ae73b5c60662e2d778b43230a9fa2c7b683402bb67966428f70db2d900": { + "query": "\n WITH transactions AS (\n SELECT\n '0x' || encode(tx_hash, 'hex') as tx_hash,\n tx as op,\n block_number,\n success,\n fail_reason,\n created_at\n FROM executed_transactions\n WHERE block_number = $1\n ), priority_ops AS (\n SELECT\n '0x' || encode(eth_hash, 'hex') as tx_hash,\n operation as op,\n block_number,\n true as success,\n Null as fail_reason,\n created_at\n FROM executed_priority_operations\n WHERE block_number = $1\n ), everything AS (\n SELECT * FROM transactions\n UNION ALL\n SELECT * FROM priority_ops\n )\n SELECT\n tx_hash as \"tx_hash!\",\n block_number as \"block_number!\",\n op as \"op!\",\n success as \"success!\",\n fail_reason as \"fail_reason?\",\n created_at as \"created_at!\"\n FROM everything\n ORDER BY created_at DESC\n ", "describe": { - "columns": [], + "columns": [ + { + "ordinal": 0, + "name": "tx_hash!", + "type_info": "Text" + }, + { + "ordinal": 1, + "name": "block_number!", + "type_info": "Int8" + }, + { + "ordinal": 2, + "name": "op!", + "type_info": "Jsonb" + }, + { + "ordinal": 3, + "name": "success!", + "type_info": "Bool" + }, + { + "ordinal": 4, + "name": "fail_reason?", + "type_info": "Text" + }, + { + "ordinal": 5, + "name": "created_at!", + "type_info": "Timestamptz" + } + ], "parameters": { "Left": [ - "TextArray", - "JsonbArray", - "JsonbArray", - "Timestamptz", "Int8" ] }, - "nullable": [] + "nullable": [ + null, + null, + null, + null, + null, + null + ] } }, "1e491f4afb54c10a9e4f2ea467bd7f219e7a32bdf741691cb6f350d50caae417": { @@ -889,6 +902,18 @@ "nullable": [] } }, + "1fbfd087b4c05dc6a682c0020bfae07b3eea537e3e96f0316a7ec3ed63df9f88": { + "query": "DELETE FROM account_tree_cache WHERE block < $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int8" + ] + }, + "nullable": [] + } + }, "222e3946401772e3f6e0d9ce9909e8e7ac2dc830c5ecfcd522f56b3bf70fd679": { "query": "INSERT INTO data_restore_storage_state_update (storage_state) VALUES ($1)", "describe": { @@ -1188,27 +1213,6 @@ ] } }, - "285c1453d6e486c92a2b9b73f75c17ac00f0ca553d2b9e9a689e0da9e7471482": { - "query": "INSERT INTO executed_priority_operations (block_number, block_index, operation, from_account, to_account, priority_op_serialid, deadline_block, eth_hash, eth_block, created_at)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)\n ON CONFLICT (priority_op_serialid)\n DO NOTHING", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int8", - "Int4", - "Jsonb", - "Bytea", - "Bytea", - "Int8", - "Int8", - "Bytea", - "Int8", - "Timestamptz" - ] - }, - "nullable": [] - } - }, "28f120a906bc5fd893293d391913ac53ed79855274b85979a0cb38c3307e9ee9": { "query": "SELECT * FROM eth_operations WHERE id <= $1 ORDER BY ID DESC LIMIT 1", "describe": { @@ -1271,6 +1275,56 @@ ] } }, + "29d2ac9094d660ffa445ed8787f303e35deefc41b403b23557f6a0850cdbf4c6": { + "query": "\n SELECT * FROM nft\n WHERE creator_account_id = $1\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "token_id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "creator_account_id", + "type_info": "Int4" + }, + { + "ordinal": 2, + "name": "creator_address", + "type_info": "Bytea" + }, + { + "ordinal": 3, + "name": "serial_id", + "type_info": "Int4" + }, + { + "ordinal": 4, + "name": "address", + "type_info": "Bytea" + }, + { + "ordinal": 5, + "name": "content_hash", + "type_info": "Bytea" + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false, + false, + false, + false, + false, + false + ] + } + }, "2e92926816053cda2de6d571867a625fab5bb9668840db94bd18c411f96dc39b": { "query": "SELECT * FROM blocks WHERE number = $1", "describe": { @@ -1345,6 +1399,32 @@ ] } }, + "311eb879affeff3c877d978d0a7ac443d904edbc606a213ecc5959dbedc16b3e": { + "query": "SELECT created_at, block_number FROM executed_priority_operations\n WHERE tx_hash = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "created_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 1, + "name": "block_number", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Bytea" + ] + }, + "nullable": [ + false, + false + ] + } + }, "3538961dd16f0eb374b50b33cae9a656426720c7fdf5d26ac406f44f47692e01": { "query": "SELECT COUNT(*) FROM executed_transactions WHERE success = true", "describe": { @@ -1536,6 +1616,26 @@ "nullable": [] } }, + "43469652ff4f68b9990157c9eefb0cce5347db70e6c00df12d9fb23f701bbafd": { + "query": "\n SELECT MAX(block_number)\n FROM(\n SELECT block_number FROM account_balance_updates\n WHERE account_id = $1\n UNION ALL\n SELECT block_number FROM account_creates\n WHERE account_id = $1\n UNION ALL\n SELECT block_number FROM account_pubkey_updates\n WHERE account_id = $1\n ) as subquery\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "max", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Int8" + ] + }, + "nullable": [ + null + ] + } + }, "439d0083a3b98066071cde5909969b4e9ce744bc1bfa761116c6fb5bcc356075": { "query": "DELETE FROM account_balance_updates WHERE block_number > $1", "describe": { @@ -1548,41 +1648,47 @@ "nullable": [] } }, - "4469f85caafd8e489247f5a16d567910a113975fb5911622e40440b09eac7e4f": { - "query": "DELETE FROM account_pubkey_updates WHERE block_number > $1", + "444fd4dfaf4e0fdf1675c857b17feb5cf1f02ea0eb3e1e7bb60deb093fadb19f": { + "query": "\n WITH transactions AS (\n SELECT tx_hash, created_at, block_index\n FROM executed_transactions\n WHERE block_number = $1\n ), priority_ops AS (\n SELECT tx_hash, created_at, block_index\n FROM executed_priority_operations\n WHERE block_number = $1\n ), everything AS (\n SELECT * FROM transactions\n UNION ALL\n SELECT * FROM priority_ops\n )\n SELECT\n tx_hash as \"tx_hash!\"\n FROM everything\n ORDER BY created_at DESC, block_index DESC\n LIMIT 1\n ", "describe": { - "columns": [], + "columns": [ + { + "ordinal": 0, + "name": "tx_hash!", + "type_info": "Bytea" + } + ], "parameters": { "Left": [ "Int8" ] }, - "nullable": [] + "nullable": [ + null + ] } }, - "44b276fda62734e9c9d9853f493340265116ab7f13599674d27aafe3d3887391": { - "query": "UPDATE eth_operations \n SET last_used_gas_price = $1, last_deadline_block = $2\n WHERE id = $3", + "4469f85caafd8e489247f5a16d567910a113975fb5911622e40440b09eac7e4f": { + "query": "DELETE FROM account_pubkey_updates WHERE block_number > $1", "describe": { "columns": [], "parameters": { "Left": [ - "Numeric", - "Int8", "Int8" ] }, "nullable": [] } }, - "44c99a84f28659435e9cae90670179cf2e49b789abeee4754a8f830a2eead483": { - "query": "\n INSERT INTO nft_factory ( creator_id, factory_address, creator_address )\n VALUES ( $1, $2, $3 )\n ON CONFLICT ( creator_id ) \n DO UPDATE \n SET factory_address = $2 \n ", + "44b276fda62734e9c9d9853f493340265116ab7f13599674d27aafe3d3887391": { + "query": "UPDATE eth_operations \n SET last_used_gas_price = $1, last_deadline_block = $2\n WHERE id = $3", "describe": { "columns": [], "parameters": { "Left": [ - "Int4", - "Text", - "Text" + "Numeric", + "Int8", + "Int8" ] }, "nullable": [] @@ -1715,6 +1821,70 @@ ] } }, + "49b2154dd103b5aee0ee03aa964e8e7eb6b1dff1abe69f63c06a8c06ea6d3ece": { + "query": "\n WITH transactions AS (\n SELECT\n tx_hash,\n tx as op,\n block_number,\n created_at,\n success,\n fail_reason,\n Null::bytea as eth_hash,\n Null::bigint as priority_op_serialid,\n block_index\n FROM executed_transactions\n WHERE (from_account = $1 OR to_account = $1 OR primary_account_address = $1)\n AND created_at >= $2\n ), priority_ops AS (\n SELECT\n tx_hash,\n operation as op,\n block_number,\n created_at,\n true as success,\n Null as fail_reason,\n eth_hash,\n priority_op_serialid,\n block_index\n FROM executed_priority_operations\n WHERE (from_account = $1 OR to_account = $1) AND created_at >= $2\n ), everything AS (\n SELECT * FROM transactions\n UNION ALL\n SELECT * FROM priority_ops\n )\n SELECT\n tx_hash as \"tx_hash!\",\n block_number as \"block_number!\",\n op as \"op!\",\n created_at as \"created_at!\",\n success as \"success!\",\n fail_reason as \"fail_reason?\",\n eth_hash as \"eth_hash?\",\n priority_op_serialid as \"priority_op_serialid?\"\n FROM everything\n ORDER BY created_at ASC, block_index ASC\n LIMIT $3\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "tx_hash!", + "type_info": "Bytea" + }, + { + "ordinal": 1, + "name": "block_number!", + "type_info": "Int8" + }, + { + "ordinal": 2, + "name": "op!", + "type_info": "Jsonb" + }, + { + "ordinal": 3, + "name": "created_at!", + "type_info": "Timestamptz" + }, + { + "ordinal": 4, + "name": "success!", + "type_info": "Bool" + }, + { + "ordinal": 5, + "name": "fail_reason?", + "type_info": "Text" + }, + { + "ordinal": 6, + "name": "eth_hash?", + "type_info": "Bytea" + }, + { + "ordinal": 7, + "name": "priority_op_serialid?", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Bytea", + "Timestamptz", + "Int8" + ] + }, + "nullable": [ + null, + null, + null, + null, + null, + null, + null, + null + ] + } + }, "4a0bc713a57201aa894b96acdb462c03d3ad63cf4fbc8a14b9ac5e2e02121207": { "query": "\n SELECT * FROM ticker_market_volume\n WHERE token_id = $1\n LIMIT 1\n ", "describe": { @@ -1780,6 +1950,11 @@ "ordinal": 5, "name": "batch_id", "type_info": "Int8" + }, + { + "ordinal": 6, + "name": "next_priority_op_serial_id", + "type_info": "Int8" } ], "parameters": { @@ -1791,7 +1966,8 @@ false, false, true, - false + false, + true ] } }, @@ -1911,66 +2087,206 @@ "nullable": [] } }, - "4fc97e18f8e63d63d3a52db84ddd38243a865011e69a60061af37ebc2a8f1566": { - "query": "SELECT * FROM complete_withdrawals_transactions\n WHERE pending_withdrawals_queue_start_index <= $1\n AND $1 < pending_withdrawals_queue_end_index\n LIMIT 1\n ", + "4de513de380df55d42b5e799020c9dbe46a94671b53d5d4d822fec7c83accf56": { + "query": "\n WITH transaction AS (\n SELECT\n tx_hash,\n block_number,\n success,\n fail_reason,\n Null::bigint as eth_block,\n Null::bigint as priority_op_serialid\n FROM executed_transactions\n WHERE tx_hash = $1\n ), priority_op AS (\n SELECT\n tx_hash,\n block_number,\n true as success,\n Null as fail_reason,\n eth_block,\n priority_op_serialid\n FROM executed_priority_operations\n WHERE tx_hash = $1 OR eth_hash = $1\n ), mempool_tx AS (\n SELECT\n decode(tx_hash, 'hex'),\n Null::bigint as block_number,\n Null::boolean as success,\n Null as fail_reason,\n Null::bigint as eth_block,\n Null::bigint as priority_op_serialid\n FROM mempool_txs\n WHERE tx_hash = $2\n ),\n everything AS (\n SELECT * FROM transaction\n UNION ALL\n SELECT * FROM priority_op\n UNION ALL\n SELECT * FROM mempool_tx\n )\n SELECT\n tx_hash as \"tx_hash!\",\n block_number as \"block_number?\",\n success as \"success?\",\n fail_reason as \"fail_reason?\",\n eth_block as \"eth_block?\",\n priority_op_serialid as \"priority_op_serialid?\"\n FROM everything\n ", "describe": { "columns": [ { "ordinal": 0, - "name": "tx_hash", + "name": "tx_hash!", "type_info": "Bytea" }, { "ordinal": 1, - "name": "pending_withdrawals_queue_start_index", + "name": "block_number?", "type_info": "Int8" }, { "ordinal": 2, - "name": "pending_withdrawals_queue_end_index", + "name": "success?", + "type_info": "Bool" + }, + { + "ordinal": 3, + "name": "fail_reason?", + "type_info": "Text" + }, + { + "ordinal": 4, + "name": "eth_block?", + "type_info": "Int8" + }, + { + "ordinal": 5, + "name": "priority_op_serialid?", "type_info": "Int8" } ], "parameters": { "Left": [ - "Int8" + "Bytea", + "Text" ] }, "nullable": [ - false, - false, - false + null, + null, + null, + null, + null, + null ] } }, - "502e94a5b03c686539721f133998c66fa53f50a620167666d2e1b6084d3832b9": { - "query": "\n SELECT * FROM forced_exit_requests\n WHERE fulfilled_at IS NULL AND created_at = (\n SELECT MIN(created_at) FROM forced_exit_requests\n WHERE fulfilled_at IS NULL\n )\n LIMIT 1\n ", + "4ef355dbbaaf749ea6ef1a9d447b7528877d81ecb56d41d41f99b69a46d738c8": { + "query": "\n WITH transaction AS (\n SELECT\n tx_hash,\n tx as op,\n block_number,\n created_at,\n success,\n fail_reason,\n Null::bytea as eth_hash,\n Null::bigint as priority_op_serialid,\n eth_sign_data\n FROM executed_transactions\n WHERE tx_hash = $1\n ), priority_op AS (\n SELECT\n tx_hash,\n operation as op,\n block_number,\n created_at,\n true as success,\n Null as fail_reason,\n eth_hash,\n priority_op_serialid,\n Null::jsonb as eth_sign_data\n FROM executed_priority_operations\n WHERE tx_hash = $1 OR eth_hash = $1\n ), mempool_tx AS (\n SELECT\n decode(tx_hash, 'hex'),\n tx as op,\n Null::bigint as block_number,\n created_at,\n Null::boolean as success,\n Null as fail_reason,\n Null::bytea as eth_hash,\n Null::bigint as priority_op_serialid,\n eth_sign_data\n FROM mempool_txs\n WHERE tx_hash = $2\n ),\n everything AS (\n SELECT * FROM transaction\n UNION ALL\n SELECT * FROM priority_op\n UNION ALL\n SELECT * FROM mempool_tx\n )\n SELECT\n tx_hash as \"tx_hash!\",\n op as \"op!\",\n block_number as \"block_number?\",\n created_at as \"created_at!\",\n success as \"success?\",\n fail_reason as \"fail_reason?\",\n eth_hash as \"eth_hash?\",\n priority_op_serialid as \"priority_op_serialid?\",\n eth_sign_data as \"eth_sign_data?\"\n FROM everything\n ", "describe": { "columns": [ { "ordinal": 0, - "name": "id", - "type_info": "Int8" + "name": "tx_hash!", + "type_info": "Bytea" }, { "ordinal": 1, - "name": "target", - "type_info": "Text" + "name": "op!", + "type_info": "Jsonb" }, { "ordinal": 2, - "name": "tokens", - "type_info": "Text" + "name": "block_number?", + "type_info": "Int8" }, { "ordinal": 3, - "name": "price_in_wei", - "type_info": "Numeric" + "name": "created_at!", + "type_info": "Timestamptz" }, { "ordinal": 4, - "name": "valid_until", - "type_info": "Timestamptz" + "name": "success?", + "type_info": "Bool" + }, + { + "ordinal": 5, + "name": "fail_reason?", + "type_info": "Text" + }, + { + "ordinal": 6, + "name": "eth_hash?", + "type_info": "Bytea" + }, + { + "ordinal": 7, + "name": "priority_op_serialid?", + "type_info": "Int8" + }, + { + "ordinal": 8, + "name": "eth_sign_data?", + "type_info": "Jsonb" + } + ], + "parameters": { + "Left": [ + "Bytea", + "Text" + ] + }, + "nullable": [ + null, + null, + null, + null, + null, + null, + null, + null, + null + ] + } + }, + "4fc97e18f8e63d63d3a52db84ddd38243a865011e69a60061af37ebc2a8f1566": { + "query": "SELECT * FROM complete_withdrawals_transactions\n WHERE pending_withdrawals_queue_start_index <= $1\n AND $1 < pending_withdrawals_queue_end_index\n LIMIT 1\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "tx_hash", + "type_info": "Bytea" + }, + { + "ordinal": 1, + "name": "pending_withdrawals_queue_start_index", + "type_info": "Int8" + }, + { + "ordinal": 2, + "name": "pending_withdrawals_queue_end_index", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Int8" + ] + }, + "nullable": [ + false, + false, + false + ] + } + }, + "50007e206cca6a31ce868c1f626c601b548c236823b47bdf4b0399c5084973a0": { + "query": "SELECT count(*) as \"count!\" FROM executed_transactions WHERE block_number = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "count!", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Int8" + ] + }, + "nullable": [ + null + ] + } + }, + "502e94a5b03c686539721f133998c66fa53f50a620167666d2e1b6084d3832b9": { + "query": "\n SELECT * FROM forced_exit_requests\n WHERE fulfilled_at IS NULL AND created_at = (\n SELECT MIN(created_at) FROM forced_exit_requests\n WHERE fulfilled_at IS NULL\n )\n LIMIT 1\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int8" + }, + { + "ordinal": 1, + "name": "target", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "tokens", + "type_info": "Text" + }, + { + "ordinal": 3, + "name": "price_in_wei", + "type_info": "Numeric" + }, + { + "ordinal": 4, + "name": "valid_until", + "type_info": "Timestamptz" }, { "ordinal": 5, @@ -2128,6 +2444,27 @@ "nullable": [] } }, + "58d4d06fc0d3bc68286c7ec33f5e080a150461479dd08361bfe0e650a0015f0d": { + "query": "\n SELECT token_id\n FROM ticker_market_volume\n WHERE token_id = ANY($1) AND market_volume >= $2\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "token_id", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Int4Array", + "Numeric" + ] + }, + "nullable": [ + false + ] + } + }, "59c4e0d8255c2e4dd6eece1b24245daf3414d4f15b6cba7b369dc1ac32bed018": { "query": "\n SELECT * FROM accounts\n WHERE id = $1\n ", "describe": { @@ -2213,26 +2550,6 @@ "nullable": [] } }, - "60cf573e253358218a6319233221e8c2ff0561fd7ffbf8339a11a4509d955442": { - "query": "SELECT count(*) from mempool_txs\n WHERE tx_hash = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "count", - "type_info": "Int8" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - null - ] - } - }, "62304acbc93efab5117766689c6413d152dc0104c49c6f305e26b245b6ff7cde": { "query": "SELECT * FROM executed_priority_operations WHERE eth_hash = $1", "describe": { @@ -2286,6 +2603,16 @@ "ordinal": 9, "name": "created_at", "type_info": "Timestamptz" + }, + { + "ordinal": 10, + "name": "eth_block_index", + "type_info": "Int8" + }, + { + "ordinal": 11, + "name": "tx_hash", + "type_info": "Bytea" } ], "parameters": { @@ -2303,6 +2630,8 @@ false, false, false, + false, + true, false ] } @@ -2356,19 +2685,6 @@ ] } }, - "6c25f6955c7381b5ed9bf4f2eb233adbd2923baafc688f36b66b86f44b456668": { - "query": "UPDATE blocks\n SET root_hash = $1\n WHERE number = $2", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Bytea", - "Int8" - ] - }, - "nullable": [] - } - }, "6d676581f14d0935983aca496bc37b58206b90320058290809020a2604b11df3": { "query": "SELECT max(number) FROM blocks", "describe": { @@ -2719,6 +3035,44 @@ "nullable": [] } }, + "7d22d9facba43b954a6ffbccffaee54feab17317910247d7752e0d59dcf3af9a": { + "query": "\n SELECT tx_hash, created_at, success, block_number\n FROM executed_transactions\n INNER JOIN txs_batches_hashes\n ON txs_batches_hashes.batch_id = COALESCE(executed_transactions.batch_id, 0)\n WHERE batch_hash = $1\n ORDER BY created_at ASC, block_index ASC\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "tx_hash", + "type_info": "Bytea" + }, + { + "ordinal": 1, + "name": "created_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 2, + "name": "success", + "type_info": "Bool" + }, + { + "ordinal": 3, + "name": "block_number", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Bytea" + ] + }, + "nullable": [ + false, + false, + false, + false + ] + } + }, "7dfa76c3e12c301dc3d7fbf820ecf0be45e0b1c5f01ce13f7cdc1a82880804c1": { "query": "\n SELECT * FROM forced_exit_requests\n WHERE id = $1\n LIMIT 1\n ", "describe": { @@ -2842,6 +3196,26 @@ "nullable": [] } }, + "839caf265f3e87a43a788d8fc321ec8d3ada6987d46ce1179683aefb0bb1e789": { + "query": "SELECT COUNT(*) from mempool_txs\n WHERE tx_hash = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "count", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + null + ] + } + }, "83cc9ff843c9dd1c974b651f5ed1e0c6bea94454db1d6f01b8fdf556cdd77d81": { "query": "DELETE FROM mempool_txs\n WHERE tx_hash = $1", "describe": { @@ -2898,39 +3272,96 @@ "nullable": [] } }, - "86a1592862553cfb07b950a5f4547a650ee40ba774ddb367d8e84b5e8166cbea": { - "query": "UPDATE prover_job_queue SET last_block = $1 WHERE last_block > $1", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int8" - ] - }, - "nullable": [] - } - }, - "8a039b0bae78afb5d106d84f7d136be17670909814f92a8e8070ba99a9aea21c": { - "query": "SELECT * FROM data_restore_last_watched_eth_block LIMIT 1", + "860cebd02464f314a5d2f7f9708beff689cce8891d8727189318732765f60a88": { + "query": "\n WITH aggr_comm AS (\n SELECT \n aggregate_operations.created_at, \n eth_operations.final_hash, \n commit_aggregated_blocks_binding.block_number \n FROM aggregate_operations\n INNER JOIN commit_aggregated_blocks_binding ON aggregate_operations.id = commit_aggregated_blocks_binding.op_id\n INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id\n INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id\n WHERE aggregate_operations.confirmed = true \n ),\n aggr_exec as (\n SELECT \n aggregate_operations.created_at, \n eth_operations.final_hash, \n execute_aggregated_blocks_binding.block_number \n FROM aggregate_operations\n INNER JOIN execute_aggregated_blocks_binding ON aggregate_operations.id = execute_aggregated_blocks_binding.op_id\n INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id\n INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id\n WHERE aggregate_operations.confirmed = true \n )\n SELECT\n blocks.number AS \"block_number!\",\n blocks.root_hash AS \"new_state_root!\",\n blocks.block_size AS \"block_size!\",\n committed.final_hash AS \"commit_tx_hash?\",\n verified.final_hash AS \"verify_tx_hash?\",\n committed.created_at AS \"committed_at!\",\n verified.created_at AS \"verified_at?\"\n FROM blocks\n INNER JOIN aggr_comm committed ON blocks.number = committed.block_number\n LEFT JOIN aggr_exec verified ON blocks.number = verified.block_number\n WHERE false\n OR committed.final_hash = $1\n OR verified.final_hash = $1\n OR blocks.root_hash = $1\n OR blocks.number = $2\n ORDER BY blocks.number DESC\n LIMIT 1;\n ", "describe": { "columns": [ { "ordinal": 0, - "name": "id", - "type_info": "Int4" + "name": "block_number!", + "type_info": "Int8" }, { "ordinal": 1, - "name": "block_number", - "type_info": "Text" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - false, - false + "name": "new_state_root!", + "type_info": "Bytea" + }, + { + "ordinal": 2, + "name": "block_size!", + "type_info": "Int8" + }, + { + "ordinal": 3, + "name": "commit_tx_hash?", + "type_info": "Bytea" + }, + { + "ordinal": 4, + "name": "verify_tx_hash?", + "type_info": "Bytea" + }, + { + "ordinal": 5, + "name": "committed_at!", + "type_info": "Timestamptz" + }, + { + "ordinal": 6, + "name": "verified_at?", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": [ + "Bytea", + "Int8" + ] + }, + "nullable": [ + false, + false, + false, + true, + true, + false, + false + ] + } + }, + "86a1592862553cfb07b950a5f4547a650ee40ba774ddb367d8e84b5e8166cbea": { + "query": "UPDATE prover_job_queue SET last_block = $1 WHERE last_block > $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int8" + ] + }, + "nullable": [] + } + }, + "8a039b0bae78afb5d106d84f7d136be17670909814f92a8e8070ba99a9aea21c": { + "query": "SELECT * FROM data_restore_last_watched_eth_block LIMIT 1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "block_number", + "type_info": "Text" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false, + false ] } }, @@ -3059,6 +3490,83 @@ ] } }, + "8cc434d8801cbe1f957e54a29b0aa49182bd5b693d24b5c74c34290ed5768389": { + "query": "INSERT INTO txs_batches_hashes VALUES($1, $2)", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int8", + "Bytea" + ] + }, + "nullable": [] + } + }, + "8e69d6ddc76fddeb674420cd6aa48c2911c74110917c9833d97911f4988c0755": { + "query": "\n WITH transactions AS (\n SELECT\n tx_hash,\n tx as op,\n block_number,\n created_at,\n success,\n fail_reason,\n Null::bytea as eth_hash,\n Null::bigint as priority_op_serialid,\n block_index\n FROM executed_transactions\n WHERE (from_account = $1 OR to_account = $1 OR primary_account_address = $1)\n AND created_at <= $2\n ), priority_ops AS (\n SELECT\n tx_hash,\n operation as op,\n block_number,\n created_at,\n true as success,\n Null as fail_reason,\n eth_hash,\n priority_op_serialid,\n block_index\n FROM executed_priority_operations\n WHERE (from_account = $1 OR to_account = $1) AND created_at <= $2\n ), everything AS (\n SELECT * FROM transactions\n UNION ALL\n SELECT * FROM priority_ops\n )\n SELECT\n tx_hash as \"tx_hash!\",\n block_number as \"block_number!\",\n op as \"op!\",\n created_at as \"created_at!\",\n success as \"success!\",\n fail_reason as \"fail_reason?\",\n eth_hash as \"eth_hash?\",\n priority_op_serialid as \"priority_op_serialid?\"\n FROM everything\n ORDER BY created_at DESC, block_index DESC\n LIMIT $3\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "tx_hash!", + "type_info": "Bytea" + }, + { + "ordinal": 1, + "name": "block_number!", + "type_info": "Int8" + }, + { + "ordinal": 2, + "name": "op!", + "type_info": "Jsonb" + }, + { + "ordinal": 3, + "name": "created_at!", + "type_info": "Timestamptz" + }, + { + "ordinal": 4, + "name": "success!", + "type_info": "Bool" + }, + { + "ordinal": 5, + "name": "fail_reason?", + "type_info": "Text" + }, + { + "ordinal": 6, + "name": "eth_hash?", + "type_info": "Bytea" + }, + { + "ordinal": 7, + "name": "priority_op_serialid?", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Bytea", + "Timestamptz", + "Int8" + ] + }, + "nullable": [ + null, + null, + null, + null, + null, + null, + null, + null + ] + } + }, "8eb8865ba9f727bf86cbb3713903241b60e61b02b200fcf60483c99ff7cdc57c": { "query": "INSERT INTO data_restore_rollup_block_ops (block_num, operation)\n SELECT $1, u.operation\n FROM UNNEST ($2::jsonb[])\n AS u(operation)", "describe": { @@ -3144,6 +3652,26 @@ ] } }, + "931b39aa534358963d02950c0821a1b28c4354db0d0dfc90a110a546549ef690": { + "query": "SELECT count(*) as \"count!\" FROM executed_priority_operations WHERE block_number = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "count!", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Int8" + ] + }, + "nullable": [ + null + ] + } + }, "93fe4dceacf4e052ad807068272dc768eab33513e6c1e1ac62d2f989b1a26eee": { "query": "\n INSERT INTO eth_operations (op_type, nonce, last_deadline_block, last_used_gas_price, raw_tx)\n VALUES ($1, $2, $3, $4, $5)\n RETURNING id\n ", "describe": { @@ -3178,56 +3706,6 @@ "nullable": [] } }, - "9600a226f271e0939eb5fd0327a48e3f1dbbdfb673e91287c474c827cdea83ee": { - "query": "\n SELECT * FROM nft \n WHERE creator_account_id = $1\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "token_id", - "type_info": "Int4" - }, - { - "ordinal": 1, - "name": "creator_account_id", - "type_info": "Int4" - }, - { - "ordinal": 2, - "name": "creator_address", - "type_info": "Bytea" - }, - { - "ordinal": 3, - "name": "serial_id", - "type_info": "Int4" - }, - { - "ordinal": 4, - "name": "address", - "type_info": "Bytea" - }, - { - "ordinal": 5, - "name": "content_hash", - "type_info": "Bytea" - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - false, - false, - false, - false, - false, - false - ] - } - }, "961bbd13b54a7d53a58dfef2e60ce77752ff30807226edc69a47487b994b1468": { "query": "\n INSERT INTO tokens ( id, address, symbol, decimals, is_nft )\n VALUES ( $1, $2, $3, $4, $5 )\n ", "describe": { @@ -3256,6 +3734,27 @@ "nullable": [] } }, + "981fb627ef58081884cfa08f32153f356807406dafa291692276ba1f6459b855": { + "query": "\n SELECT COUNT(*) as \"count!\" FROM executed_transactions\n WHERE block_number <= $1 AND (from_account = $2 OR to_account = $2 OR primary_account_address = $2)\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "count!", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Int8", + "Bytea" + ] + }, + "nullable": [ + null + ] + } + }, "98f87793202531586603307eab53987f75f4e07614af8706e6180413f808a1b4": { "query": "INSERT INTO txs_batches_signatures VALUES($1, $2)", "describe": { @@ -3279,6 +3778,24 @@ "nullable": [] } }, + "99b1aad6f25729e9189706d99c87b8487788b2de0a4ed7915d4f49daf37b62dc": { + "query": "SELECT COUNT(*) from mempool_txs", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "count", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + null + ] + } + }, "9aeeb5e20f4f34d4b4e1987f1bf0a23ee931f12da071b134225069d32c1896de": { "query": "SELECT * FROM pending_block\n ORDER BY number DESC\n LIMIT 1", "describe": { @@ -3337,6 +3854,70 @@ "nullable": [] } }, + "9fb67f0d0bc8387201e5358ca011da4b6d4d48c38c5de3f628c9818804c01376": { + "query": "\n WITH transactions AS (\n SELECT\n tx_hash,\n tx as op,\n block_number,\n created_at,\n success,\n fail_reason,\n Null::bytea as eth_hash,\n Null::bigint as priority_op_serialid,\n block_index\n FROM executed_transactions\n WHERE block_number = $1 AND created_at <= $2\n ), priority_ops AS (\n SELECT\n tx_hash,\n operation as op,\n block_number,\n created_at,\n true as success,\n Null as fail_reason,\n eth_hash,\n priority_op_serialid,\n block_index\n FROM executed_priority_operations\n WHERE block_number = $1 AND created_at <= $2\n ), everything AS (\n SELECT * FROM transactions\n UNION ALL\n SELECT * FROM priority_ops\n )\n SELECT\n tx_hash as \"tx_hash!\",\n block_number as \"block_number!\",\n op as \"op!\",\n created_at as \"created_at!\",\n success as \"success!\",\n fail_reason as \"fail_reason?\",\n eth_hash as \"eth_hash?\",\n priority_op_serialid as \"priority_op_serialid?\"\n FROM everything\n ORDER BY created_at DESC, block_index DESC\n LIMIT $3\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "tx_hash!", + "type_info": "Bytea" + }, + { + "ordinal": 1, + "name": "block_number!", + "type_info": "Int8" + }, + { + "ordinal": 2, + "name": "op!", + "type_info": "Jsonb" + }, + { + "ordinal": 3, + "name": "created_at!", + "type_info": "Timestamptz" + }, + { + "ordinal": 4, + "name": "success!", + "type_info": "Bool" + }, + { + "ordinal": 5, + "name": "fail_reason?", + "type_info": "Text" + }, + { + "ordinal": 6, + "name": "eth_hash?", + "type_info": "Bytea" + }, + { + "ordinal": 7, + "name": "priority_op_serialid?", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Int8", + "Timestamptz", + "Int8" + ] + }, + "nullable": [ + null, + null, + null, + null, + null, + null, + null, + null + ] + } + }, "9fbf3d0ae8610fb464ac74ff989860eb913f4bfb14790373021ef456b671ed96": { "query": "SELECT * FROM eth_tx_hashes\n WHERE eth_op_id = $1\n ORDER BY id ASC", "describe": { @@ -3490,6 +4071,70 @@ "nullable": [] } }, + "a36020585959caaf7354f66c84a5df7e796e95c5759256aaf861dd60597071f3": { + "query": "\n WITH transactions AS (\n SELECT\n tx_hash,\n tx as op,\n block_number,\n created_at,\n success,\n fail_reason,\n Null::bytea as eth_hash,\n Null::bigint as priority_op_serialid,\n block_index\n FROM executed_transactions\n WHERE block_number = $1 AND created_at >= $2\n ), priority_ops AS (\n SELECT\n tx_hash,\n operation as op,\n block_number,\n created_at,\n true as success,\n Null as fail_reason,\n eth_hash,\n priority_op_serialid,\n block_index\n FROM executed_priority_operations\n WHERE block_number = $1 AND created_at >= $2\n ), everything AS (\n SELECT * FROM transactions\n UNION ALL\n SELECT * FROM priority_ops\n )\n SELECT\n tx_hash as \"tx_hash!\",\n block_number as \"block_number!\",\n op as \"op!\",\n created_at as \"created_at!\",\n success as \"success!\",\n fail_reason as \"fail_reason?\",\n eth_hash as \"eth_hash?\",\n priority_op_serialid as \"priority_op_serialid?\"\n FROM everything\n ORDER BY created_at ASC, block_index ASC\n LIMIT $3\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "tx_hash!", + "type_info": "Bytea" + }, + { + "ordinal": 1, + "name": "block_number!", + "type_info": "Int8" + }, + { + "ordinal": 2, + "name": "op!", + "type_info": "Jsonb" + }, + { + "ordinal": 3, + "name": "created_at!", + "type_info": "Timestamptz" + }, + { + "ordinal": 4, + "name": "success!", + "type_info": "Bool" + }, + { + "ordinal": 5, + "name": "fail_reason?", + "type_info": "Text" + }, + { + "ordinal": 6, + "name": "eth_hash?", + "type_info": "Bytea" + }, + { + "ordinal": 7, + "name": "priority_op_serialid?", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Int8", + "Timestamptz", + "Int8" + ] + }, + "nullable": [ + null, + null, + null, + null, + null, + null, + null, + null + ] + } + }, "a4969ac155106f1d8dd9b305e71ce36b3ee39adf75574d40e123a617a502ffe4": { "query": "INSERT INTO executed_transactions (block_number, block_index, tx, operation, tx_hash, from_account, to_account, success, fail_reason, primary_account_address, nonce, created_at, eth_sign_data, batch_id)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14)\n ON CONFLICT (tx_hash)\n DO NOTHING", "describe": { @@ -3542,6 +4187,47 @@ "nullable": [] } }, + "a8db70ecce6347665cfbc4dd9f43bb99d6681ad811b14ebb77ca57b685d92630": { + "query": "\n SELECT COUNT(*) as \"count!\" FROM executed_priority_operations\n WHERE block_number <= $1 AND (from_account = $2 OR to_account = $2)\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "count!", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Int8", + "Bytea" + ] + }, + "nullable": [ + null + ] + } + }, + "a9e416d1cf63d47318cf8da7904b62101a9fa413f5b646b832cd9114a6693158": { + "query": "\n WITH transactions AS (\n SELECT tx_hash, created_at, block_index\n FROM executed_transactions\n WHERE from_account = $1 OR to_account = $1 OR primary_account_address = $1\n ), priority_ops AS (\n SELECT tx_hash, created_at, block_index\n FROM executed_priority_operations\n WHERE from_account = $1 OR to_account = $1\n ), everything AS (\n SELECT * FROM transactions\n UNION ALL\n SELECT * FROM priority_ops\n )\n SELECT\n tx_hash as \"tx_hash!\"\n FROM everything\n ORDER BY created_at DESC, block_index DESC\n LIMIT 1\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "tx_hash!", + "type_info": "Bytea" + } + ], + "parameters": { + "Left": [ + "Bytea" + ] + }, + "nullable": [ + null + ] + } + }, "aaaf2bcea738151db11f6152772516a46ef7d23ae885936094226b837369ee3c": { "query": "DELETE FROM mempool_txs\n WHERE tx_hash = ANY($1)", "describe": { @@ -3622,6 +4308,29 @@ ] } }, + "abbdfc0983adb46d2051a4f6f2c0c46d17196bf312e1bb4747bf5b07f73d53d1": { + "query": "INSERT INTO executed_priority_operations (block_number, block_index, operation, from_account, to_account,\n priority_op_serialid, deadline_block, eth_hash, eth_block, created_at, eth_block_index, tx_hash)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)\n ON CONFLICT (priority_op_serialid)\n DO NOTHING", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int8", + "Int4", + "Jsonb", + "Bytea", + "Bytea", + "Int8", + "Int8", + "Bytea", + "Int8", + "Timestamptz", + "Int8", + "Bytea" + ] + }, + "nullable": [] + } + }, "ad3353e54de7447ea420b981e09af0f44894a6cad621640c7f8aac08f441ede2": { "query": "SELECT * FROM nft", "describe": { @@ -3683,6 +4392,23 @@ "nullable": [] } }, + "b2058dc0ab15ec7fdbd2c2ca59faaadc9c826f6318851d8c3a22e8feaa4989b8": { + "query": "INSERT INTO mempool_txs (tx_hash, tx, created_at, eth_sign_data, batch_id, next_priority_op_serial_id)\n VALUES ($1, $2, $3, $4, $5, $6)", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Jsonb", + "Timestamptz", + "Jsonb", + "Int8", + "Int8" + ] + }, + "nullable": [] + } + }, "b5e0f843d267576d57f41e2c4a63335749cb40e79bdb2b2cccbbaed5200abe96": { "query": "\n SELECT * FROM tokens\n WHERE address = $1\n LIMIT 1\n ", "describe": { @@ -3814,6 +4540,11 @@ "ordinal": 5, "name": "batch_id", "type_info": "Int8" + }, + { + "ordinal": 6, + "name": "next_priority_op_serial_id", + "type_info": "Int8" } ], "parameters": { @@ -3825,7 +4556,8 @@ false, false, true, - false + false, + true ] } }, @@ -3841,63 +4573,6 @@ "nullable": [] } }, - "ba155dc95f19a097d1a16bf35f23371872f72dfb618cb871693752be93fed472": { - "query": "\n WITH aggr_comm AS (\n SELECT \n aggregate_operations.created_at, \n eth_operations.final_hash, \n commit_aggregated_blocks_binding.block_number \n FROM aggregate_operations\n INNER JOIN commit_aggregated_blocks_binding ON aggregate_operations.id = commit_aggregated_blocks_binding.op_id\n INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id\n INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id\n WHERE aggregate_operations.confirmed = true \n )\n ,aggr_exec as (\n SELECT \n aggregate_operations.created_at, \n eth_operations.final_hash, \n execute_aggregated_blocks_binding.block_number \n FROM aggregate_operations\n INNER JOIN execute_aggregated_blocks_binding ON aggregate_operations.id = execute_aggregated_blocks_binding.op_id\n INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id\n INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id\n WHERE aggregate_operations.confirmed = true \n )\n SELECT\n blocks.number AS \"block_number!\",\n blocks.root_hash AS \"new_state_root!\",\n blocks.block_size AS \"block_size!\",\n committed.final_hash AS \"commit_tx_hash?\",\n verified.final_hash AS \"verify_tx_hash?\",\n committed.created_at AS \"committed_at!\",\n verified.created_at AS \"verified_at?\"\n FROM blocks\n INNER JOIN aggr_comm committed ON blocks.number = committed.block_number\n LEFT JOIN aggr_exec verified ON blocks.number = verified.block_number\n WHERE\n blocks.number <= $1\n ORDER BY blocks.number DESC\n LIMIT $2;\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "block_number!", - "type_info": "Int8" - }, - { - "ordinal": 1, - "name": "new_state_root!", - "type_info": "Bytea" - }, - { - "ordinal": 2, - "name": "block_size!", - "type_info": "Int8" - }, - { - "ordinal": 3, - "name": "commit_tx_hash?", - "type_info": "Bytea" - }, - { - "ordinal": 4, - "name": "verify_tx_hash?", - "type_info": "Bytea" - }, - { - "ordinal": 5, - "name": "committed_at!", - "type_info": "Timestamptz" - }, - { - "ordinal": 6, - "name": "verified_at?", - "type_info": "Timestamptz" - } - ], - "parameters": { - "Left": [ - "Int8", - "Int8" - ] - }, - "nullable": [ - false, - false, - false, - true, - true, - false, - false - ] - } - }, "baaaff359564c5d1094fcf2650d53cf9dcac5d50fc3a549c6cff53dd472350f7": { "query": "\n SELECT * FROM ticker_price\n WHERE token_id = $1\n LIMIT 1\n ", "describe": { @@ -4010,56 +4685,6 @@ "nullable": [] } }, - "be887d91df5cb45059e7ac1a857e79829b42b931cc7d9f086536c7ec1f096b75": { - "query": "\n WITH transactions AS (\n SELECT\n '0x' || encode(tx_hash, 'hex') as tx_hash,\n tx as op,\n block_number,\n success,\n fail_reason,\n created_at\n FROM executed_transactions\n WHERE block_number = $1\n ), priority_ops AS (\n SELECT\n '0x' || encode(eth_hash, 'hex') as tx_hash,\n operation as op,\n block_number,\n true as success,\n Null as fail_reason,\n created_at\n FROM executed_priority_operations\n WHERE block_number = $1\n ), everything AS (\n SELECT * FROM transactions\n UNION ALL\n SELECT * FROM priority_ops\n )\n SELECT\n tx_hash as \"tx_hash!\",\n block_number as \"block_number!\",\n op as \"op!\",\n success as \"success?\",\n fail_reason as \"fail_reason?\",\n created_at as \"created_at!\"\n FROM everything\n ORDER BY created_at DESC\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "tx_hash!", - "type_info": "Text" - }, - { - "ordinal": 1, - "name": "block_number!", - "type_info": "Int8" - }, - { - "ordinal": 2, - "name": "op!", - "type_info": "Jsonb" - }, - { - "ordinal": 3, - "name": "success?", - "type_info": "Bool" - }, - { - "ordinal": 4, - "name": "fail_reason?", - "type_info": "Text" - }, - { - "ordinal": 5, - "name": "created_at!", - "type_info": "Timestamptz" - } - ], - "parameters": { - "Left": [ - "Int8" - ] - }, - "nullable": [ - null, - null, - null, - null, - null, - null - ] - } - }, "bec05747dcfbf729bfd6e5d6aedf8da39f6d0d4ab5f0eae8dfed6c07adac1ba8": { "query": "SELECT eth_operations.* FROM aggregate_operations\n LEFT JOIN eth_aggregated_ops_binding ON eth_aggregated_ops_binding.op_id = aggregate_operations.id\n LEFT JOIN eth_operations ON eth_aggregated_ops_binding.eth_op_id = eth_operations.id\n WHERE\n ($1 BETWEEN from_block AND to_block) AND action_type = $2 AND eth_operations.confirmed = true \n LIMIT 1", "describe": { @@ -4248,6 +4873,16 @@ "ordinal": 9, "name": "created_at", "type_info": "Timestamptz" + }, + { + "ordinal": 10, + "name": "eth_block_index", + "type_info": "Int8" + }, + { + "ordinal": 11, + "name": "tx_hash", + "type_info": "Bytea" } ], "parameters": { @@ -4265,6 +4900,8 @@ false, false, false, + false, + true, false ] } @@ -4476,39 +5113,24 @@ "nullable": [] } }, - "c7bc91425f35b3a77be36fe8ba80030445051a0bc2536fa4a0def7ac498fc5c2": { - "query": "INSERT INTO mempool_txs (tx_hash, tx, created_at, eth_sign_data)\n VALUES ($1, $2, $3, $4)", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Jsonb", - "Timestamptz", - "Jsonb" - ] - }, - "nullable": [] - } - }, - "c842454191f93c4ab02e9845294b575dfd48a8eaae85996c5e76a36be997f969": { - "query": "\n WITH block_details AS (\n WITH aggr_comm AS (\n SELECT \n aggregate_operations.created_at, \n eth_operations.final_hash, \n commit_aggregated_blocks_binding.block_number \n FROM aggregate_operations\n INNER JOIN commit_aggregated_blocks_binding ON aggregate_operations.id = commit_aggregated_blocks_binding.op_id\n INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id\n INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id\n WHERE aggregate_operations.confirmed = true \n )\n , aggr_exec as (\n SELECT \n aggregate_operations.created_at, \n eth_operations.final_hash, \n execute_aggregated_blocks_binding.block_number \n FROM aggregate_operations\n INNER JOIN execute_aggregated_blocks_binding ON aggregate_operations.id = execute_aggregated_blocks_binding.op_id\n INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id\n INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id\n WHERE aggregate_operations.confirmed = true \n )\n SELECT\n blocks.number AS details_block_number,\n committed.final_hash AS commit_tx_hash,\n verified.final_hash AS verify_tx_hash\n FROM blocks\n INNER JOIN aggr_comm committed ON blocks.number = committed.block_number\n LEFT JOIN aggr_exec verified ON blocks.number = verified.block_number\n )\n SELECT\n block_number, \n block_index,\n eth_hash,\n details.commit_tx_hash as \"commit_tx_hash?\",\n details.verify_tx_hash as \"verify_tx_hash?\"\n FROM executed_priority_operations\n LEFT JOIN block_details details ON details.details_block_number = executed_priority_operations.block_number\n WHERE (\n (from_account = $1 OR to_account = $1)\n AND (\n block_number = $2 AND (\n block_index >= $3\n ) OR (\n block_number > $2\n )\n )\n )\n ORDER BY block_number ASC, block_index ASC\n LIMIT $4\n ", + "c76bdef17043c7f22c968ae7a27b861ef5967d0e30d9e6c298e741c203eadd2e": { + "query": "\n WITH aggr_comm AS (\n SELECT \n aggregate_operations.created_at, \n eth_operations.final_hash, \n commit_aggregated_blocks_binding.block_number \n FROM aggregate_operations\n INNER JOIN commit_aggregated_blocks_binding ON aggregate_operations.id = commit_aggregated_blocks_binding.op_id\n INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id\n INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id\n WHERE aggregate_operations.confirmed = true \n ),\n aggr_exec as (\n SELECT \n aggregate_operations.created_at, \n eth_operations.final_hash, \n execute_aggregated_blocks_binding.block_number \n FROM aggregate_operations\n INNER JOIN execute_aggregated_blocks_binding ON aggregate_operations.id = execute_aggregated_blocks_binding.op_id\n INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id\n INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id\n WHERE aggregate_operations.confirmed = true \n )\n SELECT\n blocks.number AS \"block_number!\",\n blocks.root_hash AS \"new_state_root!\",\n blocks.block_size AS \"block_size!\",\n committed.final_hash AS \"commit_tx_hash?\",\n verified.final_hash AS \"verify_tx_hash?\",\n committed.created_at AS \"committed_at!\",\n verified.created_at AS \"verified_at?\"\n FROM blocks\n INNER JOIN aggr_comm committed ON blocks.number = committed.block_number\n LEFT JOIN aggr_exec verified ON blocks.number = verified.block_number\n WHERE\n blocks.number >= $1\n ORDER BY blocks.number ASC\n LIMIT $2;\n ", "describe": { "columns": [ { "ordinal": 0, - "name": "block_number", + "name": "block_number!", "type_info": "Int8" }, { "ordinal": 1, - "name": "block_index", - "type_info": "Int4" + "name": "new_state_root!", + "type_info": "Bytea" }, { "ordinal": 2, - "name": "eth_hash", - "type_info": "Bytea" + "name": "block_size!", + "type_info": "Int8" }, { "ordinal": 3, @@ -4519,13 +5141,21 @@ "ordinal": 4, "name": "verify_tx_hash?", "type_info": "Bytea" + }, + { + "ordinal": 5, + "name": "committed_at!", + "type_info": "Timestamptz" + }, + { + "ordinal": 6, + "name": "verified_at?", + "type_info": "Timestamptz" } ], "parameters": { "Left": [ - "Bytea", "Int8", - "Int4", "Int8" ] }, @@ -4534,10 +5164,27 @@ false, false, true, - true + true, + false, + false ] } }, + "c7bc91425f35b3a77be36fe8ba80030445051a0bc2536fa4a0def7ac498fc5c2": { + "query": "INSERT INTO mempool_txs (tx_hash, tx, created_at, eth_sign_data)\n VALUES ($1, $2, $3, $4)", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Jsonb", + "Timestamptz", + "Jsonb" + ] + }, + "nullable": [] + } + }, "cb492484bab6e66f89a4d80649d3559566a681db153152a52449acf931a1d039": { "query": "SELECT * FROM block_witness WHERE block = $1", "describe": { @@ -4614,6 +5261,22 @@ ] } }, + "cd155debc525d539341b88e30a9ba9d3f130c4934883d945fa4abcb528ffc80f": { + "query": "INSERT INTO mempool_txs (tx_hash, tx, created_at, eth_sign_data, batch_id)\n VALUES ($1, $2, $3, $4, $5)", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Jsonb", + "Timestamptz", + "Jsonb", + "Int8" + ] + }, + "nullable": [] + } + }, "ceb8e4656aa76e1918a03707a1f047aed19ffcb3c70dbde61a6353b26b5a2493": { "query": "\n INSERT INTO ticker_market_volume ( token_id, market_volume, last_updated )\n VALUES ( $1, $2, $3 )\n ON CONFLICT (token_id)\n DO\n UPDATE SET market_volume = $2, last_updated = $3\n ", "describe": { @@ -4986,30 +5649,75 @@ } ], "parameters": { - "Left": [] + "Left": [] + }, + "nullable": [ + false, + null, + false, + true, + true, + false + ] + } + }, + "dcef2a0727cc074e66d5d5ac5c0d65e7581d0c4d635452950f1704859b06a94b": { + "query": "DELETE FROM prover_job_queue WHERE first_block > $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int8" + ] + }, + "nullable": [] + } + }, + "dd6a01d31268f3f9b922fdf75f8e9e265fc295562865e23dea4dd3293aa05d78": { + "query": "\n SELECT * FROM tokens\n WHERE id <= $1 AND is_nft = false\n ORDER BY id DESC\n LIMIT $2\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "address", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "symbol", + "type_info": "Text" + }, + { + "ordinal": 3, + "name": "decimals", + "type_info": "Int2" + }, + { + "ordinal": 4, + "name": "is_nft", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Int4", + "Int8" + ] }, "nullable": [ false, - null, false, - true, - true, + false, + false, false ] } }, - "dcef2a0727cc074e66d5d5ac5c0d65e7581d0c4d635452950f1704859b06a94b": { - "query": "DELETE FROM prover_job_queue WHERE first_block > $1", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int8" - ] - }, - "nullable": [] - } - }, "debbe23f0c730c331482c798387d1739911923edcafc2bd80463464ff98f3b71": { "query": "SELECT * from mempool_txs\n WHERE tx_hash = $1", "describe": { @@ -5043,6 +5751,11 @@ "ordinal": 5, "name": "batch_id", "type_info": "Int8" + }, + { + "ordinal": 6, + "name": "next_priority_op_serial_id", + "type_info": "Int8" } ], "parameters": { @@ -5056,7 +5769,8 @@ false, false, true, - false + false, + true ] } }, @@ -5084,53 +5798,6 @@ "nullable": [] } }, - "e32e0ba9ec31e6e78de5972548dced78d2a6949ec723b71ce210627dbb92dfe4": { - "query": "\n WITH block_details AS (\n WITH aggr_comm AS (\n SELECT \n aggregate_operations.created_at, \n eth_operations.final_hash, \n commit_aggregated_blocks_binding.block_number \n FROM aggregate_operations\n INNER JOIN commit_aggregated_blocks_binding ON aggregate_operations.id = commit_aggregated_blocks_binding.op_id\n INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id\n INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id\n WHERE aggregate_operations.confirmed = true \n )\n , aggr_exec as (\n SELECT \n aggregate_operations.created_at, \n eth_operations.final_hash, \n execute_aggregated_blocks_binding.block_number \n FROM aggregate_operations\n INNER JOIN execute_aggregated_blocks_binding ON aggregate_operations.id = execute_aggregated_blocks_binding.op_id\n INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id\n INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id\n WHERE aggregate_operations.confirmed = true \n )\n SELECT\n blocks.number AS details_block_number,\n committed.final_hash AS commit_tx_hash,\n verified.final_hash AS verify_tx_hash\n FROM blocks\n INNER JOIN aggr_comm committed ON blocks.number = committed.block_number\n LEFT JOIN aggr_exec verified ON blocks.number = verified.block_number\n )\n SELECT\n block_number, \n block_index,\n eth_hash,\n details.commit_tx_hash as \"commit_tx_hash?\",\n details.verify_tx_hash as \"verify_tx_hash?\"\n FROM executed_priority_operations\n LEFT JOIN block_details details ON details.details_block_number = executed_priority_operations.block_number\n WHERE (\n (from_account = $1 OR to_account = $1)\n AND (\n block_number = $2 AND (\n block_index <= $3\n ) OR (\n block_number < $2\n )\n )\n )\n ORDER BY block_number DESC, block_index DESC\n LIMIT $4\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "block_number", - "type_info": "Int8" - }, - { - "ordinal": 1, - "name": "block_index", - "type_info": "Int4" - }, - { - "ordinal": 2, - "name": "eth_hash", - "type_info": "Bytea" - }, - { - "ordinal": 3, - "name": "commit_tx_hash?", - "type_info": "Bytea" - }, - { - "ordinal": 4, - "name": "verify_tx_hash?", - "type_info": "Bytea" - } - ], - "parameters": { - "Left": [ - "Bytea", - "Int8", - "Int4", - "Int8" - ] - }, - "nullable": [ - false, - false, - false, - true, - true - ] - } - }, "e3ee3cb9cbe8d05a635e71daea301cf6b2310f89f3d9f8fdabc28e7ebf8d3521": { "query": "\n INSERT INTO eth_account_types VALUES ( $1, $2 )\n ON CONFLICT (account_id) DO UPDATE SET account_type = $2\n ", "describe": { @@ -5321,63 +5988,6 @@ ] } }, - "e7b1a3e830945cfe5c876255bbaa97dae409e1f642539ec898fd5dc3bb991bfc": { - "query": "\n WITH aggr_comm AS (\n SELECT \n aggregate_operations.created_at, \n eth_operations.final_hash, \n commit_aggregated_blocks_binding.block_number \n FROM aggregate_operations\n INNER JOIN commit_aggregated_blocks_binding ON aggregate_operations.id = commit_aggregated_blocks_binding.op_id\n INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id\n INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id\n WHERE aggregate_operations.confirmed = true \n )\n ,aggr_exec as (\n SELECT \n aggregate_operations.created_at, \n eth_operations.final_hash, \n execute_aggregated_blocks_binding.block_number \n FROM aggregate_operations\n INNER JOIN execute_aggregated_blocks_binding ON aggregate_operations.id = execute_aggregated_blocks_binding.op_id\n INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id\n INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id\n WHERE aggregate_operations.confirmed = true \n )\n SELECT\n blocks.number AS \"block_number!\",\n blocks.root_hash AS \"new_state_root!\",\n blocks.block_size AS \"block_size!\",\n committed.final_hash AS \"commit_tx_hash?\",\n verified.final_hash AS \"verify_tx_hash?\",\n committed.created_at AS \"committed_at!\",\n verified.created_at AS \"verified_at?\"\n FROM blocks\n INNER JOIN aggr_comm committed ON blocks.number = committed.block_number\n LEFT JOIN aggr_exec verified ON blocks.number = verified.block_number\n WHERE false\n OR committed.final_hash = $1\n OR verified.final_hash = $1\n OR blocks.root_hash = $1\n OR blocks.number = $2\n ORDER BY blocks.number DESC\n LIMIT 1;\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "block_number!", - "type_info": "Int8" - }, - { - "ordinal": 1, - "name": "new_state_root!", - "type_info": "Bytea" - }, - { - "ordinal": 2, - "name": "block_size!", - "type_info": "Int8" - }, - { - "ordinal": 3, - "name": "commit_tx_hash?", - "type_info": "Bytea" - }, - { - "ordinal": 4, - "name": "verify_tx_hash?", - "type_info": "Bytea" - }, - { - "ordinal": 5, - "name": "committed_at!", - "type_info": "Timestamptz" - }, - { - "ordinal": 6, - "name": "verified_at?", - "type_info": "Timestamptz" - } - ], - "parameters": { - "Left": [ - "Bytea", - "Int8" - ] - }, - "nullable": [ - false, - false, - false, - true, - true, - false, - false - ] - } - }, "e99d990d2d9b1c6068efb623634d6d6cf49a3c7ec33a5a916b7ddaa745e24c9b": { "query": "\n SELECT * FROM prover_job_queue\n WHERE job_status = $1\n ORDER BY (job_priority, id, first_block)\n LIMIT 1\n ", "describe": { @@ -5479,30 +6089,45 @@ "nullable": [] } }, - "ed39b22ac81b690c2102487ae3351915eec23b00a9cf9e409de08662c42fa20d": { - "query": "SELECT * FROM balances", + "ec1b0d11c29e691e78145bf04665fd1967b329722cf0d54a0611eedc4caff866": { + "query": "\n SELECT * FROM tokens\n WHERE id >= $1 AND is_nft = false\n ORDER BY id ASC\n LIMIT $2\n ", "describe": { "columns": [ { "ordinal": 0, - "name": "account_id", - "type_info": "Int8" + "name": "id", + "type_info": "Int4" }, { "ordinal": 1, - "name": "coin_id", - "type_info": "Int4" + "name": "address", + "type_info": "Text" }, { "ordinal": 2, - "name": "balance", - "type_info": "Numeric" + "name": "symbol", + "type_info": "Text" + }, + { + "ordinal": 3, + "name": "decimals", + "type_info": "Int2" + }, + { + "ordinal": 4, + "name": "is_nft", + "type_info": "Bool" } ], "parameters": { - "Left": [] + "Left": [ + "Int4", + "Int8" + ] }, "nullable": [ + false, + false, false, false, false @@ -5594,18 +6219,6 @@ "nullable": [] } }, - "f02021c46f5edc171f22c16e29bb028353eb0519aec1555c066fdd8dfe1d61e5": { - "query": "\n INSERT INTO mempool_txs (tx_hash, tx, created_at, eth_sign_data, batch_id)\n SELECT tx_hash, tx, created_at, eth_sign_data, COALESCE(batch_id, 0) FROM executed_transactions\n WHERE block_number > $1\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int8" - ] - }, - "nullable": [] - } - }, "f057b85811c3991b73c58991fc8dae8bf4cdf9d2238171ca13a3fdf1172f2c91": { "query": "SELECT * FROM data_restore_events_state\n WHERE block_type = $1\n ORDER BY block_num ASC", "describe": { @@ -5801,6 +6414,16 @@ "ordinal": 9, "name": "created_at", "type_info": "Timestamptz" + }, + { + "ordinal": 10, + "name": "eth_block_index", + "type_info": "Int8" + }, + { + "ordinal": 11, + "name": "tx_hash", + "type_info": "Bytea" } ], "parameters": { @@ -5818,6 +6441,8 @@ false, false, false, + false, + true, false ] } @@ -5878,48 +6503,6 @@ ] } }, - "f491f570438dd3a3ecd5988d0682751448723b41f1bd17198cc60d7f5d9aeb11": { - "query": "\n SELECT * FROM tokens WHERE is_nft = false\n ORDER BY id ASC\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Int4" - }, - { - "ordinal": 1, - "name": "address", - "type_info": "Text" - }, - { - "ordinal": 2, - "name": "symbol", - "type_info": "Text" - }, - { - "ordinal": 3, - "name": "decimals", - "type_info": "Int2" - }, - { - "ordinal": 4, - "name": "is_nft", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - false, - false, - false, - false, - false - ] - } - }, "f4aaa302a20921ae9ff490ac1a86083c49ee4a9afacf0faeb76aa8e1549f2fe7": { "query": "SELECT * FROM account_creates WHERE block_number > $1 AND block_number <= $2 ", "describe": { @@ -5991,18 +6574,6 @@ ] } }, - "f5bb5886974577c7f43179f77638507511ffbe1462bb75844a1f1c72414a4d83": { - "query": "\n DELETE FROM account_tree_cache \n WHERE block = $1\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int8" - ] - }, - "nullable": [] - } - }, "f7599bbef8c317c1ab1a61b2bcba3c5b03855b8a536bcdf369332c567b29d92c": { "query": "SELECT pg_notify($1, $2)", "describe": { @@ -6024,6 +6595,32 @@ ] } }, + "f8f2208c71cbf2d42de633222bb888c773a47b82dd0095b76ad38f535d74fdce": { + "query": "SELECT created_at, block_number FROM executed_transactions\n WHERE tx_hash = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "created_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 1, + "name": "block_number", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Bytea" + ] + }, + "nullable": [ + false, + false + ] + } + }, "fabb011dfd474fd56c71b7fb1707bbe586e66f9a45deac15b486845ba5c87979": { "query": "SELECT * FROM mint_nft_updates WHERE block_number <= $1", "describe": { diff --git a/core/lib/storage/src/chain/account/mod.rs b/core/lib/storage/src/chain/account/mod.rs index 8341594800..4ac215b869 100644 --- a/core/lib/storage/src/chain/account/mod.rs +++ b/core/lib/storage/src/chain/account/mod.rs @@ -3,7 +3,7 @@ use std::time::Instant; // External imports use sqlx::Acquire; // Workspace imports -use zksync_types::{Account, AccountId, AccountUpdates, Address, TokenId}; +use zksync_types::{Account, AccountId, AccountUpdates, Address, BlockNumber, TokenId}; // Local imports use self::records::*; use crate::diff::StorageAccountDiff; @@ -76,21 +76,18 @@ impl<'a, 'c> AccountSchema<'a, 'c> { account_id: AccountId, ) -> QueryResult { let start = Instant::now(); - // Load committed & verified states, and return them. - let committed = self + let (verified_state, committed_state) = self + .0 + .chain() + .account_schema() .last_committed_state_for_account(account_id) - .await? - .map(|a| (account_id, a)); - let verified = self - .last_verified_state_for_account(account_id) - .await? - .map(|a| (account_id, a)); + .await?; metrics::histogram!("sql.chain.account.account_state_by_id", start.elapsed()); Ok(StoredAccountState { - committed, - verified, + committed: committed_state.map(|a| (account_id, a)), + verified: verified_state.1.map(|a| (account_id, a)), }) } @@ -119,10 +116,11 @@ impl<'a, 'c> AccountSchema<'a, 'c> { /// Loads the last committed (e.g. just added but no necessarily verified) state for /// account given its ID. + /// Returns both verified and committed states. pub async fn last_committed_state_for_account( &mut self, account_id: AccountId, - ) -> QueryResult> { + ) -> QueryResult<((i64, Option), Option)> { let start = Instant::now(); let mut transaction = self.0.start_transaction().await?; @@ -211,7 +209,7 @@ impl<'a, 'c> AccountSchema<'a, 'c> { let account_state = account_diff .into_iter() .map(|(_, upd)| upd) - .fold(account, Account::apply_update); + .fold(account.clone(), Account::apply_update); transaction.commit().await?; @@ -219,7 +217,7 @@ impl<'a, 'c> AccountSchema<'a, 'c> { "sql.chain.account.last_committed_state_for_account", start.elapsed() ); - Ok(account_state) + Ok(((last_block, account), account_state)) } /// Loads the last verified state for the account (i.e. the one obtained in the last block @@ -238,7 +236,7 @@ impl<'a, 'c> AccountSchema<'a, 'c> { } /// Obtains the last verified state of the account. - async fn account_and_last_block( + pub async fn account_and_last_block( &mut self, account_id: AccountId, ) -> QueryResult<(i64, Option)> { @@ -275,7 +273,7 @@ impl<'a, 'c> AccountSchema<'a, 'c> { let nfts: Vec = sqlx::query_as!( StorageNFT, " - SELECT * FROM nft + SELECT * FROM nft WHERE creator_account_id = $1 ", *account_id as i32 @@ -341,27 +339,38 @@ impl<'a, 'c> AccountSchema<'a, 'c> { Ok(address) } - // This method does not have metrics, since it is used only for the - // migration for the nft regenesis. - // Remove this function once the regenesis is complete and the tool is not - // needed anymore: ZKS-663 - pub async fn get_all_accounts(&mut self) -> QueryResult> { - let result = sqlx::query_as!(StorageAccount, "SELECT * FROM accounts") - .fetch_all(self.0.conn()) - .await?; - - Ok(result) - } + /// Obtains the last committed block that affects the account. + pub async fn last_committed_block_with_update_for_acc( + &mut self, + account_id: AccountId, + ) -> QueryResult { + let start = Instant::now(); - // This method does not have metrics, since it is used only for the - // migration for the nft regenesis. - // Remove this function once the regenesis is complete and the tool is not - // needed anymore: ZKS-663 - pub async fn get_all_balances(&mut self) -> QueryResult> { - let result = sqlx::query_as!(StorageBalance, "SELECT * FROM balances",) - .fetch_all(self.0.conn()) - .await?; + let block_number = sqlx::query!( + " + SELECT MAX(block_number) + FROM( + SELECT block_number FROM account_balance_updates + WHERE account_id = $1 + UNION ALL + SELECT block_number FROM account_creates + WHERE account_id = $1 + UNION ALL + SELECT block_number FROM account_pubkey_updates + WHERE account_id = $1 + ) as subquery + ", + i64::from(*account_id), + ) + .fetch_one(self.0.conn()) + .await? + .max + .unwrap_or(0); - Ok(result) + metrics::histogram!( + "sql.chain.account.last_committed_block_with_update_for_acc", + start.elapsed() + ); + Ok(BlockNumber(block_number as u32)) } } diff --git a/core/lib/storage/src/chain/account/records.rs b/core/lib/storage/src/chain/account/records.rs index 1226bcb268..586bad8868 100644 --- a/core/lib/storage/src/chain/account/records.rs +++ b/core/lib/storage/src/chain/account/records.rs @@ -1,3 +1,5 @@ +// Workspace imports +use zksync_api_types::v02::account::EthAccountType as ApiEthAccountType; // External imports use sqlx::{types::BigDecimal, FromRow}; use zksync_types::{AccountId, Address, TokenId, H256, NFT}; @@ -87,6 +89,15 @@ pub enum EthAccountType { CREATE2, } +impl From for ApiEthAccountType { + fn from(account_type: EthAccountType) -> ApiEthAccountType { + match account_type { + EthAccountType::Owned => ApiEthAccountType::Owned, + EthAccountType::CREATE2 => ApiEthAccountType::CREATE2, + } + } +} + #[derive(Debug, Clone, FromRow)] pub struct StorageAccountType { pub account_id: i64, diff --git a/core/lib/storage/src/chain/block/conversion.rs b/core/lib/storage/src/chain/block/conversion.rs index 08142a5626..1fe264d9bc 100644 --- a/core/lib/storage/src/chain/block/conversion.rs +++ b/core/lib/storage/src/chain/block/conversion.rs @@ -6,18 +6,21 @@ use std::convert::TryFrom; // External imports // Workspace imports +use zksync_api_types::v02::transaction::{ + L1Transaction, Transaction, TransactionData, TxInBlockStatus, +}; use zksync_types::{ - Action, ActionType, Operation, SignedZkSyncTx, H256, - { - block::{ExecutedPriorityOp, ExecutedTx}, - BlockNumber, PriorityOp, ZkSyncOp, ZkSyncTx, - }, + aggregated_operations::AggregatedOperation, + block::{ExecutedPriorityOp, ExecutedTx}, + tx::TxHash, + Action, ActionType, BlockNumber, Operation, PriorityOp, SignedZkSyncTx, ZkSyncOp, ZkSyncTx, + H256, }; // Local imports use crate::chain::operations::records::StoredAggregatedOperation; use crate::{ chain::{ - block::BlockSchema, + block::{records::TransactionItem, BlockSchema}, operations::records::{ NewExecutedPriorityOperation, NewExecutedTransaction, StoredExecutedPriorityOperation, StoredExecutedTransaction, StoredOperation, @@ -26,7 +29,6 @@ use crate::{ prover::ProverSchema, QueryResult, StorageActionType, StorageProcessor, }; -use zksync_types::aggregated_operations::AggregatedOperation; impl StoredOperation { pub async fn into_op(self, conn: &mut StorageProcessor<'_>) -> QueryResult { @@ -88,6 +90,7 @@ impl StoredExecutedPriorityOperation { deadline_block: self.deadline_block as u64, eth_hash: H256::from_slice(&self.eth_hash), eth_block: self.eth_block as u64, + eth_block_index: self.eth_block_index.map(|index| index as u64), }, op: franklin_op, block_index: self.block_index as u32, @@ -102,6 +105,7 @@ impl NewExecutedPriorityOperation { block: BlockNumber, ) -> Self { let operation = serde_json::to_value(&exec_prior_op.op).unwrap(); + let tx_hash = exec_prior_op.priority_op.tx_hash().as_ref().to_vec(); let (from_account, to_account) = match exec_prior_op.op { ZkSyncOp::Deposit(deposit) => (deposit.priority_op.from, deposit.priority_op.to), @@ -126,6 +130,11 @@ impl NewExecutedPriorityOperation { eth_hash: exec_prior_op.priority_op.eth_hash.as_bytes().to_vec(), eth_block: exec_prior_op.priority_op.eth_block as i64, created_at: exec_prior_op.created_at, + eth_block_index: exec_prior_op + .priority_op + .eth_block_index + .map(|index| index as i64), + tx_hash, } } } @@ -209,3 +218,37 @@ impl StoredAggregatedOperation { ) } } + +impl TransactionItem { + pub fn transaction_from_item(item: TransactionItem, is_block_finalized: bool) -> Transaction { + let tx_hash = TxHash::from_slice(&item.tx_hash).unwrap(); + let block_number = Some(BlockNumber(item.block_number as u32)); + let status = if item.success { + if is_block_finalized { + TxInBlockStatus::Finalized + } else { + TxInBlockStatus::Committed + } + } else { + TxInBlockStatus::Rejected + }; + let op = if let Some(eth_hash) = item.eth_hash { + let eth_hash = H256::from_slice(ð_hash); + let id = item.priority_op_serialid.unwrap() as u64; + let operation: ZkSyncOp = serde_json::from_value(item.op).unwrap(); + TransactionData::L1( + L1Transaction::from_executed_op(operation, eth_hash, id, tx_hash).unwrap(), + ) + } else { + TransactionData::L2(serde_json::from_value(item.op).unwrap()) + }; + Transaction { + tx_hash, + block_number, + op, + status, + fail_reason: item.fail_reason, + created_at: Some(item.created_at), + } + } +} diff --git a/core/lib/storage/src/chain/block/mod.rs b/core/lib/storage/src/chain/block/mod.rs index d3a26a923a..9c1f6d5cfd 100644 --- a/core/lib/storage/src/chain/block/mod.rs +++ b/core/lib/storage/src/chain/block/mod.rs @@ -2,6 +2,13 @@ use std::time::{Instant, SystemTime, UNIX_EPOCH}; // External imports // Workspace imports +use zksync_api_types::{ + v02::{ + pagination::{BlockAndTxHash, PaginationDirection, PaginationQuery}, + transaction::Transaction, + }, + Either, +}; use zksync_basic_types::{H256, U256}; use zksync_crypto::convert::FeConvert; use zksync_types::{ @@ -13,7 +20,7 @@ use zksync_types::{ // Local imports use self::records::{ AccountTreeCache, BlockTransactionItem, StorageBlock, StorageBlockDetails, - StorageBlockMetadata, StoragePendingBlock, + StorageBlockMetadata, StoragePendingBlock, TransactionItem, }; use crate::{ chain::account::records::EthAccountType, @@ -27,7 +34,7 @@ use crate::{ QueryResult, StorageProcessor, }; -mod conversion; +pub(crate) mod conversion; pub mod records; /// Block schema is a primary sidechain storage controller. @@ -231,7 +238,7 @@ impl<'a, 'c> BlockSchema<'a, 'c> { tx_hash as "tx_hash!", block_number as "block_number!", op as "op!", - success as "success?", + success as "success!", fail_reason as "fail_reason?", created_at as "created_at!" FROM everything @@ -309,8 +316,8 @@ impl<'a, 'c> BlockSchema<'a, 'c> { Ok(executed_operations) } - /// Loads the block headers for the given amount of blocks. - pub async fn load_block_range( + /// Loads the block headers for the given amount of blocks in the descending order. + pub async fn load_block_range_desc( &mut self, max_block: BlockNumber, limit: u32, @@ -336,8 +343,8 @@ impl<'a, 'c> BlockSchema<'a, 'c> { INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id WHERE aggregate_operations.confirmed = true - ) - ,aggr_exec as ( + ), + aggr_exec as ( SELECT aggregate_operations.created_at, eth_operations.final_hash, @@ -373,6 +380,87 @@ impl<'a, 'c> BlockSchema<'a, 'c> { Ok(details) } + /// Loads the block headers for the given amount of blocks in the ascending order. + pub async fn load_block_range_asc( + &mut self, + min_block: BlockNumber, + limit: u32, + ) -> QueryResult> { + let start = Instant::now(); + // This query does the following: + // - joins the `operations` and `eth_tx_hashes` (using the intermediate `eth_ops_binding` table) + // tables to collect the data: + // block number, ethereum transaction hash, action type and action creation timestamp; + // - joins the `blocks` table with result of the join twice: once for committed operations + // and verified operations; + // - collects the {limit} blocks in the ascending order with the data gathered above. + let details = sqlx::query_as!( + StorageBlockDetails, + r#" + WITH aggr_comm AS ( + SELECT + aggregate_operations.created_at, + eth_operations.final_hash, + commit_aggregated_blocks_binding.block_number + FROM aggregate_operations + INNER JOIN commit_aggregated_blocks_binding ON aggregate_operations.id = commit_aggregated_blocks_binding.op_id + INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id + INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id + WHERE aggregate_operations.confirmed = true + ), + aggr_exec as ( + SELECT + aggregate_operations.created_at, + eth_operations.final_hash, + execute_aggregated_blocks_binding.block_number + FROM aggregate_operations + INNER JOIN execute_aggregated_blocks_binding ON aggregate_operations.id = execute_aggregated_blocks_binding.op_id + INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id + INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id + WHERE aggregate_operations.confirmed = true + ) + SELECT + blocks.number AS "block_number!", + blocks.root_hash AS "new_state_root!", + blocks.block_size AS "block_size!", + committed.final_hash AS "commit_tx_hash?", + verified.final_hash AS "verify_tx_hash?", + committed.created_at AS "committed_at!", + verified.created_at AS "verified_at?" + FROM blocks + INNER JOIN aggr_comm committed ON blocks.number = committed.block_number + LEFT JOIN aggr_exec verified ON blocks.number = verified.block_number + WHERE + blocks.number >= $1 + ORDER BY blocks.number ASC + LIMIT $2; + "#, + i64::from(*min_block), + i64::from(limit) + ).fetch_all(self.0.conn()) + .await?; + + metrics::histogram!("sql.chain.block.load_block_range_asc", start.elapsed()); + Ok(details) + } + + /// Loads the block headers for the given pagination query + pub async fn load_block_page( + &mut self, + query: &PaginationQuery, + ) -> QueryResult> { + let details = match query.direction { + PaginationDirection::Newer => { + self.load_block_range_asc(query.from, query.limit).await? + } + PaginationDirection::Older => { + self.load_block_range_desc(query.from, query.limit).await? + } + }; + + Ok(details) + } + /// Helper method for `find_block_by_height_or_hash`. It checks whether /// provided string can be interpreted like a hash, and if so, returns the /// hexadecimal string without prefix. @@ -450,8 +538,8 @@ impl<'a, 'c> BlockSchema<'a, 'c> { INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id WHERE aggregate_operations.confirmed = true - ) - ,aggr_exec as ( + ), + aggr_exec as ( SELECT aggregate_operations.created_at, eth_operations.final_hash, @@ -508,25 +596,25 @@ impl<'a, 'c> BlockSchema<'a, 'c> { } /// Returns the number of last block for which an aggregated operation exists. - pub async fn get_last_committed_confirmed_block(&mut self) -> QueryResult { + pub async fn get_last_committed_block(&mut self) -> QueryResult { let start = Instant::now(); let result = OperationsSchema(self.0) - .get_last_block_by_aggregated_action(AggregatedActionType::CommitBlocks, Some(true)) + .get_last_block_by_aggregated_action(AggregatedActionType::CommitBlocks, None) .await; - metrics::histogram!( - "sql.chain.block.get_last_committed_confirmed_block", - start.elapsed() - ); + metrics::histogram!("sql.chain.block.get_last_committed_block", start.elapsed()); result } - /// Returns the number of last block for which an aggregated operation exists. - pub async fn get_last_committed_block(&mut self) -> QueryResult { + /// Returns the number of last block which commit is confirmed on Ethereum. + pub async fn get_last_committed_confirmed_block(&mut self) -> QueryResult { let start = Instant::now(); let result = OperationsSchema(self.0) - .get_last_block_by_aggregated_action(AggregatedActionType::CommitBlocks, None) + .get_last_block_by_aggregated_action(AggregatedActionType::CommitBlocks, Some(true)) .await; - metrics::histogram!("sql.chain.block.get_last_committed_block", start.elapsed()); + metrics::histogram!( + "sql.chain.block.get_last_committed_confirmed_block", + start.elapsed() + ); result } @@ -558,6 +646,16 @@ impl<'a, 'c> BlockSchema<'a, 'c> { result } + pub async fn is_block_finalized(&mut self, block_number: BlockNumber) -> QueryResult { + let last_finalized_block = self + .0 + .chain() + .block_schema() + .get_last_verified_confirmed_block() + .await?; + Ok(block_number <= last_finalized_block) + } + /// Helper method for retrieving pending blocks from the database. async fn load_storage_pending_block(&mut self) -> QueryResult> { let start = Instant::now(); @@ -771,29 +869,6 @@ impl<'a, 'c> BlockSchema<'a, 'c> { Ok(()) } - // This method does not have metrics, since it is used only for the - // migration for the nft regenesis. - // Remove this function once the regenesis is complete and the tool is not - // needed anymore: ZKS-663 - pub async fn change_block_root_hash( - &mut self, - block_number: BlockNumber, - new_root_hash: Fr, - ) -> QueryResult<()> { - let root_hash_bytes = new_root_hash.to_bytes(); - sqlx::query!( - "UPDATE blocks - SET root_hash = $1 - WHERE number = $2", - root_hash_bytes, - *block_number as i64 - ) - .execute(self.0.conn()) - .await?; - - Ok(()) - } - pub async fn save_block_metadata( &mut self, block_number: BlockNumber, @@ -844,24 +919,6 @@ impl<'a, 'c> BlockSchema<'a, 'c> { Ok(()) } - // This method does not have metrics, since it is used only for the - // migration for the nft regenesis. - // Remove this function once the regenesis is complete and the tool is not - // needed anymore: ZKS-663 - pub async fn reset_account_tree_cache(&mut self, block_number: BlockNumber) -> QueryResult<()> { - sqlx::query!( - " - DELETE FROM account_tree_cache - WHERE block = $1 - ", - *block_number as u32 - ) - .execute(self.0.conn()) - .await?; - - Ok(()) - } - /// Gets stored account tree cache for a block pub async fn get_account_tree_cache( &mut self, @@ -931,6 +988,204 @@ impl<'a, 'c> BlockSchema<'a, 'c> { Ok(self.save_block(block).await?) } + /// Retrieves both L1 and L2 operations stored in the block for the given pagination query + pub async fn get_block_transactions_page( + &mut self, + query: &PaginationQuery, + ) -> QueryResult>> { + let start = Instant::now(); + let mut transaction = self.0.start_transaction().await?; + + let tx_hash = match query.from.tx_hash.inner { + Either::Left(tx_hash) => tx_hash, + Either::Right(_) => { + if let Some(tx_hash) = transaction + .chain() + .operations_ext_schema() + .get_block_last_tx_hash(query.from.block_number) + .await? + { + tx_hash + } else { + return Ok(Some(Vec::new())); + } + } + }; + let created_at_and_block = transaction + .chain() + .operations_ext_schema() + .get_tx_created_at_and_block_number(tx_hash) + .await?; + let block_txs = if let Some((time_from, block_number)) = created_at_and_block { + if block_number == query.from.block_number { + let raw_txs: Vec = match query.direction { + PaginationDirection::Newer => { + sqlx::query_as!( + TransactionItem, + r#" + WITH transactions AS ( + SELECT + tx_hash, + tx as op, + block_number, + created_at, + success, + fail_reason, + Null::bytea as eth_hash, + Null::bigint as priority_op_serialid, + block_index + FROM executed_transactions + WHERE block_number = $1 AND created_at >= $2 + ), priority_ops AS ( + SELECT + tx_hash, + operation as op, + block_number, + created_at, + true as success, + Null as fail_reason, + eth_hash, + priority_op_serialid, + block_index + FROM executed_priority_operations + WHERE block_number = $1 AND created_at >= $2 + ), everything AS ( + SELECT * FROM transactions + UNION ALL + SELECT * FROM priority_ops + ) + SELECT + tx_hash as "tx_hash!", + block_number as "block_number!", + op as "op!", + created_at as "created_at!", + success as "success!", + fail_reason as "fail_reason?", + eth_hash as "eth_hash?", + priority_op_serialid as "priority_op_serialid?" + FROM everything + ORDER BY created_at ASC, block_index ASC + LIMIT $3 + "#, + i64::from(*block_number), + time_from, + i64::from(query.limit), + ) + .fetch_all(transaction.conn()) + .await? + } + PaginationDirection::Older => { + sqlx::query_as!( + TransactionItem, + r#" + WITH transactions AS ( + SELECT + tx_hash, + tx as op, + block_number, + created_at, + success, + fail_reason, + Null::bytea as eth_hash, + Null::bigint as priority_op_serialid, + block_index + FROM executed_transactions + WHERE block_number = $1 AND created_at <= $2 + ), priority_ops AS ( + SELECT + tx_hash, + operation as op, + block_number, + created_at, + true as success, + Null as fail_reason, + eth_hash, + priority_op_serialid, + block_index + FROM executed_priority_operations + WHERE block_number = $1 AND created_at <= $2 + ), everything AS ( + SELECT * FROM transactions + UNION ALL + SELECT * FROM priority_ops + ) + SELECT + tx_hash as "tx_hash!", + block_number as "block_number!", + op as "op!", + created_at as "created_at!", + success as "success!", + fail_reason as "fail_reason?", + eth_hash as "eth_hash?", + priority_op_serialid as "priority_op_serialid?" + FROM everything + ORDER BY created_at DESC, block_index DESC + LIMIT $3 + "#, + i64::from(*block_number), + time_from, + i64::from(query.limit), + ) + .fetch_all(transaction.conn()) + .await? + } + }; + let is_block_finalized = transaction + .chain() + .block_schema() + .is_block_finalized(block_number) + .await?; + let txs: Vec = raw_txs + .into_iter() + .map(|tx| TransactionItem::transaction_from_item(tx, is_block_finalized)) + .collect(); + Some(txs) + } else { + None + } + } else { + None + }; + transaction.commit().await?; + + metrics::histogram!( + "sql.chain.block.get_block_transactions_page", + start.elapsed() + ); + Ok(block_txs) + } + + /// Returns count of both L1 and L2 operations stored in the block + pub async fn get_block_transactions_count( + &mut self, + block_number: BlockNumber, + ) -> QueryResult { + let start = Instant::now(); + let mut transaction = self.0.start_transaction().await?; + + let tx_count = sqlx::query!( + r#"SELECT count(*) as "count!" FROM executed_transactions WHERE block_number = $1"#, + i64::from(*block_number) + ) + .fetch_one(transaction.conn()) + .await? + .count; + let priority_op_count = sqlx::query!( + r#"SELECT count(*) as "count!" FROM executed_priority_operations WHERE block_number = $1"#, + i64::from(*block_number) + ) + .fetch_one(transaction.conn()) + .await? + .count; + transaction.commit().await?; + + metrics::histogram!( + "sql.chain.block.get_block_transactions_count", + start.elapsed() + ); + Ok((tx_count + priority_op_count) as u32) + } + // Removes blocks with number greater than `last_block` pub async fn remove_blocks(&mut self, last_block: BlockNumber) -> QueryResult<()> { let start = Instant::now(); @@ -969,7 +1224,10 @@ impl<'a, 'c> BlockSchema<'a, 'c> { } // Removes account tree cache for blocks with number greater than `last_block` - pub async fn remove_account_tree_cache(&mut self, last_block: BlockNumber) -> QueryResult<()> { + pub async fn remove_new_account_tree_cache( + &mut self, + last_block: BlockNumber, + ) -> QueryResult<()> { let start = Instant::now(); sqlx::query!( "DELETE FROM account_tree_cache WHERE block > $1", @@ -978,7 +1236,30 @@ impl<'a, 'c> BlockSchema<'a, 'c> { .execute(self.0.conn()) .await?; - metrics::histogram!("sql.chain.block.remove_account_tree_cache", start.elapsed()); + metrics::histogram!( + "sql.chain.block.remove_new_account_tree_cache", + start.elapsed() + ); + Ok(()) + } + + // Removes account tree cache for blocks with number less than `last_block` + pub async fn remove_old_account_tree_cache( + &mut self, + last_block: BlockNumber, + ) -> QueryResult<()> { + let start = Instant::now(); + sqlx::query!( + "DELETE FROM account_tree_cache WHERE block < $1", + *last_block as i64 + ) + .execute(self.0.conn()) + .await?; + + metrics::histogram!( + "sql.chain.block.remove_old_account_tree_cache", + start.elapsed() + ); Ok(()) } diff --git a/core/lib/storage/src/chain/block/records.rs b/core/lib/storage/src/chain/block/records.rs index 07e679a5cb..6128979246 100644 --- a/core/lib/storage/src/chain/block/records.rs +++ b/core/lib/storage/src/chain/block/records.rs @@ -62,11 +62,23 @@ pub struct BlockTransactionItem { pub tx_hash: String, pub block_number: i64, pub op: Value, - pub success: Option, + pub success: bool, pub fail_reason: Option, pub created_at: DateTime, } +#[derive(Debug, Serialize, Deserialize, FromRow, PartialEq)] +pub struct TransactionItem { + pub tx_hash: Vec, + pub block_number: i64, + pub op: Value, + pub created_at: DateTime, + pub success: bool, + pub fail_reason: Option, + pub eth_hash: Option>, + pub priority_op_serialid: Option, +} + #[derive(Debug, Clone, Serialize, Deserialize)] pub struct AccountTreeCache { pub block: i64, diff --git a/core/lib/storage/src/chain/mempool/mod.rs b/core/lib/storage/src/chain/mempool/mod.rs index 048dfc0229..f16328d31a 100644 --- a/core/lib/storage/src/chain/mempool/mod.rs +++ b/core/lib/storage/src/chain/mempool/mod.rs @@ -1,15 +1,23 @@ // Built-in deps -use std::{collections::VecDeque, convert::TryFrom, time::Instant}; +use std::{ + collections::VecDeque, + convert::{TryFrom, TryInto}, + str::FromStr, + time::Instant, +}; // External imports use itertools::Itertools; // Workspace imports +use zksync_api_types::v02::transaction::{ + ApiTxBatch, BatchStatus, TxHashSerializeWrapper, TxInBlockStatus, +}; use zksync_types::{ - mempool::SignedTxVariant, + mempool::{RevertedTxVariant, SignedTxVariant}, tx::{TxEthSignature, TxHash}, - BlockNumber, SignedZkSyncTx, + BlockNumber, ExecutedOperations, ExecutedTx, SignedZkSyncTx, }; // Local imports -use self::records::MempoolTx; +use self::records::{MempoolTx, QueuedBatchTx}; use crate::{QueryResult, StorageProcessor}; pub mod records; @@ -25,7 +33,9 @@ pub struct MempoolSchema<'a, 'c>(pub &'a mut StorageProcessor<'c>); impl<'a, 'c> MempoolSchema<'a, 'c> { /// Loads all the transactions stored in the mempool schema. - pub async fn load_txs(&mut self) -> QueryResult> { + pub async fn load_txs( + &mut self, + ) -> QueryResult<(VecDeque, VecDeque)> { let start = Instant::now(); // Load the transactions from mempool along with corresponding batch IDs. let txs: Vec = sqlx::query_as!( @@ -53,43 +63,45 @@ impl<'a, 'c> MempoolSchema<'a, 'c> { }); let mut txs = Vec::new(); + let mut reverted_txs = Vec::new(); for (batch_id, group) in grouped_txs.into_iter() { - let deserialized_txs: Vec = group - .map(|tx_object| -> QueryResult { - let tx = serde_json::from_value(tx_object.tx)?; - let sign_data = match tx_object.eth_sign_data { - None => None, - Some(sign_data_value) => serde_json::from_value(sign_data_value)?, - }; - - Ok(SignedZkSyncTx { - tx, - eth_sign_data: sign_data, - }) - }) - .collect::, anyhow::Error>>()?; - - match batch_id { - Some(batch_id) => { - // Group of batched transactions. - // Signatures will be loaded afterwards. - let variant = SignedTxVariant::batch(deserialized_txs, batch_id, vec![]); - txs.push(variant); + if let Some(batch_id) = batch_id { + let mut group = group.peekable(); + let next_priority_op_serial_id = group.peek().unwrap().next_priority_op_serial_id; + let deserialized_txs = group + .map(SignedZkSyncTx::try_from) + .collect::, serde_json::Error>>()?; + let variant = SignedTxVariant::batch(deserialized_txs, batch_id, vec![]); + + match next_priority_op_serial_id { + Some(serial_id) => { + reverted_txs.push(RevertedTxVariant::new(variant, serial_id.try_into()?)); + } + None => txs.push(variant), } - None => { - // Group of non-batched transactions. - let mut variants = deserialized_txs - .into_iter() - .map(SignedTxVariant::from) - .collect(); - txs.append(&mut variants); + } else { + for mempool_tx in group { + let next_priority_op_serial_id = mempool_tx.next_priority_op_serial_id; + let signed_tx = SignedZkSyncTx::try_from(mempool_tx)?; + let variant = SignedTxVariant::Tx(signed_tx); + + match next_priority_op_serial_id { + Some(serial_id) => { + reverted_txs + .push(RevertedTxVariant::new(variant, serial_id.try_into()?)); + } + None => txs.push(variant), + } } } } // Load signatures for batches. - for tx in &mut txs { + for tx in txs + .iter_mut() + .chain(reverted_txs.iter_mut().map(AsMut::as_mut)) + { if let SignedTxVariant::Batch(batch) = tx { let eth_signatures: Vec = sqlx::query!( "SELECT eth_signature FROM txs_batches_signatures @@ -109,20 +121,8 @@ impl<'a, 'c> MempoolSchema<'a, 'c> { } } - // Now transactions should be sorted by the nonce (transaction natural order) - // According to our convention in batch `fee transaction` would be the last one, so we would use nonce from it as a key for sort - txs.sort_by_key(|tx| match tx { - SignedTxVariant::Tx(tx) => tx.tx.nonce(), - SignedTxVariant::Batch(batch) => batch - .txs - .last() - .expect("batch must contain at least one transaction") - .tx - .nonce(), - }); - metrics::histogram!("sql.chain.mempool.load_txs", start.elapsed()); - Ok(txs.into()) + Ok((txs.into(), reverted_txs.into())) } /// Adds a new transactions batch to the mempool schema. @@ -137,13 +137,16 @@ impl<'a, 'c> MempoolSchema<'a, 'c> { anyhow::bail!("Cannot insert an empty batch"); } + let mut transaction = self.0.start_transaction().await?; + let tx_hashes: Vec = txs.iter().map(|tx| tx.tx.hash()).collect(); + // The first transaction of the batch would be inserted manually // batch_id of the inserted transaction would be the id of this batch // Will be unique cause batch_id is bigserial // Special case: batch_id == 0 <==> transaction is not a part of some batch (uses in `insert_tx` function) let batch_id = { let first_tx_data = txs[0].clone(); - let tx_hash = hex::encode(first_tx_data.hash().as_ref()); + let tx_hash = hex::encode(tx_hashes[0].as_ref()); let tx = serde_json::to_value(&first_tx_data.tx) .expect("Unserializable TX provided to the database"); let eth_sign_data = first_tx_data @@ -159,7 +162,7 @@ impl<'a, 'c> MempoolSchema<'a, 'c> { chrono::Utc::now(), eth_sign_data, ) - .execute(self.0.conn()) + .execute(transaction.conn()) .await?; sqlx::query_as!( @@ -168,44 +171,35 @@ impl<'a, 'c> MempoolSchema<'a, 'c> { ORDER BY batch_id DESC LIMIT 1", ) - .fetch_optional(self.0.conn()) + .fetch_optional(transaction.conn()) .await? .ok_or_else(|| anyhow::format_err!("Can't get maximal batch_id from mempool_txs"))? .batch_id }; // Processing of all batch transactions, except the first - let mut tx_hashes = Vec::with_capacity(txs.len()); - let mut tx_values = Vec::with_capacity(txs.len()); - let mut txs_sign_data = Vec::with_capacity(txs.len()); - - for tx_data in txs[1..].iter() { - tx_hashes.push(hex::encode(tx_data.hash().as_ref())); - tx_values.push( - serde_json::to_value(&tx_data.tx) - .expect("Unserializable TX provided to the database"), - ); - txs_sign_data.push( - tx_data - .eth_sign_data - .as_ref() - .map(|sd| serde_json::to_value(sd).expect("failed to encode EthSignData")) - .unwrap_or_default(), - ); + + for (tx_data, tx_hash) in txs[1..].iter().zip(tx_hashes[1..].iter()) { + let tx_hash = hex::encode(tx_hash.as_ref()); + let tx = serde_json::to_value(&tx_data.tx) + .expect("Unserializable TX provided to the database"); + let eth_sign_data = tx_data + .eth_sign_data + .as_ref() + .map(|sd| serde_json::to_value(sd).expect("failed to encode EthSignData")); + + sqlx::query!( + "INSERT INTO mempool_txs (tx_hash, tx, created_at, eth_sign_data, batch_id) + VALUES ($1, $2, $3, $4, $5)", + tx_hash, + tx, + chrono::Utc::now(), + eth_sign_data, + batch_id + ) + .execute(transaction.conn()) + .await?; } - sqlx::query!( - "INSERT INTO mempool_txs (tx_hash, tx, eth_sign_data, created_at, batch_id) - SELECT u.tx_hash, u.tx, u.eth_sign_data, $4, $5 - FROM UNNEST ($1::text[], $2::jsonb[], $3::jsonb[]) - AS u(tx_hash, tx, eth_sign_data)", - &tx_hashes, - &tx_values, - &txs_sign_data, - chrono::Utc::now(), - batch_id - ) - .execute(self.0.conn()) - .await?; // If there're signatures for the whole batch, store them too. for signature in eth_signatures { @@ -215,10 +209,21 @@ impl<'a, 'c> MempoolSchema<'a, 'c> { batch_id, signature ) - .execute(self.0.conn()) + .execute(transaction.conn()) .await?; } + let batch_hash = TxHash::batch_hash(&tx_hashes); + sqlx::query!( + "INSERT INTO txs_batches_hashes VALUES($1, $2)", + batch_id, + batch_hash.as_ref() + ) + .execute(transaction.conn()) + .await?; + + transaction.commit().await?; + metrics::histogram!("sql.chain.mempool.insert_batch", start.elapsed()); Ok(batch_id) } @@ -290,7 +295,7 @@ impl<'a, 'c> MempoolSchema<'a, 'c> { let tx_hash = hex::encode(tx_hash.as_ref()); let row = sqlx::query!( - "SELECT count(*) from mempool_txs + "SELECT COUNT(*) from mempool_txs WHERE tx_hash = $1", &tx_hash ) @@ -304,10 +309,23 @@ impl<'a, 'c> MempoolSchema<'a, 'c> { Ok(contains) } - /// Returns zkSync transaction with thr given hash. + /// Returns zkSync transaction with the given hash. pub async fn get_tx(&mut self, tx_hash: TxHash) -> QueryResult> { let start = Instant::now(); + let mempool_tx = self.get_mempool_tx(tx_hash).await?; + + metrics::histogram!("sql.chain", start.elapsed(), "mempool" => "get_tx"); + mempool_tx + .map(SignedZkSyncTx::try_from) + .transpose() + .map_err(anyhow::Error::from) + } + + /// Returns mempool transaction as it is stored in the database. + pub async fn get_mempool_tx(&mut self, tx_hash: TxHash) -> QueryResult> { + let start = Instant::now(); + let tx_hash = hex::encode(tx_hash.as_ref()); let mempool_tx = sqlx::query_as!( @@ -320,10 +338,7 @@ impl<'a, 'c> MempoolSchema<'a, 'c> { .await?; metrics::histogram!("sql.chain", start.elapsed(), "mempool" => "get_tx"); - mempool_tx - .map(SignedZkSyncTx::try_from) - .transpose() - .map_err(anyhow::Error::from) + Ok(mempool_tx) } /// Removes transactions that are already committed. @@ -337,7 +352,15 @@ impl<'a, 'c> MempoolSchema<'a, 'c> { /// invoked periodically with a big interval (to prevent possible database bloating). pub async fn collect_garbage(&mut self) -> QueryResult<()> { let start = Instant::now(); - let all_txs: Vec<_> = self.load_txs().await?.into_iter().collect(); + let (queue, reverted_queue) = self.load_txs().await?; + let all_txs: Vec<_> = queue + .into_iter() + .chain( + reverted_queue + .into_iter() + .map(RevertedTxVariant::into_inner), + ) + .collect(); let mut tx_hashes_to_remove = Vec::new(); for tx in all_txs { @@ -376,30 +399,153 @@ impl<'a, 'c> MempoolSchema<'a, 'c> { Ok(()) } + /// Returns mempool size. + pub async fn get_mempool_size(&mut self) -> QueryResult { + let start = Instant::now(); + + let size = sqlx::query!("SELECT COUNT(*) from mempool_txs") + .fetch_one(self.0.conn()) + .await? + .count; + + metrics::histogram!("sql.chain", start.elapsed(), "mempool" => "get_mempool_size"); + Ok(size.unwrap_or(0) as u32) + } + + /// Get info about batch in mempool. + pub async fn get_queued_batch_info( + &mut self, + batch_hash: TxHash, + ) -> QueryResult> { + let start = Instant::now(); + + let batch_data = sqlx::query_as!( + QueuedBatchTx, + r#" + SELECT tx_hash, created_at + FROM mempool_txs + INNER JOIN txs_batches_hashes + ON txs_batches_hashes.batch_id = mempool_txs.batch_id + WHERE batch_hash = $1 + ORDER BY id ASC + "#, + batch_hash.as_ref() + ) + .fetch_all(self.0.conn()) + .await?; + let result = if !batch_data.is_empty() { + let created_at = batch_data[0].created_at; + let transaction_hashes: Vec = batch_data + .iter() + .map(|tx| { + TxHashSerializeWrapper(TxHash::from_str(&format!("0x{}", tx.tx_hash)).unwrap()) + }) + .collect(); + Some(ApiTxBatch { + batch_hash, + transaction_hashes, + created_at, + batch_status: BatchStatus { + updated_at: created_at, + last_state: TxInBlockStatus::Queued, + }, + }) + } else { + None + }; + + metrics::histogram!("sql.chain", start.elapsed(), "mempool" => "get_queued_batch_info"); + Ok(result) + } + // Returns executed txs back to mempool for blocks with number greater than `last_block` pub async fn return_executed_txs_to_mempool( &mut self, - last_block: BlockNumber, + last_block_number: BlockNumber, ) -> QueryResult<()> { let start = Instant::now(); let mut transaction = self.0.start_transaction().await?; - sqlx::query!( - r#" - INSERT INTO mempool_txs (tx_hash, tx, created_at, eth_sign_data, batch_id) - SELECT tx_hash, tx, created_at, eth_sign_data, COALESCE(batch_id, 0) FROM executed_transactions - WHERE block_number > $1 - "#, - *last_block as i64 - ) - .execute(transaction.conn()) - .await?; + + let last_block = transaction + .chain() + .block_schema() + .get_block(last_block_number) + .await? + .ok_or_else(|| anyhow::Error::msg("Failed to load last block from the database"))?; + + let mut reverted_txs = Vec::new(); + let mut next_priority_op_serial_id = last_block.processed_priority_ops.1; + let mut block_number = last_block_number + 1; + + loop { + let block_transactions = transaction + .chain() + .block_schema() + .get_block_executed_ops(block_number) + .await?; + if block_transactions.is_empty() { + break; + } + vlog::info!("Reverting transactions from the block {}", block_number); + + for executed_tx in block_transactions { + if !executed_tx.is_successful() { + continue; + } + + match executed_tx { + ExecutedOperations::Tx(tx) => { + reverted_txs.push((tx, next_priority_op_serial_id)); + } + ExecutedOperations::PriorityOp(priority_op) => { + assert_eq!( + priority_op.priority_op.serial_id, + next_priority_op_serial_id + ); + next_priority_op_serial_id += 1; + } + } + } + + block_number = block_number + 1; + } + + for (reverted_tx, next_priority_op_serial_id) in reverted_txs { + let ExecutedTx { + signed_tx, + created_at, + batch_id, + .. + } = *reverted_tx; + let SignedZkSyncTx { tx, eth_sign_data } = signed_tx; + + let tx_hash = hex::encode(tx.hash().as_ref()); + let tx_value = + serde_json::to_value(tx).expect("Failed to serialize reverted transaction"); + let eth_sign_data = eth_sign_data.as_ref().map(|sign_data| { + serde_json::to_value(sign_data).expect("Failed to serialize Ethereum sign data") + }); + + sqlx::query!( + "INSERT INTO mempool_txs (tx_hash, tx, created_at, eth_sign_data, batch_id, next_priority_op_serial_id) + VALUES ($1, $2, $3, $4, $5, $6)", + tx_hash, + tx_value, + created_at, + eth_sign_data, + batch_id.unwrap_or(0i64), + next_priority_op_serial_id as i64, + ) + .execute(transaction.conn()) + .await?; + } sqlx::query!( r#" DELETE FROM executed_transactions WHERE block_number > $1 "#, - *last_block as i64 + *last_block_number as i64 ) .execute(transaction.conn()) .await?; diff --git a/core/lib/storage/src/chain/mempool/records.rs b/core/lib/storage/src/chain/mempool/records.rs index 29106dcc77..32f92b5cfe 100644 --- a/core/lib/storage/src/chain/mempool/records.rs +++ b/core/lib/storage/src/chain/mempool/records.rs @@ -18,6 +18,7 @@ pub struct MempoolTx { pub created_at: DateTime, pub eth_sign_data: Option, pub batch_id: i64, + pub next_priority_op_serial_id: Option, } impl TryFrom for SignedZkSyncTx { @@ -33,3 +34,9 @@ impl TryFrom for SignedZkSyncTx { }) } } + +#[derive(Debug, FromRow, PartialEq)] +pub struct QueuedBatchTx { + pub tx_hash: String, + pub created_at: DateTime, +} diff --git a/core/lib/storage/src/chain/operations/mod.rs b/core/lib/storage/src/chain/operations/mod.rs index 58de6ff012..61bce127c1 100644 --- a/core/lib/storage/src/chain/operations/mod.rs +++ b/core/lib/storage/src/chain/operations/mod.rs @@ -3,7 +3,11 @@ use std::time::Instant; // External imports use chrono::{Duration, Utc}; // Workspace imports -use zksync_types::{tx::TxHash, BlockNumber}; +use zksync_types::{ + aggregated_operations::{AggregatedActionType, AggregatedOperation}, + tx::TxHash, + BlockNumber, H256, +}; // Local imports use self::records::{ NewExecutedPriorityOperation, NewExecutedTransaction, StoredAggregatedOperation, @@ -13,8 +17,6 @@ use crate::chain::operations::records::StoredExecutedTransaction; use crate::chain::operations_ext::OperationsExtSchema; use crate::ethereum::EthereumSchema; use crate::{chain::mempool::MempoolSchema, QueryResult, StorageProcessor}; -use zksync_basic_types::H256; -use zksync_types::aggregated_operations::{AggregatedActionType, AggregatedOperation}; pub mod records; @@ -116,8 +118,8 @@ impl<'a, 'c> OperationsSchema<'a, 'c> { Ok(op) } - /// Retrieves priority operation from the database given its hash. - pub async fn get_executed_priority_operation_by_hash( + /// Retrieves priority operation from the database by its eth_hash. + pub async fn get_executed_priority_operation_by_eth_hash( &mut self, eth_hash: &[u8], ) -> QueryResult> { @@ -131,7 +133,7 @@ impl<'a, 'c> OperationsSchema<'a, 'c> { .await?; metrics::histogram!( - "sql.chain.operations.get_executed_priority_operation_by_hash", + "sql.chain.operations.get_executed_priority_operation_by_eth_hash", start.elapsed() ); Ok(op) @@ -265,9 +267,11 @@ impl<'a, 'c> OperationsSchema<'a, 'c> { operation: NewExecutedPriorityOperation, ) -> QueryResult<()> { let start = Instant::now(); + sqlx::query!( - "INSERT INTO executed_priority_operations (block_number, block_index, operation, from_account, to_account, priority_op_serialid, deadline_block, eth_hash, eth_block, created_at) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) + "INSERT INTO executed_priority_operations (block_number, block_index, operation, from_account, to_account, + priority_op_serialid, deadline_block, eth_hash, eth_block, created_at, eth_block_index, tx_hash) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) ON CONFLICT (priority_op_serialid) DO NOTHING", operation.block_number, @@ -280,6 +284,8 @@ impl<'a, 'c> OperationsSchema<'a, 'c> { operation.eth_hash, operation.eth_block, operation.created_at, + operation.eth_block_index, + operation.tx_hash, ) .execute(self.0.conn()) .await?; diff --git a/core/lib/storage/src/chain/operations/records.rs b/core/lib/storage/src/chain/operations/records.rs index 3ecd6f6d27..43c49ae35f 100644 --- a/core/lib/storage/src/chain/operations/records.rs +++ b/core/lib/storage/src/chain/operations/records.rs @@ -15,7 +15,7 @@ pub struct StoredOperation { pub confirmed: bool, } -#[derive(Debug, Clone, FromRow)] +#[derive(Debug, Clone, FromRow, PartialEq)] pub struct StoredExecutedPriorityOperation { pub block_number: i64, pub block_index: i32, @@ -27,6 +27,9 @@ pub struct StoredExecutedPriorityOperation { pub eth_hash: Vec, pub eth_block: i64, pub created_at: DateTime, + /// This field must be optional because of backward compatibility. + pub eth_block_index: Option, + pub tx_hash: Vec, } #[derive(Debug, Clone, FromRow)] @@ -65,6 +68,9 @@ pub struct NewExecutedPriorityOperation { pub eth_hash: Vec, pub eth_block: i64, pub created_at: DateTime, + /// This field must be optional because of backward compatibility. + pub eth_block_index: Option, + pub tx_hash: Vec, } #[derive(Debug, Clone)] diff --git a/core/lib/storage/src/chain/operations_ext/conversion.rs b/core/lib/storage/src/chain/operations_ext/conversion.rs new file mode 100644 index 0000000000..1069f2da14 --- /dev/null +++ b/core/lib/storage/src/chain/operations_ext/conversion.rs @@ -0,0 +1,146 @@ +// Built-in deps +// External imports +// Workspace imports +use zksync_api_types::v02::transaction::{ + ForcedExitData, L1Receipt, L1Transaction, L2Receipt, L2Transaction, Receipt, Transaction, + TransactionData, TxData, TxInBlockStatus, WithdrawData, WithdrawNFTData, +}; +use zksync_types::{ + tx::{EthSignData, TxHash}, + BlockNumber, EthBlockId, ZkSyncOp, ZkSyncTx, H256, +}; +// Local imports +use super::records::{StorageTxData, StorageTxReceipt}; + +impl StorageTxReceipt { + pub fn receipt_from_storage_receipt( + receipt: StorageTxReceipt, + is_block_finalized: Option, + ) -> Receipt { + if receipt.block_number.is_some() { + let status = if receipt.success.unwrap() { + if is_block_finalized.unwrap() { + TxInBlockStatus::Finalized + } else { + TxInBlockStatus::Committed + } + } else { + TxInBlockStatus::Rejected + }; + if receipt.eth_block.is_some() { + Receipt::L1(L1Receipt { + status, + eth_block: EthBlockId(receipt.eth_block.unwrap() as u64), + rollup_block: receipt + .block_number + .map(|number| BlockNumber(number as u32)), + id: receipt.priority_op_serialid.unwrap() as u64, + }) + } else { + Receipt::L2(L2Receipt { + status, + tx_hash: TxHash::from_slice(&receipt.tx_hash).unwrap(), + rollup_block: receipt + .block_number + .map(|number| BlockNumber(number as u32)), + fail_reason: receipt.fail_reason, + }) + } + } else { + Receipt::L2(L2Receipt { + status: TxInBlockStatus::Queued, + tx_hash: TxHash::from_slice(&receipt.tx_hash).unwrap(), + rollup_block: None, + fail_reason: None, + }) + } + } +} + +impl StorageTxData { + pub fn tx_data_from_zksync_tx( + tx: ZkSyncTx, + complete_withdrawals_tx_hash: Option, + ) -> TransactionData { + let tx = match tx { + ZkSyncTx::ChangePubKey(tx) => L2Transaction::ChangePubKey(tx), + ZkSyncTx::Close(tx) => L2Transaction::Close(tx), + ZkSyncTx::ForcedExit(tx) => L2Transaction::ForcedExit(Box::new(ForcedExitData { + tx: *tx, + eth_tx_hash: complete_withdrawals_tx_hash, + })), + ZkSyncTx::Transfer(tx) => L2Transaction::Transfer(tx), + ZkSyncTx::Withdraw(tx) => L2Transaction::Withdraw(Box::new(WithdrawData { + tx: *tx, + eth_tx_hash: complete_withdrawals_tx_hash, + })), + ZkSyncTx::MintNFT(tx) => L2Transaction::MintNFT(tx), + ZkSyncTx::WithdrawNFT(tx) => L2Transaction::WithdrawNFT(Box::new(WithdrawNFTData { + tx: *tx, + eth_tx_hash: complete_withdrawals_tx_hash, + })), + ZkSyncTx::Swap(tx) => L2Transaction::Swap(tx), + }; + TransactionData::L2(tx) + } + + pub fn data_from_storage_data( + data: StorageTxData, + is_block_finalized: Option, + complete_withdrawals_tx_hash: Option, + ) -> TxData { + let tx_hash = TxHash::from_slice(&data.tx_hash).unwrap(); + let tx = if data.block_number.is_some() { + let block_number = data.block_number.map(|number| BlockNumber(number as u32)); + let status = if data.success.unwrap() { + if is_block_finalized.unwrap() { + TxInBlockStatus::Finalized + } else { + TxInBlockStatus::Committed + } + } else { + TxInBlockStatus::Rejected + }; + + let op = if data.eth_hash.is_some() { + let operation: ZkSyncOp = serde_json::from_value(data.op).unwrap(); + let eth_hash = H256::from_slice(&data.eth_hash.unwrap()); + let id = data.priority_op_serialid.unwrap() as u64; + TransactionData::L1( + L1Transaction::from_executed_op(operation, eth_hash, id, tx_hash).unwrap(), + ) + } else { + Self::tx_data_from_zksync_tx( + serde_json::from_value(data.op).unwrap(), + complete_withdrawals_tx_hash, + ) + }; + Transaction { + tx_hash, + block_number, + op, + status, + fail_reason: data.fail_reason, + created_at: Some(data.created_at), + } + } else { + let tx_data = Self::tx_data_from_zksync_tx( + serde_json::from_value(data.op).unwrap(), + complete_withdrawals_tx_hash, + ); + Transaction { + tx_hash, + block_number: None, + op: tx_data, + status: TxInBlockStatus::Queued, + fail_reason: None, + created_at: Some(data.created_at), + } + }; + let eth_signature = data.eth_sign_data.map(|eth_sign_data| { + let eth_sign_data: EthSignData = serde_json::from_value(eth_sign_data).unwrap(); + eth_sign_data.signature.to_string() + }); + TxData { tx, eth_signature } + } +} diff --git a/core/lib/storage/src/chain/operations_ext/mod.rs b/core/lib/storage/src/chain/operations_ext/mod.rs index 401278babf..ebe7b008b7 100644 --- a/core/lib/storage/src/chain/operations_ext/mod.rs +++ b/core/lib/storage/src/chain/operations_ext/mod.rs @@ -5,21 +5,37 @@ use std::time::Instant; use chrono::{DateTime, Utc}; // Workspace imports +use zksync_api_types::{ + v02::{ + pagination::{AccountTxsRequest, PaginationDirection, PaginationQuery}, + transaction::{ + ApiTxBatch, BatchStatus, Receipt, Transaction, TxData, TxHashSerializeWrapper, + TxInBlockStatus, + }, + }, + Either, +}; use zksync_crypto::params; -use zksync_types::aggregated_operations::AggregatedActionType; -use zksync_types::{Address, BlockNumber, TokenId}; +use zksync_types::{ + aggregated_operations::AggregatedActionType, + {tx::TxHash, Address, BlockNumber, TokenId}, +}; // Local imports use self::records::{ - AccountCreatedAt, AccountOpReceiptResponse, AccountTxReceiptResponse, - PriorityOpReceiptResponse, TransactionsHistoryItem, TxByHashResponse, TxReceiptResponse, + AccountCreatedAt, InBlockBatchTx, PriorityOpReceiptResponse, StorageTxData, StorageTxReceipt, + TransactionsHistoryItem, TxByHashResponse, TxReceiptResponse, }; use crate::{ - chain::operations::{records::StoredExecutedPriorityOperation, OperationsSchema}, + chain::{ + block::records::TransactionItem, + operations::{records::StoredExecutedPriorityOperation, OperationsSchema}, + }, tokens::TokensSchema, QueryResult, StorageProcessor, }; +pub(crate) mod conversion; pub mod records; /// Direction to perform search of transactions to. @@ -72,6 +88,208 @@ impl<'a, 'c> OperationsExtSchema<'a, 'c> { result } + pub async fn tx_receipt_api_v02(&mut self, hash: &[u8]) -> QueryResult> { + let start = Instant::now(); + let mut transaction = self.0.start_transaction().await?; + let hash_str = hex::encode(hash); + let receipt: Option = sqlx::query_as!( + StorageTxReceipt, + r#" + WITH transaction AS ( + SELECT + tx_hash, + block_number, + success, + fail_reason, + Null::bigint as eth_block, + Null::bigint as priority_op_serialid + FROM executed_transactions + WHERE tx_hash = $1 + ), priority_op AS ( + SELECT + tx_hash, + block_number, + true as success, + Null as fail_reason, + eth_block, + priority_op_serialid + FROM executed_priority_operations + WHERE tx_hash = $1 OR eth_hash = $1 + ), mempool_tx AS ( + SELECT + decode(tx_hash, 'hex'), + Null::bigint as block_number, + Null::boolean as success, + Null as fail_reason, + Null::bigint as eth_block, + Null::bigint as priority_op_serialid + FROM mempool_txs + WHERE tx_hash = $2 + ), + everything AS ( + SELECT * FROM transaction + UNION ALL + SELECT * FROM priority_op + UNION ALL + SELECT * FROM mempool_tx + ) + SELECT + tx_hash as "tx_hash!", + block_number as "block_number?", + success as "success?", + fail_reason as "fail_reason?", + eth_block as "eth_block?", + priority_op_serialid as "priority_op_serialid?" + FROM everything + "#, + hash, + &hash_str + ) + .fetch_optional(transaction.conn()) + .await?; + + let result = if let Some(receipt) = receipt { + let is_block_finalized = if let Some(block_number) = receipt.block_number { + Some( + transaction + .chain() + .block_schema() + .is_block_finalized(BlockNumber(block_number as u32)) + .await?, + ) + } else { + None + }; + Some(StorageTxReceipt::receipt_from_storage_receipt( + receipt, + is_block_finalized, + )) + } else { + None + }; + + transaction.commit().await?; + metrics::histogram!( + "sql.chain.operations_ext.tx_receipt_api_v02", + start.elapsed() + ); + Ok(result) + } + + pub async fn tx_data_api_v02(&mut self, hash: &[u8]) -> QueryResult> { + let start = Instant::now(); + let mut transaction = self.0.start_transaction().await?; + let hash_str = hex::encode(hash); + let data: Option = sqlx::query_as!( + StorageTxData, + r#" + WITH transaction AS ( + SELECT + tx_hash, + tx as op, + block_number, + created_at, + success, + fail_reason, + Null::bytea as eth_hash, + Null::bigint as priority_op_serialid, + eth_sign_data + FROM executed_transactions + WHERE tx_hash = $1 + ), priority_op AS ( + SELECT + tx_hash, + operation as op, + block_number, + created_at, + true as success, + Null as fail_reason, + eth_hash, + priority_op_serialid, + Null::jsonb as eth_sign_data + FROM executed_priority_operations + WHERE tx_hash = $1 OR eth_hash = $1 + ), mempool_tx AS ( + SELECT + decode(tx_hash, 'hex'), + tx as op, + Null::bigint as block_number, + created_at, + Null::boolean as success, + Null as fail_reason, + Null::bytea as eth_hash, + Null::bigint as priority_op_serialid, + eth_sign_data + FROM mempool_txs + WHERE tx_hash = $2 + ), + everything AS ( + SELECT * FROM transaction + UNION ALL + SELECT * FROM priority_op + UNION ALL + SELECT * FROM mempool_tx + ) + SELECT + tx_hash as "tx_hash!", + op as "op!", + block_number as "block_number?", + created_at as "created_at!", + success as "success?", + fail_reason as "fail_reason?", + eth_hash as "eth_hash?", + priority_op_serialid as "priority_op_serialid?", + eth_sign_data as "eth_sign_data?" + FROM everything + "#, + hash, + &hash_str + ) + .fetch_optional(transaction.conn()) + .await?; + + let result = if let Some(data) = data { + let complete_withdrawals_tx_hash = if let Some(tx_type) = data.op.get("type") { + let tx_type = tx_type.as_str().unwrap(); + if tx_type == "Withdraw" || tx_type == "ForcedExit" { + transaction + .chain() + .operations_schema() + .eth_tx_for_withdrawal(&TxHash::from_slice(&data.tx_hash).unwrap()) + .await? + } else { + None + } + } else { + None + }; + + let is_block_finalized = if let Some(block_number) = data.block_number { + Some( + transaction + .chain() + .block_schema() + .is_block_finalized(BlockNumber(block_number as u32)) + .await?, + ) + } else { + None + }; + + Some(StorageTxData::data_from_storage_data( + data, + is_block_finalized, + complete_withdrawals_tx_hash, + )) + } else { + None + }; + + transaction.commit().await?; + metrics::histogram!("sql.chain.operations_ext.tx_data_api_v02", start.elapsed()); + Ok(result) + } + pub async fn get_priority_op_receipt( &mut self, op_id: u32, @@ -269,7 +487,7 @@ impl<'a, 'c> OperationsExtSchema<'a, 'c> { let start = Instant::now(); // TODO: Maybe move the transformations to api_server (ZKS-114)? let tx: Option = OperationsSchema(self.0) - .get_executed_priority_operation_by_hash(hash) + .get_executed_priority_operation_by_eth_hash(hash) .await?; let result = if let Some(tx) = tx { @@ -719,321 +937,419 @@ impl<'a, 'c> OperationsExtSchema<'a, 'c> { Ok(tx_history) } - /// Loads the range of transaction receipts applied to the given account address - /// starting from the specified transaction location. Transaction location is defined - /// by the (`block_number`, `block index`) pair. This method can be used to get receipts - /// "older" than some location or "newer" than one. - /// - /// The response for "newer" receipts is sorted in ascending order by position and for "older" - /// ones in descending order. - pub async fn get_account_transactions_receipts( + pub async fn get_account_transactions( &mut self, - address: Address, - block_number: u64, - block_index: Option, - direction: SearchDirection, - limit: u64, - ) -> QueryResult> { + query: &PaginationQuery, + ) -> QueryResult>> { let start = Instant::now(); - - let block_number = block_number as i64; - let block_index = block_index.map(|x| x as i32).unwrap_or(-1); - - let receipts: Vec<_> = match direction { - SearchDirection::Newer => { - sqlx::query_as!( - AccountTxReceiptResponse, - r#" - WITH block_details AS ( - WITH aggr_comm AS ( - SELECT - aggregate_operations.created_at, - eth_operations.final_hash, - commit_aggregated_blocks_binding.block_number - FROM aggregate_operations - INNER JOIN commit_aggregated_blocks_binding ON aggregate_operations.id = commit_aggregated_blocks_binding.op_id - INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id - INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id - WHERE aggregate_operations.confirmed = true - ) - , aggr_exec as ( - SELECT - aggregate_operations.created_at, - eth_operations.final_hash, - execute_aggregated_blocks_binding.block_number - FROM aggregate_operations - INNER JOIN execute_aggregated_blocks_binding ON aggregate_operations.id = execute_aggregated_blocks_binding.op_id - INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id - INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id - WHERE aggregate_operations.confirmed = true - ) - SELECT - blocks.number AS details_block_number, - committed.final_hash AS commit_tx_hash, - verified.final_hash AS verify_tx_hash - FROM blocks - INNER JOIN aggr_comm committed ON blocks.number = committed.block_number - LEFT JOIN aggr_exec verified ON blocks.number = verified.block_number - ) - SELECT - block_number, - block_index as "block_index?", - tx_hash, - success, - fail_reason as "fail_reason?", - details.commit_tx_hash as "commit_tx_hash?", - details.verify_tx_hash as "verify_tx_hash?" - FROM executed_transactions - LEFT JOIN block_details details ON details.details_block_number = executed_transactions.block_number - WHERE ( - (primary_account_address = $1 OR from_account = $1 OR to_account = $1) - AND ( - block_number = $2 AND ( - COALESCE(block_index, -1) >= $3 - ) OR ( - block_number > $2 + let mut transaction = self.0.start_transaction().await?; + let tx_hash = match query.from.tx_hash.inner { + Either::Left(tx_hash) => tx_hash, + Either::Right(_) => { + if let Some(tx_hash) = transaction + .chain() + .operations_ext_schema() + .get_account_last_tx_hash(query.from.address) + .await? + { + tx_hash + } else { + return Ok(Some(Vec::new())); + } + } + }; + let created_at_and_block = transaction + .chain() + .operations_ext_schema() + .get_tx_created_at_and_block_number(tx_hash) + .await?; + let txs = if let Some((time_from, _)) = created_at_and_block { + let raw_txs: Vec = match query.direction { + PaginationDirection::Newer => { + sqlx::query_as!( + TransactionItem, + r#" + WITH transactions AS ( + SELECT + tx_hash, + tx as op, + block_number, + created_at, + success, + fail_reason, + Null::bytea as eth_hash, + Null::bigint as priority_op_serialid, + block_index + FROM executed_transactions + WHERE (from_account = $1 OR to_account = $1 OR primary_account_address = $1) + AND created_at >= $2 + ), priority_ops AS ( + SELECT + tx_hash, + operation as op, + block_number, + created_at, + true as success, + Null as fail_reason, + eth_hash, + priority_op_serialid, + block_index + FROM executed_priority_operations + WHERE (from_account = $1 OR to_account = $1) AND created_at >= $2 + ), everything AS ( + SELECT * FROM transactions + UNION ALL + SELECT * FROM priority_ops ) - ) + SELECT + tx_hash as "tx_hash!", + block_number as "block_number!", + op as "op!", + created_at as "created_at!", + success as "success!", + fail_reason as "fail_reason?", + eth_hash as "eth_hash?", + priority_op_serialid as "priority_op_serialid?" + FROM everything + ORDER BY created_at ASC, block_index ASC + LIMIT $3 + "#, + query.from.address.as_bytes(), + time_from, + i64::from(query.limit), ) - ORDER BY block_number ASC, COALESCE(block_index, -1) ASC - LIMIT $4 - "#, - address.as_bytes(), - block_number, - block_index, - limit as i64, - ).fetch_all(self.0.conn()) - .await? - }, - - SearchDirection::Older => { - sqlx::query_as!( - AccountTxReceiptResponse, - r#" - WITH block_details AS ( - WITH aggr_comm AS ( - SELECT - aggregate_operations.created_at, - eth_operations.final_hash, - commit_aggregated_blocks_binding.block_number - FROM aggregate_operations - INNER JOIN commit_aggregated_blocks_binding ON aggregate_operations.id = commit_aggregated_blocks_binding.op_id - INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id - INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id - WHERE aggregate_operations.confirmed = true - ) - , aggr_exec as ( - SELECT - aggregate_operations.created_at, - eth_operations.final_hash, - execute_aggregated_blocks_binding.block_number - FROM aggregate_operations - INNER JOIN execute_aggregated_blocks_binding ON aggregate_operations.id = execute_aggregated_blocks_binding.op_id - INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id - INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id - WHERE aggregate_operations.confirmed = true - ) - SELECT - blocks.number AS details_block_number, - committed.final_hash AS commit_tx_hash, - verified.final_hash AS verify_tx_hash - FROM blocks - INNER JOIN aggr_comm committed ON blocks.number = committed.block_number - LEFT JOIN aggr_exec verified ON blocks.number = verified.block_number - ) - SELECT - block_number, - block_index as "block_index?", - tx_hash, - success, - fail_reason as "fail_reason?", - details.commit_tx_hash as "commit_tx_hash?", - details.verify_tx_hash as "verify_tx_hash?" - FROM executed_transactions - LEFT JOIN block_details details ON details.details_block_number = executed_transactions.block_number - WHERE ( - (primary_account_address = $1 OR from_account = $1 OR to_account = $1) - AND ( - block_number = $2 AND ( - COALESCE(block_index, -1) <= $3 - ) OR ( - block_number < $2 + .fetch_all(transaction.conn()) + .await? + } + PaginationDirection::Older => { + sqlx::query_as!( + TransactionItem, + r#" + WITH transactions AS ( + SELECT + tx_hash, + tx as op, + block_number, + created_at, + success, + fail_reason, + Null::bytea as eth_hash, + Null::bigint as priority_op_serialid, + block_index + FROM executed_transactions + WHERE (from_account = $1 OR to_account = $1 OR primary_account_address = $1) + AND created_at <= $2 + ), priority_ops AS ( + SELECT + tx_hash, + operation as op, + block_number, + created_at, + true as success, + Null as fail_reason, + eth_hash, + priority_op_serialid, + block_index + FROM executed_priority_operations + WHERE (from_account = $1 OR to_account = $1) AND created_at <= $2 + ), everything AS ( + SELECT * FROM transactions + UNION ALL + SELECT * FROM priority_ops ) - ) + SELECT + tx_hash as "tx_hash!", + block_number as "block_number!", + op as "op!", + created_at as "created_at!", + success as "success!", + fail_reason as "fail_reason?", + eth_hash as "eth_hash?", + priority_op_serialid as "priority_op_serialid?" + FROM everything + ORDER BY created_at DESC, block_index DESC + LIMIT $3 + "#, + query.from.address.as_bytes(), + time_from, + i64::from(query.limit), ) - ORDER BY block_number DESC, COALESCE(block_index, -1) DESC - LIMIT $4 - "#, - address.as_bytes(), - block_number, - block_index, - limit as i64, - ).fetch_all(self.0.conn()) - .await? - } + .fetch_all(transaction.conn()) + .await? + } + }; + let last_finalized = transaction + .chain() + .block_schema() + .get_last_verified_confirmed_block() + .await?; + let txs: Vec = raw_txs + .into_iter() + .map(|tx| { + if tx.block_number as u32 <= *last_finalized { + TransactionItem::transaction_from_item(tx, true) + } else { + TransactionItem::transaction_from_item(tx, false) + } + }) + .collect(); + Some(txs) + } else { + None }; + transaction.commit().await?; metrics::histogram!( - "sql.chain.operations_ext.get_account_transactions_receipts", + "sql.chain.operations_ext.get_account_transactions", start.elapsed() ); - Ok(receipts) + Ok(txs) } - /// Loads the range of priority operation receipts applied to the given account address - /// starting from the specified operation location. Transaction location is defined - /// by the (`block_number`, `block index`) pair. This method can be used to get receipts - /// "older" than some location or "newer" than one. - /// - /// The response for "newer" receipts is sorted in ascending order by position and for "older" - /// ones in descending order. - pub async fn get_account_operations_receipts( + pub async fn get_account_last_tx_hash( &mut self, address: Address, - block_number: u64, - block_index: u32, - direction: SearchDirection, - limit: u64, - ) -> QueryResult> { + ) -> QueryResult> { let start = Instant::now(); - - let block_number = block_number as i64; - let block_index = block_index as i32; - - let receipts: Vec<_> = match direction { - SearchDirection::Newer => { - sqlx::query_as!( - AccountOpReceiptResponse, - r#" - WITH block_details AS ( - WITH aggr_comm AS ( - SELECT - aggregate_operations.created_at, - eth_operations.final_hash, - commit_aggregated_blocks_binding.block_number - FROM aggregate_operations - INNER JOIN commit_aggregated_blocks_binding ON aggregate_operations.id = commit_aggregated_blocks_binding.op_id - INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id - INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id - WHERE aggregate_operations.confirmed = true - ) - , aggr_exec as ( - SELECT - aggregate_operations.created_at, - eth_operations.final_hash, - execute_aggregated_blocks_binding.block_number - FROM aggregate_operations - INNER JOIN execute_aggregated_blocks_binding ON aggregate_operations.id = execute_aggregated_blocks_binding.op_id - INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id - INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id - WHERE aggregate_operations.confirmed = true - ) - SELECT - blocks.number AS details_block_number, - committed.final_hash AS commit_tx_hash, - verified.final_hash AS verify_tx_hash - FROM blocks - INNER JOIN aggr_comm committed ON blocks.number = committed.block_number - LEFT JOIN aggr_exec verified ON blocks.number = verified.block_number - ) - SELECT - block_number, - block_index, - eth_hash, - details.commit_tx_hash as "commit_tx_hash?", - details.verify_tx_hash as "verify_tx_hash?" + let record = sqlx::query!( + r#" + WITH transactions AS ( + SELECT tx_hash, created_at, block_index + FROM executed_transactions + WHERE from_account = $1 OR to_account = $1 OR primary_account_address = $1 + ), priority_ops AS ( + SELECT tx_hash, created_at, block_index FROM executed_priority_operations - LEFT JOIN block_details details ON details.details_block_number = executed_priority_operations.block_number - WHERE ( - (from_account = $1 OR to_account = $1) - AND ( - block_number = $2 AND ( - block_index >= $3 - ) OR ( - block_number > $2 - ) - ) - ) - ORDER BY block_number ASC, block_index ASC - LIMIT $4 - "#, - address.as_bytes(), - block_number, - block_index, - limit as i64, - ).fetch_all(self.0.conn()) - .await? - }, - - SearchDirection::Older => { - sqlx::query_as!( - AccountOpReceiptResponse, - r#" - WITH block_details AS ( - WITH aggr_comm AS ( - SELECT - aggregate_operations.created_at, - eth_operations.final_hash, - commit_aggregated_blocks_binding.block_number - FROM aggregate_operations - INNER JOIN commit_aggregated_blocks_binding ON aggregate_operations.id = commit_aggregated_blocks_binding.op_id - INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id - INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id - WHERE aggregate_operations.confirmed = true - ) - , aggr_exec as ( - SELECT - aggregate_operations.created_at, - eth_operations.final_hash, - execute_aggregated_blocks_binding.block_number - FROM aggregate_operations - INNER JOIN execute_aggregated_blocks_binding ON aggregate_operations.id = execute_aggregated_blocks_binding.op_id - INNER JOIN eth_aggregated_ops_binding ON aggregate_operations.id = eth_aggregated_ops_binding.op_id - INNER JOIN eth_operations ON eth_operations.id = eth_aggregated_ops_binding.eth_op_id - WHERE aggregate_operations.confirmed = true - ) - SELECT - blocks.number AS details_block_number, - committed.final_hash AS commit_tx_hash, - verified.final_hash AS verify_tx_hash - FROM blocks - INNER JOIN aggr_comm committed ON blocks.number = committed.block_number - LEFT JOIN aggr_exec verified ON blocks.number = verified.block_number - ) - SELECT - block_number, - block_index, - eth_hash, - details.commit_tx_hash as "commit_tx_hash?", - details.verify_tx_hash as "verify_tx_hash?" + WHERE from_account = $1 OR to_account = $1 + ), everything AS ( + SELECT * FROM transactions + UNION ALL + SELECT * FROM priority_ops + ) + SELECT + tx_hash as "tx_hash!" + FROM everything + ORDER BY created_at DESC, block_index DESC + LIMIT 1 + "#, + address.as_bytes(), + ) + .fetch_optional(self.0.conn()) + .await?; + + metrics::histogram!( + "sql.chain.operations_ext.get_account_last_tx_hash", + start.elapsed() + ); + Ok(record.map(|record| TxHash::from_slice(&record.tx_hash).unwrap())) + } + + pub async fn get_block_last_tx_hash( + &mut self, + block_number: BlockNumber, + ) -> QueryResult> { + let start = Instant::now(); + let record = sqlx::query!( + r#" + WITH transactions AS ( + SELECT tx_hash, created_at, block_index + FROM executed_transactions + WHERE block_number = $1 + ), priority_ops AS ( + SELECT tx_hash, created_at, block_index FROM executed_priority_operations - LEFT JOIN block_details details ON details.details_block_number = executed_priority_operations.block_number - WHERE ( - (from_account = $1 OR to_account = $1) - AND ( - block_number = $2 AND ( - block_index <= $3 - ) OR ( - block_number < $2 - ) - ) - ) - ORDER BY block_number DESC, block_index DESC - LIMIT $4 - "#, - address.as_bytes(), - block_number, - block_index, - limit as i64, - ).fetch_all(self.0.conn()) - .await? - } + WHERE block_number = $1 + ), everything AS ( + SELECT * FROM transactions + UNION ALL + SELECT * FROM priority_ops + ) + SELECT + tx_hash as "tx_hash!" + FROM everything + ORDER BY created_at DESC, block_index DESC + LIMIT 1 + "#, + i64::from(*block_number) + ) + .fetch_optional(self.0.conn()) + .await?; + + metrics::histogram!( + "sql.chain.operations_ext.get_block_last_tx_hash", + start.elapsed() + ); + Ok(record.map(|record| TxHash::from_slice(&record.tx_hash).unwrap())) + } + + pub async fn get_account_transactions_count(&mut self, address: Address) -> QueryResult { + let start = Instant::now(); + let mut transaction = self.0.start_transaction().await?; + let last_committed = transaction + .chain() + .block_schema() + .get_last_committed_confirmed_block() + .await?; + let tx_count = sqlx::query!( + r#" + SELECT COUNT(*) as "count!" FROM executed_transactions + WHERE block_number <= $1 AND (from_account = $2 OR to_account = $2 OR primary_account_address = $2) + "#, + i64::from(*last_committed), + address.as_bytes() + ) + .fetch_one(transaction.conn()) + .await? + .count; + + let priority_op_count = sqlx::query!( + r#" + SELECT COUNT(*) as "count!" FROM executed_priority_operations + WHERE block_number <= $1 AND (from_account = $2 OR to_account = $2) + "#, + i64::from(*last_committed), + address.as_bytes() + ) + .fetch_one(transaction.conn()) + .await? + .count; + transaction.commit().await?; + + metrics::histogram!( + "sql.chain.operations_ext.get_account_transactions_count", + start.elapsed() + ); + Ok((tx_count + priority_op_count) as u32) + } + + /// Returns `created_at` and `block_number` fields for transaction with given hash. + pub async fn get_tx_created_at_and_block_number( + &mut self, + tx_hash: TxHash, + ) -> QueryResult, BlockNumber)>> { + let start = Instant::now(); + let mut transaction = self.0.start_transaction().await?; + + let record = sqlx::query!( + "SELECT created_at, block_number FROM executed_transactions + WHERE tx_hash = $1", + tx_hash.as_ref() + ) + .fetch_optional(transaction.conn()) + .await?; + + let result = if let Some(record) = record { + Some((record.created_at, BlockNumber(record.block_number as u32))) + } else { + let record = sqlx::query!( + "SELECT created_at, block_number FROM executed_priority_operations + WHERE tx_hash = $1", + tx_hash.as_ref() + ) + .fetch_optional(transaction.conn()) + .await?; + + record.map(|record| (record.created_at, BlockNumber(record.block_number as u32))) }; + transaction.commit().await?; metrics::histogram!( - "sql.chain.operations_ext.get_account_operations_receipts", + "sql.chain.block.get_tx_created_at_and_block_number", start.elapsed() ); - Ok(receipts) + Ok(result) + } + + pub async fn get_in_block_batch_info( + &mut self, + batch_hash: TxHash, + ) -> QueryResult> { + let start = Instant::now(); + let mut transaction = self.0.start_transaction().await?; + + let batch_data: Vec = sqlx::query_as!( + InBlockBatchTx, + r#" + SELECT tx_hash, created_at, success, block_number + FROM executed_transactions + INNER JOIN txs_batches_hashes + ON txs_batches_hashes.batch_id = COALESCE(executed_transactions.batch_id, 0) + WHERE batch_hash = $1 + ORDER BY created_at ASC, block_index ASC + "#, + batch_hash.as_ref() + ) + .fetch_all(transaction.conn()) + .await?; + let result = if !batch_data.is_empty() { + let created_at = batch_data[0].created_at; + let transaction_hashes: Vec = batch_data + .iter() + .map(|tx| TxHashSerializeWrapper(TxHash::from_slice(&tx.tx_hash).unwrap())) + .collect(); + let block_number = BlockNumber(batch_data[0].block_number as u32); + let batch_status = if batch_data[0].success { + if let Some(op) = transaction + .chain() + .operations_schema() + .get_stored_aggregated_operation( + block_number, + AggregatedActionType::ExecuteBlocks, + ) + .await + { + BatchStatus { + updated_at: op.created_at, + last_state: TxInBlockStatus::Finalized, + } + } else { + BatchStatus { + updated_at: created_at, + last_state: TxInBlockStatus::Committed, + } + } + } else { + BatchStatus { + updated_at: created_at, + last_state: TxInBlockStatus::Rejected, + } + }; + Some(ApiTxBatch { + batch_hash, + transaction_hashes, + created_at, + batch_status, + }) + } else { + None + }; + transaction.commit().await?; + + metrics::histogram!("sql.chain.block.get_in_block_batch_info", start.elapsed()); + Ok(result) + } + + pub async fn get_batch_info(&mut self, batch_hash: TxHash) -> QueryResult> { + let start = Instant::now(); + let mut transaction = self.0.start_transaction().await?; + + let result = if let Some(batch_info) = transaction + .chain() + .operations_ext_schema() + .get_in_block_batch_info(batch_hash) + .await? + { + Some(batch_info) + } else { + transaction + .chain() + .mempool_schema() + .get_queued_batch_info(batch_hash) + .await? + }; + transaction.commit().await?; + + metrics::histogram!("sql.chain.block.get_batch_info", start.elapsed()); + Ok(result) } } diff --git a/core/lib/storage/src/chain/operations_ext/records.rs b/core/lib/storage/src/chain/operations_ext/records.rs index 9007288ad2..5619ec0a37 100644 --- a/core/lib/storage/src/chain/operations_ext/records.rs +++ b/core/lib/storage/src/chain/operations_ext/records.rs @@ -8,7 +8,6 @@ use serde::{Deserialize, Serialize}; use serde_json::value::Value; use sqlx::FromRow; // Workspace imports - // Local imports use crate::prover::records::ProverRun; @@ -141,3 +140,33 @@ pub struct AccountOpReceiptResponse { /// given priority operation. pub verify_tx_hash: Option>, } + +#[derive(Debug, FromRow, PartialEq)] +pub struct InBlockBatchTx { + pub tx_hash: Vec, + pub created_at: DateTime, + pub success: bool, + pub block_number: i64, +} + +#[derive(Debug, FromRow, PartialEq)] +pub struct StorageTxReceipt { + pub tx_hash: Vec, + pub block_number: Option, + pub success: Option, + pub fail_reason: Option, + pub eth_block: Option, + pub priority_op_serialid: Option, +} + +pub struct StorageTxData { + pub tx_hash: Vec, + pub block_number: Option, + pub op: Value, + pub success: Option, + pub fail_reason: Option, + pub created_at: DateTime, + pub eth_hash: Option>, + pub priority_op_serialid: Option, + pub eth_sign_data: Option, +} diff --git a/core/lib/storage/src/config/mod.rs b/core/lib/storage/src/config/mod.rs index ce11070dcd..089c8f675e 100644 --- a/core/lib/storage/src/config/mod.rs +++ b/core/lib/storage/src/config/mod.rs @@ -32,7 +32,7 @@ impl<'a, 'c> ConfigSchema<'a, 'c> { // Stores the server configuration for tests. #[doc(hidden)] #[allow(dead_code)] - pub(crate) async fn store_config( + pub async fn store_config( &mut self, contract_addr: Address, gov_contract_addr: Address, diff --git a/core/lib/storage/src/event/mod.rs b/core/lib/storage/src/event/mod.rs index d3518580c5..aa24ff3bf4 100644 --- a/core/lib/storage/src/event/mod.rs +++ b/core/lib/storage/src/event/mod.rs @@ -121,7 +121,7 @@ impl<'a, 'c> EventSchema<'a, 'c> { let block_details = transaction .chain() .block_schema() - .load_block_range(block_number, 1) + .load_block_range_desc(block_number, 1) .await?; // If there're no block details for the given block number, // ignore the event. Since the `eth_sender` is currently @@ -130,12 +130,14 @@ impl<'a, 'c> EventSchema<'a, 'c> { let block_details = match block_details.into_iter().next() { Some(block_details) => block_details, None => { - vlog::warn!( - "Couldn't create block event, no block details found in the database. \ - Block number: {}, status: {:?}", - *block_number, - status - ); + // Logging is currently disabled. + // + // vlog::warn!( + // "Couldn't create block event, no block details found in the database. \ + // Block number: {}, status: {:?}", + // *block_number, + // status + // ); return Ok(()); } }; @@ -186,8 +188,7 @@ impl<'a, 'c> EventSchema<'a, 'c> { }, ) }) - .filter(|x| x.is_some()) - .map(|x| x.unwrap()) + .flatten() .collect(); transaction @@ -258,11 +259,13 @@ impl<'a, 'c> EventSchema<'a, 'c> { { Ok(account_id) => account_id, _ => { - vlog::warn!( - "Couldn't create transaction event, no account id exists \ - in the database. Operation: {:?}", - executed_operation - ); + // Logging is currently disabled. + // + // vlog::warn!( + // "Couldn't create transaction event, no account id exists \ + // in the database. Operation: {:?}", + // executed_operation + // ); continue; } }; @@ -315,11 +318,13 @@ impl<'a, 'c> EventSchema<'a, 'c> { { Ok(account_id) => account_id, _ => { - vlog::warn!( - "Couldn't create transaction event, no account id exists \ - in the database. Operation: {:?}", - executed_tx - ); + // Logging is currently disabled. + // + // vlog::warn!( + // "Couldn't create transaction event, no account id exists \ + // in the database. Operation: {:?}", + // rejected_tx + // ); continue; } }; diff --git a/core/lib/storage/src/tests/chain/accounts.rs b/core/lib/storage/src/tests/chain/accounts.rs index 6f1913ee86..1c1116c450 100644 --- a/core/lib/storage/src/tests/chain/accounts.rs +++ b/core/lib/storage/src/tests/chain/accounts.rs @@ -47,7 +47,26 @@ async fn stored_accounts(mut storage: StorageProcessor<'_>) -> QueryResult<()> { let block_size = 100; + let (last_finalized, _) = AccountSchema(&mut storage) + .account_and_last_block(AccountId(1)) + .await?; + let last_committed = AccountSchema(&mut storage) + .last_committed_block_with_update_for_acc(AccountId(1)) + .await?; + assert_eq!(last_finalized, 0); + assert_eq!(*last_committed, 0); + + // Create several accounts. let accounts = AccountMap::default(); + let (last_finalized, _) = AccountSchema(&mut storage) + .account_and_last_block(AccountId(1)) + .await?; + let last_committed = AccountSchema(&mut storage) + .last_committed_block_with_update_for_acc(AccountId(1)) + .await?; + assert_eq!(last_finalized, 0); + assert_eq!(*last_committed, 0); + // Create several accounts. let (mut accounts_block, mut updates_block) = apply_random_updates(accounts, &mut rng); @@ -81,6 +100,16 @@ async fn stored_accounts(mut storage: StorageProcessor<'_>) -> QueryResult<()> { // Get the accounts by their addresses. for (account_id, account) in accounts_block.iter() { let mut account = account.clone(); + + let (last_finalized, _) = AccountSchema(&mut storage) + .account_and_last_block(*account_id) + .await?; + let last_committed = AccountSchema(&mut storage) + .last_committed_block_with_update_for_acc(*account_id) + .await?; + assert_eq!(last_finalized, 0); + assert_eq!(*last_committed, 1); + let account_state = AccountSchema(&mut storage) .account_state_by_address(account.address) .await?; @@ -108,7 +137,8 @@ async fn stored_accounts(mut storage: StorageProcessor<'_>) -> QueryResult<()> { assert_eq!( AccountSchema(&mut storage) .last_committed_state_for_account(*account_id) - .await?, + .await? + .1, Some(got_account) ); @@ -141,6 +171,15 @@ async fn stored_accounts(mut storage: StorageProcessor<'_>) -> QueryResult<()> { // After that all the accounts should have a verified state. for (account_id, account) in accounts_block { + let (last_finalized, _) = AccountSchema(&mut storage) + .account_and_last_block(account_id) + .await?; + let last_committed = AccountSchema(&mut storage) + .last_committed_block_with_update_for_acc(account_id) + .await?; + assert_eq!(last_finalized, 1); + assert_eq!(*last_committed, 1); + let account_state = AccountSchema(&mut storage) .account_state_by_id(account_id) .await?; diff --git a/core/lib/storage/src/tests/chain/block.rs b/core/lib/storage/src/tests/chain/block.rs index db37f07cd9..d4f0c07833 100644 --- a/core/lib/storage/src/tests/chain/block.rs +++ b/core/lib/storage/src/tests/chain/block.rs @@ -1,11 +1,19 @@ // External imports // Workspace imports +use zksync_api_types::v02::pagination::{ + ApiEither, BlockAndTxHash, PaginationDirection, PaginationQuery, +}; use zksync_crypto::{convert::FeConvert, rand::XorShiftRng}; use zksync_types::{ - aggregated_operations::AggregatedActionType, helpers::apply_updates, tx::ChangePubKeyType, + aggregated_operations::AggregatedActionType, + helpers::apply_updates, + tx::{ChangePubKeyType, TxHash}, AccountId, AccountMap, AccountUpdate, AccountUpdates, BlockNumber, TokenId, H256, }; // Local imports +use super::operations_ext::{ + commit_block, commit_schema_data, setup::TransactionsHistoryTestSetup, verify_block, +}; use crate::{ chain::{ block::{records::StorageBlockDetails, BlockSchema}, @@ -328,12 +336,12 @@ async fn test_find_block_by_height_or_hash(mut storage: StorageProcessor<'_>) -> Ok(()) } -/// Checks that `load_block_range` method loads the range of blocks correctly. +/// Checks that `load_block_page` method loads the range of blocks correctly. #[db_test] -async fn test_block_range(mut storage: StorageProcessor<'_>) -> QueryResult<()> { - /// Loads the block range and checks that every block in the response is +async fn test_block_page(mut storage: StorageProcessor<'_>) -> QueryResult<()> { + /// Loads the block range in desc order and checks that every block in the response is /// equal to the one obtained from `find_block_by_height_or_hash` method. - async fn check_block_range( + async fn check_block_range_desc( storage: &mut StorageProcessor<'_>, max_block: BlockNumber, limit: u32, @@ -344,8 +352,16 @@ async fn test_block_range(mut storage: StorageProcessor<'_>) -> QueryResult<()> BlockNumber(1) }; let block_range = BlockSchema(storage) - .load_block_range(max_block, limit) + .load_block_range_desc(max_block, limit) .await?; + let block_page = BlockSchema(storage) + .load_block_page(&PaginationQuery { + from: max_block, + limit, + direction: PaginationDirection::Older, + }) + .await?; + assert_eq!(block_range, block_page); // Go in the reversed order, since the blocks themselves are ordered backwards. for (idx, block_number) in (*start_block..=*max_block).rev().enumerate() { let expected = BlockSchema(storage) @@ -364,6 +380,47 @@ async fn test_block_range(mut storage: StorageProcessor<'_>) -> QueryResult<()> Ok(()) } + /// Loads the block range in asc order and checks that every block in the response is + /// equal to the one obtained from `find_block_by_height_or_hash` method. + async fn check_block_range_asc( + storage: &mut StorageProcessor<'_>, + min_block: BlockNumber, + limit: u32, + max_block: BlockNumber, + ) -> QueryResult<()> { + let last_block = if *max_block >= *min_block + limit { + min_block + limit - 1 + } else { + max_block + }; + let block_range = BlockSchema(storage) + .load_block_range_asc(min_block, limit) + .await?; + let block_page = BlockSchema(storage) + .load_block_page(&PaginationQuery { + from: min_block, + limit, + direction: PaginationDirection::Newer, + }) + .await?; + assert_eq!(block_range, block_page); + for (idx, block_number) in (*min_block..=*last_block).enumerate() { + let expected = BlockSchema(storage) + .find_block_by_height_or_hash(block_number.to_string()) + .await + .unwrap_or_else(|| { + panic!( + "Can't load the existing block with the index {}", + block_number + ) + }); + let got = &block_range[idx]; + assert_eq!(got, &expected); + } + + Ok(()) + } + // Below lies the initialization of the data for the test. let mut rng = create_rng(); @@ -469,10 +526,26 @@ async fn test_block_range(mut storage: StorageProcessor<'_>) -> QueryResult<()> (n_commited_block_number, 1), (n_commited_block_number, 0), (n_commited_block_number, 100), + (n_verified_block_number + 1, n_verified), ]; for (max_block, limit) in test_vector { - check_block_range(&mut storage, max_block, limit).await?; + check_block_range_desc(&mut storage, max_block, limit).await?; + } + + let test_vector = vec![ + (BlockNumber(1), n_committed), + (BlockNumber(1), n_verified + 1), + (BlockNumber(2), n_verified + 1), + (n_verified_block_number + 1, n_committed - n_verified), + (BlockNumber(2), 0), + (BlockNumber(2), 1), + (BlockNumber(2), 3), + (BlockNumber(2), 10), + ]; + + for (max_block, limit) in test_vector { + check_block_range_asc(&mut storage, max_block, limit, n_commited_block_number).await?; } Ok(()) @@ -592,7 +665,7 @@ async fn unconfirmed_transaction(mut storage: StorageProcessor<'_>) -> QueryResu .is_none()); let block_range = BlockSchema(&mut storage) - .load_block_range(BlockNumber(n_committed), 100) + .load_block_range_desc(BlockNumber(n_committed), 100) .await?; assert_eq!(block_range.len(), n_commited_confirmed as usize); @@ -930,6 +1003,39 @@ async fn test_operations_counter(mut storage: StorageProcessor<'_>) -> QueryResu Ok(()) } +/// Checks that `get_block_status_and_last_updated` method works correctly. +#[db_test] +async fn test_is_block_finalized(mut storage: StorageProcessor<'_>) -> QueryResult<()> { + let block_number = BlockNumber(1); + + let result = storage + .chain() + .block_schema() + .is_block_finalized(BlockNumber(1)) + .await?; + assert!(!result); + + commit_block(&mut storage, block_number).await?; + + let result = storage + .chain() + .block_schema() + .is_block_finalized(BlockNumber(1)) + .await?; + assert!(!result); + + verify_block(&mut storage, block_number).await?; + + let result = storage + .chain() + .block_schema() + .is_block_finalized(BlockNumber(1)) + .await?; + assert!(result); + + Ok(()) +} + /// Check that blocks are removed correctly. #[db_test] async fn test_remove_blocks(mut storage: StorageProcessor<'_>) -> QueryResult<()> { @@ -993,9 +1099,138 @@ async fn test_remove_pending_block(mut storage: StorageProcessor<'_>) -> QueryRe Ok(()) } +/// Checks that `get_block_transactions_page` method works correctly. +#[db_test] +async fn test_get_block_transactions_page(mut storage: StorageProcessor<'_>) -> QueryResult<()> { + let mut setup = TransactionsHistoryTestSetup::new(); + setup.add_block(1); + setup.add_block(2); + commit_schema_data(&mut storage, &setup).await?; + + let tx_hashes = vec![ + setup.get_tx_hash(0, 0), + setup.get_tx_hash(0, 1), + setup.get_tx_hash(0, 2), + setup.get_tx_hash(0, 3), + setup.get_tx_hash(0, 4), + setup.get_tx_hash(0, 5), + setup.get_tx_hash(0, 6), + ]; + + for (tx_hash, limit, direction, expected, test_name) in vec![ + ( + tx_hashes[0], + 5, + PaginationDirection::Newer, + tx_hashes[0..5].to_vec(), + "First 5 txs", + ), + ( + tx_hashes[0], + 1, + PaginationDirection::Newer, + tx_hashes[0..1].to_vec(), + "1 tx (newer)", + ), + ( + tx_hashes[1], + 5, + PaginationDirection::Newer, + tx_hashes[1..6].to_vec(), + "Middle 5 txs (newer)", + ), + ( + tx_hashes[5], + 100, + PaginationDirection::Newer, + tx_hashes[5..].to_vec(), + "Big limit (newer)", + ), + ( + tx_hashes[6], + 5, + PaginationDirection::Older, + tx_hashes[2..=6].iter().rev().cloned().collect(), + "Last 5 txs", + ), + ( + tx_hashes[6], + 1, + PaginationDirection::Older, + tx_hashes[6..=6].iter().rev().cloned().collect(), + "1 tx (older)", + ), + ( + tx_hashes[5], + 5, + PaginationDirection::Older, + tx_hashes[1..=5].iter().rev().cloned().collect(), + "Middle 5 txs (older)", + ), + ( + tx_hashes[5], + 100, + PaginationDirection::Older, + tx_hashes[..=5].iter().rev().cloned().collect(), + "Big limit (older)", + ), + ] { + let actual: Vec = storage + .chain() + .block_schema() + .get_block_transactions_page(&PaginationQuery { + from: BlockAndTxHash { + block_number: BlockNumber(1), + tx_hash: ApiEither::from(tx_hash), + }, + limit, + direction, + }) + .await? + .unwrap() + .into_iter() + .map(|tx| tx.tx_hash) + .collect(); + assert_eq!(actual, expected, "\"{}\", failed", test_name); + } + + // Check that it returns None for unknown tx_hash + setup.add_block(3); + let result = storage + .chain() + .block_schema() + .get_block_transactions_page(&PaginationQuery { + from: BlockAndTxHash { + block_number: BlockNumber(3), + tx_hash: ApiEither::from(setup.get_tx_hash(2, 0)), + }, + limit: 1, + direction: PaginationDirection::Newer, + }) + .await?; + assert!(result.is_none()); + + // Check that it returns None if block of `from` tx differs from `block_number` + let result = storage + .chain() + .block_schema() + .get_block_transactions_page(&PaginationQuery { + from: BlockAndTxHash { + block_number: BlockNumber(2), + tx_hash: ApiEither::from(setup.get_tx_hash(0, 0)), + }, + limit: 1, + direction: PaginationDirection::Newer, + }) + .await?; + assert!(result.is_none()); + + Ok(()) +} + /// Check that account tree cache is removed correctly. #[db_test] -async fn test_remove_account_tree_cache(mut storage: StorageProcessor<'_>) -> QueryResult<()> { +async fn test_remove_new_account_tree_cache(mut storage: StorageProcessor<'_>) -> QueryResult<()> { // Insert account tree cache for 5 blocks. for block_number in 1..=5 { BlockSchema(&mut storage) @@ -1012,7 +1247,7 @@ async fn test_remove_account_tree_cache(mut storage: StorageProcessor<'_>) -> Qu // Remove account tree cache for blocks with numbers greater than 2. BlockSchema(&mut storage) - .remove_account_tree_cache(BlockNumber(2)) + .remove_new_account_tree_cache(BlockNumber(2)) .await?; // Check if account tree cache for the 2nd block is present, and for the 3rd is not. @@ -1027,3 +1262,38 @@ async fn test_remove_account_tree_cache(mut storage: StorageProcessor<'_>) -> Qu Ok(()) } + +/// Check that account tree cache is removed correctly. +#[db_test] +async fn test_remove_old_account_tree_cache(mut storage: StorageProcessor<'_>) -> QueryResult<()> { + // Insert account tree cache for 5 blocks. + for block_number in 1..=5 { + BlockSchema(&mut storage) + .save_block(gen_sample_block( + BlockNumber(block_number), + BLOCK_SIZE_CHUNKS, + Default::default(), + )) + .await?; + BlockSchema(&mut storage) + .store_account_tree_cache(BlockNumber(block_number), serde_json::Value::default()) + .await?; + } + + // Remove account tree cache for blocks with numbers greater than 2. + BlockSchema(&mut storage) + .remove_old_account_tree_cache(BlockNumber(3)) + .await?; + + // Check that the account tree cache for block #3 is present, and for block #1 is not. + assert!(BlockSchema(&mut storage) + .get_account_tree_cache_block(BlockNumber(3)) + .await? + .is_some()); + assert!(BlockSchema(&mut storage) + .get_account_tree_cache_block(BlockNumber(1)) + .await? + .is_none()); + + Ok(()) +} diff --git a/core/lib/storage/src/tests/chain/mempool.rs b/core/lib/storage/src/tests/chain/mempool.rs index 5d35aaf228..eab6b742be 100644 --- a/core/lib/storage/src/tests/chain/mempool.rs +++ b/core/lib/storage/src/tests/chain/mempool.rs @@ -1,10 +1,14 @@ // External imports -use zksync_crypto::rand::{Rng, SeedableRng, XorShiftRng}; +use chrono::Utc; // Workspace imports +use zksync_crypto::rand::{Rng, SeedableRng, XorShiftRng}; use zksync_types::{ + block::Block, mempool::SignedTxVariant, - tx::{ChangePubKey, Transfer, Withdraw}, - AccountId, Address, BlockNumber, Nonce, SignedZkSyncTx, TokenId, ZkSyncTx, + priority_ops::FullExit, + tx::{ChangePubKey, Transfer, TxHash, Withdraw}, + AccountId, Address, BlockNumber, ExecutedPriorityOp, FullExitOp, Nonce, PriorityOp, + SignedZkSyncTx, TokenId, ZkSyncOp, ZkSyncPriorityOp, ZkSyncTx, H256, }; // Local imports use crate::test_data::gen_eth_sign_data; @@ -12,7 +16,11 @@ use crate::tests::db_test; use crate::{ chain::{ mempool::MempoolSchema, - operations::{records::NewExecutedTransaction, OperationsSchema}, + operations::{ + records::{NewExecutedPriorityOperation, NewExecutedTransaction}, + OperationsSchema, + }, + operations_ext::OperationsExtSchema, }, QueryResult, StorageProcessor, }; @@ -137,7 +145,7 @@ async fn store_load(mut storage: StorageProcessor<'_>) -> QueryResult<()> { } // Load the txs and check that they match the expected list. - let txs_from_db = MempoolSchema(&mut storage) + let (txs_from_db, _) = MempoolSchema(&mut storage) .load_txs() .await .expect("Can't load txs"); @@ -194,7 +202,7 @@ async fn store_load_batch(mut storage: StorageProcessor<'_>) -> QueryResult<()> .await?; // Load the txs and check that they match the expected list. - let txs_from_db = MempoolSchema(&mut storage).load_txs().await?; + let (txs_from_db, _) = MempoolSchema(&mut storage).load_txs().await?; assert_eq!(txs_from_db.len(), elements_count); assert!(matches!(txs_from_db[0], SignedTxVariant::Tx(_))); @@ -238,7 +246,7 @@ async fn remove_txs(mut storage: StorageProcessor<'_>) -> QueryResult<()> { } // Load the txs and check that they match the expected list. - let txs_from_db = MempoolSchema(&mut storage).load_txs().await?; + let (txs_from_db, _) = MempoolSchema(&mut storage).load_txs().await?; assert_eq!(txs_from_db.len(), retained_hashes.len()); for (expected_hash, tx_from_db) in retained_hashes.iter().zip(txs_from_db) { @@ -287,7 +295,7 @@ async fn collect_garbage(mut storage: StorageProcessor<'_>) -> QueryResult<()> { let retained_hashes: Vec<_> = txs[1..].iter().map(|tx| tx.hash()).collect(); // Load the txs and check that they match the expected list. - let txs_from_db = MempoolSchema(&mut storage).load_txs().await?; + let (txs_from_db, _) = MempoolSchema(&mut storage).load_txs().await?; assert_eq!(txs_from_db.len(), retained_hashes.len()); for (expected_hash, tx_from_db) in retained_hashes.iter().zip(txs_from_db) { @@ -306,10 +314,7 @@ async fn contains_and_get_tx(mut storage: StorageProcessor<'_>) -> QueryResult<( for tx in &txs { let tx_hash = tx.hash(); - assert_eq!( - MempoolSchema(&mut storage).contains_tx(tx_hash).await?, - false - ); + assert!(!MempoolSchema(&mut storage).contains_tx(tx_hash).await?); assert!(MempoolSchema(&mut storage).get_tx(tx_hash).await?.is_none()); } @@ -330,10 +335,7 @@ async fn contains_and_get_tx(mut storage: StorageProcessor<'_>) -> QueryResult<( for tx in &txs { let tx_hash = tx.hash(); - assert_eq!( - MempoolSchema(&mut storage).contains_tx(tx_hash).await?, - true - ); + assert!(MempoolSchema(&mut storage).contains_tx(tx_hash).await?); assert_eq!( MempoolSchema(&mut storage) .get_tx(tx_hash) @@ -348,11 +350,91 @@ async fn contains_and_get_tx(mut storage: StorageProcessor<'_>) -> QueryResult<( Ok(()) } +/// Checks that batch is got from mempool correctly +#[db_test] +async fn test_get_batch_info_from_mempool(mut storage: StorageProcessor<'_>) -> QueryResult<()> { + let txs = gen_transfers(5); + MempoolSchema(&mut storage) + .insert_batch(&txs, Vec::new()) + .await?; + + let tx_hashes: Vec = txs.into_iter().map(|tx| tx.hash()).collect(); + let batch_hash = TxHash::batch_hash(&tx_hashes); + + let batch = OperationsExtSchema(&mut storage) + .get_batch_info(batch_hash) + .await? + .unwrap(); + + let actual_tx_hashes: Vec = batch + .transaction_hashes + .into_iter() + .map(|tx_hash| tx_hash.0) + .collect(); + assert_eq!(actual_tx_hashes, tx_hashes); + + Ok(()) +} + /// Checks that returning executed txs to mempool works correctly. #[db_test] async fn test_return_executed_txs_to_mempool(mut storage: StorageProcessor<'_>) -> QueryResult<()> { let txs = gen_transfers(5); + // Save the last block. + storage + .chain() + .block_schema() + .save_block(Block { + block_number: BlockNumber(3), + new_root_hash: Default::default(), + fee_account: AccountId(0), + block_transactions: Vec::new(), + processed_priority_ops: (0u64, 1), // Next priority operation serial id is 1. + block_chunks_size: 0usize, + commit_gas_limit: Default::default(), + verify_gas_limit: Default::default(), + block_commitment: Default::default(), + timestamp: 0u64, + }) + .await?; + + // Save priority operation with serial id 1. + let priority_op = FullExit { + account_id: AccountId(0), + eth_address: Address::zero(), + token: TokenId(0), + is_legacy: false, + }; + let exec_priority_op = ExecutedPriorityOp { + priority_op: PriorityOp { + serial_id: 1, + data: ZkSyncPriorityOp::FullExit(priority_op.clone()), + deadline_block: 0, + eth_hash: H256::zero(), + eth_block: 0, + eth_block_index: None, + }, + op: ZkSyncOp::FullExit(Box::new(FullExitOp { + priority_op, + withdraw_amount: None, + creator_account_id: None, + creator_address: None, + serial_id: None, + content_hash: None, + })), + block_index: 0, + created_at: Utc::now(), + }; + storage + .chain() + .operations_schema() + .store_executed_priority_op(NewExecutedPriorityOperation::prepare_stored_priority_op( + exec_priority_op, + BlockNumber(5), + )) + .await?; + // Insert 5 executed transactions. for block_number in 1..=5 { let tx_data = txs.get(block_number - 1).unwrap(); @@ -384,7 +466,10 @@ async fn test_return_executed_txs_to_mempool(mut storage: StorageProcessor<'_>) .await?; // Check that the first 3 txs are executed and 2 last are in mempool. - assert_eq!(MempoolSchema(&mut storage).load_txs().await?.len(), 2); + let (mempool_txs, reverted_txs) = storage.chain().mempool_schema().load_txs().await?; + // No transactions in the mempool apart from the reverted ones. + assert!(mempool_txs.is_empty()); + assert_eq!(reverted_txs.len(), 2); for block_number in 1..=5 { let tx_hash = txs.get(block_number - 1).unwrap().hash(); let tx_in_executed = OperationsSchema(&mut storage) @@ -397,6 +482,12 @@ async fn test_return_executed_txs_to_mempool(mut storage: StorageProcessor<'_>) assert!(!tx_in_executed); } } + // The order of priority operations is preserved. + let mut reverted_iter = reverted_txs.iter(); + // Block number 4. + assert_eq!(reverted_iter.next().unwrap().next_priority_op_id, 1u64); + // Block number 5. + assert_eq!(reverted_iter.next().unwrap().next_priority_op_id, 2u64); Ok(()) } diff --git a/core/lib/storage/src/tests/chain/operations.rs b/core/lib/storage/src/tests/chain/operations.rs index cb97b1e7bd..919b0ae3ab 100644 --- a/core/lib/storage/src/tests/chain/operations.rs +++ b/core/lib/storage/src/tests/chain/operations.rs @@ -37,7 +37,7 @@ async fn aggregated_operations(mut storage: StorageProcessor<'_>) -> QueryResult assert_eq!(stored_operation.from_block, 1); assert_eq!(stored_operation.to_block, 1); assert_eq!(stored_operation.action_type, action_type.to_string()); - assert_eq!(stored_operation.confirmed, false); + assert!(!stored_operation.confirmed); Ok(()) } @@ -104,6 +104,8 @@ async fn executed_priority_operations(mut storage: StorageProcessor<'_>) -> Quer eth_hash: vec![0xDE, 0xAD, 0xBE, 0xEF], eth_block: 10, created_at: chrono::Utc::now(), + tx_hash: Default::default(), + eth_block_index: Some(1), }; OperationsSchema(&mut storage) .store_executed_priority_op(executed_tx.clone()) @@ -162,6 +164,8 @@ async fn duplicated_operations(mut storage: StorageProcessor<'_>) -> QueryResult eth_hash: vec![0xDE, 0xAD, 0xBE, 0xEF], eth_block: 10, created_at: chrono::Utc::now(), + tx_hash: Default::default(), + eth_block_index: Some(1), }; // Save the same operations twice. @@ -244,7 +248,7 @@ async fn transaction_resent(mut storage: StorageProcessor<'_>) -> QueryResult<() .await? .unwrap(); assert_eq!(loaded_tx.tx_hash, executed_tx.tx_hash); - assert_eq!(loaded_tx.success, true); + assert!(loaded_tx.success); // Get the block transactions and check if there is exactly 1 tx (failed tx not copied but replaced). let block_txs = BlockSchema(&mut storage) @@ -264,7 +268,7 @@ async fn transaction_resent(mut storage: StorageProcessor<'_>) -> QueryResult<() .await? .unwrap(); assert_eq!(loaded_tx.tx_hash, executed_tx.tx_hash); - assert_eq!(loaded_tx.success, true); + assert!(loaded_tx.success); // ...and there still must be one operation. let block_txs = BlockSchema(&mut storage) @@ -371,6 +375,50 @@ async fn remove_rejected_transactions(mut storage: StorageProcessor<'_>) -> Quer Ok(()) } +/// Checks that getting executed priority operation by `eth_hash` is working correctly. +#[db_test] +async fn priority_ops_hashes(mut storage: StorageProcessor<'_>) -> QueryResult<()> { + let executed_priority_op = NewExecutedPriorityOperation { + block_number: 1, + block_index: 1, + operation: Default::default(), + from_account: Default::default(), + to_account: Default::default(), + priority_op_serialid: 1, + deadline_block: 100, + eth_hash: vec![0xAA, 0xAA, 0xAA, 0xAA], + eth_block: 10, + created_at: chrono::Utc::now(), + tx_hash: vec![0xBB, 0xBB, 0xBB, 0xBB], + eth_block_index: Some(1), + }; + // Store executed priority op and try to get it by `eth_hash`. + storage + .chain() + .operations_schema() + .store_executed_priority_op(executed_priority_op.clone()) + .await?; + let op_by_eth_hash = storage + .chain() + .operations_schema() + .get_executed_priority_operation_by_eth_hash(&executed_priority_op.eth_hash) + .await?; + assert_eq!( + op_by_eth_hash.unwrap().priority_op_serialid, + executed_priority_op.priority_op_serialid + ); + + // Checks that it doesn't find unexisting operation + let op = storage + .chain() + .operations_schema() + .get_executed_priority_operation_by_eth_hash(&[0xDE, 0xAD, 0xBE, 0xEF]) + .await?; + assert!(op.is_none()); + + Ok(()) +} + /// Checks if executed_priority_operations are removed correctly. #[db_test] async fn test_remove_executed_priority_operations( @@ -389,6 +437,8 @@ async fn test_remove_executed_priority_operations( eth_hash: vec![0xDE, 0xAD, 0xBE, 0xEF], eth_block: 10, created_at: chrono::Utc::now(), + eth_block_index: Some(1), + tx_hash: Default::default(), }; OperationsSchema(&mut storage) .store_executed_priority_op(executed_priority_op) diff --git a/core/lib/storage/src/tests/chain/operations_ext/mod.rs b/core/lib/storage/src/tests/chain/operations_ext/mod.rs index d779ac486b..513a3e0910 100644 --- a/core/lib/storage/src/tests/chain/operations_ext/mod.rs +++ b/core/lib/storage/src/tests/chain/operations_ext/mod.rs @@ -2,16 +2,21 @@ use std::collections::HashMap; // External imports // Workspace imports -use zksync_types::aggregated_operations::AggregatedActionType; +use zksync_api_types::v02::{ + pagination::{AccountTxsRequest, ApiEither, PaginationDirection, PaginationQuery}, + transaction::{Receipt, TxInBlockStatus}, +}; +use zksync_types::{ + aggregated_operations::{AggregatedActionType, AggregatedOperation}, + tx::TxHash, + BlockNumber, ExecutedOperations, +}; // Local imports use self::setup::TransactionsHistoryTestSetup; use crate::{ chain::block::BlockSchema, chain::operations::OperationsSchema, - chain::operations_ext::{ - records::{AccountOpReceiptResponse, AccountTxReceiptResponse}, - SearchDirection, - }, + chain::operations_ext::SearchDirection, test_data::{ dummy_ethereum_tx_hash, gen_sample_block, gen_unique_aggregated_operation, BLOCK_SIZE_CHUNKS, @@ -20,13 +25,11 @@ use crate::{ tokens::StoreTokenError, QueryResult, StorageProcessor, }; -use zksync_types::aggregated_operations::AggregatedOperation; -use zksync_types::BlockNumber; -mod setup; +pub mod setup; /// Commits the data from the test setup to the database. -async fn commit_schema_data( +pub async fn commit_schema_data( storage: &mut StorageProcessor<'_>, setup: &TransactionsHistoryTestSetup, ) -> QueryResult<()> { @@ -73,36 +76,34 @@ async fn confirm_eth_op( Ok(()) } -// Make first block committed and verified. -async fn update_blocks_status(mut storage: &mut StorageProcessor<'_>) -> QueryResult<()> { +pub async fn commit_block( + mut storage: &mut StorageProcessor<'_>, + block_number: BlockNumber, +) -> QueryResult<()> { // Required since we use `EthereumSchema` in this test. storage.ethereum_schema().initialize_eth_data().await?; - // Make first block committed. BlockSchema(&mut storage) .save_block(gen_sample_block( - BlockNumber(1), + block_number, BLOCK_SIZE_CHUNKS, Default::default(), )) .await?; OperationsSchema(&mut storage) .store_aggregated_action(gen_unique_aggregated_operation( - BlockNumber(1), + block_number, AggregatedActionType::CommitBlocks, BLOCK_SIZE_CHUNKS, )) .await?; let (id, aggregated_op) = OperationsSchema(&mut storage) - .get_aggregated_op_that_affects_block( - AggregatedActionType::CommitBlocks, - BlockNumber(1_u32), - ) + .get_aggregated_op_that_affects_block(AggregatedActionType::CommitBlocks, block_number) .await? .unwrap(); storage .chain() .state_schema() - .commit_state_update(BlockNumber(1), &[], 0) + .commit_state_update(block_number, &[], 0) .await?; confirm_eth_op( storage, @@ -111,19 +112,22 @@ async fn update_blocks_status(mut storage: &mut StorageProcessor<'_>) -> QueryRe ) .await?; - // Make first block verified. + Ok(()) +} + +pub async fn verify_block( + mut storage: &mut StorageProcessor<'_>, + block_number: BlockNumber, +) -> QueryResult<()> { OperationsSchema(&mut storage) .store_aggregated_action(gen_unique_aggregated_operation( - BlockNumber(1), + block_number, AggregatedActionType::ExecuteBlocks, BLOCK_SIZE_CHUNKS, )) .await?; let (id, op) = OperationsSchema(&mut storage) - .get_aggregated_op_that_affects_block( - AggregatedActionType::ExecuteBlocks, - BlockNumber(1_u32), - ) + .get_aggregated_op_that_affects_block(AggregatedActionType::ExecuteBlocks, block_number) .await? .unwrap(); confirm_eth_op(storage, (id, op), AggregatedActionType::ExecuteBlocks).await?; @@ -131,36 +135,6 @@ async fn update_blocks_status(mut storage: &mut StorageProcessor<'_>) -> QueryRe Ok(()) } -#[derive(Debug, Copy, Clone, PartialEq)] -struct ReceiptRequest { - block_number: u64, - block_index: Option, - limit: u64, - direction: SearchDirection, -} - -#[derive(Debug, Copy, Clone, PartialEq)] -struct ReceiptLocation { - block_number: i64, - block_index: Option, -} - -impl ReceiptLocation { - fn from_tx(item: AccountTxReceiptResponse) -> Self { - Self { - block_number: item.block_number, - block_index: item.block_index, - } - } - - fn from_op(item: AccountOpReceiptResponse) -> Self { - Self { - block_number: item.block_number, - block_index: Some(item.block_index), - } - } -} - /// Here we take the account transactions using `get_account_transactions` and /// check `get_account_transactions_history` to match obtained results. #[db_test] @@ -337,258 +311,145 @@ async fn get_account_transactions_history_from( Ok(()) } -/// Checks that all the transaction receipts related to account address can be loaded -/// with the `get_account_transactions_receipts` method and the result will be +pub struct ReceiptRequest { + tx_hash: TxHash, + direction: PaginationDirection, + limit: u32, +} + +/// Checks that all the transaction related to account address can be loaded +/// with the `get_account_transactions` method and the result will be /// same as expected. #[db_test] -async fn get_account_transactions_receipts(mut storage: StorageProcessor<'_>) -> QueryResult<()> { +async fn get_account_transactions(mut storage: StorageProcessor<'_>) -> QueryResult<()> { let mut setup = TransactionsHistoryTestSetup::new(); + let from = setup.from_zksync_account.address; + let to = setup.to_zksync_account.address; setup.add_block(1); setup.add_block_with_rejected_op(2); + // Check that it doesn't return not committed txs. + let txs = storage + .chain() + .operations_ext_schema() + .get_account_transactions(&PaginationQuery { + from: AccountTxsRequest { + address: from, + tx_hash: ApiEither::from(setup.get_tx_hash(0, 0)), + }, + limit: 1, + direction: PaginationDirection::Newer, + }) + .await?; + assert!(txs.is_none()); + // execute_operation commit_schema_data(&mut storage, &setup).await?; - let from = setup.from_zksync_account.address; - let to = setup.to_zksync_account.address; + // Make blocks committed + commit_block(&mut storage, BlockNumber(1)).await?; + commit_block(&mut storage, BlockNumber(2)).await?; + let test_data = vec![ ( "Get first five transactions.", ReceiptRequest { - block_number: 0, - block_index: None, - direction: SearchDirection::Newer, + tx_hash: setup.get_tx_hash(0, 0), + direction: PaginationDirection::Newer, limit: 5, }, vec![ - ReceiptLocation { - block_number: 1, - block_index: Some(1), - }, - ReceiptLocation { - block_number: 1, - block_index: Some(2), - }, - ReceiptLocation { - block_number: 1, - block_index: Some(3), - }, - ReceiptLocation { - block_number: 1, - block_index: Some(4), - }, - ReceiptLocation { - block_number: 1, - block_index: Some(5), - }, + setup.get_tx_hash(0, 0), + setup.get_tx_hash(0, 1), + setup.get_tx_hash(0, 2), + setup.get_tx_hash(0, 3), + setup.get_tx_hash(0, 4), ], ), ( "Get a single transaction. (newer)", ReceiptRequest { - block_number: 1, - block_index: Some(2), - direction: SearchDirection::Newer, + tx_hash: setup.get_tx_hash(0, 2), + direction: PaginationDirection::Newer, limit: 1, }, - vec![ReceiptLocation { - block_number: 1, - block_index: Some(2), - }], + vec![setup.get_tx_hash(0, 2)], ), ( - "Get a failed transaction. (newer)", - ReceiptRequest { - block_number: 2, - block_index: None, - direction: SearchDirection::Newer, - limit: 1, - }, - vec![ReceiptLocation { - block_number: 2, - block_index: None, - }], - ), - ( - "Get some transations from the next block.", + "Get five transactions from some index.", ReceiptRequest { - block_number: 1, - block_index: Some(100), - direction: SearchDirection::Newer, + tx_hash: setup.get_tx_hash(0, 4), + direction: PaginationDirection::Newer, limit: 5, }, vec![ - ReceiptLocation { - block_number: 2, - block_index: None, - }, - ReceiptLocation { - block_number: 2, - block_index: Some(1), - }, - ReceiptLocation { - block_number: 2, - block_index: Some(2), - }, - ReceiptLocation { - block_number: 2, - block_index: Some(3), - }, - ReceiptLocation { - block_number: 2, - block_index: Some(4), - }, + setup.get_tx_hash(0, 4), + setup.get_tx_hash(0, 5), + setup.get_tx_hash(0, 6), + setup.get_tx_hash(1, 0), + setup.get_tx_hash(1, 1), ], ), ( - "Get five transactions from some index.", + "Limit is more than number of txs. (Newer)", ReceiptRequest { - block_number: 1, - block_index: Some(3), - direction: SearchDirection::Newer, + tx_hash: setup.get_tx_hash(1, 5), + direction: PaginationDirection::Newer, limit: 5, }, - vec![ - ReceiptLocation { - block_number: 1, - block_index: Some(3), - }, - ReceiptLocation { - block_number: 1, - block_index: Some(4), - }, - ReceiptLocation { - block_number: 1, - block_index: Some(5), - }, - ReceiptLocation { - block_number: 2, - block_index: None, - }, - ReceiptLocation { - block_number: 2, - block_index: Some(1), - }, - ], + vec![setup.get_tx_hash(1, 5), setup.get_tx_hash(1, 6)], ), // Older search direction ( "Get last five transactions.", ReceiptRequest { - block_number: i64::MAX as u64, - block_index: Some(i32::MAX as u32), - direction: SearchDirection::Older, + tx_hash: setup.get_tx_hash(1, 6), + direction: PaginationDirection::Older, limit: 5, }, vec![ - ReceiptLocation { - block_number: 2, - block_index: Some(4), - }, - ReceiptLocation { - block_number: 2, - block_index: Some(3), - }, - ReceiptLocation { - block_number: 2, - block_index: Some(2), - }, - ReceiptLocation { - block_number: 2, - block_index: Some(1), - }, - ReceiptLocation { - block_number: 2, - block_index: None, - }, + setup.get_tx_hash(1, 6), + setup.get_tx_hash(1, 5), + setup.get_tx_hash(1, 4), + setup.get_tx_hash(1, 3), + setup.get_tx_hash(1, 2), ], ), ( - "Get a single transaction (older).", + "Get a single transaction. (older)", ReceiptRequest { - block_number: 1, - block_index: Some(2), - direction: SearchDirection::Older, + tx_hash: setup.get_tx_hash(0, 2), + direction: PaginationDirection::Older, limit: 1, }, - vec![ReceiptLocation { - block_number: 1, - block_index: Some(2), - }], + vec![setup.get_tx_hash(0, 2)], ), ( - "Get a failed transaction. (older)", + "Get some transactions from the previous block.", ReceiptRequest { - block_number: 2, - block_index: None, - direction: SearchDirection::Older, - limit: 1, - }, - vec![ReceiptLocation { - block_number: 2, - block_index: None, - }], - ), - ( - "Get some transations from the previous block.", - ReceiptRequest { - block_number: 2, - block_index: None, - direction: SearchDirection::Older, + tx_hash: setup.get_tx_hash(1, 2), + direction: PaginationDirection::Older, limit: 5, }, vec![ - ReceiptLocation { - block_number: 2, - block_index: None, - }, - ReceiptLocation { - block_number: 1, - block_index: Some(5), - }, - ReceiptLocation { - block_number: 1, - block_index: Some(4), - }, - ReceiptLocation { - block_number: 1, - block_index: Some(3), - }, - ReceiptLocation { - block_number: 1, - block_index: Some(2), - }, + setup.get_tx_hash(1, 2), + setup.get_tx_hash(1, 1), + setup.get_tx_hash(1, 0), + setup.get_tx_hash(0, 6), + setup.get_tx_hash(0, 5), ], ), ( - "Get five transactions up to some index.", + "Limit is more than number of txs. (Older)", ReceiptRequest { - block_number: 2, - block_index: Some(2), - direction: SearchDirection::Older, + tx_hash: setup.get_tx_hash(0, 2), + direction: PaginationDirection::Older, limit: 5, }, vec![ - ReceiptLocation { - block_number: 2, - block_index: Some(2), - }, - ReceiptLocation { - block_number: 2, - block_index: Some(1), - }, - ReceiptLocation { - block_number: 2, - block_index: None, - }, - ReceiptLocation { - block_number: 1, - block_index: Some(5), - }, - ReceiptLocation { - block_number: 1, - block_index: Some(4), - }, + setup.get_tx_hash(0, 2), + setup.get_tx_hash(0, 1), + setup.get_tx_hash(0, 0), ], ), ]; @@ -597,292 +458,488 @@ async fn get_account_transactions_receipts(mut storage: StorageProcessor<'_>) -> let items = storage .chain() .operations_ext_schema() - .get_account_transactions_receipts( - from, - request.block_number, - request.block_index, - request.direction, - request.limit, - ) + .get_account_transactions(&PaginationQuery { + from: AccountTxsRequest { + address: from, + tx_hash: ApiEither::from(request.tx_hash), + }, + limit: request.limit, + direction: request.direction, + }) .await?; - - let actual_resp = items - .into_iter() - .map(ReceiptLocation::from_tx) - .collect::>(); + let actual_resp: Vec = items.unwrap().into_iter().map(|tx| tx.tx_hash).collect(); assert_eq!(actual_resp, expected_resp, "\"{}\", failed", test_name); } - // Make first block committed and verified - update_blocks_status(&mut storage).await?; + let failed_tx = storage + .chain() + .operations_ext_schema() + .get_account_transactions(&PaginationQuery { + from: AccountTxsRequest { + address: from, + tx_hash: ApiEither::from(setup.get_tx_hash(1, 2)), + }, + limit: 1, + direction: PaginationDirection::Newer, + }) + .await? + .unwrap(); + assert_eq!(failed_tx[0].status, TxInBlockStatus::Rejected); - let receipts = storage + verify_block(&mut storage, BlockNumber(1)).await?; + let txs = storage .chain() .operations_ext_schema() - .get_account_transactions_receipts(from, 1, Some(1), SearchDirection::Newer, 1) - .await?; + .get_account_transactions(&PaginationQuery { + from: AccountTxsRequest { + address: from, + tx_hash: ApiEither::from(setup.get_tx_hash(0, 6)), + }, + limit: 2, + direction: PaginationDirection::Newer, + }) + .await? + .unwrap(); + assert_eq!(txs[0].status, TxInBlockStatus::Finalized); + assert_eq!(txs[1].status, TxInBlockStatus::Committed); - // Check that `commit_tx_hash` and `verify_tx_hash` now exist. - let reciept = receipts.into_iter().next().unwrap(); - assert!(reciept.commit_tx_hash.is_some()); - assert!(reciept.verify_tx_hash.is_some()); // Make sure that the receiver see the same receipts. - let receipts = storage + let from_txs = storage + .chain() + .operations_ext_schema() + .get_account_transactions(&PaginationQuery { + from: AccountTxsRequest { + address: from, + tx_hash: ApiEither::from(setup.get_tx_hash(0, 2)), + }, + limit: 1, + direction: PaginationDirection::Newer, + }) + .await? + .unwrap(); + let to_txs = storage .chain() .operations_ext_schema() - .get_account_transactions_receipts(to, 1, Some(1), SearchDirection::Newer, 1) + .get_account_transactions(&PaginationQuery { + from: AccountTxsRequest { + address: to, + tx_hash: ApiEither::from(setup.get_tx_hash(0, 2)), + }, + limit: 1, + direction: PaginationDirection::Newer, + }) + .await? + .unwrap(); + let from_txs_hashes: Vec = from_txs.into_iter().map(|tx| tx.tx_hash).collect(); + let to_txs_hashes: Vec = to_txs.into_iter().map(|tx| tx.tx_hash).collect(); + assert_eq!(from_txs_hashes, to_txs_hashes); + + Ok(()) +} + +/// Test `get_tx_created_at_and_block_number` method +#[db_test] +async fn get_tx_created_at_and_block_number(mut storage: StorageProcessor<'_>) -> QueryResult<()> { + let mut setup = TransactionsHistoryTestSetup::new(); + setup.add_block(1); + commit_schema_data(&mut storage, &setup).await?; + + // Get priority op created_at and block_number + let tx_hash = setup.get_tx_hash(0, 0); + let result = storage + .chain() + .operations_ext_schema() + .get_tx_created_at_and_block_number(tx_hash) .await?; - assert_eq!( - storage + assert!(result.is_some()); + assert_eq!(result.unwrap().1, BlockNumber(1)); + + // Get transaction created_at and block_number + let tx_hash = setup.get_tx_hash(0, 1); + let result = storage + .chain() + .operations_ext_schema() + .get_tx_created_at_and_block_number(tx_hash) + .await?; + assert!(result.is_some()); + assert_eq!(result.unwrap().1, BlockNumber(1)); + + // Try to get unexisting tx + setup.add_block(2); + let tx_hash = setup.get_tx_hash(1, 0); + let result = storage + .chain() + .operations_ext_schema() + .get_tx_created_at_and_block_number(tx_hash) + .await?; + assert!(result.is_none()); + + Ok(()) +} + +/// Test `get_batch_info` method +#[db_test] +async fn get_batch_info(mut storage: StorageProcessor<'_>) -> QueryResult<()> { + let mut setup = TransactionsHistoryTestSetup::new(); + + // `batch_id` will be added after we insert batch into mempool. + setup.add_block_with_batch(1, true); + setup.add_block_with_batch(2, false); + + for i in 0..2 { + let txs: Vec<_> = setup.blocks[i] + .block_transactions + .iter() + .map(|tx| tx.get_executed_tx().unwrap().signed_tx.clone()) + .collect(); + let batch_id = storage .chain() - .operations_ext_schema() - .get_account_transactions_receipts(to, 1, Some(1), SearchDirection::Older, 1) - .await?, - receipts + .mempool_schema() + .insert_batch(&txs, Vec::new()) + .await?; + setup.blocks[i] + .block_transactions + .iter_mut() + .for_each(|tx| match tx { + ExecutedOperations::Tx(tx) => { + tx.batch_id = Some(batch_id); + } + _ => unreachable!(), + }); + } + + // Get batch from mempool + let tx_hashes = vec![ + setup.get_tx_hash(0, 0), + setup.get_tx_hash(0, 1), + setup.get_tx_hash(0, 2), + ]; + let batch_hash = TxHash::batch_hash(&tx_hashes); + let batch_info = storage + .chain() + .operations_ext_schema() + .get_batch_info(batch_hash) + .await? + .unwrap(); + + let actual_tx_hashes: Vec = batch_info + .transaction_hashes + .into_iter() + .map(|tx_hash| tx_hash.0) + .collect(); + assert_eq!(batch_info.batch_hash, batch_hash); + assert_eq!(actual_tx_hashes, tx_hashes); + assert_eq!(batch_info.batch_status.last_state, TxInBlockStatus::Queued); + + // Get batch from queued block. + commit_schema_data(&mut storage, &setup).await?; + storage.chain().mempool_schema().collect_garbage().await?; + + let batch_info = storage + .chain() + .operations_ext_schema() + .get_batch_info(batch_hash) + .await? + .unwrap(); + + let actual_tx_hashes: Vec = batch_info + .transaction_hashes + .into_iter() + .map(|tx_hash| tx_hash.0) + .collect(); + assert_eq!(batch_info.batch_hash, batch_hash); + assert_eq!(actual_tx_hashes, tx_hashes); + assert_eq!( + batch_info.batch_status.last_state, + TxInBlockStatus::Committed + ); + + // Get batch from committed block. + commit_block(&mut storage, BlockNumber(1)).await?; + + let batch_info = storage + .chain() + .operations_ext_schema() + .get_batch_info(batch_hash) + .await? + .unwrap(); + assert_eq!( + batch_info.batch_status.last_state, + TxInBlockStatus::Committed + ); + + // Get batch from finalized block. + verify_block(&mut storage, BlockNumber(1)).await?; + let batch_info = storage + .chain() + .operations_ext_schema() + .get_batch_info(batch_hash) + .await? + .unwrap(); + assert_eq!( + batch_info.batch_status.last_state, + TxInBlockStatus::Finalized + ); + + // Get failed batch. + let tx_hashes = vec![ + setup.get_tx_hash(1, 0), + setup.get_tx_hash(1, 1), + setup.get_tx_hash(1, 2), + ]; + let batch_hash = TxHash::batch_hash(&tx_hashes); + let batch_info = storage + .chain() + .operations_ext_schema() + .get_batch_info(batch_hash) + .await? + .unwrap(); + assert_eq!( + batch_info.batch_status.last_state, + TxInBlockStatus::Rejected ); Ok(()) } -/// Checks that all the operations receipts related to account address can be loaded -/// with the `get_account_operations_receipts` method and the result will be -/// same as expected. +/// Test `get_account_transactions_count` method #[db_test] -async fn get_account_operations_receipts(mut storage: StorageProcessor<'_>) -> QueryResult<()> { +async fn account_transactions_count(mut storage: StorageProcessor<'_>) -> QueryResult<()> { let mut setup = TransactionsHistoryTestSetup::new(); setup.add_block(1); - setup.add_block_with_rejected_op(2); + commit_schema_data(&mut storage, &setup).await?; - // execute_operation + let count_before_commit = storage + .chain() + .operations_ext_schema() + .get_account_transactions_count(setup.from_zksync_account.address) + .await?; + assert_eq!(count_before_commit, 0); + + commit_block(&mut storage, BlockNumber(1)).await?; + + let count_after_commit = storage + .chain() + .operations_ext_schema() + .get_account_transactions_count(setup.from_zksync_account.address) + .await?; + assert_eq!(count_after_commit, 7); + + Ok(()) +} + +/// Test `get_account_last_tx_hash` method +#[db_test] +async fn account_last_tx_hash(mut storage: StorageProcessor<'_>) -> QueryResult<()> { + let mut setup = TransactionsHistoryTestSetup::new(); + + // Checks that it returns None for unexisting account + let last_tx_hash = storage + .chain() + .operations_ext_schema() + .get_account_last_tx_hash(setup.from_zksync_account.address) + .await?; + assert!(last_tx_hash.is_none()); + + setup.add_block(1); commit_schema_data(&mut storage, &setup).await?; - let from = setup.from_zksync_account.address; - let to = setup.to_zksync_account.address; - let test_data = vec![ - ( - "Get first five operations.", - ReceiptRequest { - block_number: 0, - block_index: Some(0), - direction: SearchDirection::Newer, - limit: 5, - }, - vec![ - ReceiptLocation { - block_number: 1, - block_index: Some(0), - }, - ReceiptLocation { - block_number: 1, - block_index: Some(6), - }, - ReceiptLocation { - block_number: 2, - block_index: Some(0), - }, - ReceiptLocation { - block_number: 2, - block_index: Some(6), - }, - ], - ), - ( - "Get a single operation. (newer)", - ReceiptRequest { - block_number: 1, - block_index: Some(0), - direction: SearchDirection::Newer, - limit: 1, - }, - vec![ReceiptLocation { - block_number: 1, - block_index: Some(0), - }], - ), - ( - "Get some operations from the next block.", - ReceiptRequest { - block_number: 1, - block_index: Some(100), - direction: SearchDirection::Newer, - limit: 5, - }, - vec![ - ReceiptLocation { - block_number: 2, - block_index: Some(0), - }, - ReceiptLocation { - block_number: 2, - block_index: Some(6), - }, - ], - ), - ( - "Get five operations from some index.", - ReceiptRequest { - block_number: 1, - block_index: Some(3), - direction: SearchDirection::Newer, - limit: 5, - }, - vec![ - ReceiptLocation { - block_number: 1, - block_index: Some(6), - }, - ReceiptLocation { - block_number: 2, - block_index: Some(0), - }, - ReceiptLocation { - block_number: 2, - block_index: Some(6), - }, - ], - ), - // Older search direction - ( - "Get last five operations.", - ReceiptRequest { - block_number: i64::MAX as u64, - block_index: Some(i32::MAX as u32), - direction: SearchDirection::Older, - limit: 5, - }, - vec![ - ReceiptLocation { - block_number: 2, - block_index: Some(6), - }, - ReceiptLocation { - block_number: 2, - block_index: Some(0), - }, - ReceiptLocation { - block_number: 1, - block_index: Some(6), - }, - ReceiptLocation { - block_number: 1, - block_index: Some(0), - }, - ], - ), - ( - "Get a single operation (older).", - ReceiptRequest { - block_number: 1, - block_index: Some(6), - direction: SearchDirection::Older, - limit: 1, - }, - vec![ReceiptLocation { - block_number: 1, - block_index: Some(6), - }], - ), - ( - "Get some operations from the previous block.", - ReceiptRequest { - block_number: 2, - block_index: Some(0), - direction: SearchDirection::Older, - limit: 5, - }, - vec![ - ReceiptLocation { - block_number: 2, - block_index: Some(0), - }, - ReceiptLocation { - block_number: 1, - block_index: Some(6), - }, - ReceiptLocation { - block_number: 1, - block_index: Some(0), - }, - ], - ), - ( - "Get five operations up to some index.", - ReceiptRequest { - block_number: 2, - block_index: Some(10), - direction: SearchDirection::Older, - limit: 5, - }, - vec![ - ReceiptLocation { - block_number: 2, - block_index: Some(6), - }, - ReceiptLocation { - block_number: 2, - block_index: Some(0), - }, - ReceiptLocation { - block_number: 1, - block_index: Some(6), - }, - ReceiptLocation { - block_number: 1, - block_index: Some(0), - }, - ], - ), - ]; + let last_tx_hash = storage + .chain() + .operations_ext_schema() + .get_account_last_tx_hash(setup.from_zksync_account.address) + .await?; + assert_eq!(last_tx_hash, Some(setup.get_tx_hash(0, 6))); - for (test_name, request, expected_resp) in test_data { - let items = storage - .chain() - .operations_ext_schema() - .get_account_operations_receipts( - from, - request.block_number, - request.block_index.unwrap(), - request.direction, - request.limit, - ) - .await?; + Ok(()) +} - let actual_resp = items - .into_iter() - .map(ReceiptLocation::from_op) - .collect::>(); +/// Test `get_block_last_tx_hash` method +#[db_test] +async fn block_last_tx_hash(mut storage: StorageProcessor<'_>) -> QueryResult<()> { + let mut setup = TransactionsHistoryTestSetup::new(); - assert_eq!(actual_resp, expected_resp, "\"{}\", failed", test_name); + // Checks that it returns None for unexisting block + let last_tx_hash = storage + .chain() + .operations_ext_schema() + .get_block_last_tx_hash(BlockNumber(1)) + .await?; + assert!(last_tx_hash.is_none()); + + setup.add_block(1); + commit_schema_data(&mut storage, &setup).await?; + + let last_tx_hash = storage + .chain() + .operations_ext_schema() + .get_block_last_tx_hash(BlockNumber(1)) + .await?; + assert_eq!(last_tx_hash, Some(setup.get_tx_hash(0, 6))); + Ok(()) +} + +/// Test `tx_receipt_api_v02` method +#[db_test] +async fn tx_receipt(mut storage: StorageProcessor<'_>) -> QueryResult<()> { + let mut setup = TransactionsHistoryTestSetup::new(); + + // Checks that it returns None for unexisting tx + let receipt = storage + .chain() + .operations_ext_schema() + .tx_receipt_api_v02(&[0xDE, 0xAD, 0xBE, 0xEF]) + .await?; + assert!(receipt.is_none()); + + setup.add_block(1); + commit_schema_data(&mut storage, &setup).await?; + + // Test receipt for L1 op. + let (expected_id, eth_hash) = match setup.blocks[0].block_transactions[0].clone() { + ExecutedOperations::PriorityOp(op) => (op.priority_op.serial_id, op.priority_op.eth_hash), + ExecutedOperations::Tx(_) => { + panic!("Should be L1 op") + } + }; + + let l1_receipt_by_tx_hash = storage + .chain() + .operations_ext_schema() + .tx_receipt_api_v02(setup.get_tx_hash(0, 0).as_ref()) + .await?; + match l1_receipt_by_tx_hash.unwrap() { + Receipt::L1(receipt) => { + assert_eq!(receipt.id, expected_id); + } + Receipt::L2(_) => { + panic!("Should be L1 receipt"); + } } - // Make first block committed and verified - update_blocks_status(&mut storage).await?; + let l1_receipt_by_eth_hash = storage + .chain() + .operations_ext_schema() + .tx_receipt_api_v02(eth_hash.as_ref()) + .await?; + match l1_receipt_by_eth_hash.unwrap() { + Receipt::L1(receipt) => { + assert_eq!(receipt.id, expected_id); + } + Receipt::L2(_) => { + panic!("Should be L1 receipt"); + } + } - let receipts = storage + // Test receipt for executed L2 tx. + let l2_receipt = storage .chain() .operations_ext_schema() - .get_account_operations_receipts(from, 1, 0, SearchDirection::Newer, 1) + .tx_receipt_api_v02(setup.get_tx_hash(0, 2).as_ref()) .await?; + match l2_receipt.unwrap() { + Receipt::L2(receipt) => { + assert_eq!(receipt.tx_hash, setup.get_tx_hash(0, 2)); + } + Receipt::L1(_) => { + panic!("Should be L2 receipt"); + } + } - // Check that `commit_tx_hash` and `verify_tx_hash` now exist. - let reciept = receipts.into_iter().next().unwrap(); - assert!(reciept.commit_tx_hash.is_some()); - assert!(reciept.verify_tx_hash.is_some()); - // Make sure that the receiver see the same receipts. - let receipts = storage + // Test receipt for tx from mempool. + setup.add_block(2); + let tx = match setup.blocks[1].block_transactions[2].clone() { + ExecutedOperations::Tx(tx) => tx.signed_tx, + ExecutedOperations::PriorityOp(_) => { + panic!("Should be L2 tx") + } + }; + storage.chain().mempool_schema().insert_tx(&tx).await?; + let l2_receipt = storage + .chain() + .operations_ext_schema() + .tx_receipt_api_v02(tx.hash().as_ref()) + .await?; + match l2_receipt.unwrap() { + Receipt::L2(receipt) => { + assert_eq!(receipt.tx_hash, tx.hash()); + } + Receipt::L1(_) => { + panic!("Should be L2 receipt"); + } + } + + Ok(()) +} + +/// Test `tx_data_api_v02` method +#[db_test] +async fn tx_data(mut storage: StorageProcessor<'_>) -> QueryResult<()> { + let mut setup = TransactionsHistoryTestSetup::new(); + + // Checks that it returns None for unexisting tx + let data = storage + .chain() + .operations_ext_schema() + .tx_data_api_v02(&[0xDE, 0xAD, 0xBE, 0xEF]) + .await?; + assert!(data.is_none()); + + setup.add_block(1); + commit_schema_data(&mut storage, &setup).await?; + + // Test data for L1 op. + let eth_hash = match setup.blocks[0].block_transactions[0].clone() { + ExecutedOperations::PriorityOp(op) => op.priority_op.eth_hash, + ExecutedOperations::Tx(_) => { + panic!("Should be L1 op") + } + }; + + let l1_data_by_tx_hash = storage .chain() .operations_ext_schema() - .get_account_operations_receipts(to, 1, 0, SearchDirection::Newer, 1) + .tx_data_api_v02(setup.get_tx_hash(0, 0).as_ref()) .await?; assert_eq!( - storage - .chain() - .operations_ext_schema() - .get_account_operations_receipts(to, 1, 0, SearchDirection::Older, 1) - .await?, - receipts + l1_data_by_tx_hash.unwrap().tx.tx_hash, + setup.get_tx_hash(0, 0) + ); + + let l1_data_by_eth_hash = storage + .chain() + .operations_ext_schema() + .tx_data_api_v02(eth_hash.as_ref()) + .await?; + assert_eq!( + l1_data_by_eth_hash.unwrap().tx.tx_hash, + setup.get_tx_hash(0, 0) ); + // Test data for executed L2 tx. + let l2_data = storage + .chain() + .operations_ext_schema() + .tx_data_api_v02(setup.get_tx_hash(0, 2).as_ref()) + .await?; + assert_eq!(l2_data.unwrap().tx.tx_hash, setup.get_tx_hash(0, 2)); + + // Test data for tx from mempool. + setup.add_block(2); + let tx = match setup.blocks[1].block_transactions[2].clone() { + ExecutedOperations::Tx(tx) => tx.signed_tx, + ExecutedOperations::PriorityOp(_) => { + panic!("Should be L2 tx") + } + }; + storage.chain().mempool_schema().insert_tx(&tx).await?; + let l2_data = storage + .chain() + .operations_ext_schema() + .tx_data_api_v02(tx.hash().as_ref()) + .await?; + assert_eq!(l2_data.unwrap().tx.tx_hash, tx.hash()); + Ok(()) } diff --git a/core/lib/storage/src/tests/chain/operations_ext/setup.rs b/core/lib/storage/src/tests/chain/operations_ext/setup.rs index 7f25c79f90..3687bd9ae7 100644 --- a/core/lib/storage/src/tests/chain/operations_ext/setup.rs +++ b/core/lib/storage/src/tests/chain/operations_ext/setup.rs @@ -4,15 +4,15 @@ use chrono::{DateTime, Duration, Utc}; use num::BigUint; // Workspace imports use zksync_basic_types::H256; -use zksync_crypto::franklin_crypto::bellman::pairing::ff::Field; -use zksync_crypto::Fr; +use zksync_crypto::{franklin_crypto::bellman::pairing::ff::Field, Fr}; use zksync_test_account::ZkSyncAccount; -use zksync_types::block::{Block, ExecutedOperations, ExecutedPriorityOp, ExecutedTx}; -use zksync_types::operations::{ChangePubKeyOp, ZkSyncOp}; -use zksync_types::priority_ops::PriorityOp; use zksync_types::{ - tx::ChangePubKeyType, AccountId, Address, BlockNumber, CloseOp, Deposit, DepositOp, FullExit, - FullExitOp, Token, TokenId, TransferOp, TransferToNewOp, WithdrawOp, + block::{Block, ExecutedOperations, ExecutedPriorityOp, ExecutedTx}, + operations::{ChangePubKeyOp, ZkSyncOp}, + priority_ops::PriorityOp, + tx::{ChangePubKeyType, TxHash}, + AccountId, Address, BlockNumber, CloseOp, Deposit, DepositOp, FullExit, FullExitOp, Token, + TokenId, TransferOp, TransferToNewOp, WithdrawOp, }; // Local imports @@ -59,6 +59,13 @@ impl TransactionsHistoryTestSetup { } } + pub fn get_tx_hash(&self, block_number: usize, block_index: usize) -> TxHash { + match &self.blocks[block_number].block_transactions[block_index] { + ExecutedOperations::PriorityOp(op) => op.priority_op.tx_hash(), + ExecutedOperations::Tx(tx) => tx.signed_tx.hash(), + } + } + pub fn add_block(&mut self, block_id: u32) { let prior_op_unique_serial_id = u64::from(block_id * 2); let executed_deposit_op = self.create_deposit_op(prior_op_unique_serial_id, block_id, 0); @@ -72,12 +79,12 @@ impl TransactionsHistoryTestSetup { let operations = vec![ executed_deposit_op, - executed_full_exit_op, executed_transfer_to_new_op, executed_transfer_op, - executed_withdraw_op, executed_close_op, executed_change_pubkey_op, + executed_withdraw_op, + executed_full_exit_op, ]; let block = Block::new( @@ -109,12 +116,12 @@ impl TransactionsHistoryTestSetup { let operations = vec![ executed_deposit_op, - executed_full_exit_op, executed_transfer_to_new_op, rejected_transfer_op, - executed_withdraw_op, executed_close_op, executed_change_pubkey_op, + executed_withdraw_op, + executed_full_exit_op, ]; let block = Block::new( @@ -133,6 +140,34 @@ impl TransactionsHistoryTestSetup { self.blocks.push(block); } + pub fn add_block_with_batch(&mut self, block_id: u32, success: bool) { + let block_indexes = if success { + vec![Some(0), Some(1), Some(2)] + } else { + vec![None, None, None] + }; + let transfer_op_0 = self.create_transfer_tx(block_indexes[0]); + let transfer_op_1 = self.create_transfer_tx(block_indexes[1]); + let transfer_op_2 = self.create_transfer_tx(block_indexes[2]); + + let operations = vec![transfer_op_0, transfer_op_1, transfer_op_2]; + + let block = Block::new( + BlockNumber(block_id), + Fr::zero(), + AccountId(0), + operations, + (0, 0), // Not important + 100, + 1_000_000.into(), // Not important + 1_500_000.into(), // Not important + Default::default(), + 0, + ); + + self.blocks.push(block); + } + fn create_deposit_op( &mut self, serial_id: u64, @@ -158,6 +193,7 @@ impl TransactionsHistoryTestSetup { &hex::decode(format!("{:0>64}", format!("{}{}", block, block_index))).unwrap(), ), eth_block: 10, + eth_block_index: Some(1), }, op: deposit_op, block_index, @@ -196,6 +232,7 @@ impl TransactionsHistoryTestSetup { &hex::decode(format!("{:0>64}", format!("{}{}", block, block_index))).unwrap(), ), eth_block: 11, + eth_block_index: Some(1), }, op: full_exit_op, block_index, diff --git a/core/lib/storage/src/tests/tokens.rs b/core/lib/storage/src/tests/tokens.rs index 0b50a406c0..44d88b2389 100644 --- a/core/lib/storage/src/tests/tokens.rs +++ b/core/lib/storage/src/tests/tokens.rs @@ -24,7 +24,7 @@ use zksync_crypto::params::MIN_NFT_TOKEN_ID; #[db_test] async fn tokens_storage(mut storage: StorageProcessor<'_>) -> QueryResult<()> { // There should be only Ethereum main token by default. - assert_eq!(storage.tokens_schema().get_last_token_id().await?.0, 0); + assert_eq!(storage.tokens_schema().get_count().await?, 0); let tokens = TokensSchema(&mut storage) .load_tokens() .await @@ -76,7 +76,7 @@ async fn tokens_storage(mut storage: StorageProcessor<'_>) -> QueryResult<()> { .await .expect("Store tokens query failed"); // The count is updated. - assert_eq!(storage.tokens_schema().get_last_token_id().await?.0, 2); + assert_eq!(storage.tokens_schema().get_count().await?, 2); // Load tokens again. let tokens = TokensSchema(&mut storage) diff --git a/core/lib/storage/src/tokens/mod.rs b/core/lib/storage/src/tokens/mod.rs index ad6e59f31b..3dfbc1e0ea 100644 --- a/core/lib/storage/src/tokens/mod.rs +++ b/core/lib/storage/src/tokens/mod.rs @@ -1,14 +1,16 @@ // Built-in deps -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use std::time::Instant; // External imports use num::{rational::Ratio, BigUint}; use thiserror::Error; // Workspace imports -use zksync_types::{ - tokens::ApiNFT, AccountId, Address, Token, TokenId, TokenLike, TokenPrice, NFT, +use zksync_api_types::v02::{ + pagination::{PaginationDirection, PaginationQuery}, + token::ApiNFT, }; +use zksync_types::{AccountId, Address, Token, TokenId, TokenLike, TokenPrice, NFT}; use zksync_utils::ratio_to_big_decimal; // Local imports use self::records::{DBMarketVolume, DbTickerPrice, DbToken, StorageApiNFT, StorageNFT}; @@ -121,33 +123,84 @@ impl<'a, 'c> TokensSchema<'a, 'c> { Ok(()) } - /// Loads all the stored tokens from the database. - /// Alongside with the tokens added via `store_token` method, the default `ETH` token - /// is returned. - pub async fn load_tokens(&mut self) -> QueryResult> { + /// Loads tokens from the database starting from the given id with the given limit in the ascending order. + pub async fn load_tokens_asc( + &mut self, + from: TokenId, + limit: Option, + ) -> QueryResult> { let start = Instant::now(); + let limit = limit.map(i64::from); let tokens = sqlx::query_as!( DbToken, r#" - SELECT * FROM tokens WHERE is_nft = false + SELECT * FROM tokens + WHERE id >= $1 AND is_nft = false ORDER BY id ASC + LIMIT $2 "#, + *from as i32, + limit ) .fetch_all(self.0.conn()) .await?; - let result = tokens - .into_iter() - .map(|t| { - let token: Token = t.into(); - (token.id, token) - }) - .collect(); + let result = tokens.into_iter().map(Token::from).collect(); + metrics::histogram!("sql.token.load_tokens_asc", start.elapsed()); + Ok(result) + } - metrics::histogram!("sql.token.load_tokens", start.elapsed()); + /// Loads tokens from the database starting from the given id with the given limit in the descending order. + pub async fn load_tokens_desc( + &mut self, + from: TokenId, + limit: Option, + ) -> QueryResult> { + let start = Instant::now(); + let limit = limit.map(i64::from); + let tokens = sqlx::query_as!( + DbToken, + r#" + SELECT * FROM tokens + WHERE id <= $1 AND is_nft = false + ORDER BY id DESC + LIMIT $2 + "#, + from.0 as u32, + limit + ) + .fetch_all(self.0.conn()) + .await?; + + let result = tokens.into_iter().map(Token::from).collect(); + metrics::histogram!("sql.token.load_tokens_desc", start.elapsed()); Ok(result) } + /// Loads all the stored tokens from the database. + /// Alongside with the tokens added via `store_token` method, the default `ETH` token + /// is returned. + pub async fn load_tokens(&mut self) -> QueryResult> { + let tokens = self.load_tokens_asc(TokenId(0), None).await?; + Ok(tokens.into_iter().map(|token| (token.id, token)).collect()) + } + + /// Loads tokens for the given pagination query + pub async fn load_token_page( + &mut self, + query: &PaginationQuery, + ) -> QueryResult> { + let tokens = match query.direction { + PaginationDirection::Newer => { + self.load_tokens_asc(query.from, Some(query.limit)).await? + } + PaginationDirection::Older => { + self.load_tokens_desc(query.from, Some(query.limit)).await? + } + }; + Ok(tokens) + } + /// Loads all finalized NFTs. pub async fn load_nfts(&mut self) -> QueryResult> { let start = Instant::now(); @@ -197,8 +250,40 @@ impl<'a, 'c> TokensSchema<'a, 'c> { result } - /// Gets the last used token ID from Database. - pub async fn get_last_token_id(&mut self) -> QueryResult { + /// Filters out tokens whose market volume is less than the specified limit (min_market_volume). + pub async fn filter_tokens_by_market_volume( + &mut self, + tokens_to_check: Vec, + min_market_volume: &Ratio, + ) -> QueryResult> { + let start = Instant::now(); + let tokens_to_check: Vec = tokens_to_check.into_iter().map(|id| *id as i32).collect(); + let tokens = sqlx::query!( + r#" + SELECT token_id + FROM ticker_market_volume + WHERE token_id = ANY($1) AND market_volume >= $2 + "#, + &tokens_to_check, + ratio_to_big_decimal(min_market_volume, STORED_USD_PRICE_PRECISION) + ) + .fetch_all(self.0.conn()) + .await?; + + let result = Ok(tokens + .into_iter() + .map(|t| TokenId(t.token_id as u32)) + .collect()); + + metrics::histogram!( + "sql.token.load_token_ids_that_enabled_for_fees", + start.elapsed() + ); + result + } + + /// Get the number of tokens from Database + pub async fn get_count(&mut self) -> QueryResult { let start = Instant::now(); let last_token_id = sqlx::query!( r#" @@ -207,11 +292,11 @@ impl<'a, 'c> TokensSchema<'a, 'c> { ) .fetch_optional(self.0.conn()) .await? - .map(|token| token.id as u32) + .map(|token| token.id) .unwrap_or(0); - metrics::histogram!("sql.token.get_last_token_id", start.elapsed()); - Ok(TokenId(last_token_id)) + metrics::histogram!("sql.token.get_count", start.elapsed()); + Ok(last_token_id as u32) } pub async fn get_nft(&mut self, token_id: TokenId) -> QueryResult> { @@ -421,9 +506,9 @@ impl<'a, 'c> TokensSchema<'a, 'c> { r#" INSERT INTO nft_factory ( creator_id, factory_address, creator_address ) VALUES ( $1, $2, $3 ) - ON CONFLICT ( creator_id ) - DO UPDATE - SET factory_address = $2 + ON CONFLICT ( creator_id ) + DO UPDATE + SET factory_address = $2 "#, creator_id.0 as i32, address_to_stored_string(&factory_address), diff --git a/core/lib/storage/src/tokens/records.rs b/core/lib/storage/src/tokens/records.rs index 58b0392814..f1e9392d7f 100644 --- a/core/lib/storage/src/tokens/records.rs +++ b/core/lib/storage/src/tokens/records.rs @@ -7,8 +7,9 @@ use sqlx::{types::BigDecimal, FromRow}; // Local imports use crate::utils::{address_to_stored_string, stored_str_address_to_address}; use chrono::{DateTime, Utc}; +use zksync_api_types::v02::token::ApiNFT; use zksync_types::{ - tokens::{ApiNFT, TokenMarketVolume, TokenPrice}, + tokens::{TokenMarketVolume, TokenPrice}, AccountId, Address, Token, TokenId, H256, NFT, }; use zksync_utils::big_decimal_to_ratio; diff --git a/core/lib/types/src/account/mod.rs b/core/lib/types/src/account/mod.rs index e991b0c32f..888148b960 100644 --- a/core/lib/types/src/account/mod.rs +++ b/core/lib/types/src/account/mod.rs @@ -66,7 +66,7 @@ impl From for CircuitAccount { } circuit_account.nonce = Fr::from_str(&acc.nonce.to_string()).unwrap(); - circuit_account.pub_key_hash = acc.pub_key_hash.to_fr(); + circuit_account.pub_key_hash = acc.pub_key_hash.as_fr(); circuit_account.address = eth_address_to_fr(&acc.address); circuit_account } diff --git a/core/lib/types/src/account/pubkey_hash.rs b/core/lib/types/src/account/pubkey_hash.rs index 069940d84f..a55ae47ad2 100644 --- a/core/lib/types/src/account/pubkey_hash.rs +++ b/core/lib/types/src/account/pubkey_hash.rs @@ -23,7 +23,7 @@ pub struct PubKeyHash { impl std::fmt::Debug for PubKeyHash { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.to_hex()) + write!(f, "{}", self.as_hex()) } } @@ -47,9 +47,9 @@ impl PubKeyHash { /// use zksync_types::account::PubKeyHash; /// /// let pubkey_hash = PubKeyHash::zero(); - /// assert_eq!(pubkey_hash.to_hex(), "sync:0000000000000000000000000000000000000000"); + /// assert_eq!(pubkey_hash.as_hex(), "sync:0000000000000000000000000000000000000000"); /// ``` - pub fn to_hex(&self) -> String { + pub fn as_hex(&self) -> String { format!("sync:{}", hex::encode(&self.data)) } @@ -92,7 +92,7 @@ impl PubKeyHash { } /// Converts the `PubKeyhash` into the field element. - pub fn to_fr(&self) -> Fr { + pub fn as_fr(&self) -> Fr { ff::from_hex(&format!("0x{}", hex::encode(&self.data))).unwrap() } @@ -108,7 +108,7 @@ impl Serialize for PubKeyHash { where S: Serializer, { - serializer.serialize_str(&self.to_hex()) + serializer.serialize_str(&self.as_hex()) } } diff --git a/core/lib/types/src/fee.rs b/core/lib/types/src/fee.rs index cefc6a8fd1..39e53d2f30 100644 --- a/core/lib/types/src/fee.rs +++ b/core/lib/types/src/fee.rs @@ -2,7 +2,7 @@ use num::rational::Ratio; use num::BigUint; use serde::{Deserialize, Serialize}; -use crate::helpers::{closest_packable_fee_amount, pack_fee_amount, unpack_fee_amount}; +use crate::helpers::{pack_fee_amount, unpack_fee_amount}; use crate::tokens::ChangePubKeyFeeTypeArg; use zksync_utils::{round_precision, BigUintSerdeAsRadix10Str}; @@ -42,15 +42,29 @@ pub struct Fee { #[derive(Debug, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct BatchFee { + #[serde(with = "BigUintSerdeAsRadix10Str")] + pub gas_fee: BigUint, + #[serde(with = "BigUintSerdeAsRadix10Str")] + pub zkp_fee: BigUint, + #[serde(with = "BigUintSerdeAsRadix10Str")] + pub total_fee: BigUint, +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +pub struct TotalFee { #[serde(with = "BigUintSerdeAsRadix10Str")] pub total_fee: BigUint, } impl BatchFee { - pub fn new(zkp_fee: &Ratio, gas_fee: &Ratio) -> BatchFee { - let (_, _, mut total_fee) = total_fee(zkp_fee, gas_fee); - total_fee = closest_packable_fee_amount(&total_fee); - BatchFee { total_fee } + pub fn new(zkp_fee: Ratio, gas_fee: Ratio) -> Self { + let (zkp_fee, gas_fee, total_fee) = total_fee(&zkp_fee, &gas_fee); + Self { + gas_fee, + zkp_fee, + total_fee, + } } } diff --git a/core/lib/types/src/gas_counter.rs b/core/lib/types/src/gas_counter.rs index f317be2a1d..61e79b0fa8 100644 --- a/core/lib/types/src/gas_counter.rs +++ b/core/lib/types/src/gas_counter.rs @@ -228,11 +228,11 @@ impl GasCounter { } pub fn commit_gas_limit(&self) -> U256 { - self.commit_cost * U256::from(130) / U256::from(100) + Self::scale_up(self.commit_cost) } pub fn verify_gas_limit(&self) -> U256 { - self.verify_cost * U256::from(130) / U256::from(100) + Self::scale_up(self.verify_cost) } pub fn complete_withdrawals_gas_limit() -> U256 { diff --git a/core/lib/types/src/lib.rs b/core/lib/types/src/lib.rs index 8f788cd6fa..8bf9491dc3 100644 --- a/core/lib/types/src/lib.rs +++ b/core/lib/types/src/lib.rs @@ -62,7 +62,7 @@ mod tests; pub use self::account::{Account, AccountUpdate, PubKeyHash}; pub use self::block::{ExecutedOperations, ExecutedPriorityOp, ExecutedTx}; -pub use self::fee::{BatchFee, Fee, OutputFeeType}; +pub use self::fee::{BatchFee, Fee, OutputFeeType, TotalFee}; pub use self::operations::{ ChangePubKeyOp, DepositOp, ForcedExitOp, FullExitOp, MintNFTOp, SwapOp, TransferOp, TransferToNewOp, WithdrawNFTOp, WithdrawOp, ZkSyncOp, diff --git a/core/lib/types/src/mempool.rs b/core/lib/types/src/mempool.rs index 679853f3b3..f8abb418bf 100644 --- a/core/lib/types/src/mempool.rs +++ b/core/lib/types/src/mempool.rs @@ -1,6 +1,6 @@ use super::{ tx::{TxEthSignature, TxHash}, - SignedZkSyncTx, + SerialId, SignedZkSyncTx, }; /// A collection of transactions that must be executed together. @@ -54,3 +54,34 @@ impl SignedTxVariant { } } } + +#[derive(Debug, Clone)] +pub struct RevertedTxVariant { + inner: SignedTxVariant, + pub next_priority_op_id: SerialId, +} + +impl AsRef for RevertedTxVariant { + fn as_ref(&self) -> &SignedTxVariant { + &self.inner + } +} + +impl AsMut for RevertedTxVariant { + fn as_mut(&mut self) -> &mut SignedTxVariant { + &mut self.inner + } +} + +impl RevertedTxVariant { + pub fn new(txs: SignedTxVariant, next_priority_op_id: SerialId) -> Self { + Self { + inner: txs, + next_priority_op_id, + } + } + + pub fn into_inner(self) -> SignedTxVariant { + self.inner + } +} diff --git a/core/lib/types/src/operations/full_exit_op.rs b/core/lib/types/src/operations/full_exit_op.rs index 4562b02fe3..ba595df4ed 100644 --- a/core/lib/types/src/operations/full_exit_op.rs +++ b/core/lib/types/src/operations/full_exit_op.rs @@ -50,16 +50,10 @@ impl FullExitOp { .unwrap() .to_be_bytes(), ); - data.extend_from_slice( - &self - .creator_account_id - .clone() - .unwrap_or_default() - .to_be_bytes(), - ); - data.extend_from_slice(&self.creator_address.clone().unwrap_or_default().as_bytes()); - data.extend_from_slice(&self.serial_id.clone().unwrap_or_default().to_be_bytes()); - data.extend_from_slice(&self.content_hash.clone().unwrap_or_default().as_bytes()); + data.extend_from_slice(&self.creator_account_id.unwrap_or_default().to_be_bytes()); + data.extend_from_slice(&self.creator_address.unwrap_or_default().as_bytes()); + data.extend_from_slice(&self.serial_id.unwrap_or_default().to_be_bytes()); + data.extend_from_slice(&self.content_hash.unwrap_or_default().as_bytes()); data.resize(Self::CHUNKS * CHUNK_BYTES, 0x00); data } @@ -77,13 +71,7 @@ impl FullExitOp { .unwrap_or(0) .to_be_bytes(), ); - data.extend_from_slice( - &self - .creator_account_id - .clone() - .unwrap_or_default() - .to_be_bytes(), - ); + data.extend_from_slice(&self.creator_account_id.unwrap_or_default().to_be_bytes()); data } diff --git a/core/lib/types/src/priority_ops/mod.rs b/core/lib/types/src/priority_ops/mod.rs index 2d88f866ef..5b07a4be22 100644 --- a/core/lib/types/src/priority_ops/mod.rs +++ b/core/lib/types/src/priority_ops/mod.rs @@ -2,6 +2,7 @@ use ethabi::{decode, ParamType}; use num::{BigUint, ToPrimitive}; +use parity_crypto::digest::sha256; use serde::{Deserialize, Serialize}; use std::convert::{TryFrom, TryInto}; use zksync_basic_types::{Address, Log, H256, U256}; @@ -13,6 +14,7 @@ use zksync_utils::BigUintSerdeAsRadix10Str; use super::{ operations::{DepositOp, FullExitOp}, + tx::TxHash, utils::h256_as_vec, AccountId, SerialId, TokenId, }; @@ -357,6 +359,9 @@ pub struct PriorityOp { pub eth_hash: H256, /// Block in which Ethereum transaction was included. pub eth_block: u64, + /// Transaction index in Ethereum block. + /// This field must be optional because of backward compatibility. + pub eth_block_index: Option, } impl TryFrom for PriorityOp { @@ -416,6 +421,7 @@ impl TryFrom for PriorityOp { .block_number .expect("Event block number is missing") .as_u64(), + eth_block_index: event.transaction_index.map(|index| index.as_u64()), }) } } @@ -426,4 +432,16 @@ impl PriorityOp { queue_entries.iter().map(|priority_op| &priority_op.data), ) } + + pub fn tx_hash(&self) -> TxHash { + let mut bytes = Vec::with_capacity(48); + bytes.extend_from_slice(self.eth_hash.as_bytes()); + bytes.extend_from_slice(&self.eth_block.to_be_bytes()); + bytes.extend_from_slice(&self.eth_block_index.unwrap_or(0).to_be_bytes()); + + let hash = sha256(&bytes); + let mut out = [0u8; 32]; + out.copy_from_slice(&hash); + TxHash { data: out } + } } diff --git a/core/lib/types/src/priority_ops/tests.rs b/core/lib/types/src/priority_ops/tests.rs index 2a1c270b0a..65e7b1e04a 100644 --- a/core/lib/types/src/priority_ops/tests.rs +++ b/core/lib/types/src/priority_ops/tests.rs @@ -16,6 +16,7 @@ mod backward_compatibility { deadline_block: u64, eth_hash: Vec, eth_block: u64, + eth_block_index: u64, } fn old_value() -> OldPriorityOp { @@ -31,6 +32,7 @@ mod backward_compatibility { deadline_block: 100, eth_hash: vec![2; 32], eth_block: 0, + eth_block_index: 0, } } diff --git a/core/lib/types/src/tests/utils.rs b/core/lib/types/src/tests/utils.rs index 6961817547..fda250b590 100644 --- a/core/lib/types/src/tests/utils.rs +++ b/core/lib/types/src/tests/utils.rs @@ -16,6 +16,7 @@ pub fn create_full_exit_op() -> ExecutedOperations { deadline_block: 0, eth_hash: H256::zero(), eth_block: 0, + eth_block_index: None, }, op: ZkSyncOp::FullExit(Box::new(FullExitOp { priority_op, diff --git a/core/lib/types/src/tokens.rs b/core/lib/types/src/tokens.rs index 0ea124a285..a50f2b1e1a 100644 --- a/core/lib/types/src/tokens.rs +++ b/core/lib/types/src/tokens.rs @@ -282,22 +282,6 @@ impl NFT { } } -// TODO: move this struct to `api_types` crate (ZKD-67) -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -pub struct ApiNFT { - pub id: TokenId, - pub serial_id: u32, - pub creator_address: Address, - pub creator_id: AccountId, - pub address: Address, - pub symbol: String, - pub content_hash: H256, - /// Current factory address of nft creator - pub current_factory: Address, - /// Factory address which was used for withdrawing nft - pub withdrawn_factory: Option
, -} - #[derive(Debug, Error, PartialEq)] #[error("Incorrect ProverJobStatus number: {0}")] pub struct IncorrectProverJobStatus(pub i32); diff --git a/core/lib/types/src/tx/change_pubkey.rs b/core/lib/types/src/tx/change_pubkey.rs index d99cdc4557..50bb286f0c 100644 --- a/core/lib/types/src/tx/change_pubkey.rs +++ b/core/lib/types/src/tx/change_pubkey.rs @@ -266,7 +266,7 @@ impl ChangePubKey { out.extend_from_slice(&pack_fee_amount(&self.fee)); out.extend_from_slice(&self.nonce.to_be_bytes()); if let Some(time_range) = &self.time_range { - out.extend_from_slice(&time_range.to_be_bytes()); + out.extend_from_slice(&time_range.as_be_bytes()); } out } @@ -287,7 +287,7 @@ impl ChangePubKey { out.extend_from_slice(&pack_fee_amount(&self.fee)); out.extend_from_slice(&self.nonce.to_be_bytes()); if let Some(time_range) = &self.time_range { - out.extend_from_slice(&time_range.to_be_bytes()); + out.extend_from_slice(&time_range.as_be_bytes()); } out } diff --git a/core/lib/types/src/tx/close.rs b/core/lib/types/src/tx/close.rs index 4d8417009c..7172d2888f 100644 --- a/core/lib/types/src/tx/close.rs +++ b/core/lib/types/src/tx/close.rs @@ -25,7 +25,7 @@ impl Close { out.extend_from_slice(&[Self::TX_TYPE]); out.extend_from_slice(&self.account.as_bytes()); out.extend_from_slice(&self.nonce.to_be_bytes()); - out.extend_from_slice(&self.time_range.to_be_bytes()); + out.extend_from_slice(&self.time_range.as_be_bytes()); out } diff --git a/core/lib/types/src/tx/forced_exit.rs b/core/lib/types/src/tx/forced_exit.rs index 80a0caff4b..a5a414c228 100644 --- a/core/lib/types/src/tx/forced_exit.rs +++ b/core/lib/types/src/tx/forced_exit.rs @@ -120,7 +120,7 @@ impl ForcedExit { out.extend_from_slice(&(self.token.0 as u16).to_be_bytes()); out.extend_from_slice(&pack_fee_amount(&self.fee)); out.extend_from_slice(&self.nonce.to_be_bytes()); - out.extend_from_slice(&self.time_range.to_be_bytes()); + out.extend_from_slice(&self.time_range.as_be_bytes()); out } @@ -138,7 +138,7 @@ impl ForcedExit { out.extend_from_slice(&self.token.to_be_bytes()); out.extend_from_slice(&pack_fee_amount(&self.fee)); out.extend_from_slice(&self.nonce.to_be_bytes()); - out.extend_from_slice(&self.time_range.to_be_bytes()); + out.extend_from_slice(&self.time_range.as_be_bytes()); out } diff --git a/core/lib/types/src/tx/primitives/eth_signature.rs b/core/lib/types/src/tx/primitives/eth_signature.rs index 7188020daa..a4ea0af2ca 100644 --- a/core/lib/types/src/tx/primitives/eth_signature.rs +++ b/core/lib/types/src/tx/primitives/eth_signature.rs @@ -1,5 +1,6 @@ use crate::tx::{EIP1271Signature, PackedEthSignature}; use serde::{Deserialize, Serialize}; +use std::fmt::{Display, Formatter}; /// Representation of the signature secured by L1. /// May be either a signature generated via Ethereum private key @@ -55,3 +56,14 @@ impl TxEthSignatureVariant { } } } + +impl Display for TxEthSignature { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + match self { + Self::EthereumSignature(sign) => { + write!(f, "0x{}", hex::encode(sign.serialize_packed())) + } + Self::EIP1271Signature(sign) => write!(f, "0x{}", hex::encode(sign.0.clone())), + } + } +} diff --git a/core/lib/types/src/tx/primitives/time_range.rs b/core/lib/types/src/tx/primitives/time_range.rs index fbd40646e7..d495ea64bc 100644 --- a/core/lib/types/src/tx/primitives/time_range.rs +++ b/core/lib/types/src/tx/primitives/time_range.rs @@ -18,7 +18,7 @@ impl TimeRange { } } - pub fn to_be_bytes(&self) -> [u8; 16] { + pub fn as_be_bytes(&self) -> [u8; 16] { [ self.valid_from.to_be_bytes(), self.valid_until.to_be_bytes(), diff --git a/core/lib/types/src/tx/primitives/tx_hash.rs b/core/lib/types/src/tx/primitives/tx_hash.rs index 92049bd47f..201ba82939 100644 --- a/core/lib/types/src/tx/primitives/tx_hash.rs +++ b/core/lib/types/src/tx/primitives/tx_hash.rs @@ -1,3 +1,4 @@ +use parity_crypto::digest::sha256; use serde::{Deserialize, Deserializer, Serialize, Serializer}; use std::{convert::TryInto, str::FromStr}; use thiserror::Error; @@ -23,6 +24,11 @@ impl TxHash { Some(out) } } + + pub fn batch_hash(tx_hashes: &[TxHash]) -> TxHash { + let bytes: Vec = tx_hashes.iter().flat_map(AsRef::as_ref).cloned().collect(); + TxHash::from_slice(&*sha256(&bytes)).unwrap() + } } impl AsRef<[u8]> for TxHash { @@ -41,10 +47,14 @@ impl FromStr for TxHash { type Err = TxHashDecodeError; fn from_str(s: &str) -> Result { - if !s.starts_with("sync-tx:") { + let s = if let Some(s) = s.strip_prefix("0x") { + s + } else if let Some(s) = s.strip_prefix("sync-tx:") { + s + } else { return Err(TxHashDecodeError::PrefixError); - } - let bytes = hex::decode(&s[8..])?; + }; + let bytes = hex::decode(&s)?; if bytes.len() != 32 { return Err(TxHashDecodeError::IncorrectHashLength); } @@ -56,7 +66,7 @@ impl FromStr for TxHash { #[derive(Debug, Error)] pub enum TxHashDecodeError { - #[error("TxHash should start with sync-tx:")] + #[error("TxHash should start with 0x or sync-tx:")] PrefixError, #[error("Cannot decode Hex: {0}")] DecodeHex(#[from] hex::FromHexError), diff --git a/core/lib/types/src/tx/swap.rs b/core/lib/types/src/tx/swap.rs index eae1557178..1114d95670 100644 --- a/core/lib/types/src/tx/swap.rs +++ b/core/lib/types/src/tx/swap.rs @@ -80,7 +80,7 @@ impl Order { out.extend_from_slice(&pad_front(&self.price.0.to_bytes_be(), PRICE_BIT_WIDTH / 8)); out.extend_from_slice(&pad_front(&self.price.1.to_bytes_be(), PRICE_BIT_WIDTH / 8)); out.extend_from_slice(&pack_token_amount(&self.amount)); - out.extend_from_slice(&self.time_range.to_be_bytes()); + out.extend_from_slice(&self.time_range.as_be_bytes()); out } diff --git a/core/lib/types/src/tx/tests.rs b/core/lib/types/src/tx/tests.rs index a50ea56b80..585755f207 100644 --- a/core/lib/types/src/tx/tests.rs +++ b/core/lib/types/src/tx/tests.rs @@ -6,7 +6,9 @@ use zksync_crypto::{ eddsa::{PrivateKey, PublicKey}, jubjub::FixedGenerators, }, + pairing::bn256::Bn256, params::{max_account_id, max_fungible_token_id, CURRENT_TX_VERSION, JUBJUB_PARAMS}, + primitives::rescue_hash_orders, public_key_from_private, rand::{Rng, SeedableRng, XorShiftRng}, }; @@ -14,7 +16,7 @@ use zksync_crypto::{ use super::*; use crate::{ helpers::{pack_fee_amount, pack_token_amount}, - AccountId, Engine, Nonce, TokenId, + AccountId, Engine, Nonce, PubKeyHash, TokenId, H256, }; fn gen_pk_and_msg() -> (PrivateKey, Vec>) { @@ -35,6 +37,109 @@ fn gen_token_id(rng: &mut T) -> TokenId { TokenId(rng.gen::().min(*max_fungible_token_id())) } +fn gen_nft_token_id(rng: &mut T) -> TokenId { + TokenId(rng.gen::().max(*max_fungible_token_id() + 1)) +} + +#[test] +fn test_print_swap_for_protocol() { + let mut rng = XorShiftRng::from_seed([1, 2, 3, 4]); + let key_0 = gen_pk_and_msg().0; + let key_1 = gen_pk_and_msg().0; + let key_2 = gen_pk_and_msg().0; + let token_a = gen_token_id(&mut rng); + let token_b = gen_token_id(&mut rng); + + let order_0 = Order::new_signed( + gen_account_id(&mut rng), + Address::from(rng.gen::<[u8; 20]>()), + Nonce(rng.gen()), + token_a, + token_b, + (BigUint::from(12u8), BigUint::from(18u8)), + BigUint::from(12_000_000_000u64), + Default::default(), + &key_0, + ) + .expect("failed to sign order"); + + let order_1 = Order::new_signed( + gen_account_id(&mut rng), + Address::from(rng.gen::<[u8; 20]>()), + Nonce(rng.gen()), + token_b, + token_a, + (BigUint::from(18u8), BigUint::from(12u8)), + BigUint::from(18_000_000_000u64), + Default::default(), + &key_1, + ) + .expect("failed to sign order"); + + let swap = Swap::new_signed( + gen_account_id(&mut rng), + Address::from(rng.gen::<[u8; 20]>()), + Nonce(rng.gen()), + (order_0.clone(), order_1.clone()), + ( + BigUint::from(12_000_000_000u64), + BigUint::from(18_000_000_000u64), + ), + BigUint::from(56_000_000u64), + gen_token_id(&mut rng), + &key_2, + ) + .expect("failed to sign transfer"); + + println!( + "User representation:\n{}\n", + serde_json::to_string_pretty(&swap).expect("json serialize") + ); + + let print_signer = |name, key: PrivateKey| { + println!("Signer ({}):", name); + println!("Private key: {}", key.0.to_string()); + let (pk_x, pk_y) = public_key_from_private(&key).0.into_xy(); + println!("Public key: x: {}, y: {}\n", pk_x, pk_y); + }; + + print_signer("account_a", key_0); + print_signer("account_b", key_1); + print_signer("submitter", key_2); + + let mut orders_bytes = Vec::new(); + orders_bytes.extend(order_0.get_bytes()); + orders_bytes.extend(order_1.get_bytes()); + + let signed_fields = vec![ + ("type", vec![255u8 - Swap::TX_TYPE]), + ("version", vec![CURRENT_TX_VERSION]), + ("submitterId", swap.submitter_id.to_be_bytes().to_vec()), + ( + "submitterAddress", + swap.submitter_address.as_bytes().to_vec(), + ), + ("nonce", swap.nonce.to_be_bytes().to_vec()), + ("orders_hash", rescue_hash_orders(&orders_bytes)), + ("fee_token", swap.fee_token.to_be_bytes().to_vec()), + ("fee", pack_fee_amount(&swap.fee)), + ("amounts[0]", pack_token_amount(&swap.amounts.0)), + ("amounts[1]", pack_token_amount(&swap.amounts.1)), + ]; + println!("Signed transaction fields:"); + let mut field_concat = Vec::new(); + for (field, value) in signed_fields.into_iter() { + println!("{}: 0x{}", field, hex::encode(&value)); + field_concat.extend(value); + } + println!("Signed bytes: 0x{}", hex::encode(&field_concat)); + assert_eq!( + field_concat, + swap.get_sign_bytes(), + "Protocol serialization mismatch" + ); +} + #[test] fn test_print_transfer_for_protocol() { let mut rng = XorShiftRng::from_seed([1, 2, 3, 4]); @@ -77,7 +182,67 @@ fn test_print_transfer_for_protocol() { transfer .time_range .expect("no time range on transfer") - .to_be_bytes() + .as_be_bytes() + .to_vec(), + ), + ]; + println!("Signed transaction fields:"); + let mut field_concat = Vec::new(); + for (field, value) in signed_fields.into_iter() { + println!("{}: 0x{}", field, hex::encode(&value)); + field_concat.extend(value.into_iter()); + } + println!("Signed bytes: 0x{}", hex::encode(&field_concat)); + assert_eq!( + field_concat, + transfer.get_bytes(), + "Protocol serialization mismatch" + ); +} + +#[test] +fn test_print_change_pub_key_for_protocol() { + let mut rng = XorShiftRng::from_seed([1, 2, 3, 4]); + let key = gen_pk_and_msg().0; + PubKeyHash::from_privkey(&key); + let transfer = ChangePubKey::new_signed( + gen_account_id(&mut rng), + Address::from(rng.gen::<[u8; 20]>()), + PubKeyHash::from_privkey(&key), + gen_token_id(&mut rng), + BigUint::from(56_700_000_000u64), + Nonce(rng.gen()), + Default::default(), + None, + &key, + ) + .expect("failed to sign transfer"); + + println!( + "User representation:\n{}\n", + serde_json::to_string_pretty(&transfer).expect("json serialize") + ); + + println!("Signer:"); + println!("Private key: {}", key.0.to_string()); + let (pk_x, pk_y) = public_key_from_private(&key).0.into_xy(); + println!("Public key: x: {}, y: {}\n", pk_x, pk_y); + + let signed_fields = vec![ + ("type", vec![255u8 - ChangePubKey::TX_TYPE]), + ("version", vec![CURRENT_TX_VERSION]), + ("accountId", transfer.account_id.to_be_bytes().to_vec()), + ("account", transfer.account.as_bytes().to_vec()), + ("new_pub_key_hash", transfer.new_pk_hash.data.to_vec()), + ("token", transfer.fee_token.to_be_bytes().to_vec()), + ("fee", pack_fee_amount(&transfer.fee)), + ("nonce", transfer.nonce.to_be_bytes().to_vec()), + ( + "time_range", + transfer + .time_range + .expect("no time range on transfer") + .as_be_bytes() .to_vec(), ), ]; @@ -140,7 +305,7 @@ fn test_print_withdraw_for_protocol() { withdraw .time_range .expect("no time range on withdraw") - .to_be_bytes() + .as_be_bytes() .to_vec(), ), ]; @@ -158,6 +323,113 @@ fn test_print_withdraw_for_protocol() { ); } +#[test] +fn test_print_withdraw_nft_for_protocol() { + let mut rng = XorShiftRng::from_seed([2, 2, 3, 4]); + let key = gen_pk_and_msg().0; + let withdraw = WithdrawNFT::new_signed( + gen_account_id(&mut rng), + Address::from(rng.gen::<[u8; 20]>()), + Address::from(rng.gen::<[u8; 20]>()), + gen_nft_token_id(&mut rng), + gen_token_id(&mut rng), + BigUint::from(12_340_000_000_000u64), + Nonce(rng.gen()), + Default::default(), + &key, + ) + .expect("failed to sign withdraw"); + + println!( + "User representation:\n{}\n", + serde_json::to_string_pretty(&withdraw).expect("json serialize") + ); + + println!("Signer:"); + println!("Private key: {}", key.0.to_string()); + let (pk_x, pk_y) = public_key_from_private(&key).0.into_xy(); + println!("Public key: x: {}, y: {}\n", pk_x, pk_y); + + let signed_fields = vec![ + ("type", vec![255u8 - WithdrawNFT::TX_TYPE]), + ("version", vec![CURRENT_TX_VERSION]), + ("accountId", withdraw.account_id.to_be_bytes().to_vec()), + ("from", withdraw.from.as_bytes().to_vec()), + ("to", withdraw.to.as_bytes().to_vec()), + ("token", withdraw.token.to_be_bytes().to_vec()), + ("fee_token", withdraw.fee_token.to_be_bytes().to_vec()), + ("fee", pack_fee_amount(&withdraw.fee)), + ("nonce", withdraw.nonce.to_be_bytes().to_vec()), + ("time_range", withdraw.time_range.as_be_bytes().to_vec()), + ]; + println!("Signed transaction fields:"); + let mut field_concat = Vec::new(); + for (field, value) in signed_fields.into_iter() { + println!("{}: 0x{}", field, hex::encode(&value)); + field_concat.extend(value.into_iter()); + } + println!("Signed bytes: 0x{}", hex::encode(&field_concat)); + assert_eq!( + field_concat, + withdraw.get_bytes(), + "Protocol serialization mismatch" + ); +} + +#[test] +fn test_print_mint_nft_for_protocol() { + let mut rng = XorShiftRng::from_seed([2, 2, 3, 4]); + let key = gen_pk_and_msg().0; + let mint_nft = MintNFT::new_signed( + gen_account_id(&mut rng), + Address::from(rng.gen::<[u8; 20]>()), + H256::random(), + Address::from(rng.gen::<[u8; 20]>()), + BigUint::from(12_340_000_000_000u64), + gen_token_id(&mut rng), + Nonce(rng.gen()), + &key, + ) + .expect("failed to sign withdraw"); + + println!( + "User representation:\n{}\n", + serde_json::to_string_pretty(&mint_nft).expect("json serialize") + ); + + println!("Signer:"); + println!("Private key: {}", key.0.to_string()); + let (pk_x, pk_y) = public_key_from_private(&key).0.into_xy(); + println!("Public key: x: {}, y: {}\n", pk_x, pk_y); + + let signed_fields = vec![ + ("type", vec![255u8 - MintNFT::TX_TYPE]), + ("version", vec![CURRENT_TX_VERSION]), + ("creatorId", mint_nft.creator_id.to_be_bytes().to_vec()), + ( + "creatorAddress", + mint_nft.creator_address.as_bytes().to_vec(), + ), + ("contentHash", mint_nft.content_hash.as_bytes().to_vec()), + ("recipient", mint_nft.recipient.as_bytes().to_vec()), + ("fee_token", mint_nft.fee_token.to_be_bytes().to_vec()), + ("fee", pack_fee_amount(&mint_nft.fee)), + ("nonce", mint_nft.nonce.to_be_bytes().to_vec()), + ]; + println!("Signed transaction fields:"); + let mut field_concat = Vec::new(); + for (field, value) in signed_fields.into_iter() { + println!("{}: 0x{}", field, hex::encode(&value)); + field_concat.extend(value.into_iter()); + } + println!("Signed bytes: 0x{}", hex::encode(&field_concat)); + assert_eq!( + field_concat, + mint_nft.get_bytes(), + "Protocol serialization mismatch" + ); +} + #[test] fn test_musig_rescue_signing_verification() { let (pk, messages) = gen_pk_and_msg(); diff --git a/core/lib/types/src/tx/transfer.rs b/core/lib/types/src/tx/transfer.rs index e19776655e..8823ee7135 100644 --- a/core/lib/types/src/tx/transfer.rs +++ b/core/lib/types/src/tx/transfer.rs @@ -134,7 +134,7 @@ impl Transfer { out.extend_from_slice(&pack_fee_amount(&self.fee)); out.extend_from_slice(&self.nonce.to_be_bytes()); if let Some(time_range) = &self.time_range { - out.extend_from_slice(&time_range.to_be_bytes()); + out.extend_from_slice(&time_range.as_be_bytes()); } out } @@ -159,7 +159,7 @@ impl Transfer { out.extend_from_slice(&pack_fee_amount(&self.fee)); out.extend_from_slice(&self.nonce.to_be_bytes()); if let Some(time_range) = &self.time_range { - out.extend_from_slice(&time_range.to_be_bytes()); + out.extend_from_slice(&time_range.as_be_bytes()); } out } diff --git a/core/lib/types/src/tx/withdraw.rs b/core/lib/types/src/tx/withdraw.rs index dc27facc8c..97eb4feb64 100644 --- a/core/lib/types/src/tx/withdraw.rs +++ b/core/lib/types/src/tx/withdraw.rs @@ -139,7 +139,7 @@ impl Withdraw { out.extend_from_slice(&pack_fee_amount(&self.fee)); out.extend_from_slice(&self.nonce.to_be_bytes()); if let Some(time_range) = &self.time_range { - out.extend_from_slice(&time_range.to_be_bytes()); + out.extend_from_slice(&time_range.as_be_bytes()); } out } @@ -161,7 +161,7 @@ impl Withdraw { out.extend_from_slice(&pack_fee_amount(&self.fee)); out.extend_from_slice(&self.nonce.to_be_bytes()); if let Some(time_range) = &self.time_range { - out.extend_from_slice(&time_range.to_be_bytes()); + out.extend_from_slice(&time_range.as_be_bytes()); } out } diff --git a/core/lib/types/src/tx/withdraw_nft.rs b/core/lib/types/src/tx/withdraw_nft.rs index 1e86699214..8db125208c 100644 --- a/core/lib/types/src/tx/withdraw_nft.rs +++ b/core/lib/types/src/tx/withdraw_nft.rs @@ -132,7 +132,7 @@ impl WithdrawNFT { out.extend_from_slice(&self.fee_token.to_be_bytes()); out.extend_from_slice(&pack_fee_amount(&self.fee)); out.extend_from_slice(&self.nonce.to_be_bytes()); - out.extend_from_slice(&self.time_range.to_be_bytes()); + out.extend_from_slice(&self.time_range.as_be_bytes()); out } diff --git a/core/lib/utils/src/serde_wrappers.rs b/core/lib/utils/src/serde_wrappers.rs index 13bb0eff76..f4ec937237 100644 --- a/core/lib/utils/src/serde_wrappers.rs +++ b/core/lib/utils/src/serde_wrappers.rs @@ -150,7 +150,7 @@ pub struct BytesToHexSerde

{ } impl BytesToHexSerde

{ - pub fn serialize(value: &[u8], serializer: S) -> Result + pub fn serialize(value: impl AsRef<[u8]>, serializer: S) -> Result where S: Serializer, { diff --git a/core/tests/loadnext/src/corrupted_tx.rs b/core/tests/loadnext/src/corrupted_tx.rs index 05fa12e23d..bb2f10287e 100644 --- a/core/tests/loadnext/src/corrupted_tx.rs +++ b/core/tests/loadnext/src/corrupted_tx.rs @@ -395,10 +395,9 @@ mod tests { let (modified_transfer, _eth_signature) = transfer.not_packable_amount(account.eth_account_data.unwrap_eoa_pk(), "ETH", 18); - assert_eq!( - is_token_amount_packable(&unwrap_transfer(modified_transfer).amount), - false - ); + assert!(!is_token_amount_packable( + &unwrap_transfer(modified_transfer).amount + )); } #[test] @@ -410,10 +409,9 @@ mod tests { let (modified_transfer, _eth_signature) = transfer.not_packable_fee(account.eth_account_data.unwrap_eoa_pk(), "ETH", 18); - assert_eq!( - is_fee_amount_packable(&unwrap_transfer(modified_transfer).fee), - false - ); + assert!(!is_fee_amount_packable( + &unwrap_transfer(modified_transfer).fee + )); } #[test] diff --git a/core/tests/loadtest/src/api/data_pool.rs b/core/tests/loadtest/src/api/data_pool.rs index d644244e80..58c9a04add 100644 --- a/core/tests/loadtest/src/api/data_pool.rs +++ b/core/tests/loadtest/src/api/data_pool.rs @@ -11,7 +11,6 @@ use rand::{thread_rng, Rng}; use tokio::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard}; // Workspace uses -use zksync_api_client::rest::v1::Pagination; use zksync_types::{tx::TxHash, AccountId, Address, BlockNumber, PriorityOp, ZkSyncPriorityOp}; // Local uses @@ -130,22 +129,6 @@ impl ApiDataPoolInner { self.random_tx_location().0 } - /// Generates a random pagination block range. - pub fn random_block_range(&self) -> (Pagination, u32) { - let mut rng = thread_rng(); - - let block_number = self.random_block(); - let pagination = match rng.gen_range(0, 3) { - 0 => Pagination::Before(block_number), - 1 => Pagination::After(block_number), - 2 => Pagination::Last, - _ => unreachable!(), - }; - - let limit = rng.gen_range(1, MAX_REQUEST_LIMIT as u32 + 1); - (pagination, limit) - } - /// Generates a random transaction identifier (block number, position in block). pub fn random_tx_location(&self) -> (BlockNumber, usize) { let from = *self.blocks.keys().next().unwrap(); diff --git a/core/tests/loadtest/src/api/mod.rs b/core/tests/loadtest/src/api/mod.rs index a8432912bc..dc27d6149b 100644 --- a/core/tests/loadtest/src/api/mod.rs +++ b/core/tests/loadtest/src/api/mod.rs @@ -25,7 +25,6 @@ use crate::{ mod data_pool; mod old_rest_api_tests; -mod rest_api_v1_tests; mod sdk_tests; // TODO: Make it configurable (ZKS-104). @@ -191,7 +190,6 @@ pub fn run(monitor: Monitor) -> (ApiTestsFuture, CancellationToken) { let mut builder = ApiTestsBuilder::new(token.clone()); builder = sdk_tests::wire_tests(builder, &monitor); builder = old_rest_api_tests::wire_tests(builder, &monitor); - builder = rest_api_v1_tests::wire_tests(builder, &monitor); let report = builder.run().await; vlog::info!("API tests finished"); diff --git a/core/tests/loadtest/src/api/rest_api_v1_tests.rs b/core/tests/loadtest/src/api/rest_api_v1_tests.rs deleted file mode 100644 index 7cf2c4bdce..0000000000 --- a/core/tests/loadtest/src/api/rest_api_v1_tests.rs +++ /dev/null @@ -1,280 +0,0 @@ -//! Tests for the relevant API methods declared in the -//! `core/bin/zksync_api/src/api_server/rest/v1` module. - -// Built-in uses -use std::str::FromStr; - -// External uses -use futures::prelude::*; -use rand::{thread_rng, Rng}; - -// Workspace uses -use zksync_api_client::rest::v1::{ - accounts::{AccountQuery, AccountReceipts}, - Client, TokenPriceKind, MAX_LIMIT, -}; -use zksync_config::test_config::TestConfig; -use zksync_types::{Address, TokenId, TokenLike}; - -// Local uses -use super::{ApiDataPool, ApiTestsBuilder}; -use crate::monitor::Monitor; - -struct RestApiTestsBuilder<'a> { - inner: ApiTestsBuilder<'a>, - monitor: &'a Monitor, - client: Client, -} - -impl<'a> RestApiTestsBuilder<'a> { - fn new(inner: ApiTestsBuilder<'a>, monitor: &'a Monitor) -> Self { - let rest_api_url = TestConfig::load().api.rest_api_url; - let client = Client::new(rest_api_url); - - Self { - inner, - monitor, - client, - } - } - - fn append(self, category: &str, factory: F) -> Self - where - F: Fn(Client, &'a Monitor) -> Fut + Send + 'a, - Fut: Future> + Send + 'a, - { - let monitor = self.monitor; - let client = self.client.clone(); - - let category = format!("rest/v1/{}", category); - let inner = self - .inner - .append(&category, move || factory(client.clone(), monitor)); - - Self { - inner, - monitor, - client: self.client, - } - } - - fn into_inner(self) -> ApiTestsBuilder<'a> { - self.inner - } -} - -fn random_token(tokens: &[TokenLike]) -> TokenLike { - let mut rng = thread_rng(); - - let index = rng.gen_range(0, tokens.len()); - tokens[index].clone() -} - -async fn random_account_query(pool: &ApiDataPool) -> AccountQuery { - let (address, account_id); - // We should only use accounts with the settled account ID. - let mut attempts: u32 = 0; - loop { - let inner = pool.read().await; - let data = inner.random_address(); - if let Some(id) = data.1.account_id { - address = data.0; - account_id = id; - break; - } - - attempts += 1; - if attempts >= MAX_LIMIT { - unreachable!( - "Unable to find the appropriate account {} attempts.", - MAX_LIMIT - ); - } - } - - if thread_rng().gen::() { - AccountQuery::Id(account_id) - } else { - AccountQuery::Address(address) - } -} - -async fn random_account_receipts_query(pool: &ApiDataPool) -> AccountReceipts { - let location = pool.read().await.random_tx_location(); - match thread_rng().gen_range(0, 3) { - 0 => AccountReceipts::older_than(location.0, Some(location.1 as u32)), - 1 => AccountReceipts::newer_than(location.0, Some(location.1 as u32)), - 2 => AccountReceipts::Latest, - _ => unreachable!(), - } -} - -pub fn wire_tests<'a>(builder: ApiTestsBuilder<'a>, monitor: &'a Monitor) -> ApiTestsBuilder<'a> { - let builder = RestApiTestsBuilder::new(builder, monitor); - - // Prebuilt token-like requests - let tokens = [ - // Ethereum. - TokenLike::Id(TokenId(0)), - TokenLike::Symbol("ETH".to_string()), - TokenLike::Address(Address::default()), - // PHNX, see rest/v1/test_utils.rs - TokenLike::Id(TokenId(1)), - TokenLike::Symbol("PHNX".to_string()), - TokenLike::Address(Address::from_str("38A2fDc11f526Ddd5a607C1F251C065f40fBF2f7").unwrap()), - ]; - - builder - // accounts endpoints. - .append("accounts/info", |client, monitor| async move { - let address = random_account_query(&monitor.api_data_pool).await; - client.account_info(address).await?; - Ok(()) - }) - .append( - "accounts/transactions/receipts", - |client, monitor| async move { - let address = random_account_query(&monitor.api_data_pool).await; - let receipts = random_account_receipts_query(&monitor.api_data_pool).await; - client - .account_tx_receipts(address, receipts, MAX_LIMIT) - .await?; - Ok(()) - }, - ) - .append( - "accounts/operations/receipts", - |client, monitor| async move { - let address = random_account_query(&monitor.api_data_pool).await; - let receipts = random_account_receipts_query(&monitor.api_data_pool).await; - client - .account_op_receipts(address, receipts, MAX_LIMIT) - .await?; - Ok(()) - }, - ) - .append( - "accounts/operations/pending_receipts", - |client, monitor| async move { - let address = random_account_query(&monitor.api_data_pool).await; - client.account_pending_ops(address).await?; - Ok(()) - }, - ) - // blocks endpoints. - .append("blocks/info", |client, monitor| async move { - let block_number = monitor.api_data_pool.read().await.random_block(); - client.block_by_id(block_number).await?; - Ok(()) - }) - .append("blocks/range", |client, monitor| async move { - let (pagination, limit) = monitor.api_data_pool.read().await.random_block_range(); - client.blocks_range(pagination, limit).await?; - Ok(()) - }) - .append("blocks/transactions", |client, monitor| async move { - let block_number = monitor.api_data_pool.read().await.random_block(); - client.block_transactions(block_number).await?; - Ok(()) - }) - // config endpoints. - .append("config/contracts", |client, _monitor| async move { - client.contracts().await?; - Ok(()) - }) - .append( - "config/deposit_confirmations", - |client, _monitor| async move { - client.deposit_confirmations().await?; - Ok(()) - }, - ) - .append("config/network", |client, _monitor| async move { - client.network().await?; - Ok(()) - }) - // operations endpoints. - .append( - "operations/receipt/by_serial_id", - |client, monitor| async move { - let op = monitor.api_data_pool.read().await.random_priority_op(); - client.priority_op(op.serial_id).await?; - Ok(()) - }, - ) - .append( - "operations/receipt/eth_hash", - |client, monitor| async move { - let op = monitor.api_data_pool.read().await.random_priority_op(); - client.priority_op(op.eth_hash).await?; - Ok(()) - }, - ) - .append( - "operations/data/by_serial_id", - |client, monitor| async move { - let op = monitor.api_data_pool.read().await.random_priority_op(); - client.priority_op_data(op.serial_id).await?; - Ok(()) - }, - ) - .append("operations/data/eth_hash", |client, monitor| async move { - let op = monitor.api_data_pool.read().await.random_priority_op(); - client.priority_op_data(op.eth_hash).await?; - Ok(()) - }) - // search endpoints. - .append("search", |client, monitor| async move { - let block_id = monitor.api_data_pool.read().await.random_block(); - client.search_block(block_id).await?; - Ok(()) - }) - // tokens endpoints. - .append("tokens/list", |client, _monitor| async move { - client.tokens().await?; - Ok(()) - }) - .append("tokens/by_id", { - let tokens = tokens.clone(); - move |client, _monitor| { - let tokens = tokens.clone(); - async move { - let token = random_token(&tokens); - client.token_by_id(&token).await?; - Ok(()) - } - } - }) - .append("tokens/price", move |client, _monitor| { - let tokens = tokens.clone(); - async move { - let token = random_token(&tokens); - client.token_price(&token, TokenPriceKind::Currency).await?; - Ok(()) - } - }) - // transactions enpoints. - .append("transactions/status", move |client, monitor| async move { - let tx_hash = monitor.api_data_pool.read().await.random_tx_hash(); - client.tx_status(tx_hash).await?; - Ok(()) - }) - .append("transactions/data", move |client, monitor| async move { - let tx_hash = monitor.api_data_pool.read().await.random_tx_hash(); - client.tx_data(tx_hash).await?; - Ok(()) - }) - .append("transactions/receipts", move |client, monitor| async move { - let tx_hash = monitor.api_data_pool.read().await.random_tx_hash(); - let range = monitor.api_data_pool.read().await.random_block_range().0; - client.tx_receipts(tx_hash, range, MAX_LIMIT).await?; - Ok(()) - }) - .append("transactions/receipt", move |client, monitor| async move { - let tx_hash = monitor.api_data_pool.read().await.random_tx_hash(); - let receipt_id = thread_rng().gen_range(0, MAX_LIMIT); - client.tx_receipt_by_id(tx_hash, receipt_id).await?; - Ok(()) - }) - .into_inner() -} diff --git a/core/tests/testkit/src/state_keeper_utils.rs b/core/tests/testkit/src/state_keeper_utils.rs index 66baafa980..62c6177409 100644 --- a/core/tests/testkit/src/state_keeper_utils.rs +++ b/core/tests/testkit/src/state_keeper_utils.rs @@ -63,7 +63,6 @@ pub fn spawn_state_keeper( block_chunks_sizes, max_miniblock_iterations, max_miniblock_iterations, - None, ); let (stop_state_keeper_sender, stop_state_keeper_receiver) = oneshot::channel::<()>(); diff --git a/core/tests/testkit/src/test_setup.rs b/core/tests/testkit/src/test_setup.rs index 2af980cb41..dfd998ba11 100644 --- a/core/tests/testkit/src/test_setup.rs +++ b/core/tests/testkit/src/test_setup.rs @@ -164,6 +164,8 @@ impl TestSetup { (receipts, deposit_op) } + #[allow(clippy::map_entry)] + // Due to await function map entry looks really ugly pub async fn setup_basic_l1_balances(&mut self, eth_account_id: ETHAccountId, token: Token) { if !self .expected_changes_for_current_block diff --git a/core/tests/ts-tests/tests/api.test.ts b/core/tests/ts-tests/tests/api.test.ts index e0f4f78931..ceffeb79ec 100644 --- a/core/tests/ts-tests/tests/api.test.ts +++ b/core/tests/ts-tests/tests/api.test.ts @@ -1,19 +1,20 @@ -import { Wallet } from 'zksync'; +import { Wallet, RestProvider, getDefaultRestProvider, types } from 'zksync'; import { Tester } from './tester'; import './priority-ops'; import './change-pub-key'; import './transfer'; import './withdraw'; import './forced-exit'; +import { expect } from 'chai'; import * as api from './api'; -describe('ZkSync REST API tests', () => { +describe('ZkSync REST API V0.1 tests', () => { let tester: Tester; let alice: Wallet; before('create tester and test wallets', async () => { - tester = await Tester.init('localhost', 'HTTP'); + tester = await Tester.init('localhost', 'HTTP', 'RPC'); alice = await tester.fundedWallet('1.0'); let bob = await tester.emptyWallet(); for (const token of ['ETH', 'DAI']) { @@ -62,3 +63,142 @@ describe('ZkSync REST API tests', () => { } }); }); + +describe('ZkSync REST API V0.2 tests', () => { + let tester: Tester; + let alice: Wallet; + let bob: Wallet; + let provider: RestProvider; + let lastTxHash: string; + let lastTxReceipt: types.TransactionReceipt; + + before('create tester and test wallets', async () => { + provider = await getDefaultRestProvider('localhost'); + tester = await Tester.init('localhost', 'HTTP', 'REST'); + alice = await tester.fundedWallet('1.0'); + bob = await tester.emptyWallet(); + for (const token of ['ETH']) { + const thousand = tester.syncProvider.tokenSet.parseToken(token, '1000'); + await tester.testDeposit(alice, token, thousand, true); + await tester.testChangePubKey(alice, token, false); + await tester.testTransfer(alice, bob, token, thousand.div(4)); + } + + const handle = await alice.syncTransfer({ + to: bob.address(), + token: 'ETH', + amount: alice.provider.tokenSet.parseToken('ETH', '1') + }); + lastTxHash = handle.txHash; + lastTxHash.replace('sync-tx:', '0x'); + lastTxReceipt = await handle.awaitReceipt(); + }); + + it('should check api v0.2 account scope', async () => { + const committedState = await provider.accountInfo(alice.address(), 'committed'); + const finalizedState = await provider.accountInfo(alice.address(), 'finalized'); + const fullState = await provider.accountFullInfo(alice.address()); + expect(fullState.committed, 'committed state differs').to.eql(committedState); + expect(fullState.finalized, 'finalized state differs').to.eql(finalizedState); + + const txs = await provider.accountTxs(alice.accountId!, { + from: lastTxHash, + limit: 10, + direction: 'older' + }); + const expected = 4; + expect( + txs.list.length, + `Endpoint returned incorrect number of transactions: ${txs.list.length}, expected ${expected}` + ).to.eql(expected); + expect(txs.list[0].txHash, 'Endpoint did not return first tx correctly').to.be.eql(lastTxHash); + + const accTxs = await provider.accountPendingTxs(alice.accountId!, { + from: 1, + limit: 10, + direction: 'newer' + }); + expect(accTxs).to.exist; + }); + + it('should check api v0.2 block scope', async () => { + const lastCommittedBlock = await provider.blockByPosition('lastCommitted'); + expect(lastCommittedBlock).to.exist; + + const expectedBlocks = 3; + const blocks = await provider.blockPagination({ + from: lastCommittedBlock.blockNumber, + limit: 3, + direction: 'older' + }); + expect( + blocks.list.length, + `Endpoint returned incorrect number of blocks: ${blocks.list.length}, expected ${expectedBlocks}` + ).to.eql(expectedBlocks); + + const expectedTxs = 1; + const blockTxs = await provider.blockTransactions(lastTxReceipt.block!.blockNumber, { + from: lastTxHash, + limit: 10, + direction: 'newer' + }); + expect( + blockTxs.list.length, + `Endpoint returned incorrect number of transactions: ${blockTxs.list.length}, expected ${expectedTxs}` + ).to.eql(expectedTxs); + }); + + it('should check api v0.2 config endpoint', async () => { + const config = await provider.config(); + expect(config.network === 'localhost').to.be.true; + }); + + it('should check api v0.2 fee scope', async () => { + const fee = await provider.getTransactionFee('Withdraw', alice.address(), 'ETH'); + expect(fee).to.exist; + const batchFee = await provider.getBatchFullFee( + [ + { txType: 'Transfer', address: alice.address() }, + { txType: 'Withdraw', address: alice.address() } + ], + 'ETH' + ); + expect(batchFee).to.exist; + }); + + it('should check api v0.2 network status endpoint', async () => { + const networkStatus = await provider.networkStatus(); + expect(networkStatus).to.exist; + }); + + it('should check api v0.2 token scope', async () => { + const tokens = await provider.tokenPagination({ + from: 0, + limit: 2, + direction: 'newer' + }); + expect(tokens.list.length).to.be.eql(2); + const firstToken = await provider.tokenByIdOrAddress('0x'.padEnd(42, '0')); + const secondToken = await provider.tokenByIdOrAddress(1); + expect(tokens.list[0]).to.be.eql(firstToken); + expect(tokens.list[1]).to.be.eql(secondToken); + }); + + it('should check api v0.2 transaction scope', async () => { + const apiReceipt = await provider.txStatus(lastTxHash); + expect(apiReceipt!.rollupBlock).to.exist; + + const txData = await provider.txData(lastTxHash); + expect(txData!.tx.op.type).to.eql('Transfer'); + + const batch = await alice + .batchBuilder() + .addTransfer({ to: bob.address(), token: 'ETH', amount: alice.provider.tokenSet.parseToken('ETH', '1') }) + .addTransfer({ to: bob.address(), token: 'ETH', amount: alice.provider.tokenSet.parseToken('ETH', '1') }) + .build('ETH'); + const submitBatchResponse = await provider.submitTxsBatchNew(batch.txs, [batch.signature]); + await provider.notifyAnyTransaction(submitBatchResponse.transactionHashes[0], 'COMMIT'); + const batchInfo = await provider.getBatch(submitBatchResponse.batchHash); + expect(batchInfo.batchHash).to.eql(submitBatchResponse.batchHash); + }); +}); diff --git a/core/tests/ts-tests/tests/change-pub-key.ts b/core/tests/ts-tests/tests/change-pub-key.ts index 9c2a15c074..2c6dff9ab2 100644 --- a/core/tests/ts-tests/tests/change-pub-key.ts +++ b/core/tests/ts-tests/tests/change-pub-key.ts @@ -34,5 +34,9 @@ Tester.prototype.testChangePubKey = async function (wallet: Wallet, feeToken: To const receipt = await changePubkeyHandle.awaitReceipt(); expect(receipt.success, `ChangePubKey transaction failed with a reason: ${receipt.failReason}`).to.be.true; expect(await wallet.isSigningKeySet(), 'ChangePubKey failed').to.be.true; + + const accountState = await wallet.getAccountState(); + expect(accountState.accountType, 'Incorrect account type').to.be.eql('Owned'); + this.runningFee = this.runningFee.add(fee); }; diff --git a/core/tests/ts-tests/tests/main.test.ts b/core/tests/ts-tests/tests/main.test.ts index dea2c98e7c..dd52e10476 100644 --- a/core/tests/ts-tests/tests/main.test.ts +++ b/core/tests/ts-tests/tests/main.test.ts @@ -22,8 +22,8 @@ const DEPOSIT_AMOUNT = TX_AMOUNT.mul(200); // prettier-ignore /// We don't want to run tests with all tokens, so we highlight basic operations such as: Deposit, Withdrawal, Forced Exit /// We want to check basic operations with all tokens, and other operations only if it's necessary -const TestSuite = (token: types.TokenSymbol, transport: 'HTTP' | 'WS', onlyBasic: boolean = false) => -describe(`ZkSync integration tests (token: ${token}, transport: ${transport})`, () => { +const TestSuite = (token: types.TokenSymbol, transport: 'HTTP' | 'WS', providerType: 'REST' | 'RPC', onlyBasic: boolean = false) => +describe(`ZkSync integration tests (token: ${token}, transport: ${transport}, provider: ${providerType})`, () => { let tester: Tester; let alice: Wallet; let bob: Wallet; @@ -36,7 +36,7 @@ describe(`ZkSync integration tests (token: ${token}, transport: ${transport})`, let nft: types.NFT; before('create tester and test wallets', async () => { - tester = await Tester.init('localhost', transport); + tester = await Tester.init('localhost', transport, providerType); alice = await tester.fundedWallet('5.0'); bob = await tester.emptyWallet(); chuck = await tester.emptyWallet(); @@ -89,7 +89,7 @@ describe(`ZkSync integration tests (token: ${token}, transport: ${transport})`, }); step('should execute a mintNFT', async () => { - nft = await tester.testMintNFT(alice, chuck, token); + nft = await tester.testMintNFT(alice, chuck, token); }); step('should execute a getNFT', async () => { if (onlyBasic) { @@ -119,8 +119,8 @@ describe(`ZkSync integration tests (token: ${token}, transport: ${transport})`, step('should test multi-transfers', async () => { await tester.testBatch(alice, bob, token, TX_AMOUNT); await tester.testIgnoredBatch(alice, bob, token, TX_AMOUNT); - await tester.testRejectedBatch(alice, bob, token, TX_AMOUNT); - await tester.testInvalidFeeBatch(alice, bob, token, TX_AMOUNT); + await tester.testRejectedBatch(alice, bob, token, TX_AMOUNT, providerType); + await tester.testInvalidFeeBatch(alice, bob, token, TX_AMOUNT, providerType); }); step('should test batch-builder', async () => { @@ -167,7 +167,7 @@ describe(`ZkSync integration tests (token: ${token}, transport: ${transport})`, step('should test multi-signers', async () => { // At this point, all these wallets already have their public keys set. await tester.testMultipleBatchSigners([alice, david, frank], token, TX_AMOUNT); - await tester.testMultipleWalletsWrongSignature(alice, david, token, TX_AMOUNT); + await tester.testMultipleWalletsWrongSignature(alice, david, token, TX_AMOUNT, providerType); }); step('should test backwards compatibility', async () => { @@ -209,7 +209,7 @@ describe(`ZkSync integration tests (token: ${token}, transport: ${transport})`, if (onlyBasic) { return; } - await tester.testWrongSignature(alice, bob, token, TX_AMOUNT); + await tester.testWrongSignature(alice, bob, token, TX_AMOUNT, providerType); }); describe('Full Exit tests', () => { @@ -284,6 +284,8 @@ describe(`ZkSync integration tests (token: ${token}, transport: ${transport})`, ethAuthType: 'CREATE2' }); await cpk.awaitReceipt(); + const accountState = await hilda.getAccountState(); + expect(accountState.accountType, 'Incorrect account type').to.be.eql('CREATE2'); }); step('should make transfers from create2 account', async () => { @@ -316,8 +318,10 @@ describe(`ZkSync integration tests (token: ${token}, transport: ${transport})`, } // here we have a signle eth signature for the whole batch await tester.testCreate2SignedBatchFail(hilda, david, token, TX_AMOUNT); - // here the only each individual transaction is signed - await tester.testCreate2BatchFail(hilda, david, token, TX_AMOUNT); + if(providerType === 'RPC') { + // REST provider always expects Ethereum signed message for the whole batch, skip this test. + await tester.testCreate2BatchFail(hilda, david, token, TX_AMOUNT); + } }); }); }); @@ -325,6 +329,7 @@ describe(`ZkSync integration tests (token: ${token}, transport: ${transport})`, // wBTC is chosen because it has decimals different from ETH (8 instead of 18). // Using this token will help us to detect decimals-related errors. const defaultERC20 = 'wBTC'; +const defaultProviderType = 'REST'; let tokenAndTransport = []; if (process.env.TEST_TRANSPORT) { @@ -335,7 +340,8 @@ if (process.env.TEST_TRANSPORT) { tokenAndTransport = [ { transport: envTransport, - token: envToken + token: envToken, + providerType: process.env.TEST_PROVIDER ? process.env.TEST_PROVIDER : defaultProviderType } ]; } else { @@ -344,7 +350,8 @@ if (process.env.TEST_TRANSPORT) { tokenAndTransport = [ { transport: envTransport, - token: defaultERC20 + token: defaultERC20, + providerType: process.env.TEST_PROVIDER ? process.env.TEST_PROVIDER : defaultProviderType } ]; } @@ -354,11 +361,25 @@ if (process.env.TEST_TRANSPORT) { { transport: 'HTTP', token: 'ETH', + providerType: 'RPC', + onlyBasic: true + }, + { + transport: 'HTTP', + token: defaultERC20, + providerType: 'RPC', + onlyBasic: false + }, + { + transport: 'HTTP', + token: 'ETH', + providerType: 'REST', onlyBasic: true }, { transport: 'HTTP', token: defaultERC20, + providerType: 'REST', onlyBasic: false } ]; @@ -366,5 +387,5 @@ if (process.env.TEST_TRANSPORT) { for (const input of tokenAndTransport) { // @ts-ignore - TestSuite(input.token, input.transport, input.onlyBasic); + TestSuite(input.token, input.transport, input.providerType, input.onlyBasic); } diff --git a/core/tests/ts-tests/tests/misc.ts b/core/tests/ts-tests/tests/misc.ts index 488265c2de..3f8a63ec7c 100644 --- a/core/tests/ts-tests/tests/misc.ts +++ b/core/tests/ts-tests/tests/misc.ts @@ -21,14 +21,32 @@ type TokenLike = types.TokenLike; declare module './tester' { interface Tester { - testWrongSignature(from: Wallet, to: Wallet, token: TokenLike, amount: BigNumber): Promise; + testWrongSignature( + from: Wallet, + to: Wallet, + token: TokenLike, + amount: BigNumber, + providerType: 'REST' | 'RPC' + ): Promise; testMultipleBatchSigners(wallets: Wallet[], token: TokenLike, amount: BigNumber): Promise; - testMultipleWalletsWrongSignature(from: Wallet, to: Wallet, token: TokenLike, amount: BigNumber): Promise; + testMultipleWalletsWrongSignature( + from: Wallet, + to: Wallet, + token: TokenLike, + amount: BigNumber, + providerType: 'REST' | 'RPC' + ): Promise; testBackwardCompatibleEthMessages(from: Wallet, to: Wallet, token: TokenLike, amount: BigNumber): Promise; } } -Tester.prototype.testWrongSignature = async function (from: Wallet, to: Wallet, token: TokenLike, amount: BigNumber) { +Tester.prototype.testWrongSignature = async function ( + from: Wallet, + to: Wallet, + token: TokenLike, + amount: BigNumber, + providerType: 'REST' | 'RPC' +) { const signedTransfer = await from.signSyncTransfer({ to: to.address(), token: token, @@ -48,7 +66,11 @@ Tester.prototype.testWrongSignature = async function (from: Wallet, to: Wallet, await from.provider.submitTx(signedTransfer.tx, fakeEthSignature); thrown = false; // this line should be unreachable } catch (e) { - expect(e.jrpcError.message).to.equal('Eth signature is incorrect'); + if (providerType === 'REST') { + expect(e.restError.message).to.equal('Transaction adding error: Eth signature is incorrect.'); + } else { + expect(e.jrpcError.message).to.equal('Eth signature is incorrect'); + } } expect(thrown, 'Sending tx with incorrect ETH signature must throw').to.be.true; @@ -66,7 +88,11 @@ Tester.prototype.testWrongSignature = async function (from: Wallet, to: Wallet, await from.provider.submitTx(signedWithdraw.tx, fakeEthSignature); thrown = false; // this line should be unreachable } catch (e) { - expect(e.jrpcError.message).to.equal('Eth signature is incorrect'); + if (providerType === 'REST') { + expect(e.restError.message).to.equal('Transaction adding error: Eth signature is incorrect.'); + } else { + expect(e.jrpcError.message).to.equal('Eth signature is incorrect'); + } } expect(thrown, 'Sending tx with incorrect ETH signature must throw').to.be.true; }; @@ -128,7 +154,8 @@ Tester.prototype.testMultipleWalletsWrongSignature = async function ( from: Wallet, to: Wallet, token: TokenLike, - amount: BigNumber + amount: BigNumber, + providerType: 'REST' | 'RPC' ) { const fee = await this.syncProvider.getTransactionsBatchFee( ['Transfer', 'Transfer'], @@ -168,7 +195,11 @@ Tester.prototype.testMultipleWalletsWrongSignature = async function ( await submitSignedTransactionsBatch(from.provider, batch, [ethSignature]); thrown = false; // this line should be unreachable } catch (e) { - expect(e.jrpcError.message).to.equal('Eth signature is incorrect'); + if (providerType === 'REST') { + expect(e.restError.message).to.equal('Transaction adding error: Eth signature is incorrect.'); + } else { + expect(e.jrpcError.message).to.equal('Eth signature is incorrect'); + } } expect(thrown, 'Sending batch with incorrect ETH signature must throw').to.be.true; }; diff --git a/core/tests/ts-tests/tests/tester.ts b/core/tests/ts-tests/tests/tester.ts index 9c96387c0a..8a72b2560a 100644 --- a/core/tests/ts-tests/tests/tester.ts +++ b/core/tests/ts-tests/tests/tester.ts @@ -28,7 +28,7 @@ export class Tester { constructor( public network: Network, public ethProvider: ethers.providers.Provider, - public syncProvider: zksync.Provider, + public syncProvider: zksync.SyncProvider, public ethWallet: ethers.Wallet, public syncWallet: zksync.Wallet ) { @@ -37,7 +37,10 @@ export class Tester { } // prettier-ignore - static async init(network: Network, transport: 'WS' | 'HTTP') { + static async init(network: Network, transport: 'WS' | 'HTTP', providerType: 'REST' | 'RPC') { + if(transport === 'WS' && providerType === 'REST') { + throw new Error('REST provider supports only HTTP transport'); + } // @ts-ignore let web3Url = process.env.ETH_CLIENT_WEB3_URL.split(",")[0]; const ethProvider = network == 'localhost' @@ -46,7 +49,9 @@ export class Tester { if (network == 'localhost') { ethProvider.pollingInterval = 100; } - const syncProvider = await zksync.getDefaultProvider(network, transport); + const syncProvider = providerType === 'REST' + ? await zksync.getDefaultRestProvider(network) + : await zksync.getDefaultProvider(network, transport); const ethWallet = ethers.Wallet.fromMnemonic( ethTestConfig.test_mnemonic as string, "m/44'/60'/0'/0/0" diff --git a/core/tests/ts-tests/tests/transfer.ts b/core/tests/ts-tests/tests/transfer.ts index 214b253dc9..c111aff6e2 100644 --- a/core/tests/ts-tests/tests/transfer.ts +++ b/core/tests/ts-tests/tests/transfer.ts @@ -12,8 +12,20 @@ declare module './tester' { testTransferNFT(from: Wallet, to: Wallet, feeToken: TokenLike): Promise; testBatch(from: Wallet, to: Wallet, token: TokenLike, amount: BigNumber): Promise; testIgnoredBatch(from: Wallet, to: Wallet, token: TokenLike, amount: BigNumber): Promise; - testRejectedBatch(from: Wallet, to: Wallet, token: TokenLike, amount: BigNumber): Promise; - testInvalidFeeBatch(from: Wallet, to: Wallet, token: TokenLike, amount: BigNumber): Promise; + testRejectedBatch( + from: Wallet, + to: Wallet, + token: TokenLike, + amount: BigNumber, + providerType: 'REST' | 'RPC' + ): Promise; + testInvalidFeeBatch( + from: Wallet, + to: Wallet, + token: TokenLike, + amount: BigNumber, + providerType: 'REST' | 'RPC' + ): Promise; } } @@ -152,7 +164,8 @@ Tester.prototype.testRejectedBatch = async function ( sender: Wallet, receiver: Wallet, token: types.TokenLike, - amount: BigNumber + amount: BigNumber, + providerType: 'REST' | 'RPC' ) { const tx = { to: receiver.address(), @@ -169,7 +182,13 @@ Tester.prototype.testRejectedBatch = async function ( } thrown = false; // this line should be unreachable } catch (e) { - expect(e.jrpcError.message).to.equal('Transactions batch summary fee is too low'); + if (providerType === 'REST') { + expect(e.restError.message).to.equal( + 'Transaction adding error: Transactions batch summary fee is too low.' + ); + } else { + expect(e.jrpcError.message).to.equal('Transactions batch summary fee is too low'); + } } expect(thrown, 'Batch should have failed').to.be.true; }; @@ -180,7 +199,8 @@ Tester.prototype.testInvalidFeeBatch = async function ( sender: Wallet, receiver: Wallet, token: types.TokenLike, - amount: BigNumber + amount: BigNumber, + providerType: 'REST' | 'RPC' ) { // Ignore the second transfer. const fee = await this.syncProvider.getTransactionsBatchFee(['Transfer'], [receiver.address()], token); @@ -212,7 +232,13 @@ Tester.prototype.testInvalidFeeBatch = async function ( } thrown = false; // this line should be unreachable } catch (e) { - expect(e.jrpcError.message).to.equal('Transactions batch summary fee is too low'); + if (providerType === 'REST') { + expect(e.restError.message).to.equal( + 'Transaction adding error: Transactions batch summary fee is too low.' + ); + } else { + expect(e.jrpcError.message).to.equal('Transactions batch summary fee is too low'); + } } expect(thrown, 'Batch should have failed').to.be.true; }; diff --git a/core/tests/ts-tests/tests/withdrawal-helpers.test.ts b/core/tests/ts-tests/tests/withdrawal-helpers.test.ts index d54a6c62c6..51c22dcfd4 100644 --- a/core/tests/ts-tests/tests/withdrawal-helpers.test.ts +++ b/core/tests/ts-tests/tests/withdrawal-helpers.test.ts @@ -16,14 +16,16 @@ const TEST_CONFIG = loadTestConfig(true); // The token here should have the ERC20 implementation from RevertTransferERC20.sol const erc20Token = 'wBTC'; -describe('Withdrawal helpers tests', () => { +// prettier-ignore +const TestSuite = (providerType: 'REST' | 'RPC') => +describe(`Withdrawal helpers tests (provider: ${providerType})`, () => { let tester: Tester; let alice: Wallet; let bob: Wallet; let chuck: Wallet; before('create tester and test wallets', async () => { - tester = await Tester.init('localhost', 'HTTP'); + tester = await Tester.init('localhost', 'HTTP', providerType); alice = await tester.fundedWallet('10.0'); bob = await tester.fundedWallet('10.0'); chuck = await tester.emptyWallet(); @@ -76,3 +78,8 @@ describe('Withdrawal helpers tests', () => { ); }); }); + +for (const providerType of ['RPC', 'REST']) { + // @ts-ignore + TestSuite(providerType); +} diff --git a/core/tests/ts-tests/tests/withdrawal-helpers.ts b/core/tests/ts-tests/tests/withdrawal-helpers.ts index e4bcfe13d5..2117d09455 100644 --- a/core/tests/ts-tests/tests/withdrawal-helpers.ts +++ b/core/tests/ts-tests/tests/withdrawal-helpers.ts @@ -1,6 +1,6 @@ import { Tester } from './tester'; import { expect } from 'chai'; -import { Wallet, types, Provider, utils } from 'zksync'; +import { Wallet, types, utils, SyncProvider } from 'zksync'; import { BigNumber, ethers } from 'ethers'; import { Address } from 'zksync/build/types'; import { sleep } from 'zksync/build/utils'; @@ -26,7 +26,7 @@ declare module './tester' { } async function waitForOnchainWithdrawal( - syncProvider: Provider, + syncProvider: SyncProvider, hash: string, polling_interval: number = 200, polling_timeout: number = 35000 @@ -60,7 +60,7 @@ async function setRevertTransfer(ethWallet: ethers.Signer, tokenAddress: Address async function setRevert( ethWallet: ethers.Signer, - provider: Provider, + provider: SyncProvider, recipient: Address, token: TokenLike, value: boolean diff --git a/docker-compose-runner.yml b/docker-compose-runner.yml index 513cbf65f6..eb7c0513ff 100644 --- a/docker-compose-runner.yml +++ b/docker-compose-runner.yml @@ -12,6 +12,8 @@ services: dev-ticker: image: "matterlabs/dev-ticker:latest" + volumes: + - ./etc/tokens/:/etc/tokens dev-liquidity-token-watcher: image: "matterlabs/dev-liquidity-token-watcher:latest" diff --git a/docker-compose.yml b/docker-compose.yml index 96b2a4662a..e560a21a04 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -32,6 +32,8 @@ services: image: "matterlabs/dev-ticker:latest" ports: - "9876:9876" + volumes: + - ./etc/tokens/:/etc/tokens tesseracts: image: "adria0/tesseracts" command: --cfg /tesseracts.toml -vvv diff --git a/docker/data-restore/Dockerfile b/docker/data-restore/Dockerfile index 291e35a255..3d9c7101f2 100644 --- a/docker/data-restore/Dockerfile +++ b/docker/data-restore/Dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.52 +FROM rust:1.53 WORKDIR /usr/src/zksync diff --git a/docker/dev-liquidity-token-watcher/Dockerfile b/docker/dev-liquidity-token-watcher/Dockerfile index 41104241bf..526dccf454 100644 --- a/docker/dev-liquidity-token-watcher/Dockerfile +++ b/docker/dev-liquidity-token-watcher/Dockerfile @@ -1,5 +1,5 @@ # syntax=docker/dockerfile:experimental -FROM rust:1.48 as builder +FROM rust:1.53 as builder RUN --mount=type=cache,target=/usr/local/cargo/registry \ cargo install sccache WORKDIR /usr/src/zksync diff --git a/docker/dev-ticker/Dockerfile b/docker/dev-ticker/Dockerfile index da146d226a..1a8fc06ccb 100644 --- a/docker/dev-ticker/Dockerfile +++ b/docker/dev-ticker/Dockerfile @@ -1,5 +1,5 @@ # syntax=docker/dockerfile:experimental -FROM rust:1.48 as builder +FROM rust:1.53 as builder RUN --mount=type=cache,target=/usr/local/cargo/registry \ cargo install sccache WORKDIR /usr/src/zksync @@ -15,4 +15,5 @@ RUN apt install openssl -y EXPOSE 9876 ENV RUST_LOG info COPY --from=builder /usr/src/zksync/target/release/dev-ticker-server /bin/ +COPY --from=builder /usr/src/zksync/etc/tokens /etc/tokens ENTRYPOINT ["dev-ticker-server"] diff --git a/docker/event-listener/Dockerfile b/docker/event-listener/Dockerfile index 94d942390f..6d36c54423 100644 --- a/docker/event-listener/Dockerfile +++ b/docker/event-listener/Dockerfile @@ -1,5 +1,5 @@ # syntax=docker/dockerfile:experimental -FROM rust:1.51 as builder +FROM rust:1.53 as builder RUN --mount=type=cache,target=/usr/local/cargo/registry \ cargo install sccache WORKDIR /usr/src/zksync diff --git a/docker/prover/Dockerfile b/docker/prover/Dockerfile index 4e358f66fa..09f7508b39 100644 --- a/docker/prover/Dockerfile +++ b/docker/prover/Dockerfile @@ -1,5 +1,5 @@ # syntax=docker/dockerfile:experimental -FROM rust:1.51 as builder +FROM rust:1.53 as builder WORKDIR /usr/src/zksync COPY . . RUN --mount=type=cache,target=/usr/local/cargo/registry \ diff --git a/docker/server/Dockerfile b/docker/server/Dockerfile index 41519be72f..f513c0f3ab 100644 --- a/docker/server/Dockerfile +++ b/docker/server/Dockerfile @@ -1,5 +1,5 @@ # syntax=docker/dockerfile:experimental -FROM rust:1.51 as builder +FROM rust:1.53 as builder WORKDIR /usr/src/zksync COPY . . RUN --mount=type=cache,target=/usr/local/cargo/registry \ diff --git a/docker/zk-environment/Dockerfile b/docker/zk-environment/Dockerfile index d23100a6ed..fc55fd95e7 100644 --- a/docker/zk-environment/Dockerfile +++ b/docker/zk-environment/Dockerfile @@ -10,13 +10,17 @@ RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - RUN apt-get install -y nodejs RUN npm install -g yarn +# Install required node packages +RUN yarn global add aglio +RUN yarn global add dredd + # Install Rust and required cargo packages ENV RUSTUP_HOME=/usr/local/rustup \ CARGO_HOME=/usr/local/cargo \ PATH=/usr/local/cargo/bin:$PATH RUN curl https://sh.rustup.rs -sSf | bash -s -- -y RUN cargo install diesel_cli --no-default-features --features postgres -RUN cargo install --version=0.2.0 sqlx-cli +RUN cargo install --version=0.5.2 sqlx-cli # Install `solc` RUN curl -LO https://github.com/ethereum/solidity/releases/download/v0.5.16/solc-static-linux diff --git a/docs/protocol.md b/docs/protocol.md index f5e97a671c..faff5601f6 100644 --- a/docs/protocol.md +++ b/docs/protocol.md @@ -11,16 +11,21 @@ - [Data format](#data-format) - [Data types](#data-types) - [Amount packing](#amount-packing) - - [State Merkle Tree (SMT)](#state-merkle-tree) + - [State Merkle Tree](#state-merkle-tree) - [zkSync block pub data format](#zksync-block-pub-data-format) - [zkSync operations](#zksync-operations) + - [0. Rollup operation lifecycle](#0-rollup-operation-lifecycle) - [1. Noop operation](#1-noop-operation) - [2. Transfer](#2-transfer) - [3. Transfer to new](#3-transfer-to-new) - [4. Withdraw (Partial Exit)](#4-withdraw-partial-exit) - - [5. Deposit](#5-deposit) - - [7. Change pubkey](#7-change-pubkey) - - [8. Forced exit](#8-forced-exit) + - [5. Withdraw NFT](#5-withdraw-nft) + - [6. Mint NFT](#6-mint-nft) + - [7. Deposit](#7-deposit) + - [8. Full exit](#8-full-exit) + - [9. Change pubkey](#9-change-pubkey) + - [10. Forced exit](#10-forced-exit) + - [11. Swap](#11-swap) - [Smart contracts API](#smart-contracts-api) - [Rollup contract](#rollup-contract) - [Deposit Ether](#deposit-ether) @@ -40,13 +45,10 @@ - [Check that token address is valid](#check-that-token-address-is-valid) - [Block state transition circuit](#block-state-transition-circuit) - [Appendix I: Cryptographic primitives](#appendix-i-cryptographic-primitives) - - [Transaction signature](#transaction-signature) - [Rescue hash](#rescue-hash) + - [Bitpacking](#bitpacking) + - [Transaction signature](#transaction-signature) - [SHA256](#sha256) - - [Sparse Merkle Tree](#sparse-merkle-tree) - -Table of contents generated with -markdown-toc ## Glossary @@ -220,6 +222,9 @@ Rollup transactions: - Withdraw (Partial exit) - Change pubkey - Forced Exit +- MintNFT +- WithdrawNFT +- Swap Priority operations: @@ -236,7 +241,7 @@ Legend: - Onchain operation: what the operator can put into the rollup block pubdata (operation pubdata). - Node implementation: node model that describes an operation. - Circuit implementation: circuit model that describes the operation and its witness. -- Chunk: the dimension of the operation. Each chunk has its own part of the public data (9 bytes) given through +- Chunk: the dimension of the operation. Each chunk has its own part of the public data (10 bytes) given through witnesses. - Significant bytes: how many bytes, of all bytes occupied by the operation, are significant (including operation number). @@ -283,7 +288,8 @@ Account.address -> EthAddress # Address of the account Account.pubkey_hash -> RollupPubkeyHash # Hash of the public key set for the account # Constants -MAX_TOKENS = 2**16 # maximum number of tokens in the Rollup(including "ETH" token) +MAX_TOKENS = 2**32 # maximum number of tokens in the Rollup(including "ETH" token) +MAX_FUNGIBLE_TOKENS = 2**16 # maximum number of fungible tokens in the Rollup(including "ETH" token) MAX_NONCE = 2**32 # max possible nonce ``` @@ -333,7 +339,7 @@ Transfers funds between Rollup accounts. | Chunks | Significant bytes | | ------ | ----------------- | -| 2 | 18 | +| 2 | 20 | ##### Structure @@ -341,7 +347,7 @@ Transfers funds between Rollup accounts. | ------------- | -------- | -------------- | ----------------------------------------------------------------------------------- | | opcode | 1 | `0x05` | Operation code | | from_account | 4 | AccountId | Unique identifier of the rollup account from which funds will be withdrawn (sender) | -| token | 2 | TokenId | Unique token identifier in the rollup | +| token | 4 | TokenId | Unique token identifier in the rollup | | to_account | 4 | AccountId | Unique identifier of the rollup account that will receive the funds (recipient) | | packed_amount | 5 | PackedTxAmount | Packed amount of funds sent | | packed_fee | 2 | PackedFee | Packed amount of fee paid | @@ -349,7 +355,7 @@ Transfers funds between Rollup accounts. ##### Example ``` -05000000040002000000030000001ad30012 +050000000400000002000000030000001ad30012 ``` Reads as: transfer from account #4 token #2 to account #3 amount in packed representation 0x0000001ad3 for fee in packed @@ -359,17 +365,19 @@ representation 0x0012. ##### Structure -| Field | Value/type | Description | -| ---------- | -------------- | -------------------------------------------------------------------------------- | -| type | `0x05` | Operation code | -| account_id | AccountId | Unique id of the sender rollup account in the state tree | -| from | ETHAddress | Unique address of the rollup account from which funds will be withdrawn (sender) | -| to | ETHAddress | Unique address of the rollup account that will receive the funds (recipient) | -| token | TokenId | Unique token identifier in the rollup | -| amount | PackedTxAmount | Amount of funds sent | -| fee | PackedFee | Amount of fee paid | -| nonce | Nonce | A one-time code that specifies the order of transactions | -| signature | Signanture | [Signature](#transaction-singature) of previous fields, see the spec below | +| Field | Value/type | Description | +| ----------- | -------------- | -------------------------------------------------------------------------------- | +| type | `0xfa` | Operation code | +| account_id | AccountId | Unique id of the sender rollup account in the state tree | +| from | ETHAddress | Unique address of the rollup account from which funds will be withdrawn (sender) | +| to | ETHAddress | Unique address of the rollup account that will receive the funds (recipient) | +| token | TokenId | Unique token identifier in the rollup | +| amount | PackedTxAmount | Amount of funds sent | +| fee | PackedFee | Amount of fee paid | +| nonce | Nonce | A one-time code that specifies the order of transactions | +| valid_from | Timestamp | Unix timestamp from which the block with this transaction can be processed | +| valid_until | Timestamp | Unix timestamp until which the block with this transaction can be processed | +| signature | Signature | [Signature](#transaction-singature) of previous fields, see the spec below | ##### Example @@ -378,16 +386,19 @@ the spec below). ```json { + "type": "Transfer", "accountId": 2061, "from": "0x1f04204dba8e9e8bf90f5889fe4bdc0f37265dbb", "to": "0x05e3066450dfcd4ee9ca4f2039d58883631f0460", - "token": 60896, + "token": 1023, "amount": "12340000000000", "fee": "56700000000", "nonce": 784793056, + "validFrom": 0, + "validUntil": 18446744073709551615, "signature": { "pubKey": "0e1390d3e86881117979db2b37e40eaf46b6f8f38d2509ff3ecfaf229c717b9d", - "signature": "355b60e9fa06bb4755fde52001f32558f221aa8bbe974882abb5db2996ecb487086bcf51dbc3b8693dbad74f393278cce63d58e79e0a629e7cbb61c4aff7fb04" + "signature": "817c866e71a0b3e6d412ac56524557d368c11332db93554693787e89c9813310adeda68314fc833a4f73323eca00e2cc774e78db88921dc230db7dae691fe500" } } ``` @@ -395,20 +406,22 @@ the spec below). Signed transaction representation. ``` -Signed using: +Signer: Private key: Fs(0x057afe7e950189b17eedfd749f5537a88eb3ed4981467636a115e5c3efcce0f4) Public key: x: Fr(0x0e63e65569365f7d2db43642f9cb15781120364f5e993cd6822cbab3f86be4d3), y: Fr(0x1d7b719c22afcf3eff09258df3f8b646af0ee4372bdb7979118168e8d390130e) -type: 0x05 +Signed transaction fields: +type: 0xfa +version: 0x01 accountId: 0x0000080d from: 0x1f04204dba8e9e8bf90f5889fe4bdc0f37265dbb to: 0x05e3066450dfcd4ee9ca4f2039d58883631f0460 -token: 0xede0 +token: 0x000003ff amount: 0x5bf0aea003 fee: 0x46e8 nonce: 0x2ec6fde0 - -Signed bytes: 0x050000080d1f04204dba8e9e8bf90f5889fe4bdc0f37265dbb05e3066450dfcd4ee9ca4f2039d58883631f0460ede05bf0aea00346e82ec6fde0 +time_range: 0x0000000000000000ffffffffffffffff +Signed bytes: 0xfa010000080d1f04204dba8e9e8bf90f5889fe4bdc0f37265dbb05e3066450dfcd4ee9ca4f2039d58883631f0460000003ff5bf0aea00346e82ec6fde00000000000000000ffffffffffffffff ``` #### Rollup operation @@ -436,7 +449,7 @@ amount = unpack_amount(TransferOp.tx.packed_amount) fee = unpack_fee(TransferOp.tx.packed_fee) def tree_invariants(): - TransferOp.token < TOTAL_TOKENS + TransferOp.token < MAX_TOKENS from_account.id == TransferOp.tx.from_account_id; from_account.nonce == TransferOp.tx.nonce @@ -478,7 +491,7 @@ assigned. And then the usual funds' Transfer between Rollup accounts will occur. | Chunks | Significant bytes | | ------ | ----------------- | -| 6 | 38 | +| 6 | 40 | ##### Structure @@ -486,7 +499,7 @@ assigned. And then the usual funds' Transfer between Rollup accounts will occur. | ------------- | -------- | -------------- | ----------------------------------------------------------------------------------- | | opcode | 1 | `0x02` | Operation code | | from_account | 4 | AccountId | Unique identifier of the rollup account from which funds will be withdrawn (sender) | -| token | 2 | TokenId | Unique token identifier in the rollup | +| token | 4 | TokenId | Unique token identifier in the rollup | | packed_amount | 5 | PackedTxAmount | Packed amount of funds sent | | to_address | 20 | ETHAddress | The address of the rollup account that will receive the funds (recipient) | | to_account | 4 | AccountId | Unique identifier of the rollup account that will receive the funds (recipient) | @@ -495,7 +508,7 @@ assigned. And then the usual funds' Transfer between Rollup accounts will occur. ##### Example ``` -020000000400020000001ad3080910111213141516171819202122233425262800000003001200000000 +0200000004000000020000001ad3080910111213141516171819202122233425262800000003001200000000 ``` Reads as: transfer from account #4 token #2 amount in packed representation 0x0000001ad3 to account with address @@ -530,7 +543,7 @@ amount = unpack_amount(TransferToNewOp.tx.packed_amount) fee = unpack_fee(TransferToNewOp.tx.packed_fee) def tree_invariants(): - TransferToNewOp.token < TOTAL_TOKENS + TransferToNewOp.token < MAX_TOKENS from_account.id == TransferToNewOp.tx.from_account_id; from_account.nonce == TransferToNewOp.tx.nonce @@ -572,7 +585,7 @@ Withdraws funds from Rollup account to appropriate balance of the indicated Ethe | Chunks | Significant bytes | | ------ | ----------------- | -| 6 | 44 | +| 6 | 47 | ##### Structure @@ -580,7 +593,7 @@ Withdraws funds from Rollup account to appropriate balance of the indicated Ethe | ------------ | -------- | ----------- | ------------------------------------------------------------------------------------------ | | opcode | 1 | `0x03` | Operation code | | from_account | 4 | AccountId | Unique identifier of the rollup account from which funds will be withdrawn (sender) | -| token | 2 | TokenId | Unique token identifier in the rollup | +| token | 4 | TokenId | Unique token identifier in the rollup | | full_amount | 16 | StateAmount | Full amount of funds sent | | packed_fee | 2 | PackedFee | Packed amount of fee paid | | to_address | 20 | EthAddress | The address of Ethereum account, to the balance of which funds will be accrued (recipient) | @@ -588,7 +601,7 @@ Withdraws funds from Rollup account to appropriate balance of the indicated Ethe ##### Example ``` -03000000040002000000000000000002c68af0bb1400000012080910111213141516171819202122233425262800000000 +030000000400000002000000000000000002c68af0bb1400000012080910111213141516171819202122233425262800000000 ``` Reads as: transfer from account #4 token #2 amount 0x000000000000000002c68af0bb140000 for fee packed in representation @@ -600,7 +613,7 @@ Reads as: transfer from account #4 token #2 amount 0x000000000000000002c68af0bb1 | Field | Value/type | Description | | ------------ | ----------- | --------------------------------------------------------------------------------------------- | -| type | `0x03` | Operation code | +| type | `0xfc` | Operation code | | account_id | AccountId | Unique id of the sender rollup account in the state tree | | from_address | ETHAddress | Unique address of the rollup account from which funds will be withdrawn (sender) | | to_address | EthAddress | The address of Ethereum account, to the balance of which the funds will be accrued(recipient) | @@ -608,7 +621,9 @@ Reads as: transfer from account #4 token #2 amount 0x000000000000000002c68af0bb1 | amount | StateAmount | Full amount of funds sent | | fee | PackedFee | Packed amount of fee paid | | nonce | Nonce | A one-time code that specifies the order of transactions | -| signature | Signanture | [Signature](#transaction-singature) of previous fields, see the spec below | +| valid_from | Timestamp | Unix timestamp from which the block with this transaction can be processed | +| valid_until | Timestamp | Unix timestamp until which the block with this transaction can be processed | +| signature | Signature | [Signature](#transaction-singature) of previous fields, see the spec below | ##### Example @@ -617,37 +632,43 @@ the spec below).. ```json { + "type": "Withdraw", "accountId": 4118, "from": "0x041f3b8db956854839d7434f3e53c7141a236b16", "to": "0xdc8f1d4d7b5b4cde2dbc793c1d458f8916cb0513", - "token": 9888, + "token": 1023, "amount": "12340000000000", "fee": "56700000000", "nonce": 352676723, "signature": { "pubKey": "0e1390d3e86881117979db2b37e40eaf46b6f8f38d2509ff3ecfaf229c717b9d", - "signature": "ae94d3b349e9ed18753c307262f62bea5ec1cc748ce5e5123caa5f7eb1aa599bc6734c43a92dad5c00eab5e6443e3ae8217e9bde60b93c7e9739dc85b148ad02" - } + "signature": "e29781125bdd3c1d0a4e863e7d364979dd3e3a36c2cd31fcf18d3853ae417201632c5c6ce4ac24da6a3ca99ed7e2005a74e6d6e2a3378d4102d68efb02d28d03" + }, + "fast": false, + "validFrom": 0, + "validUntil": 18446744073709551615 } ``` Signed transaction representation. ``` -Signed using: +Signer: Private key: Fs(0x057afe7e950189b17eedfd749f5537a88eb3ed4981467636a115e5c3efcce0f4) Public key: x: Fr(0x0e63e65569365f7d2db43642f9cb15781120364f5e993cd6822cbab3f86be4d3), y: Fr(0x1d7b719c22afcf3eff09258df3f8b646af0ee4372bdb7979118168e8d390130e) -type: 0x03 -account_id: 0x00001016 -from_address: 0x041f3b8db956854839d7434f3e53c7141a236b16 -to_address: 0xdc8f1d4d7b5b4cde2dbc793c1d458f8916cb0513 -token: 0x26a0 -amount: 0x000000000000000000000b3921510800 +Signed transaction fields: +type: 0xfc +version: 0x01 +accountId: 0x00001016 +from: 0x041f3b8db956854839d7434f3e53c7141a236b16 +to: 0xdc8f1d4d7b5b4cde2dbc793c1d458f8916cb0513 +token: 0x000003ff +fullAmount: 0x000000000000000000000b3921510800 fee: 0x46e8 nonce: 0x15056b73 - -Signed bytes: 0x0300001016041f3b8db956854839d7434f3e53c7141a236b16dc8f1d4d7b5b4cde2dbc793c1d458f8916cb051326a0000000000000000000000b392151080046e815056b73 +time_range: 0x0000000000000000ffffffffffffffff +Signed bytes: 0xfc0100001016041f3b8db956854839d7434f3e53c7141a236b16dc8f1d4d7b5b4cde2dbc793c1d458f8916cb0513000003ff000000000000000000000b392151080046e815056b730000000000000000ffffffffffffffff ``` #### Rollup operation @@ -671,7 +692,7 @@ fee_account = get_tree_account(Block.fee_account) fee = unpack_fee(WithdrawOp.tx.packed_fee) def tree_invariants(): - WithdrawOp.token < TOTAL_TOKENS + WithdrawOp.token < MAX_FUNGIBLE_TOKENS account.nonce == WithdrawOp.nonce account.nonce < MAX_NONCE @@ -694,7 +715,295 @@ def pubdata_invariants(): OnchainOp.to_address == WithdrawOp.tx.to_address ``` -### 5. Deposit +### 5. Withdraw NFT + +#### Description + +Withdraws NFT from Rollup account to appropriate ethereum account. + +#### Onchain operation + +##### Size + +| Chunks | Significant bytes | +| ------ | ----------------- | +| 10 | 95 | + +##### Structure + +| Field | Byte len | Value/type | Description | +| --------------- | -------- | ---------- | ------------------------------------------------------------------------------------------ | +| opcode | 1 | `0x0a` | Operation code | +| from_account | 4 | AccountId | Unique identifier of the rollup account from which funds will be withdrawn (sender) | +| creator_account | 4 | AccountId | Unique identifier of the rollup account which create the NFT (creator) | +| creator_address | 20 | EthAddress | The address of Ethereum account, to the balance of which create the NFT (creator) | +| serial_id | 4 | Int | Special id for NFT for enforcing uniqueness | +| content_hash | 32 | H256 | Content hash of NFT | +| to_address | 20 | EthAddress | The address of Ethereum account, to the balance of which funds will be accrued (recipient) | +| token | 4 | TokenId | Unique token identifier in the rollup | +| fee_token | 4 | TokenId | Token for paying fees | +| packed_fee | 2 | PackedFee | Packed amount of fee paid | + +##### Example + +``` +0a0000002a0000002b21abaed8712072e918632259780e587698ef58da00000000000000000000000000000000000000000000000000000000000000000000000021abaed8712072e918632259780e587698ef58da000100000000002a05400000000000 +``` + +Reads as: Withdraw NFT from account #4 token #2 for fee packed in representation and paying fee in token 0x0012 to +ethereum account with address 0x0809101112131415161718192021222334252628. + +#### User transaction + +##### Structure + +| Field | Value/type | Description | +| ------------ | ---------- | --------------------------------------------------------------------------------------------- | +| type | `0xf5` | Operation code | +| account_id | AccountId | Unique id of the sender rollup account in the state tree | +| from_address | ETHAddress | Unique address of the rollup account from which funds will be withdrawn (sender) | +| to_address | EthAddress | The address of Ethereum account, to the balance of which the funds will be accrued(recipient) | +| token | TokenId | Unique token identifier in the rollup | +| fee_token | TokenId | Fee token identifier in the rollup | +| fee | PackedFee | Packed amount of fee paid | +| nonce | Nonce | A one-time code that specifies the order of transactions | +| valid_from | Timestamp | Unix timestamp from which the block with this transaction can be processed | +| valid_until | Timestamp | Unix timestamp until which the block with this transaction can be processed | +| signature | Signature | [Signature](#transaction-singature) of previous fields, see the spec below | + +##### Example + +User transaction representation. (NOTE: tx bytecode differs slightly from this representation due to data packing, see +the spec below).. + +```json +{ + "type": "WithdrawNFT", + "accountId": 4118, + "from": "0x041f3b8db956854839d7434f3e53c7141a236b16", + "to": "0xdc8f1d4d7b5b4cde2dbc793c1d458f8916cb0513", + "token": 274474656, + "feeToken": 1023, + "fee": "12340000000000", + "nonce": 3924379879, + "signature": { + "pubKey": "0e1390d3e86881117979db2b37e40eaf46b6f8f38d2509ff3ecfaf229c717b9d", + "signature": "55aea80f1359cbedf68f86509a51ab721c7656263b221f8afa38a6c794ba181d119396c3d82e93feb61d2a5bef44069a3c1a7086206d7fab923abcc16e30b501" + }, + "fast": false, + "validFrom": 0, + "validUntil": 18446744073709551615 +} +``` + +Signed transaction representation. + +``` +Signer: +Private key: Fs(0x057afe7e950189b17eedfd749f5537a88eb3ed4981467636a115e5c3efcce0f4) +Public key: x: Fr(0x0e63e65569365f7d2db43642f9cb15781120364f5e993cd6822cbab3f86be4d3), y: Fr(0x1d7b719c22afcf3eff09258df3f8b646af0ee4372bdb7979118168e8d390130e) + +Signed transaction fields: +type: 0xf5 +version: 0x01 +accountId: 0x00001016 +from: 0x041f3b8db956854839d7434f3e53c7141a236b16 +to: 0xdc8f1d4d7b5b4cde2dbc793c1d458f8916cb0513 +token: 0x105c26a0 +fee_token: 0x000003ff +fee: 0x9a4a +nonce: 0xe9e948e7 +time_range: 0x0000000000000000ffffffffffffffff +Signed bytes: 0xf50100001016041f3b8db956854839d7434f3e53c7141a236b16dc8f1d4d7b5b4cde2dbc793c1d458f8916cb0513105c26a0000003ff9a4ae9e948e70000000000000000ffffffffffffffff +``` + +#### Rollup operation + +##### Structure + +| Field | Value/type | Description | +| ----- | ------------- | ----------------------------------------- | +| tx | WithdrawNFTTx | Signed withdraw transaction defined above | + +#### Circuit constraints + +```python +# WithdrawNFTOp - Rollup operation described above +# Block - block where this Rollup operation is executed +# OnchainOp - public data created after executing this rollup operation and posted to the Ethereum + +account = get_tree_account(WithdrawNFTOp.tx.account_id) +fee_account = get_tree_account(Block.fee_account) + +fee = unpack_fee(WithdrawNFTOp.tx.packed_fee) + +def tree_invariants(): + WithdrawNFTOp.token < MAX_TOKENS + WithdrawNFTOp.token > MAX_FUNGIBLE_TOKENS + WithdrawNFTOp.fee_token < MAX_FUNGIBLE_TOKENS + + account.nonce == WithdrawNFTOp.nonce + account.nonce < MAX_NONCE + account.balance[WithdrawNFTOp.tx.token] == 1 + account.balance[WithdrawNFTOp.tx.fee_token] >= fee + account.pubkey_hash == recover_signer_pubkey_hash(WithdrawNFTOp.tx) + + +def tree_updates(): + account.balance[WithdrawNFTOp.tx.token] = 0 + account.balance[WithdrawNFTOp.tx.fee_token] -= fee + account.nonce += 1 + + fee_account.balance[WithdrawNFTOp.token] += fee + +def pubdata_invariants(): + OnhcainOp.opcode == 0x0a + OnchainOp.from_account == WithdrawNFTOp.tx.account_id + OnchainOp.token == WithdrawNFTOp.tx.token + OnchainOp.fee_token == WithdrawNFTOp.tx.fee_token + OnhcainOp.packed_fee == WithdrawNFTOp.tx.packed_fee + OnchainOp.to_address == WithdrawNFTOp.tx.to_address +``` + +### 6. Mint NFT + +#### Description + +Mints an NFT token inside Rollup + +#### Onchain operation + +##### Size + +| Chunks | Significant bytes | +| ------ | ----------------- | +| 5 | 47 | + +##### Structure + +| Field | Byte len | Value/type | Description | +| --------------- | -------- | ----------- | --------------------------------------------------------------- | +| opcode | 1 | `0x09` | Operation code | +| creator_account | 4 | AccountId | Unique identifier of the rollup account will mint nft (creator) | +| recipient | 4 | AccountId | Recipient of NFT | +| content_hash | 32 | ContentHash | Content for NFT | +| fee_token | 4 | TokenId | Fee for paying fee | +| packed_fee | 2 | PackedFee | Packed amount of fee paid | + +##### Example + +``` +090000000a0000000b0000000000000000000000000000000000000000000000000000000000000000000000000140000000 +``` + +Reads as: Mint NFT from account to recipient with content hash and pay packed fee in fee_token + +#### User transaction + +##### Structure + +| Field | Value/type | Description | +| ------------ | ---------- | --------------------------------------------------------------------------------------------- | +| type | `0xf6` | Operation code | +| account_id | AccountId | Unique id of the sender rollup account in the state tree | +| from_address | ETHAddress | Unique address of the rollup account from which funds will be withdrawn (sender) | +| to_address | EthAddress | The address of Ethereum account, to the balance of which the funds will be accrued(recipient) | +| token | TokenId | Unique token identifier in the rollup | +| fee_token | TokenId | Fee token identifier in the rollup | +| fee | PackedFee | Packed amount of fee paid | +| nonce | Nonce | A one-time code that specifies the order of transactions | +| signature | Signature | [Signature](#transaction-singature) of previous fields, see the spec below | + +##### Example + +User transaction representation. (NOTE: tx bytecode differs slightly from this representation due to data packing, see +the spec below).. + +```json +{ + "type": "MintNFT", + "creatorId": 4118, + "creatorAddress": "0x041f3b8db956854839d7434f3e53c7141a236b16", + "contentHash": "0x0d185e587f0a80e93cd0f311cf9c7a0071ae63d088cfc810de55c9f6d9fb4bcc", + "recipient": "0xdc8f1d4d7b5b4cde2dbc793c1d458f8916cb0513", + "fee": "12340000000000", + "feeToken": 1023, + "nonce": 352676723, + "signature": { + "pubKey": "0e1390d3e86881117979db2b37e40eaf46b6f8f38d2509ff3ecfaf229c717b9d", + "signature": "59aff7f0f3dff5c6b0efc1f919599e62214bb99933438b74acb96076598b41ae4976b68328492978b349e907aebfc9dce2b1298debda589686517780afae7203" + } +} +``` + +Signed transaction representation. + +``` +Signer: +Private key: Fs(0x057afe7e950189b17eedfd749f5537a88eb3ed4981467636a115e5c3efcce0f4) +Public key: x: Fr(0x0e63e65569365f7d2db43642f9cb15781120364f5e993cd6822cbab3f86be4d3), y: Fr(0x1d7b719c22afcf3eff09258df3f8b646af0ee4372bdb7979118168e8d390130e) + +Signed transaction fields: +type: 0xf6 +version: 0x01 +creatorId: 0x00001016 +creatorAddress: 0x041f3b8db956854839d7434f3e53c7141a236b16 +contentHash: 0x0d185e587f0a80e93cd0f311cf9c7a0071ae63d088cfc810de55c9f6d9fb4bcc +recipient: 0xdc8f1d4d7b5b4cde2dbc793c1d458f8916cb0513 +fee_token: 0x000003ff +fee: 0x9a4a +nonce: 0x15056b73 + +Signed bytes: 0xf60100001016041f3b8db956854839d7434f3e53c7141a236b160d185e587f0a80e93cd0f311cf9c7a0071ae63d088cfc810de55c9f6d9fb4bccdc8f1d4d7b5b4cde2dbc793c1d458f8916cb0513000003ff9a4a15056b73 +``` + +#### Rollup operation + +##### Structure + +| Field | Value/type | Description | +| ----- | ---------- | ----------------------------------------- | +| tx | MintNFTTx | Signed mint nft transaction defined above | + +#### Circuit constraints + +```python +# MintNFTOp - Rollup operation described above +# Block - block where this Rollup operation is executed +# OnchainOp - public data created after executing this rollup operation and posted to the Ethereum + +creator_account = get_tree_account(MintNFTOp.tx.creator_id) +recipient_account = get_tree_account(MintNFTOp.tx.recipient) +fee_account = get_tree_account(Block.fee_account) + +fee = unpack_fee(MintNFTOp.tx.packed_fee) + +def tree_invariants(): + MintNFTOp.fee_token < MAX_FUNGIBLE_TOKENS + + creator_account.nonce == MintNFTOp.nonce + creator_account.nonce < MAX_NONCE + creator_account.balance[MintNFTOp.tx.fee_token] >= fee + creator_account.pubkey_hash == recover_signer_pubkey_hash(MintNFTOp.tx) + + +def tree_updates(): + creator_account.balance[MintNFTOp.tx.fee_token] -= fee + creator_account.balance[SPECIAL_NFT_TOKEN] += 1 + special_nft_account.balance[SPECIAL_NFT_TOKEN] += 1 + creator_account.nonce += 1 + recipient_account[minted_token] = 1 + fee_account.balance[MintNFTOp.token] += fee + +def pubdata_invariants(): + OnhcainOp.opcode == 0x09 + OnchainOp.creator_account == MintNFTOp.tx.account_id + OnchainOp.recipient == MintNFTOp.tx.recipient + OnchainOp.fee_token == MintNFTOp.tx.fee_token + OnhcainOp.packed_fee == MintNFTOp.tx.packed_fee +``` + +### 7. Deposit #### Description @@ -709,22 +1018,22 @@ be created if needed. | Chunks | Significant bytes | | ------ | ----------------- | -| 6 | 43 | +| 6 | 45 | ##### Structure | Field | Byte len | Value/type | Description | | ----------- | -------- | ----------- | ------------------------------------------------------------------------------- | -| opcode | 1 | `0x01` | Operation code | +| opcode | 1 | `0xfe` | Operation code | | to_account | 4 | AccountId | Unique identifier of the rollup account that will receive the funds (recipient) | -| token | 2 | TokenId | Unique token identifier in the rollup | +| token | 4 | TokenId | Unique token identifier in the rollup | | full_amount | 16 | StateAmount | Full amount of funds sent | | to_address | 20 | ETHAddress | The address of the rollup account that will receive the funds (recipient) | ##### Example ``` -01000000040002000000000000000002c68af0bb1400000809101112131415161718192021222334252628000000000000 +fe010000000400000002000000000000000002c68af0bb1400000809101112131415161718192021222334252628000000000000 ``` Reads as: deposit to account #4 token #2 amount 0x000000000000000002c68af0bb140000, account will have address @@ -736,7 +1045,7 @@ Reads as: deposit to account #4 token #2 amount 0x000000000000000002c68af0bb1400 | Field | Byte len | Value/type | Description | | ----------- | -------- | ----------- | ------------------------------------------------------------------------- | -| token | 2 | TokenId | Unique token identifier in the rollup | +| token | 4 | TokenId | Unique token identifier in the rollup | | full_amount | 16 | StateAmount | Full amount of funds sent | | to_address | 20 | ETHAddress | The address of the rollup account that will receive the funds (recipient) | @@ -758,7 +1067,7 @@ Reads as: deposit to account #4 token #2 amount 0x000000000000000002c68af0bb1400 account = get_account_tree(DepositOp.to_account_id) def tree_invariants(): - DepositOp.token < TOTAL_TOKENS + DepositOp.token < MAX_FUNGIBLE_TOKENS is_account_empty(account) == True or account.address == DepositOp.op.to_address @@ -783,7 +1092,7 @@ It is possible that the operator for some reason does not include this operation of ethereum blocks set on the smart contract, the exodus mode will be launched. It will allow recipient account (i.e. with `msg.sender == Deposit.to`) to withdraw funds from zkSync contract. -### 6. Full exit +### 8. Full exit #### Description @@ -798,22 +1107,25 @@ in a block. | Chunks | Significant bytes | | ------ | ----------------- | -| 6 | 43 | +| 11 | 85 | ##### Structure -| Field | Byte len | Value/type | Description | -| ----------- | -------- | ----------- | ------------------------------------------------------------------------------------------- | -| opcode | 1 | `0x06` | Operation code | -| account_id | 4 | AccountId | Unique identifier of the rollup account from which funds will be withdrawn (sender) | -| owner | 20 | EthAddress | The address of the fund owner account. Funds will be accrued to the balance of this address | -| token | 2 | TokenId | Unique token identifier in the rollup | -| full_amount | 16 | StateAmount | Full amount of funds that had been withdrawn | +| Field | Byte len | Value/type | Description | +| ----------------------------- | -------- | ----------- | ------------------------------------------------------------------------------------------- | +| opcode | 1 | `0xf9` | Operation code | +| account_id | 4 | AccountId | Unique identifier of the rollup account from which funds will be withdrawn (sender) | +| owner | 20 | EthAddress | The address of the fund owner account. Funds will be accrued to the balance of this address | +| token | 4 | TokenId | Unique token identifier in the rollup | +| full_amount | 16 | StateAmount | Full amount of funds that had been withdrawn | +| creator_account_id (Optional) | 4 | AccountId | Unique identifier of the rollup account from which created nft | +| serial_id (Optional) | 4 | Int | | +| content_hash (Optional) | 32 | ContentHash | Content of NFT | ##### Example ``` -060000040809101112131415161718192021222334252628000200000000000002c68af0bb1400000000 +060000002a2a0a81e257a2f5d6ed4f07b81dbda09f107bd0260000002a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ``` Reads as: full exit from account #4 with with address 0x0809101112131415161718192021222334252628, token #2, amount is @@ -827,7 +1139,7 @@ Reads as: full exit from account #4 with with address 0x080910111213141516171819 | ----------- | -------- | ---------- | --------------------------------------- | | account_id | 4 | AccountId | Unique identifier of the rollup account | | eth_address | 20 | ETHAddress | The address of the account | -| token | 2 | TokenId | Unique token identifier in the rollup | +| token | 4 | TokenId | Unique token identifier in the rollup | #### Rollup operation @@ -847,7 +1159,7 @@ account = get_account_tree(FullExitOp.op.account_id) withdrawn_amount = 0 def tree_invariants(): - FullExitOp.op.token < TOTAL_TOKENS + FullExitOp.op.token < MAX_TOKENS account.id == FullExitOp.op.id def tree_updates(): @@ -874,7 +1186,7 @@ It is possible that the operator for some reason does not include this operation of ethereum blocks set on the smart contract, the exodus mode will be launched. After that, a user can submit exit proof to get her funds. Read more about censorship resistance and exodus mode in special sections. -### 7. Change pubkey +### 9. Change pubkey #### Description @@ -898,7 +1210,7 @@ with ethereum keys for which address is the same as account address. | new_pubkey_hash | 20 | RollupPubkeyHash | Hash of the new rollup public key | | account_address | 20 | ETHAddress | Address of the account | | nonce | 4 | Nonce | Account nonce | -| fee_token | 2 | TokenId | Unique token identifier in the rollup used to pay fee | +| fee_token | 4 | TokenId | Unique token identifier in the rollup used to pay fee | | packed_fee | 2 | PackedFee | Packed amount of fee paid | ##### Example @@ -946,51 +1258,60 @@ function create2_address_zksync(creator_address, salt_arg /* abitrary 32 bytes * | Field | Value/type | Description | | ------------------------ | ---------------- | --------------------------------------------------------------------------------------------- | -| type | `0x07` | Operation code | +| type | `0xf8` | Operation code | | account_id | AccountId | Unique id of the rollup account | | account | ETHAddress | Address of the rollup account | | new_pubkey_hash | RollupPubkeyHash | Hash of the new rollup public key | | fee_token | TokenId | Unique token identifier in the rollup used to pay fee | | fee | PackedFee | Packed amount of fee paid | | nonce | Nonce | A one-time code that specifies the order of transactions | -| signature | Signanture | [Signature](#transaction-singature) of previous fields, see the spec below | -| eth_signature (optional) | ETHSignanture | Ethereum signature of the message defined above. Null if operation was authorized on contract | +| valid_from | Timestamp | Unix timestamp from which the block with this transaction can be processed | +| valid_until | Timestamp | Unix timestamp until which the block with this transaction can be processed | +| signature | Signature | [Signature](#transaction-singature) of previous fields, see the spec below | +| eth_signature (optional) | ETHSignature | Ethereum signature of the message defined above. Null if operation was authorized on contract | ##### Example ```json { "type": "ChangePubKey", - "accountId": 5, - "account": "0x11742517336Ae1b09CA275bb6CAFc6B341B6e324", - "newPkHash": "sync:4a38f08c06ac48328029485e07d6d9a3c29155e7", - "feeToken": 100, + "accountId": 2061, + "account": "0x1f04204dba8e9e8bf90f5889fe4bdc0f37265dbb", + "newPkHash": "sync:63aa2a0efb97064e0e52a6adb63a42018bd6e72b", + "feeToken": 1023, "fee": "56700000000", - "nonce": 0, + "nonce": 155724003, "signature": { "pubKey": "0e1390d3e86881117979db2b37e40eaf46b6f8f38d2509ff3ecfaf229c717b9d", - "signature": "4da3c53a246a0237f295baa4349e0c659edbf29e458709d9f48f9e04af168da09c5fc08ecaf5ee5b808d35806ea6043285ef10dc1d0bdd24ee6abad1918ada02" + "signature": "a44999d6d7962b8216ebb2c53afc159f4bd85282844b1e443f82a1e50bfe1c2b70377ac0dbe1b8c14672fac3548df77f0b7bae0eb40c553191b9b0606ef86b04" + }, + "ethSignature": null, + "ethAuthData": { + "type": "Onchain" }, - "ethSignature": "0x40875b0ad3c5520093c8222acf293f34016c4fea9596ca02b37cc6e5c7cf007170cfa1195d3461ad17296ff80721762e6f783f195db19dbf40cf6ae58057172b1b" + "validFrom": 0, + "validUntil": 18446744073709551615 } ``` Signed transaction representation. ``` -Signed using: +Signer: Private key: Fs(0x057afe7e950189b17eedfd749f5537a88eb3ed4981467636a115e5c3efcce0f4) Public key: x: Fr(0x0e63e65569365f7d2db43642f9cb15781120364f5e993cd6822cbab3f86be4d3), y: Fr(0x1d7b719c22afcf3eff09258df3f8b646af0ee4372bdb7979118168e8d390130e) -type: 0x07, -account_id: 0x00000005, -account: 0x11742517336ae1b09ca275bb6cafc6b341b6e324, -new_pk_hash: 0x63aa2a0efb97064e0e52a6adb63a42018bd6e72b, -fee_token: 0x0064, -fee: 0x46e8, -nonce: 0x00000000, - -Signed bytes: 0x070000000511742517336ae1b09ca275bb6cafc6b341b6e32463aa2a0efb97064e0e52a6adb63a42018bd6e72b006446e800000000 +Signed transaction fields: +type: 0xf8 +version: 0x01 +accountId: 0x0000080d +account: 0x1f04204dba8e9e8bf90f5889fe4bdc0f37265dbb +new_pub_key_hash: 0x63aa2a0efb97064e0e52a6adb63a42018bd6e72b +token: 0x000003ff +fee: 0x46e8 +nonce: 0x094828e3 +time_range: 0x0000000000000000ffffffffffffffff +Signed bytes: 0xf8010000080d1f04204dba8e9e8bf90f5889fe4bdc0f37265dbb63aa2a0efb97064e0e52a6adb63a42018bd6e72b000003ff46e8094828e30000000000000000ffffffffffffffff ``` #### Rollup operation @@ -1044,7 +1365,7 @@ Signature validity is verified twice: 1. Rollup signature is verified in circuit. 2. Ethereum signature is verified when transaction is committed to the Ethereum. -### 8. Forced exit +### 10. Forced exit #### Description @@ -1057,7 +1378,7 @@ account. Unowned account is an account with no signing key set. | Chunks | Significant bytes | | ------ | ----------------- | -| 6 | 49 | +| 6 | 51 | ##### Structure @@ -1066,7 +1387,7 @@ account. Unowned account is an account with no signing key set. | opcode | 1 | `0x08` | Operation code | | initiator_account_id | 4 | AccountId | Unique identifier of the rollup account which initiates a forced exit operation (sender) | | target_account_id | 4 | AccountId | Unique identifier of the rollup account to perform a forced exit on (target) | -| token | 2 | TokenId | Unique token identifier in the rollup | +| token | 4 | TokenId | Unique token identifier in the rollup | | full_amount | 16 | StateAmount | Full amount of funds sent | | packed_fee | 2 | PackedFee | Packed amount of fee paid | | target_address | 20 | EthAddress | The address of Ethereum account, to the balance of which funds will be accrued (recipient) | @@ -1093,7 +1414,7 @@ packed in representation 0x0012 for the Rollup account which has Ethereum accoun | token | TokenId | Unique token identifier in the rollup | | fee | PackedFee | Packed amount of fee paid | | nonce | Nonce | A one-time code that specifies the order of transactions | -| signature | Signanture | [Signature](#transaction-singature) of previous fields, see the spec below | +| signature | Signature | [Signature](#transaction-singature) of previous fields, see the spec below | ##### Example @@ -1121,13 +1442,14 @@ Signed using: Private key: Fs(0x057afe7e950189b17eedfd749f5537a88eb3ed4981467636a115e5c3efcce0f4) Public key: x: Fr(0x0e63e65569365f7d2db43642f9cb15781120364f5e993cd6822cbab3f86be4d3), y: Fr(0x1d7b719c22afcf3eff09258df3f8b646af0ee4372bdb7979118168e8d390130e) -type: 0x03 +type: 0xf7 +version: 0x01 account_id: 0x00001016 target: 0xdc8f1d4d7b5b4cde2dbc793c1d458f8916cb0513 -token: 0x0064 +token: 0x00000064 fee: 0x46e8 nonce: 0x15056b73 -Signed bytes: 0x0800001016dc8f1d4d7b5b4cde2dbc793c1d458f8916cb0513006446e815056b73 +Signed bytes: 0xf70100001016dc8f1d4d7b5b4cde2dbc793c1d458f8916cb05130000006446e815056b73 ``` #### Rollup operation @@ -1154,7 +1476,7 @@ target_account_initial_balance = target_account.balances[ForcedExitOp.tx.token] fee = unpack_fee(ForcedExitOp.tx.packed_fee) def tree_invariants(): - ForcedExitOp.token < TOTAL_TOKENS + ForcedExitOp.token < MAX_FUNGIBLE_TOKENS initiator_account.nonce == ForcedExitOp.nonce initiator_account.nonce < MAX_NONCE @@ -1180,6 +1502,267 @@ def pubdata_invariants(): OnchainOp.target == WithdrawOp.tx.target ``` +### 11. Swap + +#### Description + +Performs an atomic swap of tokens between 2 Rollup accounts at an arranged ratio. + +#### Onchain operation + +##### Size + +| Chunks | Significant bytes | +| ------ | ----------------- | +| 5 | 46 | + +##### Structure + +| Field | Byte len | Value/type | Description | +| ----------- | -------- | -------------- | ---------------------------------------------------------------------------------------- | +| opcode | 1 | `0x0b` | Operation code | +| account_a | 4 | AccountId | Unique identifier of the first rollup account that performs a swap | +| recipient_a | 4 | AccountId | Unique identifier of the rollup account which receives the funds sent by `account_b` | +| account_b | 4 | AccountId | Unique identifier of the second rollup account that performs a swap | +| recipient_b | 4 | AccountId | Unique identifier of the rollup account which receives the funds sent by `account_a` | +| submitter | 4 | AccountId | Unique identifier of the rollup account which submits the swap transaction and pays fees | +| token_a | 4 | TokenId | Unique identifier of the token that account_a is swapping | +| token_b | 4 | TokenId | Unique identifier of the token that account_b is swapping | +| fee_token | 4 | TokenId | Unique identifier of the token in which submitter is paying fees | +| amount_a | 5 | PackedTxAmount | Full amount of funds sent by `account_a` (of `token_a`) | +| amount_b | 5 | PackedTxAmount | Full amount of funds sent by `account_b` (of `token_b`) | +| packed_fee | 2 | PackedFee | Packed amount of fee paid | +| nonce_mask | 1 | 1 Byte | Nonce mask \* | + +\* Nonce mask is an 8-bit number. 1st bit set indicates that account_a's nonce was incremented. 2nd bit set +indicates that account_b's nonce was incremented. Other bits are always 0. + +##### Example + +``` +0b000000050000000600000007000000080000002a00000007000000010000002d00000012200000001b2005800200000000 +``` + +Reads as: account #5 has swapped amount 0x0000001220 in packed representation of token #7 for account #7's amount +0x0000001b20 in packed representation of token #1. account #6 received the swapped tokens #1, and account #8 received +swapped tokens #7. account #42 has submitted the swap and payed the fee of 0x0580 in packed representation with a token +\#45. account #5's nonce has not been incremented, while account #7's has. + +#### User transaction + +##### Order structure + +| Field | Value/type | Description | +| ----------- | -------------- | --------------------------------------------------------------------------- | +| type | `0x6f` | Operation code | +| account_id | AccountId | Unique id of the sender rollup account in the state tree | +| recipient | ETHAddress | Unique address of the rollup account that will receive the funds | +| nonce | Nonce | A one-time code that specifies the order of transactions | +| token_sell | TokenId | Unique identifier of the token to be swapped | +| token_buy | TokenId | Unique identifier of the token to be swapped for | +| amount | PackedTxAmount | Amount of funds to be swapped, 0 indicates a limit order | +| ratio | Ratio | Array of 2 15-byte values, acceptable sell:buy ratio | +| valid_from | Timestamp | Unix timestamp from which the block with this transaction can be processed | +| valid_until | Timestamp | Unix timestamp until which the block with this transaction can be processed | +| signature | Signature | [Signature](#transaction-singature) of previous fields, see the spec below | + +##### Swap structure + +| Field | Value/type | Description | +| ----------------- | -------------- | -------------------------------------------------------------------------- | +| type | `0xf4` | Operation code | +| submitter_id | AccountId | Unique id of the sender rollup account in the state tree | +| submitter_address | ETHAddress | Unique address of the rollup account that submitted the transaction | +| nonce | Nonce | A one-time code that specifies the order of transactions | +| orders_hash | Hash | Rescue hash of 2 serialized concatenated orders \* | +| fee_token | TokenId | Unique identifier of the token in which submitter is paying fees | +| fee | PackedFee | Packed amount of fee paid | +| amount_a | PackedTxAmount | Amount of funds to be swapped by `account_a` | +| amount_b | PackedTxAmount | Amount of funds to be swapped by `account_b` | +| signature | Signature | [Signature](#transaction-singature) of previous fields, see the spec below | + +\* In the submitted transaction both orders are present in their full form, but only their hash is signed by +the user. + +##### Example + +User transaction representation. (NOTE: tx bytecode differs slightly from this representation due to data packing, see +the spec below). + +```json +{ + "submitterId": 16777214, + "submitterAddress": "0xa143fc5851d93cdc72e90d63cfb7286395ce20d5", + "nonce": 2081453911, + "orders": [ + { + "accountId": 4, + "recipient": "0x204dba8e9e8bf90f5889fe4bdc0f37265dbb05e3", + "nonce": 412184582, + "tokenBuy": 1023, + "tokenSell": 1023, + "ratio": ["12", "18"], + "amount": "12000000000", + "validFrom": 0, + "validUntil": 18446744073709551615, + "signature": { + "pubKey": "0e1390d3e86881117979db2b37e40eaf46b6f8f38d2509ff3ecfaf229c717b9d", + "signature": "8bfc1b854d6cf4f6d30a98249562d34c4b2c72344498a5803817ca994f6f051b984052dd501b10d2567a24719043de92bd1d7a55a951e7be9cc0995873f88002" + } + }, + { + "accountId": 16777214, + "recipient": "0x50dfcd4ee9ca4f2039d58883631f0460e0e0668f", + "nonce": 119487968, + "tokenBuy": 1023, + "tokenSell": 1023, + "ratio": ["18", "12"], + "amount": "18000000000", + "validFrom": 0, + "validUntil": 18446744073709551615, + "signature": { + "pubKey": "0e1390d3e86881117979db2b37e40eaf46b6f8f38d2509ff3ecfaf229c717b9d", + "signature": "ce385443624ae362991fd6150d950aea8143ae66388b36b4ec2ccac2c2b80a19fee8c56fcf693158f655f8612fbc3374b046b22673bd9907b31e13bdb61cc301" + } + } + ], + "amounts": ["12000000000", "18000000000"], + "fee": "56000000", + "feeToken": 1023, + "signature": { + "pubKey": "0e1390d3e86881117979db2b37e40eaf46b6f8f38d2509ff3ecfaf229c717b9d", + "signature": "5b64500bf4fae9766792129808f8116a8d63a9c35dda9378e986ba708f983a9d5bd0d8ffb59aaa1b3f47f42ae8bc629cd19514f6a72fc82a144591c16105b605" + } +} +``` + +Signed transaction representation. + +``` +Signer (account_a): +Private key: Fs(0x057afe7e950189b17eedfd749f5537a88eb3ed4981467636a115e5c3efcce0f4) +Public key: x: Fr(0x0e63e65569365f7d2db43642f9cb15781120364f5e993cd6822cbab3f86be4d3), y: Fr(0x1d7b719c22afcf3eff09258df3f8b646af0ee4372bdb7979118168e8d390130e) + +Signer (account_b): +Private key: Fs(0x057afe7e950189b17eedfd749f5537a88eb3ed4981467636a115e5c3efcce0f4) +Public key: x: Fr(0x0e63e65569365f7d2db43642f9cb15781120364f5e993cd6822cbab3f86be4d3), y: Fr(0x1d7b719c22afcf3eff09258df3f8b646af0ee4372bdb7979118168e8d390130e) + +Signer (submitter): +Private key: Fs(0x057afe7e950189b17eedfd749f5537a88eb3ed4981467636a115e5c3efcce0f4) +Public key: x: Fr(0x0e63e65569365f7d2db43642f9cb15781120364f5e993cd6822cbab3f86be4d3), y: Fr(0x1d7b719c22afcf3eff09258df3f8b646af0ee4372bdb7979118168e8d390130e) + +Signed transaction fields: +type: 0xf4 +version: 0x01 +submitterId: 0x00fffffe +submitterAddress: 0xa143fc5851d93cdc72e90d63cfb7286395ce20d5 +nonce: 0x7c107757 +orders_hash: 0x8d2f227c69cb8d3dc16e20cb1b6829d1ee5d97d276ada6c6e6f71e3bccdc17 +fee_token: 0x000003ff +fee: 0x4605 +amounts[0]: 0x59682f0000 +amounts[1]: 0x861c468000 +Signed bytes: 0xf40100fffffea143fc5851d93cdc72e90d63cfb7286395ce20d57c1077578d2f227c69cb8d3dc16e20cb1b6829d1ee5d97d276ada6c6e6f71e3bccdc17000003ff460559682f0000861c468000 +``` + +#### Rollup operation + +##### Structure + +| Field | Value/type | Description | +| ----- | ---------- | ------------------------------------- | +| tx | SwapTx | Signed swap transaction defined above | + +#### Circuit constraints + +```python +# SwapOp - Rollup operation described above +# Block - block where this Rollup operation is executed +# OnchainOp - public data created after executing this rollup operation and posted to the Ethereum + +account_a = get_tree_account(SwapOp.orders.0.account_id) +account_b = get_tree_account(SwapOp.orders.1.account_id) +submitter = get_tree_account(SwapOp.submitter_id) +recipient_a = get_account_by_address(SwapOp.orders.0.recipient) +recipient_b = get_account_by_address(SwapOp.orders.1.recipient) +fee_account = get_tree_account(Block.fee_account) + +fee = unpack_fee(SwapOp.tx.packed_fee) + +def tree_invariants(): + SwapOp.orders.0.token_sell < MAX_TOKENS + SwapOp.orders.0.token_buy < MAX_TOKENS + SwapOp.orders.1.token_sell < MAX_TOKENS + SwapOp.orders.1.token_buy < MAX_TOKENS + SwapOp.fee_token < MAX_FUNGIBLE_TOKENS + + submitter.nonce == SwapOp.nonce + account_a.nonce == SwapOp.orders.0.nonce + account_b.nonce == SwapOp.orders.1.nonce + submitter.nonce < MAX_NONCE + account_a.nonce < MAX_NONCE + account_b.nonce < MAX_NONCE + + submitter.pubkey_hash == recover_signer_pubkey_hash(SwapOp) + account_a.pubkey_hash == recover_signer_pubkey_hash(SwapOp.orders.0) + account_b.pubkey_hash == recover_signer_pubkey_hash(SwapOp.orders.1) + + # tokens must match + SwapOp.orders.0.token_buy == SwapOp.orders.1.token_sell + SwapOp.orders.1.token_sell == SwapOp.orders.0.token_buy + SwapOp.orders.0.token_buy != SwapOp.orders.0.token_sell + + # if partial order filling is not allowed, amounts must match + SwapOp.orders.0.amount == 0 or SwapOp.orders.0.amount == SwapOp.amounts.0 + SwapOp.orders.1.amount == 0 or SwapOp.orders.1.amount == SwapOp.amounts.1 + + # either one of 2 proposed prices is accepted (or in between) + SwapOp.amounts.0 * SwapOp.orders.0.ratio.1 <= SwapOp.amounts.1 * SwapOp.orders.0.ratio.0 + SwapOp.amounts.1 * SwapOp.orders.1.ratio.1 <= SwapOp.amounts.0 * SwapOp.orders.1.ratio.0 + + # balance checks + account_a.balance[SwapOp.orders.0.token_sell] >= SwapOp.amounts.0 + account_b.balance[SwapOp.orders.1.token_sell] >= SwapOp.amounts.1 + submitter.balance[SwapOp.fee_token] >= SwapOp.fee + + if account_a.id == submitter.id and SwapOp.fee_token == SwapOp.orders.0.token_sell: + account_a.balance[SwapOp.orders.0.token_sell] >= SwapOp.amounts.0 + SwapOp.fee + + if account_b.id == submitter.id and SwapOp.fee_token == SwapOp.orders.1.token_sell: + account_b.balance[SwapOp.orders.1.token_sell] >= SwapOp.amounts.1 + SwapOp.fee + + +def tree_updates(): + account_a.balance[SwapOp.orders.0.token_sell] -= SwapOp.amounts.0 + recipient_b.balance[SwapOp.orders.1.token_buy] += SwapOp.amounts.0 + account_b.balance[SwapOp.orders.1.token_sell] -= SwapOp.amounts.1 + recipient_a.balance[SwapOp.orders.0.token_buy] += SwapOp.amounts.1 + + submitter.balance[SwapOp.fee_token] -= SwapOp.fee + fee_account.balance[SwapOp.fee_token] += SwapOp.fee + + submitter.nonce += 1 + if SwapOp.orders.0.amount != 0 and submitter.id != account_a.id: + account_a.nonce += 1 + if SwapOp.orders.1.amount != 0 and submitter.id != account_b.id: + account_b.nonce += 1 + +def pubdata_invariants(): + OnhcainOp.opcode == 0x0b + OnchainOp.account_a == SwapOp.orders.0.account_id + OnchainOp.recipient_a == SwapOp.orders.0.recipient + OnchainOp.account_b == SwapOp.orders.1.account_id + OnchainOp.recipient_b == SwapOp.orders.1.recipient + OnchainOp.submitter == SwapOp.submitter_id + OnchainOp.token_a == SwapOp.orders.0.token_sell + OnchainOp.token_b == SwapOp.orders.1.token_sell + OnchainOp.fee_token == SwapOp.fee_token + OnhcainOp.packed_amount_a == SwapOp.amounts.0 + OnhcainOp.packed_amount_b == SwapOp.amounts.1 + OnhcainOp.packed_fee == SwapOp.fee + OnchainOp.nonce_mask == (SwapOp.orders.0.amount != 0) | (SwapOp.orders.1.amount != 0) << 1 +``` + ## Smart contracts API ### Rollup contract @@ -1210,31 +1793,36 @@ depositERC20(IERC20 _token, uint104 _amount, address _rollupAddr) payable #### Withdraw Ether -Withdraw ETH to L1 - register withdrawal and transfer ether from contract to msg.sender +Withdraw NFT to L1 ```solidity -withdrawETH(uint128 _amount) +withdrawPendingNFTBalance(uint32 _tokenId) ``` -- `_amount`: Amount to withdraw +- `_tokenId`: Token to withdraw #### Withdraw ERC-20 token -Withdraw ERC20 token to L1 - register withdrawal and transfer token from contract to msg.sender +Withdraw ERC20 token to L1 - Transfer token from contract to owner ```solidity -withdrawERC20(IERC20 _token, uint128 _amount) +withdrawPendingBalance( +address payable _owner, +address _token, +uint128 _amount +) ``` - `_token`: Token address in L1 chain - `_amount`: Amount to withdraw +- `_owner`: Recipient #### Authenticate rollup public key change Authenticates pubkey hash change for new rollup public key. ```solidity -function setAuthPubkeyHash(bytes calldata _pubkey_hash, uint32 _nonce) external { +setAuthPubkeyHash(bytes calldata _pubkey_hash, uint32 _nonce) external { ``` - `_pubkey_hash`: `RollupPubkeyHash` @@ -1246,7 +1834,7 @@ Register full exit request to withdraw all token balance from the account. The u that her transactions are censored by the validator. ```solidity -fullExit ( +requestFullExit ( uint24 _accountId, address _token, ) @@ -1255,6 +1843,19 @@ fullExit ( - `_accountId`: `AccountId` of the Rollup account - `_token`: Token address in L1 chain +Register full exit request to withdraw NFT tokens balance from the account. Users need to call it if they believe that +their transactions are censored by the validator. + +```solidity +requestFullExitNFT ( + uint24 _accountId, + uint32 _tokenId, +) +``` + +- `_accountId`: `AccountId` of the Rollup account +- `_tokenId`: NFT Token ID + #### Exodus mode ##### Withdraw funds @@ -1262,11 +1863,15 @@ fullExit ( Withdraws token from Rollup to L1 in case of exodus mode. User must provide proof that she owns funds. ```solidity -exit( +performExodus( StoredBlockInfo memory _storedBlockInfo, uint24 _accountId, - uint16 _tokenId, + uint32 _tokenId, uint128 _amount, + uint32 _nftCreatorAccountId, + address _nftCreatorAddress, + uint32 _nftSerialId, + bytes32 _nftContentHash, uint256[] calldata _proof ) ``` @@ -1274,7 +1879,10 @@ exit( - `_storedBlockInfo`: Stored block data of the last verified block - `_accountId`: `AccountId` of the owner account. - `_tokenId`: Verified token id -- `_amount`: `StateAmount` full amount of the given token that belong to `AccountId` in the last verified block. +- `_amount`: `StateAmount` Full amount of the given token that belong to `AccountId` in the last verified block. +- `_nftCreatorAccountId`: Creator id of NFT (optional, only for NFT) +- `_nftCreatorAddress`: Creator Address of NFT (optional, only for NFT) +- `_nftSerialId`: Serial ID of NFT (optional, only for NFT) - `_proof`: Proof that user funds are present in the account tree ##### Cancel outstanding deposits @@ -1282,11 +1890,13 @@ exit( Cancels open priority requests, accrues users balances from deposit priority requests in Exodus mode. ```solidity -cancelOutstandingDepositsForExodusMode(uint64 _number) +cancelOutstandingDepositsForExodusMode(uint64 _number, bytes[] memory _depositsPubdata) ``` - `_number`: Supposed number of requests to cancel (if there are less request than provided number - will be canceled exact number of requests) +- `_depositsPubdata`: The array of the pubdata for the deposits to be cancelled. Please note, that it should not contain + any (even empty) pubdata for `FullExit` priority operations. #### Rollup Operations @@ -1434,7 +2044,7 @@ changeGovernor(address _newGovernor) #### Add token -Add token to the list of networks tokens. The caller must be current governor. +Add token to the list of networks tokens. The caller must be current token governance. ```solidity addToken(address _token) @@ -1466,9 +2076,17 @@ setValidator(address _validator, bool _active) - `_validator`: Validator address - `_active`: Active flag +##### Change token governance + +```solidity +changeTokenGovernance(TokenGovernance _newTokenGovernance) +``` + +- `_newTokenGovernance`: New token Governance + #### Check for governor -Validate that specified address is the governor address +Validate that specified address is the token governance address ```solidity requireGovernor(address _address) @@ -1491,7 +2109,7 @@ requireActiveValidator(address _address) Validate token id (must be less than total tokens amount). ```solidity -isValidTokenId(uint16 _tokenId) returns (bool) +isValidTokenId(uint32 _tokenId) returns (bool) ``` - `_tokenId`: Token id @@ -1503,13 +2121,61 @@ Returns: bool flag that indicates if token id is less than total tokens amount. Validate token address (it must be presented in tokens list). ```solidity -validateTokenAddress(address _tokenAddr) returns (uint16) +validateTokenAddress(address _tokenAddr) returns (uint32) ``` - `_tokenAddr`: Token address Returns: token id. +#### Register creator corresponding to the factory + +Register custom factory for withdrawing NFT + +```solidity +registerNFTFactoryCreator(uint32 _creatorAccountId, address _creatorAddress, bytes memory _signature) +``` + +- `_creatorAccountId`: Creator's zkSync account ID +- `_creatorAddress`: NFT creator address +- `_signature`: Creator's signature + +The creator should sign the message + +```solidity + "\x19Ethereum Signed Message:\n141", + "\nCreator's account ID in zkSync: ", + Bytes.bytesToHexASCIIBytes(abi.encodePacked((_creatorAccountId))), + "\nCreator: ", + Bytes.bytesToHexASCIIBytes(abi.encodePacked((_creatorAddress))), + "\nFactory: ", + Bytes.bytesToHexASCIIBytes(abi.encodePacked((_factoryAddress))) +``` + +This signature should be sent to the governance contract by calling `registerNFTFactoryCreator` from the factory +contract. + +#### Set default NFT factory + +Register factory, which will be use for withdrawing NFT by default + +```solidity +setDefaultNFTFactory(address _factory) +``` + +- `_factory`: NFT factory address + +#### Get NFT factory for creator + +Get NFT factory which will be used for withdrawing NFT for corresponding creator + +```solidity + getNFTFactory(uint32 _creatorAccountId, address _creatorAddress) +``` + +- `_creatorAccountId`: Creator account id +- `_creatorAddress`: Creator address + ## Block state transition circuit Block circuit describes state transition function (STF) from previous state to the new one by applying a number of diff --git a/etc/env/base/fee_ticker.toml b/etc/env/base/fee_ticker.toml index 7aee02faa0..687a4cf13b 100644 --- a/etc/env/base/fee_ticker.toml +++ b/etc/env/base/fee_ticker.toml @@ -21,12 +21,4 @@ unconditionally_valid_tokens="0x0000000000000000000000000000000000000000" token_market_update_time=120 # Number of tickers for load balancing. number_of_ticker_actors=5 -# List of tokens for which subsidions are disabled. -not_subsidized_tokens=[ - "0x2b591e99afe9f32eaa6214f7b7629768c40eeb39", # HEX - "0x34083bbd70d394110487feaa087da875a54624ec" # Some sample token -] - -subsidized_tokens=[] -subsidized_tokens_limits=[] scale_fee_percent=100 diff --git a/etc/token-lists/coingecko.json b/etc/token-lists/coingecko.json index fabbdd43fc..3ed2d7c3b1 100644 --- a/etc/token-lists/coingecko.json +++ b/etc/token-lists/coingecko.json @@ -1 +1 @@ -[{"chainId":1,"address":"0x63f88a2298a5c4aee3c216aa6d926b184a4b2437","name":"GameCredits","symbol":"GAME","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/193/thumb/XlQmXoU.png?1595304945"},{"chainId":1,"address":"0x3505f494c3f0fed0b594e01fa41dd3967645ca39","name":"Swarm Fund","symbol":"SWM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/197/thumb/swarm.jpg?1547033949"},{"chainId":1,"address":"0x221657776846890989a759ba2973e427dff5c9bb","name":"Augur","symbol":"REP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/309/thumb/REP.png?1596339859"},{"chainId":1,"address":"0xdac17f958d2ee523a2206206994597c13d831ec7","name":"Tether","symbol":"USDT","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/325/thumb/Tether-logo.png?1598003707"},{"chainId":1,"address":"0xe0b7927c4af23765cb51314a0e0521a9645f0e2a","name":"DigixDAO","symbol":"DGD","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/397/thumb/dgd.png?1547034124"},{"chainId":1,"address":"0xaec2e87e0a235266d9c5adc9deb4b2e29b54d009","name":"SingularDTV","symbol":"SNGLS","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/521/thumb/singulardtv.png?1547034199"},{"chainId":1,"address":"0xabc430136a4de71c9998242de8c1b4b97d2b9045","name":"Veros","symbol":"VRS","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/539/thumb/vrs_logo.png?1583913100"},{"chainId":1,"address":"0x7dd9c5cba05e151c895fde1cf355c9a1d5da6429","name":"Golem","symbol":"GLM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/542/thumb/Golem_Submark_Positive_RGB.png?1606392013"},{"chainId":1,"address":"0x3d658390460295fb963f54dc0899cfb1c30776df","name":"Circuits of Value","symbol":"COVAL","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/588/thumb/coval-logo.png?1599493950"},{"chainId":1,"address":"0x485d17a6f1b8780392d53d64751824253011a260","name":"chrono tech","symbol":"TIME","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/604/thumb/TIMEsymbol200x200.png?1572093177"},{"chainId":1,"address":"0xec67005c4e498ec7f55e092bd1d35cbc47c91892","name":"Enzyme","symbol":"MLN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/605/thumb/Enzyme_Icon_Secondary.png?1611576629"},{"chainId":1,"address":"0xcb94be6f13a1182e4a4b6140cb7bf2025d28e41b","name":"WeTrust","symbol":"TRST","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/645/thumb/wetrust.png?1547034370"},{"chainId":1,"address":"0x607f4c5bb672230e8672085532f7e901544a7375","name":"iExec RLC","symbol":"RLC","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/646/thumb/pL1VuXm.png?1604543202"},{"chainId":1,"address":"0x667088b212ce3d06a1b553a7221e1fd19000d9af","name":"Wings","symbol":"WINGS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/648/thumb/wings.png?1548760631"},{"chainId":1,"address":"0x6810e776880c02933d47db1b9fc05908e5386b96","name":"Gnosis","symbol":"GNO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/662/thumb/logo_square_simple_300px.png?1609402668"},{"chainId":1,"address":"0xaaaf91d9b90df800df4f55c205fd6989c977e73a","name":"Monolith","symbol":"TKN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/675/thumb/Monolith.png?1566296607"},{"chainId":1,"address":"0x0d8775f648430679a709e98d2b0cb6250d2887ef","name":"Basic Attention Tok","symbol":"BAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/677/thumb/basic-attention-token.png?1547034427"},{"chainId":1,"address":"0xa117000000f279d81a1d3cc75430faa017fa5a2e","name":"Aragon","symbol":"ANT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/681/thumb/JelZ58cv_400x400.png?1601449653"},{"chainId":1,"address":"0xf7b098298f7c69fc14610bf71d5e02c60792894c","name":"Guppy","symbol":"GUP","decimals":3,"logoURI":"https://assets.coingecko.com/coins/images/683/thumb/matchpool.png?1547034437"},{"chainId":1,"address":"0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374","name":"Veritaseum","symbol":"VERI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/695/thumb/veritaseum.png?1547034460"},{"chainId":1,"address":"0x426ca1ea2406c07d75db9585f22781c096e3d0e0","name":"Minereum","symbol":"MNE","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/702/thumb/mne.png?1587615060"},{"chainId":1,"address":"0x1f573d6fb3f13d689ff844b4ce37794d79a7ff1c","name":"Bancor Network Toke","symbol":"BNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/736/thumb/bancor.png?1547034477"},{"chainId":1,"address":"0x8ae4bf2c33a8e667de34b54938b0ccd03eb8cc06","name":"Patientory","symbol":"PTOY","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/746/thumb/patientory.png?1548330777"},{"chainId":1,"address":"0x1776e1f26f98b1a5df9cd347953a26dd3cb46671","name":"Numeraire","symbol":"NMR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/752/thumb/numeraire.png?1592538976"},{"chainId":1,"address":"0xd4fa1460f537bb9085d22c7bccb5dd450ef28e3a","name":"Populous","symbol":"PPT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/753/thumb/populous.png?1548331905"},{"chainId":1,"address":"0x4cf89ca06ad997bc732dc876ed2a7f26a9e7f361","name":"Mysterium","symbol":"MYST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/757/thumb/mysterium.png?1547034503"},{"chainId":1,"address":"0x419d0d8bdd9af5e606ae2232ed285aff190e711b","name":"FunFair","symbol":"FUN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/761/thumb/funfair.png?1592404368"},{"chainId":1,"address":"0xf433089366899d83a9f26a773d59ec7ecf30355e","name":"Metal","symbol":"MTL","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/763/thumb/Metal.png?1592195010"},{"chainId":1,"address":"0x0affa06e7fbe5bc9a764c979aa66e8256a631f02","name":"Polybius","symbol":"PLBT","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/766/thumb/polybius.png?1547034516"},{"chainId":1,"address":"0xb97048628db6b661d4c2aa833e95dbe1a905b280","name":"TenX","symbol":"PAY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/775/thumb/TenX-Icon-CircleBlack.png?1553766360"},{"chainId":1,"address":"0xd26114cd6ee289accf82350c8d8487fedb8a0c07","name":"OMG Network","symbol":"OMG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/776/thumb/OMG_Network.jpg?1591167168"},{"chainId":1,"address":"0x744d70fdbe2ba4cf95131626614a1763df805b9e","name":"Status","symbol":"SNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/779/thumb/status.png?1548610778"},{"chainId":1,"address":"0x41e5560054824ea6b0732e656e3ad64e20e94e45","name":"Civic","symbol":"CVC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/788/thumb/civic.png?1547034556"},{"chainId":1,"address":"0x5af2be193a6abca9c8817001f45744777db30756","name":"Voyager Token","symbol":"VGX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/794/thumb/Voyager-vgx.png?1575693595"},{"chainId":1,"address":"0x7c5a0ce9267ed19b22f8cae653f198e3e8daf098","name":"Santiment Network T","symbol":"SAN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/797/thumb/santiment-network-token.png?1547034571"},{"chainId":1,"address":"0xe3818504c1b32bf1557b16c238b2e01fd3149c17","name":"Pillar","symbol":"PLR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/809/thumb/PLR_Token.png?1595237935"},{"chainId":1,"address":"0xfca47962d45adfdfd1ab2d972315db4ce7ccf094","name":"iXledger","symbol":"IXT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/814/thumb/ixledger.png?1547034602"},{"chainId":1,"address":"0x68aa3f232da9bdc2343465545794ef3eea5209bd","name":"Mothership","symbol":"MSP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/815/thumb/mothership.png?1547034603"},{"chainId":1,"address":"0xade00c28244d5ce17d72e40330b1c318cd12b7c3","name":"AdEx","symbol":"ADX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/847/thumb/adex.png?1547034643"},{"chainId":1,"address":"0xf8e386eda857484f5a12e4b5daa9984e06e73705","name":"Indorse","symbol":"IND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/848/thumb/indorse_token.png?1547034644"},{"chainId":1,"address":"0x0abdace70d3790235af448c88547603b945604ea","name":"district0x","symbol":"DNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/849/thumb/district0x.png?1547223762"},{"chainId":1,"address":"0x08d32b0da63e2c3bcf8019c9c5d849d7a9d791e6","name":"Dentacoin","symbol":"DCN","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/850/thumb/dentacoin.png?1547034647"},{"chainId":1,"address":"0xe41d2489571d322189246dafa5ebde1f4699f498","name":"0x","symbol":"ZRX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/863/thumb/0x.png?1547034672"},{"chainId":1,"address":"0x514910771af9ca656af840dff83e8264ecf986ca","name":"Chainlink","symbol":"LINK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/877/thumb/chainlink-new-logo.png?1547034700"},{"chainId":1,"address":"0x0f5d2fb29fb7d3cfee444a200298f468908cc942","name":"Decentraland","symbol":"MANA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/878/thumb/decentraland-mana.png?1550108745"},{"chainId":1,"address":"0xc0eb85285d83217cd7c891702bcbc0fc401e2d9d","name":"Hiveterminal token","symbol":"HVN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/899/thumb/Hiveterminal_token.jpg?1547034726"},{"chainId":1,"address":"0x0d88ed6e74bbfd96b831231638b66c05571e824f","name":"Aventus","symbol":"AVT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/901/thumb/Aventus_Vertical_Logo_Dark_1500px.png?1612494414"},{"chainId":1,"address":"0x0e0989b1f9b8a38983c2ba8053269ca62ec9b195","name":"Po et","symbol":"POE","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/910/thumb/poet.png?1548331583"},{"chainId":1,"address":"0xbbbbca6a901c926f240b89eacb641d8aec7aeafd","name":"Loopring","symbol":"LRC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/913/thumb/LRC.png?1572852344"},{"chainId":1,"address":"0x08f5a9235b08173b7569f83645d2c7fb55e8ccd8","name":"Tierion","symbol":"TNT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/923/thumb/tierion.png?1547034767"},{"chainId":1,"address":"0xdd974d5c2e2928dea5f71b9825b8b646686bd200","name":"Kyber Network","symbol":"KNC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/947/thumb/kyber-logo.png?1547034806"},{"chainId":1,"address":"0xe8ff5c9c75deb346acac493c463c8950be03dfba","name":"VIBE","symbol":"VIBE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/948/thumb/vibe.png?1547034809"},{"chainId":1,"address":"0xb64ef51c888972c908cfacf59b47c1afbc0ab8ac","name":"Storj","symbol":"STORJ","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/949/thumb/storj.png?1547034811"},{"chainId":1,"address":"0xe814aee960a85208c3db542c53e7d4a6c8d5f60f","name":"Chronologic","symbol":"DAY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/951/thumb/Chronologic-network.png?1547034815"},{"chainId":1,"address":"0x4156d3342d5c385a87d264f90653733592000581","name":"SALT","symbol":"SALT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/962/thumb/salt.png?1548608746"},{"chainId":1,"address":"0xc96df921009b790dffca412375251ed1a2b75c60","name":"Ormeus Coin","symbol":"ORME","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/964/thumb/ORMEUS_logo.png?1606557243"},{"chainId":1,"address":"0xc12d1c73ee7dc3615ba4e37e4abfdbddfa38907e","name":"KickToken","symbol":"KICK","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/981/thumb/kick.png?1568643013"},{"chainId":1,"address":"0xa8006c4ca56f24d6836727d106349320db7fef82","name":"Internxt","symbol":"INXT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/986/thumb/round.png?1602484873"},{"chainId":1,"address":"0xdd6c68bb32462e01705011a4e2ad1a60740f217f","name":"Hubii Network","symbol":"HBT","decimals":15,"logoURI":"https://assets.coingecko.com/coins/images/994/thumb/hubii-network.png?1547744064"},{"chainId":1,"address":"0xf3db5fa2c66b7af3eb0c0b782510816cbe4813b8","name":"Everex","symbol":"EVX","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/997/thumb/everex.png?1548125695"},{"chainId":1,"address":"0xc42209accc14029c1012fb5680d95fbd6036e2a0","name":"PayPie","symbol":"PPP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/999/thumb/paypie.png?1548330825"},{"chainId":1,"address":"0xea610b1153477720748dc13ed378003941d84fab","name":"ALIS","symbol":"ALIS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1003/thumb/alis.png?1547034909"},{"chainId":1,"address":"0xba2184520a1cc49a6159c57e61e1844e085615b6","name":"HelloGold","symbol":"HGT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1005/thumb/hellogold.png?1547743862"},{"chainId":1,"address":"0xd4c435f5b09f855c3317c8524cb1f586e42795fa","name":"Cindicator","symbol":"CND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1006/thumb/cindicator.png?1547034913"},{"chainId":1,"address":"0xf0ee6b27b759c9893ce4f094b49ad28fd15a23e4","name":"Enigma","symbol":"ENG","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1007/thumb/enigma-logo.png?1547034914"},{"chainId":1,"address":"0xced4e93198734ddaff8492d525bd258d49eb388e","name":"Eidoo","symbol":"EDO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1018/thumb/mark-color-onBright.png?1557386214"},{"chainId":1,"address":"0x27054b13b1b798b345b591a4d22e6562d47ea75a","name":"AirSwap","symbol":"AST","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/1019/thumb/AST.png?1547034939"},{"chainId":1,"address":"0x7d4b8cce0591c9044a22ee543533b72e976e36c3","name":"Change","symbol":"CAG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1021/thumb/200x200.png?1610766224"},{"chainId":1,"address":"0x8f8221afbb33998d8584a2b05749ba73c37a938a","name":"Request","symbol":"REQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1031/thumb/Request_icon.png?1550832088"},{"chainId":1,"address":"0x539efe69bcdd21a83efd9122571a64cc25e0282b","name":"Blue Protocol","symbol":"BLUE","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1036/thumb/blue-protocol.jpg?1547034969"},{"chainId":1,"address":"0x957c30ab0426e0c93cd8241e2c60392d08c6ac8e","name":"Modum","symbol":"MOD","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/1040/thumb/modum.png?1548085261"},{"chainId":1,"address":"0x4dc3643dbc642b72c158e7f3d2ff232df61cb6ce","name":"Ambrosus","symbol":"AMB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1041/thumb/_nSEjidJ_400x400.jpg?1593158410"},{"chainId":1,"address":"0xe469c4473af82217b30cf17b10bcdb6c8c796e75","name":"EXRNchain","symbol":"EXRN","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/1049/thumb/exrnchain.png?1547395257"},{"chainId":1,"address":"0xf970b8e36e23f7fc3fd752eea86f8be8d83375a6","name":"Ripio Credit Networ","symbol":"RCN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1057/thumb/ripio-credit-network.png?1548608361"},{"chainId":1,"address":"0xac3211a5025414af2866ff09c23fc18bc97e79b1","name":"Dovu","symbol":"DOV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1072/thumb/dovu.png?1547035027"},{"chainId":1,"address":"0xefd720c94659f2ccb767809347245f917a145ed8","name":"Quoxent","symbol":"QUO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1084/thumb/Quoxent_Logo_Final_-_NO_TEXT.png?1581412910"},{"chainId":1,"address":"0xf629cbd94d3791c9250152bd8dfbdf380e2a3b9c","name":"Enjin Coin","symbol":"ENJ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1102/thumb/enjin-coin-logo.png?1547035078"},{"chainId":1,"address":"0x595832f8fc6bf59c85c527fec3740a1b7a361269","name":"Power Ledger","symbol":"POWR","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/1104/thumb/power-ledger.png?1547035082"},{"chainId":1,"address":"0x12b19d3e2ccc14da04fae33e63652ce469b3f2fd","name":"GridPlus","symbol":"GRID","decimals":12,"logoURI":"https://assets.coingecko.com/coins/images/1106/thumb/grid.png?1547743150"},{"chainId":1,"address":"0x78b7fada55a64dd895d8c8c35779dd8b67fa8a05","name":"Atlant","symbol":"ATL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1108/thumb/atlant.png?1547035089"},{"chainId":1,"address":"0x0cf0ee63788a0849fe5297f3407f701e122cc023","name":"Streamr DATAcoin","symbol":"DATA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1115/thumb/streamr.png?1547035101"},{"chainId":1,"address":"0xc813ea5e3b48bebeedb796ab42a30c5599b01740","name":"Autonio","symbol":"NIOX","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/1122/thumb/NewLogo.png?1597298450"},{"chainId":1,"address":"0x0c37bcf456bc661c14d596683325623076d7e283","name":"Aeron","symbol":"ARNX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1124/thumb/ARNX-token-logo-256x256.png?1602652111"},{"chainId":1,"address":"0x255aa6df07540cb5d3d297f0d0d4d84cb52bc8e6","name":"Raiden Network Toke","symbol":"RDN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1132/thumb/raiden-logo.jpg?1547035131"},{"chainId":1,"address":"0xc3761eb917cd790b30dad99f6cc5b4ff93c4f9ea","name":"ERC20","symbol":"ERC20","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1141/thumb/erc20.png?1547035146"},{"chainId":1,"address":"0x3597bfd533a99c9aa083587b074434e61eb0a258","name":"Dent","symbol":"DENT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1152/thumb/gLCEA2G.png?1604543239"},{"chainId":1,"address":"0xf4134146af2d511dd5ea8cdb1c4ac88c57d60404","name":"SunContract","symbol":"SNC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1166/thumb/suncontract.png?1548611174"},{"chainId":1,"address":"0xea097a2b1db00627b2fa17460ad260c016016977","name":"Upfiring","symbol":"UFR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1170/thumb/upfiring.png?1548759693"},{"chainId":1,"address":"0x103c3a209da59d3e7c4a89307e66521e081cfdf0","name":"Genesis Vision","symbol":"GVT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1173/thumb/Genesis-vision.png?1558045005"},{"chainId":1,"address":"0xef6344de1fcfc5f48c30234c16c1389e8cdc572c","name":"EncrypGen","symbol":"DNA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1215/thumb/encrypgen.png?1547393601"},{"chainId":1,"address":"0x99ea4db9ee77acd40b119bd1dc4e33e1c070b80d","name":"Quantstamp","symbol":"QSP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1219/thumb/0_E0kZjb4dG4hUnoDD_.png?1604815917"},{"chainId":1,"address":"0x55648de19836338549130b1af587f16bea46f66b","name":"Pebbles","symbol":"PBL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1224/thumb/publica.png?1548607428"},{"chainId":1,"address":"0x42d6622dece394b54999fbd73d108123806f6a18","name":"SpankChain","symbol":"SPANK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1226/thumb/spankchain.png?1548610811"},{"chainId":1,"address":"0x177d39ac676ed1c67a2b268ad7f1e58826e5b0af","name":"Blox","symbol":"CDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1231/thumb/Blox_Staking_Logo_2.png?1609117544"},{"chainId":1,"address":"0x2e071d2966aa7d8decb1005885ba1977d6038a65","name":"Etheroll","symbol":"DICE","decimals":16,"logoURI":"https://assets.coingecko.com/coins/images/1232/thumb/etheroll.png?1548125481"},{"chainId":1,"address":"0x5d60d8d7ef6d37e16ebabc324de3be57f135e0bc","name":"MyBit Token","symbol":"MYB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1240/thumb/mybit.png?1547035264"},{"chainId":1,"address":"0xd8912c10681d8b21fd3742244f44658dba12264e","name":"Pluton","symbol":"PLU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1241/thumb/pluton.png?1548331624"},{"chainId":1,"address":"0xf04a8ac553fcedb5ba99a64799155826c136b0be","name":"Flixxo","symbol":"FLIXX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1261/thumb/flixxo.png?1547483809"},{"chainId":1,"address":"0xd341d1680eeee3255b8c4c75bcce7eb57f144dae","name":"SoMee Social","symbol":"ONG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1286/thumb/So_Mee_logo_icons_11.png?1581305902"},{"chainId":1,"address":"0x419c4db4b9e25d6db2ad9691ccb832c8d9fda05e","name":"Dragonchain","symbol":"DRGN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1289/thumb/dragonchain.png?1547957761"},{"chainId":1,"address":"0xec213f83defb583af3a000b1c0ada660b1902a0f","name":"Presearch","symbol":"PRE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1299/thumb/presearch.png?1548331942"},{"chainId":1,"address":"0xbdc5bac39dbe132b1e030e898ae3830017d7d969","name":"Snovian Space","symbol":"SNOV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1330/thumb/logo2.png?1547035355"},{"chainId":1,"address":"0x8806926ab68eb5a7b909dcaf6fdbe5d93271d6e2","name":"Uquid Coin","symbol":"UQC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1341/thumb/uquid-coin.png?1548759712"},{"chainId":1,"address":"0x66186008c1050627f979d464eabb258860563dbe","name":"MediShares","symbol":"MDS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1343/thumb/medishares.png?1547978625"},{"chainId":1,"address":"0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2","name":"Maker","symbol":"MKR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1364/thumb/Mark_Maker.png?1585191826"},{"chainId":1,"address":"0x80fb784b7ed66730e8b1dbd9820afd29931aab03","name":"Aave OLD ","symbol":"LEND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1365/thumb/ethlend.png?1547394586"},{"chainId":1,"address":"0x2c4e8f2d746113d0696ce89b35f0d8bf88e0aeca","name":"OST","symbol":"OST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1367/thumb/ost.jpg?1547035393"},{"chainId":1,"address":"0xbe9375c6a420d2eeb258962efb95551a5b722803","name":"StormX","symbol":"STMX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1369/thumb/StormX.png?1603113002"},{"chainId":1,"address":"0xbf2179859fc6d5bee9bf9158632dc51678a4100e","name":"elf","symbol":"ELF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1371/thumb/aelf-logo.png?1547035397"},{"chainId":1,"address":"0x558ec3152e2eb2174905cd19aea4e34a23de9ad6","name":"Bread","symbol":"BRD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1440/thumb/bread.png?1547563238"},{"chainId":1,"address":"0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359","name":"Sai","symbol":"SAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1442/thumb/dai.png?1547035520"},{"chainId":1,"address":"0xf70a642bd387f94380ffb90451c2c81d4eb82cbc","name":"Starbase","symbol":"STAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1449/thumb/starbase.png?1548610771"},{"chainId":1,"address":"0x0af44e2784637218dd1d32a322d44e603a8f0c6a","name":"MATRYX","symbol":"MTX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1495/thumb/matryx.png?1547978542"},{"chainId":1,"address":"0x4fbb350052bca5417566f188eb2ebce5b19bc964","name":"RigoBlock","symbol":"GRG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1532/thumb/Symbol-RigoblockRGB.png?1547035682"},{"chainId":1,"address":"0x63e634330a20150dbb61b15648bc73855d6ccf07","name":"Blocklancer","symbol":"LNC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1540/thumb/blocklancer.png?1547351104"},{"chainId":1,"address":"0x245ef47d4d0505ecf3ac463f4d81f41ade8f1fd1","name":"Nuggets","symbol":"NUG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1543/thumb/nuggets.png?1548329505"},{"chainId":1,"address":"0x9f599410d207f3d2828a8712e5e543ac2e040382","name":"Tapcoin","symbol":"TTT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1580/thumb/tapcoin.png?1547035760"},{"chainId":1,"address":"0x1234567461d3f8db7496581774bd869c83d51c93","name":"BitClave","symbol":"CAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1585/thumb/bitclave.png?1547035768"},{"chainId":1,"address":"0x2859021ee7f2cb10162e67f33af2d22764b31aff","name":"Silent Notary","symbol":"SNTR","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/1599/thumb/silent-notary.png?1548609544"},{"chainId":1,"address":"0x990e081a7b7d3ccba26a2f49746a68cc4ff73280","name":"KStarCoin","symbol":"KSC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1630/thumb/ksc.png?1547035850"},{"chainId":1,"address":"0x1961b3331969ed52770751fc718ef530838b6dee","name":"BitDegree","symbol":"BDG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1653/thumb/bitdegree.jpg?1547035900"},{"chainId":1,"address":"0x446c9033e7516d820cc9a2ce2d0b7328b579406f","name":"SOLVE","symbol":"SOLVE","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1768/thumb/Solve.Token_logo_200_200_wiyhout_BG.png?1575869846"},{"chainId":1,"address":"0x4a42d2c580f83dce404acad18dab26db11a1750e","name":"Relex","symbol":"RLX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1799/thumb/relex.jpg?1547036103"},{"chainId":1,"address":"0xf3db7560e820834658b590c96234c333cd3d5e5e","name":"CoinPoker","symbol":"CHP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1808/thumb/coinpoker.jpg?1547036113"},{"chainId":1,"address":"0xdc9ac3c20d1ed0b540df9b1fedc10039df13f99c","name":"UTRUST","symbol":"UTK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1824/thumb/300x300_logo.png?1570520533"},{"chainId":1,"address":"0x6710c63432a2de02954fc0f851db07146a6c0312","name":"Smart MFG","symbol":"MFG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1842/thumb/mfg-logo.png?1608131645"},{"chainId":1,"address":"0x68d57c9a1c35f63e2c83ee8e49a64e9d70528d25","name":"Sirin Labs Token","symbol":"SRN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1872/thumb/sirin-labs-token.png?1548609584"},{"chainId":1,"address":"0xaa7a9ca87d3694b5755f213b5d04094b8d0f0a6f","name":"OriginTrail","symbol":"TRAC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1877/thumb/origintrail.jpg?1605694415"},{"chainId":1,"address":"0x467bccd9d29f223bce8043b84e8c8b282827790f","name":"Telcoin","symbol":"TEL","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/1899/thumb/tel.png?1547036203"},{"chainId":1,"address":"0x749826f1041caf0ea856a4b3578ba327b18335f8","name":"TIG Token","symbol":"TIG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1903/thumb/tigereum.png?1548758748"},{"chainId":1,"address":"0x910dfc18d6ea3d6a7124a6f8b5458f281060fa4c","name":"X8X Token","symbol":"X8X","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1912/thumb/x8x.png?1547036213"},{"chainId":1,"address":"0x2167fb82309cf76513e83b25123f8b0559d6b48f","name":"CoinLion","symbol":"LION","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1917/thumb/coinlion.png?1547036216"},{"chainId":1,"address":"0x8a854288a5976036a725879164ca3e91d30c6a1b","name":"GET Protocol","symbol":"GET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1927/thumb/GET_Protocol.png?1552893230"},{"chainId":1,"address":"0xd559f20296ff4895da39b5bd9add54b442596a61","name":"FintruX","symbol":"FTX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1928/thumb/token-500x500.png?1547036223"},{"chainId":1,"address":"0x83cee9e086a77e492ee0bb93c2b0437ad6fdeccc","name":"Goldmint","symbol":"MNTP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1944/thumb/goldmint.png?1547743002"},{"chainId":1,"address":"0xada86b1b313d1d5267e3fc0bb303f0a2b66d0ea7","name":"Covesting","symbol":"COV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1950/thumb/covesting.png?1547036237"},{"chainId":1,"address":"0xacfa209fb73bf3dd5bbfb1101b9bc999c49062a5","name":"BCdiploma EvidenZ","symbol":"BCDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2014/thumb/evidenz-512.png?1594871754"},{"chainId":1,"address":"0xa5fd1a791c4dfcaacc963d4f73c6ae5824149ea7","name":"Jibrel Network","symbol":"JNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2016/thumb/Capture.PNG?1547036293"},{"chainId":1,"address":"0x4cc19356f2d37338b9802aa8e8fc58b0373296e7","name":"SelfKey","symbol":"KEY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2034/thumb/selfkey.png?1548608934"},{"chainId":1,"address":"0x4ac00f287f36a6aad655281fe1ca6798c9cb727b","name":"GazeCoin","symbol":"GZE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2035/thumb/gazecoin.png?1547742556"},{"chainId":1,"address":"0x7d29a64504629172a429e64183d6673b9dacbfce","name":"Vectorspace AI","symbol":"VXV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2063/thumb/vectorspace-ai-logo.jpeg?1547036362"},{"chainId":1,"address":"0xbb1fa4fdeb3459733bf67ebc6f893003fa976a82","name":"Pangea Arbitration ","symbol":"XPAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2070/thumb/Pangea-Arbitration-Token-Logo.png?1547036374"},{"chainId":1,"address":"0xb4efd85c19999d84251304bda99e90b92300bd93","name":"Rocket Pool","symbol":"RPL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2090/thumb/rocket.png?1563781948"},{"chainId":1,"address":"0x26e75307fc0c021472feb8f727839531f112f317","name":"CRYPTO20","symbol":"C20","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2097/thumb/c20.png?1547036413"},{"chainId":1,"address":"0xd3fb5cabd07c85395667f83d20b080642bde66c7","name":"Ammbr","symbol":"AMR","decimals":16,"logoURI":"https://assets.coingecko.com/coins/images/2100/thumb/ammbr.png?1547036418"},{"chainId":1,"address":"0x78b039921e84e726eb72e7b1212bb35504c645ca","name":"Sether","symbol":"SETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2101/thumb/sether.png?1548609212"},{"chainId":1,"address":"0xd0929d411954c47438dc1d871dd6081f5c5e149c","name":"Refereum","symbol":"RFR","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/2102/thumb/refereum.png?1548608001"},{"chainId":1,"address":"0x554ffc77f4251a9fb3c0e3590a6a205f8d4e067d","name":"ZMINE","symbol":"ZMN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2103/thumb/zmn.png?1547036420"},{"chainId":1,"address":"0x0e8d6b471e332f140e7d9dbb99e5e3822f728da6","name":"Abyss","symbol":"ABYSS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2105/thumb/NrFmpxs.png?1600318377"},{"chainId":1,"address":"0x2604fa406be957e542beb89e6754fcde6815e83f","name":"PlayKey","symbol":"PKT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2116/thumb/playkey.png?1548331394"},{"chainId":1,"address":"0xba9d4199fab4f26efe3551d490e3821486f135ba","name":"SwissBorg","symbol":"CHSB","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/2117/thumb/YJUrRy7r_400x400.png?1589794215"},{"chainId":1,"address":"0x8eb24319393716668d768dcec29356ae9cffe285","name":"SingularityNET","symbol":"AGI","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/2138/thumb/singularitynet.png?1548609559"},{"chainId":1,"address":"0x83984d6142934bb535793a82adb0a46ef0f66b6d","name":"Remme","symbol":"REM","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/2152/thumb/semme.png?1561622861"},{"chainId":1,"address":"0xc27a2f05fa577a83ba0fdb4c38443c0718356501","name":"Lamden","symbol":"TAU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2155/thumb/Lamden_Logo_2020_-_White_w_Black_Borders.png?1597732013"},{"chainId":1,"address":"0xc12d099be31567add4e4e4d0d45691c3f58f5663","name":"Auctus","symbol":"AUC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2165/thumb/Auctus.png?1593479271"},{"chainId":1,"address":"0xa15c7ebe1f07caf6bff097d8a589fb8ac49ae5b3","name":"Pundi X","symbol":"NPXS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2170/thumb/pundi-x.png?1548386366"},{"chainId":1,"address":"0x6781a0f84c7e9e846dcb84a9a5bd49333067b104","name":"Zap","symbol":"ZAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2180/thumb/zap.png?1547036476"},{"chainId":1,"address":"0xc666081073e8dff8d3d1c2292a29ae1a2153ec09","name":"Digitex Token","symbol":"DGTX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2188/thumb/DGTX_coin_icon.png?1606869511"},{"chainId":1,"address":"0x45245bc59219eeaaf6cd3f382e078a461ff9de7b","name":"BANKEX","symbol":"BKX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2199/thumb/cEG4Vgx.png?1547036488"},{"chainId":1,"address":"0x0ebb614204e47c09b6c3feb9aaecad8ee060e23e","name":"Cryptopay","symbol":"CPAY","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/2216/thumb/cryptopay.png?1547036499"},{"chainId":1,"address":"0x27f610bf36eca0939093343ac28b1534a721dbb4","name":"WandX","symbol":"WAND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2219/thumb/wandx.png?1548760294"},{"chainId":1,"address":"0xe477292f1b3268687a29376116b0ed27a9c76170","name":"HEROcoin","symbol":"PLAY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2221/thumb/herocoin.png?1547744781"},{"chainId":1,"address":"0x5adc961d6ac3f7062d2ea45fefb8d8167d44b190","name":"Dether","symbol":"DTH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2231/thumb/dether.png?1547036510"},{"chainId":1,"address":"0xdd16ec0f66e54d453e6756713e533355989040e4","name":"Tokenomy","symbol":"TEN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2286/thumb/logo_%281%29.png?1604543144"},{"chainId":1,"address":"0x846c66cf71c43f80403b51fe3906b3599d63336f","name":"PumaPay","symbol":"PMA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2307/thumb/pumapay.png?1548607436"},{"chainId":1,"address":"0x2ab6bb8408ca3199b8fa6c92d5b455f820af03c4","name":"TE FOOD","symbol":"TONE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2325/thumb/tec.png?1547036538"},{"chainId":1,"address":"0x0bb217e40f8a5cb79adf04e1aab60e5abd0dfc1e","name":"SWFT Blockchain","symbol":"SWFTC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/2346/thumb/QJB0PBHu_400x400.jpg?1565564254"},{"chainId":1,"address":"0x0a50c93c762fdd6e56d86215c24aaad43ab629aa","name":"LGO Token","symbol":"LGO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/2353/thumb/2_JNnfVRPMBuA1hwnRubH72A.png?1595311622"},{"chainId":1,"address":"0x2467aa6b5a2351416fd4c3def8462d841feeecec","name":"qiibee","symbol":"QBX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2365/thumb/qbx-icon-dark.png?1554082393"},{"chainId":1,"address":"0x737f98ac8ca59f2c68ad658e3c3d8c8963e40a4c","name":"Amon","symbol":"AMN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2369/thumb/amon.png?1547036554"},{"chainId":1,"address":"0x7b0c06043468469967dba22d1af33d77d44056c8","name":"Morpheus Network","symbol":"MRPH","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/2379/thumb/MRPH_.png?1612252243"},{"chainId":1,"address":"0xe61fdaf474fac07063f2234fb9e60c1163cfa850","name":"Coin","symbol":"COIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2394/thumb/coin.png?1606626874"},{"chainId":1,"address":"0x814e0908b12a99fecf5bc101bb5d0b8b5cdf7d26","name":"Measurable Data Tok","symbol":"MDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2441/thumb/mdt_logo.png?1569813574"},{"chainId":1,"address":"0x584b44853680ee34a0f337b712a8f66d816df151","name":"AI Doctor","symbol":"AIDOC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2449/thumb/aidoc.png?1547036587"},{"chainId":1,"address":"0x28dee01d53fed0edf5f6e310bf8ef9311513ae40","name":"BlitzPredict","symbol":"XBP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2458/thumb/BlitzPredict.jpg?1547701183"},{"chainId":1,"address":"0x922ac473a3cc241fd3a0049ed14536452d58d73c","name":"Vetri","symbol":"VLD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2476/thumb/vld.png?1547036599"},{"chainId":1,"address":"0x26db5439f651caf491a87d48799da81f191bdb6b","name":"Casino Betting Coin","symbol":"CBC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/2477/thumb/Elj3BV73_400x400.jpg?1605753220"},{"chainId":1,"address":"0xfc05987bd2be489accf0f509e44b0145d68240f7","name":"Essentia","symbol":"ESS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2483/thumb/Essentia-token.jpg?1547036604"},{"chainId":1,"address":"0x8727c112c712c4a03371ac87a74dd6ab104af768","name":"Jetcoin","symbol":"JET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2487/thumb/jetcoin.png?1547974820"},{"chainId":1,"address":"0xf83301c5cd1ccbb86f466a6b3c53316ed2f8465a","name":"COMSA","symbol":"CMS","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/2500/thumb/comsa-_xem_.png?1547036614"},{"chainId":1,"address":"0x264dc2dedcdcbb897561a57cba5085ca416fb7b4","name":"QunQun","symbol":"QUN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2546/thumb/qunqun.png?1547036662"},{"chainId":1,"address":"0x0f4ca92660efad97a9a70cb0fe969c755439772c","name":"Leverj","symbol":"LEV","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/2548/thumb/leverj.png?1547975721"},{"chainId":1,"address":"0x2c82c73d5b34aa015989462b2948cd616a37641f","name":"Spectre ai Utility ","symbol":"SXUT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2551/thumb/spectre-utility.png?1547036668"},{"chainId":1,"address":"0xf485c5e679238f9304d986bb2fc28fe3379200e5","name":"ugChain","symbol":"UGC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2557/thumb/ugchain.png?1548759478"},{"chainId":1,"address":"0x4092678e4e78230f46a1534c0fbc8fa39780892b","name":"Odyssey","symbol":"OCN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2559/thumb/ocn.png?1547036683"},{"chainId":1,"address":"0xb705268213d593b8fd88d3fdeff93aff5cbdcfae","name":"IDEX","symbol":"IDEX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2565/thumb/49046004.png?1557813562"},{"chainId":1,"address":"0x9af839687f6c94542ac5ece2e317daae355493a1","name":"Hydro Protocol","symbol":"HOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2570/thumb/Hydro-Protocol.png?1558069424"},{"chainId":1,"address":"0xe75ad3aab14e4b0df8c5da4286608dabb21bd864","name":"Acute Angle Cloud","symbol":"AAC","decimals":5,"logoURI":"https://assets.coingecko.com/coins/images/2577/thumb/acute-angle-cloud.png?1547036708"},{"chainId":1,"address":"0xb6ee9668771a79be7967ee29a63d4184f8097143","name":"CargoX","symbol":"CXO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2580/thumb/cargox.png?1547738832"},{"chainId":1,"address":"0xb056c38f6b7dc4064367403e26424cd2c60655e1","name":"CEEK Smart VR Token","symbol":"CEEK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2581/thumb/ceek-smart-vr-token-logo.png?1547036714"},{"chainId":1,"address":"0x20f7a3ddf244dc9299975b4da1c39f8d5d75f05a","name":"Sapien","symbol":"SPN","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/2596/thumb/Sapien_Token_450x450.png?1607560493"},{"chainId":1,"address":"0x69b148395ce0015c13e36bffbad63f49ef874e03","name":"DATA","symbol":"DTA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2604/thumb/data.png?1547036749"},{"chainId":1,"address":"0x653430560be843c4a3d143d0110e896c2ab8ac0d","name":"Molecular Future","symbol":"MOF","decimals":16,"logoURI":"https://assets.coingecko.com/coins/images/2607/thumb/molecular_future.png?1547036754"},{"chainId":1,"address":"0xf03f8d65bafa598611c3495124093c56e8f638f0","name":"View","symbol":"VIEW","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2608/thumb/view-token.png?1547036756"},{"chainId":1,"address":"0x3a92bd396aef82af98ebc0aa9030d25a23b11c6b","name":"Tokenbox","symbol":"TBX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2644/thumb/tokenbox.png?1547036822"},{"chainId":1,"address":"0x107c4504cd79c5d2696ea0030a8dd4e92601b82e","name":"Bloom","symbol":"BLT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2662/thumb/bloom.png?1547036854"},{"chainId":1,"address":"0x6c37bf4f042712c978a73e3fd56d1f5738dd7c43","name":"Elementeum","symbol":"ELET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2670/thumb/ELET.png?1558594342"},{"chainId":1,"address":"0xca0e7269600d353f70b14ad118a49575455c0f2f","name":"AMLT Network","symbol":"AMLT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2703/thumb/amlt.png?1563794756"},{"chainId":1,"address":"0x8400d94a5cb0fa0d041a3788e395285d61c9ee5e","name":"Unibright","symbol":"UBT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/2707/thumb/UnibrightLogo_colorful_500x500_preview.png?1547036916"},{"chainId":1,"address":"0x58c69ed6cd6887c0225d1fccecc055127843c69b","name":"HalalChain","symbol":"HLC","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/2737/thumb/halalchain.png?1547036938"},{"chainId":1,"address":"0xfae4ee59cdd86e3be9e8b90b53aa866327d7c090","name":"CPChain","symbol":"CPC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2760/thumb/cpchain.png?1547036953"},{"chainId":1,"address":"0xea5f88e54d982cbb0c441cde4e79bc305e5b43bc","name":"PARETO Rewards","symbol":"PARETO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2783/thumb/pareto.png?1547036965"},{"chainId":1,"address":"0x9992ec3cf6a55b00978cddf2b27bc6882d88d1ec","name":"Polymath Network","symbol":"POLY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2784/thumb/inKkF01.png?1605007034"},{"chainId":1,"address":"0x998b3b82bc9dba173990be7afb772788b5acb8bd","name":"Banca","symbol":"BANCA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2795/thumb/banca.png?1547036972"},{"chainId":1,"address":"0x464ebe77c293e473b48cfe96ddcf88fcf7bfdac0","name":"KRYLL","symbol":"KRL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2807/thumb/krl.png?1547036979"},{"chainId":1,"address":"0x55a290f08bb4cae8dcf1ea5635a3fcfd4da60456","name":"BITTO","symbol":"BITTO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2814/thumb/BITTO.jpg?1547036986"},{"chainId":1,"address":"0x6f259637dcd74c767781e37bc6133cd6a68aa161","name":"Huobi Token","symbol":"HT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2822/thumb/huobi-token-logo.png?1547036992"},{"chainId":1,"address":"0x9e46a38f5daabe8683e10793b06749eef7d733d1","name":"PolySwarm","symbol":"NCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2843/thumb/polyswarm.png?1548331600"},{"chainId":1,"address":"0x5732046a883704404f284ce41ffadd5b007fd668","name":"Bluzelle","symbol":"BLZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2848/thumb/bluzelle.png?1547351698"},{"chainId":1,"address":"0x41dbecc1cdc5517c6f76f6a6e836adbee2754de3","name":"Medicalchain","symbol":"MTN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2850/thumb/medicalchain.png?1547037019"},{"chainId":1,"address":"0x4bcea5e4d0f6ed53cf45e7a28febb2d3621d7438","name":"Modex","symbol":"MODEX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2851/thumb/LhWIeAg.png?1602566568"},{"chainId":1,"address":"0x87f56ee356b434187105b40f96b230f5283c0ab4","name":"Pitch","symbol":"PITCH","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/2855/thumb/pitch_token.jpg?1547037026"},{"chainId":1,"address":"0xcaaa93712bdac37f736c323c93d4d5fdefcc31cc","name":"CryptalDash","symbol":"CRD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2859/thumb/cryptaldash.png?1547037030"},{"chainId":1,"address":"0xe8a1df958be379045e2b46a31a98b93a2ecdfded","name":"EtherSportz","symbol":"ESZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2890/thumb/ethersportz.png?1547037061"},{"chainId":1,"address":"0xbbff862d906e348e9946bfb2132ecb157da3d4b4","name":"Sharder protocol","symbol":"SS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2921/thumb/sharder-200px.png?1595305234"},{"chainId":1,"address":"0x47bc01597798dcd7506dcca36ac4302fc93a8cfb","name":"Crowd Machine","symbol":"CMCT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/2967/thumb/crowd-machine.png?1547037212"},{"chainId":1,"address":"0x0947b0e6d821378805c9598291385ce7c791a6b2","name":"Lendingblock","symbol":"LND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2988/thumb/lnd.png?1518768584"},{"chainId":1,"address":"0xfd09911130e6930bf87f2b0554c44f400bd80d3e","name":"EthicHub","symbol":"ETHIX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3031/thumb/Logo_%284%29_%281%29.png?1613249824"},{"chainId":1,"address":"0x12f649a9e821f90bb143089a6e56846945892ffb","name":"Hyprr Howdoo ","symbol":"UDOO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3078/thumb/howdoo.png?1547744057"},{"chainId":1,"address":"0x36ac219f90f5a6a3c77f2a7b660e3cc701f68e25","name":"CoinMetro","symbol":"XCM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3125/thumb/xcm.png?1547037518"},{"chainId":1,"address":"0xd42debe4edc92bd5a3fbb4243e1eccf6d63a4a5d","name":"Carboneum","symbol":"C8","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3127/thumb/c8.png?1547037525"},{"chainId":1,"address":"0x408e41876cccdc0f92210600ef50372656052a38","name":"REN","symbol":"REN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3139/thumb/REN.png?1589985807"},{"chainId":1,"address":"0xbc86727e770de68b1060c91f6bb6945c73e10388","name":"Ink Protocol","symbol":"XNK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3156/thumb/ink-protocol.png?1547974056"},{"chainId":1,"address":"0x4a527d8fc13c5203ab24ba0944f4cb14658d1db6","name":"Morpheus Labs","symbol":"MITX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3164/thumb/mitx.png?1604888269"},{"chainId":1,"address":"0xb5dbc6d3cf380079df3b27135664b6bcf45d1869","name":"Project SHIVOM","symbol":"OMX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/3167/thumb/omx.png?1547037607"},{"chainId":1,"address":"0x954b890704693af242613edef1b603825afcd708","name":"Cardstack","symbol":"CARD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3247/thumb/cardstack.png?1547037769"},{"chainId":1,"address":"0xa3d58c4e56fedcae3a7c43a725aee9a71f0ece4e","name":"Metronome","symbol":"MET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3249/thumb/metronome.png?1548084800"},{"chainId":1,"address":"0xaaaebe6fe48e54f431b0c390cfaf0b017d09d42d","name":"Celsius Network","symbol":"CEL","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/3263/thumb/CEL_logo.png?1609598753"},{"chainId":1,"address":"0xa8c8cfb141a3bb59fea1e2ea6b79b5ecbcd7b6ca","name":"Syntropy","symbol":"NOIA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3269/thumb/Component_1.png?1608275724"},{"chainId":1,"address":"0x89020f0d5c5af4f3407eb5fe185416c457b0e93e","name":"Edenchain","symbol":"EDN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3292/thumb/Eden.png?1574126935"},{"chainId":1,"address":"0xdf2c7238198ad8b389666574f2d8bc411a4b7428","name":"Hifi Finance","symbol":"MFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3293/thumb/hifi_logo.png?1613102742"},{"chainId":1,"address":"0x8207c1ffc5b6804f6024322ccf34f29c3541ae26","name":"Origin Protocol","symbol":"OGN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3296/thumb/op.jpg?1547037878"},{"chainId":1,"address":"0xbcdfe338d55c061c084d81fd793ded00a27f226d","name":"Decentralized Machi","symbol":"DML","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3297/thumb/decentralized-machine-learning.png?1547037880"},{"chainId":1,"address":"0x4fe83213d56308330ec302a8bd641f1d0113a4cc","name":"NuCypher","symbol":"NU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3318/thumb/photo1198982838879365035.jpg?1547037916"},{"chainId":1,"address":"0x8ab7404063ec4dbcfd4598215992dc3f8ec853d7","name":"Akropolis","symbol":"AKRO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3328/thumb/Akropolis.png?1547037929"},{"chainId":1,"address":"0xdb0acc14396d108b3c5574483acb817855c9dc8d","name":"Overline Emblem","symbol":"EMB","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/3335/thumb/Emblem.jpg?1613379262"},{"chainId":1,"address":"0x4946fcea7c692606e8908002e55a582af44ac121","name":"FOAM","symbol":"FOAM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3345/thumb/K51lJQc.png?1547037959"},{"chainId":1,"address":"0x6c6ee5e31d828de241282b9606c8e98ea48526e2","name":"Holo","symbol":"HOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3348/thumb/Holologo_Profile.png?1547037966"},{"chainId":1,"address":"0x5d48f293baed247a2d0189058ba37aa238bd4725","name":"NeuroChain","symbol":"NCC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3367/thumb/neurochain.png?1548085917"},{"chainId":1,"address":"0xc86d054809623432210c107af2e3f619dcfbf652","name":"Sentinel Protocol","symbol":"UPP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3369/thumb/Sentinel_Protocol.jpg?1547700074"},{"chainId":1,"address":"0x4a220e6096b25eadb88358cb44068a3248254675","name":"Quant","symbol":"QNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3370/thumb/5ZOu7brX_400x400.jpg?1612437252"},{"chainId":1,"address":"0x85eee30c52b0b379b046fb0f85f4f3dc3009afec","name":"Keep Network","symbol":"KEEP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3373/thumb/IuNzUb5b_400x400.jpg?1589526336"},{"chainId":1,"address":"0x5cf04716ba20127f1e2297addcf4b5035000c9eb","name":"NKN","symbol":"NKN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3375/thumb/nkn.png?1548329212"},{"chainId":1,"address":"0xa4e8c3ec456107ea67d3075bf9e3df3a75823db0","name":"Loom Network","symbol":"LOOM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3387/thumb/1_K76UVoLq-FOL7l-_Fag-Qw_2x.png?1547038040"},{"chainId":1,"address":"0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f","name":"Synthetix Network T","symbol":"SNX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3406/thumb/SNX.png?1598631139"},{"chainId":1,"address":"0x1122b6a0e00dce0563082b6e2953f3a943855c1f","name":"Centrality","symbol":"CENNZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3408/thumb/logo.PNG?1547038083"},{"chainId":1,"address":"0xd49ff13661451313ca1553fd6954bd1d9b6e02b9","name":"Electrify Asia","symbol":"ELEC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3415/thumb/d45b1d82743c749d05697da200179874.jpg?1547038096"},{"chainId":1,"address":"0xffe02ee4c69edf1b340fcad64fbd6b37a7b9e265","name":"NANJCOIN","symbol":"NANJ","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/3424/thumb/FDGC.png?1547038112"},{"chainId":1,"address":"0x6ba460ab75cd2c56343b3517ffeba60748654d26","name":"UpToken","symbol":"UP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/3425/thumb/uptoken.png?1548759702"},{"chainId":1,"address":"0x4730fb1463a6f1f44aeb45f6c5c422427f37f4d0","name":"4thpillar technolog","symbol":"FOUR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3434/thumb/fourtoken-symbol-256-256.png?1585742434"},{"chainId":1,"address":"0x41b3f18c6384dc9a39c33afeca60d9b8e61eaa9f","name":"Noah Decentralized ","symbol":"NOAHP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3442/thumb/FvG3XweD.png?1610437675"},{"chainId":1,"address":"0xfdbc1adc26f0f8f8606a5d63b7d3a3cd21c22b23","name":"1World","symbol":"1WO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/3443/thumb/unnamed.png?1547038151"},{"chainId":1,"address":"0x0000000000085d4780b73119b644ae5ecd22b376","name":"TrueUSD","symbol":"TUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3449/thumb/TUSD.png?1559172762"},{"chainId":1,"address":"0x01ff50f8b7f74e4f00580d9596cd3d0d6d6e326f","name":"BnkToTheFuture","symbol":"BFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3468/thumb/bnktothefuture.png?1547351865"},{"chainId":1,"address":"0xa849eaae994fb86afa73382e9bd88c2b6b18dc71","name":"MVL","symbol":"MVL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3476/thumb/mass-vehicle-ledger.png?1547978299"},{"chainId":1,"address":"0x543ff227f64aa17ea132bf9886cab5db55dcaddf","name":"DAOstack","symbol":"GEN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3479/thumb/gen.png?1547038215"},{"chainId":1,"address":"0xdf1d6405df92d981a2fb3ce68f6a03bac6c0e41f","name":"Verasity Old ","symbol":"VRA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3481/thumb/3mefBCd.png?1547038219"},{"chainId":1,"address":"0x4de2573e27e648607b50e1cfff921a33e4a34405","name":"Lendroid Support To","symbol":"LST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3485/thumb/lst-icon.png?1606992361"},{"chainId":1,"address":"0x723cbfc05e2cfcc71d3d89e770d32801a5eef5ab","name":"Bitcoin Pro","symbol":"BTCP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/3545/thumb/DSiD9ZhWsAE_8cS.png?1547038353"},{"chainId":1,"address":"0xcc80c051057b774cd75067dc48f8987c4eb97a5e","name":"Nectar","symbol":"NEC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3559/thumb/NecLogoLoad.png?1592795924"},{"chainId":1,"address":"0xd98f75b1a3261dab9eed4956c93f33749027a964","name":"ShareToken","symbol":"SHR","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/3609/thumb/74586729_2443914875881351_2785018663453851648_n.png?1574898410"},{"chainId":1,"address":"0xa44e5137293e855b1b7bc7e2c6f8cd796ffcb037","name":"Sentinel","symbol":"SENT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/3625/thumb/download_%287%29.png?1547038545"},{"chainId":1,"address":"0x076c97e1c869072ee22f8c91978c99b4bcb02591","name":"CommerceBlock Token","symbol":"CBT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3653/thumb/bb4WjF2.png?1547038622"},{"chainId":1,"address":"0xfe5f141bf94fe84bc28ded0ab966c16b17490657","name":"LibraToken","symbol":"LBA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3673/thumb/libra-credit.png?1547975828"},{"chainId":1,"address":"0xebbdf302c940c6bfd49c6b165f457fdb324649bc","name":"Hydro","symbol":"HYDRO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3678/thumb/Hydro-Blu-512.png?1547038669"},{"chainId":1,"address":"0xc528c28fec0a90c083328bc45f587ee215760a0f","name":"Endor Protocol Toke","symbol":"EDR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3683/thumb/0b805574-ef0d-41dc-b518-8d6148bf4716.png?1547038680"},{"chainId":1,"address":"0x967da4048cd07ab37855c090aaf366e4ce1b9f48","name":"Ocean Protocol","symbol":"OCEAN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3687/thumb/ocean-protocol-logo.jpg?1547038686"},{"chainId":1,"address":"0xb62132e35a6c13ee1ee0f84dc5d40bad8d815206","name":"NEXO","symbol":"NEXO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3695/thumb/nexo.png?1548086057"},{"chainId":1,"address":"0xd31695a1d35e489252ce57b129fd4b1b05e6acac","name":"TOKPIE","symbol":"TKP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3731/thumb/tokpie-200x200.png?1562207865"},{"chainId":1,"address":"0xaf1250fa68d7decd34fd75de8742bc03b29bd58e","name":"Invictus Hyperion F","symbol":"IHF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3747/thumb/ihp.png?1547038807"},{"chainId":1,"address":"0x608f006b6813f97097372d0d31fb0f11d1ca3e4e","name":"CryptoAds Marketpla","symbol":"CRAD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3761/thumb/crad.png?1547038854"},{"chainId":1,"address":"0xd29f0b5b3f50b07fe9a9511f7d86f4f4bac3f8c4","name":"Liquidity Network","symbol":"LQD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3801/thumb/liquidity-network.png?1547975994"},{"chainId":1,"address":"0x048fe49be32adfc9ed68c37d32b5ec9df17b3603","name":"Skrumble Network","symbol":"SKM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3826/thumb/skrumble-network.png?1548609513"},{"chainId":1,"address":"0x93ed3fbe21207ec2e8f2d3c3de6e058cb73bc04d","name":"Kleros","symbol":"PNK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3833/thumb/kleros.png?1547975322"},{"chainId":1,"address":"0xea26c4ac16d4a5a106820bc8aee85fd0b7b2b664","name":"QuarkChain","symbol":"QKC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3849/thumb/quarkchain.png?1548387524"},{"chainId":1,"address":"0x593114f03a0a575aece9ed675e52ed68d2172b8c","name":"BidiPass","symbol":"BDP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3890/thumb/AxiFAoHc_400x400.jpg?1567461770"},{"chainId":1,"address":"0x4575f41308ec1483f3d399aa9a2826d74da13deb","name":"Orchid Protocol","symbol":"OXT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3916/thumb/download_%285%29.png?1576624060"},{"chainId":1,"address":"0xfef3884b603c33ef8ed4183346e093a173c94da6","name":"MetaMorph","symbol":"METM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3929/thumb/metamorph.png?1548084814"},{"chainId":1,"address":"0x4d807509aece24c0fa5a102b6a3b059ec6e14392","name":"Menlo One","symbol":"ONE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3947/thumb/menlo-one.png?1547038971"},{"chainId":1,"address":"0xe5dada80aa6477e85d09747f2842f7993d0df71c","name":"Dock","symbol":"DOCK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3978/thumb/2675.png?1547039034"},{"chainId":1,"address":"0x115ec79f1de567ec68b7ae7eda501b406626478e","name":"Carry","symbol":"CRE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3994/thumb/Carry.png?1592402610"},{"chainId":1,"address":"0xe25b0bba01dc5630312b6a21927e578061a13f55","name":"ShipChain","symbol":"SHIP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3997/thumb/shipchain.png?1548609236"},{"chainId":1,"address":"0xaa19961b6b858d9f18a115f25aa1d98abc1fdba8","name":"LocalCoinSwap","symbol":"LCS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3998/thumb/LocalCoinSwap.png?1547039086"},{"chainId":1,"address":"0x4e15361fd6b4bb609fa63c81a2be19d873717870","name":"Fantom","symbol":"FTM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4001/thumb/Fantom.png?1558015016"},{"chainId":1,"address":"0x9b4e2b4b13d125238aa0480dd42b4f6fc71b37cc","name":"MyToken","symbol":"MT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4109/thumb/2712.png?1547039296"},{"chainId":1,"address":"0x79c75e2e8720b39e258f41c37cc4f309e0b0ff80","name":"Phantasma","symbol":"SOUL","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/4130/thumb/phantasma.png?1548331035"},{"chainId":1,"address":"0x66fd97a78d8854fec445cd1c80a07896b0b4851f","name":"Lunch Money","symbol":"LMY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4149/thumb/IMG_2073.png?1612754752"},{"chainId":1,"address":"0x6704b673c70de9bf74c8fba4b4bd748f0e2190e1","name":"Ubex","symbol":"UBEX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4163/thumb/ubex.png?1547039421"},{"chainId":1,"address":"0x4f3afec4e5a3f2a6a1a411def7d7dfe50ee057bf","name":"Digix Gold","symbol":"DGX","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/4171/thumb/DGX_Token.png?1547039436"},{"chainId":1,"address":"0x53066cddbc0099eb6c96785d9b3df2aaeede5da3","name":"Penta Network Token","symbol":"PNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4175/thumb/pentanetwork.png?1548330852"},{"chainId":1,"address":"0x905e337c6c8645263d3521205aa37bf4d034e745","name":"Doc com","symbol":"MTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4177/thumb/Webp.net-resizeimage_%2832%29.png?1547039449"},{"chainId":1,"address":"0x4cd988afbad37289baaf53c13e98e2bd46aaea8c","name":"Key","symbol":"KEY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4182/thumb/bihu-key-token.png?1547039459"},{"chainId":1,"address":"0x5c872500c00565505f3624ab435c222e558e9ff8","name":"CoTrader","symbol":"COT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4205/thumb/logo_black.png?1547039508"},{"chainId":1,"address":"0xe5b826ca2ca02f09c1725e9bd98d9a8874c30532","name":"ZEON Network","symbol":"ZEON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4247/thumb/XZqXYc2j_400x400.jpg?1547039580"},{"chainId":1,"address":"0x3c4bea627039f0b7e7d21e34bb9c9fe962977518","name":"Ubique Chain of Thi","symbol":"UCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4277/thumb/Webp.net-resizeimage_%2829%29.jpg?1547039634"},{"chainId":1,"address":"0xedd7c94fd7b4971b916d15067bc454b9e1bad980","name":"Zippie","symbol":"ZIPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4302/thumb/zippie.jpg?1547039665"},{"chainId":1,"address":"0x0f71b8de197a1c84d31de0f1fa7926c365f052b3","name":"Arcona","symbol":"ARCONA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4312/thumb/9xfrZX3q_400x400.jpg?1551073749"},{"chainId":1,"address":"0xd9485499499d66b175cf5ed54c0a19f1a6bcb61a","name":"Usechain","symbol":"USE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4318/thumb/logo_%281%29.png?1547039678"},{"chainId":1,"address":"0x8290333cef9e6d528dd5618fb97a76f268f3edd4","name":"Ankr","symbol":"ANKR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4324/thumb/U85xTl2.png?1608111978"},{"chainId":1,"address":"0x21d5a14e625d767ce6b7a167491c2d18e0785fda","name":"Jinbi Token","symbol":"JNB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4349/thumb/image001.jpg?1547039703"},{"chainId":1,"address":"0x4f9254c83eb525f9fcf346490bbb3ed28a81c667","name":"Celer Network","symbol":"CELR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4379/thumb/Celr.png?1554705437"},{"chainId":1,"address":"0x1ccaa0f2a7210d76e1fdec740d5f323e2e1b1672","name":"Faceter","symbol":"FACE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4383/thumb/faceter-logo.png?1547039727"},{"chainId":1,"address":"0x10ba8c420e912bf07bedac03aa6908720db04e0c","name":"Raise Token","symbol":"RAISE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4411/thumb/Raise.png?1590671180"},{"chainId":1,"address":"0xb6ed7644c69416d67b522e20bc294a9a9b405b31","name":"0xBitcoin","symbol":"0XBTC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/4454/thumb/0xbtc.png?1561603765"},{"chainId":1,"address":"0xc28e931814725bbeb9e670676fabbcb694fe7df2","name":"Quadrant Protocol","symbol":"EQUAD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4462/thumb/equad.png?1547039783"},{"chainId":1,"address":"0x75231f58b43240c9718dd58b4967c5114342a86c","name":"OKB","symbol":"OKB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4463/thumb/okb_token.png?1548386209"},{"chainId":1,"address":"0xc275865a6cce78398e94cb2af29fa0d787b7f7eb","name":"RiseCoin Token","symbol":"RSCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4469/thumb/rsct.png?1547039788"},{"chainId":1,"address":"0xd13c7342e1ef687c5ad21b27c2b65d772cab5c8c","name":"Ultra","symbol":"UOS","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/4480/thumb/Ultra.png?1563356418"},{"chainId":1,"address":"0x22de9912cd3d74953b1cd1f250b825133cc2c1b3","name":"Drep","symbol":"DREP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4486/thumb/DREP-logo.jpg?1547039799"},{"chainId":1,"address":"0xd07d9fe2d2cc067015e2b4917d24933804f42cfa","name":"Tolar","symbol":"TOL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4487/thumb/tolar.png?1548759060"},{"chainId":1,"address":"0x91af0fbb28aba7e31403cb457106ce79397fd4e6","name":"Aergo","symbol":"AERGO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4490/thumb/Aergo.png?1558084282"},{"chainId":1,"address":"0x55296f69f40ea6d20e478533c15a6b08b654e758","name":"XYO Network","symbol":"XYO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4519/thumb/XYO_Network-logo.png?1547039819"},{"chainId":1,"address":"0xa9d2927d3a04309e008b6af6e2e282ae2952e7fd","name":"Zipper Network","symbol":"ZIP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4524/thumb/zip_token_logo.png?1547039822"},{"chainId":1,"address":"0x83e2be8d114f9661221384b3a50d24b96a5653f5","name":"0xcert","symbol":"ZXC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4552/thumb/0xcert.png?1547039841"},{"chainId":1,"address":"0x4442556a08a841227bef04c67a7ba7acf01b6fc8","name":"Monarch Token","symbol":"MT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4558/thumb/mm07ThTv_400x400.jpg?1566389078"},{"chainId":1,"address":"0xbd356a39bff2cada8e9248532dd879147221cf76","name":"WOM Protocol","symbol":"WOM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4559/thumb/wom_logo_small.png?1572098941"},{"chainId":1,"address":"0x6f919d67967a97ea36195a2346d9244e60fe0ddb","name":"Blockcloud","symbol":"BLOC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4572/thumb/Xd1i27EM_400x400.jpg?1547039854"},{"chainId":1,"address":"0xc719d010b63e5bbf2c0551872cd5316ed26acd83","name":"Etherisc DIP Token","symbol":"DIP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4586/thumb/dip.png?1547039863"},{"chainId":1,"address":"0x5ca381bbfb58f0092df149bd3d243b08b9a8386e","name":"MXC","symbol":"MXC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4604/thumb/MXC-app-icon10242x.png?1597628240"},{"chainId":1,"address":"0x6737fe98389ffb356f64ebb726aa1a92390d94fb","name":"Zero Carbon Project","symbol":"ZCC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4610/thumb/29597798_1994933117411549_6379526843613393871_n.png?1606409572"},{"chainId":1,"address":"0xad5fe5b0b8ec8ff4565204990e4405b2da117d8e","name":"TronClassic","symbol":"TRXC","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/4626/thumb/trxc.png?1547039893"},{"chainId":1,"address":"0xff56cc6b1e6ded347aa0b7676c85ab0b3d08b0fa","name":"Orbs","symbol":"ORBS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4630/thumb/Orbs.jpg?1547039896"},{"chainId":1,"address":"0x0c7d5ae016f806603cb1782bea29ac69471cab9c","name":"Bifrost","symbol":"BFC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4639/thumb/bifrost_32.png?1608520677"},{"chainId":1,"address":"0x0f8c45b896784a1e408526b9300519ef8660209c","name":"XMax","symbol":"XMX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/4643/thumb/xmx.png?1574682262"},{"chainId":1,"address":"0xcc394f10545aeef24483d2347b32a34a44f20e6f","name":"Vault Guardian Toke","symbol":"VGT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4652/thumb/Vault12.jpg?1547039918"},{"chainId":1,"address":"0x56e0b2c7694e6e10391e870774daa45cf6583486","name":"DUO Network","symbol":"DUO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4653/thumb/Duo_Network.png?1556593318"},{"chainId":1,"address":"0xeca82185adce47f39c684352b0439f030f860318","name":"Perlin","symbol":"PERL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4682/thumb/PerlinX-Icon-1500px.png?1598633609"},{"chainId":1,"address":"0x973e52691176d36453868d9d86572788d27041a9","name":"DxChain Token","symbol":"DX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4700/thumb/VdZwy0Pv_400x400.png?1603089728"},{"chainId":1,"address":"0xd46ba6d942050d489dbd938a2c909a5d5039a161","name":"Ampleforth","symbol":"AMPL","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/4708/thumb/Ampleforth.png?1561684250"},{"chainId":1,"address":"0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0","name":"Polygon","symbol":"MATIC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4713/thumb/matic___polygon.jpg?1612939050"},{"chainId":1,"address":"0x885e127aba09bf8fae058a2895c221b37697c9be","name":"Aced","symbol":"ACED","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4761/thumb/aced.png?1547040086"},{"chainId":1,"address":"0x14da230d6726c50f759bc1838717f8ce6373509c","name":"Kambria","symbol":"KAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4784/thumb/kambria.png?1547040127"},{"chainId":1,"address":"0xc4c7ea4fab34bd9fb9a5e1b1a98df76e26e6407c","name":"COCOS BCX","symbol":"COCOS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4932/thumb/_QPpjoUi_400x400.jpg?1566430520"},{"chainId":1,"address":"0xb9ef770b6a5e12e45983c5d80545258aa38f3b78","name":"0chain","symbol":"ZCN","decimals":10,"logoURI":"https://assets.coingecko.com/coins/images/4934/thumb/0_Black-svg.png?1600757954"},{"chainId":1,"address":"0x9b39a0b97319a9bd5fed217c1db7b030453bac91","name":"TigerCash","symbol":"TCH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4956/thumb/tigercash-logo.png?1547040378"},{"chainId":1,"address":"0x8a2279d4a90b6fe1c4b30fa660cc9f926797baa2","name":"Chromia","symbol":"CHR","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/5000/thumb/Chromia.png?1559038018"},{"chainId":1,"address":"0xcca0c9c383076649604ee31b20248bc04fdf61ca","name":"Bitmax Token","symbol":"BTMX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5003/thumb/BTMX.jpg?1547040429"},{"chainId":1,"address":"0x6a27348483d59150ae76ef4c0f3622a78b0ca698","name":"BeeKan Beenews","symbol":"BKBT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5004/thumb/beekan.png?1547040430"},{"chainId":1,"address":"0x57ab1ec28d129707052df4df418d58a2d46d5f51","name":"sUSD","symbol":"SUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5013/thumb/sUSD.png?1562212426"},{"chainId":1,"address":"0x05079687d35b93538cbd59fe5596380cae9054a9","name":"BitSong","symbol":"BTSG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5041/thumb/logo_-_2021-01-10T210801.390.png?1610284134"},{"chainId":1,"address":"0xedf6568618a00c6f0908bf7758a16f76b6e04af9","name":"Arianee","symbol":"ARIA20","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5054/thumb/Aria_Logo_256.png?1610097866"},{"chainId":1,"address":"0x76306f029f8f99effe509534037ba7030999e3cf","name":"Acreage Coin","symbol":"ACR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5100/thumb/acreage-coin.jpg?1547040494"},{"chainId":1,"address":"0x4eeea7b48b9c3ac8f70a9c932a8b1e8a5cb624c7","name":"Membrana","symbol":"MBN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5117/thumb/membrana_logo.png?1565238625"},{"chainId":1,"address":"0xe64b47931f28f89cc7a0c6965ecf89eadb4975f5","name":"Ludos Protocol","symbol":"LUD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5118/thumb/Ludos_Protocol.jpg?1557216263"},{"chainId":1,"address":"0x5d4d57cd06fa7fe99e26fdc481b468f77f05073c","name":"Netkoin","symbol":"NTK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5162/thumb/NTK.png?1606878538"},{"chainId":1,"address":"0xdb25f211ab05b1c97d595516f45794528a807ad8","name":"STASIS EURO","symbol":"EURS","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/5164/thumb/EURS_300x300.png?1550571779"},{"chainId":1,"address":"0x5bc7e5f0ab8b2e10d2d0a3f21739fce62459aef3","name":"Hut34 Entropy","symbol":"ENTRP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5197/thumb/hut.png?1575869079"},{"chainId":1,"address":"0xebd9d99a3982d547c5bb4db7e3b1f9f14b67eb83","name":"Everest","symbol":"ID","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5209/thumb/logo.png?1610866164"},{"chainId":1,"address":"0x986ee2b944c42d017f52af21c4c69b84dbea35d8","name":"BitMart Token","symbol":"BMX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5236/thumb/bitmart-token.png?1548835017"},{"chainId":1,"address":"0x7297862b9670ff015192799cc849726c88bf1d77","name":"SkyMap","symbol":"SKYM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5266/thumb/soar_earth.png?1547040769"},{"chainId":1,"address":"0x2ecb13a8c458c379c4d9a7259e202de03c8f3d19","name":"Block chain com","symbol":"BC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5298/thumb/block-chain-com.png?1547350894"},{"chainId":1,"address":"0xb1f871ae9462f1b2c6826e88a7827e76f86751d4","name":"GNY","symbol":"GNY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5300/thumb/icon_gny.jpg?1601926183"},{"chainId":1,"address":"0x61bfc979ea8160ede9b862798b7833a97bafa02a","name":"RELEASE","symbol":"REL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5387/thumb/release.jpg?1547041000"},{"chainId":1,"address":"0x687bfc3e73f6af55f0ccca8450114d107e781a0e","name":"QChi","symbol":"QCH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5392/thumb/qchi.png?1548607478"},{"chainId":1,"address":"0x02f2d4a04e6e01ace88bd2cd632875543b2ef577","name":"PKG Token","symbol":"PKG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5422/thumb/pkg-token.png?1548331357"},{"chainId":1,"address":"0xd9a8cfe21c232d485065cb62a96866799d4645f7","name":"FingerPrint","symbol":"FGP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5454/thumb/fingerprint.png?1561602642"},{"chainId":1,"address":"0x4a621d9f1b19296d1c0f87637b3a8d4978e9bf82","name":"CyberFM","symbol":"CYFM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5476/thumb/cyberfm.png?1547041216"},{"chainId":1,"address":"0xba745513acebcbb977497c569d4f7d340f2a936b","name":"Mainstream For The ","symbol":"MFTU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5519/thumb/Mainstream_for_the_underground.png?1534426154"},{"chainId":1,"address":"0x48c1b2f3efa85fbafb2ab951bf4ba860a08cdbb7","name":"ShowHand","symbol":"HAND","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/5554/thumb/showhand.png?1548609179"},{"chainId":1,"address":"0x2f141ce366a2462f02cea3d12cf93e4dca49e4fd","name":"FREE coin","symbol":"FREE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5585/thumb/free-coin.png?1548126559"},{"chainId":1,"address":"0xaea46a60368a7bd060eec7df8cba43b7ef41ad85","name":"Fetch ai","symbol":"FET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5681/thumb/Fetch.jpg?1572098136"},{"chainId":1,"address":"0xd28cfec79db8d0a225767d06140aee280718ab7e","name":"Bizkey","symbol":"BZKY","decimals":16,"logoURI":"https://assets.coingecko.com/coins/images/5766/thumb/bizkey.png?1547041634"},{"chainId":1,"address":"0xb20043f149817bff5322f1b928e89abfc65a9925","name":"EXRT Network","symbol":"EXRT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5954/thumb/EXRT.jpg?1547041893"},{"chainId":1,"address":"0x6be61833fc4381990e82d7d4a9f4c9b3f67ea941","name":"Hotbit Token","symbol":"HTB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5990/thumb/hotbit-token.png?1547041932"},{"chainId":1,"address":"0x056fd409e1d7a124bd7017459dfea2f387b6d5cd","name":"Gemini Dollar","symbol":"GUSD","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/5992/thumb/gemini-dollar-gusd.png?1536745278"},{"chainId":1,"address":"0x780116d91e5592e58a3b3c76a351571b39abcec6","name":"Blockparty","symbol":"BOXX","decimals":15,"logoURI":"https://assets.coingecko.com/coins/images/5995/thumb/boxx-token.png?1547041938"},{"chainId":1,"address":"0x8e870d67f660d95d5be530380d0ec0bd388289e1","name":"Paxos Standard","symbol":"PAX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6013/thumb/paxos_standard.png?1548386291"},{"chainId":1,"address":"0x8578530205cecbe5db83f7f29ecfeec860c297c2","name":"smARTOFGIVING","symbol":"AOG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6050/thumb/logo_%286%29.png?1547042007"},{"chainId":1,"address":"0xcec38306558a31cdbb2a9d6285947c5b44a24f3e","name":"Fantasy Sports","symbol":"DFS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6062/thumb/fantasy_sports.png?1567508873"},{"chainId":1,"address":"0x3db6ba6ab6f95efed1a6e794cad492faaabf294d","name":"LTO Network","symbol":"LTO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6068/thumb/LTO_Network.png?1567443682"},{"chainId":1,"address":"0xe48972fcd82a274411c01834e2f031d4377fa2c0","name":"2key network","symbol":"2KEY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6090/thumb/2key.png?1591591830"},{"chainId":1,"address":"0xfef4185594457050cc9c23980d301908fe057bb1","name":"VIDT Datalink","symbol":"VIDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6115/thumb/V-ID_blockchain_-logo.png?1547042127"},{"chainId":1,"address":"0x35a735b7d1d811887966656855f870c05fd0a86d","name":"Thorncoin","symbol":"THRN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6300/thumb/_VaSXQpe_400x400.jpg?1547042348"},{"chainId":1,"address":"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48","name":"USD Coin","symbol":"USDC","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/6319/thumb/USD_Coin_icon.png?1547042389"},{"chainId":1,"address":"0x6e605c269e0c92e70beeb85486f1fc550f9380bd","name":"Catex Token","symbol":"CATT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6353/thumb/catex.png?1548733307"},{"chainId":1,"address":"0x01fa555c97d7958fa6f771f3bbd5ccd508f81e22","name":"Civil","symbol":"CVL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6374/thumb/civil.png?1547042477"},{"chainId":1,"address":"0xdf59c8ba19b4d1437d80836b45f1319d9a429eed","name":"IZIChain","symbol":"IZI","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/6405/thumb/logo-icon-200x200.png?1547617296"},{"chainId":1,"address":"0xf293d23bf2cdc05411ca0eddd588eb1977e8dcd4","name":"Sylo","symbol":"SYLO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6430/thumb/SYLO.svg?1589527756"},{"chainId":1,"address":"0xf18432ef894ef4b2a5726f933718f5a8cf9ff831","name":"BioCrypt","symbol":"BIO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6457/thumb/200x200logo.png?1547042660"},{"chainId":1,"address":"0xe1a178b681bd05964d3e3ed33ae731577d9d96dd","name":"BOX Token","symbol":"BOX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6511/thumb/box-token.png?1547563043"},{"chainId":1,"address":"0x763fa6806e1acf68130d2d0f0df754c93cc546b2","name":"Lition","symbol":"LIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6580/thumb/Lition_ico.png?1547042787"},{"chainId":1,"address":"0x86ed939b500e121c0c5f493f399084db596dad20","name":"SpaceChain ERC 20 ","symbol":"SPC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6659/thumb/Spacechain.jpg?1547042861"},{"chainId":1,"address":"0x3affcca64c2a6f4e3b6bd9c64cd2c969efd1ecbe","name":"DSLA Protocol","symbol":"DSLA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6694/thumb/dsla_logo-squared_200x200.png?1569571063"},{"chainId":1,"address":"0xbb1f24c0c1554b9990222f036b0aad6ee4caec29","name":"CryptoSoul","symbol":"SOUL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6723/thumb/cryptosoul.png?1547042952"},{"chainId":1,"address":"0x6fe56c0bcdd471359019fcbc48863d6c3e9d4f41","name":"Props Token","symbol":"PROPS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6735/thumb/photo-2017-10-10-03-32-02.png?1595168186"},{"chainId":1,"address":"0xfb559ce67ff522ec0b9ba7f5dc9dc7ef6c139803","name":"Probit Token","symbol":"PROB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6765/thumb/ProBit-Exchange-logo.png?1547043029"},{"chainId":1,"address":"0x018d7d179350f1bb9853d04982820e37cce13a92","name":"InMax","symbol":"INX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6826/thumb/gDALsvq.png?1555895815"},{"chainId":1,"address":"0x757703bd5b2c4bbcfde0be2c0b0e7c2f31fcf4e9","name":"Zest Token","symbol":"ZEST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6837/thumb/33_%281%29.jpg?1594437564"},{"chainId":1,"address":"0x7de91b204c1c737bcee6f000aaa6569cf7061cb7","name":"Robonomics Network","symbol":"XRT","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/7024/thumb/Robonomics-Network-logo.png?1547043451"},{"chainId":1,"address":"0x45af324f53a8d7da1752dad74adc1748126d7978","name":"MyTVchain","symbol":"MYTV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7026/thumb/MYTV-200x200.png?1585697417"},{"chainId":1,"address":"0x06e0feb0d74106c7ada8497754074d222ec6bcdf","name":"Bitball","symbol":"BTB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7039/thumb/BitBall_png_.png?1588640849"},{"chainId":1,"address":"0x8b79656fc38a04044e495e22fad747126ca305c4","name":"AgaveCoin","symbol":"AGVC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7056/thumb/G4TML4cb_400x400.jpg?1547043511"},{"chainId":1,"address":"0xb8e103b60a33597136ea9511f46b6dbeb643a3a5","name":"SiamBitcoin","symbol":"SBTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7089/thumb/image-62DF_5C05991C.jpg?1547043573"},{"chainId":1,"address":"0x2ec95b8eda549b79a1248335a39d299d00ed314c","name":"Fatcoin","symbol":"FAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7109/thumb/SV2Xb94q_400x400.jpg?1547043605"},{"chainId":1,"address":"0x790bfacae71576107c068f494c8a6302aea640cb","name":"CryptoBossCoin","symbol":"CBC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7114/thumb/eqIkj-ZZ_400x400.jpg?1549521587"},{"chainId":1,"address":"0x58b6a8a3302369daec383334672404ee733ab239","name":"Livepeer","symbol":"LPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7137/thumb/logo-circle-white.png?1611492552"},{"chainId":1,"address":"0xf1290473e210b2108a85237fbcd7b6eb42cc654f","name":"HedgeTrade","symbol":"HEDG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7196/thumb/to3Vj4EZ_400x400.jpg?1547043758"},{"chainId":1,"address":"0x297e4e5e59ad72b1b0a2fd446929e76117be0e0a","name":"Smart Valor","symbol":"VALOR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7231/thumb/smart_valor.png?1555925772"},{"chainId":1,"address":"0xdb05ea0877a2622883941b939f0bb11d1ac7c400","name":"Opacity","symbol":"OPCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7237/thumb/Opacity.jpg?1551843524"},{"chainId":1,"address":"0xd4ca5c2aff1eefb0bea9e9eab16f88db2990c183","name":"XRP Classic","symbol":"XRPC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7259/thumb/xrpc.png?1572011410"},{"chainId":1,"address":"0x95daaab98046846bf4b2853e23cba236fa394a31","name":"EthermonToken","symbol":"EMONT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7272/thumb/colorfull_with_word_250x250.png?1580111776"},{"chainId":1,"address":"0x73c9275c3a2dd84b5741fd59aebf102c91eb033f","name":"Bitball Treasure","symbol":"BTRS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7273/thumb/normal_5b87c9dd5583d.png?1547043898"},{"chainId":1,"address":"0x70a63225bcadacc4430919f0c1a4f0f5fcffbaac","name":"VEY","symbol":"VEY","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/7282/thumb/dkDh4z0a_400x400.jpg?1547043914"},{"chainId":1,"address":"0xa0b73e1ff0b80914ab6fe0444e65848c4c34450b","name":"Crypto com Coin","symbol":"CRO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7310/thumb/cypto.png?1547043960"},{"chainId":1,"address":"0xd4f6f9ae14399fd5eb8dfc7725f0094a1a7f5d80","name":"Bitsten Token","symbol":"BST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7335/thumb/bitsten.png?1589629209"},{"chainId":1,"address":"0x7865af71cf0b288b4e7f654f4f7851eb46a2b7f8","name":"Sentivate","symbol":"SNTVT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7383/thumb/2x9veCp.png?1598409975"},{"chainId":1,"address":"0x03282f2d7834a97369cad58f888ada19eec46ab6","name":"Globex","symbol":"GEX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7391/thumb/globex.png?1592450726"},{"chainId":1,"address":"0xaec7d1069e3a914a3eb50f0bfb1796751f2ce48a","name":"S4FE","symbol":"S4F","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7405/thumb/logo_%284%29.png?1547085640"},{"chainId":1,"address":"0x32c4adb9cf57f972bc375129de91c897b4f364f1","name":"Flowchain","symbol":"FLC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7446/thumb/logo_%2889%29.png?1597459811"},{"chainId":1,"address":"0xb8a5dba52fe8a0dd737bf15ea5043cea30c7e30b","name":"AFRICUNIA BANK","symbol":"AFCASH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7449/thumb/afcash.jpg?1592393180"},{"chainId":1,"address":"0xc0f9bd5fa5698b6505f643900ffa515ea5df54a9","name":"Donut","symbol":"DONUT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7538/thumb/Donut.png?1548234345"},{"chainId":1,"address":"0x82a77710495a35549d2add797412b4a4497d33ef","name":"Dogz","symbol":"DOGZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7544/thumb/dogz.png?1604655282"},{"chainId":1,"address":"0x1beef31946fbbb40b877a72e4ae04a8d1a5cee06","name":"Parachute","symbol":"PAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7590/thumb/Parachute_Logo.png?1560918207"},{"chainId":1,"address":"0xa4bdb11dc0a2bec88d24a3aa1e6bb17201112ebe","name":"Stably Dollar","symbol":"USDS","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/7596/thumb/logo.png?1604543121"},{"chainId":1,"address":"0x2260fac5e5542a773aa44fbcfedf7c193bc2c599","name":"Wrapped Bitcoin","symbol":"WBTC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7598/thumb/wrapped_bitcoin_wbtc.png?1548822744"},{"chainId":1,"address":"0x965f109d31ccb77005858defae0ebaf7b4381652","name":"BitStash Marketplac","symbol":"STASH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7674/thumb/bitstash.png?1555301765"},{"chainId":1,"address":"0x8ffe40a3d0f80c0ce6b203d5cdc1a6a86d9acaea","name":"IG Gold","symbol":"IGG","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/7697/thumb/N7aEdYrY_400x400.png?1561587437"},{"chainId":1,"address":"0xa960d2ba7000d58773e7fa5754dec3bb40a069d5","name":"One DEX","symbol":"ODEX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7712/thumb/WzsJ6pIr_400x400.jpg?1549940214"},{"chainId":1,"address":"0x1c95b093d6c236d3ef7c796fe33f9cc6b8606714","name":"BOMB","symbol":"BOMB","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/7713/thumb/Bomb-token.png?1549944422"},{"chainId":1,"address":"0x5aaefe84e0fb3dd1f0fcff6fa7468124986b91bd","name":"Evedo","symbol":"EVED","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7721/thumb/Variations-09.png?1549979992"},{"chainId":1,"address":"0x4bd70556ae3f8a6ec6c4080a0c327b24325438f3","name":"Hxro","symbol":"HXRO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7805/thumb/hxro-squarelogo-1585089594129.png?1586221980"},{"chainId":1,"address":"0xb3e2cb7cccfe139f8ff84013823bf22da6b6390a","name":"Iconic Token","symbol":"ICNQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7830/thumb/2_Iconic_Holding_icon.png?1593396172"},{"chainId":1,"address":"0xe6be436df1ff96956dfe0b2b77fab84ede30236f","name":"Revelation coin","symbol":"REV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7855/thumb/Db7wCd0.jpg?1551171100"},{"chainId":1,"address":"0xac9ce326e95f51b5005e9fe1dd8085a01f18450c","name":"VeriSafe","symbol":"VSF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7862/thumb/verisafe_logo.png?1563852491"},{"chainId":1,"address":"0xac2385e183d9301dd5e2bb08da932cbf9800dc9c","name":"Netkoin Liquid","symbol":"LIQUID","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7910/thumb/netkoin-liquid-logo-600x400.png?1551755315"},{"chainId":1,"address":"0xd9ec3ff1f8be459bb9369b4e79e9ebcf7141c093","name":"KardiaChain","symbol":"KAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7942/thumb/KardiaChain.png?1591631223"},{"chainId":1,"address":"0x4b7ad3a56810032782afce12d7d27122bdb96eff","name":"Sparkle Loyalty","symbol":"SPRKL","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7949/thumb/SparkleLoyalty_Icon.png?1597653289"},{"chainId":1,"address":"0xffc63b9146967a1ba33066fb057ee3722221acf0","name":"Alpha Token","symbol":"A","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7968/thumb/alpha-token.jpg?1552883009"},{"chainId":1,"address":"0x9aab071b4129b083b01cb5a0cb513ce7eca26fa5","name":"HUNT","symbol":"HUNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7989/thumb/HUNT.png?1571024256"},{"chainId":1,"address":"0x0a913bead80f321e7ac35285ee10d9d922659cb7","name":"DOS Network","symbol":"DOS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7991/thumb/DOS.png?1552900889"},{"chainId":1,"address":"0xb9eefc4b0d472a44be93970254df4f4016569d27","name":"DigitalBits","symbol":"XDB","decimals":7,"logoURI":"https://assets.coingecko.com/coins/images/8089/thumb/digitalbits-logo.jpg?1554454902"},{"chainId":1,"address":"0x056dd20b01799e9c1952c7c9a5ff4409a6110085","name":"WPP Token","symbol":"WPP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8103/thumb/WzdD53fh_400x400.jpg?1554860792"},{"chainId":1,"address":"0x70debcdab2ef20be3d1dbff6a845e9ccb6e46930","name":"BIKI","symbol":"BIKI","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8119/thumb/BiKi_icon.png?1581935375"},{"chainId":1,"address":"0x8c15ef5b4b21951d50e53e4fbda8298ffad25057","name":"f x Coin","symbol":"FX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8186/thumb/47271330_590071468072434_707260356350705664_n.jpg?1556096683"},{"chainId":1,"address":"0x1fcdce58959f536621d76f5b7ffb955baa5a672f","name":"ForTube","symbol":"FOR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8242/thumb/for.png?1606195375"},{"chainId":1,"address":"0xe5caef4af8780e59df925470b050fb23c43ca68c","name":"Ferrum Network","symbol":"FRM","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/8251/thumb/frm.png?1563777564"},{"chainId":1,"address":"0x13e9ec660d872f55405d70e5c52d872136f0970c","name":"Twinkle","symbol":"TKT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8260/thumb/twinkle.png?1557123321"},{"chainId":1,"address":"0x07597255910a51509ca469568b048f2597e72504","name":"Uptrennd","symbol":"1UP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8273/thumb/Uptrennd_Logo.png?1579334846"},{"chainId":1,"address":"0x4954db6391f4feb5468b6b943d4935353596aec9","name":"USDQ","symbol":"USDQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8300/thumb/favicon-256x256.png?1557315995"},{"chainId":1,"address":"0x047686fb287e7263a23873dea66b4501015a2226","name":"Blockchain Cuties U","symbol":"CUTE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8328/thumb/bnLvIEl1_400x400.jpg?1557533240"},{"chainId":1,"address":"0xe54b3458c47e44c37a267e7c633afef88287c294","name":"Artfinity Token","symbol":"AT","decimals":5,"logoURI":"https://assets.coingecko.com/coins/images/8339/thumb/artfinity.png?1557604049"},{"chainId":1,"address":"0x8762db106b2c2a0bccb3a80d1ed41273552616e8","name":"Reserve Rights Toke","symbol":"RSR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8365/thumb/Reserve_Rights.png?1557737411"},{"chainId":1,"address":"0x0488401c3f535193fa8df029d9ffe615a06e74e6","name":"SparkPoint","symbol":"SRK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8371/thumb/U8-03TzL_400x400.jpg?1557811463"},{"chainId":1,"address":"0x3c76ef53be46ed2e9be224e8f0b92e8acbc24ea0","name":"Bitsou","symbol":"BTU","decimals":3,"logoURI":"https://assets.coingecko.com/coins/images/8378/thumb/61B3F6DFA9584DDAA760E74B12D6FAD3.png?1557823748"},{"chainId":1,"address":"0x09617f6fd6cf8a71278ec86e23bbab29c04353a7","name":"Shardus","symbol":"ULT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8383/thumb/final_logo_photoshop.png?1557890272"},{"chainId":1,"address":"0x98e0438d3ee1404fea48e38e92853bb08cfa68bd","name":"TVT","symbol":"TVT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8388/thumb/g8hXw4QX_400x400.jpg?1557973343"},{"chainId":1,"address":"0x6c22b815904165f3599f0a4a092d458966bd8024","name":"Bit Public Talent N","symbol":"BPTN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8412/thumb/7f346702db390a289f5770f008563173.png?1558077057"},{"chainId":1,"address":"0x2af5d2ad76741191d15dfe7bf6ac92d4bd912ca3","name":"LEO Token","symbol":"LEO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8418/thumb/leo-token.png?1558326215"},{"chainId":1,"address":"0xd36a0e7b741542208ae0fbb35453c893d0136625","name":"ITO Utility Token","symbol":"IUT","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/8420/thumb/300x300.png?1592800024"},{"chainId":1,"address":"0xb4272071ecadd69d933adcd19ca99fe80664fc08","name":"CryptoFranc","symbol":"XCHF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8465/thumb/WhuiuJBc_400x400.jpg?1558699947"},{"chainId":1,"address":"0xf0bc1ae4ef7ffb126a8347d06ac6f8add770e1ce","name":"1Million Token","symbol":"1MT","decimals":7,"logoURI":"https://assets.coingecko.com/coins/images/8495/thumb/1MTp.png?1586964391"},{"chainId":1,"address":"0xba50933c268f567bdc86e1ac131be072c6b0b71a","name":"ARPA Chain","symbol":"ARPA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8506/thumb/9u0a23XY_400x400.jpg?1559027357"},{"chainId":1,"address":"0x8b8a8a91d7b8ec2e6ab37ed8ffbacee062c6f3c7","name":"ECP Technology","symbol":"ECP","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/8507/thumb/lhwmJl7R_400x400.png?1574931781"},{"chainId":1,"address":"0x0e5f00da8aaef196a719d045db89b5da8f371b32","name":"Connectome","symbol":"CNTM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8528/thumb/200_200_CNTM-LOGO-07.png?1600751947"},{"chainId":1,"address":"0x11eef04c884e24d9b7b4760e7476d06ddf797f36","name":"MX Token","symbol":"MX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8545/thumb/TII1YIdv_400x400.png?1559180170"},{"chainId":1,"address":"0x3166c570935a7d8554c8f4ea792ff965d2efe1f2","name":"Q DAO Governance to","symbol":"QDAO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8599/thumb/QDAO_logo_white_black.png?1562131656"},{"chainId":1,"address":"0xd6a55c63865affd67e2fb9f284f87b7a9e5ff3bd","name":"Switch","symbol":"ESH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8608/thumb/Cco9sLN.png?1603676332"},{"chainId":1,"address":"0xac4d22e40bf0b8ef4750a99ed4e935b99a42685e","name":"Aeryus","symbol":"AER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8626/thumb/aerlogo.png.jpeg?1559773242"},{"chainId":1,"address":"0x5acd07353106306a6530ac4d49233271ec372963","name":"Ethereum Cloud","symbol":"ETY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8682/thumb/ethereumcloud_mid_1554103232943.png?1570230515"},{"chainId":1,"address":"0xde7d85157d9714eadf595045cc12ca4a5f3e2adb","name":"STP Network","symbol":"STPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8713/thumb/STP.png?1560262664"},{"chainId":1,"address":"0x1b073382e63411e3bcffe90ac1b9a43fefa1ec6f","name":"Bitpanda Ecosystem ","symbol":"BEST","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8738/thumb/BEST_250px.png?1570103109"},{"chainId":1,"address":"0x79c71d3436f39ce382d0f58f1b011d88100b9d91","name":"Xeonbit Token","symbol":"XNS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8744/thumb/200x200_icon_darkbg.png?1560826732"},{"chainId":1,"address":"0xa31b1767e09f842ecfd4bc471fe44f830e3891aa","name":"Roobee","symbol":"ROOBEE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8791/thumb/Group_11.png?1580344629"},{"chainId":1,"address":"0x09fe5f0236f0ea5d930197dce254d77b04128075","name":"Wrapped CryptoKitti","symbol":"WCK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8797/thumb/WCK.png?1561705836"},{"chainId":1,"address":"0x4c1c4957d22d8f373aed54d0853b090666f6f9de","name":"Silverway","symbol":"SLV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8822/thumb/Silverway.png?1561629364"},{"chainId":1,"address":"0x1c48f86ae57291f7686349f12601910bd8d470bb","name":"USDK","symbol":"USDK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8824/thumb/usdk.png?1563418517"},{"chainId":1,"address":"0xfc82bb4ba86045af6f327323a46e80412b91b27d","name":"Prometeus","symbol":"PROM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8825/thumb/G2LY-Dg_.png?1591698270"},{"chainId":1,"address":"0x87210f1d3422ba75b6c40c63c78d79324dabcd55","name":"EOS TRUST","symbol":"EOST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8829/thumb/EOS_TRUST.png?1561955075"},{"chainId":1,"address":"0xfe18be6b3bd88a2d2a7f928d00292e7a9963cfc6","name":"sBTC","symbol":"SBTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8838/thumb/XOZPLK3.png?1605006973"},{"chainId":1,"address":"0x79cdfa04e3c4eb58c4f49dae78b322e5b0d38788","name":"Truefeedback Token","symbol":"TFB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8842/thumb/5rd7a55q_400x400.png?1562902557"},{"chainId":1,"address":"0x5e74c9036fb86bd7ecdcb084a0673efc32ea31cb","name":"sETH","symbol":"SETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8843/thumb/9ZAujYk.png?1605006952"},{"chainId":1,"address":"0xa9859874e1743a32409f75bb11549892138bba1e","name":"iETH","symbol":"IETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8846/thumb/iETH.png?1562212479"},{"chainId":1,"address":"0x8515cd0f00ad81996d24b9a9c35121a3b759d6cd","name":"BlockBurn","symbol":"BURN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8851/thumb/blockburn.JPG?1582774870"},{"chainId":1,"address":"0x6226caa1857afbc6dfb6ca66071eb241228031a1","name":"LinkArt","symbol":"LAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8892/thumb/pB4iXZbU_400x400.jpg?1562579001"},{"chainId":1,"address":"0x57b946008913b82e4df85f501cbaed910e58d26c","name":"Marlin","symbol":"POND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8903/thumb/Marlin.png?1608584519"},{"chainId":1,"address":"0x191557728e4d8caa4ac94f86af842148c0fa8f7e","name":"Ormeus Ecosystem","symbol":"ECO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8923/thumb/logo_eco_low.png?1562902804"},{"chainId":1,"address":"0x426fc8be95573230f6e6bc4af91873f0c67b21b4","name":"BlackPearl Token","symbol":"BPLC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8931/thumb/EJIpComQ_400x400.png?1584653141"},{"chainId":1,"address":"0x740623d2c797b7d8d1ecb98e9b4afcf99ec31e14","name":"DoYourTip","symbol":"DYT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8936/thumb/image1.png?1578033515"},{"chainId":1,"address":"0x187d1018e8ef879be4194d6ed7590987463ead85","name":"FUZE Token","symbol":"FUZE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8941/thumb/logo-fuze-fix-big.png?1563117524"},{"chainId":1,"address":"0x3b7f247f21bf3a07088c2d3423f64233d4b069f7","name":"DYNAMITE Token","symbol":"DYNMT","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/8951/thumb/dynamite_logo.jpg?1598851224"},{"chainId":1,"address":"0xf6537fe0df7f0cc0985cf00792cc98249e73efa0","name":"GIV Token","symbol":"GIV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8996/thumb/giv.png?1596069222"},{"chainId":1,"address":"0x4b4b1d389d4f4e082b30f75c6319c0ce5acbd619","name":"Heart Number","symbol":"HTN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9002/thumb/htn%28200x200%29.png?1600757668"},{"chainId":1,"address":"0xbf4a2ddaa16148a9d0fa2093ffac450adb7cd4aa","name":"Ethereum Money","symbol":"ETHMNY","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/9025/thumb/20200605_131214.png?1597297671"},{"chainId":1,"address":"0x50d1c9771902476076ecfc8b2a83ad6b9355a4c9","name":"FTX Token","symbol":"FTT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9026/thumb/F.png?1609051564"},{"chainId":1,"address":"0x456ae45c0ce901e2e7c99c0718031cec0a7a59ff","name":"Vision Network","symbol":"VSN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9029/thumb/photo_2020-08-14_20-34-55.jpg?1606133699"},{"chainId":1,"address":"0x2cd9324ba13b77554592d453e6364086fbba446a","name":"502 Bad Gateway Tok","symbol":"Z502","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/9040/thumb/502.jpg?1563872035"},{"chainId":1,"address":"0x875353da48c4f9627c4d0b8b8c37b162fc43ce67","name":"Digipharm","symbol":"DPH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9052/thumb/R4XzLI-a_400x400.jpg?1563910390"},{"chainId":1,"address":"0x47e820df943170b0e31f9e18ecd5bdd67b77ff1f","name":"PIGX","symbol":"PIGX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9069/thumb/IMG_5547.PNG?1604239318"},{"chainId":1,"address":"0x810908b285f85af668f6348cd8b26d76b3ec12e1","name":"SwapCoinz","symbol":"SPAZ","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9081/thumb/8HfLK99.png?1586746202"},{"chainId":1,"address":"0x03fb52d4ee633ab0d06c833e32efdd8d388f3e6a","name":"Super Black Hole","symbol":"HOLE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9087/thumb/SdAKFUu.png?1564086285"},{"chainId":1,"address":"0xfcf8eda095e37a41e002e266daad7efc1579bc0a","name":"FLEX Coin","symbol":"FLEX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9108/thumb/CoinFlex.png?1579227316"},{"chainId":1,"address":"0x5b535edfa75d7cb706044da0171204e1c48d00e8","name":"808TA Token","symbol":"808TA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9120/thumb/eKmFtFle_400x400.png?1564473061"},{"chainId":1,"address":"0x675ce995953136814cb05aaaa5d02327e7dc8c93","name":"Blue Baikal","symbol":"BBC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9130/thumb/symbol_Blue_Baikal.png?1586736403"},{"chainId":1,"address":"0x83869de76b9ad8125e22b857f519f001588c0f62","name":"EXMO Coin","symbol":"EXM","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9154/thumb/exmo_token.png?1579588209"},{"chainId":1,"address":"0x5f9d86fa0454ffd6a59ccc485e689b0a832313db","name":"XWC Dice Token","symbol":"XDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9189/thumb/xdt.PNG?1565000033"},{"chainId":1,"address":"0x8cb1d155a5a1d5d667611b7710920fd9d1cd727f","name":"Aircoins","symbol":"AIRX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9201/thumb/Aircoins.png?1591615033"},{"chainId":1,"address":"0x26946ada5ecb57f3a1f91605050ce45c482c9eb1","name":"BitcoinSoV","symbol":"BSOV","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9205/thumb/bsov.png?1578020375"},{"chainId":1,"address":"0x3a9fff453d50d4ac52a6890647b823379ba36b9e","name":"Shuffle Monster","symbol":"SHUF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9222/thumb/shuf.png?1568038008"},{"chainId":1,"address":"0xebf4ca5319f406602eeff68da16261f1216011b5","name":"Yobit Token","symbol":"YO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9231/thumb/ybx_logo.gif?1565306320"},{"chainId":1,"address":"0xe541504417670fb76b612b41b4392d967a1956c7","name":"Bitsonic Token","symbol":"BSC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9238/thumb/image.png?1604295837"},{"chainId":1,"address":"0x5d3a536e4d6dbd6114cc1ead35777bab948e3643","name":"cDAI","symbol":"CDAI","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9281/thumb/cDAI.png?1576467585"},{"chainId":1,"address":"0x525794473f7ab5715c81d06d10f52d11cc052804","name":"12Ships","symbol":"TSHP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9351/thumb/12ships.png?1566485390"},{"chainId":1,"address":"0x8ce9137d39326ad0cd6491fb5cc0cba0e089b6a9","name":"Swipe","symbol":"SXP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9368/thumb/swipe.png?1566792311"},{"chainId":1,"address":"0xeb269732ab75a6fd61ea60b06fe994cd32a83549","name":"USDx Stablecoin","symbol":"USDX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9375/thumb/logo_USDx_256x256.png?1568695741"},{"chainId":1,"address":"0xf784682c82526e245f50975190ef0fff4e4fc077","name":"INLOCK","symbol":"ILK","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9377/thumb/qlyyGGYI_400x400.jpg?1566774060"},{"chainId":1,"address":"0x8e30ea2329d95802fd804f4291220b0e2f579812","name":"Decentralized Vulne","symbol":"DVP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9424/thumb/4520.png?1568598223"},{"chainId":1,"address":"0xe5a3229ccb22b6484594973a03a3851dcd948756","name":"Receive Access Ecos","symbol":"RAE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9428/thumb/Copy_of_raetoken.png?1567290545"},{"chainId":1,"address":"0x998ffe1e43facffb941dc337dd0468d52ba5b48a","name":"Rupiah Token","symbol":"IDRT","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/9441/thumb/57421944_1371636006308255_3647136573922738176_n.jpg?1567462531"},{"chainId":1,"address":"0x39aa39c021dfbae8fac545936693ac917d5e7563","name":"cUSDC","symbol":"CUSDC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9442/thumb/Compound_USDC.png?1567581577"},{"chainId":1,"address":"0x9469d013805bffb7d3debe5e7839237e535ec483","name":"Darwinia Network Na","symbol":"RING","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9443/thumb/iHFgzyCK_400x400.png?1567463393"},{"chainId":1,"address":"0x83d60e7aed59c6829fb251229061a55f35432c4d","name":"Infinito","symbol":"INFT","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/9461/thumb/5TOvk2A.png?1604885818"},{"chainId":1,"address":"0x0000852600ceb001e08e00bc008be620d60031f2","name":"TrueHKD","symbol":"THKD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9465/thumb/THKD.png?1567642964"},{"chainId":1,"address":"0x412d397ddca07d753e3e0c61e367fb1b474b3e7d","name":"8X8 Protocol","symbol":"EXE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9466/thumb/8x8_symbol_512x.png?1574320199"},{"chainId":1,"address":"0xaa7fb1c8ce6f18d4fd4aabb61a2193d4d441c54f","name":"ShitCoin","symbol":"SHIT","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/9472/thumb/ShitCoin_200x200.png?1567723695"},{"chainId":1,"address":"0x4ec2efb9cbd374786a03261e46ffce1a67756f3b","name":"Deflacoin","symbol":"DEFL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9477/thumb/20190906_172749.png?1567982012"},{"chainId":1,"address":"0x45804880de22913dafe09f4980848ece6ecbaf78","name":"PAX Gold","symbol":"PAXG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9519/thumb/paxg.PNG?1568542565"},{"chainId":1,"address":"0xa689dcea8f7ad59fb213be4bc624ba5500458dc6","name":"EURBASE","symbol":"EBASE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9541/thumb/Eurbase_Logo.png?1590024287"},{"chainId":1,"address":"0xd56dac73a4d6766464b38ec6d91eb45ce7457c44","name":"Panvala Pan","symbol":"PAN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9543/thumb/pan-logo.png?1568674599"},{"chainId":1,"address":"0xba11d00c5f74255f56a5e366f4f77f5a186d7f55","name":"Band Protocol","symbol":"BAND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9545/thumb/band-protocol.png?1568730326"},{"chainId":1,"address":"0xfbcecb002177e530695b8976638fbd18d2038c3c","name":"Belifex","symbol":"BEFX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9547/thumb/belifex.png?1586748867"},{"chainId":1,"address":"0xdf574c24545e5ffecb9a659c229253d4111d87e1","name":"HUSD","symbol":"HUSD","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9567/thumb/HUSD.jpg?1568889385"},{"chainId":1,"address":"0x4fabb145d64652a948d72533023f6e7a623c7c53","name":"Binance USD","symbol":"BUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9576/thumb/BUSD.png?1568947766"},{"chainId":1,"address":"0xb020ed54651831878e5c967e0953a900786178f9","name":"Baz Token","symbol":"BAZT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9581/thumb/baz.png?1576038883"},{"chainId":1,"address":"0x9556f8ee795d991ff371f547162d5efb2769425f","name":"DMme","symbol":"DMME","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9598/thumb/iyrIZf3N_400x400.png?1569383452"},{"chainId":1,"address":"0x25901f2a5a4bb0aaabe2cdb24e0e15a0d49b015d","name":"Bitfex","symbol":"BFX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9616/thumb/CBc5dTJ.png?1569853341"},{"chainId":1,"address":"0x630d98424efe0ea27fb1b3ab7741907dffeaad78","name":"PEAKDEFI","symbol":"PEAK","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9626/thumb/PEAKDEFI_Logo_250x250.png?1603094772"},{"chainId":1,"address":"0x536381a8628dbcc8c70ac9a30a7258442eab4c92","name":"Pantos","symbol":"PAN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9639/thumb/icon-coin-pan-color_250px.png?1570103344"},{"chainId":1,"address":"0x0ba45a8b5d5575935b8158a88c631e9f9c95a2e5","name":"Tellor","symbol":"TRB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9644/thumb/Blk_icon_current.png?1584980686"},{"chainId":1,"address":"0x931ad0628aa11791c26ff4d41ce23e40c31c5e4e","name":"Pegasus","symbol":"PGS","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9646/thumb/pgs.PNG?1570179224"},{"chainId":1,"address":"0x1f3f677ecc58f6a1f9e2cf410df4776a8546b5de","name":"VNDC","symbol":"VNDC","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/9670/thumb/vndc-gold-coin.png?1571032826"},{"chainId":1,"address":"0x0452aed878805514e28fb5bd0b56bef92176e32a","name":"BPOP","symbol":"BPOP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9701/thumb/bpop.PNG?1570916211"},{"chainId":1,"address":"0x431ad2ff6a9c365805ebad47ee021148d6f7dbe0","name":"dForce Token","symbol":"DF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9709/thumb/xlGxxIjI_400x400.jpg?1571006794"},{"chainId":1,"address":"0xe0b9bcd54bf8a730ea5d3f1ffce0885e911a502c","name":"ZUM TOKEN","symbol":"ZUM","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9721/thumb/zum256x256.png?1571264005"},{"chainId":1,"address":"0x8888889213dd4da823ebdd1e235b09590633c150","name":"Marblecoin","symbol":"MBC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9770/thumb/logo_%2824%29.png?1571610155"},{"chainId":1,"address":"0x7c8155909cd385f120a56ef90728dd50f9ccbe52","name":"Nahmii","symbol":"NII","decimals":15,"logoURI":"https://assets.coingecko.com/coins/images/9786/thumb/nahmii-sm_icon-full-color.png?1608513773"},{"chainId":1,"address":"0xdd436a0dce9244b36599ae7b22f0373b4e33992d","name":"TrustUSD","symbol":"TRUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9811/thumb/TrustUSDlogo.png?1589631273"},{"chainId":1,"address":"0xaa2ce7ae64066175e0b90497ce7d9c190c315db4","name":"Suterusu","symbol":"SUTER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9830/thumb/p-NFlBlw_400x400.jpg?1572472860"},{"chainId":1,"address":"0x9cb2f26a23b8d89973f08c957c4d7cdf75cd341c","name":"Digital Rand","symbol":"DZAR","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/9841/thumb/logo200_%281%29.png?1572577311"},{"chainId":1,"address":"0x1412f6aa5adc77c620715bb2a020aa690b85f68a","name":"MargiX","symbol":"MGX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9865/thumb/MGX_Logo.png?1603614181"},{"chainId":1,"address":"0xf5a562597d5fb5cc19482379755e1a5275a6607b","name":"XFOC","symbol":"XFOC","decimals":7,"logoURI":"https://assets.coingecko.com/coins/images/9885/thumb/logo_%2811%29.png?1572942311"},{"chainId":1,"address":"0x150b0b96933b75ce27af8b92441f8fb683bf9739","name":"Dragonereum GOLD","symbol":"GOLD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9905/thumb/PO04AL0y_400x400.jpg?1573437136"},{"chainId":1,"address":"0xd8a8843b0a5aba6b030e92b3f4d669fad8a5be50","name":"AfroDex Labs Token","symbol":"AFDLT","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/9908/thumb/GOLDEN_TOKEN_4.png?1575868746"},{"chainId":1,"address":"0x00fc270c9cc13e878ab5363d00354bebf6f05c15","name":"VNX Exchange","symbol":"VNXLU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9945/thumb/vnx.PNG?1573639467"},{"chainId":1,"address":"0x6b175474e89094c44da98b954eedeac495271d0f","name":"Dai","symbol":"DAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9956/thumb/dai-multi-collateral-mcd.png?1574218774"},{"chainId":1,"address":"0x6f02055e3541dd74a1abd8692116c22ffafadc5d","name":"The Mart Token","symbol":"TMT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9963/thumb/tmt.png?1585317430"},{"chainId":1,"address":"0xcf8f9555d55ce45a3a33a81d6ef99a2a2e71dee2","name":"CBI Index 7","symbol":"CBIX7","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9978/thumb/CBIX7.png?1574320790"},{"chainId":1,"address":"0x037a54aab062628c9bbae1fdb1583c195585fe41","name":"LCX","symbol":"LCX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9985/thumb/zRPSu_0o_400x400.jpg?1574327008"},{"chainId":1,"address":"0xc770eefad204b5180df6a14ee197d99d808ee52d","name":"FOX Token","symbol":"FOX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9988/thumb/FOX.png?1574330622"},{"chainId":1,"address":"0x68eb95dc9934e19b86687a10df8e364423240e94","name":"3X Long Bitcoin Tok","symbol":"BULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9992/thumb/683JEXMN_400x400.png?1574418750"},{"chainId":1,"address":"0x5f75112bbb4e1af516fbe3e21528c63da2b6a1a5","name":"Chess Coin","symbol":"CHESS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9998/thumb/Webp.net-resizeimage.png?1595321722"},{"chainId":1,"address":"0x0a9f693fce6f00a51a8e0db4351b5a8078b4242e","name":"Resfinex Token","symbol":"RES","decimals":5,"logoURI":"https://assets.coingecko.com/coins/images/10026/thumb/logo_%281%29.png?1588935633"},{"chainId":1,"address":"0x0f7f961648ae6db43c75663ac7e5414eb79b5704","name":"Blockzero Labs","symbol":"XIO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10029/thumb/blockzero.jpg?1611110205"},{"chainId":1,"address":"0x08130635368aa28b217a4dfb68e1bf8dc525621c","name":"AfroDex","symbol":"AFROX","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/10047/thumb/AfroDex_LOGO.png?1575243022"},{"chainId":1,"address":"0x4588c3c165a5c66c020997d89c2162814aec9cd6","name":"Bitcoin Wheelchair","symbol":"BTCWH","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10067/thumb/BTCWH_Logo-1.png?1575426261"},{"chainId":1,"address":"0x2b591e99afe9f32eaa6214f7b7629768c40eeb39","name":"HEX","symbol":"HEX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10103/thumb/HEX-logo.png?1575942673"},{"chainId":1,"address":"0x70da48f4b7e83c386ef983d4cef4e58c2c09d8ac","name":"Quras Token","symbol":"XQC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10112/thumb/FZFHac2z_400x400.jpg?1575964560"},{"chainId":1,"address":"0x674c6ad92fd080e4004b2312b45f796a192d27a0","name":"Neutrino USD","symbol":"USDN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10117/thumb/78GWcZu.png?1600845716"},{"chainId":1,"address":"0x2c537e5624e4af88a7ae4060c022609376c8d0eb","name":"BiLira","symbol":"TRYB","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/10119/thumb/v1bIhvRr_400x400.png?1576359242"},{"chainId":1,"address":"0xf51ebf9a26dbc02b13f8b3a9110dac47a4d62d78","name":"APIX","symbol":"APIX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10124/thumb/5sSKmtlA_400x400.png?1576126911"},{"chainId":1,"address":"0x6ca88cc8d9288f5cad825053b6a1b179b05c76fc","name":"Universal Protocol ","symbol":"UPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10136/thumb/yS35aK0t_400x400_%281%29.jpg?1576191179"},{"chainId":1,"address":"0x00006100f7090010005f1bd7ae6122c3c2cf0090","name":"TrueAUD","symbol":"TAUD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10146/thumb/TAUD.png?1576466892"},{"chainId":1,"address":"0x06af07097c9eeb7fd685c692751d5c66db49c215","name":"Chai","symbol":"CHAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10147/thumb/CHAI.png?1576467289"},{"chainId":1,"address":"0xf5dce57282a584d2746faf1593d3121fcac444dc","name":"cSAI","symbol":"CSAI","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10148/thumb/cSAI.png?1576467788"},{"chainId":1,"address":"0xcf3c8be2e2c42331da80ef210e9b1b307c03d36a","name":"BEPRO Network","symbol":"BEPRO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10251/thumb/logo.png?1610592699"},{"chainId":1,"address":"0x3c7b464376db7c9927930cf50eefdea2eff3a66a","name":"USDA","symbol":"USDA","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10280/thumb/71706577_106238760785222_2649249116525166592_n.png?1576972115"},{"chainId":1,"address":"0x6368e1e18c4c419ddfc608a0bed1ccb87b9250fc","name":"Tap","symbol":"XTP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10291/thumb/0_3SJYkk_400x400.jpg?1577229220"},{"chainId":1,"address":"0x73cee8348b9bdd48c64e13452b8a6fbc81630573","name":"Egoras","symbol":"EGR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10293/thumb/egoras.png?1594434887"},{"chainId":1,"address":"0x13339fd07934cd674269726edf3b5ccee9dd93de","name":"Curio","symbol":"CUR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10314/thumb/is8-HSAQ99o3KejDDwfnqnzW_tOHbqsEPHQlYL_UEVDeVfKhbMe871CfCrEo_BYAeC1MtEFUGcd1aZ2YtJopCQKr5tEbz9dyLmBw7nJGuOgWE4fGa4Bsui2bt8yMSZQt6meB2hAbZ1VPUf6J5pgVPslRkH3C7pSsapnpZslVi0eD7U8wb7CucXp6xuI3T0rsBQaBbHtftdoUrz8d0WiYLcwpflI6A1dVOlCXUIk9llfTuTJE.jpg?1577834182"},{"chainId":1,"address":"0x970b9bb2c0444f5e81e9d0efb84c8ccdcdcaf84d","name":"Fuse Network Token","symbol":"FUSE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10347/thumb/vUXKHEe.png?1601523640"},{"chainId":1,"address":"0x4b1e80cac91e2216eeb63e29b957eb91ae9c2be8","name":"Jupiter","symbol":"JUP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10351/thumb/Jupiter-Logo-Def-No-Stroke-256px.png?1613529417"},{"chainId":1,"address":"0xb5a4ac5b04e777230ba3381195eff6a60c3934f2","name":"inSure DeFi","symbol":"SURE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10354/thumb/logo200.png?1578435990"},{"chainId":1,"address":"0x37236cd05b34cc79d3715af2383e96dd7443dcf1","name":"Small Love Potion","symbol":"SLP","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/10366/thumb/SLP.png?1578640057"},{"chainId":1,"address":"0x48783486ddd7fa85eca6b0c4ae8920bc25dfbcd7","name":"GoMoney2","symbol":"GOM2","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/10374/thumb/lvAhDIqmH0fh6U3NIiYLmKETR3uUBcySAv-K28eW6CCFm-ODhCdId71Ug5c4TCoEtxsre30Efe08muctK0MlK-JPdAbxilzZ7dHyiBNOCvcc_9AmJIo09TRLaiAafgqcFKsxpNOON2D28oTLnVTaqwxWL8zKSzjbI6ChKTCJKOiM2mq7VhQRZYe93StR30mf2O7DnkqmGEbZ5_i.jpg?1578675305"},{"chainId":1,"address":"0x8a9c67fee641579deba04928c4bc45f66e26343a","name":"Jarvis Reward Token","symbol":"JRT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10390/thumb/cfeii0y.png?1578868949"},{"chainId":1,"address":"0x20ae0ca9d42e6ffeb1188f341a7d63450452def6","name":"CIPHER","symbol":"CPR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10392/thumb/cipher-logo.png?1578891757"},{"chainId":1,"address":"0xcfad57a67689809cda997f655802a119838c9cec","name":"Benscoin","symbol":"BSC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10393/thumb/Benscoin_Logo_200x200_%28CoinGecko%29.png?1594432611"},{"chainId":1,"address":"0x14409b0fc5c7f87b5dad20754fe22d29a3de8217","name":"PYRO Network","symbol":"PYRO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10413/thumb/ldWtWr6.png?1579127581"},{"chainId":1,"address":"0xdcfe18bc46f5a0cd0d3af0c2155d2bcb5ade2fc5","name":"Hue","symbol":"HUE","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/10420/thumb/untitled.png?1579141360"},{"chainId":1,"address":"0xac9bb427953ac7fddc562adca86cf42d988047fd","name":"Scatter cx","symbol":"STT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10422/thumb/scatter.png?1580876890"},{"chainId":1,"address":"0x5abfd418adb35e89c68313574eb16bdffc15e607","name":"Timvi","symbol":"TMV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10424/thumb/MiSBHza.png?1603596390"},{"chainId":1,"address":"0xaea8e1b6cb5c05d1dac618551c76bcd578ea3524","name":"Sogur","symbol":"SGR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10429/thumb/sgr.png?1600827772"},{"chainId":1,"address":"0xc962ad021a69d457564e985738c719ae3f79b707","name":"IFX24","symbol":"IFX24","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10444/thumb/lpFSaoD.png?1579475634"},{"chainId":1,"address":"0xa2b0fde6d710e201d0d608e924a484d1a5fed57c","name":"sXRP","symbol":"SXRP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10455/thumb/sXRP.png?1579575399"},{"chainId":1,"address":"0x4922a015c4407f87432b179bb209e125432e4a2a","name":"Tether Gold","symbol":"XAUT","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/10481/thumb/tether-gold.png?1579946148"},{"chainId":1,"address":"0xa6e7dc135bdf4b3fee7183eab2e87c0bb9684783","name":"BIGOCOIN","symbol":"BIGO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10564/thumb/Bigocoin_1200px.jpg?1597463586"},{"chainId":1,"address":"0x309627af60f0926daa6041b8279484312f2bf060","name":"USD Bancor","symbol":"USDB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10619/thumb/busd.png?1581026228"},{"chainId":1,"address":"0xbcc66ed2ab491e9ae7bf8386541fb17421fa9d35","name":"Skull","symbol":"SKULL","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/10641/thumb/skull.png?1581339740"},{"chainId":1,"address":"0xc1fb6c015fc535abd331d3029de76a62e412fb23","name":"Forcer","symbol":"FORCER","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/10642/thumb/logo.png?1581339963"},{"chainId":1,"address":"0x4ddc2d193948926d02f9b1fe9e1daa0718270ed5","name":"cETH","symbol":"CETH","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10643/thumb/ceth2.JPG?1581389598"},{"chainId":1,"address":"0xb3319f5d18bc0d84dd1b4825dcde5d5f7266d407","name":"c0x","symbol":"CZRX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10644/thumb/czrx1.JPG?1581390510"},{"chainId":1,"address":"0x6c8c6b02e7b2be14d4fa6022dfd6d75921d90e4e","name":"cBAT","symbol":"CBAT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10645/thumb/cBAT1.JPG?1581390910"},{"chainId":1,"address":"0xdf801468a808a32656d2ed2d2d80b72a129739f4","name":"Somnium Space CUBEs","symbol":"CUBE","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10687/thumb/Steam_Logo200x200_02.png?1581976974"},{"chainId":1,"address":"0x3cc5eb07e0e1227613f1df58f38b549823d11cb9","name":"Ethereum eRush","symbol":"EER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10695/thumb/0x6f371ca338bbddd0baf719e1d5d0797cce20774f.png?1582153688"},{"chainId":1,"address":"0x3212b29e33587a00fb1c83346f5dbfa69a458923","name":"The Tokenized Bitco","symbol":"IMBTC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10702/thumb/imbtc.png?1585124381"},{"chainId":1,"address":"0x23b608675a2b2fb1890d3abbd85c5775c51691d5","name":"Unisocks","symbol":"SOCKS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10717/thumb/qFrcoiM.png?1582525244"},{"chainId":1,"address":"0xaffcdd96531bcd66faed95fc61e443d08f79efef","name":"Perth Mint Gold Tok","symbol":"PMGT","decimals":5,"logoURI":"https://assets.coingecko.com/coins/images/10730/thumb/pmgt_logo_256x256.png?1582668331"},{"chainId":1,"address":"0x6913ccabbc337f0ea7b4109dd8200d61c704d332","name":"Asac Coin","symbol":"ASAC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10738/thumb/NiGQ7aKr_400x400.jpg?1582778597"},{"chainId":1,"address":"0x493c8d6a973246a7b26aa8ef4b1494867a825de5","name":"NuLINK","symbol":"NLINK","decimals":3,"logoURI":"https://assets.coingecko.com/coins/images/10741/thumb/o1bMQL2.png?1582779928"},{"chainId":1,"address":"0x804e26c4eff0bb196b805bdfb5b29ab828cf0b1f","name":"Whale Coin","symbol":"WHALE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10743/thumb/whalecoin200.png?1582835568"},{"chainId":1,"address":"0x4c6e796bbfe5eb37f9e3e0f66c009c8bf2a5f428","name":"FC Bitcoin","symbol":"FCBTC","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/10750/thumb/FCBTC.png?1583053684"},{"chainId":1,"address":"0xcd62b1c403fa761baadfc74c525ce2b51780b184","name":"Aragon Court","symbol":"ANJ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10765/thumb/ANJ.png?1588956187"},{"chainId":1,"address":"0x51bc0deaf7bbe82bc9006b0c3531668a4206d27f","name":"RAKUN","symbol":"RAKU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10768/thumb/Rakun_Icon_Red_200x200.png?1583310899"},{"chainId":1,"address":"0xc00e94cb662c3520282e6f5717214004a7f26888","name":"Compound","symbol":"COMP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10775/thumb/COMP.png?1592625425"},{"chainId":1,"address":"0x0000000000b3f879cb30fe243b4dfee438691c04","name":"GasToken","symbol":"GST2","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/10779/thumb/gas.png?1583466756"},{"chainId":1,"address":"0x74faab6986560fd1140508e4266d8a7b87274ffd","name":"HyperDAO","symbol":"HDAO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10780/thumb/B7-ppPfE_400x400.png?1583467291"},{"chainId":1,"address":"0x46d473a0b3eeec9f55fade641bc576d5bc0b2246","name":"SurfExUtilityToken","symbol":"SURF","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10783/thumb/200x200-logo-blu-grey-bkg-4-e1583512409629.png?1583539501"},{"chainId":1,"address":"0x2bf91c18cd4ae9c2f2858ef9fe518180f7b5096d","name":"KIWI Token","symbol":"KIWI","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10799/thumb/kiwi_256.png?1583736957"},{"chainId":1,"address":"0xfd6c31bb6f05fc8db64f4b740ab758605c271fd8","name":"Contracoin","symbol":"CTCN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10801/thumb/Contracoin-symbol.png?1583881685"},{"chainId":1,"address":"0x5228a22e72ccc52d415ecfd199f99d0665e7733b","name":"pTokens BTC","symbol":"PBTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10805/thumb/J51iIea.png?1583891599"},{"chainId":1,"address":"0x975ce667d59318e13da8acd3d2f534be5a64087b","name":"The Whale of Blockc","symbol":"TWOB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10806/thumb/_6b6b6b.png?1587105970"},{"chainId":1,"address":"0x666d875c600aa06ac1cf15641361dec3b00432ef","name":"BTSE Token","symbol":"BTSE","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10807/thumb/BTSE_logo_Square.jpeg?1583965964"},{"chainId":1,"address":"0x95e40e065afb3059dcabe4aaf404c1f92756603a","name":"King DAG","symbol":"KDAG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10809/thumb/3xcLUorv_400x400.jpg?1591000563"},{"chainId":1,"address":"0xb52fc0f17df38ad76f290467aab57cabaeeada14","name":"VideoGamesToken","symbol":"VGTN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10815/thumb/vgtn.png?1585123177"},{"chainId":1,"address":"0xc11b1268c1a384e55c48c2391d8d480264a3a7f4","name":"cWBTC","symbol":"CWBTC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10823/thumb/cwbtc.png?1584331700"},{"chainId":1,"address":"0xfc1e690f61efd961294b3e1ce3313fbd8aa4f85d","name":"Aave DAI","symbol":"ADAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10843/thumb/aDAI.png?1584698791"},{"chainId":1,"address":"0x1763ad73694d4d64fb71732b068e32ac72a345b1","name":"BEE Coin","symbol":"BEE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10853/thumb/Xg9uPrki_400x400.jpg?1585523253"},{"chainId":1,"address":"0xb2cf3a438acf46275839a38db7594065f64151d3","name":"TheWorldsAMine","symbol":"WRLD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10859/thumb/WRLD.png?1585119261"},{"chainId":1,"address":"0xc969e16e63ff31ad4bcac3095c616644e6912d79","name":"Seed Venture","symbol":"SEED","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10860/thumb/Seed.png?1585204998"},{"chainId":1,"address":"0x3c45b24359fb0e107a4eaa56bd0f2ce66c99a0e5","name":"Apple Network","symbol":"ANK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10872/thumb/ANK.png?1585456588"},{"chainId":1,"address":"0x94ca37d108e89775dc8ae65f51ae28c2d9599f9a","name":"Cryptotipsfr","symbol":"CRTS","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/10874/thumb/CRTS.png?1613661396"},{"chainId":1,"address":"0x697ef32b4a3f5a4c39de1cb7563f24ca7bfc5947","name":"Insula","symbol":"ISLA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10884/thumb/isla.PNG?1585522028"},{"chainId":1,"address":"0x2781246fe707bb15cee3e5ea354e2154a2877b16","name":"ELYSIA","symbol":"EL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10887/thumb/CeyRVXPY_400x400.jpg?1585559128"},{"chainId":1,"address":"0x7e8539d1e5cb91d63e46b8e188403b3f262a949b","name":"SOMIDAX","symbol":"SMDX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10899/thumb/IcgJHkM.png?1585698101"},{"chainId":1,"address":"0x8933ea1ce67b946bdf2436ce860ffbb53ce814d2","name":"LINK ETH RSI Ratio ","symbol":"LINKETHRSI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10927/thumb/linketh_rsi_ratio.png?1585894605"},{"chainId":1,"address":"0x6b466b0232640382950c45440ea5b630744eca99","name":"Covid19","symbol":"CVD","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/10940/thumb/bg-2.png?1586140534"},{"chainId":1,"address":"0xd7efb00d12c2c13131fd319336fdf952525da2af","name":"Proton","symbol":"XPR","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/10941/thumb/Proton-Icon.png?1588283737"},{"chainId":1,"address":"0xf8f237d074f637d777bcd2a4712bde793f94272b","name":"ERC223","symbol":"ERC223","decimals":10,"logoURI":"https://assets.coingecko.com/coins/images/10946/thumb/20200328_235557.png?1586222500"},{"chainId":1,"address":"0x04fa0d235c4abf4bcf4787af4cf447de572ef828","name":"UMA","symbol":"UMA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10951/thumb/UMA.png?1586307916"},{"chainId":1,"address":"0x196f4727526ea7fb1e17b2071b3d8eaa38486988","name":"Reserve","symbol":"RSV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10952/thumb/Reserve.png?1586372277"},{"chainId":1,"address":"0x0327112423f3a68efdf1fcf402f6c5cb9f7c33fd","name":"PieDAO BTC ","symbol":"BTC++","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10959/thumb/BTC__.png?1586499443"},{"chainId":1,"address":"0x56ed2f7dac19243df100bac10364c56df20cb1e9","name":"Brapper Token","symbol":"BRAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10962/thumb/photo_2019-09-12_01-04-13-400x400.jpg?1586506435"},{"chainId":1,"address":"0x8ba6dcc667d3ff64c1a2123ce72ff5f0199e5315","name":"Alex","symbol":"ALEX","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/10972/thumb/ALEX.png?1586742545"},{"chainId":1,"address":"0x8b6c3b7c01d9db4393f9aa734750f36df1543e9a","name":"Vid","symbol":"VI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10978/thumb/VI_Icon_%281%29.jpg?1594358218"},{"chainId":1,"address":"0xeb7355c2f217b3485a591332fe13c8c5a76a581d","name":"Jubi Token","symbol":"JT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10994/thumb/Af5MFcVY_400x400.jpg?1586998222"},{"chainId":1,"address":"0x5313e18463cf2f4b68b392a5b11f94de5528d01d","name":"ULLU","symbol":"ULLU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11003/thumb/HHo1IBgw_400x400.jpg?1587087634"},{"chainId":1,"address":"0x646b41183bb0d18c01f75f630688d613a5774dc7","name":"BLUEKEY","symbol":"BKY","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11013/thumb/bluekeymarket.PNG?1587113081"},{"chainId":1,"address":"0x70fadbe1f2cccbaf98ac88fdcf94a0509a48e46d","name":"Green Light","symbol":"GL","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11015/thumb/greenlight.PNG?1587114464"},{"chainId":1,"address":"0xb83cd8d39462b761bb0092437d38b37812dd80a2","name":"Golden Ratio Token","symbol":"GRT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11022/thumb/golden_ratio_token.png?1592811112"},{"chainId":1,"address":"0x25cef4fb106e76080e88135a0e4059276fa9be87","name":"Imperial","symbol":"UNITS","decimals":5,"logoURI":"https://assets.coingecko.com/coins/images/11025/thumb/Imperial.png?1587285955"},{"chainId":1,"address":"0x035df12e0f3ac6671126525f1015e47d79dfeddf","name":"0xMonero","symbol":"0XMR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11035/thumb/0xmnr.PNG?1587357680"},{"chainId":1,"address":"0x491604c0fdf08347dd1fa4ee062a822a5dd06b5d","name":"Cartesi","symbol":"CTSI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11038/thumb/cartesi.png?1592288021"},{"chainId":1,"address":"0x310da5e1e61cd9d6eced092f085941089267e71e","name":"Money Token","symbol":"MNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11039/thumb/mnt_200_by_200.png?1595310635"},{"chainId":1,"address":"0xcdd0a6b15b49a9eb3ce011cce22fac2ccf09ece6","name":"ARMTOKEN","symbol":"TARM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11040/thumb/o5FoEVG.png?1587515392"},{"chainId":1,"address":"0x1062fdf250b44697216d07e41df93824519f47aa","name":"Cryptolandy","symbol":"CRYPL","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11046/thumb/crypl.png?1587526012"},{"chainId":1,"address":"0x4bebe99fac607dc7ef2d99d352ca18999f51b709","name":"Bloc","symbol":"DAP","decimals":10,"logoURI":"https://assets.coingecko.com/coins/images/11059/thumb/b4e2de_467f4949d9a240ffbe68bc0808dfbe5a_mv2.jpg?1597823810"},{"chainId":1,"address":"0x0ae055097c6d159879521c384f1d2123d1f195e6","name":"xDAI Stake","symbol":"STAKE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11061/thumb/xdai.png?1587714165"},{"chainId":1,"address":"0xf26893f89b23084c4c6216038d6ebdbe9e96c5cb","name":"Mega Lottery Servic","symbol":"MLR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11072/thumb/gg1NiOsG_400x400.jpg?1587958538"},{"chainId":1,"address":"0x686c650dbcfeaa75d09b883621ad810f5952bd5d","name":"AAX Token","symbol":"AAB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11073/thumb/GluwoJk__400x400.jpg?1587969347"},{"chainId":1,"address":"0x79c5a1ae586322a07bfb60be36e1b31ce8c84a1e","name":"Freight Trust Netwo","symbol":"EDI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11074/thumb/e6YLf6kD_400x400.jpg?1587970897"},{"chainId":1,"address":"0x2e3c062e16c1a3a04ddc5003c62e294305d83684","name":"LITonium","symbol":"LIT","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/11079/thumb/Picture_20200206_154444187.png?1588000262"},{"chainId":1,"address":"0x40fd72257597aa14c7231a7b1aaa29fce868f677","name":"Sora","symbol":"XOR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11093/thumb/sora_logo_cg_white.png?1588284194"},{"chainId":1,"address":"0x1f6deadcb526c4710cf941872b86dcdfbbbd9211","name":"Ruletka","symbol":"RTK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11102/thumb/rtk-logo.png?1595212217"},{"chainId":1,"address":"0x5fbdb42bb048c685c990a37f2c87fe087c586655","name":"Xenon","symbol":"XEN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11105/thumb/DyNZKe79_400x400.jpg?1588568617"},{"chainId":1,"address":"0xb4742e2013f96850a5cef850a3bb74cf63b9a5d5","name":"EANTO","symbol":"EAN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11120/thumb/BKL0LdS7_400x400.png?1588730490"},{"chainId":1,"address":"0x147faf8de9d8d8daae129b187f0d02d819126750","name":"GeoDB","symbol":"GEO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11130/thumb/geodb.png?1588941704"},{"chainId":1,"address":"0x7b123f53421b1bf8533339bfbdc7c98aa94163db","name":"dfohub","symbol":"BUIDL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11131/thumb/buidllogo.png?1599577041"},{"chainId":1,"address":"0xd6940a1ffd9f3b025d1f1055abcfd9f7cda81ef9","name":"YouForia","symbol":"YFR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11132/thumb/6Won2ZF.png?1588903985"},{"chainId":1,"address":"0xa1d65e8fb6e87b60feccbc582f7f97804b725521","name":"DXdao","symbol":"DXD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11148/thumb/dxdao.png?1607999331"},{"chainId":1,"address":"0x1a5f9352af8af974bfc03399e3767df6370d82e4","name":"OWL","symbol":"OWL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11149/thumb/gnosis-owl_32.png?1589057849"},{"chainId":1,"address":"0x3d371413dd5489f3a04c07c0c2ce369c20986ceb","name":"YOUcash","symbol":"YOUC","decimals":10,"logoURI":"https://assets.coingecko.com/coins/images/11152/thumb/round-400x400.png?1589162715"},{"chainId":1,"address":"0xbca3c97837a39099ec3082df97e28ce91be14472","name":"DUST Token","symbol":"DUST","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11162/thumb/DUST.png?1589280496"},{"chainId":1,"address":"0xa9fbb83a2689f4ff86339a4b96874d718673b627","name":"FireAnts","symbol":"ANTS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11179/thumb/ants200.png?1589510693"},{"chainId":1,"address":"0x8daebade922df735c38c80c7ebd708af50815faa","name":"tBTC","symbol":"TBTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11224/thumb/tBTC.png?1589620754"},{"chainId":1,"address":"0xf3a2ace8e48751c965ea0a1d064303aca53842b9","name":"HXY Money","symbol":"HXY","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11225/thumb/hexmoneygradientsmall.png?1595305947"},{"chainId":1,"address":"0x02fdd6866333d8cd8b1ca022d382080698060bc2","name":"6ix9ine Chain","symbol":"69C","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11260/thumb/6ix9ineChain.png?1589789641"},{"chainId":1,"address":"0x04abeda201850ac0124161f037efd70c74ddc74c","name":"Nest Protocol","symbol":"NEST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11284/thumb/52954052.png?1589868539"},{"chainId":1,"address":"0xd15ecdcf5ea68e3995b2d0527a0ae0a3258302f8","name":"Machi X","symbol":"MCX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11329/thumb/MachiX.png?1589926940"},{"chainId":1,"address":"0x08d967bb0134f2d07f7cfb6e246680c53927dd30","name":"MATH","symbol":"MATH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11335/thumb/2020-05-19-token-200.png?1589940590"},{"chainId":1,"address":"0xeb4c2781e4eba804ce9a9803c67d0893436bb27d","name":"renBTC","symbol":"RENBTC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11370/thumb/renBTC.png?1589985711"},{"chainId":1,"address":"0x4ba6ddd7b89ed838fed25d208d4f644106e34279","name":"Vether","symbol":"VETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11375/thumb/HQ6nQhH.png?1605492813"},{"chainId":1,"address":"0xa8b919680258d369114910511cc87595aec0be6d","name":"LUKSO Token","symbol":"LYXE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11423/thumb/1_QAHTciwVhD7SqVmfRW70Pw.png?1590110612"},{"chainId":1,"address":"0x2c50ba1ed5e4574c1b613b044bd1876f0b0b87a9","name":"Kids Cash","symbol":"KASH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11467/thumb/kash.png?1590242267"},{"chainId":1,"address":"0x96c645d3d3706f793ef52c19bbace441900ed47d","name":"Mt Pelerin Shares","symbol":"MPS","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/11471/thumb/MPS.png?1590319120"},{"chainId":1,"address":"0xa7de087329bfcda5639247f96140f9dabe3deed1","name":"Statera","symbol":"STA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11472/thumb/Statera.png?1590415353"},{"chainId":1,"address":"0xc760721eb65aa6b0a634df6a008887c48813ff63","name":"Cryptorg Token","symbol":"CTG","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11474/thumb/crystal_200.png?1590450209"},{"chainId":1,"address":"0x249f71f8d9da86c60f485e021b509a206667a079","name":"Singular J","symbol":"SNGJ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11475/thumb/SNGJ_logo_200x200.png?1590450436"},{"chainId":1,"address":"0xef9cd7882c067686691b6ff49e650b43afbbcc6b","name":"FinNexus","symbol":"FNX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11488/thumb/finnexus_gecko.png?1591260971"},{"chainId":1,"address":"0xbe5b336ef62d1626940363cf34be079e0ab89f20","name":"Bnoincoin","symbol":"BNC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11511/thumb/bnoincoin_cryptocoin-1.png?1590489689"},{"chainId":1,"address":"0xb26631c6dda06ad89b93c71400d25692de89c068","name":"Minds","symbol":"MINDS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11517/thumb/Minds.png?1590580465"},{"chainId":1,"address":"0x9b53e429b0badd98ef7f01f03702986c516a5715","name":"Hybrix","symbol":"HY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11518/thumb/icon_%282%29.png?1590618414"},{"chainId":1,"address":"0x06f65b8cfcb13a9fe37d836fe9708da38ecb29b2","name":"SAINT FAME Genesis","symbol":"FAME","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11521/thumb/FAME.png?1590622461"},{"chainId":1,"address":"0x793e2602a8396468f3ce6e34c1b6c6fd6d985bad","name":" ICK Mask","symbol":"ICK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11522/thumb/ICK.png?1590622642"},{"chainId":1,"address":"0x38a2fdc11f526ddd5a607c1f251c065f40fbf2f7","name":"PhoenixDAO","symbol":"PHNX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11523/thumb/PhoenixDAO.png?1590680344"},{"chainId":1,"address":"0x7841b2a48d1f6e78acec359fed6d874eb8a0f63c","name":"KERMAN","symbol":"KERMAN","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/11536/thumb/Kerman.png?1590776066"},{"chainId":1,"address":"0x0a4b2d4b48a63088e0897a3f147ba37f81a27722","name":"CuraDAI","symbol":"CURA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11540/thumb/61919000.png?1590983686"},{"chainId":1,"address":"0x60571e95e12c78cba5223042692908f0649435a5","name":"PLAAS FARMERS TOKEN","symbol":"PLAAS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11541/thumb/Logo_%289%29.png?1590984188"},{"chainId":1,"address":"0x35dd2ebf20746c6e658fac75cd80d4722fae62f6","name":"CryptoBet","symbol":"CBET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11543/thumb/TvJUqCso_400x400.jpg?1591066399"},{"chainId":1,"address":"0xf0fac7104aac544e4a7ce1a55adf2b5a25c65bd1","name":"Pamp Network","symbol":"PAMP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11546/thumb/pMqJaqDK_400x400.jpg?1595199126"},{"chainId":1,"address":"0x85eba557c06c348395fd49e35d860f58a4f7c95a","name":"H3X","symbol":"H3X","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11554/thumb/Ps3O6GY.png?1591058696"},{"chainId":1,"address":"0x580c8520deda0a441522aeae0f9f7a5f29629afa","name":"Dawn Protocol","symbol":"DAWN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11555/thumb/dawn_protocol.png?1591060256"},{"chainId":1,"address":"0x261efcdd24cea98652b9700800a13dfbca4103ff","name":"sXAU","symbol":"SXAU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11559/thumb/sXAU.png?1591090407"},{"chainId":1,"address":"0x5caf454ba92e6f2c929df14667ee360ed9fd5b26","name":"Dev Protocol","symbol":"DEV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11560/thumb/Dev_Protocol__CoinGecko_Logo___Jan.18.2021_.png?1611021474"},{"chainId":1,"address":"0x679131f591b4f369acb8cd8c51e68596806c3916","name":"Trustlines Network","symbol":"TLN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11562/thumb/Trustlines.png?1591152088"},{"chainId":1,"address":"0x459086f2376525bdceba5bdda135e4e9d3fef5bf","name":"renBCH","symbol":"RENBCH","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11563/thumb/renBCH.png?1591185978"},{"chainId":1,"address":"0x1c5db575e2ff833e46a2e9864c22f4b22e0b37c2","name":"renZEC","symbol":"RENZEC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11564/thumb/renZEC.png?1591186101"},{"chainId":1,"address":"0xd9a947789974bad9be77e45c2b327174a9c59d71","name":"Ystar","symbol":"YSR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11575/thumb/256_256.png?1600495476"},{"chainId":1,"address":"0xe2f2a5c287993345a840db3b0845fbc70f5935a5","name":"mStable USD","symbol":"MUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11576/thumb/mStable_USD.png?1595591803"},{"chainId":1,"address":"0xdc5864ede28bd4405aa04d93e05a0531797d9d59","name":"Falcon Project","symbol":"FNT","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/11579/thumb/falcon_ava_black.png?1591317863"},{"chainId":1,"address":"0x0000000000004946c0e9f43f4dee607b0ef1fa1c","name":"Chi Gastoken","symbol":"CHI","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/11583/thumb/chi.png?1591331659"},{"chainId":1,"address":"0xb6c4267c4877bb0d6b1685cfd85b0fbe82f105ec","name":"Relevant","symbol":"REL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11586/thumb/Relevant.png?1591390081"},{"chainId":1,"address":"0x0f8794f66c7170c4f9163a8498371a747114f6c4","name":"Flama","symbol":"FMA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11587/thumb/Flama.png?1591498092"},{"chainId":1,"address":"0x96b52b5bf8d902252d0714a1bd2651a785fd2660","name":"EtherBone","symbol":"ETHBN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11596/thumb/dogdata.png?1591667966"},{"chainId":1,"address":"0x0e7f79e89ba8c4a13431129fb2db0d4f444b5b9a","name":"Xank","symbol":"XANK","decimals":16,"logoURI":"https://assets.coingecko.com/coins/images/11599/thumb/9zAYweVj_400x400.png?1591671435"},{"chainId":1,"address":"0xf5238462e7235c7b62811567e63dd17d12c2eaa0","name":"CACHE Gold","symbol":"CGT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11601/thumb/cache-gold-icon-200x200.png?1591755874"},{"chainId":1,"address":"0x26ce25148832c04f3d7f26f32478a9fe55197166","name":"DexTools","symbol":"DEXT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11603/thumb/dext.png?1605790188"},{"chainId":1,"address":"0xf2f9a7e93f845b3ce154efbeb64fb9346fcce509","name":"UniPower","symbol":"POWER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11618/thumb/unipower.png?1591943398"},{"chainId":1,"address":"0xf650c3d88d12db855b8bf7d11be6c55a4e07dcc9","name":"cUSDT","symbol":"CUSDT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11621/thumb/cUSDT.png?1592113270"},{"chainId":1,"address":"0x5299d6f7472dcc137d7f3c4bcfbbb514babf341a","name":"sXMR","symbol":"SXMR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11625/thumb/sXMR.png?1592124269"},{"chainId":1,"address":"0x6de037ef9ad2725eb40118bb1702ebb27e4aeb24","name":"Render Token","symbol":"RNDR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11636/thumb/uTDd98ZN_400x400.jpg?1592200150"},{"chainId":1,"address":"0x256845e721c0c46d54e6afbd4fa3b52cb72353ea","name":"UniDollar","symbol":"UNIUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11637/thumb/Unidollar.png?1592272468"},{"chainId":1,"address":"0x6b785a0322126826d8226d77e173d75dafb84d11","name":"Bankroll Vault","symbol":"VLT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11638/thumb/vlt-200.png?1592272725"},{"chainId":1,"address":"0x91d6f6e9026e43240ce6f06af6a4b33129ebde94","name":"Rivex","symbol":"RVX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11644/thumb/200px_logo_RX_3d-01.png?1602130114"},{"chainId":1,"address":"0x9a48bd0ec040ea4f1d3147c025cd4076a2e71e3e","name":"PieDAO USD ","symbol":"USD++","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11658/thumb/USD__.png?1592389079"},{"chainId":1,"address":"0x89ab32156e46f46d02ade3fecbe5fc4243b9aaed","name":"pNetwork","symbol":"PNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11659/thumb/pNetwork.png?1592411134"},{"chainId":1,"address":"0x051aab38d46f6ebb551752831c7280b2b42164db","name":"FreelancerChain","symbol":"FCN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11661/thumb/LOGO200_%286%29.png?1592432680"},{"chainId":1,"address":"0x27702a26126e0b3702af63ee09ac4d1a084ef628","name":"Aleph im","symbol":"ALEPH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11676/thumb/Monochram-aleph.png?1608483725"},{"chainId":1,"address":"0xed91879919b71bb6905f23af0a68d231ecf87b14","name":"DMM Governance","symbol":"DMG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11677/thumb/dmm.png?1592674690"},{"chainId":1,"address":"0x58a3520d738b268c2353ecee518a1ad8e28e4ae5","name":"HEIDI","symbol":"HDI","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/11679/thumb/Untitled-design-4-removebg-preview.png?1592789518"},{"chainId":1,"address":"0xba100000625a3754423978a60c9317c58a424e3d","name":"Balancer","symbol":"BAL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11683/thumb/Balancer.png?1592792958"},{"chainId":1,"address":"0x4f56221252d117f35e2f6ab937a3f77cad38934d","name":"CryptoCricketClub","symbol":"3CS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11685/thumb/crypto-cricket-club-logo-e1592305032921.png?1592793917"},{"chainId":1,"address":"0x95172ccbe8344fecd73d0a30f54123652981bd6f","name":"Meridian Network","symbol":"LOCK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11687/thumb/LOCK_cropped.png?1599614902"},{"chainId":1,"address":"0xb4058411967d5046f3510943103805be61f0600e","name":"STONK","symbol":"STONK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11690/thumb/Iu1YBsl.png?1592798197"},{"chainId":1,"address":"0x827eed050df933f6fda3a606b5f716cec660ecba","name":"BurnDrop","symbol":"BD","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11691/thumb/Burn_Drop_Logo_200x200.png?1592798838"},{"chainId":1,"address":"0x4599836c212cd988eaccc54c820ee9261cdaac71","name":"Cryptid","symbol":"CID","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11692/thumb/yWrCHzW.png?1592799534"},{"chainId":1,"address":"0xf80d589b3dbe130c270a69f1a69d050f268786df","name":"Datamine","symbol":"DAM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11695/thumb/qxsFH8W.png?1592880463"},{"chainId":1,"address":"0x61cdb66e56fad942a7b5ce3f419ffe9375e31075","name":"RAIN Network","symbol":"RAIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11699/thumb/v4Bpj2k.png?1592963188"},{"chainId":1,"address":"0x34612903db071e888a4dadcaa416d3ee263a87b9","name":"Items","symbol":"ARTE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11720/thumb/Arte.png?1607332372"},{"chainId":1,"address":"0xa0471cdd5c0dc2614535fd7505b17a651a8f0dab","name":"EasySwap","symbol":"ESWA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11721/thumb/Easyswap.png?1593080991"},{"chainId":1,"address":"0x265ba42daf2d20f3f358a7361d9f69cb4e28f0e6","name":"Unibomb","symbol":"UBOMB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11722/thumb/aLjLmGNT_400x400.png?1596603288"},{"chainId":1,"address":"0x625ae63000f46200499120b906716420bd059240","name":"Aave SUSD","symbol":"ASUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11723/thumb/aSUSD.png?1593082612"},{"chainId":1,"address":"0xa64bd6c70cb9051f6a9ba1f163fdc07e0dfb5f84","name":"Aave LINK","symbol":"ALINK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11729/thumb/aLINK.png?1593084323"},{"chainId":1,"address":"0x328c4c80bc7aca0834db37e6600a6c49e12da4de","name":"Aave SNX","symbol":"ASNX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11733/thumb/aSNX.png?1593085047"},{"chainId":1,"address":"0x6ee0f7bb50a54ab5253da0667b0dc2ee526c30a8","name":"Aave BUSD","symbol":"ABUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11736/thumb/aBUSD.png?1593085489"},{"chainId":1,"address":"0x239b0fa917d85c21cf6435464c2c6aa3d45f6720","name":"Amun Ether 3x Daily","symbol":"ETH3L","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11740/thumb/token-eth3l.png?1593140154"},{"chainId":1,"address":"0xe61eecfdba2ad1669cee138f1919d08ced070b83","name":"VGTGToken","symbol":"VGTG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11742/thumb/vgtg_gold_209x209.png?1593142842"},{"chainId":1,"address":"0x995de3d961b40ec6cdee0009059d48768ccbdd48","name":"Union Fair Coin","symbol":"UFC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11750/thumb/maiOmI3b_400x400.png?1593417703"},{"chainId":1,"address":"0x469eda64aed3a3ad6f868c44564291aa415cb1d9","name":"FLUX","symbol":"FLUX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11756/thumb/fluxres.png?1593748917"},{"chainId":1,"address":"0x95ba34760ac3d7fbe98ee8b2ab33b4f1a6d18878","name":"DeCash","symbol":"DESH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11772/thumb/Logo_Blanc_%28DESH%29_V3_200x200_rond.png?1597752785"},{"chainId":1,"address":"0xeeee2a622330e6d2036691e983dee87330588603","name":"Asko","symbol":"ASKO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11773/thumb/Asko_Logo_%28200x200%29.png?1604706371"},{"chainId":1,"address":"0x43044f861ec040db59a7e324c40507addb673142","name":"Cap","symbol":"CAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11775/thumb/CAP.png?1594083244"},{"chainId":1,"address":"0xf29e46887ffae92f1ff87dfe39713875da541373","name":"UniCrypt Old ","symbol":"UNC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11782/thumb/200x200_%289%29.png?1593999474"},{"chainId":1,"address":"0xfab25d4469444f28023075db5932497d70094601","name":"European Coin Allia","symbol":"ECA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11785/thumb/eca.png?1594001400"},{"chainId":1,"address":"0x638155f4bd8f85d401da32498d8866ee39a150b8","name":"Jurasaur","symbol":"JREX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11792/thumb/jura_logo.png?1594172306"},{"chainId":1,"address":"0xcc4304a31d09258b0029ea7fe63d032f52e44efe","name":"Trustswap","symbol":"SWAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11795/thumb/Trustswap.png?1594311216"},{"chainId":1,"address":"0x4e352cf164e64adcbad318c3a1e222e9eba4ce42","name":"MCDEX","symbol":"MCB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11796/thumb/mcb.png?1594355515"},{"chainId":1,"address":"0x9355372396e3f6daf13359b7b607a3374cc638e0","name":"WHALE","symbol":"WHALE","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/11797/thumb/WHALE.png?1595004706"},{"chainId":1,"address":"0xd6bd97a26232ba02172ff86b055d5d7be789335b","name":"Ormeus Cash","symbol":"OMC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11798/thumb/Vooo8SX.png?1594359387"},{"chainId":1,"address":"0x0d4b4da5fb1a7d55e85f8e22f728701ceb6e44c9","name":"DigiMax","symbol":"DGMT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11807/thumb/0053e154-964b-485a-9827-d3ef7015a9b9.png?1594375316"},{"chainId":1,"address":"0x56d811088235f11c8920698a204a5010a788f4b3","name":"bZx Protocol","symbol":"BZRX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11811/thumb/bzrx.png?1594563172"},{"chainId":1,"address":"0x55eb5288c9b65037a4cd2289637f38a4f9db3a6b","name":"KAWANGGAWA","symbol":"KGW","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11815/thumb/f_HFXjBE_400x400.jpg?1594597195"},{"chainId":1,"address":"0x30f271c9e86d2b7d00a6376cd96a1cfbd5f0b9b3","name":"Decentr","symbol":"DEC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11816/thumb/Decentr.png?1594637985"},{"chainId":1,"address":"0x40f8b7a82b6355d26546d363ce9c12ce104cf0ce","name":"GLOBALTRUSTFUND TOK","symbol":"GTF","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11817/thumb/gtf.png?1594679456"},{"chainId":1,"address":"0xc4199fb6ffdb30a829614beca030f9042f1c3992","name":"snglsDAO Governance","symbol":"SGT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11823/thumb/SGT-icon.png?1594681863"},{"chainId":1,"address":"0x625687081ba9fcbffb0ae6bfe8d7fad6f616f494","name":"Medalte","symbol":"MDTL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11827/thumb/PicsArt_05-15-08.59.17-1-e1590371242800.png?1594710840"},{"chainId":1,"address":"0x37ee79e0b44866876de2fb7f416d0443dd5ae481","name":"Tatcoin","symbol":"TAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11828/thumb/54098571.png?1594714629"},{"chainId":1,"address":"0xe1afe1fd76fd88f78cbf599ea1846231b8ba3b6b","name":"sDEFI","symbol":"SDEFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11832/thumb/sDEFI.png?1594787588"},{"chainId":1,"address":"0x0258f474786ddfd37abce6df6bbb1dd5dfc4434a","name":"Orion Protocol","symbol":"ORN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11841/thumb/orion_logo.png?1594943318"},{"chainId":1,"address":"0xfca59cd816ab1ead66534d82bc21e7515ce441cf","name":"Rarible","symbol":"RARI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11845/thumb/Rari.png?1594946953"},{"chainId":1,"address":"0xa3bed4e1c75d00fa6f4e5e6922db7261b5e9acd2","name":"Meta","symbol":"MTA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11846/thumb/mStable.png?1594950533"},{"chainId":1,"address":"0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e","name":"yearn finance","symbol":"YFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11849/thumb/yfi-192x192.png?1598325330"},{"chainId":1,"address":"0x7533d63a2558965472398ef473908e1320520ae2","name":"INTEXCOIN","symbol":"INTX","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/11854/thumb/INTX.png?1595167044"},{"chainId":1,"address":"0xdf5e0e81dff6faf3a7e52ba697820c5e32d806a8","name":"LP yCurve","symbol":"YCURVE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11858/thumb/yCrv.png?1595203628"},{"chainId":1,"address":"0xdaab5e695bb0e8ce8384ee56ba38fa8290618e52","name":"CRDT","symbol":"CRDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11859/thumb/image_%281%29.png?1600937373"},{"chainId":1,"address":"0x5c84bc60a796534bfec3439af0e6db616a966335","name":"Bone","symbol":"BONE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11860/thumb/Bone200x200.png?1595231768"},{"chainId":1,"address":"0xc76fb75950536d98fa62ea968e1d6b45ffea2a55","name":"Unit Protocol","symbol":"COL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11862/thumb/Unit.png?1595580755"},{"chainId":1,"address":"0xa10ae543db5d967a73e9abcc69c81a18a7fc0a78","name":"BLOCKCLOUT","symbol":"CLOUT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11870/thumb/communityIcon_nys28lije4b51.png?1595505057"},{"chainId":1,"address":"0x5dc60c4d5e75d22588fa17ffeb90a63e535efce0","name":"dKargo","symbol":"DKA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11875/thumb/bVD0g0dlmrEOPIkt943KZIBZ086eCshyY0jIQFti4zxYdOlFltU8tKa6uJlcA14HvNjX4bc7dxdMvlpoW5NFMND85oG4aiiCbFRhI6eowDfKEBY3BoSVY0IrBbA9SFGIxh_IYrkNC5uNdG-roZ0_TlGO3098now6Tbzga0p4IDqVk6lnaX3TuRC7pgnAYWZM15RD-uEIHr3O_3OoIIWP-.jpg?1595563347"},{"chainId":1,"address":"0xdfe691f37b6264a90ff507eb359c45d55037951c","name":"Karma DAO","symbol":"KARMA","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/11884/thumb/Karma.png?1597042574"},{"chainId":1,"address":"0x08ad83d779bdf2bbe1ad9cc0f78aa0d24ab97802","name":"Robonomics Web Serv","symbol":"RWS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11885/thumb/rws_logo.png?1595745253"},{"chainId":1,"address":"0x3f8a2f7bcd70e7f7bdd3fbb079c11d073588dea2","name":"FIRE","symbol":"FIRE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11888/thumb/tYmI5eG.png?1597282794"},{"chainId":1,"address":"0x5091aed52ad421969254e48d29aa1d1807e1870b","name":"ZOM","symbol":"ZOM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11889/thumb/zom_256px.png?1610965111"},{"chainId":1,"address":"0x0d438f3b5175bebc262bf23753c1e53d03432bde","name":"Wrapped NXM","symbol":"WNXM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11890/thumb/wrapped-nexus-mutual.jpg?1595811559"},{"chainId":1,"address":"0x9f284e1337a815fe77d2ff4ae46544645b20c5ff","name":"Darwinia Commitment","symbol":"KTON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11895/thumb/logo.png?1595856452"},{"chainId":1,"address":"0xf29992d7b589a0a6bd2de7be29a97a6eb73eaf85","name":"DMScript","symbol":"DMST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11896/thumb/h0snSnDE_400x400.jpg?1595892384"},{"chainId":1,"address":"0x1e3a2446c729d34373b87fd2c9cbb39a93198658","name":"DeFi Nation Signals","symbol":"DSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11898/thumb/iLgw2f82_400x400.png?1596078737"},{"chainId":1,"address":"0xc25a3a3b969415c80451098fa907ec722572917f","name":"LP sCurve","symbol":"SCURVE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11899/thumb/Curvefi_sCrv_32.png?1595931870"},{"chainId":1,"address":"0xa1d0e215a23d7030842fc67ce582a6afa3ccab83","name":"DFI money","symbol":"YFII","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11902/thumb/YFII-logo.78631676.png?1598677348"},{"chainId":1,"address":"0xa8892bfc33fa44053a9e402b1839966f4fec74a4","name":"Crypto User Base","symbol":"CUB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11906/thumb/logo-200x200.png?1596074026"},{"chainId":1,"address":"0x400b1d8a7dd8c471026b2c8cbe1062b27d120538","name":"Limestone Network","symbol":"LIMEX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11907/thumb/nw1FE_f4_400x400.png?1596074376"},{"chainId":1,"address":"0x2863916c6ebdbbf0c6f02f87b7eb478509299868","name":"SIMBA Storage Token","symbol":"SST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11908/thumb/1_4OdZX6cWBKd9pRGoOCG5Bg.jpeg?1596075333"},{"chainId":1,"address":"0x174bea2cb8b20646681e855196cf34fcecec2489","name":"FreeTip","symbol":"FTT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11920/thumb/sW08mMhz_400x400.jpg?1596078313"},{"chainId":1,"address":"0x0417912b3a7af768051765040a55bb0925d4ddcf","name":"Liquidity Dividends","symbol":"LID","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11921/thumb/logo-200.png?1596100933"},{"chainId":1,"address":"0x1f8f123bf24849443a56ed9fc42b9265b7f3a39a","name":"UniTopia Token","symbol":"UTO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11922/thumb/logo200.png?1596101623"},{"chainId":1,"address":"0x57700244b20f84799a31c6c96dadff373ca9d6c5","name":"TrustDAO","symbol":"TRUST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11923/thumb/trustwhite.png?1596704613"},{"chainId":1,"address":"0x1453dbb8a29551ade11d89825ca812e05317eaeb","name":"Tendies","symbol":"TEND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11924/thumb/aaaaa.jpg?1596645622"},{"chainId":1,"address":"0xf911a7ec46a2c6fa49193212fe4a2a9b95851c27","name":"Antiample","symbol":"XAMP","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/11925/thumb/antiample.png?1596168983"},{"chainId":1,"address":"0x695106ad73f506f9d0a9650a78019a93149ae07c","name":"BNS Token","symbol":"BNS","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11926/thumb/HS7eNJdt_400x400.jpg?1596170654"},{"chainId":1,"address":"0x4ba012f6e411a1be55b98e9e62c3a4ceb16ec88b","name":"Cybercoin","symbol":"CBR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11927/thumb/ezDztuH.png?1596179588"},{"chainId":1,"address":"0x49184e6dae8c8ecd89d8bdc1b950c597b8167c90","name":"LIBERTAS","symbol":"LIBERTAS","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/11928/thumb/logo200x200_%281%29.png?1596409240"},{"chainId":1,"address":"0x95ad61b0a150d79219dcf64e1e6cc01f0b64c4ce","name":"Shiba Inu","symbol":"SHIB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11939/thumb/SHIBLOGO.png?1600752116"},{"chainId":1,"address":"0xcee1d3c3a02267e37e6b373060f79d5d7b9e1669","name":"yffi finance","symbol":"YFFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11940/thumb/yffi-finance.jpg?1596289302"},{"chainId":1,"address":"0xc3dd23a0a854b4f9ae80670f528094e9eb607ccb","name":"Trendering","symbol":"TRND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11941/thumb/trnd-ico-200.png?1605147194"},{"chainId":1,"address":"0x6d6506e6f438ede269877a0a720026559110b7d5","name":"BONK Token","symbol":"BONK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11942/thumb/2Updated_2x.png?1598511690"},{"chainId":1,"address":"0x56687cf29ac9751ce2a4e764680b6ad7e668942e","name":"FlynnJamm","symbol":"JAMM","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/11943/thumb/jamm.png?1602491065"},{"chainId":1,"address":"0x355c665e101b9da58704a8fddb5feef210ef20c0","name":"dForce GOLDx","symbol":"GOLDX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11947/thumb/logo_DF_200x200_%281%29.png?1596409058"},{"chainId":1,"address":"0x3d3ab800d105fbd2f97102675a412da3dc934357","name":"Marvrodi Salute Vis","symbol":"MSV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11950/thumb/vRZShfV.jpg?1596418526"},{"chainId":1,"address":"0x6b9f031d718dded0d681c20cb754f97b3bb81b78","name":"GEEQ","symbol":"GEEQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11953/thumb/GeeqLogoPNGTransparent-1.png?1596421769"},{"chainId":1,"address":"0xe277ac35f9d327a670c1a3f3eec80a83022431e4","name":"PolypuX","symbol":"PUX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11954/thumb/puxlogoforcoingecko.png?1609516934"},{"chainId":1,"address":"0x84ca8bc7997272c7cfb4d0cd3d55cd942b3c9419","name":"DIA","symbol":"DIA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11955/thumb/DIA-icon-colour_%281%29.png?1596423488"},{"chainId":1,"address":"0x607c794cda77efb21f8848b7910ecf27451ae842","name":"DeFiPie","symbol":"PIE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11956/thumb/98j5E_EG_400x400.png?1596644614"},{"chainId":1,"address":"0x7c9d8fb3bde3d9ea6e89170618c2dc3d16695d36","name":"WhiteRockCasino","symbol":"WRC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11962/thumb/cwSeVyY.png?1605338879"},{"chainId":1,"address":"0xf0b0a13d908253d954ba031a425dfd54f94a2e3d","name":"FlashX Advance","symbol":"FSXA","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11966/thumb/logo-200x200_%281%29.png?1596460801"},{"chainId":1,"address":"0x0763fdccf1ae541a5961815c0872a8c5bc6de4d7","name":"SUKU","symbol":"SUKU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11969/thumb/UmfW5S6f_400x400.jpg?1596602238"},{"chainId":1,"address":"0x476c5e26a75bd202a9683ffd34359c0cc15be0ff","name":"Serum","symbol":"SRM","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/11970/thumb/serum-logo.png?1597121577"},{"chainId":1,"address":"0x362bc847a3a9637d3af6624eec853618a43ed7d2","name":"PARSIQ","symbol":"PRQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11973/thumb/DsNgK0O.png?1596590280"},{"chainId":1,"address":"0x2ba592f78db6436527729929aaf6c908497cb200","name":"Cream","symbol":"CREAM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11976/thumb/Cream.png?1596593418"},{"chainId":1,"address":"0xabe580e7ee158da464b51ee1a83ac0289622e6be","name":"Offshift","symbol":"XFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11977/thumb/offshift_logo.png?1596597308"},{"chainId":1,"address":"0x26b3038a7fc10b36c426846a9086ef87328da702","name":"Yield Farming Token","symbol":"YFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11981/thumb/photo_2020-08-04_03-25-28.jpg?1596622873"},{"chainId":1,"address":"0x6f87d756daf0503d08eb8993686c7fc01dc44fb1","name":"Unitrade","symbol":"TRADE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11982/thumb/unitrade.PNG?1597009487"},{"chainId":1,"address":"0x5beabaebb3146685dd74176f68a0721f91297d37","name":"Bounce","symbol":"BOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11984/thumb/photo_2020-10-19_09.17.57.jpeg?1603070366"},{"chainId":1,"address":"0x9235bda06b8807161b8fbb1e102cb654555b212f","name":"Feellike","symbol":"FLL","decimals":3,"logoURI":"https://assets.coingecko.com/coins/images/12075/thumb/FLL_logo_200.png?1596751266"},{"chainId":1,"address":"0xeeeeeeeee2af8d0e1940679860398308e0ef24d6","name":"Ethverse","symbol":"ETHV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12076/thumb/logo_%2888%29.png?1596751504"},{"chainId":1,"address":"0x722f97a435278b7383a1e3c47f41773bebf3232c","name":"UCROWDME","symbol":"UCM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12079/thumb/UKm2qXh.png?1605346168"},{"chainId":1,"address":"0x28cb7e841ee97947a86b06fa4090c8451f64c0be","name":"YF Link","symbol":"YFL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12081/thumb/YFLink.png?1596987945"},{"chainId":1,"address":"0x3c6ff50c9ec362efa359317009428d52115fe643","name":"PeerEx Network","symbol":"PERX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12091/thumb/2AyoUJyQ_400x400.jpg?1597273390"},{"chainId":1,"address":"0x990f341946a3fdb507ae7e52d17851b87168017c","name":"Strong","symbol":"STRONG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12092/thumb/STRONG-Token-256x256.png?1597823573"},{"chainId":1,"address":"0x93ecd2ecdfb91ab2fee28a8779a6adfe2851cda6","name":"LoanBurst","symbol":"LBURST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12093/thumb/oKczM17b_400x400.jpg?1597273304"},{"chainId":1,"address":"0x309013d55fb0e8c17363bcc79f25d92f711a5802","name":"Soft Bitcoin","symbol":"SBTC","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12094/thumb/soft_bitcoin_logo.jpg?1597043537"},{"chainId":1,"address":"0x4639cd8cd52ec1cf2e496a606ce28d8afb1c792f","name":"CBDAO","symbol":"BREE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12096/thumb/cbdao_logo.jpg?1597059848"},{"chainId":1,"address":"0x314bd765cab4774b2e547eb0aa15013e03ff74d2","name":"MONEY PARTY","symbol":"PARTY","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/12097/thumb/MoneyPartyIcon.png?1597103516"},{"chainId":1,"address":"0xb339fca531367067e98d7c4f9303ffeadff7b881","name":"Aludra Network","symbol":"ALD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12098/thumb/20200810_135504.jpg?1597112432"},{"chainId":1,"address":"0xb2279b6769cfba691416f00609b16244c0cf4b20","name":"Waifu Token","symbol":"WAIF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12100/thumb/Small-Waifu_token.png?1597120029"},{"chainId":1,"address":"0x2579bb08387f0de7ab135edd6c2a985a3f577b6b","name":"Sports Betting Mark","symbol":"SBX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12104/thumb/HOTavatar.png?1599272463"},{"chainId":1,"address":"0x00d1793d7c3aae506257ba985b34c76aaf642557","name":"Tacos","symbol":"TACO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12108/thumb/photo_2020-08-12_05-50-46.jpg?1597217863"},{"chainId":1,"address":"0x821144518dfe9e7b44fcf4d0824e15e8390d4637","name":"Atlantis Token","symbol":"ATIS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12112/thumb/atis_token_logo.png?1600097654"},{"chainId":1,"address":"0xa462d0e6bb788c7807b1b1c96992ce1f7069e195","name":"Equus Mining Token","symbol":"EQMT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12114/thumb/RYy8zR9jCnDE5Wqnnh-06q2UBuEq2NhsAaoeZhGLCy3q2zDcOOTTnaB8Tadw9-CO8IUQ34HwIPPFf4wG-7saZk1awoHQIaH9ZdHyKKeQth0GDewgEGbtgpNDxV2fxMbJB8CFpGljfF6LiLadmJsMmT0Gm0sZqzygRtxOAyTCMu5pVopFo5tz4I1R1NA-HDyjCBkXnxR6ovo0dbH.jpg?1597275175"},{"chainId":1,"address":"0x68a118ef45063051eac49c7e647ce5ace48a68a5","name":"Based Money","symbol":"BASED","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12115/thumb/Based.png?1597261198"},{"chainId":1,"address":"0x8a6f3bf52a26a21531514e23016eeae8ba7e7018","name":"Multiplier","symbol":"MXX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12119/thumb/MXXlogo.png?1597306184"},{"chainId":1,"address":"0x3408b204d67ba2dbca13b9c50e8a45701d8a1ca6","name":"Sendvibe","symbol":"SVB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12120/thumb/U6Uf6r70_400x400.jpg?1597298729"},{"chainId":1,"address":"0xe17f017475a709de58e976081eb916081ff4c9d5","name":"RMPL","symbol":"RMPL","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12122/thumb/rmpl_logo.jpg?1597298400"},{"chainId":1,"address":"0xc75f15ada581219c95485c578e124df3985e4ce0","name":"zzz finance","symbol":"ZZZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12123/thumb/zzz_finance_logo.jpg?1597306287"},{"chainId":1,"address":"0xd533a949740bb3306d119cc777fa900ba034cd52","name":"Curve DAO Token","symbol":"CRV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12124/thumb/Curve.png?1597369484"},{"chainId":1,"address":"0x4ecb692b0fedecd7b486b4c99044392784877e8c","name":"Cherry","symbol":"CHERRY","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/12125/thumb/clubcherry-2-scaled-uai-516x516.jpg?1597463169"},{"chainId":1,"address":"0xa19a40fbd7375431fab013a4b08f00871b9a2791","name":"Swagg Network","symbol":"SWAGG","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/12126/thumb/swagg_logo.png?1597376071"},{"chainId":1,"address":"0x1b980e05943de3db3a459c72325338d327b6f5a9","name":"Bitgear","symbol":"GEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12127/thumb/bitgear_logo.png?1597377982"},{"chainId":1,"address":"0x2129ff6000b95a973236020bcd2b2006b0d8e019","name":"MYX Network","symbol":"MYX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12128/thumb/oKkmWEt.png?1597395102"},{"chainId":1,"address":"0x3845badade8e6dff049820680d1f14bd3903a5d0","name":"SAND","symbol":"SAND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12129/thumb/sandbox_logo.jpg?1597397942"},{"chainId":1,"address":"0x2cad4991f62fc6fcd8ec219f37e7de52b688b75a","name":"Schain Wallet","symbol":"SCHA","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/12135/thumb/schain.png?1597462731"},{"chainId":1,"address":"0xd5525d397898e5502075ea5e830d8914f6f0affe","name":"Meme","symbol":"MEME","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12140/thumb/meme.jpg?1597476037"},{"chainId":1,"address":"0x6a7ef4998eb9d0f706238756949f311a59e05745","name":"Keysians Network","symbol":"KEN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12141/thumb/Keysians_logo.jpg?1597542966"},{"chainId":1,"address":"0x54c9ea2e9c9e8ed865db4a4ce6711c2a0d5063ba","name":"BarterTrade","symbol":"BART","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12142/thumb/200x200-transparent.png?1606958206"},{"chainId":1,"address":"0x539f3615c1dbafa0d008d87504667458acbd16fa","name":"Fera","symbol":"FERA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12143/thumb/IMG_20200908_085545_557.jpg?1599563732"},{"chainId":1,"address":"0x7777770f8a6632ff043c8833310e245eba9209e6","name":"Tokens of Babel","symbol":"TOB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12144/thumb/tokens_of_babel_logo.jpg?1597566356"},{"chainId":1,"address":"0x1b4052d98fb1888c2bf3b8d3b930e0aff8a910df","name":"Community Token","symbol":"COM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12145/thumb/community_token_logo.png?1597631449"},{"chainId":1,"address":"0xfbeea1c75e4c4465cb2fccc9c6d6afe984558e20","name":"DuckDaoDime","symbol":"DDIM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12146/thumb/token_DDIM-01.png?1606982032"},{"chainId":1,"address":"0x6251e725cd45fb1af99354035a414a2c0890b929","name":"MixTrust","symbol":"MXT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12148/thumb/MXT_LOGO_200_200.png?1597578983"},{"chainId":1,"address":"0x38c4102d11893351ced7ef187fcf43d33eb1abe6","name":"Shrimp Finance","symbol":"SHRIMP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12150/thumb/shrimp_logo.jpg?1597653144"},{"chainId":1,"address":"0x3593d125a4f7849a1b059e64f4517a86dd60c95d","name":"MANTRA DAO","symbol":"OM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12151/thumb/OM_3D_whtbg.png?1598332353"},{"chainId":1,"address":"0x87f5f9ebe40786d49d35e1b5997b07ccaa8adbff","name":"Rebased","symbol":"REB2","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12153/thumb/reb.png?1608516711"},{"chainId":1,"address":"0x784561b89a160990f46de6db19571ca1b5f14bce","name":"Most Protocol","symbol":"MOST","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12162/thumb/most_protocol_logo.png?1597728245"},{"chainId":1,"address":"0x0e29e5abbb5fd88e28b2d355774e73bd47de3bcd","name":"Hakka Finance","symbol":"HAKKA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12163/thumb/Hakka-icon.png?1597746776"},{"chainId":1,"address":"0x0ff6ffcfda92c53f615a4a75d982f399c989366b","name":"UniLayer","symbol":"LAYER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12164/thumb/Unilayer.jpg?1597779313"},{"chainId":1,"address":"0x646707246d7d5c2a86d7206f41ca8199ea9ced69","name":"Porkchop","symbol":"CHOP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12169/thumb/Porkchop.png?1597803275"},{"chainId":1,"address":"0xe54f9e6ab80ebc28515af8b8233c1aee6506a15e","name":"Spaghetti","symbol":"PASTA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12170/thumb/pasta_logo.png?1597803191"},{"chainId":1,"address":"0x64c5572e7a100af9901c148d75d72c619a7f1e9d","name":"UniCrapToken xyz","symbol":"UNICRAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12172/thumb/GfCR6sqZMaJmDBJ80CQBSSxzm2fe1Y0Cd87I9ZgwUU32Zr70LZDGA7ue_2aisyeXuEhweh4fQaRYg1KRbQzuZVrnDJota1LsNLgcjWj23eYTAdo8bI79hg6oxwVC-FPi58jxlqKO6e-5G-ICeqzUbW-LPQjSeG0esscG9a5y_9R64p4rMTHCqudAO01tLmBrYfIUn9bEyK-pgicSGY0.jpg?1597804376"},{"chainId":1,"address":"0x3c4030839708a20fd2fb379cf11810dde4888d93","name":"IMSWallet","symbol":"IMS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12173/thumb/wqtIArTS_400x400.jpg?1597804992"},{"chainId":1,"address":"0xcb8d1260f9c92a3a545d409466280ffdd7af7042","name":"NFT Protocol","symbol":"NFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12174/thumb/nftprotocol_32.png?1597818115"},{"chainId":1,"address":"0xbd2949f67dcdc549c6ebe98696449fa79d988a9f","name":"Meter Governance ma","symbol":"EMTRG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12175/thumb/Dark-blue-icon-transparent-vector-white-icon200x200.png?1597819237"},{"chainId":1,"address":"0x56015bbe3c01fe05bc30a8a9a9fd9a88917e7db3","name":"Cat Token","symbol":"CAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12177/thumb/cat.png?1598137093"},{"chainId":1,"address":"0xaba8cac6866b83ae4eec97dd07ed254282f6ad8a","name":"YAM v2","symbol":"YAMV2","decimals":24,"logoURI":"https://assets.coingecko.com/coins/images/12179/thumb/YAM-v2.png?1597892396"},{"chainId":1,"address":"0x2d80f5f5328fdcb6eceb7cacf5dd8aedaec94e20","name":"AGA Token","symbol":"AGA","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/12180/thumb/aga-logo.png?1597937396"},{"chainId":1,"address":"0xae697f994fc5ebc000f8e22ebffee04612f98a0d","name":"LGCY Network","symbol":"LGCY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12181/thumb/LGCY_network.jpg?1597926587"},{"chainId":1,"address":"0x31024a4c3e9aeeb256b825790f5cb7ac645e7cd5","name":"Xiotri","symbol":"XIOT","decimals":3,"logoURI":"https://assets.coingecko.com/coins/images/12182/thumb/xiot_logo_512x512.png?1601775223"},{"chainId":1,"address":"0xf552b656022c218c26dad43ad88881fc04116f76","name":"MORK","symbol":"MORK","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/12183/thumb/mork-logo.png?1597941710"},{"chainId":1,"address":"0x70d2b7c19352bb76e4409858ff5746e500f2b67c","name":"Pawtocol","symbol":"UPI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12186/thumb/pawtocol.jpg?1597962008"},{"chainId":1,"address":"0xee3b9b531f4c564c70e14b7b3bb7d516f33513ff","name":"DeFi Omega","symbol":"DFIO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12191/thumb/defi_omega_logo.png?1597978243"},{"chainId":1,"address":"0x10bae51262490b4f4af41e12ed52a0e744c1137a","name":"Soft Link","symbol":"SLINK","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12192/thumb/LogoSLINK.png?1597983753"},{"chainId":1,"address":"0xc8d2ab2a6fdebc25432e54941cb85b55b9f152db","name":"Grap Finance","symbol":"GRAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12193/thumb/0WBMFrtk_400x400.jpg?1597984167"},{"chainId":1,"address":"0xb7ba8461664de526a3ae44189727dfc768625902","name":"YMPL","symbol":"YMPL","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12194/thumb/xm0vpJqS_400x400.jpg?1597984439"},{"chainId":1,"address":"0x56cdbbeec9828962cecb3f1b69517d430295d952","name":"Davecoin","symbol":"DDTG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12195/thumb/davecoin.png?1597991174"},{"chainId":1,"address":"0x9903a4cd589da8e434f264deafc406836418578e","name":"Harrison First","symbol":"FIRST","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/12196/thumb/cc2016f6-0c74-4a95-b89b-b1684c7b9426.png?1597991823"},{"chainId":1,"address":"0x165440036ce972c5f8ebef667086707e48b2623e","name":"UniGraph","symbol":"GRAPH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12197/thumb/unigraph_logo.png?1597992376"},{"chainId":1,"address":"0xecc0f1f860a82ab3b442382d93853c02d6384389","name":"Axis DeFi","symbol":"AXIS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12199/thumb/YeLWZ3V.jpg?1597998424"},{"chainId":1,"address":"0x4fe5851c9af07df9e5ad8217afae1ea72737ebda","name":"OpenPredict Token","symbol":"OPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12200/thumb/9idIjfrY_400x400.jpg?1598020161"},{"chainId":1,"address":"0x11a2ab94ade17e96197c78f9d5f057332a19a0b9","name":"Orbicular","symbol":"ORBI","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12201/thumb/orbicular_logo.png?1598005710"},{"chainId":1,"address":"0x6bff2fe249601ed0db3a87424a2e923118bb0312","name":"Fyooz","symbol":"FYZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12202/thumb/fyooz.png?1598017956"},{"chainId":1,"address":"0xbff0e42eec4223fbd12260f47f3348d29876db42","name":"Xtake","symbol":"XTK","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/12204/thumb/xtake.jpg?1598080058"},{"chainId":1,"address":"0x2f3e054d233c93c59140c0905227c7c607c70cbb","name":"CoomCoin","symbol":"COOM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12205/thumb/coom.jpg?1598081856"},{"chainId":1,"address":"0x11f4c6b3e8f50c50935c7889edc56c96f41b5399","name":"Yield Breeder DAO","symbol":"YBREE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12207/thumb/ybdao_logo.jpg?1598094230"},{"chainId":1,"address":"0x26e43759551333e57f073bb0772f50329a957b30","name":"DegenVC","symbol":"DGVC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12208/thumb/degen_vc_logo.png?1598186601"},{"chainId":1,"address":"0x5dbcf33d8c2e976c6b560249878e6f1491bca25c","name":"yUSD","symbol":"YVAULT-LP-YCURVE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12210/thumb/yUSD.png?1600166557"},{"chainId":1,"address":"0x0bf6261297198d91d4fa460242c69232146a5703","name":"Libera","symbol":"LIB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12211/thumb/19nmRSeR_400x400.jpg?1598234697"},{"chainId":1,"address":"0xc4cb5793bd58bad06bf51fb37717b86b02cbe8a4","name":"PROXI DeFi","symbol":"CREDIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12212/thumb/_credit.png?1598235420"},{"chainId":1,"address":"0x3d3d35bb9bec23b06ca00fe472b50e7a4c692c30","name":"Vidya","symbol":"VIDYA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12219/thumb/VIDYA_TOKEN.png?1598240425"},{"chainId":1,"address":"0x8c3ee4f778e282b59d42d693a97b80b1ed80f4ee","name":"SatoPay","symbol":"STOP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12220/thumb/stop.png?1598241582"},{"chainId":1,"address":"0xb81d70802a816b5dacba06d708b5acf19dcd436d","name":"Dextoken Governance","symbol":"DEXG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12223/thumb/dextoken-logo-v2_200.png?1598408669"},{"chainId":1,"address":"0xab37e1358b639fd877f015027bb62d3ddaa7557e","name":"Lien","symbol":"LIEN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12224/thumb/Lien.png?1598262819"},{"chainId":1,"address":"0xf0be50ed0620e0ba60ca7fc968ed14762e0a5dd3","name":"Cowboy Finance","symbol":"COW","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12228/thumb/cowboy.png?1598309446"},{"chainId":1,"address":"0x52132a43d7cae69b23abe77b226fa1a5bc66b839","name":"Truample","symbol":"TMPL","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12229/thumb/tmpl.jpg?1598311641"},{"chainId":1,"address":"0x16b0a1a87ae8af5c792fabc429c4fe248834842b","name":"Algory","symbol":"ALG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12231/thumb/logo-2.png?1605256312"},{"chainId":1,"address":"0x9631483f28b7f5cbf7d435ab249be8f709215bc3","name":"Sperax","symbol":"SPA","decimals":24,"logoURI":"https://assets.coingecko.com/coins/images/12232/thumb/sperax_logo.jpg?1598342904"},{"chainId":1,"address":"0x3936ad01cf109a36489d93cabda11cf062fd3d48","name":"Coil","symbol":"COIL","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12234/thumb/Coil_-_Logo_open_%28256x256%29_tp.png?1598519979"},{"chainId":1,"address":"0xd379700999f4805ce80aa32db46a94df64561108","name":"Dextrust","symbol":"DETS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12235/thumb/logo_dark.png?1598425651"},{"chainId":1,"address":"0x09e64c2b61a5f1690ee6fbed9baf5d6990f8dfd0","name":"GROWTH DeFi","symbol":"GRO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12239/thumb/growthdefi_logo.png?1598438196"},{"chainId":1,"address":"0x6f022e991ea21d26f85f6716c088e2864101dfec","name":"Hands of Steel","symbol":"STEEL","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/12246/thumb/HOSlogo.png?1598496572"},{"chainId":1,"address":"0x70efdc485a10210b056ef8e0a32993bc6529995e","name":"Blaze Network","symbol":"BLZN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12248/thumb/A8JOuPSJ_400x400.jpg?1598511402"},{"chainId":1,"address":"0xf063fe1ab7a291c5d06a86e14730b00bf24cb589","name":"DxSale Network","symbol":"SALE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12250/thumb/logoicon_200-200.png?1598513464"},{"chainId":1,"address":"0xf9c36c7ad7fa0f0862589c919830268d1a2581a1","name":"BOA","symbol":"BOA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12251/thumb/5f4336749313bc77f88e3927_the-ouroboros-or-uroborus-english-school-p-500.jpeg?1598515550"},{"chainId":1,"address":"0xfffffffff15abf397da76f1dcc1a1604f45126db","name":"Falconswap","symbol":"FSW","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12256/thumb/falconswap.png?1598534184"},{"chainId":1,"address":"0xc4c2614e694cf534d407ee49f8e44d125e4681c4","name":"Chain Games","symbol":"CHAIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12257/thumb/chain-logo-centered-500x500.png?1599617244"},{"chainId":1,"address":"0x9e78b8274e1d6a76a0dbbf90418894df27cbceb5","name":"Covenants","symbol":"UNIFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12258/thumb/Unifi.png?1598548933"},{"chainId":1,"address":"0x44086035439e676c02d411880fccb9837ce37c57","name":"unified Stable Doll","symbol":"USD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12259/thumb/Uniswap_State_Dollar.png?1598550804"},{"chainId":1,"address":"0xbbe319b73744db9d54f5d29df7d8256b7e43995c","name":"Aragon China","symbol":"ANC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12261/thumb/bbs-panda200.png?1598579736"},{"chainId":1,"address":"0x78571accaf24052795f98b11f093b488a2d9eaa4","name":"Rocket Token","symbol":"RCKT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12262/thumb/IAY0DFX4_400x400.jpg?1598584324"},{"chainId":1,"address":"0xba21ef4c9f433ede00badefcc2754b8e74bd538a","name":"Swapfolio","symbol":"SWFL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12263/thumb/swapfolio-token-logo-icon-symbol-256-256.png?1598593097"},{"chainId":1,"address":"0xfab5a05c933f1a2463e334e011992e897d56ef0a","name":"DeFi of Thrones","symbol":"DOTX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12265/thumb/logo200x200.jpg?1598599911"},{"chainId":1,"address":"0x38e4adb44ef08f22f5b5b76a8f0c2d0dcbe7dca1","name":"PowerPool Concentra","symbol":"CVP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12266/thumb/Powerpool.jpg?1598621373"},{"chainId":1,"address":"0x6b3595068778dd592e39a122f4f5a5cf09c90fe2","name":"Sushi","symbol":"SUSHI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12271/thumb/512x512_Logo_no_chop.png?1606986688"},{"chainId":1,"address":"0xae9cbe6ebf72a51c9fcea3830485614486318fd4","name":"Newtonium","symbol":"NEWTON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12273/thumb/newton.jpg?1598689904"},{"chainId":1,"address":"0x3aef8e803bd9be47e69b9f36487748d30d940b96","name":"Vesta","symbol":"VESTA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12276/thumb/t693cWC.png?1598736747"},{"chainId":1,"address":"0x86965a86539e2446f9e72634cefca7983cc21a81","name":"YFISCURITY","symbol":"YFIS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12277/thumb/Logo_YFIS_.png?1598737945"},{"chainId":1,"address":"0xa54c67bd320da4f9725a6f585b7635a0c09b122e","name":"TimeMiner","symbol":"TIME","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/12280/thumb/2WTMX74.png?1598739901"},{"chainId":1,"address":"0x29f6e320dbdbf1f5ebf599d36242634739a24609","name":"Mobius Crypto","symbol":"MOBI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12281/thumb/nTcbsIgu_400x400.jpg?1598741341"},{"chainId":1,"address":"0x19810559df63f19cfe88923313250550edadb743","name":"Toast finance","symbol":"HOUSE","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/12287/thumb/icon_%284%29.png?1598825274"},{"chainId":1,"address":"0x23aeff664c1b2bba98422a0399586e96cc8a1c92","name":"Fee Active Collater","symbol":"FACT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12288/thumb/PfFTv2JB_200x200.jpg?1598826350"},{"chainId":1,"address":"0x47eb79217f42f92dbd741add1b1a6783a2c873cf","name":"Bast","symbol":"BAST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12289/thumb/bast_logo.png?1598865533"},{"chainId":1,"address":"0x9b9087756eca997c5d595c840263001c9a26646d","name":"DogeFi","symbol":"DOGEFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12290/thumb/DOGEFI-Logo.png?1598868716"},{"chainId":1,"address":"0x4b4701f3f827e1331fb22ff8e2beac24b17eb055","name":"DistX","symbol":"DISTX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12291/thumb/DISTX-icon.png?1598885812"},{"chainId":1,"address":"0xd3e8695d2bef061eab38b5ef526c0f714108119c","name":"YFIVE FINANCE","symbol":"YFIVE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12292/thumb/0gW17G6E_400x400.jpg?1598886392"},{"chainId":1,"address":"0xaea5e11e22e447fa9837738a0cd2848857748adf","name":"Social Finance","symbol":"SOFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12296/thumb/logo-transparent.png?1598931704"},{"chainId":1,"address":"0x4b4f5286e0f93e965292b922b9cd1677512f1222","name":"YUNo Finance","symbol":"YUNO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12297/thumb/y.png?1598942444"},{"chainId":1,"address":"0x4d953cf077c0c95ba090226e59a18fcf97db44ec","name":"Mini","symbol":"MINI","decimals":19,"logoURI":"https://assets.coingecko.com/coins/images/12298/thumb/IrTAVc_GqZ7iQucAa3fNYlh_Cqt3tY9wM_pmzOl5SifscRMpuzrp_dizMzGTiMr_NxDJPCKigBgz8THrzvO_DqT3JLzqZIYeytDBRw3qKI73dljS0BnFaaI2aLadpdCZah4RkhydddLIDDbQlGit77farlQRaq7qEgxdjVe0aqEeh4phE-DWAKi_KS_Yz-fFdDfjWgifVCKkZRBeNSWWQEplxxl.jpg?1598961320"},{"chainId":1,"address":"0xd7b7d3c0bda57723fb54ab95fd8f9ea033af37f2","name":"Pylon Finance","symbol":"PYLON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12299/thumb/NewPylonLogo.png?1604457455"},{"chainId":1,"address":"0x94d863173ee77439e4292284ff13fad54b3ba182","name":"Akropolis Delphi","symbol":"ADEL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12300/thumb/adel_on_white_10x.png?1598967061"},{"chainId":1,"address":"0x0501e7a02c285b9b520fdbf1badc74ae931ad75d","name":"Walnut finance","symbol":"WTF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12301/thumb/photo_2020-08-31_04-24-32.jpg?1598968170"},{"chainId":1,"address":"0x1e18821e69b9faa8e6e75dffe54e7e25754beda0","name":"KIMCHI finance","symbol":"KIMCHI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12302/thumb/VBa2Z60o_400x400.png?1598982471"},{"chainId":1,"address":"0xb6ee603933e024d8d53dde3faa0bf98fe2a3d6f1","name":"DeFiat","symbol":"DFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12303/thumb/defiat.jpg?1598985049"},{"chainId":1,"address":"0xa0246c9032bc3a600820415ae600c6388619a14d","name":"Harvest Finance","symbol":"FARM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12304/thumb/Harvest.png?1613016180"},{"chainId":1,"address":"0x39795344cbcc76cc3fb94b9d1b15c23c2070c66d","name":"Seigniorage Shares","symbol":"SHARE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12306/thumb/logo_%281%29.png?1607658707"},{"chainId":1,"address":"0xd0df3b1cf729a29b7404c40d61c750008e631ba7","name":"Rug","symbol":"RUG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12307/thumb/rug_token_logo.png?1599029152"},{"chainId":1,"address":"0x90d702f071d2af33032943137ad0ab4280705817","name":"YFFS Finance","symbol":"YFFS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12309/thumb/KijHtdcg_400x400.jpg?1599041092"},{"chainId":1,"address":"0x420ab548b18911717ed7c4ccbf46371ea758458c","name":"NOODLE Finance","symbol":"NOODLE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12311/thumb/noodle.jpg?1599053738"},{"chainId":1,"address":"0x466912baa9430a4a460b141ee8c580d817441449","name":"BLOCKMAX","symbol":"OCB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12315/thumb/200x200-01.png?1599086761"},{"chainId":1,"address":"0xcb3df3108635932d912632ef7132d03ecfc39080","name":"Wing Shop","symbol":"WING","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12318/thumb/6584.png?1599087626"},{"chainId":1,"address":"0x322124122df407b0d0d902cb713b3714fb2e2e1f","name":"Soft Yearn","symbol":"SYFI","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12320/thumb/soft_yearn.png?1599094189"},{"chainId":1,"address":"0x69bbc3f8787d573f1bbdd0a5f40c7ba0aee9bcc9","name":"Yup","symbol":"YUP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12322/thumb/yupx.png?1599094638"},{"chainId":1,"address":"0x89ee58af4871b474c30001982c3d7439c933c838","name":"yfBeta","symbol":"YFBETA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12325/thumb/yfbeta_logo.jpg?1599096612"},{"chainId":1,"address":"0x3678d8cc9eb08875a3720f34c1c8d1e1b31f5a11","name":"Obee Network","symbol":"OBEE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12326/thumb/ObeeNetwork.png?1599099616"},{"chainId":1,"address":"0x798a9055a98913835bbfb45a0bbc209438dcfd97","name":"New Year Bull","symbol":"NYB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12327/thumb/bull.jpg?1599102873"},{"chainId":1,"address":"0xd6c67b93a7b248df608a653d82a100556144c5da","name":"ExNetwork Token","symbol":"EXNT","decimals":16,"logoURI":"https://assets.coingecko.com/coins/images/12328/thumb/exnt_logo.png?1599102916"},{"chainId":1,"address":"0x3e780920601d61cedb860fe9c4a90c9ea6a35e78","name":"Boosted Finance","symbol":"BOOST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12329/thumb/boosted.jpg?1599105606"},{"chainId":1,"address":"0x8a3d77e9d6968b780564936d15b09805827c21fa","name":"Uniris","symbol":"UCO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12330/thumb/e353ZVj.png?1599112996"},{"chainId":1,"address":"0x6a6c2ada3ce053561c2fbc3ee211f23d9b8c520a","name":"TONToken","symbol":"TON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12334/thumb/ton.jpg?1599128436"},{"chainId":1,"address":"0x175ab41e2cedf3919b2e4426c19851223cf51046","name":"BaconSwap","symbol":"BACON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12336/thumb/bacon_swap_logo.png?1599133231"},{"chainId":1,"address":"0xf4c17bc4979c1dc7b4ca50115358dec58c67fd9d","name":"Omega Protocol Mone","symbol":"OPM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12337/thumb/opm-200px.png?1599136480"},{"chainId":1,"address":"0x9043d4d51c9d2e31e3f169de4551e416970c27ef","name":"Prime DAI","symbol":"PDAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12338/thumb/pdai-200px.png?1599136775"},{"chainId":1,"address":"0x9aeb50f542050172359a0e1a25a9933bc8c01259","name":"OIN Finance","symbol":"OIN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12339/thumb/oin_finance_logo.jpg?1599137603"},{"chainId":1,"address":"0x177ba0cac51bfc7ea24bad39d81dcefd59d74faa","name":"KittenFinance","symbol":"KIF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12340/thumb/SnQPkABT_400x400.png?1599173267"},{"chainId":1,"address":"0xed0439eacf4c4965ae4613d77a5c2efe10e5f183","name":"Shroom Finance","symbol":"SHROOM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12341/thumb/icon_%285%29.png?1599173559"},{"chainId":1,"address":"0x1da01e84f3d4e6716f274c987ae4bee5dc3c8288","name":"DeFi Bids","symbol":"BID","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12344/thumb/IMG_20200919_115022_477.png?1600739441"},{"chainId":1,"address":"0xcbd55d4ffc43467142761a764763652b48b969ff","name":"AstroTools","symbol":"ASTRO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12345/thumb/AT-flat-purple_logo.png?1599190828"},{"chainId":1,"address":"0x47632da9227e322eda59f9e7691eacc6430ac87c","name":"YFI Business","symbol":"YFIB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12346/thumb/fkPIR2pc_400x400.jpg?1599192901"},{"chainId":1,"address":"0x6c972b70c533e2e045f333ee28b9ffb8d717be69","name":"FoundryDAO Logistic","symbol":"FRY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12348/thumb/lNceCqHc_400x400.jpg?1599202157"},{"chainId":1,"address":"0x012ba3ae1074ae43a34a14bca5c4ed0af01b6e53","name":"YUGE","symbol":"TRUMP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12350/thumb/flat-750x-075-f-pad-750x1000-f8f8f8.png?1599968841"},{"chainId":1,"address":"0x0cf58006b2400ebec3eb8c05b73170138a340563","name":"Good Boy Points","symbol":"GBP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12351/thumb/good_boy_points_logo.png?1599206547"},{"chainId":1,"address":"0x6dddf4111ad997a8c7be9b2e502aa476bf1f4251","name":"Unimonitor","symbol":"UNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12352/thumb/logo-2.png?1599206919"},{"chainId":1,"address":"0xef327568556310d344c49fb7ce6cbfe7b2bb83e6","name":"YFA Finance","symbol":"YFA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12354/thumb/2020-08-31_19.04.20.png?1599260762"},{"chainId":1,"address":"0xd9bae39c725a1864b1133ad0ef1640d02f79b78c","name":"Touch Social","symbol":"TST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12355/thumb/RhEvWed.png?1599260984"},{"chainId":1,"address":"0xc5e19fd321b9bc49b41d9a3a5ad71bcc21cc3c54","name":"TradePower Dex","symbol":"TDEX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12356/thumb/slider-img.png?1599261139"},{"chainId":1,"address":"0x9d24364b97270961b2948734afe8d58832efd43a","name":"Yefam Finance","symbol":"FAM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12359/thumb/FAM200.png?1600333720"},{"chainId":1,"address":"0xb8baa0e4287890a5f79863ab62b7f175cecbd433","name":"Swerve","symbol":"SWRV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12361/thumb/swerve.png?1599278316"},{"chainId":1,"address":"0x0128e4fccf5ef86b030b28f0a8a029a3c5397a94","name":"FlashSwap","symbol":"FSP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12362/thumb/ZKvuJEUR_400x400.jpg?1599299420"},{"chainId":1,"address":"0x96d62cdcd1cc49cb6ee99c867cb8812bea86b9fa","name":"Yearn Finance Proto","symbol":"YFP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12363/thumb/yearn.jpg?1599309396"},{"chainId":1,"address":"0x41efc0253ee7ea44400abb5f907fdbfdebc82bec","name":" AAPL","symbol":"AAPL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12367/thumb/oF1_9R1K_400x400.jpg?1599345463"},{"chainId":1,"address":"0x668dbf100635f593a3847c0bdaf21f0a09380188","name":"BNSD Finance","symbol":"BNSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12368/thumb/bnsd.png?1599358388"},{"chainId":1,"address":"0xbd301be09eb78df47019aa833d29edc5d815d838","name":"YFUEL","symbol":"YFUEL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12369/thumb/Untitled-3-1.png?1600765495"},{"chainId":1,"address":"0xf1f5de69c9c8d9be8a7b01773cc1166d4ec6ede2","name":"Definitex","symbol":"DFX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12370/thumb/dfx.jpg?1599360540"},{"chainId":1,"address":"0x557b933a7c2c45672b610f8954a3deb39a51a8ca","name":"REVV","symbol":"REVV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12373/thumb/Nxy8QwOU.png?1599385982"},{"chainId":1,"address":"0xb1ec548f296270bc96b8a1b3b3c8f3f04b494215","name":"Foresight","symbol":"FORS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12374/thumb/foresight_logo.jpg?1599389915"},{"chainId":1,"address":"0x87b008e57f640d94ee44fd893f0323af933f9195","name":"Coin Artist","symbol":"COIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12375/thumb/coin_artist_logo.png?1599403918"},{"chainId":1,"address":"0x035bfe6057e15ea692c0dfdcab3bb41a64dd2ad4","name":"Universal Liquidity","symbol":"ULU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12376/thumb/ulu_finance_logo.ico?1599444401"},{"chainId":1,"address":"0x2f6081e3552b1c86ce4479b80062a1dda8ef23e3","name":"Dollars","symbol":"USDX","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12377/thumb/rCdP56C.png?1599445426"},{"chainId":1,"address":"0x5580ab97f226c324c671746a1787524aef42e415","name":"JustLiquidity","symbol":"JUL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12378/thumb/JUL256_256.png?1599445678"},{"chainId":1,"address":"0x6e36556b3ee5aa28def2a8ec3dae30ec2b208739","name":"BUILD Finance","symbol":"BUILD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12380/thumb/build.PNG?1599463828"},{"chainId":1,"address":"0xbc396689893d065f41bc2c6ecbee5e0085233447","name":"Perpetual Protocol","symbol":"PERP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12381/thumb/perpetual_protocol_logo.jpg?1599469619"},{"chainId":1,"address":"0x4889f721f80c5e9fade6ea9b85835d405d79a4f4","name":"Mafia Network","symbol":"MAFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12383/thumb/MAFI.jpg?1599488498"},{"chainId":1,"address":"0x1dd80016e3d4ae146ee2ebb484e8edd92dacc4ce","name":"Lead Token","symbol":"LEAD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12384/thumb/lead.jpg?1599491466"},{"chainId":1,"address":"0xf4cd3d3fda8d7fd6c5a500203e38640a70bf9577","name":"YfDAI finance","symbol":"YF-DAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12385/thumb/LOGO_Coingechko.png?1600514429"},{"chainId":1,"address":"0x556148562d5ddeb72545d7ec4b3ec8edc8f55ba7","name":"Predix Network","symbol":"PRDX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12388/thumb/main-logo.png?1599531749"},{"chainId":1,"address":"0x468ab3b1f63a1c14b361bc367c3cc92277588da1","name":"Yeld Finance","symbol":"YELD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12389/thumb/yeld_logo.png?1599537337"},{"chainId":1,"address":"0xdb2f2bcce3efa95eda95a233af45f3e0d4f00e2a","name":"Aegis","symbol":"AGS","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12391/thumb/logo-3.png?1599540071"},{"chainId":1,"address":"0x00a8b738e453ffd858a7edf03bccfe20412f0eb0","name":"AllianceBlock","symbol":"ALBT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12392/thumb/alliance_block_logo.jpg?1599546617"},{"chainId":1,"address":"0x5f7fa1a0ae94b5dd6bb6bd1708b5f3af01b57908","name":"YFIKing Finance","symbol":"YFIKING","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12395/thumb/Kinglog_200px.png?1599550956"},{"chainId":1,"address":"0x270d09cb4be817c98e84feffde03d5cd45e30a27","name":"Maki Finance","symbol":"MAKI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12397/thumb/256x256_maki_logo.png?1599551429"},{"chainId":1,"address":"0x6c4b85cab20c13af72766025f0e17e0fe558a553","name":"YFFII Finance","symbol":"YFFII","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12398/thumb/4hWupcq.jpg?1599553239"},{"chainId":1,"address":"0xa17de0ab0a97bc5e56fa8b39ebfc81cc3f1f349e","name":"DefiKing","symbol":"DFK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12405/thumb/dfklogo.png?1599603745"},{"chainId":1,"address":"0x0316eb71485b0ab14103307bf65a021042c6d380","name":"Huobi BTC","symbol":"HBTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12407/thumb/Unknown-5.png?1599624896"},{"chainId":1,"address":"0x3080ec2a6960432f179c66d388099a48e82e2047","name":"Popcorn Token","symbol":"CORN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12408/thumb/n425bUN.png?1599625062"},{"chainId":1,"address":"0xff20817765cb7f73d4bde2e66e067e58d11095c2","name":"Amp","symbol":"AMP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12409/thumb/amp-200x200.png?1599625397"},{"chainId":1,"address":"0x5150956e082c748ca837a5dfa0a7c10ca4697f9c","name":"Zeedex","symbol":"ZDEX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12412/thumb/Untitled-design-4.png?1599647173"},{"chainId":1,"address":"0x87047986e8e4961c11d2edcd94285e3a1331d97b","name":"Yakuza DFO","symbol":"YKZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12413/thumb/UeUSmpx.png?1601970433"},{"chainId":1,"address":"0xcec2387e04f9815bf12670dbf6cf03bba26df25f","name":"YFILEND FINANCE","symbol":"YFILD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12414/thumb/ylend.png?1599684775"},{"chainId":1,"address":"0x84294fc9710e1252d407d3d80a84bc39001bd4a8","name":"Squirrel Finance","symbol":"NUTS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12415/thumb/transparent_logo200.png?1599690422"},{"chainId":1,"address":"0x601938988f0fdd937373ea185c33751462b1d194","name":"Etherpay","symbol":"ETHPY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12417/thumb/Captura-de-Tela-2020-09-09-a-s-13-54-20.png?1599692074"},{"chainId":1,"address":"0x4208d8d500b1643dca98dd27ba6c0060bca311c5","name":"Rebase","symbol":"REBASE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12420/thumb/rebase_logo.jpg?1599719177"},{"chainId":1,"address":"0x86642d169db9f57a02c65052049cbbbfb3e3b08c","name":"dRAY","symbol":"DRAY","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/12421/thumb/draylogo_200x200.png?1599727930"},{"chainId":1,"address":"0x05fcc72cfb4150abae415c885f7a433ff523296f","name":"YOKcoin","symbol":"YOK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12425/thumb/YOKcoin_200x200.png?1599732314"},{"chainId":1,"address":"0xc28e27870558cf22add83540d2126da2e4b464c2","name":"Sashimi","symbol":"SASHIMI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12427/thumb/SashimiSwap-200x200.png?1601347413"},{"chainId":1,"address":"0x066798d9ef0833ccc719076dab77199ecbd178b0","name":"SakeToken","symbol":"SAKE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12428/thumb/sake.png?1599777402"},{"chainId":1,"address":"0xb9464ef80880c5aea54c7324c0b8dd6ca6d05a90","name":"LOCK Token","symbol":"LOCK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12429/thumb/sherlock.jpg?1599780187"},{"chainId":1,"address":"0x930ed81ad809603baf727117385d01f04354612e","name":"Solarite","symbol":"SOLARITE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12430/thumb/solarite_logo.jpg?1599785957"},{"chainId":1,"address":"0x5d1b1019d0afa5e6cc047b9e78081d44cc579fc4","name":"yfrb Finance","symbol":"YFRB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12431/thumb/yfrb.png?1599786507"},{"chainId":1,"address":"0x8eef5a82e6aa222a60f009ac18c24ee12dbf4b41","name":"Tixl","symbol":"TXL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12432/thumb/Tixl-Logo-200-transparent.png?1610248504"},{"chainId":1,"address":"0x3b4caaaf6f3ce5bee2871c89987cbd825ac30822","name":"OFIN TOKEN","symbol":"ON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12433/thumb/oin.png?1599796457"},{"chainId":1,"address":"0x429881672b9ae42b8eba0e26cd9c73711b891ca5","name":"Pickle Finance","symbol":"PICKLE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12435/thumb/pickle_finance_logo.jpg?1599817746"},{"chainId":1,"address":"0x5979f50f1d4c08f9a53863c2f39a7b0492c38d0f","name":"pTokens LTC","symbol":"PLTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12436/thumb/pLTC_logo.png?1599819176"},{"chainId":1,"address":"0x675e7d927af7e6d0082e0153dc3485b687a6f0ad","name":"Creed Finance","symbol":"CREED","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12437/thumb/creed_finance_logo.jpg?1599840364"},{"chainId":1,"address":"0x3a1c1d1c06be03cddc4d3332f7c20e1b37c97ce9","name":"Vybe","symbol":"VYBE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12438/thumb/22k5gGG.jpg?1609924524"},{"chainId":1,"address":"0xea004e8fa3701b8e58e41b78d50996e0f7176cbd","name":"yffc finance","symbol":"YFFC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12439/thumb/yffc.png?1599868672"},{"chainId":1,"address":"0x36f3fd68e7325a35eb768f1aedaae9ea0689d723","name":"Empty Set Dollar","symbol":"ESD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12440/thumb/esd_logo_circle.png?1603676421"},{"chainId":1,"address":"0x68a3637ba6e75c0f66b61a42639c4e9fcd3d4824","name":"MoonSwap","symbol":"MOON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12441/thumb/moon.jpg?1599880968"},{"chainId":1,"address":"0x94939d55000b31b7808904a80aa7bab05ef59ed6","name":"Jiaozi","symbol":"JIAOZI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12442/thumb/JiaoziFarm.png?1599888576"},{"chainId":1,"address":"0x488e0369f9bc5c40c002ea7c1fe4fd01a198801c","name":"Golff","symbol":"GOF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12445/thumb/_x-AmLBv_400x400.jpg?1599902833"},{"chainId":1,"address":"0x3a73f6156c4fbc71b8fdf38090a9d99401163644","name":"Lottonation","symbol":"LNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12448/thumb/lNSc7jtO_400x400_%281%29.jpg?1599903922"},{"chainId":1,"address":"0x5befbb272290dd5b8521d4a938f6c4757742c430","name":"Xfinance","symbol":"XFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12449/thumb/go.png?1599904281"},{"chainId":1,"address":"0x6c5ba91642f10282b576d91922ae6448c9d52f4e","name":"Phala Network","symbol":"PHA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12451/thumb/phala.png?1600061318"},{"chainId":1,"address":"0xd0c59798f986d333554688cd667033d469c2398e","name":"Ymen Finance","symbol":"YMEN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12452/thumb/logoymen.png?1603008881"},{"chainId":1,"address":"0x7968bc6a03017ea2de509aaa816f163db0f35148","name":"Hedget","symbol":"HGET","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/12453/thumb/Hedget.png?1599944809"},{"chainId":1,"address":"0x584bc13c7d411c00c01a62e8019472de68768430","name":"Hegic","symbol":"HEGIC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12454/thumb/Hegic.png?1599938210"},{"chainId":1,"address":"0x69692d3345010a207b759a7d1af6fc7f38b35c5e","name":"CHADS VC","symbol":"CHADS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12455/thumb/Chad_VC.png?1599940044"},{"chainId":1,"address":"0x7a545ed3863221a974f327199ac22f7f12535f11","name":"Baguette Token","symbol":"BGTT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12456/thumb/baguette_logo.png?1599945036"},{"chainId":1,"address":"0xc3771d47e2ab5a519e2917e61e23078d0c05ed7f","name":"Gather","symbol":"GTH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12458/thumb/Gather-Logo-Working-File.png?1599981686"},{"chainId":1,"address":"0x4086692d53262b2be0b13909d804f0491ff6ec3e","name":"Yield Farming Known","symbol":"YFKA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12459/thumb/5f5cfce7b7b794f5e1e4c6b5_logo200.jpg?1599982854"},{"chainId":1,"address":"0x9a7a4c141a3bcce4a31e42c1192ac6add35069b4","name":"Momentum","symbol":"XMM","decimals":10,"logoURI":"https://assets.coingecko.com/coins/images/12461/thumb/logo-transparent-200.png?1600007183"},{"chainId":1,"address":"0x7031ab87dcc46818806ec07af46fa8c2ad2a2bfc","name":"Tribute","symbol":"TRBT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12463/thumb/Tribute_Coin-04.png?1600034100"},{"chainId":1,"address":"0x1494ca1f11d487c2bbe4543e90080aeba4ba3c2b","name":"DeFiPulse Index","symbol":"DPI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12465/thumb/defi_pulse_index_set.png?1600051053"},{"chainId":1,"address":"0x5c4ac68aac56ebe098d621cd8ce9f43270aaa355","name":"bXIOT","symbol":"BXIOT","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/12466/thumb/bxiot_logo_512x512.png?1601775151"},{"chainId":1,"address":"0x3f382dbd960e3a9bbceae22651e88158d2791550","name":"Aavegotchi","symbol":"GHST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12467/thumb/ghst_200.png?1600750321"},{"chainId":1,"address":"0x1a231e75538a931c395785ef5d1a5581ec622b0e","name":"Zoom Protocol","symbol":"ZOM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12468/thumb/zoom_protocol_logo.jpeg?1600098680"},{"chainId":1,"address":"0x0746b8cb6dd33134baf0ead66146f442c098b42e","name":"HaloOracle","symbol":"HALO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12469/thumb/1_-6YxpHv34QNEAAIp-vKYxA.jpeg?1600116457"},{"chainId":1,"address":"0xe6410569602124506658ff992f258616ea2d4a3d","name":"Katana Finance","symbol":"KATANA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12473/thumb/AyHMMbK.jpeg?1600124081"},{"chainId":1,"address":"0x90f62b96a62801488b151ff3c65eac5fae21a962","name":"GemSwap","symbol":"GEM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12474/thumb/gem.png?1600124318"},{"chainId":1,"address":"0xf5d0fefaab749d8b14c27f0de60cc6e9e7f848d1","name":"YFARM Token","symbol":"YFARM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12475/thumb/yffs.jpg?1600136951"},{"chainId":1,"address":"0xa91ac63d040deb1b7a5e4d4134ad23eb0ba07e14","name":"Bella Protocol","symbol":"BEL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12478/thumb/Bella.png?1602230054"},{"chainId":1,"address":"0xf8c3527cc04340b208c854e985240c02f7b7793f","name":"Frontier","symbol":"FRONT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12479/thumb/frontier_logo.png?1600145472"},{"chainId":1,"address":"0xb05af453011d7ad68a92b0065ffd9d1277ed2741","name":"Team Finance","symbol":"TEAM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12480/thumb/team_token_logo.jpg?1600158847"},{"chainId":1,"address":"0xd03b6ae96cae26b743a6207dcee7cbe60a425c70","name":"UniDexBot","symbol":"UNDB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12481/thumb/logo_128.png?1601814643"},{"chainId":1,"address":"0xf2da15ae6ef94988534bad4b9e646f5911cbd487","name":"Fame","symbol":"FAME","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12491/thumb/tEXH2Dz0_400x400.jpg?1600209124"},{"chainId":1,"address":"0x15d4c048f83bd7e37d49ea4c83a07267ec4203da","name":"Gala","symbol":"GALA","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12493/thumb/GALA-COINGECKO.png?1600233435"},{"chainId":1,"address":"0xfef3bef71a5eb97e097039038776fd967ae5b106","name":"YFMoonshot","symbol":"YFMS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12496/thumb/yfmoonshot_logo.jpg?1600266768"},{"chainId":1,"address":"0x54b8c98268da0055971652a95f2bfd3a9349a38c","name":"Printer Finance","symbol":"PRINT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12497/thumb/moneyprinter_anm.png?1600499835"},{"chainId":1,"address":"0x4690d8f53e0d367f5b68f7f571e6eb4b72d39ace","name":"WinPlay","symbol":"WNRZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12498/thumb/winplay.png?1600279162"},{"chainId":1,"address":"0xc0e47007e084eef3ee58eb33d777b3b4ca98622f","name":"StarDEX","symbol":"XSTAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12500/thumb/token_icon.png?1600296899"},{"chainId":1,"address":"0x88ef27e69108b2633f8e1c184cc37940a075cc02","name":"Dego Finance","symbol":"DEGO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12503/thumb/c185FKx.png?1600298167"},{"chainId":1,"address":"0x1f9840a85d5af5bf1d1762f925bdaddc4201f984","name":"Uniswap","symbol":"UNI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12504/thumb/uniswap-uni.png?1600306604"},{"chainId":1,"address":"0xbc16da9df0a22f01a16bc0620a27e7d6d6488550","name":"Percent","symbol":"PCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12505/thumb/1*T5u1FDg9LLpvHifwr4WCwQ.png?1600310998"},{"chainId":1,"address":"0x1efb2286bf89f01488c6b2a22b2556c0f45e972b","name":"Moon YFI","symbol":"MYFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12506/thumb/moonyfi_logo.jpg?1600316838"},{"chainId":1,"address":"0x06ff1a3b08b63e3b2f98a5124bfc22dc0ae654d3","name":"Atlas","symbol":"KASSIAHOTEL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12507/thumb/KassiaHotelLogo.png?1600318010"},{"chainId":1,"address":"0xca1207647ff814039530d7d35df0e1dd2e91fa84","name":"dHEDGE DAO","symbol":"DHT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12508/thumb/dht.png?1600752201"},{"chainId":1,"address":"0x3e9bc21c9b189c09df3ef1b824798658d5011937","name":"Linear","symbol":"LINA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12509/thumb/linear.jpg?1606884470"},{"chainId":1,"address":"0xdea67845a51e24461d5fed8084e69b426af3d5db","name":"HodlTree","symbol":"HTRE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12511/thumb/htre.jpg?1600373697"},{"chainId":1,"address":"0x8ef47555856f6ce2e0cd7c36aef4fab317d2e2e2","name":"PayAccept","symbol":"PAYT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12513/thumb/logo.png?1603801944"},{"chainId":1,"address":"0xf3281c539716a08c754ec4c8f2b4cee0fab64bb9","name":"Markaccy","symbol":"MKCY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12522/thumb/e2eLPzTF_400x400.png?1600499534"},{"chainId":1,"address":"0x1d37986f252d0e349522ea6c3b98cb935495e63e","name":"ChartEx","symbol":"CHART","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12523/thumb/chartex.png?1600499406"},{"chainId":1,"address":"0x3b58c52c03ca5eb619eba171091c86c34d603e5f","name":"MCI Coin","symbol":"MCI","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12524/thumb/mcicoin-logo.png?1600471686"},{"chainId":1,"address":"0x49e833337ece7afe375e44f4e3e8481029218e5c","name":"Value Liquidity","symbol":"VALUE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12525/thumb/value_logo_-_500x500.png?1601478115"},{"chainId":1,"address":"0x6f3009663470475f0749a6b76195375f95495fcb","name":"Hatch DAO","symbol":"HATCH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12526/thumb/hatch-dao.jpg?1600480488"},{"chainId":1,"address":"0x53378825d95281737914a8a2ac0e5a9304ae5ed7","name":"Samurai","symbol":"SAM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12529/thumb/UkWCWt1.png?1600495292"},{"chainId":1,"address":"0x0aacfbec6a24756c20d41914f2caba817c0d8521","name":"YAM","symbol":"YAM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12530/thumb/YAM-icon.png?1600495536"},{"chainId":1,"address":"0xcad2d4c4469ff09ab24d02a63bcedfcd44be0645","name":"Crypto Accept","symbol":"ACPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12531/thumb/crypto-accept.png?1600497829"},{"chainId":1,"address":"0x0ef3b2024ae079e6dbc2b37435ce30d2731f0101","name":"UNIFI DeFi","symbol":"UNIFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12533/thumb/unifi_defi_logo.jpg?1600531278"},{"chainId":1,"address":"0x062f90480551379791fbe2ed74c1fe69821b30d3","name":"YMAX","symbol":"YMAX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12535/thumb/Jec_HMyy_400x400.png?1600555787"},{"chainId":1,"address":"0x37e808f084101f75783612407e7c3f5f92d8ee3f","name":"RI Token","symbol":"RI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12536/thumb/Ri_logo_512x512.png?1601775196"},{"chainId":1,"address":"0x579353231f3540b218239774422962c64a3693e7","name":"Bitcratic Revenue","symbol":"BCTR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12537/thumb/BCTR.png?1600557934"},{"chainId":1,"address":"0x3b62f3820e0b035cc4ad602dece6d796bc325325","name":"DEUS Finance","symbol":"DEUS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12539/thumb/deus_logo.jpg?1611136731"},{"chainId":1,"address":"0x3b544e6fcf6c8dce9d8b45a4fdf21c9b02f9fda9","name":"Giftedhands","symbol":"GHD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12540/thumb/K-8uHktJ.png?1600644856"},{"chainId":1,"address":"0x9b06d48e0529ecf05905ff52dd426ebec0ea3011","name":"XSwap","symbol":"XSP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12541/thumb/256x256_%282%29.png?1600645409"},{"chainId":1,"address":"0x3b78dc5736a49bd297dd2e4d62daa83d35a22749","name":"Finswap","symbol":"FNSP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12542/thumb/finswap-orange-200x200-1.png?1600663987"},{"chainId":1,"address":"0x44001a5656baafa5a3359ced8fa38e150a71eea2","name":"VN Finance","symbol":"VFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12543/thumb/VFI200.png?1600664014"},{"chainId":1,"address":"0x3f09400313e83d53366147e3ea0e4e2279d80850","name":"Kush Finance","symbol":"KSEED","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12545/thumb/kush.finance-512.png?1600844515"},{"chainId":1,"address":"0x7afb39837fd244a651e4f0c5660b4037214d4adf","name":"Soda Token","symbol":"SODA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12546/thumb/soda.acd4d701.png?1600671234"},{"chainId":1,"address":"0x5322a3556f979ce2180b30e689a9436fddcb1021","name":"yTSLA Finance","symbol":"YTSLA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12547/thumb/YTSLA_%284%29.png?1600740522"},{"chainId":1,"address":"0x685aea4f02e39e5a5bb7f7117e88db1151f38364","name":"Shill","symbol":"POSH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12548/thumb/alone.png?1600676559"},{"chainId":1,"address":"0x32a7c02e79c4ea1008dd6564b35f131428673c41","name":"Crust Network","symbol":"CRU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12549/thumb/sAB3KVzD_400x400.jpg?1600680411"},{"chainId":1,"address":"0xa117ea1c0c85cef648df2b6f40e50bb5475c228d","name":"Ducato Protocol Tok","symbol":"DUCATO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12550/thumb/70691538.png?1600680832"},{"chainId":1,"address":"0xf0a0f3a6fa6bed75345171a5ea18abcadf6453ba","name":"Yearn Finance Bit","symbol":"YFBT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12551/thumb/logo-200x200.png?1600681308"},{"chainId":1,"address":"0x0b342c51d1592c41068d5d4b4da4a68c0a04d5a4","name":"OneSwap DAO Token","symbol":"ONES","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12552/thumb/logo.png?1600682344"},{"chainId":1,"address":"0xc6bf2a2a43ca360bb0ec6770f57f77cdde64bb3f","name":"UnityDAO","symbol":"UTY","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12553/thumb/UTY_LOGO.png?1600734985"},{"chainId":1,"address":"0xa4f779074850d320b5553c9db5fc6a8ab15bd34a","name":"YFIX finance","symbol":"YFIX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12554/thumb/yfix-icon-200.png?1600739144"},{"chainId":1,"address":"0x46f4e420c75401494a39b70653f4bbb88ad2d728","name":"WenBurn","symbol":"WENB","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/12557/thumb/moonOnFire.jpg?1600746273"},{"chainId":1,"address":"0x4cc84b41ececc387244512242eec226eb7948a92","name":"Kassia Home","symbol":"KASSIAHOME","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12558/thumb/farmer.4e48cd5b.png?1600899057"},{"chainId":1,"address":"0xd04785c4d8195e4a54d9dec3a9043872875ae9e2","name":"Rotten","symbol":"ROT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12560/thumb/rot_logo.png?1600762626"},{"chainId":1,"address":"0x73ee6d7e6b203125add89320e9f343d65ec7c39a","name":"Axioms","symbol":"AXI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12562/thumb/axioms_logo.png?1600772415"},{"chainId":1,"address":"0x889efb523cc39590b8483eb9491890ac71407f64","name":"Moon Juice","symbol":"JUICE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12564/thumb/-TMHqn9S_400x400.jpg?1600899021"},{"chainId":1,"address":"0x9d47894f8becb68b9cf3428d256311affe8b068b","name":"Rope","symbol":"ROPE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12567/thumb/Rope_Icon.jpg?1604038203"},{"chainId":1,"address":"0xe63684bcf2987892cefb4caa79bd21b34e98a291","name":"Chicken","symbol":"KFC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12569/thumb/download.png?1600840301"},{"chainId":1,"address":"0xde201daec04ba73166d9917fdf08e1728e270f06","name":"MOJI Experience Poi","symbol":"MEXP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12571/thumb/mexp_logo.png?1600842788"},{"chainId":1,"address":"0x9cd39da8f25ec50cf2ee260e464ac23ea23f6bb0","name":"Toshify finance","symbol":"YFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12574/thumb/QskdLwuY_400x400.png?1600899144"},{"chainId":1,"address":"0x0e9b56d2233ea2b5883861754435f9c51dbca141","name":"Rare Pepe","symbol":"RPEPE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12575/thumb/rare_pepe_logo.png?1600856124"},{"chainId":1,"address":"0xe09216f1d343dd39d6aa732a08036fee48555af0","name":"Contribute","symbol":"TRIB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12576/thumb/New_logo_circle.png?1604214723"},{"chainId":1,"address":"0xab7aaf9e485a3bc885985184abe9fc6aba727bd6","name":"MANY","symbol":"MANY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12577/thumb/MANY_logo_NoBanksNearby.png?1601347315"},{"chainId":1,"address":"0x8be6a6158f6b8a19fe60569c757d16e546c2296d","name":"YFF Finance","symbol":"YFF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12578/thumb/5ymP5emT_400x400.jpg?1600913790"},{"chainId":1,"address":"0x042afd3869a47e2d5d42cc787d5c9e19df32185f","name":"Hotpot Base Token","symbol":"POT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12580/thumb/hotpot.f49fb832.png?1600916677"},{"chainId":1,"address":"0x81313f7c5c9c824236c9e4cba3ac4b049986e756","name":"HippoFinance","symbol":"HIPPO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12581/thumb/chef.50555ea1.png?1600922357"},{"chainId":1,"address":"0xf7e04d8a32229b4ca63aa51eea9979c7287fea48","name":"Beowulf","symbol":"BWF","decimals":5,"logoURI":"https://assets.coingecko.com/coins/images/12586/thumb/BWF.png?1600932145"},{"chainId":1,"address":"0xef8ba8cba86f81b3108f60186fce9c81b5096d5c","name":"YFII Gold","symbol":"YFIIG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12587/thumb/yfiigold_logo.png?1600937694"},{"chainId":1,"address":"0x2a8e1e676ec238d8a992307b495b45b3feaa5e86","name":"Origin Dollar","symbol":"OUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12589/thumb/ousd-logo-200x200.png?1600943287"},{"chainId":1,"address":"0xc57d533c50bc22247d49a368880fb49a1caa39f7","name":"PowerTrade Fuel","symbol":"PTF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12590/thumb/powertrade_logo.jpg?1600944549"},{"chainId":1,"address":"0x7d36cce46dd2b0d28dde12a859c2ace4a21e3678","name":"Combine finance","symbol":"COMB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12592/thumb/combine_finance_logo.jpg?1602417055"},{"chainId":1,"address":"0x3ac2ab91ddf57e2385089202ca221c360ced0062","name":"SwapShip","symbol":"SWSH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12593/thumb/SwapShip.png?1600975182"},{"chainId":1,"address":"0x7240ac91f01233baaf8b064248e80feaa5912ba3","name":"OctoFi","symbol":"OCTO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12594/thumb/octofi-256x256-radius-22percent.png?1610679969"},{"chainId":1,"address":"0x174897edd3ce414084a009d22db31c7b7826400d","name":"JOON","symbol":"JOON","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/12595/thumb/logo.png?1600995905"},{"chainId":1,"address":"0x25e1474170c4c0aa64fa98123bdc8db49d7802fa","name":"Bidao","symbol":"BID","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12596/thumb/bidao.png?1600996485"},{"chainId":1,"address":"0x44ea84a85616f8e9cd719fc843de31d852ad7240","name":"NO Trump Augur Pred","symbol":"NTRUMP","decimals":15,"logoURI":"https://assets.coingecko.com/coins/images/12597/thumb/nX10wsB.png?1600997655"},{"chainId":1,"address":"0x3af375d9f77ddd4f16f86a5d51a9386b7b4493fa","name":"YES Trump Augur Pre","symbol":"YTRUMP","decimals":15,"logoURI":"https://assets.coingecko.com/coins/images/12598/thumb/yes.png?1600997679"},{"chainId":1,"address":"0x5913d0f34615923552ee913dbe809f9f348e706e","name":"BMJ Master Nodes","symbol":"BMJ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12601/thumb/200.png?1601001633"},{"chainId":1,"address":"0x213c53c96a01a89e6dcc5683cf16473203e17513","name":"Defi Shopping Stake","symbol":"DSS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12602/thumb/DSS.png?1601002204"},{"chainId":1,"address":"0x5d762f76b9e91f71cc4f94391bdfe6333db8519c","name":"IYF finance","symbol":"IYF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12603/thumb/MenqcTv.png?1601006342"},{"chainId":1,"address":"0x825130aa1beef07bdf4f389705321816d05b0d0f","name":"UNII Finance","symbol":"UNII","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12604/thumb/P3KzPgJ9_400x400.jpg?1601013005"},{"chainId":1,"address":"0x8a6aca71a218301c7081d4e96d64292d3b275ce0","name":"S Finance","symbol":"SFG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12605/thumb/Z7D8B4b.png?1605346184"},{"chainId":1,"address":"0x3a8cccb969a61532d1e6005e2ce12c200caece87","name":"TitanSwap","symbol":"TITAN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12606/thumb/nqGlQzdz_400x400.png?1601019805"},{"chainId":1,"address":"0x250a3500f48666561386832f1f1f1019b89a2699","name":"SAFE2","symbol":"SAFE2","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12608/thumb/safe2.jpg?1601259102"},{"chainId":1,"address":"0xbf06035c31386d0d024895a97d0cc6ef6884854f","name":"Fanta Finance","symbol":"FANTA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12612/thumb/LOGOFANTA.png?1601241841"},{"chainId":1,"address":"0xecbf566944250dde88322581024e611419715f7a","name":"xBTC","symbol":"XBTC","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12613/thumb/Y3ZxUNM.png?1601242661"},{"chainId":1,"address":"0x78175901e9b04090bf3b3d3cb7f91ca986fb1af6","name":"Antique Zombie Shar","symbol":"ZOMB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12617/thumb/cryptopunks-zomb.png?1602398280"},{"chainId":1,"address":"0x6369c3dadfc00054a42ba8b2c09c48131dd4aa38","name":"Morpher","symbol":"MPH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12619/thumb/morpher_200_200.png?1601524084"},{"chainId":1,"address":"0xb1dc9124c395c1e97773ab855d66e879f053a289","name":"yAxis","symbol":"YAX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12620/thumb/Logo.png?1608310944"},{"chainId":1,"address":"0xb48e0f69e6a3064f5498d495f77ad83e0874ab28","name":"CXN Network","symbol":"CXN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12622/thumb/Webp.net-resizeimage.png?1601282522"},{"chainId":1,"address":"0xaf9f549774ecedbd0966c52f250acc548d3f36e5","name":"RioDeFi","symbol":"RFUEL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12623/thumb/RFUEL_SQR.png?1602481093"},{"chainId":1,"address":"0x9b62ec1453cea5dde760aaf662048ca6eeb66e7f","name":"Consensus Cell Netw","symbol":"ECELL","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/12624/thumb/98201030_131705818496610_9196703627136204800_n.jpg?1601283839"},{"chainId":1,"address":"0x73a9fb46e228628f8f9bb9004eca4f4f529d3998","name":"Wrapped LEO","symbol":"WLEO","decimals":3,"logoURI":"https://assets.coingecko.com/coins/images/12626/thumb/4XfO3w3.png?1601286769"},{"chainId":1,"address":"0xb1f66997a5760428d3a87d68b90bfe0ae64121cc","name":"Lua Token","symbol":"LUA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12627/thumb/Screenshot_2020-09-28_at_6.24.59_PM.jpg?1601288721"},{"chainId":1,"address":"0x4be40bc9681d0a7c24a99b4c92f85b9053fc2a45","name":"Dify Finance","symbol":"YFIII","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12628/thumb/zNTAjrF.png?1601294851"},{"chainId":1,"address":"0xa4eed63db85311e22df4473f87ccfc3dadcfa3e3","name":"Rubic","symbol":"RBC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12629/thumb/200x200.png?1607952509"},{"chainId":1,"address":"0xb2c822a1b923e06dbd193d2cfc7ad15388ea09dd","name":"Vampire Protocol","symbol":"VAMP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12630/thumb/vampire.jpeg?1601335717"},{"chainId":1,"address":"0xf4a81c18816c9b0ab98fac51b36dcb63b0e58fde","name":"YieldWars","symbol":"WAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12633/thumb/121169136_333321361293975_7238588238572942050_n.png?1602551929"},{"chainId":1,"address":"0x5f64ab1544d28732f0a24f4713c2c8ec0da089f0","name":"DEXTF","symbol":"DEXTF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12634/thumb/DEXTFiconNEGATIVE-page-001.jpg?1601349042"},{"chainId":1,"address":"0x62359ed7505efc61ff1d56fef82158ccaffa23d7","name":"cVault finance","symbol":"CORE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12635/thumb/cvault.finance_logo.png?1601353499"},{"chainId":1,"address":"0x212dd60d4bf0da8372fe8116474602d429e5735f","name":"Stobox Token","symbol":"STBU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12637/thumb/logo200x200.png?1601363179"},{"chainId":1,"address":"0x87c00817abe35ed4c093e59043fae488238d2f74","name":"Yoink","symbol":"YNK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12639/thumb/yoin_logo.png?1601368710"},{"chainId":1,"address":"0x05d27cdd23e22ca63e7f9c7c6d1b79ede9c4fcf5","name":"Yearn Finance Passi","symbol":"YFPI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12640/thumb/200.png?1601369185"},{"chainId":1,"address":"0x5df94780f00140fe72d239d0d261f7797e3fbd1b","name":"QChi Chain","symbol":"QHC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12642/thumb/logo.png?1601370470"},{"chainId":1,"address":"0x33811d4edbcaed10a685254eb5d3c4e4398520d2","name":"YFE Money","symbol":"YFE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12644/thumb/logo-round.png?1601373377"},{"chainId":1,"address":"0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9","name":"Aave","symbol":"AAVE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12645/thumb/AAVE.png?1601374110"},{"chainId":1,"address":"0x05d3606d5c81eb9b7b18530995ec9b29da05faba","name":"TomoChain ERC 20","symbol":"TOMOE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12646/thumb/tomoe_logo.png?1601377449"},{"chainId":1,"address":"0xd6d3608f2d770d0a8d0da62d7afe21ea1da86d9c","name":"AmericanHorror Fina","symbol":"AHF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12647/thumb/KBakm0K.jpg?1601386376"},{"chainId":1,"address":"0x83e6f1e41cdd28eaceb20cb649155049fac3d5aa","name":"Polkastarter","symbol":"POLS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12648/thumb/polkastarter.png?1609813702"},{"chainId":1,"address":"0x8feef860e9fa9326ff9d7e0058f637be8579cc29","name":"Timers","symbol":"IPM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12649/thumb/logo200x200_%282%29.png?1601421807"},{"chainId":1,"address":"0x2e6e152d29053b6337e434bc9be17504170f8a5b","name":"Yearn Finance Ecosy","symbol":"YFIEC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12650/thumb/pypIqcG.jpg?1601431822"},{"chainId":1,"address":"0x43dfc4159d86f3a37a5a4b3d4580b888ad7d4ddd","name":"DODO","symbol":"DODO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12651/thumb/dodo_logo.png?1601433025"},{"chainId":1,"address":"0x7b0f66fa5cf5cc28280c1e7051af881e06579362","name":"YFarmLand Token","symbol":"YFARMER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12652/thumb/yfarmer.png?1601435163"},{"chainId":1,"address":"0x41bc0913ed789428e107c4ea9ed007815c5a8230","name":"Kompass","symbol":"KOMP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12655/thumb/kompass_symbol.png?1601436438"},{"chainId":1,"address":"0x152687bc4a7fcc89049cf119f9ac3e5acf2ee7ef","name":"DeltaHub Community","symbol":"DHC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12656/thumb/DHC_Transparent_200x200.png?1601440150"},{"chainId":1,"address":"0x41523a22144f3d129dddf1e9a549333148d0c37d","name":"CryptoPunk 3831 Sh","symbol":"COZOM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12659/thumb/unnamed_%281%29.png?1601446454"},{"chainId":1,"address":"0xca76baa777d749de63ca044853d22d56bc70bb47","name":"Fiscus FYI","symbol":"FFYI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12663/thumb/FFYI.png?1601450423"},{"chainId":1,"address":"0xefc1c73a3d8728dc4cf2a18ac5705fe93e5914ac","name":"MetricExchange","symbol":"METRIC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12664/thumb/metric_exchange_logo.png?1601453711"},{"chainId":1,"address":"0x209c1808febf6c1ab7c65764bb61ad67d3923fcc","name":"APEcoin","symbol":"APE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12665/thumb/apecoin_logo.jpg?1601459267"},{"chainId":1,"address":"0x8e57c27761ebbd381b0f9d09bb92ceb51a358abb","name":"extraDNA","symbol":"XDNA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12667/thumb/Logo_coin_black.png?1601463830"},{"chainId":1,"address":"0x61bc1f530ac6193d73af1e1a6a14cb44b9c3f915","name":"Pajama Finance","symbol":"PJM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12669/thumb/pajama200.png?1601501914"},{"chainId":1,"address":"0xeed9e4f2450035d6426276a8aa2084966ee3b1bb","name":"Steaks Finance","symbol":"STEAK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12672/thumb/MtZuJ_Gq6mqy4BaGacnKNMKmviA1xeDWg2wUiPMqZ-1MzfSiTiAbEzfclWWsU4FF3QxYJcrs5ia_DSWAvdwNYbROJEkm-UK9mZRBPK_z61JciH4XhqMEDpYParjxnkEDqIoobaGaW9bOzPPN_YYHYcv0A1LxjnzdPZF47ZigVuAoOa46YZNFJ_IkM-e-Cuf_-XCpbS2EtbMYvCEhbSuzrI.jpg?1601518956"},{"chainId":1,"address":"0xd0658324074d6249a51876438916f7c423075451","name":"Yearn Land","symbol":"YLAND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12673/thumb/SXMzvraK_400x400.jpg?1601522909"},{"chainId":1,"address":"0x326caf6980d4e9161cfb3c55f195b3d825c266d4","name":"BullionsChain","symbol":"BLC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12674/thumb/transparent1.png?1601523923"},{"chainId":1,"address":"0xc22b30e4cce6b78aaaadae91e44e73593929a3e9","name":"RAC","symbol":"RAC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12675/thumb/rac_logo_%281%29.jpg?1601526417"},{"chainId":1,"address":"0x14eb60f5f270b059b0c788de0ddc51da86f8a06d","name":"Phantasma Energy","symbol":"KCAL","decimals":10,"logoURI":"https://assets.coingecko.com/coins/images/12678/thumb/kcal-logo-coingecko.png?1602063865"},{"chainId":1,"address":"0xed7fa212e100dfb3b13b834233e4b680332a3420","name":"Street Cred","symbol":"CRED","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12680/thumb/cred_logo.png?1601611472"},{"chainId":1,"address":"0xa47c8bf37f92abed4a126bda807a7b7498661acd","name":"TerraUSD","symbol":"UST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12681/thumb/UST.png?1601612407"},{"chainId":1,"address":"0x7afac1d878c66a47263dce57976c371ae2e74882","name":"YFMoonBeam","symbol":"YFMB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12682/thumb/yuqS66I.png?1601619725"},{"chainId":1,"address":"0x38acefad338b870373fb8c810fe705569e1c7225","name":"Yearn4 Finance","symbol":"YF4","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12683/thumb/yearn4logo.png?1601621780"},{"chainId":1,"address":"0x1b7c4d4f226ccf3211b0f99c4fdfb84a2606bf8e","name":"Orb V2","symbol":"ORB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12686/thumb/favicon_%281%29.png?1601630265"},{"chainId":1,"address":"0x68496ee825dafe1cf66d4083f776b9eaab31e447","name":"ErcauX","symbol":"RAUX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12687/thumb/raux_logo.jpeg?1601633375"},{"chainId":1,"address":"0xb1191f691a355b43542bea9b8847bc73e7abb137","name":"Kirobo","symbol":"KIRO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12688/thumb/QmScxyKBwqbGJZmp38EwaoRpXbzPkq3tvuMjeuJE1YLZeG.png?1601672684"},{"chainId":1,"address":"0x3383c5a8969dc413bfddc9656eb80a1408e4ba20","name":"Wrapped ANATHA","symbol":"WANATHA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12690/thumb/CrZ8h9FV_400x400.png?1601678935"},{"chainId":1,"address":"0x8901bed88a57db0eae2bb87d72ced14c6c91164b","name":"YFI Product Token","symbol":"YFIP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12691/thumb/YFI_LOGO_TRANSPERANT.png?1604466364"},{"chainId":1,"address":"0x98a90499b62ae48e151a66b0f647570b5a473b1c","name":"ZAC Finance","symbol":"ZAC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12692/thumb/zaclogo200.png?1601693830"},{"chainId":1,"address":"0xad32a8e6220741182940c5abf610bde99e737b2d","name":"PieDAO DOUGH v2","symbol":"DOUGH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12693/thumb/DOUGH2v.png?1602655308"},{"chainId":1,"address":"0x26cf82e4ae43d31ea51e72b663d26e26a75af729","name":"Moonbase","symbol":"MBBASED","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12694/thumb/mb-logo.png?1601715131"},{"chainId":1,"address":"0x2216e873ea4282ebef7a02ac5aea220be6391a7c","name":"smol","symbol":"SMOL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12695/thumb/blockfolio-gecko-smol-clean-up.png?1601867705"},{"chainId":1,"address":"0x8da25b8ed753a5910013167945a676921e864436","name":"Bellevue Network","symbol":"BLV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12697/thumb/BLV-200x200-1.png?1601825641"},{"chainId":1,"address":"0xbd05cee8741100010d8e93048a80ed77645ac7bf","name":"Cyclops Treasure","symbol":"CYTR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12698/thumb/Untitled-design-9-removebg-preview.png?1601855912"},{"chainId":1,"address":"0xcf9c692f7e62af3c571d4173fd4abf9a3e5330d0","name":"Onigiri","symbol":"ONIGIRI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12699/thumb/onigiri-coingecko.png?1601857724"},{"chainId":1,"address":"0xad6a626ae2b43dcb1b39430ce496d2fa0365ba9c","name":"PieDAO DEFI Small C","symbol":"DEFI+S","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12701/thumb/DefiS.png?1601862595"},{"chainId":1,"address":"0x706cb9e741cbfee00ad5b3f5acc8bd44d1644a74","name":"YFOX Finance","symbol":"YFOX","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/12702/thumb/Yfox.png?1601865990"},{"chainId":1,"address":"0x40b92fce37cefa03baf7603e7913c1d34dd1a4ec","name":"YeaFinance","symbol":"YEA","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12705/thumb/logoeth.png?1601877470"},{"chainId":1,"address":"0x83f873388cd14b83a9f47fabde3c9850b5c74548","name":"Zero Utility Token","symbol":"ZUT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12706/thumb/logo.png?1605007113"},{"chainId":1,"address":"0xcd254568ebf88f088e40f456db9e17731243cb25","name":"YFOS finance","symbol":"YFOS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12707/thumb/wHQeaUF.jpg?1601888512"},{"chainId":1,"address":"0x03e4bdce611104289333f35c8177558b04cc99ff","name":"Yield Stake Finance","symbol":"YI12","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12708/thumb/yi12_logo.jpg?1601894672"},{"chainId":1,"address":"0xeaccb6e0f24d66cf4aa6cbda33971b9231d332a1","name":"Polyient Games Gove","symbol":"PGT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12709/thumb/Polyent.png?1601897060"},{"chainId":1,"address":"0x0fdc5313333533cc0c00c22792bff7383d3055f2","name":"YFPRO Finance","symbol":"YFPRO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12712/thumb/STOV7niY_400x400.png?1602630888"},{"chainId":1,"address":"0xde4ee8057785a7e8e800db58f9784845a5c2cbd6","name":"DeXe","symbol":"DEXE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12713/thumb/logo_%2814%29.png?1601952779"},{"chainId":1,"address":"0x3108ccfd96816f9e663baa0e8c5951d229e8c6da","name":"Dark Build","symbol":"DARK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12716/thumb/DARK-black.jpg?1601968540"},{"chainId":1,"address":"0x8f87ec6aad3b2a8c44f1298a1af56169b8e574cf","name":"LYNC Network","symbol":"LYNC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12717/thumb/coingecko_200x200.png?1604203317"},{"chainId":1,"address":"0x2a7f709ee001069771ceb6d42e85035f7d18e736","name":"OWL Token","symbol":"OWL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12720/thumb/logo-transbg_200x200.png?1602024124"},{"chainId":1,"address":"0xe0e4839e0c7b2773c58764f9ec3b9622d01a0428","name":"EnCore","symbol":"ENCORE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12721/thumb/72530481.png?1605256352"},{"chainId":1,"address":"0x1df6f1bb7454e5e4ba3bca882d3148fbf9b5697a","name":"Yfscience","symbol":"YFSI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12723/thumb/Yfscience_logo.png?1602038268"},{"chainId":1,"address":"0x00000000441378008ea67f4284a57932b1c000a5","name":"TrueGBP","symbol":"TGBP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12724/thumb/TGBP.png?1602042166"},{"chainId":1,"address":"0x00000100f2a2bd000715001920eb70d229700085","name":"TrueCAD","symbol":"TCAD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12725/thumb/TCAD.png?1602043400"},{"chainId":1,"address":"0x2688213fedd489762a281a67ae4f2295d8e17ecc","name":"FUD finance","symbol":"FUD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12727/thumb/fud_finance_logo.png?1602055414"},{"chainId":1,"address":"0x0954906da0bf32d5479e25f46056d22f08464cab","name":"Index Cooperative","symbol":"INDEX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12729/thumb/c7w3TmXs_400x400.png?1602630788"},{"chainId":1,"address":"0x2e1e15c44ffe4df6a0cb7371cd00d5028e571d14","name":"Mettalex","symbol":"MTLX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12730/thumb/nrEqFTEW_400x400.jpg?1602063980"},{"chainId":1,"address":"0xec0a0915a7c3443862b678b0d4721c7ab133fdcf","name":"Wrapped Origin Axie","symbol":"WOA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12732/thumb/WOA_logo.png?1602116474"},{"chainId":1,"address":"0x2dbd330bc9b7f3a822a9173ab52172bdddcace2a","name":"YFED Finance","symbol":"YFED","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12736/thumb/yfed_logo.png?1602123697"},{"chainId":1,"address":"0xa1faa113cbe53436df28ff0aee54275c13b40975","name":"Alpha Finance","symbol":"ALPHA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12738/thumb/ec7316b1-8bd9-4a76-8a1e-2d5c0b287d2f.jpg?1602306985"},{"chainId":1,"address":"0x054bd236b42385c938357112f419dc5943687886","name":"Heavens Gate","symbol":"HATE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12740/thumb/BUQoiaJY_400x400.png?1602630549"},{"chainId":1,"address":"0x913d8adf7ce6986a8cbfee5a54725d9eea4f0729","name":"EasyFi","symbol":"EASY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12742/thumb/skiXdJLe_400x400.png?1602630380"},{"chainId":1,"address":"0x03042482d64577a7bdb282260e2ea4c8a89c064b","name":"Centaur","symbol":"CNTR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12743/thumb/logo_%2898%29.png?1602630445"},{"chainId":1,"address":"0x454cb9d0845bb4a28462f98c21a4fafd16ceb25f","name":"Yearn finance Infra","symbol":"YLAB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12744/thumb/kKGUHNFn_400x400.jpg?1602193258"},{"chainId":1,"address":"0x159a1dfae19057de57dfffcbb3da1ae784678965","name":"Reflex","symbol":"RFX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12745/thumb/2MKGMRCT_400x400.png?1602194456"},{"chainId":1,"address":"0xb944b46bbd4ccca90c962ef225e2804e46691ccf","name":"Decore","symbol":"DCORE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12746/thumb/86jI-acy_400x400.png?1602208062"},{"chainId":1,"address":"0x39eae99e685906ff1c11a962a743440d0a1a6e09","name":"Holyheld OLD ","symbol":"HOLY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12747/thumb/veqfbl.png?1602211222"},{"chainId":1,"address":"0xedfbd6c48c3ddff5612ade14b45bb19f916809ba","name":"pulltherug finance","symbol":"RUGZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12749/thumb/rugz_logo.png?1602218634"},{"chainId":1,"address":"0xb2b9335791346e94245dcd316a9c9ed486e6dd7f","name":"Baby Power Index Po","symbol":"PIPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12750/thumb/powerpool.jpeg?1602233006"},{"chainId":1,"address":"0xfe9a29ab92522d14fc65880d817214261d8479ae","name":"Snowswap","symbol":"SNOW","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12751/thumb/uQBJL3A.png?1602237225"},{"chainId":1,"address":"0xd9a6803f41a006cbf389f21e55d7a6079dfe8df3","name":"NovaDeFi","symbol":"NMT","decimals":19,"logoURI":"https://assets.coingecko.com/coins/images/12752/thumb/nova_defi_logo.png?1602241365"},{"chainId":1,"address":"0xb987d48ed8f2c468d52d6405624eadba5e76d723","name":"Stabilize","symbol":"STBZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12753/thumb/icon.png?1608771101"},{"chainId":1,"address":"0xb78b3320493a4efaa1028130c5ba26f0b6085ef8","name":"Dracula Token","symbol":"DRC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12758/thumb/dracula_protocol.png?1602316655"},{"chainId":1,"address":"0x9ceb84f92a0561fa3cc4132ab9c0b76a59787544","name":"Doki Doki Finance","symbol":"DOKI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12759/thumb/doki_logo.png?1602338064"},{"chainId":1,"address":"0x1712aad2c773ee04bdc9114b32163c058321cd85","name":"LimitSwap","symbol":"LIMIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12760/thumb/limit_swap_logo.png?1602347106"},{"chainId":1,"address":"0x73374ea518de7addd4c2b624c0e8b113955ee041","name":"Juggernaut","symbol":"JGN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12761/thumb/juggernaut_logo.png?1602428976"},{"chainId":1,"address":"0x33c2da7fd5b125e629b3950f3c38d7f721d7b30d","name":"Seal Finance","symbol":"SEAL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12762/thumb/seal.png?1602434721"},{"chainId":1,"address":"0xb4fbed161bebcb37afb1cb4a6f7ca18b977ccb25","name":"Dogeswap","symbol":"DOGES","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12763/thumb/20200926-220107.png?1602455597"},{"chainId":1,"address":"0x9dfc4b433d359024eb3e810d77d60fbe8b0d9b82","name":"Dandy Dego","symbol":"DANDY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12764/thumb/487ogltc_400x400.jpg?1602463048"},{"chainId":1,"address":"0x6006fc2a849fedaba8330ce36f5133de01f96189","name":"SHAKE","symbol":"SHAKE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12765/thumb/shake_logo.jpg?1602470135"},{"chainId":1,"address":"0x1cbb83ebcd552d5ebf8131ef8c9cd9d9bab342bc","name":"Non Fungible Yearn","symbol":"NFY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12766/thumb/NFY_logo.png?1602686886"},{"chainId":1,"address":"0x80c8c3dcfb854f9542567c8dac3f44d709ebc1de","name":"MILK2","symbol":"MILK2","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12771/thumb/PVXczB4M.png?1602482463"},{"chainId":1,"address":"0xa09ff006c652496e72d648cef2f4ee6777efdf6f","name":"deCraft Finance","symbol":"CRAFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12775/thumb/decraft_logo.jpg?1602486383"},{"chainId":1,"address":"0xea3cb156745a8d281a5fc174186c976f2dd04c2e","name":"Nobrainer Finance","symbol":"BRAIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12778/thumb/brain_logo.jpg?1602493938"},{"chainId":1,"address":"0x9a0aba393aac4dfbff4333b06c407458002c6183","name":"ACoconut","symbol":"AC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12779/thumb/ac_logo.png?1602500084"},{"chainId":1,"address":"0x054f76beed60ab6dbeb23502178c52d6c5debe40","name":"DeFiner","symbol":"FIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12780/thumb/PdaW8Lb.png?1602500407"},{"chainId":1,"address":"0x1a23a6bfbadb59fa563008c0fb7cf96dfcf34ea1","name":"CoFiX","symbol":"COFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12781/thumb/dnPnSkfa_400x400.png?1602885321"},{"chainId":1,"address":"0xd82bb924a1707950903e2c0a619824024e254cd1","name":"DAOfi","symbol":"DAOFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12782/thumb/logocircle.png?1611944557"},{"chainId":1,"address":"0x88d59ba796fdf639ded3b5e720988d59fdb71eb8","name":"Payship","symbol":"PSHP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12789/thumb/pshp_logo.png?1602566222"},{"chainId":1,"address":"0x0d9227f9c4ab3972f994fccc6eeba3213c0305c4","name":"SERGS Governance","symbol":"SSL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12790/thumb/1SSL_Ticker_Etherscan_256x256.png?1607928756"},{"chainId":1,"address":"0x2e6539edc3b76f1e21b71d214527faba875f70f3","name":"Yearn Finance DOT","symbol":"YFDOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12791/thumb/logo_%2815%29.png?1602580328"},{"chainId":1,"address":"0x260e63d91fccc499606bae3fe945c4ed1cf56a56","name":"MoonTools","symbol":"MOONS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12793/thumb/moontools-token-logo.png?1602588060"},{"chainId":1,"address":"0x72f020f8f3e8fd9382705723cd26380f8d0c66bb","name":"PlotX","symbol":"PLOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12795/thumb/PlotX.png?1611109969"},{"chainId":1,"address":"0xb1e9157c2fdcc5a856c8da8b2d89b6c32b3c1229","name":"Zenfuse","symbol":"ZEFU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12796/thumb/zenfuse.jpg?1602640333"},{"chainId":1,"address":"0x11b0a8c0fa626627601ed518c3538a39d92d609e","name":"Generation of Yield","symbol":"YGY","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/12798/thumb/ygycg.png?1602643175"},{"chainId":1,"address":"0xa150db9b1fa65b44799d4dd949d922c0a33ee606","name":"Digital Reserve Cur","symbol":"DRC","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/12802/thumb/DRC-Digital-Reserve-Currency-Coingecko.png?1603355646"},{"chainId":1,"address":"0x155ff1a85f440ee0a382ea949f24ce4e0b751c65","name":"Behodler","symbol":"EYE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12804/thumb/beholder_logo.png?1602682616"},{"chainId":1,"address":"0x87edffde3e14c7a66c9b9724747a1c5696b742e6","name":"SWAG Finance","symbol":"SWAG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12805/thumb/photo_2020-10-14_23.17.02.jpeg?1602688642"},{"chainId":1,"address":"0x40ce0a1d8f4999807b92ec266a025f071814b15d","name":"Dai If Trump Loses ","symbol":"NOTRUMP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12806/thumb/noTrump.png?1602689764"},{"chainId":1,"address":"0x5963fd7ca9b17b85768476019f81cb43d9d1818e","name":"Dai If Trump Wins T","symbol":"YESTRUMP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12807/thumb/yesTrump.png?1602689766"},{"chainId":1,"address":"0x82866b4a71ba9d930fe338c386b6a45a7133eb36","name":"Qcore Finance","symbol":"QCORE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12809/thumb/logo_%281%29_%281%29.png?1602714432"},{"chainId":1,"address":"0x014a543f767b3b06e31a811b0a75483ee8dfd72d","name":"BonezYard","symbol":"BNZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12810/thumb/bnz_icon.png?1602716875"},{"chainId":1,"address":"0x0391d2021f89dc339f60fff84546ea23e337750f","name":"BarnBridge","symbol":"BOND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12811/thumb/barnbridge.jpg?1602728853"},{"chainId":1,"address":"0x7f9a00e03c2e53a3af6031c17a150dbedaaab3dc","name":"Read This Contract","symbol":"RTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12812/thumb/rtc_logo.png?1602730411"},{"chainId":1,"address":"0x9ed8e7c9604790f7ec589f99b94361d8aab64e5e","name":"Unistake","symbol":"UNISTAKE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12813/thumb/unistake.png?1612346684"},{"chainId":1,"address":"0x3142dad33b1c6e1371d8627365f2ee2095eb6b37","name":"Hauteclere Shards","symbol":"HAUT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12815/thumb/astt.png?1602884781"},{"chainId":1,"address":"0x30b1efb052205e6ca3c4888c3c50c5b339cc0602","name":"Cargo Gems","symbol":"GEM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12818/thumb/gems_logo.jpg?1602743920"},{"chainId":1,"address":"0x0202be363b8a4820f3f4de7faf5224ff05943ab1","name":"UniLend Finance","symbol":"UFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12819/thumb/UniLend_Finance_logo_PNG.png?1602748658"},{"chainId":1,"address":"0x4d2ee5dae46c86da2ff521f7657dad98834f97b8","name":"Pepemon Pepeballs","symbol":"PPBLZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12823/thumb/200pepebball-BIG.png?1603330304"},{"chainId":1,"address":"0x1378ec93ab2b07ba5a0eaef19cf354a33f64b9fd","name":"Yearn Finance Diamo","symbol":"YFDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12824/thumb/yfdt_logo.png?1602814305"},{"chainId":1,"address":"0x80ab141f324c3d6f2b18b030f1c4e95d4d658778","name":"DEA","symbol":"DEA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12825/thumb/dea_logo.jpg?1611136739"},{"chainId":1,"address":"0xeef9f339514298c6a857efcfc1a762af84438dee","name":"Hermez Network","symbol":"HEZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12826/thumb/hermez_logo.png?1602826556"},{"chainId":1,"address":"0xad0887734461af8c6033068bde4047dbe84074cc","name":"Arbiswap","symbol":"ASWAP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12827/thumb/logo_%283%29.png?1602831070"},{"chainId":1,"address":"0x1368452bfb5cd127971c8de22c58fbe89d35a6bf","name":"JNTR e","symbol":"JNTRE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12829/thumb/jntr_logo.jpg?1602835757"},{"chainId":1,"address":"0xa58a4f5c4bb043d2cc1e170613b74e767c94189b","name":"UTU Coin","symbol":"UTU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12831/thumb/Aa5nmbkJ_400x400.png?1602884636"},{"chainId":1,"address":"0x70e8de73ce538da2beed35d14187f6959a8eca96","name":"XSGD","symbol":"XSGD","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/12832/thumb/opiTgkh.png?1602856852"},{"chainId":1,"address":"0x04b5e13000c6e9a3255dc057091f3e3eeee7b0f0","name":"Unifund","symbol":"IFUND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12833/thumb/unifund_logo.png?1602859047"},{"chainId":1,"address":"0x4b34c0cbeef271f895d339c5f76322d71a60782b","name":"Yearn Finance Manag","symbol":"YEFIM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12836/thumb/jOVGT0Y.png?1602886889"},{"chainId":1,"address":"0x33d0568941c0c64ff7e0fb4fba0b11bd37deed9f","name":"RAMP","symbol":"RAMP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12837/thumb/RampdefiExternal200.png?1602897632"},{"chainId":1,"address":"0xa7925aa2a6e4575ab0c74d169f3bc3e03d4c319a","name":"Better Money","symbol":"BETTER","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/12838/thumb/BETTER_MONEY_MASK_ICON.png?1602899651"},{"chainId":1,"address":"0x39fa206c1648944f92e8f7b626e1cbdf78d7e9db","name":"DXY Finance","symbol":"DXY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12839/thumb/dxy_finance.png?1602903489"},{"chainId":1,"address":"0x70e36f6bf80a52b3b46b3af8e106cc0ed743e8e4","name":"cCOMP","symbol":"CCOMP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12840/thumb/1_z8UrVtod3bme4-J_pXAQQA_2x.png?1602936322"},{"chainId":1,"address":"0x1695936d6a953df699c38ca21c2140d497c08bd9","name":"SynLev","symbol":"SYN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12841/thumb/synlev_logo.jpg?1602945400"},{"chainId":1,"address":"0xb9782532fa7062a6f73df1ce71d75c0e16046ebc","name":"YFI Paprika","symbol":"YFIP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12842/thumb/yfipaprika.png?1602990259"},{"chainId":1,"address":"0xf1f955016ecbcd7321c7266bccfb96c68ea5e49b","name":"Rally","symbol":"RLY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12843/thumb/image.png?1611212077"},{"chainId":1,"address":"0x53f64be99da00fec224eaf9f8ce2012149d2fc88","name":"Nice","symbol":"NICE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12844/thumb/nice-200px.png?1603031077"},{"chainId":1,"address":"0x8b6dd24bcb2d0aea92c3abd4eb11103a5db6d714","name":"dXIOT","symbol":"DXIOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12850/thumb/dxiot.png?1603074874"},{"chainId":1,"address":"0x573be8873cc39149e71b92918e73634acb3c54d5","name":"FridayBeers","symbol":"BEER","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12852/thumb/256x256.png?1603976502"},{"chainId":1,"address":"0x6051c1354ccc51b4d561e43b02735deae64768b8","name":"yRise Finance","symbol":"YRISE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12853/thumb/logoyrise-200px.png?1603084410"},{"chainId":1,"address":"0x9c2dc0c3cc2badde84b0025cf4df1c5af288d835","name":"Coreto","symbol":"COR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12856/thumb/photo_2020-10-27_11-13-23.jpg?1603768611"},{"chainId":1,"address":"0x47fd85128312ee72aa0e0382a531a8f848b8b2cb","name":"Gallery Finance","symbol":"GLF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12857/thumb/U5VMHQ5q_400x400.jpg?1603090892"},{"chainId":1,"address":"0x2edf094db69d6dcd487f1b3db9febe2eec0dd4c5","name":"ZeroSwap","symbol":"ZEE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12861/thumb/zeroswap.jpg?1603111827"},{"chainId":1,"address":"0x1de5e000c41c8d35b9f1f4985c23988f05831057","name":"BonFi","symbol":"BNF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12862/thumb/bonfi_logo.png?1603114422"},{"chainId":1,"address":"0xcb2fa15f4ea7c55bf6ef9456a662412b137043e9","name":"Payou Finance","symbol":"PAYOU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12863/thumb/PAYOU-LOGO.png?1603118094"},{"chainId":1,"address":"0xb4ae194a0dcf1b4080b164c1d775ee06e0817305","name":"Super Saiya jin","symbol":"SSJ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12867/thumb/super_saiyan_jin_logo.jpg?1603168317"},{"chainId":1,"address":"0x81b1bfd6cb9ad42db395c2a27f73d4dcf5777e2d","name":"Rare","symbol":"RARE","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/12868/thumb/rare_logo.png?1603170092"},{"chainId":1,"address":"0xa10740ff9ff6852eac84cdcff9184e1d6d27c057","name":"Wrapped Gen 0 Crypt","symbol":"WG0","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12870/thumb/wg0_logo.png?1603176705"},{"chainId":1,"address":"0xadb2437e6f65682b85f814fbc12fec0508a7b1d0","name":"UniCrypt","symbol":"UNCX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12871/thumb/unicrypt_logo.png?1603178739"},{"chainId":1,"address":"0x7d91e637589ec3bb54d8213a9e92dc6e8d12da91","name":"Friends With Benefi","symbol":"FWB","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/12873/thumb/fwb_logo.png?1603182111"},{"chainId":1,"address":"0x25c7b64a93eb1261e130ec21a3e9918caa38b611","name":"Wrapped Virgin Gen ","symbol":"WVG0","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12875/thumb/wvg0.png?1603211534"},{"chainId":1,"address":"0x016bf078abcacb987f0589a6d3beadd4316922b0","name":"Rari Stable Pool To","symbol":"RSPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12877/thumb/rspt.png?1603248283"},{"chainId":1,"address":"0x92ef4ffbfe0df030837b65d7fccfe1abd6549579","name":"Swirge","symbol":"SWG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12879/thumb/swirge_logo.png?1603250039"},{"chainId":1,"address":"0x12d102f06da35cc0111eb58017fd2cd28537d0e1","name":"Vox Finance","symbol":"VOX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12880/thumb/BSensIa.png?1603261093"},{"chainId":1,"address":"0xee87b220d9b0e762f0643c501fadefd6d9cc5b7e","name":"Dragon Network","symbol":"DGNN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12881/thumb/logo_256x256.png?1603254107"},{"chainId":1,"address":"0xe28b3b32b6c345a34ff64674606124dd5aceca30","name":"Injective Protocol","symbol":"INJ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12882/thumb/Injective_Icon.png?1613669548"},{"chainId":1,"address":"0xe3a64a3c4216b83255b53ec7ea078b13f21a7dad","name":"DeFi Gold","symbol":"DFGL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12883/thumb/defi_gold.jpg?1603281766"},{"chainId":1,"address":"0x22222c03318440305ac3e8a7820563d6a9fd777f","name":"Clover","symbol":"CLV","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/12888/thumb/clover_logo.png?1603274615"},{"chainId":1,"address":"0x1ad606adde97c0c28bd6ac85554176bc55783c01","name":"Moonday Finance","symbol":"MOONDAY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12890/thumb/qJWRxsz.jpeg?1603327151"},{"chainId":1,"address":"0xa9c44135b3a87e0688c41cf8c27939a22dd437c9","name":"BooBank","symbol":"BOOB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12894/thumb/boobank.PNG?1604043315"},{"chainId":1,"address":"0x84679bc467dc6c2c40ab04538813aff3796351f1","name":"Chonk","symbol":"CHONK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12899/thumb/a2LHjXZ.jpeg?1603418225"},{"chainId":1,"address":"0xd291e7a03283640fdc51b121ac401383a46cc623","name":"Rari Governance Tok","symbol":"RGT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12900/thumb/rgt_logo.png?1603340632"},{"chainId":1,"address":"0xe52d53c8c9aa7255f8c2fa9f7093fea7192d2933","name":"YieldX","symbol":"YIELDX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12904/thumb/logo-200x200.png?1603353354"},{"chainId":1,"address":"0xb9871cb10738eada636432e86fc0cb920dc3de24","name":"PRIA","symbol":"PRIA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12905/thumb/pria-200x.png?1603357286"},{"chainId":1,"address":"0x793786e2dd4cc492ed366a94b88a3ff9ba5e7546","name":"Axia","symbol":"AXIAV3","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12906/thumb/axia_protocol.png?1603379184"},{"chainId":1,"address":"0x1706c33b9a5b12aeb85b862215378dee9480eb95","name":"BananoDOS","symbol":"YBAN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12907/thumb/H3ddt7A.png?1603418786"},{"chainId":1,"address":"0x80bb277f4355a43cdbb86a82f9876c946476d9eb","name":"DogDeFiCoin","symbol":"DOGDEFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12912/thumb/dogdefi_logo.jpg?1603425386"},{"chainId":1,"address":"0x18aaa7115705e8be94bffebde57af9bfc265b998","name":"Audius","symbol":"AUDIO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12913/thumb/AudiusCoinLogo_2x.png?1603425727"},{"chainId":1,"address":"0x6e0dade58d2d89ebbe7afc384e3e4f15b70b14d8","name":"QuiverX","symbol":"QRX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12916/thumb/qrx_logo.png?1603550478"},{"chainId":1,"address":"0x3c9d6c1c73b31c837832c72e04d3152f051fc1a9","name":"BoringDAO","symbol":"BOR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12917/thumb/bor_logo.png?1603607502"},{"chainId":1,"address":"0x4691937a7508860f876c9c0a2a617e7d9e945d4b","name":"Wootrade Network","symbol":"WOO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12921/thumb/w2UiemF__400x400.jpg?1603670367"},{"chainId":1,"address":"0x4c11249814f11b9346808179cf06e71ac328c1b5","name":"Oraichain Token","symbol":"ORAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12931/thumb/2000x2000_azfsy0.png?1603696770"},{"chainId":1,"address":"0x50eb346fc29a80d97563a50146c3fcf9423b5538","name":"Skull Candy Shards","symbol":"CANDY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12934/thumb/Skull_Candy.png?1603719579"},{"chainId":1,"address":"0xbc3ec4e491b835dce394a53e9a9a10ac19564839","name":"Starbugs Shards","symbol":"BUGS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12935/thumb/Starbugs.png?1603720230"},{"chainId":1,"address":"0xa3a3f076413a362bb0d69eea1dc5b0e79c831edc","name":"Cocaine Cowboy Shar","symbol":"COKE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12937/thumb/Cocaine_Cowboy.png?1603720411"},{"chainId":1,"address":"0x034455c8a9882bf44c9704c780a55198e05ba559","name":"Lumos","symbol":"LMS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12938/thumb/6tZdBWW.png?1603723170"},{"chainId":1,"address":"0xeeaa34af95b034bada4baf565063132c765b1fa5","name":"OLCF","symbol":"OLCF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12939/thumb/2_5237799779538307093.png?1603838173"},{"chainId":1,"address":"0x7a82c573b378ceea29772afb93891f0d0afa93b7","name":"Wizard","symbol":"WIZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12942/thumb/T9L0NJT.png?1607391342"},{"chainId":1,"address":"0x6c4522f0035bed2180b40f4c5d9dbaab64b41325","name":"Passport Finance","symbol":"PASS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12946/thumb/android-chrome-512x512.png?1604277448"},{"chainId":1,"address":"0xbe685c5e06866cfb94a4242e3df8f2fa3e7c2b73","name":"Yearn Finance Red M","symbol":"YFRM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12947/thumb/200X200.png?1603778631"},{"chainId":1,"address":"0x20945ca1df56d237fd40036d47e866c7dccd2114","name":"Nsure Network","symbol":"NSURE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12948/thumb/Nsure_token.png?1603778876"},{"chainId":1,"address":"0x3516415161c478df10adbb8bb884cc83fbd5f11a","name":"AlphaDex","symbol":"DEX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12949/thumb/AlphaDex.png?1603779030"},{"chainId":1,"address":"0xbbff34e47e559ef680067a6b1c980639eeb64d24","name":"Leverj Gluon","symbol":"L2","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12950/thumb/Gluon256x256.png?1604048379"},{"chainId":1,"address":"0xe6710e0cda178f3d921f456902707b0d4c4a332b","name":"JULIEN","symbol":"JULIEN","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/12954/thumb/julien_logo.jpg?1603792446"},{"chainId":1,"address":"0xa1d6df714f91debf4e0802a542e13067f31b8262","name":"RedFOX Labs","symbol":"RFOX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12956/thumb/logo-200.png?1607620623"},{"chainId":1,"address":"0x6a8c66cab4f766e5e30b4e9445582094303cc322","name":"Farm Defi","symbol":"PFARM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12957/thumb/PFARM_logo.png?1603837555"},{"chainId":1,"address":"0x20c36f062a31865bed8a5b1e512d9a1a20aa333a","name":"DefiDollar DAO","symbol":"DFD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12959/thumb/DFD.jpg?1604415975"},{"chainId":1,"address":"0xaf20b44c1c651d1d29cfb916ee2a0630b828eb7a","name":"YYFI Protocol","symbol":"YYFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12960/thumb/20201027_093510.png?1603850588"},{"chainId":1,"address":"0xa6312567e419e73951c451feaba07b6d74a0e8ce","name":"SocketFinance","symbol":"SFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12962/thumb/SocketFinance_logo_256_256.png?1603854169"},{"chainId":1,"address":"0xb7bc7b0a32455f7e7a924f832ca4f0a0ac3b6b88","name":"Warlord Token","symbol":"WLT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12963/thumb/200px.png?1603854513"},{"chainId":1,"address":"0x1ceb5cb57c4d4e2b2433641b95dd330a33185a44","name":"Keep3rV1","symbol":"KP3R","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12966/thumb/kp3r_logo.jpg?1607057458"},{"chainId":1,"address":"0x892f5a0b08bb7b1eecccc63ef3916ff201c93664","name":"Bloody Token","symbol":"BLOODY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12969/thumb/bloody-200px.png?1603940552"},{"chainId":1,"address":"0x3218a02f8f8b5c3894ce30eb255f10bcba13e654","name":"MegaCryptoPolis","symbol":"MEGA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12971/thumb/mcp_icon_200.png?1603943441"},{"chainId":1,"address":"0x6c3f90f043a72fa612cbac8115ee7e52bde6e490","name":"LP 3pool Curve","symbol":"3CRV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12972/thumb/3pool_128.png?1603948039"},{"chainId":1,"address":"0x776ca7ded9474829ea20ad4a5ab7a6ffdb64c796","name":"TenSpeed Finance","symbol":"TENS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12973/thumb/72911917.jpg?1603955940"},{"chainId":1,"address":"0xc761d1ccb38a94703675d2cdb15f7f1b3dcff7b7","name":"Hiz Finance","symbol":"HIZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12974/thumb/73051179.png?1603959145"},{"chainId":1,"address":"0x5218e472cfcfe0b64a064f055b43b4cdc9efd3a6","name":"UnFederalReserve","symbol":"ERSDL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12975/thumb/unFederalReserve_LogoArtboard_1_copy_20-64.png?1610087806"},{"chainId":1,"address":"0x39ad22c916f42af5f67371d6f2fb0dab42321a89","name":"OSINA","symbol":"OSINA","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/12977/thumb/OSINA_Logo.png?1604019955"},{"chainId":1,"address":"0x6be7e93e45740c314c89a3be52473a0ddf2450fe","name":"XCredit","symbol":"XFYI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12979/thumb/xcredit_finance_logo.jpg?1604040780"},{"chainId":1,"address":"0xea319e87cf06203dae107dd8e5672175e3ee976c","name":"Surf Finance","symbol":"SURF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12982/thumb/surf_200x200.png?1604050261"},{"chainId":1,"address":"0xaa9d866666c2a3748d6b23ff69e63e52f08d9ab4","name":"Fundamenta","symbol":"FMTA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12983/thumb/fundamenta.png?1604065939"},{"chainId":1,"address":"0xc89b4a8a121dd3e726fe7515e703936cf83e3350","name":"Kper Network","symbol":"KPER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12984/thumb/kper.png?1604066205"},{"chainId":1,"address":"0x160b1e5aabfd70b2fc40af815014925d71ceed7e","name":"StakedFIRO","symbol":"STFIRO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12985/thumb/stFIRO_high_res.png?1606234476"},{"chainId":1,"address":"0xf12ec0d3dab64ddefbdc96474bde25af3fe1b327","name":"Stacy","symbol":"STACY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12986/thumb/Stacy.png?1604384468"},{"chainId":1,"address":"0x02eca910cb3a7d43ebc7e8028652ed5c6b70259b","name":"Pteria","symbol":"PTERIA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12989/thumb/Pteria.png?1604105704"},{"chainId":1,"address":"0x355376d6471e09a4ffca8790f50da625630c5270","name":"Libartysharetoken","symbol":"LST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12990/thumb/lst_logo.png?1604148361"},{"chainId":1,"address":"0x8bf92cad232f72a7c61eb42e9185e8d0ea470f6b","name":"SMPL Foundation","symbol":"SMPL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12991/thumb/smpl.jpg?1604208000"},{"chainId":1,"address":"0xdacd69347de42babfaecd09dc88958378780fb62","name":"Atari","symbol":"ATRI","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/12992/thumb/atari.png?1604212345"},{"chainId":1,"address":"0xeea9ae787f3a620072d13b2cdc8cabffb9c0ab96","name":"Yearn Secure","symbol":"YSEC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12993/thumb/ysec.png?1604212852"},{"chainId":1,"address":"0x0829d2d5cc09d3d341e813c821b0cfae272d9fb2","name":"Social Rocket","symbol":"ROCKS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12994/thumb/logo-256x256-1.png?1604759401"},{"chainId":1,"address":"0xbea98c05eeae2f3bc8c3565db7551eb738c8ccab","name":"Geyser","symbol":"GYSR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12995/thumb/gey.png?1604235725"},{"chainId":1,"address":"0x075190c6130ea0a3a7e40802f1d77f4ea8f38fe2","name":"nYFI","symbol":"N0031","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12997/thumb/nest_protocol_logo.png?1604246163"},{"chainId":1,"address":"0xfa5047c9c78b8877af97bdcb85db743fd7313d4a","name":"KeeperDAO","symbol":"ROOK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13005/thumb/keeper_dao_logo.jpg?1604316506"},{"chainId":1,"address":"0xa89ac6e529acf391cfbbd377f3ac9d93eae9664e","name":"Keep4r","symbol":"KP4R","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13006/thumb/kp4r.png?1604368813"},{"chainId":1,"address":"0xf151980e7a781481709e8195744bf2399fb3cba4","name":"Freeway Token","symbol":"FWT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13012/thumb/A-200px.png?1604381296"},{"chainId":1,"address":"0x1c7bbadc81e18f7177a95eb1593e5f5f35861b10","name":"Auric Network","symbol":"AUSCM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13015/thumb/auric-1-high-res_icon_300_PNG.png?1604384136"},{"chainId":1,"address":"0x10633216e7e8281e33c86f02bf8e565a635d9770","name":"Dvision Network","symbol":"DVI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13020/thumb/WGAhHOLv_400x400.png?1604396086"},{"chainId":1,"address":"0xf1f508c7c9f0d1b15a76fba564eef2d956220cf7","name":"Pepedex","symbol":"PPDEX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13022/thumb/output-onlinepngtools-1.png?1604720841"},{"chainId":1,"address":"0xaac41ec512808d64625576eddd580e7ea40ef8b2","name":"Gameswap","symbol":"GSWAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13026/thumb/gameswap.jpg?1604456704"},{"chainId":1,"address":"0x538a151dd910c1d1227719bd400d6c4f99ea06d0","name":"Cryptochrome","symbol":"CHM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13028/thumb/cryptochrome_logo.png?1604461218"},{"chainId":1,"address":"0xf5d669627376ebd411e34b98f19c868c8aba5ada","name":"Axie Infinity","symbol":"AXS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13029/thumb/axie_infinity_logo.png?1604471082"},{"chainId":1,"address":"0x79ba92dda26fce15e1e9af47d5cfdfd2a093e000","name":"SERGS","symbol":"SERGS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13031/thumb/sergs_logo.png?1604476848"},{"chainId":1,"address":"0x74603e780545d02c4257e7d2be19c74de7be1952","name":"ETG Finance","symbol":"ETGF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13032/thumb/etgf_logo.png?1604482450"},{"chainId":1,"address":"0xa93d5cfaa41193b13321c035b4bdd2b534172762","name":"Dream Swap","symbol":"DREAM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13033/thumb/dream_32.png?1604503082"},{"chainId":1,"address":"0xd811e485cb4ab1fad56233de4464fb5d1c9f3e99","name":"Yearn Global","symbol":"YG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13034/thumb/tyrQieZZ_400x400.png?1604539997"},{"chainId":1,"address":"0x72e9d9038ce484ee986fea183f8d8df93f9ada13","name":"SmartCredit Token","symbol":"SMARTCREDIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13036/thumb/smartcredit_logo_02_white_a-1.png?1604545479"},{"chainId":1,"address":"0x16be21c08eb27953273608629e4397556c561d26","name":"Yearn20Moon Finance","symbol":"YMF20","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13037/thumb/Brand_Identity.png?1605773986"},{"chainId":1,"address":"0x21686f8ce003a95c99acd297e302faacf742f7d4","name":"Wrapped Conceal","symbol":"WCCX","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/13039/thumb/wccx_logo.png?1604566677"},{"chainId":1,"address":"0x95a4492f028aa1fd432ea71146b433e7b4446611","name":"APY Finance","symbol":"APY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13041/thumb/1*AvkD-OLocausbxqUzezZ0A.png?1604577922"},{"chainId":1,"address":"0x21cf09bc065082478dcc9ccb5fd215a978dc8d86","name":"Jem","symbol":"JEM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13044/thumb/itchiro-defi.png?1605892179"},{"chainId":1,"address":"0xa393473d64d2f9f026b60b6df7859a689715d092","name":"Lattice Token","symbol":"LTX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13050/thumb/lattice-logo.png?1604641504"},{"chainId":1,"address":"0x058349297672b6cc7ccb6e59a679c5add74a6898","name":"Ethereum Vault","symbol":"ETHV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13051/thumb/Tok425m.jpeg?1604654743"},{"chainId":1,"address":"0xca3fe04c7ee111f0bbb02c328c699226acf9fd33","name":"SEEN","symbol":"SEEN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13052/thumb/seen_logo.png?1604678509"},{"chainId":1,"address":"0x7c81542ed859a2061538fee22b6544a235b9557d","name":"Combo","symbol":"COMB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13053/thumb/7zYe50X.png?1604703767"},{"chainId":1,"address":"0x15334dcb171e8b65d6650321581dca83be870115","name":"Wrapped BIND","symbol":"WBIND","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13055/thumb/o1w2cBW.png?1604720921"},{"chainId":1,"address":"0x86d3f38edaf7e7959e5d8e6aea5ad3187b78c346","name":"MTI Finance","symbol":"MTI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13061/thumb/mti.png?1605153678"},{"chainId":1,"address":"0x38d58b82cb24a3e0410a7991f255174c9fd8093b","name":"TEAL","symbol":"TEAT","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/13062/thumb/teat_logo.png?1604845769"},{"chainId":1,"address":"0x2e2f3246b6c65ccc4239c9ee556ec143a7e5de2c","name":"Yfi mobi","symbol":"YFIM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13063/thumb/yfim.jpg?1604848218"},{"chainId":1,"address":"0x59e7b5db9be0bdd26fa048d39e01fee456ab674e","name":"Yearn Finance Bit2","symbol":"YFB2","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13064/thumb/yfb2_logo.png?1604884273"},{"chainId":1,"address":"0xc5bddf9843308380375a611c18b50fb9341f502a","name":"veCRV DAO yVault","symbol":"YVE-CRVDAO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13065/thumb/yearn_veCRV.png?1612862859"},{"chainId":1,"address":"0xfdb615d6a15f929ddabc6b83a4f1cf9d361b064e","name":"Divert Finance","symbol":"DEVE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13067/thumb/DVMZDhP.png?1606785893"},{"chainId":1,"address":"0xcbe7142f5c16755d8683ba329efa1abf7b54482d","name":"MedicalVeda","symbol":"MVEDA","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13069/thumb/medicalveda_new_logo_final_%281%29.png?1604894690"},{"chainId":1,"address":"0x7ca4408137eb639570f8e647d9bd7b7e8717514a","name":"Alpaca","symbol":"ALPA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13070/thumb/alpaca_logo.png?1604895862"},{"chainId":1,"address":"0xd794dd1cada4cf79c9eebaab8327a1b0507ef7d4","name":"Hyve","symbol":"HYVE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13072/thumb/MKHXNbf.png?1604899269"},{"chainId":1,"address":"0xa8e7ad77c60ee6f30bac54e2e7c0617bd7b5a03e","name":"zLOT","symbol":"ZLOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13073/thumb/z-LOT-logo-transparent.png?1604900416"},{"chainId":1,"address":"0x837010619aeb2ae24141605afc8f66577f6fb2e7","name":"zHEGIC","symbol":"ZHEGIC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13074/thumb/zhegic_logo.png?1604903561"},{"chainId":1,"address":"0x921c87490ccbef90a3b0fc1951bd9064f7220af6","name":"Ectoplasma","symbol":"ECTO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13077/thumb/ECTO-LOGO.png?1604915817"},{"chainId":1,"address":"0xa8b0f154a688c22142e361707df64277e0a0be66","name":"Rake Finance","symbol":"RAK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13078/thumb/rake-logo-200x200.png?1604931839"},{"chainId":1,"address":"0xf6832ea221ebfdc2363729721a146e6745354b14","name":"FRMx Token","symbol":"FRMX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13082/thumb/New_Project_%2862%29.png?1609811248"},{"chainId":1,"address":"0xe6179bb571d2d69837be731da88c76e377ec4738","name":"wormhole finance","symbol":"WHOLE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13084/thumb/wormhole.finance.png?1604984651"},{"chainId":1,"address":"0x90b426067be0b0ff5de257bc4dd6a4815ea03b5f","name":"Strain","symbol":"STRN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13087/thumb/strain_logo.jpg?1604990516"},{"chainId":1,"address":"0x1fc05d480b1ef1175a31123bfdbd36bfee256889","name":"noob finance","symbol":"NOOB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13088/thumb/noob_finance_logo.jpg?1604998432"},{"chainId":1,"address":"0x910524678c0b1b23ffb9285a81f99c29c11cbaed","name":"Azuki","symbol":"AZUKI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13091/thumb/bdUBSCo.png?1605169403"},{"chainId":1,"address":"0x1fa21b20222076d7465fb901e5f459289c95f66a","name":"XFII","symbol":"XFII","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13092/thumb/xfii_logo.png?1605065018"},{"chainId":1,"address":"0xbf4a9a37ecfc21825011285222c36ab35de51f14","name":"Nyan V2","symbol":"NYAN-2","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13093/thumb/v2-logo.png?1605067493"},{"chainId":1,"address":"0x2369686fc9fb6e1fdc46541891568c2f341906ef","name":"Drakoin","symbol":"DRK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13094/thumb/drakoinlogo200.png?1605076487"},{"chainId":1,"address":"0x51bb9c623226ce781f4a54fc8f4a530a47142b6b","name":"Peet DeFi","symbol":"PTE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13100/thumb/peetdefi_logo.png?1605148557"},{"chainId":1,"address":"0x6bffa07a1b0cebc474ce6833eaf2be6326252449","name":"BAEPAY","symbol":"BAEPAY","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/13101/thumb/baepay_logo.png?1605150696"},{"chainId":1,"address":"0x2f4eb47a1b1f4488c71fc10e39a4aa56af33dd49","name":"UNCL","symbol":"UNCL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13102/thumb/uncl_logo.png?1605230945"},{"chainId":1,"address":"0x59ad6061a0be82155e7acce9f0c37bf59f9c1e3c","name":"Liquid Lottery RTC","symbol":"LIQLO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13104/thumb/liqlo_logo.png?1605234382"},{"chainId":1,"address":"0x72ca0501427bb8f089c1c4f767cb17d017e803a9","name":"Liquid DeFi","symbol":"LIQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13107/thumb/liquid_defi_logo.jpg?1605247848"},{"chainId":1,"address":"0x3d1be3fef769399cce7e504e85324d622f23cf85","name":"Tulip Seed","symbol":"STLP","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13108/thumb/tulip_logo.jpg?1605258713"},{"chainId":1,"address":"0x71f85b2e46976bd21302b64329868fd15eb0d127","name":"Axion","symbol":"AXN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13110/thumb/AXN.png?1613016807"},{"chainId":1,"address":"0x60ca261e14f26e8daae8b1a7f8e783d64859126c","name":"STONKS","symbol":"STONK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13111/thumb/stonk_logo.png?1605278755"},{"chainId":1,"address":"0x63b4f3e3fa4e438698ce330e365e831f7ccd1ef4","name":"CyberFi","symbol":"CFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13112/thumb/cyberfi_logo.jpeg?1605283367"},{"chainId":1,"address":"0xc3eb2622190c57429aac3901808994443b64b466","name":"ORO","symbol":"ORO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13114/thumb/oro_logo.png?1605338447"},{"chainId":1,"address":"0x14d1c83df4decee9deb14ee851f109f0101a6631","name":"Volts Finance","symbol":"VOLTS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13115/thumb/volts_logo.png?1605367400"},{"chainId":1,"address":"0x66d28cb58487a7609877550e1a34691810a6b9fc","name":"Koinos","symbol":"KOIN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13116/thumb/koinos_logo.jpg?1605406276"},{"chainId":1,"address":"0xb753428af26e81097e7fd17f40c88aaa3e04902c","name":"saffron finance","symbol":"SFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13117/thumb/sfi_red_250px.png?1606020144"},{"chainId":1,"address":"0x903bef1736cddf2a537176cf3c64579c3867a881","name":"ichi farm","symbol":"ICHI","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13119/thumb/ichifarm.jpg?1605664946"},{"chainId":1,"address":"0x22b6c31c2beb8f2d0d5373146eed41ab9ede3caf","name":"cocktailbar finance","symbol":"COC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13121/thumb/cocktail_bar_logo.png?1605488103"},{"chainId":1,"address":"0xd2be3722b17b616c51ed9b8944a227d1ce579c24","name":"Dtube Coin","symbol":"DTUBE","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/13126/thumb/dtube_logo.png?1605500467"},{"chainId":1,"address":"0x26a604dffe3ddab3bee816097f81d3c4a2a4cf97","name":"CorionX","symbol":"CORX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13129/thumb/x_log.png?1605515405"},{"chainId":1,"address":"0x48cf0e2eca22eae0ad33fee16a5cb6e62207a8ab","name":"YTHO Online","symbol":"YTHO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13130/thumb/photo_2020-10-06_11-28-28_%282%29.jpg?1609205097"},{"chainId":1,"address":"0x67b66c99d3eb37fa76aa3ed1ff33e8e39f0b9c7a","name":"Interest Bearing ET","symbol":"IBETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13131/thumb/7675.png?1605535879"},{"chainId":1,"address":"0x6e10aacb89a28d6fa0fe68790777fec7e7f01890","name":"SAV3","symbol":"SAV3","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13132/thumb/sav3_logo.png?1605536471"},{"chainId":1,"address":"0xdecade1c6bf2cd9fb89afad73e4a519c867adcf5","name":"Experty Wisdom Toke","symbol":"WIS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13133/thumb/n0MTVBrm_400x400.jpg?1605543934"},{"chainId":1,"address":"0x9f7229af0c4b9740e207ea283b9094983f78ba04","name":"Tadpole","symbol":"TAD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13134/thumb/9DmF_cs3_400x400.jpg?1605574755"},{"chainId":1,"address":"0x15f5f5f29a819bf7b4b80bf55352e1e42707c94e","name":"Die","symbol":"DIE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13136/thumb/gR-removebg-preview.png?1605580337"},{"chainId":1,"address":"0x8888801af4d980682e47f1a9036e589479e835c5","name":"88mph","symbol":"MPH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13137/thumb/yfU-_Tcj_400x400.png?1605581509"},{"chainId":1,"address":"0x5935ffc231e93ac04daa089c0f1b94d0fb2449de","name":"Kanva","symbol":"KNV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13138/thumb/5uoWII9M_400x400.png?1605592792"},{"chainId":1,"address":"0x515d7e9d75e2b76db60f8a051cd890eba23286bc","name":"Governor DAO","symbol":"GDAO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13140/thumb/GDAOlogo2-bird.png?1605591842"},{"chainId":1,"address":"0x09843b9137fc5935b7f3832152f9074db5d2d1ee","name":"YFI3 money","symbol":"YFI3","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13142/thumb/yfi3.png?1605596278"},{"chainId":1,"address":"0xa211f450ce88deb31d3f12ae3c1ebf6b0e55a5d9","name":"Parsiq Boost","symbol":"PRQBOOST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13144/thumb/boost_logo.png?1605600652"},{"chainId":1,"address":"0x6468e79a80c0eab0f9a2b574c8d5bc374af59414","name":"e Radix","symbol":"EXRD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13145/thumb/exrd_logo.png?1605662677"},{"chainId":1,"address":"0x65fc94d99cb301c5630c485d312e6ff5edde13d0","name":"MVP","symbol":"MVP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13150/thumb/mvp_token_logo.png?1605688252"},{"chainId":1,"address":"0xcb5f72d37685c3d5ad0bb5f982443bc8fcdf570e","name":"Rootkit","symbol":"ROOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13151/thumb/rootkit_logo.png?1605712875"},{"chainId":1,"address":"0x4c10bd19688b906665fbd53415f279f34b44ece7","name":"YUI Finance","symbol":"YUI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13153/thumb/YUI.png?1605751023"},{"chainId":1,"address":"0x595643d83b35df38e29058976c04000acfa31570","name":"OBR","symbol":"OBR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13154/thumb/nftobr.png?1605756268"},{"chainId":1,"address":"0x1443e7c1cce72662545d94779120c59251447e91","name":"Molten","symbol":"MOL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13156/thumb/256.png?1605931524"},{"chainId":1,"address":"0xa6fb1df483b24eeab569e19447e0e107003b9e15","name":"Earnbase","symbol":"ENB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13164/thumb/YhCEGdB.png?1605775799"},{"chainId":1,"address":"0xe59064a8185ed1fca1d17999621efedfab4425c9","name":"PrimeDAO","symbol":"PRIME","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13165/thumb/PrimeDAO_200x200.png?1605800174"},{"chainId":1,"address":"0xdbdd6f355a37b94e6c7d32fef548e98a280b8df5","name":"UniWhales","symbol":"UWL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13166/thumb/uniwhale.png?1611967645"},{"chainId":1,"address":"0xe481f2311c774564d517d015e678c2736a25ddd3","name":"DefHold","symbol":"DEFO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13168/thumb/defhold_logo.png?1605849148"},{"chainId":1,"address":"0xa69f7a10df90c4d6710588bc18ad9bf08081f545","name":"Cexlt","symbol":"CLT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13171/thumb/clt_logo.png?1605855281"},{"chainId":1,"address":"0x47935edfb3cdd358c50f6c0add1cc24662e30f5f","name":"SUP8EME","symbol":"SUP8EME","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/13174/thumb/sup8eme_logo.png?1605864500"},{"chainId":1,"address":"0x59d4ccc94a9c4c3d3b4ba2aa343a9bdf95145dd1","name":"QUSD Stablecoin","symbol":"QUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13176/thumb/qusd_logo.png?1605922605"},{"chainId":1,"address":"0x65d9bc970aa9b2413027fa339f7f179b3f3f2604","name":"QIAN Governance Tok","symbol":"KUN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13177/thumb/kun_logo.png?1605923919"},{"chainId":1,"address":"0x95b3497bbcccc46a8f45f5cf54b0878b39f8d96c","name":"UniDex","symbol":"UNIDX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13178/thumb/unidex_logo.png?1605925219"},{"chainId":1,"address":"0x88d39566dae88dc838652d9898f0aa6a8ff2819a","name":"HypeBurn","symbol":"HBURN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13179/thumb/hypeburn_logo_coingecko_200px.png?1605968369"},{"chainId":1,"address":"0x4c19596f5aaff459fa38b0f7ed92f11ae6543784","name":"TrueFi","symbol":"TRU","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13180/thumb/trust-token.png?1606009370"},{"chainId":1,"address":"0x45080a6531d671ddff20db42f93792a489685e32","name":"Finance Vote","symbol":"FVT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13181/thumb/finance.png?1606015010"},{"chainId":1,"address":"0x7ef1081ecc8b5b5b130656a41d4ce4f89dbbcc8c","name":"Compounder","symbol":"CP3R","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13182/thumb/compounder_logo.png?1606018434"},{"chainId":1,"address":"0xa0bed124a09ac2bd941b10349d8d224fe3c955eb","name":"DePay","symbol":"DEPAY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13183/thumb/favicon.png?1608102012"},{"chainId":1,"address":"0xd61b60ccbdaf09c2e036c72734adb3270ed27192","name":"WaterDrop","symbol":"WDP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13185/thumb/QhKzNey.png?1606084418"},{"chainId":1,"address":"0x7866e48c74cbfb8183cd1a929cd9b95a7a5cb4f4","name":"DexKit","symbol":"KIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13187/thumb/dexkit_logo.png?1606093850"},{"chainId":1,"address":"0x1f3f9d3068568f8040775be2e8c03c103c61f3af","name":"Archer DAO Governan","symbol":"ARCH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13188/thumb/archer_logo.png?1606097487"},{"chainId":1,"address":"0xa1afffe3f4d611d252010e3eaf6f4d77088b0cd7","name":"reflect finance","symbol":"RFI","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13189/thumb/reflect_finance_logo.png?1606098213"},{"chainId":1,"address":"0xd1afbccc9a2c2187ea544363b986ea0ab6ef08b5","name":"Ethereum Yield","symbol":"ETHY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13191/thumb/rOIuPZM.png?1606101103"},{"chainId":1,"address":"0x72630b1e3b42874bf335020ba0249e3e9e47bafc","name":"Paypolitan Token","symbol":"EPAN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13192/thumb/ava3.png?1606102032"},{"chainId":1,"address":"0x610c67be018a5c5bdc70acd8dc19688a11421073","name":"Hype Finance","symbol":"HYPE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13193/thumb/hype_finance_logo.png?1606109896"},{"chainId":1,"address":"0xd18a8abed9274edbeace4b12d86a8633283435da","name":"UnoSwap","symbol":"UNOS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13194/thumb/slazzer-edit-image.png?1606115031"},{"chainId":1,"address":"0x6cfb6df56bbdb00226aeffcdb2cd1fe8da1abda7","name":"Komet","symbol":"KOMET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13196/thumb/komet_finance_logo.png?1606120745"},{"chainId":1,"address":"0xe8ed08a581777f112654e28de507e11613da0379","name":"Yearn Finance Cente","symbol":"YFC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13199/thumb/yfc_logo.png?1606186020"},{"chainId":1,"address":"0x9248c485b0b80f76da451f167a8db30f33c70907","name":"Debase","symbol":"DEBASE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13201/thumb/debase_logo.png?1606190818"},{"chainId":1,"address":"0x537a9095b78517597b5f2058edcd6e1978095909","name":"Design","symbol":"DSGN","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/13204/thumb/design_logo.jpg?1606196569"},{"chainId":1,"address":"0x8d5db0c1f0681071cb38a382ae6704588d9da587","name":"Prophet","symbol":"PROPHET","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13209/thumb/prophet_finance.png?1606202225"},{"chainId":1,"address":"0x67c597624b17b16fb77959217360b7cd18284253","name":"Benchmark Protocol","symbol":"MARK","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13212/thumb/benchmark_protocol.jpg?1606267583"},{"chainId":1,"address":"0xed36482c7f8e5850e91ac0cf6bf2130a1aa2df92","name":"Holdtowin","symbol":"7ADD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13213/thumb/logo256_%281%29.png?1606276280"},{"chainId":1,"address":"0x63d0eea1d7c0d1e89d7e665708d7e8997c0a9ed6","name":"Ethanol","symbol":"ENOL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13214/thumb/hV_w1e5G_400x400.png?1606292732"},{"chainId":1,"address":"0x469e66e06fec34839e5eb1273ba85a119b8d702f","name":"Degov","symbol":"DEGOV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13215/thumb/degov.png?1606277121"},{"chainId":1,"address":"0xce593a29905951e8fc579bc092eca72577da575c","name":"GROM","symbol":"GR","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/13216/thumb/gr.png?1606278269"},{"chainId":1,"address":"0x8d3e855f3f55109d473735ab76f753218400fe96","name":"Bundles","symbol":"BUND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13219/thumb/bundles_finance_logo.jpg?1606294826"},{"chainId":1,"address":"0x74fb9da15d4f9a34d8c825798da0fa5c400dade1","name":"CORD Finance","symbol":"CORD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13221/thumb/cord-transparent-square-256.png?1611322978"},{"chainId":1,"address":"0x5dc02ea99285e17656b8350722694c35154db1e8","name":"Bonded Finance","symbol":"BOND","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13222/thumb/bonded_finance_logo.png?1606318433"},{"chainId":1,"address":"0xb97faf860045483e0c7f08c56acb31333084a988","name":"Vanilla Network","symbol":"VNLA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13223/thumb/vanilla_network_logo.jpeg?1606352291"},{"chainId":1,"address":"0x4f4f0ef7978737ce928bff395529161b44e27ad9","name":"YfDFI Finance","symbol":"YFD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13225/thumb/YFD2.png?1613362452"},{"chainId":1,"address":"0x6e742e29395cf5736c358538f0f1372ab3dfe731","name":"TAMA EGG NiftyGotch","symbol":"TME","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13229/thumb/photo_2021-01-25_09-16-29.jpg?1611537425"},{"chainId":1,"address":"0xb6ca7399b4f9ca56fc27cbff44f4d2e4eef1fc81","name":"Muse","symbol":"MUSE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13230/thumb/muse_logo.png?1606460453"},{"chainId":1,"address":"0xb6ff96b8a8d214544ca0dbc9b33f7ad6503efd32","name":"Sync Network","symbol":"SYNC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13231/thumb/sync_network.png?1606468585"},{"chainId":1,"address":"0x16980b3b4a3f9d89e33311b5aa8f80303e5ca4f8","name":"KIRA Network","symbol":"KEX","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/13232/thumb/kira_logo.jpg?1606570162"},{"chainId":1,"address":"0x69e8b9528cabda89fe846c67675b5d73d463a916","name":"OPEN Governance Tok","symbol":"OPEN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13233/thumb/opendao_logo.png?1606575207"},{"chainId":1,"address":"0x1456688345527be1f37e9e627da0837d6f08c925","name":"USDP Stablecoin","symbol":"USDP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13234/thumb/USDP.png?1606579598"},{"chainId":1,"address":"0xa456b515303b2ce344e9d2601f91270f8c2fea5e","name":"Cornichon","symbol":"CORN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13235/thumb/cornichon.png?1606629943"},{"chainId":1,"address":"0x6e1a19f235be7ed8e3369ef73b196c07257494de","name":"Wrapped Filecoin","symbol":"WFIL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13238/thumb/WFIL-Icon.png?1606630561"},{"chainId":1,"address":"0x4a64515e5e1d1073e83f30cb97bed20400b66e10","name":"Wrapped Zcash","symbol":"WZEC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13239/thumb/WZEC-icon.png?1606630700"},{"chainId":1,"address":"0x0def8d8adde14c9ef7c2a986df3ea4bd65826767","name":"DefiCliq","symbol":"CLIQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13242/thumb/deficliq_logo.png?1606660146"},{"chainId":1,"address":"0x00c83aecc790e8a4453e5dd3b0b4b3680501a7a7","name":"SKALE","symbol":"SKL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13245/thumb/SKALE_token_300x300.png?1606789574"},{"chainId":1,"address":"0x3449fc1cd036255ba1eb19d65ff4ba2b8903a69a","name":"Basis Cash","symbol":"BAC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13246/thumb/BAC.png?1613231642"},{"chainId":1,"address":"0xbd2f0cd039e0bfcf88901c98c0bfac5ab27566e3","name":"Dynamic Set Dollar","symbol":"DSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13249/thumb/DSD.jpg?1606713628"},{"chainId":1,"address":"0x033e223870f766644f7f7a4b7dc2e91573707d06","name":"Zin","symbol":"ZIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13250/thumb/coingecko_logo.png?1606716375"},{"chainId":1,"address":"0x106538cc16f938776c7c180186975bca23875287","name":"Basis Share","symbol":"BAS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13251/thumb/BAS.png?1613231139"},{"chainId":1,"address":"0x692eb773e0b5b7a79efac5a015c8b36a2577f65c","name":"swiss finance","symbol":"SWISS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13253/thumb/SWISS.png?1606724844"},{"chainId":1,"address":"0xa0afaa285ce85974c3c881256cb7f225e3a1178a","name":"Wrapped CrescoFin","symbol":"WCRES","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13254/thumb/cres_logo.png?1606728821"},{"chainId":1,"address":"0xd8e3fb3b08eba982f2754988d70d57edc0055ae6","name":"Zoracles","symbol":"ZORA","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13255/thumb/zora.png?1606747018"},{"chainId":1,"address":"0x0b38210ea11411557c13457d4da7dc6ea731b88a","name":"API3","symbol":"API3","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13256/thumb/api3.jpg?1606751424"},{"chainId":1,"address":"0x70401dfd142a16dc7031c56e862fc88cb9537ce0","name":"Bird Money","symbol":"BIRD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13260/thumb/favicon-180x180.png?1611546646"},{"chainId":1,"address":"0x3d995510f8d82c2ea341845932b5ddde0bead9a3","name":"uLABS synthetic Gas","symbol":"UGAS-JAN21","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13261/thumb/uma_logo.jpg?1606799190"},{"chainId":1,"address":"0xcdeee767bed58c5325f68500115d4b722b3724ee","name":"Carbon","symbol":"CRBN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13262/thumb/CRBN_Icon_200.png?1606803750"},{"chainId":1,"address":"0x226e390751a2e22449d611bac83bd267f2a2caff","name":"STVKE","symbol":"STV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13264/thumb/stvke_network.png?1606813287"},{"chainId":1,"address":"0x07150e919b4de5fd6a63de1f9384828396f25fdc","name":"Base Protocol","symbol":"BASE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13265/thumb/200x200green.png?1607650121"},{"chainId":1,"address":"0x8c18d6a985ef69744b9d57248a45c0861874f244","name":"ClinTex CTi","symbol":"CTI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13266/thumb/CTI.png?1606817542"},{"chainId":1,"address":"0xee06a81a695750e71a662b51066f2c74cf4478a0","name":"Decentral Games","symbol":"DG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13267/thumb/Copy_of_DG_Coin_logo.png?1606834850"},{"chainId":1,"address":"0xa883e72c12473ded50a5fbffa60e4000fa5fe3c8","name":"LOAD Network","symbol":"LOAD","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13270/thumb/load_network_logo.png?1606880512"},{"chainId":1,"address":"0x558a069a3a1a1e72398607b9e3577fce1c67ea63","name":"JPYQ Stablecoin by ","symbol":"JPYQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13271/thumb/1MMbEc4a.png?1606884873"},{"chainId":1,"address":"0xb0bfb1e2f72511cf8b4d004852e2054d7b9a76e1","name":"Streamix","symbol":"MIXS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13275/thumb/stream.png?1606893790"},{"chainId":1,"address":"0x70460c3bb9abcc0aa51f922c00d37816d6ede4d7","name":"BooBanker Research ","symbol":"BBRA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13280/thumb/bbra_logo.png?1606906062"},{"chainId":1,"address":"0xa2ef2757d2ed560c9e3758d1946d7bcccbd5a7fe","name":"Adventure Token","symbol":"TWA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13284/thumb/twa_logo.jpg?1606979012"},{"chainId":1,"address":"0x3f84c4184b35c488f7fe4a12469610c9b1cb03c9","name":"PoolStake","symbol":"PSK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13285/thumb/psk_logo.png?1606984935"},{"chainId":1,"address":"0x875773784af8135ea0ef43b5a374aad105c5d39e","name":"IDLE","symbol":"IDLE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13286/thumb/token-logo.png?1607004948"},{"chainId":1,"address":"0x3472a5a71965499acd81997a54bba8d852c6e53d","name":"Badger DAO","symbol":"BADGER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13287/thumb/badger_dao_logo.jpg?1607054976"},{"chainId":1,"address":"0xf406f7a9046793267bc276908778b29563323996","name":"APY vision","symbol":"VISION","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13288/thumb/apyvisionlogo200circle.png?1607059042"},{"chainId":1,"address":"0x7be00ed6796b21656732e8f739fc1b8f1c53da0d","name":"AC eXchange Token","symbol":"ACXT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13293/thumb/ACDX_Original_05.png?1607064933"},{"chainId":1,"address":"0x09a3ecafa817268f77be1283176b946c4ff2e608","name":"Mirror Protocol","symbol":"MIR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13295/thumb/mirror_logo_transparent.png?1611554658"},{"chainId":1,"address":"0xc9dfcd0a1dd2d7bb6fd2ef91a16a6a1c4e9846dd","name":"Hype Bet","symbol":"HYPEBET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13296/thumb/Hype-Bet-Token-Logo.png?1607074281"},{"chainId":1,"address":"0xc32cc5b70bee4bd54aa62b9aefb91346d18821c4","name":"Iteration Syndicate","symbol":"ITS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13297/thumb/1_LOssD4ENHv72I5e9PAsndA_%281%29.png?1607223580"},{"chainId":1,"address":"0x275f5ad03be0fa221b4c6649b8aee09a42d9412a","name":"Monavale","symbol":"MONA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13298/thumb/monavale_logo.jpg?1607232721"},{"chainId":1,"address":"0xe88f8313e61a97cec1871ee37fbbe2a8bf3ed1e4","name":"Sora Validator Toke","symbol":"VAL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13299/thumb/val-gold-256.png?1607242927"},{"chainId":1,"address":"0xbaa70614c7aafb568a93e62a98d55696bcc85dfe","name":"Unicap Finance","symbol":"UCAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13300/thumb/unicap256.png?1607308439"},{"chainId":1,"address":"0x123151402076fc819b7564510989e475c9cd93ca","name":"Wrapped DGLD","symbol":"WDGLD","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13301/thumb/wrappeddgld_32.png?1607310693"},{"chainId":1,"address":"0xa283aa7cfbb27ef0cfbcb2493dd9f4330e0fd304","name":"MM Token","symbol":"MM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13302/thumb/MM.jpg?1607315862"},{"chainId":1,"address":"0x5b3f693efd5710106eb2eac839368364acb5a70f","name":"Relayer Network OL","symbol":"RLR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13306/thumb/relayer_logo.jpg?1607327132"},{"chainId":1,"address":"0x61266424b904d65ceb2945a1413ac322185187d5","name":"YFIDapp","symbol":"YFID","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13309/thumb/Untitled-design-9-removebg-preview.png?1607328419"},{"chainId":1,"address":"0x34950ff2b487d9e5282c5ab342d08a2f712eb79f","name":"Efforce","symbol":"WOZX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13310/thumb/rZ6Oe3dm_400x400.jpg?1607331889"},{"chainId":1,"address":"0x0222be1f1b8413b2d7d76ebfc9e0285c1300692f","name":"Glox Finance","symbol":"GLOX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13312/thumb/glox_finance.png?1607395418"},{"chainId":1,"address":"0x1287c0509df9a475ef178471ab2132b9dfd312b3","name":"LADZ","symbol":"LADZ","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/13315/thumb/ladz_logo.jpg?1607408640"},{"chainId":1,"address":"0x31be30217989766215672e88ed449913e05bf0f5","name":"Groovy Finance","symbol":"GVY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13320/thumb/Groovy-finance-Logo-A.png?1607415508"},{"chainId":1,"address":"0x14c38e90a593b0bd5b7e9896a8ef4ae0a119d6ae","name":"WAV3","symbol":"WAV3","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13321/thumb/wav3_logo.jpeg?1607426650"},{"chainId":1,"address":"0xd2dda223b2617cb616c1580db421e4cfae6a8a85","name":"Bondly","symbol":"BONDLY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13322/thumb/logomark.png?1607474416"},{"chainId":1,"address":"0x881a7e25d44591c467a37da96adf3c3705e7251b","name":"Elynet Token","symbol":"ELYX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13326/thumb/KakaoTalk_20201208_102026847.png?1607483005"},{"chainId":1,"address":"0xe1c7e30c42c24582888c758984f6e382096786bd","name":"Curate","symbol":"XCUR","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13327/thumb/XCUR.png?1611628267"},{"chainId":1,"address":"0xd0d3ebcad6a20ce69bc3bc0e1ec964075425e533","name":"Ethereum Stake","symbol":"ETHYS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13328/thumb/eths_logo.png?1607494708"},{"chainId":1,"address":"0xd084b83c305dafd76ae3e1b4e1f1fe2ecccb3988","name":"Terra Virtua Kolect","symbol":"TVK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13330/thumb/CoinGLogo.png?1607507042"},{"chainId":1,"address":"0x6589fe1271a0f29346796c6baf0cdf619e25e58e","name":"Grain","symbol":"GRAIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13331/thumb/784594063499853904.png?1607531032"},{"chainId":1,"address":"0xb4bebd34f6daafd808f73de0d10235a92fbb6c3d","name":"Yearn Ecosystem Tok","symbol":"YETI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13332/thumb/yeti.png?1607563342"},{"chainId":1,"address":"0xdcb01cc464238396e213a6fdd933e36796eaff9f","name":"Yield","symbol":"YLD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13336/thumb/yieldcredit-logo-1024.png?1607653444"},{"chainId":1,"address":"0x244c5276ea5bb927575417156038d7381b44ab2c","name":"Bridge Finance","symbol":"BFR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13337/thumb/bridge_finance_logo.png?1607574570"},{"chainId":1,"address":"0xa9a8377287ea9c6b8b4249dd502e75d34148fc5b","name":"Stargaze Protocol","symbol":"STGZ","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13339/thumb/stgz_protocol_logo.jpg?1607580880"},{"chainId":1,"address":"0x054d64b73d3d8a21af3d764efd76bcaa774f3bb2","name":"Plasma Finance","symbol":"PPAY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13340/thumb/Hi9sEGAD.png?1607586849"},{"chainId":1,"address":"0xcbd380c2d84deafed09f79863705353505764f26","name":"Emojis Farm","symbol":"EMOJI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13341/thumb/emojis_farm.png?1607588447"},{"chainId":1,"address":"0xc626e0619ac79afea9281c8eb9b1a9f9d3fab532","name":"Freedom Reserve","symbol":"FR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13342/thumb/J6uNL2FS_400x400.jpg?1607589046"},{"chainId":1,"address":"0xe8b251822d003a2b2466ee0e38391c2db2048739","name":"rbase finance","symbol":"RBASE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13343/thumb/rbase_logo.jpg?1607619337"},{"chainId":1,"address":"0xa4e7414fcba1af15203030c6daac630df8f16aea","name":"Meme Cash","symbol":"MCH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13344/thumb/memecash_logo.png?1607654879"},{"chainId":1,"address":"0xba358b6f5b4c0215650444b8c30d870b55050d2d","name":"Hub Token","symbol":"HUB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13345/thumb/Hub-Logo-Transparent-BG-200x200_%281%29.png?1607661813"},{"chainId":1,"address":"0x24e3794605c84e580eea4972738d633e8a7127c8","name":"Katalyo","symbol":"KTLYO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13347/thumb/katalyo_logo_aqua_256.png?1607762430"},{"chainId":1,"address":"0x35872fea6a4843facbcdbce99e3b69596a3680b8","name":"1337","symbol":"1337","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/13348/thumb/logo.png?1607791847"},{"chainId":1,"address":"0xeda6efe5556e134ef52f2f858aa1e81c84cda84b","name":"Capital finance","symbol":"CAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13351/thumb/Untitled-design-4-removebg-preview-2.png?1607811346"},{"chainId":1,"address":"0xc0a25a24cce412e2fb407c08e3785437fee9ad1d","name":"Orient","symbol":"OFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13354/thumb/40FJ03N.png?1607812101"},{"chainId":1,"address":"0x40e7705254494a7e61d5b7c86da50225ddc3daae","name":"yplutus","symbol":"YPLT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13358/thumb/ypltblack-01.png?1607826916"},{"chainId":1,"address":"0x92e187a03b6cd19cb6af293ba17f2745fd2357d5","name":"Unit Protocol New","symbol":"DUCK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13359/thumb/unit_telegram.png?1607878022"},{"chainId":1,"address":"0x4bae380b5d762d543d426331b8437926443ae9ec","name":"XVIX","symbol":"XVIX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13364/thumb/xvix_logo.png?1607914655"},{"chainId":1,"address":"0xf94b5c5651c888d928439ab6514b93944eee6f48","name":"YIELD App","symbol":"YLD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13365/thumb/Icon_Blue.png?1607917500"},{"chainId":1,"address":"0x98ad9b32dd10f8d8486927d846d4df8baf39abe2","name":"VELO Token","symbol":"VLO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13366/thumb/velo_token_logo.png?1607918558"},{"chainId":1,"address":"0xa30189d8255322a2f8b2a77906b000aeb005570c","name":"Buy Sell","symbol":"BSE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13368/thumb/buy_sell_logo.png?1607927143"},{"chainId":1,"address":"0x3aa5f749d4a6bcf67dac1091ceb69d1f5d86fa53","name":"Deflect","symbol":"DEFLCT","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13369/thumb/deflect_logo.jpg?1609223085"},{"chainId":1,"address":"0x940bdcb99a0ee5fb008a606778ae87ed9789f257","name":"JFIN Coin","symbol":"JFIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13370/thumb/JFin-Coin-Logo.png?1607984823"},{"chainId":1,"address":"0x167e2a574669b0eeb552aaf3da47c728cb348a41","name":"Spartan","symbol":"300","decimals":7,"logoURI":"https://assets.coingecko.com/coins/images/13371/thumb/spartan300-200x200.png?1607986424"},{"chainId":1,"address":"0xb29663aa4e2e81e425294193616c1b102b70a158","name":"Ludena Protocol","symbol":"LDN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13372/thumb/LudenaProtocol_symbol_200x200.png?1607999831"},{"chainId":1,"address":"0xd8c82fbc4d8ed0644a7ec04cf973e84c6153c1d7","name":"Rizen Coin","symbol":"RZN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13373/thumb/rizen_coin.jpg?1608003096"},{"chainId":1,"address":"0x47c0ad2ae6c0ed4bcf7bc5b380d7205e89436e84","name":"rHegic","symbol":"RHEGIC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13374/thumb/hegic_logo.jpg?1608006964"},{"chainId":1,"address":"0xd5147bc8e386d91cc5dbe72099dac6c9b99276f5","name":"renFIL","symbol":"RENFIL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13375/thumb/renFIL.png?1608014942"},{"chainId":1,"address":"0x4e085036a1b732cbe4ffb1c12ddfdd87e7c3664d","name":"Predictz","symbol":"PRDZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13376/thumb/Predictz_Transperant.png?1608021631"},{"chainId":1,"address":"0x622f2962ae78e8686ecc1e30cf2f9a6e5ac35626","name":"Wrapped Polis","symbol":"POLIS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13377/thumb/polispay_logo.jpg?1608027141"},{"chainId":1,"address":"0xbcd4b7de6fde81025f74426d43165a5b0d790fdd","name":"SpiderDAO","symbol":"SPDR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13378/thumb/spiderdao_logo.png?1608029180"},{"chainId":1,"address":"0xc299004a310303d1c0005cb14c70ccc02863924d","name":"Trinity Protocol","symbol":"TRI","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13379/thumb/trinity_logo.png?1608030983"},{"chainId":1,"address":"0x755be920943ea95e39ee2dc437b268917b580d6e","name":"VersoView","symbol":"VVT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13380/thumb/HkfxEtWh_400x400.jpg?1608031723"},{"chainId":1,"address":"0x04ab43d32d0172c76f5287b6619f0aa50af89303","name":"Unilock Network","symbol":"UNL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13381/thumb/unilock_logo.png?1608074688"},{"chainId":1,"address":"0xba7b2c094c1a4757f9534a37d296a3bed7f544dc","name":"HLand Token","symbol":"HLAND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13385/thumb/HLAND_LOGO.png?1608085636"},{"chainId":1,"address":"0x32c868f6318d6334b2250f323d914bc2239e4eee","name":"N3RD Finance","symbol":"N3RDZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13389/thumb/logo.png?1608195840"},{"chainId":1,"address":"0x68e0a48d3bff6633a31d1d100b70f93c3859218b","name":"Blaze DeFi","symbol":"BNFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13390/thumb/photo_2020-12-16_15-23-59.jpg?1608108829"},{"chainId":1,"address":"0xcaeaf8381d4b20b43afa42061d6f80319a8881f6","name":"R34P","symbol":"R34P","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13393/thumb/r34p_logo.png?1608100330"},{"chainId":1,"address":"0xe0bdaafd0aab238c55d68ad54e616305d4a21772","name":"Refract","symbol":"RFR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13394/thumb/refract_logo.png?1608108926"},{"chainId":1,"address":"0x41bbedd7286daab5910a1f15d12cbda839852bd7","name":"Mirrored Microsoft","symbol":"MMSFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13396/thumb/mirror_logo_transparent.png?1611564779"},{"chainId":1,"address":"0xc944e90c64b2c07662a292be6244bdf05cda44a7","name":"The Graph","symbol":"GRT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13397/thumb/Graph_Token.png?1608145566"},{"chainId":1,"address":"0x1fdab294eda5112b7d066ed8f2e4e562d5bcc664","name":"SPICE","symbol":"SPICE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13398/thumb/scifi_logo.png?1608160393"},{"chainId":1,"address":"0x739763a258640919981f9ba610ae65492455be53","name":"Node Runners","symbol":"NDR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13400/thumb/ndr.jpg?1608172954"},{"chainId":1,"address":"0xf0acf8949e705e0ebb6cb42c2164b0b986454223","name":"Barter","symbol":"BRTR","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13401/thumb/BRTR.png?1612843022"},{"chainId":1,"address":"0x16b1eb8b8e9058800bf0ba3684f805a6711a1d2c","name":"Reflector Finance","symbol":"RFCTR","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13402/thumb/aRFCTR_PROFILE_LOGO.png?1612494768"},{"chainId":1,"address":"0xe95a203b1a91a908f9b9ce46459d101078c2c3cb","name":"ankrETH","symbol":"AETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13403/thumb/ankr.png?1608764406"},{"chainId":1,"address":"0xb4d930279552397bba2ee473229f89ec245bc365","name":"MahaDAO","symbol":"MAHA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13404/thumb/mahadao.jpg?1608373356"},{"chainId":1,"address":"0x3863ea7577fc91bfbaeae6a6a3e403524afcf787","name":"xETH G","symbol":"XETH-G","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13406/thumb/xETH-logo-mobile-e1608208725285.png?1608251162"},{"chainId":1,"address":"0x226f7b842e0f0120b7e194d05432b3fd14773a9d","name":"UNION Protocol Gove","symbol":"UNN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13408/thumb/unn_finance.png?1608262290"},{"chainId":1,"address":"0x7a3d5d49d64e57dbd6fbb21df7202bd3ee7a2253","name":"Tornado Core","symbol":"TCORE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13412/thumb/tcore.jpeg?1609238107"},{"chainId":1,"address":"0x7b3d36eb606f873a75a6ab68f8c999848b04f935","name":"NFTLootBox","symbol":"LOOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13414/thumb/nftlootbox.png?1608280539"},{"chainId":1,"address":"0xcae72a7a0fd9046cf6b165ca54c9e3a3872109e0","name":"AnRKey X","symbol":"ANRX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13415/thumb/anrkey.jpg?1608311301"},{"chainId":1,"address":"0x70a6d0d1561ba98711e935a76b1c167c612978a2","name":"Dragonfly Protocol","symbol":"DFLY","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13416/thumb/dfly_logo.png?1608341835"},{"chainId":1,"address":"0x0c63cae5fcc2ca3dde60a35e50362220651ebec8","name":"stakedXEM","symbol":"STXEM","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13417/thumb/stakedXEM_high_res.png?1608389932"},{"chainId":1,"address":"0x08e411220e47e3fc43bfb832186aba95108f2861","name":"Eclipseum","symbol":"ECL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13418/thumb/eclipseum_logo.png?1608429994"},{"chainId":1,"address":"0x21f54372c07b930b79c5c2d9bb0eaaca86c3b298","name":"Banana Finance","symbol":"BANANA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13419/thumb/bananacoin.png?1608446599"},{"chainId":1,"address":"0xaf162491c0b21900c01f4cc0f7110238aacdebe7","name":"arcane bear","symbol":"BEAR","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/13421/thumb/arcane_bear_logo.png?1608476062"},{"chainId":1,"address":"0x853d955acef822db058eb8505911ed77f175b99e","name":"Frax","symbol":"FRAX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13422/thumb/frax_logo.png?1608476506"},{"chainId":1,"address":"0x3432b6a60d23ca0dfca7761b7ab56459d9c964d0","name":"Frax Share","symbol":"FXS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13423/thumb/frax_share.png?1608478989"},{"chainId":1,"address":"0x7d25d9f10cd224ecce0bc824a2ec800db81c01d7","name":"ETHOPT","symbol":"OPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13424/thumb/KHP6ebV.jpeg?1608514202"},{"chainId":1,"address":"0x06a01a4d579479dd5d884ebf61a31727a3d8d442","name":"SmartKey","symbol":"SKEY","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13425/thumb/smart-key_sign-256.png?1608531133"},{"chainId":1,"address":"0x4efe8665e564bf454ccf5c90ee16817f7485d5cf","name":"BlackDragon Token","symbol":"BDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13426/thumb/Black-Dragon-Black.png?1608515220"},{"chainId":1,"address":"0xe4ae84448db5cfe1daf1e6fb172b469c161cb85f","name":"Utopia Genesis Foun","symbol":"UOP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13428/thumb/logo_%2830%29.png?1608518506"},{"chainId":1,"address":"0x21bfbda47a0b4b5b1248c767ee49f7caa9b23697","name":"Ovr","symbol":"OVR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13429/thumb/ovr_logo.png?1608518911"},{"chainId":1,"address":"0x1cc0744c5106bb47a61c4e41f517cb6f1c49b547","name":"Chalice Finance","symbol":"CHAL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13432/thumb/chalice_logo.png?1608526094"},{"chainId":1,"address":"0x68e8a20128e1902c02f533a02ed0cfd8396e3fbc","name":"Aries Financial","symbol":"AFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13433/thumb/aries.png?1608528510"},{"chainId":1,"address":"0x7f0c8b125040f707441cad9e5ed8a8408673b455","name":"CSP DAO Network","symbol":"NEBO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13436/thumb/csp_dao.png?1608535699"},{"chainId":1,"address":"0x168e39f96a653ce0a456560687241b0b2936e5ff","name":"2Based Finance","symbol":"2BASED","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13439/thumb/2based.jpg?1608564864"},{"chainId":1,"address":"0xc0ba369c8db6eb3924965e5c4fd0b4c1b91e305f","name":"DLP Duck Token","symbol":"DUCK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13440/thumb/DLP_Duck_Token.png?1612840740"},{"chainId":1,"address":"0xc567bca531992352166252ea5121e535432e81ed","name":"Tartarus","symbol":"TAR","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13441/thumb/tartarus_logo.png?1608603011"},{"chainId":1,"address":"0xae7ab96520de3a18e5e111b5eaab095312d7fe84","name":"Lido Staked Ether","symbol":"STETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13442/thumb/steth_logo.png?1608607546"},{"chainId":1,"address":"0xac00797df10e825589d8b53e715393be4e617459","name":"Bubble Network","symbol":"BBL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13443/thumb/bubble_network_logo.png?1608612666"},{"chainId":1,"address":"0x4185cf99745b2a20727b37ee798193dd4a56cdfa","name":"DEUS Synthetic Coin","symbol":"WCOINBASE-IOU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13444/thumb/coinbase-black.png?1608629833"},{"chainId":1,"address":"0xe0ad1806fd3e7edf6ff52fdb822432e847411033","name":"OnX Finance","symbol":"ONX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13445/thumb/onxlogo-1.png?1608629659"},{"chainId":1,"address":"0xe8d17542dfe79ff4fbd4b850f2d39dc69c4489a2","name":"KiloAmple","symbol":"KMPL","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13449/thumb/kappa_logo.png?1608681544"},{"chainId":1,"address":"0x3a880652f47bfaa771908c07dd8673a787daed3a","name":"DerivaDAO","symbol":"DDX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13453/thumb/ddx_logo.png?1608741641"},{"chainId":1,"address":"0x0000000000095413afc295d19edeb1ad7b71c952","name":"Tokenlon","symbol":"LON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13454/thumb/lon_logo.png?1608701720"},{"chainId":1,"address":"0x7e32c8727cc19dd59a7a4d01b95ae1cbfc8f4c77","name":"Aqua","symbol":"AQUA","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13455/thumb/aqua10-white-round.png?1608712198"},{"chainId":1,"address":"0x93dfaf57d986b9ca77df9376c50878e013d9c7c8","name":"Unique One","symbol":"RARE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13458/thumb/Logo_Unique.png?1612757355"},{"chainId":1,"address":"0xfebc25f4c5fc3e90a7efae0b4d436a77c9e131b3","name":"Cezo","symbol":"CEZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13461/thumb/2_hj7B4Z_400x400.jpg?1608764687"},{"chainId":1,"address":"0x4a7adcb083fe5e3d6b58edc3d260e2e61668e7a2","name":"Trade Butler Bot","symbol":"TBB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13462/thumb/L9km5LC5ZKpTey0UKcTMt9xbXw_Q0Nq8F119_QjJlqLHvuxLK6vb_VjxHtXYczia0DHXHSxhtCFUCVyMBBxJNw_-tkS3FTpoeEFs7EHuxrxs7b2hV_se2JzisurH7YQmRjXIq3wG6Va6zv90ug_uRGeuk-VoAfck7rBdnoUCGL-Xfmz7AySAn6SUVToUCtwObez36TEADBc7AR9.jpg?1608766426"},{"chainId":1,"address":"0x92ece48522e1acbcda4aaa8c2fbf2aa9fb15d624","name":"Rocki","symbol":"ROCKS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13465/thumb/rocki_logo.png?1608786767"},{"chainId":1,"address":"0x239119c43e3cac84c8a2d45bcba0e46f528e5f77","name":"Dripper","symbol":"DRIP","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13468/thumb/drip-stretch-200.png?1608796810"},{"chainId":1,"address":"0x111111111117dc0aa78b770fa6a738034120c302","name":"1inch","symbol":"1INCH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13469/thumb/1inch-token.png?1608803028"},{"chainId":1,"address":"0xec681f28f4561c2a9534799aa38e0d36a83cf478","name":"YVS Finance","symbol":"YVS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13471/thumb/cu0LSzE.png?1608852718"},{"chainId":1,"address":"0xcd1cb16a67937ff8af5d726e2681010ce1e9891a","name":"Themis","symbol":"MIS","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13478/thumb/3uZAPv2CbXF5txM.png?1608947522"},{"chainId":1,"address":"0x961c8c0b1aad0c0b10a51fef6a867e3091bcef17","name":"DeFi Yield Protocol","symbol":"DYP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13480/thumb/dyp_logo.png?1608971751"},{"chainId":1,"address":"0xb5fe099475d3030dde498c3bb6f3854f762a48ad","name":"Finiko","symbol":"FNK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13483/thumb/fnk.png?1609039834"},{"chainId":1,"address":"0x5f0e628b693018f639d10e4a4f59bd4d8b2b6b44","name":"Whiteheart","symbol":"WHITE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13484/thumb/whiteheart.png?1609076548"},{"chainId":1,"address":"0x861b2456ac1a6ab5fb5c72aa456091f23ddec1cc","name":"Vaultz","symbol":"VAULTZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13488/thumb/vaultz_logo.jpg?1609112163"},{"chainId":1,"address":"0x6417e8673dedd7a0471a87804bf85a559fd8bcc2","name":"Aura Protocol","symbol":"AURA","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13491/thumb/aura_protocol_logo.png?1609124742"},{"chainId":1,"address":"0x52d904eff2605463c2f0b338d34abc9b7c3e3b08","name":"Bitpower","symbol":"BPP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13492/thumb/Bitpower_%28200x200%29.png?1609134732"},{"chainId":1,"address":"0xf921ae2dac5fa128dc0f6168bf153ea0943d2d43","name":"Fire Protocol","symbol":"FIRE","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13495/thumb/fire.jpg?1609165121"},{"chainId":1,"address":"0x77777feddddffc19ff86db637967013e6c6a116c","name":"Tornado Cash","symbol":"TORN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13496/thumb/ZINt8NSB_400x400.jpg?1609193407"},{"chainId":1,"address":"0xfe3e6a25e6b192a42a44ecddcd13796471735acf","name":"Reef Finance","symbol":"REEF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13504/thumb/Group_10572.png?1610534130"},{"chainId":1,"address":"0xb15ae165000c8d7b69d2a82e425e110668c73ad5","name":"LinkBased","symbol":"LBD","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13506/thumb/linkbased_logo.jpg?1609224548"},{"chainId":1,"address":"0x96cf107e446a6e528ffd045f4eb6dff3cdb6a666","name":"3XT","symbol":"3XT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13507/thumb/3XT.jpg?1609225380"},{"chainId":1,"address":"0x7a2bc711e19ba6aff6ce8246c546e8c4b4944dfd","name":"WAXE","symbol":"WAXE","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13508/thumb/waxe_logo.png?1609232755"},{"chainId":1,"address":"0xad808e7a446f14a109dafce7dd2fe7ae7ff86b20","name":"Bafi Finance Token","symbol":"BAFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13512/thumb/logo_-_2020-12-30T063720.124.png?1609281475"},{"chainId":1,"address":"0x3fa400483487a489ec9b1db29c4129063eec4654","name":"CryptoKek","symbol":"KEK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13513/thumb/Cryptokek-Logo-256px.png?1609292074"},{"chainId":1,"address":"0xd36932143f6ebdedd872d5fb0651f4b72fd15a84","name":"Mirrored Apple","symbol":"MAAPL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13514/thumb/mirror_logo_transparent.png?1611564758"},{"chainId":1,"address":"0xee573a945b01b788b9287ce062a0cfc15be9fd86","name":"Exeedme","symbol":"XED","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13518/thumb/exeedme.png?1610669597"},{"chainId":1,"address":"0x63b8b7d4a3efd0735c4bffbd95b332a55e4eb851","name":"DigiCol Token","symbol":"DGCL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13519/thumb/DigiCol_Logo-01.png?1609372199"},{"chainId":1,"address":"0x0e3ef895c59e7db27214ab5bbf56347ce115a3f4","name":"Relayer Network","symbol":"RLR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13523/thumb/rlr_logo.jpg?1609385448"},{"chainId":1,"address":"0x1b40183efb4dd766f11bda7a7c3ad8982e998421","name":"Vesper Finance","symbol":"VSP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13527/thumb/vesper_logo.jpg?1609399927"},{"chainId":1,"address":"0x544288176bb6d7d198302a2d18fad38442e69b25","name":"Gains Farm","symbol":"GFARM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13528/thumb/gains_farm_logo.png?1609401001"},{"chainId":1,"address":"0xd90e69f67203ebe02c917b5128629e77b4cd92dc","name":"One Cash","symbol":"ONC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13529/thumb/onc_logo.png?1609406029"},{"chainId":1,"address":"0x03066da434e5264ef0b32f787923f974a5726fdc","name":"Basis Coin Share","symbol":"BCS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13530/thumb/Basiscoin_Share.png?1609406623"},{"chainId":1,"address":"0x5bb29c33c4a3c29f56f8aca40b4db91d8a5fe2c5","name":"One Share","symbol":"ONS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13531/thumb/bss.a1671c75.png?1609452258"},{"chainId":1,"address":"0xb4467e8d621105312a914f1d42f10770c0ffe3c8","name":"Flashstake","symbol":"FLASH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13533/thumb/Flashstake.png?1609730156"},{"chainId":1,"address":"0xae17f4f5ca32f77ea8e3786db7c0b2fe877ac176","name":"Basis Coin Cash","symbol":"BCC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13535/thumb/yiu47vtN_400x400.jpg?1609541472"},{"chainId":1,"address":"0x9b02dd390a603add5c07f9fd9175b7dabe8d63b7","name":"Shopping io","symbol":"SPI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13537/thumb/vd4KuYIE_400x400.png?1609578616"},{"chainId":1,"address":"0x54ee01beb60e745329e6a8711ad2d6cb213e38d7","name":"DefiSocial","symbol":"DFSOCIAL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13538/thumb/o91UuwtD_400x400.jpg?1609578301"},{"chainId":1,"address":"0x350a6a30c79df3600c4e0e67deab0a64b645e2c2","name":"StrongHold","symbol":"STRNG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13540/thumb/strng.png?1609599778"},{"chainId":1,"address":"0x790baf0c914898c62163a61f150637d4bd180697","name":"Nirvana","symbol":"VANA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13541/thumb/vana.jpg?1609602820"},{"chainId":1,"address":"0xacd8f2523a4613eee78904354187c81bb05ae2b8","name":"Stand Cash","symbol":"SAC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13542/thumb/sac.jpg?1609648101"},{"chainId":1,"address":"0x4c38d0e726b6c86f64c1b281348e725973542043","name":"Stand Share","symbol":"SAS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13543/thumb/sac.jpg?1609648278"},{"chainId":1,"address":"0x834ce7ad163ab3be0c5fd4e0a81e67ac8f51e00c","name":"Polkainsure Finance","symbol":"PIS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13544/thumb/Logo_Polkainsure___Final-200x200-01.png?1609686092"},{"chainId":1,"address":"0x74159651a992952e2bf340d7628459aa4593fc05","name":"Tenet","symbol":"TEN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13545/thumb/iMqC3F_p_400x400.png?1609711856"},{"chainId":1,"address":"0x86772b1409b61c639eaac9ba0acfbb6e238e5f83","name":"Indexed Finance","symbol":"NDX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13546/thumb/indexed-light.74bb5471.png?1609712728"},{"chainId":1,"address":"0x374cb8c27130e2c9e04f44303f3c8351b9de61c1","name":"Bao Finance","symbol":"BAO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13547/thumb/BAO.png?1613034916"},{"chainId":1,"address":"0x56b4f8c39e07d4d5d91692acf9d0f6d4d3493763","name":"Trism","symbol":"TRISM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13549/thumb/76106366.png?1609715454"},{"chainId":1,"address":"0x66a0f676479cee1d7373f3dc2e2952778bff5bd6","name":"Wise","symbol":"WISE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13552/thumb/WISE-logo-1600x1280.png?1609727947"},{"chainId":1,"address":"0x4846239fdf4d4c1aeb26729fa064b0205aca90e1","name":"True Seigniorage Do","symbol":"TSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13555/thumb/2dc3a1b1-41fd-4d9c-ba1d-8114635efd09.jpg?1609754836"},{"chainId":1,"address":"0xfce94fde7ac091c2f1db00d62f15eeb82b624389","name":"Noah s Ark","symbol":"NOAHARK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13557/thumb/Gc6kz-5a.png?1609769750"},{"chainId":1,"address":"0xe452e6ea2ddeb012e20db73bf5d3863a3ac8d77a","name":"Wrapped CELO","symbol":"WCELO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13561/thumb/WCELO-Icon.jpg?1609819515"},{"chainId":1,"address":"0x4688a8b1f292fdab17e9a90c8bc379dc1dbd8713","name":"Cover Protocol","symbol":"COVER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13563/thumb/1_eWBbDaqpxXqt7WYPSP4qSw.jpeg?1609822578"},{"chainId":1,"address":"0xc888a0ab4831a29e6ca432babf52e353d23db3c2","name":"FastSwap","symbol":"FAST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13567/thumb/logo.png?1609834317"},{"chainId":1,"address":"0x9d1233cc46795e94029fda81aaadc1455d510f15","name":"Zero Collateral Dai","symbol":"ZAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13569/thumb/zai_logo.png?1609844802"},{"chainId":1,"address":"0x2186ecb39f1b765ba7d78f1c43c2e9d7fc0c1eca","name":"My Crypto Play","symbol":"MCP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13570/thumb/Ysv6EyvR_400x400.jpg?1609845061"},{"chainId":1,"address":"0x17525e4f4af59fbc29551bc4ece6ab60ed49ce31","name":"PieDAO Yearn Ecosys","symbol":"YPIE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13572/thumb/YPIE.png?1610437730"},{"chainId":1,"address":"0x5a98fcbea516cf06857215779fd812ca3bef1b32","name":"Lido DAO","symbol":"LDO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13573/thumb/Lido_DAO.png?1609873644"},{"chainId":1,"address":"0x87d73e916d7057945c9bcd8cdd94e42a6f47f776","name":"NFTX","symbol":"NFTX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13574/thumb/NFTX_%28Real%29.jpg?1613449530"},{"chainId":1,"address":"0xc005204856ee7035a13d8d7cdbbdc13027afff90","name":"MoneySwap","symbol":"MSWAP","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/13576/thumb/logo_%281%29.png?1609888424"},{"chainId":1,"address":"0xcb4e8cafeda995da5cedfda5205bd5664a12b848","name":"Shabu Shabu","symbol":"KOBE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13577/thumb/shabu_shabu_logo.jpg?1609901993"},{"chainId":1,"address":"0x93ed140172ff226dad1f7f3650489b8daa07ae7f","name":"zzz finance v2","symbol":"ZZZV2","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13584/thumb/zzz_finance.jpg?1609919864"},{"chainId":1,"address":"0xe4815ae53b124e7263f08dcdbbb757d41ed658c6","name":"ZKSwap","symbol":"ZKS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13585/thumb/hfmvDpha_400x400.jpg?1609922062"},{"chainId":1,"address":"0x15e4132dcd932e8990e794d1300011a472819cbd","name":"GRPL Finance","symbol":"GRPL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13586/thumb/GRPL.png?1609927724"},{"chainId":1,"address":"0x17c090f9a17e4e5a8ceb23bbe7e7e28e3c4ca196","name":"BitDNS","symbol":"DNS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13590/thumb/T_t9CFf6_400x400.png?1609981076"},{"chainId":1,"address":"0x3f5be50e4651ee184109a0b1b71d344d12e8b603","name":"RFYield Finance","symbol":"RFY","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13591/thumb/3QVx5Fp.png?1609983766"},{"chainId":1,"address":"0xeabb8996ea1662cad2f7fb715127852cd3262ae9","name":"Connect Financial","symbol":"CNFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13592/thumb/Connect_Financial.png?1609993203"},{"chainId":1,"address":"0x3f344c88d823f180fb8b44a3c7cfc4edc92dfa35","name":"Definex","symbol":"DSWAP","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/13593/thumb/cjZjhY3w_400x400.png?1609998112"},{"chainId":1,"address":"0xa5a2af22eac6f050227d844b108c2b2a011fd329","name":"Tunnel Protocol","symbol":"TNI","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13598/thumb/tni_logo.png?1610006256"},{"chainId":1,"address":"0xedeec5691f23e4914cf0183a4196bbeb30d027a0","name":"Wrapped Statera","symbol":"WSTA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13599/thumb/wsta_logo.png?1610011862"},{"chainId":1,"address":"0xf0196985601598a35a48606b643fd2c34fb861e1","name":"Eternal Cash","symbol":"EC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13601/thumb/eternal_cash_logo.png?1610095491"},{"chainId":1,"address":"0x7eaf9c89037e4814dc0d9952ac7f888c784548db","name":"Royale","symbol":"ROYA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13602/thumb/royale_logo.jpg?1610176118"},{"chainId":1,"address":"0xd27af03cb73a29ee2f37194c70c4ee13b68fe8cb","name":"Freq Set Dollar","symbol":"FSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13603/thumb/fsd.jpg?1610251925"},{"chainId":1,"address":"0x5cf9242493be1411b93d064ca2e468961bbb5924","name":"Empty Set Gold","symbol":"ESG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13604/thumb/esg.jpg?1610252594"},{"chainId":1,"address":"0xf0e3543744afced8042131582f2a19b6aeb82794","name":"Variable Time Dolla","symbol":"VTD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13608/thumb/vtd.jpg?1610273963"},{"chainId":1,"address":"0x236ecfb32c2b496f942c86d43b8ca4f6bd931e30","name":"Morph","symbol":"MORC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13609/thumb/0PAc0nMs_400x400.png?1611734234"},{"chainId":1,"address":"0x970b596ea3cb9864397f799902f0a579cdc3377b","name":"Morph Tracker","symbol":"MORT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13610/thumb/0PAc0nMs_400x400.png?1611734232"},{"chainId":1,"address":"0x9c664f20c0a00a4949dffca76748c02754c875aa","name":"Yearn Shark Finance","symbol":"YSKF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13614/thumb/IMG-20201203-122807-053.png?1610287099"},{"chainId":1,"address":"0x10be9a8dae441d276a5027936c3aaded2d82bc15","name":"UniMex Network","symbol":"UMX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13615/thumb/Unimex-Brandmark-RGB-Small_200x200.png?1612758290"},{"chainId":1,"address":"0x6d0f5149c502faf215c89ab306ec3e50b15e2892","name":"Portion","symbol":"PRT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13617/thumb/OKeO2FI.png?1610327038"},{"chainId":1,"address":"0x5166d4ce79b9bf7df477da110c560ce3045aa889","name":"Xdef Finance","symbol":"XDEF2","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13619/thumb/xdef.png?1610330383"},{"chainId":1,"address":"0x0b66015bc42601d5986b540373b4e02d7383c7c1","name":"Fission Cash","symbol":"FCX","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13620/thumb/FCX-Logo-W-e1609294744561.png?1610333962"},{"chainId":1,"address":"0x73d9e335669462cbdd6aa3adafe9efee86a37fe9","name":"Daiquilibrium","symbol":"DAIQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13626/thumb/BicSg26r_400x400.png?1610418623"},{"chainId":1,"address":"0xe13559cf6edf84bd04bf679e251f285000b9305e","name":"TMC NiftyGotchi","symbol":"TMC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13627/thumb/tmc.png?1610434378"},{"chainId":1,"address":"0xd2877702675e6ceb975b4a1dff9fb7baf4c91ea9","name":"Wrapped Terra","symbol":"LUNA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13628/thumb/wluna.png?1610448334"},{"chainId":1,"address":"0xffffffff2ba8f66d4e51811c5190992176930278","name":"Furucombo","symbol":"COMBO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13629/thumb/COMBO_token_ol.png?1610701537"},{"chainId":1,"address":"0x6e9730ecffbed43fd876a264c982e254ef05a0de","name":"Nord Finance","symbol":"NORD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13630/thumb/nord.jpg?1610465136"},{"chainId":1,"address":"0xf72fcd9dcf0190923fadd44811e240ef4533fc86","name":"Mirrored ProShares ","symbol":"MVIXY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13638/thumb/mirror_logo_transparent.png?1611564742"},{"chainId":1,"address":"0xedb0414627e6f1e3f082de65cd4f9c693d78cca9","name":"Mirrored Twitter","symbol":"MTWTR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13639/thumb/mirror_logo_transparent.png?1611564718"},{"chainId":1,"address":"0x9d1555d8cb3c846bb4f7d5b1b1080872c3166676","name":"Mirrored iShares Si","symbol":"MSLV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13642/thumb/mirror_logo_transparent.png?1611565255"},{"chainId":1,"address":"0xc8d674114bac90148d11d3c1d33c61835a0f9dcd","name":"Mirrored Netflix","symbol":"MNFLX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13643/thumb/mirror_logo_transparent.png?1611565277"},{"chainId":1,"address":"0x13b02c8de71680e71f0820c996e4be43c2f57d15","name":"Mirrored Invesco QQ","symbol":"MQQQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13645/thumb/mirror_logo_transparent.png?1611565327"},{"chainId":1,"address":"0x56aa298a19c93c6801fdde870fa63ef75cc0af72","name":"Mirrored Alibaba","symbol":"MBABA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13647/thumb/mirror_logo_transparent.png?1611565672"},{"chainId":1,"address":"0x9048c33c7bae0bbe9ad702b17b4453a83900d154","name":"Energy Ledger","symbol":"ELX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13648/thumb/ELX.png?1610531914"},{"chainId":1,"address":"0x1d350417d9787e000cc1b95d70e9536dcd91f373","name":"Mirrored iShares Go","symbol":"MIAU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13649/thumb/mirror_logo_transparent.png?1611565655"},{"chainId":1,"address":"0x817bbdbc3e8a1204f3691d14bb44992841e3db35","name":"Cudos","symbol":"CUDOS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13651/thumb/CudosIconTransparent.png?1610631426"},{"chainId":1,"address":"0xa8b12cc90abf65191532a12bb5394a714a46d358","name":"pBTC35A","symbol":"PBTC35A","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13653/thumb/pBTC35A.png?1610574940"},{"chainId":1,"address":"0x66c0dded8433c9ea86c8cf91237b14e10b4d70b7","name":"Mars","symbol":"MARS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13654/thumb/MARS.png?1610575403"},{"chainId":1,"address":"0xc237868a9c5729bdf3173dddacaa336a0a5bb6e0","name":"Wrapped Wagerr","symbol":"WWGR","decimals":8},{"chainId":1,"address":"0xc2d3ae29c8309c14994d02ecd228cf86f3efde77","name":"CurrySwap","symbol":"CURRY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13656/thumb/curry_logo.jpg?1610581982"},{"chainId":1,"address":"0x3c81d482172cc273c3b91dd9d8eb212023d00521","name":"Prophecy","symbol":"PRY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13658/thumb/prophecy_256x256.png?1610592382"},{"chainId":1,"address":"0xb34ab2f65c6e4f764ffe740ab83f982021faed6d","name":"Basis Gold","symbol":"BSG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13663/thumb/pErVlwLE_400x400.png?1610601302"},{"chainId":1,"address":"0xfa99a87b14b02e2240c79240c5a20f945ca5ef76","name":"GG Token","symbol":"GGTK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13666/thumb/ggblack200.png?1610811691"},{"chainId":1,"address":"0xdbb2f12cb89af05516768c2c69a771d92a25d17c","name":"Beast DAO","symbol":"BEAST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13667/thumb/beastdao_logo.png?1610611281"},{"chainId":1,"address":"0x8642a849d0dcb7a15a974794668adcfbe4794b56","name":"Prosper","symbol":"PROS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13668/thumb/heD6cg22l3sF5VgPh4G1xC6lnKEWXJif-jbaqUpv8CDP6jbWaqn9UjBdkXWNrw1CewaQOxb8zXRdNeNJWWiUDjfsEl_d7E3bPLg4cFoilQF5TGKHfWyJlnpm3UYc9ytvRvOjxOevMuiu8-lusnNoOcwgsJpMkYWHqe322GAxLt0_30kFMVAcjEDUrOlkK6hUYi0m9P433mvNlOm.jpg?1610671732"},{"chainId":1,"address":"0x87de305311d5788e8da38d19bb427645b09cb4e5","name":"Verox","symbol":"VRX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13669/thumb/IMG-20210115-000024.png?1610675319"},{"chainId":1,"address":"0xac0c8da4a4748d8d821a0973d00b157aa78c473d","name":"YFIONE","symbol":"YFO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13670/thumb/256.png?1610676054"},{"chainId":1,"address":"0x2791bfd60d232150bff86b39b7146c0eaaa2ba81","name":"BiFi","symbol":"BIFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13671/thumb/ysYIu7Q.png?1610679337"},{"chainId":1,"address":"0xa9d232cc381715ae791417b624d7c4509d2c28db","name":"Basis Gold Share","symbol":"BSGS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13672/thumb/bsgs_logo.png?1610680124"},{"chainId":1,"address":"0x7671904eed7f10808b664fc30bb8693fd7237abf","name":"Bitberry Token","symbol":"BBR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13673/thumb/1_AdMyBccrRv0e6rhW7UKJSw.png?1610681228"},{"chainId":1,"address":"0x4ca0654f4fc1025cf1a17b7459c20ac0479522ad","name":"Rigel Finance","symbol":"RIGEL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13674/thumb/logo-200x200_%282%29.png?1610682780"},{"chainId":1,"address":"0x88bd6efe33bc82860278c044efa33364c6285032","name":"PegShares","symbol":"PEGS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13675/thumb/pegshare.png?1610705105"},{"chainId":1,"address":"0x412e5a36bde71aa2c38e1c0e26baaf7f2f0bc24a","name":"PegsUSD","symbol":"PUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13676/thumb/pegusd.png?1610705447"},{"chainId":1,"address":"0x3155ba85d5f96b2d030a4966af206230e46849cb","name":"THORChain ERC20 ","symbol":"RUNE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13677/thumb/IMG_20210123_132049_458.png?1612179252"},{"chainId":1,"address":"0xae1eaae3f627aaca434127644371b67b18444051","name":"Yield Optimization ","symbol":"YOP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13678/thumb/J7zykPx.jpg?1610802162"},{"chainId":1,"address":"0x69a95185ee2a045cdc4bcd1b1df10710395e4e23","name":"Poolz Finance","symbol":"POOLZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13679/thumb/poolz_logo.png?1610806091"},{"chainId":1,"address":"0x94f31ac896c9823d81cf9c2c93feceed4923218f","name":"YFTether","symbol":"YFTE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13683/thumb/yftether.png?1610858860"},{"chainId":1,"address":"0x9c78ee466d6cb57a4d01fd887d2b5dfb2d46288f","name":"Must","symbol":"MUST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13688/thumb/must_logo.png?1610949645"},{"chainId":1,"address":"0xe8e06a5613dc86d459bc8fb989e173bb8b256072","name":"Feyorra","symbol":"FEY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13689/thumb/1_XiKKk5_400x400.jpg?1610953208"},{"chainId":1,"address":"0x0e3cc2c4fb9252d17d07c67135e48536071735d9","name":"ARTH","symbol":"ARTH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13690/thumb/arth_logo.jpeg?1610956950"},{"chainId":1,"address":"0xfa6de2697d59e88ed7fc4dfe5a33dac43565ea41","name":"DEFI Top 5 Tokens I","symbol":"DEFI5","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13691/thumb/thGDKHo.png?1610959947"},{"chainId":1,"address":"0x17ac188e09a7890a1844e5e65471fe8b0ccfadf3","name":"Cryptocurrency Top ","symbol":"CC10","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13692/thumb/BRfNDy1.png?1610960481"},{"chainId":1,"address":"0xd4cb461eace80708078450e465881599d2235f1a","name":"Passive Income","symbol":"PSI","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13695/thumb/logo_psi.jpg?1610965597"},{"chainId":1,"address":"0x30647a72dc82d7fbb1123ea74716ab8a317eac19","name":"imUSD","symbol":"IMUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13696/thumb/imUSD.png?1610971385"},{"chainId":1,"address":"0x2b4200a8d373d484993c37d63ee14aee0096cd12","name":"USDFreeLiquidity","symbol":"USDFL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13697/thumb/usdfl.png?1610980328"},{"chainId":1,"address":"0xffed56a180f23fd32bc6a1d8d3c09c283ab594a8","name":"Freeliquid","symbol":"FL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13698/thumb/freeliquid_logo.png?1610980336"},{"chainId":1,"address":"0x06f3c323f0238c72bf35011071f2b5b7f43a054c","name":"MASQ","symbol":"MASQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13699/thumb/MASQ_Logo_Gold.png?1611017625"},{"chainId":1,"address":"0x831091da075665168e01898c6dac004a867f1e1b","name":"Gains V2","symbol":"GFARM2","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13703/thumb/gfarm_v2.png?1611035398"},{"chainId":1,"address":"0x9cea2ed9e47059260c97d697f82b8a14efa61ea5","name":"Punk","symbol":"PUNK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13704/thumb/Screenshot_2021-01-19_at_3.27.50_PM.png?1611041655"},{"chainId":1,"address":"0xf0939011a9bb95c3b791f0cb546377ed2693a574","name":"Zero Exchange","symbol":"ZERO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13706/thumb/zero_exchange_logo.jpg?1611048217"},{"chainId":1,"address":"0x16eccfdbb4ee1a85a33f3a9b21175cd7ae753db4","name":"Router Protocol","symbol":"ROUTE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13709/thumb/route_token_200x200-19.png?1611057698"},{"chainId":1,"address":"0x24ea9c1cfd77a8db3fb707f967309cf013cc1078","name":"Excavo Finance","symbol":"CAVO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13711/thumb/CAVO.png?1611915659"},{"chainId":1,"address":"0x038a68ff68c393373ec894015816e33ad41bd564","name":"Glitch Protocol","symbol":"GLCH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13712/thumb/glitch_logo.jpeg?1611100011"},{"chainId":1,"address":"0x041fdd6637ecfd96af8804278ac12660ac2d12c0","name":"SwapDEX","symbol":"SDX","decimals":7,"logoURI":"https://assets.coingecko.com/coins/images/13717/thumb/sdx.png?1611116537"},{"chainId":1,"address":"0xbae5f2d8a1299e5c4963eaff3312399253f27ccb","name":"Soar","symbol":"SOAR","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13718/thumb/soar_logo-e1610311708668.png?1611125359"},{"chainId":1,"address":"0x3c03b4ec9477809072ff9cc9292c9b25d4a8e6c6","name":"Polkacover","symbol":"CVR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13720/thumb/Polkacover_logo.png?1611147519"},{"chainId":1,"address":"0x73968b9a57c6e53d41345fd57a6e6ae27d6cdb2f","name":"Stake DAO","symbol":"SDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13724/thumb/stakedao_logo.jpg?1611195011"},{"chainId":1,"address":"0x7e291890b01e5181f7ecc98d79ffbe12ad23df9e","name":"Unifty","symbol":"NIF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13726/thumb/NIF.png?1612320636"},{"chainId":1,"address":"0x159751323a9e0415dd3d6d42a1212fe9f4a0848c","name":"Insured Finance","symbol":"INFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13727/thumb/logo_%287%29.png?1611210296"},{"chainId":1,"address":"0x2f7b618993cc3848d6c7ed9cdd5e835e4fe22b98","name":"Nami Corporation To","symbol":"NAMI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13729/thumb/nami_logo_256.png?1611224464"},{"chainId":1,"address":"0x9c405acf8688afb61b3197421cdeec1a266c6839","name":"DogeYield","symbol":"DOGY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13734/thumb/dogy200px.png?1611266985"},{"chainId":1,"address":"0x947aeb02304391f8fbe5b25d7d98d649b57b1788","name":"Mandala Exchange To","symbol":"MDX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13736/thumb/png-cmc.png?1611288725"},{"chainId":1,"address":"0x798d1be841a82a273720ce31c822c61a67a601c3","name":"DIGG","symbol":"DIGG","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13737/thumb/digg.PNG?1611292196"},{"chainId":1,"address":"0xa5959e9412d27041194c3c3bcbe855face2864f7","name":"UniDexGas","symbol":"UNDG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13740/thumb/undg_logo_200_.png?1611305562"},{"chainId":1,"address":"0xbc81bf5b3173bccdbe62dba5f5b695522ad63559","name":"Transmute","symbol":"XPB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13743/thumb/lead-03.png?1611376298"},{"chainId":1,"address":"0x0d6ae2a429df13e44a07cd2969e085e4833f64a0","name":"PolkaBridge","symbol":"PBR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13744/thumb/symbol-whitebg200x200.png?1611377553"},{"chainId":1,"address":"0x220b71671b649c03714da9c621285943f3cbcdc6","name":"TosDis","symbol":"DIS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13745/thumb/Tosdis-black.png?1611379744"},{"chainId":1,"address":"0x1337def16f9b486faed0293eb623dc8395dfe46a","name":"ARMOR","symbol":"ARMOR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13748/thumb/armor.png?1611425846"},{"chainId":1,"address":"0xc6d19a604fbdb5c2eeb363255fd63c9eea29288e","name":"DarkBundles","symbol":"DBUND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13749/thumb/dbund_logo.png?1611457781"},{"chainId":1,"address":"0xbb0a009ba1eb20c5062c790432f080f6597662af","name":"Bitbot Protocol","symbol":"BBP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13750/thumb/bitbot_protocol.png?1611477932"},{"chainId":1,"address":"0xdfe66b14d37c77f4e9b180ceb433d1b164f0281d","name":"StakeHound Staked E","symbol":"STETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13752/thumb/926MHi5g_400x400.png?1611542247"},{"chainId":1,"address":"0x1337def18c680af1f9f45cbcab6309562975b1dd","name":"Armor NXM","symbol":"ARNXM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13753/thumb/1_otmQ1sN0MgsT4idRsPsu3w.png?1611556043"},{"chainId":1,"address":"0xa8580f3363684d76055bdc6660caefe8709744e1","name":"Folder Protocol","symbol":"FOL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13755/thumb/folderlabs_logo.png?1611560881"},{"chainId":1,"address":"0x7bce667ef12023dc5f8577d015a2f09d99a5ef58","name":"Block Duelers","symbol":"BDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13757/thumb/block_duelers.png?1611567700"},{"chainId":1,"address":"0x888888888889c00c67689029d7856aac1065ec11","name":"Opium","symbol":"OPIUM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13758/thumb/opium-token-black_%281%29.png?1611767960"},{"chainId":1,"address":"0x8c8687fc965593dfb2f0b4eaefd55e9d8df348df","name":"PAID Network","symbol":"PAID","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13761/thumb/PAID.png?1612493556"},{"chainId":1,"address":"0x50d2de5397d7c657c3d424634a2ddf4e0d73d789","name":"Bliss","symbol":"BLISS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13762/thumb/eD2mpsGhthNTkzYlFjNACI_Oy8IwC9kh7TISfep2ZcaRYoNiVFOwiUprqlrzwVTHRddCUULAEQGyPPjaTqG2ZLCPvCX5ycQF3TMrffadkJGDKe_wQ0N8QT2MO4xXMJ4c6PJgi2MG0WySER24ZbvahGPjtxBBPIb3fS21Seydik57qQyJMYB73il_L636mqaIT1gc9h75K5uT8UK.jpg?1611695377"},{"chainId":1,"address":"0x2ec75589856562646afe393455986cad26c4cc5f","name":"Interop","symbol":"TROP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13763/thumb/Interop.jpg?1611631842"},{"chainId":1,"address":"0x5479d565e549f3ecdbde4ab836d02d86e0d6a8c7","name":"LenDeFi Token","symbol":"LDFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13764/thumb/logo-200.png?1611649291"},{"chainId":1,"address":"0x91383a15c391c142b80045d8b4730c1c37ac0378","name":"XStable","symbol":"XST","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13765/thumb/xstable.png?1613026749"},{"chainId":1,"address":"0x888888877a18532b78d259577d00057054c50dd8","name":"Universal Dollar","symbol":"U8D","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13766/thumb/Gn8x1TZN_400x400.jpg?1611662713"},{"chainId":1,"address":"0x2b89bf8ba858cd2fcee1fada378d5cd6936968be","name":"Secret ERC20 ","symbol":"WSCRT","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/13767/thumb/Secret_S_Black_Coingecko.png?1611667298"},{"chainId":1,"address":"0x2b5016cea1c425f915e13727f7657025de3208fe","name":"Tokemon","symbol":"TKMN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13769/thumb/RDpa3fCw_400x400.png?1611697299"},{"chainId":1,"address":"0x833e4c02c47b7e38f5b9a80b26eb07d23d1961f4","name":"The Bitcoin Family","symbol":"FAMILY","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/13776/thumb/the_bitcoin_family.png?1611712529"},{"chainId":1,"address":"0x98c36c0e953463bd5146c8783ce081ce1d187acf","name":"Polyient Games Unit","symbol":"PGU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13777/thumb/gap1KZNe_400x400.jpg?1611716610"},{"chainId":1,"address":"0x99fe3b1391503a1bc1788051347a1324bff41452","name":"SportX","symbol":"SX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13779/thumb/sportx.png?1611725183"},{"chainId":1,"address":"0x9f9913853f749b3fe6d6d4e16a1cc3c1656b6d51","name":"BITToken","symbol":"BITT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13783/thumb/BITT_Logo_256pixels.png?1611733961"},{"chainId":1,"address":"0xb97d5cf2864fb0d08b34a484ff48d5492b2324a0","name":"Klondike Finance","symbol":"KLON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13787/thumb/klondike.jpg?1611759069"},{"chainId":1,"address":"0xe6c3502997f97f9bde34cb165fbce191065e068f","name":"Klondike BTC","symbol":"KBTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13789/thumb/klondike.jpg?1611759492"},{"chainId":1,"address":"0xc58467b855401ef3ff8fda9216f236e29f0d6277","name":"Gasgains","symbol":"GASG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13795/thumb/gasgains_logo.png?1611809086"},{"chainId":1,"address":"0x3832d2f059e55934220881f831be501d180671a7","name":"renDOGE","symbol":"RENDOGE","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13796/thumb/renDOGE.png?1611897869"},{"chainId":1,"address":"0x50de6856358cc35f3a9a57eaaa34bd4cb707d2cd","name":"Razor Network","symbol":"RAZOR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13797/thumb/icon.png?1611919354"},{"chainId":1,"address":"0xbf494f02ee3fde1f20bee6242bce2d1ed0c15e47","name":"World Token","symbol":"WORLD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13801/thumb/WORLD.png?1612843088"},{"chainId":1,"address":"0x48be867b240d2ffaff69e0746130f2c027d8d3d2","name":"Elevate","symbol":"ELE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13802/thumb/elevate-logo.png?1611980666"},{"chainId":1,"address":"0xc4de189abf94c57f396bd4c52ab13b954febefd8","name":"B20","symbol":"B20","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13803/thumb/b20.png?1611996305"},{"chainId":1,"address":"0x6fa0952355607dfb2d399138b7fe10eb90f245e4","name":"Clash Token","symbol":"SCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13805/thumb/SZKnadlg_400x400.png?1612001081"},{"chainId":1,"address":"0x725c263e32c72ddc3a19bea12c5a0479a81ee688","name":"Bridge Mutual","symbol":"BMI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13808/thumb/bmi_logo.png?1612009598"},{"chainId":1,"address":"0x45128cb743951121fb70cb570c0784492732778a","name":"Metawhale Gold","symbol":"MWG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13809/thumb/metawhalepaxg.png?1612234889"},{"chainId":1,"address":"0x7b69d465c0f9fb22affae56aa86149973e9b0966","name":"Protocol Finance","symbol":"PFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13810/thumb/17RgoN2.png?1612047312"},{"chainId":1,"address":"0x15c303b84045f67156acf6963954e4247b526717","name":"Gas Cash Back","symbol":"GCBN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13814/thumb/hlogo.e7dd3b85.png?1612049566"},{"chainId":1,"address":"0x9eb6be354d88fd88795a04de899a57a77c545590","name":"GameStop Finance","symbol":"GME","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13820/thumb/gamestop_logo.jpg?1612070725"},{"chainId":1,"address":"0xb0dfd28d3cf7a5897c694904ace292539242f858","name":"Lotto","symbol":"LOTTO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13822/thumb/Lotto-Logo256x256.png?1612150421"},{"chainId":1,"address":"0x76c5449f4950f6338a393f53cda8b53b0cd3ca3a","name":"BT Finance","symbol":"BT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13824/thumb/BT-logo.324f553c.png?1612152632"},{"chainId":1,"address":"0xb59490ab09a0f526cc7305822ac65f2ab12f9723","name":"Litentry","symbol":"LIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13825/thumb/logo_200x200.png?1612153317"},{"chainId":1,"address":"0x8a9c4dfe8b9d8962b31e4e16f8321c44d48e246e","name":"Name Changing Token","symbol":"NCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13826/thumb/hashmasks-nct.png?1612879286"},{"chainId":1,"address":"0x88930072f583936f506ce1f1d5fe69290c2d6a2a","name":"Civitas Protocol","symbol":"CVT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13829/thumb/CVT-e1612099273674.png?1612164504"},{"chainId":1,"address":"0xac0104cca91d167873b8601d2e71eb3d4d8c33e0","name":"Crowns","symbol":"CWS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13835/thumb/crowns_logo.png?1612176905"},{"chainId":1,"address":"0x4f5fa8f2d12e5eb780f6082dd656c565c48e0f24","name":"Gourmet Galaxy","symbol":"GUM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13846/thumb/gum.png?1612320864"},{"chainId":1,"address":"0xaef4f02e31cdbf007f8d98da4ae365188a0e9ecc","name":"The Famous Token","symbol":"TFT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13847/thumb/android-icon-192x192_%281%29.png?1612336853"},{"chainId":1,"address":"0xe8272210954ea85de6d2ae739806ab593b5d9c51","name":"Alpha5","symbol":"A5T","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13848/thumb/A5Tlogo.png?1612337831"},{"chainId":1,"address":"0x297d33e17e61c2ddd812389c2105193f8348188a","name":"Strudel Finance","symbol":"TRDL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13854/thumb/Strudel-9bea7582.png?1612400740"},{"chainId":1,"address":"0xf56842af3b56fd72d17cb103f92d027bba912e89","name":"BambooDeFi","symbol":"BAMBOO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13856/thumb/Bamboo-token-logo-200.png?1612404311"},{"chainId":1,"address":"0x9a96e767bfcce8e80370be00821ed5ba283d4a17","name":"GOGO Finance","symbol":"GOGO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13857/thumb/gogofinance.png?1612404853"},{"chainId":1,"address":"0xff744f2315c9d61d825b581c973576055c3da07e","name":"HPLUS","symbol":"HPLUS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13859/thumb/HPLUS.jpg?1612409678"},{"chainId":1,"address":"0x0c7e25e15e9f6818fa2770107b3ba565470bc8c5","name":"Decentralized Bitco","symbol":"DBTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13862/thumb/dbtc.png?1612416910"},{"chainId":1,"address":"0xc12ecee46ed65d970ee5c899fcc7ae133aff9b03","name":"Try Finance","symbol":"TRY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13865/thumb/try-logo.png?1612420128"},{"chainId":1,"address":"0xfdc4a3fc36df16a78edcaf1b837d3acaaedb2cb4","name":"Scifi Finance","symbol":"SCIFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13868/thumb/scifi.png?1612433269"},{"chainId":1,"address":"0xbe3c393fb670f0a29c3f3e660ffb113200e36676","name":"Digital Antares Dol","symbol":"DANT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13869/thumb/dant.png?1612435811"},{"chainId":1,"address":"0x6ad61128aba16b9d4295e6cf8bdb57b70085c9c7","name":"P Ethereum","symbol":"PETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13870/thumb/peth.png?1612436492"},{"chainId":1,"address":"0x696c1de4e7f475d5231372c47a627e4cd6ce555a","name":"Impulse By FDR","symbol":"IMPULSE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13871/thumb/Impulse_by_FDR_200x200.png?1612444245"},{"chainId":1,"address":"0x94d916873b22c9c1b53695f1c002f78537b9b3b2","name":"AlgoVest","symbol":"AVS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13874/thumb/AVS.png?1612449709"},{"chainId":1,"address":"0xeeaa40b28a2d1b0b08f6f97bb1dd4b75316c6107","name":"Govi","symbol":"GOVI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13875/thumb/GOVI.png?1612451531"},{"chainId":1,"address":"0x389999216860ab8e0175387a0c90e5c52522c945","name":"FEG Token","symbol":"FEG","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13878/thumb/feg.png?1612475137"},{"chainId":1,"address":"0x70d47fd6c9497b11c1caf0e2a84a5e7661e66c1d","name":"Defla","symbol":"DEFLA","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13879/thumb/98GNpAw.png?1612491558"},{"chainId":1,"address":"0xf680429328caaacabee69b7a9fdb21a71419c063","name":"Butterfly Protocol","symbol":"BFLY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13882/thumb/ButterflyProtocolNoText_sm.png?1612492535"},{"chainId":1,"address":"0xad4f86a25bbc20ffb751f2fac312a0b4d8f88c64","name":"OptionRoom","symbol":"ROOM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13889/thumb/option_room_logo.png?1612518313"},{"chainId":1,"address":"0x8c7424c3000942e5a93de4a01ce2ec86c06333cb","name":"ROCK3T","symbol":"R3T","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13890/thumb/rock3t_logo.jpg?1612520793"},{"chainId":1,"address":"0x417ffdbc285dd2c4dc00937798ab901634137caa","name":"BlackFisk","symbol":"BLFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13893/thumb/logo_%2891%29.png?1612561370"},{"chainId":1,"address":"0xcda2f16c6aa895d533506b426aff827b709c87f5","name":"Fairum","symbol":"FAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13894/thumb/logo-65ce48ea8d2b64b6478a42c0050214e2.png?1612645237"},{"chainId":1,"address":"0xa0bb0027c28ade4ac628b7f81e7b93ec71b4e020","name":"Rug Proof","symbol":"RPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13896/thumb/1cu6Bea.png?1612674739"},{"chainId":1,"address":"0x018fb5af9d015af25592a014c4266a84143de7a0","name":"MP3","symbol":"MP3","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13897/thumb/1_sq13-ssNvv2APEFcy8dWJg.png?1612690862"},{"chainId":1,"address":"0xaa4e3edb11afa93c41db59842b29de64b72e355b","name":"Marginswap","symbol":"MFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13899/thumb/marginswap_logo.png?1612756590"},{"chainId":1,"address":"0xf9fbe825bfb2bf3e387af0dc18cac8d87f29dea8","name":"Bot Ocean","symbol":"BOTS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13909/thumb/photo_2021-02-09_10-08-17.jpg?1612836512"},{"chainId":1,"address":"0xed40834a13129509a89be39a9be9c0e96a0ddd71","name":"Warp Finance","symbol":"WARP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13910/thumb/601ed0ac35c687c6e07d17c2_warp_token.png?1612834360"},{"chainId":1,"address":"0x6fc13eace26590b80cccab1ba5d51890577d83b2","name":"Umbrella Network","symbol":"UMB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13913/thumb/Umbrella_Network_Logo-Vertical_Version.png?1612836176"},{"chainId":1,"address":"0x0f51bb10119727a7e5ea3538074fb341f56b09ad","name":"DAO Maker","symbol":"DAO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13915/thumb/4.png?1612838831"},{"chainId":1,"address":"0x8a40c222996f9f3431f63bf80244c36822060f12","name":"Finxflo","symbol":"FXF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13916/thumb/o-z-lFJW_400x400.png?1612841822"},{"chainId":1,"address":"0x3521c85c3000bff57eac04489eb05bbd3193a531","name":"MetaWhale BTC","symbol":"MWBTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13926/thumb/metawhale.png?1612857183"},{"chainId":1,"address":"0xacbed9726ffd232b59d3ca86a0f5c856e2abef29","name":"Debunk","symbol":"DBNK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13930/thumb/77926469.jpg?1612908627"},{"chainId":1,"address":"0x9af15d7b8776fa296019979e70a5be53c714a7ec","name":"Evolution Finance","symbol":"EVN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13932/thumb/Frame_63_2.png?1612936435"},{"chainId":1,"address":"0x11003e410ca3fcd220765b3d2f343433a0b2bffd","name":"Farming Bad","symbol":"METH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13933/thumb/meth.png?1612941488"},{"chainId":1,"address":"0x5d3a4f62124498092ce665f865e0b38ff6f5fbea","name":"Ideaology","symbol":"IDEA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13938/thumb/idea_logo.png?1613022658"},{"chainId":1,"address":"0x60a995cebcd44ca566ae22a9666ed28c67b598a1","name":"Hardcore Finance","symbol":"HCORE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13941/thumb/hcore_logo.jpg?1613059806"},{"chainId":1,"address":"0x7f1f2d3dfa99678675ece1c243d3f7bc3746db5d","name":"Tapmydata","symbol":"TAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13942/thumb/taptoken.png?1613168762"},{"chainId":1,"address":"0xf9fbaefde7112f78fa9bfe813341f0f49f888cb3","name":"DDS Store","symbol":"DDS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13946/thumb/11qbAbzb_400x400.png?1613172588"},{"chainId":1,"address":"0x84810bcf08744d5862b8181f12d17bfd57d3b078","name":"SharedStake Governa","symbol":"SGT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13948/thumb/logo-1_200px.png?1613204546"},{"chainId":1,"address":"0x74c287ad5328daca276c6a1c1f149415b12c148d","name":"Pazzy","symbol":"PAZZY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13949/thumb/copred.png?1613205149"},{"chainId":1,"address":"0xde9d41a01bb11a9f41e709242824e54c3917084e","name":"Ignite","symbol":"IGN","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13953/thumb/ign_logo.jpg?1613270529"},{"chainId":1,"address":"0x44b537b6f94c73a54f7bf8a9b68f8125da3c330b","name":"Polkabase","symbol":"PBASE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13954/thumb/polkabase_logo.png?1613301180"},{"chainId":1,"address":"0x5cc737a37a02a1b34ba8edf899aa6441765232a0","name":"Burn Yield Burn","symbol":"XYX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13956/thumb/xyx_logo.png?1613351293"},{"chainId":1,"address":"0xbf0f3ccb8fa385a287106fba22e6bb722f94d686","name":"Zytara Dollar","symbol":"ZUSD","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/13957/thumb/zusd.png?1613353410"},{"chainId":1,"address":"0x89bd2e7e388fab44ae88bef4e1ad12b4f1e0911c","name":"Peanut","symbol":"NUX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13958/thumb/2sAMZXpO_400x400.jpg?1613353972"},{"chainId":1,"address":"0x3fa807b6f8d4c407e6e605368f4372d14658b38c","name":"Rise Protocol","symbol":"RISE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13959/thumb/Uo19zBht_400x400.png?1613354499"},{"chainId":1,"address":"0xc36824905dff2eaaee7ecc09fcc63abc0af5abc5","name":"Basis Bond","symbol":"BAB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13961/thumb/bab_1.png?1613358492"},{"chainId":1,"address":"0x6399c842dd2be3de30bf99bc7d1bbf6fa3650e70","name":"Premia","symbol":"PREMIA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13962/thumb/photo_2021-02-19_10-51-08.jpg?1613703321"},{"chainId":1,"address":"0x196c81385bc536467433014042788eb707703934","name":"CryptoTask","symbol":"CTASK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13965/thumb/cryptotask_logo.png?1613372242"},{"chainId":1,"address":"0xad7ca17e23f13982796d27d1e6406366def6ee5f","name":"rHEGIC2","symbol":"RHEGIC2","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13969/thumb/ezgif-4-b5306690cb32.jpg?1613385300"},{"chainId":1,"address":"0x6c28aef8977c9b773996d0e8376d2ee379446f2f","name":"Quickswap","symbol":"QUICK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13970/thumb/1_pOU6pBMEmiL-ZJVb0CYRjQ.png?1613386659"},{"chainId":1,"address":"0x51e00a95748dbd2a3f47bc5c3b3e7b3f0fea666c","name":"DAOventures","symbol":"DVG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13971/thumb/DAOventures.co_final_icon_200x200.png?1613388224"},{"chainId":1,"address":"0x0020d80229877b495d2bf3269a4c13f6f1e1b9d3","name":"Dexmex","symbol":"DEXM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13972/thumb/dexmex.png?1613393175"},{"chainId":1,"address":"0xa36e59c08c9f251a6b7a9eb6be6e32fd6157acd0","name":"Previse","symbol":"PRVS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13977/thumb/previse-logo-200.png?1613437063"},{"chainId":1,"address":"0xea1ea0972fa092dd463f2968f9bb51cc4c981d71","name":"Modefi","symbol":"MOD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13980/thumb/modefi_logo.png?1613453111"},{"chainId":1,"address":"0x9f801c1f02af03cc240546dadef8e56cd46ea2e9","name":"Vaiot","symbol":"VAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13981/thumb/VAIOT_logo.png?1613456546"},{"chainId":1,"address":"0x6595b8fd9c920c81500dca94e53cdc712513fb1f","name":"Olyseum","symbol":"OLY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13983/thumb/oly-logo.png?1613461530"},{"chainId":1,"address":"0xeb2c0e11af20fb1c41c6e7abe5ad214e48738514","name":"Sinelock","symbol":"SINE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13984/thumb/q3rzuFnH_400x400.jpg?1613463180"},{"chainId":1,"address":"0x19a2cf2a1b2f76e52e2b0c572bd80a95b4fa8643","name":"Fyooz NFT","symbol":"FYZNFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13989/thumb/fyznft.png?1613519992"},{"chainId":1,"address":"0x7061ee0896ab2c1865078b6c91731f67a89ea6a4","name":"Nitrous Finance","symbol":"NOS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13994/thumb/nos_logo.png?1613541619"},{"chainId":1,"address":"0x0bfec35a1a3550deed3f6fc76dde7fc412729a91","name":"xKNCa","symbol":"XKNCA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13995/thumb/Token-4.png?1613545763"},{"chainId":1,"address":"0x9ad03c34aab604a9e0fde41dbf8e383e11c416c4","name":"Guarded Ether","symbol":"GETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14001/thumb/guarda-shield-logo.png?1613603915"},{"chainId":1,"address":"0xe4e822c0d5b329e8bb637972467d2e313824efa0","name":"Dfinance","symbol":"XFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14002/thumb/7223.png?1613579385"},{"chainId":1,"address":"0x0cec1a9154ff802e7934fc916ed7ca50bde6844e","name":"PoolTogether","symbol":"POOL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14003/thumb/PoolTogether.png?1613585632"},{"chainId":1,"address":"0x03ab458634910aad20ef5f1c8ee96f1d6ac54919","name":"Rai Reflex Index","symbol":"RAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14004/thumb/RAI-logo-coin.png?1613592334"},{"chainId":1,"address":"0xada0a1202462085999652dc5310a7a9e2bf3ed42","name":"CoinShares Gold and","symbol":"CGI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14005/thumb/coinshares_gold.jpg?1613602163"},{"chainId":1,"address":"0x3aada3e213abf8529606924d8d1c55cbdc70bf74","name":"XMON","symbol":"XMON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14008/thumb/xmon_logo.png?1613615094"},{"chainId":1,"address":"0xa12a00e73e4e7174acc50a1c073e36aa0c9cb305","name":"Swaap Stablecoin","symbol":"SAP","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/14012/thumb/swaap.png?1613722677"},{"chainId":1,"address":"0xfecba472b2540c5a2d3700b2c9e06f0aa7dc6462","name":"Pub Finance","symbol":"PINT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14016/thumb/pint_logo.jpeg?1613707442"},{"chainId":1,"address":"0xa9248f8e40d4b9c3ca8ebd8e07e9bcb942c616d8","name":"ARKE","symbol":"ARKE","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/14017/thumb/15ba0074-67e7-4f57-8358-313805266bf1.png?1613708594"},{"chainId":1,"address":"0xf136d7b0b7ae5b86d21e7b78dfa95375a7360f19","name":"Toshimon","symbol":"TOSHI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14019/thumb/9E1K1PIZ_400x400.png?1613716582"},{"chainId":1,"address":"0x0e99cc0535bb6251f6679fa6e65d6d3b430e840b","name":"Mirrored Facebook","symbol":"MFB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14020/thumb/mirror_logo_transparent.png?1613718368"},{"chainId":1,"address":"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","name":"WETH","symbol":"WETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2518/thumb/weth.png?1547036627"}] \ No newline at end of file +[{"chainId":1,"address":"0x92161385c9de8798ad5fb01c0be99ffcbc84dfd8","name":"RealT Token 10084","symbol":"REALTOKEN-S-10084-G","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16693/thumb/Grayton_84_side1x.jpeg?1624638633"},{"chainId":1,"address":"0x57eadd2a542cfe9f00a37f55df4d5062f857c0e8","name":"RealT Token 9943 ","symbol":"REALTOKEN-S-9943-MA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16695/thumb/9943-Marlowe-HERO-2.jpeg?1624639568"},{"chainId":1,"address":"0xd9a8cfe21c232d485065cb62a96866799d4645f7","name":"FingerPrint","symbol":"FGP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5454/thumb/fingerprint.png?1561602642"},{"chainId":1,"address":"0xe8ff5c9c75deb346acac493c463c8950be03dfba","name":"VIBE","symbol":"VIBE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/948/thumb/vibe.png?1547034809"},{"chainId":1,"address":"0x4fd0b42d14ad7ffd18d2d1d7ea6b4b45f3d56463","name":"Goya Giant Token","symbol":"ARTG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16752/thumb/ARTG-logo-e1619211414299.png?1624925976"},{"chainId":1,"address":"0xcfb72ed3647cc8e7fa52e4f121ecdabefc305e7f","name":"Flapp","symbol":"FLAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13714/thumb/logo_-_2021-01-20T085648.571.png?1611104234"},{"chainId":1,"address":"0x957b28f93b0e01557e21e6c564ab26ddc2d18ec5","name":"NemoCoin","symbol":"NEMO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8683/thumb/KwqZ31Zm_400x400.png?1560225786"},{"chainId":1,"address":"0x6d1dc3928604b00180bb570bdae94b9698d33b79","name":"UnitedCrowd","symbol":"UCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14956/thumb/eUvRU9wm.png?1619142511"},{"chainId":1,"address":"0x21f15966e07a10554c364b988e91dab01d32794a","name":"SmartMesh","symbol":"SMT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1346/thumb/smartmesh.png?1548609531"},{"chainId":1,"address":"0x6682195e2a0048ce38b727a3711802d58244606e","name":"BeautyK","symbol":"BTKC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12189/thumb/logo_%2891%29.png?1597963518"},{"chainId":1,"address":"0xe6410569602124506658ff992f258616ea2d4a3d","name":"Katana Finance","symbol":"KATANA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12473/thumb/AyHMMbK.jpeg?1600124081"},{"chainId":1,"address":"0x3d4e7f52efafb9e0c70179b688fc3965a75bcfea","name":"OT Compound Dai","symbol":"OT-CDAI-29DEC2022","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/16581/thumb/Pendle_cDAI_OT.png?1624507586"},{"chainId":1,"address":"0x410e731c2970dce3add351064acf5ce9e33fdbf0","name":"ONBUFF","symbol":"ONIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12252/thumb/d4suDHSzEZjDXc0uxFGPZXfDFp0L1tfoEusBx03zB1bvMLLbxa7Yq5naXAOutkirIlLXacFRRebX_hF2Ez69_fIPUfr2LuN0Z_UrXTLYds4aT95C6eHGXsZnezMHKAaOmjLpKto0xPTiYkXExvEvXrqL7O_J1wecb4eJsgwCoVprMLpm89BdKO9IyMmpNsfbW7JJFMiHgL8vq9fPhaeEi.jpg?1598519096"},{"chainId":1,"address":"0x033e223870f766644f7f7a4b7dc2e91573707d06","name":"Zin","symbol":"ZIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13250/thumb/coingecko_logo.png?1606716375"},{"chainId":1,"address":"0x6b33f15360cedbfb8f60539ec828ef52910aca9b","name":"xINCHb","symbol":"XINCHB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13800/thumb/xINCH-2.png?1611978606"},{"chainId":1,"address":"0xe1b583dc66e0a24fd9af2dc665f6f5e48978e106","name":"Mercurity Finance","symbol":"MEE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14513/thumb/mee.PNG?1616633698"},{"chainId":1,"address":"0xcc34366e3842ca1bd36c1f324d15257960fcc801","name":"Bonpay","symbol":"BON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1314/thumb/bonpay.png?1547563439"},{"chainId":1,"address":"0xa86a0da9d05d0771955df05b44ca120661af16de","name":"OTCBTC Token","symbol":"OTB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5246/thumb/otcbtc-token.jpg?1547040734"},{"chainId":1,"address":"0x054f76beed60ab6dbeb23502178c52d6c5debe40","name":"DeFiner","symbol":"FIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12780/thumb/PdaW8Lb.png?1602500407"},{"chainId":1,"address":"0x72a66e54b66892ae3bbe54df7bb7dd5ae927a6f9","name":"Crypto Village Acce","symbol":"CVAG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17124/thumb/cvag.PNG?1626401266"},{"chainId":1,"address":"0xf8e386eda857484f5a12e4b5daa9984e06e73705","name":"Indorse","symbol":"IND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/848/thumb/indorse_token.png?1547034644"},{"chainId":1,"address":"0xc4c7ea4fab34bd9fb9a5e1b1a98df76e26e6407c","name":"COCOS BCX","symbol":"COCOS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4932/thumb/_QPpjoUi_400x400.jpg?1566430520"},{"chainId":1,"address":"0x79256db1bdb6259315a1a3d7dd237f69cadfd8fc","name":"Typhoon Cash","symbol":"PHOON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13730/thumb/photo_2021-01-21_19-05-27.jpg?1611227665"},{"chainId":1,"address":"0xe0c8b298db4cffe05d1bea0bb1ba414522b33c1b","name":"Nuco Cloud","symbol":"NCDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8932/thumb/necocloud.png?1600380803"},{"chainId":1,"address":"0x6c4522f0035bed2180b40f4c5d9dbaab64b41325","name":"Passport Finance","symbol":"PASS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12946/thumb/android-chrome-512x512.png?1604277448"},{"chainId":1,"address":"0xbdc5bac39dbe132b1e030e898ae3830017d7d969","name":"Snovian Space","symbol":"SNOV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1330/thumb/logo2.png?1547035355"},{"chainId":1,"address":"0x61266424b904d65ceb2945a1413ac322185187d5","name":"YFIDapp","symbol":"YFID","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13309/thumb/Untitled-design-9-removebg-preview.png?1607328419"},{"chainId":1,"address":"0x46a97629c9c1f58de6ec18c7f536e7e6d6a6ecde","name":"iDOT","symbol":"IDOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15733/thumb/idot.JPG?1621671898"},{"chainId":1,"address":"0xc221b7e65ffc80de234bbb6667abdd46593d34f0","name":"Wrapped Centrifuge","symbol":"WCFG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17106/thumb/WCFG.jpg?1626266462"},{"chainId":1,"address":"0x1ed7ae1f0e2fa4276dd7ddc786334a3df81d50c0","name":"FSBT API","symbol":"FSBT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1635/thumb/fsbt.PNG?1547035857"},{"chainId":1,"address":"0x155ff1a85f440ee0a382ea949f24ce4e0b751c65","name":"Behodler","symbol":"EYE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12804/thumb/behodler_200_P.png?1614331645"},{"chainId":1,"address":"0x5091aed52ad421969254e48d29aa1d1807e1870b","name":"ZOM","symbol":"ZOM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11889/thumb/zom_256px.png?1610965111"},{"chainId":1,"address":"0x0c63cae5fcc2ca3dde60a35e50362220651ebec8","name":"stakedXEM","symbol":"STXEM","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13417/thumb/stakedXEM_high_res.png?1608389932"},{"chainId":1,"address":"0x6226caa1857afbc6dfb6ca66071eb241228031a1","name":"LinkArt","symbol":"LAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8892/thumb/pB4iXZbU_400x400.jpg?1562579001"},{"chainId":1,"address":"0x8c15ef5b4b21951d50e53e4fbda8298ffad25057","name":"Function X","symbol":"FX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8186/thumb/47271330_590071468072434_707260356350705664_n.jpg?1556096683"},{"chainId":1,"address":"0x449efe48ad7cd423bab056276639f8120cd4f9a3","name":"LibreFreelencer","symbol":"LIBREF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13169/thumb/LibraF-256x256.png?1606084188"},{"chainId":1,"address":"0x8ae4bf2c33a8e667de34b54938b0ccd03eb8cc06","name":"Patientory","symbol":"PTOY","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/746/thumb/patientory.png?1548330777"},{"chainId":1,"address":"0xe1bad922f84b198a08292fb600319300ae32471b","name":"Firmachain","symbol":"FCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9892/thumb/6mHcLurm_400x400.jpg?1573160342"},{"chainId":1,"address":"0x31d939dc09a6bb55642fcbf9d56166ebc0bdec9a","name":"Peach Finance","symbol":"PEECH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15376/thumb/PEECH-token-logo-200.png?1620692908"},{"chainId":1,"address":"0x1ece1739dae08253ae582c404511b37355b42c84","name":"PICA","symbol":"PICA","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/14364/thumb/pica_logo.png?1615694871"},{"chainId":1,"address":"0xf6fd82dedbbe0ffadb5e1ecc2a283ab52b9ed2b0","name":"Etheal","symbol":"HEAL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3267/thumb/heal.png?1547037807"},{"chainId":1,"address":"0xe48972fcd82a274411c01834e2f031d4377fa2c0","name":"2key network","symbol":"2KEY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6090/thumb/2key.png?1591591830"},{"chainId":1,"address":"0x504cde95dbc5d90d09b802f43b371971adbecf79","name":"Centralex","symbol":"CENX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16025/thumb/Centralex_Logo.png?1622618498"},{"chainId":1,"address":"0x677ddbd918637e5f2c79e164d402454de7da8619","name":"Vesper V Dollar","symbol":"VUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16253/thumb/Vesper_Token_600.png?1623394697"},{"chainId":1,"address":"0x1fc05d480b1ef1175a31123bfdbd36bfee256889","name":"noob finance","symbol":"NOOB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13088/thumb/noob_finance_logo.jpg?1604998432"},{"chainId":1,"address":"0x97aa8e14db0bc073cc7e2d42ac715427717d6042","name":"SPUNK Vault NFTX ","symbol":"SPUNK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17063/thumb/Spunks_%281%29.png?1626150896"},{"chainId":1,"address":"0xe530441f4f73bdb6dc2fa5af7c3fc5fd551ec838","name":"GSENetwork","symbol":"GSE","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/4776/thumb/gsenetwork.png?1547743285"},{"chainId":1,"address":"0x05bbe7240de66f6480c9aeda77c1376b13393f83","name":"Xeno Token","symbol":"XNO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13830/thumb/XNO_logo_200x200.png?1612168285"},{"chainId":1,"address":"0x8752bf7ad53d25a4165b9370f2becc22dd8ae838","name":"BlockNoteX","symbol":"BNOX","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/11066/thumb/bnox-color-h256.png?1587777583"},{"chainId":1,"address":"0x69e8b9528cabda89fe846c67675b5d73d463a916","name":"OPEN Governance Tok","symbol":"OPEN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13233/thumb/opendao_logo.png?1606575207"},{"chainId":1,"address":"0x35a23bc27c345b36dee700a256f69c6334030971","name":"Concern Poverty Cha","symbol":"CHY","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/17092/thumb/cpy.PNG?1626223644"},{"chainId":1,"address":"0x68d57c9a1c35f63e2c83ee8e49a64e9d70528d25","name":"Sirin Labs Token","symbol":"SRN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1872/thumb/sirin-labs-token.png?1548609584"},{"chainId":1,"address":"0xd29f0b5b3f50b07fe9a9511f7d86f4f4bac3f8c4","name":"Liquidity Network","symbol":"LQD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3801/thumb/liquidity-network.png?1547975994"},{"chainId":1,"address":"0x40c6f861a08f97dfbc3c0931485bff4921975a56","name":"HGH Token","symbol":"HGH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10045/thumb/Screenshot_2019-12-02_at_6.43.54_AM.png?1575240248"},{"chainId":1,"address":"0x31c63146a635eb7465e5853020b39713ac356991","name":"Mirrored United Sta","symbol":"MUSO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13640/thumb/mirror_logo_transparent.png?1611564829"},{"chainId":1,"address":"0x3de7148c41e3b3233f3310e794f68d8e70ca69af","name":"ShibaLink","symbol":"SLINK","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16843/thumb/shibalink.png?1625384724"},{"chainId":1,"address":"0xeaf61fc150cd5c3bea75744e830d916e60ea5a9f","name":"Typerium","symbol":"TYPE","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/4019/thumb/type.png?1547039124"},{"chainId":1,"address":"0x865ec58b06bf6305b886793aa20a2da31d034e68","name":"Mossland","symbol":"MOC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2374/thumb/moc.png?1547036557"},{"chainId":1,"address":"0xc07a150ecadf2cc352f5586396e344a6b17625eb","name":"Bio Passport","symbol":"BIOT","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/14167/thumb/logo_%2895%29.png?1614753428"},{"chainId":1,"address":"0xa360f2af3f957906468c0fd7526391aed08ae3db","name":"ETH 50 Day MA Cross","symbol":"ETH50SMACO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10615/thumb/eth-50-day-moving-average-set.png?1580971806"},{"chainId":1,"address":"0xab37e1358b639fd877f015027bb62d3ddaa7557e","name":"Lien","symbol":"LIEN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12224/thumb/Lien.png?1598262819"},{"chainId":1,"address":"0xaf1250fa68d7decd34fd75de8742bc03b29bd58e","name":"Invictus Hyperion F","symbol":"IHF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3747/thumb/ihp.png?1547038807"},{"chainId":1,"address":"0xbe5b336ef62d1626940363cf34be079e0ab89f20","name":"Bnoincoin","symbol":"BNC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11511/thumb/bnoincoin_cryptocoin-1.png?1590489689"},{"chainId":1,"address":"0x14da230d6726c50f759bc1838717f8ce6373509c","name":"Kambria","symbol":"KAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4784/thumb/kambria.png?1547040127"},{"chainId":1,"address":"0x0dd83b5013b2ad7094b1a7783d96ae0168f82621","name":"Florafic","symbol":"FIC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10661/thumb/djMKIRPg9_amC409dhw27xYWgwMxnFk81HGexyGpj6RCaCYQZp7xjOjw-VpWiSHZp7r9HjtQbzsmNGw7TWR9T9PIQdxgXSJUCuY5FU7Zbt2xxfIhY4oD975-h4nrKEXbHcI6VMvzlbuz3J7o5elU-crDa4OoRns7IQqu02Hzgi-waDWPFR5fPwaLjRKSgq9Alt2bZ4S0CNKqelY.jpg?1581462836"},{"chainId":1,"address":"0x7f3edcdd180dbe4819bd98fee8929b5cedb3adeb","name":"xToken","symbol":"XTK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14089/thumb/xToken.png?1614226407"},{"chainId":1,"address":"0xe2da716381d7e0032cecaa5046b34223fc3f218d","name":"Carbon Utility Toke","symbol":"CUT","decimals":5,"logoURI":"https://assets.coingecko.com/coins/images/14487/thumb/CUT_Logo_%281%29.png?1616478995"},{"chainId":1,"address":"0x7dd9c5cba05e151c895fde1cf355c9a1d5da6429","name":"Golem","symbol":"GLM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/542/thumb/Golem_Submark_Positive_RGB.png?1606392013"},{"chainId":1,"address":"0x8d8129963291740dddd917ab01af18c7aed4ba58","name":"MineBee","symbol":"MB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9455/thumb/BWVFWd2btlmC4o6e6o5oTdChrbJOpr9MaNgOuJirFmkbSiZltqfyzSwFd2efv0FSNf3siXU1B8quEHTBX3VkJ8CNTEN16gEgKDr3RFjS7Fw4QdnnPMUBgKsTDjr_zL2vMw6erjtV_3dZyLSCpGJvF6IjoWdZUVTGBMEqEwGqhGSPsq_Qrdxzo4aIhJdhVtUIhHS9QDIWEmY52DyFZ.jpg?1567562959"},{"chainId":1,"address":"0x8515cd0f00ad81996d24b9a9c35121a3b759d6cd","name":"BlockBurn","symbol":"BURN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8851/thumb/blockburn.JPG?1582774870"},{"chainId":1,"address":"0x301c755ba0fca00b1923768fffb3df7f4e63af31","name":"Global Digital Cont","symbol":"GDC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10122/thumb/Vp4L1x4Hu4HEuEPUl0gSocDaVifkXlCqSd8A72ml_Q0uwEc9uBWBTwjS43_NP8eiiZVveJDIQXguWUXYk3MLZiFOER-8CGO120I0NGU_L8aTJ8c50a-O_AbkY-4nUkPYhUTNgf3rkcqkXnKecixQwLfkJG2XTCLwNvo_ox05x0_hU1Z__FOT4O7AeU-PC6skc85NCVS68cnZjxcUBOY9K.jpg?1576124937"},{"chainId":1,"address":"0x14dd7ebe6cb084cb73ef377e115554d47dc9d61e","name":"ApeHaven","symbol":"APES","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15735/thumb/apes.PNG?1621683822"},{"chainId":1,"address":"0xc32cc5b70bee4bd54aa62b9aefb91346d18821c4","name":"Iteration Syndicate","symbol":"ITS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13297/thumb/1_LOssD4ENHv72I5e9PAsndA_%281%29.png?1607223580"},{"chainId":1,"address":"0x2731d151cbdf84a8a4c6d9d0bae74012db51e428","name":"IFToken","symbol":"IFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14049/thumb/ift_200x200.jpg?1614046057"},{"chainId":1,"address":"0xddce093888c8dc636677cd29bc6c68d35cfdac33","name":"Paper","symbol":"PAPER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14369/thumb/paper.png?1621827513"},{"chainId":1,"address":"0xb31c219959e06f9afbeb36b388a4bad13e802725","name":"ONO","symbol":"ONOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7374/thumb/Q4smiijArZodsQ9wFctGCcM5I-czQdVwLd7pieSqKS1dDad_Y6OkypEKX7Ckil16iDz9o5K06r41tI4FSmuyCXhRXdkzPlwwwNkH2Uf6OsQB_NdlJ_UvklPmTb2IRE1FT2wnx1EVBz_t2K1oZNDi2L7rlhOVnxbkm3zpgcy15boOyEvpU-wCgAqrbQ6OLLYZAKOwfRS-NQVJCz2YfM8vGY2y7Zr-QM59t8hpI7cgMpY6lbfT.jpg?1547044066"},{"chainId":1,"address":"0x90b426067be0b0ff5de257bc4dd6a4815ea03b5f","name":"Strain","symbol":"STRN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13087/thumb/strain_logo.jpg?1604990516"},{"chainId":1,"address":"0x6ec47a178a9d50d4ec4683003d8324f19ca35382","name":"NDN Link","symbol":"NDN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11553/thumb/5O_jIk2e_400x400.jpg?1591000318"},{"chainId":1,"address":"0x423b5f62b328d0d6d44870f4eee316befa0b2df5","name":"GoNetwork","symbol":"GOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3291/thumb/gonetwork.png?1547743011"},{"chainId":1,"address":"0xd5930c307d7395ff807f2921f12c5eb82131a789","name":"Bolt","symbol":"BOLT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4489/thumb/bolt.png?1555648257"},{"chainId":1,"address":"0xb8243b4eeca27a4191e879760b88fe2270561796","name":"ETHUSD ADL 4H Set","symbol":"ETHUSDADL4","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10587/thumb/ethusd_adl_4h.png?1580962139"},{"chainId":1,"address":"0xbbff862d906e348e9946bfb2132ecb157da3d4b4","name":"Sharder protocol","symbol":"SS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2921/thumb/sharder-200px.png?1595305234"},{"chainId":1,"address":"0x5b5a353fc217ebef77bc7686ea05a003ebdb7d1a","name":"HiGameCoin","symbol":"HGC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8333/thumb/hpc.png?1557546950"},{"chainId":1,"address":"0x0947b0e6d821378805c9598291385ce7c791a6b2","name":"Lendingblock","symbol":"LND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2988/thumb/lnd.png?1518768584"},{"chainId":1,"address":"0x4a527d8fc13c5203ab24ba0944f4cb14658d1db6","name":"Morpheus Labs","symbol":"MITX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3164/thumb/mitx.png?1604888269"},{"chainId":1,"address":"0xf52cdcd458bf455aed77751743180ec4a595fd3f","name":"IdleSUSD Yield ","symbol":"IDLESUSDYIELD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11934/thumb/idlesusdv3mmaxyield_32.png?1596263703"},{"chainId":1,"address":"0x3d3af44cf092a49280e316f09c8f20ecf97bc933","name":"UCX","symbol":"UCX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10131/thumb/UCX_200200.png?1576186720"},{"chainId":1,"address":"0x72955ecff76e48f2c8abcce11d54e5734d6f3657","name":"TrustVerse","symbol":"TRV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8793/thumb/trv_256px.png?1623928469"},{"chainId":1,"address":"0x8c81121b15197fa0eeaee1dc75533419dcfd3151","name":"IdleWBTC Best Yiel","symbol":"IDLEWBTCYIELD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11936/thumb/idlewbtcv3maxyield_32.png?1596263736"},{"chainId":1,"address":"0x09617f6fd6cf8a71278ec86e23bbab29c04353a7","name":"Shardus","symbol":"ULT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8383/thumb/final_logo_photoshop.png?1557890272"},{"chainId":1,"address":"0x4bb3205bf648b7f59ef90dee0f1b62f6116bc7ca","name":"Beyond Finance","symbol":"BYN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14746/thumb/ZJfK0wYy_400x400.jpg?1618078874"},{"chainId":1,"address":"0xff744f2315c9d61d825b581c973576055c3da07e","name":"HPLUS","symbol":"HPLUS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13859/thumb/HPLUS.jpg?1612409678"},{"chainId":1,"address":"0x48ff53777f747cfb694101222a944de070c15d36","name":"Ether Kingdoms Toke","symbol":"IMP","decimals":7,"logoURI":"https://assets.coingecko.com/coins/images/5473/thumb/ether-kingdoms-token.png?1547394504"},{"chainId":1,"address":"0xce111a198eb04f388aceb78c40ced6daf1b0514a","name":"RealT Token 272 N","symbol":"REALTOKEN-S-272-NE-","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16635/thumb/272-Court-1.jpeg?1624556789"},{"chainId":1,"address":"0x77f39c61ddac121ca1b24fdea984fab734fdce8f","name":"Shiba Launch","symbol":"SHIBAL","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15480/thumb/shibal.jpg?1621008148"},{"chainId":1,"address":"0x3f4cd830543db25254ec0f05eac058d4d6e86166","name":"Jindoge","symbol":"JINDOGE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15417/thumb/JINDOGE.png?1620774122"},{"chainId":1,"address":"0x6b3595068778dd592e39a122f4f5a5cf09c90fe2","name":"Sushi","symbol":"SUSHI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12271/thumb/512x512_Logo_no_chop.png?1606986688"},{"chainId":1,"address":"0xfef3bef71a5eb97e097039038776fd967ae5b106","name":"YFMoonshot","symbol":"YFMS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12496/thumb/yfmoonshot_logo.jpg?1600266768"},{"chainId":1,"address":"0x80c62fe4487e1351b47ba49809ebd60ed085bf52","name":"Clover Finance","symbol":"CLV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15278/thumb/photo_2021-07-16_08.50.50.jpeg?1626396674"},{"chainId":1,"address":"0xd559f20296ff4895da39b5bd9add54b442596a61","name":"FintruX","symbol":"FTX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1928/thumb/token-500x500.png?1547036223"},{"chainId":1,"address":"0x051cf5178f60e9def5d5a39b2a988a9f914107cb","name":"Epstein","symbol":"EPSTEIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16299/thumb/pTRo5Ak.png?1623681578"},{"chainId":1,"address":"0x9cb1aeafcc8a9406632c5b084246ea72f62d37b6","name":"LBK","symbol":"LBK","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9492/thumb/lbk.jpeg?1586144855"},{"chainId":1,"address":"0x034455c8a9882bf44c9704c780a55198e05ba559","name":"Lumos","symbol":"LMS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12938/thumb/6tZdBWW.png?1603723170"},{"chainId":1,"address":"0xfae4ee59cdd86e3be9e8b90b53aa866327d7c090","name":"CPChain","symbol":"CPC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2760/thumb/cpchain.png?1547036953"},{"chainId":1,"address":"0x0e29e5abbb5fd88e28b2d355774e73bd47de3bcd","name":"Hakka Finance","symbol":"HAKKA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12163/thumb/Hakka-icon.png?1597746776"},{"chainId":1,"address":"0x9a0587eae7ef64b2b38a10442a44cfa43edd7d2a","name":"Welltrado","symbol":"WTL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3612/thumb/welltrado.png?1548760605"},{"chainId":1,"address":"0x2f6081e3552b1c86ce4479b80062a1dda8ef23e3","name":"Dollars","symbol":"USDX","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12377/thumb/rCdP56C.png?1599445426"},{"chainId":1,"address":"0xd1e06952708771f71e6dd18f06ee418f6e8fc564","name":"GazeTV","symbol":"GAZE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14717/thumb/Gaze_Icon_Positive.png?1617937326"},{"chainId":1,"address":"0xcb4b17b9fa78bf1fac6d239e5bce291035750b6c","name":"Unicly Beeple Colle","symbol":"UBEEPLE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15224/thumb/uBEEPLE.jpeg?1620136048"},{"chainId":1,"address":"0x0aee8703d34dd9ae107386d3eff22ae75dd616d1","name":"Tranche Finance","symbol":"SLICE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14119/thumb/photo_2021-03-01_18-31-45.jpg?1614694699"},{"chainId":1,"address":"0x07ef9e82721ac16809d24dafbe1792ce01654db4","name":"Chimpion","symbol":"BNANA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7522/thumb/banana-token-logo.jpg?1548167777"},{"chainId":1,"address":"0x0fd3822072ad001aac1c90a09d9506f097f24458","name":"NOA PLAY","symbol":"NOA","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15723/thumb/XHFjmBTx_400x400.png?1621635644"},{"chainId":1,"address":"0xb37a769b37224449d92aac57de379e1267cd3b00","name":"Cova Unity","symbol":"COVA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4707/thumb/covalent.jpg?1547040005"},{"chainId":1,"address":"0x74fb9da15d4f9a34d8c825798da0fa5c400dade1","name":"CORD Finance old ","symbol":"CORD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13221/thumb/cord-transparent-square-256.png?1611322978"},{"chainId":1,"address":"0xd3c625f54dec647db8780dbbe0e880ef21ba4329","name":"HollaEx Token","symbol":"XHT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16157/thumb/xGyZxK8.png?1623139610"},{"chainId":1,"address":"0x9a794dc1939f1d78fa48613b89b8f9d0a20da00e","name":"Arbidex","symbol":"ABX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5541/thumb/arbidex.png?1547041334"},{"chainId":1,"address":"0xb35e9ad7e9ebf731e04c73845f1bf75e55828700","name":"BitRewards","symbol":"XBRT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3514/thumb/DUu2c0KVAAUOvql_%281%29.jpg?1547038299"},{"chainId":1,"address":"0x81c9151de0c8bafcd325a57e3db5a5df1cebf79c","name":"Datum","symbol":"DAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1353/thumb/datum.png?1547035378"},{"chainId":1,"address":"0xc761d1ccb38a94703675d2cdb15f7f1b3dcff7b7","name":"Hiz Finance","symbol":"HIZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12974/thumb/73051179.png?1603959145"},{"chainId":1,"address":"0xf921ae2dac5fa128dc0f6168bf153ea0943d2d43","name":"Fire Protocol","symbol":"FIRE","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13495/thumb/fire.jpg?1609165121"},{"chainId":1,"address":"0xc3d088842dcf02c13699f936bb83dfbbc6f721ab","name":"Voucher ETH","symbol":"VETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14484/thumb/veth_logo_uniswap_200x200.png?1616471309"},{"chainId":1,"address":"0x9043d4d51c9d2e31e3f169de4551e416970c27ef","name":"Prime DAI","symbol":"PDAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12338/thumb/pdai-200px.png?1599136775"},{"chainId":1,"address":"0x8f0921f30555624143d427b340b1156914882c10","name":"FlypMe","symbol":"FYP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1098/thumb/flypme.png?1548126453"},{"chainId":1,"address":"0x06f65b8cfcb13a9fe37d836fe9708da38ecb29b2","name":"SAINT FAME Genesis","symbol":"FAME","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11521/thumb/FAME.png?1590622461"},{"chainId":1,"address":"0x5b26c5d0772e5bbac8b3182ae9a13f9bb2d03765","name":"Education Ecosystem","symbol":"LEDU","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/3451/thumb/LEDU-education-ecosystem.png?1547038165"},{"chainId":1,"address":"0x7afb39837fd244a651e4f0c5660b4037214d4adf","name":"Soda Token","symbol":"SODA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12546/thumb/soda.acd4d701.png?1600671234"},{"chainId":1,"address":"0xdac17f958d2ee523a2206206994597c13d831ec7","name":"Tether","symbol":"USDT","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/325/thumb/Tether-logo.png?1598003707"},{"chainId":1,"address":"0x4b4eb5c44d50bfd44124688c6754633f7e258b01","name":"SubGame","symbol":"SGB","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/15422/thumb/logo_200_200.png?1620785105"},{"chainId":1,"address":"0xcee1d3c3a02267e37e6b373060f79d5d7b9e1669","name":"yffi finance","symbol":"YFFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11940/thumb/yffi-finance.jpg?1596289302"},{"chainId":1,"address":"0x32a8cd4d04d5f2e5de30ad73ef0a377eca2fdd98","name":"Karaganda Token","symbol":"KRG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12611/thumb/117756674_103472948138919_7691283516567887912_n.jpg?1601241618"},{"chainId":1,"address":"0x5247c0db4044fb6f97f32c7e1b48758019a5a912","name":"pxGOLD Synthetic Go","symbol":"PXGOLD-MAR2022","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14430/thumb/PXGOLD.png?1616038262"},{"chainId":1,"address":"0x9c306a78b1a904e83115c05ac67c1ef07c653651","name":"BoringDAO DOGE","symbol":"ODOGE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16894/thumb/oDOGE.png?1625555417"},{"chainId":1,"address":"0x24dcc881e7dd730546834452f21872d5cb4b5293","name":"Data Transaction To","symbol":"XD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3460/thumb/xd_01.png?1560142295"},{"chainId":1,"address":"0x6a7ef4998eb9d0f706238756949f311a59e05745","name":"Keysians Network","symbol":"KEN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12141/thumb/Keysians_logo.jpg?1597542966"},{"chainId":1,"address":"0x3cbc780d2934d55a06069e837fabd3e6fc23dab0","name":"DBX","symbol":"DBX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15682/thumb/photo_2021-05-17_22-10-35.jpg?1621549173"},{"chainId":1,"address":"0x9fef44fc4c571010bccd5b63e1cdc807d3b347bf","name":"RealT Token 15095 ","symbol":"REALTOKEN-S-15095-H","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16664/thumb/15095-Hartwell-hero-1.jpeg?1624625590"},{"chainId":1,"address":"0x5bc52b5367b637bec5f818e69208eb9f03c426ee","name":"Panda Finance","symbol":"PAND","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15579/thumb/logo-200_%285%29.png?1621239747"},{"chainId":1,"address":"0x96b0bf939d9460095c15251f71fda11e41dcbddb","name":"Sharpay","symbol":"S","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2386/thumb/sharpay.png?1547036564"},{"chainId":1,"address":"0x15eabb7500e44b7fdb6e4051ca8deca430cf9fb8","name":"Dexfin","symbol":"DXF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13660/thumb/dxf-symbol.png?1610599440"},{"chainId":1,"address":"0xa891cf72aeda692570928efe1a832342e9783cdc","name":"Interfinex Bills","symbol":"IFEX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13346/thumb/U6uYZry.png?1607662020"},{"chainId":1,"address":"0x179e31fb25e433441a2839389a7b8ec9c4654b7b","name":"SynchroBitcoin","symbol":"SNB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10727/thumb/Logosnb.png?1582667361"},{"chainId":1,"address":"0x354e514c135c8603f840ffadb4c33cde6d2a37e0","name":"Unilock Network","symbol":"UNL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13381/thumb/unilock_logo.png?1608074688"},{"chainId":1,"address":"0xab9c92a9337a1494c6d545e48187fa37144403c8","name":"Punk Attr 5","symbol":"PUNK-ATTR-5","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13999/thumb/icon-punk-attr-5-40.png?1613604003"},{"chainId":1,"address":"0x0222be1f1b8413b2d7d76ebfc9e0285c1300692f","name":"Glox Finance","symbol":"GLOX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13312/thumb/glox_finance.png?1607395418"},{"chainId":1,"address":"0xde7d85157d9714eadf595045cc12ca4a5f3e2adb","name":"STP Network","symbol":"STPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8713/thumb/STP.png?1560262664"},{"chainId":1,"address":"0xd38aeb759891882e78e957c80656572503d8c1b1","name":"sCRV","symbol":"SCRV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14954/thumb/sCRV.png?1619129512"},{"chainId":1,"address":"0x2129ff6000b95a973236020bcd2b2006b0d8e019","name":"MYX Network","symbol":"MYX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12128/thumb/oKkmWEt.png?1597395102"},{"chainId":1,"address":"0xfa6de2697d59e88ed7fc4dfe5a33dac43565ea41","name":"DEFI Top 5 Index","symbol":"DEFI5","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13691/thumb/thGDKHo.png?1610959947"},{"chainId":1,"address":"0x01c0987e88f778df6640787226bc96354e1a9766","name":"UltrAlpha","symbol":"UAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9300/thumb/UltrAlpha.png?1565882277"},{"chainId":1,"address":"0x7297862b9670ff015192799cc849726c88bf1d77","name":"SkyMap","symbol":"SKYM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5266/thumb/soar_earth.png?1547040769"},{"chainId":1,"address":"0xb0280743b44bf7db4b6be482b2ba7b75e5da096c","name":"Transcodium","symbol":"TNS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2071/thumb/transcodium.png?1548759093"},{"chainId":1,"address":"0xac0c8da4a4748d8d821a0973d00b157aa78c473d","name":"YFIONE","symbol":"YFO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13670/thumb/256.png?1610676054"},{"chainId":1,"address":"0x7d14b842630cbc2530cb288109e5719e0c4d67d7","name":"Innovation Blockcha","symbol":"IBP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12903/thumb/ibp.?1603347704"},{"chainId":1,"address":"0xf263292e14d9d8ecd55b58dad1f1df825a874b7c","name":"Educoin","symbol":"EDU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3256/thumb/educoin.jpg?1547037785"},{"chainId":1,"address":"0xf18af466f8885f9ea93d2b85c47a427cb01bad52","name":"Racing Pigeon Chain","symbol":"RPC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6408/thumb/SzibabnT_400x400.jpg?1550629165"},{"chainId":1,"address":"0x38d1b0d157529bd5d936719a8a5f8379afb24faa","name":"DataKYC","symbol":"DKYC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7123/thumb/1btu7Lp__400x400.jpg?1547043621"},{"chainId":1,"address":"0x11b0a8c0fa626627601ed518c3538a39d92d609e","name":"Generation of Yield","symbol":"YGY","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/12798/thumb/ygycg.png?1602643175"},{"chainId":1,"address":"0x3383c5a8969dc413bfddc9656eb80a1408e4ba20","name":"Wrapped ANATHA","symbol":"WANATHA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12690/thumb/CrZ8h9FV_400x400.png?1601678935"},{"chainId":1,"address":"0x0ae055097c6d159879521c384f1d2123d1f195e6","name":"xDAI Stake","symbol":"STAKE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11061/thumb/xdai.png?1587714165"},{"chainId":1,"address":"0xed0e2041bfb5a426e5ed426a73765624e08bbb75","name":"FANZY","symbol":"FX1","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11117/thumb/FX.png?1604900016"},{"chainId":1,"address":"0xc560984d8c4ced2a0eba5790b33b6f43afeef759","name":"SpritzCoin","symbol":"SPRTZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7174/thumb/RkSyYKm.png?1547043705"},{"chainId":1,"address":"0xef6344de1fcfc5f48c30234c16c1389e8cdc572c","name":"EncrypGen","symbol":"DNA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1215/thumb/encrypgen.png?1547393601"},{"chainId":1,"address":"0x9d62526f5ce701950c30f2caca70edf70f9fbf0f","name":"Blocktanium","symbol":"BKT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16650/thumb/bkt.png?1624592883"},{"chainId":1,"address":"0x4689a4e169eb39cc9078c0940e21ff1aa8a39b9c","name":"Proton Token","symbol":"PTT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5248/thumb/proton-token.png?1548332108"},{"chainId":1,"address":"0x76dbeb740ecd1f3b052a9afa302abc7eb4fb5390","name":"RealT Token 9133 ","symbol":"REALTOKEN-S-9133-DE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16683/thumb/9133-Devonshire-hero.jpeg?1624632898"},{"chainId":1,"address":"0xd4a80224350528b7c0ae8c325a0b5778d92fd86e","name":"Crypto Bits","symbol":"CBS3","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15737/thumb/logo_-_2021-05-22T200127.142.png?1621684895"},{"chainId":1,"address":"0x1f573d6fb3f13d689ff844b4ce37794d79a7ff1c","name":"Bancor Network Toke","symbol":"BNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/736/thumb/bancor.png?1547034477"},{"chainId":1,"address":"0xef2e239b21a81719abaabc6239e2e90859b44d9b","name":"Talent Token","symbol":"TTX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12770/thumb/nsrM738k_400x400.jpg?1602481890"},{"chainId":1,"address":"0xa283aa7cfbb27ef0cfbcb2493dd9f4330e0fd304","name":"MM Token","symbol":"MM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13302/thumb/MM.jpg?1607315862"},{"chainId":1,"address":"0xa2b4c0af19cc16a6cfacce81f192b024d625817d","name":"Kishu Inu","symbol":"KISHU","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/14890/thumb/uVLzCoP.png?1622445866"},{"chainId":1,"address":"0xc237868a9c5729bdf3173dddacaa336a0a5bb6e0","name":"Wagerr","symbol":"WGR","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/759/thumb/syGKmAT.png?1619597241"},{"chainId":1,"address":"0x43e577338d6c07bc92a06c8ca4b781470515dfa8","name":"Oblichain","symbol":"OBC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17016/thumb/1589894107133.png?1626076795"},{"chainId":1,"address":"0xb119ce94d098c18fe380904c24e358bd887f00be","name":"MACH Project","symbol":"MACH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12898/thumb/Mach_token.png?1603337098"},{"chainId":1,"address":"0xe35f19e4457a114a951781aaf421ec5266ef25fe","name":"Vidiachange","symbol":"VIDA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14346/thumb/vidia.png?1615504632"},{"chainId":1,"address":"0x382f0160c24f5c515a19f155bac14d479433a407","name":"KleeKai","symbol":"KLEE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15548/thumb/klee200x200.png?1622439746"},{"chainId":1,"address":"0xb16e967ff83de3f1e9fceafbc2c28c1c5c56ef91","name":"Polkadog","symbol":"PDOG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16343/thumb/pdog-200x200.png?1623769750"},{"chainId":1,"address":"0x55a290f08bb4cae8dcf1ea5635a3fcfd4da60456","name":"BITTO","symbol":"BITTO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2814/thumb/BITTO.jpg?1547036986"},{"chainId":1,"address":"0x64ea2c6104f1cf3035e28be0f781b6286d50934d","name":"Satoshivision Coin","symbol":"SVC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11150/thumb/coingecko-Logo.png?1595311196"},{"chainId":1,"address":"0xf30547ff2df1f1cbe5c8dd758b3dd098c856e38f","name":"RAI Finance","symbol":"RAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14686/thumb/RAI_Finance.jpg?1617778423"},{"chainId":1,"address":"0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0","name":"Polygon","symbol":"MATIC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4713/thumb/matic-token-icon.png?1624446912"},{"chainId":1,"address":"0x741857c07b100c9c0c1272d95845dddc4f1b67cb","name":"RealT Token 8342 ","symbol":"REALTOKEN-S-8342-SC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16700/thumb/Schaefer-1.jpeg?1624642033"},{"chainId":1,"address":"0x5acd19b9c91e596b1f062f18e3d02da7ed8d1e50","name":"BTC Lite","symbol":"BTCL","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/3569/thumb/4umbZipg_400x400.jpg?1547038416"},{"chainId":1,"address":"0x2fe39f22eac6d3c1c86dd9d143640ebb94609fce","name":"JD Coin","symbol":"JDC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9958/thumb/Cv-2ca6p_400x400.jpg?1575926305"},{"chainId":1,"address":"0x970b596ea3cb9864397f799902f0a579cdc3377b","name":"Morph Tracker","symbol":"MORT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13610/thumb/0PAc0nMs_400x400.png?1611734232"},{"chainId":1,"address":"0x1212b68d8555cf0b08f3371b926b3e1148b520f1","name":"Efficient Transacti","symbol":"ETT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9110/thumb/9bb9b46b4070efdf9713194ed98b4ec7.png?1564434751"},{"chainId":1,"address":"0xf151980e7a781481709e8195744bf2399fb3cba4","name":"Freeway Token","symbol":"FWT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13012/thumb/A-200px.png?1604381296"},{"chainId":1,"address":"0xc14103c2141e842e228fbac594579e798616ce7a","name":"sLTC","symbol":"SLTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10458/thumb/sLTC.png?1616150389"},{"chainId":1,"address":"0x960efd63ae895f165d874e6cc62501fd0e7dc50a","name":"3X Short Stellar To","symbol":"XLMBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13335/thumb/assets_coingecko_com-ftt.jpg?1607567062"},{"chainId":1,"address":"0x8fa025e8342ead1037d2954b95333ff2bf57162b","name":"ShibaMax","symbol":"SMAX","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16218/thumb/ShibaMax.png?1623652199"},{"chainId":1,"address":"0xf8ed6c51762208ff26f8f3e4efd4e06af2da649c","name":"Alldex Alliance","symbol":"AXA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9438/thumb/alldex.png?1569122383"},{"chainId":1,"address":"0xb5fe099475d3030dde498c3bb6f3854f762a48ad","name":"Fnk com","symbol":"FNK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13483/thumb/fnk.png?1609039834"},{"chainId":1,"address":"0x018fb5af9d015af25592a014c4266a84143de7a0","name":"MP3","symbol":"MP3","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13897/thumb/1_sq13-ssNvv2APEFcy8dWJg.png?1612690862"},{"chainId":1,"address":"0x0aef06dcccc531e581f0440059e6ffcc206039ee","name":"Intelligent Trading","symbol":"ITT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1064/thumb/itt.jpg?1547035010"},{"chainId":1,"address":"0x05385abd2a95a8cd9b696f738aed73f1afbc12e0","name":"Fompound","symbol":"FOMP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13325/thumb/logo_%2829%29.png?1607482203"},{"chainId":1,"address":"0xa10740ff9ff6852eac84cdcff9184e1d6d27c057","name":"Wrapped Gen 0 Crypt","symbol":"WG0","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12870/thumb/wg0_logo.png?1603176705"},{"chainId":1,"address":"0x5ca9a71b1d01849c0a95490cc00559717fcf0d1d","name":"Aeternity","symbol":"AE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1091/thumb/aeternity.png?1547035060"},{"chainId":1,"address":"0x056354f3ff20743aa4c0da365603871c7000b081","name":"TriumphX","symbol":"TRIX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12270/thumb/TRIX_Logo_transparent.png?1598619314"},{"chainId":1,"address":"0x72b2b8e42a10d785abf85f3044223db8c9167bd6","name":"Atlantic Coin","symbol":"ATC","decimals":10,"logoURI":"https://assets.coingecko.com/coins/images/9151/thumb/atc.PNG?1564732934"},{"chainId":1,"address":"0xf9c36c7ad7fa0f0862589c919830268d1a2581a1","name":"BOA","symbol":"BOA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12251/thumb/5f4336749313bc77f88e3927_the-ouroboros-or-uroborus-english-school-p-500.jpeg?1598515550"},{"chainId":1,"address":"0x38acefad338b870373fb8c810fe705569e1c7225","name":"Yearn4 Finance","symbol":"YF4","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12683/thumb/yearn4logo.png?1601621780"},{"chainId":1,"address":"0x72630b1e3b42874bf335020ba0249e3e9e47bafc","name":"Paypolitan Token","symbol":"EPAN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13192/thumb/ava3.png?1606102032"},{"chainId":1,"address":"0x1a3564852d8ede7c8249805e71718bd7aa93dd6d","name":"X power Chain","symbol":"XPO","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/9735/thumb/r4ahvyuo_400x400.jpg?1571309103"},{"chainId":1,"address":"0x328c4c80bc7aca0834db37e6600a6c49e12da4de","name":"Aave SNX v1","symbol":"ASNX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11733/thumb/aSNX.png?1593085047"},{"chainId":1,"address":"0x8400d94a5cb0fa0d041a3788e395285d61c9ee5e","name":"Unibright","symbol":"UBT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/2707/thumb/UnibrightLogo_colorful_500x500_preview.png?1547036916"},{"chainId":1,"address":"0x22ef3753e3658e81d5a0d0889ce078178fe66595","name":"SHENG","symbol":"SHENG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11753/thumb/2xA1KJr6_400x400.png?1593420277"},{"chainId":1,"address":"0xd3fb5cabd07c85395667f83d20b080642bde66c7","name":"Ammbr","symbol":"AMR","decimals":16,"logoURI":"https://assets.coingecko.com/coins/images/2100/thumb/ammbr.png?1547036418"},{"chainId":1,"address":"0x307d45afbb7e84f82ef3d251a6bb0f00edf632e4","name":"PLANET","symbol":"PLA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9279/thumb/LOGO_BLACK.png?1565731302"},{"chainId":1,"address":"0x3e65e1eefde5ea7ccfc9a9a1634abe90f32262f8","name":"BaaSid","symbol":"BAAS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5463/thumb/baasid.png?1547041199"},{"chainId":1,"address":"0xf6dbe88ba55f1793ff0773c9b1275300f830914f","name":"Asian Dragon","symbol":"AD","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8100/thumb/zUrjsX2s.png?1554775662"},{"chainId":1,"address":"0x875353da48c4f9627c4d0b8b8c37b162fc43ce67","name":"Digipharm","symbol":"DPH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9052/thumb/R4XzLI-a_400x400.jpg?1563910390"},{"chainId":1,"address":"0x9ba60ba98413a60db4c651d4afe5c937bbd8044b","name":"Yearn Lazy Ape","symbol":"YLA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14447/thumb/yla.png?1616128042"},{"chainId":1,"address":"0x72a56f7bbee939a8c441c891e1754bb795ee0b21","name":"Crown Finance","symbol":"CRWN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13791/thumb/crown256.png?1611785271"},{"chainId":1,"address":"0x02f3a1819851d127bcd6f468253d7a498567eee0","name":"Gasify","symbol":"GSFY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14100/thumb/logo.png?1614305756"},{"chainId":1,"address":"0xee059f0ca1507e4e20c689b20cff71b5e924f7bd","name":"Litecoin SV","symbol":"LSV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11100/thumb/1GyOsGG.png?1588749283"},{"chainId":1,"address":"0x5136c98a80811c3f46bdda8b5c4555cfd9f812f0","name":"indaHash","symbol":"IDH","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/1909/thumb/indahash.png?1547973902"},{"chainId":1,"address":"0x649ebf73043ffcc70a59855ecd8a568fd996415a","name":"YFIII","symbol":"YFIII","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13030/thumb/LOGO-200-X200.png?1604474135"},{"chainId":1,"address":"0x6020da0f7c1857dbe4431ec92a15cc318d933eaa","name":"En Tan Mo","symbol":"ETM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8652/thumb/En-tan-mo.jpg?1560148966"},{"chainId":1,"address":"0xae9cbe6ebf72a51c9fcea3830485614486318fd4","name":"Newtonium","symbol":"NEWTON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12273/thumb/newton.jpg?1598689904"},{"chainId":1,"address":"0xfef4185594457050cc9c23980d301908fe057bb1","name":"VIDT Datalink","symbol":"VIDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6115/thumb/V-ID_blockchain_-logo.png?1547042127"},{"chainId":1,"address":"0xe944f2b46fcfc9d0e887bbeaad95268d9416d0fd","name":"BERRY Vault NFTX ","symbol":"BERRY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17038/thumb/BERRY.png?1626146080"},{"chainId":1,"address":"0xe912b8ba2513d7e29b7b2e5b14398dbf77503fb4","name":"InventoryClub","symbol":"VNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14410/thumb/_SWCTiTC_400x400.png?1615946356"},{"chainId":1,"address":"0x1ccaa0f2a7210d76e1fdec740d5f323e2e1b1672","name":"Faceter","symbol":"FACE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4383/thumb/faceter-logo.png?1547039727"},{"chainId":1,"address":"0x930ed81ad809603baf727117385d01f04354612e","name":"Solarite","symbol":"SOLARITE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12430/thumb/solarite_logo.jpg?1599785957"},{"chainId":1,"address":"0x56d811088235f11c8920698a204a5010a788f4b3","name":"bZx Protocol","symbol":"BZRX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11811/thumb/bzrx.png?1594563172"},{"chainId":1,"address":"0x0789dbae94fb18e5789b8e4489bcb7a1adb58622","name":"FISCO Coin","symbol":"FSCC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6507/thumb/AnyConv.com__fscc_icon_fin.png?1608779052"},{"chainId":1,"address":"0xcf9c692f7e62af3c571d4173fd4abf9a3e5330d0","name":"Onigiri","symbol":"ONIGIRI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12699/thumb/onigiri-coingecko.png?1601857724"},{"chainId":1,"address":"0x63aa9d05c025279f8e963ba784f1254814c1e12b","name":"SBLAND Vault NFTX ","symbol":"SBLAND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17059/thumb/SBLAND.png?1626150303"},{"chainId":1,"address":"0x36ac219f90f5a6a3c77f2a7b660e3cc701f68e25","name":"CoinMetro","symbol":"XCM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3125/thumb/xcm.png?1547037518"},{"chainId":1,"address":"0x280e9ed3b20c580a2f4219657bb9332d80bc01f1","name":"RealT Token 19020","symbol":"REALTOKEN-S-19020-R","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16705/thumb/19020-Rosemont-hero-1.jpeg?1624644549"},{"chainId":1,"address":"0x4b4571925e94ccd8c546b39462a270cc9b3ed1e4","name":"Wrapped Shift","symbol":"WSHIFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15926/thumb/Wshift.png?1622434604"},{"chainId":1,"address":"0xb2c62e0a1f5837356e399359ecc34fcc49a02093","name":"KAMAX Vault NFTX ","symbol":"KAMAX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17079/thumb/KAMAX.png?1626154307"},{"chainId":1,"address":"0xc22b30e4cce6b78aaaadae91e44e73593929a3e9","name":"RAC","symbol":"RAC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12675/thumb/rac_logo_%281%29.jpg?1601526417"},{"chainId":1,"address":"0x989ac4c1fc5ab2b8c86924c6253aaf1ee68e9ce9","name":"Prime Finance","symbol":"PFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13580/thumb/hasanah.jpg?1609915358"},{"chainId":1,"address":"0x4270bb238f6dd8b1c3ca01f96ca65b2647c06d3c","name":"Fortuna","symbol":"FOTA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2689/thumb/fortuna.png?1547483931"},{"chainId":1,"address":"0x326caf6980d4e9161cfb3c55f195b3d825c266d4","name":"BullionsChain","symbol":"BLC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12674/thumb/transparent1.png?1601523923"},{"chainId":1,"address":"0xfe18be6b3bd88a2d2a7f928d00292e7a9963cfc6","name":"sBTC","symbol":"SBTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8838/thumb/sBTC.png?1616149734"},{"chainId":1,"address":"0x4946fcea7c692606e8908002e55a582af44ac121","name":"FOAM","symbol":"FOAM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3345/thumb/K51lJQc.png?1547037959"},{"chainId":1,"address":"0xd49ff13661451313ca1553fd6954bd1d9b6e02b9","name":"Electrify Asia","symbol":"ELEC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3415/thumb/d45b1d82743c749d05697da200179874.jpg?1547038096"},{"chainId":1,"address":"0xb83cd8d39462b761bb0092437d38b37812dd80a2","name":"Golden Ratio Token","symbol":"GRT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11022/thumb/golden_ratio_token.png?1592811112"},{"chainId":1,"address":"0x59a921db27dd6d4d974745b7ffc5c33932653442","name":"Mirrored Google","symbol":"MGOOGL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13641/thumb/mirror_logo_transparent.png?1611565240"},{"chainId":1,"address":"0x3a810ff7211b40c4fa76205a14efe161615d0385","name":"AI Network","symbol":"AIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13211/thumb/AI_Network_Logo_200x200.png?1606205615"},{"chainId":1,"address":"0x8fc9b6354e839ab1c8b31f4afa53607092b8c2e5","name":"ECOSC","symbol":"ECU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10989/thumb/ecosc-logo.png?1586914826"},{"chainId":1,"address":"0x429881672b9ae42b8eba0e26cd9c73711b891ca5","name":"Pickle Finance","symbol":"PICKLE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12435/thumb/pickle_finance_logo.jpg?1599817746"},{"chainId":1,"address":"0x825130aa1beef07bdf4f389705321816d05b0d0f","name":"UNII Finance","symbol":"UNII","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12604/thumb/P3KzPgJ9_400x400.jpg?1601013005"},{"chainId":1,"address":"0x0fdc5313333533cc0c00c22792bff7383d3055f2","name":"YFPRO Finance","symbol":"YFPRO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12712/thumb/STOV7niY_400x400.png?1602630888"},{"chainId":1,"address":"0x3154da898943fc7151bc77f16e43c0c47b5e452d","name":"STB Chain","symbol":"STB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7458/thumb/QUezGZyH_400x400.jpg?1547546575"},{"chainId":1,"address":"0xb5d30c28f87acf675ed5b9f343e5fff39ec9942c","name":"RealT Token 10024 ","symbol":"REALTOKEN-S-10024-1","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16639/thumb/appoline-hero.jpeg?1624559019"},{"chainId":1,"address":"0x5c4ac68aac56ebe098d621cd8ce9f43270aaa355","name":"bXIOT","symbol":"BXIOT","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/12466/thumb/bxiot_logo_512x512.png?1601775151"},{"chainId":1,"address":"0x9a1997c130f4b2997166975d9aff92797d5134c2","name":"Bond Appetite USD","symbol":"USDAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14874/thumb/USDap_%281%29.png?1618822197"},{"chainId":1,"address":"0x31274db8b609df99e5988ee527071643b5160fc3","name":"Business Credit Sub","symbol":"BCS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9638/thumb/iq6AaVX8F_EvdI7nkgGPKL4P1ON70Zpu4JoIYpXK5RTMtGKATJVC0HAwWtddy2Yiw6fNkj7ElLSRkziKEHYsjvLdCZzWelJEzbToEKHgOejWXlHFsc-Ssqz3iiHenhYI8QzUhqYTp-rKa7DoCKPASlN2cO1JMFMAzqCPwHpYToIfYP4_KsVeE1u-FcHsVNNSQ9Zy5nbl7MnLb8O0G.jpg?1570077863"},{"chainId":1,"address":"0x720c2c93f5f9a6b82226e84095558b10f399b0fa","name":"Gric Coin","symbol":"GC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7144/thumb/gric.png?1576037693"},{"chainId":1,"address":"0x4375e7ad8a01b8ec3ed041399f62d9cd120e0063","name":"BitZ Token","symbol":"BZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4774/thumb/BitZ.?1613974566"},{"chainId":1,"address":"0x59c033ec65e6b9c501c1ee34fb42f2575da4b517","name":"Betherchip","symbol":"BEC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12447/thumb/icone-bth-preta.jpg?1599903494"},{"chainId":1,"address":"0xc4a86561cb0b7ea1214904f26e6d50fd357c7986","name":"Charg Coin","symbol":"CHG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2159/thumb/charg-coin.png?1547036459"},{"chainId":1,"address":"0x78a8c84b4c23563be4518e7045016d3170130823","name":"3X Short Zcash Toke","symbol":"ZECBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16560/thumb/FTX_LOGO.png?1624453448"},{"chainId":1,"address":"0xa6b9d7e3d76cf23549293fb22c488e0ea591a44e","name":"uGAS JUN21 Token Ex","symbol":"UGAS-JUN21","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14439/thumb/uGAS_Logo_200x200.png?1616064129"},{"chainId":1,"address":"0x68350d30d9f58c81aaaa41929f1bfc52fff4ea49","name":"Rapidz","symbol":"RPZX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7663/thumb/rapidzpay-logo.jpg?1549038850"},{"chainId":1,"address":"0xf4134146af2d511dd5ea8cdb1c4ac88c57d60404","name":"SunContract","symbol":"SNC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1166/thumb/suncontract.png?1548611174"},{"chainId":1,"address":"0x833e4c02c47b7e38f5b9a80b26eb07d23d1961f4","name":"The Bitcoin Family","symbol":"FAMILY","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/13776/thumb/the_bitcoin_family.png?1611712529"},{"chainId":1,"address":"0x8fb6c8a44a4e23fd1f5a936818b39083b4cdc865","name":"BitOnyx Token","symbol":"BTNYX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13684/thumb/token-logo-200px.png?1610860892"},{"chainId":1,"address":"0x0e99cc0535bb6251f6679fa6e65d6d3b430e840b","name":"Mirrored Facebook","symbol":"MFB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14020/thumb/mirror_logo_transparent.png?1613718368"},{"chainId":1,"address":"0xb8e103b60a33597136ea9511f46b6dbeb643a3a5","name":"SiamBitcoin","symbol":"SBTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7089/thumb/image-62DF_5C05991C.jpg?1547043573"},{"chainId":1,"address":"0x8bb95734f5011088fd228c8060b3e02ca53e3c0d","name":"Candy Box","symbol":"CANDYBOX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9594/thumb/tIVXxlNp_400x400.jpg?1569279181"},{"chainId":1,"address":"0xe7f4c89032a2488d327323548ab0459676269331","name":"WAIFU Vault NFTX ","symbol":"WAIFU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17045/thumb/waifu.png?1626147639"},{"chainId":1,"address":"0x159a1dfae19057de57dfffcbb3da1ae784678965","name":"Reflex","symbol":"RFX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12745/thumb/2MKGMRCT_400x400.png?1602194456"},{"chainId":1,"address":"0xe95990825aab1a7f0af4cc648f76a3bcc99f25b2","name":"Zenswap Network Tok","symbol":"ZNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6452/thumb/3CGDn4e.png?1547042648"},{"chainId":1,"address":"0x75d12e4f91df721fafcae4c6cd1d5280381370ac","name":"My bu","symbol":"MYOBU","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16122/thumb/myobu.png?1623037167"},{"chainId":1,"address":"0x04abeda201850ac0124161f037efd70c74ddc74c","name":"Nest Protocol","symbol":"NEST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11284/thumb/52954052.png?1589868539"},{"chainId":1,"address":"0x26a604dffe3ddab3bee816097f81d3c4a2a4cf97","name":"CorionX","symbol":"CORX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13129/thumb/x_log.png?1605515405"},{"chainId":1,"address":"0x6393e822874728f8afa7e1c9944e417d37ca5878","name":"Cryptoindex com 100","symbol":"CIX100","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6106/thumb/cix.png?1563780642"},{"chainId":1,"address":"0x6810e776880c02933d47db1b9fc05908e5386b96","name":"Gnosis","symbol":"GNO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/662/thumb/logo_square_simple_300px.png?1609402668"},{"chainId":1,"address":"0xaf5db2cc35ef9bba3cfa5f8faeedcf9b4e2f286f","name":"Voltium","symbol":"VLTM","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/15349/thumb/voltm.PNG?1620625153"},{"chainId":1,"address":"0x7c974104df9dd7fb91205ab3d66d15aff1049de8","name":"Wrapped USD","symbol":"WUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14691/thumb/StableLogo.png?1617808927"},{"chainId":1,"address":"0x0cae9e4d663793c2a2a0b211c1cf4bbca2b9caa7","name":"Mirrored Amazon","symbol":"MAMZN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13646/thumb/mirror_logo_transparent.png?1611565645"},{"chainId":1,"address":"0x2ec95b8eda549b79a1248335a39d299d00ed314c","name":"Fatcoin","symbol":"FAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7109/thumb/SV2Xb94q_400x400.jpg?1547043605"},{"chainId":1,"address":"0x81705082ef9f0d660f07be80093d46d826d48b25","name":"Globalvillage Ecosy","symbol":"GVE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5288/thumb/globalvillage-ecosystem.png?1548127334"},{"chainId":1,"address":"0xb97d5cf2864fb0d08b34a484ff48d5492b2324a0","name":"Klondike Finance v1","symbol":"KLON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13787/thumb/klondike.jpg?1611759069"},{"chainId":1,"address":"0x08037036451c768465369431da5c671ad9b37dbc","name":"NFT Stars","symbol":"NFTS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16141/thumb/j2KHi8zR_400x400.png?1623116004"},{"chainId":1,"address":"0xa957045a12d270e2ee0dca9a3340c340e05d4670","name":"AIDUS Token","symbol":"AIDUS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7432/thumb/LKOt-PQ6_400x400.jpg?1571193797"},{"chainId":1,"address":"0xf3281c539716a08c754ec4c8f2b4cee0fab64bb9","name":"Markaccy","symbol":"MKCY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12522/thumb/e2eLPzTF_400x400.png?1600499534"},{"chainId":1,"address":"0x0371a82e4a9d0a4312f3ee2ac9c6958512891372","name":"bitJob","symbol":"STU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1172/thumb/bitjob.jpg?1547035202"},{"chainId":1,"address":"0xf04a8ac553fcedb5ba99a64799155826c136b0be","name":"Flixxo","symbol":"FLIXX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1261/thumb/flixxo.png?1547483809"},{"chainId":1,"address":"0x96184d9c811ea0624fc30c80233b1d749b9e485b","name":"Dapp com","symbol":"DAPPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8282/thumb/dappt_logo.png?1593074788"},{"chainId":1,"address":"0x34d6a0f5c2f5d0082141fe73d93b9dd00ca7ce11","name":"Golden Token","symbol":"GOLD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8939/thumb/4uf1Sim9_400x400.png?1563116366"},{"chainId":1,"address":"0x400b5716b0c23b6f1f0f2a5fdb038949962b803e","name":"RealT Token 3432 ","symbol":"REALTOKEN-S-3432-HA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16694/thumb/Hardy_front.jpeg?1624639158"},{"chainId":1,"address":"0x0168703872fa06741ecaa9dff7803168e83f7ae0","name":"Mirocana","symbol":"MIRO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1651/thumb/mirocana.jpg?1547035896"},{"chainId":1,"address":"0x83e2be8d114f9661221384b3a50d24b96a5653f5","name":"0xcert","symbol":"ZXC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4552/thumb/0xcert.png?1547039841"},{"chainId":1,"address":"0x3cbf23c081faa5419810ce0f6bc1ecb73006d848","name":"Digible","symbol":"DIGI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14960/thumb/RE3Fiua.png?1619148839"},{"chainId":1,"address":"0x87c00817abe35ed4c093e59043fae488238d2f74","name":"Yoink","symbol":"YNK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12639/thumb/yoin_logo.png?1601368710"},{"chainId":1,"address":"0x4efe8665e564bf454ccf5c90ee16817f7485d5cf","name":"BlackDragon Token","symbol":"BDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13426/thumb/Black-Dragon-Black.png?1608515220"},{"chainId":1,"address":"0x1e3a2446c729d34373b87fd2c9cbb39a93198658","name":"DeFi Nation Signals","symbol":"DSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11898/thumb/iLgw2f82_400x400.png?1596078737"},{"chainId":1,"address":"0x69d9905b2e5f6f5433212b7f3c954433f23c1572","name":"Onooks","symbol":"OOKS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16281/thumb/onooks-logo.png?1623637635"},{"chainId":1,"address":"0xb62132e35a6c13ee1ee0f84dc5d40bad8d815206","name":"NEXO","symbol":"NEXO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3695/thumb/nexo.png?1548086057"},{"chainId":1,"address":"0x81f8f0bb1cb2a06649e51913a151f0e7ef6fa321","name":"VitaDAO","symbol":"VITA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16580/thumb/QmRjwywiAfpzSfQTuWM3zCTghSHN7G6ohQaar7Ht6WANUp.png?1624506420"},{"chainId":1,"address":"0x62947ff43626ea26427be5ae4c7dd03b4f1ca872","name":"Neo Holistic Coin","symbol":"NHC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/14596/thumb/nhc.png?1617173747"},{"chainId":1,"address":"0x042afd3869a47e2d5d42cc787d5c9e19df32185f","name":"Hotpot Base Token","symbol":"POT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12580/thumb/hotpot.f49fb832.png?1600916677"},{"chainId":1,"address":"0x35f6b052c598d933d69a4eec4d04c73a191fe6c2","name":"Aave SNX","symbol":"ASNX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14265/thumb/aSNX.3238f3e7.png?1615528264"},{"chainId":1,"address":"0x3449fc1cd036255ba1eb19d65ff4ba2b8903a69a","name":"Basis Cash","symbol":"BAC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13246/thumb/BAC.png?1613231642"},{"chainId":1,"address":"0x14dfa5cfaafe89d81d7bf3df4e11eaeda0416618","name":"Cops Finance","symbol":"COPS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14984/thumb/inQIYqOm_400x400.jpg?1619250680"},{"chainId":1,"address":"0x147e3d644d53adadd18a28201b91e2b98aeb7f94","name":"ElenaUSD","symbol":"USE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15041/thumb/use.168dccf0.png?1619510682"},{"chainId":1,"address":"0x98d8d146e644171cd47ff8588987b7bdeef72a87","name":"Blockchain Exchange","symbol":"BXA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7842/thumb/images.png?1551144999"},{"chainId":1,"address":"0x56e0b2c7694e6e10391e870774daa45cf6583486","name":"DUO Network","symbol":"DUO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4653/thumb/Duo_Network.png?1556593318"},{"chainId":1,"address":"0x049399a6b048d52971f7d122ae21a1532722285f","name":"Fire Lotto","symbol":"FLOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2201/thumb/fire-lotto.png?1548126078"},{"chainId":1,"address":"0xf0fe1a87abf12099b77352bdcc10f5a87067b290","name":"BONSAI Vault NFTX ","symbol":"BONSAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17054/thumb/bonsai.png?1626149555"},{"chainId":1,"address":"0x42b387cdf0951a0e08336d35651544c47cd05c95","name":"RealT Token 10974","symbol":"REALTOKEN-S-10974-W","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16688/thumb/Worden-hero-site.jpeg?1624635525"},{"chainId":1,"address":"0xd043f70ff0634167db1149b15e5668f5be52d72c","name":"BigCash","symbol":"BGC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14158/thumb/WHITELOGO.png?1614686463"},{"chainId":1,"address":"0x7a647637e75d34a7798ba06bd1adf5c084bb5dd5","name":"Bestay","symbol":"BSY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12166/thumb/photo-2019-07-04-17-03-29.jpg?1597787199"},{"chainId":1,"address":"0xba7b2c094c1a4757f9534a37d296a3bed7f544dc","name":"HLand Token","symbol":"HLAND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13385/thumb/HLAND_LOGO.png?1608085636"},{"chainId":1,"address":"0x78c292d1445e6b9558bf42e8bc369271ded062ea","name":"CyberMusic","symbol":"CYMT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6039/thumb/cybermusic.png?1547791125"},{"chainId":1,"address":"0xf576ff0d7e4c1e8f27dbd50321e95e36a965985f","name":"Apiary Fund Coin","symbol":"AFC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12878/thumb/Untitled-design_%281%29.png?1603248485"},{"chainId":1,"address":"0x1a7a8bd9106f2b8d977e08582dc7d24c723ab0db","name":"AppCoins","symbol":"APPC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1876/thumb/appcoins.png?1547036186"},{"chainId":1,"address":"0x340d2bde5eb28c1eed91b2f790723e3b160613b7","name":"BLOCKv","symbol":"VEE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1266/thumb/blockv.png?1547351380"},{"chainId":1,"address":"0x6767615a97a8204298bbac44c57ef1a615eed244","name":"Cribnb","symbol":"CRB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15775/thumb/11111.png?1621835123"},{"chainId":1,"address":"0x8185bc4757572da2a610f887561c32298f1a5748","name":"Aluna","symbol":"ALN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14379/thumb/ALN-token-logo-200px.png?1615778759"},{"chainId":1,"address":"0xf293d23bf2cdc05411ca0eddd588eb1977e8dcd4","name":"Sylo","symbol":"SYLO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6430/thumb/SYLO.svg?1589527756"},{"chainId":1,"address":"0xc6c6224cf32f5b0850ddf740b47cd1ed31abead4","name":"KUPP","symbol":"KUPP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/14705/thumb/kupp_icon.png?1617859709"},{"chainId":1,"address":"0x608f006b6813f97097372d0d31fb0f11d1ca3e4e","name":"CryptoAds Marketpla","symbol":"CRAD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3761/thumb/crad.png?1547038854"},{"chainId":1,"address":"0x270371c58d9d775ed73971dd414656107384f235","name":"BTA Protocol","symbol":"BTAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14467/thumb/coingecko200x200.png?1616378590"},{"chainId":1,"address":"0x048fe49be32adfc9ed68c37d32b5ec9df17b3603","name":"Skrumble Network","symbol":"SKM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3826/thumb/skrumble-network.png?1548609513"},{"chainId":1,"address":"0xa3e7833775a9cc022db2c72eb900378f90ce89b4","name":"Malamute Finance","symbol":"MALLY","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15557/thumb/malamutefinance-logo-250x250.png?1622647033"},{"chainId":1,"address":"0x59e7b5db9be0bdd26fa048d39e01fee456ab674e","name":"Yearn Finance Bit2","symbol":"YFB2","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13064/thumb/yfb2_logo.png?1604884273"},{"chainId":1,"address":"0xe3f4b4a5d91e5cb9435b947f090a319737036312","name":"Popchain","symbol":"PCH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4533/thumb/popchain-logo.png?1547039828"},{"chainId":1,"address":"0x33e07f5055173cf8febede8b21b12d1e2b523205","name":"Etherland","symbol":"ELAND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14432/thumb/eland.png?1616044253"},{"chainId":1,"address":"0xb8366948b4a3f07bcbf14eb1739daa42a26b07c4","name":"VALOBIT","symbol":"VBIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12394/thumb/Untitled-design-3.png?1599550715"},{"chainId":1,"address":"0xf2cee90309418353a57717eca26c4f8754f0d84e","name":"BitcoinBrand","symbol":"BTCB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6607/thumb/y76xcDSr_400x400.jpg?1547042811"},{"chainId":1,"address":"0x63f88a2298a5c4aee3c216aa6d926b184a4b2437","name":"GameCredits","symbol":"GAME","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/193/thumb/XlQmXoU.png?1595304945"},{"chainId":1,"address":"0x469e66e06fec34839e5eb1273ba85a119b8d702f","name":"Degov","symbol":"DEGOV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13215/thumb/degov.png?1606277121"},{"chainId":1,"address":"0xd6f7db7db116170ecb1c3b35f12c1e693ba70586","name":"CARD Vault NFTX ","symbol":"CARD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17056/thumb/EtherCards.png?1626149572"},{"chainId":1,"address":"0xcb94be6f13a1182e4a4b6140cb7bf2025d28e41b","name":"WeTrust","symbol":"TRST","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/645/thumb/wetrust.png?1547034370"},{"chainId":1,"address":"0xa6e7dc135bdf4b3fee7183eab2e87c0bb9684783","name":"BIGOCOIN","symbol":"BIGO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10564/thumb/Bigocoin_1200px.jpg?1597463586"},{"chainId":1,"address":"0xf9e3a323957b172fdb2dd89c30bbda980cfac395","name":"AstroLion","symbol":"ASTROLION","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16856/thumb/IMG_20210713_233244_184.jpg?1626334235"},{"chainId":1,"address":"0xe1aee98495365fc179699c1bb3e761fa716bee62","name":"Bezant","symbol":"BZNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3825/thumb/bezant.png?1546240528"},{"chainId":1,"address":"0x11003e410ca3fcd220765b3d2f343433a0b2bffd","name":"Farming Bad","symbol":"METH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13933/thumb/meth.png?1612941488"},{"chainId":1,"address":"0x5635ddeabf9cdda686995fe90beb5411831563fc","name":"TravelNote","symbol":"TVNT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7051/thumb/omwKldFY_400x400.jpg?1547043503"},{"chainId":1,"address":"0xfffffffff15abf397da76f1dcc1a1604f45126db","name":"Falconswap","symbol":"FSW","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12256/thumb/falconswap.png?1598534184"},{"chainId":1,"address":"0x884181554dfa9e578d36379919c05c25dc4a15bb","name":"Gene Source Code To","symbol":"GENE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5283/thumb/Gene_Source_Code_Token_Logo.jpg?1547040798"},{"chainId":1,"address":"0x33e18a092a93ff21ad04746c7da12e35d34dc7c4","name":"Metaverse NFT Index","symbol":"PLAY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14590/thumb/PLAY.png?1618308275"},{"chainId":1,"address":"0xa2ef2757d2ed560c9e3758d1946d7bcccbd5a7fe","name":"Adventure Token","symbol":"TWA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13284/thumb/twa_logo.jpg?1606979012"},{"chainId":1,"address":"0xa9fbb83a2689f4ff86339a4b96874d718673b627","name":"FireAnts","symbol":"ANTS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11179/thumb/ants200.png?1589510693"},{"chainId":1,"address":"0xcb4e8cafeda995da5cedfda5205bd5664a12b848","name":"Shabu Shabu","symbol":"KOBE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13577/thumb/shabu_shabu_logo.jpg?1609901993"},{"chainId":1,"address":"0xc06aec5191be16b94ffc97b6fc01393527367365","name":"BTC ETH Equal Weigh","symbol":"BTCETH5050","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10606/thumb/btc_buy_and_hold.png?1580970605"},{"chainId":1,"address":"0xf7e04d8a32229b4ca63aa51eea9979c7287fea48","name":"Beowulf","symbol":"BWF","decimals":5,"logoURI":"https://assets.coingecko.com/coins/images/12586/thumb/BWF.png?1600932145"},{"chainId":1,"address":"0x05d3606d5c81eb9b7b18530995ec9b29da05faba","name":"TomoChain ERC 20","symbol":"TOMOE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12646/thumb/tomoe_logo.png?1601377449"},{"chainId":1,"address":"0xd714d91a169127e11d8fab3665d72e8b7ef9dbe2","name":"BlackHole Protocol","symbol":"BLACK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15124/thumb/blackhole.PNG?1620094580"},{"chainId":1,"address":"0x92ec47df1aa167806dfa4916d9cfb99da6953b8f","name":"Idavoll Network","symbol":"IDV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14229/thumb/71922199.png?1615169236"},{"chainId":1,"address":"0xc3b5284b2c0cfa1871a6ac63b6d6ee43c08bdc79","name":"BGAN Vault NFTX ","symbol":"BGAN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17051/thumb/bgan.png?1626149084"},{"chainId":1,"address":"0xe09394f8ba642430ed448ca20f342ec7aa1ba2e1","name":"Fesschain","symbol":"FESS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8414/thumb/Zcn3Txzj_400x400.jpg?1590982136"},{"chainId":1,"address":"0x747f564d258612ec5c4e24742c5fd4110bcbe46b","name":"Nodeseeds","symbol":"NDS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14658/thumb/n1EiZLt.png?1618374330"},{"chainId":1,"address":"0xf07376f0e3bff57116ed62e5e8e2bb1341e4b4c2","name":"JoorsChain","symbol":"JIC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7128/thumb/H0kIwyNs_400x400.jpg?1547043626"},{"chainId":1,"address":"0x12b306fa98f4cbb8d4457fdff3a0a0a56f07ccdf","name":"Spectre ai Dividend","symbol":"SXDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2550/thumb/spectre-dividend.png?1547036667"},{"chainId":1,"address":"0xe225aca29524bb65fd82c79a9602f3b4f9c6fe3f","name":"Tratok","symbol":"TRAT","decimals":5,"logoURI":"https://assets.coingecko.com/coins/images/6791/thumb/tratok.png?1547043075"},{"chainId":1,"address":"0xf552b656022c218c26dad43ad88881fc04116f76","name":"MORK","symbol":"MORK","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/12183/thumb/mork-logo.png?1597941710"},{"chainId":1,"address":"0xe0bdaafd0aab238c55d68ad54e616305d4a21772","name":"Refract","symbol":"RFR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13394/thumb/refract_logo.png?1608108926"},{"chainId":1,"address":"0x9bbc9286cdf6eefebf21df19bac71c6bdd7759d4","name":"QUEENBEE","symbol":"QBZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10772/thumb/1nIgm-Ut_400x400.jpg?1583377902"},{"chainId":1,"address":"0x6c37bf4f042712c978a73e3fd56d1f5738dd7c43","name":"Elementeum","symbol":"ELET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2670/thumb/ELET.png?1558594342"},{"chainId":1,"address":"0xdfe66b14d37c77f4e9b180ceb433d1b164f0281d","name":"StakeHound Staked E","symbol":"STETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13752/thumb/926MHi5g_400x400.png?1611542247"},{"chainId":1,"address":"0x5b3f693efd5710106eb2eac839368364acb5a70f","name":"Relayer Network OL","symbol":"RLR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13306/thumb/relayer_logo.jpg?1607327132"},{"chainId":1,"address":"0x6fb0855c404e09c47c3fbca25f08d4e41f9f062f","name":"Aave ZRX v1","symbol":"AZRX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11735/thumb/aZRX.png?1593085371"},{"chainId":1,"address":"0xd8924385cd46e6af6f377871c732bde2f8e9dd18","name":"Pylon Network","symbol":"PYLNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2228/thumb/Pylon_simbolo_azul_%282%29.png?1623747111"},{"chainId":1,"address":"0xcef46305d096fa876dd23048bf80f9345282e3fc","name":"Banque Universal","symbol":"CBU","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/8112/thumb/png_tr.png?1554952499"},{"chainId":1,"address":"0x4981553e8ccf6df916b36a2d6b6f8fc567628a51","name":"Betnomi","symbol":"BNI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13329/thumb/betnomi.png?1607503078"},{"chainId":1,"address":"0x56b4f8c39e07d4d5d91692acf9d0f6d4d3493763","name":"Trism","symbol":"TRISM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13549/thumb/76106366.png?1609715454"},{"chainId":1,"address":"0x89fb927240750c1b15d4743cd58440fc5f14a11c","name":"Attila","symbol":"ATT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11337/thumb/LOGO_%2874%29.png?1589942265"},{"chainId":1,"address":"0x86c2752f8fe2c6679a942c8ee6c785c28f42cd55","name":"BitMinutes","symbol":"BMT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4144/thumb/IBrHqd09_400x400.jpg?1576040901"},{"chainId":1,"address":"0x02eca910cb3a7d43ebc7e8028652ed5c6b70259b","name":"Pteria","symbol":"PTERIA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12989/thumb/Pteria.png?1604105704"},{"chainId":1,"address":"0x8e30ea2329d95802fd804f4291220b0e2f579812","name":"Decentralized Vulne","symbol":"DVP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9424/thumb/4520.png?1568598223"},{"chainId":1,"address":"0x83d60e7aed59c6829fb251229061a55f35432c4d","name":"Infinito","symbol":"INFT","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/9461/thumb/5TOvk2A.png?1604885818"},{"chainId":1,"address":"0x0435316b3ab4b999856085c98c3b1ab21d85cd4d","name":"DeltaExCoin","symbol":"DLTX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9255/thumb/dltx200px.png?1565648813"},{"chainId":1,"address":"0xac4d22e40bf0b8ef4750a99ed4e935b99a42685e","name":"Aeryus","symbol":"AER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8626/thumb/aerlogo.png.jpeg?1559773242"},{"chainId":1,"address":"0x5547136b913b68881596275ace01e9a589c5b16b","name":"BITCOINHEDGE","symbol":"BTCHG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11617/thumb/BTCHG_logo.png?1600765418"},{"chainId":1,"address":"0x2578a20a07e8761d91d0961d3ea92e14510885aa","name":"COVIR","symbol":"CVR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12319/thumb/Auxy2Y7.png?1599093847"},{"chainId":1,"address":"0x8f6a193c8b3c949e1046f1547c3a3f0836944e4b","name":"xINCHa","symbol":"XINCHA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13799/thumb/xINCH.png?1611978456"},{"chainId":1,"address":"0x3810a4ddf41e586fa0dba1463a7951b748cecfca","name":"Menapay","symbol":"MPAY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6360/thumb/Menapay_ico.png?1547042454"},{"chainId":1,"address":"0x06141f60ee56c8ecc869f46568e2cb1e66baaf41","name":"24 Genesis Mooncats","symbol":"GMC24","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15438/thumb/mooncat.png?1625752139"},{"chainId":1,"address":"0xe1ba0fb44ccb0d11b80f92f4f8ed94ca3ff51d00","name":"Aave BAT v1","symbol":"ABAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11726/thumb/aBAT.png?1593086569"},{"chainId":1,"address":"0x6e742e29395cf5736c358538f0f1372ab3dfe731","name":"TAMA EGG NiftyGotch","symbol":"TME","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13229/thumb/photo_2021-01-25_09-16-29.jpg?1611537425"},{"chainId":1,"address":"0xdc5864ede28bd4405aa04d93e05a0531797d9d59","name":"Falcon Project","symbol":"FNT","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/11579/thumb/falcon_ava_black.png?1591317863"},{"chainId":1,"address":"0x3be6e7bf2cd8e1a0a95597e72ca6d3709bbeff76","name":"Demeter Chain","symbol":"DMTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9882/thumb/7QhVSU2R_400x400.jpg?1572941462"},{"chainId":1,"address":"0xa35fc5019c4dc509394bd4d74591a0bf8852c195","name":"BTC ETH 75 25 Wei","symbol":"BTCETH7525","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10593/thumb/btc_buy_and_hold.png?1580963533"},{"chainId":1,"address":"0x7e442206da059905050ba02be63cbb85c559eb04","name":"French ICO Coin","symbol":"FICO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12528/thumb/Icon-French-ICO.png?1600495093"},{"chainId":1,"address":"0x8052327f1baf94a9dc8b26b9100f211ee3774f54","name":"A2DAO","symbol":"ATD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14509/thumb/96YRRLDc_400x400.jpg?1616580742"},{"chainId":1,"address":"0x6d16cf3ec5f763d4d99cb0b0b110eefd93b11b56","name":"Synth sOIL","symbol":"SOIL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13837/thumb/sOIL.png?1616150562"},{"chainId":1,"address":"0x0b63128c40737b13647552e0c926bcfeccc35f93","name":"wLITI","symbol":"WLITI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16810/thumb/liticapital_real.png?1625151260"},{"chainId":1,"address":"0xe17e41acd4caa3cec048837bfd1918b3c4141767","name":"Ace Entertainment","symbol":"ACE","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/9702/thumb/97706665_104962101231887_1710817986622783488_n.png?1592815301"},{"chainId":1,"address":"0x88dafebb769311d7fbbeb9a21431fa026d4100d0","name":"Lux Expression","symbol":"LUX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15720/thumb/lux_logo.jpg?1621605302"},{"chainId":1,"address":"0x016ee7373248a80bde1fd6baa001311d233b3cfa","name":"3X Short Bitcoin To","symbol":"BEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9991/thumb/683JEXMN_400x400.png?1574418639"},{"chainId":1,"address":"0x9f801c1f02af03cc240546dadef8e56cd46ea2e9","name":"Vaiot","symbol":"VAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13981/thumb/VAIOT_logo.png?1613456546"},{"chainId":1,"address":"0x927159670c50042109d7c0f4aed0cee89452433e","name":"DGPayment","symbol":"DGP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13291/thumb/dgpay-icon-logo.png?1607062736"},{"chainId":1,"address":"0xb39185e33e8c28e0bb3dbbce24da5dea6379ae91","name":"PHUNK Vault NFTX ","symbol":"PHUNK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17074/thumb/Phunks.png?1626152056"},{"chainId":1,"address":"0xfec0cf7fe078a500abf15f1284958f22049c2c7e","name":"Maecenas","symbol":"ART","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1025/thumb/maecenas.png?1547034953"},{"chainId":1,"address":"0x13de0b0c1507d424fad4c6212830a0b2e59587c5","name":"WishChain","symbol":"WISH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9473/thumb/rX_fbFL6_400x400.jpg?1567724441"},{"chainId":1,"address":"0xcec38306558a31cdbb2a9d6285947c5b44a24f3e","name":"Fantasy Sports","symbol":"DFS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6062/thumb/fantasy_sports.png?1567508873"},{"chainId":1,"address":"0xdd94842c15abfe4c9bafe4222ade02896beb064c","name":"W Green Pay","symbol":"WGP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4419/thumb/wgreenpay-01-400x300.png?1547039752"},{"chainId":1,"address":"0xf14922001a2fb8541a433905437ae954419c2439","name":"Direct Insurance To","symbol":"DIT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/4220/thumb/Direct_Insurance_Token.jpg?1547039537"},{"chainId":1,"address":"0x888888848b652b3e3a0f34c96e00eec0f3a23f72","name":"Alien Worlds","symbol":"TLM","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/14676/thumb/kY-C4o7RThfWrDQsLCAG4q4clZhBDDfJQVhWUEKxXAzyQYMj4Jmq1zmFwpRqxhAJFPOa0AsW_PTSshoPuMnXNwq3rU7Imp15QimXTjlXMx0nC088mt1rIwRs75GnLLugWjSllxgzvQ9YrP4tBgclK4_rb17hjnusGj_c0u2fx0AvVokjSNB-v2poTj0xT9BZRCbzRE3-lF1.jpg?1617700061"},{"chainId":1,"address":"0x62d75a2a10f755104bd1024d997141ce793cf585","name":"520","symbol":"520","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9758/thumb/logo_%2822%29.png?1571437829"},{"chainId":1,"address":"0xcf3c8be2e2c42331da80ef210e9b1b307c03d36a","name":"BEPRO Network","symbol":"BEPRO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10251/thumb/logo.png?1610592699"},{"chainId":1,"address":"0xc25a3a3b969415c80451098fa907ec722572917f","name":"LP sCurve","symbol":"SCURVE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11899/thumb/Curvefi_sCrv_32.png?1595931870"},{"chainId":1,"address":"0xd0d3ebcad6a20ce69bc3bc0e1ec964075425e533","name":"Ethereum Stake","symbol":"ETHYS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13328/thumb/eths_logo.png?1607494708"},{"chainId":1,"address":"0x261638ec8ee8100484130ebd2febfdadc0d8742a","name":"LVX","symbol":"LVX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5269/thumb/New_Level01_Logo_200px.png?1600751532"},{"chainId":1,"address":"0x0602121722642936150f12ea1e07d62a8bb2aa71","name":"Boboo Token","symbol":"BOBT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13123/thumb/2jfWUjx5_400x400.png?1605494729"},{"chainId":1,"address":"0x798d1be841a82a273720ce31c822c61a67a601c3","name":"DIGG","symbol":"DIGG","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13737/thumb/digg.PNG?1611292196"},{"chainId":1,"address":"0xc3e2de0b661cf58f66bde8e896905399ded58af5","name":"Matrexcoin","symbol":"MAC","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/6579/thumb/l5b5MJXn_400x400.jpg?1557131764"},{"chainId":1,"address":"0x229b239b7d00aa2a41c8b74b1db50a821f58d31a","name":"Fruits","symbol":"FRTS","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/16059/thumb/FruitsLogo3.png?1622709717"},{"chainId":1,"address":"0xd15ecdcf5ea68e3995b2d0527a0ae0a3258302f8","name":"Machi X","symbol":"MCX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11329/thumb/MachiX.png?1589926940"},{"chainId":1,"address":"0x30647a72dc82d7fbb1123ea74716ab8a317eac19","name":"imUSD","symbol":"IMUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13696/thumb/imUSD.png?1610971385"},{"chainId":1,"address":"0x63e634330a20150dbb61b15648bc73855d6ccf07","name":"Blocklancer","symbol":"LNC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1540/thumb/blocklancer.png?1547351104"},{"chainId":1,"address":"0x78b7fada55a64dd895d8c8c35779dd8b67fa8a05","name":"Atlant","symbol":"ATL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1108/thumb/atlant.png?1547035089"},{"chainId":1,"address":"0xcd9b72f6e971026ea8609d2918c7bd02e1653945","name":"BEAM Vault NFTX ","symbol":"BEAM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17053/thumb/BEAM.png?1626149517"},{"chainId":1,"address":"0x06a87f6afec4a739c367bef69eefe383d27106bd","name":"Scoobi Doge","symbol":"SCOOBI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16101/thumb/scoobi_doge.jpg?1622963978"},{"chainId":1,"address":"0x750fa12ae51d1515c893c1aaabe2c135937a2c8b","name":"RealT Token 9465 ","symbol":"REALTOKEN-S-9465-BE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16707/thumb/9465-Beaconsfield-hero-1c.jpeg?1624645510"},{"chainId":1,"address":"0x47140a767a861f7a1f3b0dd22a2f463421c28814","name":"All me","symbol":"ME","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5497/thumb/all.me-logo.jpg?1547041239"},{"chainId":1,"address":"0xf34842d05a1c888ca02769a633df37177415c2f8","name":"IdleUSDT Yield ","symbol":"IDLEUSDTYIELD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11933/thumb/idleusdtv3maxyield_32.png?1596263688"},{"chainId":1,"address":"0xe2ee1ac57b2e5564522b2de064a47b3f98b0e9c9","name":"Whalesburg","symbol":"WBT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3365/thumb/Whalesburg.jpg?1547037997"},{"chainId":1,"address":"0xfb5453340c03db5ade474b27e68b6a9c6b2823eb","name":"Robot","symbol":"ROBOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13517/thumb/MF_Robot_200px.png?1609312481"},{"chainId":1,"address":"0x48fb253446873234f2febbf9bdeaa72d9d387f94","name":"Bancor Governance T","symbol":"VBNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14053/thumb/bancorvbnt_32.png?1614048819"},{"chainId":1,"address":"0x0100546f2cd4c9d97f798ffc9755e47865ff7ee6","name":"Alchemix ETH","symbol":"ALETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16271/thumb/photo_2021-06-13_22-16-07.jpg?1623593846"},{"chainId":1,"address":"0x53066cddbc0099eb6c96785d9b3df2aaeede5da3","name":"Penta Network Token","symbol":"PNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4175/thumb/pentanetwork.png?1548330852"},{"chainId":1,"address":"0xa19a40fbd7375431fab013a4b08f00871b9a2791","name":"Swagg Network","symbol":"SWAGG","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/12126/thumb/swagg_logo.png?1597376071"},{"chainId":1,"address":"0x47481c1b44f2a1c0135c45aa402ce4f4dde4d30e","name":"Meetple","symbol":"MPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14323/thumb/Tqlsvhn1_400x400.png?1615427198"},{"chainId":1,"address":"0xd85a6ae55a7f33b0ee113c234d2ee308edeaf7fd","name":"Cobak Token","symbol":"CBK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13459/thumb/cbk-128-128.png?1608760936"},{"chainId":1,"address":"0x14c38e90a593b0bd5b7e9896a8ef4ae0a119d6ae","name":"WAV3","symbol":"WAV3","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13321/thumb/wav3_logo.jpeg?1607426650"},{"chainId":1,"address":"0x59321ace77c8087ff8cb9f94c8384807e4fd8a3c","name":"Xeniumx","symbol":"XEMX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11094/thumb/AmoNWiZ_vx17KF3g6q5RQRaAYrXBXXWjRH5sU2m-1JYt3rJ4c88yo-KS9qKh43lfN2QkuS6AVuYAxcpQQSHQMjqwh-6HsdCyF-yi0xH9Dio5E6UdvNlh0fAMe-RSzp6x2UN6RhAorfUp_wMDDDnHSANWR9iOmVKtemiBLwpUyF-NbY3xdhW5hHAfbARvdnGODq14ujlFu0MJuLi.jpg?1588212665"},{"chainId":1,"address":"0x83984d6142934bb535793a82adb0a46ef0f66b6d","name":"Remme","symbol":"REM","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/2152/thumb/semme.png?1561622861"},{"chainId":1,"address":"0x8a732bc91c33c167f868e0af7e6f31e0776d0f71","name":"Litecoin Token","symbol":"LTK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7573/thumb/LTK.jpg?1550626784"},{"chainId":1,"address":"0x6beb418fc6e1958204ac8baddcf109b8e9694966","name":"Linker Coin","symbol":"LNC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3885/thumb/linker-coin.png?1547975979"},{"chainId":1,"address":"0xa9a8377287ea9c6b8b4249dd502e75d34148fc5b","name":"Stargaze Protocol","symbol":"STGZ","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13339/thumb/stgz_protocol_logo.jpg?1607580880"},{"chainId":1,"address":"0x40821cd074dfecb1524286923bc69315075b5c89","name":"Quai Dao","symbol":"QUAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13815/thumb/77559276.png?1612050148"},{"chainId":1,"address":"0x26b3038a7fc10b36c426846a9086ef87328da702","name":"Yield Farming Token","symbol":"YFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11981/thumb/photo_2020-08-04_03-25-28.jpg?1596622873"},{"chainId":1,"address":"0x0bc61dded5f6710c637cf8288eb6058766ce1921","name":"Coinsuper Ecosystem","symbol":"CEN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5215/thumb/coinsuper-ecosystem-network-token-logo.png?1547040682"},{"chainId":1,"address":"0x456ae45c0ce901e2e7c99c0718031cec0a7a59ff","name":"Vision Network","symbol":"VSN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9029/thumb/photo_2020-08-14_20-34-55.jpg?1606133699"},{"chainId":1,"address":"0x740623d2c797b7d8d1ecb98e9b4afcf99ec31e14","name":"DoYourTip","symbol":"DYT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8936/thumb/image1.png?1578033515"},{"chainId":1,"address":"0x7bce667ef12023dc5f8577d015a2f09d99a5ef58","name":"Block Duelers","symbol":"BDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13757/thumb/block_duelers.png?1611567700"},{"chainId":1,"address":"0xd8698a985b89650d0a70f99ad2909bd0c0b4b51c","name":"Consentium","symbol":"CSM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3068/thumb/consentium.png?1547037411"},{"chainId":1,"address":"0x581911b360b6eb3a14ef295a83a91dc2bce2d6f7","name":"MileVerse","symbol":"MVC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13146/thumb/kXSdwuxD_400x400.jpg?1605668418"},{"chainId":1,"address":"0x57e83505827788c9f92bcfd398a51a7b0c83dd8e","name":"ChainLink Trading S","symbol":"CTS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11779/thumb/chainlink_trading_set.png?1593932710"},{"chainId":1,"address":"0x43567eb78638a55bbe51e9f9fb5b2d7ad1f125aa","name":"Hackspace Capital","symbol":"HAC","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/2336/thumb/hac.png?1547036543"},{"chainId":1,"address":"0x1fa21b20222076d7465fb901e5f459289c95f66a","name":"XFII","symbol":"XFII","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13092/thumb/xfii_logo.png?1605065018"},{"chainId":1,"address":"0x5dced3c2fab61e21b25177c6050d3f166f696110","name":"Tea Token","symbol":"TEA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14426/thumb/teachain-logo.png?1616031044"},{"chainId":1,"address":"0xa49dc04d118bdf4a3471f593c1bba0c99b2187ea","name":"Odius","symbol":"ODI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16841/thumb/odius_logo.png?1625379079"},{"chainId":1,"address":"0x3b046fde911d3b6f9caa4759dbcfb034a87648ba","name":"Elon Diamond Hands","symbol":"EDH","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/15821/thumb/83nQGjea_400x400.jpg?1621999765"},{"chainId":1,"address":"0xc0f9bd5fa5698b6505f643900ffa515ea5df54a9","name":"Donut","symbol":"DONUT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7538/thumb/Donut.png?1548234345"},{"chainId":1,"address":"0x662b67d00a13faf93254714dd601f5ed49ef2f51","name":"Orbit Chain","symbol":"ORC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9782/thumb/-p1Br7oh_400x400.png?1571716593"},{"chainId":1,"address":"0x574f84108a98c575794f75483d801d1d5dc861a5","name":"Robotina","symbol":"ROX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3153/thumb/rox.png?1519831400"},{"chainId":1,"address":"0x4086692d53262b2be0b13909d804f0491ff6ec3e","name":"Yield Farming Known","symbol":"YFKA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12459/thumb/5f5cfce7b7b794f5e1e4c6b5_logo200.jpg?1599982854"},{"chainId":1,"address":"0xcc3f1441e84f124a65bc9798a69a5c4cebc20dff","name":"MORPH Vault NFTX ","symbol":"MORPH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17070/thumb/PolyMorphs.png?1626151257"},{"chainId":1,"address":"0x70da48f4b7e83c386ef983d4cef4e58c2c09d8ac","name":"Quras Token","symbol":"XQC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10112/thumb/FZFHac2z_400x400.jpg?1575964560"},{"chainId":1,"address":"0x68496ee825dafe1cf66d4083f776b9eaab31e447","name":"ErcauX","symbol":"RAUX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12687/thumb/raux_logo.jpeg?1601633375"},{"chainId":1,"address":"0x43e6228b5bf22eab754486082ca91fdd8585521a","name":"Dixt Finance","symbol":"DIXT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13466/thumb/20201224_102613.png?1608794672"},{"chainId":1,"address":"0x9b4e2b4b13d125238aa0480dd42b4f6fc71b37cc","name":"MyToken","symbol":"MT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4109/thumb/2712.png?1547039296"},{"chainId":1,"address":"0xe7d324b2677440608fb871981b220eca062c3fbf","name":"Bullswap Protocol","symbol":"BVL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13195/thumb/4HPwA1D2_400x400.png?1606115706"},{"chainId":1,"address":"0xec0a0915a7c3443862b678b0d4721c7ab133fdcf","name":"Wrapped Origin Axie","symbol":"WOA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12732/thumb/WOA_logo.png?1602116474"},{"chainId":1,"address":"0xb64cd4f56043f8d80691433e395d08b1bebdadf0","name":"Meliora","symbol":"MORA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14553/thumb/3vcbfVWS_400x400.png?1616992649"},{"chainId":1,"address":"0xcb696c86917175dfb4f0037ddc4f2e877a9f081a","name":"MoonDayPlus","symbol":"MD+","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14464/thumb/md__logo.jpg?1616303384"},{"chainId":1,"address":"0x3c6a7ab47b5f058be0e7c7fe1a4b7925b8aca40e","name":"Cajutel","symbol":"CAJ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7354/thumb/RuHhMsFd_400x400.png?1547044031"},{"chainId":1,"address":"0xf0acf8949e705e0ebb6cb42c2164b0b986454223","name":"Barter","symbol":"BRTR","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13401/thumb/BRTR.png?1612843022"},{"chainId":1,"address":"0xc626e0619ac79afea9281c8eb9b1a9f9d3fab532","name":"Freedom Reserve","symbol":"FR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13342/thumb/J6uNL2FS_400x400.jpg?1607589046"},{"chainId":1,"address":"0x7420b4b9a0110cdc71fb720908340c03f9bc03ec","name":"JasmyCoin","symbol":"JASMY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13876/thumb/JASMY200x200.jpg?1612473259"},{"chainId":1,"address":"0xc96df921009b790dffca412375251ed1a2b75c60","name":"Ormeus Coin","symbol":"ORME","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/964/thumb/ORMEUS_logo.png?1606557243"},{"chainId":1,"address":"0x3c6ff50c9ec362efa359317009428d52115fe643","name":"PeerEx Network","symbol":"PERX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12091/thumb/2AyoUJyQ_400x400.jpg?1597273390"},{"chainId":1,"address":"0x6faa826af0568d1866fca570da79b318ef114dab","name":"B21","symbol":"B21","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3510/thumb/B21_%283%29.png?1608706191"},{"chainId":1,"address":"0x33384af34b03eaca63fd153f59589f504772b570","name":"onLEXpa Token","symbol":"ONLEXPA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10373/thumb/logo-text.png?1578675009"},{"chainId":1,"address":"0x1a231e75538a931c395785ef5d1a5581ec622b0e","name":"Zoom Protocol","symbol":"ZOM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12468/thumb/zoom_protocol_logo.jpeg?1600098680"},{"chainId":1,"address":"0x8f5e78888f8933ed676a62bb6b58a4b279abe408","name":"stakedXYM","symbol":"STXYM","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/14787/thumb/stXYM.png?1618436747"},{"chainId":1,"address":"0x6aba1623ea906d1164cbb007e764ebde2514a2ba","name":"AAAchain","symbol":"AAA","decimals":10,"logoURI":"https://assets.coingecko.com/coins/images/6253/thumb/TVq6wtGj_400x400.jpg?1547042289"},{"chainId":1,"address":"0x10bae51262490b4f4af41e12ed52a0e744c1137a","name":"Soft Link","symbol":"SLINK","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12192/thumb/LogoSLINK.png?1597983753"},{"chainId":1,"address":"0xd947b0ceab2a8885866b9a04a06ae99de852a3d4","name":"Trade Token X","symbol":"TIOX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1542/thumb/trade-token-x128.png?1547035698"},{"chainId":1,"address":"0xd6cb2adf47655b1babddc214d79257348cbc39a7","name":"Oracle Top 5 Index","symbol":"ORCL5","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14182/thumb/orcl-light-circular.4c2aac77.png?1614821411"},{"chainId":1,"address":"0x99d8a9c45b2eca8864373a26d1459e3dff1e17f3","name":"Magic Internet Mone","symbol":"MIM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16786/thumb/mimlogopng.png?1624979612"},{"chainId":1,"address":"0xf3b3cad094b89392fce5fafd40bc03b80f2bc624","name":"Patron","symbol":"PAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3169/thumb/patron.png?1548330790"},{"chainId":1,"address":"0x74c287ad5328daca276c6a1c1f149415b12c148d","name":"Pazzy","symbol":"PAZZY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13949/thumb/copred.png?1613205149"},{"chainId":1,"address":"0xf6c0aa7ebfe9992200c67e5388e4f42da49e1783","name":"Psyche","symbol":"USD1","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/13661/thumb/Psyche-logo-256.png?1610600682"},{"chainId":1,"address":"0xf136d7b0b7ae5b86d21e7b78dfa95375a7360f19","name":"Toshimon","symbol":"TOSHI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14019/thumb/9E1K1PIZ_400x400.png?1613716582"},{"chainId":1,"address":"0x5d48f293baed247a2d0189058ba37aa238bd4725","name":"NeuroChain","symbol":"NCC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3367/thumb/neurochain.png?1548085917"},{"chainId":1,"address":"0xb14ebf566511b9e6002bb286016ab2497b9b9c9d","name":"Hypersign Identity ","symbol":"HID","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16158/thumb/hypersign_ONLYlogo_Yellow.png?1623140987"},{"chainId":1,"address":"0x80fb784b7ed66730e8b1dbd9820afd29931aab03","name":"Aave OLD ","symbol":"LEND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1365/thumb/ethlend.png?1547394586"},{"chainId":1,"address":"0x8c7424c3000942e5a93de4a01ce2ec86c06333cb","name":"ROCK3T","symbol":"R3T","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13890/thumb/rock3t_logo.jpg?1612520793"},{"chainId":1,"address":"0x3d1be3fef769399cce7e504e85324d622f23cf85","name":"Tulip Seed","symbol":"STLP","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13108/thumb/tulip_logo.jpg?1605258713"},{"chainId":1,"address":"0xd2d6158683aee4cc838067727209a0aaf4359de3","name":"Bounty0x","symbol":"BNTY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1444/thumb/bounty0x.png?1547562674"},{"chainId":1,"address":"0x689cf5f8dd09bbb4417514c88909bb64eba2547d","name":"Coop Network","symbol":"COOP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16541/thumb/coop.jpeg?1624367532"},{"chainId":1,"address":"0x8d717ab5eac1016b64c2a7fd04720fd2d27d1b86","name":"BitcoinVend","symbol":"BCVT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14162/thumb/BCVT-200x200_transparent.png?1614724192"},{"chainId":1,"address":"0xc57baa24f72037c21f9c0d345bb6f19f47407447","name":"TOPDOG Vault NFTX ","symbol":"TOPDOG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17080/thumb/TOPDOG.png?1626154411"},{"chainId":1,"address":"0xd8e3fb3b08eba982f2754988d70d57edc0055ae6","name":"Zoracles","symbol":"ZORA","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13255/thumb/zora.png?1606747018"},{"chainId":1,"address":"0x0557df767419296474c3f551bb0a0ed4c2dd3380","name":"Universal Gold","symbol":"UPXAU","decimals":5,"logoURI":"https://assets.coingecko.com/coins/images/13534/thumb/UPXAU-1.png?1609540908"},{"chainId":1,"address":"0xaef4f02e31cdbf007f8d98da4ae365188a0e9ecc","name":"The Famous Token","symbol":"TFT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13847/thumb/android-icon-192x192_%281%29.png?1612336853"},{"chainId":1,"address":"0x41dbecc1cdc5517c6f76f6a6e836adbee2754de3","name":"Medicalchain","symbol":"MTN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2850/thumb/medicalchain.png?1547037019"},{"chainId":1,"address":"0x996652b6c5c4b1154b25515db21b7bbadd40ddfa","name":"Golfrochain","symbol":"GOLF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15956/thumb/golfro.PNG?1622517333"},{"chainId":1,"address":"0xbbe460dc4ac73f7c13a2a2feecf9acf6d5083f9b","name":"Wick Finance","symbol":"WICK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15770/thumb/WICK-FINANCE-11-256x256.png?1621834220"},{"chainId":1,"address":"0x2167fb82309cf76513e83b25123f8b0559d6b48f","name":"CoinLion","symbol":"LION","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1917/thumb/Coinlion_Brandmark_Color.png?1620706193"},{"chainId":1,"address":"0x0e2ec54fc0b509f445631bf4b91ab8168230c752","name":"LINKUSD","symbol":"LINKUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12386/thumb/ARC-LOGO.png?1599529783"},{"chainId":1,"address":"0xa6272359bc37f61af398071b65c8934aca744d53","name":"GokuMarket Credit","symbol":"GMC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12561/thumb/GMC-favicon-Asset-200x200.png?1601623779"},{"chainId":1,"address":"0x87befc1d367190f2b9cbe9b689e0e5ca658e3b71","name":"GLOBALTRUSTFUND TOK","symbol":"GTF","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11817/thumb/gtf.png?1594679456"},{"chainId":1,"address":"0xac9ce326e95f51b5005e9fe1dd8085a01f18450c","name":"VeriSafe","symbol":"VSF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7862/thumb/verisafe_logo.png?1563852491"},{"chainId":1,"address":"0x8f041a3940a5e6fb580075c3774e15fcfa0e1618","name":"oneWING","symbol":"ONEWING","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15103/thumb/logo_200_wing.png?1619731848"},{"chainId":1,"address":"0x7a3c45f34ea5df6fe5f6af710ec8a04d388a71d1","name":"Pando","symbol":"PANDO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14150/thumb/pando_logo.png?1614667045"},{"chainId":1,"address":"0x446c9033e7516d820cc9a2ce2d0b7328b579406f","name":"SOLVE","symbol":"SOLVE","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1768/thumb/Solve.Token_logo_200_200_wiyhout_BG.png?1575869846"},{"chainId":1,"address":"0x70e36f6bf80a52b3b46b3af8e106cc0ed743e8e4","name":"cCOMP","symbol":"CCOMP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12840/thumb/1_z8UrVtod3bme4-J_pXAQQA_2x.png?1602936322"},{"chainId":1,"address":"0xc166f976ce9926a3205b145af104eb0e4b38b5c0","name":"LINK ETH Growth Alp","symbol":"LEGA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11457/thumb/alphachain_link_eth_growth_alpha_set.png?1590141817"},{"chainId":1,"address":"0x322124122df407b0d0d902cb713b3714fb2e2e1f","name":"Soft Yearn","symbol":"SYFI","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12320/thumb/soft_yearn.png?1599094189"},{"chainId":1,"address":"0xff32b6dc663e9aa3ef61117749c6ccc168100b99","name":"Bitcoin Network Dem","symbol":"BYTE3","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16186/thumb/BYTE_Logo_Square2.png?1623241130"},{"chainId":1,"address":"0x62f8dbdea37a4ed40ff3d2631001e4490c13218f","name":"Wall Street Baby","symbol":"WSB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15042/thumb/Wall_Street_Baby_200x200_logo.png?1619517949"},{"chainId":1,"address":"0x8e12bd795d2608f90440c84dddd2d985240696d5","name":"Isalcoin","symbol":"ISAL","decimals":7,"logoURI":"https://assets.coingecko.com/coins/images/13633/thumb/Untitled-design-6-removebg-preview-3.png?1610497846"},{"chainId":1,"address":"0xacfa209fb73bf3dd5bbfb1101b9bc999c49062a5","name":"EvidenZ","symbol":"BCDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2014/thumb/evidenz-512.png?1594871754"},{"chainId":1,"address":"0x3ed3b47dd13ec9a98b44e6204a523e766b225811","name":"Aave USDT","symbol":"AUSDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14243/thumb/aUSDT.78f5faae.png?1615528400"},{"chainId":1,"address":"0xba8ea15b647f54d9ff849670fcaacf35df21a457","name":"Intelligent Ratio S","symbol":"INTRATIO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10900/thumb/the_intelligent_ratio_set.png?1585730413"},{"chainId":1,"address":"0x009c43b42aefac590c719e971020575974122803","name":"Bibox Token","symbol":"BIX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1441/thumb/bibox-token.png?1547035519"},{"chainId":1,"address":"0x3142dad33b1c6e1371d8627365f2ee2095eb6b37","name":"Hauteclere Shards","symbol":"HAUT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12815/thumb/astt.png?1602884781"},{"chainId":1,"address":"0x27460aac4b005de72e2326bd8391c27fb41780f8","name":"JustBet","symbol":"WINR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12886/thumb/WINR.png?1603270935"},{"chainId":1,"address":"0xad6a626ae2b43dcb1b39430ce496d2fa0365ba9c","name":"PieDAO DEFI Small C","symbol":"DEFI+S","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12701/thumb/DefiS.png?1601862595"},{"chainId":1,"address":"0x6cfb6df56bbdb00226aeffcdb2cd1fe8da1abda7","name":"Komet","symbol":"KOMET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13196/thumb/komet_finance_logo.png?1606120745"},{"chainId":1,"address":"0x679badc551626e01b23ceecefbc9b877ea18fc46","name":"Ccore","symbol":"CCO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1287/thumb/LOGO_CCO.png?1547035312"},{"chainId":1,"address":"0xc1f976b91217e240885536af8b63bc8b5269a9be","name":"Public Index Networ","symbol":"PIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/241/thumb/pin.jpeg?1623054253"},{"chainId":1,"address":"0xee2f2212a64ec3f6bc0f7580e10c53cb38b57508","name":"RealT Token 12334","symbol":"REALTOKEN-S-12334-L","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16692/thumb/Landsdowne-hero.jpeg?1624638212"},{"chainId":1,"address":"0x2a3bff78b79a009976eea096a51a948a3dc00e34","name":"Wilder World","symbol":"WILD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15407/thumb/WWLogo_Gradient_Cirlce.png?1620743969"},{"chainId":1,"address":"0x537a9095b78517597b5f2058edcd6e1978095909","name":"Design","symbol":"DSGN","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/13204/thumb/design_logo.jpg?1606196569"},{"chainId":1,"address":"0x5273063725a43a323300c502478c22fbb4e92c2d","name":"My Identity Coin","symbol":"MYID","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15063/thumb/MYID-LOGO.png?1619594142"},{"chainId":1,"address":"0xfe69bc0920fb63c5924cfc322dc4a5cc23d9afed","name":"LYZE","symbol":"LZE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7514/thumb/bO6XPX1N_400x400.jpg?1548126342"},{"chainId":1,"address":"0x196c81385bc536467433014042788eb707703934","name":"CryptoTask","symbol":"CTASK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13965/thumb/cryptotask_logo.png?1613372242"},{"chainId":1,"address":"0x1977be49c33dfacf6590c16ca9a9cfa0463f663c","name":"DoRen","symbol":"DRE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16901/thumb/DoRen_project_whitepaper_v1_1_EN_pdf.png?1625572581"},{"chainId":1,"address":"0xff2b3353c3015e9f1fbf95b9bda23f58aa7ce007","name":"BitScreener","symbol":"BITX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4241/thumb/bitx.png?1547039570"},{"chainId":1,"address":"0x901f8679a6ef435d533732f5ea49bb82d568be99","name":"Trebit Network","symbol":"TRB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14572/thumb/20210330_044456.png?1617084399"},{"chainId":1,"address":"0xc1eecf1f4af8eb9a2a19f6c26b434aa96ce859e1","name":"SaveToken","symbol":"SAVE","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5141/thumb/5HqoBUuh_400x400.png?1578524644"},{"chainId":1,"address":"0xc37e8a31ba2d110c12f09f0239954a68b00bc599","name":"EUB Chain","symbol":"EUBC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6547/thumb/j2Lj7uGH_400x400.jpg?1547042762"},{"chainId":1,"address":"0xf6abff616043c2da572573dcc583b656297b30e7","name":"Custody Token","symbol":"CUST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8992/thumb/Lud1DxGT_400x400.jpg?1563503751"},{"chainId":1,"address":"0x4aac461c86abfa71e9d00d9a2cde8d74e4e1aeea","name":"ZINC","symbol":"ZINC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5237/thumb/zinc-logo.jpg?1547040722"},{"chainId":1,"address":"0x4bcddfcfa8cb923952bcf16644b36e5da5ca3184","name":"Fuzzy Inu","symbol":"FUZZY","decimals":12,"logoURI":"https://assets.coingecko.com/coins/images/15918/thumb/FuzzyInu.jpg?1622428523"},{"chainId":1,"address":"0xb15ae165000c8d7b69d2a82e425e110668c73ad5","name":"LinkBased","symbol":"LBD","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13506/thumb/linkbased_logo.jpg?1609224548"},{"chainId":1,"address":"0xa8b61cff52564758a204f841e636265bebc8db9b","name":"Yield Protocol","symbol":"YIELD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14220/thumb/yield.png?1615030969"},{"chainId":1,"address":"0x00a55375002f3cda400383f479e7cd57bad029a9","name":"Conjure","symbol":"CNJ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16438/thumb/1_zfxcjq-d6nkwCyQPLz5YGg.png?1624114478"},{"chainId":1,"address":"0xf911a7ec46a2c6fa49193212fe4a2a9b95851c27","name":"Antiample","symbol":"XAMP","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/11925/thumb/antiample.png?1596168983"},{"chainId":1,"address":"0x3c76ef53be46ed2e9be224e8f0b92e8acbc24ea0","name":"Bitsou","symbol":"BTU","decimals":3,"logoURI":"https://assets.coingecko.com/coins/images/8378/thumb/61B3F6DFA9584DDAA760E74B12D6FAD3.png?1557823748"},{"chainId":1,"address":"0x1e950af2f6f8505c09f0ca42c4b38f10979cb22e","name":"BurnX 2 0","symbol":"BURNX20","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15431/thumb/BurnX20.jpeg?1625467959"},{"chainId":1,"address":"0xeb2c0e11af20fb1c41c6e7abe5ad214e48738514","name":"Sinelock","symbol":"SINE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13984/thumb/q3rzuFnH_400x400.jpg?1613463180"},{"chainId":1,"address":"0xdcbcffeee34eb128336fd45ed62fe8f420c8857d","name":"Davies","symbol":"DVS","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5668/thumb/logodaviesred.png?1559916938"},{"chainId":1,"address":"0x7be5901f679bde8202a123c84c19bbce2cf3449b","name":"Fiola","symbol":"FLA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13010/thumb/Untitled-design-4-removebg-preview-1.png?1604373860"},{"chainId":1,"address":"0xb2f7eb1f2c37645be61d73953035360e768d81e6","name":"Cobinhood","symbol":"COB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/971/thumb/cobinhood.png?1547739572"},{"chainId":1,"address":"0x17d8cbb6bce8cee970a4027d1198f6700a7a6c24","name":"imBTC","symbol":"IMBTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13988/thumb/imbtc.png?1613487586"},{"chainId":1,"address":"0x9388f54fa978aa9e24395a8b69033304eccea4df","name":"BITSCOIN","symbol":"BTCX","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/11181/thumb/vBaA50a.png?1589512223"},{"chainId":1,"address":"0x777ba4d2393ea77893322743c7d817efef872204","name":"W3bPUSH","symbol":"W3B","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15263/thumb/logo.674b4d2b.png?1620279693"},{"chainId":1,"address":"0x171706b7d113c68f2cc68a6ce63b1dbdcdf7b233","name":"Echo Token","symbol":"ECHO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15295/thumb/ECHO-logo-v2-cg-01.png?1622520853"},{"chainId":1,"address":"0xc11551bb497875050b69a2fdccc20a53a9a70263","name":"TenXCoin","symbol":"TXC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7518/thumb/38759388_305248313385249_2251789437044260864_n.png?1548146715"},{"chainId":1,"address":"0x82fdedfb7635441aa5a92791d001fa7388da8025","name":"Digital Ticks","symbol":"DTX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4898/thumb/digital-ticks-logo.jpg?1533010074"},{"chainId":1,"address":"0xc4895f94340f30fc126d1149d6cbd4a5fea50890","name":"Nickel","symbol":"NICKEL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16172/thumb/IMG-20210626-034544-756.png?1625580379"},{"chainId":1,"address":"0xab93df617f51e1e415b5b4f8111f122d6b48e55c","name":"Delta Exchange Toke","symbol":"DETO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14610/thumb/deto-logo.png?1617247295"},{"chainId":1,"address":"0x03282f2d7834a97369cad58f888ada19eec46ab6","name":"Globex","symbol":"GEX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7391/thumb/globex.png?1592450726"},{"chainId":1,"address":"0xc80c5e40220172b36adee2c951f26f2a577810c5","name":"Bankera","symbol":"BNK","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1949/thumb/bnk.png?1547036236"},{"chainId":1,"address":"0xe1329ebf8b719881549909d689987f746a8931d1","name":"Refine Medium","symbol":"XRM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8173/thumb/RefineMedium.png?1574851594"},{"chainId":1,"address":"0x53378825d95281737914a8a2ac0e5a9304ae5ed7","name":"Samurai","symbol":"SAM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12529/thumb/UkWCWt1.png?1600495292"},{"chainId":1,"address":"0xb9e7f8568e08d5659f5d29c4997173d84cdf2607","name":"Swarm City","symbol":"SWT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/621/thumb/swarm-city.png?1548611426"},{"chainId":1,"address":"0x0bfec35a1a3550deed3f6fc76dde7fc412729a91","name":"xKNCa","symbol":"XKNCA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13995/thumb/Token-4.png?1613545763"},{"chainId":1,"address":"0xc12d099be31567add4e4e4d0d45691c3f58f5663","name":"Auctus","symbol":"AUC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2165/thumb/Auc_Discord_Avatar1.png?1618983355"},{"chainId":1,"address":"0x88a9a52f944315d5b4e917b9689e65445c401e83","name":"Fear","symbol":"FEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15825/thumb/fear-logo-400-400.png?1625552865"},{"chainId":1,"address":"0x55b54d8fb1640d1321d5164590e7b020ba43def2","name":"1X Short XRP Token","symbol":"XRPHEDGE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12059/thumb/683JEXMN_400x400.png?1596705201"},{"chainId":1,"address":"0xa8c2af8c403704a31f32f0aa70a43e63afcd54d0","name":"Klondike Bond","symbol":"KBOND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13788/thumb/klondike.jpg?1611759321"},{"chainId":1,"address":"0xb5dbc6d3cf380079df3b27135664b6bcf45d1869","name":"Project SHIVOM","symbol":"OMX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/3167/thumb/omx.png?1547037607"},{"chainId":1,"address":"0x26cb3641aaa43911f1d4cb2ce544eb652aac7c47","name":"Crystal Token","symbol":"CYL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6419/thumb/crystal-token.png?1547042585"},{"chainId":1,"address":"0xdfbc9050f5b01df53512dcc39b4f2b2bbacd517a","name":"Jobchain","symbol":"JOB","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9352/thumb/Logo_%283%29.png?1566510871"},{"chainId":1,"address":"0xfa05a73ffe78ef8f1a739473e462c54bae6567d9","name":"Lunyr","symbol":"LUN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/735/thumb/lunyr.png?1547976492"},{"chainId":1,"address":"0x226bb599a12c826476e3a771454697ea52e9e220","name":"Propy","symbol":"PRO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/869/thumb/propy.png?1548332100"},{"chainId":1,"address":"0x48be867b240d2ffaff69e0746130f2c027d8d3d2","name":"Elevate","symbol":"ELE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13802/thumb/elevate-logo.png?1611980666"},{"chainId":1,"address":"0x8a2279d4a90b6fe1c4b30fa660cc9f926797baa2","name":"Chromia","symbol":"CHR","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/5000/thumb/Chromia.png?1559038018"},{"chainId":1,"address":"0xd7394087e1dbbe477fe4f1cf373b9ac9459565ff","name":"RealTract","symbol":"RET","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5955/thumb/200-01.png?1547041895"},{"chainId":1,"address":"0x675e7d927af7e6d0082e0153dc3485b687a6f0ad","name":"Creed Finance","symbol":"CREED","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12437/thumb/creed_finance_logo.jpg?1599840364"},{"chainId":1,"address":"0x309627af60f0926daa6041b8279484312f2bf060","name":"USD Bancor","symbol":"USDB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10619/thumb/busd.png?1581026228"},{"chainId":1,"address":"0x59f1b6d0f5105cf025a3de58858a9363f4fef084","name":"Auscoin","symbol":"AUSC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6081/thumb/auscoin-logo.png?1547042059"},{"chainId":1,"address":"0xd379700999f4805ce80aa32db46a94df64561108","name":"Dextrust","symbol":"DETS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12235/thumb/logo_dark.png?1598425651"},{"chainId":1,"address":"0x5dc74029509752f4ed9a609c2bb52216275e4c1d","name":"Game City","symbol":"GMCI","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7121/thumb/gamecity.jpg?1612234592"},{"chainId":1,"address":"0xee9e5eff401ee921b138490d00ca8d1f13f67a72","name":"Asian Fintech","symbol":"AFIN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7519/thumb/afin.png?1558430973"},{"chainId":1,"address":"0x07de533cbc72395c32eb8981ddccd2cc6a6e1c4e","name":"Technology Innovati","symbol":"TIP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13681/thumb/KRW_TIP.png?1610835212"},{"chainId":1,"address":"0xaba8cac6866b83ae4eec97dd07ed254282f6ad8a","name":"YAM v2","symbol":"YAMV2","decimals":24,"logoURI":"https://assets.coingecko.com/coins/images/12179/thumb/YAM-v2.png?1597892396"},{"chainId":1,"address":"0xef8ba8cba86f81b3108f60186fce9c81b5096d5c","name":"YFII Gold","symbol":"YFIIG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12587/thumb/yfiigold_logo.png?1600937694"},{"chainId":1,"address":"0x8811e4dd5ec5eb8764b97cc814b1339089717ada","name":"Bithachi","symbol":"BITH","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11765/thumb/bith3.png?1593656342"},{"chainId":1,"address":"0x5f778ec4b31a506c1dfd8b06f131e9b451a61d39","name":"UDAP","symbol":"UPX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5806/thumb/UDAP-logo.png?1547041676"},{"chainId":1,"address":"0x1be66c15731788bae659b4bdd40d4aa9b3bbca94","name":"PolkaDoge","symbol":"PDOGE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16860/thumb/polka.png?1625466946"},{"chainId":1,"address":"0x2aa5ce395b00cc486159adbdd97c55b535cf2cf9","name":"ElasticDAO","symbol":"EGT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14458/thumb/edao_logo.png?1616213380"},{"chainId":1,"address":"0x7c8155909cd385f120a56ef90728dd50f9ccbe52","name":"Nahmii","symbol":"NII","decimals":15,"logoURI":"https://assets.coingecko.com/coins/images/9786/thumb/nahmii-sm_icon-full-color.png?1608513773"},{"chainId":1,"address":"0xacbed9726ffd232b59d3ca86a0f5c856e2abef29","name":"Debunk","symbol":"DBNK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13930/thumb/77926469.jpg?1612908627"},{"chainId":1,"address":"0x5c3a228510d246b78a3765c20221cbf3082b44a4","name":"Storiqa","symbol":"STQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1929/thumb/storiqa.png?1548611108"},{"chainId":1,"address":"0xcdb7ecfd3403eef3882c65b761ef9b5054890a47","name":"Hurify","symbol":"HUR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2705/thumb/Hurify.jpg?1547036915"},{"chainId":1,"address":"0x2f3e054d233c93c59140c0905227c7c607c70cbb","name":"CoomCoin","symbol":"COOM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12205/thumb/coom.jpg?1598081856"},{"chainId":1,"address":"0x2c50ba1ed5e4574c1b613b044bd1876f0b0b87a9","name":"Kids Cash","symbol":"KASH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11467/thumb/kash.png?1590242267"},{"chainId":1,"address":"0x5d60d8d7ef6d37e16ebabc324de3be57f135e0bc","name":"MyBit Token","symbol":"MYB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1240/thumb/mybit.png?1547035264"},{"chainId":1,"address":"0x5a143f78bb66294ff37c47b5164584475b932bab","name":"Yearn Hold Finance","symbol":"YHFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13124/thumb/photo-2020-11-09-21-22-47.jpg?1605495059"},{"chainId":1,"address":"0xa8580f3363684d76055bdc6660caefe8709744e1","name":"Folder Protocol","symbol":"FOL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13755/thumb/folderlabs_logo.png?1611560881"},{"chainId":1,"address":"0xb2c822a1b923e06dbd193d2cfc7ad15388ea09dd","name":"Vampire Protocol","symbol":"VAMP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12630/thumb/vampire.jpeg?1601335717"},{"chainId":1,"address":"0x4b86e0295e7d32433ffa6411b82b4f4e56a581e1","name":"Dogira","symbol":"DOGIRA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14634/thumb/IQgaRw0.png?1622439620"},{"chainId":1,"address":"0x741b0428efdf4372a8df6fb54b018db5e5ab7710","name":"ARTX","symbol":"ARTX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14652/thumb/logo_black_cmc.png?1617556500"},{"chainId":1,"address":"0x5a7e3c07604eb515c16b36cd51906a65f021f609","name":"sNFLX","symbol":"SNFLX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14950/thumb/sNFLX.png?1619129222"},{"chainId":1,"address":"0x9ad03c34aab604a9e0fde41dbf8e383e11c416c4","name":"Guarded Ether","symbol":"GETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14001/thumb/guarda-shield-logo.png?1613603915"},{"chainId":1,"address":"0x0a9f693fce6f00a51a8e0db4351b5a8078b4242e","name":"Resfinex Token","symbol":"RES","decimals":5,"logoURI":"https://assets.coingecko.com/coins/images/10026/thumb/logo_%281%29.png?1588935633"},{"chainId":1,"address":"0x27ffed7e5926fb2795fc85aaab558243f280a8a2","name":"Punk Female","symbol":"PUNK-FEMALE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13997/thumb/icon-punk-female-40.png?1613564774"},{"chainId":1,"address":"0xe96f2c381e267a96c29bbb8ab05ab7d3527b45ab","name":"SatoExchange Token","symbol":"SATX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8500/thumb/satx-logo.png?1559015585"},{"chainId":1,"address":"0x83eea00d838f92dec4d1475697b9f4d3537b56e3","name":"VOISE","symbol":"VOISE","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/749/thumb/voise_single.png?1547034493"},{"chainId":1,"address":"0x07d9e49ea402194bf48a8276dafb16e4ed633317","name":"Dalecoin","symbol":"DALC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/932/thumb/dalecoin.png?1547791491"},{"chainId":1,"address":"0x1f3f677ecc58f6a1f9e2cf410df4776a8546b5de","name":"VNDC","symbol":"VNDC","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/9670/thumb/vndc-gold-coin.png?1571032826"},{"chainId":1,"address":"0xed7fa212e100dfb3b13b834233e4b680332a3420","name":"Street Cred","symbol":"CRED","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12680/thumb/cred_logo.png?1601611472"},{"chainId":1,"address":"0xeda6efe5556e134ef52f2f858aa1e81c84cda84b","name":"Capital finance","symbol":"CAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13351/thumb/Untitled-design-4-removebg-preview-2.png?1607811346"},{"chainId":1,"address":"0xbd0a4bf098261673d5e6e600fd87ddcd756e6764","name":"Hina Inu","symbol":"HINA","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15993/thumb/download.png?1622549919"},{"chainId":1,"address":"0x92ece48522e1acbcda4aaa8c2fbf2aa9fb15d624","name":"Rocki","symbol":"ROCKS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13465/thumb/rocki_logo.png?1608786767"},{"chainId":1,"address":"0xdd0020b1d5ba47a54e2eb16800d73beb6546f91a","name":"aXpire","symbol":"AXPR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2682/thumb/kVreRBC.png?1621925356"},{"chainId":1,"address":"0x68aa3f232da9bdc2343465545794ef3eea5209bd","name":"Mothership","symbol":"MSP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/815/thumb/mothership.png?1547034603"},{"chainId":1,"address":"0xccbf21ba6ef00802ab06637896b799f7101f54a2","name":"Budbo","symbol":"BUBO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1779/thumb/IMG_7712.png?1594016157"},{"chainId":1,"address":"0x2341dd0a96a0dab62aa1efb93d59ff7f3bdb8932","name":"ProStarter","symbol":"PROT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15259/thumb/rpot.PNG?1620269970"},{"chainId":1,"address":"0xa4e9584daa093cb1205e17ba737c3fd015748087","name":"FOREXCOIN","symbol":"FOREX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6852/thumb/forex-logo.PNG?1547043174"},{"chainId":1,"address":"0x4ecb692b0fedecd7b486b4c99044392784877e8c","name":"Cherry","symbol":"CHERRY","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/12125/thumb/clubcherry-2-scaled-uai-516x516.jpg?1597463169"},{"chainId":1,"address":"0xbc4171f45ef0ef66e76f979df021a34b46dcc81d","name":"Dora Factory","symbol":"DORA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14478/thumb/dora_logo.jpg?1616410086"},{"chainId":1,"address":"0x413f6a89ddb823974f24f2e3cd3b4f467d3bbb38","name":"ALPACA Vault NFTX ","symbol":"ALPACA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17042/thumb/ALPACA.png?1626147234"},{"chainId":1,"address":"0x1505c95a707348c2bcc75698be258891387f008b","name":"Uncle Scrooge Finan","symbol":"CROOGE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16304/thumb/logo200.png?1623718782"},{"chainId":1,"address":"0xfbe878ced08132bd8396988671b450793c44bc12","name":"Fox Trading Token","symbol":"FOXT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5182/thumb/foxtrading-logo.png?1547040619"},{"chainId":1,"address":"0xbb340a2eaf55c5e67a5a05fe5ceed9b9702d76f4","name":"BolttCoin","symbol":"BOLTT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/3928/thumb/Ticker.jpeg?1551231549"},{"chainId":1,"address":"0x2e2364966267b5d7d2ce6cd9a9b5bd19d9c7c6a9","name":"Voice Token","symbol":"VOICE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12926/thumb/OjCQtdL.png?1614780024"},{"chainId":1,"address":"0x3597bfd533a99c9aa083587b074434e61eb0a258","name":"Dent","symbol":"DENT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1152/thumb/gLCEA2G.png?1604543239"},{"chainId":1,"address":"0x85f6eb2bd5a062f5f8560be93fb7147e16c81472","name":"Franklin","symbol":"FLY","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/14810/thumb/uC05I_Kc_400x400.jpg?1618539481"},{"chainId":1,"address":"0xa249de6948022783765fee4850d7b85e43118fcc","name":"Jarvis ","symbol":"JAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8774/thumb/3jmUWB3e_400x400.jpg?1561085148"},{"chainId":1,"address":"0xe13559cf6edf84bd04bf679e251f285000b9305e","name":"TMC NiftyGotchi","symbol":"TMC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13627/thumb/tmc.png?1610434378"},{"chainId":1,"address":"0xe9f84de264e91529af07fa2c746e934397810334","name":"SAK3","symbol":"SAK3","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15890/thumb/Sak3.jpg?1622219322"},{"chainId":1,"address":"0x798a9055a98913835bbfb45a0bbc209438dcfd97","name":"New Year Bull","symbol":"NYB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12327/thumb/bull.jpg?1599102873"},{"chainId":1,"address":"0xe8d17542dfe79ff4fbd4b850f2d39dc69c4489a2","name":"KiloAmple","symbol":"KMPL","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13449/thumb/kappa_logo.png?1608681544"},{"chainId":1,"address":"0x8762db106b2c2a0bccb3a80d1ed41273552616e8","name":"Reserve Rights Toke","symbol":"RSR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8365/thumb/Reserve_Rights.png?1557737411"},{"chainId":1,"address":"0x8281ee37f164c0e26e6b6f87e7695baac256df07","name":"Degen Arts","symbol":"DAC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14994/thumb/DAC-logo-200.png?1619390738"},{"chainId":1,"address":"0xaffdb768e5f909b9a6ed110ad724b5e454670c08","name":"Unicly Air Jordan 1","symbol":"UJORD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15675/thumb/ujord.jpg?1621498536"},{"chainId":1,"address":"0xabc1280a0187a2020cc675437aed400185f86db6","name":"Smart Application C","symbol":"SAC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5515/thumb/smart-application-chain.png?1548609520"},{"chainId":1,"address":"0xfd09911130e6930bf87f2b0554c44f400bd80d3e","name":"EthicHub","symbol":"ETHIX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3031/thumb/ETHIX_icon_256x256-256.png?1622195164"},{"chainId":1,"address":"0x1c5f43710a1776b0ea7191b7ead75d4b98d69858","name":"Pool of Stake","symbol":"PSK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3494/thumb/Logo_square.png?1547038247"},{"chainId":1,"address":"0x86367c0e517622dacdab379f2de389c3c9524345","name":"Universal US Dollar","symbol":"UPUSD","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/11170/thumb/yS35aK0t_400x400_%282%29.jpg?1589449387"},{"chainId":1,"address":"0x9a0aba393aac4dfbff4333b06c407458002c6183","name":"ACoconut","symbol":"AC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12779/thumb/ac_logo.png?1602500084"},{"chainId":1,"address":"0x2af72850c504ddd3c1876c66a914caee7ff8a46a","name":"WhaleRoom","symbol":"WHL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14328/thumb/ArEX8tkV_400x400.png?1615432175"},{"chainId":1,"address":"0x8b98df4dff429e64e9a56fc6eebe2380c6c3409c","name":"Si14Bet","symbol":"SI14","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/14973/thumb/logo-si14.png?1619213479"},{"chainId":1,"address":"0xa38920c00d1a5303db538a3ea08da7a779e1f751","name":"3X Long TomoChain T","symbol":"TOMOBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10170/thumb/683JEXMN_400x400_%281%29.png?1576505510"},{"chainId":1,"address":"0x0829d2d5cc09d3d341e813c821b0cfae272d9fb2","name":"Social Rocket","symbol":"ROCKS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12994/thumb/logo-256x256-1.png?1604759401"},{"chainId":1,"address":"0x2409d6059e2a8130c099e49f3cb418fd6c3d9aff","name":"BTC Fund Active Tra","symbol":"BTCFUND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11675/thumb/btc_fund_active_trading_set.png?1592573498"},{"chainId":1,"address":"0xa117000000f279d81a1d3cc75430faa017fa5a2e","name":"Aragon","symbol":"ANT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/681/thumb/JelZ58cv_400x400.png?1601449653"},{"chainId":1,"address":"0x9eb90ec3faafc22092c9b91559fddde538042093","name":"RealT Token 18900","symbol":"REALTOKEN-S-18900-M","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16697/thumb/18900-Mansfield-flowers.jpeg?1624640555"},{"chainId":1,"address":"0x4ee438be38f8682abb089f2bfea48851c5e71eaf","name":"Cryptonovae","symbol":"YAE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14693/thumb/cryptonovae_cmc_logo.png?1617810908"},{"chainId":1,"address":"0x297e4e5e59ad72b1b0a2fd446929e76117be0e0a","name":"Smart Valor","symbol":"VALOR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7231/thumb/smart_valor.png?1555925772"},{"chainId":1,"address":"0x33722ea778df197f1b7b1cf0b124d7a962181d65","name":"RealT Token 19136","symbol":"REALTOKEN-S-19136-T","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16706/thumb/19136-Tracey-hero-1.jpeg?1624644977"},{"chainId":1,"address":"0xce49c3c92b33a1653f34811a9d7e34502bf12b89","name":"3X Short Bitcoin SV","symbol":"BSVBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10329/thumb/683JEXMN_400x400_%281%29.png?1578051844"},{"chainId":1,"address":"0x06874f973dc3c96dc22a10ef0d0609f877f335ea","name":"Defi STOA","symbol":"STA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16710/thumb/RSloE6X1_400x400.jpeg?1624684021"},{"chainId":1,"address":"0x60eb57d085c59932d5faa6c6026268a4386927d0","name":"LOCGame","symbol":"LOCG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15175/thumb/LOC_GAME.png?1620025060"},{"chainId":1,"address":"0xac00797df10e825589d8b53e715393be4e617459","name":"Bubble Network","symbol":"BBL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13443/thumb/bubble_network_logo.png?1608612666"},{"chainId":1,"address":"0xc2d3ae29c8309c14994d02ecd228cf86f3efde77","name":"CurrySwap","symbol":"CURRY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13656/thumb/curry_logo.jpg?1610581982"},{"chainId":1,"address":"0x4cc53ee5ef306a95d407321d4b4acc30814c04ee","name":"RealT Token 19163","symbol":"REALTOKEN-S-19163-M","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16614/thumb/19163-Mitchell-hero-1.jpeg?1624548736"},{"chainId":1,"address":"0xa95592dcffa3c080b4b40e459c5f5692f67db7f8","name":"Elysian","symbol":"ELY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3558/thumb/elysian.png?1548124914"},{"chainId":1,"address":"0xc19b6a4ac7c7cc24459f08984bbd09664af17bd1","name":"SENSO","symbol":"SENSO","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/11064/thumb/senso.png?1587776458"},{"chainId":1,"address":"0xbe6c8f2810ef39420d2dc2901b8414c8c45fee6d","name":"Micromines","symbol":"MICRO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7000/thumb/micromines.png?1548085033"},{"chainId":1,"address":"0xc719d010b63e5bbf2c0551872cd5316ed26acd83","name":"Etherisc DIP Token","symbol":"DIP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4586/thumb/dip.png?1547039863"},{"chainId":1,"address":"0x5f75112bbb4e1af516fbe3e21528c63da2b6a1a5","name":"Chess Coin","symbol":"CHESS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9998/thumb/Webp.net-resizeimage.png?1595321722"},{"chainId":1,"address":"0x9cf7e61853ea30a41b02169391b393b901eac457","name":"sAMZN","symbol":"SAMZN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14948/thumb/sAMZN.png?1619129008"},{"chainId":1,"address":"0x8a9f904b4ead6a97f3ab304d0d2196f5c602c807","name":"RealT Token 19311","symbol":"REALTOKEN-S-19311-K","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16631/thumb/19311-Keystone-hero-1.jpeg?1624554016"},{"chainId":1,"address":"0xd4fa1460f537bb9085d22c7bccb5dd450ef28e3a","name":"Populous","symbol":"PPT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/753/thumb/populous.png?1548331905"},{"chainId":1,"address":"0xba14b245d449965bdbeb630ebe135b569474f5b1","name":"EvaCash","symbol":"EVC","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/7939/thumb/evacash-logo.jpg?1552211584"},{"chainId":1,"address":"0xd9d01d4cb824219a8f482a0fad479cb971fd0628","name":"EnterCoin","symbol":"ENTRC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8163/thumb/entrc-logo200.png?1555901482"},{"chainId":1,"address":"0x178bf8fd04b47d2de3ef3f6b3d112106375ad584","name":"Unagii Tether USD","symbol":"UUSDT","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/13778/thumb/uUSDT.png?1611729448"},{"chainId":1,"address":"0xffc16ab7d366273466c705f03cfeaca8dd964f89","name":"Kansas City Chiefs ","symbol":"CHIEFS","decimals":15,"logoURI":"https://assets.coingecko.com/coins/images/13885/thumb/chiefs_logo.png?1612497638"},{"chainId":1,"address":"0xde30da39c46104798bb5aa3fe8b9e0e1f348163f","name":"Gitcoin","symbol":"GTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15810/thumb/gitcoin.png?1621992929"},{"chainId":1,"address":"0xde5ea375ffbdc8b25a80fe13d631e8ba0ab4bb02","name":"Gera Coin","symbol":"GERA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13686/thumb/GeraCoin_Logo-icon-1000px.png?1610919942"},{"chainId":1,"address":"0xbbbbbbb5aa847a2003fbc6b5c16df0bd1e725f61","name":"B Protocol","symbol":"BPRO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15110/thumb/66428641.jpg?1619749844"},{"chainId":1,"address":"0x05079687d35b93538cbd59fe5596380cae9054a9","name":"BitSong","symbol":"BTSG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5041/thumb/logo_-_2021-01-10T210801.390.png?1610284134"},{"chainId":1,"address":"0xa6eb54102f20095679882db4c84e72e65ab782a4","name":"Magnachain","symbol":"MGC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5938/thumb/Magnachain-Logo-150x150.jpg?1547041878"},{"chainId":1,"address":"0xcca0c9c383076649604ee31b20248bc04fdf61ca","name":"AscendEx Token","symbol":"ASD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5003/thumb/bitmax.png?1621310871"},{"chainId":1,"address":"0xea7aa1edd21735a5ab05ee3e90869016191e274e","name":"Junca cash","symbol":"JCC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12889/thumb/junca.jpg?1603279160"},{"chainId":1,"address":"0xcbe430927370e95b4b10cfc702c6017ec7abefc3","name":"YD ETH JUN21","symbol":"YD-ETH-JUN21","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14499/thumb/UMA_square_red_logo.png?1616557912"},{"chainId":1,"address":"0x7dbdd9dafdc4c1c03d67925a4f85daa398af32b0","name":"Anchor Neural World","symbol":"ANW","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11104/thumb/logo_scan.png?1588567155"},{"chainId":1,"address":"0xb2dbf14d0b47ed3ba02bdb7c954e05a72deb7544","name":"MobiFi","symbol":"MOFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14697/thumb/thumbnail.png?1618978255"},{"chainId":1,"address":"0x24aef3bf1a47561500f9430d74ed4097c47f51f2","name":"Sparta","symbol":"SPARTA","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/4172/thumb/CEYM9qS.png?1547039440"},{"chainId":1,"address":"0x06677dc4fe12d3ba3c7ccfd0df8cd45e4d4095bf","name":"Work Quest","symbol":"WQT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14662/thumb/workquest_logo.jpg?1617622192"},{"chainId":1,"address":"0x9e46a38f5daabe8683e10793b06749eef7d733d1","name":"PolySwarm","symbol":"NCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2843/thumb/polyswarm.png?1548331600"},{"chainId":1,"address":"0x20c36f062a31865bed8a5b1e512d9a1a20aa333a","name":"DefiDollar DAO","symbol":"DFD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12959/thumb/DFD.jpg?1604415975"},{"chainId":1,"address":"0x0e7f79e89ba8c4a13431129fb2db0d4f444b5b9a","name":"Xank","symbol":"XANK","decimals":16,"logoURI":"https://assets.coingecko.com/coins/images/11599/thumb/9zAYweVj_400x400.png?1591671435"},{"chainId":1,"address":"0x6f02055e3541dd74a1abd8692116c22ffafadc5d","name":"The Mart Token","symbol":"TMT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9963/thumb/tmt.png?1585317430"},{"chainId":1,"address":"0x321c2fe4446c7c963dc41dd58879af648838f98d","name":"Cryptex Finance","symbol":"CTX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14932/thumb/glossy_icon_-_C200px.png?1619073171"},{"chainId":1,"address":"0x41bc0913ed789428e107c4ea9ed007815c5a8230","name":"Kompass","symbol":"KOMP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12655/thumb/kompass_symbol.png?1601436438"},{"chainId":1,"address":"0x888888877a18532b78d259577d00057054c50dd8","name":"Universal Dollar","symbol":"U8D","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13766/thumb/Gn8x1TZN_400x400.jpg?1611662713"},{"chainId":1,"address":"0xfc98e825a2264d890f9a1e68ed50e1526abccacd","name":"Moss Carbon Credit","symbol":"MCO2","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14414/thumb/ENtxnThA_400x400.jpg?1615948522"},{"chainId":1,"address":"0x861b2456ac1a6ab5fb5c72aa456091f23ddec1cc","name":"Vaultz","symbol":"VAULTZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13488/thumb/vaultz_logo.jpg?1609112163"},{"chainId":1,"address":"0x97cb5cc1b2e10cc56dc16ab9179f06dfedbe41a2","name":"MobilinkToken","symbol":"MOLK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2989/thumb/MobilinkToken.png?1547037251"},{"chainId":1,"address":"0x388fd8a5145d6ef85aae14d494f93df9d1c7c00c","name":"BitcoinRegular","symbol":"BTRL","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7321/thumb/6N4N8s9l_400x400.jpg?1547043978"},{"chainId":1,"address":"0x41b3f18c6384dc9a39c33afeca60d9b8e61eaa9f","name":"Noah Decentralized ","symbol":"NOAHP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3442/thumb/FvG3XweD.png?1610437675"},{"chainId":1,"address":"0xd9016a907dc0ecfa3ca425ab20b6b785b42f2373","name":"GAMEE","symbol":"GMEE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14716/thumb/gmee-200x200.png?1621827468"},{"chainId":1,"address":"0x37611b28aca5673744161dc337128cfdd2657f69","name":"Goat Coin","symbol":"GOAT","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15525/thumb/qqked5P.png?1621126222"},{"chainId":1,"address":"0x73104e9d3da91e410a6c211068f7bffabbbd3e26","name":"ETH Moonshot X Set","symbol":"ETHMOONX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10583/thumb/eth_moonshot_x.png?1580960848"},{"chainId":1,"address":"0xd6327ce1fb9d6020e8c2c0e124a1ec23dcab7536","name":"Cum Inu","symbol":"CUMINU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15832/thumb/suz7x7WV_400x400.png?1622066931"},{"chainId":1,"address":"0xae8488e75493b89a0e1488bf91542208c416f486","name":"Buzcoin","symbol":"BUZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5219/thumb/buzcoin-logo.png?1547040688"},{"chainId":1,"address":"0x668f7dfb8c8d716839fa5dbea317d8723ebe6110","name":"SMSCodes","symbol":"SMSCT","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/16014/thumb/logo200_%2813%29.png?1622609030"},{"chainId":1,"address":"0x687bfc3e73f6af55f0ccca8450114d107e781a0e","name":"QChi","symbol":"QCH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5392/thumb/qchi.png?1548607478"},{"chainId":1,"address":"0xeffea57067e02999fdcd0bb45c0f1071a29472d9","name":"Zantepay","symbol":"ZANTEPAY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7122/thumb/984cSZaC_400x400.jpg?1547043619"},{"chainId":1,"address":"0x8d137e3337eb1b58a222fef2b2cc7c423903d9cf","name":"SQGL Vault NFTX ","symbol":"SQGL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17041/thumb/SQGL.png?1626147070"},{"chainId":1,"address":"0x70a6d0d1561ba98711e935a76b1c167c612978a2","name":"Dragonfly Protocol","symbol":"DFLY","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13416/thumb/dfly_logo.png?1608341835"},{"chainId":1,"address":"0xf0c6521b1f8ad9c33a99aaf056f6c6247a3862ba","name":"ETH limiteD","symbol":"ELD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13413/thumb/Untitled-design-6-removebg-preview_%281%29.png?1608275516"},{"chainId":1,"address":"0x1715ac0743102bf5cd58efbb6cf2dc2685d967b6","name":"sDOT","symbol":"SDOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15729/thumb/sdot_final.PNG?1621669683"},{"chainId":1,"address":"0xff44b5719f0b77a9951636fc5e69d3a1fc9e7d73","name":"4ART Coin","symbol":"4ART","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4690/thumb/0_%284%29.png?1595544690"},{"chainId":1,"address":"0x420ab548b18911717ed7c4ccbf46371ea758458c","name":"NOODLE Finance","symbol":"NOODLE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12311/thumb/noodle.jpg?1599053738"},{"chainId":1,"address":"0x75d669c53142302c8826d16b5689bffad50a7e18","name":"Smilecoin","symbol":"SEC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15344/thumb/smile_coin.PNG?1620617696"},{"chainId":1,"address":"0x38d58b82cb24a3e0410a7991f255174c9fd8093b","name":"TEAL","symbol":"TEAT","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/13062/thumb/teat_logo.png?1604845769"},{"chainId":1,"address":"0xda022ca91df99413e8cb0caab4d1cba4e9018bea","name":"JMTIME","symbol":"JMT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7397/thumb/SQA_voBI.png?1555664534"},{"chainId":1,"address":"0xfebc25f4c5fc3e90a7efae0b4d436a77c9e131b3","name":"Cezo","symbol":"CEZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13461/thumb/2_hj7B4Z_400x400.jpg?1608764687"},{"chainId":1,"address":"0x6e1a58e7e9e801f32bb82462636a8a2e7b65e036","name":"LCG","symbol":"LCG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12851/thumb/LCG_token.jpg?1603083545"},{"chainId":1,"address":"0xec58d3aefc9aaa2e0036fa65f70d569f49d9d1ed","name":"uSTONKS Index Token","symbol":"USTONKS-APR21","decimals":6},{"chainId":1,"address":"0xfc05987bd2be489accf0f509e44b0145d68240f7","name":"Essentia","symbol":"ESS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2483/thumb/Essentia-token.jpg?1547036604"},{"chainId":1,"address":"0xc20464e0c373486d2b3335576e83a218b1618a5e","name":"Datarius Credit","symbol":"DTRC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2794/thumb/Datarius-Logo.png?1547036972"},{"chainId":1,"address":"0x5cbb89b03534d82692b183882c2a2a9ff7fdeb44","name":"BGT","symbol":"BGT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6666/thumb/bgt.jpg?1547042870"},{"chainId":1,"address":"0x9d5e6b92ba3f75589943372df82dbd3a8a802e80","name":"FINPLE","symbol":"FPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10260/thumb/aH4x0_6B6qaFjtyw9xn9HSyp1MwOpXOu8d-Anaxd0h9LyfPDIiq9EQ9dwKMx3fRQctuRbXG9RNVxtT58qcGmhvr9D-zl2B0NMIL2ywbcWUcLlgVSft0T8u0GGhsCHx6_3J_yUS4zqjJkmhrcC5Tm3e3ahBvRTFsz1jH4ptUt9niucuh2K9hprP_XKuVR1EXEjUa5dT47ZjWqjmk.jpg?1576795549"},{"chainId":1,"address":"0x538a151dd910c1d1227719bd400d6c4f99ea06d0","name":"Cryptochrome","symbol":"CHM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13028/thumb/cryptochrome_logo.png?1604461218"},{"chainId":1,"address":"0xf43b2f981efc5a611a97951ce4fd7d3bd87f4902","name":"BullBearEthereum Se","symbol":"BBE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10902/thumb/bullbearethereum.png?1585730791"},{"chainId":1,"address":"0xccf4429db6322d5c611ee964527d42e5d685dd6a","name":"cWBTC","symbol":"CWBTC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10823/thumb/cwbtc.png?1584331700"},{"chainId":1,"address":"0xcfbf70e33d5163e25b0dad73955c1bd9e8cd8ba2","name":"WinStars Live","symbol":"WNL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4178/thumb/HEq48ZDOCvVTVFw8J8qws9les1E27b_8F_k34sVhpwULn3muT66wiQI9HjNNUhGLELkGGSi0daPgxt8YHjbRqHzX1uurAbySQdtr_FW0GRBNN3CEWGU03Vn_z9NdJiGHV193Y_RWPDAGlm69ISIMSdTxT34VycLZTMrgJeWaNXrblBrXpPprJXKDJCKsa_Wt1jofCsygfNLdWQ0j_.jpg?1563768641"},{"chainId":1,"address":"0x05edffbda103d90d5040829a105f687443e0ca3e","name":"Woyager","symbol":"WYX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7404/thumb/PNG-amblem.png?1547085374"},{"chainId":1,"address":"0xff8be4b22cedc440591dcb1e641eb2a0dd9d25a5","name":"Uranus","symbol":"URAC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4683/thumb/Leood48Z_400x400.jpg?1563118461"},{"chainId":1,"address":"0x3ff426ca07a9f589a80f18cccc759e84cf06f0eb","name":"Employment Coin","symbol":"EC2","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13773/thumb/logoNav.png?1611699039"},{"chainId":1,"address":"0x76c5449f4950f6338a393f53cda8b53b0cd3ca3a","name":"BT Finance","symbol":"BT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13824/thumb/BT-logo.324f553c.png?1612152632"},{"chainId":1,"address":"0x5bb1632fa0023e1aa76a1ae92b4635c8dba49fa2","name":"GastroAdvisor","symbol":"FORK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6089/thumb/Gastro-logo-black.png?1549082587"},{"chainId":1,"address":"0x1ee01654665303a5dd2744e30b576941880e3a73","name":"DFNORM Vault NFTX ","symbol":"DFNORM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17078/thumb/DFNORM.png?1626154202"},{"chainId":1,"address":"0x7a41e0517a5eca4fdbc7fbeba4d4c47b9ff6dc63","name":"Zeusshield","symbol":"ZSC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1009/thumb/zeusshield.png?1548761440"},{"chainId":1,"address":"0x001a8ffcb0f03e99141652ebcdecdb0384e3bd6c","name":"Polker","symbol":"PKR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16803/thumb/200x200-PKR_Chip.png?1625589565"},{"chainId":1,"address":"0xba100000625a3754423978a60c9317c58a424e3d","name":"Balancer","symbol":"BAL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11683/thumb/Balancer.png?1592792958"},{"chainId":1,"address":"0x2f85e502a988af76f7ee6d83b7db8d6c0a823bf9","name":"LatiumX","symbol":"LATX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/3500/thumb/latium.jpg?1547038261"},{"chainId":1,"address":"0xc05d14442a510de4d3d71a3d316585aa0ce32b50","name":"LINA","symbol":"LINA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5412/thumb/linalogo.png?1551083963"},{"chainId":1,"address":"0xf2ddae89449b7d26309a5d54614b1fc99c608af5","name":"ASTA","symbol":"ASTA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11123/thumb/asta_logo.png?1588734656"},{"chainId":1,"address":"0xf6bf74a97d78f2242376769ef1e79885cf1f0c1c","name":"KAASO","symbol":"KAASO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9657/thumb/KAASO.png?1570436692"},{"chainId":1,"address":"0xc949fc82a15964fb5b97e5cf8f9ffed139086821","name":"PGPay","symbol":"PGPAY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6351/thumb/pgpay-logo.jpg?1582515723"},{"chainId":1,"address":"0x22602469d704bffb0936c7a7cfcd18f7aa269375","name":"sETC","symbol":"SETC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11804/thumb/sETC.png?1616150166"},{"chainId":1,"address":"0x0d9227f9c4ab3972f994fccc6eeba3213c0305c4","name":"SERGS Governance","symbol":"SSL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12790/thumb/1SSL_Ticker_Etherscan_256x256.png?1607928756"},{"chainId":1,"address":"0xbce7bd79558dda90b261506768f265c5543a9f90","name":"TKN Token","symbol":"TKNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12808/thumb/1_jLY3Tj0kuBTjZGHFCqkTGA.png?1602713481"},{"chainId":1,"address":"0xc4199fb6ffdb30a829614beca030f9042f1c3992","name":"snglsDAO Governance","symbol":"SGT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11823/thumb/SGT-icon.png?1594681863"},{"chainId":1,"address":"0x29239242a83479a4074cb1c9e2a3e6705a4a4455","name":"Tozex","symbol":"TOZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13772/thumb/Logo_toz_200x200.png?1611698823"},{"chainId":1,"address":"0x191557728e4d8caa4ac94f86af842148c0fa8f7e","name":"Ormeus Ecosystem","symbol":"ECO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8923/thumb/logo_eco_low.png?1562902804"},{"chainId":1,"address":"0xe41d2489571d322189246dafa5ebde1f4699f498","name":"0x","symbol":"ZRX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/863/thumb/0x.png?1547034672"},{"chainId":1,"address":"0xcc1a8bd438bebc4b2a885a34475bb974f2124317","name":"Whole Earth Coin","symbol":"WEC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16313/thumb/wec.PNG?1623729041"},{"chainId":1,"address":"0x78571accaf24052795f98b11f093b488a2d9eaa4","name":"Rocket Token","symbol":"RCKT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12262/thumb/IAY0DFX4_400x400.jpg?1598584324"},{"chainId":1,"address":"0x42d6622dece394b54999fbd73d108123806f6a18","name":"SpankChain","symbol":"SPANK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1226/thumb/spankchain.png?1548610811"},{"chainId":1,"address":"0x6aca6de211ee17d38d05c7af583e43f9b1ec4c07","name":"Uploadea","symbol":"UPL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14642/thumb/logo-200_%282%29.png?1617486019"},{"chainId":1,"address":"0xf4d861575ecc9493420a3f5a14f85b13f0b50eb3","name":"Fractal","symbol":"FCL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14096/thumb/fractal_logo.png?1614264502"},{"chainId":1,"address":"0xa8eda9d4aee0eb882f8752c6ba7e16d9233c9ad2","name":"LevelApp","symbol":"LVL","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5588/thumb/n5DaGBqY_400x400.jpg?1559789019"},{"chainId":1,"address":"0xe748269494e76c1cec3f627bb1e561e607da9161","name":"XELS","symbol":"XELS","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/14729/thumb/Xels_logo_square_%281%29.png?1617957186"},{"chainId":1,"address":"0x37f74e99794853777a10ea1dc08a64c86958f06a","name":"D Community","symbol":"DILI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9485/thumb/BYf_d6kekNWOY34VLGPvf7RcVj8SeRi7P65Nk0W7ji1jir_qSLfssffnNW0ZzQSWzhhsNRkMCL7qcX4CCaMTbgKb0D7b5yNeStKVMm2deZd9cONMuItgoKUXxIYkHElfk1PW2uiNZbg6a2K0OHtZTvkt1xo8YVKuthskXaryOkM6Ax-MXQlHOfbjwCcnQQjHxAucufrCZJfDgrY.jpg?1571685571"},{"chainId":1,"address":"0x2b2b0559081c41e962777b5049632fdb30f7e652","name":"BitDefi","symbol":"BFI","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13076/thumb/bitdefi256x256.png?1604907555"},{"chainId":1,"address":"0x7c9d8fb3bde3d9ea6e89170618c2dc3d16695d36","name":"WhiteRockCasino","symbol":"WRC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11962/thumb/cwSeVyY.png?1605338879"},{"chainId":1,"address":"0x646cec6ee42d258336165cbbd5deb4af14f0f476","name":"Solar DAO","symbol":"SDAO","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/1625/thumb/solar-dao.jpg?1547035842"},{"chainId":1,"address":"0x461733c17b0755ca5649b6db08b3e213fcf22546","name":"ATN","symbol":"ATN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2542/thumb/atn.png?1547036658"},{"chainId":1,"address":"0x996229d0c6a485c7f4b52e092eaa907cb2def5c6","name":"BuckHath Coin","symbol":"BHIG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7821/thumb/logstex.PNG?1585121237"},{"chainId":1,"address":"0x87047986e8e4961c11d2edcd94285e3a1331d97b","name":"Yakuza DFO","symbol":"YKZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12413/thumb/UeUSmpx.png?1601970433"},{"chainId":1,"address":"0xcc4ae94372da236e9b113132e0c46c68704246b9","name":"Tagcoin ERC 20","symbol":"TAG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14169/thumb/TAG.png?1614756882"},{"chainId":1,"address":"0x4185cf99745b2a20727b37ee798193dd4a56cdfa","name":"DEUS Synthetic Coin","symbol":"WCOINBASE-IOU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13444/thumb/coinbase-black.png?1608629833"},{"chainId":1,"address":"0x4b742b5bdb1d252907ae7f399a891d4a178dbc24","name":"B ONE PAYMENT","symbol":"B1P","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10865/thumb/68rvfmWK_400x400.jpg?1585522355"},{"chainId":1,"address":"0xc5bddf9843308380375a611c18b50fb9341f502a","name":"veCRV DAO yVault","symbol":"YVE-CRVDAO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13065/thumb/yearn_veCRV.png?1612862859"},{"chainId":1,"address":"0x874d4c9b980f1a13dd44cbcdb912e24ef0671ed0","name":"Guider","symbol":"GDR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8425/thumb/mROuNfEF_400x400.png?1571308333"},{"chainId":1,"address":"0x8578530205cecbe5db83f7f29ecfeec860c297c2","name":"smARTOFGIVING","symbol":"AOG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6050/thumb/logo_%286%29.png?1547042007"},{"chainId":1,"address":"0x1c8266a4369af6d80df2659ba47b3c98f35cb8be","name":"Koji","symbol":"KOJI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16124/thumb/koji-token-200.png?1623039354"},{"chainId":1,"address":"0xa1248c718d52752b2cc257eeb0eba900408daeb8","name":"SWYFT","symbol":"SWYFTT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10672/thumb/SWYFT_Logo_250x250.png?1582280902"},{"chainId":1,"address":"0x253444bd9ecf11e5516d6d00974e91c9f0857ccb","name":"ETH BTC Long Only A","symbol":"EBLOAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11004/thumb/sw_ethbtc_set.png?1587089906"},{"chainId":1,"address":"0xd3c89cac4a4283edba6927e2910fd1ebc14fe006","name":"Moona ","symbol":"MOOI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14125/thumb/mooi.png?1617866132"},{"chainId":1,"address":"0xb81d70802a816b5dacba06d708b5acf19dcd436d","name":"Dextoken Governance","symbol":"DEXG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12223/thumb/dextoken-logo-v2_200.png?1598408669"},{"chainId":1,"address":"0x1b9aa0b63e0f025cd544e4d350ed81429b43b724","name":"TOSHIMON Vault NFT","symbol":"TOSHIMON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17062/thumb/256x256.png?1626150657"},{"chainId":1,"address":"0x1c4481750daa5ff521a2a7490d9981ed46465dbd","name":"Blockmason Credit P","symbol":"BCPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1022/thumb/mason.jpg?1547034948"},{"chainId":1,"address":"0x79c75e2e8720b39e258f41c37cc4f309e0b0ff80","name":"Phantasma","symbol":"SOUL","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/4130/thumb/phantasma.png?1548331035"},{"chainId":1,"address":"0x24e3794605c84e580eea4972738d633e8a7127c8","name":"Katalyo","symbol":"KTLYO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13347/thumb/katalyo_logo_aqua_256.png?1607762430"},{"chainId":1,"address":"0x6f919d67967a97ea36195a2346d9244e60fe0ddb","name":"Blockcloud","symbol":"BLOC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4572/thumb/Xd1i27EM_400x400.jpg?1547039854"},{"chainId":1,"address":"0xbff89386d062c6040ed1955e180c87dd00bb71af","name":"Hedge Tech Governan","symbol":"HTG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14505/thumb/hgt_logo.png?1616569312"},{"chainId":1,"address":"0x86ed939b500e121c0c5f493f399084db596dad20","name":"SpaceChain ERC 20 ","symbol":"SPC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6659/thumb/Spacechain.jpg?1547042861"},{"chainId":1,"address":"0x2c756e74b7309d785b5e2960ef262c4f14a87930","name":"SPENDER X","symbol":"SPDX","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/9259/thumb/spdx.PNG?1565650786"},{"chainId":1,"address":"0xfd8971d5e8e1740ce2d0a84095fca4de729d0c16","name":"Zilla","symbol":"ZLA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2805/thumb/zilla.png?1548761449"},{"chainId":1,"address":"0x11613b1f840bb5a40f8866d857e24da126b79d73","name":"Cappasity","symbol":"CAPP","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/1302/thumb/cappasity.png?1547564648"},{"chainId":1,"address":"0xdef1fac7bf08f173d286bbbdcbeeade695129840","name":"DeFi Factory Token","symbol":"DEFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15792/thumb/image_2021_04_28T17_49_24_564Z.png?1621903614"},{"chainId":1,"address":"0xdd974d5c2e2928dea5f71b9825b8b646686bd200","name":"Kyber Network Cryst","symbol":"KNCL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/947/thumb/logo-kncl.png?1618984814"},{"chainId":1,"address":"0x865bfd8232778f00cae81315bf75ef1fe6e30cdd","name":"ABLE X Token","symbol":"ABLX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4730/thumb/able.png?1547040033"},{"chainId":1,"address":"0x1fc5ef0337aea85c5f9198853a6e3a579a7a6987","name":"ReapChain","symbol":"REAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13109/thumb/REAP.jpg?1605259422"},{"chainId":1,"address":"0xbae5f2d8a1299e5c4963eaff3312399253f27ccb","name":"Soar","symbol":"SOAR","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13718/thumb/soar_logo-e1610311708668.png?1611125359"},{"chainId":1,"address":"0x1f8f123bf24849443a56ed9fc42b9265b7f3a39a","name":"UniTopia Token","symbol":"UTO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11922/thumb/logo200.png?1596101623"},{"chainId":1,"address":"0xd34c9281585866a9fb2af0931adb1fa35ed44039","name":"Be Gaming Coin","symbol":"BGC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13503/thumb/logo_%2897%29.png?1614982763"},{"chainId":1,"address":"0xf485c5e679238f9304d986bb2fc28fe3379200e5","name":"ugChain","symbol":"UGC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2557/thumb/ugchain.png?1548759478"},{"chainId":1,"address":"0x0763fdccf1ae541a5961815c0872a8c5bc6de4d7","name":"SUKU","symbol":"SUKU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11969/thumb/UmfW5S6f_400x400.jpg?1596602238"},{"chainId":1,"address":"0x813b428af3920226e059b68a62e4c04933d4ea7a","name":"Decentralized Asset","symbol":"DATP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6565/thumb/Decentralized_Asset_Trading_Platform.jpg?1547042776"},{"chainId":1,"address":"0xada86b1b313d1d5267e3fc0bb303f0a2b66d0ea7","name":"Covesting","symbol":"COV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1950/thumb/covesting.png?1547036237"},{"chainId":1,"address":"0x9a005c9a89bd72a4bd27721e7a09a3c11d2b03c4","name":"CoinStarter","symbol":"STC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1759/thumb/ll6FVzPA_400x400.jpg?1564997523"},{"chainId":1,"address":"0x0dde6f6e345bfd23f3f419f0dfe04e93143b44fb","name":"SOTA Finance","symbol":"SOTA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14067/thumb/sota_logo.png?1614132527"},{"chainId":1,"address":"0x5299d6f7472dcc137d7f3c4bcfbbb514babf341a","name":"sXMR","symbol":"SXMR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11625/thumb/sXMR.png?1616150880"},{"chainId":1,"address":"0x9ccbd05d4d25c745d49f5e6bf17e09113eb4c769","name":"Decentralized Crypt","symbol":"DCTO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7040/thumb/dcto-logo.png?1547043482"},{"chainId":1,"address":"0xea610b1153477720748dc13ed378003941d84fab","name":"ALIS","symbol":"ALIS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1003/thumb/alis.png?1547034909"},{"chainId":1,"address":"0x454cb9d0845bb4a28462f98c21a4fafd16ceb25f","name":"Yearn finance Infra","symbol":"YLAB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12744/thumb/kKGUHNFn_400x400.jpg?1602193258"},{"chainId":1,"address":"0x74159651a992952e2bf340d7628459aa4593fc05","name":"Tenet","symbol":"TEN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13545/thumb/iMqC3F_p_400x400.png?1609711856"},{"chainId":1,"address":"0x3137619705b5fc22a3048989f983905e456b59ab","name":"Everus","symbol":"EVR","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1027/thumb/everus.png?1547395108"},{"chainId":1,"address":"0x970b9bb2c0444f5e81e9d0efb84c8ccdcdcaf84d","name":"Fuse","symbol":"FUSE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10347/thumb/vUXKHEe.png?1601523640"},{"chainId":1,"address":"0xab7aaf9e485a3bc885985184abe9fc6aba727bd6","name":"MANY","symbol":"MANY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12577/thumb/MANY_logo_NoBanksNearby.png?1601347315"},{"chainId":1,"address":"0x795dbf627484f8248d3d6c09c309825c1563e873","name":"SNP Token","symbol":"SNP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15995/thumb/snp.PNG?1622587224"},{"chainId":1,"address":"0x1c48f86ae57291f7686349f12601910bd8d470bb","name":"USDK","symbol":"USDK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8824/thumb/usdk.png?1563418517"},{"chainId":1,"address":"0x33e70c9efabdf151f5c674a4addc104874980c3f","name":"BUNNY Vault NFTX ","symbol":"BUNNY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17049/thumb/BUNNY.png?1626148809"},{"chainId":1,"address":"0x8c4e7f814d40f8929f9112c5d09016f923d34472","name":"XCELTOKEN PLUS","symbol":"XLAB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8508/thumb/CXQJPNyO_400x400.jpg?1559030200"},{"chainId":1,"address":"0x70a63225bcadacc4430919f0c1a4f0f5fcffbaac","name":"VEY","symbol":"VEY","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/7282/thumb/dkDh4z0a_400x400.jpg?1547043914"},{"chainId":1,"address":"0x56ed2f7dac19243df100bac10364c56df20cb1e9","name":"Brapper Token","symbol":"BRAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10962/thumb/photo_2019-09-12_01-04-13-400x400.jpg?1586506435"},{"chainId":1,"address":"0x67a83b28f6dd8c07301495ee2c6f83b73fd21092","name":"RealT Token 9309 ","symbol":"REALTOKEN-S-9309-CO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16686/thumb/9309x-1.jpeg?1624634539"},{"chainId":1,"address":"0xbc0d84fa6260e065f330d51621d682d2630f4aa2","name":"BeatBind","symbol":"BBND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16951/thumb/beatbind-logo.png?1625836007"},{"chainId":1,"address":"0xcd46d92c46be1dbbd5ccc497e95611abe9d507bc","name":"FACE Vault NFTX ","symbol":"FACE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17039/thumb/FACE.png?1626146356"},{"chainId":1,"address":"0x6febd6be8fa45be6a5eeb61a17c82d33b9addd41","name":"IDL Token","symbol":"IDL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13499/thumb/IDL_Logo.png?1609194848"},{"chainId":1,"address":"0xdcdc1c1cc33aa817cbdbe8f5e2390bf7cc43dc4b","name":"AVASTR Vault NFTX ","symbol":"AVASTR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17034/thumb/AVASTR.png?1626142802"},{"chainId":1,"address":"0x3004cf8b4e28d60f4e305df25a57cd5faf37b8d5","name":"BSYS","symbol":"BSYS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11532/thumb/4PvxXDdP_400x400_%281%29.jpg?1590720588"},{"chainId":1,"address":"0x114f1388fab456c4ba31b1850b244eedcd024136","name":"COOL Vault NFTX ","symbol":"COOL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17032/thumb/COOL.png?1626142075"},{"chainId":1,"address":"0xe0b9bcd54bf8a730ea5d3f1ffce0885e911a502c","name":"ZUM TOKEN","symbol":"ZUM","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9721/thumb/zum256x256.png?1571264005"},{"chainId":1,"address":"0xf784682c82526e245f50975190ef0fff4e4fc077","name":"INLOCK","symbol":"ILK","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9377/thumb/inlock_kor_logo.png?1623246682"},{"chainId":1,"address":"0xa685a61171bb30d4072b338c80cb7b2c865c873e","name":"Aave MANA","symbol":"AMANA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14267/thumb/aMANA.f89a1098.png?1615528680"},{"chainId":1,"address":"0xdf59c8ba19b4d1437d80836b45f1319d9a429eed","name":"IZIChain","symbol":"IZI","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/6405/thumb/logo-icon-200x200.png?1547617296"},{"chainId":1,"address":"0x7240ac91f01233baaf8b064248e80feaa5912ba3","name":"OctoFi","symbol":"OCTO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12594/thumb/octofi-256x256-radius-22percent.png?1610679969"},{"chainId":1,"address":"0x96b52b5bf8d902252d0714a1bd2651a785fd2660","name":"EtherBone","symbol":"ETHBN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11596/thumb/ETHBN.png?1615803426"},{"chainId":1,"address":"0xc713e5e149d5d0715dcd1c156a020976e7e56b88","name":"Aave MKR","symbol":"AMKR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14248/thumb/aMKR.ac965178.png?1615528346"},{"chainId":1,"address":"0x66186008c1050627f979d464eabb258860563dbe","name":"MediShares","symbol":"MDS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1343/thumb/medishares.png?1547978625"},{"chainId":1,"address":"0x3fe7940616e5bc47b0775a0dccf6237893353bb4","name":"IdleDAI Best Yield","symbol":"IDLEDAIYIELD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11901/thumb/idledai_32.png?1595990312"},{"chainId":1,"address":"0x3fd2e747cea0e8a78f1827ea2ffd3334628a600b","name":"Banklife","symbol":"LIB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9937/thumb/BBcbNG1w_400x400.jpg?1573594562"},{"chainId":1,"address":"0xe17f017475a709de58e976081eb916081ff4c9d5","name":"RMPL","symbol":"RMPL","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12122/thumb/rmpl_logo.jpg?1597298400"},{"chainId":1,"address":"0xa3a3f076413a362bb0d69eea1dc5b0e79c831edc","name":"Cocaine Cowboy Shar","symbol":"COKE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12937/thumb/Cocaine_Cowboy.png?1603720411"},{"chainId":1,"address":"0xabc430136a4de71c9998242de8c1b4b97d2b9045","name":"Veros","symbol":"VRS","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/539/thumb/vrs_logo.png?1583913100"},{"chainId":1,"address":"0x62a56a4a2ef4d355d34d10fbf837e747504d38d4","name":"Paypex","symbol":"PAYX","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/1189/thumb/paypex.png?1548330810"},{"chainId":1,"address":"0x73a9fb46e228628f8f9bb9004eca4f4f529d3998","name":"Wrapped LEO","symbol":"WLEO","decimals":3,"logoURI":"https://assets.coingecko.com/coins/images/12626/thumb/4XfO3w3.png?1601286769"},{"chainId":1,"address":"0xb6ca7399b4f9ca56fc27cbff44f4d2e4eef1fc81","name":"Muse","symbol":"MUSE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13230/thumb/muse_logo.png?1606460453"},{"chainId":1,"address":"0xd36a0e7b741542208ae0fbb35453c893d0136625","name":"ITO Utility Token","symbol":"IUT","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/8420/thumb/300x300.png?1592800024"},{"chainId":1,"address":"0x66e5d4063219a54a8244078affb49e23982d9640","name":"UZURAS","symbol":"UZZ","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7306/thumb/uzura.png?1572096519"},{"chainId":1,"address":"0x641927e970222b10b2e8cdbc96b1b4f427316f16","name":"MEEB Vault NFTX ","symbol":"MEEB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17044/thumb/Meebs.png?1626147616"},{"chainId":1,"address":"0x017b584acfd16d767541ae9e80cdc702f4527b0b","name":"ASYAGRO","symbol":"ASY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10632/thumb/c0Q4z8HJ_400x400.jpg?1581203764"},{"chainId":1,"address":"0x6ec8a24cabdc339a06a172f8223ea557055adaa5","name":"Genaro Network","symbol":"GNX","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/1361/thumb/genaro-network.png?1547035387"},{"chainId":1,"address":"0xef0fda1d4bd73ddc2f93a4e46e2e5adbc2d668f4","name":"ETH 20 Day MA Cross","symbol":"ETHMACOAPY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10601/thumb/eth-20-day-moving-average-ctoken-set.png?1580968662"},{"chainId":1,"address":"0x0f02e27745e3b6e9e1310d19469e2b5d7b5ec99a","name":"Peculium","symbol":"PCL","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/2211/thumb/pcl.png?1585122309"},{"chainId":1,"address":"0x5edc1a266e8b2c5e8086d373725df0690af7e3ea","name":"YottaChain","symbol":"YTA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9197/thumb/lq0YNNPmLKW-aMKOZxJxgPgsISc6FfVwjZFwqA3rY_03jRf4BcLeNK4fR535U2UgBaSgSm4ZNrdaS7TsEygObg4W9wzL3rmOaMnG5byfjc2N7OsZRlI7S97jyFCnoFm3kd-qqCrgMQHoUz--jCS0q3kmcdfVWP_AP0SdQZjRJ5iGKyDLIkDRbHP45mfWDXLhe6F6BaJ65qAJddXjG.jpg?1565076600"},{"chainId":1,"address":"0x5df94780f00140fe72d239d0d261f7797e3fbd1b","name":"QChi Chain","symbol":"QHC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12642/thumb/logo.png?1601370470"},{"chainId":1,"address":"0xe8e06a5613dc86d459bc8fb989e173bb8b256072","name":"Feyorra","symbol":"FEY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13689/thumb/1_XiKKk5_400x400.jpg?1610953208"},{"chainId":1,"address":"0x66bad545596fb17a0b4ebdc003a85def10e8f6ae","name":"Wiki Token","symbol":"WIKI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5414/thumb/wiki-token-logo.jpg?1547041078"},{"chainId":1,"address":"0x687174f8c49ceb7729d925c3a961507ea4ac7b28","name":"Gatcoin","symbol":"GAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2566/thumb/gatcoin.png?1547036691"},{"chainId":1,"address":"0xad0887734461af8c6033068bde4047dbe84074cc","name":"Arbiswap","symbol":"ASWAP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12827/thumb/logo_%283%29.png?1602831070"},{"chainId":1,"address":"0xa81f77e8988b28fb74243b907ace3c83353dc80a","name":"RealT Token 15634","symbol":"REALTOKEN-S-15634-L","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16703/thumb/Liberal-1.png?1624643634"},{"chainId":1,"address":"0x601938988f0fdd937373ea185c33751462b1d194","name":"Etherpay","symbol":"ETHPY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12417/thumb/Captura-de-Tela-2020-09-09-a-s-13-54-20.png?1599692074"},{"chainId":1,"address":"0x54a9ed327f2614316914c3f3a782a77d0aa47aee","name":"Connect","symbol":"CNCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5487/thumb/Connect.png?1547041229"},{"chainId":1,"address":"0x4fd5b9b5dcc9a5d5931d007ba4ae573e760d9b64","name":"Morality","symbol":"MO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12961/thumb/SRy1GCaK_400x400.png?1603853062"},{"chainId":1,"address":"0xe692c8d72bd4ac7764090d54842a305546dd1de5","name":"ANY Blocknet","symbol":"ABLOCK","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/14869/thumb/blocknet.jpg?1618816800"},{"chainId":1,"address":"0x4d807509aece24c0fa5a102b6a3b059ec6e14392","name":"Menlo One","symbol":"ONE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3947/thumb/menlo-one.png?1547038971"},{"chainId":1,"address":"0xd778e4f5450ede47289fef874a37b79db77c4cf1","name":"YFIA","symbol":"YFIA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12846/thumb/Untitled-design-11.png?1603061697"},{"chainId":1,"address":"0x47dac6bd80f024575a6d367af5ba8e89202a09fc","name":"OXO Farm","symbol":"OXO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15107/thumb/OXO200.png?1619734005"},{"chainId":1,"address":"0x44197a4c44d6a059297caf6be4f7e172bd56caaf","name":"Eltcoin","symbol":"ELTCOIN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1118/thumb/eltcoin.png?1547958349"},{"chainId":1,"address":"0xe138fda441fc31b36171122397a8a11d6cd2c479","name":"Global Trust Coin","symbol":"GTC","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/7752/thumb/gtib.png?1550222444"},{"chainId":1,"address":"0xdb7eab9ba6be88b869f738f6deeba96d49fe13fd","name":"Boom Token","symbol":"BOOM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9004/thumb/fxIdfHb4_400x400.png?1563577165"},{"chainId":1,"address":"0xe0bdfe2ce51f44556309665d59818ccb541ff067","name":"Crypto Puzzles","symbol":"CPTE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15216/thumb/3_Black___Yellow_2x.png?1620114026"},{"chainId":1,"address":"0x1fe70be734e473e5721ea57c8b5b01e6caa52686","name":"BitRent","symbol":"RNTB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3499/thumb/photo.png?1547273521"},{"chainId":1,"address":"0x667102bd3413bfeaa3dffb48fa8288819e480a88","name":"Tokenize Xchange","symbol":"TKX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/4984/thumb/Tokenize.png?1561602968"},{"chainId":1,"address":"0x06d0e5aee443093ac5635b709c8a01342e59df19","name":"RealT Token 10617","symbol":"REALTOKEN-S-10617-H","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16709/thumb/10617-Hathaway-hero-1.jpeg?1624647056"},{"chainId":1,"address":"0x91af0fbb28aba7e31403cb457106ce79397fd4e6","name":"Aergo","symbol":"AERGO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4490/thumb/Aergo.png?1558084282"},{"chainId":1,"address":"0xf947b0824c3995787efc899017a36bc9f281265e","name":"Lotoblock","symbol":"LOTO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6611/thumb/xkKemBDV_400x400.jpg?1547042813"},{"chainId":1,"address":"0x56aa298a19c93c6801fdde870fa63ef75cc0af72","name":"Mirrored Alibaba","symbol":"MBABA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13647/thumb/mirror_logo_transparent.png?1611565672"},{"chainId":1,"address":"0x395768aeb16484e5785612a98e9408e4cc1269ec","name":"Rush","symbol":"RUC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12834/thumb/120030147_104370844760714_1920358536411869061_n.jpg?1602882889"},{"chainId":1,"address":"0x5150956e082c748ca837a5dfa0a7c10ca4697f9c","name":"Zeedex","symbol":"ZDEX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12412/thumb/Untitled-design-4.png?1599647173"},{"chainId":1,"address":"0xcbc1065255cbc3ab41a6868c22d1f1c573ab89fd","name":"Cream ETH 2","symbol":"CRETH2","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13568/thumb/creth2.png?1609837099"},{"chainId":1,"address":"0x1829aa045e21e0d59580024a951db48096e01782","name":"FuzeX","symbol":"FXT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3692/thumb/fuzex-token.png?1547038696"},{"chainId":1,"address":"0x16448014a29484b82e3a5a6cf254e5c563a28929","name":"The APIS","symbol":"API","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14055/thumb/API.jpg?1614054286"},{"chainId":1,"address":"0x1cf0f3aabe4d12106b27ab44df5473974279c524","name":"xSNXa","symbol":"XSNXA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12700/thumb/Token-4.png?1626145261"},{"chainId":1,"address":"0x0778cc2e8bbad3d483e82371606d100cc8604522","name":"LHCoin","symbol":"LHCOIN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6709/thumb/lhcoin.jpg?1547042926"},{"chainId":1,"address":"0x84f7c44b6fed1080f647e354d552595be2cc602f","name":"Bigbom","symbol":"BBO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3795/thumb/bigbom-logo.png?1547038875"},{"chainId":1,"address":"0x35de3eccaccb02e627062b5d63aa941b137288fe","name":"Value Set Dollar","symbol":"VSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14321/thumb/7AAErx1U_400x400.jpg?1615425566"},{"chainId":1,"address":"0xedd7c94fd7b4971b916d15067bc454b9e1bad980","name":"Zippie","symbol":"ZIPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4302/thumb/zippie.jpg?1547039665"},{"chainId":1,"address":"0xa46f33694f5b31a6ed27eda16ccd466e94c80f1a","name":"Unicly Pak Collecti","symbol":"UPAK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15635/thumb/uPAK.jpg?1621403681"},{"chainId":1,"address":"0xee3b9b531f4c564c70e14b7b3bb7d516f33513ff","name":"DeFi Omega","symbol":"DFIO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12191/thumb/defi_omega_logo.png?1597978243"},{"chainId":1,"address":"0x9b02dd390a603add5c07f9fd9175b7dabe8d63b7","name":"Shopping io","symbol":"SPI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13537/thumb/SPI_Token.png?1623763713"},{"chainId":1,"address":"0xb4ae194a0dcf1b4080b164c1d775ee06e0817305","name":"Super Saiya jin","symbol":"SSJ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12867/thumb/super_saiyan_jin_logo.jpg?1603168317"},{"chainId":1,"address":"0x88d50b466be55222019d71f9e8fae17f5f45fca1","name":"Cryptaur","symbol":"CPT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/2481/thumb/n3w6Z9xW_400x400.jpg?1548224365"},{"chainId":1,"address":"0x1062fdf250b44697216d07e41df93824519f47aa","name":"Cryptolandy","symbol":"CRYPL","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11046/thumb/crypl.png?1587526012"},{"chainId":1,"address":"0x8b8a8a91d7b8ec2e6ab37ed8ffbacee062c6f3c7","name":"ECP Technology","symbol":"ECP","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/8507/thumb/lhwmJl7R_400x400.png?1574931781"},{"chainId":1,"address":"0x486a72811ae65c4c814ba929d6da35497d21296f","name":"Galaxy Wallet","symbol":"GC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8535/thumb/1500x500.jpg?1596643294"},{"chainId":1,"address":"0x66fd97a78d8854fec445cd1c80a07896b0b4851f","name":"Lunch Money","symbol":"LMY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4149/thumb/IMG_2073.png?1612754752"},{"chainId":1,"address":"0xa960d2ba7000d58773e7fa5754dec3bb40a069d5","name":"One DEX","symbol":"ODEX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7712/thumb/WzsJ6pIr_400x400.jpg?1549940214"},{"chainId":1,"address":"0x57c8d5d5b87a1580fdaf996cef674bb0d7f14c98","name":"OdinBrowser","symbol":"ODIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7737/thumb/ZA9ZUdPO_400x400.jpg?1550110867"},{"chainId":1,"address":"0xa9d232cc381715ae791417b624d7c4509d2c28db","name":"Basis Gold Share","symbol":"BSGS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13672/thumb/bsgs_logo.png?1610680124"},{"chainId":1,"address":"0x66a0f676479cee1d7373f3dc2e2952778bff5bd6","name":"Wise","symbol":"WISE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13552/thumb/WISE-logo-1600x1280.png?1609727947"},{"chainId":1,"address":"0xb3b4431f812a74bdfc148d6bddfadecdc63fc083","name":"COLLECTIVE Vault N","symbol":"COLLECTIVE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17073/thumb/collective.png?1626152053"},{"chainId":1,"address":"0xca3ea3061d638e02113aa960340c98343b5acd62","name":"Bittwatt","symbol":"BWT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4777/thumb/bittwatt.png?1547274101"},{"chainId":1,"address":"0x3e6a17e1913b2f49ceb6803e46094066ff5f9c78","name":"VaporRISE","symbol":"VRISE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16785/thumb/60da9801285d073d6a124726_vr256_250x250_200x200.png?1624970033"},{"chainId":1,"address":"0x6c972b70c533e2e045f333ee28b9ffb8d717be69","name":"FoundryDAO Logistic","symbol":"FRY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12348/thumb/fry-icon.png?1614064283"},{"chainId":1,"address":"0xa12a00e73e4e7174acc50a1c073e36aa0c9cb305","name":"Swaap Stablecoin","symbol":"SAP","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/14012/thumb/swaap.png?1613722677"},{"chainId":1,"address":"0x1640bd2898eee4c36f369836a067dea8725ac0cc","name":"DeFiato","symbol":"DFO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13386/thumb/Defiato.png?1608085873"},{"chainId":1,"address":"0xe0c8087ce1a17bdd5d6c12eb52f8d7eff7791987","name":"Linfinity","symbol":"LFC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5364/thumb/Linfinity-logo.jpg?1547040963"},{"chainId":1,"address":"0xbd356a39bff2cada8e9248532dd879147221cf76","name":"WOM Protocol","symbol":"WOM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4559/thumb/wom_logo_small.png?1572098941"},{"chainId":1,"address":"0xfe39e6a32acd2af7955cb3d406ba2b55c901f247","name":"ZBG Token","symbol":"ZT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6566/thumb/ztcoin.jpg?1547042777"},{"chainId":1,"address":"0x3abdff32f76b42e7635bdb7e425f0231a5f3ab17","name":"ConnectJob","symbol":"CJT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2207/thumb/connectjob.png?1547739980"},{"chainId":1,"address":"0xe3a64a3c4216b83255b53ec7ea078b13f21a7dad","name":"DeFi Gold","symbol":"DFGL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12883/thumb/defi_gold.jpg?1603281766"},{"chainId":1,"address":"0xc7743bf0b300ec041e704cc34d4f43050942099e","name":"CAT trade Protocol","symbol":"CATX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12214/thumb/cattrade_protocol_logo.png?1598236877"},{"chainId":1,"address":"0x1961b3331969ed52770751fc718ef530838b6dee","name":"BitDegree","symbol":"BDG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1653/thumb/bitdegree.jpg?1547035900"},{"chainId":1,"address":"0xa499648fd0e80fd911972bbeb069e4c20e68bf22","name":"Jenny Metaverse DAO","symbol":"UJENNY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15453/thumb/ujenny.png?1620870247"},{"chainId":1,"address":"0x9cea2ed9e47059260c97d697f82b8a14efa61ea5","name":"Punk","symbol":"PUNK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13704/thumb/Screenshot_2021-01-19_at_3.27.50_PM.png?1611041655"},{"chainId":1,"address":"0x8b6dd24bcb2d0aea92c3abd4eb11103a5db6d714","name":"dXIOT","symbol":"DXIOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12850/thumb/dxiot.png?1603074874"},{"chainId":1,"address":"0x5319e86f0e41a06e49eb37046b8c11d78bcad68c","name":"Zelwin","symbol":"ZLW","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11547/thumb/5614.png?1590991128"},{"chainId":1,"address":"0x76960dccd5a1fe799f7c29be9f19ceb4627aeb2f","name":"Red","symbol":"RED","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4523/thumb/red.png?1548607994"},{"chainId":1,"address":"0x0d8775f648430679a709e98d2b0cb6250d2887ef","name":"Basic Attention Tok","symbol":"BAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/677/thumb/basic-attention-token.png?1547034427"},{"chainId":1,"address":"0x83cee9e086a77e492ee0bb93c2b0437ad6fdeccc","name":"Goldmint","symbol":"MNTP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1944/thumb/goldmint.png?1547743002"},{"chainId":1,"address":"0x0def8d8adde14c9ef7c2a986df3ea4bd65826767","name":"DefiCliq","symbol":"CLIQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13242/thumb/deficliq_logo.png?1606660146"},{"chainId":1,"address":"0xc731eca970979cd2da2a1094a808f49894070d35","name":"RealT Token 19218","symbol":"REALTOKEN-S-19218-H","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16708/thumb/19218-Houghton-hero-1.jpeg?1624646592"},{"chainId":1,"address":"0x722f97a435278b7383a1e3c47f41773bebf3232c","name":"UCROWDME","symbol":"UCM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12079/thumb/UKm2qXh.png?1605346168"},{"chainId":1,"address":"0xd9485499499d66b175cf5ed54c0a19f1a6bcb61a","name":"Usechain","symbol":"USE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4318/thumb/logo_%281%29.png?1547039678"},{"chainId":1,"address":"0x910dfc18d6ea3d6a7124a6f8b5458f281060fa4c","name":"X8X Token","symbol":"X8X","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1912/thumb/x8x.png?1547036213"},{"chainId":1,"address":"0x39ad22c916f42af5f67371d6f2fb0dab42321a89","name":"OSINA","symbol":"OSINA","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/12977/thumb/OSINA_Logo.png?1604019955"},{"chainId":1,"address":"0x08f5a9235b08173b7569f83645d2c7fb55e8ccd8","name":"Tierion","symbol":"TNT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/923/thumb/tierion.png?1547034767"},{"chainId":1,"address":"0x78b039921e84e726eb72e7b1212bb35504c645ca","name":"Sether","symbol":"SETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2101/thumb/sether.png?1548609212"},{"chainId":1,"address":"0xeea9ae787f3a620072d13b2cdc8cabffb9c0ab96","name":"Yearn Secure","symbol":"YSEC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12993/thumb/ysec.png?1604212852"},{"chainId":1,"address":"0x3adfc4999f77d04c8341bac5f3a76f58dff5b37a","name":"Privatix","symbol":"PRIX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1183/thumb/dZZrRl8.png?1547035211"},{"chainId":1,"address":"0x3a1bda28adb5b0a812a7cf10a1950c920f79bcd3","name":"Gameflip","symbol":"FLP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2173/thumb/flp.png?1547036470"},{"chainId":1,"address":"0xcd39b5434a0a92cf47d1f567a7df84be356814f0","name":"s1INCH","symbol":"S1INCH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14952/thumb/s1INCH.png?1619129330"},{"chainId":1,"address":"0xbcd9e216200369803ed059b7744f6fb4cf3887c7","name":"Epic","symbol":"EPIC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12670/thumb/Untitled-design-8.png?1601503498"},{"chainId":1,"address":"0x464ebe77c293e473b48cfe96ddcf88fcf7bfdac0","name":"KRYLL","symbol":"KRL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2807/thumb/krl.png?1547036979"},{"chainId":1,"address":"0x5fb99a3593d7088e44377a1beb27739bd928f269","name":"Unicly Chris McCann","symbol":"UCM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14913/thumb/logo.png?1618995818"},{"chainId":1,"address":"0xf51ebf9a26dbc02b13f8b3a9110dac47a4d62d78","name":"APIX","symbol":"APIX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10124/thumb/5sSKmtlA_400x400.png?1576126911"},{"chainId":1,"address":"0x58379bf685ea2e251ae63d3ee26269c7c3848a17","name":"Distributed Energy ","symbol":"DEC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9095/thumb/T2g217wc_400x400.jpg?1564131646"},{"chainId":1,"address":"0x07c44b5ac257c2255aa0933112c3b75a6bff3cb1","name":"BoringDAO LTC","symbol":"OLTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16893/thumb/oLTC.png?1625555059"},{"chainId":1,"address":"0xc71e20e54adfc415f79bf0a8f11122917920050e","name":"Storichain Token","symbol":"TORI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9551/thumb/Tcp1SO9L_400x400.jpg?1568836675"},{"chainId":1,"address":"0xc58467b855401ef3ff8fda9216f236e29f0d6277","name":"Gasgains","symbol":"GASG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13795/thumb/gasgains_logo.png?1611809086"},{"chainId":1,"address":"0x6443e507f53b526042d0054867a60a4c0409cb4b","name":"Chainlink NFT Vault","symbol":"CNHPD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17064/thumb/CHAINLINK.png?1626150809"},{"chainId":1,"address":"0x06e0feb0d74106c7ada8497754074d222ec6bcdf","name":"Bitball","symbol":"BTB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7039/thumb/BTB.jpeg?1625463492"},{"chainId":1,"address":"0xcf9fbffec9e0e5bbc62e79bf1965f5db76955661","name":"MeshBox","symbol":"MESH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6200/thumb/DPuEPJQ6_400x400.jpg?1547042229"},{"chainId":1,"address":"0xc1215988f2e555ac324d1e2d2a6164f1010ff29f","name":"Nyantereum Internat","symbol":"NYANTE","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13090/thumb/Nyantereum.png?1615216234"},{"chainId":1,"address":"0xeedc2f5f4d1226759b1acf9efa23a99661de6663","name":"RealT Token 20200","symbol":"REALTOKEN-S-20200-L","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16702/thumb/20200-Lesure-003.jpeg?1624643190"},{"chainId":1,"address":"0xfcf8eda095e37a41e002e266daad7efc1579bc0a","name":"FLEX Coin","symbol":"FLEX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9108/thumb/CoinFlex.png?1579227316"},{"chainId":1,"address":"0x9ea3b5b4ec044b70375236a281986106457b20ef","name":"Delta Financial","symbol":"DELTA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14564/thumb/Delta_logo.png?1619067341"},{"chainId":1,"address":"0x58c69ed6cd6887c0225d1fccecc055127843c69b","name":"HalalChain","symbol":"HLC","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/2737/thumb/halalchain.png?1547036938"},{"chainId":1,"address":"0xaa9d866666c2a3748d6b23ff69e63e52f08d9ab4","name":"Fundamenta","symbol":"FMTA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12983/thumb/fundamenta.png?1604065939"},{"chainId":1,"address":"0x74303d9d085a0d647ef47f9c0c424c73f3bfa6ca","name":"MIAMI","symbol":"MIAMI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7139/thumb/eb6a27241027ae3c5a8fb0bb8752b28b_700x706.png?1547043640"},{"chainId":1,"address":"0x9b68bfae21df5a510931a262cecf63f41338f264","name":"DecentBet","symbol":"DBET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1168/thumb/decent-bet.jpg?1547035195"},{"chainId":1,"address":"0x021bb23a45e9fc824260435e670fc383b7b8cbbb","name":"RealT Token 16200","symbol":"REALTOKEN-S-16200-F","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16704/thumb/16200-Fullerton-HERO.jpeg?1624644084"},{"chainId":1,"address":"0xd938137e6d96c72e4a6085412ada2dad78ff89c4","name":"Abulaba","symbol":"AAA","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/4016/thumb/abulaba.png?1547039118"},{"chainId":1,"address":"0xa053c1b7013e77fe0a873ce0ca2bd5d0b7414c41","name":"Kambria Yield Tunin","symbol":"KYTE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14670/thumb/kyte.png?1617676559"},{"chainId":1,"address":"0x58002a6b6e659a16de9f02f529b10536e307b0d9","name":"Crypto Holding Fran","symbol":"CHFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11184/thumb/chft.png?1589523711"},{"chainId":1,"address":"0x4de2573e27e648607b50e1cfff921a33e4a34405","name":"Lendroid Support To","symbol":"LST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3485/thumb/lst-icon.png?1606992361"},{"chainId":1,"address":"0x94236591125e935f5ac128bb3d5062944c24958c","name":"VegaWallet Token","symbol":"VGW","decimals":5,"logoURI":"https://assets.coingecko.com/coins/images/7355/thumb/cm_sfjC8_400x400.jpg?1547044033"},{"chainId":1,"address":"0xf6117cc92d7247f605f11d4c942f0feda3399cb5","name":"Multicoin","symbol":"MTCN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3072/thumb/Group-42.71-1.png?1557815880"},{"chainId":1,"address":"0xe64b47931f28f89cc7a0c6965ecf89eadb4975f5","name":"Ludos Protocol","symbol":"LUD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5118/thumb/Ludos_Protocol.jpg?1557216263"},{"chainId":1,"address":"0x8aa2af3df13bb6f0cb922bd34446d65244733ad0","name":"Libra","symbol":"LC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13575/thumb/Untitled-design-7-removebg-preview-1.png?1609887720"},{"chainId":1,"address":"0x6aeb95f06cda84ca345c2de0f3b7f96923a44f4c","name":"Rentberry","symbol":"BERRY","decimals":14,"logoURI":"https://assets.coingecko.com/coins/images/1787/thumb/rentberry.png?1548608046"},{"chainId":1,"address":"0xdcfe18bc46f5a0cd0d3af0c2155d2bcb5ade2fc5","name":"Hue","symbol":"HUE","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/10420/thumb/untitled.png?1579141360"},{"chainId":1,"address":"0x1122b6a0e00dce0563082b6e2953f3a943855c1f","name":"Centrality","symbol":"CENNZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3408/thumb/logo.PNG?1547038083"},{"chainId":1,"address":"0x0c572544a4ee47904d54aaa6a970af96b6f00e1b","name":"Wasder","symbol":"WAS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15374/thumb/wasderlogo200x200.png?1620691729"},{"chainId":1,"address":"0xfd30c9bea1a952feeed2ef2c6b2ff8a8fc4aad07","name":"Polkally","symbol":"KALLY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15812/thumb/polkally.PNG?1621979722"},{"chainId":1,"address":"0xd8c82fbc4d8ed0644a7ec04cf973e84c6153c1d7","name":"Rizen Coin Old ","symbol":"RZN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13373/thumb/Rizen_logo_black.png?1620206327"},{"chainId":1,"address":"0xae697f994fc5ebc000f8e22ebffee04612f98a0d","name":"LGCY Network","symbol":"LGCY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12181/thumb/LGCY_network.jpg?1597926587"},{"chainId":1,"address":"0x9f4f1c679fc8479cd71482a8d8c88dc60c1403f9","name":"Double Ace","symbol":"DAA","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13806/thumb/doubleace-logo.png?1612001264"},{"chainId":1,"address":"0x3136ef851592acf49ca4c825131e364170fa32b3","name":"CoinFi","symbol":"COFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1709/thumb/coinfi.png?1547035969"},{"chainId":1,"address":"0xa5959e9412d27041194c3c3bcbe855face2864f7","name":"UniDexGas","symbol":"UNDG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13740/thumb/undg_logo_200_.png?1611305562"},{"chainId":1,"address":"0x68eb95dc9934e19b86687a10df8e364423240e94","name":"3X Long Bitcoin Tok","symbol":"BULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9992/thumb/683JEXMN_400x400.png?1574418750"},{"chainId":1,"address":"0xa49d7499271ae71cd8ab9ac515e6694c755d400c","name":"Mute","symbol":"MUTE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14331/thumb/MUTE.png?1617618967"},{"chainId":1,"address":"0xd2057d71fe3f5b0dc1e3e7722940e1908fc72078","name":"King Swap","symbol":"KING","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13622/thumb/rsz_king_token_new.png?1610437757"},{"chainId":1,"address":"0x660e71483785f66133548b10f6926dc332b06e61","name":"Adelphoi","symbol":"ADL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1246/thumb/adelphoi-logo.png?1547035271"},{"chainId":1,"address":"0x0ea984e789302b7b612147e4e4144e64f21425eb","name":"Waletoken","symbol":"WTN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6404/thumb/waletoken_2_sosmed_Square.png?1547042539"},{"chainId":1,"address":"0xbab165df9455aa0f2aed1f2565520b91ddadb4c8","name":"EDUCare","symbol":"EKT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/2643/thumb/educare.png?1547036820"},{"chainId":1,"address":"0x38a94e92a19e970c144ded0b2dd47278ca11cc1f","name":"Falcon Nine","symbol":"F9","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16858/thumb/logo-f9.png?1625465513"},{"chainId":1,"address":"0x8e87f1811de0025d2335174dbc7338a43df6d7cc","name":"Virtual Goods Token","symbol":"VGO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8889/thumb/1QdEK96k_400x400.png?1562574531"},{"chainId":1,"address":"0x26fb86579e371c7aedc461b2ddef0a8628c93d3b","name":"BORA","symbol":"BORA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7646/thumb/LDqRyofe_400x400.jpg?1548926877"},{"chainId":1,"address":"0x22b6c31c2beb8f2d0d5373146eed41ab9ede3caf","name":"cocktailbar finance","symbol":"COC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13121/thumb/cocktail_bar_logo.png?1605488103"},{"chainId":1,"address":"0x0c7e25e15e9f6818fa2770107b3ba565470bc8c5","name":"Decentralized Bitco","symbol":"DBTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13862/thumb/dbtc.png?1612416910"},{"chainId":1,"address":"0x48e234d2ddcb32d780971c0df7fdde25bba192de","name":"NEWLAND","symbol":"NLD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9138/thumb/drNv_nJs_400x400.png?1564630866"},{"chainId":1,"address":"0x00f29171d7bcdc464a0758cf3217fe83173772b9","name":"INU Token","symbol":"INU","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16898/thumb/logoV.png?1625556518"},{"chainId":1,"address":"0xa0b84460a1e78339692c7463009c35f0b9a6ae4c","name":"E2P Group","symbol":"E2P","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15966/thumb/78312d_130e19a85eae4c40b00257a016da7ff0_mv2.png?1622520328"},{"chainId":1,"address":"0x4156d3342d5c385a87d264f90653733592000581","name":"SALT","symbol":"SALT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/962/thumb/salt.png?1548608746"},{"chainId":1,"address":"0xac2e58a06e6265f1cf5084ee58da68e5d75b49ca","name":"ORS Group","symbol":"ORS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3036/thumb/ors-group-logo.jpg?1547037349"},{"chainId":1,"address":"0xefab7248d36585e2340e5d25f8a8d243e6e3193f","name":"Dacxi","symbol":"DACXI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4466/thumb/Dacxi.png?1623749728"},{"chainId":1,"address":"0xa0ed4c4acbf07c03365d6bbe28150a819aff700f","name":"BITIFEX","symbol":"BITX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7141/thumb/logo_%2833%29.png?1547043643"},{"chainId":1,"address":"0x79650799e7899a802cb96c0bc33a6a8d4ce4936c","name":"AICHAIN","symbol":"AIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2525/thumb/aichain.png?1547036638"},{"chainId":1,"address":"0x4fbb350052bca5417566f188eb2ebce5b19bc964","name":"RigoBlock","symbol":"GRG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1532/thumb/Symbol-RigoblockRGB.png?1547035682"},{"chainId":1,"address":"0x3936ad01cf109a36489d93cabda11cf062fd3d48","name":"Coil","symbol":"COIL","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12234/thumb/Coil_-_Logo_open_%28256x256%29_tp.png?1598519979"},{"chainId":1,"address":"0xf4a81c18816c9b0ab98fac51b36dcb63b0e58fde","name":"YieldWars","symbol":"WAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12633/thumb/121169136_333321361293975_7238588238572942050_n.png?1602551929"},{"chainId":1,"address":"0x491604c0fdf08347dd1fa4ee062a822a5dd06b5d","name":"Cartesi","symbol":"CTSI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11038/thumb/cartesi.png?1592288021"},{"chainId":1,"address":"0x9f300b4ac0bf94cad77e7e2d3f850352b8bb264c","name":"Talent Coin","symbol":"TLNT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13771/thumb/TLNT.png?1611698474"},{"chainId":1,"address":"0x8feef860e9fa9326ff9d7e0058f637be8579cc29","name":"Timers","symbol":"IPM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12649/thumb/logo200x200_%282%29.png?1601421807"},{"chainId":1,"address":"0xda4c27a9fbdde1f5f3af0398396be4644dcec715","name":"Ponzu Inu","symbol":"PONZU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16936/thumb/200x200.png?1625660123"},{"chainId":1,"address":"0xa51fc71422a30fa7ffa605b360c3b283501b5bf6","name":"AurusDeFi","symbol":"AWX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12684/thumb/AWX-256x256.png?1612840521"},{"chainId":1,"address":"0x455f7ef6d8bcfc35f9337e85aee1b0600a59fabe","name":"Aloha","symbol":"ALOHA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14048/thumb/aloha.png?1615527835"},{"chainId":1,"address":"0x84cd68c3e470ecee4b8b6212efcb8c6bcb38da1d","name":"Doki Doki Chainbind","symbol":"BND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15690/thumb/chainbinders_logo_250px.png?1621565106"},{"chainId":1,"address":"0x6353eadf8d1d4421002332bb9074222b14d54881","name":"Payfair","symbol":"PFR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1290/thumb/payfair.png?1548330817"},{"chainId":1,"address":"0xe0b7e882c194881c690924cb46154b8241f9145e","name":"Cofinex","symbol":"CNX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10834/thumb/abstract-logo-template-for-a-corporation-1531l-2833_%282%29.png?1592292069"},{"chainId":1,"address":"0xa5a2af22eac6f050227d844b108c2b2a011fd329","name":"Tunnel Protocol","symbol":"TNI","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13598/thumb/tni_logo.png?1610006256"},{"chainId":1,"address":"0x4a64515e5e1d1073e83f30cb97bed20400b66e10","name":"Wrapped Zcash","symbol":"WZEC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13239/thumb/WZEC.png?1623827266"},{"chainId":1,"address":"0xb09ad98524780228d2df4f34aa665d9dbb9999e4","name":"Tradcoin","symbol":"TRAD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6924/thumb/tmTPJCkZ_400x400.jpg?1547043296"},{"chainId":1,"address":"0x1f9840a85d5af5bf1d1762f925bdaddc4201f984","name":"Uniswap","symbol":"UNI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12504/thumb/uniswap-uni.png?1600306604"},{"chainId":1,"address":"0x305de070488c8469dfac957226c9c900c4bfba22","name":"More Coin","symbol":"MORE","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/742/thumb/1722.png?1620080666"},{"chainId":1,"address":"0xfb5a551374b656c6e39787b1d3a03feab7f3a98e","name":"ThingsOperatingSyst","symbol":"TOS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5282/thumb/tos-logo.png?1547040796"},{"chainId":1,"address":"0x3f9078b8fbcb1c4e03b41fa9e5a0532a28848db7","name":"EverApe","symbol":"EVERAPE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16546/thumb/chico.png?1624416570"},{"chainId":1,"address":"0x7841b2a48d1f6e78acec359fed6d874eb8a0f63c","name":"KERMAN","symbol":"KERMAN","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/11536/thumb/Kerman.png?1590776066"},{"chainId":1,"address":"0xc151ca64d66ea44ee4be9d47c3ce7e031b2fccb7","name":"YFET","symbol":"YFET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12689/thumb/Logo-Coin-YFET-1-768x768.png?1601674080"},{"chainId":1,"address":"0x8a9c67fee641579deba04928c4bc45f66e26343a","name":"Jarvis Reward Token","symbol":"JRT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10390/thumb/cfeii0y.png?1578868949"},{"chainId":1,"address":"0x84119cb33e8f590d75c2d6ea4e6b0741a7494eda","name":"Giga Watt Token","symbol":"WTT","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/907/thumb/wtt.png?1547034739"},{"chainId":1,"address":"0x92ef4ffbfe0df030837b65d7fccfe1abd6549579","name":"Swirge","symbol":"SWGB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12879/thumb/swirge_logo.png?1603250039"},{"chainId":1,"address":"0x1864ce27e9f7517047933caae530674e8c70b8a7","name":"Pibble","symbol":"PIB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2972/thumb/pibble.jpg?1551683103"},{"chainId":1,"address":"0xa92e7c82b11d10716ab534051b271d2f6aef7df5","name":"Ara Token","symbol":"ARA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13877/thumb/ARA-Icon-Black.png?1612473492"},{"chainId":1,"address":"0xfaa965d80d956de59808974e33ada054f7696de5","name":"BTour Chain","symbol":"BTOUR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13141/thumb/BTour_Icon.png?1605595523"},{"chainId":1,"address":"0x0020d80229877b495d2bf3269a4c13f6f1e1b9d3","name":"Dexmex","symbol":"DEXM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13972/thumb/dexmex.png?1613393175"},{"chainId":1,"address":"0x3918c42f14f2eb1168365f911f63e540e5a306b5","name":"Neural Protocol","symbol":"NRP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6313/thumb/neural-protocol.png?1548085897"},{"chainId":1,"address":"0x7ba19b7f7d106a9a1e0985397b94f38eee0b555e","name":"Wixlar","symbol":"WIX","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/6306/thumb/JtT8UEU.png?1547042361"},{"chainId":1,"address":"0x595832f8fc6bf59c85c527fec3740a1b7a361269","name":"Power Ledger","symbol":"POWR","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/1104/thumb/power-ledger.png?1547035082"},{"chainId":1,"address":"0x34ed9e71449529e034d0326cfbb3b5ccdca00cbc","name":"RealT Token 19317","symbol":"REALTOKEN-S-19317-G","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16638/thumb/19317-Gable-hero-1.jpeg?1624558479"},{"chainId":1,"address":"0xb0e99627bc29adef1178f16117bf495351e81997","name":"Dex Trade Coin","symbol":"DXC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15025/thumb/R1A63oDx_400x400.jpg?1619489389"},{"chainId":1,"address":"0x006bea43baa3f7a6f765f14f10a1a1b08334ef45","name":"Stox","symbol":"STX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1230/thumb/stox-token.png?1547035256"},{"chainId":1,"address":"0x87931e7ad81914e7898d07c68f145fc0a553d8fb","name":"WIZARD Vault NFTX ","symbol":"WIZARD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17068/thumb/Wizards.png?1626151233"},{"chainId":1,"address":"0x14eb60f5f270b059b0c788de0ddc51da86f8a06d","name":"Phantasma Energy","symbol":"KCAL","decimals":10,"logoURI":"https://assets.coingecko.com/coins/images/12678/thumb/kcal-logo-coingecko.png?1602063865"},{"chainId":1,"address":"0x9885ca101dfd8f23d364874f799554c52bfee820","name":"3X Long BitMax Toke","symbol":"BTMXBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10305/thumb/683JEXMN_400x400.png?1577743562"},{"chainId":1,"address":"0x9cb2f26a23b8d89973f08c957c4d7cdf75cd341c","name":"Digital Rand","symbol":"DZAR","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/9841/thumb/logo200_%281%29.png?1572577311"},{"chainId":1,"address":"0xfee4dbe2751bf8d1b1b861aaf9664961f19ce91a","name":"Q DeFi Rating Gov","symbol":"QDEFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13257/thumb/d2ty5tML.png?1606788567"},{"chainId":1,"address":"0x1eb16ec378f0ce8f81449120629f52ba28961d47","name":"RealT Token 1000 ","symbol":"REALTOKEN-S-1000-FL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16661/thumb/1000-florida-1.jpeg?1624623840"},{"chainId":1,"address":"0xba21ef4c9f433ede00badefcc2754b8e74bd538a","name":"Swapfolio","symbol":"SWFL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12263/thumb/swapfolio-token-logo-icon-symbol-256-256.png?1598593097"},{"chainId":1,"address":"0xf72fcd9dcf0190923fadd44811e240ef4533fc86","name":"Mirrored ProShares ","symbol":"MVIXY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13638/thumb/mirror_logo_transparent.png?1611564742"},{"chainId":1,"address":"0x837010619aeb2ae24141605afc8f66577f6fb2e7","name":"zHEGIC","symbol":"ZHEGIC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13074/thumb/zhegic_logo.png?1604903561"},{"chainId":1,"address":"0x3839d8ba312751aa0248fed6a8bacb84308e20ed","name":"Bezop","symbol":"BEZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1992/thumb/bez.png?1547036264"},{"chainId":1,"address":"0xdc7836bc6c84c51275365e337fd147db2dc7b3c3","name":"RRSpace","symbol":"RRC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7536/thumb/36516552_137244937169359_1773558825933078528_n.jpg?1548233442"},{"chainId":1,"address":"0x412d397ddca07d753e3e0c61e367fb1b474b3e7d","name":"8X8 Protocol","symbol":"EXE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9466/thumb/8x8_symbol_512x.png?1574320199"},{"chainId":1,"address":"0xa3c4dc4a9ce2a6b40b57f25f8b50decc2c64dec2","name":"SeedSwap","symbol":"SNFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15300/thumb/GN7ZskU.png?1620369261"},{"chainId":1,"address":"0xc567bca531992352166252ea5121e535432e81ed","name":"Tartarus","symbol":"TAR","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13441/thumb/tartarus_logo.png?1608603011"},{"chainId":1,"address":"0xad7ca17e23f13982796d27d1e6406366def6ee5f","name":"rHEGIC2","symbol":"RHEGIC2","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13969/thumb/ezgif-4-b5306690cb32.jpg?1613385300"},{"chainId":1,"address":"0x3fb8d8a28aff053ccf446bc075eecb7a0ef65d0c","name":"StarPlay","symbol":"STPC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9705/thumb/8fp5wsxp_400x400.png?1570920359"},{"chainId":1,"address":"0x09843b9137fc5935b7f3832152f9074db5d2d1ee","name":"YFI3 money","symbol":"YFI3","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13142/thumb/yfi3.png?1605596278"},{"chainId":1,"address":"0xd16c79c8a39d44b2f3eb45d2019cd6a42b03e2a9","name":"uUSDwETH Synthetic ","symbol":"UUSDWETH-DEC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12584/thumb/uma_logo.jpg?1600937972"},{"chainId":1,"address":"0x5b11aacb6bddb9ffab908fdce739bf4aed554327","name":"TrueDeck","symbol":"TDP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6567/thumb/truedeck.png?1548759129"},{"chainId":1,"address":"0x40b92fce37cefa03baf7603e7913c1d34dd1a4ec","name":"YeaFinance","symbol":"YEA","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12705/thumb/logoeth.png?1601877470"},{"chainId":1,"address":"0x6d7917864003a9bb13cbbec8f1cdd4e36ddf6fc8","name":"Semitoken","symbol":"SEMI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12293/thumb/200-200_%EB%A1%9C%EA%B3%A0.jpg?1598922002"},{"chainId":1,"address":"0x992a8a9f4bde0fb2ee1f5bbb3cb7b1e64748e13d","name":"Padcoin","symbol":"PAD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16734/thumb/200padcoin.png?1624863843"},{"chainId":1,"address":"0x6006fc2a849fedaba8330ce36f5133de01f96189","name":"Spaceswap SHAKE","symbol":"SHAKE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12765/thumb/shake_logo.jpg?1602470135"},{"chainId":1,"address":"0x922ac473a3cc241fd3a0049ed14536452d58d73c","name":"Vetri","symbol":"VLD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2476/thumb/vld.png?1547036599"},{"chainId":1,"address":"0x249e38ea4102d0cf8264d3701f1a0e39c4f2dc3b","name":"The Truth","symbol":"UFO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16801/thumb/1.png?1625082227"},{"chainId":1,"address":"0xbe6c01a67bd0160fe3e731555ad014895b225dfa","name":"Fundum","symbol":"FND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14959/thumb/Logo-200x200_%283%29.png?1619147633"},{"chainId":1,"address":"0x8806926ab68eb5a7b909dcaf6fdbe5d93271d6e2","name":"Uquid Coin","symbol":"UQC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1341/thumb/uquid-coin.png?1548759712"},{"chainId":1,"address":"0xc2bd7a597391f31d2e36c2cb769fce0e5bd6d482","name":"Anti Lockdown","symbol":"FREE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15204/thumb/FREE.jpg?1620097136"},{"chainId":1,"address":"0x625ae63000f46200499120b906716420bd059240","name":"Aave SUSD v1","symbol":"ASUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11723/thumb/aSUSD.png?1593082612"},{"chainId":1,"address":"0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374","name":"Veritaseum","symbol":"VERI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/695/thumb/veritaseum.png?1547034460"},{"chainId":1,"address":"0xc4cb5793bd58bad06bf51fb37717b86b02cbe8a4","name":"PROXI DeFi","symbol":"CREDIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12212/thumb/_credit.png?1598235420"},{"chainId":1,"address":"0xe5867608b51a2c9c78b9587355cc093140a49b0a","name":"Speed Mining Servic","symbol":"SMS","decimals":3,"logoURI":"https://assets.coingecko.com/coins/images/1807/thumb/speed-mining-service.png?1548610827"},{"chainId":1,"address":"0xea6c27d11ccb9306154f87d47dc1405c37242081","name":"PASTA Vault NFTX ","symbol":"PASTA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17067/thumb/PASTA.png?1626151064"},{"chainId":1,"address":"0x923108a439c4e8c2315c4f6521e5ce95b44e9b4c","name":"Devery","symbol":"EVE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2681/thumb/devery.png?1547036885"},{"chainId":1,"address":"0x35dd2ebf20746c6e658fac75cd80d4722fae62f6","name":"CryptoBet","symbol":"CBET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11543/thumb/TvJUqCso_400x400.jpg?1591066399"},{"chainId":1,"address":"0xe25b0bba01dc5630312b6a21927e578061a13f55","name":"ShipChain","symbol":"SHIP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3997/thumb/shipchain.png?1548609236"},{"chainId":1,"address":"0x555d051538c7a13712f1f590fa6b4c176ca4529f","name":"iOWN Token","symbol":"IOWN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8270/thumb/iOWN-Lion-Face.png?1585695262"},{"chainId":1,"address":"0x4355fc160f74328f9b383df2ec589bb3dfd82ba0","name":"Opus","symbol":"OPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/916/thumb/opus.png?1548330180"},{"chainId":1,"address":"0x5e3845a1d78db544613edbe43dc1ea497266d3b8","name":"LNX Protocol","symbol":"LNX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8776/thumb/Linix.png?1561103529"},{"chainId":1,"address":"0x9afb950948c2370975fb91a441f36fdc02737cd4","name":"Huobi Fil","symbol":"HFIL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14109/thumb/HFIL.png?1614334127"},{"chainId":1,"address":"0x00b7db6b4431e345eee5cc23d21e8dbc1d5cada3","name":"CyberTronchain","symbol":"CTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13391/thumb/zNdoAnW.png?1608095358"},{"chainId":1,"address":"0x613fa2a6e6daa70c659060e86ba1443d2679c9d7","name":"ParkinGo","symbol":"GOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6034/thumb/GOToken.png?1547041981"},{"chainId":1,"address":"0xcff20ce22e71ecf2ea89c86ecbd4a3cf513768c7","name":"Makes","symbol":"MKS","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/13318/thumb/MKS200.png?1607412065"},{"chainId":1,"address":"0x05462671c05adc39a6521fa60d5e9443e9e9d2b9","name":"OLD USDf","symbol":"USDF","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/14492/thumb/usdf.png?1616487790"},{"chainId":1,"address":"0xaa4e3edb11afa93c41db59842b29de64b72e355b","name":"Marginswap","symbol":"MFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13899/thumb/marginswap_logo.png?1612756590"},{"chainId":1,"address":"0xd61b60ccbdaf09c2e036c72734adb3270ed27192","name":"WaterDrop","symbol":"WDP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13185/thumb/QhKzNey.png?1606084418"},{"chainId":1,"address":"0xeb269732ab75a6fd61ea60b06fe994cd32a83549","name":"USDx Stablecoin","symbol":"USDX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9375/thumb/logo_USDx_256x256.png?1568695741"},{"chainId":1,"address":"0x7e03521b9da891ca3f79a8728e2eaeb24886c5f9","name":"3X Long Matic Token","symbol":"MATICBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10167/thumb/683JEXMN_400x400_%281%29.png?1576505037"},{"chainId":1,"address":"0x236ecfb32c2b496f942c86d43b8ca4f6bd931e30","name":"Morph","symbol":"MORC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13609/thumb/0PAc0nMs_400x400.png?1611734234"},{"chainId":1,"address":"0x614857c755739354d68ae0abd53849cf45d6a41d","name":"ETH 26 Day EMA Cros","symbol":"ETH26EMACO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10613/thumb/eth-26-day-exponential-moving-average-set.png?1580971494"},{"chainId":1,"address":"0x3989f36540052668c340a53aaeacb46d6cf0dd6c","name":"Valireum","symbol":"VLM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11174/thumb/logo256x256.png?1589447700"},{"chainId":1,"address":"0xb34ab2f65c6e4f764ffe740ab83f982021faed6d","name":"Basis Gold","symbol":"BSG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13663/thumb/pErVlwLE_400x400.png?1610601302"},{"chainId":1,"address":"0x08711d3b02c8758f2fb3ab4e80228418a7f8e39c","name":"Edgeless","symbol":"EDG","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/635/thumb/edgeless.png?1547958143"},{"chainId":1,"address":"0xc1322d8ae3b0e2e437e0ae36388d0cfd2c02f1c9","name":"DAO PlayMarket 2 0","symbol":"PMT","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/1514/thumb/pmt.png?1547035648"},{"chainId":1,"address":"0xcfcecfe2bd2fed07a9145222e8a7ad9cf1ccd22a","name":"Adshares","symbol":"ADS","decimals":11,"logoURI":"https://assets.coingecko.com/coins/images/868/thumb/ads_tr_900.png?1549005693"},{"chainId":1,"address":"0x73d9e335669462cbdd6aa3adafe9efee86a37fe9","name":"Daiquilibrium","symbol":"DAIQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13626/thumb/BicSg26r_400x400.png?1610418623"},{"chainId":1,"address":"0x2c000c0093de75a8fa2fccd3d97b314e20b431c3","name":"Huobi Litecoin","symbol":"HLTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14110/thumb/HLTC.png?1614335967"},{"chainId":1,"address":"0xcc12abe4ff81c9378d670de1b57f8e0dd228d77a","name":"Aave REN","symbol":"AREN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14249/thumb/aREN.382be386.png?1615528633"},{"chainId":1,"address":"0xe469c4473af82217b30cf17b10bcdb6c8c796e75","name":"EXRNchain","symbol":"EXRN","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/1049/thumb/exrn.png?1616039914"},{"chainId":1,"address":"0x8ffe40a3d0f80c0ce6b203d5cdc1a6a86d9acaea","name":"IG Gold","symbol":"IGG","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/7697/thumb/N7aEdYrY_400x400.png?1561587437"},{"chainId":1,"address":"0x4ac00f287f36a6aad655281fe1ca6798c9cb727b","name":"GazeCoin","symbol":"GZE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2035/thumb/gazecoin.png?1547742556"},{"chainId":1,"address":"0xf0bc1ae4ef7ffb126a8347d06ac6f8add770e1ce","name":"1Million Token","symbol":"1MT","decimals":7,"logoURI":"https://assets.coingecko.com/coins/images/8495/thumb/1MTp.png?1586964391"},{"chainId":1,"address":"0x1500205f50bf3fd976466d0662905c9ff254fc9c","name":"BitBoost","symbol":"BBT","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/1194/thumb/bitboost.jpg?1547035224"},{"chainId":1,"address":"0x7d48fbe0a877bb1f511fcf9b57f12420c75841e9","name":"DOOR","symbol":"DOOR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16885/thumb/door256.png?1625548384"},{"chainId":1,"address":"0xe452e6ea2ddeb012e20db73bf5d3863a3ac8d77a","name":"Wrapped CELO","symbol":"WCELO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13561/thumb/WCELO.png?1623827365"},{"chainId":1,"address":"0x73c9275c3a2dd84b5741fd59aebf102c91eb033f","name":"Bitball Treasure","symbol":"BTRS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7273/thumb/BTRS.png?1625462917"},{"chainId":1,"address":"0x66d28cb58487a7609877550e1a34691810a6b9fc","name":"Koinos","symbol":"KOIN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13116/thumb/koinos-mark-circle-250px.png?1614870541"},{"chainId":1,"address":"0x91e64f39c1fe14492e8fdf5a8b0f305bd218c8a1","name":"Vodi X","symbol":"VDX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8451/thumb/vodi-x.jpg?1558566350"},{"chainId":1,"address":"0xa3d58c4e56fedcae3a7c43a725aee9a71f0ece4e","name":"Metronome","symbol":"MET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3249/thumb/metronome.png?1548084800"},{"chainId":1,"address":"0x1fc52f1abade452dd4674477d4711951700b3d27","name":"Noku","symbol":"NOKU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1577/thumb/noku.png?1548329133"},{"chainId":1,"address":"0x952b65d976e8669c4ce92a17cce5b2586912adb5","name":"Etrade","symbol":"ETT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9111/thumb/NkGLvEO2_400x400.jpg?1564435046"},{"chainId":1,"address":"0x50ec35d1e18d439f02fa895746fc3e1bef311780","name":"Epanus","symbol":"EPS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12295/thumb/SBqy8NapjZHtkIb4gkQrAXfxFI-j5G4mvfTxCVb2b1HuNGVv0m_6JTq4Ika8BOSHgbWBm0zKSH1dSohftNOaMI00Nb9hW_q5wnMoMi78BIbqTmf810zAHJPpXlFuMhZJ1Q1pUIjyKhb476mFwn5fys_EIF_26GhEE_n9TgAuyMI71hnYDCguzD-ZA7SsMoq.jpg?1598924999"},{"chainId":1,"address":"0x3c81d482172cc273c3b91dd9d8eb212023d00521","name":"Prophecy","symbol":"PRY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13658/thumb/prophecy_256x256.png?1610592382"},{"chainId":1,"address":"0xbac7a1798350cdf2dbfe0c210c2c9861223f4b31","name":"Moneynet","symbol":"MNC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5634/thumb/YVgOxCAD_400x400.jpg?1547041513"},{"chainId":1,"address":"0xbf0f3ccb8fa385a287106fba22e6bb722f94d686","name":"Zytara Dollar","symbol":"ZUSD","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/13957/thumb/zusd.png?1613353410"},{"chainId":1,"address":"0x40897c872214303b6f479a37e549ee1516b264a2","name":"FLETA","symbol":"FLETA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7865/thumb/Fleta_new_logo_%282%29.png?1623520180"},{"chainId":1,"address":"0x3a3547d62e9f9e76f99d51d5ab4f07aae0db2dbb","name":"BITICA COIN","symbol":"BDCC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11857/thumb/bitica_400x400.png?1595168606"},{"chainId":1,"address":"0x3b73c1b2ea59835cbfcadade5462b6ab630d9890","name":"Chainswap","symbol":"ASAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14945/thumb/chainswap_logo.png?1619109717"},{"chainId":1,"address":"0x5f0e628b693018f639d10e4a4f59bd4d8b2b6b44","name":"Whiteheart","symbol":"WHITE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13484/thumb/whiteheart.png?1609076548"},{"chainId":1,"address":"0x49706a576bb823cde3180c930f9947d59e2ded4d","name":"Punk Attr 4","symbol":"PUNK-ATTR-4","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13998/thumb/icon-punk-attr-4-40.png?1613565027"},{"chainId":1,"address":"0x3a9fff453d50d4ac52a6890647b823379ba36b9e","name":"Shuffle Monster","symbol":"SHUF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9222/thumb/shuf.png?1568038008"},{"chainId":1,"address":"0x0a2d9370cf74da3fd3df5d764e394ca8205c50b6","name":"Save Environment To","symbol":"SET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4829/thumb/set.png?1547040208"},{"chainId":1,"address":"0x6f3009663470475f0749a6b76195375f95495fcb","name":"Hatch DAO","symbol":"HATCH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12526/thumb/hatch-dao.jpg?1600480488"},{"chainId":1,"address":"0x7bd198b9107496fd5cc3d7655af52f43a8edbc4c","name":"oneVBTC","symbol":"ONEVBTC","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15104/thumb/logo_200_vBTC.png?1619732117"},{"chainId":1,"address":"0xba069ee53b8b531f3ab117c92ca09a204c9e6285","name":"Plug","symbol":"PLG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7124/thumb/zdj7lS36_400x400.jpg?1547043622"},{"chainId":1,"address":"0x1fdab294eda5112b7d066ed8f2e4e562d5bcc664","name":"SPICE","symbol":"SPICE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13398/thumb/VUenmQt_%281%29.png?1624954218"},{"chainId":1,"address":"0xf93340b1a3adf7eedcaec25fae8171d4b736e89f","name":"pxUSD Synthetic USD","symbol":"PXUSD-MAR2021","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12936/thumb/perlin.png?1603720296"},{"chainId":1,"address":"0xdddddd4301a082e62e84e43f474f044423921918","name":"DVF","symbol":"DVF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16414/thumb/DVF_02.png?1625826746"},{"chainId":1,"address":"0xa209ba34c01a2713a4453a656630cc9de8a362bc","name":"3X Short Chainlink ","symbol":"LINKBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10233/thumb/683JEXMN_400x400_%281%29.png?1576618846"},{"chainId":1,"address":"0x1c4b7d0e1885bd7667af3378e0c538f74e712006","name":"Playgroundz","symbol":"IOG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6512/thumb/playgroundz.png?1548331384"},{"chainId":1,"address":"0xac3211a5025414af2866ff09c23fc18bc97e79b1","name":"Dovu","symbol":"DOV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1072/thumb/Dovu_Earth_72x72_leaf_blue.png?1615259361"},{"chainId":1,"address":"0xc9f1016d336ef77aee75fc11ad64c5ecf9121332","name":"SoMee Advertising T","symbol":"SAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16040/thumb/SoMee.png?1622683511"},{"chainId":1,"address":"0x107c4504cd79c5d2696ea0030a8dd4e92601b82e","name":"Bloom","symbol":"BLT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2662/thumb/bloom.png?1547036854"},{"chainId":1,"address":"0xdf4df8ee1bd1c9f01e60ee15e4c2f7643b690699","name":"POMA","symbol":"POMAC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6830/thumb/POMALogoMain.png?1547043139"},{"chainId":1,"address":"0x04e0af0af1b7f0023c6b12af5a94df59b0e8cf59","name":"Sensitrust","symbol":"SETS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15035/thumb/SETS-token-logo-200.png?1619503990"},{"chainId":1,"address":"0x16587cf43f044aba0165ffa00acf412631194e4b","name":"Simracer Coin","symbol":"SRC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13027/thumb/SimRacer-500px.png?1604456794"},{"chainId":1,"address":"0x925f2c11b99c1a4c46606898ee91ed3d450cfeda","name":"Chow Chow Finance","symbol":"CHOW","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/14275/thumb/chow-logo.png?1620787242"},{"chainId":1,"address":"0xacf3d402e5e2c3edd5b8129e966017d293f12a4c","name":"BoxAxis","symbol":"BAXS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7732/thumb/MaUNF_dJFGQujn1_y5zYWG_U1NCglt4yBsjyftdpPr5H7LqTsu0XEqcKnnRWcjTUA0DsOLCr1Ekhe37__Wpx83X29R-nbs0UTxz5eElpzw7Mcl0y8-ReYLck8dNYAxJpXG1k48pA4RousepQFj7H9JKq09h5Z4EzBwnJf2P6qFWALryESUUmAOmtByKUD5WoCWI4DIlRorsWSbbl6.jpg?1550108268"},{"chainId":1,"address":"0x8798249c2e607446efb7ad49ec89dd1865ff4272","name":"xSUSHI","symbol":"XSUSHI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13725/thumb/xsushi.png?1612538526"},{"chainId":1,"address":"0x103c3a209da59d3e7c4a89307e66521e081cfdf0","name":"Genesis Vision","symbol":"GVT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1173/thumb/Genesis-vision.png?1558045005"},{"chainId":1,"address":"0x7f940b5509a22e81d29167581bdeea3fa5a0abee","name":"RealT Token 15784","symbol":"REALTOKEN-S-15784-M","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16673/thumb/15784-monte-vista-hero-1.jpeg?1624628466"},{"chainId":1,"address":"0xf7b098298f7c69fc14610bf71d5e02c60792894c","name":"Guppy","symbol":"GUP","decimals":3,"logoURI":"https://assets.coingecko.com/coins/images/683/thumb/matchpool.png?1547034437"},{"chainId":1,"address":"0x87b008e57f640d94ee44fd893f0323af933f9195","name":"Coin Artist","symbol":"COIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12375/thumb/coin_artist_logo.png?1599403918"},{"chainId":1,"address":"0xf18ade29a225faa555e475ee01f9eb66eb4a3a74","name":"Punk Zombie","symbol":"PUNK-ZOMBIE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14000/thumb/icon-punk-zombies-40.png?1613565553"},{"chainId":1,"address":"0x70460c3bb9abcc0aa51f922c00d37816d6ede4d7","name":"BooBanker Research ","symbol":"BBRA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13280/thumb/bbra_logo.png?1606906062"},{"chainId":1,"address":"0xd9e89bfebae447b42c1fa85c590716ec8820f737","name":"RealT Token 4061 ","symbol":"REALTOKEN-S-4061-GR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16616/thumb/4061-Grand-hero-1.jpeg?1624551866"},{"chainId":1,"address":"0x16f812be7fff02caf662b85d5d58a5da6572d4df","name":"United Traders Toke","symbol":"UTT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1741/thumb/utt.png?1547036018"},{"chainId":1,"address":"0x17a4ae8b1ea75d51ab0f2875b80452f7e34c272a","name":"Kawakami Inu","symbol":"KAWA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16369/thumb/kawainu.PNG?1623820805"},{"chainId":1,"address":"0x7f0c8b125040f707441cad9e5ed8a8408673b455","name":"CSP DAO Network","symbol":"NEBO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13436/thumb/csp_dao.png?1608535699"},{"chainId":1,"address":"0x23ccc43365d9dd3882eab88f43d515208f832430","name":"Midas Protocol","symbol":"MAS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4287/thumb/Bestand_000.png?1607560518"},{"chainId":1,"address":"0x9b2d81a1ae36e8e66a0875053429816f0b6b829e","name":"Grey Token","symbol":"GREY","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16987/thumb/5acyT4o.png?1625957378"},{"chainId":1,"address":"0x10994aa2fb8e6ba5d9fb2bc127ff228c4fe6167f","name":"Secure Pad","symbol":"SEPA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14740/thumb/OJmHLHXb_400x400.png?1618004962"},{"chainId":1,"address":"0x9e77d5a1251b6f7d456722a6eac6d2d5980bd891","name":"BROTHER","symbol":"BRAT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/921/thumb/coinbrat.jpg?1547034765"},{"chainId":1,"address":"0xc222e5b89309fab5faf55a3b3bd9082be834916c","name":"Bitcoiva","symbol":"BCA","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/13016/thumb/Untitled-design-6-removebg-preview.png?1604389289"},{"chainId":1,"address":"0x33c8517e8b1beefd4a5275ab72acf39cd18331a3","name":"OxyDev","symbol":"OYT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16540/thumb/oxydev.jpeg?1624364715"},{"chainId":1,"address":"0xe531642e9bb5d027e9c20e03284287b97919a9a5","name":"FaithCoin","symbol":"FAITH","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/3648/thumb/Y4u0Cl8.png?1547038612"},{"chainId":1,"address":"0x24ea9c1cfd77a8db3fb707f967309cf013cc1078","name":"Excavo Finance","symbol":"CAVO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13711/thumb/CAVO.png?1611915659"},{"chainId":1,"address":"0xb6ff96b8a8d214544ca0dbc9b33f7ad6503efd32","name":"Sync Network","symbol":"SYNC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13231/thumb/sync_network.png?1606468585"},{"chainId":1,"address":"0x7c5a0ce9267ed19b22f8cae653f198e3e8daf098","name":"Santiment Network T","symbol":"SAN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/797/thumb/santiment-network-token.png?1547034571"},{"chainId":1,"address":"0xc86d054809623432210c107af2e3f619dcfbf652","name":"Sentinel Protocol","symbol":"UPP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3369/thumb/Sentinel_Protocol.jpg?1547700074"},{"chainId":1,"address":"0x8a8221628361fa25294a83a172dd4f0133207b37","name":"Shadetech","symbol":"SHD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14394/thumb/_MVDoFXx_400x400.jpg?1615878255"},{"chainId":1,"address":"0xa4e7414fcba1af15203030c6daac630df8f16aea","name":"Meme Cash","symbol":"MCH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13344/thumb/memecash_logo.png?1607654879"},{"chainId":1,"address":"0x467bccd9d29f223bce8043b84e8c8b282827790f","name":"Telcoin","symbol":"TEL","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/1899/thumb/tel.png?1547036203"},{"chainId":1,"address":"0xcbe7142f5c16755d8683ba329efa1abf7b54482d","name":"MedicalVeda","symbol":"MVEDA","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13069/thumb/medicalveda_new_logo_final_%281%29.png?1604894690"},{"chainId":1,"address":"0xe9e73e1ae76d17a16cc53e3e87a9a7da78834d37","name":"Camp","symbol":"CAMP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13338/thumb/CampGlobal_256256.png?1607576849"},{"chainId":1,"address":"0xa7fc5d2453e3f68af0cc1b78bcfee94a1b293650","name":"Spiking","symbol":"SPIKE","decimals":10,"logoURI":"https://assets.coingecko.com/coins/images/8764/thumb/20992879_1955586251324612_252149629126870098_n.png?1560915322"},{"chainId":1,"address":"0x17ac188e09a7890a1844e5e65471fe8b0ccfadf3","name":"Cryptocurrency Top ","symbol":"CC10","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13692/thumb/BRfNDy1.png?1610960481"},{"chainId":1,"address":"0xeb5a8eefdae23a815072bf28de8114a825c27876","name":"HYPER Vault NFTX ","symbol":"HYPER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17043/thumb/HYPER.png?1626147576"},{"chainId":1,"address":"0x2ecb13a8c458c379c4d9a7259e202de03c8f3d19","name":"Block chain com","symbol":"BC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5298/thumb/block-chain-com.png?1547350894"},{"chainId":1,"address":"0xeb9951021698b42e4399f9cbb6267aa35f82d59d","name":"Lif","symbol":"LIF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1760/thumb/lif-logo.png?1622196538"},{"chainId":1,"address":"0x65ccd72c0813ce6f2703593b633202a0f3ca6a0c","name":"Nestree","symbol":"EGG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9362/thumb/nestree.png?1566529061"},{"chainId":1,"address":"0x5845cd0205b5d43af695412a79cf7c1aeddb060f","name":"ShardingDAO","symbol":"SHD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14700/thumb/I1QLkPTq_400x400.png?1617836174"},{"chainId":1,"address":"0x1c9922314ed1415c95b9fd453c3818fd41867d0b","name":"Tower","symbol":"TOWER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14134/thumb/towertoken-icon.png?1615350405"},{"chainId":1,"address":"0x5a98fcbea516cf06857215779fd812ca3bef1b32","name":"Lido DAO","symbol":"LDO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13573/thumb/Lido_DAO.png?1609873644"},{"chainId":1,"address":"0xd70240dd62f4ea9a6a2416e0073d72139489d2aa","name":"GLYPH Vault NFTX ","symbol":"GLYPH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17050/thumb/Glyph.png?1626149071"},{"chainId":1,"address":"0x12e51e77daaa58aa0e9247db7510ea4b46f9bead","name":"Aave YFI v1","symbol":"AYFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12482/thumb/aYFI.png?1600188076"},{"chainId":1,"address":"0xde9d41a01bb11a9f41e709242824e54c3917084e","name":"Ignite","symbol":"IGN","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13953/thumb/IGN_logo.png?1615436936"},{"chainId":1,"address":"0xe64509f0bf07ce2d29a7ef19a8a9bc065477c1b4","name":"PiplCoin","symbol":"PIPL","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1017/thumb/piplcoin.png?1548331081"},{"chainId":1,"address":"0xd6d3608f2d770d0a8d0da62d7afe21ea1da86d9c","name":"AmericanHorror Fina","symbol":"AHF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12647/thumb/KBakm0K.jpg?1601386376"},{"chainId":1,"address":"0xb3d3c1bbcef737204aadb4fa6d90e974bc262197","name":"RealT Token 15796","symbol":"REALTOKEN-S-15796-H","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16607/thumb/15796-Hartwell-hero-1.jpeg?1624545151"},{"chainId":1,"address":"0xe1030b48b2033314979143766d7dc1f40ef8ce11","name":"The People s Coin","symbol":"PEEPS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16777/thumb/The-Peoples-Coin-Logo-2.png?1624949153"},{"chainId":1,"address":"0x63f584fa56e60e4d0fe8802b27c7e6e3b33e007f","name":"ContentBox","symbol":"BOX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4929/thumb/contentbox.png?1547740046"},{"chainId":1,"address":"0x80dc468671316e50d4e9023d3db38d3105c1c146","name":"xAAVEa","symbol":"XAAVEA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13236/thumb/xAAVEa.png?1606629962"},{"chainId":1,"address":"0xbc16da9df0a22f01a16bc0620a27e7d6d6488550","name":"Percent","symbol":"PCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12505/thumb/1*T5u1FDg9LLpvHifwr4WCwQ.png?1600310998"},{"chainId":1,"address":"0x6b3760facdeb7f798cd13c0af2e4cd9ddc085122","name":"Oviex","symbol":"OVI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15235/thumb/oviex-token-logo.png?1620192449"},{"chainId":1,"address":"0x40e7705254494a7e61d5b7c86da50225ddc3daae","name":"yplutus","symbol":"YPLT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13358/thumb/ypltblack-01.png?1607826916"},{"chainId":1,"address":"0xf21661d0d1d76d3ecb8e1b9f1c923dbfffae4097","name":"Realio Network","symbol":"RIO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12206/thumb/0.jpg?1598083003"},{"chainId":1,"address":"0xefe82d6baf0db71f92889eb9d00721bd49121316","name":"RealT Token 4680 ","symbol":"REALTOKEN-S-4680-BU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16629/thumb/4680-Buckingham-hero-1.jpeg?1624553513"},{"chainId":1,"address":"0x7b0f66fa5cf5cc28280c1e7051af881e06579362","name":"YFarmLand Token","symbol":"YFARMER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12652/thumb/yfarmer.png?1601435163"},{"chainId":1,"address":"0x6fe355c62c6faf6946ce888ffaba9fd12355ae27","name":"HashBX","symbol":"HBX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7091/thumb/46489646-905693182887642-8012727636373536768-n.png?1550724892"},{"chainId":1,"address":"0x73bde888664df8ddfd156b52e6999eeabab57c94","name":"RealT Token 9717 ","symbol":"REALTOKEN-S-9717-EV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16612/thumb/9717-Everts-hero-1.jpeg?1624546272"},{"chainId":1,"address":"0xaf20b44c1c651d1d29cfb916ee2a0630b828eb7a","name":"YYFI Protocol","symbol":"YYFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12960/thumb/20201027_093510.png?1603850588"},{"chainId":1,"address":"0xfecba472b2540c5a2d3700b2c9e06f0aa7dc6462","name":"Pub Finance","symbol":"PINT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14016/thumb/PINT.png?1614064578"},{"chainId":1,"address":"0x9a99f283e1f6c3b7f24901995624ef7b78e94471","name":"RealT Token 18466 ","symbol":"REALTOKEN-S-18466-F","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16663/thumb/18466-Fielding-hero-1.jpeg?1624625063"},{"chainId":1,"address":"0xc91b523a59acc63a64f61fc7bbfb4bfc82dd25f2","name":"Multiverse","symbol":"AI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16329/thumb/AI.jpg?1623749973"},{"chainId":1,"address":"0x7ca4408137eb639570f8e647d9bd7b7e8717514a","name":"Alpaca City","symbol":"ALPA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13070/thumb/alpaca_logo.png?1604895862"},{"chainId":1,"address":"0xb4efd85c19999d84251304bda99e90b92300bd93","name":"Rocket Pool","symbol":"RPL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2090/thumb/rocket.png?1563781948"},{"chainId":1,"address":"0xfd62247943f94c3910a4922af2c62c2d3fac2a8f","name":"BTEcoin","symbol":"BTE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10736/thumb/read.jpg?1582701685"},{"chainId":1,"address":"0xdf0041891bda1f911c4243f328f7cf61b37f965b","name":"BOOSTO","symbol":"BST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3448/thumb/Untitled2222.png?1547038159"},{"chainId":1,"address":"0x1460a58096d80a50a2f1f956dda497611fa4f165","name":"WeOwn","symbol":"CHX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1943/thumb/ZlGXwUDv_400x400.jpg?1571388675"},{"chainId":1,"address":"0xfa99a87b14b02e2240c79240c5a20f945ca5ef76","name":"GG Token","symbol":"GGTK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13666/thumb/ggblack200.png?1610811691"},{"chainId":1,"address":"0x830b0e9a5ecf36d0a886d21e1c20043cd2d16515","name":"RealT Token 19201","symbol":"REALTOKEN-S-19201-W","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16613/thumb/19201-Westphalia-hero-1.jpeg?1624547689"},{"chainId":1,"address":"0x60a995cebcd44ca566ae22a9666ed28c67b598a1","name":"Hardcore Finance","symbol":"HCORE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13941/thumb/hcore_logo.jpg?1613059806"},{"chainId":1,"address":"0xb7fbff4ce5200215c690cc95855e5d6c5236ee9f","name":"CCSwap","symbol":"CC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15037/thumb/NEW-Logo-1.png?1622196132"},{"chainId":1,"address":"0x6295ab2be04a617747481b292c390bfca592cf28","name":"TokenDesk","symbol":"TDS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1821/thumb/tokendesk.png?1548758709"},{"chainId":1,"address":"0x59e9261255644c411afdd00bd89162d09d862e38","name":"ETHA Lend","symbol":"ETHA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14141/thumb/etha_logo200x200.png?1614646986"},{"chainId":1,"address":"0x481578423221a35b9358cfe5400d202d2bdc66f1","name":"Cyber Doge","symbol":"CYBERD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15508/thumb/PdaUeMH1_400x400.png?1621097475"},{"chainId":1,"address":"0x2c36204a0712a2a50e54a62f7c4f01867e78cb53","name":"Taklimakan Network","symbol":"TAN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1963/thumb/takli.png?1566738740"},{"chainId":1,"address":"0xe1a178b681bd05964d3e3ed33ae731577d9d96dd","name":"BOX Token","symbol":"BOX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6511/thumb/box-token.png?1547563043"},{"chainId":1,"address":"0xff0e5e014cf97e0615cb50f6f39da6388e2fae6e","name":"Origo","symbol":"OGO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4377/thumb/Origo_Logo_png.png?1580430001"},{"chainId":1,"address":"0x4b606e9eb2228c70f44453afe5a73e1fea258ce1","name":"pxUSD Synthetic USD","symbol":"PXUSD-MAR2022","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14507/thumb/perlin.png?1616575526"},{"chainId":1,"address":"0x7cda79830faf07ed696fe220566116951ced36a7","name":"Maya Preferred","symbol":"MAYP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8081/thumb/2u0OXhT9_400x400.png?1554426529"},{"chainId":1,"address":"0x0f8c793dbc30a185138d5da00f106290b26e36c5","name":"Ape Stax","symbol":"ASTAX","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16842/thumb/apestax.png?1625383600"},{"chainId":1,"address":"0x8424c5ac326834b404742de0067bcb654e86be30","name":"Sad Cat Token","symbol":"SCAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14390/thumb/sadcat_icon.png?1615967385"},{"chainId":1,"address":"0xa117ea1c0c85cef648df2b6f40e50bb5475c228d","name":"Ducato Protocol Tok","symbol":"DUCATO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12550/thumb/70691538.png?1600680832"},{"chainId":1,"address":"0x75f06b482adbfb04b877d8ee683e2fcdf18ad153","name":"RealT Token 18481","symbol":"REALTOKEN-S-18481-W","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16633/thumb/18481-Westphalia-hero-1.jpeg?1624554981"},{"chainId":1,"address":"0x8af17a6396c8f315f6b6dbc6aa686c85f9b3e554","name":"3X Long Tezos Token","symbol":"XTZBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10254/thumb/683JEXMN_400x400_%281%29.png?1576675670"},{"chainId":1,"address":"0x45080a6531d671ddff20db42f93792a489685e32","name":"Finance Vote","symbol":"FVT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13181/thumb/finance.png?1606015010"},{"chainId":1,"address":"0x90d46a9636b973f18186541d1b04ed3621a49cb0","name":"Natmin","symbol":"NAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5024/thumb/natmin.png?1547040445"},{"chainId":1,"address":"0x28d7f432d24ba6020d1cbd4f28bedc5a82f24320","name":"Tercet Network","symbol":"TCNX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7319/thumb/180Logo.jpg?1555665267"},{"chainId":1,"address":"0x1051a014e4b3f2bd08e5a7e52522f0f71628162b","name":"GOTOGODS","symbol":"OGODS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9996/thumb/gotogods.png?1574683061"},{"chainId":1,"address":"0xe9fa21e671bcfb04e6868784b89c19d5aa2424ea","name":"EurocoinToken","symbol":"ECTE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7634/thumb/logotoken200x200.png?1550742362"},{"chainId":1,"address":"0x82866b4a71ba9d930fe338c386b6a45a7133eb36","name":"Qcore Finance","symbol":"QCORE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12809/thumb/logo_%281%29_%281%29.png?1602714432"},{"chainId":1,"address":"0xb987d48ed8f2c468d52d6405624eadba5e76d723","name":"Stabilize","symbol":"STBZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12753/thumb/icon.png?1608771101"},{"chainId":1,"address":"0x34950ff2b487d9e5282c5ab342d08a2f712eb79f","name":"Efforce","symbol":"WOZX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13310/thumb/rZ6Oe3dm_400x400.jpg?1607331889"},{"chainId":1,"address":"0xaec2e87e0a235266d9c5adc9deb4b2e29b54d009","name":"SingularDTV","symbol":"SNGLS","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/521/thumb/singulardtv.png?1547034199"},{"chainId":1,"address":"0xa689dcea8f7ad59fb213be4bc624ba5500458dc6","name":"EURBASE","symbol":"EBASE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9541/thumb/Eurbase_Logo.png?1590024287"},{"chainId":1,"address":"0x1571ed0bed4d987fe2b498ddbae7dfa19519f651","name":"iFARM","symbol":"IFARM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14472/thumb/ifarm.png?1616389133"},{"chainId":1,"address":"0x97fb6fc2ad532033af97043b563131c5204f8a35","name":"Plus Coin","symbol":"NPLC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4686/thumb/plus-coin-logo.png?1547039959"},{"chainId":1,"address":"0x27f610bf36eca0939093343ac28b1534a721dbb4","name":"WandX","symbol":"WAND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2219/thumb/wandx.png?1548760294"},{"chainId":1,"address":"0x4fe83213d56308330ec302a8bd641f1d0113a4cc","name":"NuCypher","symbol":"NU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3318/thumb/photo1198982838879365035.jpg?1547037916"},{"chainId":1,"address":"0x6d2c508fc4a588a41713ff59212f85489291d244","name":"Bloomzed Loyalty Cl","symbol":"BLCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10810/thumb/esRodCO5_400x400.jpg?1583906706"},{"chainId":1,"address":"0xc0a25a24cce412e2fb407c08e3785437fee9ad1d","name":"Orient","symbol":"OFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13354/thumb/40FJ03N.png?1607812101"},{"chainId":1,"address":"0x831168e04047d881968d236249689cc001a6da08","name":"Trodl","symbol":"TRO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14713/thumb/KU_Ul7P5_400x400.jpg?1617921826"},{"chainId":1,"address":"0xe0c6ce3e73029f201e5c0bedb97f67572a93711c","name":"ETHplode","symbol":"ETHPLO","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/8712/thumb/coingecko.png?1560246023"},{"chainId":1,"address":"0x8b79656fc38a04044e495e22fad747126ca305c4","name":"AgaveCoin","symbol":"AGVC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7056/thumb/G4TML4cb_400x400.jpg?1547043511"},{"chainId":1,"address":"0x5011d48d4265b6fb8228600a111b2faa1fda3139","name":"SolidDefi","symbol":"SOLID","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16527/thumb/solid.png?1624341534"},{"chainId":1,"address":"0x44e4963f9012e7a7aeee05b7f2caae3419557aea","name":"AI Prediction Ecosy","symbol":"AIPE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8262/thumb/oS7YFh3X_400x400.png?1557125114"},{"chainId":1,"address":"0xeeaa34af95b034bada4baf565063132c765b1fa5","name":"OLCF","symbol":"OLCF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12939/thumb/2_5237799779538307093.png?1603838173"},{"chainId":1,"address":"0x8606a8f28e1e2fd50b9074d65c01548b1f040b32","name":"Cryptrust","symbol":"CTRT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6110/thumb/cryptrust.png?1547042119"},{"chainId":1,"address":"0x5a235c0b4cb8d0e80a5c3bf4d2fad5c32e440884","name":"KONGZ Vault NFTX ","symbol":"KONGZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17061/thumb/kongz.png?1626150650"},{"chainId":1,"address":"0x558ec3152e2eb2174905cd19aea4e34a23de9ad6","name":"Bread","symbol":"BRD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1440/thumb/bread.png?1547563238"},{"chainId":1,"address":"0x9c664f20c0a00a4949dffca76748c02754c875aa","name":"Yearn Shark Finance","symbol":"YSKF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13614/thumb/IMG-20201203-122807-053.png?1610287099"},{"chainId":1,"address":"0x4ca0654f4fc1025cf1a17b7459c20ac0479522ad","name":"Rigel Finance","symbol":"RIGEL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13674/thumb/logo-200x200_%282%29.png?1610682780"},{"chainId":1,"address":"0x440238cc07186adea6653a2e8cb9a24737615609","name":"Shibmerican","symbol":"SHIBMERICAN","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/17008/thumb/60e1bb9c402f36243557ca79_200.png?1626066342"},{"chainId":1,"address":"0xde2f7766c8bf14ca67193128535e5c7454f8387c","name":"Metadium","symbol":"META","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5247/thumb/META_Logo_black.png?1548833790"},{"chainId":1,"address":"0xdf276a2442ccbbdf0707427668434d6d130b75eb","name":"DeFini","symbol":"DFNI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14616/thumb/logo_-_2021-04-01T133425.308.png?1617255308"},{"chainId":1,"address":"0x648d19d775a8d4bafba09e189090bdcbf8ef31c1","name":"Safari","symbol":"SFR","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12599/thumb/SFR.png?1604658501"},{"chainId":1,"address":"0x924e26fee8e10c20726006cc2bd307a538b0ebe5","name":"BTC RSI Crossover Y","symbol":"BTCRSIAPY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11778/thumb/btc_rsi_apy_set.png?1593932540"},{"chainId":1,"address":"0xc716cf01532999e5df45e1bd09743128c5932821","name":"MANEKI Vault NFTX ","symbol":"MANEKI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17058/thumb/MANEKI.png?1626149771"},{"chainId":1,"address":"0x54f9b4b4485543a815c51c412a9e20436a06491d","name":"Baanx","symbol":"BXX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17108/thumb/BXX_Token_logo.png?1626311836"},{"chainId":1,"address":"0x701c244b988a513c945973defa05de933b23fe1d","name":"OAX","symbol":"OAX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/853/thumb/OAXlogo.png?1598686792"},{"chainId":1,"address":"0x08ad1f3a48be1d23c723a6cc8486b247f5de935a","name":"RealT Token 13116","symbol":"REALTOKEN-S-13116-K","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16679/thumb/13116-Kilbourne-hero-1.jpeg?1624630007"},{"chainId":1,"address":"0xdc8af07a7861bedd104b8093ae3e9376fc8596d2","name":"Rocket Vault","symbol":"RVF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14728/thumb/7.png?1618414105"},{"chainId":1,"address":"0xd0c64d6c0e9aa53fffd8b80313e035f7b83083f3","name":"1X Short Litecoin T","symbol":"LTCHEDGE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10230/thumb/683JEXMN_400x400_%281%29.png?1576618594"},{"chainId":1,"address":"0xa36e59c08c9f251a6b7a9eb6be6e32fd6157acd0","name":"Previse","symbol":"PRVS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13977/thumb/previse-logo-200.png?1613437063"},{"chainId":1,"address":"0x3fa729b4548becbad4eab6ef18413470e6d5324c","name":"Mover","symbol":"MOVE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13719/thumb/o0KIvs7T_400x400.jpg?1617672818"},{"chainId":1,"address":"0x6888a16ea9792c15a4dcf2f6c623d055c8ede792","name":"Signal Token","symbol":"SIG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3508/thumb/5906667d95a2d43d31378ce7_60x60logo.png?1547038276"},{"chainId":1,"address":"0x46f8a600337dec5cab03aa9b8f67f1d5b788ce28","name":"RealT Token 18433","symbol":"REALTOKEN-S-18433-F","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16684/thumb/Faust-1.jpeg?1624633417"},{"chainId":1,"address":"0xcfd6ae8bf13f42de14867351eaff7a8a3b9fbbe7","name":"Sinergia","symbol":"SNG","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/2156/thumb/sng.png?1547036457"},{"chainId":1,"address":"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","name":"WETH","symbol":"WETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2518/thumb/weth.png?1547036627"},{"chainId":1,"address":"0xf406f7a9046793267bc276908778b29563323996","name":"APY vision","symbol":"VISION","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13288/thumb/apyvisionlogo200circle.png?1607059042"},{"chainId":1,"address":"0x78f225869c08d478c34e5f645d07a87d3fe8eb78","name":"PieDAO DEFI Large C","symbol":"DEFI+L","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12731/thumb/DeFi_L.png?1602070128"},{"chainId":1,"address":"0x429ac77f069bff489e2d78f9479e1e933305c528","name":"Rizubot","symbol":"RZB","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8072/thumb/IMG-20190325-094833-072.jpg?1554254437"},{"chainId":1,"address":"0xa69d7d4ddf397f3d1e7ebaf108555d1107b3b117","name":"RealT Token 9166 ","symbol":"REALTOKEN-S-9166-DE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16690/thumb/Devonshire-3x.jpeg?1624636640"},{"chainId":1,"address":"0x54735d716995071585a4f6ba341a6ded79756f09","name":"FLUX Token","symbol":"FLX","decimals":18},{"chainId":1,"address":"0xfe33ae95a9f0da8a845af33516edc240dcd711d6","name":"sDASH","symbol":"SDASH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11805/thumb/sDASH.png?1616149895"},{"chainId":1,"address":"0x35a79fceb867ee3392ed0c8dedd8dc2f6124c9cd","name":"SPIDER ECOLOGY","symbol":"ESPI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10075/thumb/logo_%2853%29.png?1575501034"},{"chainId":1,"address":"0x997507cc49fbf0cd6ce5e1ee543218556fafdebc","name":"Bitenium Token","symbol":"BT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14618/thumb/BT-token-logo-200.png?1617262055"},{"chainId":1,"address":"0xc770eefad204b5180df6a14ee197d99d808ee52d","name":"FOX Token","symbol":"FOX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9988/thumb/FOX.png?1574330622"},{"chainId":1,"address":"0xe74ac81b14021d0cfb835f269f48f25918c5cae6","name":"Carbon GEMS","symbol":"GEMS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15982/thumb/CARBON_Social-07_2x%28200PX%29.jpeg?1622532999"},{"chainId":1,"address":"0x8a6f3bf52a26a21531514e23016eeae8ba7e7018","name":"Multiplier","symbol":"MXX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12119/thumb/MXXlogo.png?1597306184"},{"chainId":1,"address":"0x1443e7c1cce72662545d94779120c59251447e91","name":"Molten","symbol":"MOL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13156/thumb/256.png?1605931524"},{"chainId":1,"address":"0xbfd815347d024f449886c171f78fa5b8e6790811","name":"AMPnet","symbol":"AAPX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14303/thumb/AAPX.png?1615356946"},{"chainId":1,"address":"0x21f1af3e751317a2f7de7df31d5d092e6a907bde","name":"RealT Token 18276","symbol":"REALTOKEN-S-18276-A","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16696/thumb/Appoline-18267_jpg__3760%C3%973754_.png?1624640149"},{"chainId":1,"address":"0x30680ac0a8a993088223925265fd7a76beb87e7f","name":"ARAW Token","symbol":"ARAW","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4281/thumb/araw.png?1547039642"},{"chainId":1,"address":"0x3ffffa8f3cc943e43f9f17a83cbb18f4bbb9f4ac","name":"Rewardiqa","symbol":"REW","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11614/thumb/REW_medium.png?1594698840"},{"chainId":1,"address":"0x77777feddddffc19ff86db637967013e6c6a116c","name":"Tornado Cash","symbol":"TORN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13496/thumb/ZINt8NSB_400x400.jpg?1609193407"},{"chainId":1,"address":"0x72dd4b6bd852a3aa172be4d6c5a6dbec588cf131","name":"NAGA","symbol":"NGC","decimals":19,"logoURI":"https://assets.coingecko.com/coins/images/1439/thumb/naga.jpg?1547035515"},{"chainId":1,"address":"0x8694ee05b45c9fe1058ce532de8dbcf1d84a4154","name":"Treasure Financial ","symbol":"TFC","decimals":5,"logoURI":"https://assets.coingecko.com/coins/images/7227/thumb/33781678_148334189202523_3882412846583119872_o.jpg?1547043812"},{"chainId":1,"address":"0x298d492e8c1d909d3f63bc4a36c66c64acb3d695","name":"PolkaBridge","symbol":"PBR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13744/thumb/symbol-whitebg200x200.png?1611377553"},{"chainId":1,"address":"0xc443930ecd59e55e42efe976b8a4ba0658f5c50a","name":"SODIUM Vault NFTX ","symbol":"SODIUM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17071/thumb/MFPickles.png?1626152045"},{"chainId":1,"address":"0xf028adee51533b1b47beaa890feb54a457f51e89","name":"BMCHAIN token","symbol":"BMT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7419/thumb/bchain_logo.jpg?1547199925"},{"chainId":1,"address":"0x9d86b1b2554ec410eccffbf111a6994910111340","name":"Open Platform","symbol":"OPEN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/2953/thumb/open-platform.png?1548330231"},{"chainId":1,"address":"0x8af22fbdefe01b4dc7960ec04ec73e8502f4a6b0","name":"Biokkoin","symbol":"BKKG","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13125/thumb/7F-imH-r_400x400.png?1605496322"},{"chainId":1,"address":"0x420412e765bfa6d85aaac94b4f7b708c89be2e2b","name":"Brazilian Digital T","symbol":"BRZ","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/8472/thumb/2_vtiD3xwce9knG2COxtSMaQ.png?1597786961"},{"chainId":1,"address":"0xc944e90c64b2c07662a292be6244bdf05cda44a7","name":"The Graph","symbol":"GRT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13397/thumb/Graph_Token.png?1608145566"},{"chainId":1,"address":"0x98968f0747e0a261532cacc0be296375f5c08398","name":"MOONCAT Vault NFTX","symbol":"MOONCAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17055/thumb/Mooncats.png?1626149563"},{"chainId":1,"address":"0xfa93660c3f6a848556bb8e265f994160a1f2b289","name":"Community Business ","symbol":"CBT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14701/thumb/CBT-Token-Small.png?1617838284"},{"chainId":1,"address":"0x6c93c838d362656430d81e150cdbe9b69ba8efc4","name":"NFT Rehab","symbol":"REHAB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14292/thumb/NFT_Rehab.png?1615282970"},{"chainId":1,"address":"0xa8006e3ac1bd94e54e3136b8e5dd75db0163e6f4","name":"EveryonesCrypto","symbol":"EOC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13081/thumb/logo_blue.png?1604976930"},{"chainId":1,"address":"0x5f2ec9cf1ec1c0e2c880b6584921e812a4225395","name":"Bitcoin Unicorn","symbol":"BTCUI","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/3676/thumb/btcui.png?1547038666"},{"chainId":1,"address":"0x47da42696a866cdc61a4c809a515500a242909c1","name":"BitRewards Token","symbol":"BIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2198/thumb/bitrewards.png?1547273593"},{"chainId":1,"address":"0x7f9a00e03c2e53a3af6031c17a150dbedaaab3dc","name":"Read This Contract","symbol":"RTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12812/thumb/rtc_logo.png?1602730411"},{"chainId":1,"address":"0x3779d960261f882750b39c622527822c88c98e13","name":"Bitget DeFi Token","symbol":"BFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11610/thumb/bitget-logo-1.png?1591831987"},{"chainId":1,"address":"0x3845badade8e6dff049820680d1f14bd3903a5d0","name":"The Sandbox","symbol":"SAND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12129/thumb/sandbox_logo.jpg?1597397942"},{"chainId":1,"address":"0xcb86c6a22cb56b6cf40cafedb06ba0df188a416e","name":"inSure DeFi","symbol":"SURE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10354/thumb/logo-grey-circle.png?1614910406"},{"chainId":1,"address":"0x30b1efb052205e6ca3c4888c3c50c5b339cc0602","name":"Cargo Gems","symbol":"GEM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12818/thumb/gems_logo.jpg?1602743920"},{"chainId":1,"address":"0xbc46d9961a3932f7d6b64abfdec80c1816c4b835","name":"LITEX","symbol":"LXT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5133/thumb/litex-logo.png?1547040525"},{"chainId":1,"address":"0xb6f43025b29196af2dddd69b0a58afba079cd600","name":"Intelligent Investm","symbol":"IIC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4307/thumb/intelligent-investment-chain.png?1547974303"},{"chainId":1,"address":"0x21686f8ce003a95c99acd297e302faacf742f7d4","name":"Wrapped Conceal","symbol":"WCCX","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/13039/thumb/wccx_logo.png?1604566677"},{"chainId":1,"address":"0x6556d2ec4d96da39cf75cbe50d58fae90079800a","name":"Lukki Operating Tok","symbol":"LOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8463/thumb/HxHSPaeb_400x400.png?1566858024"},{"chainId":1,"address":"0x4e15361fd6b4bb609fa63c81a2be19d873717870","name":"Fantom","symbol":"FTM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4001/thumb/Fantom.png?1558015016"},{"chainId":1,"address":"0x9746953f5b1324a78132895cfd263f417b0faae3","name":"ValueCyberToken","symbol":"VCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5276/thumb/valuecybertoken-logo.jpg?1547040788"},{"chainId":1,"address":"0x2d39ec4da54329d28d230b4973f5aa27886c3aee","name":"NFX Coin","symbol":"NFXC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10694/thumb/nfx.png?1604656044"},{"chainId":1,"address":"0x91d6f6e9026e43240ce6f06af6a4b33129ebde94","name":"Rivex","symbol":"RVX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11644/thumb/200px_logo_RX_3d-01.png?1602130114"},{"chainId":1,"address":"0x015df42d36bc851c7f15f80bd1d4e8dbf02aed0c","name":"Connect Coin","symbol":"XCON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6592/thumb/connect_coin.jpg?1547042796"},{"chainId":1,"address":"0xfde98a3bf5c7f6336ae4ce1b43148aeab7b7c89a","name":"ENERGY Vault NFTX ","symbol":"ENERGY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17057/thumb/ENERGY.png?1626149631"},{"chainId":1,"address":"0x39eae99e685906ff1c11a962a743440d0a1a6e09","name":"Holyheld OLD ","symbol":"HOLY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12747/thumb/veqfbl.png?1602211222"},{"chainId":1,"address":"0xeda8b016efa8b1161208cf041cd86972eee0f31e","name":"IHT Real Estate Pro","symbol":"IHT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3158/thumb/iht-real-estate-protocol.png?1547744404"},{"chainId":1,"address":"0xaea5e11e22e447fa9837738a0cd2848857748adf","name":"Social Finance","symbol":"SOFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12296/thumb/logo-transparent.png?1598931704"},{"chainId":1,"address":"0xc7eb46eefa9e83022d024c8edc0de31aecbfbdd7","name":"Gambler Shiba","symbol":"GSHIBA","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/17130/thumb/RHzOHCyb_400x400.jpg?1626410775"},{"chainId":1,"address":"0x4a73e60adbb8575500ffc6aaea6128954011c8af","name":"Doch Coin","symbol":"DCH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11598/thumb/dzRvyTsj_400x400_%281%29.jpg?1591668799"},{"chainId":1,"address":"0x00006100f7090010005f1bd7ae6122c3c2cf0090","name":"TrueAUD","symbol":"TAUD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10146/thumb/TAUD.png?1576466892"},{"chainId":1,"address":"0x87c4bd3038176301e81e6682ce51a6fdaefabd0c","name":"Pofid Dao","symbol":"PFID","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12462/thumb/62735485.png?1600033798"},{"chainId":1,"address":"0xca3fe04c7ee111f0bbb02c328c699226acf9fd33","name":"SEEN","symbol":"SEEN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13052/thumb/seen_logo.png?1604678509"},{"chainId":1,"address":"0x57652fc91f522f9eff0b38cdf1d51f5fb5764215","name":"Buddy","symbol":"BUD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4697/thumb/buddy.jpg?1554103368"},{"chainId":1,"address":"0x827d53c8170af52625f414bde00326fc8a085e86","name":"Beaxy","symbol":"BXY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4114/thumb/beaxy.png?1583389826"},{"chainId":1,"address":"0x0ebb614204e47c09b6c3feb9aaecad8ee060e23e","name":"Cryptopay","symbol":"CPAY","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/2216/thumb/cryptopay.png?1547036499"},{"chainId":1,"address":"0x6ce654ac973d326f89f0685e7459542641410ed9","name":"HubDao","symbol":"HD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12970/thumb/HD_ICON.png?1603941647"},{"chainId":1,"address":"0xe4e822c0d5b329e8bb637972467d2e313824efa0","name":"Dfinance","symbol":"XFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14002/thumb/7223.png?1613579385"},{"chainId":1,"address":"0x10be9a8dae441d276a5027936c3aaded2d82bc15","name":"UniMex Network","symbol":"UMX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13615/thumb/Unimex-Brandmark-RGB-Small_200x200.png?1612758290"},{"chainId":1,"address":"0x983f6d60db79ea8ca4eb9968c6aff8cfa04b3c63","name":"SONM","symbol":"SNM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/861/thumb/sonm.png?1548609871"},{"chainId":1,"address":"0x1997830b5beb723f5089bb8fc38766d419a0444d","name":"Newinu","symbol":"NEWINU","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16192/thumb/Newinu.png?1625583532"},{"chainId":1,"address":"0xe632e1ea781df32c60ab11052958744cbfbc439a","name":"BAKC Vault NFTX ","symbol":"BAKC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17052/thumb/BYAC.png?1626149096"},{"chainId":1,"address":"0xfef3884b603c33ef8ed4183346e093a173c94da6","name":"MetaMorph","symbol":"METM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3929/thumb/metamorph.png?1548084814"},{"chainId":1,"address":"0x4ff7c227e1e7bd59351de8635381c379750a8040","name":"Hype","symbol":"HYPE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13494/thumb/N9aAdTFH_400x400.png?1609153363"},{"chainId":1,"address":"0x66af49ebaeefed6f0f43df48142341391f3f25c1","name":"Mangu","symbol":"MNGUZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13018/thumb/6SrauWkt_200x200.jpg?1604389900"},{"chainId":1,"address":"0xcf42de80d80edc4a8d56e4e840b5ff0dc84aaa17","name":"Real estate Sales P","symbol":"RSP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7357/thumb/rsSiuGCV_400x400.jpg?1547044037"},{"chainId":1,"address":"0xf3db7560e820834658b590c96234c333cd3d5e5e","name":"CoinPoker","symbol":"CHP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1808/thumb/coinpoker.jpg?1547036113"},{"chainId":1,"address":"0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f","name":"Synthetix Network T","symbol":"SNX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3406/thumb/SNX.png?1598631139"},{"chainId":1,"address":"0xf503bf7a7b0962205668ed041140f4af360304be","name":"Unicly Autoglyphs C","symbol":"UGLYPH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15352/thumb/uGLYPH.png?1620629169"},{"chainId":1,"address":"0xb6c3dc857845a713d3531cea5ac546f6767992f4","name":"Advertise Coin","symbol":"ADCO","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/14344/thumb/advertisecoin200x200.png?1615503478"},{"chainId":1,"address":"0xf8b358b3397a8ea5464f8cc753645d42e14b79ea","name":"Airbloc","symbol":"ABL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4393/thumb/airbloc-protocol-logo.png?1547039734"},{"chainId":1,"address":"0x049e119413ab1f1b0fd836e657e3e4ba3ad9cab8","name":"Kesef Finance","symbol":"KSF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16434/thumb/Kesef.png?1624013559"},{"chainId":1,"address":"0xb2279b6769cfba691416f00609b16244c0cf4b20","name":"Waifu Token","symbol":"WAIF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12100/thumb/Small-Waifu_token.png?1597120029"},{"chainId":1,"address":"0x1e797ce986c3cff4472f7d38d5c4aba55dfefe40","name":"BlockCDN","symbol":"BCDN","decimals":15,"logoURI":"https://assets.coingecko.com/coins/images/1301/thumb/blockcdn.png?1547350830"},{"chainId":1,"address":"0xd1632efa392925089785b43410c529f8959a8d9a","name":"Real Land","symbol":"RLD","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1882/thumb/rld.png?1606535580"},{"chainId":1,"address":"0x916885426255235da7a0bd90447986c00675f9ec","name":"GoalTime N","symbol":"GTX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10705/thumb/GTX_200x200.png?1607580745"},{"chainId":1,"address":"0x4893a1938df49f4178c37e4e965cc8a1b3882173","name":"Baroin","symbol":"BRI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12940/thumb/baroin200.png?1603757378"},{"chainId":1,"address":"0x6b4c7a5e3f0b99fcd83e9c089bddd6c7fce5c611","name":"Million","symbol":"MM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16825/thumb/logo200x200.png?1625834139"},{"chainId":1,"address":"0xf4b54874cd8a6c863e3a904c18fda964661ec363","name":"DWS","symbol":"DWS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4940/thumb/dws.png?1547224427"},{"chainId":1,"address":"0x78a52e12c7b63d05c12f9608307587cf654ec3d0","name":"Crypto Village Acce","symbol":"CVA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10071/thumb/logo_tondo_%281%29.png?1575499784"},{"chainId":1,"address":"0xbe3c393fb670f0a29c3f3e660ffb113200e36676","name":"Digital Antares Dol","symbol":"DANT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13869/thumb/dant.png?1612435811"},{"chainId":1,"address":"0xa774ffb4af6b0a91331c084e1aebae6ad535e6f3","name":"flexUSD","symbol":"FLEXUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13323/thumb/flexUSD_2x.png?1607480702"},{"chainId":1,"address":"0x626e8036deb333b408be468f951bdb42433cbf18","name":"AIOZ Network","symbol":"AIOZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14631/thumb/aioz_logo.png?1617413126"},{"chainId":1,"address":"0xffc63b9146967a1ba33066fb057ee3722221acf0","name":"Alpha Token","symbol":"A","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7968/thumb/alpha-token.jpg?1552883009"},{"chainId":1,"address":"0x556938621c19e5eae58c94a806da9d237b969bd8","name":"Low Orbit Crypto Ca","symbol":"LOCC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15911/thumb/LOCC_Token_200_x_200.png?1622418917"},{"chainId":1,"address":"0x3d382228c54736d831fac2748f4734d9177c7332","name":"Aniverse","symbol":"ANV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16348/thumb/anv.PNG?1623794994"},{"chainId":1,"address":"0xcc394f10545aeef24483d2347b32a34a44f20e6f","name":"Vault Guardian Toke","symbol":"VGT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4652/thumb/Vault12.jpg?1547039918"},{"chainId":1,"address":"0x61bc1f530ac6193d73af1e1a6a14cb44b9c3f915","name":"Pajama Finance","symbol":"PJM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12669/thumb/pajama200.png?1601501914"},{"chainId":1,"address":"0x65032604dab202aff9adf89300cdb4bd0d059f55","name":"SOBA Token","symbol":"SOBA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14673/thumb/soba-logo-black.png?1617680379"},{"chainId":1,"address":"0x3218a02f8f8b5c3894ce30eb255f10bcba13e654","name":"MegaCryptoPolis","symbol":"MEGA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12971/thumb/mcp_icon_200.png?1603943441"},{"chainId":1,"address":"0xbcdfe338d55c061c084d81fd793ded00a27f226d","name":"Decentralized Machi","symbol":"DML","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3297/thumb/decentralized-machine-learning.png?1547037880"},{"chainId":1,"address":"0xea5f88e54d982cbb0c441cde4e79bc305e5b43bc","name":"PARETO Rewards","symbol":"PARETO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2783/thumb/pareto.png?1547036965"},{"chainId":1,"address":"0x672a1ad4f667fb18a333af13667aa0af1f5b5bdd","name":"Verify","symbol":"CRED","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1349/thumb/verify.png?1548759755"},{"chainId":1,"address":"0xb0bfb1e2f72511cf8b4d004852e2054d7b9a76e1","name":"Streamix","symbol":"MIXS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13275/thumb/stream.png?1606893790"},{"chainId":1,"address":"0xcf81e6fdb8d7a743c3d4c3542a5356ff197ea1c0","name":"Global Gaming","symbol":"GMNG","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12792/thumb/output-onlinepngtools.png_small.png?1602581337"},{"chainId":1,"address":"0x4bcea5e4d0f6ed53cf45e7a28febb2d3621d7438","name":"Modex","symbol":"MODEX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2851/thumb/LhWIeAg.png?1602566568"},{"chainId":1,"address":"0x8a6aca71a218301c7081d4e96d64292d3b275ce0","name":"S Finance","symbol":"SFG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12605/thumb/Z7D8B4b.png?1605346184"},{"chainId":1,"address":"0xdb61354e9cf2217a29770e9811832b360a8daad3","name":"3X Long Litecoin To","symbol":"LTCBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10227/thumb/683JEXMN_400x400_%281%29.png?1576618224"},{"chainId":1,"address":"0xb9d99c33ea2d86ec5ec6b8a4dd816ebba64404af","name":"K21","symbol":"K21","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14466/thumb/k21-token.png?1616775801"},{"chainId":1,"address":"0x9f549ebfd4974cd4ed4a1550d40394b44a7382aa","name":"LinkCoin Token","symbol":"LKN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6098/thumb/vWhhedXQ.png?1547042094"},{"chainId":1,"address":"0x4618519de4c304f3444ffa7f812dddc2971cc688","name":"Kind Ads Token","symbol":"KIND","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5302/thumb/kind-ads-token.png?1547975306"},{"chainId":1,"address":"0x6b4689e4514957699edeb2ee91c947f18e439806","name":"ZeuxCoin","symbol":"ZUC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9034/thumb/HVMZgdBY_400x400.jpg?1563831075"},{"chainId":1,"address":"0xe5b998f63e7022664d3c36c56d1798cca7751573","name":"Bor Protocol","symbol":"BRP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15665/thumb/f.eu1.jwwb.nl_public_y_m_w_temp-tdnklykxgvgehwwdodye_gdyq90_image-15.png?1621491281"},{"chainId":1,"address":"0x4f5f2eea4ed3485e5e23a39704d5fd9d0a423886","name":"Torchain","symbol":"TOR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8636/thumb/Z01mRB2BHvjsIsR95aZ4l8UTF87S5JVTgTvvdC5PVpEPaFXOoXuYwdKvEDiK3o5s-tx-o-S5KW1y2zgwn-9ftk6QUfNQsc_gnzrbvfbIgbm-_FYNoTG50PHc59XU32p6vihaXFYUnHZ9cMCHzGvq9fSqKRul9AEiUe0M9SkS65UNuL--P1ulJtc7r-rQTZpPZ3TS0VhXSGPsdwMglbhIHQDs_.jpg?1566612218"},{"chainId":1,"address":"0x996dc5dfc819408dd98cd92c9a76f64b0738dc3d","name":"Skillchain","symbol":"SKI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3780/thumb/SKI.png?1589121168"},{"chainId":1,"address":"0xaac679720204aaa68b6c5000aa87d789a3ca0aa5","name":"Huobi Bitcoin Cash","symbol":"HBCH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14105/thumb/HBCh.png?1614330789"},{"chainId":1,"address":"0xebdf9a7ae0009b958c6d09501eb9ac1dafeb31ab","name":"REDi","symbol":"REDI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6329/thumb/token_blue.png?1566515068"},{"chainId":1,"address":"0xa4ef4b0b23c1fc81d3f9ecf93510e64f58a4a016","name":"1MillionNFTs","symbol":"1MIL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14990/thumb/4kQ8hRnU_400x400.jpg?1619334818"},{"chainId":1,"address":"0xa7f976c360ebbed4465c2855684d1aae5271efa9","name":"TrueFlip","symbol":"TFL","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/940/thumb/trueflip.png?1548759136"},{"chainId":1,"address":"0x64c5572e7a100af9901c148d75d72c619a7f1e9d","name":"UniCrapToken xyz","symbol":"UNICRAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12172/thumb/GfCR6sqZMaJmDBJ80CQBSSxzm2fe1Y0Cd87I9ZgwUU32Zr70LZDGA7ue_2aisyeXuEhweh4fQaRYg1KRbQzuZVrnDJota1LsNLgcjWj23eYTAdo8bI79hg6oxwVC-FPi58jxlqKO6e-5G-ICeqzUbW-LPQjSeG0esscG9a5y_9R64p4rMTHCqudAO01tLmBrYfIUn9bEyK-pgicSGY0.jpg?1597804376"},{"chainId":1,"address":"0x14f0a12a43c36c49d4b403dd6e1a9b8222be456c","name":"VINX COIN","symbol":"VXC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11786/thumb/vinx.png?1594005658"},{"chainId":1,"address":"0x4e085036a1b732cbe4ffb1c12ddfdd87e7c3664d","name":"Predictz","symbol":"PRDZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13376/thumb/Predictz_Transperant.png?1608021631"},{"chainId":1,"address":"0x06576eb3b212d605b797dc15523d9dc9f4f66db4","name":"The Crypto Propheci","symbol":"TCP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15054/thumb/tcp.PNG?1619579195"},{"chainId":1,"address":"0xc75f15ada581219c95485c578e124df3985e4ce0","name":"zzz finance","symbol":"ZZZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12123/thumb/zzz_finance_logo.jpg?1597306287"},{"chainId":1,"address":"0xd51e852630debc24e9e1041a03d80a0107f8ef0c","name":"ORIUM","symbol":"ORM","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/7247/thumb/K0VVDQwT_400x400.jpg?1547043848"},{"chainId":1,"address":"0x3505f494c3f0fed0b594e01fa41dd3967645ca39","name":"Swarm Network","symbol":"SWM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/197/thumb/swarm.jpg?1547033949"},{"chainId":1,"address":"0xf8e06e4e4a80287fdca5b02dccecaa9d0954840f","name":"Truegame","symbol":"TGAME","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2974/thumb/tgame.png?1518620605"},{"chainId":1,"address":"0x4846239fdf4d4c1aeb26729fa064b0205aca90e1","name":"True Seigniorage Do","symbol":"TSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13555/thumb/2dc3a1b1-41fd-4d9c-ba1d-8114635efd09.jpg?1609754836"},{"chainId":1,"address":"0xe6404a4472e5222b440f8fafb795553046000841","name":"BTC Long Only Alpha","symbol":"BLOAP","decimals":18},{"chainId":1,"address":"0x478e677c0bd24c848bd591cc5273383dd5f30e4a","name":"PATH Vault NFTX ","symbol":"PATH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17048/thumb/PATH.png?1626148660"},{"chainId":1,"address":"0xcbcc0f036ed4788f63fc0fee32873d6a7487b908","name":"Humaniq","symbol":"HMQ","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/647/thumb/humaniq.jpg?1547034375"},{"chainId":1,"address":"0xf6317dd9b04097a9e7b016cd23dcaa7cfe19d9c6","name":"TOPBTC Token","symbol":"TOPB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6252/thumb/2xgmN7FE_400x400.jpg?1547042288"},{"chainId":1,"address":"0xf0814d0e47f2390a8082c4a1bd819fdde50f9bfc","name":"XPToken io","symbol":"XPT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13184/thumb/Untitled-design-7.png?1606083893"},{"chainId":1,"address":"0x81995ff7aee5c780192b47e0b42a7a86692d1415","name":"Speedcash","symbol":"SCS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2929/thumb/scs_logo_200x200.png?1606439865"},{"chainId":1,"address":"0x1df6f1bb7454e5e4ba3bca882d3148fbf9b5697a","name":"Yfscience","symbol":"YFSI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12723/thumb/Yfscience_logo.png?1602038268"},{"chainId":1,"address":"0x1368452bfb5cd127971c8de22c58fbe89d35a6bf","name":"JNTR e","symbol":"JNTR/E","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12829/thumb/jntr_logo.jpg?1602835757"},{"chainId":1,"address":"0x69d2779533a4d2c780639713558b2cc98c46a9b7","name":"VNT Chain","symbol":"VNT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6897/thumb/images_%282%29.png?1547043254"},{"chainId":1,"address":"0x24692791bc444c5cd0b81e3cbcaba4b04acd1f3b","name":"Unikoin Gold","symbol":"UKG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1120/thumb/unikoin-gold.png?1548759441"},{"chainId":1,"address":"0x15c303b84045f67156acf6963954e4247b526717","name":"Gas Cash Back","symbol":"GCBN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13814/thumb/hlogo.e7dd3b85.png?1612049566"},{"chainId":1,"address":"0xd4342a57ecf2fe7ffa37c33cb8f63b1500e575e6","name":"Apron","symbol":"APN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14916/thumb/1_GOjoDhGzzpqnMPGpHGeWhg.png?1618998577"},{"chainId":1,"address":"0xc56b13ebbcffa67cfb7979b900b736b3fb480d78","name":"Social Activity Tok","symbol":"SAT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/2586/thumb/sat.png?1547036721"},{"chainId":1,"address":"0x2781246fe707bb15cee3e5ea354e2154a2877b16","name":"ELYSIA","symbol":"EL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10887/thumb/CeyRVXPY_400x400.jpg?1585559128"},{"chainId":1,"address":"0x1d96fd43ee07aa79f8fd003cbdf404fb5ce41ad2","name":"Qawalla Token","symbol":"QWLA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15242/thumb/qawalla-token-logo-200.png?1620203833"},{"chainId":1,"address":"0xbbe761ea1447a20b75aa485b7bcad4837415d7d7","name":"Global Crypto Allia","symbol":"CALL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10276/thumb/gca-favicon.png?1576969530"},{"chainId":1,"address":"0x4abb9cc67bd3da9eb966d1159a71a0e68bd15432","name":"KelVPN","symbol":"KEL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14851/thumb/logokelvpn200x200.png?1618797379"},{"chainId":1,"address":"0x14468ff6b324f1c5a869e62b9c442846e7d0baf1","name":"Maya Coin","symbol":"MAYA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9325/thumb/coinlogo.png?1566266922"},{"chainId":1,"address":"0x021576770cb3729716ccfb687afdb4c6bf720cb6","name":"Unlimited FiscusFYI","symbol":"UFFYI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12666/thumb/uFFYI.png?1601463557"},{"chainId":1,"address":"0xa849eaae994fb86afa73382e9bd88c2b6b18dc71","name":"MVL","symbol":"MVL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3476/thumb/mass-vehicle-ledger.png?1547978299"},{"chainId":1,"address":"0x491c9a23db85623eed455a8efdd6aba9b911c5df","name":"Hero Node Token","symbol":"HER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4131/thumb/Webp.net-resizeimage_%2824%29.jpg?1547039357"},{"chainId":1,"address":"0x9f7229af0c4b9740e207ea283b9094983f78ba04","name":"Tadpole","symbol":"TAD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13134/thumb/9DmF_cs3_400x400.jpg?1605574755"},{"chainId":1,"address":"0x94d863173ee77439e4292284ff13fad54b3ba182","name":"Delphi","symbol":"ADEL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12300/thumb/adel_on_white_10x.png?1598967061"},{"chainId":1,"address":"0x43dfc4159d86f3a37a5a4b3d4580b888ad7d4ddd","name":"DODO","symbol":"DODO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12651/thumb/dodo_logo.png?1601433025"},{"chainId":1,"address":"0xe81d72d14b1516e68ac3190a46c93302cc8ed60f","name":"Coinlancer","symbol":"CL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2445/thumb/coinlancer.png?1516072576"},{"chainId":1,"address":"0xf94b5c5651c888d928439ab6514b93944eee6f48","name":"YIELD App","symbol":"YLD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13365/thumb/Icon_Blue.png?1607917500"},{"chainId":1,"address":"0x2466ba59e474c46639ceb4eb9b7248638443560d","name":"Capitalsharetoken","symbol":"CSTO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9331/thumb/officallogo.png?1566291539"},{"chainId":1,"address":"0x7dee45dff03ec7137979586ca20a2f4917bac9fa","name":"DeFi Wizard","symbol":"DWZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14132/thumb/logoonblack.png?1614593221"},{"chainId":1,"address":"0xce5114d7fa8361f0c088ee26fa3a5446c4a1f50b","name":"Blue Whale","symbol":"BWX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3332/thumb/blue-whale-logo-web-transparent-blue.png?1547037935"},{"chainId":1,"address":"0xb9eefc4b0d472a44be93970254df4f4016569d27","name":"DigitalBits","symbol":"XDB","decimals":7,"logoURI":"https://assets.coingecko.com/coins/images/8089/thumb/digitalbits-logo.jpg?1554454902"},{"chainId":1,"address":"0xc697648021870cc250fbcd6ea8e77524f57b45c0","name":"Podo Point","symbol":"POD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13917/thumb/wkJXhZ0M_400x400.png?1612841009"},{"chainId":1,"address":"0xed91879919b71bb6905f23af0a68d231ecf87b14","name":"DMM Governance","symbol":"DMG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11677/thumb/dmm.png?1592674690"},{"chainId":1,"address":"0xa6610ed604047e7b76c1da288172d15bcda57596","name":"Sacks","symbol":"SACKS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15876/thumb/mockup-a558c23f_1024x1024_2x.jpg?1622186229"},{"chainId":1,"address":"0x18aa7c90d3ae4c5bb219d0a2813f441704084625","name":"Decentralize Curren","symbol":"DCA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7673/thumb/DCA.png?1573037394"},{"chainId":1,"address":"0x55150e8378b81f930f310d4b62ab7e1252c30b9b","name":"Smart Trade Network","symbol":"STN5","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15962/thumb/stn5.png?1622519333"},{"chainId":1,"address":"0xacce88f5a63a5e65db9aa7303720be16b556e751","name":"Coineal Token","symbol":"NEAL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6712/thumb/coineal_token.png?1547042932"},{"chainId":1,"address":"0x2467aa6b5a2351416fd4c3def8462d841feeecec","name":"qiibee","symbol":"QBX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2365/thumb/qbx-icon-dark.png?1554082393"},{"chainId":1,"address":"0x53f0c9f1b6e283a59bcd672e80e2222b97e534cb","name":"X Block","symbol":"IX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8258/thumb/3SP7h2sF_400x400.jpg?1557121522"},{"chainId":1,"address":"0xfe56e974c1c85e9351325fb2d62963a022ad624f","name":"UnilayerX","symbol":"LAYERX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15015/thumb/LAYERX-logo.png?1619428951"},{"chainId":1,"address":"0x83eb94cb563146a42fe0a8b3d051f2387a7fb81f","name":"Cipher Core Token","symbol":"CIPHC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11524/thumb/CipherCoreLogo_L.jpg?1590681179"},{"chainId":1,"address":"0x193408ca0576b73156ed42a2ea7d6fd3f6507162","name":"Infinity Esaham","symbol":"INFS","decimals":1,"logoURI":"https://assets.coingecko.com/coins/images/10716/thumb/WBUD9cx.png?1582524776"},{"chainId":1,"address":"0xc7a8b45e184138114e6085c82936a8db93dd156a","name":"MASK Vault NFTX ","symbol":"MASK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17046/thumb/Hashie.png?1626147674"},{"chainId":1,"address":"0xc12ecee46ed65d970ee5c899fcc7ae133aff9b03","name":"Try Finance","symbol":"TRY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13865/thumb/try-logo.png?1612420128"},{"chainId":1,"address":"0xd6a5ab46ead26f49b03bbb1f9eb1ad5c1767974a","name":"Ethermon","symbol":"EMON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15889/thumb/LtET0reH_400x400.jpg?1622213962"},{"chainId":1,"address":"0x36151737b45017234e9570cf9a1cac97138953c2","name":"Noiz Chain","symbol":"NOIZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3798/thumb/xDxHeYll_400x400.jpg?1563415658"},{"chainId":1,"address":"0x4f4f0ef7978737ce928bff395529161b44e27ad9","name":"Your Finance Decent","symbol":"YFD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13225/thumb/YFD2.png?1613362452"},{"chainId":1,"address":"0x136fae4333ea36a24bb751e2d505d6ca4fd9f00b","name":"ETH RSI 60 40 Yield","symbol":"ETHRSIAPY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10602/thumb/eth-rsi-40-60-ctoken-set.png?1580970094"},{"chainId":1,"address":"0x72430a612adc007c50e3b6946dbb1bb0fd3101d1","name":"Thingschain","symbol":"TIC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5320/thumb/thingschain-logo.png?1547040881"},{"chainId":1,"address":"0x84679bc467dc6c2c40ab04538813aff3796351f1","name":"Chonk","symbol":"CHONK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12899/thumb/a2LHjXZ.jpeg?1603418225"},{"chainId":1,"address":"0x639ae8f3eed18690bf451229d14953a5a5627b72","name":"Nimbus Governance T","symbol":"GNBU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16391/thumb/gnbu.PNG?1623898676"},{"chainId":1,"address":"0xbdfa65533074b0b23ebc18c7190be79fa74b30c2","name":"Zloadr","symbol":"ZDR","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1885/thumb/Zloadr.png?1547036193"},{"chainId":1,"address":"0xaae3cf9968d26925bdb73ce3864e0084a20f4687","name":"Farmland Protocol","symbol":"FAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13497/thumb/70059912.jpg?1609193763"},{"chainId":1,"address":"0x7c3e3eae4d893d11c61e74d5187c962ba5744a3b","name":"KokoSwap","symbol":"KOKO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15205/thumb/Kokoswap.png?1624955646"},{"chainId":1,"address":"0x8e57c27761ebbd381b0f9d09bb92ceb51a358abb","name":"extraDNA","symbol":"XDNA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12667/thumb/Logo_coin_black.png?1601463830"},{"chainId":1,"address":"0xbf4a2ddaa16148a9d0fa2093ffac450adb7cd4aa","name":"Ethereum Money","symbol":"ETHMNY","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/9025/thumb/20200605_131214.png?1597297671"},{"chainId":1,"address":"0x773258b03c730f84af10dfcb1bfaa7487558b8ac","name":"SEFI","symbol":"SEFI","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/14601/thumb/Secret-Swap-Icon.jpg?1617197061"},{"chainId":1,"address":"0x3930e4ddb4d24ef2f4cb54c1f009a3694b708428","name":"Game Fanz","symbol":"GFN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7165/thumb/gfn.png?1549539102"},{"chainId":1,"address":"0x106d3c66d22d2dd0446df23d7f5960752994d600","name":"LabraCoin","symbol":"LABRA","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15024/thumb/Labra_Coin.jpg?1622613634"},{"chainId":1,"address":"0x6936f1dcd8c2e3a69469311a130858174f9f0a15","name":"Shiba Swim","symbol":"SSWIM","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15591/thumb/BaAw4CKm_400x400.jpg?1621292396"},{"chainId":1,"address":"0x13edcc775f8895961b81db5c0205889b3afb3a16","name":"RINGER Vault NFTX ","symbol":"RINGER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17060/thumb/RINGER.png?1626150396"},{"chainId":1,"address":"0x481de76d5ab31e28a33b0ea1c1063adcb5b1769a","name":"B26","symbol":"B26","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14404/thumb/VA6RVny9FP2RRc70QVVPSjXasSRx7SLTLrvyZTQghAX7tAFUJ3f1ekCpb3daNETOClQmZ-8NQxnuX6-Evvjazs2AXbbpcL8toNO2pdoDt8zo09GiZxapdFCUJNxzor43QgsXUtmaecOTpgfoJrwUU4GGb7DSqZncr0Z8VJX9wXaiu8kPKsGlP6ZJZ6d-nGwkaW7elAg_oSpsdzG.jpg?1615896479"},{"chainId":1,"address":"0x35bd01fc9d6d5d81ca9e055db88dc49aa2c699a8","name":"Friends With Benefi","symbol":"FWB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14391/thumb/xRGEXmQN_400x400.png?1615868085"},{"chainId":1,"address":"0x68a118ef45063051eac49c7e647ce5ace48a68a5","name":"Based Money","symbol":"BASED","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12115/thumb/Based.png?1597261198"},{"chainId":1,"address":"0xf0c5831ec3da15f3696b4dad8b21c7ce2f007f28","name":"AXIS Token","symbol":"AXIS","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/16972/thumb/lUeFYUeu_400x400.png?1625815058"},{"chainId":1,"address":"0x6ba460ab75cd2c56343b3517ffeba60748654d26","name":"UpToken","symbol":"UP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/3425/thumb/uptoken.png?1548759702"},{"chainId":1,"address":"0x62359ed7505efc61ff1d56fef82158ccaffa23d7","name":"cVault finance","symbol":"CORE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12635/thumb/cvault.finance_logo.png?1601353499"},{"chainId":1,"address":"0xdd6c68bb32462e01705011a4e2ad1a60740f217f","name":"Hubii Network","symbol":"HBT","decimals":15,"logoURI":"https://assets.coingecko.com/coins/images/994/thumb/hubii-network.png?1547744064"},{"chainId":1,"address":"0x5c62da804298d5972a323c80b539b8e7517a0dde","name":"VENJOCOIN","symbol":"VJC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8088/thumb/vjc-logo.jpg?1554454773"},{"chainId":1,"address":"0x72e203a17add19a3099137c9d7015fd3e2b7dba9","name":"BlockchainPoland","symbol":"BCP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8143/thumb/43Stz1Tw.png?1555551797"},{"chainId":1,"address":"0x5aa485e6b794bcf5f834bf5c7ff43b9b83322764","name":"Mandi Token","symbol":"MANDI","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11747/thumb/DFE10T9.png?1593414801"},{"chainId":1,"address":"0xf83d7ff2e4b43ebad2fa534e621e31076f4d254c","name":"Hyper Credit Networ","symbol":"HPAY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13536/thumb/256-256.png?1609541754"},{"chainId":1,"address":"0x0198f46f520f33cd4329bd4be380a25a90536cd5","name":"PlayChip","symbol":"PLA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4567/thumb/pla.png?1547039851"},{"chainId":1,"address":"0x300a902513815028e97fc79e92082ce6a98d3b74","name":"Ethersocks","symbol":"SOX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14943/thumb/LOGO-for-CMC-V1.png?1619429911"},{"chainId":1,"address":"0xbbe319b73744db9d54f5d29df7d8256b7e43995c","name":"Aragon China","symbol":"ANC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12261/thumb/bbs-panda200.png?1598579736"},{"chainId":1,"address":"0x00000000000045166c45af0fc6e4cf31d9e14b9a","name":"TopBidder","symbol":"BID","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14820/thumb/topbidder_logo_square_256.png?1618556813"},{"chainId":1,"address":"0x3e9e371f8d2e9fca315fb0a747533ced8a3fcbcb","name":"BIXCPRO","symbol":"BIXCPRO","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/7893/thumb/download.jpg?1551429825"},{"chainId":1,"address":"0x2cf2f4e07ecc54740293df6d6fb4150d725a919f","name":"Winsor Token","symbol":"WST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10827/thumb/Untitled-3-01_i8l0qn.jpg?1584340349"},{"chainId":1,"address":"0x7a2bc711e19ba6aff6ce8246c546e8c4b4944dfd","name":"WAXE","symbol":"WAXE","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13508/thumb/waxe_logo.png?1609232755"},{"chainId":1,"address":"0xa0bed124a09ac2bd941b10349d8d224fe3c955eb","name":"DePay","symbol":"DEPAY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13183/thumb/favicon.png?1622174813"},{"chainId":1,"address":"0xd07d9fe2d2cc067015e2b4917d24933804f42cfa","name":"Tolar","symbol":"TOL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4487/thumb/tolar.png?1548759060"},{"chainId":1,"address":"0xc350e846e2c57f9eece90febc253d14c8080871b","name":"SRH","symbol":"SRH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2051/thumb/srcoin.png?1548610836"},{"chainId":1,"address":"0x54e8371c1ec43e58fb53d4ef4ed463c17ba8a6be","name":"ETH 26 EMA Crossove","symbol":"ETHEMAAPY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11649/thumb/eth-26-day-exponential-moving-average-set-ctoken.png?1592324217"},{"chainId":1,"address":"0x765f0c16d1ddc279295c1a7c24b0883f62d33f75","name":"DaTa eXchange Token","symbol":"DTX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2920/thumb/dtx.png?1578973961"},{"chainId":1,"address":"0x07150e919b4de5fd6a63de1f9384828396f25fdc","name":"Base Protocol","symbol":"BASE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13265/thumb/200x200green.png?1607650121"},{"chainId":1,"address":"0x9c2dc0c3cc2badde84b0025cf4df1c5af288d835","name":"Coreto","symbol":"COR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12856/thumb/COR.png?1620210966"},{"chainId":1,"address":"0xa7925aa2a6e4575ab0c74d169f3bc3e03d4c319a","name":"Better Money","symbol":"BETTER","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/12838/thumb/BETTER_MONEY_MASK_ICON.png?1602899651"},{"chainId":1,"address":"0x2b591e99afe9f32eaa6214f7b7629768c40eeb39","name":"HEX","symbol":"HEX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10103/thumb/HEX-logo.png?1575942673"},{"chainId":1,"address":"0xaea46a60368a7bd060eec7df8cba43b7ef41ad85","name":"Fetch ai","symbol":"FET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5681/thumb/Fetch.jpg?1572098136"},{"chainId":1,"address":"0xd31533e8d0f3df62060e94b3f1318137bb6e3525","name":"sREN","symbol":"SREN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15731/thumb/sREN_final.JPG?1621670563"},{"chainId":1,"address":"0xed04915c23f00a313a544955524eb7dbd823143d","name":"Alchemy Pay","symbol":"ACH","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12390/thumb/ACH_%281%29.png?1599691266"},{"chainId":1,"address":"0x539e890f31f8e3fc63d5a2f5756a785c20f5c85d","name":"Golden Bridge Coin","symbol":"GBC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13855/thumb/Untitled-design-7.png?1612403188"},{"chainId":1,"address":"0x48a3d9510f7c2aa61a285ccb4eaa5ba072692468","name":"Football Inu","symbol":"FINU","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16523/thumb/football_inu.PNG?1624332778"},{"chainId":1,"address":"0xc980be019f2ac10a1c96f964b971a5f44551d318","name":"BitFarmings","symbol":"BFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13524/thumb/gA8yh7wZ_400x400.jpg?1609388994"},{"chainId":1,"address":"0xd417144312dbf50465b1c641d016962017ef6240","name":"Covalent","symbol":"CQT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14168/thumb/covalent-cqt.png?1624545218"},{"chainId":1,"address":"0xf5c0e24aca5217bcbae662871cae1a86873f02db","name":"Alligator Fractal","symbol":"GATOR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11653/thumb/alligator_fractal_set.png?1592325151"},{"chainId":1,"address":"0x20b4b41ddaecd180798bd4322ba971fa1a54e512","name":"DHD Coin","symbol":"DHD","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/14617/thumb/2_%283%29.png?1617256439"},{"chainId":1,"address":"0xe577e0b200d00ebdecbfc1cd3f7e8e04c70476be","name":"XEuro","symbol":"XEURO","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/9085/thumb/fDuXUMs5_400x400.png?1564085357"},{"chainId":1,"address":"0xa9248f8e40d4b9c3ca8ebd8e07e9bcb942c616d8","name":"ARKE","symbol":"ARKE","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/14017/thumb/15ba0074-67e7-4f57-8358-313805266bf1.png?1613708594"},{"chainId":1,"address":"0xa42f266684ac2ad6ecb00df95b1c76efbb6f136c","name":"Cash Tech","symbol":"CATE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14529/thumb/CG.jpg?1624471293"},{"chainId":1,"address":"0x85ca6710d0f1d511d130f6935edda88acbd921bd","name":"Pledgecamp","symbol":"PLG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5120/thumb/pledgecamop.png?1550204115"},{"chainId":1,"address":"0x4730fb1463a6f1f44aeb45f6c5c422427f37f4d0","name":"4thpillar technolog","symbol":"FOUR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3434/thumb/four-ticker-2021-256x256.png?1617702287"},{"chainId":1,"address":"0xe61fdaf474fac07063f2234fb9e60c1163cfa850","name":"Coin","symbol":"COIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2394/thumb/coin.png?1606626874"},{"chainId":1,"address":"0x31be30217989766215672e88ed449913e05bf0f5","name":"Groovy Finance","symbol":"GVY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13320/thumb/Groovy-finance-Logo-A.png?1607415508"},{"chainId":1,"address":"0x2e1e15c44ffe4df6a0cb7371cd00d5028e571d14","name":"Mettalex","symbol":"MTLX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12730/thumb/nrEqFTEW_400x400.jpg?1602063980"},{"chainId":1,"address":"0x9e976f211daea0d652912ab99b0dc21a7fd728e4","name":"MAP Protocol","symbol":"MAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10085/thumb/MAP_LOGO.png?1597227221"},{"chainId":1,"address":"0x89d3c0249307ae570a316030764d12f53bb191fd","name":"Xiglute Coin","symbol":"XGC","decimals":14,"logoURI":"https://assets.coingecko.com/coins/images/15240/thumb/256x256_%282%29.png?1620196016"},{"chainId":1,"address":"0x90d702f071d2af33032943137ad0ab4280705817","name":"YFFS Finance","symbol":"YFFS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12309/thumb/KijHtdcg_400x400.jpg?1599041092"},{"chainId":1,"address":"0xc40af1e4fecfa05ce6bab79dcd8b373d2e436c4e","name":"Hokkaidu Inu","symbol":"HOKK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14985/thumb/wnTVZtfc_400x400.jpg?1619251560"},{"chainId":1,"address":"0x9813037ee2218799597d83d4a5b6f3b6778218d9","name":"Bone ShibaSwap","symbol":"BONE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16916/thumb/bone_icon.png?1625625505"},{"chainId":1,"address":"0x3e780920601d61cedb860fe9c4a90c9ea6a35e78","name":"Boosted Finance","symbol":"BOOST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12329/thumb/boosted.jpg?1599105606"},{"chainId":1,"address":"0x6e1a19f235be7ed8e3369ef73b196c07257494de","name":"Wrapped Filecoin","symbol":"WFIL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13238/thumb/WFIL.png?1623827165"},{"chainId":1,"address":"0x73484a262730d1d422610729e828346f9b2ff480","name":"BRCP Token","symbol":"BRCP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14388/thumb/brcp-500x500-verde.png?1615855378"},{"chainId":1,"address":"0x0954906da0bf32d5479e25f46056d22f08464cab","name":"Index Cooperative","symbol":"INDEX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12729/thumb/Index_Coop.png?1622442711"},{"chainId":1,"address":"0xb6ee603933e024d8d53dde3faa0bf98fe2a3d6f1","name":"DeFiat","symbol":"DFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12303/thumb/defiat.jpg?1598985049"},{"chainId":1,"address":"0xd6caf5bd23cf057f5fccce295dcc50c01c198707","name":"Evanesco Network","symbol":"EVA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16722/thumb/evan.PNG?1624849154"},{"chainId":1,"address":"0xf70d160102cf7a22c1e432d6928a9d625db91170","name":"Kuverit","symbol":"KUV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8102/thumb/kzu5xCtG_400x400.jpg?1572471470"},{"chainId":1,"address":"0x723cbfc05e2cfcc71d3d89e770d32801a5eef5ab","name":"Bitcoin Pro","symbol":"BTCP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/3545/thumb/DSiD9ZhWsAE_8cS.png?1547038353"},{"chainId":1,"address":"0x7061ee0896ab2c1865078b6c91731f67a89ea6a4","name":"Nitrous Finance","symbol":"NOS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13994/thumb/nos_logo.png?1613541619"},{"chainId":1,"address":"0x6bc1f3a1ae56231dbb64d3e82e070857eae86045","name":"Xensor","symbol":"XSR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9224/thumb/Xensor_Logo_%28White__200x200px%29.png?1593570861"},{"chainId":1,"address":"0xd53998c536fc8b59b38aa0b49dbd8170d5ebf4c2","name":"PUPS Vault NFTX ","symbol":"PUPS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17072/thumb/Pups.png?1626152049"},{"chainId":1,"address":"0x7a545ed3863221a974f327199ac22f7f12535f11","name":"Baguette Token","symbol":"BGTT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12456/thumb/baguette_logo.png?1599945036"},{"chainId":1,"address":"0xaf80e6612d9c2e883122e7f2292ee6c34176ad4f","name":"CoinJanitor","symbol":"JAN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3186/thumb/coinjanitor.jpg?1583132603"},{"chainId":1,"address":"0xf4eebdd0704021ef2a6bbe993fdf93030cd784b4","name":"iEOS","symbol":"IEOS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11627/thumb/iEOS.png?1616151361"},{"chainId":1,"address":"0xb9e6bdcba653b5f768dd2e2faf6288df9054e554","name":"Dirham","symbol":"DAH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15920/thumb/coinsilver1.610c07e0.png?1622429910"},{"chainId":1,"address":"0x6ab4a7d75b0a42b6bc83e852dab9e121f9c610aa","name":"Elitium","symbol":"EUM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7874/thumb/elitium-coin.png?1551864695"},{"chainId":1,"address":"0xe2f2a5c287993345a840db3b0845fbc70f5935a5","name":"mStable USD","symbol":"MUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11576/thumb/mStable_USD.png?1595591803"},{"chainId":1,"address":"0x0b4680e848f842b86e4df38d9fa0d9f9419f37ec","name":"Beshare Token","symbol":"BST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16870/thumb/BST_symbol_transparent_background_200.png?1625476744"},{"chainId":1,"address":"0x7510d6fac98a6eca2db7c9357619715a7f5049d4","name":"Holistic BTC Set","symbol":"TCAPBTCUSDC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11776/thumb/holistic_btc_set.png?1593931993"},{"chainId":1,"address":"0x7b69d465c0f9fb22affae56aa86149973e9b0966","name":"Protocol Finance","symbol":"PFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13810/thumb/17RgoN2.png?1612047312"},{"chainId":1,"address":"0x3242aebcdcf8de491004b1c98e6595e9827f6c17","name":"Global Utility Smar","symbol":"GUSDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13479/thumb/gusdt.png?1608948333"},{"chainId":1,"address":"0xe7ab45162f5979f09b0bda1cc7dfc97c270ea3d5","name":"Dobermann","symbol":"DOBE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16002/thumb/doberman.PNG?1622593349"},{"chainId":1,"address":"0x469a8ea7683c27d31cd9b0de769151d8a8b66c5a","name":"SpacePenguin","symbol":"PNGN","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15435/thumb/PNGN_LOGO_WHITE_BG.png?1620800225"},{"chainId":1,"address":"0x7d8daff6d70cead12c6f077048552cf89130a2b1","name":"ARCS","symbol":"ARX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10068/thumb/arcs.png?1575426741"},{"chainId":1,"address":"0x6839ac5ea8082688b706c773d5d2afd7d503fdd4","name":"Next Level","symbol":"NXL","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/15178/thumb/NXL-token-logo-200.png?1620026497"},{"chainId":1,"address":"0xc36824905dff2eaaee7ecc09fcc63abc0af5abc5","name":"Basis Bond","symbol":"BAB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13961/thumb/bab_1.png?1613358492"},{"chainId":1,"address":"0x8b3870df408ff4d7c3a26df852d41034eda11d81","name":"IOI Token","symbol":"IOI","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/15952/thumb/IOI-logo.png?1625128187"},{"chainId":1,"address":"0x5f435cd858f71e42a3db4282231d1ed25ba07aed","name":"Star Shib","symbol":"STARSB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15419/thumb/100-1.png?1620775159"},{"chainId":1,"address":"0xd20bcbd56d9d551cac10a6bc2a83635bfb72f3f4","name":"FUNDChains","symbol":"FUND","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/6079/thumb/fundchains-logo.png?1547042057"},{"chainId":1,"address":"0x54ad74edeab48e09ccc43ee324f2603071dad72b","name":"DTOP Token","symbol":"DTOP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11146/thumb/Untitled.png?1588928222"},{"chainId":1,"address":"0x728f30fa2f100742c7949d1961804fa8e0b1387d","name":"GamerCoin","symbol":"GHX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14714/thumb/ghx_icon.png?1618819440"},{"chainId":1,"address":"0xe3fedaecd47aa8eab6b23227b0ee56f092c967a9","name":"Primas","symbol":"PST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/917/thumb/primas.png?1548331951"},{"chainId":1,"address":"0x5dc60c4d5e75d22588fa17ffeb90a63e535efce0","name":"dKargo","symbol":"DKA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11875/thumb/bVD0g0dlmrEOPIkt943KZIBZ086eCshyY0jIQFti4zxYdOlFltU8tKa6uJlcA14HvNjX4bc7dxdMvlpoW5NFMND85oG4aiiCbFRhI6eowDfKEBY3BoSVY0IrBbA9SFGIxh_IYrkNC5uNdG-roZ0_TlGO3098now6Tbzga0p4IDqVk6lnaX3TuRC7pgnAYWZM15RD-uEIHr3O_3OoIIWP-.jpg?1595563347"},{"chainId":1,"address":"0xfab5a05c933f1a2463e334e011992e897d56ef0a","name":"DeFi of Thrones","symbol":"DOTX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12265/thumb/logo200x200.jpg?1598599911"},{"chainId":1,"address":"0x8d5db0c1f0681071cb38a382ae6704588d9da587","name":"Prophet","symbol":"PROPHET","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13209/thumb/prophet_finance.png?1606202225"},{"chainId":1,"address":"0xade7b5f4a421d81ddad8ce86f77a0efe8921e9cc","name":"Diligence","symbol":"IRA","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8577/thumb/IRA_DILIGENCE_SEMI-FINAL_3.png?1566456622"},{"chainId":1,"address":"0x86696431d6aca9bae5ce6536ecf5d437f2e6dba2","name":"SoftChain","symbol":"SCC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6613/thumb/FgUyfr6K_400x400.jpg?1547042814"},{"chainId":1,"address":"0xffcf5f9feb7e14833331b6687755d1622399316c","name":"ICICB Coin","symbol":"ICICB","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/15001/thumb/ICICB-LOGO-200-X200.png?1619402531"},{"chainId":1,"address":"0x1baffbc23f2246040cce12f7a140c38c5dc73e46","name":"Passive Income Bot","symbol":"PIB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14755/thumb/R4WAZBgP_400x400.png?1618192898"},{"chainId":1,"address":"0xba8e5a4c64c1be42230910f7b39a6388f3d4297c","name":"Give Global","symbol":"GIVE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16070/thumb/give.PNG?1622767166"},{"chainId":1,"address":"0x0f4ca92660efad97a9a70cb0fe969c755439772c","name":"Leverj","symbol":"LEV","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/2548/thumb/leverj.png?1547975721"},{"chainId":1,"address":"0xf16e81dce15b08f326220742020379b855b87df9","name":"Popsicle Finance","symbol":"ICE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14586/thumb/ice.png?1617188825"},{"chainId":1,"address":"0x78a2a1029e3168b49d3a276c787050ff5106dcf2","name":"EZOOW","symbol":"EZW","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6720/thumb/ezoow.png?1541392542"},{"chainId":1,"address":"0x0258f474786ddfd37abce6df6bbb1dd5dfc4434a","name":"Orion Protocol","symbol":"ORN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11841/thumb/orion_logo.png?1594943318"},{"chainId":1,"address":"0xedeec5691f23e4914cf0183a4196bbeb30d027a0","name":"Wrapped Statera","symbol":"WSTA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13599/thumb/wsta_logo.png?1610011862"},{"chainId":1,"address":"0x7a8ca2f815a260660158a38c34ca321a3605ecfe","name":"BIZZCOIN","symbol":"BIZZ","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10979/thumb/bizzcoin.PNG?1586766076"},{"chainId":1,"address":"0xbf70a33a13fbe8d0106df321da0cf654d2e9ab50","name":"ETH BTC RSI Ratio T","symbol":"ETHBTCRSI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10605/thumb/ethbtc-rsi-ratio-set.png?1580970413"},{"chainId":1,"address":"0x6e98e5401adcb0d76f4debfc3d794b3031f48790","name":"Aurix","symbol":"AUR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14372/thumb/gold-brown-2.png?1615769158"},{"chainId":1,"address":"0xd794dd1cada4cf79c9eebaab8327a1b0507ef7d4","name":"Hyve","symbol":"HYVE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13072/thumb/MKHXNbf.png?1604899269"},{"chainId":1,"address":"0x5f474906637bdcda05f29c74653f6962bb0f8eda","name":"DeFinity","symbol":"DEFX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15875/thumb/definity-listing-logo.png?1622414896"},{"chainId":1,"address":"0xc6bf2a2a43ca360bb0ec6770f57f77cdde64bb3f","name":"UnityDAO","symbol":"UTY","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12553/thumb/UTY_LOGO.png?1600734985"},{"chainId":1,"address":"0x2509ee05b8df07ec75046e24bbf1cfcdb8b2a183","name":"Amaten","symbol":"AMA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11010/thumb/0_%283%29.png?1587104344"},{"chainId":1,"address":"0x1296a923cd4f39116e0297d921fe25fe228552c6","name":"Stoner Doge Finance","symbol":"STOGE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14896/thumb/Stoge-logo.png?1618916387"},{"chainId":1,"address":"0x84cffa78b2fbbeec8c37391d2b12a04d2030845e","name":"Digital Fitness","symbol":"DEFIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14699/thumb/Defit.png?1623738365"},{"chainId":1,"address":"0xb5e88b229b18e748e3aa16a1c2bfefdfc8a5560d","name":"Global DeFi","symbol":"GDEFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15670/thumb/Global-Defi-logo-200x200-1.png?1621496499"},{"chainId":1,"address":"0x7b123f53421b1bf8533339bfbdc7c98aa94163db","name":"dfohub","symbol":"BUIDL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11131/thumb/buidllogo.png?1599577041"},{"chainId":1,"address":"0x80c8c3dcfb854f9542567c8dac3f44d709ebc1de","name":"Spaceswap MILK2","symbol":"MILK2","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12771/thumb/PVXczB4M.png?1602482463"},{"chainId":1,"address":"0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9","name":"Aave","symbol":"AAVE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12645/thumb/AAVE.png?1601374110"},{"chainId":1,"address":"0xcbfef8fdd706cde6f208460f2bf39aa9c785f05d","name":"Kine Protocol","symbol":"KINE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14339/thumb/kine.jpg?1615474456"},{"chainId":1,"address":"0x696acc2de564b48682d71d0847b3632f87c9a402","name":"AurusGOLD","symbol":"AWG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11594/thumb/AurusGOLD_%28AWG%29_Icon_200x200.png?1591664999"},{"chainId":1,"address":"0xf34960d9d60be18cc1d5afc1a6f012a723a28811","name":"KuCoin Token","symbol":"KCS","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/1047/thumb/sa9z79.png?1610678720"},{"chainId":1,"address":"0x3e1d5a855ad9d948373ae68e4fe1f094612b1322","name":"HyperQuant","symbol":"HQT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4410/thumb/hqt.png?1547039746"},{"chainId":1,"address":"0x592ef68c18f05a22c5890263dea5d952dd140d2a","name":"3X Long Exchange To","symbol":"EXCHBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10436/thumb/683JEXMN_400x400.png?1579276837"},{"chainId":1,"address":"0xca694eb79ef355ea0999485d211e68f39ae98493","name":"Traceability Chain","symbol":"TAC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5813/thumb/traceability.png?1547041683"},{"chainId":1,"address":"0x53893a4a67d4392ebebdf1a683e98e1c577ab6c1","name":"MicroBloodScience","symbol":"MBS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8755/thumb/I8yPI6EUpvrrVPWjBISufHV_of43y5S97JaX_AQ_ZjjrDE6r9XqanEp5m2CrrgOl911Cn87Q36t-E3Cyt9PoZgnf8-ccwiQO8xqnP6GNEB1TtgYL9dd_84j8zOo5sHuqBjWDVYGT03gV_QgfaWcVckH-M7hZ8XYAqBdFqorXf-rj7QNetdXxRxc4DRSSTgT8Ju7Y-5gn8hDncH-cD.jpg?1560842420"},{"chainId":1,"address":"0x72108a8cc3254813c6be2f1b77be53e185abfdd9","name":"Era Swap Token","symbol":"ES","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6031/thumb/era_swap.PNG?1570920926"},{"chainId":1,"address":"0xdf7ff54aacacbff42dfe29dd6144a69b629f8c9e","name":"Aave ZRX","symbol":"AZRX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14264/thumb/aZRX.9be555a9.png?1615528286"},{"chainId":1,"address":"0xa93d5cfaa41193b13321c035b4bdd2b534172762","name":"Dream Swap","symbol":"DREAM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13033/thumb/dream_32.png?1604503082"},{"chainId":1,"address":"0xb13de094cc5cee6c4cc0a3737bf0290166d9ca5d","name":"GoWithMi","symbol":"GMAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7162/thumb/qXNbxVny_400x400.png?1564433322"},{"chainId":1,"address":"0x350758e4a1256561fd0ee142dc7e0545f561fadc","name":"B2U Coin","symbol":"B2U","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13713/thumb/b2ucoin_logo_200.png?1611103785"},{"chainId":1,"address":"0x05ec93c0365baaeabf7aeffb0972ea7ecdd39cf1","name":"Aave BAT","symbol":"ABAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14246/thumb/aBAT.1fe436f7_-_Copy.png?1615528663"},{"chainId":1,"address":"0x6fce4a401b6b80ace52baaefe4421bd188e76f6f","name":"Aave MANA v1","symbol":"AMANA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11730/thumb/aMANA.png?1593084474"},{"chainId":1,"address":"0x3ef36d53a168c44ed2ec7a98129ca0308bc1ae45","name":"DigiDinar StableTok","symbol":"DDRST","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12835/thumb/ddrst.png?1602883422"},{"chainId":1,"address":"0x1cceed434a7a64d1d8f9bb719fe0d29cbba9f120","name":"Arix","symbol":"ARIX","decimals":3,"logoURI":"https://assets.coingecko.com/coins/images/13485/thumb/logo_-_2020-12-27T231657.316.png?1609082279"},{"chainId":1,"address":"0xd0658324074d6249a51876438916f7c423075451","name":"Yearn Land","symbol":"YLAND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12673/thumb/SXMzvraK_400x400.jpg?1601522909"},{"chainId":1,"address":"0x47935edfb3cdd358c50f6c0add1cc24662e30f5f","name":"SUP8EME","symbol":"SUP8EME","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/13174/thumb/sup8eme_logo.png?1605864500"},{"chainId":1,"address":"0x2029017f38128bfefaa6c7b9cdd1b680ce8e5c03","name":"Candy Protocol","symbol":"CAD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14071/thumb/YMXZkwwS_400x400.png?1614149796"},{"chainId":1,"address":"0xc617d51e3a1f621da8ae67b2f652d6ac02eb8d95","name":"Hoard Token","symbol":"HRD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8386/thumb/Hoard_Token.png?1560841641"},{"chainId":1,"address":"0x87f56ee356b434187105b40f96b230f5283c0ab4","name":"Pitch","symbol":"PITCH","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/2855/thumb/pitch_token.jpg?1547037026"},{"chainId":1,"address":"0x7e9e431a0b8c4d532c745b1043c7fa29a48d4fba","name":"eosDAC","symbol":"EOSDAC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3878/thumb/2644.png?1547038931"},{"chainId":1,"address":"0x19810559df63f19cfe88923313250550edadb743","name":"Toast finance","symbol":"HOUSE","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/12287/thumb/icon_%284%29.png?1598825274"},{"chainId":1,"address":"0xa64bd6c70cb9051f6a9ba1f163fdc07e0dfb5f84","name":"Aave LINK v1","symbol":"ALINK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11729/thumb/aLINK.png?1593084323"},{"chainId":1,"address":"0x3a3a65aab0dd2a17e3f1947ba16138cd37d08c04","name":"Aave ETH v1","symbol":"AETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11619/thumb/aETH_2x.png?1591976597"},{"chainId":1,"address":"0x9b9fb226e98c4e90db2830c9aefa9cfcbe3b000a","name":"KITTY Vault NFTX ","symbol":"KITTY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17037/thumb/KITTY.png?1626145386"},{"chainId":1,"address":"0x83ff572a1757b9e4508cb08f13a79ed162c756c4","name":"Zrocor","symbol":"ZCOR","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/13612/thumb/coin_%282%29.png?1610285699"},{"chainId":1,"address":"0xc175e77b04f2341517334ea3ed0b198a01a97383","name":"3X Long TRX Token","symbol":"TRXBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10266/thumb/683JEXMN_400x400_%281%29.png?1576834617"},{"chainId":1,"address":"0x46d473a0b3eeec9f55fade641bc576d5bc0b2246","name":"SurfExUtilityToken","symbol":"SURF","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10783/thumb/200x200-logo-blu-grey-bkg-4-e1583512409629.png?1583539501"},{"chainId":1,"address":"0x331fa6c97c64e47475164b9fc8143b533c5ef529","name":"EXMR FDN","symbol":"EXMR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3285/thumb/exmr_transparent.png?1604655926"},{"chainId":1,"address":"0x60c24407d01782c2175d32fe7c8921ed732371d1","name":"LemoChain","symbol":"LEMO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3108/thumb/lemochain.png?1547975597"},{"chainId":1,"address":"0x35a735b7d1d811887966656855f870c05fd0a86d","name":"Thorncoin","symbol":"THRN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6300/thumb/_VaSXQpe_400x400.jpg?1547042348"},{"chainId":1,"address":"0x30365ed4ca8173013ad948b9842f34ac71d01f7c","name":"Dirham Crypto","symbol":"DHS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15974/thumb/dirham_200.png?1622524968"},{"chainId":1,"address":"0x3684b581db1f94b721ee0022624329feb16ab653","name":"GUNTHY","symbol":"GUNTHY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7869/thumb/GUNTHY_128.png?1562130711"},{"chainId":1,"address":"0x4afb0aac9b862946837b2444566b8a914d6d0d97","name":"Simian Finance","symbol":"SIFI","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/14417/thumb/simian.png?1616735055"},{"chainId":1,"address":"0x7d4b8cce0591c9044a22ee543533b72e976e36c3","name":"Change","symbol":"CAG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1021/thumb/200x200.png?1610766224"},{"chainId":1,"address":"0x6be61833fc4381990e82d7d4a9f4c9b3f67ea941","name":"Hotbit Token","symbol":"HTB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5990/thumb/hotbit-token.png?1547041932"},{"chainId":1,"address":"0xa69f7a10df90c4d6710588bc18ad9bf08081f545","name":"Cexlt","symbol":"CLT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13171/thumb/clt_logo.png?1605855281"},{"chainId":1,"address":"0x74fd51a98a4a1ecbef8cc43be801cce630e260bd","name":"SiaCashCoin","symbol":"SCC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5312/thumb/siacashcoin-logo.png?1547040865"},{"chainId":1,"address":"0x3c9d6c1c73b31c837832c72e04d3152f051fc1a9","name":"BoringDAO OLD ","symbol":"BOR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12917/thumb/bor_logo.png?1603607502"},{"chainId":1,"address":"0xbbc455cb4f1b9e4bfc4b73970d360c8f032efee6","name":"sLINK","symbol":"SLINK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10456/thumb/sLINK.png?1616150356"},{"chainId":1,"address":"0xbff0e42eec4223fbd12260f47f3348d29876db42","name":"Xtake","symbol":"XTK","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/12204/thumb/xtake.jpg?1598080058"},{"chainId":1,"address":"0xc36c65693ea9e207ad35d4ee2fb6c5f6f43bdec8","name":"Eauric","symbol":"EAURIC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13013/thumb/logo_%2820%29.png?1604382710"},{"chainId":1,"address":"0xbf8fb919a8bbf28e590852aef2d284494ebc0657","name":"ABCC Token","symbol":"AT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5132/thumb/abcc-token.png?1547040523"},{"chainId":1,"address":"0x72de803b67b6ab05b61efab2efdcd414d16ebf6d","name":"LedgerScore","symbol":"LED","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16144/thumb/photo-2021-06-05-07-45-06.jpg?1623119314"},{"chainId":1,"address":"0x38c6a68304cdefb9bec48bbfaaba5c5b47818bb2","name":"High Performance Bl","symbol":"HPB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2363/thumb/HPB_Logo_2020_-_Colour.jpg?1596097580"},{"chainId":1,"address":"0x9d0b65a76274645b29e4cc41b8f23081fa09f4a3","name":"iMe Lab","symbol":"LIME","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16243/thumb/lim_200.2.png?1623376205"},{"chainId":1,"address":"0x03066da434e5264ef0b32f787923f974a5726fdc","name":"Basis Coin Share","symbol":"BCS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13530/thumb/Basiscoin_Share.png?1609406623"},{"chainId":1,"address":"0xd8e2b153e94daec5fe657a49ff59bb68fa67f126","name":"FRED Energy ERC 20","symbol":"FREDX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14628/thumb/AcD80M3u_400x400.jpg?1617348984"},{"chainId":1,"address":"0xcadc0acd4b445166f12d2c07eac6e2544fbe2eef","name":"CAD Coin","symbol":"CADC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14149/thumb/cadc_2.png?1614666625"},{"chainId":1,"address":"0xdd1ad9a21ce722c151a836373babe42c868ce9a4","name":"Universal Basic Inc","symbol":"UBI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15269/thumb/ubi.png?1620287853"},{"chainId":1,"address":"0x722f2f3eac7e9597c73a593f7cf3de33fbfc3308","name":"CoinUs","symbol":"CNUS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7205/thumb/coinus.png?1547043774"},{"chainId":1,"address":"0x61fd1c62551850d0c04c76fce614cbced0094498","name":"IDK","symbol":"IDK","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9301/thumb/idk-logo.png?1565861759"},{"chainId":1,"address":"0x6a8c66cab4f766e5e30b4e9445582094303cc322","name":"Farm Defi","symbol":"PFARM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12957/thumb/PFARM_logo.png?1603837555"},{"chainId":1,"address":"0x8207c1ffc5b6804f6024322ccf34f29c3541ae26","name":"Origin Protocol","symbol":"OGN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3296/thumb/op.jpg?1547037878"},{"chainId":1,"address":"0x852e5427c86a3b46dd25e5fe027bb15f53c4bcb8","name":"NiiFi","symbol":"NIIFI","decimals":15,"logoURI":"https://assets.coingecko.com/coins/images/16033/thumb/niifi.PNG?1622674467"},{"chainId":1,"address":"0x101cc05f4a51c0319f570d5e146a8c625198e636","name":"Aave TUSD","symbol":"ATUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14317/thumb/aTUSD.08592b49.png?1615528207"},{"chainId":1,"address":"0xe478d4f4a87d4d641af97ca0b5cc3db61e266357","name":"LUCKY","symbol":"LUCKY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11127/thumb/title-bg.png?1588737239"},{"chainId":1,"address":"0xf650c3d88d12db855b8bf7d11be6c55a4e07dcc9","name":"cUSDT","symbol":"CUSDT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11621/thumb/cUSDT.png?1592113270"},{"chainId":1,"address":"0x41ab75435668919bb507f871dd01e9762c2d173a","name":"XChain Token","symbol":"NXCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7473/thumb/rSDrnQ3f_400x400.jpg?1547690137"},{"chainId":1,"address":"0xf8ad7dfe656188a23e89da09506adf7ad9290d5d","name":"Blocery","symbol":"BLY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12095/thumb/Blocery_logo_200x200_.png?1597046107"},{"chainId":1,"address":"0xa8c16fbecf1ae1bc1dcc87e6892f18f777e92c69","name":"Androttweiler Token","symbol":"ANDROTTWEILER","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16881/thumb/Laastkings-1.png?1626267885"},{"chainId":1,"address":"0x14ca41eecd7d81d5d13098586c0d2314eba285be","name":"JUST NETWORK","symbol":"JUS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10796/thumb/OPQ-hZVi_400x400.png?1583722516"},{"chainId":1,"address":"0x6c103d85c15107dce19f5a75fc746227e610aabd","name":"Universal Euro","symbol":"UPEUR","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/11172/thumb/1_hxXrtjdwUeSTn67wA8nHQw.png?1589440779"},{"chainId":1,"address":"0x4edd66235349e353eb8cb8e40596599644bfe91c","name":"Vanywhere","symbol":"VANY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2701/thumb/vany.png?1547036908"},{"chainId":1,"address":"0x967da4048cd07ab37855c090aaf366e4ce1b9f48","name":"Ocean Protocol","symbol":"OCEAN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3687/thumb/ocean-protocol-logo.jpg?1547038686"},{"chainId":1,"address":"0x0000000000004946c0e9f43f4dee607b0ef1fa1c","name":"Chi Gastoken","symbol":"CHI","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/11583/thumb/chi.png?1591331659"},{"chainId":1,"address":"0x15e4132dcd932e8990e794d1300011a472819cbd","name":"GRPL Finance","symbol":"GRPL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13586/thumb/GRPL.png?1609927724"},{"chainId":1,"address":"0xcb67be5c54eab9462967ee3c03c35bfffeb801cd","name":"Galactic Blue Index","symbol":"GBI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16555/thumb/uQHJPKi.png?1624954179"},{"chainId":1,"address":"0x1eddee3fa21591a9637f88dab9615c33ee636b9d","name":"WeBlock","symbol":"WON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13226/thumb/won.png?1606371371"},{"chainId":1,"address":"0xada62f7ccd6af6cacff04accbc4f56f3d4ffd4ef","name":"PlayFuel","symbol":"PLF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10313/thumb/BNXcW4kq_400x400.jpg?1577833532"},{"chainId":1,"address":"0xc4e15973e6ff2a35cc804c2cf9d2a1b817a8b40f","name":"Interest Bearing Bi","symbol":"IBBTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15500/thumb/ibbtc.png?1621077589"},{"chainId":1,"address":"0x186a33d4dbcd700086a26188dcb74e69be463665","name":"7ELEVEN","symbol":"7E","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8324/thumb/icon4.png?1557529360"},{"chainId":1,"address":"0xcb39c3502415152b2ec90ff07ee18cc94f681a72","name":"Storeum","symbol":"STO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8942/thumb/stoterum.png?1563423648"},{"chainId":1,"address":"0x2f5c3dd519e8a502c48c9fc104eee64fdff05f03","name":"META Vault NFTX ","symbol":"META","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17065/thumb/META.png?1626150949"},{"chainId":1,"address":"0xd780ae2bf04cd96e577d3d014762f831d97129d0","name":"Envion","symbol":"EVN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1547/thumb/envion.jpg?1547035704"},{"chainId":1,"address":"0xea1f346faf023f974eb5adaf088bbcdf02d761f4","name":"Blocktix","symbol":"TIX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1233/thumb/blocktix.png?1547351347"},{"chainId":1,"address":"0xe532a2a37b0707b4306b21b412d2e8c22f9824ec","name":"EUP Chain","symbol":"EUP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10264/thumb/euchain.PNG?1576813636"},{"chainId":1,"address":"0x42b4df7e402a71eae743c6c5410ce3bbb63aef22","name":"HDPUNK Vault NFTX ","symbol":"HDPUNK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17069/thumb/HDPunks.png?1626151243"},{"chainId":1,"address":"0x21a870c7fce1bce5d88bdf845ac332c76204a9a0","name":"Refraction","symbol":"REFRACTION","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14794/thumb/refraction.png?1618474332"},{"chainId":1,"address":"0x2a69655c22eda32ff48d315bb26ed45f150700b4","name":"Wrapped Tezos","symbol":"WXTZ","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/14763/thumb/wXTZ-token-FullColor.png?1618281765"},{"chainId":1,"address":"0x712db54daa836b53ef1ecbb9c6ba3b9efb073f40","name":"Aave ENJ v1","symbol":"AENJ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12484/thumb/aENJ.png?1600189443"},{"chainId":1,"address":"0xf12ec0d3dab64ddefbdc96474bde25af3fe1b327","name":"Stacy","symbol":"STACY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12986/thumb/Stacy.png?1604384468"},{"chainId":1,"address":"0x2d5bed63b0fe325ed3b865ae2cdaa3649eb25461","name":"Teslafan","symbol":"TESLF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15840/thumb/teslafan.PNG?1622082511"},{"chainId":1,"address":"0x5592c5aa89492ea918d55b804e177b5ca7dccd5a","name":"Wrapped xBTC","symbol":"WXBTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15688/thumb/XBTC-Logo-6.png?1621564837"},{"chainId":1,"address":"0xaf4dce16da2877f8c9e00544c93b62ac40631f16","name":"Monetha","symbol":"MTH","decimals":5,"logoURI":"https://assets.coingecko.com/coins/images/902/thumb/mth_logo_coingecko.png?1622448039"},{"chainId":1,"address":"0xdbdd6f355a37b94e6c7d32fef548e98a280b8df5","name":"UniWhales","symbol":"UWL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13166/thumb/uniwhale.png?1611967645"},{"chainId":1,"address":"0x2aeccb42482cc64e087b6d2e5da39f5a7a7001f8","name":"Ruler Protocol","symbol":"RULER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14183/thumb/ruler_token.png?1614821796"},{"chainId":1,"address":"0x39c6b3e42d6a679d7d776778fe880bc9487c2eda","name":"Aave KNC","symbol":"AKNC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14250/thumb/aKNC.42bcd2e3.png?1615528613"},{"chainId":1,"address":"0xe3278df3eb2085ba9b6899812a99a10f9ca5e0df","name":"Tourist Token","symbol":"TOTO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5271/thumb/tourist-token.png?1548759070"},{"chainId":1,"address":"0x6c3f90f043a72fa612cbac8115ee7e52bde6e490","name":"LP 3pool Curve","symbol":"3CRV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12972/thumb/3pool_128.png?1603948039"},{"chainId":1,"address":"0x5d3a4f62124498092ce665f865e0b38ff6f5fbea","name":"Ideaology","symbol":"IDEA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13938/thumb/idea_logo.png?1613022658"},{"chainId":1,"address":"0xb9ffe0b8ee2d1af94202ffed366520300748a4d8","name":"ETH BTC EMA Ratio T","symbol":"ETHBTCEMACO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10607/thumb/ethbtc-ema-ratio-set.png?1580970846"},{"chainId":1,"address":"0xa57392548087453dec6106e670bbfb849276b358","name":"GemVault Coin","symbol":"GVC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5243/thumb/gemvault-coin-logo.png?1547040729"},{"chainId":1,"address":"0xd2946be786f35c3cc402c29b323647abda799071","name":"VikkyToken","symbol":"VIKKY","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5278/thumb/vikkytoken.png?1548760050"},{"chainId":1,"address":"0xae6eb6f6c0a1694968b9f78a4316319c27b0964b","name":"PETROLEUM","symbol":"OIL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11231/thumb/OIL.png?1593273828"},{"chainId":1,"address":"0x244c5276ea5bb927575417156038d7381b44ab2c","name":"Bridge Finance","symbol":"BFR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13337/thumb/bridge_finance_logo.png?1607574570"},{"chainId":1,"address":"0x87de305311d5788e8da38d19bb427645b09cb4e5","name":"Verox","symbol":"VRX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13669/thumb/IMG-20210115-000024.png?1610675319"},{"chainId":1,"address":"0x33d20575f20c6a1881f8ab08e69f6fbaffaeedf2","name":"BlueWizard","symbol":"WIZ","decimals":12,"logoURI":"https://assets.coingecko.com/coins/images/15261/thumb/BW.jpg?1620270880"},{"chainId":1,"address":"0x9af839687f6c94542ac5ece2e317daae355493a1","name":"Hydro Protocol","symbol":"HOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2570/thumb/Hydro-Protocol.png?1558069424"},{"chainId":1,"address":"0x9214ec02cb71cba0ada6896b8da260736a67ab10","name":"Real Estate Asset L","symbol":"REAL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/993/thumb/real.png?1548607834"},{"chainId":1,"address":"0x89bd2e7e388fab44ae88bef4e1ad12b4f1e0911c","name":"Peanut","symbol":"NUX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13958/thumb/2sAMZXpO_400x400.jpg?1613353972"},{"chainId":1,"address":"0x7b2df125567815ac9b57da04b620f50bc93b320c","name":"Archetypal Network","symbol":"ACTP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5946/thumb/logo_%284%29.png?1547041885"},{"chainId":1,"address":"0xcae72a7a0fd9046cf6b165ca54c9e3a3872109e0","name":"AnRKey X","symbol":"ANRX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13415/thumb/anrkey.jpg?1608311301"},{"chainId":1,"address":"0x1de5e000c41c8d35b9f1f4985c23988f05831057","name":"BonFi","symbol":"BNF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12862/thumb/bonfi_logo.png?1603114422"},{"chainId":1,"address":"0xbf4a9a37ecfc21825011285222c36ab35de51f14","name":"Nyan V2","symbol":"NYAN-2","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13093/thumb/v2-logo.png?1605067493"},{"chainId":1,"address":"0xb97048628db6b661d4c2aa833e95dbe1a905b280","name":"TenX","symbol":"PAY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/775/thumb/TenX-Icon-CircleBlack.png?1553766360"},{"chainId":1,"address":"0x706cb9e741cbfee00ad5b3f5acc8bd44d1644a74","name":"YFOX Finance","symbol":"YFOX","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/12702/thumb/Yfox.png?1601865990"},{"chainId":1,"address":"0x91f529e972d6cf43d36abfa91c1118122ff7f16c","name":"Sapchain","symbol":"SAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9109/thumb/sap.PNG?1564433894"},{"chainId":1,"address":"0x5479d565e549f3ecdbde4ab836d02d86e0d6a8c7","name":"Lendefi","symbol":"LDFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13764/thumb/icons-08.png?1617767962"},{"chainId":1,"address":"0xeed9e4f2450035d6426276a8aa2084966ee3b1bb","name":"Steaks Finance","symbol":"STEAK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12672/thumb/MtZuJ_Gq6mqy4BaGacnKNMKmviA1xeDWg2wUiPMqZ-1MzfSiTiAbEzfclWWsU4FF3QxYJcrs5ia_DSWAvdwNYbROJEkm-UK9mZRBPK_z61JciH4XhqMEDpYParjxnkEDqIoobaGaW9bOzPPN_YYHYcv0A1LxjnzdPZF47ZigVuAoOa46YZNFJ_IkM-e-Cuf_-XCpbS2EtbMYvCEhbSuzrI.jpg?1601518956"},{"chainId":1,"address":"0x30bcd71b8d21fe830e493b30e90befba29de9114","name":"Penguin Party Fish","symbol":"FISH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14359/thumb/Screen-Shot-2021-03-10-at-1-05-40-AM.png?1615629402"},{"chainId":1,"address":"0xe3818504c1b32bf1557b16c238b2e01fd3149c17","name":"Pillar","symbol":"PLR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/809/thumb/v2logo-1.png?1624906282"},{"chainId":1,"address":"0x5e6ffe7b174a50c81ff3f3c54c04fd3c11e20830","name":"DragonVein","symbol":"DVC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8263/thumb/LrDC1OmYiqq05_-E3PFLO6oJou6HOvVMFpjEqbYdcvaIPgQp7mF52lpj_rCmQW1FhAoBg5E2Z9o16L3Z7n8SQrMIp1YZNEGHRzc3P0P3jOZnyKvHNuTXQx9q13_kxXG1oMzaN3HfWdUnTMAfKRwghCa7BX67W9pSV-AJkcQ4-5Qy_qlAN28UCUgVnM0k6ZXlNWZo7Vi00CD7657qw.jpg?1557125797"},{"chainId":1,"address":"0x9b20dabcec77f6289113e61893f7beefaeb1990a","name":"FairGame","symbol":"FAIR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2456/thumb/fairgame.png?1547036592"},{"chainId":1,"address":"0x32163c2d2d313c73279e87398e7f84bb9f537e9d","name":"etor","symbol":"ETOR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7897/thumb/O0gpmBh.jpg?1551660695"},{"chainId":1,"address":"0x336f646f87d9f6bc6ed42dd46e8b3fd9dbd15c22","name":"Crystal Clear","symbol":"CCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/995/thumb/crystal-clear.png?1547034897"},{"chainId":1,"address":"0xd3e8695d2bef061eab38b5ef526c0f714108119c","name":"YFIVE FINANCE","symbol":"YFIVE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12292/thumb/0gW17G6E_400x400.jpg?1598886392"},{"chainId":1,"address":"0x877c7deb5eb1fc5faad30c71e3a6e39dc8b1519f","name":"HeartBout","symbol":"HB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2037/thumb/hbc.png?1547036326"},{"chainId":1,"address":"0x024b6e7dc26f4d5579bdd936f8d7bc31f2339999","name":"Mithril Share","symbol":"MIS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13516/thumb/MIS.png?1609306996"},{"chainId":1,"address":"0x98e0438d3ee1404fea48e38e92853bb08cfa68bd","name":"TVT","symbol":"TVT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8388/thumb/g8hXw4QX_400x400.jpg?1557973343"},{"chainId":1,"address":"0x3506424f91fd33084466f402d5d97f05f8e3b4af","name":"Chiliz","symbol":"CHZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8834/thumb/Chiliz.png?1561970540"},{"chainId":1,"address":"0x9b5c2be869a19e84bdbcb1386dad83a2ec8dae82","name":"Stream Protocol","symbol":"STPL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13277/thumb/STPL.png?1606897574"},{"chainId":1,"address":"0x165440036ce972c5f8ebef667086707e48b2623e","name":"UniGraph","symbol":"GRAPH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12197/thumb/unigraph_logo.png?1597992376"},{"chainId":1,"address":"0xcd1cb16a67937ff8af5d726e2681010ce1e9891a","name":"Themis","symbol":"MIS","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13478/thumb/3uZAPv2CbXF5txM.png?1608947522"},{"chainId":1,"address":"0x0cc9fccff81252f4bd8c5c6b359b14ae2ed851cf","name":"InnovativeBioresear","symbol":"INNBCL","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/7911/thumb/INNBCL.png?1551777826"},{"chainId":1,"address":"0xcce63fd31e9053c110c74cebc37c8e358a6aa5bd","name":"Bitriver","symbol":"BTR","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/14946/thumb/1552652626371.png?1619128181"},{"chainId":1,"address":"0x406ae253fb0aa898f9912fb192c1e6deb9623a07","name":"TOROCUS Token","symbol":"TOROCUS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9912/thumb/j_bHDge7_400x400.png?1573454465"},{"chainId":1,"address":"0x4a42d2c580f83dce404acad18dab26db11a1750e","name":"Relex","symbol":"RLX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1799/thumb/relex.jpg?1547036103"},{"chainId":1,"address":"0x2688213fedd489762a281a67ae4f2295d8e17ecc","name":"FUD finance","symbol":"FUD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12727/thumb/fud_finance_logo.png?1602055414"},{"chainId":1,"address":"0x69692d3345010a207b759a7d1af6fc7f38b35c5e","name":"CHADS VC","symbol":"CHADS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12455/thumb/Chad_VC.png?1599940044"},{"chainId":1,"address":"0x2e95cea14dd384429eb3c4331b776c4cfbb6fcd9","name":"Throne","symbol":"THN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16965/thumb/aXhD3i_g_400x400.jpg?1625804145"},{"chainId":1,"address":"0x474021845c4643113458ea4414bdb7fb74a01a77","name":"Uno Re","symbol":"UNO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15073/thumb/UnoRe_logo_256.png?1619657040"},{"chainId":1,"address":"0x426fc8be95573230f6e6bc4af91873f0c67b21b4","name":"BlackPearl Token","symbol":"BPLC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8931/thumb/EJIpComQ_400x400.png?1584653141"},{"chainId":1,"address":"0x03806ce5ef69bd9780edfb04c29da1f23db96294","name":"Tesla Token","symbol":"TSL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1222/thumb/energo.png?1547035249"},{"chainId":1,"address":"0xdf49c9f599a0a9049d97cff34d0c30e468987389","name":"SaTT","symbol":"SATT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4070/thumb/r3s9XKk.png?1623046839"},{"chainId":1,"address":"0x999967e2ec8a74b7c8e9db19e039d920b31d39d0","name":"Ties DB","symbol":"TIE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1142/thumb/ties-network.jpg?1547035148"},{"chainId":1,"address":"0x881a7e25d44591c467a37da96adf3c3705e7251b","name":"Elynet Token","symbol":"ELYX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13326/thumb/KakaoTalk_20201208_102026847.png?1607483005"},{"chainId":1,"address":"0x7c32db0645a259fae61353c1f891151a2e7f8c1e","name":"Potentiam","symbol":"PTM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2349/thumb/ptm.png?1547036546"},{"chainId":1,"address":"0xc691bc298a304d591ad9b352c7a8d216de9f2ced","name":"Polaris Share","symbol":"POLA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13817/thumb/tHQrxdYQ_400x400.png?1612051098"},{"chainId":1,"address":"0x28d3e409bb9bc58f1ca6e009f8fc78a1db85e6b7","name":"Gem Exchange And Tr","symbol":"GXT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12226/thumb/gxt_icon_256x256_gradient.png?1598306924"},{"chainId":1,"address":"0x54c9ea2e9c9e8ed865db4a4ce6711c2a0d5063ba","name":"BarterTrade","symbol":"BART","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12142/thumb/200x200-transparent.png?1606958206"},{"chainId":1,"address":"0x9af15d7b8776fa296019979e70a5be53c714a7ec","name":"Evolution Finance","symbol":"EVN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13932/thumb/Frame_63_2.png?1612936435"},{"chainId":1,"address":"0x7051620d11042c4335069aaa4f10cd3b4290c681","name":"TCASH","symbol":"TCASH","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6574/thumb/jiPkVuI7_400x400.jpg?1547042782"},{"chainId":1,"address":"0xa10a210c27c86f8c63825096e34f671fd61041b1","name":"Jeff in Space","symbol":"JEFF","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/17087/thumb/jeff3.png?1626163962"},{"chainId":1,"address":"0x72ba699f0f3c29d0f886c264ec7350533a32b3d5","name":"Medican Coin","symbol":"MCAN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13625/thumb/mcan_logo_RGB_v1.png?1610413624"},{"chainId":1,"address":"0xbe5d345d05dd62828ed61519ef9f7af76f092248","name":"Ticket2Lambo","symbol":"T2L","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16906/thumb/t2l.png?1625582240"},{"chainId":1,"address":"0x737fa0372c8d001904ae6acaf0552d4015f9c947","name":"MEDIBIT","symbol":"MEDIBIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6606/thumb/medibit.png?1547978632"},{"chainId":1,"address":"0x539efe69bcdd21a83efd9122571a64cc25e0282b","name":"Blue Protocol","symbol":"BLUE","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1036/thumb/blue-protocol.jpg?1547034969"},{"chainId":1,"address":"0x5d4d57cd06fa7fe99e26fdc481b468f77f05073c","name":"Netkoin","symbol":"NTK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5162/thumb/NTK.png?1606878538"},{"chainId":1,"address":"0xa54c67bd320da4f9725a6f585b7635a0c09b122e","name":"TimeMiner","symbol":"TIME","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/12280/thumb/2WTMX74.png?1598739901"},{"chainId":1,"address":"0x99f2b69ee2468c834a634ff50d930ae64e3e500f","name":"Utrin","symbol":"UTRIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14380/thumb/utrin_logo.png?1615779349"},{"chainId":1,"address":"0xcc7ab8d78dba187dc95bf3bb86e65e0c26d0041f","name":"Spacelens","symbol":"SPACE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16979/thumb/SPACE___Spacelens.png?1625900475"},{"chainId":1,"address":"0x7e9d8f07a64e363e97a648904a89fb4cd5fb94cd","name":"Forefront","symbol":"FF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14659/thumb/N2kir6jx_400x400.jpg?1617608020"},{"chainId":1,"address":"0x1ebe1e64dd249c6fdb600d05a927a7d26a4a895f","name":"Ethereum Supreme","symbol":"ESUPREME","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15973/thumb/MWt21Ym.png?1622523673"},{"chainId":1,"address":"0xa8e7ad77c60ee6f30bac54e2e7c0617bd7b5a03e","name":"zLOT","symbol":"ZLOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13073/thumb/z-LOT-logo-transparent.png?1604900416"},{"chainId":1,"address":"0x19d97d8fa813ee2f51ad4b4e04ea08baf4dffc28","name":"Badger Sett Badger","symbol":"BBADGER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14502/thumb/BADGER_DAO.png?1616559959"},{"chainId":1,"address":"0x182f4c4c97cd1c24e1df8fc4c053e5c47bf53bef","name":"keyTango","symbol":"TANGO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14349/thumb/2Fv6IUqc_400x400.jpg?1615513660"},{"chainId":1,"address":"0x05a78ffea2b35aa1af438c21cf06668cf118df0a","name":"Migranet","symbol":"MIG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9033/thumb/ymZOjgz5_400x400.jpg?1563790723"},{"chainId":1,"address":"0xc014186cf1ba36032aaec7f96088f09eb3934347","name":"WeCoOwn","symbol":"WCX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14497/thumb/WCX-Token-Logo.png?1616555141"},{"chainId":1,"address":"0xdb11f6fc8e16c02719e9c2eb3c4c762fee8f5c5b","name":"Nydronia","symbol":"NIA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13738/thumb/IMG-20210121-221955-366.png?1611294905"},{"chainId":1,"address":"0x7fbec0bb6a7152e77c30d005b5d49cbc08a602c3","name":"disBalancer","symbol":"DDOS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14791/thumb/communityIcon_o2yriheuszk61.png?1618463138"},{"chainId":1,"address":"0xa5e412ba6fca1e07b15defcaa4236ff7b5a7f086","name":"Crypto Bank","symbol":"CBANK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13473/thumb/HHeUVDBF5clKgE4vW_dyCtcTZqWDRw_vDe1MA3lIJWI4wEZW2BwF5dHFbm_ZpJNTWf85sZxCBVl2R7u29kGg37bE8XkGh3CneW6SkVwbnQEe0r2WR6yy6THxMvzIMiicWza82-NyjMitEo84_2E_C5LCiBcdTPFrjNQiMs1DTSJuaRTNB81KRsdcXNW0p2j7PH8O7Xk3QrWVjPe.jpg?1608853514"},{"chainId":1,"address":"0x46e9fe43470fafd690100c86037f9e566e24d480","name":"EQO","symbol":"EQO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14868/thumb/EQO-Token-Icon.png?1618816238"},{"chainId":1,"address":"0x56c64e280ef1262da370d2c5862bb61c6dc3dbb4","name":"Big Coin","symbol":"BIG","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13756/thumb/Logo_-_2021-01-25T173222.900.png?1611567220"},{"chainId":1,"address":"0x110fe5f21c1edd4f03a6e0de0d96d0c2eed0b9cc","name":"Tessla Coin","symbol":"TSLA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13045/thumb/Tessla-Icon.png?1604630729"},{"chainId":1,"address":"0xd82df0abd3f51425eb15ef7580fda55727875f14","name":"DAV Network","symbol":"DAV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2842/thumb/DAV-Network-logo.jpg?1547037011"},{"chainId":1,"address":"0xc1fa06e8596c3fa98ccd2113c38b6b60b6efa00d","name":"Erotica","symbol":"EROTICA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15510/thumb/PF1HT6l.png?1621101445"},{"chainId":1,"address":"0xb59490ab09a0f526cc7305822ac65f2ab12f9723","name":"Litentry","symbol":"LIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13825/thumb/logo_200x200.png?1612153317"},{"chainId":1,"address":"0x4fadc7a98f2dc96510e42dd1a74141eeae0c1543","name":"Wrapped AR","symbol":"WAR","decimals":12,"logoURI":"https://assets.coingecko.com/coins/images/17093/thumb/war.PNG?1626224053"},{"chainId":1,"address":"0xb4c9abc8a74bd2e0e0b7ac5ece30792e65d86c59","name":"LiteGold","symbol":"LTG","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6792/thumb/O4v8ll_f_400x400.jpg?1547043077"},{"chainId":1,"address":"0x4a6ab9792e9f046c3ab22d8602450de5186be9a7","name":"Polka Ventures","symbol":"POLVEN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14613/thumb/polven.png?1617253185"},{"chainId":1,"address":"0x4fb721ef3bf99e0f2c193847afa296b9257d3c30","name":"Tokenplace","symbol":"TOK","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/15779/thumb/output-onlinepngtools_%283%29.png?1621837855"},{"chainId":1,"address":"0x67b66c99d3eb37fa76aa3ed1ff33e8e39f0b9c7a","name":"Interest Bearing ET","symbol":"IBETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13131/thumb/7675.png?1605535879"},{"chainId":1,"address":"0xb393cd041afc1aca4c380c663793fe2c7b8a0212","name":"NanTrade","symbol":"NAN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11049/thumb/logo_%2871%29.png?1587537446"},{"chainId":1,"address":"0x72e9d9038ce484ee986fea183f8d8df93f9ada13","name":"SmartCredit Token","symbol":"SMARTCREDIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13036/thumb/smartcredit_logo_02_white_a-1.png?1604545479"},{"chainId":1,"address":"0xf56842af3b56fd72d17cb103f92d027bba912e89","name":"BambooDeFi","symbol":"BAMBOO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13856/thumb/Bamboo-token-logo-200.png?1612404311"},{"chainId":1,"address":"0x0d88ed6e74bbfd96b831231638b66c05571e824f","name":"Aventus","symbol":"AVT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/901/thumb/Aventus.png?1625122968"},{"chainId":1,"address":"0x7409856cae628f5d578b285b45669b36e7005283","name":"Jarvis Synthetic Br","symbol":"JGBP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15726/thumb/logo_-_2021-05-22T063537.065.png?1621636572"},{"chainId":1,"address":"0x4527a3b4a8a150403090a99b87effc96f2195047","name":"P2P solutions found","symbol":"P2PS","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/2798/thumb/p2ps.png?1547036973"},{"chainId":1,"address":"0x86d1d12523b65203851c571fcc029bf90903fb6d","name":"Bintex Futures","symbol":"BNTX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12117/thumb/Bintexfutures_Icon_Logo.png?1597272672"},{"chainId":1,"address":"0xd1e10c37a27d95d95720291b1dc6f12f74c71443","name":"Cosmo Coin","symbol":"COSM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5252/thumb/cosmo-coin.png?1547040742"},{"chainId":1,"address":"0x429d83bb0dcb8cdd5311e34680adc8b12070a07f","name":"PlatonCoin","symbol":"PLTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7178/thumb/PLTC.png?1616126045"},{"chainId":1,"address":"0x6ce21e5f5383c95691d243879a86a6025e0870c0","name":"Hintchain","symbol":"HINT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9329/thumb/JwEnTYRktjoozNKeI6qtQ0CEuiwNhl_vWNoXvob7OO-ZJ7YsXqK6oUmBjdXy0XRTnLcOywgKyWP-3WPcpelcT2ZQyBYoYEGLXA4Q-n6utwbn43oTkW3Ro6Mm93tr9lC1lrb3E4vPTS17TYRvYDP_6c9KLulnS4y_E4FlU9u6Y2FkoYhFdrV9-XF1CPif17GxyVa9vr45xfgGmqmU5.jpg?1566284372"},{"chainId":1,"address":"0xc813ea5e3b48bebeedb796ab42a30c5599b01740","name":"Autonio","symbol":"NIOX","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/1122/thumb/NewLogo.png?1597298450"},{"chainId":1,"address":"0x196f4727526ea7fb1e17b2071b3d8eaa38486988","name":"Reserve","symbol":"RSV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10952/thumb/Reserve.png?1586372277"},{"chainId":1,"address":"0x892f5a0b08bb7b1eecccc63ef3916ff201c93664","name":"Bloody Token","symbol":"BLOODY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12969/thumb/bloody-200px.png?1603940552"},{"chainId":1,"address":"0x3e991dbec296e00626e58c33b62e53bec9d54636","name":"USDL","symbol":"USDL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12748/thumb/200x200usdl.png?1602214831"},{"chainId":1,"address":"0xeb58343b36c7528f23caae63a150240241310049","name":"Nimbus","symbol":"NBU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14517/thumb/EQMLlI52Dhm7DPe4QPt81MiqPTUa0X7YOZV9G1ki_OpZe6rtVUtmIn5XbQHeMHyuTkX4Y1qU-K8lAn4juL3KnVQLR7WeeJ_r6jI5nrjGgvt4DgMSAnuTrT15AREqbB0wUkosE8NVhjKpPUvvaALnpO0BtFUt4Bo9tsOTsfQDAEFrpH0uhVkEqJG_u09ehkX88hkYKJcm5RkvIgq.jpg?1616654587"},{"chainId":1,"address":"0x24d8c2163d6b13a6b8770b794d00c98cb4e0cbca","name":"O OCEAN MAR22","symbol":"O-OCEAN-MAR22","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14860/thumb/Or0WdShi_400x400.jpg?1618806215"},{"chainId":1,"address":"0xb9782532fa7062a6f73df1ce71d75c0e16046ebc","name":"YFI Paprika","symbol":"YFIP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12842/thumb/yfipaprika.png?1602990259"},{"chainId":1,"address":"0xd6a55c63865affd67e2fb9f284f87b7a9e5ff3bd","name":"Switch","symbol":"ESH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8608/thumb/Cco9sLN.png?1603676332"},{"chainId":1,"address":"0x3ee6e46f52c475c52040b934745501f2a0cea252","name":"DSCVR Finance","symbol":"DSCVR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15131/thumb/dscvr.PNG?1619766992"},{"chainId":1,"address":"0xdaf88906ac1de12ba2b1d2f7bfc94e9638ac40c4","name":"EpiK Protocol","symbol":"EPK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15188/thumb/epk.PNG?1620078400"},{"chainId":1,"address":"0x53f64be99da00fec224eaf9f8ce2012149d2fc88","name":"Nice","symbol":"NICE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12844/thumb/nice-200px.png?1603031077"},{"chainId":1,"address":"0xa918897bd10d6dee614470c24a061b78b021b3a9","name":"Universal Coin","symbol":"UCOIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13650/thumb/UCOIN_LOGO-min.png?1610549326"},{"chainId":1,"address":"0xb0b1685f55843d03739c7d9b0a230f1b7dcf03d5","name":"Lynchpin Token","symbol":"LYN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7090/thumb/logo_%2899%29.png?1607810177"},{"chainId":1,"address":"0xeb029507d3e043dd6c87f2917c4e82b902c35618","name":"sCOMP","symbol":"SCOMP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15732/thumb/scomp.JPG?1621671410"},{"chainId":1,"address":"0x3a92bd396aef82af98ebc0aa9030d25a23b11c6b","name":"Tokenbox","symbol":"TBX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2644/thumb/tokenbox.png?1547036822"},{"chainId":1,"address":"0x6628606c321faf52b7230a57b26c01b19aa68e82","name":"BitHash Token","symbol":"BT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13224/thumb/bt.png?1606358296"},{"chainId":1,"address":"0x903bef1736cddf2a537176cf3c64579c3867a881","name":"ICHI","symbol":"ICHI","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13119/thumb/ICHI_%28Round%29.jpg?1614308761"},{"chainId":1,"address":"0xd536bbd5414a8c2beed82a63737b9327d2fa35a6","name":"Aitheon","symbol":"ACU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3008/thumb/5NGo-O_T_400x400.png?1561446178"},{"chainId":1,"address":"0xedf6568618a00c6f0908bf7758a16f76b6e04af9","name":"Arianee","symbol":"ARIA20","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5054/thumb/Aria_Logo_256.png?1610097866"},{"chainId":1,"address":"0x1337def16f9b486faed0293eb623dc8395dfe46a","name":"ARMOR","symbol":"ARMOR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13748/thumb/armor.png?1611425846"},{"chainId":1,"address":"0x580c8520deda0a441522aeae0f9f7a5f29629afa","name":"Dawn Protocol","symbol":"DAWN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11555/thumb/dawn_protocol.png?1591060256"},{"chainId":1,"address":"0xc38f1fb49acdf2f1213caf3319f6eb3ea2cb7527","name":"Bitcoinus","symbol":"BITS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6294/thumb/bitcoinus.png?1547042337"},{"chainId":1,"address":"0x299948bc2ca54a5e814b19849327a6d9a0e7de1b","name":"Glyph Token","symbol":"GLY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14752/thumb/logo_-_2021-04-12T064510.489.png?1618181135"},{"chainId":1,"address":"0x6f39297bc0c386355c77da3a0275c867b21b2454","name":"GrandPa Fan","symbol":"FYY","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9122/thumb/fyy.PNG?1564473811"},{"chainId":1,"address":"0x21d5678a62dfe63a47062469ebb2fac2817d8832","name":"YOLOCash","symbol":"YLC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/4368/thumb/received_2320303067998561.png?1547039717"},{"chainId":1,"address":"0x3c6da7763caa0e4b684bbc733f04a8ec08af3762","name":"MODEL X coin","symbol":"MODX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6603/thumb/LOGO-MODX.png?1547042808"},{"chainId":1,"address":"0xa883e72c12473ded50a5fbffa60e4000fa5fe3c8","name":"LOAD Network","symbol":"LOAD","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13270/thumb/load_network_logo.png?1606880512"},{"chainId":1,"address":"0xbcc66ed2ab491e9ae7bf8386541fb17421fa9d35","name":"Skull","symbol":"SKULL","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/10641/thumb/skull.png?1581339740"},{"chainId":1,"address":"0x2bdc0d42996017fce214b21607a515da41a9e0c5","name":"SkinCoin","symbol":"SKIN","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/830/thumb/skincoin.png?1547034622"},{"chainId":1,"address":"0x5cb888182fbffdb62c08fb4b5a343914f00fdfee","name":"Moneybrain BiPS","symbol":"BIPS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15556/thumb/bips_logo_200x200_Trans.png?1621204965"},{"chainId":1,"address":"0x543ff227f64aa17ea132bf9886cab5db55dcaddf","name":"DAOstack","symbol":"GEN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3479/thumb/gen.png?1547038215"},{"chainId":1,"address":"0x197e6bca6bc2f488ec760a6ce46b1399cd2954b0","name":"BitCloud Pro","symbol":"BPRO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8413/thumb/V86TNt3F_400x400.jpg?1560421281"},{"chainId":1,"address":"0xe09216f1d343dd39d6aa732a08036fee48555af0","name":"Contribute","symbol":"TRIB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12576/thumb/New_logo_circle.png?1604214723"},{"chainId":1,"address":"0x0f4c00139602ab502bc7c1c0e71d6cb72a9fb0e7","name":"dHEDGE Top Index","symbol":"DTOP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14792/thumb/dtop.jpg?1618469418"},{"chainId":1,"address":"0x06a6fc23e6ec8a2b2aeeefd70d772dc3d6b45010","name":"CryptoProfile","symbol":"CP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7350/thumb/CryptoProfile-logo.png?1547044024"},{"chainId":1,"address":"0xdbf5c7d8ac5007667617a15db2c1b1d616c9d302","name":"FlexETH BTC Set","symbol":"FLEXETHBTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10581/thumb/flex_eth_btc.png?1580960245"},{"chainId":1,"address":"0xe7c9c188138f7d70945d420d75f8ca7d8ab9c700","name":"Basis Dollar Share","symbol":"BSDS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13411/thumb/bshare.png?1608267551"},{"chainId":1,"address":"0xfb9553afa2b5c19c5f8e5b8ee175fc01abd1555f","name":"Hybrid Bank Cash","symbol":"HBC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12489/thumb/hb_logo.png?1600208518"},{"chainId":1,"address":"0x3c4bea627039f0b7e7d21e34bb9c9fe962977518","name":"Ubique Chain of Thi","symbol":"UCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4277/thumb/Webp.net-resizeimage_%2829%29.jpg?1547039634"},{"chainId":1,"address":"0x1b06b43f3b0bbad73784d858c782e029f3f5af14","name":"Bitwell Token","symbol":"WELL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15878/thumb/IYW0e-3S_400x400.jpg?1622187107"},{"chainId":1,"address":"0x54ee01beb60e745329e6a8711ad2d6cb213e38d7","name":"DefiSocial","symbol":"DFSOCIAL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13538/thumb/DEPI.png?1617093782"},{"chainId":1,"address":"0xf6ed276a69270a895d6e419d99dcb5aaa2f3cb4a","name":"SwapAll","symbol":"SAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13014/thumb/fav.png?1604383601"},{"chainId":1,"address":"0x351caa9045d65107b9d311d922d15887cfd634e4","name":"Arowana Token","symbol":"ARW","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17114/thumb/ARW_Logo-Transparent_200x200.png?1626327474"},{"chainId":1,"address":"0x37d6e7f287200c740012747d2a79295caed2db35","name":"ALP Coin","symbol":"ALP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9725/thumb/Logo_ALP_coin200%D1%85200.png?1572406499"},{"chainId":1,"address":"0x03b155af3f4459193a276395dd76e357bb472da1","name":"Swace","symbol":"SWACE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3727/thumb/swace-symbol.png?1564553792"},{"chainId":1,"address":"0xa6a840e50bcaa50da017b91a0d86b8b2d41156ee","name":"EchoLink","symbol":"EKO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2437/thumb/echolink.png?1547224598"},{"chainId":1,"address":"0xa6714a2e5f0b1bdb97b895b0913b4fcd3a775e4d","name":"PromotionChain","symbol":"PC","decimals":5,"logoURI":"https://assets.coingecko.com/coins/images/6630/thumb/2cs3_gfe_400x400.jpg?1547042831"},{"chainId":1,"address":"0xba1ed22c69ad00739ee2b4abd70e270be9e87ee2","name":"WebFlix","symbol":"WFX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8559/thumb/dr4OEbWK_400x400.jpg?1559199557"},{"chainId":1,"address":"0x175ab41e2cedf3919b2e4426c19851223cf51046","name":"BaconSwap","symbol":"BACON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12336/thumb/bacon_swap_logo.png?1599133231"},{"chainId":1,"address":"0x52928c95c4c7e934e0efcfab08853a0e4558861d","name":"Hara Token","symbol":"HART","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5138/thumb/hara.jpg?1547040533"},{"chainId":1,"address":"0xe7e4279b80d319ede2889855135a22021baf0907","name":"ZeusNetwork","symbol":"ZEUS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6001/thumb/logo2.png?1547041947"},{"chainId":1,"address":"0xdd16ec0f66e54d453e6756713e533355989040e4","name":"Tokenomy","symbol":"TEN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2286/thumb/logo_%281%29.png?1604543144"},{"chainId":1,"address":"0x536381a8628dbcc8c70ac9a30a7258442eab4c92","name":"Pantos","symbol":"PAN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9639/thumb/Pantos-logo-compact.png?1619079883"},{"chainId":1,"address":"0x93ed140172ff226dad1f7f3650489b8daa07ae7f","name":"zzz finance v2","symbol":"ZZZV2","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13584/thumb/zzz_finance.jpg?1609919864"},{"chainId":1,"address":"0x19b58d95929586ad750893caad43e77aa6e8ce9e","name":"CelCoin","symbol":"CELC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6078/thumb/celcoin-logo.png?1547042055"},{"chainId":1,"address":"0xf205d2d65205711b6f6aae3fcb7ebdbc8573f192","name":"Bmining Token","symbol":"BMT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14155/thumb/BMT.jpg?1614673841"},{"chainId":1,"address":"0xb70835d7822ebb9426b56543e391846c107bd32c","name":"Game","symbol":"GTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2046/thumb/game.png?1547742459"},{"chainId":1,"address":"0x31fdd1c6607f47c14a2821f599211c67ac20fa96","name":"Burency","symbol":"BUY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12216/thumb/Ddphl9BD.png?1598238121"},{"chainId":1,"address":"0x8c680d0de5a9a3f6a99649d0a000225054934742","name":"Atlantic Finance","symbol":"ATFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15256/thumb/atlantic.png?1620268887"},{"chainId":1,"address":"0xdecade1c6bf2cd9fb89afad73e4a519c867adcf5","name":"Experty Wisdom Toke","symbol":"WIS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13133/thumb/n0MTVBrm_400x400.jpg?1605543934"},{"chainId":1,"address":"0x17525e4f4af59fbc29551bc4ece6ab60ed49ce31","name":"PieDAO Yearn Ecosys","symbol":"YPIE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13572/thumb/YPIE.png?1610437730"},{"chainId":1,"address":"0x89dcff5fd892f2bfc8b75dba12804b651f769579","name":"Staker DAO","symbol":"STKR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14535/thumb/stakerdao_logo.png?1616812877"},{"chainId":1,"address":"0x0ecdd783dc7bf820614044b51862ed29714d2ba5","name":"Medooza Ecosystem","symbol":"MDZA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13448/thumb/medooza-red-symbol-logo-exchange.png?1608681531"},{"chainId":1,"address":"0x2494a68c1484376fef880b4c24d91f049d29b02a","name":"The Transfer Token","symbol":"TTT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11086/thumb/4z9EtDd.png?1588125114"},{"chainId":1,"address":"0xb05097849bca421a3f51b249ba6cca4af4b97cb9","name":"Float Protocol Flo","symbol":"FLOAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15502/thumb/FLOAT_LOGO-reduced_01.png?1621081152"},{"chainId":1,"address":"0xbe685c5e06866cfb94a4242e3df8f2fa3e7c2b73","name":"Yearn Finance Red M","symbol":"YFRM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12947/thumb/200X200.png?1603778631"},{"chainId":1,"address":"0x94939d55000b31b7808904a80aa7bab05ef59ed6","name":"Jiaozi","symbol":"JIAOZI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12442/thumb/JiaoziFarm.png?1599888576"},{"chainId":1,"address":"0x824a50df33ac1b41afc52f4194e2e8356c17c3ac","name":"Kick","symbol":"KICK","decimals":10,"logoURI":"https://assets.coingecko.com/coins/images/981/thumb/kick.png?1568643013"},{"chainId":1,"address":"0x4eeea7b48b9c3ac8f70a9c932a8b1e8a5cb624c7","name":"Membrana","symbol":"MBN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5117/thumb/membrana_logo.png?1565238625"},{"chainId":1,"address":"0x6bb61215298f296c55b19ad842d3df69021da2ef","name":"Drops Ownership Pow","symbol":"DOP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15696/thumb/Drops.png?1621571328"},{"chainId":1,"address":"0xbc6669e7914a2b327ae428184086d8ac88d74efc","name":"Car Coin","symbol":"CCM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17119/thumb/CarCoin_icon_vector.png?1626356048"},{"chainId":1,"address":"0x81b1bfd6cb9ad42db395c2a27f73d4dcf5777e2d","name":"Rare","symbol":"RARE","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/12868/thumb/rare_logo.png?1603170092"},{"chainId":1,"address":"0x9972a0f24194447e73a7e8b6cd26a52e02ddfad5","name":"Thorecash ERC 20 ","symbol":"TCH","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/4754/thumb/thorecash-logo.png?1547040075"},{"chainId":1,"address":"0xaaaaaaaba2ea3daab0a6c05f1b962c78c9836d99","name":"Azbit","symbol":"AZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4504/thumb/azbit.jpg?1566190849"},{"chainId":1,"address":"0x2dbd330bc9b7f3a822a9173ab52172bdddcace2a","name":"YFED Finance","symbol":"YFED","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12736/thumb/yfed_logo.png?1602123697"},{"chainId":1,"address":"0x6368e1e18c4c419ddfc608a0bed1ccb87b9250fc","name":"Tap","symbol":"XTP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10291/thumb/0_3SJYkk_400x400.jpg?1577229220"},{"chainId":1,"address":"0xfdd7399e22918ba7234f5568cc2ef922489f7ba6","name":"Mask Token","symbol":"MSK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16267/thumb/MSK.jpg?1623561690"},{"chainId":1,"address":"0x757703bd5b2c4bbcfde0be2c0b0e7c2f31fcf4e9","name":"Zest Token","symbol":"ZEST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6837/thumb/33_%281%29.jpg?1594437564"},{"chainId":1,"address":"0xb1f66997a5760428d3a87d68b90bfe0ae64121cc","name":"LuaSwap","symbol":"LUA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12627/thumb/Screenshot_2020-09-28_at_6.24.59_PM.jpg?1601288721"},{"chainId":1,"address":"0xd7b7d3c0bda57723fb54ab95fd8f9ea033af37f2","name":"Pylon Finance","symbol":"PYLON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12299/thumb/NewPylonLogo.png?1604457455"},{"chainId":1,"address":"0x1600c2e08acb830f2a4ee4d34b48594dade48651","name":"Turex","symbol":"TUR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15539/thumb/turex-logo.png?1621155664"},{"chainId":1,"address":"0x29641e1096d4240b09a933839feac57b200652a4","name":"BIOPset","symbol":"BIOP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15356/thumb/PNG_-_200x200.png?1622439538"},{"chainId":1,"address":"0x9f0f1be08591ab7d990faf910b38ed5d60e4d5bf","name":"MainCoin","symbol":"MNC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7717/thumb/40946782_468400523662047_8336515617272102912_n.png?1549955793"},{"chainId":1,"address":"0x661ab0ed68000491d98c796146bcf28c20d7c559","name":"Shadows","symbol":"DOWS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14160/thumb/C3E49eZx_400x400.jpg?1614689301"},{"chainId":1,"address":"0xc21dbee65d62770953035f0434c532d578a666c9","name":"CryptoEnergy","symbol":"CNRG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10101/thumb/5NQC2enL_400x400.jpg?1575927862"},{"chainId":1,"address":"0xb0a0a070640b450eb136dc377208469ee4f49fbc","name":"Future1Coin","symbol":"F1C","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3113/thumb/future1coin.png?1548126667"},{"chainId":1,"address":"0x61d24aabb3e5e800d8f3d3d43dcbd66ae6cab51e","name":"Rabbit Coin","symbol":"BRB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8614/thumb/312c7330-ffbb-4a29-9cd0-7336170bb8f9.png?1559628544"},{"chainId":1,"address":"0xc434b27736a6882d33094d34792999702860a13c","name":"Savix","symbol":"SVX","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/14591/thumb/savix_200px.png?1617160141"},{"chainId":1,"address":"0x36b60a425b82483004487abc7adcb0002918fc56","name":"TICOEX Token Forme","symbol":"TICO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7036/thumb/aCjvaXZu_400x400.jpg?1547043475"},{"chainId":1,"address":"0xd1517663883e2acc154178fb194e80e8bbc29730","name":"Deipool","symbol":"DIP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13186/thumb/deipool.png?1606085265"},{"chainId":1,"address":"0x8f12dfc7981de79a8a34070a732471f2d335eece","name":"Crypto Excellence","symbol":"CE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14809/thumb/ce.PNG?1618539068"},{"chainId":1,"address":"0x6753795d67ed0b2b65b57fc45c7ac0f53b55f4fe","name":"Restore","symbol":"REST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16175/thumb/LrBewGu.png?1623204839"},{"chainId":1,"address":"0x63b8b7d4a3efd0735c4bffbd95b332a55e4eb851","name":"DigiCol Token","symbol":"DGCL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13519/thumb/DigiCol_Logo-01.png?1609372199"},{"chainId":1,"address":"0x4b4701f3f827e1331fb22ff8e2beac24b17eb055","name":"DistX","symbol":"DISTX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12291/thumb/DISTX-icon.png?1598885812"},{"chainId":1,"address":"0xd42debe4edc92bd5a3fbb4243e1eccf6d63a4a5d","name":"Carboneum","symbol":"C8","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3127/thumb/c8.png?1547037525"},{"chainId":1,"address":"0xd69ae79b01c4af7f19b9a824e5643363b202b3a1","name":"Duet Protocol","symbol":"DUET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16164/thumb/Duet.jpg?1623143640"},{"chainId":1,"address":"0xe29c5b523590165795bbd7d52369c2895b18841f","name":"Esports com","symbol":"ERT","decimals":19,"logoURI":"https://assets.coingecko.com/coins/images/1684/thumb/esports.jpg?1547035941"},{"chainId":1,"address":"0x1c5b760f133220855340003b43cc9113ec494823","name":"Cointorox","symbol":"OROX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7572/thumb/Cointorox.png?1559635132"},{"chainId":1,"address":"0x8807e69dc04155af64172cd6f0b4738f8068d0d4","name":"Meta Network","symbol":"META","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14941/thumb/8f2584c2068a45c694665c5215320c47.png?1619083885"},{"chainId":1,"address":"0x40986a85b4cfcdb054a6cbfb1210194fee51af88","name":"UniFarm","symbol":"UFARM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15247/thumb/ufarm.jpeg?1620218765"},{"chainId":1,"address":"0x21cd6af01383651ed10554394c0497f9db5e5dbc","name":"CryptoPing","symbol":"PING","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/770/thumb/Icon-ping-coin-256x256.png?1614585429"},{"chainId":1,"address":"0x7f969c4d388ca0ae39a4fddb1a6f89878ca2fbf8","name":"Global Game Coin","symbol":"GGC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10301/thumb/ggcoin_200.png?1577690908"},{"chainId":1,"address":"0xa6fa6531acdf1f9f96eddd66a0f9481e35c2e42a","name":"CryptoBRL","symbol":"CBRL","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/12321/thumb/CBRL_logo_200x200.png?1599094233"},{"chainId":1,"address":"0x9d1233cc46795e94029fda81aaadc1455d510f15","name":"Zero Collateral Dai","symbol":"ZAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13569/thumb/zai_logo.png?1609844802"},{"chainId":1,"address":"0x670f9d9a26d3d42030794ff035d35a67aa092ead","name":"XBullion","symbol":"GOLD","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/15658/thumb/WhatsApp_Image_2021-05-17_at_2.24.16_PM.jpeg?1621484245"},{"chainId":1,"address":"0x167e2a574669b0eeb552aaf3da47c728cb348a41","name":"Spartan","symbol":"300","decimals":7,"logoURI":"https://assets.coingecko.com/coins/images/13371/thumb/spartan300-200x200.png?1607986424"},{"chainId":1,"address":"0x610c67be018a5c5bdc70acd8dc19688a11421073","name":"Hype Finance","symbol":"HYPE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13193/thumb/hype_finance_logo.png?1606109896"},{"chainId":1,"address":"0xfb444c1f2b718ddfc385cb8fd9f2d1d776b24668","name":"Elamachain","symbol":"ELAMA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5650/thumb/Elamachain.png?1584505477"},{"chainId":1,"address":"0x9f8eef61b1ad834b44c089dbf33eb854746a6bf9","name":"SpaceDawgs","symbol":"DAWGS","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/17076/thumb/SPACEDAWGS_Token_Logo.png?1626152679"},{"chainId":1,"address":"0x6673b317c45f490cd8342120a7c02e2ace7cbdd9","name":"Dream21","symbol":"DMC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9708/thumb/dmc.PNG?1570922145"},{"chainId":1,"address":"0xa2a19165c17b36a5c753a246c1e188489754a693","name":"P2PGO","symbol":"P2PG","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12653/thumb/logo200x200p2pg.png?1601435471"},{"chainId":1,"address":"0xe154d54890c35634ca525d543ed58c741af7cf7a","name":"MEDIKEY","symbol":"MKEY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8257/thumb/medikey.png?1563782655"},{"chainId":1,"address":"0xf4e447c390167e5a17a95ab2475b71d4ea785200","name":"ALL BEST ICO","symbol":"ALLBI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8400/thumb/ALL_BEST_ICO.png?1557986224"},{"chainId":1,"address":"0x8c9d0e9d27fb15a96cd8ad714929502f4f1995bf","name":"SHUFFLE ","symbol":"SHFL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17040/thumb/SHFL_TIckerpng.png?1626146570"},{"chainId":1,"address":"0xae73b38d1c9a8b274127ec30160a4927c4d71824","name":"STK","symbol":"STK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1663/thumb/stk.png?1548611093"},{"chainId":1,"address":"0x8e4dbf540bf814c044785218b58c930b20a56be1","name":"Holistic ETH Set","symbol":"TCAPETHDAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11777/thumb/holistic_eth_set.png?1593932141"},{"chainId":1,"address":"0xadf8b8050639b6236915f7516d69de714672f0bf","name":"Scanetchain","symbol":"SWC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6876/thumb/scanetchain.jpg?1547043219"},{"chainId":1,"address":"0x4526dc4ac8f692535ed9bf235a3a20a2b9ff3328","name":"Essek Tov","symbol":"ETO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11706/thumb/eto.png?1592986122"},{"chainId":1,"address":"0x579353231f3540b218239774422962c64a3693e7","name":"Bitcratic Revenue","symbol":"BCTR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12537/thumb/BCTR.png?1600557934"},{"chainId":1,"address":"0x011864d37035439e078d64630777ec518138af05","name":"Zerogoki","symbol":"REI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17015/thumb/z.PNG?1626076130"},{"chainId":1,"address":"0xe653967f0beb6e313c6350f20bca9a5f4c636eed","name":"MISS","symbol":"MISS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9798/thumb/ABUIABAEGAAg-trN6wUorOP-hQEwiAM4rwI.png?1571907729"},{"chainId":1,"address":"0x6e605c269e0c92e70beeb85486f1fc550f9380bd","name":"Catex Token","symbol":"CATT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6353/thumb/catex.png?1548733307"},{"chainId":1,"address":"0x9827f6e8df0ccc584ff7b37144de8bac7c446385","name":"Kitcoin","symbol":"KTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8910/thumb/logo2.png?1562744333"},{"chainId":1,"address":"0x09e4bdfb273245063ef5e800d891eff7d04f9b83","name":"ETH Price Action Ca","symbol":"ETHPA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10905/thumb/eth_price_action_candlestick_set.png?1585731504"},{"chainId":1,"address":"0x3c72fca8523686fd9e5740b0826fa4bb376e0241","name":"300FIT","symbol":"FIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9690/thumb/6mkyI4Ss_400x400.png?1570832640"},{"chainId":1,"address":"0x514910771af9ca656af840dff83e8264ecf986ca","name":"Chainlink","symbol":"LINK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/877/thumb/chainlink-new-logo.png?1547034700"},{"chainId":1,"address":"0x865bb9a28041259b4badafd37799a288aabbfc8c","name":"Moma Protocol","symbol":"MOMAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16910/thumb/moma.PNG?1625618080"},{"chainId":1,"address":"0x7f509465c38b66bdecec2cfdc842e11809cc8357","name":"GODL","symbol":"GODL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17081/thumb/GODL.jpg?1626156131"},{"chainId":1,"address":"0x58723c7afcd33a2db6ae06c37521725d65f0cc15","name":"BullBearBitcoin Set","symbol":"BBB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10901/thumb/bullbearbitcoin.png?1585730623"},{"chainId":1,"address":"0x4fbb0b4cd8f960ac3428194f1c94c805d5b35836","name":"BigBang Game","symbol":"BBGC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7719/thumb/rxpRt7tH_400x400.jpg?1549957251"},{"chainId":1,"address":"0x1378ec93ab2b07ba5a0eaef19cf354a33f64b9fd","name":"Yearn Finance Diamo","symbol":"YFDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12824/thumb/yfdt_logo.png?1602814305"},{"chainId":1,"address":"0x8810c63470d38639954c6b41aac545848c46484a","name":"Aditus","symbol":"ADI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1867/thumb/adi.png?1514446309"},{"chainId":1,"address":"0xb1ca7e6714263a64659a3a89e1c313af30fd660a","name":"ETH Moonshot X Yiel","symbol":"ETHMOONX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10913/thumb/eth_moonshot_x.png?1585890185"},{"chainId":1,"address":"0xe54b3458c47e44c37a267e7c633afef88287c294","name":"Artfinity Token","symbol":"AT","decimals":5,"logoURI":"https://assets.coingecko.com/coins/images/8339/thumb/artfinity.png?1557604049"},{"chainId":1,"address":"0x3dd66732113af9981a861cf489431533aeba33b8","name":"Yearn Finance Netwo","symbol":"YFN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12821/thumb/9v36orK.jpg?1603191959"},{"chainId":1,"address":"0xf41e5fbc2f6aac200dd8619e121ce1f05d150077","name":"CRYCASH","symbol":"CRC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1945/thumb/crycash.png?1547790664"},{"chainId":1,"address":"0x856c4388c56c2a613c60507a4701af627157fed6","name":"ETH Trending Alpha ","symbol":"ETAS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10925/thumb/alphachain_set_2.png?1585894153"},{"chainId":1,"address":"0x5f02cf3c7ada49dfc4a3645fc85c8ae86808dd9b","name":"COST COIN ","symbol":"AKM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11705/thumb/akm.PNG?1592984686"},{"chainId":1,"address":"0x89c0b027bd7cc2d17854b06f8322e29451192ce3","name":"Intelligent ETH Set","symbol":"INTETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10923/thumb/the_intelligent_eth_set.png?1585893829"},{"chainId":1,"address":"0x951a1070ac39851dcc07b302230a68f81929a5f1","name":"GT STAR Token","symbol":"GTS","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11160/thumb/gts.PNG?1589268165"},{"chainId":1,"address":"0x622cd54deb2bb7a051515192417109bcf3fe098f","name":"IPChain","symbol":"IPC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/2572/thumb/ipchain.png?1547036700"},{"chainId":1,"address":"0x0563dce613d559a47877ffd1593549fb9d3510d6","name":"SuperBid","symbol":"SUPERBID","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14179/thumb/sign_super_bid.png?1617964829"},{"chainId":1,"address":"0x14c926f2290044b647e1bf2072e67b495eff1905","name":"Bethereum","symbol":"BETHER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2738/thumb/bethereum.png?1547036939"},{"chainId":1,"address":"0x838d8e11b160dec88fe62bf0f743fb7000941e13","name":"Krios","symbol":"GIG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1657/thumb/GIGLogo256x256.png?1591067062"},{"chainId":1,"address":"0x33840024177a7daca3468912363bed8b425015c5","name":"Ethbox Token","symbol":"EBOX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14528/thumb/ethbox.PNG?1616743175"},{"chainId":1,"address":"0x3a4f40631a4f906c2bad353ed06de7a5d3fcb430","name":"PlayDapp","symbol":"PLA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14316/thumb/54023228.png?1615366911"},{"chainId":1,"address":"0xf18432ef894ef4b2a5726f933718f5a8cf9ff831","name":"BioCrypt","symbol":"BIO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6457/thumb/200x200logo.png?1547042660"},{"chainId":1,"address":"0xfbbe9b1142c699512545f47937ee6fae0e4b0aa9","name":"EDDASwap","symbol":"EDDA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14368/thumb/edda.png?1615732928"},{"chainId":1,"address":"0x622dffcc4e83c64ba959530a5a5580687a57581b","name":"Cube","symbol":"AUTO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3503/thumb/2559.png?1547038267"},{"chainId":1,"address":"0x062f90480551379791fbe2ed74c1fe69821b30d3","name":"YMAX","symbol":"YMAX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12535/thumb/Jec_HMyy_400x400.png?1600555787"},{"chainId":1,"address":"0x25ce333b325f02c9720da526a01b5f5be889b4e3","name":"BMJ Coin","symbol":"BMJ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9939/thumb/logo_%2815%29.png?1573637099"},{"chainId":1,"address":"0xd433138d12beb9929ff6fd583dc83663eea6aaa5","name":"Bitrue Coin","symbol":"BTR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8873/thumb/BX9d22_m.jpg?1562297447"},{"chainId":1,"address":"0x28cb7e841ee97947a86b06fa4090c8451f64c0be","name":"YF Link","symbol":"YFL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12081/thumb/YFLink.png?1596987945"},{"chainId":1,"address":"0x8716fc5da009d3a208f0178b637a50f4ef42400f","name":"Ultrain","symbol":"UGAS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4684/thumb/ultrain.png?1547039956"},{"chainId":1,"address":"0xcccf837f40d334f8602f031e64b52ad4cd2b6601","name":"Unicly Fewocious Co","symbol":"UFEWO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16387/thumb/uFEWO.png?1623894677"},{"chainId":1,"address":"0x5cc00cca0692b9b34af816e5439cdb47d3b63691","name":"WooshCoin","symbol":"XWO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6173/thumb/dvqbA4Hc_400x400_%281%29.jpg?1548040425"},{"chainId":1,"address":"0x5322a3556f979ce2180b30e689a9436fddcb1021","name":"yTSLA Finance","symbol":"YTSLA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12547/thumb/YTSLA_%284%29.png?1600740522"},{"chainId":1,"address":"0xc56c2b7e71b54d38aab6d52e94a04cbfa8f604fa","name":"ZUSD","symbol":"ZUSD","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/14192/thumb/icon_zusd_200_200.png?1614843297"},{"chainId":1,"address":"0x00ff902d4b2bfdbd0db38887412447c30b565aa0","name":"Tcoin fun","symbol":"TCO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13811/thumb/logo200_%289%29.png?1612047833"},{"chainId":1,"address":"0xb422e605fbd765b80d2c4b5d8196c2f94144438b","name":"3X Short Litecoin T","symbol":"LTCBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10223/thumb/683JEXMN_400x400_%281%29.png?1576588627"},{"chainId":1,"address":"0xd059c8a4c7f53c4352d933b059349ba492294ac9","name":"Apple Protocol Toke","symbol":"AAPL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13208/thumb/aapl.png?1606200126"},{"chainId":1,"address":"0x69bbe2fa02b4d90a944ff328663667dc32786385","name":"Punk Basic","symbol":"PUNK-BASIC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13991/thumb/icon-punk-basic-40.png?1613534206"},{"chainId":1,"address":"0x02f2d4a04e6e01ace88bd2cd632875543b2ef577","name":"PKG Token","symbol":"PKG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5422/thumb/pkg-token.png?1548331357"},{"chainId":1,"address":"0x2f7b618993cc3848d6c7ed9cdd5e835e4fe22b98","name":"Nami Corporation To","symbol":"NAMI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13729/thumb/nami_logo_256.png?1611224464"},{"chainId":1,"address":"0xc3771d47e2ab5a519e2917e61e23078d0c05ed7f","name":"Gather","symbol":"GTH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12458/thumb/Gather-Logo-Working-File.png?1599981686"},{"chainId":1,"address":"0x18aaa7115705e8be94bffebde57af9bfc265b998","name":"Audius","symbol":"AUDIO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12913/thumb/AudiusCoinLogo_2x.png?1603425727"},{"chainId":1,"address":"0x6a27348483d59150ae76ef4c0f3622a78b0ca698","name":"BeeKan Beenews","symbol":"BKBT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5004/thumb/beekan.png?1547040430"},{"chainId":1,"address":"0x822808104e173cb4b21549d8e921cae9e4f655e9","name":"Uni Ape","symbol":"UAPE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16308/thumb/uniape.PNG?1623725327"},{"chainId":1,"address":"0xebf4ca5319f406602eeff68da16261f1216011b5","name":"Yobit Token","symbol":"YO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9231/thumb/ybx_logo.gif?1565306320"},{"chainId":1,"address":"0xc3dd23a0a854b4f9ae80670f528094e9eb607ccb","name":"Trendering","symbol":"TRND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11941/thumb/trnd-ico-200.png?1605147194"},{"chainId":1,"address":"0xed64142f7d0a4d94ce0e7fe45d12f712fe360bd0","name":"Cosplay Token","symbol":"COT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2821/thumb/cot.PNG?1563431427"},{"chainId":1,"address":"0xaaaf91d9b90df800df4f55c205fd6989c977e73a","name":"Monolith","symbol":"TKN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/675/thumb/Monolith.png?1566296607"},{"chainId":1,"address":"0x36d10c6800d569bb8c4fe284a05ffe3b752f972c","name":"WeShow Token","symbol":"WET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5332/thumb/weshow-token-logo.jpg?1547040904"},{"chainId":1,"address":"0x905e337c6c8645263d3521205aa37bf4d034e745","name":"Doc com","symbol":"MTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4177/thumb/Webp.net-resizeimage_%2832%29.png?1547039449"},{"chainId":1,"address":"0x9cd39da8f25ec50cf2ee260e464ac23ea23f6bb0","name":"Toshify finance","symbol":"YFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12574/thumb/QskdLwuY_400x400.png?1600899144"},{"chainId":1,"address":"0xba745513acebcbb977497c569d4f7d340f2a936b","name":"Mainstream For The ","symbol":"MFTU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5519/thumb/Mainstream_for_the_underground.png?1534426154"},{"chainId":1,"address":"0xcafe27178308351a12fffffdeb161d9d730da082","name":"HotDollars Token","symbol":"HDS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8505/thumb/pvGh4E0b_400x400.jpg?1559026304"},{"chainId":1,"address":"0x2b4200a8d373d484993c37d63ee14aee0096cd12","name":"USDFreeLiquidity","symbol":"USDFL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13697/thumb/usdfl.png?1610980328"},{"chainId":1,"address":"0xb3bace433288645114fe8e8aa91f87659cbf665b","name":"Wallet Plus X","symbol":"WPX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10302/thumb/WPX_LOGO_200X200.png?1577693149"},{"chainId":1,"address":"0xb48b7e5bf6563b3e0a85055821a83deb8cfc12f6","name":"NOVA","symbol":"NOVA","decimals":3,"logoURI":"https://assets.coingecko.com/coins/images/6545/thumb/N7d0x35q_400x400.jpg?1547042760"},{"chainId":1,"address":"0x0f71b8de197a1c84d31de0f1fa7926c365f052b3","name":"Arcona","symbol":"ARCONA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4312/thumb/9xfrZX3q_400x400.jpg?1551073749"},{"chainId":1,"address":"0x74603e780545d02c4257e7d2be19c74de7be1952","name":"ETG Finance","symbol":"ETGF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13032/thumb/etgf_logo.png?1604482450"},{"chainId":1,"address":"0xcaa05e82bdcba9e25cd1a3bf1afb790c1758943d","name":"Partner","symbol":"PRC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8589/thumb/imgonline-com-ua-Resize-54JyhhJBRl58.png?1559541814"},{"chainId":1,"address":"0xf8c17c840549974ec17c6573b3963f1e3046c0eb","name":"Prediqt","symbol":"PQT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14407/thumb/57197945.png?1615936268"},{"chainId":1,"address":"0xf59ae934f6fe444afc309586cc60a84a0f89aaea","name":"Polkadex","symbol":"PDEX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14833/thumb/dIze5Ztl_400x400.jpg?1618610724"},{"chainId":1,"address":"0x16987c021c14ca1045cd0afebb33c124a58bf16c","name":"Voyager","symbol":"VGR","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/7381/thumb/PKQbxUtP_400x400.jpg?1547044079"},{"chainId":1,"address":"0x7ccc863ece2e15bc45ac0565d410da7a3340ad98","name":"Dotify","symbol":"DFY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14722/thumb/Dotifytoken.jpg?1622193135"},{"chainId":1,"address":"0x003e0af2916e598fa5ea5cb2da4edfda9aed9fde","name":"Basis Dollar","symbol":"BSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13409/thumb/bdollar_logo.png?1608263890"},{"chainId":1,"address":"0x1695936d6a953df699c38ca21c2140d497c08bd9","name":"SynLev","symbol":"SYN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12841/thumb/synlev_logo.jpg?1602945400"},{"chainId":1,"address":"0xd44bb6663936cab1310584a277f7daa6943d4904","name":"Winco","symbol":"WCO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/3628/thumb/Webp.net-resizeimage_%281%29.png?1547038550"},{"chainId":1,"address":"0x3d3d35bb9bec23b06ca00fe472b50e7a4c692c30","name":"Vidya","symbol":"VIDYA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12219/thumb/VIDYA_TOKEN.png?1598240425"},{"chainId":1,"address":"0x15a664416e42766a6cc0a1221d9c088548a6e731","name":"WEBN token","symbol":"WEBN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6612/thumb/200x200.png?1547042814"},{"chainId":1,"address":"0x250a3500f48666561386832f1f1f1019b89a2699","name":"SAFE2","symbol":"SAFE2","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12608/thumb/safe2.jpg?1601259102"},{"chainId":1,"address":"0x4e352cf164e64adcbad318c3a1e222e9eba4ce42","name":"MCDEX","symbol":"MCB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11796/thumb/mcb.png?1594355515"},{"chainId":1,"address":"0x37c430c2b5f9ff85e534873c715871818ab1623e","name":"AXIA Coin","symbol":"AXC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16879/thumb/AXIA_Coin_Decal_Blue.png?1625545193"},{"chainId":1,"address":"0x814f67fa286f7572b041d041b1d99b432c9155ee","name":"Dragon Coin","symbol":"DRG","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/3423/thumb/Dragon_Flat_Logo_2x-1.png?1551267120"},{"chainId":1,"address":"0x4c1c4957d22d8f373aed54d0853b090666f6f9de","name":"Silverway","symbol":"SLV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8822/thumb/Silverway.png?1561629364"},{"chainId":1,"address":"0x4ad0b81f92b16624bbcf46fc0030cfbbf8d02376","name":"Unagii Dai","symbol":"UDAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13782/thumb/uDAI.png?1611730113"},{"chainId":1,"address":"0x59db60bd41bbc8ca4c1efee6ea2a97eae1e30cf5","name":"3X Long Midcap Inde","symbol":"MIDBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10229/thumb/683JEXMN_400x400_%281%29.png?1576618503"},{"chainId":1,"address":"0x2840ad41cf25ad58303ba24c416e79dce4161b4f","name":"1X Short BNB Token","symbol":"BNBHEDGE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12062/thumb/683JEXMN_400x400.png?1596706881"},{"chainId":1,"address":"0x3209f98bebf0149b769ce26d71f7aea8e435efea","name":"Traxia","symbol":"TMT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3312/thumb/tmt.png?1547037907"},{"chainId":1,"address":"0x6f259637dcd74c767781e37bc6133cd6a68aa161","name":"Huobi Token","symbol":"HT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2822/thumb/huobi-token-logo.png?1547036992"},{"chainId":1,"address":"0x53dfea0a8cc2a2a2e425e1c174bc162999723ea0","name":"Jarvis Synthetic Sw","symbol":"JCHF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15727/thumb/logo_-_2021-05-22T063927.292.png?1621636779"},{"chainId":1,"address":"0x8be6a6158f6b8a19fe60569c757d16e546c2296d","name":"YFF Finance","symbol":"YFF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12578/thumb/5ymP5emT_400x400.jpg?1600913790"},{"chainId":1,"address":"0x3fa400483487a489ec9b1db29c4129063eec4654","name":"CryptoKek","symbol":"KEK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13513/thumb/Cryptokek-Logo-256px.png?1609292074"},{"chainId":1,"address":"0x9ab165d795019b6d8b3e971dda91071421305e5a","name":"Aurora","symbol":"AOA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4755/thumb/aurora-logo.png?1547040076"},{"chainId":1,"address":"0x13572851103bed49ff743af4c4bb5ace88b22e2f","name":"Recharge Finance","symbol":"R3FI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14036/thumb/IMG_20210518_073652_114.png?1623833528"},{"chainId":1,"address":"0x738865301a9b7dd80dc3666dd48cf034ec42bdda","name":"Agoras Token","symbol":"AGRS","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/399/thumb/Agoras.png?1614680577"},{"chainId":1,"address":"0x0db8d8b76bc361bacbb72e2c491e06085a97ab31","name":"IQeon","symbol":"IQN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1736/thumb/IQN_logo_64x64.png?1547036010"},{"chainId":1,"address":"0x5d64d850c8368008afb39224e92ad0dceff3cf38","name":"MINDOL","symbol":"MIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6366/thumb/mindol-logo.png?1547042468"},{"chainId":1,"address":"0x3833dda0aeb6947b98ce454d89366cba8cc55528","name":"SophiaTX","symbol":"SPHTX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1443/thumb/sophiatx.png?1548609885"},{"chainId":1,"address":"0xa20b44c001578e2c52665098ba62b00ebf8963cb","name":"REAPit","symbol":"REAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14608/thumb/reapit.PNG?1617243938"},{"chainId":1,"address":"0x06f3cdabae564b0546529b4dd8fef1bcd4235753","name":"TilWiki","symbol":"TLW","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12915/thumb/89706561_1111490899211097_8975783115158978560_n.jpg?1603441976"},{"chainId":1,"address":"0x213c53c96a01a89e6dcc5683cf16473203e17513","name":"Defi Shopping Stake","symbol":"DSS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12602/thumb/DSS.png?1601002204"},{"chainId":1,"address":"0xf961a1fa7c781ecd23689fe1d0b7f3b6cbb2f972","name":"Wrapped Moon Cats","symbol":"MCAT20","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14387/thumb/MCAT20.png?1615803341"},{"chainId":1,"address":"0xd8912c10681d8b21fd3742244f44658dba12264e","name":"Pluton","symbol":"PLU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1241/thumb/pluton.png?1548331624"},{"chainId":1,"address":"0x692eb773e0b5b7a79efac5a015c8b36a2577f65c","name":"swiss finance","symbol":"SWISS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13253/thumb/SWISS.png?1606724844"},{"chainId":1,"address":"0x0f00c8dd21da51bc6a6ac07f491a7dbe69746f16","name":"Clap Clap Token","symbol":"CCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7153/thumb/mLA2V_IB_400x400.jpg?1547043664"},{"chainId":1,"address":"0x4a220e6096b25eadb88358cb44068a3248254675","name":"Quant","symbol":"QNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3370/thumb/5ZOu7brX_400x400.jpg?1612437252"},{"chainId":1,"address":"0x868ab6c9e560ff70584b9770d1bd1b961ad09d82","name":"Super Trip Chain","symbol":"SUPT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8706/thumb/supt.jpg?1560242340"},{"chainId":1,"address":"0xd78e5b24aae1bd03a488af642770e2abb986f9d5","name":"RYI Platinum","symbol":"RYIP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14148/thumb/Untitled-design-11.png?1614666357"},{"chainId":1,"address":"0x36a28c7c9b3dea22f07f4df67833cbe764feeeb4","name":"Cryptonits","symbol":"CRT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13392/thumb/logo-200x200.png?1608100148"},{"chainId":1,"address":"0x19f4a2f8e21915376f1429c26a3a9b9b1db5ff5a","name":"Chad Link Set","symbol":"CHADLINK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11556/thumb/chad-link-set.png?1591072904"},{"chainId":1,"address":"0xb29663aa4e2e81e425294193616c1b102b70a158","name":"Ludena Protocol","symbol":"LDN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13372/thumb/LudenaProtocol_symbol_200x200.png?1607999831"},{"chainId":1,"address":"0xbca3c97837a39099ec3082df97e28ce91be14472","name":"DUST Token","symbol":"DUST","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11162/thumb/DUST.png?1589280496"},{"chainId":1,"address":"0xffe02ee4c69edf1b340fcad64fbd6b37a7b9e265","name":"NANJCOIN","symbol":"NANJ","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/3424/thumb/FDGC.png?1547038112"},{"chainId":1,"address":"0x6de037ef9ad2725eb40118bb1702ebb27e4aeb24","name":"Render Token","symbol":"RNDR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11636/thumb/uTDd98ZN_400x400.jpg?1592200150"},{"chainId":1,"address":"0xd2dda223b2617cb616c1580db421e4cfae6a8a85","name":"Bondly","symbol":"BONDLY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13322/thumb/logomark.png?1607474416"},{"chainId":1,"address":"0x9aa53df7263a73b93ec6a5e2a767ee30da10c304","name":"AUTZ Token","symbol":"AUTZ","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16293/thumb/256logo.png?1623662222"},{"chainId":1,"address":"0xcda16f62a8d3127ea0aebfacb221c1cc41b8e488","name":"MINUTE Vault NFTX ","symbol":"MINUTE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17047/thumb/MINUTE.png?1626148533"},{"chainId":1,"address":"0x3b0e1508fae33ffba8d3ea64851cf98c02f1c61b","name":"KeFi Token","symbol":"KFI","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/14979/thumb/Kefi-Logo-256x256-px.png?1619217173"},{"chainId":1,"address":"0x3108ccfd96816f9e663baa0e8c5951d229e8c6da","name":"Dark Build v1","symbol":"DARK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12716/thumb/DARK-circle_token_200px.png?1614850894"},{"chainId":1,"address":"0x8ba6dcc667d3ff64c1a2123ce72ff5f0199e5315","name":"Alex","symbol":"ALEX","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/10972/thumb/ALEX.png?1586742545"},{"chainId":1,"address":"0x63d0eea1d7c0d1e89d7e665708d7e8997c0a9ed6","name":"Ethanol","symbol":"ENOL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13214/thumb/hV_w1e5G_400x400.png?1606292732"},{"chainId":1,"address":"0xf08c68bd5f4194d994fd70726746bf529ee5a617","name":"Thorenext","symbol":"THX","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/6838/thumb/Screenshot-2018-11-12-at-11-58-10-PM.png?1547043151"},{"chainId":1,"address":"0x2d0e95bd4795d7ace0da3c0ff7b706a5970eb9d3","name":"All Sports","symbol":"SOC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2697/thumb/all-sports.png?1547036904"},{"chainId":1,"address":"0x82bd290afa5cc1b75f46822fec415e2be51d7d46","name":"TomatoToken","symbol":"TOMATO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16723/thumb/Tomatotoken_Icon_200x200.png?1624849719"},{"chainId":1,"address":"0xecbf566944250dde88322581024e611419715f7a","name":"xBTC","symbol":"XBTC","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12613/thumb/Y3ZxUNM.png?1601242661"},{"chainId":1,"address":"0x76417e660df3e5c90c0361674c192da152a806e4","name":"Zerogoki USD","symbol":"ZUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17028/thumb/zerogokiusd.PNG?1626140530"},{"chainId":1,"address":"0xe76c6c83af64e4c60245d8c7de953df673a7a33d","name":"Railgun","symbol":"RAIL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16840/thumb/railgun.jpeg?1625322775"},{"chainId":1,"address":"0xe45fc4290fd3159588f532058592ea327d2e97d4","name":"Alliance Cargo Dire","symbol":"ACD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7694/thumb/1620803690979049473.png?1549612872"},{"chainId":1,"address":"0x584b44853680ee34a0f337b712a8f66d816df151","name":"AI Doctor","symbol":"AIDOC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2449/thumb/aidoc.png?1547036587"},{"chainId":1,"address":"0x1de6cb5b085ac84bd247b8176c781e913166aa6b","name":"BrillianceX","symbol":"BRILX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15574/thumb/rs_w_1200_cg_true.png?1621234563"},{"chainId":1,"address":"0x829067d40a8d1233927891d9b3381d6aecee1e80","name":"Ivy Mining","symbol":"IVY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12756/thumb/ivymining.PNG?1602284897"},{"chainId":1,"address":"0x7d25d9f10cd224ecce0bc824a2ec800db81c01d7","name":"ETHOPT","symbol":"OPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13424/thumb/KHP6ebV.jpeg?1608514202"},{"chainId":1,"address":"0xc82eb6dea0c93edb8b697b89ad1b13d19469d635","name":"rFIS","symbol":"RFIS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14453/thumb/rFIS.png?1616660913"},{"chainId":1,"address":"0xa6446d655a0c34bc4f05042ee88170d056cbaf45","name":"Caspian","symbol":"CSP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6247/thumb/Caspian-logo.png?1547042282"},{"chainId":1,"address":"0x042f972ac93404f0fcbe4e3a0729f0b395232106","name":"XCoinPay","symbol":"DYX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9258/thumb/zyJi7L2o_400x400.jpg?1565650541"},{"chainId":1,"address":"0xec0bf0e934d092d31e769e8c9722ffbaa582db3b","name":"Shikokuaido","symbol":"SHOKK","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15437/thumb/icon.jpg?1620801547"},{"chainId":1,"address":"0x241ba672574a78a3a604cdd0a94429a73a84a324","name":"4New","symbol":"KWATT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4975/thumb/4new.png?1547040398"},{"chainId":1,"address":"0x7be00ed6796b21656732e8f739fc1b8f1c53da0d","name":"ACDX Exchange Token","symbol":"ACXT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13293/thumb/ACDX_Original_05.png?1607064933"},{"chainId":1,"address":"0xbbc2045d335cb224228f1850b29173d9d7d7b989","name":"GoHelpFund","symbol":"HELP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4339/thumb/go-help-fund-token-logo.png?1547039693"},{"chainId":1,"address":"0x16484d73ac08d2355f466d448d2b79d2039f6ebb","name":"FortKnoxster","symbol":"FKX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5050/thumb/FortKnoxster-Knoxstercoin-FKX-256.png?1623038047"},{"chainId":1,"address":"0x51b0bcbeff204b39ce792d1e16767fe6f7631970","name":"Bitcoin Volatility ","symbol":"BTCV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16717/thumb/logo_-_2021-06-28T092740.647.png?1624843667"},{"chainId":1,"address":"0x2c2f7e7c5604d162d75641256b80f1bf6f4dc796","name":"Polkarare","symbol":"PRARE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15388/thumb/Image_from_iOS.png?1621145396"},{"chainId":1,"address":"0x0352557b007a4aae1511c114409b932f06f9e2f4","name":"sRUNE","symbol":"SRUNE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14953/thumb/sRUNE.png?1619129376"},{"chainId":1,"address":"0xd26a9c3437f7d121098c8c05c7413f5cc70bb070","name":"Azuma Coin","symbol":"AZUM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10483/thumb/WDncHJ5.png?1580161760"},{"chainId":1,"address":"0x607f4c5bb672230e8672085532f7e901544a7375","name":"iExec RLC","symbol":"RLC","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/646/thumb/pL1VuXm.png?1604543202"},{"chainId":1,"address":"0x7f0f118d083d5175ab9d2d34c4c8fa4f43c3f47b","name":"PAMP CC","symbol":"PAMP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/15745/thumb/coingecko-pamp.png?1621779079"},{"chainId":1,"address":"0xf38011f9153acffaca3fbfc42ddfa766c980d967","name":"Pluto","symbol":"PLUT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13349/thumb/pluto_logo.png?1607810584"},{"chainId":1,"address":"0x584bc13c7d411c00c01a62e8019472de68768430","name":"Hegic","symbol":"HEGIC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12454/thumb/Hegic.png?1599938210"},{"chainId":1,"address":"0x0a50c93c762fdd6e56d86215c24aaad43ab629aa","name":"LGO Token","symbol":"LGO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/2353/thumb/2_JNnfVRPMBuA1hwnRubH72A.png?1595311622"},{"chainId":1,"address":"0xd0d7a9f2021958e51d60d6966b7bbed9d1cb22b5","name":"ENEX","symbol":"ENX","decimals":10,"logoURI":"https://assets.coingecko.com/coins/images/15070/thumb/ENEXpng200.png?1619621442"},{"chainId":1,"address":"0x16558553e4647ca500c3718c56c356edb6f9b11c","name":"Monkey King Token","symbol":"MKT","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/12283/thumb/footerlogo.png?1598759253"},{"chainId":1,"address":"0xaa99199d1e9644b588796f3215089878440d58e0","name":"Alphr","symbol":"ALPHR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15029/thumb/alphr.jpg?1619495712"},{"chainId":1,"address":"0xd4cb461eace80708078450e465881599d2235f1a","name":"Passive Income","symbol":"PSI","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13695/thumb/logo_psi.jpg?1610965597"},{"chainId":1,"address":"0x089a502032166e07ae83eb434c16790ca2fa4661","name":"CURE farm","symbol":"CURE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15381/thumb/cure.PNG?1620697586"},{"chainId":1,"address":"0xec67005c4e498ec7f55e092bd1d35cbc47c91892","name":"Enzyme","symbol":"MLN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/605/thumb/Enzyme_Icon_Secondary.png?1611576629"},{"chainId":1,"address":"0xea47b64e1bfccb773a0420247c0aa0a3c1d2e5c5","name":"BAYC Vault NFTX ","symbol":"BAYC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17035/thumb/BAYC.png?1626142944"},{"chainId":1,"address":"0xb683d83a532e2cb7dfa5275eed3698436371cc9f","name":"BTU Protocol","symbol":"BTU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3697/thumb/btuprotocol.jpeg?1549597021"},{"chainId":1,"address":"0x20910e5b5f087f6439dfcb0dda4e27d1014ac2b8","name":"BananaTok","symbol":"BNA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10289/thumb/sMCxdYBa_400x400.jpg?1577013480"},{"chainId":1,"address":"0xa9598333b99d14d90bc81cad8af82c4c70625e75","name":"Metis","symbol":"MTS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13218/thumb/1Vd_NuQU_400x400.jpg?1606292031"},{"chainId":1,"address":"0x49614661737efbfc6a102efaeefdc8e197f7cc0e","name":"Escroco Emerald","symbol":"ESCE","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1836/thumb/escorco_emerald.png?1547036149"},{"chainId":1,"address":"0x269616d549d7e8eaa82dfb17028d0b212d11232a","name":"Punk Vault NFTX ","symbol":"PUNK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17018/thumb/Punk.png?1626086346"},{"chainId":1,"address":"0xdc47f2ba852669b178699449e50682d6ceaf8c07","name":"Ston","symbol":"STON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13001/thumb/ston-v2-200x200.png?1604284194"},{"chainId":1,"address":"0xf629cbd94d3791c9250152bd8dfbdf380e2a3b9c","name":"Enjin Coin","symbol":"ENJ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1102/thumb/enjin-coin-logo.png?1547035078"},{"chainId":1,"address":"0x64b986211c0cc675143f895c437b79c3cadf364a","name":"Grapefruit Coin","symbol":"GRPFT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/17002/thumb/logo-square-1.png?1626061191"},{"chainId":1,"address":"0x226e390751a2e22449d611bac83bd267f2a2caff","name":"STVKE","symbol":"STV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13264/thumb/stvke_network.png?1606813287"},{"chainId":1,"address":"0x29257908879c5792f1bb25449a7209205434dc3f","name":"Zbank Token","symbol":"ZBK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11820/thumb/zbank2.png?1594681143"},{"chainId":1,"address":"0xfb19c03a02a519a44542343803f3d42578cbc243","name":"CR Coin","symbol":"CRC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11883/thumb/pxXMTqA.png?1595741034"},{"chainId":1,"address":"0x047686fb287e7263a23873dea66b4501015a2226","name":"Blockchain Cuties U","symbol":"CUTE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8328/thumb/bnLvIEl1_400x400.jpg?1557533240"},{"chainId":1,"address":"0x054bd236b42385c938357112f419dc5943687886","name":"Heavens Gate","symbol":"HATE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12740/thumb/BUQoiaJY_400x400.png?1602630549"},{"chainId":1,"address":"0x4b34c0cbeef271f895d339c5f76322d71a60782b","name":"Yearn Finance Manag","symbol":"YEFIM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12836/thumb/jOVGT0Y.png?1602886889"},{"chainId":1,"address":"0xe081b71ed098fbe1108ea48e235b74f122272e68","name":"GOLD","symbol":"GOLD","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7118/thumb/rRwrrUW7_400x400.jpg?1547043615"},{"chainId":1,"address":"0x1df7aa5551e801e280007dc0fc0454e2d06c1a89","name":"BKEX Chain","symbol":"BKK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7734/thumb/logo_%281%29.png?1617965603"},{"chainId":1,"address":"0xfe5f141bf94fe84bc28ded0ab966c16b17490657","name":"LibraToken","symbol":"LBA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3673/thumb/libra-credit.png?1547975828"},{"chainId":1,"address":"0x34bdf48a8f753de4822a6cfb1fee275f9b4d662e","name":"FACTS","symbol":"BKC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8461/thumb/sFNOkmVx_400x400.jpg?1558690624"},{"chainId":1,"address":"0x6c862f803ff42a97d4a483ab761256ad8c90f4f8","name":"Elis","symbol":"XLS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13613/thumb/Elis-Symbol-Green.png?1610285892"},{"chainId":1,"address":"0x7ed621d37e30214d5e197454f08b1c5c9558517a","name":"DEVA Token","symbol":"DEVA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13845/thumb/200x200_%2810%29.png?1612313594"},{"chainId":1,"address":"0xbdbc2a5b32f3a5141acd18c39883066e4dab9774","name":"Emirex Token","symbol":"EMRX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9507/thumb/download.png?1568589320"},{"chainId":1,"address":"0xa3d93c0616dbc31fef1e112c7665a4ba4ddbf0be","name":"Prime Whiterock Com","symbol":"PWC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14228/thumb/156979798_133690605324377_5780181066455556577_o.png?1615169027"},{"chainId":1,"address":"0x9c197c4b58527faaab67cb35e3145166b23d242e","name":"HashNet BitEco","symbol":"HNB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8126/thumb/GyEELaxS_400x400.jpg?1555226121"},{"chainId":1,"address":"0x78e29d35573bea6265aedfcb9f45481b717ebfde","name":"LINK Profit Taker S","symbol":"LINKPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11460/thumb/link_profit_taker_set.png?1590141836"},{"chainId":1,"address":"0xe3c864307b5592404431649de541c259497e2bd1","name":"LoveChain","symbol":"LOV","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13023/thumb/the_love_chain_logo.png?1604398250"},{"chainId":1,"address":"0xbc5991ccd8caceba01edc44c2bb9832712c29cab","name":"Unagii USD Coin","symbol":"UUSDC","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/13781/thumb/uUSDC.png?1611729843"},{"chainId":1,"address":"0x6d728ff862bfe74be2aba30537e992a24f259a22","name":"Salient Investment ","symbol":"SIH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15815/thumb/SIH-Logo250x250.png?1621980958"},{"chainId":1,"address":"0x2dcd9b1a7ed408ff48bd4918a1f9c0535dc54ead","name":"WeSing Coin","symbol":"WSC","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/7645/thumb/wesingcoin.png?1548923241"},{"chainId":1,"address":"0x02e88a689fdfb920e7aa6174fb7ab72add3c5694","name":"1X Short Bitcoin Ca","symbol":"BCHHEDGE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10332/thumb/683JEXMN_400x400.png?1596707014"},{"chainId":1,"address":"0x220b71671b649c03714da9c621285943f3cbcdc6","name":"TosDis","symbol":"DIS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13745/thumb/Tosdis-black.png?1611379744"},{"chainId":1,"address":"0x0ace32f6e87ac1457a5385f8eb0208f37263b415","name":"Habitat","symbol":"HBT","decimals":10,"logoURI":"https://assets.coingecko.com/coins/images/14456/thumb/habitat-logo.png?1625495825"},{"chainId":1,"address":"0xa91464abd4625a23ab719e3f0fce84dadd54e546","name":"Inoovi","symbol":"IVI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10372/thumb/Bvp7U25U_400x400.jpg?1578674638"},{"chainId":1,"address":"0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359","name":"Sai","symbol":"SAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1442/thumb/dai.png?1547035520"},{"chainId":1,"address":"0xbb0e17ef65f82ab018d8edd776e8dd940327b28b","name":"Axie Infinity","symbol":"AXS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13029/thumb/axie_infinity_logo.png?1604471082"},{"chainId":1,"address":"0x43afc9058a3debf37eadf99138e449ce8a480a8a","name":"STAMP","symbol":"STAMP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10971/thumb/coin_%281%29.png?1586742472"},{"chainId":1,"address":"0x5538ac3ce36e73bb851921f2a804b4657b5307bf","name":"Wrapped Shuttleone","symbol":"WSZO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14094/thumb/EMQvEJSY_400x400.png?1614245757"},{"chainId":1,"address":"0xc52c326331e9ce41f04484d3b5e5648158028804","name":"Unizen","symbol":"ZCX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14830/thumb/7xjpHaG.png?1618564961"},{"chainId":1,"address":"0x75387e1287dd85482ab66102da9f6577e027f609","name":"Mindsync","symbol":"MAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7581/thumb/mindsync-logo.jpg?1548636745"},{"chainId":1,"address":"0x2b6ff53fc2493ccd5202d80a6c439741414c5ff2","name":"Tweebaa","symbol":"TWEE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10419/thumb/tweeba.png?1616039461"},{"chainId":1,"address":"0x86807da5b92d31f67e128771cacb85f3579646ea","name":"3X Short TRX Token","symbol":"TRXBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10234/thumb/683JEXMN_400x400_%281%29.png?1576618946"},{"chainId":1,"address":"0x88bd6efe33bc82860278c044efa33364c6285032","name":"PegShares","symbol":"PEGS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13675/thumb/pegshare.png?1610705105"},{"chainId":1,"address":"0xe1a4c5bbb704a92599fedb191f451e0d3a1ed842","name":"PolkaDomain","symbol":"NAME","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14832/thumb/name.png?1618580733"},{"chainId":1,"address":"0x68a3637ba6e75c0f66b61a42639c4e9fcd3d4824","name":"MoonSwap","symbol":"MOON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12441/thumb/moon.jpg?1599880968"},{"chainId":1,"address":"0x72b19558b05706708b612fbbe86b71446eafc002","name":"Unicly Formula REVV","symbol":"UREVV","decimals":14,"logoURI":"https://assets.coingecko.com/coins/images/15678/thumb/urevv.jpg?1621499895"},{"chainId":1,"address":"0x2fcee080ceb4ff95fcdc8a03052cd85e51ecc69c","name":"AlgOil","symbol":"AGOL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14850/thumb/cache_956492647.png?1618796513"},{"chainId":1,"address":"0x8933ea1ce67b946bdf2436ce860ffbb53ce814d2","name":"LINK ETH RSI Ratio ","symbol":"LINKETHRSI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10927/thumb/linketh_rsi_ratio.png?1585894605"},{"chainId":1,"address":"0xec7d3e835da3f6118079fa9a236b267d044fd7ca","name":"Crypto Rewards Stud","symbol":"CRS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13252/thumb/Circle_%28JPG%29.jpg?1612947294"},{"chainId":1,"address":"0x1efb2286bf89f01488c6b2a22b2556c0f45e972b","name":"Moon YFI","symbol":"MYFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12506/thumb/moonyfi_logo.jpg?1600316838"},{"chainId":1,"address":"0x99c6e435ec259a7e8d65e1955c9423db624ba54c","name":"Finminity","symbol":"FMT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14696/thumb/finminity.png?1617834914"},{"chainId":1,"address":"0xb73404280697080da0116cfac0e577fafdf44b37","name":"Quick Mining","symbol":"QM","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/15916/thumb/qm.PNG?1622427094"},{"chainId":1,"address":"0x7697b462a7c4ff5f8b55bdbc2f4076c2af9cf51a","name":"Sarcophagus","symbol":"SARCO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15091/thumb/E2S2-CcUcAAyNxD.jpeg?1622519884"},{"chainId":1,"address":"0xa47c8bf37f92abed4a126bda807a7b7498661acd","name":"TerraUSD","symbol":"UST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12681/thumb/UST.png?1601612407"},{"chainId":1,"address":"0xfd6c31bb6f05fc8db64f4b740ab758605c271fd8","name":"Contracoin","symbol":"CTCN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10801/thumb/Contracoin-symbol.png?1583881685"},{"chainId":1,"address":"0x84ba4aecfde39d69686a841bab434c32d179a169","name":"Method Finance","symbol":"MTHD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14619/thumb/mthd.PNG?1617262620"},{"chainId":1,"address":"0x9b91ef0d78488c5ef4c509eb7a73f7d8ca650ce4","name":"Africa To Mars","symbol":"ATM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15925/thumb/atm.PNG?1622433381"},{"chainId":1,"address":"0x95ad61b0a150d79219dcf64e1e6cc01f0b64c4ce","name":"Shiba Inu","symbol":"SHIB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11939/thumb/shiba.png?1622619446"},{"chainId":1,"address":"0x12f649a9e821f90bb143089a6e56846945892ffb","name":"Hyprr Howdoo ","symbol":"UDOO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3078/thumb/howdoo.png?1547744057"},{"chainId":1,"address":"0x3af5ba94c29a8407785f5f6d90ef5d69a8eb2436","name":"Unagii Wrapped Bitc","symbol":"UWBTC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/14625/thumb/uBTC.png?1617294190"},{"chainId":1,"address":"0xf8c595d070d104377f58715ce2e6c93e49a87f3c","name":"DACC","symbol":"DACC","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/4781/thumb/dacc-token.png?1547040122"},{"chainId":1,"address":"0xbe30f684d62c9f7883a75a29c162c332c0d98f23","name":"Global Human Trust","symbol":"GHT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12040/thumb/WechatIMG6648.png?1596700737"},{"chainId":1,"address":"0xdb69c3f8977f78952303987e87153c1988cf65a9","name":"PugLife","symbol":"PUGL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16105/thumb/puglife.png?1625756103"},{"chainId":1,"address":"0x67a9099f0008c35c61c00042cd9fb03684451097","name":"Game Stars","symbol":"GST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4075/thumb/game-stars.png?1548126796"},{"chainId":1,"address":"0xe0d95530820aafc51b1d98023aa1ff000b78d8b2","name":"PressOne","symbol":"PRS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2641/thumb/pressone.png?1547036817"},{"chainId":1,"address":"0x6f0f28ceee6ae686ee0f939375674c01b156365a","name":"Elena Protocol","symbol":"ELENA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15078/thumb/elena.png?1619648619"},{"chainId":1,"address":"0xf2354f740f31704820f6fcfba70b9da065459b62","name":"Istardust","symbol":"ISDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12568/thumb/istardust.png?1600840530"},{"chainId":1,"address":"0x666a64f5567c3145fba7ca9ef73648cd4fa2008f","name":"Energoncoin","symbol":"TFG1","decimals":8},{"chainId":1,"address":"0xea3cb156745a8d281a5fc174186c976f2dd04c2e","name":"Nobrainer Finance","symbol":"BRAIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12778/thumb/brain_logo.jpg?1602493938"},{"chainId":1,"address":"0xf3924df14812b3d3db29124aa9da4353ed5e04a3","name":"Easticoin","symbol":"ESTI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12988/thumb/EST2.png?1604093746"},{"chainId":1,"address":"0x1da87b114f35e1dc91f72bf57fc07a768ad40bb0","name":"Equalizer","symbol":"EQZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14741/thumb/X2p5mb2f_400x400.png?1618005664"},{"chainId":1,"address":"0x47eb79217f42f92dbd741add1b1a6783a2c873cf","name":"Bast","symbol":"BAST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12289/thumb/bast_logo.png?1598865533"},{"chainId":1,"address":"0x8dd4228605e467671941ffb4cae15cf7959c8d9d","name":"Ziticoin","symbol":"ZITI","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/15255/thumb/logo200x200_%284%29.png?1620267412"},{"chainId":1,"address":"0xeabb8996ea1662cad2f7fb715127852cd3262ae9","name":"Connect Financial","symbol":"CNFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13592/thumb/Connect_Financial.png?1609993203"},{"chainId":1,"address":"0x9ea1ae46c15a4164b74463bc26f8aa3b0eea2e6e","name":"MU DANK","symbol":"DANK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14423/thumb/photo_2021-03-31_16-05-34.jpg?1617359813"},{"chainId":1,"address":"0x5aaefe84e0fb3dd1f0fcff6fa7468124986b91bd","name":"Evedo","symbol":"EVED","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7721/thumb/Variations-09.png?1549979992"},{"chainId":1,"address":"0xb4272071ecadd69d933adcd19ca99fe80664fc08","name":"CryptoFranc","symbol":"XCHF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8465/thumb/WhuiuJBc_400x400.jpg?1558699947"},{"chainId":1,"address":"0x974c98bc2e82fa18de92b7e697a1d9bd25682e80","name":"3X Long Ethereum Cl","symbol":"ETCBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10326/thumb/683JEXMN_400x400_%281%29.png?1578050594"},{"chainId":1,"address":"0xe5aee163513119f4f750376c718766b40fa37a5f","name":"Frozencoin Network","symbol":"FZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8660/thumb/TytBk3jpXDsoyetqedmH7u_OOTG1WE8jTNLCkeE80GkC3_O716EOPdHs6ZK337RgqOkcpJukBJjT0pdgOX5IXUp2FZu2vzQ2CMyR0jGsgjCPFAYVi1X1ocIBlxa7TKSaazQQEUFkVnTuzjaDHtpwf6EYNrVV-dtpKx6aT0c0Jqe8bVPtoZN9i93xJTgAyX3aQs4YVmPVUZtKfopqR.jpg?1560155321"},{"chainId":1,"address":"0xd811e485cb4ab1fad56233de4464fb5d1c9f3e99","name":"Yearn Global","symbol":"YG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13034/thumb/tyrQieZZ_400x400.png?1604539997"},{"chainId":1,"address":"0xb5943c96b28570d63512dda2069045b304994daf","name":"Tugz","symbol":"TUGZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14650/thumb/200tugz.png?1617511487"},{"chainId":1,"address":"0x5a80b50a0420a2507e33508a93e0aa037fc90636","name":"Dessfi","symbol":"DESS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14764/thumb/TgpqYcAO_400x400.png?1618285579"},{"chainId":1,"address":"0xca2796f9f61dc7b238aab043971e49c6164df375","name":"Yggdrash","symbol":"YEED","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3251/thumb/ygg-logo-green.png?1547037776"},{"chainId":1,"address":"0x4ff5253e2304e3f5ed6547ac5d9952a62b91e3e8","name":"Stabinol","symbol":"STOL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14166/thumb/stol_icon.png?1614748492"},{"chainId":1,"address":"0x4e3bddd468abfc6c88bc25daa5d894380ced5bc8","name":"NSS Coin","symbol":"NSS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9501/thumb/adddcf817f.png?1568108247"},{"chainId":1,"address":"0x81dbc1c8e40c3095071949eda9800c2209a7279a","name":"Pupper","symbol":"PUP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16038/thumb/puppy.PNG?1622680387"},{"chainId":1,"address":"0x3d9ac8e7a9c9be11dfac1677dda901e28d44527f","name":"Palace","symbol":"PAA","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11141/thumb/da443cb2601f5fbdab9a2e176d62d6ce.png?1588911369"},{"chainId":1,"address":"0xe6be436df1ff96956dfe0b2b77fab84ede30236f","name":"Revelation coin","symbol":"REV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7855/thumb/Db7wCd0.jpg?1551171100"},{"chainId":1,"address":"0xa487bf43cf3b10dffc97a9a744cbb7036965d3b9","name":"Deri Protocol","symbol":"DERI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13931/thumb/deri_logo.png?1612916502"},{"chainId":1,"address":"0x4057db5bd9f67a566aa10e5587b1a964affc6a16","name":"Truefeedback Token","symbol":"TFBX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8842/thumb/5rd7a55q_400x400.png?1562902557"},{"chainId":1,"address":"0x7b7983967409fce461ea8bbdf9ed37631b1d59c9","name":"KPOP Coin","symbol":"KPOP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15923/thumb/kpop.PNG?1622431964"},{"chainId":1,"address":"0x38405fa410c6eba342f9eb5ac66b2aaf6498c8e9","name":"Vectoraic","symbol":"VT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4170/thumb/vt.png?1547039433"},{"chainId":1,"address":"0x66e7ce35578a37209d01f99f3d2ff271f981f581","name":"PactSwap","symbol":"PACT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15265/thumb/pact.PNG?1620281262"},{"chainId":1,"address":"0x170b275ced089fffaebfe927f445a350ed9160dc","name":"OWNDATA","symbol":"OWN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/3903/thumb/owndata.png?1548330403"},{"chainId":1,"address":"0x0f5d2fb29fb7d3cfee444a200298f468908cc942","name":"Decentraland","symbol":"MANA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/878/thumb/decentraland-mana.png?1550108745"},{"chainId":1,"address":"0xd3ec111e4e33c0a1c32e3ad0be976214d30dc37e","name":"Universal Marketing","symbol":"UMC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11092/thumb/unnamed.png?1588213494"},{"chainId":1,"address":"0x4a621d9f1b19296d1c0f87637b3a8d4978e9bf82","name":"CyberFM","symbol":"CYFM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5476/thumb/cyberfm.png?1547041216"},{"chainId":1,"address":"0x488e0369f9bc5c40c002ea7c1fe4fd01a198801c","name":"Golff","symbol":"GOF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12445/thumb/_x-AmLBv_400x400.jpg?1599902833"},{"chainId":1,"address":"0xc242eb8e4e27eae6a2a728a41201152f19595c83","name":"EcoFi","symbol":"ECO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14803/thumb/logo_-_2021-04-16T081409.817.png?1618532056"},{"chainId":1,"address":"0x25c7b64a93eb1261e130ec21a3e9918caa38b611","name":"Wrapped Virgin Gen ","symbol":"WVG0","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12875/thumb/wvg0.png?1603211534"},{"chainId":1,"address":"0x429876c4a6f89fb470e92456b8313879df98b63c","name":"Cryption Network","symbol":"CNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16171/thumb/Cryption_Logo_Gradient_White_Text.png?1623191284"},{"chainId":1,"address":"0x84c722e6f1363e8d5c6db3ea600bef9a006da824","name":"Misbloc","symbol":"MSB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13021/thumb/xREV4lXV.png?1604396822"},{"chainId":1,"address":"0x749826f1041caf0ea856a4b3578ba327b18335f8","name":"TIG Token","symbol":"TIG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1903/thumb/tigereum.png?1548758748"},{"chainId":1,"address":"0x0bf6261297198d91d4fa460242c69232146a5703","name":"Libera","symbol":"LIB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12211/thumb/19nmRSeR_400x400.jpg?1598234697"},{"chainId":1,"address":"0xac51066d7bec65dc4589368da368b212745d63e8","name":"My Neighbor Alice","symbol":"ALICE","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/14375/thumb/alice_logo.jpg?1615782968"},{"chainId":1,"address":"0x174afe7a032b5a33a3270a9f6c30746e25708532","name":"Humanscape","symbol":"HUM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4243/thumb/Webp.net-resizeimage_%2836%29.png?1547039574"},{"chainId":1,"address":"0x3aef8e803bd9be47e69b9f36487748d30d940b96","name":"Vesta","symbol":"VESTA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12276/thumb/t693cWC.png?1598736747"},{"chainId":1,"address":"0x1f0f468ee03a6d99cd8a09dd071494a83dc1c0e5","name":"SmartX","symbol":"SAT","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/11788/thumb/FZf8lPa3_400x400.jpg?1594018352"},{"chainId":1,"address":"0xc92276872cd1907d2e00b58a81a9bbd275b0a4ba","name":"Collateral Pay Gove","symbol":"COLLG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17026/thumb/collg.PNG?1626138703"},{"chainId":1,"address":"0xc55c2175e90a46602fd42e931f62b3acc1a013ca","name":"Mogul Productions","symbol":"STARS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14975/thumb/STARS_LOGO_PNG.png?1619214520"},{"chainId":1,"address":"0x0329d23fc7b1b1e6cca57afa3f0090f1189069e8","name":"LINK RSI Crossover ","symbol":"LINKRSICO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10723/thumb/link_rsi_set.png?1582614765"},{"chainId":1,"address":"0xa0d440c6da37892dc06ee7930b2eede0634fd681","name":"Masternet","symbol":"MASH","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5879/thumb/masternet.png?1547978307"},{"chainId":1,"address":"0x697ef32b4a3f5a4c39de1cb7563f24ca7bfc5947","name":"Insula","symbol":"ISLA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10884/thumb/isla.PNG?1585522028"},{"chainId":1,"address":"0xeaccb6e0f24d66cf4aa6cbda33971b9231d332a1","name":"Polyient Games Gove","symbol":"PGT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12709/thumb/Polyent.png?1601897060"},{"chainId":1,"address":"0xcc8fa225d80b9c7d42f96e9570156c65d6caaa25","name":"Smooth Love Potion","symbol":"SLP","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/10366/thumb/SLP.png?1578640057"},{"chainId":1,"address":"0x0452aed878805514e28fb5bd0b56bef92176e32a","name":"BPOP","symbol":"BPOP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9701/thumb/bpop.PNG?1570916211"},{"chainId":1,"address":"0xcfb152e5b93fc2c9906d4ff41fc8407dfa5e8851","name":"NTON","symbol":"NTON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16307/thumb/NTON.png?1623723151"},{"chainId":1,"address":"0x26cf82e4ae43d31ea51e72b663d26e26a75af729","name":"Moonbase","symbol":"MBBASED","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12694/thumb/mb-logo.png?1601715131"},{"chainId":1,"address":"0x035bfe6057e15ea692c0dfdcab3bb41a64dd2ad4","name":"Universal Liquidity","symbol":"ULU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12376/thumb/ulu_finance_logo.ico?1599444401"},{"chainId":1,"address":"0xf091cf09c51811819db705710e9634b8bf18f164","name":"Couchain","symbol":"COU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4529/thumb/couchain.png?1547039825"},{"chainId":1,"address":"0x951301a2bbce3d357785ba1e13ec8f42322252b8","name":"Cifculation","symbol":"CLC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8678/thumb/logo_%2825%29.png?1560221363"},{"chainId":1,"address":"0x86eb791495be777db763142a2c547d1112554fb8","name":"3X Short Huobi Toke","symbol":"HTBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10430/thumb/683JEXMN_400x400.png?1579276187"},{"chainId":1,"address":"0x976091738973b520a514ea206acdd008a09649de","name":"Mishka Token","symbol":"MISHKA","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16889/thumb/499f6eef-a43a-4a39-a928-c14e11dd80b1.png?1625549827"},{"chainId":1,"address":"0x3678d8cc9eb08875a3720f34c1c8d1e1b31f5a11","name":"Obee Network","symbol":"OBEE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12326/thumb/ObeeNetwork.png?1599099616"},{"chainId":1,"address":"0x0ebd5ec91680d3b0cedbb1d5bb61851154d3edb6","name":"Token of Power","symbol":"TOP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14623/thumb/top.jpeg?1617279944"},{"chainId":1,"address":"0x3f09400313e83d53366147e3ea0e4e2279d80850","name":"Kush Finance","symbol":"KSEED","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12545/thumb/kush.finance-512.png?1600844515"},{"chainId":1,"address":"0xde25486ccb4588ce5d9fb188fb6af72e768a466a","name":"Contraction Dynamic","symbol":"CDSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14937/thumb/T5QFuTF2_400x400.png?1619080314"},{"chainId":1,"address":"0x4e98493920b16dd6642e9d48497c8d0a49150f6f","name":"RealT Token 13991 ","symbol":"REALTOKEN-S-13991-W","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16662/thumb/Warwick-hero.jpeg?1624624485"},{"chainId":1,"address":"0x3f84c4184b35c488f7fe4a12469610c9b1cb03c9","name":"PoolStake","symbol":"PSK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13285/thumb/psk_logo.png?1606984935"},{"chainId":1,"address":"0xbc647aad10114b89564c0a7aabe542bd0cf2c5af","name":"IONChain","symbol":"IONC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6572/thumb/3PD7ycbU_400x400.jpg?1547042781"},{"chainId":1,"address":"0xdff3d69a00759449f091561a0af99a218982bd7f","name":"Our Pay","symbol":"OUR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13936/thumb/Our_pay_logo.png?1612943572"},{"chainId":1,"address":"0x2a039b1d9bbdccbb91be28691b730ca893e5e743","name":"Rentible","symbol":"RNB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15176/thumb/Rentible-Token-Logo.png?1620025850"},{"chainId":1,"address":"0x4e30910845f0cb4f66781b35c832eafc09774022","name":"Mars Token","symbol":"OMT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16506/thumb/OMT.jpeg?1624279796"},{"chainId":1,"address":"0x13b1e6b036ac0a1495f876313f92a0706cc10871","name":"ShipItPro","symbol":"SHPP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14687/thumb/photo_2020-12-28_16-37-33.jpg?1617785737"},{"chainId":1,"address":"0x316b13b951efe25aad1cb565385b23869a7d4c48","name":"ETH 26 EMA Crossove","symbol":"ETHEMAAPY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10600/thumb/eth-26-day-exponential-moving-average-set-ctoken.png?1580968470"},{"chainId":1,"address":"0xffed56a180f23fd32bc6a1d8d3c09c283ab594a8","name":"Freeliquid","symbol":"FL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13698/thumb/freeliquid_logo.png?1610980336"},{"chainId":1,"address":"0x60a16b9efd33bb45c18833aed45ca66045b3b714","name":"i9X Coin","symbol":"I9X","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/14124/thumb/unnamed_%282%29.jpg?1614565794"},{"chainId":1,"address":"0x8a4491936a8e5a1662c8a755932b83dbe9634b0d","name":"One Genesis","symbol":"OG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9916/thumb/og.PNG?1573457290"},{"chainId":1,"address":"0x336c21557185079f42f6ffc098ab572c87ae9435","name":"BigBoys Industry","symbol":"BBI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14069/thumb/Untitled-design-11-removebg-preview.png?1614146979"},{"chainId":1,"address":"0x6a625ddb2e2a2de0257c5129364dd80bb4afa3b9","name":"IKOMP","symbol":"IKOMP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14384/thumb/logo_ikomp1.png?1615789490"},{"chainId":1,"address":"0x01cc4151fe5f00efb8df2f90ff833725d3a482a3","name":"SPECTRUM","symbol":"SPT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7688/thumb/SPT-Logo-200x200.png?1549596154"},{"chainId":1,"address":"0x3a43a04d80f9881d88080bf9fa8bb720afb6c966","name":"3X Long Stellar Tok","symbol":"XLMBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13334/thumb/assets_coingecko_com-ftt.jpg?1607566862"},{"chainId":1,"address":"0x8c9e4cf756b9d01d791b95bc2d0913ef2bf03784","name":"AEROTOKEN","symbol":"AET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9772/thumb/sVM73x16_400x400.jpg?1571707385"},{"chainId":1,"address":"0x0955a73d014f0693ac7b53cfe77706dab02b3ef9","name":"Lady Luck","symbol":"LUCK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15342/thumb/luck.PNG?1620615526"},{"chainId":1,"address":"0x177ba0cac51bfc7ea24bad39d81dcefd59d74faa","name":"KittenFinance","symbol":"KIF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12340/thumb/SnQPkABT_400x400.png?1599173267"},{"chainId":1,"address":"0x752efadc0a7e05ad1bcccda22c141d01a75ef1e4","name":"CompliFi","symbol":"COMFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15006/thumb/complifi.PNG?1619413977"},{"chainId":1,"address":"0x28a06c02287e657ec3f8e151a13c36a1d43814b0","name":"BondApp tit Governa","symbol":"BAG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14724/thumb/BAG2x.png?1618568573"},{"chainId":1,"address":"0xc00e94cb662c3520282e6f5717214004a7f26888","name":"Compound","symbol":"COMP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10775/thumb/COMP.png?1592625425"},{"chainId":1,"address":"0x6b40d317bc1de4b0938519ac707ae36464f49171","name":"EVERY ORIGINAL","symbol":"EVEO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8651/thumb/EVERY_ORIGINAL.png?1560148541"},{"chainId":1,"address":"0x00873432f09143556cc156d3cf971e4c8f68dace","name":"FND Ottho Heldrings","symbol":"FND1066XT31D","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/16545/thumb/Stablecoin.png?1624416720"},{"chainId":1,"address":"0x6e36556b3ee5aa28def2a8ec3dae30ec2b208739","name":"BUILD Finance","symbol":"BUILD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12380/thumb/build.PNG?1599463828"},{"chainId":1,"address":"0x33811d4edbcaed10a685254eb5d3c4e4398520d2","name":"YFE Money","symbol":"YFE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12644/thumb/logo-round.png?1601373377"},{"chainId":1,"address":"0x4bd70556ae3f8a6ec6c4080a0c327b24325438f3","name":"Hxro","symbol":"HXRO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7805/thumb/Hxro_Profile_Transparent.png?1622443308"},{"chainId":1,"address":"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48","name":"USD Coin","symbol":"USDC","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/6319/thumb/USD_Coin_icon.png?1547042389"},{"chainId":1,"address":"0x29c56e7cb9c840d2b2371b17e28bab44ad3c3ead","name":"EsportsPro","symbol":"ESPRO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14187/thumb/logo.jpg?1614830245"},{"chainId":1,"address":"0xab51e836bdcbc7cc06d926c50d88328f1bb17148","name":"World Credit Diamon","symbol":"WCDC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7649/thumb/seHi91g1_400x400.jpg?1548930150"},{"chainId":1,"address":"0x2ec75589856562646afe393455986cad26c4cc5f","name":"Interop","symbol":"TROP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13763/thumb/Interop.jpg?1611631842"},{"chainId":1,"address":"0xd56dac73a4d6766464b38ec6d91eb45ce7457c44","name":"Panvala Pan","symbol":"PAN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9543/thumb/pan-logo.png?1568674599"},{"chainId":1,"address":"0x1ee1c46251b811075fd480fb64197f4e49c37ee0","name":"IAI Token","symbol":"IAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14678/thumb/5ffd226db2d26.png?1617707349"},{"chainId":1,"address":"0x7995ab36bb307afa6a683c24a25d90dc1ea83566","name":"HitChain","symbol":"HIT","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/5555/thumb/hitchain.png?1547041361"},{"chainId":1,"address":"0x17eb50fdd2995696ee82912a80a9766fcbb0ecca","name":"Dogen Finance","symbol":"DOGEN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15454/thumb/dogen_logo.png?1620887346"},{"chainId":1,"address":"0xd3deff001ef67e39212f4973b617c2e684fa436c","name":"484 Fund","symbol":"ERROR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15071/thumb/error.png?1619623078"},{"chainId":1,"address":"0x786448439d9401e0a8427acf7ca66a5114eb2368","name":"Dipper","symbol":"DIP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13498/thumb/200x200-format%C4%B1-arka-fon-yok_%281%29.png?1609194317"},{"chainId":1,"address":"0x97b65710d03e12775189f0d113202cc1443b0aa2","name":"AstroElon","symbol":"ELONONE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16082/thumb/AstroElon.png?1622791921"},{"chainId":1,"address":"0x739763a258640919981f9ba610ae65492455be53","name":"Node Runners","symbol":"NDR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13400/thumb/ndr.jpg?1608172954"},{"chainId":1,"address":"0x14da7b27b2e0fedefe0a664118b0c9bc68e2e9af","name":"Blockchain Cuties U","symbol":"BCUG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14425/thumb/bcug_logo.png?1616022820"},{"chainId":1,"address":"0x32c868f6318d6334b2250f323d914bc2239e4eee","name":"N3RD Finance","symbol":"N3RDZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13389/thumb/logo.png?1608195840"},{"chainId":1,"address":"0xfdb15e5e6799be72798b1ccfaecbf186bf73a0c4","name":"NitroEX","symbol":"NTX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13976/thumb/ntx-icon.png?1613435774"},{"chainId":1,"address":"0x0a2a86bb0bee386a11291d5d01e89cdfb565df5d","name":"Bitcoin Bull","symbol":"BITB","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/7250/thumb/UbGPtAkD_400x400.jpg?1547043852"},{"chainId":1,"address":"0xf6650117017ffd48b725b4ec5a00b414097108a7","name":"Xido Finance","symbol":"XIDO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16161/thumb/KJw4clj.png?1623141959"},{"chainId":1,"address":"0x0ef3b2024ae079e6dbc2b37435ce30d2731f0101","name":"UNIFI DeFi","symbol":"UNIFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12533/thumb/unifi_defi_logo.jpg?1600531278"},{"chainId":1,"address":"0x6e10aacb89a28d6fa0fe68790777fec7e7f01890","name":"SAV3","symbol":"SAV3","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13132/thumb/sav3_logo.png?1605536471"},{"chainId":1,"address":"0xdbf637f78624f896b92f801e81f6031b7865ed20","name":"3X Short BitMax Tok","symbol":"BTMXBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10257/thumb/683JEXMN_400x400_%281%29.png?1576677290"},{"chainId":1,"address":"0xdae6f68da3bab6866742a7f4050366f6ac48760d","name":"GUSS ONE","symbol":"GUSS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8509/thumb/gussone_mid.png?1559030931"},{"chainId":1,"address":"0xf6832ea221ebfdc2363729721a146e6745354b14","name":"FRMx Token","symbol":"FRMX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13082/thumb/New_Project_%2862%29.png?1609811248"},{"chainId":1,"address":"0x084da5a9c0e3f086532b98d8568432349b89d9df","name":"FUUPAY","symbol":"FPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12089/thumb/cab76be67ea99.png?1597018998"},{"chainId":1,"address":"0xefcec6d87e3ce625c90865a49f2b7482963d73fe","name":"Fetish Coin","symbol":"FETISH","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/9174/thumb/J_GljyDh_400x400.jpg?1564992660"},{"chainId":1,"address":"0x2c82c73d5b34aa015989462b2948cd616a37641f","name":"Spectre ai Utility ","symbol":"SXUT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2551/thumb/spectre-utility.png?1547036668"},{"chainId":1,"address":"0xf88951d7b676798705fd3a362ba5b1dbca2b233b","name":"Piction Network","symbol":"PXL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7870/thumb/4091.png?1562798644"},{"chainId":1,"address":"0x69beab403438253f13b6e92db91f7fb849258263","name":"Neurotoken","symbol":"NTK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3028/thumb/neurotoken.png?1547037334"},{"chainId":1,"address":"0xa14ea0e11121e6e951e87c66afe460a00bcd6a16","name":"IdleDAI Risk Adjus","symbol":"IDLEDAISAFE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11929/thumb/idledai-safe.png?1596263241"},{"chainId":1,"address":"0xa31f7a32db329f270a0e6b59558823e64d8ef0a6","name":"Q8E20 Token","symbol":"Q8E20","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10427/thumb/F366Xq9.png?1579215048"},{"chainId":1,"address":"0xa0bb0027c28ade4ac628b7f81e7b93ec71b4e020","name":"Rug Proof","symbol":"RPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13896/thumb/1cu6Bea.png?1612674739"},{"chainId":1,"address":"0x11afe7fa792589dd1236257f99ba09f510460ad9","name":"LNKO Token","symbol":"LNKO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9199/thumb/logo_%289%29.png?1565077907"},{"chainId":1,"address":"0x14ddda446688b73161aa1382f4e4343353af6fc8","name":"FXPay","symbol":"FXP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/4928/thumb/hiaLKeu4_400x400.jpg?1547040356"},{"chainId":1,"address":"0x1a5f9352af8af974bfc03399e3767df6370d82e4","name":"OWL","symbol":"OWL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11149/thumb/gnosis-owl_32.png?1589057849"},{"chainId":1,"address":"0xfee2fa52de307316d9d47ffe3781d4cba2c4f6fd","name":"Arthur Chain","symbol":"ARC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9364/thumb/download_%283%29.png?1566547313"},{"chainId":1,"address":"0x953e22945b416730bad05009af05b420e598e412","name":"GameXCoin","symbol":"GXC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5633/thumb/GameXCoin.png?1559025856"},{"chainId":1,"address":"0x31024a4c3e9aeeb256b825790f5cb7ac645e7cd5","name":"Xiotri","symbol":"XIOT","decimals":3,"logoURI":"https://assets.coingecko.com/coins/images/12182/thumb/xiot_logo_512x512.png?1601775223"},{"chainId":1,"address":"0x6d52dfefb16bb9cdc78bfca09061e44574886626","name":"CPUcoin","symbol":"CPU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9544/thumb/uaz.ms.png?1624024119"},{"chainId":1,"address":"0xf5d0fefaab749d8b14c27f0de60cc6e9e7f848d1","name":"YFARM Token","symbol":"YFARM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12475/thumb/yffs.jpg?1600136951"},{"chainId":1,"address":"0xd31695a1d35e489252ce57b129fd4b1b05e6acac","name":"TOKPIE","symbol":"TKP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3731/thumb/tokpie-200x200.png?1562207865"},{"chainId":1,"address":"0xc8cac7672f4669685817cf332a33eb249f085475","name":"LivenPay","symbol":"LVN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9554/thumb/8PgKjhJn_400x400.jpg?1568837435"},{"chainId":1,"address":"0x5330a5805b9db68ebcf5247bbc9097163c1c2442","name":"Exchange Payment Co","symbol":"EXP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12516/thumb/exp_logo_03.png?1600382400"},{"chainId":1,"address":"0x86d3f38edaf7e7959e5d8e6aea5ad3187b78c346","name":"MTI Finance","symbol":"MTI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13061/thumb/mti.png?1605153678"},{"chainId":1,"address":"0x986ee2b944c42d017f52af21c4c69b84dbea35d8","name":"BitMart Token","symbol":"BMX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5236/thumb/bitmart-token.png?1548835017"},{"chainId":1,"address":"0x5166d4ce79b9bf7df477da110c560ce3045aa889","name":"Xdef Finance","symbol":"XDEF2","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13619/thumb/xdef.png?1610330383"},{"chainId":1,"address":"0x7a939bb714fd2a48ebeb1e495aa9aaa74ba9fa68","name":"Electric Vehicle Zo","symbol":"EVZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9456/thumb/kLohzILUIln6mHFYOlecpWjINVIH-BVghP2vRTeuD0XteaQa7Lpn4sLcuPN4gHw8MU2pKWZCJRNwBmyyl1CYxplCLDcgSVihMC7vvfmkepY-_O_ImWBA27s4pKNlhcBnBYrc8y5WH0ZB2CjmqPh-32nPslrv329tqFWr2DAR8dl4R5LZGgeZ1ubCdtMoUua6gEL3umYShHBxrYLto.jpg?1567563510"},{"chainId":1,"address":"0x23b75bc7aaf28e2d6628c3f424b3882f8f072a3c","name":"Vice Industry Token","symbol":"VIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2983/thumb/vit.png?1547037240"},{"chainId":1,"address":"0xdde12a12a6f67156e0da672be05c374e1b0a3e57","name":"JOYSO","symbol":"JOY","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/2820/thumb/joy.png?1547036990"},{"chainId":1,"address":"0x3f5df2f90df67e10974fbcb1729c00d3f87c0eb4","name":"ShinCoin","symbol":"SCOIN","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/16053/thumb/ShinCoin.png?1623824898"},{"chainId":1,"address":"0xe1a0da60f8802b49cc36313bafade3f9e12342fd","name":"MP4","symbol":"MP4","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14092/thumb/Ko5uWOr8_400x400.png?1614222859"},{"chainId":1,"address":"0x78a5b382b9a83fe042a4f7eb2399d563fda931c3","name":"Black Diamond Ratin","symbol":"HZT","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/9700/thumb/hzt.PNG?1570915848"},{"chainId":1,"address":"0x7031ab87dcc46818806ec07af46fa8c2ad2a2bfc","name":"Tribute","symbol":"TRBT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12463/thumb/Tribute_Coin-04.png?1600034100"},{"chainId":1,"address":"0x49e833337ece7afe375e44f4e3e8481029218e5c","name":"Value DeFi","symbol":"VALUE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12525/thumb/value_logo_-_500x500.png?1601478115"},{"chainId":1,"address":"0x52d904eff2605463c2f0b338d34abc9b7c3e3b08","name":"Bitpower","symbol":"BPP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13492/thumb/Bitpower_%28200x200%29.png?1609134732"},{"chainId":1,"address":"0x21cf09bc065082478dcc9ccb5fd215a978dc8d86","name":"Jem","symbol":"JEM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13044/thumb/itchiro-defi.png?1605892179"},{"chainId":1,"address":"0x2de72ada48bdf7bac276256d3f016fe058490c34","name":"Floki Inu","symbol":"FLOKI","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16746/thumb/FLOKI.png?1625835665"},{"chainId":1,"address":"0x419b8ed155180a8c9c64145e76dad49c0a4efb97","name":"AltEstate Token","symbol":"ALT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3076/thumb/AltEstate_Token.jpg?1547037426"},{"chainId":1,"address":"0xe04491d64eaa464ec8fdf53c7a4c92bf5b2278cd","name":"WORLDPET","symbol":"WPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11707/thumb/worldpet3.png?1592986614"},{"chainId":1,"address":"0xce13abce0db5a8224616ef24d3979d466f19cf90","name":"Rebit","symbol":"KEYT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9891/thumb/rebit.PNG?1573119183"},{"chainId":1,"address":"0xc9859fccc876e6b4b3c749c5d29ea04f48acb74f","name":"Ino Coin","symbol":"INO","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/4096/thumb/inologo.jpg?1547039275"},{"chainId":1,"address":"0xa870879e2872f9f2dc3a33933a9af3345b00fd14","name":"B360","symbol":"B360","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9357/thumb/b360.PNG?1566515470"},{"chainId":1,"address":"0x2604fa406be957e542beb89e6754fcde6815e83f","name":"PlayKey","symbol":"PKT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2116/thumb/playkey.png?1548331394"},{"chainId":1,"address":"0xcec2387e04f9815bf12670dbf6cf03bba26df25f","name":"YFILEND FINANCE","symbol":"YFILD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12414/thumb/ylend.png?1599684775"},{"chainId":1,"address":"0x3f8a2f7bcd70e7f7bdd3fbb079c11d073588dea2","name":"FIRE","symbol":"FIRE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11888/thumb/tYmI5eG.png?1597282794"},{"chainId":1,"address":"0x2c5a9980b41861d91d30d0e0271d1c093452dca5","name":"ETH 12 Day EMA Cros","symbol":"ETH12EMACO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10614/thumb/eth-12-day-exponential-moving-average-set.png?1580971652"},{"chainId":1,"address":"0xde1e0ae6101b46520cf66fdc0b1059c5cc3d106c","name":"DeltaChain","symbol":"DELTA","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5794/thumb/deltachain.png?1547041664"},{"chainId":1,"address":"0x666d875c600aa06ac1cf15641361dec3b00432ef","name":"BTSE Token","symbol":"BTSE","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10807/thumb/BTSE_logo_Square.jpeg?1583965964"},{"chainId":1,"address":"0x6096d2460cf5177e40b515223428dc005ad35123","name":"Precium","symbol":"PCM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9490/thumb/pcm.PNG?1568015318"},{"chainId":1,"address":"0x889efb523cc39590b8483eb9491890ac71407f64","name":"Moon Juice","symbol":"JUICE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12564/thumb/-TMHqn9S_400x400.jpg?1600899021"},{"chainId":1,"address":"0xa143ac515dca260a46c742c7251ef3b268639593","name":"Bulk Network","symbol":"BULK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15266/thumb/Bulk_whale_round.png?1620285364"},{"chainId":1,"address":"0x44b537b6f94c73a54f7bf8a9b68f8125da3c330b","name":"Polkabase","symbol":"PBASE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13954/thumb/polkabase_logo.png?1613301180"},{"chainId":1,"address":"0x76974c7b79dc8a6a109fd71fd7ceb9e40eff5382","name":"Dowcoin","symbol":"DOW","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4750/thumb/dowcoin.png?1547223950"},{"chainId":1,"address":"0xa6c040045d962e4b8efa00954c7d23ccd0a2b8ad","name":"ETH BTC 75 25 Wei","symbol":"ETHBTC7525","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10595/thumb/eth_buy_and_hold.png?1580964016"},{"chainId":1,"address":"0x00d1793d7c3aae506257ba985b34c76aaf642557","name":"Tacos","symbol":"TACO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12108/thumb/photo_2020-08-12_05-50-46.jpg?1597217863"},{"chainId":1,"address":"0x8daebade922df735c38c80c7ebd708af50815faa","name":"tBTC","symbol":"TBTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11224/thumb/tBTC.png?1589620754"},{"chainId":1,"address":"0xe4f726adc8e89c6a6017f01eada77865db22da14","name":"PieDAO Balanced Cry","symbol":"BCP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13560/thumb/BCP.png?1609813753"},{"chainId":1,"address":"0x2bf91c18cd4ae9c2f2858ef9fe518180f7b5096d","name":"KIWI Token","symbol":"KIWI","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10799/thumb/kiwi_256.png?1583736957"},{"chainId":1,"address":"0x2344871f523cbb28a4f60045531184cf1f03ad24","name":"RoBet Coin","symbol":"ROBET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6286/thumb/RoBet_Coin.png?1547042328"},{"chainId":1,"address":"0xe63d6b308bce0f6193aec6b7e6eba005f41e36ab","name":"Stone Token","symbol":"STN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14593/thumb/stone-logo.png?1617164796"},{"chainId":1,"address":"0x1bc9f31c327ce04b6fa9d56fd84c14cc0b0a4f47","name":"Hygenercoin","symbol":"HG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8817/thumb/60762471_431874227611586_5376521021266329600_n.png?1561551785"},{"chainId":1,"address":"0xdf1338fbafe7af1789151627b886781ba556ef9a","name":"Kuende","symbol":"KUE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7453/thumb/29178480_930308773794230_7348989862965411840_n.png?1547540936"},{"chainId":1,"address":"0x1e41a55030e0d0794abfb6dced22e6c7d18d8247","name":"Android chain","symbol":"ADC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7656/thumb/logo_cn.png?1549011953"},{"chainId":1,"address":"0x6c4b85cab20c13af72766025f0e17e0fe558a553","name":"YFFII Finance","symbol":"YFFII","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12398/thumb/4hWupcq.jpg?1599553239"},{"chainId":1,"address":"0xf1f5de69c9c8d9be8a7b01773cc1166d4ec6ede2","name":"Definitex","symbol":"DFX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12370/thumb/dfx.jpg?1599360540"},{"chainId":1,"address":"0x37f6f8eb409deb9feaf032c109a72319f665c79d","name":"Gold Coin Reserve","symbol":"GCR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13278/thumb/Logo_%2825%29.png?1606897839"},{"chainId":1,"address":"0xdb13025b219db5e4529f48b65ff009a26b6ae733","name":"Ubricoin","symbol":"UBN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8367/thumb/M8X-YrBf_400x400.jpg?1557803271"},{"chainId":1,"address":"0x33d0568941c0c64ff7e0fb4fba0b11bd37deed9f","name":"RAMP","symbol":"RAMP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12837/thumb/RAMP-Logo-v2-1000pxsq.png?1617952606"},{"chainId":1,"address":"0x75739d5944534115d7c54ee8c73f186d793bae02","name":"Collective","symbol":"CO2","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14542/thumb/the_collective_logo.png?1616912000"},{"chainId":1,"address":"0x8a77e40936bbc27e80e9a3f526368c967869c86d","name":"Merculet","symbol":"MVP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3483/thumb/feature_token.png?1547038223"},{"chainId":1,"address":"0x28dee01d53fed0edf5f6e310bf8ef9311513ae40","name":"BlitzPredict","symbol":"XBP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2458/thumb/BlitzPredict.jpg?1547701183"},{"chainId":1,"address":"0xf2f9a7e93f845b3ce154efbeb64fb9346fcce509","name":"UniPower","symbol":"POWER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11618/thumb/unipower.png?1591943398"},{"chainId":1,"address":"0x05f9abf4b0c5661e83b92c056a8791d5ccd7ca52","name":"JOOS Protocol","symbol":"JOOS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7819/thumb/unaAbzXx_400x400.jpg?1550816726"},{"chainId":1,"address":"0x0000000000b3f879cb30fe243b4dfee438691c04","name":"GasToken","symbol":"GST2","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/10779/thumb/gas.png?1583466756"},{"chainId":1,"address":"0xca75c43f8c9afd356c585ce7aa4490b48a95c466","name":"Inari","symbol":"INARI","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16795/thumb/token_logo_%281%29.png?1625036828"},{"chainId":1,"address":"0x2b5016cea1c425f915e13727f7657025de3208fe","name":"Tokemon","symbol":"TKMN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13769/thumb/RDpa3fCw_400x400.png?1611697299"},{"chainId":1,"address":"0x0e8d6b471e332f140e7d9dbb99e5e3822f728da6","name":"Abyss","symbol":"ABYSS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2105/thumb/NrFmpxs.png?1600318377"},{"chainId":1,"address":"0xb8c6ad2586bb71d518c2aaf510efe91f82022f58","name":"Gomics","symbol":"GOM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9506/thumb/69581895_377122223186787_4719544883591774208_n.png?1568184472"},{"chainId":1,"address":"0xc0eb85285d83217cd7c891702bcbc0fc401e2d9d","name":"Hiveterminal token","symbol":"HVN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/899/thumb/Hiveterminal_token.jpg?1547034726"},{"chainId":1,"address":"0x35872fea6a4843facbcdbce99e3b69596a3680b8","name":"1337","symbol":"1337","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/13348/thumb/logo.png?1607791847"},{"chainId":1,"address":"0xb38f206615325306dddeb0794a6482486b6b78b8","name":"1X Short EOS Token","symbol":"EOSHEDGE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10221/thumb/683JEXMN_400x400.png?1596706630"},{"chainId":1,"address":"0x5d1b1019d0afa5e6cc047b9e78081d44cc579fc4","name":"yfrb Finance","symbol":"YFRB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12431/thumb/yfrb.png?1599786507"},{"chainId":1,"address":"0x393fac0773c765c80dc887451377d553c46f83b1","name":"RAKSUR","symbol":"RAS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10790/thumb/rMKHG2G6_400x400.jpg?1585523542"},{"chainId":1,"address":"0x5d30ad9c6374bf925d0a75454fa327aacf778492","name":"PERI Finance","symbol":"PERI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15313/thumb/6xVEMS1.png?1620375905"},{"chainId":1,"address":"0x825cd4201f8a2bbb1a69668eac4e5fa71283273d","name":"Zort","symbol":"ZORT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16351/thumb/zort.png?1623805056"},{"chainId":1,"address":"0x1660f10b4d610cf482194356ece8efd65b15ba83","name":"Amun DeFi Momentum ","symbol":"DMX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16818/thumb/amun-dmx.png?1625176376"},{"chainId":1,"address":"0xdb33d49b5a41a97d296b7242a96ebd8ac77b3bb8","name":"CY Finance","symbol":"CYF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12579/thumb/logocyf200.jpg?1600915999"},{"chainId":1,"address":"0x6a22e5e94388464181578aa7a6b869e00fe27846","name":"sXAG","symbol":"SXAG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11831/thumb/sXAG.png?1616150809"},{"chainId":1,"address":"0x028171bca77440897b824ca71d1c56cac55b68a3","name":"Aave DAI","symbol":"ADAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14242/thumb/aDAI.84b6c41f.png?1615528749"},{"chainId":1,"address":"0x39aa39c021dfbae8fac545936693ac917d5e7563","name":"cUSDC","symbol":"CUSDC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9442/thumb/Compound_USDC.png?1567581577"},{"chainId":1,"address":"0x160b1e5aabfd70b2fc40af815014925d71ceed7e","name":"StakedFIRO","symbol":"STFIRO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12985/thumb/stFIRO_high_res.png?1606234476"},{"chainId":1,"address":"0xa89ac6e529acf391cfbbd377f3ac9d93eae9664e","name":"Keep4r","symbol":"KP4R","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13006/thumb/kp4r.png?1604368813"},{"chainId":1,"address":"0x7f1f2d3dfa99678675ece1c243d3f7bc3746db5d","name":"Tapmydata","symbol":"TAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13942/thumb/TMD_Icon.png?1617788995"},{"chainId":1,"address":"0x15334dcb171e8b65d6650321581dca83be870115","name":"Wrapped BIND","symbol":"WBIND","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13055/thumb/o1w2cBW.png?1604720921"},{"chainId":1,"address":"0x139d9397274bb9e2c29a9aa8aa0b5874d30d62e3","name":"BoutsPro","symbol":"BOUTS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4296/thumb/boutspro-ico-logo-300x300.jpg?1527072201"},{"chainId":1,"address":"0xf278c1ca969095ffddded020290cf8b5c424ace2","name":"Ruff","symbol":"RUFF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2726/thumb/ruff.png?1548608556"},{"chainId":1,"address":"0x5dd115eb39a0fc5da9022e4bbb8e8679ca066a74","name":"Unilord","symbol":"PEER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14730/thumb/KWP0UWn4_400x400.jpg?1617957728"},{"chainId":1,"address":"0x7a4d70528c0b8d376c206b0fb2c9db1d26315c2d","name":"iShop Token","symbol":"IST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10621/thumb/ishop.png?1581029119"},{"chainId":1,"address":"0x3b58c52c03ca5eb619eba171091c86c34d603e5f","name":"Cyclub","symbol":"CYCLUB","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12524/thumb/mcicoin-logo.png?1600471686"},{"chainId":1,"address":"0x400b1d8a7dd8c471026b2c8cbe1062b27d120538","name":"Limestone Network","symbol":"LIMEX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11907/thumb/nw1FE_f4_400x400.png?1596074376"},{"chainId":1,"address":"0x1c5db575e2ff833e46a2e9864c22f4b22e0b37c2","name":"renZEC","symbol":"RENZEC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11564/thumb/renZEC.png?1591186101"},{"chainId":1,"address":"0x153ed9cc1b792979d2bde0bbf45cc2a7e436a5f9","name":"XOVBank","symbol":"XOV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5396/thumb/xov.jpg?1549857681"},{"chainId":1,"address":"0x03042482d64577a7bdb282260e2ea4c8a89c064b","name":"Centaur","symbol":"CNTR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12743/thumb/logo_%2898%29.png?1602630445"},{"chainId":1,"address":"0x4d75d9e37667a2d4677ec3d74bdd9049326ad8d6","name":"NFT Wars","symbol":"WAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14501/thumb/nft_wars.jpg?1616559078"},{"chainId":1,"address":"0x7fc693b16184b6778f4534f5410f06633cb030e0","name":"RELAX Protocol","symbol":"RLX","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/10842/thumb/logo_%2856%29.png?1584653679"},{"chainId":1,"address":"0x10ba8c420e912bf07bedac03aa6908720db04e0c","name":"Raise Token","symbol":"RAISE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4411/thumb/Raise.png?1590671180"},{"chainId":1,"address":"0xe481f2311c774564d517d015e678c2736a25ddd3","name":"DefHold","symbol":"DEFO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13168/thumb/defhold_logo.png?1605849148"},{"chainId":1,"address":"0x0f8794f66c7170c4f9163a8498371a747114f6c4","name":"Flama","symbol":"FMA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11587/thumb/Flama.png?1591498092"},{"chainId":1,"address":"0xf56b164efd3cfc02ba739b719b6526a6fa1ca32a","name":"Curio Governance","symbol":"CGT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13607/thumb/QLwpua7.png?1610273891"},{"chainId":1,"address":"0xf344490abd414dafa97f34c8ca501b0aa5bf8873","name":"Webcoin","symbol":"WEB","decimals":1,"logoURI":"https://assets.coingecko.com/coins/images/3779/thumb/webcoin-logo.png?1547038866"},{"chainId":1,"address":"0xcae838187c1f813fc3bfae6387bf34aeacb5bef6","name":"Commons Earth","symbol":"COM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14087/thumb/commons-earth.png?1614214707"},{"chainId":1,"address":"0xbb1ee07d6c7baeb702949904080eb61f5d5e7732","name":"Dogey Inu","symbol":"DINU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16374/thumb/512x512_dinu_logo.jpg?1623919813"},{"chainId":1,"address":"0x3166c570935a7d8554c8f4ea792ff965d2efe1f2","name":"Q DAO Governance to","symbol":"QDAO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8599/thumb/QDAO_logo_white_black.png?1562131656"},{"chainId":1,"address":"0x9669890e48f330acd88b78d63e1a6b3482652cd9","name":"Bincentive","symbol":"BCNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9661/thumb/XfDF7Gqv_400x400.jpg?1570484117"},{"chainId":1,"address":"0xc6d19a604fbdb5c2eeb363255fd63c9eea29288e","name":"DarkBundles","symbol":"DBUND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13749/thumb/dbund_logo.png?1611457781"},{"chainId":1,"address":"0x2216e873ea4282ebef7a02ac5aea220be6391a7c","name":"smol","symbol":"SMOL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12695/thumb/blockfolio-gecko-smol-clean-up.png?1601867705"},{"chainId":1,"address":"0x920db6c38cf5a2a12554e812d4b3ac2daa8eba4d","name":"Evimeria","symbol":"EVI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6086/thumb/evimeria.png?1548125758"},{"chainId":1,"address":"0xc005204856ee7035a13d8d7cdbbdc13027afff90","name":"MoneySwap","symbol":"MSWAP","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/13576/thumb/logo_%281%29.png?1609888424"},{"chainId":1,"address":"0x83d6a2171f78e8ffe4dfe7680983effc49cff7a0","name":"Bet Chips","symbol":"BETC","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/13273/thumb/Whats-App-Image-2020-12-01-at-6-41-47-PM-removebg-preview-removebg-preview.png?1606888089"},{"chainId":1,"address":"0xb04dfdb8271ed2d5e13858562c44a77d3ceb9e57","name":"BuildUp","symbol":"BUP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13206/thumb/BUP_-_LOGO.png?1606199462"},{"chainId":1,"address":"0x158079ee67fce2f58472a96584a73c7ab9ac95c1","name":"cREP","symbol":"CREP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10822/thumb/cbat.png?1584331275"},{"chainId":1,"address":"0x6589fe1271a0f29346796c6baf0cdf619e25e58e","name":"Grain","symbol":"GRAIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13331/thumb/784594063499853904.png?1607531032"},{"chainId":1,"address":"0xf50b5e535f62a56a9bd2d8e2434204e726c027fa","name":"sFB","symbol":"SFB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14949/thumb/sFB.png?1619129132"},{"chainId":1,"address":"0x4a9f00de5d8a244944313faee23849ff725e680d","name":"Science Chain","symbol":"SCC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10053/thumb/Science_Chain.png?1575354140"},{"chainId":1,"address":"0x3b78dc5736a49bd297dd2e4d62daa83d35a22749","name":"Finswap","symbol":"FNSP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12542/thumb/finswap-orange-200x200-1.png?1600663987"},{"chainId":1,"address":"0x8f8e787989bc652eea01a6c88a19f0f379bdf4fd","name":"Helex","symbol":"HLX","decimals":5,"logoURI":"https://assets.coingecko.com/coins/images/9658/thumb/hlx-logo.jpeg?1578295677"},{"chainId":1,"address":"0x9a49f02e128a8e989b443a8f94843c0918bf45e7","name":"Tokok","symbol":"TOK","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6618/thumb/oV2pAI5N_400x400.jpg?1548259690"},{"chainId":1,"address":"0xc76fb75950536d98fa62ea968e1d6b45ffea2a55","name":"Unit Protocol","symbol":"COL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11862/thumb/Unit.png?1595580755"},{"chainId":1,"address":"0xa30189d8255322a2f8b2a77906b000aeb005570c","name":"Buy Sell","symbol":"BSE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13368/thumb/buy_sell_logo.png?1607927143"},{"chainId":1,"address":"0xd03b6ae96cae26b743a6207dcee7cbe60a425c70","name":"UniDexBot","symbol":"UNDB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12481/thumb/logo_128.png?1601814643"},{"chainId":1,"address":"0xaa55ac677abffa4af9b798b6c138d830820d49e6","name":"Cultiplan","symbol":"CTPL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15798/thumb/Cultiplan_200x200_logo.png?1621927264"},{"chainId":1,"address":"0x1337def18c680af1f9f45cbcab6309562975b1dd","name":"Armor NXM","symbol":"ARNXM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13753/thumb/1_otmQ1sN0MgsT4idRsPsu3w.png?1611556043"},{"chainId":1,"address":"0x9f978aa425148cdd9223eb175446a877b86727ff","name":"PayYoda","symbol":"YOT","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/13632/thumb/w_72D81R_400x400.png?1610492214"},{"chainId":1,"address":"0x2e9c861713a8cbd4aca72a832f347b9520edbb90","name":"Crypto Application ","symbol":"CAPP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11082/thumb/capp.PNG?1588048135"},{"chainId":1,"address":"0x26e43759551333e57f073bb0772f50329a957b30","name":"DegenVC","symbol":"DGVC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12208/thumb/degen_vc_logo.png?1598186601"},{"chainId":1,"address":"0x4289c043a12392f1027307fb58272d8ebd853912","name":"AiLink Token","symbol":"ALI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5917/thumb/ailink-token.png?1547041855"},{"chainId":1,"address":"0xb05af453011d7ad68a92b0065ffd9d1277ed2741","name":"Team Finance","symbol":"TEAM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12480/thumb/team_token_logo.jpg?1600158847"},{"chainId":1,"address":"0xf73fc4b74a4cc6f9ea203a9d5bbff4ffce3a4c48","name":"Phillionex","symbol":"PHN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9827/thumb/AdU9pq2b_400x400.jpg?1572471686"},{"chainId":1,"address":"0xe884cc2795b9c45beeac0607da9539fd571ccf85","name":"Ultiledger","symbol":"ULT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6747/thumb/Ultiledger.jpeg?1547042996"},{"chainId":1,"address":"0x40fd72257597aa14c7231a7b1aaa29fce868f677","name":"Sora","symbol":"XOR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11093/thumb/sora_logo_cg_white.png?1588284194"},{"chainId":1,"address":"0x04b5e13000c6e9a3255dc057091f3e3eeee7b0f0","name":"Unifund","symbol":"IFUND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12833/thumb/unifund_logo.png?1602859047"},{"chainId":1,"address":"0xa823e6722006afe99e91c30ff5295052fe6b8e32","name":"Neumark","symbol":"NEU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2218/thumb/neumark.png?1547036501"},{"chainId":1,"address":"0x0405be40241a2f7822c33c5a3eee238bf2973ba3","name":"Aelysir","symbol":"AEL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12955/thumb/ael_logo.png?1603794538"},{"chainId":1,"address":"0x58959e0c71080434f237bd42d07cd84b74cef438","name":"Tesra","symbol":"TSR","decimals":5,"logoURI":"https://assets.coingecko.com/coins/images/9676/thumb/tsr.PNG?1570601008"},{"chainId":1,"address":"0xd6bd97a26232ba02172ff86b055d5d7be789335b","name":"Ormeus Cash","symbol":"OMC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11798/thumb/Vooo8SX.png?1594359387"},{"chainId":1,"address":"0x32054526df40fbb08b733abe256a8d21de58432d","name":"Taurus Chain","symbol":"TRT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11069/thumb/TRT.jpg?1587912808"},{"chainId":1,"address":"0x796e47b85a0d759f300f1de96a3583004235d4d8","name":"Electrum Dark","symbol":"ELD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6469/thumb/logo_%2817%29.png?1547042683"},{"chainId":1,"address":"0xa13f0743951b4f6e3e3aa039f682e17279f52bc3","name":"Sentinel Chain","symbol":"SENC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2960/thumb/sentinel-chain.jpg?1547037201"},{"chainId":1,"address":"0xf7269a10e85d4aa8282529516cf86847748da2bf","name":"Candela Coin","symbol":"CLA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13139/thumb/Easy_To_Use__13_-removebg-preview_bumlw2.png?1605591087"},{"chainId":1,"address":"0xe202873079913858f9ba8795ba957a4ad561ca24","name":"Wifi Coin","symbol":"WIFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13500/thumb/logo-wifi-1.png?1609195292"},{"chainId":1,"address":"0x308564dc5217c39386f5eae96545159e1d396661","name":"HLP Token","symbol":"HLP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12668/thumb/simbolo-hlp-token.png?1601467816"},{"chainId":1,"address":"0xdf35988d795d90711e785b488bb2127692e6f956","name":"BabyFloki","symbol":"BABYFLOKI","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16712/thumb/floki.jpg?1624810144"},{"chainId":1,"address":"0xa9536b9c75a9e0fae3b56a96ac8edf76abc91978","name":"Amun DeFi Index","symbol":"DFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16817/thumb/amun-dfi.png?1625176209"},{"chainId":1,"address":"0xe4fa3c576c31696322e8d7165c5965d5a1f6a1a5","name":"GamyFi Token","symbol":"GFX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14559/thumb/circle-cropped_%281%29.png?1617008124"},{"chainId":1,"address":"0xa5ddfca8b837ccd0cf80fe6c24e2a9018fb50dba","name":"3X Short BiLira Tok","symbol":"TRYBBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10451/thumb/683JEXMN_400x400.png?1579561868"},{"chainId":1,"address":"0x4954db6391f4feb5468b6b943d4935353596aec9","name":"USDQ","symbol":"USDQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8300/thumb/favicon-256x256.png?1557315995"},{"chainId":1,"address":"0x8888801af4d980682e47f1a9036e589479e835c5","name":"88mph","symbol":"MPH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13137/thumb/yfU-_Tcj_400x400.png?1605581509"},{"chainId":1,"address":"0x814e0908b12a99fecf5bc101bb5d0b8b5cdf7d26","name":"Measurable Data Tok","symbol":"MDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2441/thumb/mdt_logo.png?1569813574"},{"chainId":1,"address":"0x19fffd124cd9089e21026d10da97f8cd6b442bff","name":"Zuflo Coin","symbol":"ZFL","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10350/thumb/yFAD7NNd_400x400.jpg?1578783333"},{"chainId":1,"address":"0x20ae0ca9d42e6ffeb1188f341a7d63450452def6","name":"CIPHER","symbol":"CPR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10392/thumb/cipher-logo.png?1578891757"},{"chainId":1,"address":"0xae353daeed8dcc7a9a12027f7e070c0a50b7b6a4","name":"InnovaMinex","symbol":"MINX","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/7116/thumb/innovaminex.jpg?1547043613"},{"chainId":1,"address":"0xcda2f16c6aa895d533506b426aff827b709c87f5","name":"Fairum","symbol":"FAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13894/thumb/logo-65ce48ea8d2b64b6478a42c0050214e2.png?1612645237"},{"chainId":1,"address":"0x91a7769afcf796a3c8fff879ed80b10dd76d3ccd","name":"SG20","symbol":"SG20","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14427/thumb/T16tIw3n_400x400.jpg?1616031599"},{"chainId":1,"address":"0x2e6539edc3b76f1e21b71d214527faba875f70f3","name":"Yearn Finance DOT","symbol":"YFDOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12791/thumb/logo_%2815%29.png?1602580328"},{"chainId":1,"address":"0x884e3902c4d5cfa86de4ace7a96aa91ebc25c0ff","name":"JBOX","symbol":"JBX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3150/thumb/Untitled-design-1-removebg-preview-2.png?1598237569"},{"chainId":1,"address":"0xb6c6920327b33f8eec26786c7462c5f4098d47e3","name":"Minty Art","symbol":"MINTY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14152/thumb/p-1MCf0H_400x400.png?1614667489"},{"chainId":1,"address":"0xb20043f149817bff5322f1b928e89abfc65a9925","name":"EXRT Network","symbol":"EXRT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5954/thumb/exrt.png?1616039881"},{"chainId":1,"address":"0xeed3ae7b0f8b5b9bb8c035a9941382b1822671cd","name":"EveryCoin","symbol":"EVY","decimals":12,"logoURI":"https://assets.coingecko.com/coins/images/5629/thumb/TutkUC1x_400x400_%281%29.jpg?1547447105"},{"chainId":1,"address":"0x24d77c210a014b1e123a0878f6c903df74a2317b","name":"Bitfxt Coin","symbol":"BXT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9660/thumb/O7W3wRuP_400x400.jpg?1570482892"},{"chainId":1,"address":"0x790bfacae71576107c068f494c8a6302aea640cb","name":"CryptoBossCoin","symbol":"CBC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7114/thumb/eqIkj-ZZ_400x400.jpg?1549521587"},{"chainId":1,"address":"0xbc6819294c554f46bee6f5eb5260089a03e270a2","name":"Defla","symbol":"DEFLA","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13879/thumb/98GNpAw.png?1612491558"},{"chainId":1,"address":"0x2186ecb39f1b765ba7d78f1c43c2e9d7fc0c1eca","name":"My Crypto Play","symbol":"MCP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13570/thumb/Ysv6EyvR_400x400.jpg?1609845061"},{"chainId":1,"address":"0x38f7cd43662d1cff4cc3c2c4b749f7cfed1d1db3","name":"Neeva Defi","symbol":"NVA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12919/thumb/NEEVA-TOKEN-1-1.png?1603667387"},{"chainId":1,"address":"0x13d71cfc90a83cd1cc0e59675c3f4b90d4162a8b","name":"SWIPE Network","symbol":"SWIPE","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9697/thumb/jX_8guyy_400x400_%281%29.jpg?1570914447"},{"chainId":1,"address":"0xdc349913d53b446485e98b76800b6254f43df695","name":"Bezoge Earth","symbol":"BEZOGE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15639/thumb/token-logo.png?1621408212"},{"chainId":1,"address":"0xff75ced57419bcaebe5f05254983b013b0646ef5","name":"Cook","symbol":"COOK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14603/thumb/logo-200x200.jpg?1622448330"},{"chainId":1,"address":"0x8d2fab1ff34f1c545673a816f1438b02d0a2e32d","name":"AISF","symbol":"AGT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12859/thumb/AISF_token.jpg?1603095207"},{"chainId":1,"address":"0x442bc47357919446eabc18c7211e57a13d983469","name":"BeeChat","symbol":"CHAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14386/thumb/ezgif-6-b78b8423d870.png?1615803294"},{"chainId":1,"address":"0xbdec45952b5e234eddc2981b43eed360826d5087","name":"Mogu","symbol":"MOGX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9687/thumb/UZpzCJc1_400x400.jpg?1570828056"},{"chainId":1,"address":"0x6e8908cfa881c9f6f2c64d3436e7b80b1bf0093f","name":"Bistroo","symbol":"BIST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15645/thumb/bist.PNG?1621413969"},{"chainId":1,"address":"0x62dc4817588d53a056cbbd18231d91ffccd34b2a","name":"DeHive","symbol":"DHV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14926/thumb/logo_200x200.png?1626181831"},{"chainId":1,"address":"0x5cc737a37a02a1b34ba8edf899aa6441765232a0","name":"Burn Yield Burn","symbol":"XYX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13956/thumb/xyx_logo.png?1613351293"},{"chainId":1,"address":"0x97941ff1962026955852e9609e202d1058bc0f48","name":"Va Na Su","symbol":"VNS","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12485/thumb/platform-img1.png?1600206964"},{"chainId":1,"address":"0x4d07fdd4bae81ce2c8b1b76f4db2064c35d7851e","name":"SWE Token","symbol":"SWET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8265/thumb/swet.png?1557127536"},{"chainId":1,"address":"0x22f098f08c4eda4be4ad6b4ba59866f3e98cef92","name":"Force For Fast","symbol":"FFF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11718/thumb/fff2.PNG?1593073288"},{"chainId":1,"address":"0xd667d5a228cb09f190c4308cf89d39cab18a413c","name":"GES","symbol":"GES","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12910/thumb/ges-logo.jpg?1603422780"},{"chainId":1,"address":"0xc4d5545392f5fc57eba3af8981815669bb7e2a48","name":"HEdpAY","symbol":"HDP","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/7496/thumb/icon_hedpay.png?1555485710"},{"chainId":1,"address":"0x2942e3b38e33123965bfbc21e802be943a76bbc6","name":"EHash","symbol":"EHASH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14180/thumb/ehash.png?1614820416"},{"chainId":1,"address":"0x7e7e112a68d8d2e221e11047a72ffc1065c38e1a","name":"Badger Sett Digg","symbol":"BDIGG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14503/thumb/DIGG.png?1616560407"},{"chainId":1,"address":"0x7c81542ed859a2061538fee22b6544a235b9557d","name":"Combo","symbol":"COMB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13053/thumb/7zYe50X.png?1604703767"},{"chainId":1,"address":"0xfca47962d45adfdfd1ab2d972315db4ce7ccf094","name":"iXledger","symbol":"IXT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/814/thumb/ixledger.png?1547034602"},{"chainId":1,"address":"0xaa843f65872a25d6e9552ea0b360fb1d5e333124","name":"Eco Value Coin","symbol":"EVC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7868/thumb/temp_1524073947125.-325764774.png?1561602099"},{"chainId":1,"address":"0x151202c9c18e495656f372281f493eb7698961d5","name":"Debitum Network","symbol":"DEB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1648/thumb/debitum_network_token.jpg?1547035890"},{"chainId":1,"address":"0xfc4b8ed459e00e5400be803a9bb3954234fd50e3","name":"Aave WBTC v1","symbol":"AWBTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11734/thumb/aWBTC.png?1593087741"},{"chainId":1,"address":"0xdece0f6864c1511369ae2c30b90db9f5fe92832c","name":"Disciplina","symbol":"DSCP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2786/thumb/38657648.png?1619662653"},{"chainId":1,"address":"0x8e9a29e7ed21db7c5b2e1cd75e676da0236dfb45","name":"Minter Hub","symbol":"HUB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14639/thumb/Nvoj_6Mu_400x400_%281%29.jpg?1617484760"},{"chainId":1,"address":"0xf6ec87dfe1ed3a7256cc0c38e3c8139103e9af3b","name":"Gene","symbol":"GENE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14145/thumb/logo.a60a0c80_%281%29.png?1614653629"},{"chainId":1,"address":"0x9b8c184439245b7bb24a5b2ec51ec81c39589e8a","name":"KIMEX","symbol":"KMX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8062/thumb/XSsfMr8.png?1554083098"},{"chainId":1,"address":"0x36905fc93280f52362a1cbab151f25dc46742fb5","name":"Bottos","symbol":"BTO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2048/thumb/bottos.png?1517478551"},{"chainId":1,"address":"0x0fbe9cc858d7ad6e246fe9d01aed22abd2a66f0b","name":"Danat Coin","symbol":"DNC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13170/thumb/1528717728file.png?1605855085"},{"chainId":1,"address":"0x1d9cd2180fd4e9771fca28681034d02390b14e4c","name":"1X Short Shitcoin I","symbol":"HEDGESHIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10450/thumb/683JEXMN_400x400.png?1579561773"},{"chainId":1,"address":"0x8317b216d7c3f9a5b8401e4b6814d13a7be390ec","name":"EXNCE","symbol":"XNC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9683/thumb/logo_icon.png?1570684903"},{"chainId":1,"address":"0x888888435fde8e7d4c54cab67f206e4199454c60","name":"DFX Finance","symbol":"DFX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14091/thumb/DFX.png?1614320944"},{"chainId":1,"address":"0x459086f2376525bdceba5bdda135e4e9d3fef5bf","name":"renBCH","symbol":"RENBCH","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11563/thumb/renBCH.png?1591185978"},{"chainId":1,"address":"0xbfc1502ebc37475b940ced8f036b91018a73c8f6","name":"Bidesk","symbol":"BDK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12884/thumb/BDK_token.png?1603264639"},{"chainId":1,"address":"0x0f17bc9a994b87b5225cfb6a2cd4d667adb4f20b","name":"Jarvis Synthetic Eu","symbol":"JEUR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15725/thumb/logo_-_2021-05-22T063621.432.png?1621636593"},{"chainId":1,"address":"0x1b4052d98fb1888c2bf3b8d3b930e0aff8a910df","name":"Community Token","symbol":"COM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12145/thumb/COKK-mq__400x400.png?1615441730"},{"chainId":1,"address":"0x61cdb66e56fad942a7b5ce3f419ffe9375e31075","name":"RAIN Network","symbol":"RAIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11699/thumb/v4Bpj2k.png?1592963188"},{"chainId":1,"address":"0xb41380174d0b06181513a5677b60200b93b5efb4","name":"Chainsquare","symbol":"CHS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14858/thumb/chainsquare.png?1618804636"},{"chainId":1,"address":"0x53c8395465a84955c95159814461466053dedede","name":"DeGate","symbol":"DG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14415/thumb/80035388.png?1615951031"},{"chainId":1,"address":"0x07597255910a51509ca469568b048f2597e72504","name":"Uptrennd","symbol":"1UP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8273/thumb/Uptrennd_Logo.png?1579334846"},{"chainId":1,"address":"0x69428bb4272e3181de9e3cab461e19b0131855c8","name":"SYBC Coin","symbol":"SYBC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12901/thumb/sybc.png?1603346599"},{"chainId":1,"address":"0x7ddc52c4de30e94be3a6a0a2b259b2850f421989","name":"GoMining Token","symbol":"GMT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15662/thumb/Logo_GMT_200x200.png?1621488989"},{"chainId":1,"address":"0x152687bc4a7fcc89049cf119f9ac3e5acf2ee7ef","name":"DeltaHub Community","symbol":"DHC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12656/thumb/DHC_Transparent_200x200.png?1601440150"},{"chainId":1,"address":"0x89551b940e2a8ed8eccf509935bac9213fe30584","name":"DoDreamChain","symbol":"DRM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10469/thumb/57414069_286321078958466_8377709696580059136_n.jpg?1579733292"},{"chainId":1,"address":"0x9d5963ba32e877871dff3e2e697283dc64066271","name":"Edcoin","symbol":"EDC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13872/thumb/EDCOIN-1.png?1612447671"},{"chainId":1,"address":"0x6ff1bfa14a57594a5874b37ff6ac5efbd9f9599a","name":"TotemFi","symbol":"TOTM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14680/thumb/TOTM.png?1617721704"},{"chainId":1,"address":"0x3fa807b6f8d4c407e6e605368f4372d14658b38c","name":"Rise Protocol","symbol":"RISE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13959/thumb/Uo19zBht_400x400.png?1613354499"},{"chainId":1,"address":"0x5bc7e5f0ab8b2e10d2d0a3f21739fce62459aef3","name":"Hut34 Entropy","symbol":"ENTRP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5197/thumb/hut.png?1575869079"},{"chainId":1,"address":"0x4df812f6064def1e5e029f1ca858777cc98d2d81","name":"Xaurum","symbol":"XAUR","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/461/thumb/xaurum.png?1548761197"},{"chainId":1,"address":"0xefd720c94659f2ccb767809347245f917a145ed8","name":"Quoxent","symbol":"QUO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1084/thumb/Quoxent_Logo_Final_-_NO_TEXT.png?1581412910"},{"chainId":1,"address":"0x347c099f110ca6761779329d2879957b606b6ace","name":"Joint Ventures","symbol":"JOINT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3770/thumb/joint.png?1547038860"},{"chainId":1,"address":"0xd829664cdbf3195b2ce76047a65de29e7ed0a9a8","name":"3X Long Altcoin Ind","symbol":"ALTBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10208/thumb/683JEXMN_400x400_%281%29.png?1576535126"},{"chainId":1,"address":"0xe9f3cb0229eb8d0aaf03ec84883950134ed20ddc","name":"SLT","symbol":"SLT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6673/thumb/slt_token.jpg?1547042877"},{"chainId":1,"address":"0xc8ba3cf103e5a1658209c366153197ac7fa9c9b1","name":"Difo Network","symbol":"DFN","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/14504/thumb/difo.png?1616566305"},{"chainId":1,"address":"0x6425c6be902d692ae2db752b3c268afadb099d3b","name":"Restart Energy","symbol":"MWAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3140/thumb/re.jpg?1547037554"},{"chainId":1,"address":"0x1014613e2b3cbc4d575054d4982e580d9b99d7b1","name":"BitCapitalVendor","symbol":"BCV","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5326/thumb/hqQw2WGE_400x400.jpg?1547040893"},{"chainId":1,"address":"0x10e1e953ddba597011f8bfa806ab0cc3415a622b","name":"1X Short Ethereum T","symbol":"ETHHEDGE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10220/thumb/683JEXMN_400x400_%281%29.png?1576577133"},{"chainId":1,"address":"0x8c3ee4f778e282b59d42d693a97b80b1ed80f4ee","name":"SatoPay","symbol":"STOP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12220/thumb/stop.png?1598241582"},{"chainId":1,"address":"0xd0df3b1cf729a29b7404c40d61c750008e631ba7","name":"Rug","symbol":"RUG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12307/thumb/rug_token_logo.png?1599029152"},{"chainId":1,"address":"0x8868ff4893113193313465a0ccc5f1bd370d7751","name":"KVI","symbol":"KVI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10794/thumb/kvi.PNG?1583721478"},{"chainId":1,"address":"0x584936357d68f5143f12e2e64f0089db93814dad","name":"3X Long Algorand To","symbol":"ALGOBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10164/thumb/683JEXMN_400x400_%281%29.png?1576504676"},{"chainId":1,"address":"0xc626c9e2247c8a0c863ad6daa97ed939e12786de","name":"Digital Wallet","symbol":"DWC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9752/thumb/2P9yXbw7_400x400.jpg?1571385231"},{"chainId":1,"address":"0xd2be3722b17b616c51ed9b8944a227d1ce579c24","name":"Dtube Coin","symbol":"DTUBE","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/13126/thumb/dtube_logo.png?1605500467"},{"chainId":1,"address":"0xa105c740bc012a43a342ab4a0ef40143452c8e89","name":"Litbinex Coin","symbol":"LTB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10090/thumb/logolitbinex.png?1579753908"},{"chainId":1,"address":"0x13119e34e140097a507b07a5564bde1bc375d9e6","name":"MoneyToken","symbol":"IMT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2955/thumb/imt.png?1547037191"},{"chainId":1,"address":"0x6c5fbc90e4d78f70cc5025db005b39b03914fc0c","name":"Urus Token","symbol":"URUS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14122/thumb/urus.PNG?1614565237"},{"chainId":1,"address":"0x49184e6dae8c8ecd89d8bdc1b950c597b8167c90","name":"LIBERTAS","symbol":"LIBERTAS","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/11928/thumb/logo200x200_%281%29.png?1596409240"},{"chainId":1,"address":"0xdf9d4674a430bdcc096a3a403128357ab36844ba","name":"WadzPay Token","symbol":"WTK","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/13083/thumb/200xWadzToken.png?1604984329"},{"chainId":1,"address":"0xb566e883555aebf5b1db211070b530ab00a4b18a","name":"DCTDAO","symbol":"DCTD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14626/thumb/dctdao.jpg?1617321308"},{"chainId":1,"address":"0x06890d4c65a4cb75be73d7ccb4a8ee7962819e81","name":"xKNCb","symbol":"XKNCB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13996/thumb/Token-4.png?1613546873"},{"chainId":1,"address":"0x1306c7d95e59cfcdff7ae3c13db7f56acc543815","name":"Rapidly Reusable Ro","symbol":"RRR","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16823/thumb/logo_-_2021-07-02T061509.786.png?1625177743"},{"chainId":1,"address":"0x7d529a5b3c41126760a0fa3c1a9652d8a7a07793","name":"Narwhale","symbol":"NAWA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14129/thumb/narwhale_logo.png?1614579819"},{"chainId":1,"address":"0xa1c7d450130bb77c6a23ddfaecbc4a060215384b","name":"RougeCoin","symbol":"XRGE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14621/thumb/rougecoin.png?1617265377"},{"chainId":1,"address":"0x7a5ce6abd131ea6b148a022cb76fc180ae3315a6","name":"bAlpha","symbol":"BALPHA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14224/thumb/logo_bAlpha_200.png?1615089190"},{"chainId":1,"address":"0x65b678936c489a2639036755aa2107ec09569198","name":"ITEN","symbol":"ITEN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12314/thumb/logo-light_%281%29.png?1599084234"},{"chainId":1,"address":"0x83869de76b9ad8125e22b857f519f001588c0f62","name":"EXMO Coin","symbol":"EXM","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9154/thumb/exmo_token.png?1579588209"},{"chainId":1,"address":"0x9f9913853f749b3fe6d6d4e16a1cc3c1656b6d51","name":"BITToken","symbol":"BITT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13783/thumb/BITT_Logo_256pixels.png?1611733961"},{"chainId":1,"address":"0x755e83f560335e6bb8e45e44460ec4af598e24c9","name":"Slash Protocol","symbol":"SLASH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16238/thumb/pFdDW-Uw_400x400.png?1623367317"},{"chainId":1,"address":"0x705ee96c1c160842c92c1aecfcffccc9c412e3d9","name":"ClearPoll","symbol":"POLL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1050/thumb/clearpoll.png?1547034985"},{"chainId":1,"address":"0x96700ffae33c651bc329c3f3fbfe56e1f291f117","name":"RealT Token 4380 ","symbol":"REALTOKEN-S-4380-BE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16603/thumb/4380-Beaconsfield-hero-1.jpeg?1624543909"},{"chainId":1,"address":"0x44ea84a85616f8e9cd719fc843de31d852ad7240","name":"NO Trump Augur Pred","symbol":"NTRUMP","decimals":15,"logoURI":"https://assets.coingecko.com/coins/images/12597/thumb/nX10wsB.png?1600997655"},{"chainId":1,"address":"0x8727c112c712c4a03371ac87a74dd6ab104af768","name":"Jetcoin","symbol":"JET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2487/thumb/jetcoin.png?1547974820"},{"chainId":1,"address":"0x33bfd20660eeaf952e8d5bc3236e1918701f17d0","name":"RCCC","symbol":"RCCC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6627/thumb/rccc_token.png?1547042828"},{"chainId":1,"address":"0xdef1da03061ddd2a5ef6c59220c135dec623116d","name":"Lepricon","symbol":"L3P","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14436/thumb/yZmVlPJP_400x400.jpg?1616053077"},{"chainId":1,"address":"0x0f1ed66c251bcb52ecf7e67ac64bb72482048adb","name":"Seer","symbol":"SEER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4824/thumb/seer.png?1548608916"},{"chainId":1,"address":"0xdad26bce7dcf59cd03a2455558e4dd73e1c07b66","name":"Trade win","symbol":"TWI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13060/thumb/Logo.png?1604821765"},{"chainId":1,"address":"0x06f3c323f0238c72bf35011071f2b5b7f43a054c","name":"MASQ","symbol":"MASQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13699/thumb/MASQ_Logo_Blue_Solo_Transparent.png?1616661801"},{"chainId":1,"address":"0x0fb843d37aa2a99db8d81af9fe2f0a6485c7c002","name":"CPROP","symbol":"CPROP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5466/thumb/CPROP-logo.png?1547041204"},{"chainId":1,"address":"0xe277ac35f9d327a670c1a3f3eec80a83022431e4","name":"PolypuX","symbol":"PUX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11954/thumb/puxlogoforcoingecko.png?1609516934"},{"chainId":1,"address":"0x8d75959f1e61ec2571aa72798237101f084de63a","name":"Substratum","symbol":"SUB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/950/thumb/substratum.png?1548611133"},{"chainId":1,"address":"0x06b179e292f080871825bed5d722162fd96b4c95","name":"10x gg","symbol":"XGG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14142/thumb/coingecko_%281%29.png?1614650659"},{"chainId":1,"address":"0x46b4a7d906f1a943b7744df23625e63726d79035","name":"CODEO TOKEN","symbol":"CODEO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9890/thumb/codeo.png?1592404070"},{"chainId":1,"address":"0x13339fd07934cd674269726edf3b5ccee9dd93de","name":"Curio","symbol":"CUR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10314/thumb/is8-HSAQ99o3KejDDwfnqnzW_tOHbqsEPHQlYL_UEVDeVfKhbMe871CfCrEo_BYAeC1MtEFUGcd1aZ2YtJopCQKr5tEbz9dyLmBw7nJGuOgWE4fGa4Bsui2bt8yMSZQt6meB2hAbZ1VPUf6J5pgVPslRkH3C7pSsapnpZslVi0eD7U8wb7CucXp6xuI3T0rsBQaBbHtftdoUrz8d0WiYLcwpflI6A1dVOlCXUIk9llfTuTJE.jpg?1577834182"},{"chainId":1,"address":"0x4838903d6319e483ab82ae3f09a1ec36489a4193","name":"Famous Coin","symbol":"FAMOUS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14416/thumb/famouscoin.jpg?1615951801"},{"chainId":1,"address":"0x8a88f04e0c905054d2f33b26bb3a46d7091a039a","name":"IGToken","symbol":"IG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5434/thumb/igtoken.png?1547041141"},{"chainId":1,"address":"0x106538cc16f938776c7c180186975bca23875287","name":"Basis Share","symbol":"BAS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13251/thumb/BAS.png?1613231139"},{"chainId":1,"address":"0xc1d204d77861def49b6e769347a883b15ec397ff","name":"PayperEx","symbol":"PAX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1601/thumb/pax.png?1547035800"},{"chainId":1,"address":"0xbb0a009ba1eb20c5062c790432f080f6597662af","name":"Bitbot Protocol","symbol":"BBP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13750/thumb/bitbot_protocol.png?1611477932"},{"chainId":1,"address":"0xf3afdc2525568ffe743801c8c54bdea1704c9adb","name":"Turtle","symbol":"TURTLE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16866/thumb/turtle.PNG?1625472769"},{"chainId":1,"address":"0x91383a15c391c142b80045d8b4730c1c37ac0378","name":"XStable","symbol":"XST","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13765/thumb/xstable.png?1613026749"},{"chainId":1,"address":"0x5cf501e64786444e025c5b24025f98399538ea5d","name":"Galaxy Pool Coin","symbol":"GPO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10498/thumb/c9fg8dtz_400x400.png?1580249130"},{"chainId":1,"address":"0x2f5e2c9002c058c063d21a06b6cabb50950130c8","name":"3X Short Ethereum T","symbol":"ETHBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10172/thumb/683JEXMN_400x400_%281%29.png?1576506124"},{"chainId":1,"address":"0x3c03b4ec9477809072ff9cc9292c9b25d4a8e6c6","name":"Polkacover","symbol":"CVR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13720/thumb/Polkacover_logo.png?1611147519"},{"chainId":1,"address":"0x86e6a4f512b1290c043970b04e0b570d4fc98291","name":"IntelliShare","symbol":"INE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7092/thumb/logo.png?1547043578"},{"chainId":1,"address":"0x4104b135dbc9609fc1a9490e61369036497660c8","name":"APWine","symbol":"APW","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15597/thumb/ApWine.png?1621340387"},{"chainId":1,"address":"0x6db6d540f5614e6bab7475af3f430f46a0b083e2","name":"RealT Token 5942 ","symbol":"REALTOKEN-S-5942-AU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16699/thumb/5942-Audubon-HERO-2.jpeg?1624641512"},{"chainId":1,"address":"0xa8ebb13b9895e52ab7d815ce7f63591402581624","name":"ESCX Token","symbol":"ESCX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9723/thumb/200X200.png?1571264548"},{"chainId":1,"address":"0x3fd8f39a962efda04956981c31ab89fab5fb8bc8","name":"Rotharium","symbol":"RTH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2030/thumb/L7kpRMda_400x400.jpg?1547036314"},{"chainId":1,"address":"0x9ffc3bcde7b68c46a6dc34f0718009925c1867cb","name":"Huobi Polkadot","symbol":"HDOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14107/thumb/hdot.png?1614333466"},{"chainId":1,"address":"0xf33121a2209609cadc7349acc9c40e41ce21c730","name":"Blockchain Adventur","symbol":"BAG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14863/thumb/3iw7MAi.png?1618810870"},{"chainId":1,"address":"0x436f0f3a982074c4a05084485d421466a994fe53","name":"Rate3","symbol":"RTE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3342/thumb/rate3-logo.png?1547037953"},{"chainId":1,"address":"0xd27af03cb73a29ee2f37194c70c4ee13b68fe8cb","name":"Freq Set Dollar","symbol":"FSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13603/thumb/fsd.jpg?1610251925"},{"chainId":1,"address":"0x38c87aa89b2b8cd9b95b736e1fa7b612ea972169","name":"AMO Coin","symbol":"AMO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4009/thumb/amo-logomark_black.png?1547039106"},{"chainId":1,"address":"0x24810d836f6d60a7ee499622b7103ec769e81e3b","name":"ChunghopToken","symbol":"CHC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8778/thumb/logo-white.png?1561106432"},{"chainId":1,"address":"0xc82abb524257c8ee4790bfdefb452b2d6a395e21","name":"3X Short Midcap Ind","symbol":"MIDBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10330/thumb/683JEXMN_400x400_%281%29.png?1578051961"},{"chainId":1,"address":"0x6e13a9e4ae3d0678e511fb6d2ad531fcf0e247bf","name":"3X Long Bitcoin SV ","symbol":"BSVBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10267/thumb/683JEXMN_400x400_%281%29.png?1576834731"},{"chainId":1,"address":"0x9b62ec1453cea5dde760aaf662048ca6eeb66e7f","name":"CellETF","symbol":"ECELL","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/12624/thumb/98201030_131705818496610_9196703627136204800_n.jpg?1601283839"},{"chainId":1,"address":"0x0342ac5dfad866985dde477caa85027a3c01a334","name":"Alpha Wolf","symbol":"AWF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16110/thumb/189711874_100633792225002_2355198083305071287_n.png?1623022195"},{"chainId":1,"address":"0x4c38d0e726b6c86f64c1b281348e725973542043","name":"Stand Share","symbol":"SAS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13543/thumb/sac.jpg?1609648278"},{"chainId":1,"address":"0x9fadea1aff842d407893e21dbd0e2017b4c287b6","name":"PGF500","symbol":"PGF7T","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8987/thumb/pgf500-logo.png?1563488429"},{"chainId":1,"address":"0x35b55c25731e9b05b1d8480ba39463d52c9d0211","name":"Stonk Swap","symbol":"STONK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11690/thumb/PNG_logo_200px.png?1622340402"},{"chainId":1,"address":"0xb5b8f5616fe42d5ceca3e87f3fddbdd8f496d760","name":"ZPER","symbol":"ZPR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5293/thumb/zper.png?1547040816"},{"chainId":1,"address":"0x6baa91cd8aa07431760ef2eedfedcef662a6b8b3","name":"3X Short Exchange T","symbol":"EXCHBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10331/thumb/683JEXMN_400x400_%281%29.png?1578052093"},{"chainId":1,"address":"0xe6710e0cda178f3d921f456902707b0d4c4a332b","name":"JULIEN","symbol":"JULIEN","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/12954/thumb/julien_logo.jpg?1603792446"},{"chainId":1,"address":"0x68037790a0229e9ce6eaa8a99ea92964106c4703","name":"Parallel","symbol":"PAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14153/thumb/par_round_200.png?1614670422"},{"chainId":1,"address":"0xbc3ec4e491b835dce394a53e9a9a10ac19564839","name":"Starbugs Shards","symbol":"BUGS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12935/thumb/Starbugs.png?1603720230"},{"chainId":1,"address":"0xd08d2b199e9e5df407427d4085877d1fdff3b1d6","name":"RealT Token 6923 ","symbol":"REALTOKEN-S-6923-GR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16676/thumb/6923-Greenview.jpeg?1624629085"},{"chainId":1,"address":"0x4d31200e6d7854c2f664af7fc38a21600960f74d","name":"Bit Financial","symbol":"BFC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12822/thumb/BFC.png?1602752235"},{"chainId":1,"address":"0x45128cb743951121fb70cb570c0784492732778a","name":"Metawhale Gold","symbol":"MWG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13809/thumb/MWG-gecko-light_1.png?1617276428"},{"chainId":1,"address":"0xb62d18dea74045e822352ce4b3ee77319dc5ff2f","name":"EventChain","symbol":"EVC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1268/thumb/eventchain.png?1548125671"},{"chainId":1,"address":"0x2001f2a0cf801ecfda622f6c28fb6e10d803d969","name":"CoinLoan","symbol":"CLT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1713/thumb/blue-logo-transparent-200x200.png?1595912819"},{"chainId":1,"address":"0xbcf9dbf8b14ed096b2ba08b7269356197fdd1b5d","name":"Avaluse","symbol":"AVAL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14200/thumb/Avaluse-logo-twitter.png?1614897701"},{"chainId":1,"address":"0x391612e67b0252e0d1e1460501b41545931faef9","name":"TheBridge","symbol":"TBG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15986/thumb/9937e1b25a64a.png?1622536404"},{"chainId":1,"address":"0x990e081a7b7d3ccba26a2f49746a68cc4ff73280","name":"KStarCoin","symbol":"KSC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1630/thumb/ksc.png?1547035850"},{"chainId":1,"address":"0xf18cffb528eca0ea31d1d6b28bc80d2eca34d14d","name":"RealT Token 25097","symbol":"REALTOKEN-S-25097-A","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16698/thumb/Andover-25097.jpeg?1624641026"},{"chainId":1,"address":"0x646707246d7d5c2a86d7206f41ca8199ea9ced69","name":"Porkchop","symbol":"CHOP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12169/thumb/Porkchop.png?1597803275"},{"chainId":1,"address":"0x0a0db74ef8b4480cc29b7d68647727feeb1ea4ec","name":"GLEX","symbol":"GLEX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11609/thumb/1578901576974.png?1591777246"},{"chainId":1,"address":"0x4b7ad3a56810032782afce12d7d27122bdb96eff","name":"Sparkle Loyalty","symbol":"SPRKL","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7949/thumb/SparkleLoyalty_Icon.png?1597653289"},{"chainId":1,"address":"0x6c2adc2073994fb2ccc5032cc2906fa221e9b391","name":"Delphy","symbol":"DPY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1133/thumb/delphy.png?1547035133"},{"chainId":1,"address":"0xc7bba5b765581efb2cdd2679db5bea9ee79b201f","name":"Gems","symbol":"GEM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3945/thumb/Webp.net-resizeimage_%2817%29.jpg?1547038970"},{"chainId":1,"address":"0x1a4743cf1af4c289351390a2b3fe7c13d2f7c235","name":"Castweet","symbol":"CTT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9602/thumb/200x200color.png?1569479415"},{"chainId":1,"address":"0x245ef47d4d0505ecf3ac463f4d81f41ade8f1fd1","name":"Nuggets","symbol":"NUG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1543/thumb/nuggets.png?1548329505"},{"chainId":1,"address":"0x918da91ccbc32b7a6a0cc4ecd5987bbab6e31e6d","name":"sTSLA","symbol":"STSLA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14038/thumb/stsla_logo.png?1613961916"},{"chainId":1,"address":"0x4c1e085d8c2d2a8377834d0d7b38f12cc5b86898","name":"SilkChain","symbol":"SILK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3810/thumb/2.png?1561537249"},{"chainId":1,"address":"0x56015bbe3c01fe05bc30a8a9a9fd9a88917e7db3","name":"Cat Token","symbol":"CAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12177/thumb/happy2-2.jpg?1619593488"},{"chainId":1,"address":"0x92b914f1ddcbb1d117a718e83c9ed7eb32fc44d1","name":"Enkronos","symbol":"ENK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4214/thumb/enkronos.jpg?1553680821"},{"chainId":1,"address":"0xdf22da9a8c1d80095175ae601d182a734923f01a","name":"BitpakcoinToken","symbol":"BPAKC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8382/thumb/57207457-4e1a8480-6fe7-11e9-896b-8f650a4c9521.png?1557889389"},{"chainId":1,"address":"0x98c36c0e953463bd5146c8783ce081ce1d187acf","name":"Polyient Games Unit","symbol":"PGU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13777/thumb/gap1KZNe_400x400.jpg?1611716610"},{"chainId":1,"address":"0xec681f28f4561c2a9534799aa38e0d36a83cf478","name":"YVS Finance","symbol":"YVS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13471/thumb/cu0LSzE.png?1608852718"},{"chainId":1,"address":"0x44f262622248027f8e2a8fb1090c4cf85072392c","name":"Project Inverse","symbol":"XIV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14231/thumb/photo_2021-06-07_22-10-41.jpg?1623075271"},{"chainId":1,"address":"0xbc34985b4d345aea933d5cac19f3a86bd1fb398f","name":"ZJLT Distributed Fa","symbol":"ZJLT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7867/thumb/zjlt.jpg?1551254209"},{"chainId":1,"address":"0x87210f1d3422ba75b6c40c63c78d79324dabcd55","name":"EOS TRUST","symbol":"EOST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8829/thumb/EOS_TRUST.png?1561955075"},{"chainId":1,"address":"0xe50365f5d679cb98a1dd62d6f6e58e59321bcddf","name":"LATOKEN","symbol":"LA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1051/thumb/LA_token.png?1605772040"},{"chainId":1,"address":"0x973e52691176d36453868d9d86572788d27041a9","name":"DxChain Token","symbol":"DX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4700/thumb/VdZwy0Pv_400x400.png?1603089728"},{"chainId":1,"address":"0xd1afbccc9a2c2187ea544363b986ea0ab6ef08b5","name":"Ethereum Yield","symbol":"ETHY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13191/thumb/rOIuPZM.png?1606101103"},{"chainId":1,"address":"0xd437d88153daef4784cacd2084b1d8cc2d3312b8","name":"3X Long Zcash Token","symbol":"ZECBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16544/thumb/download_%2828%29.png?1624414707"},{"chainId":1,"address":"0xabe9b2e4bbd5a8c718752c41254ed81aae7d98bf","name":"P2P","symbol":"P2P","decimals":10,"logoURI":"https://assets.coingecko.com/coins/images/12486/thumb/p2p.png?1600207324"},{"chainId":1,"address":"0x457a57e931cba4dff5ce8500cc0dff18356df041","name":"Phantom Token","symbol":"PHTF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13844/thumb/44286840.png?1612312790"},{"chainId":1,"address":"0xd110bb8a24b100c37af7310416e685af807c1f10","name":"VODA TOKEN","symbol":"WDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8534/thumb/wdt.png?1559115489"},{"chainId":1,"address":"0x8db90e3e7d04c875a51997092f9178fcac9defdb","name":"Portal","symbol":"PORTAL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6626/thumb/Nljbrphf_400x400.jpg?1547042827"},{"chainId":1,"address":"0x9e5a64943f9f48463f07cc0578bbf9e2e67f0f61","name":"Anonymous Coin","symbol":"AMC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10014/thumb/BQ8dlAOd_400x400.png?1574760277"},{"chainId":1,"address":"0x8af785687ee8d75114b028997c9ca36b5cc67bc4","name":"3X Long OKB Token","symbol":"OKBBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10431/thumb/683JEXMN_400x400.png?1579276257"},{"chainId":1,"address":"0x9b06d48e0529ecf05905ff52dd426ebec0ea3011","name":"XSwap","symbol":"XSP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12541/thumb/256x256_%282%29.png?1600645409"},{"chainId":1,"address":"0x499a6c19f5537dd6005e2b5c6e1263103f558ba4","name":"RealT Token 17813","symbol":"REALTOKEN-S-17813-B","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16606/thumb/17813-Bradford-hero-1.jpeg?1624544519"},{"chainId":1,"address":"0xb66a2131a6b840dd020151f80723caed603efb51","name":"NNB Token","symbol":"NNB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8377/thumb/j7OrK9qU_400x400.jpg?1557822486"},{"chainId":1,"address":"0x8e6cd950ad6ba651f6dd608dc70e5886b1aa6b24","name":"StarLink","symbol":"STARL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16824/thumb/ZxJbRWJ.png?1625177900"},{"chainId":1,"address":"0xa2c1e04aca801da92fa95af161040d37f103d69d","name":"CoinAnalyst","symbol":"COY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4671/thumb/CA-CoinAnalyst-Icon_only-%28unapplicable%29-Default_old.png?1619746045"},{"chainId":1,"address":"0x593114f03a0a575aece9ed675e52ed68d2172b8c","name":"BidiPass","symbol":"BDP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3890/thumb/AxiFAoHc_400x400.jpg?1567461770"},{"chainId":1,"address":"0x3aadc3bce49724ce299fd9f3850211211c399c8c","name":"Coinstox","symbol":"CSX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14373/thumb/CSX-token-200.png?1615771653"},{"chainId":1,"address":"0x519083fc539f23131c3b7046992584592772d12a","name":"Yearn Finance Value","symbol":"YFIV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13159/thumb/download_%285%29.png?1605770239"},{"chainId":1,"address":"0xb3e2cb7cccfe139f8ff84013823bf22da6b6390a","name":"Iconic Token","symbol":"ICNQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7830/thumb/2_Iconic_Holding_icon.png?1593396172"},{"chainId":1,"address":"0x5b71bee9d961b1b848f8485eec8d8787f80217f5","name":"Bitforex Token","symbol":"BF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5330/thumb/BitForex-Logo.png?1573808168"},{"chainId":1,"address":"0x2dca19e944453e46d9130950ca135461b3bc0c30","name":"EYES Protocol","symbol":"EYES","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9734/thumb/pTaAZUI6_400x400.jpg?1571308667"},{"chainId":1,"address":"0x5e6b6d9abad9093fdc861ea1600eba1b355cd940","name":"IoT Chain","symbol":"ITC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1304/thumb/iot-chain-logo.png?1547035331"},{"chainId":1,"address":"0x87f14e9460cecb789f1b125b2e3e353ff8ed6fcd","name":"Bytus","symbol":"BYTS","decimals":3,"logoURI":"https://assets.coingecko.com/coins/images/7763/thumb/bytus.png?1588560119"},{"chainId":1,"address":"0xeb7355c2f217b3485a591332fe13c8c5a76a581d","name":"Jubi Token","symbol":"JT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10994/thumb/Af5MFcVY_400x400.jpg?1586998222"},{"chainId":1,"address":"0x4c6719bf85903d18c295da44216f862b01b36f43","name":"AlloHash","symbol":"ALH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2897/thumb/Allohash-Logo-v03_2_%281%29.png?1616119279"},{"chainId":1,"address":"0xa68b7779504b0ae372ddcc109f8786db9b91e93e","name":"RealT Token 4340 ","symbol":"REALTOKEN-S-4340-EA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16681/thumb/4340-East-71-front.jpeg?1624631910"},{"chainId":1,"address":"0xa2d77f8353cb2afd709aba4a967257511ecff716","name":"Internet Exchange T","symbol":"INEX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11017/thumb/ftQxvUbk_400x400.jpg?1587127361"},{"chainId":1,"address":"0x4be40bc9681d0a7c24a99b4c92f85b9053fc2a45","name":"Dify Finance","symbol":"YFIII","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12628/thumb/zNTAjrF.png?1601294851"},{"chainId":1,"address":"0x42bedd647e387dabec65a7dc3a3babcc68bb664d","name":"BlockMason Link","symbol":"BLINK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8525/thumb/link-by-blockmason.jpg?1559103173"},{"chainId":1,"address":"0xbd1e7f594600dcaf7f483af55deacec0159a064e","name":"Qobit","symbol":"QOB","decimals":8},{"chainId":1,"address":"0x5003b168b457b663c3c18ffcf5b6a24bee8f59c7","name":"Musk","symbol":"MUSK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6614/thumb/1aCM-fLB_400x400.jpg?1547042815"},{"chainId":1,"address":"0x9dfc4b433d359024eb3e810d77d60fbe8b0d9b82","name":"Dandy Dego","symbol":"DANDY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12764/thumb/487ogltc_400x400.jpg?1602463048"},{"chainId":1,"address":"0xdb0acc14396d108b3c5574483acb817855c9dc8d","name":"Overline Emblem","symbol":"EMB","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/3335/thumb/czcuIce.png?1621842831"},{"chainId":1,"address":"0xbc8deee89f1cf4b661514185aa1ab780336c4c4a","name":"Poker io","symbol":"POK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6982/thumb/poker.io.png?1547043383"},{"chainId":1,"address":"0x679131f591b4f369acb8cd8c51e68596806c3916","name":"Trustlines Network","symbol":"TLN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11562/thumb/Trustlines.png?1591152088"},{"chainId":1,"address":"0x2cae31d2ca104a951654456f46168bc9f88fdc65","name":"JUIICE","symbol":"JUI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11951/thumb/aWgJrI7C_400x400.png?1596418994"},{"chainId":1,"address":"0x64e65d352f6a2949463b3a7595911b61bbafc63e","name":"Khipu Token","symbol":"KIP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9751/thumb/npjrHlXC_400x400.jpg?1571380858"},{"chainId":1,"address":"0x95e40e065afb3059dcabe4aaf404c1f92756603a","name":"King DAG","symbol":"KDAG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10809/thumb/3xcLUorv_400x400.jpg?1591000563"},{"chainId":1,"address":"0x957c30ab0426e0c93cd8241e2c60392d08c6ac8e","name":"Modum","symbol":"MOD","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/1040/thumb/modum.png?1548085261"},{"chainId":1,"address":"0xaeeaa9c0ecd8d50ab7fcd159bddad0f52ce360c2","name":"Plethori","symbol":"PLE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15236/thumb/PLETHORI-LOGO-200X200PX-COINGECKO.png?1620192649"},{"chainId":1,"address":"0xb16d3ed603d62b125c6bd45519eda40829549489","name":"Insureum","symbol":"ISR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4888/thumb/insureum.png?1547974141"},{"chainId":1,"address":"0x000000000000d0151e748d25b766e77efe2a6c83","name":"XDEFI Governance To","symbol":"XDEX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14485/thumb/logo.png?1616472896"},{"chainId":1,"address":"0x88d39566dae88dc838652d9898f0aa6a8ff2819a","name":"HypeBurn","symbol":"HBURN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13179/thumb/hypeburn_logo_coingecko_200px.png?1605968369"},{"chainId":1,"address":"0x37f04d2c3ae075fad5483bb918491f656b12bdb6","name":"VestChain","symbol":"VEST","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6700/thumb/logo_200x200_%281%29.png?1547042908"},{"chainId":1,"address":"0x23684569c0636c9aea246551879d457d0a0e6f58","name":"RealT Token 9336 ","symbol":"REALTOKEN-S-9336-PA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16701/thumb/9336-Patton-HERO-2.jpeg?1624642655"},{"chainId":1,"address":"0xdfb4a81727aa961b6ee830720843104fae0fdff9","name":"BabyElon","symbol":"BABYELON","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/17013/thumb/61GMoP9.png?1626073606"},{"chainId":1,"address":"0x627e2ee3dbda546e168eaaff25a2c5212e4a95a0","name":"Inverse Bitcoin Vol","symbol":"IBVOL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11057/thumb/download_%2810%29.png?1587642128"},{"chainId":1,"address":"0xc4d586ef7be9ebe80bd5ee4fbd228fe2db5f2c4e","name":"Papa Shiba","symbol":"PHIBA","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15473/thumb/200x200_png.png?1620922532"},{"chainId":1,"address":"0xdf6ef343350780bf8c3410bf062e0c015b1dd671","name":"Blackmoon Crypto","symbol":"BMC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/876/thumb/bmc.png?1547034698"},{"chainId":1,"address":"0xaec7d1069e3a914a3eb50f0bfb1796751f2ce48a","name":"S4FE","symbol":"S4F","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7405/thumb/logo_%284%29.png?1547085640"},{"chainId":1,"address":"0x50987e6be405ebac691f8988304562e5efc3b2ea","name":"Mycro","symbol":"MYO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7035/thumb/130619_MYO_Icon_final.png?1560931928"},{"chainId":1,"address":"0x4dd672e77c795844fe3a464ef8ef0faae617c8fb","name":"CONUN","symbol":"CON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7480/thumb/conun.png?1547716938"},{"chainId":1,"address":"0xd1c15cebfdcd16f00d91666bf64c8b66cbf5e9b5","name":"RealT Token 10612","symbol":"REALTOKEN-S-10612-S","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16680/thumb/Somerset-3.jpeg?1624630432"},{"chainId":1,"address":"0x3c45b24359fb0e107a4eaa56bd0f2ce66c99a0e5","name":"Apple Network","symbol":"ANK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10872/thumb/ANK.png?1585456588"},{"chainId":1,"address":"0x7e32c8727cc19dd59a7a4d01b95ae1cbfc8f4c77","name":"Aqua","symbol":"AQUA","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13455/thumb/aqua10-white-round.png?1608712198"},{"chainId":1,"address":"0x9f58702ef19ebeb76363884362439a8691e3f033","name":"HELIO POWER TOKEN","symbol":"THPT","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/11948/thumb/thpt.png?1601347239"},{"chainId":1,"address":"0x0c3ef32f802967db75b9d49fe1e76620151ccb81","name":"Whole Network","symbol":"NODE","decimals":5,"logoURI":"https://assets.coingecko.com/coins/images/9522/thumb/61410314_394870017826322_8137973916426567680_n.png?1568604555"},{"chainId":1,"address":"0xd4f6f9ae14399fd5eb8dfc7725f0094a1a7f5d80","name":"Bitsten Token","symbol":"BST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7335/thumb/bitsten.png?1589629209"},{"chainId":1,"address":"0x8275ebf521dc217aa79c88132017a5bcef001dd9","name":"Jewel","symbol":"JWL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6996/thumb/jewelpay_token.jpg?1547043400"},{"chainId":1,"address":"0x2aa4a3e8bb72be68a31c9c3c98ca7bec723c6222","name":"Bispex","symbol":"BPX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10004/thumb/bispex.png?1574667756"},{"chainId":1,"address":"0xc48b1ac1417db27c4e2c2ed3dae5a3d2fbb07dc5","name":"StarBlock","symbol":"STB","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8668/thumb/starblock-logo-for-coinmarketcap.png?1560207677"},{"chainId":1,"address":"0xe65ee7c03bbb3c950cfd4895c24989afa233ef01","name":"Zynecoin","symbol":"ZYN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7587/thumb/LOGO-HD-Z-de-ZYNECOIN-coinmarket.png?1574652402"},{"chainId":1,"address":"0x32c4adb9cf57f972bc375129de91c897b4f364f1","name":"Flowchain","symbol":"FLC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7446/thumb/logo_%2889%29.png?1597459811"},{"chainId":1,"address":"0x0fe156436f203b114c6c562cb1a2a81aa2801090","name":"SKINCHAIN","symbol":"SKC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10878/thumb/8ZtRME2h_400x400.jpg?1585472542"},{"chainId":1,"address":"0xd9af2d11d788da0097076f4eb21bd1c5533743d9","name":"Legal Block","symbol":"LBK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9524/thumb/62783498_2399147633483417_3919658167318872064_n.jpg?1568605802"},{"chainId":1,"address":"0x0f775ad69e3c93d599d3315a130bd82a0cdda397","name":"apeUSD LINK Synthet","symbol":"APEUSD-LINK-DEC21","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14396/thumb/apeusd.jpg?1615905248"},{"chainId":1,"address":"0x53bd789f2cdb846b227d8ffc7b46ed4263231fdf","name":"SimbCoin Swap","symbol":"SMBSWAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16808/thumb/smb.png?1625134960"},{"chainId":1,"address":"0x84810bcf08744d5862b8181f12d17bfd57d3b078","name":"SharedStake Governa","symbol":"SGT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13948/thumb/sgt-png.png?1615189100"},{"chainId":1,"address":"0x6944d3e38973c4831da24e954fbd790c7e688bdd","name":"IZE","symbol":"IZE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11031/thumb/logo.png?1587294254"},{"chainId":1,"address":"0x604026696fdb3c6720ae3049c46d59ac604dea0a","name":"eXciting Japan Coin","symbol":"XJP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11963/thumb/XJP_LOGO.png?1596453963"},{"chainId":1,"address":"0x24efe6b87bf1bfe9ea2ccb5a9d0a959c7172b364","name":"Global AEX Token","symbol":"GAT","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/7008/thumb/a3b65903bffb6e47b225bdd70c635701.png?1601426171"},{"chainId":1,"address":"0x283669123bd83da2536bb534e20512101c18e5d8","name":"Bitpayer Token","symbol":"BPT","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/11110/thumb/bitplayerlogo.png?1588639294"},{"chainId":1,"address":"0x174897edd3ce414084a009d22db31c7b7826400d","name":"JOON","symbol":"JOON","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/12595/thumb/logo.png?1600995905"},{"chainId":1,"address":"0x10d88d7495ca381df1391229bdb82d015b9ad17d","name":"Bavala","symbol":"BVA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9957/thumb/Bavala.png?1574095352"},{"chainId":1,"address":"0xcbd55d4ffc43467142761a764763652b48b969ff","name":"AstroTools","symbol":"ASTRO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12345/thumb/AT-flat-purple_logo.png?1599190828"},{"chainId":1,"address":"0xc1965d7d18f37062b18ab3d5d1fe7f69873b30dd","name":"Coinzo Token","symbol":"CNZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7530/thumb/lKas8L1U_400x400.jpg?1548229971"},{"chainId":1,"address":"0x8720c8429b78df262360b0f39917a03f9b894746","name":"Frenzy","symbol":"FZY","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11096/thumb/frenzy-singapore.jpg?1588212527"},{"chainId":1,"address":"0xc77d7e0dd7b2a01b990e866feb21d031f1418c2e","name":"Littlesesame","symbol":"LSC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8893/thumb/5yIumMGs_400x400.png?1562579316"},{"chainId":1,"address":"0xc28d4341ad8224e1a424558074ef0b4515f424d5","name":"Datbit","symbol":"DBT","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/7643/thumb/ZPzfoX06_400x400.jpg?1548917195"},{"chainId":1,"address":"0xd8d887b5611a5b3e90bf764085d9858031d2be67","name":"UCOS Token","symbol":"UCOS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14343/thumb/ucos200.png?1615503284"},{"chainId":1,"address":"0xea4931bfcf3260da6dbf0550e27f5c214e3c268b","name":"MozoX","symbol":"MOZOX","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/10798/thumb/Wd7sb8F7VxkzGIkjbIHd1KAaguILwTMnafTK5-aJSWnOylO0D9otRGafiDdS9WBzxKUvqbLeguGq5iTdNdYJp3QJvGI-l_AsXscfjJGiTmn4Bw4G5bi_902OtUeKyQwvGEukbFnNpeoDyCyQ3tAW5-37sIjjj9WcgL3u3gLgdDSne6h0aRG7sBXl1AuYMQb9W_JnnplkyBoA37ZrWMfZc.jpg?1583724469"},{"chainId":1,"address":"0x42726d074bba68ccc15200442b72afa2d495a783","name":"Isiklar Coin","symbol":"ISIKC","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/10992/thumb/logo_%2866%29.png?1586940186"},{"chainId":1,"address":"0xc7596f3fc97ae603e1d7ffa61e6efb7b6a59bed2","name":"Yoo Ecology","symbol":"YOO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11021/thumb/logo.1a3fe1d.png?1587160083"},{"chainId":1,"address":"0x70efdc485a10210b056ef8e0a32993bc6529995e","name":"Blaze Network","symbol":"BLZN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12248/thumb/A8JOuPSJ_400x400.jpg?1598511402"},{"chainId":1,"address":"0x4fac0ccd9e2ed9fd462d42b66fb81ba9a1f6f25e","name":"AXiaL","symbol":"AXL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7377/thumb/e0HWV5vs_400x400.jpg?1547044071"},{"chainId":1,"address":"0x010c282118aa76174ce5952572ba715cf60a0c9b","name":"VINX COIN STO","symbol":"VINX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11177/thumb/SM-VINX-STO-COIN-LOGO.png?1589508101"},{"chainId":1,"address":"0xcd254568ebf88f088e40f456db9e17731243cb25","name":"YFOS finance","symbol":"YFOS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12707/thumb/wHQeaUF.jpg?1601888512"},{"chainId":1,"address":"0x40d1f63b5d2048e67e9bedb1b4c2f1a9fb4b6817","name":"Golden Goose","symbol":"GOLD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7892/thumb/tsRcntSR_400x400.png?1611024068"},{"chainId":1,"address":"0xeb6985acd6d0cbff60b88032b0b29ac1d9d66a1b","name":"Bitbook Gambling","symbol":"BXK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8773/thumb/bitbook_token.png?1561082516"},{"chainId":1,"address":"0x59af0356cdebd1fa23ae5dadff9170bbfc31278c","name":"Two Prime FF1 Token","symbol":"FF1","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11008/thumb/IlJLc6NC_400x400.jpg?1587103393"},{"chainId":1,"address":"0x47e67ba66b0699500f18a53f94e2b9db3d47437e","name":"PlayGame","symbol":"PXG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7242/thumb/pxg-coin_3x.png?1547043841"},{"chainId":1,"address":"0xa17de0ab0a97bc5e56fa8b39ebfc81cc3f1f349e","name":"DefiKing","symbol":"DFK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12405/thumb/dfklogo.png?1599603745"},{"chainId":1,"address":"0x5e3002dff591c5e75bb9dedae268049742e6b13a","name":"Tutor s Diary","symbol":"TUDA","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7846/thumb/dbOq7_JEa8Vzq1ljCHJygOrLjk-GmQj3qo3XuwFxa3-vKb9kbe4sFi7msqJE5eRie0WMbcPf29qS_nmNGfI_96lYJZlssCwlk-mDlBoC-LbJNxEBpMFN1gBxZLHzoHtbOn5Yk9BnKhRaz6rKA8QbMWcvXHWjK7hAqOBCqnkHdpQ_iGXHJcMkyWZJ0sMbDR4Lbi9wfrJ2vEurY45q3.jpg?1551149529"},{"chainId":1,"address":"0x8b83116e05f722554e1089b9850e731ee20dd692","name":"ZCNOX Coin","symbol":"ZCNOX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10857/thumb/QP1B-kMg_400x400_%281%29.jpg?1585523407"},{"chainId":1,"address":"0x27201232579491ce9b116ac6f37d354cc723a2f3","name":"MESEFA","symbol":"SEFA","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10977/thumb/cPEdYbm1_400x400.png?1586758998"},{"chainId":1,"address":"0x56ee8c9bd1d445a3324ad83e86d8be309db8f85d","name":"Solareum","symbol":"SLRM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4268/thumb/Solareum-Mark-Final-01.png?1547039612"},{"chainId":1,"address":"0x5a4b14aea23a605abc463f04a6b8aaf52dd3e7c6","name":"HeartBout Pay","symbol":"HP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10348/thumb/5156.png?1580251362"},{"chainId":1,"address":"0x8971f9fd7196e5cee2c1032b50f656855af7dd26","name":"Lambda","symbol":"LAMB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4703/thumb/Lambda-Logo.png?1547219112"},{"chainId":1,"address":"0x72c14bc8e28f18e91a2e9551802d3fb2cb80e712","name":"AMMYI Coin","symbol":"AMI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14469/thumb/Untitled-design-25.png?1616380058"},{"chainId":1,"address":"0xc8ce75f643ecad864fc625902a6a07371f38320d","name":"Bootleg NFT","symbol":"BOOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14455/thumb/bootleg_nft.jpg?1616156150"},{"chainId":1,"address":"0x010d14d36c3ea6570d240ae3ac9d660398f7c48e","name":"Cenfura Token","symbol":"XCF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10987/thumb/xcf-icon-01-1-flat.png?1622195426"},{"chainId":1,"address":"0x93b1e78a3e652cd2e71c4a767595b77282344932","name":"BITO Coin","symbol":"BITO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7796/thumb/bitopro_28.png?1550628495"},{"chainId":1,"address":"0xf3a2ace8e48751c965ea0a1d064303aca53842b9","name":"HXY Money","symbol":"HXY","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11225/thumb/hexmoneygradientsmall.png?1595305947"},{"chainId":1,"address":"0xef7a985e4ff9b5dccd6eddf58577486887288711","name":"HOM Token","symbol":"HOMT","decimals":15,"logoURI":"https://assets.coingecko.com/coins/images/11597/thumb/HOM-Token-Logo.jpg?1591668252"},{"chainId":1,"address":"0x14cc8dfaf2258e1b8b2869300dba1b734dc0fe43","name":"K Tune","symbol":"KTT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13939/thumb/ktune.jpg?1613030462"},{"chainId":1,"address":"0xcc6f15be8573cb8243c42d300565566d328213dd","name":"OWN Token","symbol":"OWN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10950/thumb/cropped-WhatsApp-Image-2020-04-04-at-9.04.01-PM.jpeg?1586305520"},{"chainId":1,"address":"0xe6d2c3cb986db66818c14c7032db05d1d2a6ee74","name":"FinexboxToken","symbol":"FNB","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8419/thumb/p1WP-viw_400x400.jpg?1558395663"},{"chainId":1,"address":"0x53352e7d6620cc931c0c9318166ae2a92c1a4666","name":"AI Mining","symbol":"AIM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13635/thumb/logo_-_2021-01-13T091008.612.png?1610500226"},{"chainId":1,"address":"0xe5feeac09d36b18b3fa757e5cf3f8da6b8e27f4c","name":"NFT Index","symbol":"NFTI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14215/thumb/nfti.png?1614992905"},{"chainId":1,"address":"0xf7a219fffeade6cd98789da5642b687f743270eb","name":"Rhea Protocol","symbol":"RHEA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10298/thumb/_nJt0yOT_400x400.png?1577656875"},{"chainId":1,"address":"0xc5c43ad81e6c76eaa1f2dd92cb6a11ff6b6d09ea","name":"Shiba Cosmos","symbol":"SHIBCO","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15509/thumb/zkJObpDk_400x400.jpg?1621098100"},{"chainId":1,"address":"0x790baf0c914898c62163a61f150637d4bd180697","name":"Nirvana","symbol":"VANA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13541/thumb/vana.jpg?1609602820"},{"chainId":1,"address":"0x1f6deadcb526c4710cf941872b86dcdfbbbd9211","name":"Ruletka","symbol":"RTK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11102/thumb/rtk-logo.png?1595212217"},{"chainId":1,"address":"0x93ecd2ecdfb91ab2fee28a8779a6adfe2851cda6","name":"LoanBurst","symbol":"LBURST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12093/thumb/oKczM17b_400x400.jpg?1597273304"},{"chainId":1,"address":"0x7dc59729b0adf4ae34721a1e06ef82a19e690b04","name":"BTC Alpha Token","symbol":"BAC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8631/thumb/l.NkwdggrR1hkSqghZ.png?1559791553"},{"chainId":1,"address":"0x0a4b2d4b48a63088e0897a3f147ba37f81a27722","name":"CuraDAI","symbol":"CURA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11540/thumb/61919000.png?1590983686"},{"chainId":1,"address":"0x9248c485b0b80f76da451f167a8db30f33c70907","name":"Debase","symbol":"DEBASE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13201/thumb/debase_logo.png?1606190818"},{"chainId":1,"address":"0xbd05cee8741100010d8e93048a80ed77645ac7bf","name":"Cyclops Treasure","symbol":"CYTR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12698/thumb/Untitled-design-9-removebg-preview.png?1601855912"},{"chainId":1,"address":"0x7458fd786b2fe8cd801c0381f88b61c5071a006f","name":"LOA Protocol","symbol":"LOA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11164/thumb/1a67ac81c1803ee172b7ce8805b5da3d-full.jpg?1589411408"},{"chainId":1,"address":"0xd7d706ed3598a354a4adfce5d8c5383df99a4461","name":"Dain Token","symbol":"DAIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14811/thumb/%C2%B4%C3%99%C3%80%C3%8E%C2%B7%C3%8E%C2%B0%C3%AD.png?1618541340"},{"chainId":1,"address":"0xcb17cd357c7acd594717d899ecb9df540f633f27","name":"CoinDeal Token","symbol":"CDL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9960/thumb/2ZP5JaIL_400x400.jpg?1574233581"},{"chainId":1,"address":"0x8d3e855f3f55109d473735ab76f753218400fe96","name":"Bundles","symbol":"BUND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13219/thumb/bundles_finance_logo.jpg?1606294826"},{"chainId":1,"address":"0x2730d6fdc86c95a74253beffaa8306b40fedecbb","name":"UNICORN Token","symbol":"UNI","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9383/thumb/54231438.png?1566777314"},{"chainId":1,"address":"0x0e5f00da8aaef196a719d045db89b5da8f371b32","name":"Connectome","symbol":"CNTM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8528/thumb/200_200_CNTM-LOGO-07.png?1600751947"},{"chainId":1,"address":"0x60571e95e12c78cba5223042692908f0649435a5","name":"PLAAS FARMERS TOKEN","symbol":"PLAAS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11541/thumb/Logo_%289%29.png?1590984188"},{"chainId":1,"address":"0x70fadbe1f2cccbaf98ac88fdcf94a0509a48e46d","name":"Green Light","symbol":"GL","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11015/thumb/greenlight.PNG?1587114464"},{"chainId":1,"address":"0x9ec251401eafb7e98f37a1d911c0aea02cb63a80","name":"Bitcratic","symbol":"BCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9965/thumb/bitcraticlogo-logo-150-150.jpg?1574295058"},{"chainId":1,"address":"0x901fe080ee18383bf5494049538f1bca155f4d0b","name":"TrusMarketHub Token","symbol":"TMH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11018/thumb/DT_LuskN_400x400.jpg?1587127687"},{"chainId":1,"address":"0x3391bc034f2935ef0e1e41619445f998b2680d35","name":"IdleUSDC Risk Adju","symbol":"IDLEUSDCSAFE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11930/thumb/idleusdc-safe.png?1596263257"},{"chainId":1,"address":"0xeccf15a4b5976a1365baed5297058b4ca42777c0","name":"Nosturis","symbol":"NTRS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9990/thumb/47010860_203643113858754_2966343352238211072_n.jpg?1574373395"},{"chainId":1,"address":"0xcf8f9555d55ce45a3a33a81d6ef99a2a2e71dee2","name":"CBI Index 7","symbol":"CBIX7","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9978/thumb/CBIX7.png?1574320790"},{"chainId":1,"address":"0xb089db4cebbf0618b295d9defc7feb00f56da033","name":"BYZBIT","symbol":"BYT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9997/thumb/byzbit.png?1574653301"},{"chainId":1,"address":"0xc9df0ed2e9ef4357b51db171ff08297d10875280","name":"Unicly Gone Studio ","symbol":"UGONE","decimals":17,"logoURI":"https://assets.coingecko.com/coins/images/15680/thumb/gone_studio.jpg?1621500252"},{"chainId":1,"address":"0x7e8539d1e5cb91d63e46b8e188403b3f262a949b","name":"SOMIDAX","symbol":"SMDX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10899/thumb/IcgJHkM.png?1585698101"},{"chainId":1,"address":"0x187d1018e8ef879be4194d6ed7590987463ead85","name":"FUZE Token","symbol":"FUZE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8941/thumb/logo-fuze-fix-big.png?1563117524"},{"chainId":1,"address":"0x412e5a36bde71aa2c38e1c0e26baaf7f2f0bc24a","name":"PegsUSD","symbol":"PUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13676/thumb/pegusd.png?1610705447"},{"chainId":1,"address":"0x3d371413dd5489f3a04c07c0c2ce369c20986ceb","name":"YOUcash","symbol":"YOUC","decimals":10,"logoURI":"https://assets.coingecko.com/coins/images/11152/thumb/round-400x400.png?1589162715"},{"chainId":1,"address":"0x94ca37d108e89775dc8ae65f51ae28c2d9599f9a","name":"Cryptotipsfr","symbol":"CRTS","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/10874/thumb/CRTS.png?1613661396"},{"chainId":1,"address":"0xbcd8756ea481608ea3dd5a555493305cf0a79640","name":"Paparazzi","symbol":"PAZZI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11558/thumb/jMJC4g9m_400x400.jpg?1591079702"},{"chainId":1,"address":"0xc2b58812c24020ea924c3d7c241c441605f12e75","name":"Entherfound","symbol":"ETF","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10728/thumb/Untitled-design.png?1582667621"},{"chainId":1,"address":"0xca176a8ac234446b2561293db7543e0cdadc6627","name":"Hardware Chain","symbol":"HDW","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/9157/thumb/hardwarechain.PNG?1564736937"},{"chainId":1,"address":"0x4afadb32b8fdb334cf9f20afb476a06c1f5b111a","name":"TLS Token","symbol":"TLS","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10086/thumb/logo_200x200.png?1583054911"},{"chainId":1,"address":"0xa52383b665b91dce42dd4b6d1e0fb37d3effe489","name":"MASTER USD","symbol":"MUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10063/thumb/wVgiR00.png?1575423238"},{"chainId":1,"address":"0xbf494f02ee3fde1f20bee6242bce2d1ed0c15e47","name":"World Token","symbol":"WORLD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13801/thumb/WORLD.png?1612843088"},{"chainId":1,"address":"0x85eba557c06c348395fd49e35d860f58a4f7c95a","name":"H3X","symbol":"H3X","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11554/thumb/Ps3O6GY.png?1591058696"},{"chainId":1,"address":"0x202f1877e1db1120ca3e9a98c5d505e7f035c249","name":"ZUZ Protocol","symbol":"ZUZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14444/thumb/ZUZ_Icon2-100.png?1616115188"},{"chainId":1,"address":"0xf8f237d074f637d777bcd2a4712bde793f94272b","name":"ERC223","symbol":"ERC223","decimals":10,"logoURI":"https://assets.coingecko.com/coins/images/10946/thumb/20200328_235557.png?1586222500"},{"chainId":1,"address":"0x9ea20fbfaa44efbc60c6728fcdba17f01b7e04fe","name":"Torex","symbol":"TOR","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11570/thumb/logo_%285%29.png?1591227185"},{"chainId":1,"address":"0xe814aee960a85208c3db542c53e7d4a6c8d5f60f","name":"Chronologic","symbol":"DAY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/951/thumb/Chronologic-network.png?1547034815"},{"chainId":1,"address":"0x90f802c7e8fb5d40b0de583e34c065a3bd2020d8","name":"YD ETH MAR21","symbol":"YD-ETH-MAR21","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13481/thumb/uma_logo.jpg?1608998764"},{"chainId":1,"address":"0x3c955e35b6da1ff623d38d750c85b3aed89a10c1","name":"3X Short LEO Token","symbol":"LEOBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10327/thumb/683JEXMN_400x400_%281%29.png?1578050692"},{"chainId":1,"address":"0x1bf7fd22709733ccd7c45ab27dd02c7ec8e50078","name":"Quiztok","symbol":"QTCON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8208/thumb/QTCON.png?1587543372"},{"chainId":1,"address":"0xd2727e4259bba31955fd582986334aea4fba8c52","name":"BLOOD","symbol":"BLOOD","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10079/thumb/xzJDoHiq_400x400.jpg?1575584817"},{"chainId":1,"address":"0x2cad4991f62fc6fcd8ec219f37e7de52b688b75a","name":"Schain Wallet","symbol":"SCHA","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/12135/thumb/schain.png?1597462731"},{"chainId":1,"address":"0x2822f6d1b2f41f93f33d937bc7d84a8dfa4f4c21","name":"Poseidon Network","symbol":"QQQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8442/thumb/LNBLzKy2_400x400.jpg?1558562627"},{"chainId":1,"address":"0x72adadb447784dd7ab1f472467750fc485e4cb2d","name":"Worldcore","symbol":"WRC","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/1358/thumb/worldcore.png?1548761189"},{"chainId":1,"address":"0x6b9f1f092e0b10015a4391a80cd3e6b6cefd1728","name":"LuckySevenToken","symbol":"LST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10553/thumb/lst7.png?1580944195"},{"chainId":1,"address":"0x43ae53b8c920c6c69f4abf393fcb68a6dd4cbab4","name":"RiveMont","symbol":"RVMT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13742/thumb/photo-2020-12-29-03-51-26.jpg?1611373571"},{"chainId":1,"address":"0x15822a64c8cb27d7828c45e0aafc3e6c5decd172","name":"Fear Greed Sentim","symbol":"GREED","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10921/thumb/cryptocat_greed_fear_index_set.png?1585893573"},{"chainId":1,"address":"0xb944b46bbd4ccca90c962ef225e2804e46691ccf","name":"Decore","symbol":"DCORE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12746/thumb/86jI-acy_400x400.png?1602208062"},{"chainId":1,"address":"0xd9a947789974bad9be77e45c2b327174a9c59d71","name":"Ystar","symbol":"YSR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11575/thumb/256_256.png?1600495476"},{"chainId":1,"address":"0x314bd765cab4774b2e547eb0aa15013e03ff74d2","name":"MONEY PARTY","symbol":"PARTY","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/12097/thumb/MoneyPartyIcon.png?1597103516"},{"chainId":1,"address":"0x6913ccabbc337f0ea7b4109dd8200d61c704d332","name":"Asac Coin","symbol":"ASAC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10738/thumb/NiGQ7aKr_400x400.jpg?1582778597"},{"chainId":1,"address":"0x0d5e2681d2aadc91f7da4146740180a2190f0c79","name":"3X Long Huobi Token","symbol":"HTBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10239/thumb/683JEXMN_400x400_%281%29.png?1576633312"},{"chainId":1,"address":"0x71e5fb8793b5a2fb0c4918930180f8b36500cbb8","name":"Electric Token","symbol":"ETR","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10421/thumb/Electric_Token.png?1579171352"},{"chainId":1,"address":"0x9e7cb236e43c4bd042fe463df6a175d4479ee186","name":"Halving","symbol":"HALV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12085/thumb/Halv-logo-200x200.png?1597009175"},{"chainId":1,"address":"0xf0fac7104aac544e4a7ce1a55adf2b5a25c65bd1","name":"Pamp Network","symbol":"PAMP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11546/thumb/pMqJaqDK_400x400.jpg?1595199126"},{"chainId":1,"address":"0xa3e53fe692eeda3502cf5ccfd8a535e1f93d23dd","name":"Celeb","symbol":"CELEB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16402/thumb/celeb.PNG?1623914565"},{"chainId":1,"address":"0x10a34bbe9b3c5ad536ca23d5eefa81ca448e92ff","name":"DSYS","symbol":"DSYS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10478/thumb/4PvxXDdP_400x400.jpg?1579844065"},{"chainId":1,"address":"0x7b3296198f8a548edf89bdb16864da8f37b7d9cb","name":"GoldeNugget","symbol":"GNTO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9974/thumb/gn.png?1574319320"},{"chainId":1,"address":"0x9f8f7ea504588a58b8b24b832b5d25a4aeb4706f","name":"Celeum","symbol":"CLX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10031/thumb/celeum.png?1578022943"},{"chainId":1,"address":"0x3204dcde0c50b7b2e606587663a0fe2ee8dfb6bf","name":"Thore Exchange Toke","symbol":"THEX","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/6915/thumb/photo_2018-11-18_17-49-32.jpg?1547043286"},{"chainId":1,"address":"0xa6312567e419e73951c451feaba07b6d74a0e8ce","name":"SocketFinance","symbol":"SFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12962/thumb/SocketFinance_logo_256_256.png?1603854169"},{"chainId":1,"address":"0x309013d55fb0e8c17363bcc79f25d92f711a5802","name":"Soft Bitcoin","symbol":"SBTC","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12094/thumb/soft_bitcoin_logo.jpg?1597043537"},{"chainId":1,"address":"0x00fc270c9cc13e878ab5363d00354bebf6f05c15","name":"VNX Exchange","symbol":"VNXLU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9945/thumb/vnx.PNG?1573639467"},{"chainId":1,"address":"0xc760721eb65aa6b0a634df6a008887c48813ff63","name":"Cryptorg Token","symbol":"CTG","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11474/thumb/crystal_200.png?1590450209"},{"chainId":1,"address":"0xab55bdef7057b76482914e79f037999f4ebb6bf1","name":"Healing Plus","symbol":"HP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11762/thumb/tXuolcSb_400x400.png?1593588223"},{"chainId":1,"address":"0xbbe5c81412bad19877300d63cc8d8264a154091e","name":"Polar Chain","symbol":"POLA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13818/thumb/download_%2820%29.png?1612051463"},{"chainId":1,"address":"0x903d78ca7d892e4518586d0b64f418bd4ca9a82d","name":"FK Coin","symbol":"FK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9801/thumb/logo.e944e891.png?1571918228"},{"chainId":1,"address":"0x3ca6b185285684e14f925179992387fb4ef90ac7","name":"Cryptocurrency Busi","symbol":"CBT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10512/thumb/37403472_2172303016130423_5092603986280710144_n.jpg?1580339145"},{"chainId":1,"address":"0x2e071d2966aa7d8decb1005885ba1977d6038a65","name":"Etheroll","symbol":"DICE","decimals":16,"logoURI":"https://assets.coingecko.com/coins/images/1232/thumb/etheroll.png?1548125481"},{"chainId":1,"address":"0xdd436a0dce9244b36599ae7b22f0373b4e33992d","name":"TrustUSD","symbol":"TRUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9811/thumb/TrustUSDlogo.png?1589631273"},{"chainId":1,"address":"0xf824402747e5142d04892fdc27c73e6460e80080","name":"Unicly ArtBlocks Co","symbol":"UARTB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15672/thumb/uartblocks.jpeg?1621497079"},{"chainId":1,"address":"0x00ad22ab1006fc282674887aff1114e5ad14077d","name":"PRESTO","symbol":"PRSTX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10503/thumb/prst.PNG?1580250791"},{"chainId":1,"address":"0x6e5a43db10b04701385a34afb670e404bc7ea597","name":"RAKON","symbol":"RKN","decimals":12,"logoURI":"https://assets.coingecko.com/coins/images/8852/thumb/C9KBDYOzWFsO2uCmalxKg2luhpyyNAwANif2HYsTUVgmE0uUv1R5-as2wDyyzGGUwXQ1JLBPVWBXBLxuTfxJaDc7anwthzRz88WkHJY6jqQ3TjQ8PahXr7zPXNeY3bROXhyo7m6BwqPAfbWnj32C--OsErHB1DzDezp8YVR2vRL_hz0bRltRuH8pvAOVaeSr3MbE_BIPaV-UNSmfpBDPWIv1xq5Z42xZ_t9Z6vZVi9rAcaDp.jpg?1577831830"},{"chainId":1,"address":"0xf6923f7d96fc22c4b8010a865e41cf7edfb6379c","name":"IOOX System","symbol":"IOOX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11767/thumb/R7PBzPuN_400x400.jpg?1593662861"},{"chainId":1,"address":"0x6b74dd5d01f8320081247f5cf1f7a48324700db6","name":"UBU","symbol":"UBU","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10686/thumb/NFGYEIaA_400x400_%281%29.png?1586763969"},{"chainId":1,"address":"0x23352036e911a22cfc692b5e2e196692658aded9","name":"Friendz","symbol":"FDZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3685/thumb/download_%2812%29.png?1547038682"},{"chainId":1,"address":"0xb8323cfafb0e6cc60ce332f1181d56e91ba0d8ba","name":"Myteamcoin","symbol":"MYC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16041/thumb/200x2001.png?1622683811"},{"chainId":1,"address":"0xbddab785b306bcd9fb056da189615cc8ece1d823","name":"Ebakus","symbol":"EBK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9927/thumb/F9LHFTevrWW8hLadB7x6DBF_c_32iQtKEEmX5bkqI_N3bryFVfbrgIbj6dDFj7INHNR4Vx7VpHO2_ao9C6JZP-h51ICHZzmYbSsuotC2J3X2_gRAyNUdVt3M6q0Q6NSlhP0O24HNqL_I4bmI7xPWOR6iirprnNH9WaYsfU3RVevay2FgWgvum_2dL85xLCUXvD4nvXiPnbxeiRf18.jpg?1573464332"},{"chainId":1,"address":"0x0077d27cb82ff12322987b225bfce0bb6e8931b4","name":"Corra Finance","symbol":"CORA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15684/thumb/corra.PNG?1621557324"},{"chainId":1,"address":"0x638155f4bd8f85d401da32498d8866ee39a150b8","name":"Jurasaur","symbol":"JREX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11792/thumb/jura_logo.png?1594172306"},{"chainId":1,"address":"0x98a25ba4c3793b9029652cbc1a8875cbe223df13","name":"ETH Momentum Trigge","symbol":"ETHMO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11650/thumb/ethmo.png?1592324820"},{"chainId":1,"address":"0xc9287623832668432099cef2ffdef3ced14f4315","name":"3X Long Tether Gold","symbol":"XAUTBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11979/thumb/683JEXMN_400x400__1_.png?1596618665"},{"chainId":1,"address":"0x4f56221252d117f35e2f6ab937a3f77cad38934d","name":"CryptoCricketClub","symbol":"3CS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11685/thumb/crypto-cricket-club-logo-e1592305032921.png?1592793917"},{"chainId":1,"address":"0x3e522d144814bd6149c1f3e0c6cd19d0941372ac","name":"Goldblock","symbol":"GBK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10792/thumb/goldblock.PNG?1585523631"},{"chainId":1,"address":"0x4a7adcb083fe5e3d6b58edc3d260e2e61668e7a2","name":"Trade Butler Bot","symbol":"TBB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13462/thumb/L9km5LC5ZKpTey0UKcTMt9xbXw_Q0Nq8F119_QjJlqLHvuxLK6vb_VjxHtXYczia0DHXHSxhtCFUCVyMBBxJNw_-tkS3FTpoeEFs7EHuxrxs7b2hV_se2JzisurH7YQmRjXIq3wG6Va6zv90ug_uRGeuk-VoAfck7rBdnoUCGL-Xfmz7AySAn6SUVToUCtwObez36TEADBc7AR9.jpg?1608766426"},{"chainId":1,"address":"0x6bff2fe249601ed0db3a87424a2e923118bb0312","name":"Fyooz","symbol":"FYZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12202/thumb/fyooz.png?1598017956"},{"chainId":1,"address":"0x435d664f72d6f194ef67d63b5f3936650187b131","name":"Pocket Node","symbol":"NODE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10376/thumb/u1L_YtHS_400x400.jpg?1583377126"},{"chainId":1,"address":"0xee0f286776639cd363da810daf3e0623f82576b0","name":"Lung Protocol","symbol":"L2P","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11799/thumb/64280570.png?1594359841"},{"chainId":1,"address":"0x9b683d81b8334325bcc1802d47de65571993fe89","name":"CoinBene Future Tok","symbol":"CFT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10657/thumb/coinbenefuturet.PNG?1581459701"},{"chainId":1,"address":"0x58a3520d738b268c2353ecee518a1ad8e28e4ae5","name":"HEIDI","symbol":"HDI","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/11679/thumb/Untitled-design-4-removebg-preview.png?1592789518"},{"chainId":1,"address":"0x2590f1fd14ef8bb0a46c7a889c4cbc146510f9c3","name":"Inverse Bitcoin Vol","symbol":"IBTCV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16718/thumb/logo_-_2021-06-28T093119.133.png?1624843921"},{"chainId":1,"address":"0x0b66015bc42601d5986b540373b4e02d7383c7c1","name":"Fission Cash","symbol":"FCX","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13620/thumb/FCX-Logo-W-e1609294744561.png?1610333962"},{"chainId":1,"address":"0xbdbb0ee6144544ec814d417b0ad41f16fc8b858e","name":"BitKAM","symbol":"KAM","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10310/thumb/D-MAj4JR_400x400.jpg?1577829013"},{"chainId":1,"address":"0x804e26c4eff0bb196b805bdfb5b29ab828cf0b1f","name":"Whale Coin","symbol":"WHALE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10743/thumb/whalecoin200.png?1582835568"},{"chainId":1,"address":"0x0d4b4da5fb1a7d55e85f8e22f728701ceb6e44c9","name":"DigiMax","symbol":"DGMT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11807/thumb/0053e154-964b-485a-9827-d3ef7015a9b9.png?1594375316"},{"chainId":1,"address":"0x375a08ce3a460f20bbafd282be1e3579a2c31f41","name":"Thaler Group Compan","symbol":"TGCO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10742/thumb/thaler_logo_png_200x200.png?1582834531"},{"chainId":1,"address":"0x94501b6a153c8973fd1f321fcc8188d40dc5d72d","name":"DigiDinar Token","symbol":"DDRT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10415/thumb/8WbpGRw.png?1579128643"},{"chainId":1,"address":"0x688ff43c3c19e4714f0beb76df8ee394207ab411","name":"CitiOS","symbol":"R2R","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10670/thumb/5204.png?1581542842"},{"chainId":1,"address":"0x174bfa6600bf90c885c7c01c7031389ed1461ab9","name":"MGC Token","symbol":"MGC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8469/thumb/mgc.png?1558768022"},{"chainId":1,"address":"0x4599836c212cd988eaccc54c820ee9261cdaac71","name":"Cryptid","symbol":"CID","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11692/thumb/yWrCHzW.png?1592799534"},{"chainId":1,"address":"0x305f8157c1f841fbd378f636abf390c5b4c0e330","name":"Bitcoin Galaxy Warp","symbol":"BTCGW","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10359/thumb/BITCOIN-GALAXY-WARP-200x200-logo.png?1578523873"},{"chainId":1,"address":"0x0a913bead80f321e7ac35285ee10d9d922659cb7","name":"DOS Network","symbol":"DOS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7991/thumb/DOS.png?1552900889"},{"chainId":1,"address":"0x37e808f084101f75783612407e7c3f5f92d8ee3f","name":"RI Token","symbol":"RI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12536/thumb/Ri_logo_512x512.png?1601775196"},{"chainId":1,"address":"0x6653c0d21507573cc39ead1e609d74d5e0ca16e2","name":"ReFork","symbol":"EFK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12267/thumb/ppYvWW7.png?1598617719"},{"chainId":1,"address":"0x3cc5eb07e0e1227613f1df58f38b549823d11cb9","name":"Ethereum eRush","symbol":"EER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10695/thumb/0x6f371ca338bbddd0baf719e1d5d0797cce20774f.png?1582153688"},{"chainId":1,"address":"0x9ba00d6856a4edf4665bca2c2309936572473b7e","name":"Aave USDC v1","symbol":"AUSDC","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/11674/thumb/aUSDC.png?1592546449"},{"chainId":1,"address":"0xd957e08ac5421e2c28510586b57d095e5094836a","name":"VorteX Network","symbol":"VTX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10543/thumb/256x256.png?1607154365"},{"chainId":1,"address":"0x9ea463ec4ce9e9e5bc9cfd0187c4ac3a70dd951d","name":"ETH 20 Day MA Cross","symbol":"ETH20SMACO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10616/thumb/eth-20-day-moving-average-set.png?1580971906"},{"chainId":1,"address":"0xb4742e2013f96850a5cef850a3bb74cf63b9a5d5","name":"EANTO","symbol":"EAN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11120/thumb/BKL0LdS7_400x400.png?1588730490"},{"chainId":1,"address":"0xbd0793332e9fb844a52a205a233ef27a5b34b927","name":"ZB Token","symbol":"ZB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4773/thumb/zb-token-logo.png?1547040106"},{"chainId":1,"address":"0x0d5bb28972e0b2d63732f558b4af265aa5407467","name":"7Chain","symbol":"VII","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/10733/thumb/Xvp5w6kB_400x400.jpg?1582698538"},{"chainId":1,"address":"0x4b4f5286e0f93e965292b922b9cd1677512f1222","name":"YUNo Finance","symbol":"YUNO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12297/thumb/y.png?1598942444"},{"chainId":1,"address":"0x1b7c4d4f226ccf3211b0f99c4fdfb84a2606bf8e","name":"Orb V2","symbol":"ORB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12686/thumb/favicon_%281%29.png?1601630265"},{"chainId":1,"address":"0x3d61e677944204cd1002202912a2b7a43a8e2823","name":"New USDf","symbol":"USDF","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/14871/thumb/K-wEfxTZ_400x400.jpg?1618817701"},{"chainId":1,"address":"0xa15690e9205de386ce849889831c1668c300c1ad","name":"pETH18C","symbol":"PETH18C","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14646/thumb/peth8a.png?1617489575"},{"chainId":1,"address":"0xfcfc434ee5bff924222e084a8876eee74ea7cfba","name":"Rebasing Liquidity","symbol":"DELTARLP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14583/thumb/delta_financial.jpg?1617150170"},{"chainId":1,"address":"0x87b87a7583d8d8f15b58bdd290318386ac8ee174","name":"Digiwill","symbol":"DGW","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13086/thumb/logo_200_%281%29.png?1604986880"},{"chainId":1,"address":"0x27ed129c298c5df130364083f491e2920e5a2f29","name":"Upper Pound","symbol":"GBPU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12357/thumb/UPPER-moeda-pound.png?1599261441"},{"chainId":1,"address":"0xcb3df3108635932d912632ef7132d03ecfc39080","name":"Wing Shop","symbol":"WING","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12318/thumb/6584.png?1599087626"},{"chainId":1,"address":"0xcad2d4c4469ff09ab24d02a63bcedfcd44be0645","name":"Crypto Accept","symbol":"ACPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12531/thumb/crypto-accept.png?1600497829"},{"chainId":1,"address":"0xf0be50ed0620e0ba60ca7fc968ed14762e0a5dd3","name":"Cowboy Finance","symbol":"COW","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12228/thumb/cowboy.png?1598309446"},{"chainId":1,"address":"0x123151402076fc819b7564510989e475c9cd93ca","name":"Wrapped DGLD","symbol":"WDGLD","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13301/thumb/wrappeddgld_32.png?1607310693"},{"chainId":1,"address":"0x14409b0fc5c7f87b5dad20754fe22d29a3de8217","name":"PYRO Network","symbol":"PYRO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10413/thumb/ldWtWr6.png?1579127581"},{"chainId":1,"address":"0xe61eecfdba2ad1669cee138f1919d08ced070b83","name":"VGTGToken","symbol":"VGTG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11742/thumb/vgtg_gold_209x209.png?1593142842"},{"chainId":1,"address":"0x466912baa9430a4a460b141ee8c580d817441449","name":"BLOCKMAX","symbol":"OCB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12315/thumb/200x200-01.png?1599086761"},{"chainId":1,"address":"0x685aea4f02e39e5a5bb7f7117e88db1151f38364","name":"Shill","symbol":"POSH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12548/thumb/alone.png?1600676559"},{"chainId":1,"address":"0xe7976c4efc60d9f4c200cc1bcef1a1e3b02c73e7","name":"MAX Token","symbol":"MAX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6454/thumb/MAX_Token.jpg?1547042651"},{"chainId":1,"address":"0xd1ef9a7310d0806855c672288ef5a1bab62cef33","name":"BELIEVER","symbol":"BLVR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11662/thumb/belevier_logo.png?1592432917"},{"chainId":1,"address":"0xc0ea83113038987d974fe667831a36e442e661e7","name":"Libfx","symbol":"LIBFX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12225/thumb/libfx.png?1598306252"},{"chainId":1,"address":"0xff1beda5ca92a83d05323e338d0534410858b6a2","name":"DIVO Token","symbol":"DIVO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9845/thumb/divo.PNG?1572591861"},{"chainId":1,"address":"0xdaab5e695bb0e8ce8384ee56ba38fa8290618e52","name":"CRDT","symbol":"CRDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11859/thumb/image_%281%29.png?1600937373"},{"chainId":1,"address":"0x42edc1c5ff57ff5240c90e2d8dfa269d77d68013","name":"Bitnorm","symbol":"BN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14920/thumb/logo_2.71b730c9.png?1619043921"},{"chainId":1,"address":"0x265ba42daf2d20f3f358a7361d9f69cb4e28f0e6","name":"Unibomb","symbol":"UBOMB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11722/thumb/aLjLmGNT_400x400.png?1596603288"},{"chainId":1,"address":"0x5dbe296f97b23c4a6aa6183d73e574d02ba5c719","name":"Level Up Coin","symbol":"LUC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1772/thumb/luc.png?1547036065"},{"chainId":1,"address":"0x7533d63a2558965472398ef473908e1320520ae2","name":"INTEXCOIN","symbol":"INTX","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/11854/thumb/INTX.png?1595167044"},{"chainId":1,"address":"0x2ab05b915c30093679165bcdba9c26d8cd8bee99","name":"BitCherry","symbol":"BCHC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11655/thumb/1JhE8tWnG6kmVCr.png?1592356873"},{"chainId":1,"address":"0x26a79bd709a7ef5e5f747b8d8f83326ea044d8cc","name":"BankSocial","symbol":"BSOCIAL","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/15738/thumb/banksocial_small.png?1621685752"},{"chainId":1,"address":"0x080eb7238031f97ff011e273d6cad5ad0c2de532","name":"Kittoken","symbol":"KIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7495/thumb/hQ3j84k.png?1548561187"},{"chainId":1,"address":"0x287609a15a683640a5bbc4d93d4d5f4ed6bad3a0","name":"PICK","symbol":"PICK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12243/thumb/nZlFKAmk_400x400.jpg?1598444299"},{"chainId":1,"address":"0xec1a718d1a6f8f8d94ecec6fe91465697bb2b88c","name":"Entone","symbol":"ENTONE","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11783/thumb/Logo200_%288%29.png?1594000418"},{"chainId":1,"address":"0x564393b8d6deaea8f3d739a3f6d9b441d8ee6198","name":"AMIX","symbol":"AMIX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12154/thumb/amix_logo.png?1597701271"},{"chainId":1,"address":"0x5ecb025e51415dba9fd272c551076357cf4069f5","name":"Crespo","symbol":"CSO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9125/thumb/crespo.png?1564547729"},{"chainId":1,"address":"0x1fa3bc860bf823d792f04f662f3aa3a500a68814","name":"1X Short Bitcoin To","symbol":"HEDGE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10219/thumb/683JEXMN_400x400.png?1596706467"},{"chainId":1,"address":"0x46f4e420c75401494a39b70653f4bbb88ad2d728","name":"WenBurn","symbol":"WENB","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/12557/thumb/moonOnFire.jpg?1600746273"},{"chainId":1,"address":"0x784561b89a160990f46de6db19571ca1b5f14bce","name":"Most Protocol","symbol":"MOST","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12162/thumb/most_protocol_logo.png?1597728245"},{"chainId":1,"address":"0xe9a95d175a5f4c9369f3b74222402eb1b837693b","name":"ChangeNOW","symbol":"NOW","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8224/thumb/nowtoken.png?1557131607"},{"chainId":1,"address":"0x74b1af114274335598da72f5c6ed7b954a016eed","name":"HitBTC Token","symbol":"HIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16395/thumb/JgMkz95.png?1623909204"},{"chainId":1,"address":"0x0bead9a1bcc1b84d06e3f2df67e3549fd55ab054","name":"EURxb","symbol":"EURXB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14300/thumb/eurxb.png?1615341210"},{"chainId":1,"address":"0x5f7fa1a0ae94b5dd6bb6bd1708b5f3af01b57908","name":"YFIKing Finance","symbol":"YFIKING","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12395/thumb/Kinglog_200px.png?1599550956"},{"chainId":1,"address":"0x708aa4e8aaeaad6074dd09cc4e5c52a70452eb39","name":"Bitcoffeen","symbol":"BFF","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10735/thumb/Iz2489xQ_400x400.png?1582701365"},{"chainId":1,"address":"0xe33f363351186e185470f35f6deb94aba44347d8","name":"Basid Coin","symbol":"BASID","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12566/thumb/basid-logo.png?1600827668"},{"chainId":1,"address":"0x041fdd6637ecfd96af8804278ac12660ac2d12c0","name":"SwapDEX","symbol":"SDX","decimals":7,"logoURI":"https://assets.coingecko.com/coins/images/13717/thumb/sdx.png?1611116537"},{"chainId":1,"address":"0x26548041e3a78fdc60f3cce21977e1f5e46561b7","name":"ZuCoinChain","symbol":"ZCC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10748/thumb/erc20logo.png?1582838761"},{"chainId":1,"address":"0xb9eceb9f717852ad0d936b46155cb0c0f43cbe8e","name":"Ubiner","symbol":"UBIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12190/thumb/ubin.PNG?1597965582"},{"chainId":1,"address":"0x7ef1081ecc8b5b5b130656a41d4ce4f89dbbcc8c","name":"Compounder","symbol":"CP3R","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13182/thumb/compounder_logo.png?1606018434"},{"chainId":1,"address":"0x9b1b1e109ff130b298cf1d47389c47569f5c2932","name":"Biido","symbol":"BION","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9925/thumb/biido.PNG?1573462230"},{"chainId":1,"address":"0x5935ffc231e93ac04daa089c0f1b94d0fb2449de","name":"Kanva","symbol":"KNV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13138/thumb/5uoWII9M_400x400.png?1605592792"},{"chainId":1,"address":"0xb55732a15b3dc5d6e8d4adf40634f37470da71fa","name":"ECPN Token","symbol":"ECPN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9312/thumb/favicon-196x196.png?1566117837"},{"chainId":1,"address":"0x564f45b6bb68aded8b660a0d8a0a948dd6d6e4e8","name":"Aladiex","symbol":"ALA","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12312/thumb/logo_%2894%29.png?1599083659"},{"chainId":1,"address":"0x3e1e15afd5d50b090adcc88160dd84a48ea1b80e","name":"vSPY","symbol":"VSPY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13944/thumb/itovault_logo.png?1613171346"},{"chainId":1,"address":"0xca5d29b3e74d59ebcdf09111495d86f319886a40","name":"WHEY","symbol":"WHEY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14883/thumb/WHEY_logo_black_0421_v1.png?1618893173"},{"chainId":1,"address":"0x08aa0ed0040736dd28d4c8b16ab453b368248d19","name":"Cryptobuyer Token","symbol":"XPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10845/thumb/XPT.png?1584775672"},{"chainId":1,"address":"0x7cf74238d48ce383db00a1efff8da99303552cb0","name":"i9 Coin","symbol":"I9C","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12399/thumb/Vvm9V6YM_400x400.png?1599556271"},{"chainId":1,"address":"0xf45f6c8bb3d77ea762175b8f7ca4d251941649fa","name":"Lemond","symbol":"LEMD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14964/thumb/D-smP_i-_400x400.png?1619166250"},{"chainId":1,"address":"0x1e71034c89dd191accb27dc35f18a3d8b6f91311","name":"Free Tool Box","symbol":"FTB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12188/thumb/logo-full-white.png?1597962794"},{"chainId":1,"address":"0x8ba009cad493c7646e31d69428ab9a54f47b3779","name":"VirgoX Token","symbol":"VXT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12510/thumb/VIrgoX_logo.png?1600354936"},{"chainId":1,"address":"0xa829f97373069ee5d23175e4105df8fd49238be7","name":"Opennity","symbol":"OPNN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9358/thumb/53672059_554715805021197_5765693264996859904_n.jpg?1566526789"},{"chainId":1,"address":"0x2e6e152d29053b6337e434bc9be17504170f8a5b","name":"Yearn Finance Ecosy","symbol":"YFIEC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12650/thumb/pypIqcG.jpg?1601431822"},{"chainId":1,"address":"0xe55cc44c0cf9cede2d68f9432cbeeafa6357ed92","name":"Rozeus","symbol":"ROZ","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9917/thumb/vO7f-6gR_400x400.jpg?1573457563"},{"chainId":1,"address":"0x03e4bdce611104289333f35c8177558b04cc99ff","name":"Yield Stake Finance","symbol":"YI12","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12708/thumb/yi12_logo.jpg?1601894672"},{"chainId":1,"address":"0xb8fa12f8409da31a4fc43d15c4c78c33d8213b9b","name":"CaliCoin","symbol":"CALI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14998/thumb/cropped-Logo-transparent-background-1.png?1619392357"},{"chainId":1,"address":"0x6d10e0194400a04600881057787eb9e9c063dca0","name":"Proton Project","symbol":"PRTN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14888/thumb/Golden-PRTN-Logo.jpeg?1618899544"},{"chainId":1,"address":"0xd82bb924a1707950903e2c0a619824024e254cd1","name":"DAOfi","symbol":"DAOFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12782/thumb/logocircle.png?1611944557"},{"chainId":1,"address":"0x87f5e8c3425218837f3cb67db941af0c01323e56","name":"BitCoin One","symbol":"BTCONE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5413/thumb/b-one.png?1574907888"},{"chainId":1,"address":"0x5979f50f1d4c08f9a53863c2f39a7b0492c38d0f","name":"pTokens LTC","symbol":"PLTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12436/thumb/pLTC_logo.png?1599819176"},{"chainId":1,"address":"0x559efe1d7a54fb1c7f25a036952f8498cdf02edb","name":"DOGG Token","symbol":"DOGG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15611/thumb/Over-Page-0-1-256x.png?1621319887"},{"chainId":1,"address":"0x187eff9690e1f1a61d578c7c492296eaab82701a","name":"Moar Finance","symbol":"MOAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15057/thumb/moar.PNG?1619589388"},{"chainId":1,"address":"0x16b0a1a87ae8af5c792fabc429c4fe248834842b","name":"Algory","symbol":"ALG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12231/thumb/logo-2.png?1605256312"},{"chainId":1,"address":"0x92416e32042c9e67b0771a1b00bcdf92ecb64950","name":"Bulldog Token","symbol":"BDOG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14843/thumb/bulldogFINAL.png?1621916103"},{"chainId":1,"address":"0x68481f2c02be3786987ac2bc3327171c5d05f9bd","name":"Based Loans Ownersh","symbol":"BLO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14982/thumb/based-loans-logo-200.png?1619246801"},{"chainId":1,"address":"0xc88f47067db2e25851317a2fdae73a22c0777c37","name":"oneBTC","symbol":"ONEBTC","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15082/thumb/G9oJy1-R.png?1619660359"},{"chainId":1,"address":"0x4534492034a2cd3eab34c8f357cd139c95b09f52","name":"Marshal Lion Group ","symbol":"MLGC","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/9873/thumb/UI_KObqV_400x400.jpg?1572908129"},{"chainId":1,"address":"0x17e347aad89b30b96557bcbfbff8a14e75cc88a1","name":"Unicly Bored Ape Ya","symbol":"UAPE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16221/thumb/Capture.PNG?1623324936"},{"chainId":1,"address":"0xd38de88687172bde440755b5237987e4a87c23a7","name":"AEN Smart Token","symbol":"AENS","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/15163/thumb/x58-DmSw.png?1620007469"},{"chainId":1,"address":"0x5456bc77dd275c45c3c15f0cf936b763cf57c3b5","name":"Anchor","symbol":"ANCT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9926/thumb/T2BwU9Il_400x400.jpg?1573463847"},{"chainId":1,"address":"0x428dc22668e6f3468273634067e5545ed5417a3e","name":"MiraQle","symbol":"MQL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12278/thumb/2VTVSgXn_400x400.jpg?1598738364"},{"chainId":1,"address":"0x48c3399719b582dd63eb5aadf12a40b4c3f52fa2","name":"StakeWise","symbol":"SWISE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15044/thumb/stakewise200.png?1619520721"},{"chainId":1,"address":"0x4d953cf077c0c95ba090226e59a18fcf97db44ec","name":"Mini","symbol":"MINI","decimals":19,"logoURI":"https://assets.coingecko.com/coins/images/12298/thumb/IrTAVc_GqZ7iQucAa3fNYlh_Cqt3tY9wM_pmzOl5SifscRMpuzrp_dizMzGTiMr_NxDJPCKigBgz8THrzvO_DqT3JLzqZIYeytDBRw3qKI73dljS0BnFaaI2aLadpdCZah4RkhydddLIDDbQlGit77farlQRaq7qEgxdjVe0aqEeh4phE-DWAKi_KS_Yz-fFdDfjWgifVCKkZRBeNSWWQEplxxl.jpg?1598961320"},{"chainId":1,"address":"0x6be7e93e45740c314c89a3be52473a0ddf2450fe","name":"XCredit","symbol":"XFYI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12979/thumb/xcredit_finance_logo.jpg?1604040780"},{"chainId":1,"address":"0xd91a6162f146ef85922d9a15ee6eb14a00344586","name":"SESSIA","symbol":"KICKS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8068/thumb/kicks-logo.png?1554123004"},{"chainId":1,"address":"0x4aa41bc1649c9c3177ed16caaa11482295fc7441","name":"Xfit","symbol":"XFIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14904/thumb/xfit_logo.png?1618967174"},{"chainId":1,"address":"0x53884b61963351c283118a8e1fc05ba464a11959","name":"Monnos","symbol":"MNS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11640/thumb/logo_%2880%29.png?1592274153"},{"chainId":1,"address":"0x6b4389afb3e243a65668b7311fa9ef092a8a3b64","name":"Real Coin","symbol":"REAL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14914/thumb/Real-LOGO_fav_Retina.png?1618989895"},{"chainId":1,"address":"0xb48e0f69e6a3064f5498d495f77ad83e0874ab28","name":"CXN Network","symbol":"CXN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12622/thumb/Webp.net-resizeimage.png?1601282522"},{"chainId":1,"address":"0x8b1f49491477e0fb46a29fef53f1ea320d13c349","name":"MicroMoney","symbol":"AMM","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/1356/thumb/micromoney.png?1548085045"},{"chainId":1,"address":"0x898bad2774eb97cf6b94605677f43b41871410b1","name":"vEth2","symbol":"VETH2","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15350/thumb/vEth2_200.png?1620625501"},{"chainId":1,"address":"0x57c09a8de0b0f471f8567609777addffb5c46a08","name":"Bitex Global XBX Co","symbol":"XBX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4249/thumb/lI08UUfi_400x400.jpg?1547203502"},{"chainId":1,"address":"0x70968feaf13299d0dbf78f66860bab9dbe3856bc","name":"Treelion","symbol":"TRN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9630/thumb/yvXR4R-F_400x400.jpg?1570001020"},{"chainId":1,"address":"0x2565ae0385659badcada1031db704442e1b69982","name":"Assemble Protocol","symbol":"ASM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11605/thumb/gpvrlkSq_400x400_%281%29.jpg?1591775789"},{"chainId":1,"address":"0x82bdfb4c6f488fc47700cef12c448a2f13f8ff4f","name":"SealBlock Token","symbol":"SKT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8520/thumb/YEf7izTR_400x400.jpg?1559100937"},{"chainId":1,"address":"0xb3dd5dce850dca7519e74a943568b69f958df52c","name":"UniversalEnergyChai","symbol":"UENC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8301/thumb/uenc.png?1557317299"},{"chainId":1,"address":"0x817e2addceaa4907623666a7800b1553ca21192d","name":"Unbox Art","symbol":"UBA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14915/thumb/unbox.art_logo_B_W_200.png?1618997265"},{"chainId":1,"address":"0x42891d10b550d0c5c4ac2e17bcd7e2a19c7230f0","name":"Daxhund","symbol":"DXH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14861/thumb/logo_coingecko.png?1618808438"},{"chainId":1,"address":"0x0a8b16b27d5219c8c6b57d5442ce31d81573eee4","name":"Wrapped ATROMG8","symbol":"WAG8","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/15182/thumb/ag8.jpg?1620031331"},{"chainId":1,"address":"0x0557e0d15aec0b9026dd17aa874fdf7d182a2ceb","name":"CFX Quantum","symbol":"CFXQ","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/15031/thumb/CFXQ_TOKEN_LOGO_200x200.png?1619500058"},{"chainId":1,"address":"0x150b0b96933b75ce27af8b92441f8fb683bf9739","name":"Dragonereum GOLD","symbol":"GOLD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9905/thumb/PO04AL0y_400x400.jpg?1573437136"},{"chainId":1,"address":"0x1017b147b05942ead495e2ad6d606ef3c94b8fd0","name":"Vanilla","symbol":"VNL","decimals":12,"logoURI":"https://assets.coingecko.com/coins/images/14679/thumb/vnl.png?1617714590"},{"chainId":1,"address":"0x083d41d6dd21ee938f0c055ca4fb12268df0efac","name":"GogolCoin","symbol":"GOL","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/14824/thumb/GOL.png?1618559300"},{"chainId":1,"address":"0x4df76a9dab9bb8310e4ad3dc4336a8e26ed24ebb","name":"SAPPCHAIN","symbol":"SAPP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8729/thumb/output-onlinepngtools_%282%29.png?1623159818"},{"chainId":1,"address":"0x1412f6aa5adc77c620715bb2a020aa690b85f68a","name":"MargiX","symbol":"MGX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9865/thumb/MGX_Logo.png?1603614181"},{"chainId":1,"address":"0x676a32b50e58924effad343f1d4d3c8dd0128889","name":"7Plus Coin","symbol":"SV7","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14922/thumb/K-s1DLEA_400x400.jpg?1619059570"},{"chainId":1,"address":"0x618e75ac90b12c6049ba3b27f5d5f8651b0037f6","name":"QASH","symbol":"QASH","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/1220/thumb/qash.jpeg?1547035247"},{"chainId":1,"address":"0x9a24b8e8a6d4563c575a707b1275381119298e60","name":"EVNY Token","symbol":"EVNY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14555/thumb/envy.jpg?1616999935"},{"chainId":1,"address":"0xa72b32f11c49f3f9aa14125c4c89a9c60c390eb4","name":"ZG Blockchain Token","symbol":"ZGT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9922/thumb/ABUIABAEGAAg2eSz5wUo0PGJ7QYwmAU4bA.png?1573461439"},{"chainId":1,"address":"0x05fcc72cfb4150abae415c885f7a433ff523296f","name":"YOKcoin","symbol":"YOK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12425/thumb/YOKcoin_200x200.png?1599732314"},{"chainId":1,"address":"0x0e1fe60bc4ac0e3102343752ae7e49d01d444c0b","name":"Havens Nook","symbol":"HXN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14876/thumb/havennook.PNG?1618881827"},{"chainId":1,"address":"0x69fa0fee221ad11012bab0fdb45d444d3d2ce71c","name":"Thorstarter","symbol":"XRUNE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16835/thumb/thorstarter.jpg?1625279004"},{"chainId":1,"address":"0x70debcdab2ef20be3d1dbff6a845e9ccb6e46930","name":"BIKI","symbol":"BIKI","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8119/thumb/BiKi_icon.png?1581935375"},{"chainId":1,"address":"0x1b2a76da77d03b7fc21189d9838f55bd849014af","name":"DeFiScale","symbol":"DFC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/14974/thumb/logo200x200-2.png?1619214186"},{"chainId":1,"address":"0xd9bae39c725a1864b1133ad0ef1640d02f79b78c","name":"Touch Social","symbol":"TST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12355/thumb/RhEvWed.png?1599260984"},{"chainId":1,"address":"0xa9080bf7c8e55f2af5c6603243d5865f4f328715","name":"MARKYT","symbol":"MAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9897/thumb/4nVXqSYU_400x400.jpg?1573162305"},{"chainId":1,"address":"0x831091da075665168e01898c6dac004a867f1e1b","name":"Gains Farm","symbol":"GFARM2","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13703/thumb/gfarm_v2.png?1611035398"},{"chainId":1,"address":"0x68a9d92fe19399feebed6a9a0980a7ea7638074c","name":"Iqoniq","symbol":"IQQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14672/thumb/IQONIQ-Cointransparant.png?1617678461"},{"chainId":1,"address":"0x672ef7e4fe230b5ca1466c5fdd40588d30fdf90a","name":"Wolves of Wall Stre","symbol":"WOWS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14365/thumb/wows_logo.png?1615704838"},{"chainId":1,"address":"0x51bc0deaf7bbe82bc9006b0c3531668a4206d27f","name":"RAKUN","symbol":"RAKU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10768/thumb/Rakun_Icon_Red_200x200.png?1583310899"},{"chainId":1,"address":"0xb9464ef80880c5aea54c7324c0b8dd6ca6d05a90","name":"LOCK Token","symbol":"LOCK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12429/thumb/sherlock.jpg?1599780187"},{"chainId":1,"address":"0xb7ba8461664de526a3ae44189727dfc768625902","name":"YMPL","symbol":"YMPL","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12194/thumb/xm0vpJqS_400x400.jpg?1597984439"},{"chainId":1,"address":"0x6b785a0322126826d8226d77e173d75dafb84d11","name":"Bankroll Vault","symbol":"VLT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11638/thumb/vlt-200.png?1592272725"},{"chainId":1,"address":"0x168e39f96a653ce0a456560687241b0b2936e5ff","name":"2Based Finance","symbol":"2BASED","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13439/thumb/2based.jpg?1608564864"},{"chainId":1,"address":"0x1da01e84f3d4e6716f274c987ae4bee5dc3c8288","name":"DeFi Bids","symbol":"BID","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12344/thumb/IMG_20200919_115022_477.png?1600739441"},{"chainId":1,"address":"0x8ef47555856f6ce2e0cd7c36aef4fab317d2e2e2","name":"PayAccept","symbol":"PAYT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12513/thumb/logo.png?1603801944"},{"chainId":1,"address":"0x9080e92296a176883aab1d7d1b7e50bc055b0caa","name":"YFI Credits Group","symbol":"YFICG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12932/thumb/70994628.png?1603697599"},{"chainId":1,"address":"0x6e0dade58d2d89ebbe7afc384e3e4f15b70b14d8","name":"QuiverX","symbol":"QRX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12916/thumb/qrx_logo.png?1603550478"},{"chainId":1,"address":"0xa211f450ce88deb31d3f12ae3c1ebf6b0e55a5d9","name":"Parsiq Boost","symbol":"PRQBOOST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13144/thumb/boost_logo.png?1605600652"},{"chainId":1,"address":"0x624d520bab2e4ad83935fa503fb130614374e850","name":"Smartshare","symbol":"SSP","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/4642/thumb/smartshare.png?1548609894"},{"chainId":1,"address":"0x35101c731b1548b5e48bb23f99edbc2f5c341935","name":"BlackHoleSwap Compo","symbol":"BHSC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12347/thumb/blackhole.PNG?1599201917"},{"chainId":1,"address":"0x1cc0744c5106bb47a61c4e41f517cb6f1c49b547","name":"Chalice Finance","symbol":"CHAL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13432/thumb/chalice_logo.png?1608526094"},{"chainId":1,"address":"0xfdbc1adc26f0f8f8606a5d63b7d3a3cd21c22b23","name":"1World","symbol":"1WO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/3443/thumb/unnamed.png?1547038151"},{"chainId":1,"address":"0x0501e7a02c285b9b520fdbf1badc74ae931ad75d","name":"Walnut finance","symbol":"WTF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12301/thumb/photo_2020-08-31_04-24-32.jpg?1598968170"},{"chainId":1,"address":"0xfe76be9cec465ed3219a9972c21655d57d21aec6","name":"PalletOneToken","symbol":"PTN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6669/thumb/palletone.png?1548330460"},{"chainId":1,"address":"0xacfe45c352c902ae3a3f9b6bfe6ec994c5d791bf","name":"megaBonk","symbol":"MBONK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14996/thumb/Bonk_v2_gecko.png?1619391636"},{"chainId":1,"address":"0x834ce7ad163ab3be0c5fd4e0a81e67ac8f51e00c","name":"Polkainsure Finance","symbol":"PIS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13544/thumb/Logo_Polkainsure___Final-200x200-01.png?1609686092"},{"chainId":1,"address":"0x7713bcda5106424ff6b0ae1e7fa05c3f4ae3ecb0","name":"Grafsound","symbol":"GSMT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12583/thumb/Logo200_200-GSMT.png?1600927635"},{"chainId":1,"address":"0x281f5b914b0d589f8193cd5e711c6920874e00c8","name":"MBM Token","symbol":"MBM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10515/thumb/MBM_token.png?1580422618"},{"chainId":1,"address":"0x41efc0253ee7ea44400abb5f907fdbfdebc82bec","name":" AAPL","symbol":"AAPL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12367/thumb/oF1_9R1K_400x400.jpg?1599345463"},{"chainId":1,"address":"0xb89903dde3899f0280b99913168ee833a7896b93","name":"AurusSILVER","symbol":"AWS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14965/thumb/Aurus-AWS-outline-3x.png?1619164424"},{"chainId":1,"address":"0x94fa7f8cb8453ad57cd133363b3012044647078c","name":"RealT Token 1244 ","symbol":"REALTOKEN-S-1244-SA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16634/thumb/1244-S-Avers-hero-3.jpeg?1624555551"},{"chainId":1,"address":"0x4a22a69e45ab29f9f7276b0267797474daf1f27c","name":"SUNI","symbol":"SUNI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14857/thumb/200_%282%29.png?1618803559"},{"chainId":1,"address":"0x0142c3b2fc51819b5af5dfc4aa52df9722790851","name":"Paycent","symbol":"PYN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2008/thumb/paycentos-logo-maroon.png?1547036284"},{"chainId":1,"address":"0xcb5f72d37685c3d5ad0bb5f982443bc8fcdf570e","name":"Rootkit","symbol":"ROOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13151/thumb/rootkit_logo.png?1605712875"},{"chainId":1,"address":"0x0a7e4d70e10b63fef9f8dd19fba3818d15154d2f","name":"Buff Doge","symbol":"BUFFDOGE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16174/thumb/buff.PNG?1623201903"},{"chainId":1,"address":"0x90b417ab462440cf59767bcf72d0d91ca42f21ed","name":"3X Short Altcoin In","symbol":"ALTBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10199/thumb/683JEXMN_400x400_%281%29.png?1576533954"},{"chainId":1,"address":"0xc3d6dda603fc15fd4bf9303150fe11c7cd6059dc","name":"Coweye","symbol":"COW","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9137/thumb/coweye.PNG?1564630035"},{"chainId":1,"address":"0x3a1c1d1c06be03cddc4d3332f7c20e1b37c97ce9","name":"Vybe","symbol":"VYBE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12438/thumb/22k5gGG.jpg?1609924524"},{"chainId":1,"address":"0x3a73f6156c4fbc71b8fdf38090a9d99401163644","name":"Lottonation","symbol":"LNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12448/thumb/lNSc7jtO_400x400_%281%29.jpg?1599903922"},{"chainId":1,"address":"0x78175901e9b04090bf3b3d3cb7f91ca986fb1af6","name":"Antique Zombie Shar","symbol":"ZOMB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12617/thumb/cryptopunks-zomb.png?1602398280"},{"chainId":1,"address":"0x65d9bc970aa9b2413027fa339f7f179b3f3f2604","name":"QIAN Governance Tok","symbol":"KUN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13177/thumb/kun_logo.png?1605923919"},{"chainId":1,"address":"0x24ddff6d8b8a42d835af3b440de91f3386554aa4","name":"Iungo","symbol":"ING","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1831/thumb/iungo.png?1547974844"},{"chainId":1,"address":"0x5c0bc243fb13632c4d247f4f0bc27f2f58982c39","name":"ORYX","symbol":"ORYX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12217/thumb/orx200.png?1598238697"},{"chainId":1,"address":"0xe0955f26515d22e347b17669993fcefcc73c3a0a","name":"Stacker Ventures","symbol":"STACK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14218/thumb/stack.jpg?1615000614"},{"chainId":1,"address":"0x556148562d5ddeb72545d7ec4b3ec8edc8f55ba7","name":"Predix Network","symbol":"PRDX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12388/thumb/main-logo.png?1599531749"},{"chainId":1,"address":"0xa38b7ee9df79955b90cc4e2de90421f6baa83a3d","name":"Monkey Coin","symbol":"MC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8705/thumb/3bae7cca74462350.jpg?1621126725"},{"chainId":1,"address":"0xd26fb114401ec86887cd09f62eccd95fcf20b571","name":"Bitcoin Platinums","symbol":"BCP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8395/thumb/DzEn-8rWkAALlqK_%281%29.jpg?1557988160"},{"chainId":1,"address":"0xa7a5c1058194af8f00c187adb7fcc0c95f1c6c2d","name":"SPACE iZ","symbol":"SPIZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12213/thumb/aEXTI0vf_400x400.jpg?1598236662"},{"chainId":1,"address":"0x7e6c38d007740931e4b419bf15a68c79a0fb0c66","name":"Unicly Doki Doki Co","symbol":"UDOKI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14900/thumb/uDOKI.jpg?1618935840"},{"chainId":1,"address":"0xaf80951201a0eff85a0fd3adf4c7043db856d3e6","name":"Mobilian Coin","symbol":"MBN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12472/thumb/TqhkduvK_400x400.jpg?1600122610"},{"chainId":1,"address":"0x5cb3ce6d081fb00d5f6677d196f2d70010ea3f4a","name":"Busy DAO","symbol":"BUSY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14966/thumb/busy.PNG?1619165503"},{"chainId":1,"address":"0x7a82c573b378ceea29772afb93891f0d0afa93b7","name":"Wizard","symbol":"WIZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12942/thumb/WIZ.png?1614827482"},{"chainId":1,"address":"0xd0f05d3d4e4d1243ac826d8c6171180c58eaa9bc","name":"Value Network Token","symbol":"VNTW","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14726/thumb/vntw.PNG?1617951429"},{"chainId":1,"address":"0x61b2d3ea9f1c6b387c985c73d40e8fbfb284e5c7","name":"RoboCalls","symbol":"RC20","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7935/thumb/ms-icon-310x310.png?1552009545"},{"chainId":1,"address":"0x90f62b96a62801488b151ff3c65eac5fae21a962","name":"GemSwap","symbol":"GEM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12474/thumb/gem.png?1600124318"},{"chainId":1,"address":"0xbdcfbf5c4d91abc0bc9709c7286d00063c0e6f22","name":"PeerGuess","symbol":"GUESS","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/1743/thumb/guess.png?1547036022"},{"chainId":1,"address":"0x2de27d3432d3188b53b02137e07b47896d347d45","name":"Orbicular","symbol":"ORBI","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12201/thumb/orbicular_logo.png?1598005710"},{"chainId":1,"address":"0x56cdbbeec9828962cecb3f1b69517d430295d952","name":"Davecoin","symbol":"DDTG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12195/thumb/davecoin.png?1597991174"},{"chainId":1,"address":"0xc2e343118f937f88ee1fc3150cdc0d6f3d11bba7","name":"Supertron","symbol":"STRO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9326/thumb/LQOVF5S.png?1566267616"},{"chainId":1,"address":"0x4290563c2d7c255b5eec87f2d3bd10389f991d68","name":"UnlimitedIP","symbol":"UIP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2642/thumb/unlimitedip.png?1547036818"},{"chainId":1,"address":"0x03fb52d4ee633ab0d06c833e32efdd8d388f3e6a","name":"Super Black Hole","symbol":"HOLE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9087/thumb/SdAKFUu.png?1564086285"},{"chainId":1,"address":"0xfb22ced41b1267da411f68c879f4defd0bd4796a","name":"Ziot","symbol":"ZIOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14546/thumb/1_iSvPXhw4frHgjyMejcmoKQ.png?1616973916"},{"chainId":1,"address":"0x622f2962ae78e8686ecc1e30cf2f9a6e5ac35626","name":"Wrapped Polis","symbol":"POLIS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13377/thumb/polispay_logo.jpg?1608027141"},{"chainId":1,"address":"0xf013e0ea26cb386b3021783a3201bf2652778f93","name":"ARTISTA","symbol":"ARTS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9733/thumb/arts.PNG?1571306798"},{"chainId":1,"address":"0xa0b207103f764a920b4af9e691f5bd956de14ded","name":"Abitshadow Token","symbol":"ABST","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7882/thumb/bjRfWjFv_400x400.jpg?1551316417"},{"chainId":1,"address":"0x4b7fb448df91c8ed973494f8c8c4f12daf3a8521","name":"YD BTC JUN21","symbol":"YD-BTC-JUN21","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/14500/thumb/UMA_square_red_logo.png?1616558980"},{"chainId":1,"address":"0x6f4ee03ca6c942c9397d2ba5f8f83ea58f918f47","name":"CashBackPro","symbol":"CBP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12893/thumb/logo_%2818%29.png?1603766120"},{"chainId":1,"address":"0x08e411220e47e3fc43bfb832186aba95108f2861","name":"Eclipseum","symbol":"ECL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13418/thumb/eclipseum_logo.png?1608429994"},{"chainId":1,"address":"0xb9cb7905981198add8059114b3b7dc7042b52f7b","name":"Tamy Token","symbol":"TMT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12641/thumb/tamy_logo.png?1601369530"},{"chainId":1,"address":"0x50eb346fc29a80d97563a50146c3fcf9423b5538","name":"Skull Candy Shards","symbol":"CANDY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12934/thumb/Skull_Candy.png?1603719579"},{"chainId":1,"address":"0x0d6f6a130c3046713cba425f41a65c17205df6b5","name":"Baby Akita","symbol":"BKITA","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15450/thumb/ycDKDtRt_400x400.jpg?1620836652"},{"chainId":1,"address":"0xcbb20d755abad34cb4a9b5ff6dd081c76769f62e","name":"Cash Global Coin","symbol":"CGC","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/12088/thumb/cgc.PNG?1597017789"},{"chainId":1,"address":"0x075190c6130ea0a3a7e40802f1d77f4ea8f38fe2","name":"nYFI","symbol":"N0031","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12997/thumb/nest_protocol_logo.png?1604246163"},{"chainId":1,"address":"0x03c780cd554598592b97b7256ddaad759945b125","name":"Biotron","symbol":"BTRN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4038/thumb/biotron.png?1547039163"},{"chainId":1,"address":"0x6876eba317272fe221c67405c5e8eb3b24535547","name":"MicroTuber","symbol":"MCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15489/thumb/mct.PNG?1621040638"},{"chainId":1,"address":"0x0ce6d5a093d4166237c7a9ff8e0553b0293214a1","name":"Decenturion","symbol":"DCNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6195/thumb/X5_20dt1_400x400.jpg?1547042224"},{"chainId":1,"address":"0x2e2e0a28f6585e895dd646a363bae29b77b88a31","name":"Volume Network","symbol":"VOL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8803/thumb/SexNcqS.png?1561521344"},{"chainId":1,"address":"0x6f063c0fcda0ea6dcc01d5a7cb3066ed4f90d1a8","name":"EBSP Token","symbol":"EBSP","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/7650/thumb/mwlDkYEKIpcWAP00hfCU7KPQti7jgbew1OKea9RGlGwpdkwOTWp7shOWG5EAsXpUonAo8ZnQoVYoWIz0Tju71QcYMesj8-4Qz_CAyxUy12MTknHGjwfpITWwDaRtHXeTDCCGMvPRPR5ebXultUTIQAtB1x9gtvA03QAi5RVg4GkfX6kB_r04Qx6w2lxuLuyUAqd4x6zaQo_1Hy8NV333I.jpg?1549001856"},{"chainId":1,"address":"0xc9dfcd0a1dd2d7bb6fd2ef91a16a6a1c4e9846dd","name":"Hype Bet","symbol":"HYPEBET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13296/thumb/Hype-Bet-Token-Logo.png?1607074281"},{"chainId":1,"address":"0x681ecc5a0bfd18c308a1138ff607f818bac5e417","name":"Luckstar","symbol":"LST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7804/thumb/49211002_377935006115216_8098246624284770304_n.png?1550735229"},{"chainId":1,"address":"0x45c943973e65d069906b0dc33dc31d1d7d9d09dc","name":"MovieCash","symbol":"MVH","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/14550/thumb/LOGO-CINEMADROM-2.png?1616989406"},{"chainId":1,"address":"0x5ab793e36070f0fac928ea15826b0c1bc5365119","name":"YUKI COIN","symbol":"YUKI","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5464/thumb/KoNqMvi.png?1547041201"},{"chainId":1,"address":"0xf48e200eaf9906362bb1442fca31e0835773b8b4","name":"sAUD","symbol":"SAUD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13665/thumb/sAUD.png?1610609254"},{"chainId":1,"address":"0x2b04dadd412f7281d3ccabfb8425fd9c9e841588","name":"BittUp","symbol":"BTU","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/14669/thumb/bittup_logo.png?1617673585"},{"chainId":1,"address":"0x0f767338244418310342d49b02183715691d988f","name":"Genesis Token","symbol":"GENT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7120/thumb/uUTszdKp_400x400.jpg?1547043617"},{"chainId":1,"address":"0xc28e27870558cf22add83540d2126da2e4b464c2","name":"Sashimi","symbol":"SASHIMI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12427/thumb/SashimiSwap-200x200.png?1601347413"},{"chainId":1,"address":"0x432bf73443909c33b545efed536a5246c9a722ca","name":"Poverty Eradication","symbol":"PEC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8519/thumb/pec_2.jpg?1559100388"},{"chainId":1,"address":"0x3b5f11dbac1476af17957c6e5991f21c826743dd","name":"BaconCoin","symbol":"BAK","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7320/thumb/48428794_293169174672799_1981223745984921600_n.png?1547043977"},{"chainId":1,"address":"0x4fe5851c9af07df9e5ad8217afae1ea72737ebda","name":"OpenPredict Token","symbol":"OPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12200/thumb/9idIjfrY_400x400.jpg?1598020161"},{"chainId":1,"address":"0xbaa70614c7aafb568a93e62a98d55696bcc85dfe","name":"Unicap Finance","symbol":"UCAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13300/thumb/unicap256.png?1607308439"},{"chainId":1,"address":"0xf83bf320a4a3f4bf365c3114b6f19fc3f6b1228c","name":"FXT Token","symbol":"FXT","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/14131/thumb/7rgEwxRT_400x400.jpg?1614588199"},{"chainId":1,"address":"0xe4f356ecce6fbda81ecdea2e38527e59422861c2","name":"BitStash","symbol":"STASH","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7674/thumb/bitstash.png?1555301765"},{"chainId":1,"address":"0x8282df223ac402d04b2097d16f758af4f70e7db0","name":"YFLink Synthetic","symbol":"SYFL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13884/thumb/download_%281%29.png?1612493981"},{"chainId":1,"address":"0xbc194e6f748a222754c3e8b9946922c09e7d4e91","name":"Lever Network","symbol":"LEV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15323/thumb/lever.PNG?1620513101"},{"chainId":1,"address":"0xfdc3d57eb7839ca68a2fad7a93799c8e8afa61b7","name":"1X Short Algorand T","symbol":"ALGOHEDGE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11987/thumb/683JEXMN_400x400.png?1596687107"},{"chainId":1,"address":"0x7bebd226154e865954a87650faefa8f485d36081","name":"Zignaly","symbol":"ZIG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14796/thumb/zignaly.jpg?1618496339"},{"chainId":1,"address":"0x940bdcb99a0ee5fb008a606778ae87ed9789f257","name":"JFIN Coin","symbol":"JFIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13370/thumb/JFin-Coin-Logo.png?1607984823"},{"chainId":1,"address":"0x2bc586ffbfa2d6e9c30d5ad95d546091db7607cf","name":"Magic E stock","symbol":"MSB","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/14194/thumb/magic_e_stock.PNG?1614848770"},{"chainId":1,"address":"0x4da9b813057d04baef4e5800e36083717b4a0341","name":"Aave TUSD v1","symbol":"ATUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11724/thumb/aTUSD.png?1593082700"},{"chainId":1,"address":"0xd32641191578ea9b208125ddd4ec5e7b84fcab4c","name":"MDsquare","symbol":"TMED","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8558/thumb/bAdnHTWUIl4rFB4EfbH2L50BW7xi2T9ubci7v6xfYDipXkrG8Wb4LS8g6eAiMsSKqLJfV-FjH5TrYALqACw4MM2A9NfK_L6Ujnddhw1uEgL0hmVQnY96xZeL0C4kkFRJalreK9wUBzjZ4pRhZLdQf9h1drSTF7NE9moAdQ7KtuOvJqommn_q-TjQpF8GUB7J2Ejs7zIvhXXsUHGI1.jpg?1559198882"},{"chainId":1,"address":"0x645035d009182b480fe554d2926664105d62c309","name":"Shiba Cloud","symbol":"NIMBUS","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16137/thumb/SCLOUD_256x256_1_200x200.png?1623086984"},{"chainId":1,"address":"0x10c71515602429c19d53011ea7040b87a4894838","name":"Diamond Platform To","symbol":"DPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8309/thumb/RSCL14XL_400x400.jpg?1557400596"},{"chainId":1,"address":"0x5d285f735998f36631f678ff41fb56a10a4d0429","name":"MixMarvel","symbol":"MIX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8222/thumb/8878caf93b1e3b6cfb3b414bda3b5250.png?1613945432"},{"chainId":1,"address":"0x17b26400621695c2d8c2d8869f6259e82d7544c4","name":"Custom contract net","symbol":"CCN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7225/thumb/pPmmolWS_400x400.jpg?1547043809"},{"chainId":1,"address":"0x1245ef80f4d9e02ed9425375e8f649b9221b31d8","name":"ArbitrageCT","symbol":"ARCT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/2537/thumb/arbitragect.png?1547036651"},{"chainId":1,"address":"0x058349297672b6cc7ccb6e59a679c5add74a6898","name":"Ethereum Vault","symbol":"ETHV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13051/thumb/Tok425m.jpeg?1604654743"},{"chainId":1,"address":"0xc71d8baaa436aa7e42da1f40bec48f11ab3c9e4a","name":"iEthereum","symbol":"IETH","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1065/thumb/ieth.png?1600765203"},{"chainId":1,"address":"0xf5dce57282a584d2746faf1593d3121fcac444dc","name":"cSAI","symbol":"CSAI","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10148/thumb/cSAI.png?1576467788"},{"chainId":1,"address":"0xb647a1d7633c6c4d434e22ee9756b36f2b219525","name":"ETH 20 MA Crossover","symbol":"ETH20MACOAPY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11648/thumb/eth-20-day-moving-average-ctoken-set.png?1592324078"},{"chainId":1,"address":"0xc0e47007e084eef3ee58eb33d777b3b4ca98622f","name":"StarDEX","symbol":"XSTAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12500/thumb/token_icon.png?1600296899"},{"chainId":1,"address":"0xa9ff725189fe00da9c5f27a580dc67fea61e3fb2","name":"Armours","symbol":"ARM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8319/thumb/8e-jHcvB_400x400.jpg?1557478705"},{"chainId":1,"address":"0x49bf0220c9ce17e52dcca3d217231746d676085b","name":"Vixco","symbol":"VIX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15405/thumb/vixco.png?1620811916"},{"chainId":1,"address":"0xde4c5a791913838027a2185709e98c5c6027ea63","name":"General Attention C","symbol":"XAC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9203/thumb/-LF1XcKS_400x400.png?1565131564"},{"chainId":1,"address":"0x16be21c08eb27953273608629e4397556c561d26","name":"Yearn20Moon Finance","symbol":"YMF20","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13037/thumb/Brand_Identity.png?1605773986"},{"chainId":1,"address":"0x9d24364b97270961b2948734afe8d58832efd43a","name":"Yefam Finance","symbol":"FAM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12359/thumb/FAM200.png?1600333720"},{"chainId":1,"address":"0xe120c1ecbfdfea7f0a8f0ee30063491e8c26fedf","name":"Suretly","symbol":"SUR","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/914/thumb/suretly.png?1547034752"},{"chainId":1,"address":"0x40e45890dff79e7d533797d964e64a2c0121f49a","name":"Smart Trade Coin","symbol":"TRADE","decimals":7,"logoURI":"https://assets.coingecko.com/coins/images/6829/thumb/small_trade_260d15db8a_400c35fc3e.png?1620782686"},{"chainId":1,"address":"0x5bc25f649fc4e26069ddf4cf4010f9f706c23831","name":"DefiDollar","symbol":"DUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12333/thumb/defidollar_logo.png?1599116360"},{"chainId":1,"address":"0x525794473f7ab5715c81d06d10f52d11cc052804","name":"12Ships","symbol":"TSHP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9351/thumb/12ships.png?1566485390"},{"chainId":1,"address":"0xc888a0ab4831a29e6ca432babf52e353d23db3c2","name":"FastSwap","symbol":"FAST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13567/thumb/fastswap.jpeg?1622794717"},{"chainId":1,"address":"0xc299004a310303d1c0005cb14c70ccc02863924d","name":"Trinity Protocol","symbol":"TRI","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13379/thumb/trinity_logo.png?1608030983"},{"chainId":1,"address":"0x3b9e094d56103611f0acefdab43182347ba60df4","name":"PANTHEON X","symbol":"XPN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8297/thumb/Hr9wHItp_400x400.jpg?1557307478"},{"chainId":1,"address":"0x594207c791afd06a8d087d84d99d1da53ccbd45f","name":"Buzzshow","symbol":"GLDY","decimals":3,"logoURI":"https://assets.coingecko.com/coins/images/2585/thumb/lLY2uKBE_400x400.jpg?1583447824"},{"chainId":1,"address":"0xce593a29905951e8fc579bc092eca72577da575c","name":"GROM","symbol":"GR","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/13216/thumb/gr.png?1606278269"},{"chainId":1,"address":"0xa8262eb913fccea4c3f77fc95b8b4043b384cfbb","name":"Krypton Galaxy Coin","symbol":"KGC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9152/thumb/krypton.PNG?1564733517"},{"chainId":1,"address":"0x5b322514ff727253292637d9054301600c2c81e8","name":"DAD","symbol":"DAD","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/9833/thumb/q_Vt0ajV_400x400.jpg?1572475136"},{"chainId":1,"address":"0x35a18000230da775cac24873d00ff85bccded550","name":"cUNI","symbol":"CUNI","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12696/thumb/compound-uni.png?1601789718"},{"chainId":1,"address":"0x704de5696df237c5b9ba0de9ba7e0c63da8ea0df","name":"xAAVEb","symbol":"XAAVEB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13237/thumb/xaave.png?1606630133"},{"chainId":1,"address":"0x38118bdb3b480f570837a4c2e88fac6e83be6689","name":"Werewolf Coin","symbol":"WWC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16173/thumb/WWC-200x200.png?1623198141"},{"chainId":1,"address":"0x2d94aa3e47d9d5024503ca8491fce9a2fb4da198","name":"Bankless DAO","symbol":"BANK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15227/thumb/j4WEJrwU.png?1622615796"},{"chainId":1,"address":"0x69cf3091c91eb72db05e45c76e58225177dea742","name":"CoinZoom Token","symbol":"ZOOM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15060/thumb/Coinzoom.png?1619590652"},{"chainId":1,"address":"0x8b8d971c8bc37f65a93c4609644fef0590af2fc7","name":"Securypto","symbol":"SCU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13595/thumb/IjOeviyt_400x400.png?1609999546"},{"chainId":1,"address":"0xd6c67b93a7b248df608a653d82a100556144c5da","name":"ExNetwork Token","symbol":"EXNT","decimals":16,"logoURI":"https://assets.coingecko.com/coins/images/12328/thumb/exnt_logo.png?1599102916"},{"chainId":1,"address":"0xc275865a6cce78398e94cb2af29fa0d787b7f7eb","name":"RiseCoin Token","symbol":"RSCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4469/thumb/rsct.png?1547039788"},{"chainId":1,"address":"0x94d916873b22c9c1b53695f1c002f78537b9b3b2","name":"AlgoVest","symbol":"AVS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13874/thumb/icon-200.png?1626094416"},{"chainId":1,"address":"0xc0f1728d9513efc316d0e93a0758c992f88b0809","name":"SWTCoin","symbol":"SWAT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5985/thumb/swtcoin.jpg?1547041927"},{"chainId":1,"address":"0x2f7b88458f4e6d9abb19396b5a08b8ba7f3d4b20","name":"Wave Platform","symbol":"WAE","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/14695/thumb/WAVE-icons-2021-2-dark-wave.png?1618545330"},{"chainId":1,"address":"0x755be920943ea95e39ee2dc437b268917b580d6e","name":"VersoView","symbol":"VVT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13380/thumb/HkfxEtWh_400x400.jpg?1608031723"},{"chainId":1,"address":"0xfa5e27893aee4805283d86e4283da64f8c72dd56","name":"apeUSD UMA Syntheti","symbol":"APEUSD-UMA-DEC21","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14400/thumb/apeusd.jpg?1615905279"},{"chainId":1,"address":"0xcc0014ccb39f6e86b1be0f17859a783b6722722f","name":"Showcase Token","symbol":"SHO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15084/thumb/icon_%284%29.png?1619662298"},{"chainId":1,"address":"0x37092dbf8c26da9cc805683b4cc0b942e92de2fd","name":"Blue Eyes White Dog","symbol":"BDOGE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15436/thumb/256.jpg?1620800814"},{"chainId":1,"address":"0x595643d83b35df38e29058976c04000acfa31570","name":"OBR","symbol":"OBR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13154/thumb/nftobr.png?1605756268"},{"chainId":1,"address":"0x2b67d1a87a8d8b280a23e97bc55095215ee0ec53","name":"Crypto Price Index","symbol":"CPI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12178/thumb/Z7x7eUa.png?1597886884"},{"chainId":1,"address":"0x4f27053f32eda8af84956437bc00e5ffa7003287","name":"Thrive","symbol":"THRT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2130/thumb/thrt.png?1547036439"},{"chainId":1,"address":"0x2cd9324ba13b77554592d453e6364086fbba446a","name":"502 Bad Gateway Tok","symbol":"Z502","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/9040/thumb/502.jpg?1563872035"},{"chainId":1,"address":"0x0309c98b1bffa350bcb3f9fb9780970ca32a5060","name":"BasketDAO DeFi Inde","symbol":"BDI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14664/thumb/BDI_200.png?1621851285"},{"chainId":1,"address":"0xacd8f2523a4613eee78904354187c81bb05ae2b8","name":"Stand Cash","symbol":"SAC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13542/thumb/sac.jpg?1609648101"},{"chainId":1,"address":"0xa6fb1df483b24eeab569e19447e0e107003b9e15","name":"Earnbase","symbol":"ENB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13164/thumb/YhCEGdB.png?1605775799"},{"chainId":1,"address":"0x810908b285f85af668f6348cd8b26d76b3ec12e1","name":"SwapCoinz","symbol":"SPAZ","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9081/thumb/SPAZ.png?1619594569"},{"chainId":1,"address":"0xd33d0eb1c0c0295c3a2409a9101dd511823bf217","name":"Unique Fans","symbol":"FANS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14715/thumb/fans_200X200.png?1617922576"},{"chainId":1,"address":"0x30c2a84aed6db30e31cf4d7059b1836c12c68068","name":"Unicly Aavegotchi A","symbol":"UGOTCHI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14901/thumb/uGOTCHI.jpg?1618936478"},{"chainId":1,"address":"0xcbeaec699431857fdb4d37addbbdc20e132d4903","name":"YOYOW","symbol":"YOYOW","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1270/thumb/yoyow.png?1548761123"},{"chainId":1,"address":"0x39795344cbcc76cc3fb94b9d1b15c23c2070c66d","name":"Seigniorage Shares","symbol":"SHARE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12306/thumb/logo_%281%29.png?1607658707"},{"chainId":1,"address":"0xa456b515303b2ce344e9d2601f91270f8c2fea5e","name":"Cornichon","symbol":"CORN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13235/thumb/cornichon.png?1606629943"},{"chainId":1,"address":"0xd0345d30fd918d7682398acbcdf139c808998709","name":"Lixir Finance","symbol":"LIX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15333/thumb/lixir.PNG?1620596594"},{"chainId":1,"address":"0x3db99ab08006aefcc9600972eca8c202396b4300","name":"Vinci","symbol":"VINCI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9675/thumb/logo-icon.png?1570600569"},{"chainId":1,"address":"0x51d3e4c0b2c83e62f5d517d250b3e856897d2052","name":"Space Monkey","symbol":"SPMK","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/14776/thumb/ItWjW7D.png?1618372154"},{"chainId":1,"address":"0x558a069a3a1a1e72398607b9e3577fce1c67ea63","name":"JPYQ Stablecoin by ","symbol":"JPYQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13271/thumb/1MMbEc4a.png?1606884873"},{"chainId":1,"address":"0xd9a6803f41a006cbf389f21e55d7a6079dfe8df3","name":"NovaDeFi","symbol":"NMT","decimals":19,"logoURI":"https://assets.coingecko.com/coins/images/12752/thumb/nova_defi_logo.png?1602241365"},{"chainId":1,"address":"0xd69f306549e9d96f183b1aeca30b8f4353c2ecc3","name":"MCH Coin","symbol":"MCHC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15399/thumb/MCHC.jpg?1620721307"},{"chainId":1,"address":"0x7e8c149f70437eba6785f9059190a5b08abf03de","name":"MiniBitcoin","symbol":"MBTC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7180/thumb/logo_brown.png?1547043731"},{"chainId":1,"address":"0xe865a04fb0d565107eaf9049ef22c27dd0c4bbef","name":"BestPick Coin","symbol":"BPC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9458/thumb/54520830_409845563083406_4756767827547914240_n.png?1567564924"},{"chainId":1,"address":"0x1b957dc4aefeed3b4a2351a6a6d5cbfbba0cecfa","name":"HOQU","symbol":"HQX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1793/thumb/hqx.png?1547036096"},{"chainId":1,"address":"0x7d4b1d793239707445305d8d2456d2c735f6b25b","name":"BlockSwap Network","symbol":"CBSN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14781/thumb/bsn_dp_high.png?1618865566"},{"chainId":1,"address":"0x6417e8673dedd7a0471a87804bf85a559fd8bcc2","name":"Aura Protocol","symbol":"AURA","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13491/thumb/aura_protocol_logo.png?1609124742"},{"chainId":1,"address":"0x21d5a14e625d767ce6b7a167491c2d18e0785fda","name":"Jinbi Token","symbol":"JNB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4349/thumb/image001.jpg?1547039703"},{"chainId":1,"address":"0xd2df355c19471c8bd7d8a3aa27ff4e26a21b4076","name":"sAAVE","symbol":"SAAVE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13968/thumb/sAAVE.png?1616148653"},{"chainId":1,"address":"0xd7d05bda4bf5876ba1254b3eaaf8b47d2f5676eb","name":"STABLE ASSET","symbol":"STA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12313/thumb/stable_200x200.png?1599083938"},{"chainId":1,"address":"0xed36482c7f8e5850e91ac0cf6bf2130a1aa2df92","name":"Holdtowin","symbol":"7ADD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13213/thumb/logo256_%281%29.png?1606276280"},{"chainId":1,"address":"0xbd301be09eb78df47019aa833d29edc5d815d838","name":"YFUEL","symbol":"YFUEL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12369/thumb/Untitled-3-1.png?1600765495"},{"chainId":1,"address":"0x5c6af72cbd740b90528c8fe226125413b6bd7e5a","name":"apeUSD SNX Syntheti","symbol":"APEUSD-SNX-DEC21","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14397/thumb/apeusd.jpg?1615905291"},{"chainId":1,"address":"0xd90e69f67203ebe02c917b5128629e77b4cd92dc","name":"One Cash","symbol":"ONC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13529/thumb/onc_logo.png?1609406029"},{"chainId":1,"address":"0xfbb6b34dd77274a06ea2e5462a5e0b9e23ce478e","name":"apeUSD UNI Syntheti","symbol":"APEUSD-UNI-DEC21","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14398/thumb/apeusd.jpg?1615905285"},{"chainId":1,"address":"0x5aaa2182459377b6ca18b10712f9f602140764af","name":"Elevation Token","symbol":"EVT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10446/thumb/coin.jpg?1579732717"},{"chainId":1,"address":"0xb0302d59237e6104c3f0d145996302f044797ca5","name":"GoonRich","symbol":"GOON","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16361/thumb/goontoken.png?1623812806"},{"chainId":1,"address":"0xdea67845a51e24461d5fed8084e69b426af3d5db","name":"HodlTree","symbol":"HTRE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12511/thumb/htre.jpg?1600373697"},{"chainId":1,"address":"0xc690f7c7fcffa6a82b79fab7508c466fefdfc8c5","name":"Lympo","symbol":"LYM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2620/thumb/lympo_token.png?1547036775"},{"chainId":1,"address":"0xd35ce4fd815522ff52243eb587020d557617f4db","name":"DFE Finance","symbol":"DFE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13682/thumb/200x200DFE.png?1610835715"},{"chainId":1,"address":"0x57700244b20f84799a31c6c96dadff373ca9d6c5","name":"TrustDAO","symbol":"TRUST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11923/thumb/trustwhite.png?1596704613"},{"chainId":1,"address":"0xecc0f1f860a82ab3b442382d93853c02d6384389","name":"Axis DeFi","symbol":"AXIS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12199/thumb/YeLWZ3V.jpg?1597998424"},{"chainId":1,"address":"0xd0d6d6c5fe4a677d343cc433536bb717bae167dd","name":"adToken","symbol":"ADT","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/778/thumb/adtoken.png?1547034537"},{"chainId":1,"address":"0x44bbb689aa13315ea5d56ebda2d263e53cb4b0b7","name":"Kskin","symbol":"KSK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14285/thumb/logo-kskin.png?1615273981"},{"chainId":1,"address":"0x8a845fc339ceb022a695281554890429a34df120","name":"MangoChain","symbol":"MGP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11140/thumb/JJLGKTqL8jZunfdW5-gyQYxZBeCoHoLzoXfpaEwVYARssAaJoObmOxIRqz0f1oMRIbiMWP0Jfq1aM99-_aEI3fqoMvpUy2sD-d5ZGZAR3gxeY26OQrom9MmaY7GmONjoLebGcdA3r0IVlLxKhtcAO2XJrirbnXO6RxsJbImGPLlkE7c8KxH4Y1zjnAMqHi7xgv7PnV5iwpEiIUa.jpg?1588910984"},{"chainId":1,"address":"0x1b6c5864375b34af3ff5bd2e5f40bc425b4a8d79","name":"TopChain","symbol":"TOPC","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/2547/thumb/topchain.png?1516372992"},{"chainId":1,"address":"0x014a543f767b3b06e31a811b0a75483ee8dfd72d","name":"BonezYard","symbol":"BNZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12810/thumb/bnz_icon.png?1602716875"},{"chainId":1,"address":"0x26ea1f595f6567b7050fbba24f6a66e19db4d560","name":"APE Punk","symbol":"APE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14510/thumb/ape-punk-shards.png?1616596505"},{"chainId":1,"address":"0x6307b25a665efc992ec1c1bc403c38f3ddd7c661","name":"Global Coin Researc","symbol":"GCR","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/14815/thumb/wun6fV4T_400x400.jpg?1618544214"},{"chainId":1,"address":"0xc8807f0f5ba3fa45ffbdc66928d71c5289249014","name":"Ispolink","symbol":"ISP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15283/thumb/isolink.PNG?1620352267"},{"chainId":1,"address":"0x77c07555af5ffdc946fb47ce15ea68620e4e7170","name":"Breezecoin","symbol":"BRZE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6727/thumb/breezecoin.png?1547563369"},{"chainId":1,"address":"0x820a8481451e893bc66dce50c84d45617cac3705","name":"Bitcoin True","symbol":"BTCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11839/thumb/tEGpbQI.png?1594892967"},{"chainId":1,"address":"0x39fa206c1648944f92e8f7b626e1cbdf78d7e9db","name":"DXY Finance","symbol":"DXY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12839/thumb/dxy_finance.png?1602903489"},{"chainId":1,"address":"0x7afac1d878c66a47263dce57976c371ae2e74882","name":"YFMoonBeam","symbol":"YFMB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12682/thumb/yuqS66I.png?1601619725"},{"chainId":1,"address":"0xff5c25d2f40b47c4a37f989de933e26562ef0ac0","name":"Kora Network","symbol":"KNT","decimals":16,"logoURI":"https://assets.coingecko.com/coins/images/2772/thumb/knt.png?1547036959"},{"chainId":1,"address":"0xd3cdc4e75750dc1e59f8342200742b6b29490e70","name":"Decurian","symbol":"ECU","decimals":3,"logoURI":"https://assets.coingecko.com/coins/images/10988/thumb/ECU-LOGO-200x200.png?1586914495"},{"chainId":1,"address":"0x9ed8e7c9604790f7ec589f99b94361d8aab64e5e","name":"Unistake","symbol":"UNISTAKE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12813/thumb/unistake.png?1612346684"},{"chainId":1,"address":"0x8d1ce361eb68e9e05573443c407d4a3bed23b033","name":"PieDAO DEFI ","symbol":"DEFI++","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13304/thumb/piedao__.png?1607322674"},{"chainId":1,"address":"0xedd8da5c20eb014e550008df3304213dde5e29f0","name":"Mars Network","symbol":"MARS","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12828/thumb/Mars-logo-2.jpg?1602832489"},{"chainId":1,"address":"0x4c25bdf026ea05f32713f00f73ca55857fbf6342","name":"Font","symbol":"FONT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14085/thumb/font.png?1614183855"},{"chainId":1,"address":"0x77a2bf0bda9775fb3524a6720dd3b16bd455e2c2","name":"SafeBreastInu","symbol":"BREAST","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16222/thumb/SafeBreast.jpg?1623325603"},{"chainId":1,"address":"0x05aaaa829afa407d83315cded1d45eb16025910c","name":"Sp8de","symbol":"SPX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2513/thumb/LSGJfuU.png?1547036622"},{"chainId":1,"address":"0xfce94fde7ac091c2f1db00d62f15eeb82b624389","name":"Noah s Ark","symbol":"NOAHARK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13557/thumb/Gc6kz-5a.png?1609769750"},{"chainId":1,"address":"0x8bf92cad232f72a7c61eb42e9185e8d0ea470f6b","name":"SMPL Foundation","symbol":"SMPL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12991/thumb/smpl.jpg?1604208000"},{"chainId":1,"address":"0x6fc2f1044a3b9bb3e43a43ec8f840843ed753061","name":"Robo Token","symbol":"ROBO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14611/thumb/rlogo200.jpg?1617247446"},{"chainId":1,"address":"0xc541b907478d5cd334c0cbfcb9603b6dac6e9ee3","name":"CNYQ Stablecoin by ","symbol":"CNYQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13272/thumb/USDQ_logo.png?1606886052"},{"chainId":1,"address":"0x9ceb84f92a0561fa3cc4132ab9c0b76a59787544","name":"Doki Doki","symbol":"DOKI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12759/thumb/doki_logo.png?1602338064"},{"chainId":1,"address":"0x3516415161c478df10adbb8bb884cc83fbd5f11a","name":"AlphaDex","symbol":"DEX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12949/thumb/AlphaDex.png?1603779030"},{"chainId":1,"address":"0x30cf203b48edaa42c3b4918e955fed26cd012a3f","name":"MetaGame","symbol":"SEED","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13099/thumb/V8phEz8V.png?1612854078"},{"chainId":1,"address":"0x2d4de3c744d43cf77cb12399921faf0d78b7415b","name":"Boldman Capital","symbol":"BOLD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6832/thumb/boldman-unicorn-logo-dark.png?1547043143"},{"chainId":1,"address":"0x0affa06e7fbe5bc9a764c979aa66e8256a631f02","name":"Polybius","symbol":"PLBT","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/766/thumb/polybius.png?1547034516"},{"chainId":1,"address":"0xe58c8df0088cf27b26c7d546a9835deacc29496c","name":"1X Short TRX Token","symbol":"TRXHEDGE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12060/thumb/683JEXMN_400x400.png?1596705582"},{"chainId":1,"address":"0x88665a7556e1b3c939d6661248116886845249a8","name":"Linkflow","symbol":"LF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14473/thumb/Linkflow_logo_symbol_200X200.png?1616396086"},{"chainId":1,"address":"0x2396fbc0e2e3ae4b7206ebdb5706e2a5920349cb","name":"Color Platform","symbol":"CLR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4941/thumb/color.png?1569464438"},{"chainId":1,"address":"0xcba8162778e6a3eba60e1cf7c012b327340bd05d","name":"SINOC","symbol":"SINOC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8330/thumb/SinocLogo_Horiz.png?1557544864"},{"chainId":1,"address":"0x5978708d6cce1cc9640eed47422d64c91bbd5171","name":"LOLTOKEN","symbol":"LOL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8551/thumb/logo100.png?1596534732"},{"chainId":1,"address":"0xd0cb75298d5c1e3b277e3cd95c56b3caa81a99d3","name":"HDT","symbol":"HDT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11145/thumb/title.png?1588920310"},{"chainId":1,"address":"0x919d3a363776b1ceec9352610c82dfaf80edc32d","name":"GoldFund","symbol":"GFUN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6616/thumb/Goldfun_ICO-logo.png?1547042817"},{"chainId":1,"address":"0x0371f7b219fff864b437bcfb564810f323fffcca","name":"Bitcurate","symbol":"BTCR","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/10895/thumb/Bitcurate_logo_200x200.png?1585694787"},{"chainId":1,"address":"0xd31a9d28d66a1f7e62b5565416ea14607690f788","name":"HealthChainUS","symbol":"HCUT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11868/thumb/60633927_588600498303961_3291974703035449344_n.png?1595496238"},{"chainId":1,"address":"0x282d0ad1fa03dfbdb88243b958e77349c73737d1","name":"Protector Roge","symbol":"PROGE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16993/thumb/proge_logo.png?1625994325"},{"chainId":1,"address":"0x1c153badb7e54abcdcb65f0a09fcd6f10de36aa3","name":"TMC","symbol":"TMC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12643/thumb/tmc_logo_white_bg.png?1601371056"},{"chainId":1,"address":"0x72f020f8f3e8fd9382705723cd26380f8d0c66bb","name":"PlotX","symbol":"PLOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12795/thumb/PlotX.png?1611109969"},{"chainId":1,"address":"0x737f98ac8ca59f2c68ad658e3c3d8c8963e40a4c","name":"Amon","symbol":"AMN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2369/thumb/amon.png?1547036554"},{"chainId":1,"address":"0x39d30828a163713d91c4eadbba2c497a9139ec5c","name":"Happy Birthday Coin","symbol":"HBDC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12814/thumb/HBDC.png?1622423939"},{"chainId":1,"address":"0x746dda2ea243400d5a63e0700f190ab79f06489e","name":"BOSAGORA","symbol":"BOA","decimals":7,"logoURI":"https://assets.coingecko.com/coins/images/9202/thumb/boaLogo.png?1565231346"},{"chainId":1,"address":"0x9eb6be354d88fd88795a04de899a57a77c545590","name":"GameStop Finance","symbol":"GME","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13820/thumb/gamestop_logo.jpg?1612070725"},{"chainId":1,"address":"0xc8d2ab2a6fdebc25432e54941cb85b55b9f152db","name":"Grap Finance","symbol":"GRAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12193/thumb/0WBMFrtk_400x400.jpg?1597984167"},{"chainId":1,"address":"0x3277dd536471a3cbeb0c9486acad494c95a31e73","name":"CoinHe Token","symbol":"CHT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9239/thumb/coinhe.png?1565769425"},{"chainId":1,"address":"0x6086b52cab4522b4b0e8af9c3b2c5b8994c36ba6","name":"ShuttleOne","symbol":"SZO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14063/thumb/EMQvEJSY_400x400.png?1614077678"},{"chainId":1,"address":"0xc538143202f3b11382d8606aae90a96b042a19db","name":"Coinsbit Token","symbol":"CNB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10340/thumb/cbicon.png?1578637386"},{"chainId":1,"address":"0x80ab141f324c3d6f2b18b030f1c4e95d4d658778","name":"DEA","symbol":"DEA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12825/thumb/dea_logo.jpg?1611136739"},{"chainId":1,"address":"0x1788430620960f9a70e3dc14202a3a35dde1a316","name":"OpenAlexa Protocol","symbol":"OAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12400/thumb/256x256-OAP.png?1599556701"},{"chainId":1,"address":"0xe8a1df958be379045e2b46a31a98b93a2ecdfded","name":"EtherSportz","symbol":"ESZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2890/thumb/ethersportz.png?1547037061"},{"chainId":1,"address":"0x28c8d01ff633ea9cd8fc6a451d7457889e698de6","name":"Ethereum Gold","symbol":"ETG","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/1034/thumb/ethereum-gold.png?1547394319"},{"chainId":1,"address":"0x336492a0601cc85e08c14d390bf07d960328aaf4","name":"Blueshare Token","symbol":"BST1","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13071/thumb/blueshare-token-removebg-preview.png?1604897237"},{"chainId":1,"address":"0x88d59ba796fdf639ded3b5e720988d59fdb71eb8","name":"Payship","symbol":"PSHP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12789/thumb/pshp_logo.png?1602566222"},{"chainId":1,"address":"0x2b100be232f90dd33d3b6e4b9ad70d1e8ac0e208","name":"MarX","symbol":"MARX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16258/thumb/marx.PNG?1623402476"},{"chainId":1,"address":"0x31d457e7bcff5bc9a5ef86e6a5ea1db5b5c3bfb0","name":"Star Foxx","symbol":"FOXX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16018/thumb/starfoxx.PNG?1622611911"},{"chainId":1,"address":"0x5b0751713b2527d7f002c0c4e2a37e1219610a6b","name":"Ethorse","symbol":"HORSE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2531/thumb/ethorse.png?1548125546"},{"chainId":1,"address":"0x355a458d555151d3b27f94227960ade1504e526a","name":"StockChain","symbol":"SCC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3577/thumb/stockchain.png?1548611100"},{"chainId":1,"address":"0xf3dcbc6d72a4e1892f7917b7c43b74131df8480e","name":"Big Data Protocol","symbol":"BDP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14222/thumb/logo_BDP_200.png?1615088501"},{"chainId":1,"address":"0x5fbdb42bb048c685c990a37f2c87fe087c586655","name":"Xenon","symbol":"XEN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11105/thumb/DyNZKe79_400x400.jpg?1588568617"},{"chainId":1,"address":"0x3afa1902b1f8a802abc18e5ad982d1bcd34afe22","name":"GrEarn","symbol":"GST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6193/thumb/GVlSl0Oi_400x400.jpg?1547042222"},{"chainId":1,"address":"0x35b08722aa26be119c1608029ccbc976ac5c1082","name":"Eminer","symbol":"EM","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9155/thumb/KDbQPKIu_400x400.png?1564735775"},{"chainId":1,"address":"0x3832d2f059e55934220881f831be501d180671a7","name":"renDOGE","symbol":"RENDOGE","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13796/thumb/renDOGE.png?1611897869"},{"chainId":1,"address":"0x1c7bbadc81e18f7177a95eb1593e5f5f35861b10","name":"Auric Network","symbol":"AUSCM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13015/thumb/auric-1-high-res_icon_300_PNG.png?1604384136"},{"chainId":1,"address":"0xaf91e8afbe87642dc628786188a54b78580a4d76","name":"Fund Of Yours","symbol":"FOY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16648/thumb/foy200.png?1624591862"},{"chainId":1,"address":"0xb1a30851e3f7d841b231b086479608e17198363a","name":"Homeros","symbol":"HMR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11048/thumb/g1jAE5knZSlNUdLN8fEAQFMI4mTXCuNdrjj3i77rWhsIQADp3VWH2BHTkH7-oWwExxJk7Fu545LPeT3gMNzGlCZ63oX3-9sTjiqlSDo3fRLwHmhUgjD_jtKTl1AJ_F_UOOpsTqob9CxiWHXsSTlz0zODxOrjnqpMe4_cPT_C4EskSEVee_oooTasTQ6ONrv85Zcvc8Eeb8cHLsV.jpg?1587532938"},{"chainId":1,"address":"0x2f34dd3d46855277eee79a1d724c2249f770054b","name":"GoForIt Walk Win","symbol":"GOI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9564/thumb/E5q4JAYW_400x400.jpg?1568849486"},{"chainId":1,"address":"0x683239a4cab49642c6e025cf81d283f9c87bc07d","name":"Unicly MoonCats Col","symbol":"UMOON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15674/thumb/MoonCats.jpg?1621498102"},{"chainId":1,"address":"0x6737fe98389ffb356f64ebb726aa1a92390d94fb","name":"Zero Carbon Project","symbol":"ZCC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4610/thumb/29597798_1994933117411549_6379526843613393871_n.png?1606409572"},{"chainId":1,"address":"0x4c9bbfc1fbd93dfb509e718400978fbeedf590e9","name":"Rai Token","symbol":"RAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16408/thumb/rai-logo.png?1623921062"},{"chainId":1,"address":"0x45245bc59219eeaaf6cd3f382e078a461ff9de7b","name":"BANKEX","symbol":"BKX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2199/thumb/cEG4Vgx.png?1547036488"},{"chainId":1,"address":"0x348b7f3106b5da47405332534d06069ff9ce4d1b","name":"Elongate Deluxe","symbol":"ELONGD","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15487/thumb/tT2g66pd.jpg?1623764695"},{"chainId":1,"address":"0xec0d77a58528a218cbf41fa6e1585c8d7a085868","name":"oneETH","symbol":"ONEETH","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15090/thumb/logo_200_eth.png?1619665764"},{"chainId":1,"address":"0x765baefcb5418fa9f7dddacb1ccc07bd0e890e4e","name":"Meteorite Network","symbol":"METEOR","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/14889/thumb/Meteor-token-200.png?1618900489"},{"chainId":1,"address":"0x6c22b815904165f3599f0a4a092d458966bd8024","name":"Bit Public Talent N","symbol":"BPTN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8412/thumb/7f346702db390a289f5770f008563173.png?1558077057"},{"chainId":1,"address":"0xaa8330fb2b4d5d07abfe7a72262752a8505c6b37","name":"Polkacity","symbol":"POLC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14066/thumb/vykih1Nq_400x400.png?1614130959"},{"chainId":1,"address":"0xd084944d3c05cd115c09d072b9f44ba3e0e45921","name":"Manifold Finance","symbol":"FOLD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15928/thumb/Manifold.png?1622439811"},{"chainId":1,"address":"0x9b53e429b0badd98ef7f01f03702986c516a5715","name":"Hybrix","symbol":"HY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11518/thumb/icon_%282%29.png?1590618414"},{"chainId":1,"address":"0x24ec2ca132abf8f6f8a6e24a1b97943e31f256a7","name":"dotmoovs","symbol":"MOOV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15817/thumb/dotmoove.PNG?1621981967"},{"chainId":1,"address":"0xa3ceac0aac5c5d868973e546ce4731ba90e873c2","name":"Self Storage Coin","symbol":"STOR","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8159/thumb/stor33_2.png?1555897923"},{"chainId":1,"address":"0x2c4e8f2d746113d0696ce89b35f0d8bf88e0aeca","name":"OST","symbol":"OST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1367/thumb/ost.jpg?1547035393"},{"chainId":1,"address":"0x7dbbcae15d4db168e01673400d7844870cc1e36f","name":"WOLFY","symbol":"WOLFY","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15742/thumb/Wofly.png?1621761884"},{"chainId":1,"address":"0x324af2d5353f2dd138e234b359d30d67c64b1b20","name":"Oracle System","symbol":"ORC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12517/thumb/www.oraclesystem.io-home-org-logo.png?1600382654"},{"chainId":1,"address":"0xafce9b78d409bf74980cacf610afb851bf02f257","name":"Lift Kitchen BTC","symbol":"LFBTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15598/thumb/lift.kitchen-logo.ee75a5f4.png?1621299108"},{"chainId":1,"address":"0xf9209d900f7ad1dc45376a2caa61c78f6dea53b6","name":"Lift Kitchen","symbol":"LIFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15601/thumb/lift.kitchen-logo.ee75a5f4.png?1621304520"},{"chainId":1,"address":"0x3d3dd61b0f9a558759a21da42166042b114e12d5","name":"3X Short EOS Token","symbol":"EOSBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10186/thumb/683JEXMN_400x400_%281%29.png?1576508730"},{"chainId":1,"address":"0xa0afaa285ce85974c3c881256cb7f225e3a1178a","name":"Wrapped CrescoFin","symbol":"WCRES","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13254/thumb/cres_logo.png?1606728821"},{"chainId":1,"address":"0xdfe691f37b6264a90ff507eb359c45d55037951c","name":"Karma DAO","symbol":"KARMA","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/11884/thumb/Karma.png?1597042574"},{"chainId":1,"address":"0x4824a7b64e3966b0133f4f4ffb1b9d6beb75fff7","name":"TokenClub","symbol":"TCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2455/thumb/tokenclub.png?1558012103"},{"chainId":1,"address":"0x20f7a3ddf244dc9299975b4da1c39f8d5d75f05a","name":"Sapien","symbol":"SPN","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/2596/thumb/Sapien_Token_450x450.png?1607560493"},{"chainId":1,"address":"0x10bc518c32fbae5e38ecb50a612160571bd81e44","name":"VeraOne","symbol":"VRO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11112/thumb/wsBaVF.png?1588639964"},{"chainId":1,"address":"0xe047705117eb07e712c3d684f5b18e74577e83ac","name":"BitcashPay","symbol":"BCP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/14353/thumb/BCP-200x200.png?1616468499"},{"chainId":1,"address":"0x490e3f4af13e1616ec97a8c6600c1061a8d0253e","name":"Terran Coin","symbol":"TRR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15351/thumb/TERRAN-500px.png?1620626066"},{"chainId":1,"address":"0xa0cf46eb152656c7090e769916eb44a138aaa406","name":"Spheroid Universe","symbol":"SPH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11968/thumb/spheroid-sph-icon-400x400.png?1597307957"},{"chainId":1,"address":"0xbcd4b7de6fde81025f74426d43165a5b0d790fdd","name":"SpiderDAO","symbol":"SPDR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13378/thumb/spiderdao_logo.png?1608029180"},{"chainId":1,"address":"0xd2adc1c84443ad06f0017adca346bd9b6fc52cab","name":"dFund","symbol":"DFND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15286/thumb/1zbdX36.png?1620355973"},{"chainId":1,"address":"0xbea98c05eeae2f3bc8c3565db7551eb738c8ccab","name":"Geyser","symbol":"GYSR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12995/thumb/Updated_GYSR_Logo_-_Google_Docs.png?1625757376"},{"chainId":1,"address":"0x9b639486f4a40c1a7a6728114f2413973f5fa4c6","name":"Electronic Move Pay","symbol":"EMP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9338/thumb/26.png?1566387741"},{"chainId":1,"address":"0xc28e931814725bbeb9e670676fabbcb694fe7df2","name":"Quadrant Protocol","symbol":"EQUAD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4462/thumb/equad.png?1547039783"},{"chainId":1,"address":"0x926be13b4d93f29ea254e4e518f33099e45d7f06","name":"POC Chain","symbol":"POCC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7718/thumb/logo_%281%29.png?1549956313"},{"chainId":1,"address":"0x657b83a0336561c8f64389a6f5ade675c04b0c3b","name":"Playcent","symbol":"PCNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14335/thumb/1_B5bFcgBld5poUj_c-_K1Jw.png?1615444831"},{"chainId":1,"address":"0xb52bbd3d5bfa3836bf2b55fe3b7467219280bc2e","name":"StiB","symbol":"STI","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10059/thumb/200x200_%281%29.png?1576674116"},{"chainId":1,"address":"0x3a707d56d538e85b783e8ce12b346e7fb6511f90","name":"Inverse Ethereum Vo","symbol":"IETHV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16715/thumb/logo_-_2021-06-28T085526.083.png?1624841740"},{"chainId":1,"address":"0x387c291bc3274389054e82ce81dd318a0113caf5","name":"AirRaid Lottery Tok","symbol":"ARAID","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16234/thumb/AHz3YHu.png?1623364561"},{"chainId":1,"address":"0x41599149f1b52035392402f9e311b1edb0c9f699","name":"RealT Token 14319","symbol":"REALTOKEN-S-14319-R","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16592/thumb/14319-Rosemary-hero-1-800x600.jpeg?1624539171"},{"chainId":1,"address":"0xf45b14ddabf0f0e275e215b94dd24ae013a27f12","name":"sXTZ","symbol":"SXTZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8863/thumb/sXTZ.png?1616150951"},{"chainId":1,"address":"0x8626b38267e4fc0d8c92e0bb86f97acab3f6aa05","name":"RealT Token 10604","symbol":"REALTOKEN-S-10604-S","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16682/thumb/10604-Somerset-hero-1.jpeg?1624632454"},{"chainId":1,"address":"0x3ac7a71b97183e3db7722c75eaa8df2c1a0badfc","name":"Unicly Waifu Collec","symbol":"UWAIFU","decimals":24,"logoURI":"https://assets.coingecko.com/coins/images/15218/thumb/y1ano8ch_400x400.jpg?1620116826"},{"chainId":1,"address":"0xf9fbe825bfb2bf3e387af0dc18cac8d87f29dea8","name":"Bot Ocean","symbol":"BOTS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13909/thumb/photo_2021-02-09_10-08-17.jpg?1612836512"},{"chainId":1,"address":"0x8a3d77e9d6968b780564936d15b09805827c21fa","name":"Uniris","symbol":"UCO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12330/thumb/e353ZVj.png?1599112996"},{"chainId":1,"address":"0xc96c1609a1a45ccc667b2b7fa6508e29617f7b69","name":"2gether","symbol":"2GT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14516/thumb/m329Ic5i_400x400.jpg?1616647761"},{"chainId":1,"address":"0xb78b3320493a4efaa1028130c5ba26f0b6085ef8","name":"Dracula Token","symbol":"DRC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12758/thumb/dracula_protocol.png?1602316655"},{"chainId":1,"address":"0x8028a34ec63678bcb64325f805449beba98c28a8","name":"Aggregator Network","symbol":"AGGT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15520/thumb/aggt.PNG?1621119056"},{"chainId":1,"address":"0x5befbb272290dd5b8521d4a938f6c4757742c430","name":"Xfinance","symbol":"XFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12449/thumb/go.png?1599904281"},{"chainId":1,"address":"0x7c3e3bdcec89a3f706c9a02797ec427ffa596787","name":"StakeHouse Batch","symbol":"SHB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15638/thumb/stakehouse-dp.png?1621422288"},{"chainId":1,"address":"0x77b1465b0e01ba085e515324e30fee6555c623ea","name":"Set of Sets Trailbl","symbol":"MQSS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11781/thumb/sets_of_sets_trailblazer_fund.png?1593933100"},{"chainId":1,"address":"0xc53342fd7575f572b0ff4569e31941a5b821ac76","name":"Ethereum Volatility","symbol":"ETHV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16716/thumb/logo_-_2021-06-28T092549.772.png?1624843558"},{"chainId":1,"address":"0x0417912b3a7af768051765040a55bb0925d4ddcf","name":"Liquidity Dividends","symbol":"LID","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11921/thumb/logo-200.png?1596100933"},{"chainId":1,"address":"0xf32aa187d5bc16a2c02a6afb7df1459d0d107574","name":"Hachiko Inu Token","symbol":"INU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16392/thumb/hachikoinu-200px.png?1626355242"},{"chainId":1,"address":"0xf17e9e4e32d842e4ddfbed5750a26f7bd77777ee","name":"One Army Coin","symbol":"OAC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14928/thumb/OAC-token-200-logo.png?1619068717"},{"chainId":1,"address":"0xe94b97b6b43639e238c851a7e693f50033efd75c","name":"Rainbow Token","symbol":"RNBW","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16754/thumb/RNBW-256x256.png?1624927932"},{"chainId":1,"address":"0xae17f4f5ca32f77ea8e3786db7c0b2fe877ac176","name":"Basis Coin Cash","symbol":"BCC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13535/thumb/yiu47vtN_400x400.jpg?1609541472"},{"chainId":1,"address":"0x17ef75aa22dd5f6c2763b8304ab24f40ee54d48a","name":"Revolution Populi","symbol":"RVP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14772/thumb/vsd0Wnc2_400x400.png?1618369912"},{"chainId":1,"address":"0x8abf3a95862619a55fa00cb3e4eedbe113ff468c","name":"Money Printer Go Br","symbol":"BRRR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10904/thumb/ethbtc_adl_2h.png?1585731253"},{"chainId":1,"address":"0x315699f1ba88383cff2f2f30fcad187adb2e4d72","name":"RealT Token 14078","symbol":"REALTOKEN-S-14078-C","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16597/thumb/14078-Carlisle-hero-1-800x600.jpeg?1624541175"},{"chainId":1,"address":"0x2a1174d1cd4348cb1eaec3f00310908ca289e5be","name":"Exgold","symbol":"EXG","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/14068/thumb/-HgHqzsy_400x400.png?1614137624"},{"chainId":1,"address":"0xf8cc67e304f8e1a351ed83b4dbbe6b4076d51376","name":"1X Short Exchange T","symbol":"EXCHHEDGE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11985/thumb/683JEXMN_400x400__1_.png?1596683946"},{"chainId":1,"address":"0x686c650dbcfeaa75d09b883621ad810f5952bd5d","name":"AAX Token","symbol":"AAB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11073/thumb/GluwoJk__400x400.jpg?1587969347"},{"chainId":1,"address":"0x501e8726d06cdef66f3e0cb67f54924cca1cc894","name":"BRMV Token","symbol":"BRMV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14389/thumb/brmv-logo-256px.png?1615856173"},{"chainId":1,"address":"0x9570ec7ab05d61877ff7eb180f837c7c079c4844","name":"Gaps Chain","symbol":"GAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9462/thumb/vvXw-NQ6_400x400.jpg?1569317066"},{"chainId":1,"address":"0xa9859874e1743a32409f75bb11549892138bba1e","name":"iETH","symbol":"IETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8846/thumb/iETH.png?1616151402"},{"chainId":1,"address":"0x6a48ba795e3289b9151036e189e352e3ee2c7798","name":"SXC Token","symbol":"SXC","decimals":18},{"chainId":1,"address":"0xfb559ce67ff522ec0b9ba7f5dc9dc7ef6c139803","name":"Probit Token","symbol":"PROB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6765/thumb/ProBit-Exchange-logo.png?1547043029"},{"chainId":1,"address":"0x72c9fb7ed19d3ce51cea5c56b3e023cd918baadf","name":"AGROLOT","symbol":"AGLT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4464/thumb/aglt.png?1547039784"},{"chainId":1,"address":"0x243c56e8e740025ac6b112d7b9af59be8eef6e33","name":"Lukutex","symbol":"LKT","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/14523/thumb/1HuZD81.png?1618976829"},{"chainId":1,"address":"0xe2db94e8d4e4144c336e45668a792d17d48a482c","name":"Nuvo Cash","symbol":"NUVO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11422/thumb/nuvo.png?1590109082"},{"chainId":1,"address":"0xaf162491c0b21900c01f4cc0f7110238aacdebe7","name":"arcane bear","symbol":"BEAR","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/13421/thumb/arcane_bear_logo.png?1608476062"},{"chainId":1,"address":"0x89ee58af4871b474c30001982c3d7439c933c838","name":"yfBeta","symbol":"YFBETA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12325/thumb/yfbeta_logo.jpg?1599096612"},{"chainId":1,"address":"0x41d5d79431a913c4ae7d69a668ecdfe5ff9dfb68","name":"Inverse Finance","symbol":"INV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14205/thumb/inverse_finance.jpg?1614921871"},{"chainId":1,"address":"0x780116d91e5592e58a3b3c76a351571b39abcec6","name":"Blockparty","symbol":"BOXX","decimals":15,"logoURI":"https://assets.coingecko.com/coins/images/5995/thumb/boxx-token.png?1547041938"},{"chainId":1,"address":"0x3ac2ab91ddf57e2385089202ca221c360ced0062","name":"SwapShip","symbol":"SWSH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12593/thumb/SwapShip.png?1600975182"},{"chainId":1,"address":"0xc28a4162e3cc1838bad6dfaec83d57a0d62c80f3","name":"AnySale","symbol":"SALE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13863/thumb/9le9NWE.png?1612418381"},{"chainId":1,"address":"0xb1e9157c2fdcc5a856c8da8b2d89b6c32b3c1229","name":"Zenfuse","symbol":"ZEFU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12796/thumb/zenfuse.jpg?1602640333"},{"chainId":1,"address":"0x5661c46e366570360064ae1a50a17a7a1a8f3236","name":"Jllone","symbol":"JLL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6890/thumb/jllone.png?1547043243"},{"chainId":1,"address":"0x990f341946a3fdb507ae7e52d17851b87168017c","name":"Strong","symbol":"STRONG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12092/thumb/STRONG-Token-256x256.png?1597823573"},{"chainId":1,"address":"0xde201daec04ba73166d9917fdf08e1728e270f06","name":"MOJI Experience Poi","symbol":"MEXP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12571/thumb/mexp_logo.png?1600842788"},{"chainId":1,"address":"0x30635297e450b930f8693297eba160d9e6c8ebcf","name":"sUniswap","symbol":"SUNI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15730/thumb/sUNI_final.PNG?1621670197"},{"chainId":1,"address":"0x75f0038b8fbfccafe2ab9a51431658871ba5182c","name":"3X Long Cosmos Toke","symbol":"ATOMBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10181/thumb/683JEXMN_400x400_%281%29.png?1576507613"},{"chainId":1,"address":"0x79ba92dda26fce15e1e9af47d5cfdfd2a093e000","name":"SERGS","symbol":"SERGS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13031/thumb/sergs_logo.png?1604476848"},{"chainId":1,"address":"0xc278041fdd8249fe4c1aad1193876857eea3d68c","name":"IdleTUSD Best Yiel","symbol":"IDLETUSDYIELD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11935/thumb/idletusdv3mMaxyield_32.png?1596263719"},{"chainId":1,"address":"0x13b02c8de71680e71f0820c996e4be43c2f57d15","name":"Mirrored Invesco QQ","symbol":"MQQQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13645/thumb/mirror_logo_transparent.png?1611565327"},{"chainId":1,"address":"0x4b4b1d389d4f4e082b30f75c6319c0ce5acbd619","name":"Heart Number","symbol":"HTN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9002/thumb/htn%28200x200%29.png?1600757668"},{"chainId":1,"address":"0xa09ff006c652496e72d648cef2f4ee6777efdf6f","name":"deCraft Finance","symbol":"CRAFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12775/thumb/decraft_logo.jpg?1602486383"},{"chainId":1,"address":"0xa5f8fc0921880cb7342368bd128eb8050442b1a1","name":"Block Array","symbol":"ARY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2645/thumb/block-array.png?1547350758"},{"chainId":1,"address":"0x7c3cf2d43b50e78e27a81293a43fcac45796fb54","name":"Kong Defi","symbol":"KONG","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/14490/thumb/IMG_4643.png?1620025009"},{"chainId":1,"address":"0x0a425122852ed351946a828b348bfdcda51effd8","name":"EduMetrix Coin","symbol":"EMC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12909/thumb/Coin_PNG.png?1603421187"},{"chainId":1,"address":"0xe52d53c8c9aa7255f8c2fa9f7093fea7192d2933","name":"YieldX","symbol":"YIELDX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12904/thumb/logo-200x200.png?1603353354"},{"chainId":1,"address":"0x365542df3c8c9d096c5f0de24a0d8cf33c19c8fd","name":"Hyper Speed Network","symbol":"HSN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8858/thumb/tFLHRsU2_400x400.jpg?1569316557"},{"chainId":1,"address":"0x2e2f3246b6c65ccc4239c9ee556ec143a7e5de2c","name":"Yfi mobi","symbol":"YFIM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13063/thumb/yfim.jpg?1604848218"},{"chainId":1,"address":"0x6aac8cb9861e42bf8259f5abdc6ae3ae89909e11","name":"Bitcoin Red","symbol":"BTCRED","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1054/thumb/bitcoin-red.png?1547034993"},{"chainId":1,"address":"0x7aa46a51f717404d944051af3075bbcb49b2288b","name":"Genebank Token","symbol":"GNBT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15963/thumb/Gene-Bank-500px.jpg?1622519558"},{"chainId":1,"address":"0x26ff6d16549a00ba8b36ce3159b5277e6e798d18","name":"Chihua Token","symbol":"CHIHUA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15655/thumb/chihua_token_icon_200x200.png?1622129847"},{"chainId":1,"address":"0x9534ad65fb398e27ac8f4251dae1780b989d136e","name":"Vulcan Forged","symbol":"PYR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14770/thumb/1617088937196.png?1619414736"},{"chainId":1,"address":"0x04969cd041c0cafb6ac462bd65b536a5bdb3a670","name":"Wrapped ECOMI","symbol":"WOMI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14675/thumb/ecomi.jpg?1617689100"},{"chainId":1,"address":"0x12dc767728105aa415dd720dfbd0ea1d85841172","name":"ELDORADO TOKEN","symbol":"ERD","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/9778/thumb/erdcoin.png?1574655368"},{"chainId":1,"address":"0xb5a52519426ec6d88784cc80e621062498306734","name":"Cash Per Scan","symbol":"CPS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10551/thumb/cps.PNG?1580853560"},{"chainId":1,"address":"0x44a67c8570a61a28bafd0035042f2f0a73a64428","name":"GermanCoin","symbol":"GCX","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/11552/thumb/pNfx8Lc83ER33KaMGNgBpsN0fofGu0MwRO2eM3_1Q10nzOxqgFjM4Jbq2uHUiRlSJNyMzJi1guj4jyY-vH_00bGX2hOxE79RJX4n_6_mDp13h3GraWnxW0NvfXi1Oi3n8VwHnbX5Uf-c9K7dMJrmq5VQZPYUb2r7n_nud-D32uky7zZS4S55ilccvqocKtLMWnnNH5P5ABNuoP6a8Gd9f.jpg?1590998890"},{"chainId":1,"address":"0xc0bfeba72805f22dc18dde31467c5a55c16ff57b","name":"The MetaONEz","symbol":"META","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14367/thumb/metaonez.png?1615730788"},{"chainId":1,"address":"0x68c85b9f78f30a0df5ac5723e4e700037f185415","name":"AiWork","symbol":"AWO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15373/thumb/aiwork.PNG?1620691299"},{"chainId":1,"address":"0xb67beb26ebeb0dceec354ae0942256d03c01771b","name":"DeStorage","symbol":"DS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15984/thumb/DS_LOG_Transparent_200x200.png?1622535280"},{"chainId":1,"address":"0x5bb29c33c4a3c29f56f8aca40b4db91d8a5fe2c5","name":"One Share","symbol":"ONS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13531/thumb/bss.a1671c75.png?1609452258"},{"chainId":1,"address":"0x108d27f9c4b2a98c025c94c76ca78c6ce6c7a4eb","name":"Metaprediction","symbol":"METP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10997/thumb/81621194_148915083232429_7449717815403085824_n.jpg?1587026250"},{"chainId":1,"address":"0xc314b0e758d5ff74f63e307a86ebfe183c95767b","name":"Adappter Token","symbol":"ADP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14203/thumb/logo_on.png?1614909616"},{"chainId":1,"address":"0x8064d9ae6cdf087b1bcd5bdf3531bd5d8c537a68","name":"BoringDAO BTC","symbol":"OBTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13525/thumb/gWzm2dr.png?1609390713"},{"chainId":1,"address":"0xdd039990bd551ce7437d3bf54d155220b7988b71","name":"Degens","symbol":"DEGENS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14526/thumb/degens_logo.png?1616740013"},{"chainId":1,"address":"0x56687cf29ac9751ce2a4e764680b6ad7e668942e","name":"FlynnJamm","symbol":"JAMM","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/11943/thumb/jamm.png?1602491065"},{"chainId":1,"address":"0x076641af1b8f06b7f8c92587156143c109002cbe","name":"SoPay","symbol":"SOP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6736/thumb/sopay.png?1548609877"},{"chainId":1,"address":"0xc0e6737a29de7a00e2f6011924eb257106cb082f","name":"Glosfer Token","symbol":"GLO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9237/thumb/ItBMqQKt_400x400.jpg?1565336364"},{"chainId":1,"address":"0xe8ed08a581777f112654e28de507e11613da0379","name":"Yearn Finance Cente","symbol":"YFC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13199/thumb/yfc_logo.png?1606186020"},{"chainId":1,"address":"0x5913d0f34615923552ee913dbe809f9f348e706e","name":"BMJ Master Nodes","symbol":"BMJ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12601/thumb/200.png?1601001633"},{"chainId":1,"address":"0x9f195617fa8fbad9540c5d113a99a0a0172aaedc","name":"Niobium Coin","symbol":"NBC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4095/thumb/logo-niobium.png?1547039273"},{"chainId":1,"address":"0x09970aec766b6f3223aca9111555e99dc50ff13a","name":"Levolution","symbol":"LEVL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7370/thumb/L_Icon_Blue_200x200.png?1618983083"},{"chainId":1,"address":"0xf7920b0768ecb20a123fac32311d07d193381d6f","name":"Time New Bank","symbol":"TNB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1265/thumb/time-new-bank.png?1547035290"},{"chainId":1,"address":"0x14d1c83df4decee9deb14ee851f109f0101a6631","name":"Volts Finance","symbol":"VOLTS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13115/thumb/volts_logo.png?1605367400"},{"chainId":1,"address":"0xa29a8e360c0cba25a3719763fde43a1ee570271d","name":"OILage","symbol":"OIL","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11232/thumb/download_%2812%29.png?1589767119"},{"chainId":1,"address":"0xa98ed1fd277ead2c00d143cbe1465f59e65a0066","name":"Thx ","symbol":"THX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9134/thumb/dtUHCa05GdIeMwiuO1Vdhpxe8f3xbPP_lIwFrnw2ic800CB3fhlk2eOp8hAGg-EUwrCTHwcQQqv3N3ikf5qWOKmbJePX5iK333iXdIlVF4UyAHb7ZsCi8nYBqBCJ7KZ6BwYcdlbguRPth6YSDWL5EBDIJQGmmkWEb-qTX7rnYEqS-9crxEkQJujPBnCVUV1qz87RgHV9KOvWL5HW6twlwJ.jpg?1564611313"},{"chainId":1,"address":"0x3b834a620751a811f65d8f599b3b72617a4418d0","name":"3X Short Cosmos Tok","symbol":"ATOMBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10156/thumb/683JEXMN_400x400_%281%29.png?1576503839"},{"chainId":1,"address":"0xf0e3543744afced8042131582f2a19b6aeb82794","name":"Variable Time Dolla","symbol":"VTD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13608/thumb/vtd.jpg?1610273963"},{"chainId":1,"address":"0xc19216eea17b2f4dd677f1024cda59c7d142f189","name":"ETH Long Only Alpha","symbol":"ELOAP","decimals":18},{"chainId":1,"address":"0xe2fe5e7e206e7b46cad6a5146320e5b4b9a18e97","name":"Bitcomo","symbol":"BM","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/4127/thumb/Webp.net-resizeimage_%2828%29.png?1547039349"},{"chainId":1,"address":"0x3543638ed4a9006e4840b105944271bcea15605d","name":"U Network","symbol":"UUU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3877/thumb/2645.png?1547038930"},{"chainId":1,"address":"0x88c8cf3a212c0369698d13fe98fcb76620389841","name":"sEOS","symbol":"SEOS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11626/thumb/sEOS.png?1616150113"},{"chainId":1,"address":"0x49e90537d5ef6778fd000d1f05be20134f9f6dc6","name":"ODDO coin","symbol":"ODC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8596/thumb/5-C8-F6331-50-EF-4-CC2-94-EB-7-C4-FB160-FC7-B.jpg?1559547160"},{"chainId":1,"address":"0x28fac5334c9f7262b3a3fe707e250e01053e07b5","name":"IdleUSDT Risk Adju","symbol":"IDLEUSDTSAFE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11931/thumb/idleusdt-safe.png?1596263270"},{"chainId":1,"address":"0xcbd380c2d84deafed09f79863705353505764f26","name":"Emojis Farm","symbol":"EMOJI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13341/thumb/emojis_farm.png?1607588447"},{"chainId":1,"address":"0x4af5ff1a60a6ef6c7c8f9c4e304cd9051fca3ec0","name":"Rigel Protocol","symbol":"RGP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15837/thumb/A_qRYvB2_400x400.png?1622080940"},{"chainId":1,"address":"0xadb2437e6f65682b85f814fbc12fec0508a7b1d0","name":"UniCrypt","symbol":"UNCX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12871/thumb/unicrypt_logo.png?1603178739"},{"chainId":1,"address":"0xf4c17bc4979c1dc7b4ca50115358dec58c67fd9d","name":"Omega Protocol Mone","symbol":"OPM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12337/thumb/opm-200px.png?1599136480"},{"chainId":1,"address":"0x9135d92e3a34e2a94e4474b74b9dc2d51118eed5","name":"Ulgen Hash Power","symbol":"UHP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11897/thumb/download_%2816%29.png?1595892702"},{"chainId":1,"address":"0xb8e2e2101ed11e9138803cd3e06e16dd19910647","name":"ArdCoin","symbol":"ARDX","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/9432/thumb/bu6rbqr.png?1567398000"},{"chainId":1,"address":"0xd075e95423c5c4ba1e122cae0f4cdfa19b82881b","name":"OPES Wrapped PE ","symbol":"WPE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16647/thumb/opes.png?1625834316"},{"chainId":1,"address":"0x9501bfc48897dceeadf73113ef635d2ff7ee4b97","name":"easyMine","symbol":"EMT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1749/thumb/emt.png?1547036034"},{"chainId":1,"address":"0xf88b137cfa667065955abd17525e89edcf4d6426","name":"iTrust Governance T","symbol":"ITG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16713/thumb/anchor.png?1624840761"},{"chainId":1,"address":"0xa5e99ad202bdd71d3518306cf4dd163261981af1","name":"Community Chain","symbol":"COMC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6948/thumb/download_%288%29.jpeg?1547043326"},{"chainId":1,"address":"0x9856c5ca15a4ac9c65aac090c38a9f39eb3b5eec","name":"RealT Token 18273","symbol":"REALTOKEN-S-18273-M","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16665/thumb/18273-Monte-Vista-hero-1b.jpeg?1624626435"},{"chainId":1,"address":"0xae2fab175d20b7afa56f3bb32500b26dc62bf572","name":"Tripedia","symbol":"TRIP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11014/thumb/4-e1525270062824.png?1587113708"},{"chainId":1,"address":"0x5a9f5992085e8a25a45716cb6f8ff5b57a05d332","name":"Communication Devel","symbol":"CDR","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7552/thumb/Screenshot_2019-01-24_at_5.31.56_PM.png?1548322328"},{"chainId":1,"address":"0x592481a5f6b4f078cc303c2cde4337dfa2d76fa0","name":"Sting","symbol":"STN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13760/thumb/sting.png?1611612491"},{"chainId":1,"address":"0x7c5d5100b339fe7d995a893af6cb496b9474373c","name":"Loon Network","symbol":"LOON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11673/thumb/ErUvUA2D4Q8hPWXxZBIuiI8MD0nrU2rDEY56d6EtVzJDTqlflAFXa2bgJ_kFwb8OtotfAvESvm-dik7d_SeJJh23f6RosUJ0AzU64QcKk5H3fu300KOJjFDFsntpRWARFKI5S4Cc8F3pcRPBkFIw6oPF58mKi83sa2DJPl-E5JMqmj6rJh5acb7Fvi80kfziWv3DHhhpg1YJYMP.jpg?1592536236"},{"chainId":1,"address":"0xedfbd6c48c3ddff5612ade14b45bb19f916809ba","name":"pulltherug finance","symbol":"RUGZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12749/thumb/rugz_logo.png?1602218634"},{"chainId":1,"address":"0x68e0a48d3bff6633a31d1d100b70f93c3859218b","name":"Blaze DeFi","symbol":"BNFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13390/thumb/photo_2020-12-16_15-23-59.jpg?1608108829"},{"chainId":1,"address":"0x135093731f61dd5cbfd7744751bf3ced3aaa69b1","name":"HNT Chain","symbol":"HNTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9757/thumb/4162ad27bffddd40bede8468d161919c.png?1571437573"},{"chainId":1,"address":"0x30634241d3a7fbcea55f0ba7df42dfd8cdd8b2cd","name":"Grabity","symbol":"GBT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8225/thumb/spaces_-LipZ5zidHYMsvWqinKQ_avatar-1608221625165_%281%29.png?1617345399"},{"chainId":1,"address":"0x5a14fe6923e767a8238f29d3e1fb1a913975f0d7","name":"PWay","symbol":"PWAY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14377/thumb/PWay_sygnet_200x200_transparent.png?1615778567"},{"chainId":1,"address":"0x931ad0628aa11791c26ff4d41ce23e40c31c5e4e","name":"Pegasus","symbol":"PGS","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9646/thumb/pgs.PNG?1570179224"},{"chainId":1,"address":"0xe4883bcb919386bb5f48ef59b7c31c1d93a51a57","name":"Satopay Yield Token","symbol":"SPY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12676/thumb/LseN1lD.png?1601531549"},{"chainId":1,"address":"0x45f2ab0ca2116b2e1a70bf5e13293947b25d0272","name":"Global Reserve Syst","symbol":"GLOB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10773/thumb/g20.png?1583379257"},{"chainId":1,"address":"0x7a9716685f852ee268feb86dffa562d214cc13db","name":"FANBI TOKEN","symbol":"FBT","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/9828/thumb/logo1_%281%29.png?1572472211"},{"chainId":1,"address":"0xd27d76a1ba55ce5c0291ccd04febbe793d22ebf4","name":"BenePit","symbol":"BNP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6740/thumb/TEmrEC3Z_400x400.png?1570484295"},{"chainId":1,"address":"0x7777770f8a6632ff043c8833310e245eba9209e6","name":"Tokens of Babel","symbol":"TOB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12144/thumb/tokens_of_babel_logo.jpg?1597566356"},{"chainId":1,"address":"0xdb80734b094a3f964dedfd10e8946753ae0ac04c","name":"Keep Calm and Hodl","symbol":"KCH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13355/thumb/200_%282%29.png?1607812469"},{"chainId":1,"address":"0x6c139349ee94ebaaff55ed52d382673c263b22d6","name":"Upper Euro","symbol":"EURU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12353/thumb/UPPER-moeda-euro.png?1599260517"},{"chainId":1,"address":"0xf23b80216a10e6f0c0d3b5ad5c9349e9425cad40","name":"RealT Token 15778","symbol":"REALTOKEN-S-15778-M","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16689/thumb/15778-manor-hero-2.jpeg?1624636173"},{"chainId":1,"address":"0x44440bd68b5e4b1e0cb810669097e9573175601b","name":"Unicly The Day by A","symbol":"UARC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15677/thumb/uarc.jpg?1621499433"},{"chainId":1,"address":"0x15f5f5f29a819bf7b4b80bf55352e1e42707c94e","name":"Die","symbol":"DIE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13136/thumb/gR-removebg-preview.png?1605580337"},{"chainId":1,"address":"0xc67b12049c2d0cf6e476bc64c7f82fc6c63cffc5","name":"Globe Derivative Ex","symbol":"GDT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/15335/thumb/gdt.PNG?1620597146"},{"chainId":1,"address":"0x23aeff664c1b2bba98422a0399586e96cc8a1c92","name":"Fee Active Collater","symbol":"FACT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12288/thumb/PfFTv2JB_200x200.jpg?1598826350"},{"chainId":1,"address":"0xdb2f2bcce3efa95eda95a233af45f3e0d4f00e2a","name":"Aegis","symbol":"AGS","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12391/thumb/logo-3.png?1599540071"},{"chainId":1,"address":"0x1680cfdad75da2bb56ded4f36bb9423c86ffa7b7","name":"Web Token Pay","symbol":"WTP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8720/thumb/logo_%2828%29.png?1560397140"},{"chainId":1,"address":"0xcd475371e39c0d94e82fccc9dd0ea710d0dc0c0b","name":"THECASH","symbol":"TCH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11851/thumb/thecash_logo_200.png?1595165242"},{"chainId":1,"address":"0xdb144cd0f15ee40aac5602364b470d703d7e16b6","name":"vSlice","symbol":"VSL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/543/thumb/vslice.png?1547034221"},{"chainId":1,"address":"0x0e0989b1f9b8a38983c2ba8053269ca62ec9b195","name":"Po et","symbol":"POE","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/910/thumb/poet.png?1548331583"},{"chainId":1,"address":"0x59fec83ec709c893aedd1a144cf1828eb04127cd","name":"pxGOLD Synthetic GO","symbol":"PXGOLD-MAY2021","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14018/thumb/PXGOLD.png?1613710831"},{"chainId":1,"address":"0x73f2651ea38d48b3b808ffddbd398fd600ab5ba7","name":"Dukascoin","symbol":"DUK+","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/14374/thumb/dukascoin_200x200_silver.png?1615774652"},{"chainId":1,"address":"0x88930072f583936f506ce1f1d5fe69290c2d6a2a","name":"Civitas Protocol","symbol":"CVT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13829/thumb/ctr.png?1616384860"},{"chainId":1,"address":"0x9a7a4c141a3bcce4a31e42c1192ac6add35069b4","name":"Momentum","symbol":"XMM","decimals":10,"logoURI":"https://assets.coingecko.com/coins/images/12461/thumb/logo-transparent-200.png?1600007183"},{"chainId":1,"address":"0xe6b7743e2b9aa2d0a9b163c4e69186abb57817d9","name":"Kuky Star","symbol":"KUKY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7465/thumb/images_%283%29.jpeg?1547622295"},{"chainId":1,"address":"0xde8607ccad60814c8d9cd6f5ce8e9031e4675c8f","name":"Bit Storage Box Tok","symbol":"BSBT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/14136/thumb/A8QSwwsxJ0gl8Er4EF4whEcOqHLqfjWScTYHWKkeXbgoFQLQJ6de46yhxAd8kLvuj6MRQT8lloRdPoS_kqbKCXlw-mYMiqFp7j1CbhBScOzhHyZjbVgLpifjOYawUK1308Xl3aMYCZOHxfVrQZpDxbx-8KATNqX03u-CO5UlG8-bV8p6wKlBHWZdw3AoAt-o0gZCBQCynxwVd-d.jpg?1614639184"},{"chainId":1,"address":"0x41933422dc4a1cb8c822e06f12f7b52fa5e7e094","name":"SOGE","symbol":"SOGE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14690/thumb/photo_2021-04-16_12-35-09.jpg?1620027241"},{"chainId":1,"address":"0x43244c686a014c49d3d5b8c4b20b4e3fab0cbda7","name":"kxUSD","symbol":"KXUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14788/thumb/kxUSD.png?1618458104"},{"chainId":1,"address":"0x74db83feba1574fec860413eb509d1ddfb1b730b","name":"Future Cash Digital","symbol":"FCD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13085/thumb/4abcb18740eb7eef72f8bca62a45640f_340x280.png?1604985657"},{"chainId":1,"address":"0xd64809f5f7d772d9112a6bd379de00a77188199e","name":"Lyfe Silver","symbol":"LSILVER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14939/thumb/LSILVER-Logo-200.png?1619082811"},{"chainId":1,"address":"0x3d9233f15bb93c78a4f07b5c5f7a018630217cb3","name":"Unicly Genesis Coll","symbol":"UUNICLY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14903/thumb/Unicly_%28unicly%29.jpg?1618937278"},{"chainId":1,"address":"0xffe510a92434a0df346c5e72a3494b043cf249eb","name":"LUX BIO EXCHANGE CO","symbol":"LBXC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9482/thumb/sam7Fy3A_400x400.jpg?1568000741"},{"chainId":1,"address":"0xef7f1aae6f60de9f353dc170a35b8f7c7814e32b","name":"AZ Fundchain","symbol":"AZT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7461/thumb/aPOa3zi6_400x400.jpg?1567983821"},{"chainId":1,"address":"0x13ca8eb6405cfbe2eae5d00207651002083fbc9d","name":"CryptoWater","symbol":"C2O","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/12621/thumb/CryptoWater-logo-coin_metal-blue-200.png?1601281931"},{"chainId":1,"address":"0xc11b1268c1a384e55c48c2391d8d480264a3a7f4","name":"cWBTC Legacy ","symbol":"CWBTC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/15290/thumb/cwbtc.png?1620371929"},{"chainId":1,"address":"0x578b49c45961f98d8df92854b53f1641af0a5036","name":"LINKA","symbol":"LINKA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9487/thumb/C2RRuVH6eVbXIDbew-0VJoGpPb_bMPjRjM9qlYud7tqtGgb1GskioTkIntKuugvXnX-Y3O54L-4zWeWWm_Fffo1kJiqJG5vE4Iu1FSvZ-N750y_tlB7yAGeYztAD-MDrwEPaF3Y9j6E94mPVyKuidqbxf9vBeR5r4GAya3friWZjMzpnJ_q9v0jiIBxEC5YAy1C0Zx6yqVoHJjiTW.jpg?1568013160"},{"chainId":1,"address":"0xb5bb48567bfd0bfe9e4b08ef8b7f91556cc2a112","name":"BankCoin BCash","symbol":"BCASH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7692/thumb/bcash.png?1549865564"},{"chainId":1,"address":"0xd85ad783cc94bd04196a13dc042a3054a9b52210","name":"TribeOne","symbol":"HAKA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16575/thumb/USqW1QX.png?1625577555"},{"chainId":1,"address":"0x69fe11b042789bc6e2fdaad064afd32bb298ae05","name":"The Red Order","symbol":"ORDR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16770/thumb/tW0tSF2.png?1624943147"},{"chainId":1,"address":"0x8379f52d09b9998ecba731288ee4fe532fd91c0b","name":"Backed Protocol","symbol":"BAKT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16773/thumb/QXP11lB.png?1624945482"},{"chainId":1,"address":"0x9f923653a19537b5a1b003854a1920fe67a8ffeb","name":"RealT Token 13114","symbol":"REALTOKEN-S-13114-G","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16678/thumb/13114-Glenfield-Ave.jpeg?1624629523"},{"chainId":1,"address":"0x8a63be90f095f6777be3ed25d9fc7cd2a63ddb30","name":"LINK ETH Long Only ","symbol":"LELOAP","decimals":18},{"chainId":1,"address":"0xa8892bfc33fa44053a9e402b1839966f4fec74a4","name":"Crypto User Base","symbol":"CUB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11906/thumb/logo-200x200.png?1596074026"},{"chainId":1,"address":"0xe9541c7ea236332f4d07be73101670f39b27da02","name":"Pureland Project","symbol":"PLD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8686/thumb/logo_%2826%29.png?1560233087"},{"chainId":1,"address":"0x6a404a3386655bd8b63e584f2efd2e3fb60e70f8","name":"Latex Chain","symbol":"LXC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8700/thumb/read_%284%29.jpg?1560239246"},{"chainId":1,"address":"0xef31cb88048416e301fee1ea13e7664b887ba7e8","name":"Staked yAxis","symbol":"SYAX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13867/thumb/zzRHMkND_400x400.jpg?1612429884"},{"chainId":1,"address":"0x15bda08c3afbf5955d6e9b235fd55a1fd0dbc829","name":"Alpha Coin","symbol":"APC","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/6725/thumb/alpha-coin.png?1547042955"},{"chainId":1,"address":"0xa8b6d0bd067ce5b2e4e9e225b2e0ff5eb74ded8a","name":"OBIC","symbol":"OBIC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12401/thumb/png-300x300.png?1599559020"},{"chainId":1,"address":"0x12d102f06da35cc0111eb58017fd2cd28537d0e1","name":"Vox Finance","symbol":"VOX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12880/thumb/BSensIa.png?1603261093"},{"chainId":1,"address":"0x02e3083a51e8632e571fbd6a62ac396c10c653ba","name":"Epluscoin","symbol":"EPLUS","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/4741/thumb/epluscoin-logo.png?1547040052"},{"chainId":1,"address":"0xdd690d8824c00c84d64606ffb12640e932c1af56","name":"Tavittcoin","symbol":"TAVITT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5155/thumb/tavitt-logo.png?1547040566"},{"chainId":1,"address":"0x01b23286ff60a543ec29366ae8d6b6274ca20541","name":"Brother Music Platf","symbol":"BMP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13207/thumb/BMP_logo.png?1606199707"},{"chainId":1,"address":"0xdeeb6091a5adc78fa0332bee5a38a8908b6b566e","name":"Taekwondo Access Cr","symbol":"TAC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15094/thumb/tac.PNG?1619679735"},{"chainId":1,"address":"0x03829f5675f3b51d0f8c2a74417a757625acf22f","name":"YFIBALANCER FINANCE","symbol":"YFIB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12411/thumb/LogoYFIB_200px.png?1599640942"},{"chainId":1,"address":"0xbbdce056cbe561ee004094c75099172e7e3b34df","name":"BeNative","symbol":"BNV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9552/thumb/246x0w.jpg?1568836957"},{"chainId":1,"address":"0x2858ed0225e9aa0638ccd9b552bee2712426fa24","name":"Crypto Global Bank","symbol":"CGB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8766/thumb/s8UlL0o.png?1560935402"},{"chainId":1,"address":"0x245392ee7ce736ec6a0908b67dc5d0a218230005","name":"Yap Stone","symbol":"YAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8760/thumb/yap.PNG?1573118457"},{"chainId":1,"address":"0x98ad9b32dd10f8d8486927d846d4df8baf39abe2","name":"VELO Token","symbol":"VLO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13366/thumb/velo_token_logo.png?1607918558"},{"chainId":1,"address":"0x865377367054516e17014ccded1e7d814edc9ce4","name":"Dola USD Stablecoin","symbol":"DOLA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14287/thumb/anchor-logo-1-200x200.png?1615275005"},{"chainId":1,"address":"0x40284109c3309a7c3439111bfd93bf5e0fbb706c","name":"MOTIV Protocol","symbol":"MOV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11869/thumb/jvftnBL-_400x400.jpg?1595498693"},{"chainId":1,"address":"0x18cc17a1eed37c02a77b0b96b7890c7730e2a2cf","name":"oneLINK","symbol":"ONELINK","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15102/thumb/logo_200_chainlink.png?1619731900"},{"chainId":1,"address":"0x5d21ef5f25a985380b65c8e943a0082feda0db84","name":"Ethereum Cash","symbol":"ECASH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1010/thumb/ethereumcash.png?1510040235"},{"chainId":1,"address":"0x048eb9b9c08e2df45644cf0db1fcb3e866c401ad","name":"Live Swap Coin","symbol":"LSC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15287/thumb/lsc.PNG?1620356318"},{"chainId":1,"address":"0x68909e586eeac8f47315e84b4c9788dd54ef65bb","name":"EvenCoin","symbol":"EVN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4634/thumb/evencoin.png?1548125647"},{"chainId":1,"address":"0x9f5f3cfd7a32700c93f971637407ff17b91c7342","name":"Scry info","symbol":"DDD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2569/thumb/Scry.info.jpg?1547036695"},{"chainId":1,"address":"0xf45091f25d374bbe956c0bb64bb85e02d07aa741","name":"MNMCoin","symbol":"MNMC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11163/thumb/MNMC.png?1589280919"},{"chainId":1,"address":"0x65fc94d99cb301c5630c485d312e6ff5edde13d0","name":"MVP","symbol":"MVP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13150/thumb/mvp_token_logo.png?1605688252"},{"chainId":1,"address":"0x190fb342aa6a15eb82903323ae78066ff8616746","name":"Umbrella Coin","symbol":"UMC","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/1700/thumb/umbrellacoin.jpg?1547035958"},{"chainId":1,"address":"0x4be10da47a07716af28ad199fbe020501bddd7af","name":"XT com Token","symbol":"XT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8391/thumb/XT_token.jpg?1557979399"},{"chainId":1,"address":"0x7869c4a1a3f6f8684fbcc422a21ad7abe3167834","name":"Pivot Token","symbol":"PVT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8977/thumb/j5ovdTKP_400x400.png?1563405624"},{"chainId":1,"address":"0x8b6cda5cc518c904e8844f445e1a7c7d2db0ff16","name":"SF Capital","symbol":"SFCP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6239/thumb/36952079_1621155091328297_7456989147790573568_n.jpg?1547042274"},{"chainId":1,"address":"0xa31108e5bab5494560db34c95492658af239357c","name":"Dacsee","symbol":"DACS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4834/thumb/dacsee-token-logo.png?1547040217"},{"chainId":1,"address":"0x947938339bf61c84669e303bc39c794d65a525d0","name":"FME","symbol":"FME","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12897/thumb/FME_token.png?1603336122"},{"chainId":1,"address":"0xbdcd5fafe4336a844233ebb0aff845d6b2100899","name":"Uze Tokens","symbol":"UZE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14299/thumb/uze-exchange-nobackground-200x200px.png?1615337168"},{"chainId":1,"address":"0x2a9bdcff37ab68b95a53435adfd8892e86084f93","name":"Alpha Quark Token","symbol":"AQT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12872/thumb/alpha_quark_logo.png?1605169527"},{"chainId":1,"address":"0xd5dc8921a5c58fb0eba6db6b40eab40283dc3c01","name":"Decentralized Data ","symbol":"DDAM","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/9943/thumb/ddam.PNG?1573638444"},{"chainId":1,"address":"0x01c8857057326b8f64dcb5cba6d802dcd132946e","name":"ShareAt","symbol":"XAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12902/thumb/shareat.PNG?1603346956"},{"chainId":1,"address":"0x4ba012f6e411a1be55b98e9e62c3a4ceb16ec88b","name":"Cybercoin","symbol":"CBR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11927/thumb/ezDztuH.png?1596179588"},{"chainId":1,"address":"0xeb7c20027172e5d143fb030d50f91cece2d1485d","name":"eBitcoin","symbol":"EBTC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/978/thumb/ebtc.png?1547034866"},{"chainId":1,"address":"0x81f09ed4b98b1c8e99b1fa838b72acb842afe94c","name":"3X Long PAX Gold To","symbol":"PAXGBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10435/thumb/683JEXMN_400x400.png?1579276663"},{"chainId":1,"address":"0x1ad606adde97c0c28bd6ac85554176bc55783c01","name":"Moonday Finance","symbol":"MOONDAY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12890/thumb/qJWRxsz.jpeg?1603327151"},{"chainId":1,"address":"0xe541504417670fb76b612b41b4392d967a1956c7","name":"Bitsonic Token","symbol":"BSC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9238/thumb/image.png?1604295837"},{"chainId":1,"address":"0x9b1e1fc958b83e801d1342f9f9ba7da3a55ba1ef","name":"Tronipay","symbol":"TRP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8152/thumb/tronipay-logo.jpg?1555571959"},{"chainId":1,"address":"0xf25c91c87e0b1fd9b4064af0f427157aab0193a7","name":"BASIC","symbol":"BASIC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11050/thumb/unTgJN6U_400x400.jpg?1587540882"},{"chainId":1,"address":"0x01ff50f8b7f74e4f00580d9596cd3d0d6d6e326f","name":"BnkToTheFuture","symbol":"BFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3468/thumb/bnktothefuture.png?1547351865"},{"chainId":1,"address":"0x4b6628c5396e0740630e3c597cc47f2185002e43","name":"Jemoo Community","symbol":"JMC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10010/thumb/jmc.PNG?1574757559"},{"chainId":1,"address":"0x5ef227f7ce4e96c9ce90e32d4850545a6c5d099b","name":"BLUECHIPS Token","symbol":"BCHIP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7119/thumb/xIh2PBdp_400x400.jpg?1547043616"},{"chainId":1,"address":"0x9275e8386a5bdda160c0e621e9a6067b8fd88ea2","name":"Nobunaga","symbol":"NBNG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16798/thumb/nbng.jpeg?1625056917"},{"chainId":1,"address":"0x355376d6471e09a4ffca8790f50da625630c5270","name":"Libartysharetoken","symbol":"LST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12990/thumb/lst_logo.png?1604148361"},{"chainId":1,"address":"0x7ace84ac394e41f1c01711ed134d9bbcfa770ce7","name":"Diagon","symbol":"DGN","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/12518/thumb/BR90HY-d_400x400.jpg?1600382926"},{"chainId":1,"address":"0x9d7630adf7ab0b0cb00af747db76864df0ec82e4","name":"GATENet","symbol":"GATE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16009/thumb/82168105.png?1622599261"},{"chainId":1,"address":"0x48cf0e2eca22eae0ad33fee16a5cb6e62207a8ab","name":"YTHO Online","symbol":"YTHO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13130/thumb/photo_2020-10-06_11-28-28_%282%29.jpg?1609205097"},{"chainId":1,"address":"0xbe393aa534f82c0ffac31bf06a23e283acb3352b","name":"TokenAsset","symbol":"NTB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13710/thumb/8284.png?1611097251"},{"chainId":1,"address":"0x172f20402afc807c8a5566bceed00831adb938ca","name":"Golder Coin","symbol":"GLDR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7455/thumb/46132863_341736356408664_5909841120593969152_n.png?1547542371"},{"chainId":1,"address":"0xe7fb3559358a99df54466d0350e4ad6dc7093da3","name":"Aicon","symbol":"AICO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12892/thumb/5920.png?1603333534"},{"chainId":1,"address":"0xada0a1202462085999652dc5310a7a9e2bf3ed42","name":"CoinShares Gold and","symbol":"CGI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14005/thumb/coinshares_gold.jpg?1613602163"},{"chainId":1,"address":"0xbd434a09191d401da3283a5545bb3515d033b8c4","name":"GoldFinX","symbol":"GIX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13292/thumb/nDyBmnHW_400x400.jpg?1607063929"},{"chainId":1,"address":"0x9556f8ee795d991ff371f547162d5efb2769425f","name":"DMme","symbol":"DMME","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9598/thumb/iyrIZf3N_400x400.png?1569383452"},{"chainId":1,"address":"0x31141dc226c214d40b1f77feb532741d8f893c6f","name":"Parallel network","symbol":"PNC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7395/thumb/Screenshot_2019-01-09_at_4.03.20_PM.png?1547044101"},{"chainId":1,"address":"0xc962ad021a69d457564e985738c719ae3f79b707","name":"IFX24","symbol":"IFX24","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10444/thumb/lpFSaoD.png?1579475634"},{"chainId":1,"address":"0x2ac22ebc138ff127566f68db600addad7df38d38","name":"Selenium","symbol":"SLC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11169/thumb/jbIJzuZw_400x400.jpg?1589449310"},{"chainId":1,"address":"0x4c133e081dfb5858e39cca74e69bf603d409e57a","name":"3X Long Bitcoin Cas","symbol":"BCHBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10306/thumb/683JEXMN_400x400.png?1577743740"},{"chainId":1,"address":"0x714b1fded61090a6c49eb0b4d088b8e5ebd64e61","name":"To The Moon","symbol":"TTM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11604/thumb/download_%2814%29.png?1591772757"},{"chainId":1,"address":"0x2c644c3bbea053ed95a6bc04a94c9ce928ff9881","name":"Lance Coin","symbol":"LCE","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/14707/thumb/logo200x200_%282%29.png?1617873370"},{"chainId":1,"address":"0x19131a8ae42e32c747c1ead318fadb98b0be45b7","name":"Quality Tracing Cha","symbol":"QTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10012/thumb/YRgC0w_r_400x400.jpg?1574759712"},{"chainId":1,"address":"0xec6a5d88bf56fd3f96957ae65916c69f29db35c5","name":"apeUSD AAVE Synthet","symbol":"APEUSD-AAVE-DEC21","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14399/thumb/apeusd.jpg?1615905232"},{"chainId":1,"address":"0x96d62cdcd1cc49cb6ee99c867cb8812bea86b9fa","name":"Yearn Finance Proto","symbol":"YFP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12363/thumb/yearn.jpg?1599309396"},{"chainId":1,"address":"0x92e52a1a235d9a103d970901066ce910aacefd37","name":"U CASH","symbol":"UCASH","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/2901/thumb/ucash.png?1547037074"},{"chainId":1,"address":"0x15c9dd08fb16331b9749a8d7d16bcd71c985f190","name":"CC","symbol":"CC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11593/thumb/CC_logo_200.png?1591599112"},{"chainId":1,"address":"0xc89b4a8a121dd3e726fe7515e703936cf83e3350","name":"Kper Network","symbol":"KPER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12984/thumb/kper.png?1604066205"},{"chainId":1,"address":"0xf3110b27f481f9ac3c1ba3c54de542accb2d913c","name":"R64X","symbol":"R64X","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15047/thumb/r64x.png?1619536164"},{"chainId":1,"address":"0x094f00cb5e31ab6164e3cacb654e8d6c2b3b471c","name":"ProSwap","symbol":"PROS","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/15203/thumb/logo-icon_200x200-02.jpg?1622174709"},{"chainId":1,"address":"0x41a08648c3766f9f9d85598ff102a08f4ef84f84","name":"Aave Balancer Pool ","symbol":"ABPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16788/thumb/ABPT_2x.png?1625046056"},{"chainId":1,"address":"0xa29ae272bc89e5f315b2793925f700045f845d82","name":"RealT Token 581 5","symbol":"REALTOKEN-S-581-587","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16637/thumb/571-jefferson-corner-1.1.jpg?1624557964"},{"chainId":1,"address":"0x82a77710495a35549d2add797412b4a4497d33ef","name":"Dogz","symbol":"DOGZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7544/thumb/dogz.png?1604655282"},{"chainId":1,"address":"0x7220e92d418e2eb59d0c25d195fa004bfd3afc42","name":"Ad Flex Token","symbol":"ADF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5620/thumb/ad-flex-token.png?1547041485"},{"chainId":1,"address":"0x8d2bffcbb19ff14a698c424fbcdcfd17aab9b905","name":"Unicly CryptoPunks ","symbol":"UPUNK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14905/thumb/cryptopunk7804.png?1618978888"},{"chainId":1,"address":"0xff19138b039d938db46bdda0067dc4ba132ec71c","name":"Snetwork","symbol":"SNET","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5382/thumb/snetwork.png?1548609904"},{"chainId":1,"address":"0x5872e64c3f93363822d2b1e4717be3398fdcea51","name":"Unicly Hashmasks Co","symbol":"UMASK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14902/thumb/uMask.png?1618936855"},{"chainId":1,"address":"0x175cbd54d38f58b530785e01471a2ec0d4596eb5","name":"RealT Token 15770","symbol":"REALTOKEN-S-15770-P","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16636/thumb/15770-Prest-hero-1.jpeg?1624557487"},{"chainId":1,"address":"0x2dfac6327dce9f88e31ff46de13049eca5a7dfcb","name":"Shiberus Inu","symbol":"SHIBERUS","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16338/thumb/Shiberus.png?1623752966"},{"chainId":1,"address":"0xa340f0937a8c00db11c83cc16cec12310160f0b6","name":"3X Short Ethereum C","symbol":"ETCBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10328/thumb/683JEXMN_400x400_%281%29.png?1578051480"},{"chainId":1,"address":"0xd0c59798f986d333554688cd667033d469c2398e","name":"Ymen Finance","symbol":"YMEN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12452/thumb/logoymen.png?1603008881"},{"chainId":1,"address":"0x24700a297960e8477ce3ca6c58b70a7af3410398","name":"Oasis City","symbol":"OSC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7038/thumb/wJepb5N.png?1550038108"},{"chainId":1,"address":"0xc18e7a03f8986798323658dd8645f93aa79ac5c9","name":"American Akita","symbol":"USKITA","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15433/thumb/1620756969-img-20210511-075113-925.png?1620798546"},{"chainId":1,"address":"0xeed736b2b809550d89a941c2005de93588c628e2","name":"ETHPlus","symbol":"ETHP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11768/thumb/ethplus.png?1593664706"},{"chainId":1,"address":"0x5c89736e9454200141b80c37eb28eaceca2ce8cb","name":"Cherry Token","symbol":"YT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8321/thumb/cherry.png?1557480352"},{"chainId":1,"address":"0x50d2de5397d7c657c3d424634a2ddf4e0d73d789","name":"Bliss","symbol":"BLISS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13762/thumb/eD2mpsGhthNTkzYlFjNACI_Oy8IwC9kh7TISfep2ZcaRYoNiVFOwiUprqlrzwVTHRddCUULAEQGyPPjaTqG2ZLCPvCX5ycQF3TMrffadkJGDKe_wQ0N8QT2MO4xXMJ4c6PJgi2MG0WySER24ZbvahGPjtxBBPIb3fS21Seydik57qQyJMYB73il_L636mqaIT1gc9h75K5uT8UK.jpg?1611695377"},{"chainId":1,"address":"0xcfe4f03c3afbb9857b29fc706180bf0044900d59","name":"Golden Ratio Coin","symbol":"GOLDR","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10363/thumb/original_GRO-768x768.png?1578612119"},{"chainId":1,"address":"0x64d91f12ece7362f91a6f8e7940cd55f05060b92","name":"ASH","symbol":"ASH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15714/thumb/omnPqaTY.png?1622820503"},{"chainId":1,"address":"0xcfd069247bd5f01a17f1ca76424c9e424256908d","name":"EthereumSC","symbol":"ETHSC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12167/thumb/avatar01.jpg?1597787790"},{"chainId":1,"address":"0x358aa737e033f34df7c54306960a38d09aabd523","name":"Ares Protocol","symbol":"ARES","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15153/thumb/Ares-logo.png?1620638611"},{"chainId":1,"address":"0x5c743a35e903f6c584514ec617acee0611cf44f3","name":"Experty","symbol":"EXY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1788/thumb/exy.png?1547036088"},{"chainId":1,"address":"0x361887c1d1b73557018c47c8001711168128cf69","name":"Firdaos","symbol":"FDO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13571/thumb/firdous.png?1609845693"},{"chainId":1,"address":"0x6f442da588232dc57bf0096e8de48d6961d5cc83","name":"RealT Token 13895","symbol":"REALTOKEN-S-13895-S","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16599/thumb/13895-Saratoga-hero-1.jpeg?1624541955"},{"chainId":1,"address":"0x4c10bd19688b906665fbd53415f279f34b44ece7","name":"YUI Finance","symbol":"YUI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13153/thumb/YUI.png?1605751023"},{"chainId":1,"address":"0xe8b251822d003a2b2466ee0e38391c2db2048739","name":"rbase finance","symbol":"RBASE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13343/thumb/rbase_logo.jpg?1607619337"},{"chainId":1,"address":"0x6399c842dd2be3de30bf99bc7d1bbf6fa3650e70","name":"Premia","symbol":"PREMIA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13962/thumb/apple-touch-icon.png?1623679482"},{"chainId":1,"address":"0x889bc62e94bb6902d022bb82b38f7fcd637df28c","name":"1X Short OKB Token","symbol":"OKBHEDGE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12057/thumb/683JEXMN_400x400.png?1596704656"},{"chainId":1,"address":"0x41a03e41ef555392c9f0ad60f4f61e263078bf10","name":"Upper Dollar","symbol":"USDU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12332/thumb/UPPER-moeda-dollar.png?1599114824"},{"chainId":1,"address":"0x6a6c2ada3ce053561c2fbc3ee211f23d9b8c520a","name":"TONToken","symbol":"TON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12334/thumb/ton.jpg?1599128436"},{"chainId":1,"address":"0xcaeaf8381d4b20b43afa42061d6f80319a8881f6","name":"R34P","symbol":"R34P","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13393/thumb/r34p_logo.png?1608100330"},{"chainId":1,"address":"0x350a6a30c79df3600c4e0e67deab0a64b645e2c2","name":"StrongHold","symbol":"STRNG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13540/thumb/strng.png?1609599778"},{"chainId":1,"address":"0x81824663353a9d29b01b2de9dd9a2bb271d298cd","name":"Bitcoin Volatility ","symbol":"BVOL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11056/thumb/download_%2810%29.png?1587641855"},{"chainId":1,"address":"0x3f5be50e4651ee184109a0b1b71d344d12e8b603","name":"RFYield Finance","symbol":"RFY","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13591/thumb/3QVx5Fp.png?1609983766"},{"chainId":1,"address":"0x3d0293f06daf4311b482564330d57c8db6c10893","name":"Y Coin","symbol":"YCO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/14128/thumb/BIG-POTAT-200x200-removebg-preview.png?1614576159"},{"chainId":1,"address":"0xe5bf6790d138b154f1df3db8d245be46a5d05ee4","name":"Lyfe Land","symbol":"LLAND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14940/thumb/LLAND-Logo-200.png?1619083033"},{"chainId":1,"address":"0x3b3801f0fc76528e42390df701f513fc62cbf154","name":"MONEY CASH MINER","symbol":"MCM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8544/thumb/01.jpg?1559179506"},{"chainId":1,"address":"0x86642d169db9f57a02c65052049cbbbfb3e3b08c","name":"dRAY","symbol":"DRAY","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/12421/thumb/draylogo_200x200.png?1599727930"},{"chainId":1,"address":"0xaaa7a10a8ee237ea61e8ac46c50a8db8bcc1baaa","name":"QANplatform","symbol":"QANX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15977/thumb/yqr55mM.png?1622527095"},{"chainId":1,"address":"0xe0e05c43c097b0982db6c9d626c4eb9e95c3b9ce","name":"Unslashed Finance","symbol":"USF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14177/thumb/Unslashed.jpeg?1614793365"},{"chainId":1,"address":"0xa31b1767e09f842ecfd4bc471fe44f830e3891aa","name":"Roobee","symbol":"ROOBEE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8791/thumb/Group_11.png?1580344629"},{"chainId":1,"address":"0x763f8b4fb067190e739ed6acb12f40f2f3890840","name":"Digex","symbol":"DIGEX","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/12891/thumb/Digex_token.png?1603332770"},{"chainId":1,"address":"0xa1faa113cbe53436df28ff0aee54275c13b40975","name":"Alpha Finance","symbol":"ALPHA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12738/thumb/AlphaToken_256x256.png?1617160876"},{"chainId":1,"address":"0x223fb5c14c00cfb70cf56bb63c2eef2d74fe1a78","name":"3X Short Dragon Ind","symbol":"DRGNBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10256/thumb/683JEXMN_400x400_%281%29.png?1576677145"},{"chainId":1,"address":"0xdb13fb60d3fddabc41743d9d603ce3f42c17d057","name":"Baby Token","symbol":"BABY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13294/thumb/logo_%2828%29.png?1607067692"},{"chainId":1,"address":"0xdac4ae188ace3c8985765edc6c9b4739d4845ddc","name":"InterValue","symbol":"INVE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4756/thumb/intervalue-logo.png?1547040078"},{"chainId":1,"address":"0xe50006781f435ae43096288334afd9ae5ba50065","name":"Corgi Inu","symbol":"CORGI","decimals":10,"logoURI":"https://assets.coingecko.com/coins/images/15646/thumb/mWum355Y_400x400.jpg?1621422930"},{"chainId":1,"address":"0xd8a8843b0a5aba6b030e92b3f4d669fad8a5be50","name":"AfroDex Labs Token","symbol":"AFDLT","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/9908/thumb/GOLDEN_TOKEN_4.png?1575868746"},{"chainId":1,"address":"0xc14830e53aa344e8c14603a91229a0b925b0b262","name":"Populous XBRL Token","symbol":"PXT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6207/thumb/populous.jpg?1564992440"},{"chainId":1,"address":"0x239119c43e3cac84c8a2d45bcba0e46f528e5f77","name":"Dripper","symbol":"DRIP","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13468/thumb/drip-stretch-200.png?1608796810"},{"chainId":1,"address":"0x7e95b310724334ff74537dc08bfd3377d25e65ce","name":"RealT Token 15039","symbol":"REALTOKEN-S-15039-W","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16632/thumb/15039-Ward-hero-1.jpeg?1624554456"},{"chainId":1,"address":"0x542156d51d10db5accb99f9db7e7c91b74e80a2c","name":"ETH LINK Price Acti","symbol":"LINKETHPA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10924/thumb/ethlink_price_action_candlestick_set.png?1585893962"},{"chainId":1,"address":"0x2ccbff3a042c68716ed2a2cb0c544a9f1d1935e1","name":"DMarket","symbol":"DMT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1602/thumb/dmarket.png?1547223830"},{"chainId":1,"address":"0x0a9d68886a0d7db83a30ec00d62512483e5ad437","name":"Treecle","symbol":"TRCL","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/11670/thumb/Mj4nZSD9_400x400.jpg?1592532649"},{"chainId":1,"address":"0xac8ea871e2d5f4be618905f36f73c760f8cfdc8e","name":"BTC Network Demand ","symbol":"BYTE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10929/thumb/bytetree_set_1.png?1585894918"},{"chainId":1,"address":"0xea004e8fa3701b8e58e41b78d50996e0f7176cbd","name":"yffc finance","symbol":"YFFC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12439/thumb/yffc.png?1599868672"},{"chainId":1,"address":"0xb4a677b0e363c3815d46326954a4e4d2b1ace357","name":"THENODE","symbol":"THE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10292/thumb/thenode_logo.png?1577334103"},{"chainId":1,"address":"0x5caf454ba92e6f2c929df14667ee360ed9fd5b26","name":"Dev Protocol","symbol":"DEV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11560/thumb/Dev_Protocol__CoinGecko_Logo___Jan.18.2021_.png?1611021474"},{"chainId":1,"address":"0x64cdf819d3e75ac8ec217b3496d7ce167be42e80","name":"InsurePal","symbol":"IPL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1858/thumb/ipl.png?1547036172"},{"chainId":1,"address":"0x86225481747c774b24c7c3bac4c1b7382f787c7f","name":"WIIX Coin","symbol":"WXC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10386/thumb/a2a4Vr1__400x400.jpg?1578783194"},{"chainId":1,"address":"0xde522a2778e4554707e6a8df36a4871ce9967bb5","name":"FormulA","symbol":"FML","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6878/thumb/formula_token.png?1547043223"},{"chainId":1,"address":"0x9f31fab2405dfba05a487ebce88f3abd26f1cba6","name":"Agricultural Trade ","symbol":"AAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10261/thumb/logo_%2836%29.png?1576796028"},{"chainId":1,"address":"0x74faab6986560fd1140508e4266d8a7b87274ffd","name":"HyperDAO","symbol":"HDAO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10780/thumb/B7-ppPfE_400x400.png?1583467291"},{"chainId":1,"address":"0x20945ca1df56d237fd40036d47e866c7dccd2114","name":"Nsure Network","symbol":"NSURE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12948/thumb/Nsure_token.png?1603778876"},{"chainId":1,"address":"0x5d45aa01b73c971c65f3df409c9b3627b8fe2726","name":"Timecoin Protocol","symbol":"TMCN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13175/thumb/TimeCoin.png?1605877705"},{"chainId":1,"address":"0xd3c00772b24d997a812249ca637a921e81357701","name":"Wild Crypto","symbol":"WILD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/992/thumb/wild-crypto.png?1548760618"},{"chainId":1,"address":"0x36232b1328e49a043434e71c02c0dc2be278e975","name":"Xaviera Tech","symbol":"XTS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8074/thumb/qebuQymn_400x400.jpg?1554191840"},{"chainId":1,"address":"0xaff4abdc75f07387401ba9bc0f75ebe4c734b4c9","name":"TheTimesChainCoin","symbol":"TTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9528/thumb/lD-E4KiHMPVbPJGUHBaOQlqOFE7NS0lwUmEyzGqNF5TPAOkizfiSOX7NOTjD4OJnGSYJIIJ7d1CmWS-AigN8Lxz6N3IC-wou1lESlbbu2krKaWlLdSyWrp8SUeji7HtOBM0uoEzNJWCyYgGYuk7pCq3KXZ5ppiH0ZjUVZcZAjJLax3S25_Qlh1RX21LiuWMttjqkD9irV8QQzSzib.jpg?1568613440"},{"chainId":1,"address":"0xa8c8cfb141a3bb59fea1e2ea6b79b5ecbcd7b6ca","name":"Syntropy","symbol":"NOIA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3269/thumb/Component_1.png?1608275724"},{"chainId":1,"address":"0xca76baa777d749de63ca044853d22d56bc70bb47","name":"Fiscus FYI","symbol":"FFYI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12663/thumb/FFYI.png?1601450423"},{"chainId":1,"address":"0x40395044ac3c0c57051906da938b54bd6557f212","name":"MobileGo","symbol":"MGO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/768/thumb/mobilego.png?1548085237"},{"chainId":1,"address":"0xf058501585023d040ea9493134ed72c083553eed","name":"Dymmax","symbol":"DMX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13476/thumb/dmmx.png?1608934713"},{"chainId":1,"address":"0xdf347911910b6c9a4286ba8e2ee5ea4a39eb2134","name":"Bob s Repair","symbol":"BOB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3550/thumb/PNG_BOB_Token_Large.png?1547038375"},{"chainId":1,"address":"0xe5ce63ac9a08c1eb160889151cd84855f16c94d2","name":"RealT Token 10616","symbol":"REALTOKEN-S-10616-M","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16685/thumb/Mkinney-hero.jpeg?1624634131"},{"chainId":1,"address":"0x37e8789bb9996cac9156cd5f5fd32599e6b91289","name":"AidCoin","symbol":"AID","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2144/thumb/aid.png?1547036449"},{"chainId":1,"address":"0x3c56d5e887d8fa7ae1ba65bf7eccc25ec09eaf18","name":"RealT Token 9165 ","symbol":"REALTOKEN-S-9165-KE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16687/thumb/9165-Kensington-hero-1.jpeg?1624634948"},{"chainId":1,"address":"0x2925c2a312a4934fd695fab72b1e425cc41978f2","name":"Precharge","symbol":"PCPI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7526/thumb/30741876_10155423455681220_6256622449429839872_n.jpg?1548224693"},{"chainId":1,"address":"0xbd4a858139b155219e2c8d10135003fdef720b6b","name":"Saren","symbol":"SAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14779/thumb/68887475.png?1618386459"},{"chainId":1,"address":"0xb72c794effb775197287d767ca80c22ae9094cb5","name":"Shrine Cloud Storag","symbol":"SCDS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9858/thumb/1571122840.png?1572836207"},{"chainId":1,"address":"0xe49214e4c92dc9bcb3b56c1309afe0d626dd730e","name":"SynchroLife","symbol":"SYC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1469/thumb/ud643DVg.png?1621828021"},{"chainId":1,"address":"0x002f0b1a71c5730cf2f4da1970a889207bdb6d0d","name":"YD BTC MAR21","symbol":"YD-BTC-MAR21","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13482/thumb/uma_logo.jpg?1608999110"},{"chainId":1,"address":"0xa462d0e6bb788c7807b1b1c96992ce1f7069e195","name":"Equus Mining Token","symbol":"EQMT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12114/thumb/RYy8zR9jCnDE5Wqnnh-06q2UBuEq2NhsAaoeZhGLCy3q2zDcOOTTnaB8Tadw9-CO8IUQ34HwIPPFf4wG-7saZk1awoHQIaH9ZdHyKKeQth0GDewgEGbtgpNDxV2fxMbJB8CFpGljfF6LiLadmJsMmT0Gm0sZqzygRtxOAyTCMu5pVopFo5tz4I1R1NA-HDyjCBkXnxR6ovo0dbH.jpg?1597275175"},{"chainId":1,"address":"0x6a532b08c654a1a86069b74c560d8fa0ff842218","name":"Pikto Group","symbol":"PKP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13105/thumb/a-11-e1604828151917-1024x799.png?1605235252"},{"chainId":1,"address":"0xaaf37055188feee4869de63464937e683d61b2a1","name":"UChain","symbol":"UCN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4254/thumb/UChain-logo.jpg?1547039592"},{"chainId":1,"address":"0xca208bfd69ae6d2667f1fcbe681bae12767c0078","name":"HOMIHELP","symbol":"HOMI","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/11080/thumb/Homihelp.png?1589626747"},{"chainId":1,"address":"0x4c14114c107d6374ec31981f5f6cc27a13e22f9a","name":"SBank","symbol":"STS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10279/thumb/74302797_109806420469006_618028571075543040_o.png?1576971737"},{"chainId":1,"address":"0x59ad6061a0be82155e7acce9f0c37bf59f9c1e3c","name":"Liquid Lottery RTC","symbol":"LIQLO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13104/thumb/liqlo_logo.png?1605234382"},{"chainId":1,"address":"0x806690b7a093d2cf6419a515abedb7f28595bc5e","name":"RealT Token 9169 ","symbol":"REALTOKEN-S-9169-BO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16691/thumb/Boleyn-hero.jpeg?1624637832"},{"chainId":1,"address":"0x87f5f9ebe40786d49d35e1b5997b07ccaa8adbff","name":"Rebased","symbol":"REB2","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/12153/thumb/reb.png?1608516711"},{"chainId":1,"address":"0xc0ec8caec55f37d47fbfa595727418868a21fd48","name":"EcoG9coin","symbol":"EGC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8038/thumb/Screenshot_2019-12-05_at_7.14.34_AM.png?1575501284"},{"chainId":1,"address":"0xaf5f584d79701d5bdc9ca045e66ae130b67a68ad","name":"CryBet","symbol":"CBT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10973/thumb/d4zbv0h.jpg?1586743861"},{"chainId":1,"address":"0x7e291890b01e5181f7ecc98d79ffbe12ad23df9e","name":"Unifty","symbol":"NIF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13726/thumb/NIF.png?1612320636"},{"chainId":1,"address":"0x9a96e767bfcce8e80370be00821ed5ba283d4a17","name":"GOGO Finance","symbol":"GOGO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13857/thumb/gogofinance.png?1612404853"},{"chainId":1,"address":"0xc8645f0d6a622e2a9a66c1db9d33b1a46b4462dc","name":"Mykonos Coin","symbol":"MYK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13974/thumb/Untitled-design-10-removebg-preview.png?1613427313"},{"chainId":1,"address":"0x31b595e7cfdb624d10a3e7a562ed98c3567e3865","name":"StakedZEN","symbol":"STZEN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/14506/thumb/stZEN-200px.png?1616573926"},{"chainId":1,"address":"0x60ca261e14f26e8daae8b1a7f8e783d64859126c","name":"STONKS","symbol":"STONK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13111/thumb/stonk_logo.png?1605278755"},{"chainId":1,"address":"0x2fd61567c29e7adb4ca17e60e1f4a3fcfe68acb8","name":"SymVerse","symbol":"SYM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9449/thumb/Picture1.png?1567551375"},{"chainId":1,"address":"0x4688a8b1f292fdab17e9a90c8bc379dc1dbd8713","name":"Cover Protocol","symbol":"COVER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13563/thumb/1_eWBbDaqpxXqt7WYPSP4qSw.jpeg?1609822578"},{"chainId":1,"address":"0x14dffd4f515d4c43493c6c512c78fbc59a8af254","name":"Anti Fraud Chain","symbol":"AFC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9448/thumb/logo-white.png?1567550853"},{"chainId":1,"address":"0x35e78b3982e87ecfd5b3f3265b601c046cdbe232","name":"SideShift Token","symbol":"XAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15719/thumb/sideshift-icon_3x.png?1621595183"},{"chainId":1,"address":"0xf8d1254fc324d2e75a5a37f5bd4ca34a20ef460d","name":"Advertisingcoin","symbol":"ADVC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8663/thumb/mB6sbPrt_400x400.png?1560158327"},{"chainId":1,"address":"0x2c974b2d0ba1716e644c1fc59982a89ddd2ff724","name":"Viberate","symbol":"VIB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/983/thumb/Viberate.png?1547034873"},{"chainId":1,"address":"0x614fd8f06ce4d93aa2361b342c86554eb5cb39f1","name":"Tianya Token","symbol":"TYT","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/7568/thumb/images_%283%29.png?1548411643"},{"chainId":1,"address":"0x3f344c88d823f180fb8b44a3c7cfc4edc92dfa35","name":"Definex","symbol":"DSWAP","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/13593/thumb/cjZjhY3w_400x400.png?1609998112"},{"chainId":1,"address":"0x8e5610ab5e39d26828167640ea29823fe1dd5843","name":"KanadeCoin","symbol":"KNDC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5245/thumb/kanadecoin.png?1547975028"},{"chainId":1,"address":"0x41875c2332b0877cdfaa699b641402b7d4642c32","name":"FUTURAX","symbol":"FTXT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5796/thumb/futurax.png?1547484031"},{"chainId":1,"address":"0x0ccd5dd52dee42b171a623478e5261c1eaae092a","name":"DeFi on MCW","symbol":"DFM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13831/thumb/logo_200x200_%281%29.png?1612168790"},{"chainId":1,"address":"0xe59064a8185ed1fca1d17999621efedfab4425c9","name":"PrimeDAO","symbol":"PRIME","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13165/thumb/PrimeDAO_200x200.png?1605800174"},{"chainId":1,"address":"0x59d4ccc94a9c4c3d3b4ba2aa343a9bdf95145dd1","name":"QUSD Stablecoin","symbol":"QUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13176/thumb/qusd_logo.png?1605922605"},{"chainId":1,"address":"0xefbd6d7def37ffae990503ecdb1291b2f7e38788","name":"EVO","symbol":"EVO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1854/thumb/evo.png?1547036169"},{"chainId":1,"address":"0xd7f5cabdf696d7d1bf384d7688926a4bdb092c67","name":"DRC Mobility","symbol":"DRC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13457/thumb/drc_symbol.png?1608759323"},{"chainId":1,"address":"0x4e12eb8e506ccd1427f6b8f7faa3e88fb698eb28","name":"Jack Token","symbol":"JACK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10991/thumb/Jacktoken200x200.png?1586938972"},{"chainId":1,"address":"0xc4de189abf94c57f396bd4c52ab13b954febefd8","name":"B20","symbol":"B20","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13803/thumb/b20.png?1611996305"},{"chainId":1,"address":"0x00059ae69c1622a7542edc15e8d17b060fe307b6","name":"AmonD","symbol":"AMON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8952/thumb/AmonD_512x512.png?1563227436"},{"chainId":1,"address":"0x5adc961d6ac3f7062d2ea45fefb8d8167d44b190","name":"Dether","symbol":"DTH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2231/thumb/dether.png?1547036510"},{"chainId":1,"address":"0x006699d34aa3013605d468d2755a2fe59a16b12b","name":"Zild Finance","symbol":"ZILD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15711/thumb/71716773.jpg?1621585408"},{"chainId":1,"address":"0xf05a9382a4c3f29e2784502754293d88b835109c","name":"Imbrex","symbol":"REX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/885/thumb/Imbrex_Token.jpg?1547034710"},{"chainId":1,"address":"0xf03045a4c8077e38f3b8e2ed33b8aee69edf869f","name":"BlockMesh","symbol":"BMH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4093/thumb/blockmeshlogo.png?1547039268"},{"chainId":1,"address":"0x02fdd6866333d8cd8b1ca022d382080698060bc2","name":"6ix9ine Chain","symbol":"69C","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11260/thumb/6ix9ineChain.png?1589789641"},{"chainId":1,"address":"0xdecf7be29f8832e9c2ddf0388c9778b8ba76af43","name":"BonusCloud","symbol":"BXC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7411/thumb/ZezE6AH6_400x400.jpg?1547112132"},{"chainId":1,"address":"0x9d3e0892d11f19f5181d4a4c5d04187a9e0d7032","name":"Dragonbit","symbol":"DRGB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10123/thumb/drgb.PNG?1576125394"},{"chainId":1,"address":"0x31e92324ef7185c65dd4d154cfa4f6326b489c55","name":"Earn Network","symbol":"EARN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/14727/thumb/3kpCo1Iw_400x400.png?1617951596"},{"chainId":1,"address":"0xe09b10efa59f6e17052e9a2d947bad6214e7cc90","name":"Lift Kitchen ETH","symbol":"LFETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16195/thumb/lfETH-logo.ae4a1d04.png?1623278460"},{"chainId":1,"address":"0x842c2b97772b4528589ed243f6bda3381ef0261f","name":"DGL Coin","symbol":"DGL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14015/thumb/dgllogo.png?1613698745"},{"chainId":1,"address":"0x917fd2f7378ff479419dcb56c5cbb445fbbf902a","name":"Coinwaycoin","symbol":"CAN","decimals":10,"logoURI":"https://assets.coingecko.com/coins/images/12671/thumb/Coingeco.png?1601505278"},{"chainId":1,"address":"0xd6940a1ffd9f3b025d1f1055abcfd9f7cda81ef9","name":"YouForia","symbol":"YFR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11132/thumb/6Won2ZF.png?1588903985"},{"chainId":1,"address":"0x9588fc24a9796fbd870951a2cd54c6f1f24b2e7c","name":"Kronn","symbol":"KREX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7363/thumb/Kronn.jpg?1547044048"},{"chainId":1,"address":"0x9e7ce36dbd1a9a6c6e80d08e38077745855edd3a","name":"Bimcoin","symbol":"BIM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10371/thumb/roundlogo.png?1578674498"},{"chainId":1,"address":"0x1c79ab32c66acaa1e9e81952b8aaa581b43e54e7","name":"TEAM","symbol":"TEAM","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/2665/thumb/team.png?1516812418"},{"chainId":1,"address":"0x0cd6c8161f1638485a1a2f5bf1a0127e45913c2f","name":"3X Short Tether Tok","symbol":"USDTBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10307/thumb/683JEXMN_400x400.png?1577743905"},{"chainId":1,"address":"0x5046e860ff274fb8c66106b0ffb8155849fb0787","name":"JavaScript Token","symbol":"JS","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1061/thumb/js.png?1511578998"},{"chainId":1,"address":"0x9be89d2a4cd102d8fecc6bf9da793be995c22541","name":"Binance Wrapped BTC","symbol":"BBTC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/14867/thumb/binance-btc_32.png?1618814666"},{"chainId":1,"address":"0x8f1135ea4f8946949441716d66e5390c5a990df0","name":"MesChain","symbol":"MES","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9719/thumb/TtPovcoX_400x400.jpg?1571263455"},{"chainId":1,"address":"0x3d1ba9be9f66b8ee101911bc36d3fb562eac2244","name":"Rivetz","symbol":"RVT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/957/thumb/rivetz.png?1547034826"},{"chainId":1,"address":"0xbb1fa4fdeb3459733bf67ebc6f893003fa976a82","name":"Pangea Arbitration ","symbol":"XPAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2070/thumb/Pangea-Arbitration-Token-Logo.png?1547036374"},{"chainId":1,"address":"0x1287c0509df9a475ef178471ab2132b9dfd312b3","name":"LADZ","symbol":"LADZ","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/13315/thumb/ladz_logo.jpg?1607408640"},{"chainId":1,"address":"0x50bc2ecc0bfdf5666640048038c1aba7b7525683","name":"carVertical","symbol":"CV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2098/thumb/carvertical.png?1547738903"},{"chainId":1,"address":"0x62786eeacc9246b4018e0146cb7a3efeacd9459d","name":"Less Network","symbol":"LESS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15936/thumb/Less.png?1622448675"},{"chainId":1,"address":"0x55648de19836338549130b1af587f16bea46f66b","name":"Pebbles","symbol":"PBL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1224/thumb/publica.png?1548607428"},{"chainId":1,"address":"0xd49efa7bc0d339d74f487959c573d518ba3f8437","name":"Shield Finance","symbol":"SHLD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15813/thumb/3FYKlPka_400x400.png?1621980007"},{"chainId":1,"address":"0x2904b9b16652d7d0408eccfa23a19d4a3358230f","name":"Puriever","symbol":"PURE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12600/thumb/200x200_pure_logo.png?1600999358"},{"chainId":1,"address":"0x95d82ba91256db995c80bed690d0a779191af62b","name":"AlrightCoin","symbol":"ALC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11611/thumb/34B2E0C6-DDCB-4F48-B6BE-A2D9FB8734A3.png?1591842917"},{"chainId":1,"address":"0x7671904eed7f10808b664fc30bb8693fd7237abf","name":"Bitberry Token","symbol":"BBR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13673/thumb/1_AdMyBccrRv0e6rhW7UKJSw.png?1610681228"},{"chainId":1,"address":"0x932d447274dcffb4aea4f0944d3c804e88056416","name":"Lemon Bet","symbol":"LBET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11374/thumb/lbet.png?1590037291"},{"chainId":1,"address":"0x7d36cce46dd2b0d28dde12a859c2ace4a21e3678","name":"Combine finance","symbol":"COMB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12592/thumb/combine_finance_logo.jpg?1602417055"},{"chainId":1,"address":"0xac2385e183d9301dd5e2bb08da932cbf9800dc9c","name":"Netkoin Liquid","symbol":"LIQUID","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7910/thumb/netkoin-liquid-logo-600x400.png?1551755315"},{"chainId":1,"address":"0x0766e79a6fd74469733e8330b3b461c0320ff059","name":"ExchangeN","symbol":"EXN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1016/thumb/exchangen.png?1547034929"},{"chainId":1,"address":"0x5067006f830224960fb419d7f25a3a53e9919bb0","name":"SmartPad","symbol":"PAD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16587/thumb/smartpad.PNG?1624518548"},{"chainId":1,"address":"0x94d8db14831c2c08943798542c450df2844913e5","name":"Zuplo","symbol":"ZLP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13066/thumb/logo2x56_Mesa_de_trabajo_1.png?1604886987"},{"chainId":1,"address":"0x255aa6df07540cb5d3d297f0d0d4d84cb52bc8e6","name":"Raiden Network Toke","symbol":"RDN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1132/thumb/raiden-logo.jpg?1547035131"},{"chainId":1,"address":"0x44086035439e676c02d411880fccb9837ce37c57","name":"unified Stable Doll","symbol":"USD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12259/thumb/Uniswap_State_Dollar.png?1598550804"},{"chainId":1,"address":"0x4ba6ddd7b89ed838fed25d208d4f644106e34279","name":"Vether","symbol":"VETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11375/thumb/vether-symbol-coingecko.png?1622341592"},{"chainId":1,"address":"0xf83301c5cd1ccbb86f466a6b3c53316ed2f8465a","name":"COMSA","symbol":"CMS","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/2500/thumb/comsa-_xem_.png?1547036614"},{"chainId":1,"address":"0xf8483e2d6560585c02d46bf7b3186bf154a96166","name":"IdeaChain","symbol":"ICH","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11053/thumb/4fJlFzca_400x400.jpg?1587609361"},{"chainId":1,"address":"0xf70a642bd387f94380ffb90451c2c81d4eb82cbc","name":"Starbase","symbol":"STAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1449/thumb/starbase.png?1548610771"},{"chainId":1,"address":"0x56a86d648c435dc707c8405b78e2ae8eb4e60ba4","name":"StackOS","symbol":"STACK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14989/thumb/stackos_logo.png?1619280732"},{"chainId":1,"address":"0x26db5439f651caf491a87d48799da81f191bdb6b","name":"CBC network","symbol":"CBC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/2477/thumb/CBC.network_logo_200x200.png?1623677507"},{"chainId":1,"address":"0x04a020325024f130988782bd5276e53595e8d16e","name":"Herbalist Token","symbol":"HERB","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6892/thumb/herbalist-token-twitter.png?1547043247"},{"chainId":1,"address":"0x79c5a1ae586322a07bfb60be36e1b31ce8c84a1e","name":"Freight Trust Netwo","symbol":"EDI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11074/thumb/e6YLf6kD_400x400.jpg?1587970897"},{"chainId":1,"address":"0x734c90044a0ba31b3f2e640c10dc5d3540499bfd","name":"TradeStars","symbol":"TSX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15229/thumb/WsO9siKG_400x400.png?1620167669"},{"chainId":1,"address":"0x5fd1ffa1d817e2bc1e594081a9f883a8707e959c","name":"CMGCoin","symbol":"CMG","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11158/thumb/CMGCOIN-200x200-1.png?1589246034"},{"chainId":1,"address":"0xfe17c3c0b6f38cf3bd8ba872bee7a18ab16b43fb","name":"RealT Token 15777","symbol":"REALTOKEN-S-15777-A","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16542/thumb/15777-Ardmore-hero-2.jpg?1624371814"},{"chainId":1,"address":"0x539f3615c1dbafa0d008d87504667458acbd16fa","name":"Fera","symbol":"FERA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12143/thumb/IMG_20200908_085545_557.jpg?1599563732"},{"chainId":1,"address":"0x16b1eb8b8e9058800bf0ba3684f805a6711a1d2c","name":"Reflector Finance","symbol":"RFCTR","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13402/thumb/aRFCTR_PROFILE_LOGO.png?1612494768"},{"chainId":1,"address":"0x27702a26126e0b3702af63ee09ac4d1a084ef628","name":"Aleph im","symbol":"ALEPH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11676/thumb/Monochram-aleph.png?1608483725"},{"chainId":1,"address":"0x03ab458634910aad20ef5f1c8ee96f1d6ac54919","name":"Rai Reflex Index","symbol":"RAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14004/thumb/RAI-logo-coin.png?1613592334"},{"chainId":1,"address":"0x1caa202df9240d7b464d9486a6f1542768ef0d30","name":"Ethereum Apex","symbol":"EAPEX","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16087/thumb/zZduBQE.png?1622799114"},{"chainId":1,"address":"0xf7970499814654cd13cb7b6e7634a12a7a8a9abc","name":"TOM Finance","symbol":"TOM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13173/thumb/TOM_logo.png?1605857896"},{"chainId":1,"address":"0x79c71d3436f39ce382d0f58f1b011d88100b9d91","name":"Xeonbit Token","symbol":"XNS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8744/thumb/200x200_icon_darkbg.png?1560826732"},{"chainId":1,"address":"0x33c2da7fd5b125e629b3950f3c38d7f721d7b30d","name":"Seal Finance","symbol":"SEAL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12762/thumb/seal.png?1602434721"},{"chainId":1,"address":"0x618679df9efcd19694bb1daa8d00718eacfa2883","name":"Universe XYZ","symbol":"XYZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15809/thumb/universexyz.png?1621950483"},{"chainId":1,"address":"0xd0c4ad14f872bcdf7c3cc2bae99279ab5cdead30","name":"EpaCoin","symbol":"EPC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6698/thumb/nmNdY1f.png?1561599199"},{"chainId":1,"address":"0xaa19961b6b858d9f18a115f25aa1d98abc1fdba8","name":"LocalCoinSwap","symbol":"LCS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3998/thumb/LocalCoinSwap.png?1547039086"},{"chainId":1,"address":"0x93e01899c10532d76c0e864537a1d26433dbbddb","name":"ETH RSI 60 40 Cross","symbol":"ETHRSI6040","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10609/thumb/eth-rsi-40-60-set.png?1580970994"},{"chainId":1,"address":"0x018a6106cb540af1ae6da985361afd5e176d1c00","name":"Wiz Coin","symbol":"WIZ1","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14325/thumb/Untitled-design-13.png?1615428834"},{"chainId":1,"address":"0xa9d2927d3a04309e008b6af6e2e282ae2952e7fd","name":"Zipper Network","symbol":"ZIP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4524/thumb/zip_token_logo.png?1547039822"},{"chainId":1,"address":"0xd18a8abed9274edbeace4b12d86a8633283435da","name":"UnoSwap","symbol":"UNOS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13194/thumb/slazzer-edit-image.png?1606115031"},{"chainId":1,"address":"0x9903a4cd589da8e434f264deafc406836418578e","name":"Harrison First","symbol":"FIRST","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/12196/thumb/cc2016f6-0c74-4a95-b89b-b1684c7b9426.png?1597991823"},{"chainId":1,"address":"0xbc86727e770de68b1060c91f6bb6945c73e10388","name":"Ink Protocol","symbol":"XNK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3156/thumb/ink-protocol.png?1547974056"},{"chainId":1,"address":"0x94b593002a327f2a3f1b190c50d3bcc8b869b5f5","name":"NewsTokens","symbol":"NEWS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11088/thumb/photo_2021-05-12_13-56-13.jpg?1622511396"},{"chainId":1,"address":"0x1966d718a565566e8e202792658d7b5ff4ece469","name":"nDEX","symbol":"NDX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5576/thumb/nDEX-logo.png?1547041405"},{"chainId":1,"address":"0x171d750d42d661b62c277a6b486adb82348c3eca","name":"Omnitude","symbol":"ECOM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3223/thumb/omnitude-ico-logo.png?1547037716"},{"chainId":1,"address":"0xbcfdaeb22ab6e10dfb99546e6240155edc1084f7","name":"Genexi","symbol":"GXI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7126/thumb/bR4FuOeq_400x400.jpg?1547043624"},{"chainId":1,"address":"0x47e820df943170b0e31f9e18ecd5bdd67b77ff1f","name":"PIGX","symbol":"PIGX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9069/thumb/IMG_5547.PNG?1604239318"},{"chainId":1,"address":"0x73ee6d7e6b203125add89320e9f343d65ec7c39a","name":"Axioms","symbol":"AXI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12562/thumb/axioms_logo.png?1600772415"},{"chainId":1,"address":"0x0c93b616933b0cd03b201b29cd8a22681dd9e0d9","name":"HollyGold","symbol":"HGOLD","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13652/thumb/QnfGCea3aO_Qb-Gd9n6MSFE_eBVAr87WPoxAzf0gKdcGOEL4K5J6A5cpGinzLvHclj_UHkCnw9XTlGoNYd0H8T_Ebe8voLS49MAZO2NIknCxytaYFtt5_u12RQg-kpmWHcETzAFlDgk9iNXAL-88fB_l-DRi8WEsgSJzXXjztKzQlpXuET6d4_98pykED6uyq1-4PMVg05P7tUN.jpg?1610574345"},{"chainId":1,"address":"0x52ceefc5f5c64a6d3dc6e4fde5f2d7810bccde49","name":"COINXCLUB","symbol":"CPX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9284/thumb/logo1.jpg?1565766344"},{"chainId":1,"address":"0x695db6508d66bf111d8d96adaffc5356b7f4581f","name":"Coinbene Token","symbol":"CONI","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/4772/thumb/CONI_LOGO.png?1612690472"},{"chainId":1,"address":"0x27778e14ce36d3b85e1effeb43816a17bbb7088a","name":"Lyfe Gold","symbol":"LGOLD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14938/thumb/LGOLD-Logo-200.png?1619082558"},{"chainId":1,"address":"0x47632da9227e322eda59f9e7691eacc6430ac87c","name":"YFI Business","symbol":"YFIB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12346/thumb/fkPIR2pc_400x400.jpg?1599192901"},{"chainId":1,"address":"0xde4ee8057785a7e8e800db58f9784845a5c2cbd6","name":"DeXe","symbol":"DEXE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12713/thumb/logo_%2814%29.png?1601952779"},{"chainId":1,"address":"0x114a86d31b8cb3867040b48e7c17d5d04d886ce0","name":"UPBTC Token","symbol":"UPB","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9118/thumb/iANVIh-nMDKdEB5N_OVBuhpiTZLTaKjuNvPYZUiN2vTYF5ZYBZkqfzdya67I2t1okaLgnoODfqkP_-GWnpDxmSu7IOLEBXkUlsmojeZpNoaN-wIYDpy25PLsC2I8OdJ1o6K5E-90uImq6HQTOy4jTbagjlvwvw8dbJF_Mhlotv1prhikpHxxGveU6S7QpiakG_0PE8K79H9muHT3--EBoA.jpg?1564470282"},{"chainId":1,"address":"0xcb2fa15f4ea7c55bf6ef9456a662412b137043e9","name":"Payou Finance","symbol":"PAYOU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12863/thumb/PAYOU-LOGO.png?1603118094"},{"chainId":1,"address":"0xba358b6f5b4c0215650444b8c30d870b55050d2d","name":"Hub Token","symbol":"HUB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13345/thumb/Hub-Logo-Transparent-BG-200x200_%281%29.png?1607661813"},{"chainId":1,"address":"0xa150db9b1fa65b44799d4dd949d922c0a33ee606","name":"Digital Reserve Cur","symbol":"DRC","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/12802/thumb/DRC-Digital-Reserve-Currency-Coingecko.png?1603355646"},{"chainId":1,"address":"0x95172ccbe8344fecd73d0a30f54123652981bd6f","name":"Meridian Network","symbol":"LOCK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11687/thumb/LOCK_cropped.png?1599614902"},{"chainId":1,"address":"0x9f599410d207f3d2828a8712e5e543ac2e040382","name":"Tapcoin","symbol":"TTT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1580/thumb/tapcoin.png?1547035760"},{"chainId":1,"address":"0x4946583c5b86e01ccd30c71a05617d06e3e73060","name":"Foresting","symbol":"PTON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5186/thumb/foresting_pton_token.png?1554102297"},{"chainId":1,"address":"0xa5b46ff9a887180c8fb2d97146398ddfc5fef1cd","name":"SuperSkyNet","symbol":"SSN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8944/thumb/p3dTwXMK_400x400.jpg?1563153164"},{"chainId":1,"address":"0x9469d013805bffb7d3debe5e7839237e535ec483","name":"Darwinia Network Na","symbol":"RING","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9443/thumb/RING.png?1615271827"},{"chainId":1,"address":"0xe0b9a2c3e9f40cf74b2c7f591b2b0cca055c3112","name":"Genesis Shards","symbol":"GS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14784/thumb/gs.png?1618408218"},{"chainId":1,"address":"0x76306f029f8f99effe509534037ba7030999e3cf","name":"Acreage Coin","symbol":"ACR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5100/thumb/acreage-coin.jpg?1547040494"},{"chainId":1,"address":"0xe2a083397521968eb05585932750634bed4b7d56","name":"HODL","symbol":"HODL","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16737/thumb/HODL-Token-Transparent.png?1624869186"},{"chainId":1,"address":"0xa96f31f1c187c28980176c3a27ba7069f48abde4","name":"Ethereum Gold Proje","symbol":"ETGP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7337/thumb/llxg4bqE_400x400.jpg?1547044001"},{"chainId":1,"address":"0x60715e436c37444e29772c0d26a98ae1e8e1a989","name":"Voltz","symbol":"VOLTZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8020/thumb/voltz.png?1553478253"},{"chainId":1,"address":"0xc3c221fe28c33814c28c822b631fd76047ef1a63","name":"Millimeter","symbol":"MM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12941/thumb/mm%EB%A1%9C%EA%B3%A0-2.png?1603765868"},{"chainId":1,"address":"0xac6fe9aa6b996d15f23e2e9a384fe64607bba7d5","name":"Ramifi Protocol","symbol":"RAM","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/14602/thumb/76572462.png?1618003618"},{"chainId":1,"address":"0x8cd024cc8f73f5cd132005d1584403877b318c9d","name":"Hash Pot","symbol":"HPOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11019/thumb/hashpot.PNG?1587128424"},{"chainId":1,"address":"0x2579bb08387f0de7ab135edd6c2a985a3f577b6b","name":"Sports Betting Mark","symbol":"SBX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12104/thumb/HOTavatar.png?1599272463"},{"chainId":1,"address":"0x63d958d765f5bd88efdbd8afd32445393b24907f","name":"Acash Coin","symbol":"ACA","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9471/thumb/JxCQN9vthyjwGMcjPHzlYJwcu84LG-l3rFR3zgAOGd6BJTtxFVkmZt5PbUJytMa_RrZvYI5EeVm_vP89viF_hyFxwLGw6LlIkgSk32kGMnIy7o8zDkMBrO0wd-4zC--0Ulz9OUESJUOzy6cwH6xx7s5QbF0U3A3fVL9w4Q_jgcKJeM75iuaRMT8k6IhUq6GPiNe-vAyIjpQJI_407eFSeNyB5FVz7w4h5Lu10fLp5ti0mZZs.jpg?1575586540"},{"chainId":1,"address":"0xb4058411967d5046f3510943103805be61f0600e","name":"Stonk","symbol":"STONK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14805/thumb/f9YBOaOF_400x400.jpg?1618534520"},{"chainId":1,"address":"0x2f766a83146f7eaee2c635c9f9a291e4b86f4108","name":"Ubiquitous Social N","symbol":"USNS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10039/thumb/I8sPo8I22qH5EXEGNKr2uZYZ6LJdCIGrkHDUZ8Myue8gAtfL9e1ouiq6m6lbejHlqL53_bHf-qB2Am7dRS_AdpPBbf1S8DWbIIXewPiqrmt3rarNZlP45fX99lBnxTRG7FrH0JFxXZe6ojunQsNTVlh01WVcGMwe2Q96vLr0C8JridYX_HgEUtzhX2DJl4gUSPk9-bEMG3PaMo7Cu-RP_DwSPOLKreAqKjjW0NjhbvVn-CFM.jpg?1575012815"},{"chainId":1,"address":"0x75b02aa1084a12b8729f5acbe1078bd450abe552","name":"ASEC Frontier","symbol":"ASEC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/15939/thumb/58947b_49a936ef42ab4b7da4d2beb95852d49a_mv2.png?1622459327"},{"chainId":1,"address":"0xad4c6ad1f02def1710a2d06c875a31d4868bd70a","name":"Pixel Inu","symbol":"PIXU","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16344/thumb/1623506553440.jpg?1623773176"},{"chainId":1,"address":"0xea38eaa3c86c8f9b751533ba2e562deb9acded40","name":"Etherparty","symbol":"FUEL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1082/thumb/etherparty.png?1547394573"},{"chainId":1,"address":"0xd24dff6117936b6ff97108cf26c1dd8865743d87","name":"MEDIUM","symbol":"MDM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9961/thumb/VEEFC4sG.png?1574293042"},{"chainId":1,"address":"0xf5717f5df41ea67ef67dfd3c1d02f9940bcf5d08","name":"SeChain","symbol":"SNN","decimals":3,"logoURI":"https://assets.coingecko.com/coins/images/11961/thumb/2AsGMTeI_400x400.jpg?1596453536"},{"chainId":1,"address":"0x7eaf9c89037e4814dc0d9952ac7f888c784548db","name":"Royale","symbol":"ROYA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13602/thumb/royale_logo.jpg?1610176118"},{"chainId":1,"address":"0x40c836982788dca47d11024b1fa3e01fd4661766","name":"BTCNEXT Coin","symbol":"BNX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8779/thumb/bnx_big.png?1561111777"},{"chainId":1,"address":"0x34612903db071e888a4dadcaa416d3ee263a87b9","name":"Items","symbol":"ARTE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11720/thumb/Arte.png?1607332372"},{"chainId":1,"address":"0xc7ff1e126cc81e816915ff48c940ed9d4e6d05d6","name":"IjasCoin","symbol":"IJC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14099/thumb/Ijascode-Flat-Logo-2-24-2021.png?1614304358"},{"chainId":1,"address":"0x80ce3027a70e0a928d9268994e9b85d03bd4cdcf","name":"Polkalokr","symbol":"LKR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14692/thumb/coingeckoLogo.png?1617809622"},{"chainId":1,"address":"0xfdeaa4ab9fea519afd74df2257a21e5bca0dfd3f","name":"BCAT","symbol":"BCAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9593/thumb/bcat.png?1569278870"},{"chainId":1,"address":"0x56be94d29e1125d2d61d06629c1b251d72c1b3b3","name":"Hustle Token","symbol":"HUSL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10680/thumb/hlhfVHeb_400x400.jpg?1581804351"},{"chainId":1,"address":"0xc59cb23295e2deeb66bd090acb6b02be8d30a11f","name":"Kublaicoin","symbol":"KUB","decimals":10,"logoURI":"https://assets.coingecko.com/coins/images/11342/thumb/logo_%2876%29.png?1589946883"},{"chainId":1,"address":"0x9d409a0a012cfba9b15f6d4b36ac57a46966ab9a","name":"Yearn Compounding v","symbol":"YVBOOST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15152/thumb/yvBOOST.png?1619978216"},{"chainId":1,"address":"0x12419eea0b053ffea92f9afcd7986a495e2cf0dd","name":"The Nifty ONEz","symbol":"ONEZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14370/thumb/the-nifty-onez.png?1615737408"},{"chainId":1,"address":"0x1ffe24629f1b3df74fc0f6e5d086f2fd09258ff2","name":"VBT","symbol":"VBT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8467/thumb/747suczn_400x400.jpg?1558766251"},{"chainId":1,"address":"0x69bbc3f8787d573f1bbdd0a5f40c7ba0aee9bcc9","name":"Yup","symbol":"YUP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12322/thumb/yupx.png?1599094638"},{"chainId":1,"address":"0x68bb81b3f67f7aab5fd1390ecb0b8e1a806f2465","name":"NFT Platform Index","symbol":"NFTP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14543/thumb/nftp-light-circular.c54a6825.png?1616935648"},{"chainId":1,"address":"0x72a6344185b383035d6665c3f44a9dfcc73873c8","name":"ROONEX","symbol":"RNX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11125/thumb/logo_%281%29.jpg?1588736377"},{"chainId":1,"address":"0x630d98424efe0ea27fb1b3ab7741907dffeaad78","name":"PEAKDEFI","symbol":"PEAK","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9626/thumb/PEAKDEFI_Logo_250x250.png?1603094772"},{"chainId":1,"address":"0xfe2e637202056d30016725477c5da089ab0a043a","name":"sETH2","symbol":"SETH2","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16569/thumb/emerald256.png?1624494960"},{"chainId":1,"address":"0xad32a8e6220741182940c5abf610bde99e737b2d","name":"PieDAO DOUGH v2","symbol":"DOUGH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12693/thumb/DOUGH2v.png?1602655308"},{"chainId":1,"address":"0x7af89c8a06719271a96e62e290ea9ed192e73fc1","name":"Gold Mining Members","symbol":"GMM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11660/thumb/gmm_logo_token.png?1592432359"},{"chainId":1,"address":"0xa0471cdd5c0dc2614535fd7505b17a651a8f0dab","name":"EasySwap","symbol":"ESWA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11721/thumb/Easyswap.png?1593080991"},{"chainId":1,"address":"0xba4cfe5741b357fa371b506e5db0774abfecf8fc","name":"vVSP","symbol":"VVSP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15101/thumb/vvsp.jpeg?1619693189"},{"chainId":1,"address":"0xab5c04bbe42667610a2da07ac98ea9fa6e4a9514","name":"IZEROIUM","symbol":"IZER","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10777/thumb/256X256_%281%29.png?1583448004"},{"chainId":1,"address":"0x4bae380b5d762d543d426331b8437926443ae9ec","name":"XVIX","symbol":"XVIX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13364/thumb/xvix_logo.png?1607914655"},{"chainId":1,"address":"0xef7bce1be2ba032131326910a6c11e716daedbff","name":"Spurt Plus","symbol":"SPUP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14814/thumb/Untitled-design-30.png?1618543505"},{"chainId":1,"address":"0x36dcffe069a3f2878fab2a46d81e83d462d0cbf7","name":"Tcbcoin","symbol":"TCFX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12570/thumb/6MY5OAW.png?1600840730"},{"chainId":1,"address":"0xf256f3ac4176126f55af7c6e25fa5f3cdf518b38","name":"CEDARS","symbol":"CEDS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12255/thumb/cedars.png?1598522772"},{"chainId":1,"address":"0x75230d7d86b59213773d47103b96a0e7133c8621","name":"Buildin","symbol":"BIN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/15122/thumb/bin.PNG?1619754986"},{"chainId":1,"address":"0x07bac35846e5ed502aa91adf6a9e7aa210f2dcbe","name":"Sifchain","symbol":"EROWAN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14044/thumb/EROWAN.png?1614656300"},{"chainId":1,"address":"0x5a9bf6badcd24fe0d58e1087290c2fe2c728736a","name":"Block 18","symbol":"18C","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7605/thumb/block_18.jpg?1548828772"},{"chainId":1,"address":"0xd8ef149b4e1e8f050d52925f9c68d3a296e77227","name":"Blucon","symbol":"BEP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9918/thumb/f279b103b55c6.png?1573458436"},{"chainId":1,"address":"0x3212b29e33587a00fb1c83346f5dbfa69a458923","name":"The Tokenized Bitco","symbol":"IMBTC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10702/thumb/imbtc.png?1585124381"},{"chainId":1,"address":"0x821144518dfe9e7b44fcf4d0824e15e8390d4637","name":"Atlantis Token","symbol":"ATIS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12112/thumb/atis_token_logo.png?1600097654"},{"chainId":1,"address":"0x59c337ef937d0ba9cb1cc47d4e6ded632d22d623","name":"Tchain","symbol":"TCH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7328/thumb/Tchain_%EF%BC%88TCH%29.png?1568598678"},{"chainId":1,"address":"0x853d955acef822db058eb8505911ed77f175b99e","name":"Frax","symbol":"FRAX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13422/thumb/frax_logo.png?1608476506"},{"chainId":1,"address":"0x55eb5288c9b65037a4cd2289637f38a4f9db3a6b","name":"KAWANGGAWA","symbol":"KGW","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11815/thumb/f_HFXjBE_400x400.jpg?1594597195"},{"chainId":1,"address":"0xfa2562da1bba7b954f26c74725df51fb62646313","name":"ASSY Index","symbol":"ASSY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13747/thumb/assy.png?1611425796"},{"chainId":1,"address":"0xbaa2c10ea6409b58870b5c773c0ff429af7c6f20","name":"BuyPay","symbol":"WBPC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14154/thumb/NnUycReC_400x400.jpg?1614670926"},{"chainId":1,"address":"0x2a8e1e676ec238d8a992307b495b45b3feaa5e86","name":"Origin Dollar","symbol":"OUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12589/thumb/ousd-logo-200x200.png?1600943287"},{"chainId":1,"address":"0x9e78b8274e1d6a76a0dbbf90418894df27cbceb5","name":"Covenants","symbol":"UNIFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12258/thumb/Unifi.png?1598548933"},{"chainId":1,"address":"0xbd2f0cd039e0bfcf88901c98c0bfac5ab27566e3","name":"Dynamic Set Dollar","symbol":"DSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13249/thumb/DSD.jpg?1606713628"},{"chainId":1,"address":"0x975769557510167d25beed6e32806537173e292c","name":"Derivex","symbol":"DVX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11696/thumb/dvx.png?1592880992"},{"chainId":1,"address":"0xe0ad1806fd3e7edf6ff52fdb822432e847411033","name":"OnX Finance","symbol":"ONX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13445/thumb/onxlogo-1.png?1608629659"},{"chainId":1,"address":"0x6523203bd28d399068acc14db6b7f31d9bf43f1a","name":"Balloon Coin","symbol":"BALO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11142/thumb/logo-2.png?1588918249"},{"chainId":1,"address":"0x68b1cadb8d5ab0c97fe9d9fbe0eb60acb329fe3f","name":"Unicly Mystic Axies","symbol":"UAXIE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14921/thumb/uaxie-mystic.png?1619055573"},{"chainId":1,"address":"0x8888889213dd4da823ebdd1e235b09590633c150","name":"Marblecoin","symbol":"MBC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9770/thumb/logo_%2824%29.png?1571610155"},{"chainId":1,"address":"0xf80d589b3dbe130c270a69f1a69d050f268786df","name":"Datamine","symbol":"DAM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11695/thumb/qxsFH8W.png?1592880463"},{"chainId":1,"address":"0x42dbbd5ae373fea2fc320f62d44c058522bb3758","name":"Memecoin","symbol":"MEM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16370/thumb/mem_gold_200x200_copy.png?1623821100"},{"chainId":1,"address":"0x3c4030839708a20fd2fb379cf11810dde4888d93","name":"IMSWallet","symbol":"IMS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12173/thumb/wqtIArTS_400x400.jpg?1597804992"},{"chainId":1,"address":"0x476c5e26a75bd202a9683ffd34359c0cc15be0ff","name":"Serum","symbol":"SRM","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/11970/thumb/serum-logo.png?1597121577"},{"chainId":1,"address":"0x1776e1f26f98b1a5df9cd347953a26dd3cb46671","name":"Numeraire","symbol":"NMR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/752/thumb/numeraire.png?1592538976"},{"chainId":1,"address":"0x77e31d674a46d356b2e65892bde7758bb26238ca","name":"HumanCoin","symbol":"HMNC","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15079/thumb/HMNC.png?1619650086"},{"chainId":1,"address":"0x0b4bdc478791897274652dc15ef5c135cae61e60","name":"DAEX","symbol":"DAX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4063/thumb/daex.png?1547791412"},{"chainId":1,"address":"0x1b980e05943de3db3a459c72325338d327b6f5a9","name":"Bitgear","symbol":"GEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12127/thumb/bitgear_logo.png?1597377982"},{"chainId":1,"address":"0x6f0b09bfa87410ab993291ec5f8cda81f1d2acd9","name":"Pilnette","symbol":"PVG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12527/thumb/imgonline-com-ua-resize-ZHVjngZkE0gMhQ-removebg-preview.png?1600484009"},{"chainId":1,"address":"0x4726e9de74573255ea41e0d00b49b833c77a671e","name":"USDEX","symbol":"USDEX","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/13746/thumb/Untitled-design-4.png?1611413797"},{"chainId":1,"address":"0x4cd988afbad37289baaf53c13e98e2bd46aaea8c","name":"Key","symbol":"KEY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4182/thumb/bihu-key-token.png?1547039459"},{"chainId":1,"address":"0x744d70fdbe2ba4cf95131626614a1763df805b9e","name":"Status","symbol":"SNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/779/thumb/status.png?1548610778"},{"chainId":1,"address":"0x4922a015c4407f87432b179bb209e125432e4a2a","name":"Tether Gold","symbol":"XAUT","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/10481/thumb/tether-gold.png?1579946148"},{"chainId":1,"address":"0x23b608675a2b2fb1890d3abbd85c5775c51691d5","name":"Unisocks","symbol":"SOCKS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10717/thumb/qFrcoiM.png?1582525244"},{"chainId":1,"address":"0xa91ac63d040deb1b7a5e4d4134ad23eb0ba07e14","name":"Bella Protocol","symbol":"BEL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12478/thumb/Bella.png?1602230054"},{"chainId":1,"address":"0x2be5e8c109e2197d077d13a82daead6a9b3433c5","name":"Tokamak Network","symbol":"TON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12260/thumb/D919x5-s_400x400.png?1598568068"},{"chainId":1,"address":"0x544c42fbb96b39b21df61cf322b5edc285ee7429","name":"InsurAce","symbol":"INSUR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14226/thumb/insur.png?1615124622"},{"chainId":1,"address":"0xc52e23194476b1dd39408cb0b9d935da8e6db3d6","name":"Clever DeFi","symbol":"CLVA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14685/thumb/CLVA.png?1617777204"},{"chainId":1,"address":"0x0fcbc31c503b4a9ed90e87f8ff46c318a4a14260","name":"Quantfury","symbol":"QTF","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/14033/thumb/FtSOX9Vy_400x400.jpg?1613946524"},{"chainId":1,"address":"0x0000852600ceb001e08e00bc008be620d60031f2","name":"TrueHKD","symbol":"THKD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9465/thumb/THKD.png?1567642964"},{"chainId":1,"address":"0x3893b9422cd5d70a81edeffe3d5a1c6a978310bb","name":"Mithril","symbol":"MITH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3484/thumb/mithril.png?1548085086"},{"chainId":1,"address":"0xeca82185adce47f39c684352b0439f030f860318","name":"PERL eco","symbol":"PERL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4682/thumb/PERL.eco-Icon-green_6x.png?1624365340"},{"chainId":1,"address":"0xa8b12cc90abf65191532a12bb5394a714a46d358","name":"pBTC35A","symbol":"PBTC35A","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13653/thumb/pBTC35A.png?1610574940"},{"chainId":1,"address":"0x63b4f3e3fa4e438698ce330e365e831f7ccd1ef4","name":"CyberFi","symbol":"CFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13112/thumb/cyberfi_logo.jpeg?1605283367"},{"chainId":1,"address":"0x86772b1409b61c639eaac9ba0acfbb6e238e5f83","name":"Indexed Finance","symbol":"NDX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13546/thumb/indexed-light.74bb5471.png?1609712728"},{"chainId":1,"address":"0xa806b3fed6891136940cf81c4085661500aa2709","name":"Sport and Leisure","symbol":"SNL","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/7762/thumb/745ba052-73b7-4735-a0bf-e75474def055.png?1550456328"},{"chainId":1,"address":"0xb9ef770b6a5e12e45983c5d80545258aa38f3b78","name":"0chain","symbol":"ZCN","decimals":10,"logoURI":"https://assets.coingecko.com/coins/images/4934/thumb/0_Black-svg.png?1600757954"},{"chainId":1,"address":"0x0e192d382a36de7011f795acc4391cd302003606","name":"Futureswap","symbol":"FST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14520/thumb/futureswap.jpeg?1616674209"},{"chainId":1,"address":"0xf5581dfefd8fb0e4aec526be659cfab1f8c781da","name":"HOPR","symbol":"HOPR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14061/thumb/Shared_HOPR_logo_512px.png?1614073468"},{"chainId":1,"address":"0x515d7e9d75e2b76db60f8a051cd890eba23286bc","name":"Governor DAO","symbol":"GDAO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13140/thumb/GDAOlogo2-bird.png?1605591842"},{"chainId":1,"address":"0x47fd85128312ee72aa0e0382a531a8f848b8b2cb","name":"Gallery Finance","symbol":"GLF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12857/thumb/U5VMHQ5q_400x400.jpg?1603090892"},{"chainId":1,"address":"0xa8b0f154a688c22142e361707df64277e0a0be66","name":"Rake Finance","symbol":"RAK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13078/thumb/rake-logo-200x200.png?1604931839"},{"chainId":1,"address":"0xceb286c9604c542d3cc08b41aa6c9675b078a832","name":"Vortex DeFi","symbol":"VTX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14120/thumb/vortex_defi.png?1614514332"},{"chainId":1,"address":"0x1321f1f1aa541a56c31682c57b80ecfccd9bb288","name":"ARC Governance","symbol":"ARCX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15652/thumb/ARCX.jpg?1621478114"},{"chainId":1,"address":"0xf970b8e36e23f7fc3fd752eea86f8be8d83375a6","name":"Ripio Credit Networ","symbol":"RCN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1057/thumb/ripio-credit-network.png?1548608361"},{"chainId":1,"address":"0xddf7fd345d54ff4b40079579d4c4670415dbfd0a","name":"SocialGood","symbol":"SG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3948/thumb/logo_200.png?1596589686"},{"chainId":1,"address":"0x2791bfd60d232150bff86b39b7146c0eaaa2ba81","name":"BiFi","symbol":"BIFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13671/thumb/ysYIu7Q.png?1610679337"},{"chainId":1,"address":"0x54b8c98268da0055971652a95f2bfd3a9349a38c","name":"Printer Finance","symbol":"PRINT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12497/thumb/moneyprinter_anm.png?1600499835"},{"chainId":1,"address":"0xbdea5bb640dbfc4593809deec5cdb8f99b704cd2","name":"Direwolf","symbol":"DIREWOLF","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/16007/thumb/direwolf_logo_200x200.png?1622597860"},{"chainId":1,"address":"0x945facb997494cc2570096c74b5f66a3507330a1","name":"mStable BTC","symbol":"MBTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13973/thumb/mbtc.png?1613485921"},{"chainId":1,"address":"0x275f5ad03be0fa221b4c6649b8aee09a42d9412a","name":"Monavale","symbol":"MONA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13298/thumb/monavale_logo.jpg?1607232721"},{"chainId":1,"address":"0x147faf8de9d8d8daae129b187f0d02d819126750","name":"GeoDB","symbol":"GEO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11130/thumb/geodb.png?1588941704"},{"chainId":1,"address":"0xcb8d1260f9c92a3a545d409466280ffdd7af7042","name":"NFT Protocol","symbol":"NFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12174/thumb/nftprotocol_32.png?1597818115"},{"chainId":1,"address":"0x97abee33cd075c58bfdd174e0885e08e8f03556f","name":"Sentiment Token","symbol":"SENT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16388/thumb/94SwpUOP_400x400.jpg?1623894898"},{"chainId":1,"address":"0xfdc4a3fc36df16a78edcaf1b837d3acaaedb2cb4","name":"SCIFI Index","symbol":"SCIFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13868/thumb/yaxtD4c.png?1624955109"},{"chainId":1,"address":"0x3d658390460295fb963f54dc0899cfb1c30776df","name":"Circuits of Value","symbol":"COVAL","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/588/thumb/coval-logo.png?1599493950"},{"chainId":1,"address":"0x2620638eda99f9e7e902ea24a285456ee9438861","name":"Crust Shadow","symbol":"CSM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16037/thumb/2_mnCYZfHmLg2bFrjM3vKtPw.png?1622680217"},{"chainId":1,"address":"0xa4eed63db85311e22df4473f87ccfc3dadcfa3e3","name":"Rubic","symbol":"RBC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12629/thumb/200x200.png?1607952509"},{"chainId":1,"address":"0x19fd4c760a7d4a38aee9f226035cbc9fdf434ffe","name":"CVP Token","symbol":"CVP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12275/thumb/yte0zGJf_400x400.jpg?1598736232"},{"chainId":1,"address":"0x380291a9a8593b39f123cf39cc1cc47463330b1f","name":"Elite Swap","symbol":"ELT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13715/thumb/logo_-_2021-01-20T105016.992.png?1611111027"},{"chainId":1,"address":"0xa58a4f5c4bb043d2cc1e170613b74e767c94189b","name":"UTU Coin","symbol":"UTU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12831/thumb/Aa5nmbkJ_400x400.png?1602884636"},{"chainId":1,"address":"0xc3761eb917cd790b30dad99f6cc5b4ff93c4f9ea","name":"ERC20","symbol":"ERC20","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1141/thumb/erc20.png?1547035146"},{"chainId":1,"address":"0xea6412fb370e8d1605e6aeeaa21ad07c3c7e9f24","name":"Mushroom","symbol":"MUSH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14054/thumb/logo.jpeg?1614049972"},{"chainId":1,"address":"0x9f9c8ec3534c3ce16f928381372bfbfbfb9f4d24","name":"GraphLinq Protocol","symbol":"GLQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14474/thumb/graphlinq_logo.jpg?1616397109"},{"chainId":1,"address":"0x6f87d756daf0503d08eb8993686c7fc01dc44fb1","name":"Unitrade","symbol":"TRADE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11982/thumb/unitrade.PNG?1597009487"},{"chainId":1,"address":"0x9235bda06b8807161b8fbb1e102cb654555b212f","name":"Feellike","symbol":"FLL","decimals":3,"logoURI":"https://assets.coingecko.com/coins/images/12075/thumb/FLL_logo_200.png?1596751266"},{"chainId":1,"address":"0xfdfe8b7ab6cf1bd1e3d14538ef40686296c42052","name":"Skraps","symbol":"SKRP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7987/thumb/60EnDfxK_400x400.jpg?1552888803"},{"chainId":1,"address":"0x6226e00bcac68b0fe55583b90a1d727c14fab77f","name":"MultiVAC","symbol":"MTV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4937/thumb/MultiVAC.png?1558598585"},{"chainId":1,"address":"0xc5bbae50781be1669306b9e001eff57a2957b09d","name":"Gifto","symbol":"GTO","decimals":5,"logoURI":"https://assets.coingecko.com/coins/images/1359/thumb/gifto.png?1547742697"},{"chainId":1,"address":"0x1c9491865a1de77c5b6e19d2e6a5f1d7a6f2b25f","name":"AntiMatter","symbol":"MATTER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14112/thumb/antimatter_icon.png?1614395992"},{"chainId":1,"address":"0x2edf094db69d6dcd487f1b3db9febe2eec0dd4c5","name":"ZeroSwap","symbol":"ZEE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12861/thumb/zeroswap.jpg?1603111827"},{"chainId":1,"address":"0xa6d5c720a9af5a405dfb6b9f44fc44fab5d4a58d","name":"Ezystayz","symbol":"EZY","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9062/thumb/5521.png?1603333090"},{"chainId":1,"address":"0x755eb14d2feff2939eb3026f5cad9d03775b9ff4","name":"BunnyToken","symbol":"BUNNY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3185/thumb/bunnytoken.png?1547564097"},{"chainId":1,"address":"0x679fa6dc913acab6def33ec469fc6e421bc794f5","name":"Bribe Protocol","symbol":"BRIBE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14967/thumb/bribe.PNG?1619165925"},{"chainId":1,"address":"0xbd2949f67dcdc549c6ebe98696449fa79d988a9f","name":"Meter Governance ma","symbol":"EMTRG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12175/thumb/Dark-blue-icon-transparent-vector-white-icon200x200.png?1597819237"},{"chainId":1,"address":"0x90b831fa3bebf58e9744a14d638e25b4ee06f9bc","name":"MIMO Parallel Gover","symbol":"MIMO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16449/thumb/mimodefi.PNG?1624240539"},{"chainId":1,"address":"0x0488401c3f535193fa8df029d9ffe615a06e74e6","name":"SparkPoint","symbol":"SRK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8371/thumb/SRK.png?1614675526"},{"chainId":1,"address":"0x5c872500c00565505f3624ab435c222e558e9ff8","name":"CoTrader","symbol":"COT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4205/thumb/logo_black.png?1547039508"},{"chainId":1,"address":"0xb339fca531367067e98d7c4f9303ffeadff7b881","name":"Aludra Network","symbol":"ALD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12098/thumb/20200810_135504.jpg?1597112432"},{"chainId":1,"address":"0x41e5560054824ea6b0732e656e3ad64e20e94e45","name":"Civic","symbol":"CVC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/788/thumb/civic.png?1547034556"},{"chainId":1,"address":"0x8cb1d155a5a1d5d667611b7710920fd9d1cd727f","name":"Aircoins","symbol":"AIRX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9201/thumb/Aircoins.png?1591615033"},{"chainId":1,"address":"0x0d2bb9d68dd4451a09ec94c05e20bd395022bd8e","name":"CRYPTOBUCKS","symbol":"CBUCKS","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/10299/thumb/cbucks.png?1584504612"},{"chainId":1,"address":"0x89e3ac6dd69c15e9223be7649025d6f68dab1d6a","name":"Evan","symbol":"EVAN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12078/thumb/8NERB6Pc_400x400.jpg?1597273971"},{"chainId":1,"address":"0x897abf83f0c44b86cb67ec56c006c00d56659517","name":"Arteon","symbol":"ARTEON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14771/thumb/arteon_200x200.png?1618369416"},{"chainId":1,"address":"0x3ebb4a4e91ad83be51f8d596533818b246f4bee1","name":"Signata","symbol":"SATA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14704/thumb/logo.png?1617853256"},{"chainId":1,"address":"0xe7cd2c56d3f01f9f8ae542ba5b2f00cf2cf994b1","name":"UCX FOUNDATION","symbol":"UCX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12130/thumb/UCX_Color_Logo256.jpg?1597459240"},{"chainId":1,"address":"0x6710c63432a2de02954fc0f851db07146a6c0312","name":"Smart MFG","symbol":"MFG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1842/thumb/Smart_MFG_Cropped_Logo.png?1621422155"},{"chainId":1,"address":"0x2a7f709ee001069771ceb6d42e85035f7d18e736","name":"OWL Token","symbol":"OWL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12720/thumb/logo-transbg_200x200.png?1602024124"},{"chainId":1,"address":"0xfbaf48e57cab46f4c2e03edb90a421d9fc6c7cbf","name":"MIKS COIN","symbol":"MIKS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12187/thumb/UBshwvwJ_400x400.jpg?1597962460"},{"chainId":1,"address":"0xed40834a13129509a89be39a9be9c0e96a0ddd71","name":"Warp Finance","symbol":"WARP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13910/thumb/601ed0ac35c687c6e07d17c2_warp_token.png?1612834360"},{"chainId":1,"address":"0xc528c28fec0a90c083328bc45f587ee215760a0f","name":"Endor Protocol Toke","symbol":"EDR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3683/thumb/0b805574-ef0d-41dc-b518-8d6148bf4716.png?1547038680"},{"chainId":1,"address":"0x2bba3cf6de6058cc1b4457ce00deb359e2703d7f","name":"HashCoin","symbol":"HSC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4989/thumb/hashfuture-logo.png?1531741876"},{"chainId":1,"address":"0x3b544e6fcf6c8dce9d8b45a4fdf21c9b02f9fda9","name":"Giftedhands","symbol":"GHD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12540/thumb/K-8uHktJ.png?1600644856"},{"chainId":1,"address":"0xee573a945b01b788b9287ce062a0cfc15be9fd86","name":"Exeedme","symbol":"XED","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13518/thumb/exeedme.png?1610669597"},{"chainId":1,"address":"0xe7a7ef72466167ff78e08ad76b12ca0c13c496e1","name":"DogStonks Pro","symbol":"DOGPRO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16459/thumb/I9tAJB2.png?1624253809"},{"chainId":1,"address":"0x41bbedd7286daab5910a1f15d12cbda839852bd7","name":"Mirrored Microsoft","symbol":"MMSFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13396/thumb/mirror_logo_transparent.png?1611564779"},{"chainId":1,"address":"0xaa2ce7ae64066175e0b90497ce7d9c190c315db4","name":"Suterusu","symbol":"SUTER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9830/thumb/p-NFlBlw_400x400.jpg?1572472860"},{"chainId":1,"address":"0x2863916c6ebdbbf0c6f02f87b7eb478509299868","name":"SIMBA Storage Token","symbol":"SST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11908/thumb/SIMBA_2.png?1614318625"},{"chainId":1,"address":"0xb020ed54651831878e5c967e0953a900786178f9","name":"Baz Token","symbol":"BAZT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9581/thumb/baz.png?1576038883"},{"chainId":1,"address":"0x00000000441378008ea67f4284a57932b1c000a5","name":"TrueGBP","symbol":"TGBP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12724/thumb/TGBP.png?1602042166"},{"chainId":1,"address":"0xd341d1680eeee3255b8c4c75bcce7eb57f144dae","name":"SoMee Social OLD ","symbol":"ONG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1286/thumb/So_Mee_logo_icons_11.png?1581305902"},{"chainId":1,"address":"0x25e1474170c4c0aa64fa98123bdc8db49d7802fa","name":"Bidao","symbol":"BID","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12596/thumb/bidao.png?1600996485"},{"chainId":1,"address":"0x9b9087756eca997c5d595c840263001c9a26646d","name":"DogeFi","symbol":"DOGEFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12290/thumb/DOGEFI-Logo.png?1598868716"},{"chainId":1,"address":"0x5732046a883704404f284ce41ffadd5b007fd668","name":"Bluzelle","symbol":"BLZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2848/thumb/ColorIcon_3x.png?1622516510"},{"chainId":1,"address":"0xb6ed7644c69416d67b522e20bc294a9a9b405b31","name":"0xBitcoin","symbol":"0XBTC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/4454/thumb/0xbtc.png?1561603765"},{"chainId":1,"address":"0x714599f7604144a3fe1737c440a70fc0fd6503ea","name":"Raku Coin","symbol":"RAKUC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16357/thumb/Raku-Logo-New.png?1623809320"},{"chainId":1,"address":"0x130914e1b240a7f4c5d460b7d3a2fd3846b576fa","name":"Aureus Nummus Gold","symbol":"ANG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12134/thumb/AureusNummusGold-logo.png?1597462266"},{"chainId":1,"address":"0x70e8de73ce538da2beed35d14187f6959a8eca96","name":"XSGD","symbol":"XSGD","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/12832/thumb/opiTgkh.png?1602856852"},{"chainId":1,"address":"0x31c8eacbffdd875c74b94b077895bd78cf1e64a3","name":"Radicle","symbol":"RAD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14013/thumb/radicle.png?1614402918"},{"chainId":1,"address":"0xbe428c3867f05dea2a89fc76a102b544eac7f772","name":"CyberVeinToken","symbol":"CVT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3886/thumb/CyberVein_LOGO.png?1616062326"},{"chainId":1,"address":"0x2c9c19ce3b15ae77c6d80aec3c1194cfd6f7f3fa","name":"2crazyNFT","symbol":"2CRZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16797/thumb/2crazy.jpeg?1625041884"},{"chainId":1,"address":"0xdfc628a33c18e856cd1c59583cb5ace8db706f14","name":"Projekt Gold","symbol":"GOLD","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16417/thumb/gold.png?1623982279"},{"chainId":1,"address":"0x84fe25f3921f3426395c883707950d0c00367576","name":"Insight Protocol","symbol":"INX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11694/thumb/logo_%EC%B0%90%EB%B8%94%EB%A3%A8.png?1592879247"},{"chainId":1,"address":"0x226f7b842e0f0120b7e194d05432b3fd14773a9d","name":"UNION Protocol Gove","symbol":"UNN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13408/thumb/unn_finance.png?1608262290"},{"chainId":1,"address":"0xb705268213d593b8fd88d3fdeff93aff5cbdcfae","name":"IDEX","symbol":"IDEX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2565/thumb/49046004.png?1557813562"},{"chainId":1,"address":"0x090185f2135308bad17527004364ebcc2d37e5f6","name":"Spell Token","symbol":"SPELL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15861/thumb/abracadabra-3.png?1622544862"},{"chainId":1,"address":"0x0c7d5ae016f806603cb1782bea29ac69471cab9c","name":"Bifrost","symbol":"BFC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4639/thumb/bifrost_32.png?1608520677"},{"chainId":1,"address":"0x1ef6a7e2c966fb7c5403efefde38338b1a95a084","name":"ShieldEX","symbol":"SLD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16170/thumb/Shieldex.png?1624072102"},{"chainId":1,"address":"0x5af2be193a6abca9c8817001f45744777db30756","name":"Voyager Token","symbol":"VGX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/794/thumb/Voyager-vgx.png?1575693595"},{"chainId":1,"address":"0x7968bc6a03017ea2de509aaa816f163db0f35148","name":"Hedget","symbol":"HGET","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/12453/thumb/Hedget.png?1599944809"},{"chainId":1,"address":"0x5de7cc4bcbca31c473f6d2f27825cfb09cc0bb16","name":"XBE Token","symbol":"XBE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14480/thumb/xbe.png?1616462685"},{"chainId":1,"address":"0x3ab6ed69ef663bd986ee59205ccad8a20f98b4c2","name":"Drep new ","symbol":"DREP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14578/thumb/KotgsCgS_400x400.jpg?1617094445"},{"chainId":1,"address":"0xaa7fb1c8ce6f18d4fd4aabb61a2193d4d441c54f","name":"ShitCoin","symbol":"SHIT","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/9472/thumb/ShitCoin_200x200.png?1567723695"},{"chainId":1,"address":"0x9e547061a345015869d26c7b6ee4ab5b63424441","name":"Cryptocart","symbol":"CC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15210/thumb/cc.PNG?1620107415"},{"chainId":1,"address":"0x875773784af8135ea0ef43b5a374aad105c5d39e","name":"IDLE","symbol":"IDLE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13286/thumb/token-logo.png?1607004948"},{"chainId":1,"address":"0x4f6103bad230295bacf30f914fda7d4273b7f585","name":"KI","symbol":"XKI","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/15694/thumb/xki-color.png?1621569714"},{"chainId":1,"address":"0x89ab32156e46f46d02ade3fecbe5fc4243b9aaed","name":"pNetwork","symbol":"PNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11659/thumb/pNetwork.png?1592411134"},{"chainId":1,"address":"0x9196e18bc349b1f64bc08784eae259525329a1ad","name":"Pussy Financial","symbol":"PUSSY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15213/thumb/pussytoken.png?1620110339"},{"chainId":1,"address":"0x946551dd05c5abd7cc808927480225ce36d8c475","name":"One","symbol":"ONE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4960/thumb/Screenshot_39.png?1561103318"},{"chainId":1,"address":"0x0327112423f3a68efdf1fcf402f6c5cb9f7c33fd","name":"PieDAO BTC ","symbol":"BTC++","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10959/thumb/BTC__.png?1586499443"},{"chainId":1,"address":"0xf4cd3d3fda8d7fd6c5a500203e38640a70bf9577","name":"YfDAI finance","symbol":"YF-DAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12385/thumb/1619048513068.png?1622193581"},{"chainId":1,"address":"0xc7e43a1c8e118aa2965f5eabe0e718d83db7a63c","name":"ZCore Token","symbol":"ZCRT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11113/thumb/ZCRT.png?1590979772"},{"chainId":1,"address":"0xb5ca46cf1da09248126682a7bd72401fd7a6b151","name":"Provoco","symbol":"VOCO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6501/thumb/provoco.jpg?1547042729"},{"chainId":1,"address":"0xe6b75a1960f91bfa7010dec8543685ead67f8cff","name":"Sea Cucumber Chain","symbol":"SCC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8689/thumb/1553565844735_mid.png?1560234469"},{"chainId":1,"address":"0xce3f6f6672616c39d8b6858f8dac9902eca42c84","name":"DAO1","symbol":"DAO1","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16193/thumb/dao1.PNG?1623276970"},{"chainId":1,"address":"0x9af4f26941677c706cfecf6d3379ff01bb85d5ab","name":"DomRaider","symbol":"DRT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1030/thumb/domraider.png?1547223934"},{"chainId":1,"address":"0x2af5d2ad76741191d15dfe7bf6ac92d4bd912ca3","name":"LEO Token","symbol":"LEO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8418/thumb/leo-token.png?1558326215"},{"chainId":1,"address":"0xb3299d4bab93bf04d5b11bc49cd6dfad1f77d23f","name":"3X Short Cardano To","symbol":"ADABEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10232/thumb/683JEXMN_400x400_%281%29.png?1576618766"},{"chainId":1,"address":"0x6cbedec4f1ac9d874987d2769596544e0d9161ab","name":"DeepCloud AI","symbol":"DEEP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4549/thumb/Deepcloud.png?1564168501"},{"chainId":1,"address":"0xd23ac27148af6a2f339bd82d0e3cff380b5093de","name":"Siren","symbol":"SI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13955/thumb/siren-markets.png?1622079888"},{"chainId":1,"address":"0x2d0e64b6bf13660a4c0de42a0b88144a7c10991f","name":"Tom Inu","symbol":"TINU","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16505/thumb/tom-cg-logo.png?1624269653"},{"chainId":1,"address":"0x01e0e2e61f554ecaaec0cc933e739ad90f24a86d","name":"Graviton","symbol":"GTON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15728/thumb/79590209.png?1621637194"},{"chainId":1,"address":"0x888888888889c00c67689029d7856aac1065ec11","name":"Opium","symbol":"OPIUM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13758/thumb/opium-token-black_%281%29.png?1611767960"},{"chainId":1,"address":"0xc2685307ef2b8842fbf3def432408c46bd0420fd","name":"3X Long LEO Token","symbol":"LEOBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10231/thumb/683JEXMN_400x400_%281%29.png?1576618672"},{"chainId":1,"address":"0x1712aad2c773ee04bdc9114b32163c058321cd85","name":"LimitSwap","symbol":"LIMIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12760/thumb/limit_swap_logo.png?1602347106"},{"chainId":1,"address":"0x7bef710a5759d197ec0bf621c3df802c2d60d848","name":"Splyt","symbol":"SHOPX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14600/thumb/Splyt_Logo.png?1617196503"},{"chainId":1,"address":"0x817bbdbc3e8a1204f3691d14bb44992841e3db35","name":"Cudos","symbol":"CUDOS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13651/thumb/CudosIconTransparent.png?1610631426"},{"chainId":1,"address":"0x45804880de22913dafe09f4980848ece6ecbaf78","name":"PAX Gold","symbol":"PAXG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9519/thumb/paxg.PNG?1568542565"},{"chainId":1,"address":"0xf9fbaefde7112f78fa9bfe813341f0f49f888cb3","name":"DDS Store","symbol":"DDS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13946/thumb/11qbAbzb_400x400.png?1613172588"},{"chainId":1,"address":"0x7bd82b320ebc28d8eb3c4f5fa2af7b14da5b90c3","name":"Mozik","symbol":"MOZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16167/thumb/mozik.PNG?1623189483"},{"chainId":1,"address":"0x38c4102d11893351ced7ef187fcf43d33eb1abe6","name":"Shrimp Finance","symbol":"SHRIMP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12150/thumb/shrimp_logo.jpg?1597653144"},{"chainId":1,"address":"0x8a854288a5976036a725879164ca3e91d30c6a1b","name":"GET Protocol","symbol":"GET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1927/thumb/GET_Protocol.png?1552893230"},{"chainId":1,"address":"0x725c263e32c72ddc3a19bea12c5a0479a81ee688","name":"Bridge Mutual","symbol":"BMI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13808/thumb/bmi_logo.png?1612009598"},{"chainId":1,"address":"0x910524678c0b1b23ffb9285a81f99c29c11cbaed","name":"Azuki","symbol":"AZUKI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13091/thumb/bdUBSCo.png?1605169403"},{"chainId":1,"address":"0x08130635368aa28b217a4dfb68e1bf8dc525621c","name":"AfroDex","symbol":"AFROX","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/10047/thumb/AfroDex_LOGO.png?1575243022"},{"chainId":1,"address":"0x9a0242b7a33dacbe40edb927834f96eb39f8fbcb","name":"BABB","symbol":"BAX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2168/thumb/babb.png?1547036466"},{"chainId":1,"address":"0xb893a8049f250b57efa8c62d51527a22404d7c9a","name":"American Shiba","symbol":"USHIBA","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15650/thumb/american_shiba.PNG?1621476610"},{"chainId":1,"address":"0x0ec9f76202a7061eb9b3a7d6b59d36215a7e37da","name":"BlackPool Token","symbol":"BPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15887/thumb/uyO7dQzR_400x400.jpg?1622199432"},{"chainId":1,"address":"0x36f3fd68e7325a35eb768f1aedaae9ea0689d723","name":"Empty Set Dollar","symbol":"ESD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12440/thumb/esd_logo_circle.png?1603676421"},{"chainId":1,"address":"0xc0114f14638a333a4d5c3b04f09b96372348a842","name":"Keisuke Inu","symbol":"KEI","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15797/thumb/Keisuke_Inu.png?1621914863"},{"chainId":1,"address":"0xbb97e381f1d1e94ffa2a5844f6875e6146981009","name":"WiBX","symbol":"WBX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11009/thumb/40366569.png?1587104017"},{"chainId":1,"address":"0x2ba592f78db6436527729929aaf6c908497cb200","name":"Cream","symbol":"CREAM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11976/thumb/Cream.png?1596593418"},{"chainId":1,"address":"0xacbd826394189cf2623c6df98a18b41fc8ffc16d","name":"NFTify","symbol":"N1","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16095/thumb/NFTify_200x200.png?1623052405"},{"chainId":1,"address":"0xc3eb2622190c57429aac3901808994443b64b466","name":"ORO","symbol":"ORO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13114/thumb/oro_logo.png?1605338447"},{"chainId":1,"address":"0x1cbb83ebcd552d5ebf8131ef8c9cd9d9bab342bc","name":"Non Fungible Yearn","symbol":"NFY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12766/thumb/NFY_logo.png?1602686886"},{"chainId":1,"address":"0x256845e721c0c46d54e6afbd4fa3b52cb72353ea","name":"UniDollar","symbol":"UNIUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11637/thumb/Unidollar.png?1592272468"},{"chainId":1,"address":"0x57b3140f522a3ef2f98c046f78e0d03075908591","name":"Ethereum Platinum","symbol":"EPLAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16465/thumb/ZAEDT4oU_400x400.jpg?1624264004"},{"chainId":1,"address":"0xfc979087305a826c2b2a0056cfaba50aad3e6439","name":"Dafi Protocol","symbol":"DAFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14428/thumb/Dafi_Black_Icon.png?1616040406"},{"chainId":1,"address":"0x5dc02ea99285e17656b8350722694c35154db1e8","name":"Bonded Finance","symbol":"BOND","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13222/thumb/bonded_finance_logo.png?1606318433"},{"chainId":1,"address":"0x71beff5533dd4c0a47b739da50c56a2dd28633fa","name":"Sheltie Inu","symbol":"SHINU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16403/thumb/shinu-removebg-preview.png?1623914980"},{"chainId":1,"address":"0xc57d533c50bc22247d49a368880fb49a1caa39f7","name":"PowerTrade Fuel","symbol":"PTF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12590/thumb/powertrade_logo.jpg?1600944549"},{"chainId":1,"address":"0xd478161c952357f05f0292b56012cd8457f1cfbf","name":"Polkamarkets","symbol":"POLK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14084/thumb/polkamarkets.jpg?1614179979"},{"chainId":1,"address":"0x0abdace70d3790235af448c88547603b945604ea","name":"district0x","symbol":"DNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/849/thumb/district0x.png?1547223762"},{"chainId":1,"address":"0x1410434b0346f5be678d0fb554e5c7ab620f8f4a","name":"BitKan","symbol":"KAN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4651/thumb/kan-token.png?1547039917"},{"chainId":1,"address":"0x22222c03318440305ac3e8a7820563d6a9fd777f","name":"Clover","symbol":"CLV","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/12888/thumb/clover_logo.png?1603274615"},{"chainId":1,"address":"0xaf9f549774ecedbd0966c52f250acc548d3f36e5","name":"RioDeFi","symbol":"RFUEL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12623/thumb/RFUEL_SQR.png?1602481093"},{"chainId":1,"address":"0xb3319f5d18bc0d84dd1b4825dcde5d5f7266d407","name":"c0x","symbol":"CZRX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10644/thumb/czrx1.JPG?1581390510"},{"chainId":1,"address":"0xb8647e90c0645152fccf4d9abb6b59eb4aa99052","name":"KeyFi","symbol":"KEYFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15098/thumb/keyfi_logo.jpg?1619690054"},{"chainId":1,"address":"0x239dc02a28a0774738463e06245544a72745d5c5","name":"Hanzo Inu","symbol":"HNZO","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15486/thumb/hanzo.PNG?1621038959"},{"chainId":1,"address":"0x3a8d5bc8a8948b68dfc0ce9c14ac4150e083518c","name":"Paralink Network","symbol":"PARA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15789/thumb/para.PNG?1621893038"},{"chainId":1,"address":"0xa1454f9c704af96636f3a7532b9a04c411f85680","name":"BallSwap","symbol":"BSP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14050/thumb/BSP.png?1614397327"},{"chainId":1,"address":"0x159751323a9e0415dd3d6d42a1212fe9f4a0848c","name":"Insured Finance","symbol":"INFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13727/thumb/logo_%287%29.png?1611210296"},{"chainId":1,"address":"0x6ca88cc8d9288f5cad825053b6a1b179b05c76fc","name":"Universal Protocol ","symbol":"UPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10136/thumb/yS35aK0t_400x400_%281%29.jpg?1576191179"},{"chainId":1,"address":"0x20a68f9e34076b2dc15ce726d7eebb83b694702d","name":"DefiVille Island","symbol":"ISLA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14471/thumb/256.png?1616384288"},{"chainId":1,"address":"0x2ab6bb8408ca3199b8fa6c92d5b455f820af03c4","name":"TE FOOD","symbol":"TONE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2325/thumb/tec.png?1547036538"},{"chainId":1,"address":"0x6595b8fd9c920c81500dca94e53cdc712513fb1f","name":"Olyseum","symbol":"OLY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13983/thumb/oly-logo.png?1613461530"},{"chainId":1,"address":"0xe1fc4455f62a6e89476f1072530c20cf1a0622da","name":"Phuture","symbol":"PHTR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16071/thumb/headerIcon.f21db0f7.png?1622767505"},{"chainId":1,"address":"0x4f9254c83eb525f9fcf346490bbb3ed28a81c667","name":"Celer Network","symbol":"CELR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4379/thumb/Celr.png?1554705437"},{"chainId":1,"address":"0xa4bbe66f151b22b167127c770016b15ff97dd35c","name":"Umbria Network","symbol":"UMBR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14712/thumb/RX7VJg6.png?1617891954"},{"chainId":1,"address":"0x8eef5a82e6aa222a60f009ac18c24ee12dbf4b41","name":"Tixl","symbol":"TXL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12432/thumb/Tixl-Logo-200-transparent.png?1610248504"},{"chainId":1,"address":"0xe88f8313e61a97cec1871ee37fbbe2a8bf3ed1e4","name":"Sora Validator Toke","symbol":"VAL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13299/thumb/val-gold-256.png?1607242927"},{"chainId":1,"address":"0xb125cceb9c6e349217d09b069a8d88dbeacf06e5","name":"Animal House","symbol":"AHOUSE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16457/thumb/AH_MONKEY_LOGO_NT.png?1624251312"},{"chainId":1,"address":"0x035df12e0f3ac6671126525f1015e47d79dfeddf","name":"0xMonero","symbol":"0XMR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11035/thumb/0xmnr.PNG?1587357680"},{"chainId":1,"address":"0x21bfbda47a0b4b5b1248c767ee49f7caa9b23697","name":"Ovr","symbol":"OVR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13429/thumb/ovr_logo.png?1608518911"},{"chainId":1,"address":"0x37ee79e0b44866876de2fb7f416d0443dd5ae481","name":"Tatcoin","symbol":"TAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11828/thumb/54098571.png?1594714629"},{"chainId":1,"address":"0x887168120cb89fb06f3e74dc4af20d67df0977f6","name":"Sekuritance","symbol":"SKRT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15495/thumb/skrt.png?1621053881"},{"chainId":1,"address":"0xdb25f211ab05b1c97d595516f45794528a807ad8","name":"STASIS EURO","symbol":"EURS","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/5164/thumb/EURS_300x300.png?1550571779"},{"chainId":1,"address":"0x51e00a95748dbd2a3f47bc5c3b3e7b3f0fea666c","name":"DAOventures","symbol":"DVG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13971/thumb/DAOventures.co_final_icon_200x200.png?1613388224"},{"chainId":1,"address":"0x38e4adb44ef08f22f5b5b76a8f0c2d0dcbe7dca1","name":"PowerPool Concentra","symbol":"CVP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12266/thumb/Powerpool.jpg?1598621373"},{"chainId":1,"address":"0x06af07097c9eeb7fd685c692751d5c66db49c215","name":"Chai","symbol":"CHAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10147/thumb/CHAI.png?1576467289"},{"chainId":1,"address":"0x4791143576c375919d086c35d989feff61d2c390","name":"Scaleswap Token","symbol":"SCA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16360/thumb/thumbnail_1170823958_vertical_logo_lateral_radiance.png?1623810516"},{"chainId":1,"address":"0x5eaa69b29f99c84fe5de8200340b4e9b4ab38eac","name":"Raze Network","symbol":"RAZE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14767/thumb/logo-2.png?1623867120"},{"chainId":1,"address":"0xa1ab427451f19df7445a22dea7073800ea3b687f","name":"Shinigami Inu","symbol":"SHINU","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16365/thumb/SHINU.png?1623818245"},{"chainId":1,"address":"0x02d3a27ac3f55d5d91fb0f52759842696a864217","name":"Charged Particles","symbol":"IONX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15836/thumb/DrKjSQMH_400x400.png?1622080222"},{"chainId":1,"address":"0x1234567461d3f8db7496581774bd869c83d51c93","name":"BitClave","symbol":"CAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1585/thumb/bitclave.png?1547035768"},{"chainId":1,"address":"0xea3983fc6d0fbbc41fb6f6091f68f3e08894dc06","name":"Unido","symbol":"UDO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14176/thumb/unido.jpg?1614792353"},{"chainId":1,"address":"0x70401dfd142a16dc7031c56e862fc88cb9537ce0","name":"Bird Money","symbol":"BIRD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13260/thumb/favicon-180x180.png?1611546646"},{"chainId":1,"address":"0x6dea81c8171d0ba574754ef6f8b412f2ed88c54d","name":"Liquity","symbol":"LQTY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14665/thumb/200-lqty-icon.png?1617631180"},{"chainId":1,"address":"0xfac3f6391c86004289a186ae0198180fcb4d49ab","name":"Alpha Impact","symbol":"IMPACT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16211/thumb/KSyxM0E.png?1623312447"},{"chainId":1,"address":"0x93ed3fbe21207ec2e8f2d3c3de6e058cb73bc04d","name":"Kleros","symbol":"PNK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3833/thumb/kleros.png?1547975322"},{"chainId":1,"address":"0x884ddbb5dc6c2cef77d3e74c6ccca315797d655b","name":"Carnomaly","symbol":"CARR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14403/thumb/tcjOTKE3_400x400.png?1615895296"},{"chainId":1,"address":"0x9b75848172677042269c63365b57b0a51c21d031","name":"Options Market","symbol":"OSM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14562/thumb/OSM_200.png?1617015486"},{"chainId":1,"address":"0x86965a86539e2446f9e72634cefca7983cc21a81","name":"YFISCURITY","symbol":"YFIS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12277/thumb/Logo_YFIS_.png?1598737945"},{"chainId":1,"address":"0x6c3be406174349cfa4501654313d97e6a31072e1","name":"CNNS","symbol":"CNNS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8362/thumb/cnns.png?1557992686"},{"chainId":1,"address":"0xa4f779074850d320b5553c9db5fc6a8ab15bd34a","name":"YFIX finance","symbol":"YFIX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12554/thumb/yfix-icon-200.png?1600739144"},{"chainId":1,"address":"0x037a54aab062628c9bbae1fdb1583c195585fe41","name":"LCX","symbol":"LCX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9985/thumb/zRPSu_0o_400x400.jpg?1574327008"},{"chainId":1,"address":"0x8642a849d0dcb7a15a974794668adcfbe4794b56","name":"Prosper","symbol":"PROS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13668/thumb/heD6cg22l3sF5VgPh4G1xC6lnKEWXJif-jbaqUpv8CDP6jbWaqn9UjBdkXWNrw1CewaQOxb8zXRdNeNJWWiUDjfsEl_d7E3bPLg4cFoilQF5TGKHfWyJlnpm3UYc9ytvRvOjxOevMuiu8-lusnNoOcwgsJpMkYWHqe322GAxLt0_30kFMVAcjEDUrOlkK6hUYi0m9P433mvNlOm.jpg?1610671732"},{"chainId":1,"address":"0xb1f871ae9462f1b2c6826e88a7827e76f86751d4","name":"GNY","symbol":"GNY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5300/thumb/icon_gny.jpg?1601926183"},{"chainId":1,"address":"0xaa2409594dc0aef63c0f367e30f6b51149cbe613","name":"Space Doge","symbol":"SPACEDOGE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/14992/thumb/space_doge_logo.jpg?1619342675"},{"chainId":1,"address":"0x1681bcb589b3cfcf0c0616b0ce9b19b240643dc1","name":"Island Coin","symbol":"ISLE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15835/thumb/ISLE200.png__alt__ISLE200.png?1622079141"},{"chainId":1,"address":"0x08d967bb0134f2d07f7cfb6e246680c53927dd30","name":"MATH","symbol":"MATH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11335/thumb/2020-05-19-token-200.png?1589940590"},{"chainId":1,"address":"0x5e3346444010135322268a4630d2ed5f8d09446c","name":"LockTrip","symbol":"LOC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1357/thumb/LOC_Transparent_New.png?1579491094"},{"chainId":1,"address":"0xb6ee9668771a79be7967ee29a63d4184f8097143","name":"CargoX","symbol":"CXO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2580/thumb/cargox.png?1547738832"},{"chainId":1,"address":"0x8b3192f5eebd8579568a2ed41e6feb402f93f73f","name":"Saitama Inu","symbol":"SAITAMA","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16353/thumb/ILpdnOmQ.png?1623805879"},{"chainId":1,"address":"0x72ca0501427bb8f089c1c4f767cb17d017e803a9","name":"Liquid DeFi","symbol":"LIQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13107/thumb/liquid_defi_logo.jpg?1605247848"},{"chainId":1,"address":"0x217ddead61a42369a266f1fb754eb5d3ebadc88a","name":"Don key","symbol":"DON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15482/thumb/donkey_logo.jpg?1621012824"},{"chainId":1,"address":"0xa2085073878152ac3090ea13d1e41bd69e60dc99","name":"Escoin Token","symbol":"ELG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13566/thumb/escoin-200.png?1609833886"},{"chainId":1,"address":"0x17e6616c45d267bc20a9892b58a01621c592b72d","name":"Ethereum Message Se","symbol":"EMS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9783/thumb/ems.png?1578974895"},{"chainId":1,"address":"0xe4ae84448db5cfe1daf1e6fb172b469c161cb85f","name":"Utopia Genesis Foun","symbol":"UOP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13428/thumb/logo_%2830%29.png?1608518506"},{"chainId":1,"address":"0x6fe56c0bcdd471359019fcbc48863d6c3e9d4f41","name":"Props Token","symbol":"PROPS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6735/thumb/photo-2017-10-10-03-32-02.png?1595168186"},{"chainId":1,"address":"0xc63b8ecce56ab9c46184ec6ab85e4771fea4c8ad","name":"sGOOG","symbol":"SGOOG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14951/thumb/sGOOG.png?1619129282"},{"chainId":1,"address":"0x6251e725cd45fb1af99354035a414a2c0890b929","name":"MixTrust","symbol":"MXT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12148/thumb/MXT_LOGO_200_200.png?1597578983"},{"chainId":1,"address":"0x417ffdbc285dd2c4dc00937798ab901634137caa","name":"BlackFisk","symbol":"BLFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13893/thumb/logo_%2891%29.png?1612561370"},{"chainId":1,"address":"0x2f4eb47a1b1f4488c71fc10e39a4aa56af33dd49","name":"UNCL","symbol":"UNCL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13102/thumb/uncl_logo.png?1605230945"},{"chainId":1,"address":"0x9205c049c231dda51bace0ba569f047e3e1e9979","name":"Latamcash","symbol":"LMCH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10999/thumb/a2RfSSOz_400x400.jpg?1587027551"},{"chainId":1,"address":"0xf3ae5d769e153ef72b4e3591ac004e89f48107a1","name":"Deeper Network","symbol":"DPR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14748/thumb/deeper.png?1618094356"},{"chainId":1,"address":"0xa44e5137293e855b1b7bc7e2c6f8cd796ffcb037","name":"Sentinel OLD ","symbol":"DVPN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/3625/thumb/Sentinel_512X512.png?1622174555"},{"chainId":1,"address":"0xc666081073e8dff8d3d1c2292a29ae1a2153ec09","name":"Digitex Token","symbol":"DGTX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2188/thumb/DGTX.png?1616385887"},{"chainId":1,"address":"0x96c645d3d3706f793ef52c19bbace441900ed47d","name":"Mt Pelerin Shares","symbol":"MPS","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/11471/thumb/MPS.png?1590319120"},{"chainId":1,"address":"0x8b40761142b9aa6dc8964e61d0585995425c3d94","name":"Tripio","symbol":"TRIO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4648/thumb/tripio-logo.jpg?1547039914"},{"chainId":1,"address":"0x1dd80016e3d4ae146ee2ebb484e8edd92dacc4ce","name":"Lead Token","symbol":"LEAD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12384/thumb/lead.jpg?1599491466"},{"chainId":1,"address":"0x115ec79f1de567ec68b7ae7eda501b406626478e","name":"Carry","symbol":"CRE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3994/thumb/Carry.png?1592402610"},{"chainId":1,"address":"0x2f109021afe75b949429fe30523ee7c0d5b27207","name":"OccamFi","symbol":"OCC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14801/thumb/occfi.PNG?1618531140"},{"chainId":1,"address":"0xbebdab6da046bc49ffbb61fbd7b33157eb270d05","name":"Shard Coin","symbol":"SHARD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3527/thumb/8680493537c30f81917d034613b289e9.png?1547038326"},{"chainId":1,"address":"0xe75ad3aab14e4b0df8c5da4286608dabb21bd864","name":"Acute Angle Cloud","symbol":"AAC","decimals":5,"logoURI":"https://assets.coingecko.com/coins/images/2577/thumb/acute-angle-cloud.png?1547036708"},{"chainId":1,"address":"0xca0e7269600d353f70b14ad118a49575455c0f2f","name":"AMLT Network","symbol":"AMLT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2703/thumb/amlt.png?1563794756"},{"chainId":1,"address":"0x68cfb82eacb9f198d508b514d898a403c449533e","name":"Credmark","symbol":"CMK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16305/thumb/Credmark.png?1623720167"},{"chainId":1,"address":"0x34364bee11607b1963d66bca665fde93fca666a8","name":"YOU Chain","symbol":"YOU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4649/thumb/youchain-logo.jpg?1547039915"},{"chainId":1,"address":"0xd5525d397898e5502075ea5e830d8914f6f0affe","name":"Meme","symbol":"MEME","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12140/thumb/meme-coin.jpeg?1619249191"},{"chainId":1,"address":"0xd945d2031b4c63c0e363304fb771f709b502dc0a","name":"BountyMarketCap","symbol":"BMC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13472/thumb/bmc-logo-200.png?1608852915"},{"chainId":1,"address":"0x922105fad8153f516bcfb829f56dc097a0e1d705","name":"Yee","symbol":"YEE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2576/thumb/YeeCo-logo.png?1598519113"},{"chainId":1,"address":"0xe36e2d3c7c34281fa3bc737950a68571736880a1","name":"sADA","symbol":"SADA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11622/thumb/sADA.png?1616148250"},{"chainId":1,"address":"0x61bfc979ea8160ede9b862798b7833a97bafa02a","name":"RELEASE","symbol":"REL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5387/thumb/release.jpg?1547041000"},{"chainId":1,"address":"0x0275e1001e293c46cfe158b3702aade0b99f88a5","name":"Oiler","symbol":"OIL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15249/thumb/oiler.png?1620237607"},{"chainId":1,"address":"0x264dc2dedcdcbb897561a57cba5085ca416fb7b4","name":"QunQun","symbol":"QUN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2546/thumb/qunqun.png?1547036662"},{"chainId":1,"address":"0xbc81bf5b3173bccdbe62dba5f5b695522ad63559","name":"Transmute","symbol":"XPB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13743/thumb/lead-03.png?1611376298"},{"chainId":1,"address":"0x1fcdce58959f536621d76f5b7ffb955baa5a672f","name":"ForTube","symbol":"FOR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8242/thumb/for.png?1606195375"},{"chainId":1,"address":"0x6fcb6408499a7c0f242e32d77eb51ffa1dd28a7e","name":"HydraDX","symbol":"XHDX","decimals":12,"logoURI":"https://assets.coingecko.com/coins/images/13929/thumb/hydradx_logo.png?1612877025"},{"chainId":1,"address":"0x846c66cf71c43f80403b51fe3906b3599d63336f","name":"PumaPay","symbol":"PMA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2307/thumb/pumapay_dark_rounded_256x256.png?1622176373"},{"chainId":1,"address":"0x95a4492f028aa1fd432ea71146b433e7b4446611","name":"APY Finance","symbol":"APY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13041/thumb/1*AvkD-OLocausbxqUzezZ0A.png?1604577922"},{"chainId":1,"address":"0xcaaa93712bdac37f736c323c93d4d5fdefcc31cc","name":"CRD Network","symbol":"CRD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2859/thumb/CRD.png?1623397651"},{"chainId":1,"address":"0xff603f43946a3a28df5e6a73172555d8c8b02386","name":"OneRoot Network","symbol":"RNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2520/thumb/OneRootNetwork.PNG?1558014608"},{"chainId":1,"address":"0x1a3496c18d558bd9c6c8f609e1b129f67ab08163","name":"DEAPCOIN","symbol":"DEP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10970/thumb/DEAPcoin_01.png?1586741677"},{"chainId":1,"address":"0x12fd19dac0fab61bed5e0f09091b470c452d4d61","name":"Echoin","symbol":"EC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9354/thumb/L32_KzNQ_400x400.jpg?1566513096"},{"chainId":1,"address":"0x9cec686ba6f07d6135b2091140c795166ef5b761","name":"GivingToServices","symbol":"SVCS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8763/thumb/SVCS_Ticker_logo_.png?1611590501"},{"chainId":1,"address":"0xeb9a4b185816c354db92db09cc3b50be60b901b6","name":"Origin Sport","symbol":"ORS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4646/thumb/origin-sport-logo.png?1547039912"},{"chainId":1,"address":"0xf55a93b613d172b86c2ba3981a849dae2aecde2f","name":"Your Futures Exchan","symbol":"YFX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15654/thumb/yfx.PNG?1621478455"},{"chainId":1,"address":"0x4cf89ca06ad997bc732dc876ed2a7f26a9e7f361","name":"Mysterium","symbol":"MYST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/757/thumb/mysterium.png?1547034503"},{"chainId":1,"address":"0x00aba6fe5557de1a1d565658cbddddf7c710a1eb","name":"EasyFi V2","symbol":"EZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12742/thumb/Logo_Icon.png?1624471467"},{"chainId":1,"address":"0x6c929cde908481f3d1d775008791f42b1b89dbb0","name":"Boolean","symbol":"BOOL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9888/thumb/booleanSiteLogo.png?1572943862"},{"chainId":1,"address":"0x1341a2257fa7b770420ef70616f888056f90926c","name":"Zoo Token","symbol":"ZOOT","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15629/thumb/gyzERsO.png?1621394316"},{"chainId":1,"address":"0x7b0c06043468469967dba22d1af33d77d44056c8","name":"Morpheus Network","symbol":"MRPH","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/2379/thumb/MRPH_.png?1612252243"},{"chainId":1,"address":"0xcf282ba0bc91d2aa6e775bcfd90da6b7912f1b1a","name":"Yearn Ethereum Fina","symbol":"YEFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13501/thumb/yefi-logo.png?1609195663"},{"chainId":1,"address":"0xfa5047c9c78b8877af97bdcb85db743fd7313d4a","name":"KeeperDAO","symbol":"ROOK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13005/thumb/keeper_dao_logo.jpg?1604316506"},{"chainId":1,"address":"0x99295f1141d58a99e939f7be6bbe734916a875b8","name":"LinkPool","symbol":"LPL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14548/thumb/linkpool-logo-256x256.png?1616988567"},{"chainId":1,"address":"0x9506d37f70eb4c3d79c398d326c871abbf10521d","name":"Media Licensing Tok","symbol":"MLT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15659/thumb/milc_200x200.png?1621511031"},{"chainId":1,"address":"0xe1c7e30c42c24582888c758984f6e382096786bd","name":"Curate","symbol":"XCUR","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13327/thumb/400x400_%281%29_%283%29_%282%29.png?1613998208"},{"chainId":1,"address":"0xc03841b5135600312707d39eb2af0d2ad5d51a91","name":"BasketCoin","symbol":"BSKT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14766/thumb/BasketCoin_logo_light-250x250_wbg.png?1618306694"},{"chainId":1,"address":"0x2c9023bbc572ff8dc1228c7858a280046ea8c9e5","name":"VideoCoin","symbol":"VID","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3376/thumb/Dark.png?1589435901"},{"chainId":1,"address":"0x7c2e5b7ec572199d3841f6a38f7d4868bd0798f1","name":"Havy","symbol":"HAVY","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6043/thumb/havy.png?1547041989"},{"chainId":1,"address":"0x5cf04716ba20127f1e2297addcf4b5035000c9eb","name":"NKN","symbol":"NKN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3375/thumb/nkn.png?1548329212"},{"chainId":1,"address":"0xdfc3829b127761a3218bfcee7fc92e1232c9d116","name":"PRCY Coin","symbol":"PRCY","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/14151/thumb/prcy.png?1614666991"},{"chainId":1,"address":"0x1847e59d9c2f30c7fe0347ba3e53da1ae8a7f0e8","name":"NFTA","symbol":"NFTA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16208/thumb/nfta_logo.png?1623322788"},{"chainId":1,"address":"0x155040625d7ae3e9cada9a73e3e44f76d3ed1409","name":"Revomon","symbol":"REVO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14759/thumb/revomon.jpeg?1618243538"},{"chainId":1,"address":"0x944eee930933be5e23b690c8589021ec8619a301","name":"Munch Token","symbol":"MUNCH","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/14804/thumb/logo_-_2021-04-16T082627.266.png?1618532828"},{"chainId":1,"address":"0x871baed4088b863fd6407159f3672d70cd34837d","name":"3X Long Ethereum To","symbol":"ETHBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10163/thumb/683JEXMN_400x400_%281%29.png?1576504568"},{"chainId":1,"address":"0xc08512927d12348f6620a698105e1baac6ecd911","name":"GYEN","symbol":"GYEN","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/14191/thumb/icon_gyen_200_200.png?1614843343"},{"chainId":1,"address":"0x8b6c3b7c01d9db4393f9aa734750f36df1543e9a","name":"Vid","symbol":"VI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10978/thumb/VI.png?1614827801"},{"chainId":1,"address":"0x0e2ef8aecb3c01ad5d596f1b67134e178199984d","name":"LandBox","symbol":"LAND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14875/thumb/jmKvZDn7_400x400.jpg?1618826129"},{"chainId":1,"address":"0x3479b0acf875405d7853f44142fe06470a40f6cc","name":"Value USD","symbol":"VUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13887/thumb/logo.png?1612864004"},{"chainId":1,"address":"0xc17fbe1d709ddf6c0b6665dd0591046815ac7554","name":"Polars Governance T","symbol":"POL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16285/thumb/LOGO-CMC.png?1623655463"},{"chainId":1,"address":"0xf063fe1ab7a291c5d06a86e14730b00bf24cb589","name":"DxSale Network","symbol":"SALE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12250/thumb/dx-light.png?1613965390"},{"chainId":1,"address":"0x27054b13b1b798b345b591a4d22e6562d47ea75a","name":"AirSwap","symbol":"AST","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/1019/thumb/AST.png?1547034939"},{"chainId":1,"address":"0xec5483804e637d45cde22fa0869656b64b5ab1ab","name":"Acent","symbol":"ACE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15211/thumb/acent-logo.png?1620108963"},{"chainId":1,"address":"0xd98f75b1a3261dab9eed4956c93f33749027a964","name":"ShareToken","symbol":"SHR","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/3609/thumb/74586729_2443914875881351_2785018663453851648_n.png?1574898410"},{"chainId":1,"address":"0xe4f6d46c244bb7cf3e218cdfb5c35cf9a4d9c920","name":"Donkey","symbol":"DONK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15330/thumb/donkey_logo.jpg?1620549377"},{"chainId":1,"address":"0xbd1848e1491d4308ad18287a745dd4db2a4bd55b","name":"Mochi Market","symbol":"MOMA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14993/thumb/mochi.PNG?1619390399"},{"chainId":1,"address":"0xdf801468a808a32656d2ed2d2d80b72a129739f4","name":"Somnium Space CUBEs","symbol":"CUBE","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10687/thumb/CUBE_icon.png?1617026861"},{"chainId":1,"address":"0x6d0f5149c502faf215c89ab306ec3e50b15e2892","name":"Portion","symbol":"PRT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13617/thumb/OKeO2FI.png?1610327038"},{"chainId":1,"address":"0xaec7e1f531bb09115103c53ba76829910ec48966","name":"Blank","symbol":"BLANK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14209/thumb/blank.png?1614940842"},{"chainId":1,"address":"0x9355372396e3f6daf13359b7b607a3374cc638e0","name":"WHALE","symbol":"WHALE","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/11797/thumb/WHALE.png?1595004706"},{"chainId":1,"address":"0xdb05ea0877a2622883941b939f0bb11d1ac7c400","name":"Opacity","symbol":"OPCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7237/thumb/Opacity.jpg?1551843524"},{"chainId":1,"address":"0x485d17a6f1b8780392d53d64751824253011a260","name":"chrono tech","symbol":"TIME","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/604/thumb/TIMEsymbol200x200.png?1572093177"},{"chainId":1,"address":"0x793786e2dd4cc492ed366a94b88a3ff9ba5e7546","name":"Axia","symbol":"AXIAV3","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12906/thumb/axia_200x200.png?1613988058"},{"chainId":1,"address":"0xaaca86b876ca011844b5798eca7a67591a9743c8","name":"0x nodes","symbol":"BIOS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15600/thumb/BIOS_01.png?1621737736"},{"chainId":1,"address":"0x635d081fd8f6670135d8a3640e2cf78220787d56","name":"Add xyz NEW ","symbol":"ADD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14351/thumb/ADDBK.png?1622444542"},{"chainId":1,"address":"0xcbdf1deb934e945a70b7289bb98e97013777f820","name":"Doge of Woof Street","symbol":"WSDOGE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15498/thumb/wsdoge.png?1621069303"},{"chainId":1,"address":"0x37e1160184f7dd29f00b78c050bf13224780b0b0","name":"Yuan Chain Coin","symbol":"YCC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5328/thumb/G5gCEo-J_400x400.jpg?1547040897"},{"chainId":1,"address":"0x9c405acf8688afb61b3197421cdeec1a266c6839","name":"DogeYield","symbol":"DOGY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13734/thumb/dogy200px.png?1611266985"},{"chainId":1,"address":"0x0202be363b8a4820f3f4de7faf5224ff05943ab1","name":"UniLend Finance","symbol":"UFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12819/thumb/UniLend_Finance_logo_PNG.png?1602748658"},{"chainId":1,"address":"0xeef9f339514298c6a857efcfc1a762af84438dee","name":"Hermez Network","symbol":"HEZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12826/thumb/hermez_logo.png?1602826556"},{"chainId":1,"address":"0x0c37bcf456bc661c14d596683325623076d7e283","name":"Aeron","symbol":"ARNX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1124/thumb/ARNX-token-logo-256x256.png?1602652111"},{"chainId":1,"address":"0xe6c3502997f97f9bde34cb165fbce191065e068f","name":"Klondike BTC","symbol":"KBTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13789/thumb/klondike.jpg?1611759492"},{"chainId":1,"address":"0xd46df541148932690b81092f600f35208afd4325","name":"Prism Network","symbol":"PRISM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15137/thumb/logo-prism-network.png?1619771407"},{"chainId":1,"address":"0x557b933a7c2c45672b610f8954a3deb39a51a8ca","name":"REVV","symbol":"REVV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12373/thumb/Nxy8QwOU.png?1599385982"},{"chainId":1,"address":"0x73374ea518de7addd4c2b624c0e8b113955ee041","name":"Juggernaut","symbol":"JGN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12761/thumb/juggernaut_logo.png?1602428976"},{"chainId":1,"address":"0xefc1c73a3d8728dc4cf2a18ac5705fe93e5914ac","name":"MetricExchange","symbol":"METRIC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12664/thumb/metric_exchange_logo.png?1601453711"},{"chainId":1,"address":"0x993864e43caa7f7f12953ad6feb1d1ca635b875f","name":"SingularityDAO","symbol":"SDAO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15385/thumb/singularitydao_coinmarketcap.png?1620701215"},{"chainId":1,"address":"0x0b342c51d1592c41068d5d4b4da4a68c0a04d5a4","name":"OneSwap DAO Token","symbol":"ONES","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12552/thumb/logo.png?1600682344"},{"chainId":1,"address":"0xad5fe5b0b8ec8ff4565204990e4405b2da117d8e","name":"TronClassic","symbol":"TRXC","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/4626/thumb/trxc.png?1547039893"},{"chainId":1,"address":"0xbf52f2ab39e26e0951d2a02b49b7702abe30406a","name":"ODEM","symbol":"ODE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3752/thumb/odem.png?1548329893"},{"chainId":1,"address":"0x32a7c02e79c4ea1008dd6564b35f131428673c41","name":"Crust Network","symbol":"CRU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12549/thumb/sAB3KVzD_400x400.jpg?1600680411"},{"chainId":1,"address":"0x69275ac5477f3a9dc051180bc559140bc647f8e9","name":"Apple Finance","symbol":"APLP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13559/thumb/8vx3u6M4_400x400.jpg?1609807070"},{"chainId":1,"address":"0x26e75307fc0c021472feb8f727839531f112f317","name":"CRYPTO20","symbol":"C20","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2097/thumb/c20.png?1547036413"},{"chainId":1,"address":"0x3a82d3111ab5faf39d847d46023d9090261a658f","name":"Tycoon","symbol":"TYC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15165/thumb/coingecko.png?1622177525"},{"chainId":1,"address":"0x4297394c20800e8a38a619a243e9bbe7681ff24e","name":"Hot Cross","symbol":"HOTCROSS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15706/thumb/image.png?1621580285"},{"chainId":1,"address":"0xba50933c268f567bdc86e1ac131be072c6b0b71a","name":"ARPA Chain","symbol":"ARPA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8506/thumb/9u0a23XY_400x400.jpg?1559027357"},{"chainId":1,"address":"0x9e3319636e2126e3c0bc9e3134aec5e1508a46c7","name":"Universa","symbol":"UTNP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2981/thumb/universa.png?1547037236"},{"chainId":1,"address":"0x64fb96d0395f6bf105f35233911e3df2c5bf4ce8","name":"Elastic Bitcoin","symbol":"XBT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13911/thumb/xbt-200x200.png?1612835246"},{"chainId":1,"address":"0xfe9a29ab92522d14fc65880d817214261d8479ae","name":"Snowswap","symbol":"SNOW","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12751/thumb/uQBJL3A.png?1602237225"},{"chainId":1,"address":"0x77607588222e01bf892a29abab45796a2047fc7b","name":"Unagii ETH","symbol":"UETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14624/thumb/uETH.png?1617294107"},{"chainId":1,"address":"0xbf15797bb5e47f6fb094a4abdb2cfc43f77179ef","name":"Klondike Finance v2","symbol":"KLONX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14508/thumb/WPQvZkDk_400x400.jpg?1616578143"},{"chainId":1,"address":"0xeb953eda0dc65e3246f43dc8fa13f35623bdd5ed","name":"Rainicorn","symbol":"RAINI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14491/thumb/raini-pixel-200.png?1616487155"},{"chainId":1,"address":"0x5ca381bbfb58f0092df149bd3d243b08b9a8386e","name":"MXC","symbol":"MXC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4604/thumb/MXC-app-icon10242x.png?1597628240"},{"chainId":1,"address":"0x74232704659ef37c08995e386a2e26cc27a8d7b1","name":"Strike","symbol":"STRK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14607/thumb/Jw-36llq_400x400.jpg?1617243607"},{"chainId":1,"address":"0x695106ad73f506f9d0a9650a78019a93149ae07c","name":"BNS Token","symbol":"BNS","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11926/thumb/HS7eNJdt_400x400.jpg?1596170654"},{"chainId":1,"address":"0x87761e886399ef8e1624cb0db3230b075a322c88","name":"Crossing the Yellow","symbol":"CBK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16809/thumb/78275134.png?1625138551"},{"chainId":1,"address":"0x42476f744292107e34519f9c357927074ea3f75d","name":"Loom Network NEW ","symbol":"LOOM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14735/thumb/LOOM.png?1617967111"},{"chainId":1,"address":"0x254417f7b56328a48f554b173dca7bdda7a2a0d2","name":"Simba Token","symbol":"SIMBA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16060/thumb/200x200_%2819%29.png?1622710548"},{"chainId":1,"address":"0x9b00e6e8d787b13756eb919786c9745054db64f9","name":"Sienna ERC 20 ","symbol":"WSIENNA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15420/thumb/sienna.jpeg?1620782072"},{"chainId":1,"address":"0x6e9730ecffbed43fd876a264c982e254ef05a0de","name":"Nord Finance","symbol":"NORD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13630/thumb/nord.jpg?1610465136"},{"chainId":1,"address":"0xd291e7a03283640fdc51b121ac401383a46cc623","name":"Rari Governance Tok","symbol":"RGT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12900/thumb/Rari_Logo_Transparent.png?1613978014"},{"chainId":1,"address":"0xb056c38f6b7dc4064367403e26424cd2c60655e1","name":"CEEK Smart VR Token","symbol":"CEEK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2581/thumb/ceek-smart-vr-token-logo.png?1547036714"},{"chainId":1,"address":"0x3aada3e213abf8529606924d8d1c55cbdc70bf74","name":"XMON","symbol":"XMON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14008/thumb/xmon_logo.png?1613615094"},{"chainId":1,"address":"0xba11d00c5f74255f56a5e366f4f77f5a186d7f55","name":"Band Protocol","symbol":"BAND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9545/thumb/Band_token_blue_violet_token.png?1625881431"},{"chainId":1,"address":"0xfc0d6cf33e38bce7ca7d89c0e292274031b7157a","name":"Netvrk","symbol":"NTVRK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15721/thumb/logo-h.png?1621635084"},{"chainId":1,"address":"0xc969e16e63ff31ad4bcac3095c616644e6912d79","name":"Seed Venture","symbol":"SEED","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10860/thumb/Seed.png?1585204998"},{"chainId":1,"address":"0x056fd409e1d7a124bd7017459dfea2f387b6d5cd","name":"Gemini Dollar","symbol":"GUSD","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/5992/thumb/gemini-dollar-gusd.png?1536745278"},{"chainId":1,"address":"0xed30dd7e50edf3581ad970efc5d9379ce2614adb","name":"ARC Governance Old","symbol":"ARCX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14459/thumb/arcx_logo.jpg?1616221058"},{"chainId":1,"address":"0x29cbd0510eec0327992cd6006e63f9fa8e7f33b7","name":"Tidal Finance","symbol":"TIDAL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14460/thumb/Tidal-mono.png?1616233894"},{"chainId":1,"address":"0xd4ca5c2aff1eefb0bea9e9eab16f88db2990c183","name":"XRP Classic","symbol":"XRPC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7259/thumb/xrpc.png?1572011410"},{"chainId":1,"address":"0x7866e48c74cbfb8183cd1a929cd9b95a7a5cb4f4","name":"DexKit","symbol":"KIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13187/thumb/dexkit_logo.png?1606093850"},{"chainId":1,"address":"0xab456bdb0a373bbac6c4a76176e9f159cacd5752","name":"Society of Galactic","symbol":"SGE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15819/thumb/XS-SGE-LOGO-2.png?1621983037"},{"chainId":1,"address":"0xf29e46887ffae92f1ff87dfe39713875da541373","name":"UniCrypt Old ","symbol":"UNC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11782/thumb/200x200_%289%29.png?1593999474"},{"chainId":1,"address":"0x1e18821e69b9faa8e6e75dffe54e7e25754beda0","name":"KIMCHI finance","symbol":"KIMCHI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12302/thumb/VBa2Z60o_400x400.png?1598982471"},{"chainId":1,"address":"0xbb1f24c0c1554b9990222f036b0aad6ee4caec29","name":"CryptoSoul","symbol":"SOUL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6723/thumb/cryptosoul.png?1547042952"},{"chainId":1,"address":"0x6243d8cea23066d098a15582d81a598b4e8391f4","name":"Reflexer Ungovernan","symbol":"FLX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14123/thumb/EAfYdwgd_400x400.jpg?1614564508"},{"chainId":1,"address":"0xf433089366899d83a9f26a773d59ec7ecf30355e","name":"Metal","symbol":"MTL","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/763/thumb/Metal.png?1592195010"},{"chainId":1,"address":"0xf418588522d5dd018b425e472991e52ebbeeeeee","name":"Ethereum Push Notif","symbol":"PUSH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14769/thumb/epns_logo.jpg?1618330344"},{"chainId":1,"address":"0x261efcdd24cea98652b9700800a13dfbca4103ff","name":"sXAU","symbol":"SXAU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11559/thumb/sXAU.png?1616150843"},{"chainId":1,"address":"0xe1afe1fd76fd88f78cbf599ea1846231b8ba3b6b","name":"sDEFI","symbol":"SDEFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11832/thumb/sDEFI.png?1616150059"},{"chainId":1,"address":"0x9631483f28b7f5cbf7d435ab249be8f709215bc3","name":"Sperax","symbol":"SPA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12232/thumb/sperax_logo.jpg?1598342904"},{"chainId":1,"address":"0xbbff34e47e559ef680067a6b1c980639eeb64d24","name":"Leverj Gluon","symbol":"L2","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12950/thumb/Gluon256x256.png?1604048379"},{"chainId":1,"address":"0xa7de087329bfcda5639247f96140f9dabe3deed1","name":"Statera","symbol":"STA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11472/thumb/Statera.png?1590415353"},{"chainId":1,"address":"0xc77b230f31b517f1ef362e59c173c2be6540b5e8","name":"VIDY","symbol":"VIDY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5088/thumb/vidy-logo.jpg?1547040486"},{"chainId":1,"address":"0xb6c4267c4877bb0d6b1685cfd85b0fbe82f105ec","name":"Relevant","symbol":"REL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11586/thumb/Relevant.png?1591390081"},{"chainId":1,"address":"0xd5147bc8e386d91cc5dbe72099dac6c9b99276f5","name":"renFIL","symbol":"RENFIL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13375/thumb/renFIL.png?1608014942"},{"chainId":1,"address":"0x6781a0f84c7e9e846dcb84a9a5bd49333067b104","name":"Zap","symbol":"ZAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2180/thumb/zap.png?1547036476"},{"chainId":1,"address":"0x0e58ed58e150dba5fd8e5d4a49f54c7e1e880124","name":"Relite Finance","symbol":"RELI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14906/thumb/xPZRuspj_400x400.jpg?1618983798"},{"chainId":1,"address":"0x6bffa07a1b0cebc474ce6833eaf2be6326252449","name":"BAEPAY","symbol":"BAEPAY","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/13101/thumb/baepay_logo.png?1605150696"},{"chainId":1,"address":"0x90de74265a416e1393a450752175aed98fe11517","name":"Unlock Protocol","symbol":"UDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14545/thumb/unlock.jpg?1616948136"},{"chainId":1,"address":"0x0538a9b4f4dcb0cb01a7fa34e17c0ac947c22553","name":"OptionRoom Governan","symbol":"COURT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15467/thumb/court.png?1620915482"},{"chainId":1,"address":"0x1796ae0b0fa4862485106a0de9b654efe301d0b2","name":"Polychain Monsters","symbol":"PMON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14604/thumb/polkamon.png?1617238350"},{"chainId":1,"address":"0x45af324f53a8d7da1752dad74adc1748126d7978","name":"MyTVchain","symbol":"MYTV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7026/thumb/MYTV-200x200.png?1585697417"},{"chainId":1,"address":"0x4c11249814f11b9346808179cf06e71ac328c1b5","name":"Oraichain Token","symbol":"ORAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12931/thumb/2000x2000_azfsy0.png?1603696770"},{"chainId":1,"address":"0x16eccfdbb4ee1a85a33f3a9b21175cd7ae753db4","name":"Router Protocol","symbol":"ROUTE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13709/thumb/route_token_200x200-19.png?1611057698"},{"chainId":1,"address":"0x1735db6ab5baa19ea55d0adceed7bcdc008b3136","name":"UREEQA","symbol":"URQA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14605/thumb/R_O2enOX_400x400.png?1617243310"},{"chainId":1,"address":"0xd9c2d319cd7e6177336b0a9c93c21cb48d84fb54","name":"HAPI","symbol":"HAPI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14298/thumb/R9i2HjAL_400x400.jpg?1615332438"},{"chainId":1,"address":"0xc4c2614e694cf534d407ee49f8e44d125e4681c4","name":"Chain Games","symbol":"CHAIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12257/thumb/chain-logo-centered-500x500.png?1599617244"},{"chainId":1,"address":"0x8cb924583681cbfe487a62140a994a49f833c244","name":"Swapp","symbol":"SWAPP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16216/thumb/swapp-transparent-background-200x200-1.png?1623315904"},{"chainId":1,"address":"0xf5238462e7235c7b62811567e63dd17d12c2eaa0","name":"CACHE Gold","symbol":"CGT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11601/thumb/cache-gold-icon-200x200.png?1591755874"},{"chainId":1,"address":"0x9d47894f8becb68b9cf3428d256311affe8b068b","name":"Rope","symbol":"ROPE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12567/thumb/Rope_Icon.jpg?1604038203"},{"chainId":1,"address":"0x3ea50b7ef6a7eaf7e966e2cb72b519c16557497c","name":"Rocket Bunny","symbol":"BUNNY","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/14350/thumb/n8TgW06A_400x400.jpg?1615514406"},{"chainId":1,"address":"0xb4d930279552397bba2ee473229f89ec245bc365","name":"MahaDAO","symbol":"MAHA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13404/thumb/MAHA_Token.png?1625651604"},{"chainId":1,"address":"0x6d6506e6f438ede269877a0a720026559110b7d5","name":"BONK Token","symbol":"BONK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11942/thumb/2Updated_2x.png?1598511690"},{"chainId":1,"address":"0xed0889f7e1c7c7267407222be277e1f1ef4d4892","name":"Melalie","symbol":"MEL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15028/thumb/melalie.PNG?1619494266"},{"chainId":1,"address":"0x5a705745373a780814c379ef17810630d529efe0","name":"Project Senpai","symbol":"SENPAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14702/thumb/mrWvpa_J_400x400.jpg?1617849859"},{"chainId":1,"address":"0x6051c1354ccc51b4d561e43b02735deae64768b8","name":"yRise Finance","symbol":"YRISE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12853/thumb/logoyrise-200px.png?1603084410"},{"chainId":1,"address":"0x27c1ba4f85b8dc1c150157816623a6ce80b7f187","name":"3X Long XRP Token","symbol":"XRPBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10211/thumb/683JEXMN_400x400_%281%29.png?1576535641"},{"chainId":1,"address":"0x0cdf9acd87e940837ff21bb40c9fd55f68bba059","name":"Public Mint","symbol":"MINT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14106/thumb/Public_Mint_Icon_200x200.png?1614333027"},{"chainId":1,"address":"0xd520ddbdf81323f4b9a0ea0adbb692ebef6ce280","name":"Holdefi","symbol":"HLD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16739/thumb/Logo_-_2021-06-28T163823.177.png?1624869509"},{"chainId":1,"address":"0xb551d08d2189ef67b4788be2c35c0743693625ca","name":"EAutocoin","symbol":"ATO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7132/thumb/ato.png?1547043631"},{"chainId":1,"address":"0x1763ad73694d4d64fb71732b068e32ac72a345b1","name":"BEE Coin","symbol":"BEE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10853/thumb/Xg9uPrki_400x400.jpg?1585523253"},{"chainId":1,"address":"0x64a60493d888728cf42616e034a0dfeae38efcf0","name":"OneLedger","symbol":"OLT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3422/thumb/One_Ledger.jpeg?1547038108"},{"chainId":1,"address":"0x19a2cf2a1b2f76e52e2b0c572bd80a95b4fa8643","name":"Fyooz NFT","symbol":"FYZNFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13989/thumb/fyznft.png?1613519992"},{"chainId":1,"address":"0x8f87ec6aad3b2a8c44f1298a1af56169b8e574cf","name":"LYNC Network","symbol":"LYNC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12717/thumb/coingecko_200x200.png?1604203317"},{"chainId":1,"address":"0xb753428af26e81097e7fd17f40c88aaa3e04902c","name":"saffron finance","symbol":"SFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13117/thumb/sfi_red_250px.png?1606020144"},{"chainId":1,"address":"0x468ab3b1f63a1c14b361bc367c3cc92277588da1","name":"Yeld Finance","symbol":"YELD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12389/thumb/X4bTDcZ.png?1622177749"},{"chainId":1,"address":"0x2260fac5e5542a773aa44fbcfedf7c193bc2c599","name":"Wrapped Bitcoin","symbol":"WBTC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7598/thumb/wrapped_bitcoin_wbtc.png?1548822744"},{"chainId":1,"address":"0x041a36b015486941ce8d5f2c7ff2e88f97390640","name":"Ledgis","symbol":"LED","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/16796/thumb/logo_icon.png?1625041330"},{"chainId":1,"address":"0x7a3d5d49d64e57dbd6fbb21df7202bd3ee7a2253","name":"Tornado Core","symbol":"TCORE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13412/thumb/tcore.jpeg?1609238107"},{"chainId":1,"address":"0x1c95b093d6c236d3ef7c796fe33f9cc6b8606714","name":"BOMB","symbol":"BOMB","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/7713/thumb/Bomb-token.png?1549944422"},{"chainId":1,"address":"0x465e07d6028830124be2e4aa551fbe12805db0f5","name":"Wrapped XMR by BTSE","symbol":"WXMR","decimals":18},{"chainId":1,"address":"0x81313f7c5c9c824236c9e4cba3ac4b049986e756","name":"HippoFinance","symbol":"HIPPO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12581/thumb/chef.50555ea1.png?1600922357"},{"chainId":1,"address":"0x9fc8f0ca1668e87294941b7f627e9c15ea06b459","name":"True PNL","symbol":"PNL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15282/thumb/256x256logo.png?1623230007"},{"chainId":1,"address":"0xf0939011a9bb95c3b791f0cb546377ed2693a574","name":"0 exchange","symbol":"ZERO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13706/thumb/0.exchange_%28logo%29.jpg?1617070530"},{"chainId":1,"address":"0x3521c85c3000bff57eac04489eb05bbd3193a531","name":"MetaWhale BTC","symbol":"MWBTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13926/thumb/mwBTC-gecko-light_1.png?1617276456"},{"chainId":1,"address":"0xe99a894a69d7c2e3c92e61b64c505a6a57d2bc07","name":"Hyperion","symbol":"HYN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7171/thumb/Hyperion.png?1558069078"},{"chainId":1,"address":"0x4760e7a401558aa59639161454bb2a41a3c5a90b","name":"Crowd One","symbol":"CRD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10879/thumb/bottom_logo.png?1585473923"},{"chainId":1,"address":"0xed0439eacf4c4965ae4613d77a5c2efe10e5f183","name":"Niftyx Protocol","symbol":"SHROOM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12341/thumb/niftyx_logo.jpg?1617784430"},{"chainId":1,"address":"0xcc80c051057b774cd75067dc48f8987c4eb97a5e","name":"Nectar","symbol":"NEC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3559/thumb/NecLogoLoad.png?1592795924"},{"chainId":1,"address":"0x2991341d28eaea277785d20e1d878d478c7ba4c7","name":"FM Gallery","symbol":"FMG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14527/thumb/FR44th_I_400x400.jpg?1616742157"},{"chainId":1,"address":"0x20bcae16a8ba95d8e8363e265de4ecfc36ec5cd9","name":"HEY BITCOIN","symbol":"HYBN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11886/thumb/47880519.png?1595750258"},{"chainId":1,"address":"0x12513335ffd5dafc2334e98625d27c1ca84bff86","name":"Amepay","symbol":"AME","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13539/thumb/1dPdUxIy_400x400.png?1609596297"},{"chainId":1,"address":"0x441761326490cacf7af299725b6292597ee822c2","name":"Unifi Protocol DAO","symbol":"UNFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13152/thumb/logo-2.png?1605748967"},{"chainId":1,"address":"0x906710835d1ae85275eb770f06873340ca54274b","name":"Ethereum Cash Token","symbol":"ECASH","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16251/thumb/1KbLnJj.png?1623393193"},{"chainId":1,"address":"0xf938424f7210f31df2aee3011291b658f872e91e","name":"Visor","symbol":"VISR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14381/thumb/visor_logo.png?1615782828"},{"chainId":1,"address":"0x4a615bb7166210cce20e6642a6f8fb5d4d044496","name":"NAOS Finance","symbol":"NAOS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15144/thumb/bafybeibkztkshitabrf7yqqkqtbjqestjknpgv7lsjfzdsa3ufspagqs2e.ipfs.infura-ipfs.io.png?1622176770"},{"chainId":1,"address":"0xf3db5fa2c66b7af3eb0c0b782510816cbe4813b8","name":"Everex","symbol":"EVX","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/997/thumb/everex.png?1548125695"},{"chainId":1,"address":"0x47fa4b26c1c52bc35654f98d10cd61b9f3e10267","name":"TinkuCoin","symbol":"TINKU","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16114/thumb/tinku.JPG?1623027371"},{"chainId":1,"address":"0x260e63d91fccc499606bae3fe945c4ed1cf56a56","name":"MoonTools","symbol":"MOONS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12793/thumb/moontools-token-logo.png?1602588060"},{"chainId":1,"address":"0x50de6856358cc35f3a9a57eaaa34bd4cb707d2cd","name":"Razor Network","symbol":"RAZOR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13797/thumb/icon.png?1611919354"},{"chainId":1,"address":"0x0000000000095413afc295d19edeb1ad7b71c952","name":"Tokenlon","symbol":"LON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13454/thumb/lon_logo.png?1608701720"},{"chainId":1,"address":"0xf1b8762a7fa8c244e36f7234edf40cfae24394e3","name":"GoldFarm","symbol":"GOLD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16108/thumb/rVUV_photo_2021-06-03_13-37-31.png?1623020895"},{"chainId":1,"address":"0x540d3087b21f31f9a810385c94627a067cfd0b08","name":"Crypto Candy","symbol":"CANDY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13735/thumb/p5xV71o9q0ENOCA_0hi2IGq6Lg3CcdN2wBBfhXc51uSsFdaDYuDR97ampeNGXcdHU06PH1luOQ7o2w8V__Kj9rsxO02H6RDR-eEWwugtc1V-bPlgQPw_PLu1cDxWKeU7qD6Gj3WB3gh1ylF_2OVlv2PC0aKMxcez_oWpFA0WZ5wXX2ZOlIWJH1Qf026dR-QreHnFdO0fmgmMu_K.jpg?1611285084"},{"chainId":1,"address":"0xb2e20502c7593674509b8384ed9240a03869faf3","name":"Shiba Ramen","symbol":"SHIBARAMEN","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16134/thumb/60bbdb756d4e3aea1bfa5478_image0_copy.jpeg?1623055808"},{"chainId":1,"address":"0x1c1c14a6b5074905ce5d367b0a7e098b58ebfd47","name":"FIDEX Exchange","symbol":"FEX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6843/thumb/1LC9qeLf_400x400.jpg?1547043159"},{"chainId":1,"address":"0x579cea1889991f68acc35ff5c3dd0621ff29b0c9","name":"Everipedia","symbol":"IQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5010/thumb/YAIS3fUh.png?1626267646"},{"chainId":1,"address":"0x0ff6ffcfda92c53f615a4a75d982f399c989366b","name":"UniLayer","symbol":"LAYER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12164/thumb/Unilayer.jpg?1597779313"},{"chainId":1,"address":"0x491e136ff7ff03e6ab097e54734697bb5802fc1c","name":"Kattana","symbol":"KTN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14739/thumb/c2IqkKWK_400x400.jpg?1618004426"},{"chainId":1,"address":"0xd9ec3ff1f8be459bb9369b4e79e9ebcf7141c093","name":"KardiaChain","symbol":"KAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7942/thumb/KardiaChain.png?1591631223"},{"chainId":1,"address":"0x6b9f031d718dded0d681c20cb754f97b3bb81b78","name":"GEEQ","symbol":"GEEQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11953/thumb/GeeqLogoPNGTransparent-1.png?1596421769"},{"chainId":1,"address":"0x4cf488387f035ff08c371515562cba712f9015d4","name":"WePower","symbol":"WPR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1951/thumb/wpr.png?1547036237"},{"chainId":1,"address":"0xd9b312d77bc7bed9b9cecb56636300bed4fe5ce9","name":"Gains","symbol":"GAINS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14681/thumb/GAINS_Token_200x200.png?1617796172"},{"chainId":1,"address":"0x29ceddcf0da3c1d8068a7dfbd0fb06c2e438ff70","name":"Freela","symbol":"FREL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15856/thumb/freela.PNG?1622164474"},{"chainId":1,"address":"0xaffcdd96531bcd66faed95fc61e443d08f79efef","name":"Perth Mint Gold Tok","symbol":"PMGT","decimals":5,"logoURI":"https://assets.coingecko.com/coins/images/10730/thumb/pmgt_logo_256x256.png?1582668331"},{"chainId":1,"address":"0xb7cb1c96db6b22b0d3d9536e0108d062bd488f74","name":"Waltonchain","symbol":"WTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1093/thumb/ggx6nnW.png?1604815811"},{"chainId":1,"address":"0x94804dc4948184ffd7355f62ccbb221c9765886f","name":"Rage Fan","symbol":"RAGE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14585/thumb/AcNx2x6P_400x400.jpg?1617153476"},{"chainId":1,"address":"0x91b7ed3b352aa3502f94e58eac930ae1f5b5ebcd","name":"CNY Tether","symbol":"CNYT","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/5251/thumb/cny-tether-logo.png?1547040741"},{"chainId":1,"address":"0x30d862bbbef3b75f700d6ba7d323b95708eaafaa","name":"Funder One","symbol":"FUNDX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13611/thumb/d6fa6b8fdedb00a6b3935f3a55662796-full.png?1610284736"},{"chainId":1,"address":"0x49849c98ae39fff122806c06791fa73784fb3675","name":"LP renBTC Curve","symbol":"RENBTCCURVE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11957/thumb/Curvefi_renCrv_32.png?1596435739"},{"chainId":1,"address":"0x94f31ac896c9823d81cf9c2c93feceed4923218f","name":"YFTether","symbol":"YFTE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13683/thumb/yftether.png?1610858860"},{"chainId":1,"address":"0x57f55d89c30172a913bae10a2e702e5302f1e356","name":"Big Beautiful Women","symbol":"BBW","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16439/thumb/bbw.PNG?1624179151"},{"chainId":1,"address":"0x73a052500105205d34daf004eab301916da8190f","name":"yTUSD","symbol":"YTUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14865/thumb/iearntusd_32.png?1618813131"},{"chainId":1,"address":"0x99043bb680ab9262c7b2ac524e00b215efb7db9b","name":"Black Kishu Inu","symbol":"BISHU","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16088/thumb/Bishu.png?1622799535"},{"chainId":1,"address":"0x998b3b82bc9dba173990be7afb772788b5acb8bd","name":"Banca","symbol":"BANCA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2795/thumb/banca.png?1547036972"},{"chainId":1,"address":"0xb8baa0e4287890a5f79863ab62b7f175cecbd433","name":"Swerve","symbol":"SWRV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12361/thumb/swerve.png?1599278316"},{"chainId":1,"address":"0x6c8c6b02e7b2be14d4fa6022dfd6d75921d90e4e","name":"cBAT","symbol":"CBAT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10645/thumb/cBAT1.JPG?1581390910"},{"chainId":1,"address":"0x4f76e85d067e219779a863ff18577846b3152f1f","name":"KuboCoin","symbol":"KUBO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6895/thumb/Presentatie_LOGO.png?1578975206"},{"chainId":1,"address":"0x3080ec2a6960432f179c66d388099a48e82e2047","name":"Popcorn Token","symbol":"CORN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12408/thumb/n425bUN.png?1599625062"},{"chainId":1,"address":"0x06a01a4d579479dd5d884ebf61a31727a3d8d442","name":"SmartKey","symbol":"SKEY","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13425/thumb/smart-key_sign-256.png?1608531133"},{"chainId":1,"address":"0xda23d301761e4e2bf474951f978f6dfb6f3c9f14","name":"Tsuki Inu","symbol":"TKINU","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15681/thumb/tkinu.png?1621508357"},{"chainId":1,"address":"0xf8a4a419c2d7140e49ef952a7e7ae1bd4a8b6b9c","name":"Lith Token","symbol":"LITH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16199/thumb/TBIThlqp_400x400.jpg?1623289313"},{"chainId":1,"address":"0x018d7d179350f1bb9853d04982820e37cce13a92","name":"InMax","symbol":"INX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6826/thumb/gDALsvq.png?1555895815"},{"chainId":1,"address":"0x3e8ffc8c3cb0db3081df85dec91b63abbbe99f71","name":"Mixsome","symbol":"SOME","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15005/thumb/mixsome.PNG?1619412351"},{"chainId":1,"address":"0xfad45e47083e4607302aa43c65fb3106f1cd7607","name":"Hoge Finance","symbol":"HOGE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/14360/thumb/hoge.jpg?1615641604"},{"chainId":1,"address":"0x6e5970dbd6fc7eb1f29c6d2edf2bc4c36124c0c1","name":"Polytrade","symbol":"TRADE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16416/thumb/Logo_colored_200.png?1623979654"},{"chainId":1,"address":"0x368c5290b13caa10284db58b4ad4f3e9ee8bf4c9","name":"Kineko","symbol":"KKO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15366/thumb/Kineko.jpeg?1620721965"},{"chainId":1,"address":"0x8a40c222996f9f3431f63bf80244c36822060f12","name":"Finxflo","symbol":"FXF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13916/thumb/raVh1Iw.png?1618978607"},{"chainId":1,"address":"0x79126d32a86e6663f3aaac4527732d0701c1ae6c","name":"Dark Matter","symbol":"DMT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14223/thumb/dmt.jpg?1615089067"},{"chainId":1,"address":"0x0b498ff89709d3838a063f1dfa463091f9801c2b","name":"BTC 2x Flexible Lev","symbol":"BTC2X-FLI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15406/thumb/photo_2021-05-11_22.30.33.jpeg?1620743443"},{"chainId":1,"address":"0x00c83aecc790e8a4453e5dd3b0b4b3680501a7a7","name":"SKALE","symbol":"SKL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13245/thumb/SKALE_token_300x300.png?1606789574"},{"chainId":1,"address":"0x2c31b10ca416b82cec4c5e93c615ca851213d48d","name":"Force DAO","symbol":"FORCE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15055/thumb/Force200TransPNG.png?1619618982"},{"chainId":1,"address":"0xf680429328caaacabee69b7a9fdb21a71419c063","name":"Butterfly Protocol","symbol":"BFLY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13882/thumb/ButterflyProtocolNoText_sm.png?1612492535"},{"chainId":1,"address":"0x0316eb71485b0ab14103307bf65a021042c6d380","name":"Huobi BTC","symbol":"HBTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12407/thumb/Unknown-5.png?1599624896"},{"chainId":1,"address":"0x878cf148ccbb50426043a9affe54ba408221c7fa","name":"Crypto Kombat","symbol":"KOMBAT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/15147/thumb/Kombat-token-logo-200.jpg?1619859575"},{"chainId":1,"address":"0x41ad4093349c8a60de591a3c37dcd184558eaae3","name":"Bitcoin and Company","symbol":"BITN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9909/thumb/BITN-Token-RGB-256x256.png?1573442082"},{"chainId":1,"address":"0x28cca76f6e8ec81e4550ecd761f899110b060e97","name":"ArGo Token","symbol":"ARGO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15477/thumb/argo.jpeg?1620995773"},{"chainId":1,"address":"0xd04785c4d8195e4a54d9dec3a9043872875ae9e2","name":"Rotten","symbol":"ROT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12560/thumb/rot_logo.png?1600762626"},{"chainId":1,"address":"0xd9b48548de7710519221207d70e40aa24d7d1985","name":"CandyBooty","symbol":"BOOTY","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16464/thumb/Booty.png?1624263922"},{"chainId":1,"address":"0xff56cc6b1e6ded347aa0b7676c85ab0b3d08b0fa","name":"Orbs","symbol":"ORBS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4630/thumb/Orbs.jpg?1547039896"},{"chainId":1,"address":"0x69fa8e7f6bf1ca1fb0de61e1366f7412b827cc51","name":"EnreachDAO","symbol":"NRCH","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/14694/thumb/enreachdao.jpg?1617813758"},{"chainId":1,"address":"0x76851a93977bea9264c32255b6457882035c7501","name":"Fat Doge","symbol":"FOGE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15497/thumb/foge.png?1621057848"},{"chainId":1,"address":"0x072c46f392e729c1f0d92a307c2c6dba06b5d078","name":"Snoop Doge","symbol":"SNOGE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15752/thumb/snoop_doge.PNG?1621814306"},{"chainId":1,"address":"0x3f4e02741b155f5ce8d6190d294d4f916125b896","name":"CircleEx","symbol":"CX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14181/thumb/lWlstjZM_400x400.png?1614820963"},{"chainId":1,"address":"0x93dfaf57d986b9ca77df9376c50878e013d9c7c8","name":"Unique One","symbol":"RARE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13458/thumb/Logo_Unique.png?1612757355"},{"chainId":1,"address":"0xaa7a9ca87d3694b5755f213b5d04094b8d0f0a6f","name":"OriginTrail","symbol":"TRAC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1877/thumb/origintrail.jpg?1605694415"},{"chainId":1,"address":"0x48c276e8d03813224bb1e55f953adb6d02fd3e02","name":"Kuma Inu","symbol":"KUMA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15526/thumb/kuma_inu.PNG?1621128824"},{"chainId":1,"address":"0x6f40d4a6237c257fff2db00fa0510deeecd303eb","name":"Instadapp","symbol":"INST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14688/thumb/30hFM0-n_400x400.jpg?1617786420"},{"chainId":1,"address":"0xf2051511b9b121394fa75b8f7d4e7424337af687","name":"DAOhaus","symbol":"HAUS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14551/thumb/jN3kkqke_400x400.png?1616990048"},{"chainId":1,"address":"0xa1afffe3f4d611d252010e3eaf6f4d77088b0cd7","name":"reflect finance","symbol":"RFI","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13189/thumb/reflect_finance_logo.png?1606098213"},{"chainId":1,"address":"0xaac41ec512808d64625576eddd580e7ea40ef8b2","name":"Gameswap","symbol":"GSWAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13026/thumb/gameswap.jpg?1604456704"},{"chainId":1,"address":"0x7de2d123042994737105802d2abd0a10a7bde276","name":"MEXC Token","symbol":"MEXC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9156/thumb/Q0WvFsBt_400x400.jpg?1564736309"},{"chainId":1,"address":"0xe477292f1b3268687a29376116b0ed27a9c76170","name":"HEROcoin","symbol":"PLAY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2221/thumb/herocoin.png?1547744781"},{"chainId":1,"address":"0xf65b5c5104c4fafd4b709d9d60a185eae063276c","name":"Truebit Protocol","symbol":"TRU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15053/thumb/Truebit.png?1623296246"},{"chainId":1,"address":"0xddd460bbd9f79847ea08681563e8a9696867210c","name":"Spendcoin","symbol":"SPND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6076/thumb/spend.png?1561607507"},{"chainId":1,"address":"0xf8c3527cc04340b208c854e985240c02f7b7793f","name":"Frontier","symbol":"FRONT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12479/thumb/frontier_logo.png?1600145472"},{"chainId":1,"address":"0x607c794cda77efb21f8848b7910ecf27451ae842","name":"DeFiPie","symbol":"PIE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11956/thumb/98j5E_EG_400x400.png?1596644614"},{"chainId":1,"address":"0xcc4304a31d09258b0029ea7fe63d032f52e44efe","name":"Trustswap","symbol":"SWAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11795/thumb/Trustswap.png?1594311216"},{"chainId":1,"address":"0x5f64ab1544d28732f0a24f4713c2c8ec0da089f0","name":"DEXTF","symbol":"DEXTF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12634/thumb/DEXTFiconNEGATIVE-page-001.jpg?1601349042"},{"chainId":1,"address":"0xd0660cd418a64a1d44e9214ad8e459324d8157f1","name":"Woofy","symbol":"WOOFY","decimals":12,"logoURI":"https://assets.coingecko.com/coins/images/15410/thumb/woofy.png?1622566328"},{"chainId":1,"address":"0x136bced3af8530b81e4c7ff45c9228376726d173","name":"Dolphin Token","symbol":"DSE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15423/thumb/dolphin.png?1620786242"},{"chainId":1,"address":"0x1ceb5cb57c4d4e2b2433641b95dd330a33185a44","name":"Keep3rV1","symbol":"KP3R","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12966/thumb/kp3r_logo.jpg?1607057458"},{"chainId":1,"address":"0x83f873388cd14b83a9f47fabde3c9850b5c74548","name":"Zero Utility Token","symbol":"ZUT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12706/thumb/logo.png?1605007113"},{"chainId":1,"address":"0x6fa0952355607dfb2d399138b7fe10eb90f245e4","name":"Clash Token","symbol":"SCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13805/thumb/SZKnadlg_400x400.png?1612001081"},{"chainId":1,"address":"0xa8006c4ca56f24d6836727d106349320db7fef82","name":"Internxt","symbol":"INXT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/986/thumb/round.png?1602484873"},{"chainId":1,"address":"0x7b3d36eb606f873a75a6ab68f8c999848b04f935","name":"NFTLootBox","symbol":"LOOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13414/thumb/nftlootbox.png?1608280539"},{"chainId":1,"address":"0x0cec1a9154ff802e7934fc916ed7ca50bde6844e","name":"PoolTogether","symbol":"POOL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14003/thumb/PoolTogether.png?1613585632"},{"chainId":1,"address":"0x69af81e73a73b40adf4f3d4223cd9b1ece623074","name":"Mask Network","symbol":"MASK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14051/thumb/Mask_Network.jpg?1614050316"},{"chainId":1,"address":"0x0fe629d1e84e171f8ff0c1ded2cc2221caa48a3f","name":"NFTX Hashmasks Inde","symbol":"MASK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13873/thumb/nftx.png?1612448203"},{"chainId":1,"address":"0x43de1145cd22f0a9cc99e51c205e6e81161df6b9","name":"3X Long Cardano Tok","symbol":"ADABULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10203/thumb/683JEXMN_400x400_%281%29.png?1576534440"},{"chainId":1,"address":"0xd06b25f67a17f12b41f615b34d87ecd716ff55a0","name":"3X Long Shitcoin In","symbol":"BULLSHIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10228/thumb/683JEXMN_400x400_%281%29.png?1576618335"},{"chainId":1,"address":"0x331a4589516eae384ea5f557853af6af73b9534e","name":"Token CashPay","symbol":"TCP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11616/thumb/559059354_256256.png?1591932551"},{"chainId":1,"address":"0x48dee19c81b89a9ab473361bae7a19210f2deaa4","name":"3X Short Shitcoin I","symbol":"BEARSHIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10206/thumb/683JEXMN_400x400_%281%29.png?1576534838"},{"chainId":1,"address":"0x3c7b464376db7c9927930cf50eefdea2eff3a66a","name":"USDA","symbol":"USDA","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10280/thumb/71706577_106238760785222_2649249116525166592_n.png?1576972115"},{"chainId":1,"address":"0x7aa6b33fb7f395ddbca7b7a33264a3c799fa626f","name":"3X Long Dogecoin To","symbol":"DOGEBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10283/thumb/683JEXMN_400x400.png?1577007477"},{"chainId":1,"address":"0x653430560be843c4a3d143d0110e896c2ab8ac0d","name":"Molecular Future","symbol":"MOF","decimals":16,"logoURI":"https://assets.coingecko.com/coins/images/2607/thumb/molecular_future.png?1547036754"},{"chainId":1,"address":"0xa9fc65da36064ce545e87690e06f5de10c52c690","name":"3X Short Bitcoin Ca","symbol":"BCHBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10268/thumb/683JEXMN_400x400_%281%29.png?1576835432"},{"chainId":1,"address":"0x46760d2bf2f4dd5405646d9b2ce7b723efe74a48","name":"Penny For Bit","symbol":"PFB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15741/thumb/PFB-token-logo-200.png?1621688472"},{"chainId":1,"address":"0x057fb10e3fec001a40e6b75d3a30b99e23e54107","name":"3X Short Algorand T","symbol":"ALGOBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10216/thumb/683JEXMN_400x400_%281%29.png?1576575065"},{"chainId":1,"address":"0x9c78ee466d6cb57a4d01fd887d2b5dfb2d46288f","name":"Must","symbol":"MUST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13688/thumb/must_logo.png?1610949645"},{"chainId":1,"address":"0x3a880652f47bfaa771908c07dd8673a787daed3a","name":"DerivaDAO","symbol":"DDX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13453/thumb/ddx_logo.png?1608741641"},{"chainId":1,"address":"0x83ad87c988ac0c6277c0c6234cc8108b20bb5d9b","name":"3X Long Chainlink T","symbol":"LINKBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10235/thumb/683JEXMN_400x400_%281%29.png?1576632547"},{"chainId":1,"address":"0xb351da6ffebd5dddd1da037929fcf334d6b4a8d5","name":"Flit Token","symbol":"FLT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10273/thumb/Ss5vDXAO_400x400.jpg?1579730758"},{"chainId":1,"address":"0x9f284e1337a815fe77d2ff4ae46544645b20c5ff","name":"Darwinia Commitment","symbol":"KTON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11895/thumb/KTON.png?1615271813"},{"chainId":1,"address":"0xead7f3ae4e0bb0d8785852cc37cc9d0b5e75c06a","name":"3X Long EOS Token","symbol":"EOSBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10236/thumb/683JEXMN_400x400_%281%29.png?1576632680"},{"chainId":1,"address":"0x3c4a46f0c075a7f191a7459bb51eb1f81ac36f8a","name":"3X Short PAX Gold T","symbol":"PAXGBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10432/thumb/683JEXMN_400x400.png?1579276381"},{"chainId":1,"address":"0xbc41d05287498dec58129560de6bd1b8d4e3ac1d","name":"3X Short Tezos Toke","symbol":"XTZBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10175/thumb/683JEXMN_400x400_%281%29.png?1576506808"},{"chainId":1,"address":"0x9d1a62c2ad99019768b9126fda004a9952853f6e","name":"3X Long BNB Token","symbol":"BNBBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10218/thumb/683JEXMN_400x400_%281%29.png?1576576413"},{"chainId":1,"address":"0xe9ed705842bd7219a963e452c41be85ce5cff884","name":"JoyTube Token","symbol":"JTT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10259/thumb/joytube-logo.jpeg?1576795283"},{"chainId":1,"address":"0xf99d58e463a2e07e5692127302c20a191861b4d6","name":"Anyswap","symbol":"ANY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12242/thumb/anyswap.jpg?1598443880"},{"chainId":1,"address":"0xdf2c7238198ad8b389666574f2d8bc411a4b7428","name":"Hifi Finance","symbol":"MFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3293/thumb/hifi_logo.png?1613102742"},{"chainId":1,"address":"0xd26114cd6ee289accf82350c8d8487fedb8a0c07","name":"OMG Network","symbol":"OMG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/776/thumb/OMG_Network.jpg?1591167168"},{"chainId":1,"address":"0x3335f16af9008bfd32f1ee6c2be5d4f84fa0b9da","name":"3X Long Dragon Inde","symbol":"DRGNBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10197/thumb/683JEXMN_400x400_%281%29.png?1576533729"},{"chainId":1,"address":"0x053e5ba7cb9669dcc2feb2d0e1d3d4a0ad6aae39","name":"3X Short OKB Token","symbol":"OKBBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10241/thumb/683JEXMN_400x400_%281%29.png?1576633732"},{"chainId":1,"address":"0x8f8221afbb33998d8584a2b05749ba73c37a938a","name":"Request","symbol":"REQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1031/thumb/Request_icon.png?1550832088"},{"chainId":1,"address":"0xf4b5470523ccd314c6b9da041076e7d79e0df267","name":"BlockBank","symbol":"BBANK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15081/thumb/O0EZIVAu_400x400.jpg?1619656539"},{"chainId":1,"address":"0x6febdfc0a9d9502c45343fce0df08828def44795","name":"3X Short BNB Token","symbol":"BNBBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10242/thumb/683JEXMN_400x400_%281%29.png?1576633870"},{"chainId":1,"address":"0x3b9be07d622accaed78f479bc0edabfd6397e320","name":"Lossless","symbol":"LSS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15917/thumb/Group_57.png?1623046307"},{"chainId":1,"address":"0xabe580e7ee158da464b51ee1a83ac0289622e6be","name":"Offshift","symbol":"XFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11977/thumb/CsBrPiA.png?1614570441"},{"chainId":1,"address":"0x84f710bae3316a74fb0fcb01904d2578a4cc6a26","name":"PHILLIPS PAY COIN","symbol":"PPC","decimals":1,"logoURI":"https://assets.coingecko.com/coins/images/10311/thumb/ppc.PNG?1588127720"},{"chainId":1,"address":"0x6400b5522f8d448c0803e6245436dd1c81df09ce","name":"Content Value Netwo","symbol":"CVNT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5158/thumb/cvn.jpg?1547394846"},{"chainId":1,"address":"0x315dc1b524de57ae8e809a2e97699dbc895b8a21","name":"Pist Trust","symbol":"PIST","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16397/thumb/main_img01_pc.png?1623910650"},{"chainId":1,"address":"0xcdeee767bed58c5325f68500115d4b722b3724ee","name":"Carbon","symbol":"CRBN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13262/thumb/CRBN_Icon_200.png?1606803750"},{"chainId":1,"address":"0xc42209accc14029c1012fb5680d95fbd6036e2a0","name":"PayPie","symbol":"PPP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/999/thumb/paypie.png?1548330825"},{"chainId":1,"address":"0xacaca5b8805636608e14c64b0bfffc2deb2c6cec","name":"ROM Token","symbol":"ROM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7358/thumb/ROMToken-logo.png?1547275950"},{"chainId":1,"address":"0x883a158c9b28f8d626acfcfbe1028f49e70c9d75","name":"CNG Casino","symbol":"CNG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11573/thumb/cng_casino.png?1591230675"},{"chainId":1,"address":"0xf6ea0e60cee427b90aa36f327ee61d1d4cabc49f","name":"UniqueOne Photo","symbol":"FOTO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14274/thumb/iG1Pf7kL_400x400.png?1615238642"},{"chainId":1,"address":"0x48783486ddd7fa85eca6b0c4ae8920bc25dfbcd7","name":"GoMoney2","symbol":"GOM2","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/10374/thumb/lvAhDIqmH0fh6U3NIiYLmKETR3uUBcySAv-K28eW6CCFm-ODhCdId71Ug5c4TCoEtxsre30Efe08muctK0MlK-JPdAbxilzZ7dHyiBNOCvcc_9AmJIo09TRLaiAafgqcFKsxpNOON2D28oTLnVTaqwxWL8zKSzjbI6ChKTCJKOiM2mq7VhQRZYe93StR30mf2O7DnkqmGEbZ5_i.jpg?1578675305"},{"chainId":1,"address":"0x2ecc48ba346a73d7d55aa5a46b5e314d9daa6161","name":"Safeswap","symbol":"SSGT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15848/thumb/SSGT_Coingecko.png?1622115658"},{"chainId":1,"address":"0x5d858bcd53e085920620549214a8b27ce2f04670","name":"POP Network","symbol":"POP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7281/thumb/-3r4B_4c_400x400.png?1602285342"},{"chainId":1,"address":"0xc477d038d5420c6a9e0b031712f61c5120090de9","name":"Boson Protocol","symbol":"BOSON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14710/thumb/boson_logo.png?1617882472"},{"chainId":1,"address":"0x374cb8c27130e2c9e04f44303f3c8351b9de61c1","name":"Bao Finance","symbol":"BAO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13547/thumb/BaoLogo.png?1615342483"},{"chainId":1,"address":"0x3f382dbd960e3a9bbceae22651e88158d2791550","name":"Aavegotchi","symbol":"GHST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12467/thumb/ghst_200.png?1600750321"},{"chainId":1,"address":"0xac9bb427953ac7fddc562adca86cf42d988047fd","name":"Scatter cx","symbol":"STT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10422/thumb/scatter.png?1580876890"},{"chainId":1,"address":"0x43a89815f33747edbecc588d6bb7e1c10dda5599","name":"Thunder","symbol":"THUN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16407/thumb/thunder-logo.png?1623920948"},{"chainId":1,"address":"0x236d53148f83706c3d670064809577385f923a75","name":"Siberian Husky","symbol":"SHUSKY","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16711/thumb/shusky.png?1624782891"},{"chainId":1,"address":"0xa1d6df714f91debf4e0802a542e13067f31b8262","name":"RedFOX Labs","symbol":"RFOX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12956/thumb/logo-200.png?1607620623"},{"chainId":1,"address":"0xe5a3229ccb22b6484594973a03a3851dcd948756","name":"Receive Access Ecos","symbol":"RAE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9428/thumb/Copy_of_raetoken.png?1567290545"},{"chainId":1,"address":"0xf85ef57fcdb36d628d063fa663e61e44d35ae661","name":"eToro Pound Sterlin","symbol":"GBPX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10524/thumb/Untitled_Diagram-3.png?1580511312"},{"chainId":1,"address":"0xbc396689893d065f41bc2c6ecbee5e0085233447","name":"Perpetual Protocol","symbol":"PERP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12381/thumb/token_2000x2000.png?1615791204"},{"chainId":1,"address":"0xffffffff2ba8f66d4e51811c5190992176930278","name":"Furucombo","symbol":"COMBO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13629/thumb/COMBO_token_ol.png?1610701537"},{"chainId":1,"address":"0xecb79a9b7559168174c41b153997bc462b6dfe4e","name":"Nature","symbol":"NAT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10403/thumb/logo_%281%29.png?1578951997"},{"chainId":1,"address":"0x4c6ec08cf3fc987c6c4beb03184d335a2dfc4042","name":"MurAll","symbol":"PAINT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14103/thumb/paint_logo_200x200.png?1614325640"},{"chainId":1,"address":"0x6ee0f7bb50a54ab5253da0667b0dc2ee526c30a8","name":"Aave BUSD v1","symbol":"ABUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11736/thumb/aBUSD.png?1593085489"},{"chainId":1,"address":"0x940a2db1b7008b6c776d4faaca729d6d4a4aa551","name":"DUSK Network","symbol":"DUSK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5217/thumb/D_ticker_purple_on_circle_%282%29.png?1563781659"},{"chainId":1,"address":"0xdacd69347de42babfaecd09dc88958378780fb62","name":"Atari","symbol":"ATRI","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/12992/thumb/atari.png?1604212345"},{"chainId":1,"address":"0xfc1e690f61efd961294b3e1ce3313fbd8aa4f85d","name":"Aave DAI v1","symbol":"ADAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10843/thumb/aDAI.png?1584698791"},{"chainId":1,"address":"0xcfad57a67689809cda997f655802a119838c9cec","name":"Benscoin","symbol":"BSC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10393/thumb/Benscoin_Logo_200x200_%28CoinGecko%29.png?1594432611"},{"chainId":1,"address":"0x86b300ef935284a99fa5d148a9a6ccc5103b21a8","name":"Crypto Dash","symbol":"CDASH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10409/thumb/logo.png?1578990007"},{"chainId":1,"address":"0x9ff58f4ffb29fa2266ab25e75e2a8b3503311656","name":"Aave WBTC","symbol":"AWBTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14244/thumb/aWBTC.41453c2a.png?1615528721"},{"chainId":1,"address":"0xd1766a85b0d6f81185782dc07f15326d63c3cbaa","name":"TokenTuber","symbol":"TUBER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9617/thumb/Wlk5tQQe_400x400.png?1569853753"},{"chainId":1,"address":"0x419d0d8bdd9af5e606ae2232ed285aff190e711b","name":"FUNToken","symbol":"FUN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/761/thumb/funfair.png?1592404368"},{"chainId":1,"address":"0xbdbf245c690d54b67c6e610a28486a2c6de08be6","name":"Sunder Goverance To","symbol":"SUNDER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16287/thumb/logo.d2250592.png?1623657219"},{"chainId":1,"address":"0x3bb86d867a9f3addf994cdadb210fa82f0d4157a","name":"Ghoul Token","symbol":"GHOUL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16455/thumb/rsz-ghoul2.png?1624249816"},{"chainId":1,"address":"0x062e3be6a7c56a395b1881a0cd69a4923ade4fa2","name":"Bowl A Coin","symbol":"BAC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10407/thumb/67889072_875141466188128_5648314299878211584_o.jpg?1578952952"},{"chainId":1,"address":"0x630bc7dd0abfc2d196289ce09db947dd2cafae7c","name":"Nabox","symbol":"NABOX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16445/thumb/NyemjVRA_400x400.png?1624235013"},{"chainId":1,"address":"0x0f7f961648ae6db43c75663ac7e5414eb79b5704","name":"Blockzero Labs","symbol":"XIO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10029/thumb/blockzero.jpg?1611110205"},{"chainId":1,"address":"0xeeeeeeeee2af8d0e1940679860398308e0ef24d6","name":"Ethverse","symbol":"ETHV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12076/thumb/logo_%2888%29.png?1596751504"},{"chainId":1,"address":"0x2b5ca2f9510cf1e3595ff219f24d75d4244585ea","name":"EthereumPay","symbol":"EPAY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16189/thumb/ethereumpay.PNG?1623274037"},{"chainId":1,"address":"0x1d37986f252d0e349522ea6c3b98cb935495e63e","name":"ChartEx","symbol":"CHART","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12523/thumb/chartex.png?1600499406"},{"chainId":1,"address":"0x0b38210ea11411557c13457d4da7dc6ea731b88a","name":"API3","symbol":"API3","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13256/thumb/api3.jpg?1606751424"},{"chainId":1,"address":"0x1f3f9d3068568f8040775be2e8c03c103c61f3af","name":"Archer DAO Governan","symbol":"ARCH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13188/thumb/archer_logo.png?1606097487"},{"chainId":1,"address":"0x47bc01597798dcd7506dcca36ac4302fc93a8cfb","name":"Crowd Machine","symbol":"CMCT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/2967/thumb/crowd-machine.png?1547037212"},{"chainId":1,"address":"0x71fc860f7d3a592a4a98740e39db31d25db65ae8","name":"Aave USDT v1","symbol":"AUSDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11725/thumb/aUSDT.png?1593082796"},{"chainId":1,"address":"0x2008e3057bd734e10ad13c9eae45ff132abc1722","name":"Zebi","symbol":"ZCO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/2756/thumb/zebi.png?1548761131"},{"chainId":1,"address":"0x47da5456bc2e1ce391b645ce80f2e97192e4976a","name":"PL Gnet","symbol":"PLUG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15824/thumb/PLUG_token.png?1622007572"},{"chainId":1,"address":"0x70126bd012e39038792366c9115bb64407d5cbe1","name":"EVA Coin","symbol":"EVA","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/8294/thumb/-v8LzbDt_400x400.jpg?1557284982"},{"chainId":1,"address":"0x0af44e2784637218dd1d32a322d44e603a8f0c6a","name":"MATRYX","symbol":"MTX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1495/thumb/matryx.png?1547978542"},{"chainId":1,"address":"0x8c18d6a985ef69744b9d57248a45c0861874f244","name":"ClinTex CTi","symbol":"CTI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13266/thumb/CTI.png?1606817542"},{"chainId":1,"address":"0xa361718326c15715591c299427c62086f69923d9","name":"Aave BUSD","symbol":"ABUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14245/thumb/aBUSD.346a65d7_-_Copy.png?1615528703"},{"chainId":1,"address":"0x667088b212ce3d06a1b553a7221e1fd19000d9af","name":"Wings","symbol":"WINGS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/648/thumb/wings.png?1548760631"},{"chainId":1,"address":"0x75231f58b43240c9718dd58b4967c5114342a86c","name":"OKB","symbol":"OKB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4463/thumb/okb_token.png?1548386209"},{"chainId":1,"address":"0xf2cdf38e24738ba379ffa38d47bc88a941df5627","name":"Ally","symbol":"ALY","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/9619/thumb/BTf_sTXi_400x400.jpg?1569854715"},{"chainId":1,"address":"0xfdb615d6a15f929ddabc6b83a4f1cf9d361b064e","name":"Divert Finance","symbol":"DEVE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13067/thumb/DVMZDhP.png?1606785893"},{"chainId":1,"address":"0x7777777777697cfeecf846a76326da79cc606517","name":"xSigma","symbol":"SIG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14090/thumb/logo_128.png?1619775781"},{"chainId":1,"address":"0x947aeb02304391f8fbe5b25d7d98d649b57b1788","name":"Mandala Exchange To","symbol":"MDX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13736/thumb/png-cmc.png?1611288725"},{"chainId":1,"address":"0xb879da8b24c9b8685de8526cf492e954f165d74b","name":"MovieBloc","symbol":"MBL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8460/thumb/H5IOlyrzJPJn9v-DGVYMo9TRM7A-XmNFSyY57bLIhhoO0WVXskWYl7hvBvq6zl7S5Keip_jN9mQRyi4CccGi8vFpoARK1DFGiugOy_u6wqepC_StItYo-EWUEMyCJNYiQRCuNcsn04BAl1Pggp9Gwtbqle7_BZTkvxNVb8YTqgsHJAqCeCyF6O4uVEKUVPaWFZpvTx60TpEbIDhK2.jpg?1558690328"},{"chainId":1,"address":"0xdcb01cc464238396e213a6fdd933e36796eaff9f","name":"Yield","symbol":"YLD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13336/thumb/yieldcredit-logo-1024.png?1607653444"},{"chainId":1,"address":"0x8564653879a18c560e7c0ea0e084c516c62f5653","name":"UpBots","symbol":"UBXT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12476/thumb/UBXT.png?1600132967"},{"chainId":1,"address":"0x1426cc6d52d1b14e2b3b1cb04d57ea42b39c4c7c","name":"Jomon Shiba","symbol":"JSHIBA","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15395/thumb/Jomon.png?1622960557"},{"chainId":1,"address":"0xbf2179859fc6d5bee9bf9158632dc51678a4100e","name":"aelf","symbol":"ELF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1371/thumb/aelf-logo.png?1547035397"},{"chainId":1,"address":"0x3e9bc21c9b189c09df3ef1b824798658d5011937","name":"Linear","symbol":"LINA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12509/thumb/linear.jpg?1606884470"},{"chainId":1,"address":"0x537edd52ebcb9f48ff2f8a28c51fcdb9d6a6e0d4","name":"Small Doge","symbol":"SDOG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15377/thumb/small_dog.PNG?1620693455"},{"chainId":1,"address":"0xdbddf072d7aae7b9288e31a4eebe6c54e3a143b1","name":"Crowny Token","symbol":"CRWNY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14958/thumb/crowny-icon-rounded_2x.png?1619147225"},{"chainId":1,"address":"0x69a95185ee2a045cdc4bcd1b1df10710395e4e23","name":"Poolz Finance","symbol":"POOLZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13679/thumb/poolz_logo.png?1610806091"},{"chainId":1,"address":"0x8ee04e1e9400d4e2091ff3a46509e246e2f34542","name":"Musubi","symbol":"MUSUBI","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16454/thumb/musubinu-trans-AoP0rO3Zv7tpMnDN.png?1624249382"},{"chainId":1,"address":"0x83e6f1e41cdd28eaceb20cb649155049fac3d5aa","name":"Polkastarter","symbol":"POLS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12648/thumb/polkastarter.png?1609813702"},{"chainId":1,"address":"0x50f09629d0afdf40398a3f317cc676ca9132055c","name":"Evai","symbol":"EVAI","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/15900/thumb/Y2vRAvVa_400x400.png?1622411129"},{"chainId":1,"address":"0x4575f41308ec1483f3d399aa9a2826d74da13deb","name":"Orchid Protocol","symbol":"OXT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3916/thumb/download_%285%29.png?1576624060"},{"chainId":1,"address":"0xc0ba369c8db6eb3924965e5c4fd0b4c1b91e305f","name":"DLP Duck Token","symbol":"DUCK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13440/thumb/DLP_Duck_Token.png?1612840740"},{"chainId":1,"address":"0xe5b826ca2ca02f09c1725e9bd98d9a8874c30532","name":"ZEON Network","symbol":"ZEON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4247/thumb/XZqXYc2j_400x400.jpg?1547039580"},{"chainId":1,"address":"0xf7413489c474ca4399eee604716c72879eea3615","name":"APYSwap","symbol":"APYS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14163/thumb/971k1DeM_400x400.png?1614725664"},{"chainId":1,"address":"0x4c19596f5aaff459fa38b0f7ed92f11ae6543784","name":"TrueFi","symbol":"TRU","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13180/thumb/truefi_glyph_color.png?1617610941"},{"chainId":1,"address":"0xd6014ea05bde904448b743833ddf07c3c7837481","name":"iBTC","symbol":"IBTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8853/thumb/iBTC.png?1616151124"},{"chainId":1,"address":"0xd81b1a8b1ad00baa2d6609e0bae28a38713872f7","name":"PoolTogether USDC T","symbol":"PCUSDC","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/16255/thumb/fjRgQUo4_400x400.jpg?1623397960"},{"chainId":1,"address":"0xb9871cb10738eada636432e86fc0cb920dc3de24","name":"PRIA","symbol":"PRIA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12905/thumb/pria-200x.png?1603357286"},{"chainId":1,"address":"0xa9b1eb5908cfc3cdf91f9b8b3a74108598009096","name":"Bounce","symbol":"AUCTION","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13860/thumb/1_KtgpRIJzuwfHe0Rl0avP_g.jpeg?1612412025"},{"chainId":1,"address":"0xc73c167e7a4ba109e4052f70d5466d0c312a344d","name":"Sanshu Inu","symbol":"SANSHU","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15370/thumb/m9DgRlXY.jpg?1623177779"},{"chainId":1,"address":"0x426567f78e74577f8a6233b635970eb729631e05","name":"Staker Token","symbol":"STR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5122/thumb/staker-logo.png?1547040513"},{"chainId":1,"address":"0x89020f0d5c5af4f3407eb5fe185416c457b0e93e","name":"Edenchain","symbol":"EDN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3292/thumb/Eden.png?1574126935"},{"chainId":1,"address":"0x2b89bf8ba858cd2fcee1fada378d5cd6936968be","name":"Secret ERC20 ","symbol":"WSCRT","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/13767/thumb/Secret_S_Black_Coingecko.png?1611667298"},{"chainId":1,"address":"0x1456688345527be1f37e9e627da0837d6f08c925","name":"USDP Stablecoin","symbol":"USDP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13234/thumb/USDP.png?1606579598"},{"chainId":1,"address":"0x9aeb50f542050172359a0e1a25a9933bc8c01259","name":"OIN Finance","symbol":"OIN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12339/thumb/oin_finance_logo.jpg?1599137603"},{"chainId":1,"address":"0x21f54372c07b930b79c5c2d9bb0eaaca86c3b298","name":"Banana Finance","symbol":"BANANA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13419/thumb/bananacoin.png?1608446599"},{"chainId":1,"address":"0x469eda64aed3a3ad6f868c44564291aa415cb1d9","name":"Datamine FLUX","symbol":"FLUX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11756/thumb/fluxres.png?1593748917"},{"chainId":1,"address":"0xf0ee6b27b759c9893ce4f094b49ad28fd15a23e4","name":"Enigma","symbol":"ENG","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1007/thumb/enigma-logo.png?1547034914"},{"chainId":1,"address":"0x6369c3dadfc00054a42ba8b2c09c48131dd4aa38","name":"Morpher","symbol":"MPH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12619/thumb/morpher_200_200.png?1601524084"},{"chainId":1,"address":"0xa4bdb11dc0a2bec88d24a3aa1e6bb17201112ebe","name":"Stably USD","symbol":"USDS","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/7596/thumb/Stably-Dollar_Mark_Standard.png?1615791425"},{"chainId":1,"address":"0x77c6e4a580c0dce4e5c7a17d0bc077188a83a059","name":"Swerve fi USD","symbol":"SWUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12918/thumb/swerve.png?1603631063"},{"chainId":1,"address":"0x56de8bc61346321d4f2211e3ac3c0a7f00db9b76","name":"Renascent Finance","symbol":"RENA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15667/thumb/photo_2021-05-21_17-31-35.png?1621825861"},{"chainId":1,"address":"0x1a23a6bfbadb59fa563008c0fb7cf96dfcf34ea1","name":"CoFiX","symbol":"COFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12781/thumb/dnPnSkfa_400x400.png?1602885321"},{"chainId":1,"address":"0x6c5ba91642f10282b576d91922ae6448c9d52f4e","name":"Phala Network","symbol":"PHA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12451/thumb/phala.png?1600061318"},{"chainId":1,"address":"0x2e65e12b5f0fd1d58738c6f38da7d57f5f183d1c","name":"Tepleton","symbol":"TEP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9622/thumb/tep.PNG?1569856834"},{"chainId":1,"address":"0x5274891bec421b39d23760c04a6755ecb444797c","name":"IdleUSDC Yield ","symbol":"IDLEUSDCYIELD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11932/thumb/idleusdcv3_32.png?1596263673"},{"chainId":1,"address":"0x066798d9ef0833ccc719076dab77199ecbd178b0","name":"SakeToken","symbol":"SAKE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12428/thumb/sake.png?1599777402"},{"chainId":1,"address":"0xb97faf860045483e0c7f08c56acb31333084a988","name":"Vanilla Network","symbol":"VNLA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13223/thumb/vanilla_network_logo.jpeg?1606352291"},{"chainId":1,"address":"0x5b535edfa75d7cb706044da0171204e1c48d00e8","name":"808TA Token","symbol":"808TA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9120/thumb/eKmFtFle_400x400.png?1564473061"},{"chainId":1,"address":"0x8713d26637cf49e1b6b4a7ce57106aabc9325343","name":"Content Neutrality ","symbol":"CNN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2787/thumb/cnn_logo_big.png?1547036967"},{"chainId":1,"address":"0x7cc61e3ae6360e923e9296c802382ec7c9dd3652","name":"SUN","symbol":"SUN","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7420/thumb/a55e64a9e3eb68cfcd708f956e37ec5c_320x260.png?1547200256"},{"chainId":1,"address":"0xa3ee21c306a700e682abcdfe9baa6a08f3820419","name":"Creditcoin","symbol":"CTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10569/thumb/Zbta4ckfHezzaF3Rb4X0HiYsUWo1IzZ5RbXG17Qj-et6SMVcXMbD6gX0lnOts2B43Dz_jXErds_MhckZpd7uxjhjnkI8QsjGe6gu0TqU2i_4QJGn-get-GmwNL2IZtn9u0iFRzaGlk8jhT_BzXQLyNyC1Am2BRAeARyR89vHJezN82hytRA96tWHrcj33PNmdTh3wktEpEEgyh9.jpg?1580941163"},{"chainId":1,"address":"0x1494ca1f11d487c2bbe4543e90080aeba4ba3c2b","name":"DeFiPulse Index","symbol":"DPI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12465/thumb/defi_pulse_index_set.png?1600051053"},{"chainId":1,"address":"0x66c0dded8433c9ea86c8cf91237b14e10b4d70b7","name":"Mars","symbol":"MARS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13654/thumb/MARS.png?1610575403"},{"chainId":1,"address":"0x63726dae7c57d25e90ec829ce9a5c745ffd984d3","name":"Decentralized Oracl","symbol":"DEOR","decimals":10,"logoURI":"https://assets.coingecko.com/coins/images/14189/thumb/z-MqKNfF_400x400.jpg?1614837153"},{"chainId":1,"address":"0x5dbcf33d8c2e976c6b560249878e6f1491bca25c","name":"yUSD","symbol":"YVAULT-LP-YCURVE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12210/thumb/yUSD.png?1600166557"},{"chainId":1,"address":"0xb4bebd34f6daafd808f73de0d10235a92fbb6c3d","name":"Yearn Ecosystem Tok","symbol":"YETI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13332/thumb/yeti.png?1607563342"},{"chainId":1,"address":"0xaa602de53347579f86b996d2add74bb6f79462b2","name":"Zipmex Token","symbol":"ZMT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13866/thumb/zipmex.png?1612428520"},{"chainId":1,"address":"0x72e364f2abdc788b7e918bc238b21f109cd634d7","name":"Metaverse Index","symbol":"MVI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14684/thumb/MVI_logo.png?1617776444"},{"chainId":1,"address":"0x0ada190c81b814548ddc2f6adc4a689ce7c1fe73","name":"yAxis","symbol":"YAXIS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12620/thumb/Logo.png?1608310944"},{"chainId":1,"address":"0x809826cceab68c387726af962713b64cb5cb3cca","name":"Nucleus Vision","symbol":"NCASH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3135/thumb/nv.jpg?1547037544"},{"chainId":1,"address":"0xc7283b66eb1eb5fb86327f08e1b5816b0720212b","name":"Tribe","symbol":"TRIBE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14575/thumb/tribe.PNG?1617487954"},{"chainId":1,"address":"0x3b62f3820e0b035cc4ad602dece6d796bc325325","name":"DEUS Finance","symbol":"DEUS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12539/thumb/deus_logo.jpg?1611136731"},{"chainId":1,"address":"0x4eed0fa8de12d5a86517f214c2f11586ba2ed88d","name":"DragonBite","symbol":"BITE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16386/thumb/dragonbite.PNG?1623893567"},{"chainId":1,"address":"0x24a6a37576377f63f194caa5f518a60f45b42921","name":"Float Protocol","symbol":"BANK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14116/thumb/FLOAT-Bank_LOGO-reduced_01.png?1616573606"},{"chainId":1,"address":"0x6704b673c70de9bf74c8fba4b4bd748f0e2190e1","name":"Ubex","symbol":"UBEX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4163/thumb/ubex.png?1547039421"},{"chainId":1,"address":"0x5228a22e72ccc52d415ecfd199f99d0665e7733b","name":"pTokens BTC","symbol":"PBTC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10805/thumb/J51iIea.png?1583891599"},{"chainId":1,"address":"0xf6537fe0df7f0cc0985cf00792cc98249e73efa0","name":"GIV Token","symbol":"GIV","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8996/thumb/giv.png?1596069222"},{"chainId":1,"address":"0x6e765d26388a17a6e86c49a8e41df3f58abcd337","name":"Kangal","symbol":"KANGAL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14241/thumb/logo-200.png?1622341641"},{"chainId":1,"address":"0x0128e4fccf5ef86b030b28f0a8a029a3c5397a94","name":"FlashSwap","symbol":"FSP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12362/thumb/ZKvuJEUR_400x400.jpg?1599299420"},{"chainId":1,"address":"0x58b6a8a3302369daec383334672404ee733ab239","name":"Livepeer","symbol":"LPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7137/thumb/logo-circle-green.png?1619593365"},{"chainId":1,"address":"0x126c121f99e1e211df2e5f8de2d96fa36647c855","name":"DEGEN Index","symbol":"DEGEN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14143/thumb/alpha_logo.png?1614651244"},{"chainId":1,"address":"0x99ea4db9ee77acd40b119bd1dc4e33e1c070b80d","name":"Quantstamp","symbol":"QSP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1219/thumb/0_E0kZjb4dG4hUnoDD_.png?1604815917"},{"chainId":1,"address":"0xe28b3b32b6c345a34ff64674606124dd5aceca30","name":"Injective Protocol","symbol":"INJ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12882/thumb/Injective_Icon.png?1613669548"},{"chainId":1,"address":"0x1aabf9b575e4329b8c8f272428ad5e43ab4aefc8","name":"Bugg Inu","symbol":"BUGG","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16413/thumb/bugg.PNG?1623971743"},{"chainId":1,"address":"0xf85feea2fdd81d51177f6b8f35f0e6734ce45f5f","name":"CyberMiles","symbol":"CMT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1300/thumb/cybermiles.png?1547035327"},{"chainId":1,"address":"0x12b19d3e2ccc14da04fae33e63652ce469b3f2fd","name":"GridPlus","symbol":"GRID","decimals":12,"logoURI":"https://assets.coingecko.com/coins/images/1106/thumb/grid.png?1547743150"},{"chainId":1,"address":"0x7ca62545a380e7d71f8f5cfa14b9211002075930","name":"GivingToServices SV","symbol":"SVS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16436/thumb/SVS.png?1624081687"},{"chainId":1,"address":"0xed0d5747a9ab03a75fbfec3228cd55848245b75d","name":"e Money","symbol":"NGM","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/13722/thumb/logo-200x200.jpg?1626095888"},{"chainId":1,"address":"0xf1f508c7c9f0d1b15a76fba564eef2d956220cf7","name":"Pepedex","symbol":"PPDEX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13022/thumb/output-onlinepngtools-1.png?1604720841"},{"chainId":1,"address":"0xc834fa996fa3bec7aad3693af486ae53d8aa8b50","name":"Convergence","symbol":"CONV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14519/thumb/Convergence_Logo_%28Final%29.png?1616667041"},{"chainId":1,"address":"0x0000000000085d4780b73119b644ae5ecd22b376","name":"TrueUSD","symbol":"TUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3449/thumb/tusd.png?1618395665"},{"chainId":1,"address":"0x4fab740779c73aa3945a5cf6025bf1b0e7f6349c","name":"Dirty Finance","symbol":"DIRTY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15326/thumb/DIRTY-token-logo-200.png?1620514355"},{"chainId":1,"address":"0xae1eaae3f627aaca434127644371b67b18444051","name":"Yield Optimization ","symbol":"YOP","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13678/thumb/J7zykPx.jpg?1610802162"},{"chainId":1,"address":"0xabafa52d3d5a2c18a4c1ae24480d22b831fc0413","name":"Future Of Finance F","symbol":"FFF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15761/thumb/xg1NFl0.png?1621825451"},{"chainId":1,"address":"0xba630d3ba20502ba07975b15c719beecc8e4ebb0","name":"Ethereum Pro","symbol":"EPRO","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15940/thumb/logo-2.png?1623679011"},{"chainId":1,"address":"0xbc19712feb3a26080ebf6f2f7849b417fdd792ca","name":"BoringDAO","symbol":"BORING","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16429/thumb/Tjq3pXEH_400x400.jpg?1623997009"},{"chainId":1,"address":"0xd5281bb2d1ee94866b03a0fccdd4e900c8cb5091","name":"Husky","symbol":"HUSKY","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/14842/thumb/husky_logo.png?1618634383"},{"chainId":1,"address":"0xebd9d99a3982d547c5bb4db7e3b1f9f14b67eb83","name":"Everest","symbol":"ID","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5209/thumb/logo.png?1610866164"},{"chainId":1,"address":"0x998ffe1e43facffb941dc337dd0468d52ba5b48a","name":"Rupiah Token","symbol":"IDRT","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/9441/thumb/57421944_1371636006308255_3647136573922738176_n.jpg?1567462531"},{"chainId":1,"address":"0xb1191f691a355b43542bea9b8847bc73e7abb137","name":"Kirobo","symbol":"KIRO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12688/thumb/QmScxyKBwqbGJZmp38EwaoRpXbzPkq3tvuMjeuJE1YLZeG.png?1601672684"},{"chainId":1,"address":"0x43a96962254855f16b925556f9e97be436a43448","name":"Hord","symbol":"HORD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14972/thumb/Avatar_white.png?1619513849"},{"chainId":1,"address":"0x4161725d019690a3e0de50f6be67b07a86a9fae1","name":"Token Pocket","symbol":"TPT","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/7603/thumb/_E6sbg1g_400x400.jpg?1548828066"},{"chainId":1,"address":"0xe8272210954ea85de6d2ae739806ab593b5d9c51","name":"Alpha5","symbol":"A5T","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13848/thumb/a5t.jpg?1614652988"},{"chainId":1,"address":"0xee06a81a695750e71a662b51066f2c74cf4478a0","name":"Decentral Games","symbol":"DG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13267/thumb/Decentral_Games_Logo-1.png?1621652581"},{"chainId":1,"address":"0x228ba514309ffdf03a81a205a6d040e429d6e80c","name":"Global Social Chain","symbol":"GSC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4304/thumb/global-social-chain.png?1547742843"},{"chainId":1,"address":"0xe38b72d6595fd3885d1d2f770aa23e94757f91a1","name":"TecraCoin","symbol":"TCR","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7836/thumb/tcr.jpg?1604903462"},{"chainId":1,"address":"0xd71ecff9342a5ced620049e616c5035f1db98620","name":"sEUR","symbol":"SEUR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13637/thumb/sEUR.png?1610609277"},{"chainId":1,"address":"0x9040e237c3bf18347bb00957dc22167d0f2b999d","name":"Standard Protocol","symbol":"STND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15100/thumb/standard.jpeg?1619691869"},{"chainId":1,"address":"0xbed4ab0019ff361d83ddeb74883dac8a70f5ea1e","name":"MerchDAO","symbol":"MRCH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14540/thumb/logo_256x256.png?1616891356"},{"chainId":1,"address":"0x26c8afbbfe1ebaca03c2bb082e69d0476bffe099","name":"Cellframe","symbol":"CELL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14465/thumb/cellframe_logo.png?1616333567"},{"chainId":1,"address":"0xaf691508ba57d416f895e32a1616da1024e882d2","name":"Pinknode","symbol":"PNODE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15469/thumb/pnode.jpeg?1620916010"},{"chainId":1,"address":"0xbbc2ae13b23d715c30720f079fcd9b4a74093505","name":"Ethernity Chain","symbol":"ERN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14238/thumb/ethernity_logo.png?1615189750"},{"chainId":1,"address":"0x3758e00b100876c854636ef8db61988931bb8025","name":"Uniqly","symbol":"UNIQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14808/thumb/Hnet-com-image.png?1618538742"},{"chainId":1,"address":"0xad4f86a25bbc20ffb751f2fac312a0b4d8f88c64","name":"OptionRoom","symbol":"ROOM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13889/thumb/option_room_logo.png?1612518313"},{"chainId":1,"address":"0xbdab72602e9ad40fc6a6852caf43258113b8f7a5","name":"Sovryn","symbol":"ESOV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16248/thumb/sov.PNG?1623380748"},{"chainId":1,"address":"0xe74dc43867e0cbeb208f1a012fc60dcbbf0e3044","name":"DeFIRE","symbol":"CWAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15722/thumb/defire.PNG?1621635373"},{"chainId":1,"address":"0x939a7a577d93ad29b64c1595b1284ce660a479b9","name":"Jejudoge","symbol":"JEJUDOGE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15983/thumb/1621125153419.jpg?1622534010"},{"chainId":1,"address":"0x3431f91b3a388115f00c5ba9fdb899851d005fb5","name":"GeroWallet","symbol":"GERO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15602/thumb/PdAQXY8t_400x400.jpg?1621307751"},{"chainId":1,"address":"0x05ac103f68e05da35e78f6165b9082432fe64b58","name":"eToro Euro","symbol":"EURX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10522/thumb/4.png?1580510998"},{"chainId":1,"address":"0x1f8a626883d7724dbd59ef51cbd4bf1cf2016d13","name":"Jigstack","symbol":"STAK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14978/thumb/jigstack.PNG?1619216498"},{"chainId":1,"address":"0x1ca02dd95f3f1e33da7f5afe15ea866dab07af04","name":"King Arthur","symbol":"BKING","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16162/thumb/king-arthur.png?1623142524"},{"chainId":1,"address":"0x9f20ed5f919dc1c1695042542c13adcfc100dcab","name":"Component","symbol":"CMP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15048/thumb/Component.png?1619549859"},{"chainId":1,"address":"0xa3bed4e1c75d00fa6f4e5e6922db7261b5e9acd2","name":"mStable Governance ","symbol":"MTA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11846/thumb/mStable.png?1594950533"},{"chainId":1,"address":"0xe6f1966d04cfcb9cd1b1dc4e8256d8b501b11cba","name":"SafeEarth","symbol":"SAFEEARTH","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15449/thumb/SafeEarthLogo2000.png?1620833647"},{"chainId":1,"address":"0x7b35ce522cb72e4077baeb96cb923a5529764a00","name":"Impermax","symbol":"IMX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15126/thumb/Copy_of_200px.png?1619761475"},{"chainId":1,"address":"0x808507121b80c02388fad14726482e061b8da827","name":"Pendle","symbol":"PENDLE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15069/thumb/Pendle.png?1619611216"},{"chainId":1,"address":"0x7c5ff719a6c76fe643e9ecd0f11f146a2de05f14","name":"Ganesha Token","symbol":"GNSH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15214/thumb/D0JX7d1.png?1620110966"},{"chainId":1,"address":"0x1b40183efb4dd766f11bda7a7c3ad8982e998421","name":"Vesper Finance","symbol":"VSP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13527/thumb/vesper_logo.jpg?1609399927"},{"chainId":1,"address":"0x3db6ba6ab6f95efed1a6e794cad492faaabf294d","name":"LTO Network","symbol":"LTO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/6068/thumb/LTO_Network.png?1567443682"},{"chainId":1,"address":"0x519c1001d550c0a1dae7d1fc220f7d14c2a521bb","name":"Polkaswap","symbol":"PSWAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15475/thumb/pswap-token-logomark-ticker-icon-200px-transparent-optimized.png?1622447028"},{"chainId":1,"address":"0x6468e79a80c0eab0f9a2b574c8d5bc374af59414","name":"e Radix","symbol":"EXRD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13145/thumb/exrd_logo.png?1605662677"},{"chainId":1,"address":"0xe516d78d784c77d479977be58905b3f2b1111126","name":"Bitspawn","symbol":"SPWN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16513/thumb/bitspwan.PNG?1624321594"},{"chainId":1,"address":"0x65f9a292f1aeed5d755aa2fd2fb17ab2e9431447","name":"SoMee Social","symbol":"SOMEE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16406/thumb/SoMeeBallLogo200x200.png?1623920285"},{"chainId":1,"address":"0x9992ec3cf6a55b00978cddf2b27bc6882d88d1ec","name":"Polymath Network","symbol":"POLY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2784/thumb/inKkF01.png?1605007034"},{"chainId":1,"address":"0x44e28f2acc84c36373badcd681749d38e01e2cc4","name":"vSpaceX","symbol":"VSPACEX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14525/thumb/itovault_logo_%281%29.png?1616739254"},{"chainId":1,"address":"0xa0008f510fe9ee696e7e320c9e5cbf61e27791ee","name":"GAMB","symbol":"GMB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4497/thumb/gmb.png?1547039806"},{"chainId":1,"address":"0x8ab7404063ec4dbcfd4598215992dc3f8ec853d7","name":"Akropolis","symbol":"AKRO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3328/thumb/Akropolis.png?1547037929"},{"chainId":1,"address":"0x2baac9330cf9ac479d819195794d79ad0c7616e3","name":"adbank","symbol":"ADB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2806/thumb/adbank.png?1547036978"},{"chainId":1,"address":"0x943ed852dadb5c3938ecdc6883718df8142de4c8","name":"FansTime","symbol":"FTI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4952/thumb/fanstime.png?1547395397"},{"chainId":1,"address":"0xe63684bcf2987892cefb4caa79bd21b34e98a291","name":"Chicken","symbol":"KFC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12569/thumb/download.png?1600840301"},{"chainId":1,"address":"0x85eee30c52b0b379b046fb0f85f4f3dc3009afec","name":"Keep Network","symbol":"KEEP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3373/thumb/IuNzUb5b_400x400.jpg?1589526336"},{"chainId":1,"address":"0x5218e472cfcfe0b64a064f055b43b4cdc9efd3a6","name":"unFederalReserve","symbol":"ERSDL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12975/thumb/logo_eRSDL.png?1625755665"},{"chainId":1,"address":"0x94fc5934cf5970e944a67de806eeb5a4b493c6e6","name":"3X Short XRP Token","symbol":"XRPBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10210/thumb/683JEXMN_400x400_%281%29.png?1576535444"},{"chainId":1,"address":"0x84ca8bc7997272c7cfb4d0cd3d55cd942b3c9419","name":"DIA","symbol":"DIA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11955/thumb/DIA-icon-colour_%281%29.png?1596423488"},{"chainId":1,"address":"0x08c32b0726c5684024ea6e141c50ade9690bbdcc","name":"Stratos","symbol":"STOS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16213/thumb/token_512x512.png?1623313898"},{"chainId":1,"address":"0x0e9b56d2233ea2b5883861754435f9c51dbca141","name":"Rare Pepe","symbol":"RPEPE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12575/thumb/rare_pepe_logo.png?1600856124"},{"chainId":1,"address":"0x1614f18fc94f47967a3fbe5ffcd46d4e7da3d787","name":"PAID Network","symbol":"PAID","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13761/thumb/PAID.png?1612493556"},{"chainId":1,"address":"0xfb7b4564402e5500db5bb6d63ae671302777c75a","name":"DexTools","symbol":"DEXT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11603/thumb/dext.png?1605790188"},{"chainId":1,"address":"0x6c28aef8977c9b773996d0e8376d2ee379446f2f","name":"Quickswap","symbol":"QUICK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13970/thumb/1_pOU6pBMEmiL-ZJVb0CYRjQ.png?1613386659"},{"chainId":1,"address":"0x617aecb6137b5108d1e7d4918e3725c8cebdb848","name":"sBNB","symbol":"SBNB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8844/thumb/sBNB.png?1616148783"},{"chainId":1,"address":"0xb1e93236ab6073fdac58ada5564897177d4bcc43","name":"Seele","symbol":"SEELE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3294/thumb/seele.png?1548608910"},{"chainId":1,"address":"0x1fe24f25b1cf609b9c4e7e12d802e3640dfa5e43","name":"Chain Guardians","symbol":"CGG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14326/thumb/cgg_logo.png?1615429976"},{"chainId":1,"address":"0x48c1b2f3efa85fbafb2ab951bf4ba860a08cdbb7","name":"ShowHand","symbol":"HAND","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/5554/thumb/showhand.png?1548609179"},{"chainId":1,"address":"0xd0929d411954c47438dc1d871dd6081f5c5e149c","name":"Refereum","symbol":"RFR","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/2102/thumb/refereum.png?1548608001"},{"chainId":1,"address":"0x2ef52ed7de8c5ce03a4ef0efbe9b7450f2d7edc9","name":"Revain","symbol":"REV","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/1107/thumb/256x256.png?1587018647"},{"chainId":1,"address":"0xea319e87cf06203dae107dd8e5672175e3ee976c","name":"Surf Finance","symbol":"SURF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12982/thumb/surf_200x200.png?1604050261"},{"chainId":1,"address":"0x39e743fee400a5d9b36f1167b70c10e8f06440e5","name":"TNC Coin","symbol":"TNC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11107/thumb/new-logo.png?1588570614"},{"chainId":1,"address":"0x67c597624b17b16fb77959217360b7cd18284253","name":"Benchmark Protocol","symbol":"MARK","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13212/thumb/benchmark_protocol.jpg?1606267583"},{"chainId":1,"address":"0x5a666c7d92e5fa7edcb6390e4efd6d0cdd69cf37","name":"Unmarshal","symbol":"MARSH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14554/thumb/img_circle_256x256.png?1616997706"},{"chainId":1,"address":"0x8b39b70e39aa811b69365398e0aace9bee238aeb","name":"PolkaFoundry","symbol":"PKF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14422/thumb/M7vmFGbV_400x400.png?1615972784"},{"chainId":1,"address":"0x1dea979ae76f26071870f824088da78979eb91c8","name":"SPINDLE","symbol":"SPD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3714/thumb/spindle-core-logo.png?1547038741"},{"chainId":1,"address":"0xd084b83c305dafd76ae3e1b4e1f1fe2ecccb3988","name":"Terra Virtua Kolect","symbol":"TVK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13330/thumb/CoinGLogo.png?1607507042"},{"chainId":1,"address":"0x3a8cccb969a61532d1e6005e2ce12c200caece87","name":"TitanSwap","symbol":"TITAN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12606/thumb/nqGlQzdz_400x400.png?1601019805"},{"chainId":1,"address":"0x961c8c0b1aad0c0b10a51fef6a867e3091bcef17","name":"DeFi Yield Protocol","symbol":"DYP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13480/thumb/dyp_logo.png?1608971751"},{"chainId":1,"address":"0x86e44543164d9b97b14ef7f6f3ab7ba670cab346","name":"QUINADS","symbol":"QUIN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7041/thumb/quinads-logo.png?1547043484"},{"chainId":1,"address":"0xcd7492db29e2ab436e819b249452ee1bbdf52214","name":"SafeMoon Inu","symbol":"SMI","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/16091/thumb/SMI.png?1622801787"},{"chainId":1,"address":"0x77fba179c79de5b7653f68b5039af940ada60ce0","name":"Ampleforth Governan","symbol":"FORTH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14917/thumb/photo_2021-04-22_00.00.03.jpeg?1619020835"},{"chainId":1,"address":"0x04fa0d235c4abf4bcf4787af4cf447de572ef828","name":"UMA","symbol":"UMA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10951/thumb/UMA.png?1586307916"},{"chainId":1,"address":"0x38a2fdc11f526ddd5a607c1f251c065f40fbf2f7","name":"PhoenixDAO","symbol":"PHNX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11523/thumb/Token_Icon.png?1618447147"},{"chainId":1,"address":"0xec213f83defb583af3a000b1c0ada660b1902a0f","name":"Presearch","symbol":"PRE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1299/thumb/presearch.png?1548331942"},{"chainId":1,"address":"0xa1d0e215a23d7030842fc67ce582a6afa3ccab83","name":"DFI money","symbol":"YFII","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11902/thumb/YFII-logo.78631676.png?1598677348"},{"chainId":1,"address":"0xe4815ae53b124e7263f08dcdbbb757d41ed658c6","name":"ZKSwap","symbol":"ZKS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13585/thumb/ZKSwap_logo-light.872a149.png?1622541728"},{"chainId":1,"address":"0x95daaab98046846bf4b2853e23cba236fa394a31","name":"EthermonToken","symbol":"EMONT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7272/thumb/colorfull_with_word_250x250.png?1580111776"},{"chainId":1,"address":"0xdc9ac3c20d1ed0b540df9b1fedc10039df13f99c","name":"UTRUST","symbol":"UTK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1824/thumb/300x300_logo.png?1570520533"},{"chainId":1,"address":"0x88cb253d4c8cab8cdf7948a9251db85a13669e23","name":"Yieldly","symbol":"YLDY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16757/thumb/YIELDLY_TOKEN_256x256px.png?1625732457"},{"chainId":1,"address":"0x4f5fa8f2d12e5eb780f6082dd656c565c48e0f24","name":"Gourmet Galaxy","symbol":"GUM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13846/thumb/gum.png?1612320864"},{"chainId":1,"address":"0x1cf402135d7bd27dc9d21c03ae2d8375bc43e9ec","name":"Zodiac","symbol":"ZDC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12245/thumb/zdc.PNG?1598485224"},{"chainId":1,"address":"0xe8663a64a96169ff4d95b4299e7ae9a76b905b31","name":"DPRating","symbol":"RATING","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5383/thumb/dprating.png?1547224023"},{"chainId":1,"address":"0x5eeaa2dcb23056f4e8654a349e57ebe5e76b5e6e","name":"Virtue Poker Points","symbol":"VPP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3386/thumb/vp-logo-200x200.png?1622068750"},{"chainId":1,"address":"0x11eef04c884e24d9b7b4760e7476d06ddf797f36","name":"MX Token","symbol":"MX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8545/thumb/TII1YIdv_400x400.png?1559180170"},{"chainId":1,"address":"0x6c6ee5e31d828de241282b9606c8e98ea48526e2","name":"Holo","symbol":"HOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3348/thumb/Holologo_Profile.png?1547037966"},{"chainId":1,"address":"0xa8b919680258d369114910511cc87595aec0be6d","name":"LUKSO Token","symbol":"LYXE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11423/thumb/1_QAHTciwVhD7SqVmfRW70Pw.png?1590110612"},{"chainId":1,"address":"0x00a8b738e453ffd858a7edf03bccfe20412f0eb0","name":"AllianceBlock","symbol":"ALBT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12392/thumb/alliance_block_logo.jpg?1599546617"},{"chainId":1,"address":"0xf1290473e210b2108a85237fbcd7b6eb42cc654f","name":"HedgeTrade","symbol":"HEDG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7196/thumb/to3Vj4EZ_400x400.jpg?1547043758"},{"chainId":1,"address":"0xd8dae35b487e3453cffd998c6754713c81b0f200","name":"RapDoge","symbol":"RAPDOGE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16749/thumb/rapdoge.png?1624884614"},{"chainId":1,"address":"0xa682ee16b497afceedf47e4820fc2af3845fd2d2","name":"Pika","symbol":"PIKA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14419/thumb/PIKA.jpg?1621938638"},{"chainId":1,"address":"0x15874d65e649880c2614e7a480cb7c9a55787ff6","name":"EthereumMax","symbol":"EMAX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15540/thumb/e-Max-Logo-RGB-Icon-Std.png?1622443785"},{"chainId":1,"address":"0xa9c44135b3a87e0688c41cf8c27939a22dd437c9","name":"BooBank","symbol":"BOOB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12894/thumb/boobank.PNG?1604043315"},{"chainId":1,"address":"0x3d6f0dea3ac3c607b3998e6ce14b6350721752d9","name":"Cardstarter","symbol":"CARDS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14612/thumb/CARDSx200.png?1617252006"},{"chainId":1,"address":"0xaf8a215e81faea7c180ce22b72483525121813bd","name":"Engine","symbol":"EGCC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4531/thumb/2852.png?1547039827"},{"chainId":1,"address":"0x286bda1413a2df81731d4930ce2f862a35a609fe","name":"Wabi","symbol":"WABI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1338/thumb/Tael.png?1547035364"},{"chainId":1,"address":"0x20bc832ca081b91433ff6c17f85701b6e92486c5","name":"rETH2","symbol":"RETH2","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16570/thumb/red256.png?1624495231"},{"chainId":1,"address":"0x5bdc00b6676579b301b276198db1ea9affb94329","name":"Eterbase Utility To","symbol":"XBASE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5059/thumb/image.png?1597301514"},{"chainId":1,"address":"0x3aa5f749d4a6bcf67dac1091ceb69d1f5d86fa53","name":"Deflect","symbol":"DEFLCT","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13369/thumb/deflect_logo.jpg?1609223085"},{"chainId":1,"address":"0x9559aaa82d9649c7a7b220e7c461d2e74c9a3593","name":"rETH","symbol":"RETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14452/thumb/rETH.png?1616660903"},{"chainId":1,"address":"0xb17c88bda07d28b3838e0c1de6a30eafbcf52d85","name":"Shyft Network","symbol":"SHFT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14534/thumb/TOKEN-Gradient.png?1616768352"},{"chainId":1,"address":"0xabbbb6447b68ffd6141da77c18c7b5876ed6c5ab","name":"DATx","symbol":"DATX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2942/thumb/datx.png?1547037168"},{"chainId":1,"address":"0x2369686fc9fb6e1fdc46541891568c2f341906ef","name":"Drakoin","symbol":"DRK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13094/thumb/drakoinlogo200.png?1605076487"},{"chainId":1,"address":"0x9f49ed43c90a540d1cf12f6170ace8d0b88a14e6","name":"ETH RSI 60 40 Yield","symbol":"ETHRSIAPY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11647/thumb/eth-rsi-40-60-ctoken-set.png?1592323952"},{"chainId":1,"address":"0xb67718b98d52318240c52e71a898335da4a28c42","name":"Innovative Bioresea","symbol":"INNBC","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/4043/thumb/INNBC.png?1582800857"},{"chainId":1,"address":"0x41c028a4c1f461ebfc3af91619b240004ebad216","name":"TacoToken","symbol":"TACO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14515/thumb/wnQfs2i.jpeg?1616645310"},{"chainId":1,"address":"0x8fcb1783bf4b71a51f702af0c266729c4592204a","name":"OT Aave Interest Be","symbol":"OT-AUSDC-29DEC2022","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/16582/thumb/Pendle_aUSDC_OT.png?1624507961"},{"chainId":1,"address":"0xeabacd844a196d7faf3ce596edebf9900341b420","name":"sCEX","symbol":"SCEX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11833/thumb/sCEX.png?1616149820"},{"chainId":1,"address":"0x957891c11616d3e0b0a76a76fb42724c382e0ef3","name":"Collateral Pay","symbol":"COLL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14682/thumb/cpay.jpg?1617767452"},{"chainId":1,"address":"0xe95a203b1a91a908f9b9ce46459d101078c2c3cb","name":"ankrETH","symbol":"AETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13403/thumb/aETHc.png?1625756490"},{"chainId":1,"address":"0xa06bc25b5805d5f8d82847d191cb4af5a3e873e0","name":"Aave LINK","symbol":"ALINK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14315/thumb/aLINK.412c6589.png?1615527827"},{"chainId":1,"address":"0x9d91be44c06d373a8a226e1f3b146956083803eb","name":"Aave KNC v1","symbol":"AKNC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11727/thumb/aKNC.png?1593083924"},{"chainId":1,"address":"0x44564d0bd94343f72e3c8a0d22308b7fa71db0bb","name":"BasketDAO","symbol":"BASK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14636/thumb/BASK_200_CIRCLE.png?1617494952"},{"chainId":1,"address":"0xd2877702675e6ceb975b4a1dff9fb7baf4c91ea9","name":"Wrapped Terra","symbol":"LUNA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13628/thumb/wluna.png?1610448334"},{"chainId":1,"address":"0x7deb5e830be29f91e298ba5ff1356bb7f8146998","name":"Aave MKR v1","symbol":"AMKR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11731/thumb/aMKR.png?1593084715"},{"chainId":1,"address":"0x6c5024cd4f8a59110119c56f8933403a539555eb","name":"Aave SUSD","symbol":"ASUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14266/thumb/aSUSD.9b00ffc6.png?1615528241"},{"chainId":1,"address":"0x8a9c4dfe8b9d8962b31e4e16f8321c44d48e246e","name":"Name Change Token","symbol":"NCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13826/thumb/hashmasks-nct.png?1612879286"},{"chainId":1,"address":"0x5d3a536e4d6dbd6114cc1ead35777bab948e3643","name":"cDAI","symbol":"CDAI","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9281/thumb/cDAI.png?1576467585"},{"chainId":1,"address":"0x69948cc03f478b95283f7dbf1ce764d0fc7ec54c","name":"Aave REN v1","symbol":"AREN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12483/thumb/aREN.png?1600188492"},{"chainId":1,"address":"0x73968b9a57c6e53d41345fd57a6e6ae27d6cdb2f","name":"Stake DAO","symbol":"SDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13724/thumb/stakedao_logo.jpg?1611195011"},{"chainId":1,"address":"0x8e870d67f660d95d5be530380d0ec0bd388289e1","name":"Paxos Standard","symbol":"PAX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6013/thumb/paxos_standard.png?1548386291"},{"chainId":1,"address":"0x82b89e0f9c0695639eb88659d0c306dbc242af96","name":"BoomBaby io","symbol":"BOOMB","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16440/thumb/icon-256.png?1624196038"},{"chainId":1,"address":"0x94e0bab2f6ab1f19f4750e42d7349f2740513ad5","name":"Unicly","symbol":"UNIC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14720/thumb/Unicly.png?1621132059"},{"chainId":1,"address":"0xbc6da0fe9ad5f3b0d58160288917aa56653660e9","name":"Alchemix USD","symbol":"ALUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14114/thumb/Alchemix_USD.png?1614410406"},{"chainId":1,"address":"0xbcca60bb61934080951369a648fb03df4f96263c","name":"Aave USDC","symbol":"AUSDC","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/14318/thumb/aUSDC.e260d492.png?1615527797"},{"chainId":1,"address":"0x88df592f8eb5d7bd38bfef7deb0fbc02cf3778a0","name":"Tellor","symbol":"TRB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9644/thumb/Blk_icon_current.png?1584980686"},{"chainId":1,"address":"0xdf5e0e81dff6faf3a7e52ba697820c5e32d806a8","name":"LP yCurve","symbol":"YCURVE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11858/thumb/yCrv.png?1595203628"},{"chainId":1,"address":"0x5f98805a4e8be255a32880fdec7f6728c6568ba0","name":"Liquity USD","symbol":"LUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14666/thumb/Group_3.png?1617631327"},{"chainId":1,"address":"0xac6df26a590f08dcc95d5a4705ae8abbc88509ef","name":"Aave ENJ","symbol":"AENJ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14251/thumb/aENJ.ed76293b.png?1615528574"},{"chainId":1,"address":"0x7fc3ec3574d408f3b59cd88709bacb42575ebf2b","name":"POP","symbol":"POP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14598/thumb/pop.png?1617195542"},{"chainId":1,"address":"0xdf574c24545e5ffecb9a659c229253d4111d87e1","name":"HUSD","symbol":"HUSD","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9567/thumb/HUSD.jpg?1568889385"},{"chainId":1,"address":"0x26ea744e5b887e5205727f55dfbe8685e3b21951","name":"yUSDC BUSD pool ","symbol":"YUSDC","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/14866/thumb/iearnusdc_32.png?1618814197"},{"chainId":1,"address":"0x04bc0ab673d88ae9dbc9da2380cb6b79c4bca9ae","name":"yBUSD","symbol":"YBUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14864/thumb/iearnbusd_32.png?1618813287"},{"chainId":1,"address":"0xd533a949740bb3306d119cc777fa900ba034cd52","name":"Curve DAO Token","symbol":"CRV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12124/thumb/Curve.png?1597369484"},{"chainId":1,"address":"0x4ddc2d193948926d02f9b1fe9e1daa0718270ed5","name":"cETH","symbol":"CETH","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/10643/thumb/ceth2.JPG?1581389598"},{"chainId":1,"address":"0x62b9c7356a2dc64a1969e19c23e4f579f9810aa7","name":"Convex CRV","symbol":"CVXCRV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15586/thumb/convex-crv.png?1621255952"},{"chainId":1,"address":"0x9d1555d8cb3c846bb4f7d5b1b1080872c3166676","name":"Mirrored iShares Si","symbol":"MSLV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13642/thumb/mirror_logo_transparent.png?1611565255"},{"chainId":1,"address":"0x71f85b2e46976bd21302b64329868fd15eb0d127","name":"Axion","symbol":"AXN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13110/thumb/AXN.png?1613016807"},{"chainId":1,"address":"0x674c6ad92fd080e4004b2312b45f796a192d27a0","name":"Neutrino USD","symbol":"USDN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10117/thumb/78GWcZu.png?1600845716"},{"chainId":1,"address":"0x21ca39943e91d704678f5d00b6616650f066fd63","name":"Mirrored Tesla","symbol":"MTSLA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13644/thumb/mirror_logo_transparent.png?1611565294"},{"chainId":1,"address":"0xd36932143f6ebdedd872d5fb0651f4b72fd15a84","name":"Mirrored Apple","symbol":"MAAPL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13514/thumb/mirror_logo_transparent.png?1611564758"},{"chainId":1,"address":"0xedb0414627e6f1e3f082de65cd4f9c693d78cca9","name":"Mirrored Twitter","symbol":"MTWTR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13639/thumb/mirror_logo_transparent.png?1611564718"},{"chainId":1,"address":"0x1d350417d9787e000cc1b95d70e9536dcd91f373","name":"Mirrored iShares Go","symbol":"MIAU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13649/thumb/mirror_logo_transparent.png?1611565655"},{"chainId":1,"address":"0x16c52ceece2ed57dad87319d91b5e3637d50afa4","name":"Total Crypto Market","symbol":"TCAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14703/thumb/tcap.png?1617860242"},{"chainId":1,"address":"0x09fe5f0236f0ea5d930197dce254d77b04128075","name":"Wrapped CryptoKitti","symbol":"WCK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8797/thumb/WCK.png?1561705836"},{"chainId":1,"address":"0x20398ad62bb2d930646d45a6d4292baa0b860c1f","name":"Flashstake","symbol":"FLASH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13533/thumb/FLASH.png?1615182275"},{"chainId":1,"address":"0x26607ac599266b21d13c7acf7942c7701a8b699c","name":"Power Index Pool To","symbol":"PIPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13281/thumb/pipt_logo.jpg?1606910642"},{"chainId":1,"address":"0x5e74c9036fb86bd7ecdcb084a0673efc32ea31cb","name":"sETH","symbol":"SETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8843/thumb/sETH.png?1616150207"},{"chainId":1,"address":"0x30f271c9e86d2b7d00a6376cd96a1cfbd5f0b9b3","name":"Decentr","symbol":"DEC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11816/thumb/Decentr.png?1594637985"},{"chainId":1,"address":"0x892a6f9df0147e5f079b0993f486f9aca3c87881","name":"xFund","symbol":"XFUND","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13770/thumb/xfund.png?1611697744"},{"chainId":1,"address":"0x081f67afa0ccf8c7b17540767bbe95df2ba8d97f","name":"CoinEx Token","symbol":"CET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4817/thumb/coinex-token.png?1547040183"},{"chainId":1,"address":"0x57ab1ec28d129707052df4df418d58a2d46d5f51","name":"sUSD","symbol":"SUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5013/thumb/sUSD.png?1616150765"},{"chainId":1,"address":"0x761d38e5ddf6ccf6cf7c55759d5210750b5d60f3","name":"Dogelon Mars","symbol":"ELON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14962/thumb/6GxcPRo3_400x400.jpg?1619157413"},{"chainId":1,"address":"0xfca59cd816ab1ead66534d82bc21e7515ce441cf","name":"Rarible","symbol":"RARI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11845/thumb/Rari.png?1594946953"},{"chainId":1,"address":"0x4b1e80cac91e2216eeb63e29b957eb91ae9c2be8","name":"Jupiter","symbol":"JUP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10351/thumb/Jupiter-Logo-Def-No-Stroke-256px.png?1613529417"},{"chainId":1,"address":"0xeb4c2781e4eba804ce9a9803c67d0893436bb27d","name":"renBTC","symbol":"RENBTC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11370/thumb/renBTC.png?1589985711"},{"chainId":1,"address":"0x297d33e17e61c2ddd812389c2105193f8348188a","name":"Strudel Finance","symbol":"TRDL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13854/thumb/1614634281474-TRDL_LOGO_PNG.png?1614671874"},{"chainId":1,"address":"0x456d8f0d25a4e787ee60c401f8b963a465148f70","name":"Cavapoo","symbol":"CAVA","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16047/thumb/VimPINu.png?1622689097"},{"chainId":1,"address":"0xd7c49cee7e9188cca6ad8ff264c1da2e69d4cf3b","name":"Nexus Mutual","symbol":"NXM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11810/thumb/nexus-mutual.jpg?1594547726"},{"chainId":1,"address":"0x896e145568624a498c5a909187363ae947631503","name":"WasabiX","symbol":"WASABI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14522/thumb/WASABI.299ec8f7.png?1616721315"},{"chainId":1,"address":"0xee9801669c6138e84bd50deb500827b776777d28","name":"O3 Swap","symbol":"O3","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15460/thumb/o3.png?1620904316"},{"chainId":1,"address":"0xba2184520a1cc49a6159c57e61e1844e085615b6","name":"HelloGold","symbol":"HGT","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1005/thumb/hellogold.png?1547743862"},{"chainId":1,"address":"0xa4e8c3ec456107ea67d3075bf9e3df3a75823db0","name":"Loom Network OLD ","symbol":"LOOMOLD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3387/thumb/1_K76UVoLq-FOL7l-_Fag-Qw_2x.png?1547038040"},{"chainId":1,"address":"0xa0246c9032bc3a600820415ae600c6388619a14d","name":"Harvest Finance","symbol":"FARM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12304/thumb/Harvest.png?1613016180"},{"chainId":1,"address":"0x95b3497bbcccc46a8f45f5cf54b0878b39f8d96c","name":"UniDex","symbol":"UNIDX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13178/thumb/unidex_logo.png?1605925219"},{"chainId":1,"address":"0x0d438f3b5175bebc262bf23753c1e53d03432bde","name":"Wrapped NXM","symbol":"WNXM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11890/thumb/wrapped-nexus-mutual.jpg?1595811559"},{"chainId":1,"address":"0xcd2828fc4d8e8a0ede91bb38cf64b1a81de65bf6","name":"Oddz","symbol":"ODDZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14421/thumb/img_circle_200x200.png?1617345151"},{"chainId":1,"address":"0x82f4ded9cec9b5750fbff5c2185aee35afc16587","name":"DreamTeam","symbol":"DREAM","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/1969/thumb/dtt.png?1547036249"},{"chainId":1,"address":"0x3432b6a60d23ca0dfca7761b7ab56459d9c964d0","name":"Frax Share","symbol":"FXS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13423/thumb/frax_share.png?1608478989"},{"chainId":1,"address":"0x0000a1c00009a619684135b824ba02f7fbf3a572","name":"AlchemyDAO","symbol":"ALCH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14719/thumb/sbEW5W8.png?1617939648"},{"chainId":1,"address":"0x054d64b73d3d8a21af3d764efd76bcaa774f3bb2","name":"Plasma Finance","symbol":"PPAY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13340/thumb/Hi9sEGAD.png?1607586849"},{"chainId":1,"address":"0x106552c11272420aad5d7e94f8acab9095a6c952","name":"Keanu Inu","symbol":"KEANU","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15896/thumb/keanu_inu.jpg?1622294873"},{"chainId":1,"address":"0x15d4c048f83bd7e37d49ea4c83a07267ec4203da","name":"Gala","symbol":"GALA","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12493/thumb/GALA-COINGECKO.png?1600233435"},{"chainId":1,"address":"0x3155ba85d5f96b2d030a4966af206230e46849cb","name":"THORChain ERC20 ","symbol":"RUNE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13677/thumb/IMG_20210123_132049_458.png?1612179252"},{"chainId":1,"address":"0x383518188c0c6d7730d91b2c03a03c837814a899","name":"Olympus","symbol":"OHM","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/14483/thumb/olympus.png?1616466814"},{"chainId":1,"address":"0xb4fbed161bebcb37afb1cb4a6f7ca18b977ccb25","name":"Dogeswap","symbol":"DOGES","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12763/thumb/20200926-220107.png?1622520018"},{"chainId":1,"address":"0x03be5c903c727ee2c8c4e9bc0acc860cca4715e2","name":"Ternoa","symbol":"CAPS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15921/thumb/e55393fa-7b4d-40f5-9f36-9a8a6bdcb570.png?1622430581"},{"chainId":1,"address":"0x29502fe4d233ef0b45c3647101fa1252ce0634bd","name":"Froge Finance","symbol":"FROGE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/14775/thumb/-p8cz7Bk_400x400.png?1618371907"},{"chainId":1,"address":"0x286c0936c7eaf6651099ab5dab9ee5a6cb5d229d","name":"KwikSwap Protocol","symbol":"KWIK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15853/thumb/communityIcon_b03b6vdbo0171.png?1622163636"},{"chainId":1,"address":"0x7de91b204c1c737bcee6f000aaa6569cf7061cb7","name":"Robonomics Network","symbol":"XRT","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/7024/thumb/Robonomics-Network-logo.png?1547043451"},{"chainId":1,"address":"0x7ff4169a6b5122b664c51c95727d87750ec07c84","name":"Tenset","symbol":"10SET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14629/thumb/10set.png?1617353812"},{"chainId":1,"address":"0x177d39ac676ed1c67a2b268ad7f1e58826e5b0af","name":"Blox","symbol":"CDT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1231/thumb/Blox_Staking_Logo_2.png?1609117544"},{"chainId":1,"address":"0xe66747a101bff2dba3697199dcce5b743b454759","name":"GateToken","symbol":"GT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8183/thumb/gt.png?1556085624"},{"chainId":1,"address":"0x80bb277f4355a43cdbb86a82f9876c946476d9eb","name":"DogDeFiCoin","symbol":"DOGDEFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12912/thumb/dogdefi_logo.jpg?1603425386"},{"chainId":1,"address":"0x95efd1fe6099f65a7ed524def487483221094947","name":"CryptoBonusMiles","symbol":"CBM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9302/thumb/CryptoBonusMiles.png?1565865043"},{"chainId":1,"address":"0x656c00e1bcd96f256f224ad9112ff426ef053733","name":"Efinity","symbol":"EFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16558/thumb/efi-200px_%281%29.png?1624439132"},{"chainId":1,"address":"0x26946ada5ecb57f3a1f91605050ce45c482c9eb1","name":"BitcoinSoV","symbol":"BSOV","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/9205/thumb/bsov.png?1578020375"},{"chainId":1,"address":"0x57b946008913b82e4df85f501cbaed910e58d26c","name":"Marlin","symbol":"POND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8903/thumb/POND_200x200.png?1622515451"},{"chainId":1,"address":"0x88ef27e69108b2633f8e1c184cc37940a075cc02","name":"Dego Finance","symbol":"DEGO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12503/thumb/c185FKx.png?1600298167"},{"chainId":1,"address":"0xedadeb5faa413e6c8623461849dfd0b7c3790c32","name":"Obortech","symbol":"OBOT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14929/thumb/OBORTECH_200.png?1619070515"},{"chainId":1,"address":"0x1453dbb8a29551ade11d89825ca812e05317eaeb","name":"Tendies","symbol":"TEND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11924/thumb/aaaaa.jpg?1596645622"},{"chainId":1,"address":"0x4e3fbd56cd56c3e72c1403e103b45db9da5b9d2b","name":"Convex Finance","symbol":"CVX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15585/thumb/convex.png?1621256328"},{"chainId":1,"address":"0x33349b282065b0284d756f0577fb39c158f935e6","name":"Maple","symbol":"MPL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14097/thumb/photo_2021-05-03_14.20.41.jpeg?1620022863"},{"chainId":1,"address":"0x8315472bae77f9a2b856a67eb0796480aafcd51c","name":"MMAON","symbol":"MMAON","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14645/thumb/MMAON.png?1618295603"},{"chainId":1,"address":"0xe53ec727dbdeb9e2d5456c3be40cff031ab40a55","name":"SuperFarm","symbol":"SUPER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14040/thumb/6YPdWn6.png?1613975899"},{"chainId":1,"address":"0x87edffde3e14c7a66c9b9724747a1c5696b742e6","name":"SWAG Finance","symbol":"SWAG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12805/thumb/photo_2020-10-14_23.17.02.jpeg?1602688642"},{"chainId":1,"address":"0xb26631c6dda06ad89b93c71400d25692de89c068","name":"Minds","symbol":"MINDS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11517/thumb/Minds.png?1590580465"},{"chainId":1,"address":"0xf29992d7b589a0a6bd2de7be29a97a6eb73eaf85","name":"DMScript","symbol":"DMST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11896/thumb/h0snSnDE_400x400.jpg?1595892384"},{"chainId":1,"address":"0x43044f861ec040db59a7e324c40507addb673142","name":"Cap","symbol":"CAP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11775/thumb/CAP.png?1594083244"},{"chainId":1,"address":"0xd13c7342e1ef687c5ad21b27c2b65d772cab5c8c","name":"Ultra","symbol":"UOS","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/4480/thumb/Ultra.png?1563356418"},{"chainId":1,"address":"0xfc82bb4ba86045af6f327323a46e80412b91b27d","name":"Prometeus","symbol":"PROM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8825/thumb/G2LY-Dg_.png?1591698270"},{"chainId":1,"address":"0x946112efab61c3636cbd52de2e1392d7a75a6f01","name":"Hydro","symbol":"HYDRO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3678/thumb/New_Hydro_logo.png?1625473878"},{"chainId":1,"address":"0xc8c424b91d8ce0137bab4b832b7f7d154156ba6c","name":"apM Coin","symbol":"APM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10069/thumb/PvDCvh5h_400x400.png?1575460334"},{"chainId":1,"address":"0x7d29a64504629172a429e64183d6673b9dacbfce","name":"Vectorspace AI","symbol":"VXV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2063/thumb/vectorspace-ai-logo.jpeg?1547036362"},{"chainId":1,"address":"0x7bd6a4e7db3a34c485a8dd02b30b6565e3bbc633","name":"KOK Coin","symbol":"KOK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10502/thumb/logo_navy.png?1580250344"},{"chainId":1,"address":"0x0aacfbec6a24756c20d41914f2caba817c0d8521","name":"YAM","symbol":"YAM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12530/thumb/YAM-icon.png?1600495536"},{"chainId":1,"address":"0x08389495d7456e1951ddf7c3a1314a4bfb646d8b","name":"Crypterium","symbol":"CRPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1901/thumb/crypt.png?1547036205"},{"chainId":1,"address":"0x3d1e3c5f658d74c585267350cac22fd44e8d951c","name":"Open Monetary Syste","symbol":"OMS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16152/thumb/new-ohms-logo.png?1623132711"},{"chainId":1,"address":"0xea097a2b1db00627b2fa17460ad260c016016977","name":"Upfiring","symbol":"UFR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1170/thumb/upfiring.png?1548759693"},{"chainId":1,"address":"0xcd62b1c403fa761baadfc74c525ce2b51780b184","name":"Aragon Court","symbol":"ANJ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10765/thumb/ANJ.png?1588956187"},{"chainId":1,"address":"0xeeee2a622330e6d2036691e983dee87330588603","name":"Asko","symbol":"ASKO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11773/thumb/Asko_Logo_%28200x200%29.png?1604706371"},{"chainId":1,"address":"0x14cfc7aeaa468e8c789785c39e0b753915aeb426","name":"FrogDAO Dime","symbol":"FDD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14576/thumb/fdd_logo.jpg?1617092745"},{"chainId":1,"address":"0x70d2b7c19352bb76e4409858ff5746e500f2b67c","name":"Pawtocol","symbol":"UPI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12186/thumb/pawtocol.jpg?1597962008"},{"chainId":1,"address":"0xa1d65e8fb6e87b60feccbc582f7f97804b725521","name":"DXdao","symbol":"DXD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11148/thumb/dxdao.png?1607999331"},{"chainId":1,"address":"0xe54f9e6ab80ebc28515af8b8233c1aee6506a15e","name":"Spaghetti","symbol":"PASTA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12170/thumb/pasta_logo.png?1597803191"},{"chainId":1,"address":"0xdcd85914b8ae28c1e62f1c488e1d968d5aaffe2b","name":"TOP Network","symbol":"TOP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7058/thumb/topnetwork-logo.png?1547043514"},{"chainId":1,"address":"0x4639cd8cd52ec1cf2e496a606ce28d8afb1c792f","name":"CBDAO","symbol":"BREE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12096/thumb/cbdao_logo.jpg?1597059848"},{"chainId":1,"address":"0xf1f955016ecbcd7321c7266bccfb96c68ea5e49b","name":"Rally","symbol":"RLY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12843/thumb/image.png?1611212077"},{"chainId":1,"address":"0x668dbf100635f593a3847c0bdaf21f0a09380188","name":"BNSD Finance","symbol":"BNSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12368/thumb/bnsd.png?1599358388"},{"chainId":1,"address":"0x166f1a7ecae00bd43876a25b10a63c575e05c0e7","name":"VERA","symbol":"VERA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9766/thumb/hn9LRFGrVzyuPJrDIrVeCdUN2IfxIwWDk6mM5U9cGm_b0oPyENjOrXzTJ7vwHE65PIzM_H4nGlcHJHPBV5qHoQ8cfwRSud89RJHUngAGMnYIoLZ-UzEk9HuspfOmNu2Finm8RZW-UIM1_Jykw3Cj743iNPqjsqNxkuazLsa0h76oIwf61Sn3h9-IFiwgVLXyfRVuCO0bTY6q_aLJLwzE-P1OALNJfpLSVY52ygRlDGMZS1qj.jpg?1575358608"},{"chainId":1,"address":"0x1beef31946fbbb40b877a72e4ae04a8d1a5cee06","name":"Parachute","symbol":"PAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7590/thumb/Parachute_Logo.png?1560918207"},{"chainId":1,"address":"0x122a86b5dff2d085afb49600b4cd7375d0d94a5f","name":"Italian Lira","symbol":"ITL","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/3656/thumb/italian-lira.png?1547974594"},{"chainId":1,"address":"0xd241d7b5cb0ef9fc79d9e4eb9e21f5e209f52f7d","name":"Hoo Token","symbol":"HOO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/12968/thumb/line3-1.png?1622516697"},{"chainId":1,"address":"0x0cf0ee63788a0849fe5297f3407f701e122cc023","name":"Streamr","symbol":"DATA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1115/thumb/streamr.png?1547035101"},{"chainId":1,"address":"0x99fe3b1391503a1bc1788051347a1324bff41452","name":"SX Network","symbol":"SX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13779/thumb/sportx.png?1611725183"},{"chainId":1,"address":"0xef9cd7882c067686691b6ff49e650b43afbbcc6b","name":"FinNexus","symbol":"FNX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11488/thumb/finnexus_gecko.png?1591260971"},{"chainId":1,"address":"0xbf776e4fca664d791c4ee3a71e2722990e003283","name":"Smoothy","symbol":"SMTY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15039/thumb/dDxKgwPN_400x400.jpg?1619507030"},{"chainId":1,"address":"0x07e3c70653548b04f0a75970c1f81b4cbbfb606f","name":"Agrello","symbol":"DLT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/900/thumb/delta_200x200.png?1616645398"},{"chainId":1,"address":"0x4fabb145d64652a948d72533023f6e7a623c7c53","name":"Binance USD","symbol":"BUSD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9576/thumb/BUSD.png?1568947766"},{"chainId":1,"address":"0xae7ab96520de3a18e5e111b5eaab095312d7fe84","name":"Lido Staked Ether","symbol":"STETH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13442/thumb/steth_logo.png?1608607546"},{"chainId":1,"address":"0x6149c26cd2f7b5ccdb32029af817123f6e37df5b","name":"Launchpool","symbol":"LPOOL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14041/thumb/dGUvV0HQ_400x400.jpg?1613976219"},{"chainId":1,"address":"0x956f47f50a910163d8bf957cf5846d573e7f87ca","name":"Fei Protocol","symbol":"FEI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14570/thumb/ZqsF51Re_400x400.png?1617082206"},{"chainId":1,"address":"0x7f86c782ec802ac402e0369d2e6d500256f7abc5","name":"RING X PLATFORM","symbol":"RINGX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11818/thumb/RINGX.png?1594680207"},{"chainId":1,"address":"0x9aab071b4129b083b01cb5a0cb513ce7eca26fa5","name":"HUNT","symbol":"HUNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7989/thumb/HUNT.png?1571024256"},{"chainId":1,"address":"0xb1ec548f296270bc96b8a1b3b3c8f3f04b494215","name":"Foresight","symbol":"FORS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12374/thumb/foresight_logo.jpg?1599389915"},{"chainId":1,"address":"0x5b7533812759b45c2b44c19e320ba2cd2681b542","name":"SingularityNET","symbol":"AGIX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/2138/thumb/singularitynet.png?1548609559"},{"chainId":1,"address":"0x763fa6806e1acf68130d2d0f0df754c93cc546b2","name":"Lition","symbol":"LIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6580/thumb/Lition_ico.png?1547042787"},{"chainId":1,"address":"0xea54c81fe0f72de8e86b6dc78a9271aa3925e3b5","name":"Bgogo Token","symbol":"BGG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5066/thumb/BGG.png?1547040472"},{"chainId":1,"address":"0xa0b73e1ff0b80914ab6fe0444e65848c4c34450b","name":"Crypto com Coin","symbol":"CRO","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/7310/thumb/cypto.png?1547043960"},{"chainId":1,"address":"0x514cdb9cd8a2fb2bdcf7a3b8ddd098caf466e548","name":"RedPanda Earth","symbol":"REDPANDA","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15736/thumb/N-52GutZ_400x400.jpg?1621684353"},{"chainId":1,"address":"0xea1ea0972fa092dd463f2968f9bb51cc4c981d71","name":"Modefi","symbol":"MOD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13980/thumb/modefi_logo.png?1613453111"},{"chainId":1,"address":"0xa393473d64d2f9f026b60b6df7859a689715d092","name":"Lattice Token","symbol":"LTX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/13050/thumb/Lattice.jpg?1613976295"},{"chainId":1,"address":"0x419c4db4b9e25d6db2ad9691ccb832c8d9fda05e","name":"Dragonchain","symbol":"DRGN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1289/thumb/dragonchain.png?1547957761"},{"chainId":1,"address":"0xe796d6ca1ceb1b022ece5296226bf784110031cd","name":"Blind Boxes","symbol":"BLES","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14537/thumb/BlindBoxes_logo_fuschia.png?1618300494"},{"chainId":1,"address":"0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e","name":"yearn finance","symbol":"YFI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11849/thumb/yfi-192x192.png?1598325330"},{"chainId":1,"address":"0x1b073382e63411e3bcffe90ac1b9a43fefa1ec6f","name":"Bitpanda Ecosystem ","symbol":"BEST","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/8738/thumb/BEST-Coin-Logo.png?1619079782"},{"chainId":1,"address":"0xc8d674114bac90148d11d3c1d33c61835a0f9dcd","name":"Mirrored Netflix","symbol":"MNFLX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13643/thumb/mirror_logo_transparent.png?1611565277"},{"chainId":1,"address":"0xe5caef4af8780e59df925470b050fb23c43ca68c","name":"Ferrum Network","symbol":"FRM","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/8251/thumb/frm.png?1563777564"},{"chainId":1,"address":"0xba9d4199fab4f26efe3551d490e3821486f135ba","name":"SwissBorg","symbol":"CHSB","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/2117/thumb/YJUrRy7r_400x400.png?1589794215"},{"chainId":1,"address":"0xf1a91c7d44768070f711c68f33a7ca25c8d30268","name":"Charli3","symbol":"C3","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15052/thumb/show_image.jpg?1619561192"},{"chainId":1,"address":"0xccac36423def6c19ee6b5679144e2976e309ca45","name":"Hachiko Inu","symbol":"HACHIKO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15340/thumb/Hachiko.png?1623248394"},{"chainId":1,"address":"0xd4c435f5b09f855c3317c8524cb1f586e42795fa","name":"Cindicator","symbol":"CND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1006/thumb/cindicator.png?1547034913"},{"chainId":1,"address":"0x8b0e42f366ba502d787bb134478adfae966c8798","name":"LABS Group","symbol":"LABS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14401/thumb/LABS_logo_icon_COLOR-8.png?1615890483"},{"chainId":1,"address":"0xfa3118b34522580c35ae27f6cf52da1dbb756288","name":"Linkeye","symbol":"LET","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/1814/thumb/linkeye.png?1547975964"},{"chainId":1,"address":"0x995de3d961b40ec6cdee0009059d48768ccbdd48","name":"Union Fair Coin","symbol":"UFC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11750/thumb/maiOmI3b_400x400.png?1593417703"},{"chainId":1,"address":"0xade00c28244d5ce17d72e40330b1c318cd12b7c3","name":"AdEx","symbol":"ADX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/847/thumb/adex.png?1547034643"},{"chainId":1,"address":"0x3affcca64c2a6f4e3b6bd9c64cd2c969efd1ecbe","name":"DSLA Protocol","symbol":"DSLA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6694/thumb/dsla_logo-squared_200x200.png?1569571063"},{"chainId":1,"address":"0xca1207647ff814039530d7d35df0e1dd2e91fa84","name":"dHEDGE DAO","symbol":"DHT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12508/thumb/dht.png?1600752201"},{"chainId":1,"address":"0x221657776846890989a759ba2973e427dff5c9bb","name":"Augur","symbol":"REP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/309/thumb/REP.png?1596339859"},{"chainId":1,"address":"0x1cf4592ebffd730c7dc92c1bdffdfc3b9efcf29a","name":"Waves","symbol":"WAVES","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/425/thumb/waves.png?1548386117"},{"chainId":1,"address":"0x0e69d0a2bbb30abcb7e5cfea0e4fde19c00a8d47","name":"Carlive Chain","symbol":"IOV","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/5339/thumb/carlive-chain.png?1547738870"},{"chainId":1,"address":"0x2d80f5f5328fdcb6eceb7cacf5dd8aedaec94e20","name":"AGA Token","symbol":"AGA","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/12180/thumb/aga-logo.png?1597937396"},{"chainId":1,"address":"0x3593d125a4f7849a1b059e64f4517a86dd60c95d","name":"MANTRA DAO","symbol":"OM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12151/thumb/OM_3D_whtbg.png?1598332353"},{"chainId":1,"address":"0xb453f1f2ee776daf2586501361c457db70e1ca0f","name":"AGA Rewards","symbol":"AGAR","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/14207/thumb/AR256.png?1614931200"},{"chainId":1,"address":"0x19062190b1925b5b6689d7073fdfc8c2976ef8cb","name":"Swarm","symbol":"BZZ","decimals":16,"logoURI":"https://assets.coingecko.com/coins/images/16509/thumb/BZZ.jpeg?1624283786"},{"chainId":1,"address":"0x14d9444f6b9d55caba5d73f15bea947695c11c82","name":"LeoPard Coin","symbol":"LP","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/10795/thumb/lp.PNG?1583722336"},{"chainId":1,"address":"0x8cce19943a01e78b7c277794fb081816f6151bab","name":"3X Long Tether Toke","symbol":"USDTBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10207/thumb/683JEXMN_400x400_%281%29.png?1576535011"},{"chainId":1,"address":"0x9695e0114e12c0d3a3636fab5a18e6b737529023","name":"Dfyn Network","symbol":"DFYN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15368/thumb/SgqhfWz4_400x400_%281%29.jpg?1620666919"},{"chainId":1,"address":"0x8ce9137d39326ad0cd6491fb5cc0cba0e089b6a9","name":"Swipe","symbol":"SXP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9368/thumb/swipe.png?1566792311"},{"chainId":1,"address":"0x431ad2ff6a9c365805ebad47ee021148d6f7dbe0","name":"dForce Token","symbol":"DF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9709/thumb/xlGxxIjI_400x400.jpg?1571006794"},{"chainId":1,"address":"0x0fd10b9899882a6f2fcb5c371e17e70fdee00c38","name":"Pundi X","symbol":"PUNDIX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14571/thumb/vDyefsXq_400x400.jpg?1617085003"},{"chainId":1,"address":"0x5c84bc60a796534bfec3439af0e6db616a966335","name":"Bone","symbol":"BONE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11860/thumb/photo_2021-06-24_00-48-28.jpg?1625495610"},{"chainId":1,"address":"0xfd957f21bd95e723645c07c48a2d8acb8ffb3794","name":"Ethereum Meta","symbol":"ETHM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6586/thumb/ethereum-meta.png?1548125409"},{"chainId":1,"address":"0x6a68de599e8e0b1856e322ce5bd11c5c3c79712b","name":"iBetYou","symbol":"IBY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16423/thumb/qvrS5aNM_400x400.jpg?1623988397"},{"chainId":1,"address":"0x67b6d479c7bb412c54e03dca8e1bc6740ce6b99c","name":"Kylin Network","symbol":"KYL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14164/thumb/kylin_logo.png?1615771554"},{"chainId":1,"address":"0x146d8d942048ad517479c9bab1788712af180fde","name":"MIB Coin","symbol":"MIB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5691/thumb/mibcoin.png?1547041559"},{"chainId":1,"address":"0xbbbbca6a901c926f240b89eacb641d8aec7aeafd","name":"Loopring","symbol":"LRC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/913/thumb/LRC.png?1572852344"},{"chainId":1,"address":"0x51db5ad35c671a87207d88fc11d593ac0c8415bd","name":"Moeda Loyalty Point","symbol":"MDA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/895/thumb/moeda-loyalty-points.png?1547034720"},{"chainId":1,"address":"0x84bb947fcedba6b9c7dcead42df07e113bb03007","name":"Stater","symbol":"STR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14476/thumb/stater.png?1616403854"},{"chainId":1,"address":"0x408e41876cccdc0f92210600ef50372656052a38","name":"REN","symbol":"REN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3139/thumb/REN.png?1589985807"},{"chainId":1,"address":"0xa2b0fde6d710e201d0d608e924a484d1a5fed57c","name":"sXRP","symbol":"SXRP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10455/thumb/sXRP.png?1616150916"},{"chainId":1,"address":"0xa15c7ebe1f07caf6bff097d8a589fb8ac49ae5b3","name":"Pundi X OLD ","symbol":"NPXS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2170/thumb/pundi-x.png?1548386366"},{"chainId":1,"address":"0x3472a5a71965499acd81997a54bba8d852c6e53d","name":"Badger DAO","symbol":"BADGER","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13287/thumb/badger_dao_logo.jpg?1607054976"},{"chainId":1,"address":"0x850aab69f0e0171a9a49db8be3e71351c8247df4","name":"Konomi Network","symbol":"KONO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14406/thumb/konomi.jpg?1615907763"},{"chainId":1,"address":"0x27c70cd1946795b66be9d954418546998b546634","name":"Doge Killer","symbol":"LEASH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15802/thumb/Leash.png?1621931543"},{"chainId":1,"address":"0x389999216860ab8e0175387a0c90e5c52522c945","name":"FEG Token","symbol":"FEG","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/13878/thumb/fav200.png?1619597015"},{"chainId":1,"address":"0xda1e53e088023fe4d1dc5a418581748f52cbd1b8","name":"Aidi Inu","symbol":"AIDI","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16339/thumb/Zc59dvCk_400x400.jpg?1623761548"},{"chainId":1,"address":"0x4a6be56a211a4c4e0dd4474d524138933c17f3e3","name":"Baby Shiba","symbol":"BHIBA","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15426/thumb/NAFfUZrX_400x400.jpg?1620788063"},{"chainId":1,"address":"0x2f141ce366a2462f02cea3d12cf93e4dca49e4fd","name":"FREE coin","symbol":"FREE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5585/thumb/free-coin.png?1548126559"},{"chainId":1,"address":"0xc382e04099a435439725bb40647e2b32dc136806","name":"Cogecoin","symbol":"COGE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16791/thumb/Dog-Logo_1x.png?1625033809"},{"chainId":1,"address":"0x88acdd2a6425c3faae4bc9650fd7e27e0bebb7ab","name":"Alchemist","symbol":"MIST","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14655/thumb/79158662.png?1617589045"},{"chainId":1,"address":"0xf001937650bb4f62b57521824b2c20f5b91bea05","name":"Taraxa","symbol":"TARA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4372/thumb/CPuCDZX.jpg?1616391360"},{"chainId":1,"address":"0xa02120696c7b8fe16c09c749e4598819b2b0e915","name":"Wirex","symbol":"WXT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8835/thumb/Wirex.jpg?1561970529"},{"chainId":1,"address":"0xfa14fa6958401314851a17d6c5360ca29f74b57b","name":"Saito","symbol":"SAITO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14750/thumb/QXqiVfCy_400x400.png?1618126310"},{"chainId":1,"address":"0xff20817765cb7f73d4bde2e66e067e58d11095c2","name":"Amp","symbol":"AMP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12409/thumb/amp-200x200.png?1599625397"},{"chainId":1,"address":"0x2c537e5624e4af88a7ae4060c022609376c8d0eb","name":"BiLira","symbol":"TRYB","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/10119/thumb/v1bIhvRr_400x400.png?1576359242"},{"chainId":1,"address":"0xd46ba6d942050d489dbd938a2c909a5d5039a161","name":"Ampleforth","symbol":"AMPL","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/4708/thumb/Ampleforth.png?1561684250"},{"chainId":1,"address":"0x362bc847a3a9637d3af6624eec853618a43ed7d2","name":"PARSIQ","symbol":"PRQ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11973/thumb/DsNgK0O.png?1596590280"},{"chainId":1,"address":"0xc7038ccf60e48c5b7119e55566a6ad9f2d66c7c2","name":"3X Long BiLira Toke","symbol":"TRYBBULL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10449/thumb/683JEXMN_400x400.png?1579561683"},{"chainId":1,"address":"0xaa6e8127831c9de45ae56bb1b0d4d4da6e5665bd","name":"ETH 2x Flexible Lev","symbol":"ETH2X-FLI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14392/thumb/ETH2x-FLI_%281%29.png?1615875910"},{"chainId":1,"address":"0xb1cd6e4153b2a390cf00a6556b0fc1458c4a5533","name":"ETHBNT Relay","symbol":"ETHBNT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/10664/thumb/ETHBNT_Relay.png?1581486882"},{"chainId":1,"address":"0x50d1c9771902476076ecfc8b2a83ad6b9355a4c9","name":"FTX Token","symbol":"FTT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9026/thumb/F.png?1609051564"},{"chainId":1,"address":"0x00d8318e44780edeefcf3020a5448f636788883c","name":"dAppstore","symbol":"DAPPX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15780/thumb/large-logo.png?1621841062"},{"chainId":1,"address":"0x9d561d63375672abd02119b9bc4fb90eb9e307ca","name":"Ally Direct","symbol":"DRCT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16807/thumb/ally_icon.png?1625148232"},{"chainId":1,"address":"0x672d7b3333d0f069a28b73a268bc6eaec65f2e1a","name":"Kelpie Inu","symbol":"KELPIE","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16538/thumb/logo_256px.png?1624354008"},{"chainId":1,"address":"0xeeaa40b28a2d1b0b08f6f97bb1dd4b75316c6107","name":"Govi","symbol":"GOVI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13875/thumb/GOVI.png?1612451531"},{"chainId":1,"address":"0xa0f0546eb5e3ee7e8cfc5da12e5949f3ae622675","name":"Tokoin","symbol":"TOKO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8807/thumb/logo-tokoin_%281%29.png?1619162982"},{"chainId":1,"address":"0xbf6ff49ffd3d104302ef0ab0f10f5a84324c091c","name":"Nftfy","symbol":"NFTFY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15292/thumb/nfty.PNG?1620365235"},{"chainId":1,"address":"0x0ff5a8451a839f5f0bb3562689d9a44089738d11","name":"Dopex Rebate Token","symbol":"RDPX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16659/thumb/rDPX_200x200_Coingecko.png?1624614475"},{"chainId":1,"address":"0x7659ce147d0e714454073a5dd7003544234b6aa0","name":"XCAD Network","symbol":"XCAD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15857/thumb/xcad.PNG?1622164789"},{"chainId":1,"address":"0xa4cf2afd3b165975afffbf7e487cdd40c894ab6b","name":"Shibaken Finance","symbol":"SHIBAKEN","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/15413/thumb/shibaken-logo-new.png?1620772865"},{"chainId":1,"address":"0xd487892bb4c57edbe7ab401d9fe801c8fe6473f5","name":"Uhive","symbol":"HVE2","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3811/thumb/NEW_Uhive_Logo.png?1616500156"},{"chainId":1,"address":"0xb98d4c97425d9908e66e53a6fdf673acca0be986","name":"Arcblock","symbol":"ABT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2341/thumb/arcblock.png?1547036543"},{"chainId":1,"address":"0xea26c4ac16d4a5a106820bc8aee85fd0b7b2b664","name":"QuarkChain","symbol":"QKC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3849/thumb/quarkchain.png?1548387524"},{"chainId":1,"address":"0x111111111117dc0aa78b770fa6a738034120c302","name":"1inch","symbol":"1INCH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13469/thumb/1inch-token.png?1608803028"},{"chainId":1,"address":"0x1955d744f9435522be508d1ba60e3c12d0690b6a","name":"WPP Token","symbol":"WPP","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8103/thumb/WzdD53fh_400x400.jpg?1554860792"},{"chainId":1,"address":"0x668c50b1c7f46effbe3f242687071d7908aab00a","name":"CoShi Inu","symbol":"COSHI","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15219/thumb/200.jpg?1620119215"},{"chainId":1,"address":"0xa1116930326d21fb917d5a27f1e9943a9595fb47","name":"Staked Aave Balance","symbol":"STKABPT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16789/thumb/StkABPT_2x.png?1625046066"},{"chainId":1,"address":"0x21381e026ad6d8266244f2a583b35f9e4413fa2a","name":"Formation FI","symbol":"FORM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16145/thumb/FORM.png?1623119824"},{"chainId":1,"address":"0xaaaebe6fe48e54f431b0c390cfaf0b017d09d42d","name":"Celsius Network","symbol":"CEL","decimals":4,"logoURI":"https://assets.coingecko.com/coins/images/3263/thumb/CEL_logo.png?1609598753"},{"chainId":1,"address":"0x16980b3b4a3f9d89e33311b5aa8f80303e5ca4f8","name":"KIRA Network","symbol":"KEX","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/13232/thumb/avatar.png?1622601779"},{"chainId":1,"address":"0xac0104cca91d167873b8601d2e71eb3d4d8c33e0","name":"Crowns","symbol":"CWS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13835/thumb/crowns_logo.png?1612176905"},{"chainId":1,"address":"0x8290333cef9e6d528dd5618fb97a76f268f3edd4","name":"Ankr","symbol":"ANKR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4324/thumb/U85xTl2.png?1608111978"},{"chainId":1,"address":"0x0f51bb10119727a7e5ea3538074fb341f56b09ad","name":"DAO Maker","symbol":"DAO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13915/thumb/4.png?1612838831"},{"chainId":1,"address":"0x55296f69f40ea6d20e478533c15a6b08b654e758","name":"XYO Network","symbol":"XYO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4519/thumb/XYO_Network-logo.png?1547039819"},{"chainId":1,"address":"0xfe3e6a25e6b192a42a44ecddcd13796471735acf","name":"Reef Finance","symbol":"REEF","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13504/thumb/Group_10572.png?1610534130"},{"chainId":1,"address":"0x92e187a03b6cd19cb6af293ba17f2745fd2357d5","name":"Unit Protocol New","symbol":"DUCK","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13359/thumb/unit_telegram.png?1607878022"},{"chainId":1,"address":"0x81afa8aca19d5693883b0b1e10ae1ccaf2f42781","name":"ForeverUp","symbol":"FOREVERUP","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/16743/thumb/iBcU7sK.png?1624872315"},{"chainId":1,"address":"0x3301ee63fb29f863f2333bd4466acb46cd8323e6","name":"Akita Inu","symbol":"AKITA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14115/thumb/akitadog_copy.png?1614420157"},{"chainId":1,"address":"0x31cbf205e26ba63296fdbd254a6b1be3ed28ce47","name":"3X Short Tether Gol","symbol":"XAUTBEAR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11980/thumb/683JEXMN_400x400__1_.png?1596618975"},{"chainId":1,"address":"0xa2120b9e674d3fc3875f415a7df52e382f141225","name":"Automata","symbol":"ATA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15985/thumb/ATA.jpg?1622535745"},{"chainId":1,"address":"0xf411903cbc70a74d22900a5de66a2dda66507255","name":"Verasity","symbol":"VRA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14025/thumb/VRA.jpg?1613797653"},{"chainId":1,"address":"0x87d73e916d7057945c9bcd8cdd94e42a6f47f776","name":"NFTX","symbol":"NFTX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13574/thumb/NFTX_%28Real%29.jpg?1613449530"},{"chainId":1,"address":"0x9048c33c7bae0bbe9ad702b17b4453a83900d154","name":"Energy Ledger","symbol":"ELX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13648/thumb/EnergyLedger200x200.png?1626267942"},{"chainId":1,"address":"0xeec2be5c91ae7f8a338e1e5f3b5de49d07afdc81","name":"Dopex","symbol":"DPX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16652/thumb/DPX_%281%29.png?1624598630"},{"chainId":1,"address":"0xb0dfd28d3cf7a5897c694904ace292539242f858","name":"Lotto","symbol":"LOTTO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13822/thumb/Lotto-Logo256x256.png?1612150421"},{"chainId":1,"address":"0x426ca1ea2406c07d75db9585f22781c096e3d0e0","name":"Minereum","symbol":"MNE","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/702/thumb/mne.png?1587615060"},{"chainId":1,"address":"0x767fe9edc9e0df98e07454847909b5e959d7ca0e","name":"Illuvium","symbol":"ILV","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14468/thumb/ILV.JPG?1617182121"},{"chainId":1,"address":"0x93c9175e26f57d2888c7df8b470c9eea5c0b0a93","name":"B cube ai","symbol":"BCUBE","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15948/thumb/bcube.PNG?1622511353"},{"chainId":1,"address":"0x910985ffa7101bf5801dd2e91555c465efd9aab3","name":"Chubby Inu","symbol":"CHINU","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15814/thumb/logo_-_2021-05-26T060705.435.png?1621980432"},{"chainId":1,"address":"0x3b7f247f21bf3a07088c2d3423f64233d4b069f7","name":"Dynamite Token","symbol":"DYNMT","decimals":2,"logoURI":"https://assets.coingecko.com/coins/images/8951/thumb/dynamite_logo.jpg?1598851224"},{"chainId":1,"address":"0x1673a63aa0047294d75954226f3f2f98de77b16f","name":"GENES Chain","symbol":"GENES","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/8857/thumb/logo256_%281%29.png?1562205433"},{"chainId":1,"address":"0xc626d951eff8e421448074bd2ad7805c6d585793","name":"Tiger King","symbol":"TKING","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15605/thumb/tiger_king.PNG?1621314256"},{"chainId":1,"address":"0x0f8c45b896784a1e408526b9300519ef8660209c","name":"XMax","symbol":"XMX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/4643/thumb/xmx.png?1574682262"},{"chainId":1,"address":"0x09a3ecafa817268f77be1283176b946c4ff2e608","name":"Mirror Protocol","symbol":"MIR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13295/thumb/mirror_logo_transparent.png?1611554658"},{"chainId":1,"address":"0x4d2ee5dae46c86da2ff521f7657dad98834f97b8","name":"Pepemon Pepeballs","symbol":"PPBLZ","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12823/thumb/200pepebball-BIG.png?1603330304"},{"chainId":1,"address":"0x10633216e7e8281e33c86f02bf8e565a635d9770","name":"Dvision Network","symbol":"DVI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13020/thumb/WGAhHOLv_400x400.png?1604396086"},{"chainId":1,"address":"0x4092678e4e78230f46a1534c0fbc8fa39780892b","name":"Odyssey","symbol":"OCN","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2559/thumb/ocn.png?1547036683"},{"chainId":1,"address":"0xfbeea1c75e4c4465cb2fccc9c6d6afe984558e20","name":"DuckDaoDime","symbol":"DDIM","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12146/thumb/token_DDIM-01.png?1606982032"},{"chainId":1,"address":"0x3a856d4effa670c54585a5d523e96513e148e95d","name":"Trias Token","symbol":"TRIAS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13963/thumb/5ELqtwp__400x400_%281%29.jpg?1613527958"},{"chainId":1,"address":"0x69b148395ce0015c13e36bffbad63f49ef874e03","name":"DATA","symbol":"DTA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2604/thumb/data.png?1547036749"},{"chainId":1,"address":"0x8e1b448ec7adfc7fa35fc2e885678bd323176e34","name":"Egretia","symbol":"EGT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3614/thumb/egretia.png?1547224764"},{"chainId":1,"address":"0xd22dcf31ca28cf4dce530a0f120e244f4b4539eb","name":"Omniunit","symbol":"OMNIUNIT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13838/thumb/ABE15-E31-32-D6-4-D5-E-8-DB5-4448-F5-BB008-A.png?1612219908"},{"chainId":1,"address":"0x0391d2021f89dc339f60fff84546ea23e337750f","name":"BarnBridge","symbol":"BOND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12811/thumb/barnbridge.jpg?1602728853"},{"chainId":1,"address":"0x0bb217e40f8a5cb79adf04e1aab60e5abd0dfc1e","name":"SWFTCOIN","symbol":"SWFTC","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/2346/thumb/SWFTCoin.jpg?1618392022"},{"chainId":1,"address":"0x44e2dec86b9f0e0266e9aa66e10323a2bd69cf9a","name":"Attrace","symbol":"ATTR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4395/thumb/attrace.png?1624466360"},{"chainId":1,"address":"0x841fb148863454a3b3570f515414759be9091465","name":"Shih Tzu","symbol":"SHIH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15309/thumb/shit.PNG?1620374274"},{"chainId":1,"address":"0xc6ff7eac464c99ff0e1ad8bcfd0ab0cebe08c9a3","name":"YFC","symbol":"YFC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16537/thumb/3oO61J4D_400x400.jpg?1624352360"},{"chainId":1,"address":"0x08d32b0da63e2c3bcf8019c9c5d849d7a9d791e6","name":"Dentacoin","symbol":"DCN","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/850/thumb/dentacoin.png?1547034647"},{"chainId":1,"address":"0x08ad83d779bdf2bbe1ad9cc0f78aa0d24ab97802","name":"Robonomics Web Serv","symbol":"RWS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/11885/thumb/rws_logo.png?1595745253"},{"chainId":1,"address":"0x675bbc7514013e2073db7a919f6e4cbef576de37","name":"Coldstack","symbol":"CLS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15499/thumb/logo_200x200.png?1621072403"},{"chainId":1,"address":"0xdefa4e8a7bcba345f687a2f1456f5edd9ce97202","name":"Kyber Network Cryst","symbol":"KNC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14899/thumb/RwdVsGcw_400x400.jpg?1618923851"},{"chainId":1,"address":"0xb64ef51c888972c908cfacf59b47c1afbc0ab8ac","name":"Storj","symbol":"STORJ","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/949/thumb/storj.png?1547034811"},{"chainId":1,"address":"0x6fc13eace26590b80cccab1ba5d51890577d83b2","name":"Umbrella Network","symbol":"UMB","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13913/thumb/Umbrella_Network_Logo-Vertical_Version.png?1612836176"},{"chainId":1,"address":"0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2","name":"Maker","symbol":"MKR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1364/thumb/Mark_Maker.png?1585191826"},{"chainId":1,"address":"0xad6683b7f3618c44f5ca6040902812dd890dde4d","name":"Tnos Coin","symbol":"TNO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15343/thumb/TNO-token-logo-200.png?1620621861"},{"chainId":1,"address":"0x954b890704693af242613edef1b603825afcd708","name":"Cardstack","symbol":"CARD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/3247/thumb/cardstack.png?1547037769"},{"chainId":1,"address":"0x4691937a7508860f876c9c0a2a617e7d9e945d4b","name":"Wootrade Network","symbol":"WOO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12921/thumb/w2UiemF__400x400.jpg?1603670367"},{"chainId":1,"address":"0x4f3afec4e5a3f2a6a1a411def7d7dfe50ee057bf","name":"Digix Gold","symbol":"DGX","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/4171/thumb/DGX_Token.png?1547039436"},{"chainId":1,"address":"0x6b175474e89094c44da98b954eedeac495271d0f","name":"Dai","symbol":"DAI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/9956/thumb/dai-multi-collateral-mcd.png?1574218774"},{"chainId":1,"address":"0xe4cfe9eaa8cdb0942a80b7bc68fd8ab0f6d44903","name":"Xend Finance","symbol":"XEND","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14496/thumb/WeChat_Image_20210325163206.png?1616661216"},{"chainId":1,"address":"0x2b1fe2cea92436e8c34b7c215af66aaa2932a8b2","name":"Sakhalin Husky","symbol":"SAHU","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15750/thumb/HUSKY_H-1024x683-1.png?1621785464"},{"chainId":1,"address":"0x05d27cdd23e22ca63e7f9c7c6d1b79ede9c4fcf5","name":"Yearn Finance Passi","symbol":"YFPI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12640/thumb/200.png?1601369185"},{"chainId":1,"address":"0xdbdb4d16eda451d0503b854cf79d55697f90c8df","name":"Alchemix","symbol":"ALCX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14113/thumb/Alchemix.png?1614409874"},{"chainId":1,"address":"0x212dd60d4bf0da8372fe8116474602d429e5735f","name":"Stobox Token","symbol":"STBU","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12637/thumb/exchange.png?1623764906"},{"chainId":1,"address":"0x038a68ff68c393373ec894015816e33ad41bd564","name":"Glitch Protocol","symbol":"GLCH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/13712/thumb/glitch_logo.jpeg?1611100011"},{"chainId":1,"address":"0x4cc19356f2d37338b9802aa8e8fc58b0373296e7","name":"SelfKey","symbol":"KEY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/2034/thumb/selfkey.png?1548608934"},{"chainId":1,"address":"0x7865af71cf0b288b4e7f654f4f7851eb46a2b7f8","name":"Sentivate","symbol":"SNTVT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7383/thumb/2x9veCp.png?1598409975"},{"chainId":1,"address":"0xe0b7927c4af23765cb51314a0e0521a9645f0e2a","name":"DigixDAO","symbol":"DGD","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/397/thumb/dgd.png?1547034124"},{"chainId":1,"address":"0xbe9375c6a420d2eeb258962efb95551a5b722803","name":"StormX","symbol":"STMX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/1369/thumb/StormX.png?1603113002"},{"chainId":1,"address":"0x122f96d596384885b54bccdddf2125018c421d83","name":"Cubiex","symbol":"CBIX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/6161/thumb/Cubiex-ico.jpg?1547042188"},{"chainId":1,"address":"0xc3589f56b6869824804a5ea29f2c9886af1b0fce","name":"Honey","symbol":"HNY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12895/thumb/hnys.png?1614100588"},{"chainId":1,"address":"0xd123575d94a7ad9bff3ad037ae9d4d52f41a7518","name":"MyWish","symbol":"WISH","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/1267/thumb/mywish.jpg?1547035291"},{"chainId":1,"address":"0x377d552914e7a104bc22b4f3b6268ddc69615be7","name":"NEXT","symbol":"NEXT","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7014/thumb/NEXT.exchange_Logo.png?1569212613"},{"chainId":1,"address":"0xe2dc070524a6e305ddb64d8513dc444b6a1ec845","name":"Nash","symbol":"NEX","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/3246/thumb/Nash-token_icon.png?1550821163"},{"chainId":1,"address":"0x7825e833d495f3d1c28872415a4aee339d26ac88","name":"Telos","symbol":"TLOS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/7588/thumb/TLOS_logo.png?1614668174"},{"chainId":1,"address":"0x0f3adc247e91c3c50bc08721355a41037e89bc20","name":"Anchor Protocol","symbol":"ANC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14420/thumb/anchor_protocol_logo.jpg?1615965420"},{"chainId":1,"address":"0x36b679bd64ed73dbfd88909cdcb892cb66bd4cbb","name":"xMARK","symbol":"XMARK","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/14188/thumb/omPQ9-nF_400x400.jpg?1614830988"},{"chainId":1,"address":"0x1350fbe8ce27762ec19134bf8fc405a427fe9bf1","name":"Trips Community","symbol":"TRIPS","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14648/thumb/trips_32.png?1617491133"},{"chainId":1,"address":"0xfeea0bdd3d07eb6fe305938878c0cadbfa169042","name":"8Pay","symbol":"8PAY","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14667/thumb/8pay.jpeg?1617639682"},{"chainId":1,"address":"0x6dc02164d75651758ac74435806093e421b64605","name":"XAYA","symbol":"CHI","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/2091/thumb/xaya_logo-1.png?1547036406"},{"chainId":1,"address":"0x71ba91dc68c6a206db0a6a92b4b1de3f9271432d","name":"MobieCoin","symbol":"MBX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12874/thumb/MBX_token.jpg?1603186697"},{"chainId":1,"address":"0x5a4623f305a8d7904ed68638af3b4328678eddbf","name":"dART Insurance","symbol":"DART","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/14834/thumb/dart.PNG?1618611161"},{"chainId":1,"address":"0xfb62ae373aca027177d1c18ee0862817f9080d08","name":"My DeFi Pet","symbol":"DPET","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15321/thumb/mydefi.PNG?1620512455"},{"chainId":1,"address":"0x92a42db88ed0f02c71d439e55962ca7cab0168b5","name":"Tardigrades Finance","symbol":"TRDG","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/14371/thumb/LOGO-200x200-cutout.png?1622083456"},{"chainId":1,"address":"0xa1ed0364d53394209d61ae8bfdb8ff50484d8c91","name":"TeraBlock","symbol":"TBC","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15622/thumb/tbc.png?1621345335"},{"chainId":1,"address":"0x0bffc5692960bb043d3216839bdd6e5e64ff1b4e","name":"Laika Protocol","symbol":"LAIKA","decimals":9,"logoURI":"https://assets.coingecko.com/coins/images/15833/thumb/laika.PNG?1622067228"},{"chainId":1,"address":"0xee1cea7665ba7aa97e982edeaecb26b59a04d035","name":"ORAO Network","symbol":"ORAO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15189/thumb/orao.PNG?1620078596"},{"chainId":1,"address":"0x8ae005c97aa6853478c7f373b1d0f72aa92880a7","name":"Yuang Coin","symbol":"YUANG","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15874/thumb/Yuang_PNG.png?1622182844"},{"chainId":1,"address":"0x05fb86775fd5c16290f1e838f5caaa7342bd9a63","name":"Hacken Token","symbol":"HAI","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/11081/thumb/logo_haken_vector.png?1593511379"},{"chainId":1,"address":"0xa771b49064da011df051052848477f18dba1d2ac","name":"Handshake","symbol":"HNS","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/10562/thumb/circle-handshakeLogo.png?1613668983"},{"chainId":1,"address":"0xb4371da53140417cbb3362055374b10d97e420bb","name":"Switcheo","symbol":"SWTH","decimals":8,"logoURI":"https://assets.coingecko.com/coins/images/3645/thumb/SWTH_Token_Primary.png?1624000912"},{"chainId":1,"address":"0x5f6c5c2fb289db2228d159c69621215e354218d7","name":"Demodyfi","symbol":"DMOD","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16262/thumb/cNsVoztO_400x400.jpg?1623532410"},{"chainId":1,"address":"0x4d0da4e75d40bd7d9c4f7a292bf883bcdf38c45d","name":"RealT Token 15373","symbol":"REALTOKEN-S-15373-P","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16562/thumb/15373-Parkside-hero-1.jpg?1624458568"},{"chainId":1,"address":"0x9b39a0b97319a9bd5fed217c1db7b030453bac91","name":"TigerCash","symbol":"TCH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/4956/thumb/tigercash-logo.png?1547040378"},{"chainId":1,"address":"0x9528a7402c0fe85b817aa6e106eafa03a02924c4","name":"RealT Token 14231","symbol":"REALTOKEN-S-14231-S","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16563/thumb/14231-Strathmoor-hero-1.jpg?1624459471"},{"chainId":1,"address":"0xda47bd33e8f5d17bb81b8752784bfb46c1c44b2a","name":"RealT Token 15350","symbol":"REALTOKEN-S-15350-G","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16564/thumb/15350-Greydale-hero-1.jpg?1624460101"},{"chainId":1,"address":"0xb5dd2b6e0a0422e069e1d2cc3ed16533488a05e3","name":"RealT Token 12866","symbol":"REALTOKEN-S-12866-L","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16565/thumb/12866-Lauder-hero-1.jpg?1624460677"},{"chainId":1,"address":"0x92d31e19f88597f368825ba16410f263a844527a","name":"RealT Token 8181 ","symbol":"REALTOKEN-S-8181-BL","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16566/thumb/8181-Bliss-hero-1.jpg?1624461101"},{"chainId":1,"address":"0x24293ab20159cfc0f3d7c8727cd827fba63d4f64","name":"RealT Token 19333","symbol":"REALTOKEN-S-19333-M","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16593/thumb/19333-Moenart-hero-1.jpg?1624539310"},{"chainId":1,"address":"0x5e2a09064b2dca8c44aad8a5b69a69bb1854fe72","name":"RealT Token 11201","symbol":"REALTOKEN-S-11201-C","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16594/thumb/11201-College-hero-1.jpg?1624540102"},{"chainId":1,"address":"0xa9f30c907321718e655b74463ca665b690b78894","name":"RealT Token 15860","symbol":"REALTOKEN-S-15860-H","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16595/thumb/15860-Hartwell-hero-1.jpg?1624540454"},{"chainId":1,"address":"0xb8403b7730368942a5bfe5aac04a31b44015b1cc","name":"RealT Token 11078","symbol":"REALTOKEN-S-11078-W","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16596/thumb/11078-Wayburn-hero-1.jpg?1624541135"},{"chainId":1,"address":"0x43fed9f9bf7deedcb314b432a8e38219dd62ce9e","name":"RealT Token 14825","symbol":"REALTOKEN-S-14825-W","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16598/thumb/14825-Wilfried-hero-1.jpg?1624541680"},{"chainId":1,"address":"0x31aa5fa895fd186fde12347a6fcaf540875b6434","name":"RealT Token 14882","symbol":"REALTOKEN-S-14882-T","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16600/thumb/14882-Troester-hero-1.jpg?1624542180"},{"chainId":1,"address":"0xba07997f594a52df179620284b52b50a4e66227d","name":"RealT Token 17809","symbol":"REALTOKEN-S-17809-C","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16601/thumb/17809-Charest-hero-1.jpg?1624543227"},{"chainId":1,"address":"0x2c6f00a020b613c9419bb6c1ac220036dbe9e622","name":"RealT Token 18776","symbol":"REALTOKEN-S-18776-S","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16602/thumb/18776-Sunderland-hero-1.jpg?1624543588"},{"chainId":1,"address":"0xa137d82197ea4cdfd5f008a91ba816b8324f59e1","name":"RealT Token 5601 ","symbol":"REALTOKEN-S-5601-SW","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16605/thumb/5601-S-Wood-hero-1.jpg?1624544382"},{"chainId":1,"address":"0x3150f0ebc0efee280b5348b9c8c271ad44eb8b13","name":"RealT Token 19596","symbol":"REALTOKEN-S-19596-G","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16608/thumb/19596-Goulburn-hero-1.jpg?1624544786"},{"chainId":1,"address":"0x1e001730a23c7ebaff35bc8bc90da5a9b20804a4","name":"RealT Token 9481 ","symbol":"REALTOKEN-S-9481-WA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16609/thumb/9481-Wayburn-hero-1.jpg?1624545084"},{"chainId":1,"address":"0x9b5b4886033b4abc5eb0552fff7c15a67c3c47c7","name":"RealT Token 11300","symbol":"REALTOKEN-S-11300-R","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16610/thumb/11300-Roxbury-hero-1.jpg?1624545386"},{"chainId":1,"address":"0xd5d1adf54fbf73a00b197ddcfdad7cc27d93002f","name":"RealT Token 10629","symbol":"REALTOKEN-S-10629-M","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16611/thumb/10629-McKinney-hero-1.jpg?1624545790"},{"chainId":1,"address":"0xa2b2ae397492c7ed8a4c1e751ac72d2b59947e6b","name":"RealT Token 9920 ","symbol":"REALTOKEN-S-9920-BI","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16615/thumb/9920-Bishop-hero-1.jpg?1624549554"},{"chainId":1,"address":"0x5600e25b4f24c63afa655c3bd96e3c178b654fa1","name":"RealT Token 13045","symbol":"REALTOKEN-S-13045-W","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16617/thumb/13045-Wade-hero-1.jpg?1624549855"},{"chainId":1,"address":"0xad91999f534f4075b00ba4231c018e57bdebb342","name":"RealT Token 18983","symbol":"REALTOKEN-S-18983-A","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16619/thumb/18983-Alcoy-hero-1.jpg?1624550570"},{"chainId":1,"address":"0xf5b5efc906513b4344ebabcf47a04901f99f09f3","name":"UBIX Network","symbol":"UBX","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/13000/thumb/UBIX.jpg?1626406542"},{"chainId":1,"address":"0xb09850e2b93aa3aaa1476bf0c007cfc960e2de79","name":"RealT Token 14229","symbol":"REALTOKEN-S-14229-W","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16604/thumb/14229-Wilshire-hero-1.jpg?1624543967"},{"chainId":1,"address":"0x211618fa0934910666f2c2731101f5a3ac013fd8","name":"RealT Token 19200","symbol":"REALTOKEN-S-19200-S","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16620/thumb/19200-Strasburg-hero-1.jpg?1624550918"},{"chainId":1,"address":"0x969d42ad7008e6651e1fd52742153f8743225d98","name":"RealT Token 12409","symbol":"REALTOKEN-S-12409-W","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16668/thumb/12409-Whitehill-hero-1.jpg?1624627067"},{"chainId":1,"address":"0x9d918ee39a356be8ef99734599c7e70160db4db6","name":"RealT Token 12405","symbol":"REALTOKEN-S-12405-S","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16671/thumb/12405-Santa-Rosa-hero-1.jpg?1624627801"},{"chainId":1,"address":"0xdd833d0eef6d5d7cec781b03c19f3b425f3039df","name":"RealT Token 11957","symbol":"REALTOKEN-S-11957-O","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16672/thumb/11957-Olga-hero-1.jpg?1624628071"},{"chainId":1,"address":"0xf4657ab08681214bcb1893aa8e9c7613459250ec","name":"RealT Token 1617 ","symbol":"REALTOKEN-S-1617-SA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16675/thumb/1617-S-Avers-hero-1.jpg?1624628860"},{"chainId":1,"address":"0x2adc1cfa726a45264a328d9d2e2c692ceac97458","name":"RealT Token 14494","symbol":"REALTOKEN-S-14494-C","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16618/thumb/14494-Chelsea-hero-1.jpg?1624550267"},{"chainId":1,"address":"0x4a99cc509f7facf58d7b67e99236db5e0921ef81","name":"RealT Token 10639","symbol":"REALTOKEN-S-10639-S","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16621/thumb/10639-Stratman-hero-1.jpg?1624551202"},{"chainId":1,"address":"0x31820af2d43c08bd82bd94b08974062482bd98d3","name":"RealT Token 11653","symbol":"REALTOKEN-S-11653-N","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16622/thumb/11653-Nottingham-hero-1.jpg?1624551450"},{"chainId":1,"address":"0x8d1090df790ffafdaccda03015c05df3b4cc9c21","name":"RealT Token 15753","symbol":"REALTOKEN-S-15753-H","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16623/thumb/15753-Hartwell-hero-2.jpg?1624551749"},{"chainId":1,"address":"0x1fdb4015fd5e031c5641752c1e03b973ad5ea168","name":"RealT Token 17500","symbol":"REALTOKEN-S-17500-E","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16624/thumb/17500-Evergreen-hero-1.jpg?1624552051"},{"chainId":1,"address":"0xe82cbb7c29d00a4296ee505d12a473c26cd9c423","name":"RealT Token 10700","symbol":"REALTOKEN-S-10700-W","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16625/thumb/10700-Whittier-hero-2.jpg?1624552489"},{"chainId":1,"address":"0x63a1849b47ef5913ccc5adb0e2708b11a4ba6972","name":"RealT Token 14918","symbol":"REALTOKEN-S-14918-J","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16626/thumb/14918-Joy-hero-1.jpg?1624552732"},{"chainId":1,"address":"0xe255caf8893382465368b8e1cd4ef8436acf0ade","name":"RealT Token 402 S","symbol":"REALTOKEN-S-402-SKO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16627/thumb/402-S-Kostner-hero-1.jpg?1624553033"},{"chainId":1,"address":"0x69d1b42b20f3ded07bec322253d0140b04cbb6f5","name":"RealT Token 1542 ","symbol":"REALTOKEN-S-1542-SR","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16628/thumb/1542-S-Ridgeway-hero-2.5.jpg?1624553308"},{"chainId":1,"address":"0x311fc485f1fea0c8cc9b5c783e79f4313ddfa720","name":"RealT Token 19996","symbol":"REALTOKEN-S-19996-J","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16666/thumb/19996-Joanne-hero-1.jpg?1624626495"},{"chainId":1,"address":"0xe7b6de709ffc3bd237c2f2c800e1002f97a760f3","name":"RealT Token 4852 ","symbol":"REALTOKEN-S-4852-48","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16670/thumb/Cortez-facade-1.jpg?1624627398"},{"chainId":1,"address":"0x8fcb39a25e639c8fbd28e8a018227d6570e02352","name":"RealT Token 1815 ","symbol":"REALTOKEN-S-1815-SA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16674/thumb/1815-S-Avers-hero-1.5.jpg?1624628519"},{"chainId":1,"address":"0xe887dc4fcb5240c0c080aeab8870421d3ebd0b28","name":"RealT Token 14066","symbol":"REALTOKEN-S-14066-S","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16677/thumb/14066-Santa-Rosa-hero-1.5.jpg?1624629250"},{"chainId":1,"address":"0xeb1112ac78d537853150e2a07e8b765e29d3f019","name":"Hash Token","symbol":"HASH","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17105/thumb/1622717856607.png?1626250859"},{"chainId":1,"address":"0xd5fc0c4c4c5ff316e1e91494d963ff1d52ba25ff","name":"RealT Token 11078","symbol":"REALTOKEN-S-11078-L","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16630/thumb/11078-Longview-hero-2.5.jpg?1624553559"},{"chainId":1,"address":"0x804f6baa10615c85e4b4a5bc4efe516d9f7a4365","name":"RealT Token 13606","symbol":"REALTOKEN-S-13606-W","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/16667/thumb/13606-Winthrop-hero-1.jpg?1624626772"},{"chainId":1,"address":"0xae12c5930881c53715b369cec7606b70d8eb229f","name":"Coin98","symbol":"C98","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/17117/thumb/logo.png?1626412904"},{"chainId":1,"address":"0x34965f73cfa05bf8d8af37cb4af64fa950605ea8","name":"CoinWind","symbol":"COW","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15766/thumb/logo.c3d2c062.png?1621827743"},{"chainId":1,"address":"0xef40b859d21e4d566a3d713e756197c021bffaaa","name":"APENFT","symbol":"NFT","decimals":6,"logoURI":"https://assets.coingecko.com/coins/images/15687/thumb/apenft.jpg?1621562368"},{"chainId":1,"address":"0x9ac07635ddbde5db18648c360defb00f5f22537e","name":"Museum of Crypto Ar","symbol":"MOCA","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15829/thumb/photo_2021-06-04_09.36.16.jpeg?1622770606"},{"chainId":1,"address":"0x09e64c2b61a5f1690ee6fbed9baf5d6990f8dfd0","name":"GROWTH DeFi","symbol":"GRO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/12239/thumb/growthdefi_logo.png?1598438196"},{"chainId":1,"address":"0x99676c9fa4c77848aeb2383fcfbd7e980dc25027","name":"Etho Protocol","symbol":"ETHO","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/5194/thumb/ether1new-transparent.png?1578298993"},{"chainId":1,"address":"0xf2df8458130f00c94bcde2dd3f288cf608187f87","name":"Feast Finance","symbol":"FEAST","decimals":0,"logoURI":"https://assets.coingecko.com/coins/images/15906/thumb/features-img1.png?1622412684"},{"chainId":1,"address":"0x7645ddfeeceda57e41f92679c4acd83c56a81d14","name":"Flux Protocol","symbol":"FLUX","decimals":18,"logoURI":"https://assets.coingecko.com/coins/images/15002/thumb/logo.dabc411c.png?1619402947"}] \ No newline at end of file diff --git a/infrastructure/api-docs/.gitignore b/infrastructure/api-docs/.gitignore new file mode 100755 index 0000000000..a6d7570905 --- /dev/null +++ b/infrastructure/api-docs/.gitignore @@ -0,0 +1,4 @@ +index.html +documentation.apib +test.apib +/build diff --git a/infrastructure/api-docs/blueprint/groups/accounts.apib b/infrastructure/api-docs/blueprint/groups/accounts.apib new file mode 100755 index 0000000000..efae868ef7 --- /dev/null +++ b/infrastructure/api-docs/blueprint/groups/accounts.apib @@ -0,0 +1,73 @@ +# Group Accounts + +## api/v0.2/accounts/{accountIdOrAddress}/{stateType} [/accounts/{accountIdOrAddress}/{stateType}] + ++ Parameters + + accountIdOrAddress (required, string, `1`) ... Account Id or address in the zkSync network + + stateType (required, "committed" | "finalized", `committed`) ... The type of account state which we want to get + +### Get account state [GET] +Returns committed or finalized account state + ++ Response 200 (application/json) + + Attributes + + request (Request, required) + + status: success (string, required) + + result (Account, required{{isResultNullable}}) + + error (Error, required, nullable) + +## api/v0.2/accounts/{accountIdOrAddress} [/accounts/{accountIdOrAddress}] + ++ Parameters + + accountIdOrAddress (required, string, `1`) ... Account Id or address in the zkSync network + +### Get account full state [GET] +Returns both committed and finalized account states + ++ Response 200 (application/json) + + Attributes + + request (Request, required) + + status: success (string, required) + + result (Account.FullInfo, required{{isResultNullable}}) + + error (Error, required, nullable) + +## api/v0.2/accounts/{accountIdOrAddress}/transactions [/accounts/{accountIdOrAddress}/transactions{?from,limit,direction}] + ++ Parameters + + accountIdOrAddress (required, string, `1`) ... Account Id or address in the zkSync network + + from (required, "latest" | string, `latest`) ... From which transaction to show + + limit (required, number, `2`) ... The limit of transactions to be shown + + direction (required, "newer" | "older", `older`) ... newer or older than the id of the `from` + + +### Get account transactions [GET] +Returns the transactions for a particular account according to the query params + ++ Response 200 (application/json) + + Attributes + + request (Request, required) + + status: success (string, required) + + result (object, required{{isResultNullable}}) + + pagination (PaginationFromHash, required) + + list (array[Transaction.InBlock], required) + + error (Error, required, nullable) + +## api/v0.2/accounts/{accountIdOrAddress}/transactions/pending [/accounts/{accountIdOrAddress}/transactions/pending{?from,limit,direction}] + ++ Parameters + + accountIdOrAddress (required, string, `1`) ... Account Id or address in the zkSync network + + from (required, "latest" | number, `100`) ... From which transaction to show + + limit (required, number, `2`) ... The limit of transactions to be shown + + direction (required, "newer" | "older", `older`) ... newer or older than the id of the `from` + +### Get pending priority operations [GET] +Get account pending priority operations. + ++ Response 200 (application/json) + + Attributes + + request (Request, required) + + status: success (string, required) + + result (object, required{{isResultNullable}}) + + pagination (PaginationFromNumber, required) + + list (array[Transaction.InBlock.L1], required) + + error (Error, required, nullable) diff --git a/infrastructure/api-docs/blueprint/groups/batches.apib b/infrastructure/api-docs/blueprint/groups/batches.apib new file mode 100755 index 0000000000..a76b2798cb --- /dev/null +++ b/infrastructure/api-docs/blueprint/groups/batches.apib @@ -0,0 +1,34 @@ +# Group Batches + +## api/v0.2/transactions/batches [/transactions/batches] + +### Submit batch of transactions [POST] +Submit batch of transactions. + ++ Request (application/json) + + Attributes + + txs (array[TxWithSignature], required) + + signature (BatchSignature, optional) + ++ Response 200 (application/json) + + Attributes + + request (Request, required) + + status: success (string, required) + + result (SubmitBatchResponse, required{{isResultNullable}}) + + error (Error, required, nullable) + + +## api/v0.2/transactions/batches/:txBatchHash [/transactions/batches/{txBatchHash}] + ++ Parameters + + txBatchHash (required, string, `{{txBatchHash}}`) ... the hash of the contents of the batch queried + +### Get transactions batch status [GET] +Get transactions batch status (latest receipt) + ++ Response 200 (application/json) + + Attributes + + request (Request, required) + + status: success (string, required) + + result (BatchStatus, required{{isResultNullable}}) + + error (Error, required, nullable) diff --git a/infrastructure/api-docs/blueprint/groups/blocks.apib b/infrastructure/api-docs/blueprint/groups/blocks.apib new file mode 100755 index 0000000000..698982cf42 --- /dev/null +++ b/infrastructure/api-docs/blueprint/groups/blocks.apib @@ -0,0 +1,55 @@ +# Group Blocks + +## api/v0.2/blocks [/blocks{?from,limit,direction}] + ++ Parameters + + from (required, "latest" | number, `latest`) ... From which transaction to show + + limit (required, number, `2`) ... The limit of transactions to be shown + + direction (required, "newer" | "older", `older`) ... newer or older than the id of the `from` + +### Get blocks range [GET] +Get blocks range + ++ Response 200 (application/json) + + Attributes + + request (Request, required) + + status: success (string, required) + + result (object, required{{isResultNullable}}) + + pagination (PaginationFromNumber, required) + + list (array[Block], required) + + error (Error, required, nullable) + +## api/v0.2/blocks/:block_number [/blocks/{blockNumber}] + ++ Parameters + + `blockNumber`: `lastCommitted` (required, BlockNumber) - a number of the block or `lastCommitted` for getting the last committed block or `lastFinalized` for getting the last finalized block + +### Get block details [GET] +Get block details + ++ Response 200 (application/json) + + Attributes + + request (Request, required) + + status: success (string, required) + + result (Block, required{{isResultNullable}}) + + error (Error, required, nullable) + +## api/v0.2/blocks/blockNumber/transactions [/blocks/{blockNumber}/transactions{?from,limit,direction}] + ++ Parameters + + `blockNumber`: `lastCommitted` (required, BlockNumber) - a number of the block or `lastCommitted` for getting the last committed block or `lastFinalized` for getting the last finalized block + + from (required, "latest" | string, `latest`) ... From which transaction to show + + limit (required, number, `2`) ... The limit of transactions to be shown + + direction (required, "newer" | "older", `older`) ... newer or older than the id of the `from` + +### Get block transactions [GET] +Get block transactions + ++ Response 200 (application/json) + + Attributes + + request (Request, required) + + status: success (string, required) + + result (object, required{{isResultNullable}}) + + pagination (PaginationFromHash, required) + + list (array[Transaction.InBlock], required) + + error (Error, required, nullable) diff --git a/infrastructure/api-docs/blueprint/groups/config.apib b/infrastructure/api-docs/blueprint/groups/config.apib new file mode 100755 index 0000000000..9124c4656f --- /dev/null +++ b/infrastructure/api-docs/blueprint/groups/config.apib @@ -0,0 +1,13 @@ +# Group Config + +## api/v0.2/config [/config] + +### Get config of network [GET] +Returns the config of network + ++ Response 200 (application/json) + + Attributes + + request (Request, required) + + status: success (string, required) + + result (Config, required{{isResultNullable}}) + + error (Error, required, nullable) diff --git a/infrastructure/api-docs/blueprint/groups/fee.apib b/infrastructure/api-docs/blueprint/groups/fee.apib new file mode 100755 index 0000000000..4e8f68adf2 --- /dev/null +++ b/infrastructure/api-docs/blueprint/groups/fee.apib @@ -0,0 +1,36 @@ +# Group Fees + +## api/v0.2/fee [/fee] + +### Get fee for a single transaction [POST] +Request fee for a single transaction. + ++ Request (application/json) + + Attributes + + txType: Transfer (Fee.Type, required) + + address: 0xf33A2D61DD09541A8C9897D7236aDcCCC14Cf769 (string, required) + + tokenLike: ETH (Token.TokenLike, required) + ++ Response 200 (application/json) + + Attributes + + request (Request, required) + + status: success (string, required) + + result (Fee.Single, required{{isResultNullable}}) + + error (Error, required, nullable) + +## api/v0.2/fee/batch [/fee/batch] + +### Get fee for a transactions batch [POST] +Request fee for a transactions batch. + ++ Request (application/json) + + Attributes + + transactions (array[Fee.Type.with.Address], required) + + tokenLike: ETH (Token.TokenLike, required) + ++ Response 200 (application/json) + + Attributes + + request (Request, required) + + status: success (string, required) + + result (Fee.Batch, required{{isResultNullable}}) + + error (Error, required, nullable) diff --git a/infrastructure/api-docs/blueprint/groups/status.apib b/infrastructure/api-docs/blueprint/groups/status.apib new file mode 100755 index 0000000000..2cee10a9e1 --- /dev/null +++ b/infrastructure/api-docs/blueprint/groups/status.apib @@ -0,0 +1,13 @@ +# Group Network status + +## api/v0.2/networkStatus [/networkStatus] + +### Get network status [GET] +Returns the status of the network + ++ Response 200 (application/json) + + Attributes + + request (Request, required) + + status: success (string, required) + + result (NetworkStatus, required{{isResultNullable}}) + + error (Error, required, nullable) diff --git a/infrastructure/api-docs/blueprint/groups/tokens.apib b/infrastructure/api-docs/blueprint/groups/tokens.apib new file mode 100755 index 0000000000..327a92a5c3 --- /dev/null +++ b/infrastructure/api-docs/blueprint/groups/tokens.apib @@ -0,0 +1,66 @@ +# Group Tokens + +## api/v0.2/tokens [/tokens{?from,limit,direction}] + ++ Parameters + + from (required, "latest" | number, `latest`) ... From which token id to show + + limit (required, number, `2`) ... The limit of tokens to be returned + + direction (required, "newer" | "older", `older`) ... newer or older than the id of the `from` + +### Get list of supported tokens [GET] +Returns the tokens that are currently supported by zkSync + ++ Response 200 (application/json) + + Attributes + + request (Request, required) + + status: success (string, required) + + result (object, required{{isResultNullable}}) + + pagination (PaginationFromNumber, required) + + list (array[Token.Token], required) + + error (Error, required, nullable) + +## api/v0.2/tokens/tokenIdOrAddress [/tokens/{tokenIdOrAddress}] + ++ Parameters + + tokenIdOrAddress (required, string, `2`) ... the id or address of the token in the zkSync network + +### Get token info [GET] +Get token into + ++ Response 200 (application/json) + + Attributes + + request (Request, required) + + status: success (string, required) + + result (Token.Token, required{{isResultNullable}}) + + error (Error, required, nullable) + +## api/v0.2/tokens/:tokenIdOrAddress/priceIn/:currency [/tokens/{tokenIdOrAddress}/priceIn/{currency}] + ++ Parameters + + tokenIdOrAddress (required, string, `2`) ... the id or address of the token in the zkSync network + + currency (required, `usd` | number, `usd`) ... either usd or any of the supported tokens in the zkSync network + +### Get token price [GET] +Get token price relative to another token + ++ Response 200 (application/json) + + Attributes + + request (Request, required) + + status: success (string, required) + + result (Token.Price, required{{isResultNullable}}) + + error (Error, required, nullable) + +## api/v0.2/tokens/nft/id [/tokens/nft/{id}] + ++ Parameters + + id (required, number, `{{nftId}}`) ... the id of the nft in the zkSync network + +### Get nft info [GET] +Get nft into + ++ Response 200 (application/json) + + Attributes + + request (Request, required) + + status: success (string, required) + + result (Token.NFTInfo, required{{isResultNullable}}) + + error (Error, required, nullable) diff --git a/infrastructure/api-docs/blueprint/groups/transactions.apib b/infrastructure/api-docs/blueprint/groups/transactions.apib new file mode 100755 index 0000000000..6c98c26511 --- /dev/null +++ b/infrastructure/api-docs/blueprint/groups/transactions.apib @@ -0,0 +1,49 @@ +# Group Transactions + +## api/v0.2/transactions [/transactions] + +### Submit transaction [POST] +Submit single transaction + ++ Request (application/json) + + Attributes + + tx (Transaction.Incoming, required) + + signature (TxEthSignature, optional) + ++ Response 200 (application/json) + + Attributes + + request (Request, required) + + status: success (string, required) + + result: 0xb092a0a2eabbf0b5b57d18e70d929899676cf3c0ad4df0f9492c3094ec4a8b19 (string, required{{isResultNullable}}) + + error (Error, required, nullable) + +## api/v0.2/transactions/:txHash [/transactions/{txHash}] + ++ Parameters + + txHash (required, string, `{{txHash}}`) ... hash of the transaction in the zkSync network + +### Get transaction receipt [GET] +Get transaction receipt + ++ Response 200 (application/json) + + Attributes + + request (Request, required) + + status: success (string, required) + + result (Receipt, required{{isResultNullable}}) + + error (Error, required, nullable) + + +## api/v0.2/transactions/:txHash/data [/transactions/{txHash}/data] + ++ Parameters + + txHash (required, string, `{{txHash}}`) ... hash of the transaction in the zkSync network + +### Get transaction data [GET] +Get transaction data + ++ Response 200 (application/json) + + Attributes + + request (Request, required) + + status: success (string, required) + + result (Transaction.Signed, required{{isResultNullable}}) + + error (Error, required, nullable) diff --git a/infrastructure/api-docs/blueprint/template.apib b/infrastructure/api-docs/blueprint/template.apib new file mode 100755 index 0000000000..546a38adfb --- /dev/null +++ b/infrastructure/api-docs/blueprint/template.apib @@ -0,0 +1,48 @@ +FORMAT: 1A + +# zkSync API v0.2 + +{{accountsEndpoints}} +{{batchesEndpoints}} +{{blocksEndpoints}} +{{configEndpoints}} +{{feeEndpoints}} +{{statusEndpoints}} +{{tokensEndpoints}} +{{transactionsEndpoints}} + +# Data Structures + +{{accountsTypes}} +{{batchesTypes}} +{{blocksTypes}} +{{configTypes}} +{{feeTypes}} +{{statusTypes}} +{{paginationTypes}} +{{receiptTypes}} +{{tokensTypes}} +{{transactionsTypes}} + +## TxState (enum) ++ queued ++ committed ++ finalized ++ rejected + +## BlockNumber (enum) ++ (number) ++ lastCommitted ++ lastFinalized + +## Request ++ network: localhost (Network, required) ++ apiVersion: v02 (fixed, required) ++ resource: /api/v0.2/... (string, required) ++ args (object, required) ++ timestamp: `2021-05-31T14:17:24.112536900Z` (string, required) + +## Error ++ errorType: errorType (string, required) ++ code: 0 (number, required) ++ message: message (string, required) diff --git a/infrastructure/api-docs/blueprint/types/accounts.apib b/infrastructure/api-docs/blueprint/types/accounts.apib new file mode 100755 index 0000000000..95043612aa --- /dev/null +++ b/infrastructure/api-docs/blueprint/types/accounts.apib @@ -0,0 +1,24 @@ +## Account (object) ++ accountId: 12 (number, required) ++ address: `0xc0f97CC918C9d6fA4E9fc6be61a6a06589D199b3` (string, required) ++ nonce: 6412 (number, required) ++ pubKeyHash: `sync:82b9eb68c6f7f80cecf49ee1a20acb8ae9ecd602` (string, required) ++ lastUpdateInBlock: 15001 (number, required) ++ balances (object, required) ++ accountType (Account.Type, required, nullable) ++ nfts (Account.Balances, required) ++ mintedNfts (Account.Nfts, required) + +## Account.Type (enum) +- Owned +- CREATE2 + +## Account.FullInfo ++ committed (Account, required, nullable) ++ finalized (Account, required, nullable) + +## Account.Balances (object) ++ *ETH*: `1000000000000000000` (string, required) + +## Account.Nfts (object) ++ *100000* (Token.NFT, required) diff --git a/infrastructure/api-docs/blueprint/types/batches.apib b/infrastructure/api-docs/blueprint/types/batches.apib new file mode 100755 index 0000000000..5a9bd8e6df --- /dev/null +++ b/infrastructure/api-docs/blueprint/types/batches.apib @@ -0,0 +1,15 @@ +## SubmitBatchResponse (object) ++ batchHash: 0x6d6f7e07c85a770c6cb9f667c6b7d2d6335781f956a3a66503c87a56fd392e80 (string, required) ++ transactionHashes: [0xca1d902dc4aa0d401aded0f3c4c6e73c1aa68fbb661856af1a8874472f5043bb] (array[string], required) + +## BatchStatus (object) ++ batchHash: 0x6d6f7e07c85a770c6cb9f667c6b7d2d6335781f956a3a66503c87a56fd392e80 (string, required), ++ transactionHashes: [0xca1d902dc4aa0d401aded0f3c4c6e73c1aa68fbb661856af1a8874472f5043bb] (array[string], required) ++ createdAt: `2020-10-12T09:05:03.123416742` (string, required), ++ batchStatus (object, required) + + updatedAt: `2020-10-12T09:05:03.123416742` (string, required) + + lastState: queued (TxState, required) + +## BatchSignature (enum) +- (TxEthSignature) +- (array[TxEthSignature]) diff --git a/infrastructure/api-docs/blueprint/types/blocks.apib b/infrastructure/api-docs/blueprint/types/blocks.apib new file mode 100755 index 0000000000..bd74f31c14 --- /dev/null +++ b/infrastructure/api-docs/blueprint/types/blocks.apib @@ -0,0 +1,9 @@ +## Block (object) ++ blockNumber: 11109 (number, required), ++ newStateRoot: `0x61684c1bd4ac3f7843b6a20d4270d58dc4139d546ea4249424bc6c2ce0a48f92` (string, required), ++ blockSize: 110 (number, required), ++ commitTxHash: `0xc2541cf68c6f41a6bc55f9d6ba24816c79431942ca3762514f448540cfa475` (string, required, nullable), ++ verifyTxHash: `0x5e188571f82171b0dc313d9ff5433f10d03153a573e6c2ae5b4fbf683dd2a3` (string, required, nullable), ++ committedAt: `2020-10-12T12:05:03.123416742` (string, required) ++ finalizedAt: `2020-10-12T12:10:03.123416742` (string, required, nullable) ++ status: `committed` (string, required) diff --git a/infrastructure/api-docs/blueprint/types/config.apib b/infrastructure/api-docs/blueprint/types/config.apib new file mode 100755 index 0000000000..9ccfdbacba --- /dev/null +++ b/infrastructure/api-docs/blueprint/types/config.apib @@ -0,0 +1,6 @@ +## Config (object) ++ network: `mainnet` (Network, required) ++ contract: `0x5D8cec831732d6DA03677a33430796C4840728f7` (string, required) ++ govContract: `0x70e7fB5A89f9556F8fF9611bB6f42C8eAFDB6c93` (string, required) ++ depositConfirmations: 10 (number, required) ++ zksyncVersion: `contractV4` (string, required) diff --git a/infrastructure/api-docs/blueprint/types/fee.apib b/infrastructure/api-docs/blueprint/types/fee.apib new file mode 100755 index 0000000000..c91799f8ba --- /dev/null +++ b/infrastructure/api-docs/blueprint/types/fee.apib @@ -0,0 +1,39 @@ +## ChangePubKeyType (enum) +- Onchain +- ECDSA +- CREATE2 + +## ChangePubKeyFee (object) ++ ChangePubKey (ChangePubKeyType, required) + +## LegacyChangePubKeyFeeType (object) ++ onchainPubkeyAuth (boolean, required) + +## LegacyChangePubKeyFee (object) ++ ChangePubKey (LegacyChangePubKeyFeeType, required) + +## Fee.Type (enum) +- Transfer +- Withdraw +- FastWithdraw +- ForcedExit +- Swap +- MintNFT +- WithdrawNFT +- FastWithdrawNFT +- (ChangePubKeyFee) +- (LegacyChangePubKeyFee) + +## Fee.Single (object) ++ gasFee: `12000000000` (string, required), ++ zkpFee: `12000000` (string, required), ++ totalFee: `12012000000` (string, required), + +## Fee.Batch (object) ++ gasFee: `12000000000` (string, required), ++ zkpFee: `12000000` (string, required), ++ totalFee: `12012000000` (string, required), + +## Fee.Type.with.Address (object) ++ txType (Fee.Type, required) ++ address: `0xF659D25A06607Da53e62DAA5842499316A4e2548` (string, required) diff --git a/infrastructure/api-docs/blueprint/types/pagination.apib b/infrastructure/api-docs/blueprint/types/pagination.apib new file mode 100644 index 0000000000..35bfc8fa98 --- /dev/null +++ b/infrastructure/api-docs/blueprint/types/pagination.apib @@ -0,0 +1,11 @@ +## PaginationFromHash (object) ++ from: `0x2dcb7cb4288b84766a1bef4a1bd4ae9ac15ab817f06ad07efc4dac035bcfdb45` (string, required) ++ limit: 2 (number, required) ++ direction: `older` (string, required) ++ count: 268 (number, required) + +## PaginationFromNumber (object) ++ from: 5 (number, required) ++ limit: 2 (number, required) ++ direction: `older` (string, required) ++ count: 268 (number, required) diff --git a/infrastructure/api-docs/blueprint/types/receipt.apib b/infrastructure/api-docs/blueprint/types/receipt.apib new file mode 100755 index 0000000000..fe2f00e351 --- /dev/null +++ b/infrastructure/api-docs/blueprint/types/receipt.apib @@ -0,0 +1,20 @@ +## Receipt.L2 (object) ++ txHash: `0x466a9432e5337ee85deb9092526bb96377d316b9a1f0717ae4027798837fb85b` (string, required), ++ rollupBlock: 99812 (number, required, nullable), ++ status: committed (TxState, required), ++ failReason: null (string, required, nullable) + +## Receipt.L1 (object) ++ status: committed (L1Status, required), ++ ethBlock: 134300 (number, required), ++ rollupBlock: 99812 (number, required, nullable), ++ id: 12001 (number, required) + +## Receipt (enum) +- (Receipt.L1) +- (Receipt.L2) + +## L1Status (enum) ++ committed ++ finalized ++ queued diff --git a/infrastructure/api-docs/blueprint/types/status.apib b/infrastructure/api-docs/blueprint/types/status.apib new file mode 100755 index 0000000000..a868088e66 --- /dev/null +++ b/infrastructure/api-docs/blueprint/types/status.apib @@ -0,0 +1,11 @@ +## Network (enum) ++ mainnet ++ rinkeby ++ ropsten ++ localhost + +## NetworkStatus (object) +- lastCommitted: 1298 (number, required) +- finalized: 1296 (number, required) +- totalTransactions: 1200000 (number, required) +- mempoolSize: 123 (number, required) diff --git a/infrastructure/api-docs/blueprint/types/tokens.apib b/infrastructure/api-docs/blueprint/types/tokens.apib new file mode 100755 index 0000000000..3d3d4d1b59 --- /dev/null +++ b/infrastructure/api-docs/blueprint/types/tokens.apib @@ -0,0 +1,37 @@ +## Token.Token (object) +- id: 12 (number, required) +- address: `0x0849D6ae02349352258Ca59c27bC6D3159A7b752` (string, required) +- symbol: `MLTT` (string, required) +- decimals: 18 (number, required) +- enabledForFees: true (boolean, required) + +## Token.TokenLike (enum) ++ (number) ++ (string) + +## Token.Price (object) +- tokenId: 12 (number, required) +- tokenSymbol: `MLTT` (string, required) +- priceIn: `USD` (string, required) +- decimals: 18 (number, required) +- price: `1.01` (string, required) + +## Token.NFT (object) +- id: 100000 (number, required) +- contentHash: `0x2216aae3714e46a9efe0066ff5f3684c95ea9a680a4c39cd36e62b117cb1837c` (string, required) +- creatorId: 5 (number, required) +- creatorAddress: `0x1849D6ae02349352258Ca59c27bC6D3159A7b752` (string, required) +- serialId: 57 (number, required) +- address: `0x2DEEA6ae02349352258C2DEEA6bC6D31592DEEA6` (string, required) +- symbol: `NFT-100000` + +## Token.NFTInfo (object) +- id: 100000 (number, required) +- contentHash: `0x2216aae3714e46a9efe0066ff5f3684c95ea9a680a4c39cd36e62b117cb1837c` (string, required) +- creatorId: 5 (number, required) +- creatorAddress: `0x1849D6ae02349352258Ca59c27bC6D3159A7b752` (string, required) +- serialId: 57 (number, required) +- address: `0x2DEEA6ae02349352258C2DEEA6bC6D31592DEEA6` (string, required) +- symbol: `NFT-100000` +- currentFactory: `0x5DFEA6ae02349352258C2DEEA6bC6D31592D5DFE` (string, required) +- withdrawnFactory: `0x5DFEA6ae02349352258C2DEEA6bC6D31592D5DFE` (string, required, nullable) diff --git a/infrastructure/api-docs/blueprint/types/transactions.apib b/infrastructure/api-docs/blueprint/types/transactions.apib new file mode 100755 index 0000000000..c6fa5fddb0 --- /dev/null +++ b/infrastructure/api-docs/blueprint/types/transactions.apib @@ -0,0 +1,254 @@ +## Transaction.InBlock (object) +- txHash: 0x732D0a2598ba5E9db4e5cfF36F86dF8dA88A959A (string, required) +- blockNumber: 12 (number, required) +- op (Transaction, required) +- status: rejected (TxState, required) +- failReason: Nonce mismatch (string, required, nullable) +- createdAt: `2018-12-12T01:02:03.123456789` (string, required, nullable) + +## Transaction.Signed (object) +- tx (Transaction.InBlock, required) +- ethSignature: 0xb71ef30467c91b779ccc07c6615ac5fcd2e8293847dda0a6d0c63c85e95120c812e3f1e1973fc79f1718f45554120ffeca99b21b6d424dca854e8191415d2ce91b (string, required, nullable) + +## Transaction.InBlock.L1 (object) +- txHash: 0x732D0a2598ba5E9db4e5cfF36F86dF8dA88A959A (string, required) +- blockNumber: 12 (number, required) +- op (Transaction.L1, required) +- status: rejected (TxState, required) +- failReason: Nonce mismatch (string, required, nullable) +- createdAt: `2018-12-12T01:02:03.123456789` (string, required, nullable) + +## Transaction.L2.Transfer (object) +- type: Transfer (string, fixed) +- to: 0xD3c62D2F7b6d4A63577F2415E55A6Aa6E1DbB9CA (string, required) +- fee: 12000000000000000000 (string, required) +- from: {{address}} (string, required) +- nonce: 12123 (number, required) +- token: 0 (number, required) +- amount: 17500000000000000 (string, required) +- accountId: {{accountId}} (number, required) +- validFrom: 0 (number, required, nullable) +- validUntil: 1239213821 (number, required, nullable) +- signature (L2Signature, required) + +## Transaction.L2.Withdraw (object) +- type: Withdraw (string, fixed) +- to: 0xD3c62D2F7b6d4A63577F2415E55A6Aa6E1DbB9CA (string, required) +- fee: 1200000000 (number, required) +- from: 0xD3c62D2F7b6d4A63577F2415E55A6Aa6E1DbB9CA (string, required) +- nonce: 12123 (number, required) +- tokenId: 10 (number, required) +- amount: 17500000000000000 (number, required) +- accountId: 12123 (number, required) +- validFrom: 0 (number, required, nullable) +- validUntil: 1239213821 (number, required, nullable) +- fast: false (boolean, required) +- signature (L2Signature, required) + +## Transaction.L2.WithdrawWithEthHash (object) +- type: Withdraw (string, fixed) +- to: 0xD3c62D2F7b6d4A63577F2415E55A6Aa6E1DbB9CA (string, required) +- fee: 1200000000 (number, required) +- from: 0xD3c62D2F7b6d4A63577F2415E55A6Aa6E1DbB9CA (string, required) +- nonce: 12123 (number, required) +- tokenId: 10 (number, required) +- amount: 17500000000000000 (number, required) +- accountId: 12123 (number, required) +- validFrom: 0 (number, required, nullable) +- validUntil: 1239213821 (number, required, nullable) +- fast: false (boolean, required) +- signature (L2Signature, required) +- ethTxHash: 0xdda1287002282e1804af40a7c7373bd77cc99a2a27c88bf7908be45398e93148 (string, required, nullable) + +## Transaction.L2.ChangePubKey (object) +- type: ChangePubKey (string, fixed) +- accountId: 1201 (number, required) +- account: 0x3EEe181F789c6585B39904eBAeAb10ACf70f5F1a (string, required) +- newPkHash: 5fcf0bad911e8fdebd4fd79b0a832bc92a694e55 (string, required) +- feeTokenId: 6 (number, required) +- fee: 121000000000000 (number, required) +- nonce: 51 (number, required) +- ethAuthData: *ECDSAAuthType* (AuthType, optional) +- signature (L2Signature, required) +- ethSignature: 0xf0947f0a731ada6e09ca99d3aafb1469a3baaf602eab2f5661edd30d6386 (string, optional) +- validFrom: 0 (number, required, nullable) +- validUntil: 1239213821 (number, required, nullable) + +## Transaction.L2.ForcedExit (object) +- type: `ForcedExit` (string, fixed) +- initiatorAccountId: 12 (number, required) +- target: 0x38de1b4a24548d6ff66fa8e56448d9de09955b08 (string, required) +- nonce: 1001 (number, required) +- tokenId: 5 (number, required) +- fee: `12000000000` (string, required) +- validFrom: 0 (number, required) +- validUntil: 1239213821 (number, required) +- signature (L2Signature, required) + +## Transaction.L2.ForcedExitWithEthHash (object) +- type: `ForcedExit` (string, fixed) +- initiatorAccountId: 12 (number, required) +- target: 0x38de1b4a24548d6ff66fa8e56448d9de09955b08 (string, required) +- nonce: 1001 (number, required) +- tokenId: 5 (number, required) +- fee: `12000000000` (string, required) +- validFrom: 0 (number, required) +- validUntil: 1239213821 (number, required) +- signature (L2Signature, required) +- ethTxHash: `0xdda1287002282e1804af40a7c7373bd77cc99a2a27c88bf7908be45398e93148` (string, required, nullable) + +## Order (object) +- accountId: 12 (number, required) +- recipient: 0x38de1b4a24548d6ff66fa8e56448d9de09955b08 (string, required) +- nonce: 1001 (number, required) +- tokenBuy: 1 (number, required) +- tokenSell: 2 (number, required) +- ratio: 100, 2 (array[string], required) +- amount: `100000000` (string, required) +- validFrom: 0 (number, required) +- validUntil: 1239213821 (number, required) +- signature (L2Signature, required) + +## Transaction.L2.Swap (object) +- type: `Swap` (string, fixed) +- submitterId: 12 (number, required) +- submitterAddress: 0x38de1b4a24548d6ff66fa8e56448d9de09955b08 (string, required) +- nonce: 1001 (number, required) +- orders (array[Order], required) +- amounts: 100000000, 20000 (array[string], required) +- fee: `12000000000` (string, required) +- feeToken: 5 (number, required) +- signature (L2Signature, required) + +## Transaction.L2.MintNFT (object) +- type: `MintNFT` (string, fixed) +- creatorId: 12 (number, required) +- creatorAddress: 0x38de1b4a24548d6ff66fa8e56448d9de09955b08 (string, required) +- contentHash: 0x2216aae3714e46a9efe0066ff5f3684c95ea9a680a4c39cd36e62b117cb1837c (string, required) +- recipient: 0x44de1b4a24548d6ff66fa8e56448d9de09955b00 (string, required) +- fee: `12000000000` (string, required) +- feeToken: 5 (number, required) +- nonce: 1001 (number, required) +- signature (L2Signature, required) + +## Transaction.L2.WithdrawNFT (object) +- type: `WithdrawNFT` (string, fixed) +- accountId: 12 (number, required) +- from: 0x38de1b4a24548d6ff66fa8e56448d9de09955b08 (string, required) +- to: 0x38de1b4a24548d6ff66fa8e56448d9de09955b08 (string, required) +- token: 100000 (number, required) +- feeToken: 5 (number, required) +- fee: `12000000000` (string, required) +- nonce: 1001 (number, required) +- signature (L2Signature, required) +- fast: false (boolean, required) +- validFrom: 0 (number, required) +- validUntil: 1239213821 (number, required) + +## Transaction.L2.WithdrawNFTWithEthHash (object) +- type: `WithdrawNFT` (string, fixed) +- accountId: 12 (number, required) +- from: 0x38de1b4a24548d6ff66fa8e56448d9de09955b08 (string, required) +- to: 0x38de1b4a24548d6ff66fa8e56448d9de09955b08 (string, required) +- token: 100000 (number, required) +- feeToken: 5 (number, required) +- fee: `12000000000` (string, required) +- nonce: 1001 (number, required) +- signature (L2Signature, required) +- fast: false (boolean, required) +- validFrom: 0 (number, required) +- validUntil: 1239213821 (number, required) +- ethTxHash: `0xdda1287002282e1804af40a7c7373bd77cc99a2a27c88bf7908be45398e93148` (string, required, nullable) + +## Transaction.Incoming (enum) +- (Transaction.L2.Transfer) +- (Transaction.L2.Withdraw) +- (Transaction.L2.ChangePubKey) +- (Transaction.L2.ForcedExit) +- (Transaction.L2.Swap) +- (Transaction.L2.MintNFT) +- (Transaction.L2.WithdrawNFT) + +## Transaction.L2 (enum) +- (Transaction.L2.Transfer) +- (Transaction.L2.WithdrawWithEthHash) +- (Transaction.L2.ChangePubKey) +- (Transaction.L2.ForcedExitWithEthHash) +- (Transaction.L2.Swap) +- (Transaction.L2.MintNFT) +- (Transaction.L2.WithdrawNFTWithEthHash) + +## Transaction.L1.Deposit +- type: `Deposit` (string, fixed) +- from: `0x555968cfc291aece5550822feb712d1cf66c57b4` (string, required) +- tokenId: 12 (number, required) +- amount: `18000000000000000` (string, required) +- to: `0x3f0d95988eb8538c74e609cac0c1ce56ff3d3179` (string, required) +- accountId: 1413 (number, required, nullable) +- ethHash: `0xdda1287002282e1804af40a7c7373bd77cc99a2a27c88bf7908be45398e93148` (string, required) +- id: 17002 (number, required) +- txHash: `0x2dcb7cb4288b847d8a1bef4a1bd4ae9ac15ab817f06ad07efc4dac035bcfdb45` (string, required) + +## Transaction.L1.FullExit +- type: `FullExit` (string, fixed) +- accountId: 123 (number, required) +- tokenId: 34 (number, required) +- ethHash: `0x1216aae3714e46a9efe0066ff5f3684c95ea9a680a4c39cd36e62b117cb1837c` (string, required) +- id: 1348 (number, required) +- txHash: `0xaf0612970ea1b7809886ab0cce398bb14524d700e4c7305c54c34b5f9f3e6f56` (string, required) + +## Transaction.L1 (enum) +- (Transaction.L1.Deposit) +- (Transaction.L1.FullExit) + +## Transaction (enum) +- (Transaction.L2.Transfer) +- (Transaction.L2.WithdrawWithEthHash) +- (Transaction.L2.ChangePubKey) +- (Transaction.L2.ForcedExitWithEthHash) +- (Transaction.L2.Swap) +- (Transaction.L2.MintNFT) +- (Transaction.L2.WithdrawNFT) +- (Transaction.L1.Deposit) +- (Transaction.L1.FullExit) + +## L2Signature (object) +- pubKey: {{pubKey}} (string, required) +- signature: {{l2Signature}} (string, required) + +## ECDSAAuthType (object) +- type: `ECDSA` (string, fixed) +- batchHash: `0xcf70011f7220e08cd58493bf04be43addb4aaf4ec6a4e05b50bbe05aa066d` (string, required) + +## OnchainAuthType (object) +- type: `Onchain` (string, fixed) + +## CREATE2AuthType (object) +- creatorAddress: `0xCd4eA9f4346b992e906a3672a2Ce6632760efb10` (string, required) +- saltArg: `0x81d79d8c78a01373a37cd2d0b5d109798f5c7a07c3bf20b4d5` (string, required) +- codeHash: `0x896a58a92659223a74dd447ee259607d3bac01f9b826dfce62293b8861f4e729` (string, required) + +## AuthType (enum) +- (ECDSAAuthType) +- (OnchainAuthType) +- (CREATE2AuthType) + +## EthereumSignature (object) +- type: `EthereumSignature` (string, fixed) +- signature: `{{ethereumSignature}}` (string, required) + +## EIP1271Signature (object) +- type: `EIP1271Signature` (string, fixed) +- signature: `0xc9eb71b736ef69192d90a6516c5d66af883f6bc9a1749ed98edff106bcd49594618644860be89b08725de834d3a312d409810ecb39e9e7a5a5a9d8d870b166ab1c` (string, required) + +## TxEthSignature (enum) +- (EthereumSignature) +- (EIP1271Signature) + +## TxEthSignatureVariant (enum) +- (TxEthSignature) +- (array[TxEthSignature]) + +## TxWithSignature (object) +- tx (Transaction.Incoming, required) +- signature (TxEthSignatureVariant, required) diff --git a/infrastructure/api-docs/dredd.yml b/infrastructure/api-docs/dredd.yml new file mode 100644 index 0000000000..82995ed387 --- /dev/null +++ b/infrastructure/api-docs/dredd.yml @@ -0,0 +1,32 @@ +color: true +dry-run: null +hookfiles: null +language: nodejs +require: null +server: null +server-wait: 10 +init: false +custom: {} +names: false +only: [] +reporter: [] +output: [] +header: [] +sorted: false +user: null +inline-errors: false +details: false +method: [] +loglevel: warning +path: [] +hooks-worker-timeout: 5000 +hooks-worker-connect-timeout: 1500 +hooks-worker-connect-retry: 500 +hooks-worker-after-connect-wait: 100 +hooks-worker-term-timeout: 5000 +hooks-worker-term-retry: 500 +hooks-worker-handler-host: 127.0.0.1 +hooks-worker-handler-port: 61321 +config: ./dredd.yml +blueprint: ./blueprint/test.apib +endpoint: 'http://127.0.0.1:3001/api/v0.2' diff --git a/infrastructure/api-docs/package.json b/infrastructure/api-docs/package.json new file mode 100644 index 0000000000..e9751c4ba3 --- /dev/null +++ b/infrastructure/api-docs/package.json @@ -0,0 +1,18 @@ +{ + "name": "api-docs", + "version": "1.0.0", + "license": "MIT", + "main": "build/index.js", + "private": true, + "dependencies": { + "ts-node": "^9.0.0", + "typescript": "^4.0.5", + "handlebars": "4.7.6", + "ethers": "^5.0.19", + "commander": "^6.0.0" + }, + "scripts": { + "build": "tsc", + "watch": "tsc --watch" + } +} diff --git a/infrastructure/api-docs/src/compile.ts b/infrastructure/api-docs/src/compile.ts new file mode 100644 index 0000000000..ec460e9e61 --- /dev/null +++ b/infrastructure/api-docs/src/compile.ts @@ -0,0 +1,166 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import * as handlebars from 'handlebars'; +import * as zksync from 'zksync'; +import * as ethers from 'ethers'; + +export function getDirPath() { + return path.join(process.env.ZKSYNC_HOME as string, 'infrastructure/api-docs'); +} + +function pasteAllFilesInOne() { + let template = handlebars.compile(fs.readFileSync(path.join(getDirPath(), 'blueprint/template.apib'), 'utf-8'), { + noEscape: true + }); + + let replaceObject: any = {}; + + const groupsFiles = fs.readdirSync(path.join(getDirPath(), 'blueprint/groups')); + for (let file of groupsFiles) { + const data = fs.readFileSync(path.join(getDirPath(), 'blueprint/groups', file), 'utf-8'); + replaceObject[file.replace('.apib', '') + 'Endpoints'] = data; + } + + const typesFiles = fs.readdirSync(path.join(getDirPath(), 'blueprint/types')); + for (const file of typesFiles) { + const data = fs.readFileSync(path.join(getDirPath(), 'blueprint/types', file), 'utf-8'); + replaceObject[file.replace('.apib', '') + 'Types'] = data; + } + + return template(replaceObject); +} + +async function compileCommon() { + const data = pasteAllFilesInOne(); + let template = handlebars.compile(data, { noEscape: true }); + + let replaceObject: any = await getHashesAndSignatures(); + replaceObject['isResultNullable'] = '{{isResultNullable}}'; + + return template(replaceObject); +} + +async function setupWallet() { + const pathToConfig = path.join(process.env.ZKSYNC_HOME as string, `etc/test_config/constant/eth.json`); + const config = fs.readFileSync(pathToConfig, { + encoding: 'utf-8' + }); + const ethTestConfig = JSON.parse(config); + let web3Url = (process.env.ETH_CLIENT_WEB3_URL as string).split(',')[0]; + const ethProvider = new ethers.providers.JsonRpcProvider(web3Url); + ethProvider.pollingInterval = 100; + const syncProvider = await zksync.getDefaultRestProvider('localhost'); + const ethWallet = ethers.Wallet.fromMnemonic(ethTestConfig.test_mnemonic as string, "m/44'/60'/0'/0/0").connect( + ethProvider + ); + + const syncWallet = await zksync.Wallet.fromEthSigner(ethWallet, syncProvider); + + const depositHandle = await syncWallet.depositToSyncFromEthereum({ + depositTo: syncWallet.address(), + token: 'ETH', + amount: syncWallet.provider.tokenSet.parseToken('ETH', '1000') + }); + await depositHandle.awaitReceipt(); + + if (!(await syncWallet.isSigningKeySet())) { + const changePubkeyHandle = await syncWallet.setSigningKey({ + feeToken: 'ETH', + ethAuthType: 'ECDSA' + }); + await changePubkeyHandle.awaitReceipt(); + } + + return syncWallet; +} + +interface Parameters { + txHash: string; + txBatchHash: string; + address: string; + accountId: number; + pubKey: string; + l2Signature: string; + ethereumSignature: string; + nftId: number; +} + +async function getHashesAndSignatures() { + let syncWallet = await setupWallet(); + + const handle = await syncWallet.syncTransfer({ to: syncWallet.address(), token: 'ETH', amount: 0 }); + await handle.awaitReceipt(); + const txHash = handle.txHash; + + const batch = await syncWallet + .batchBuilder() + .addTransfer({ to: syncWallet.address(), token: 'ETH', amount: 0 }) + .build('ETH'); + + const submitBatchResponse = await (syncWallet.provider as zksync.RestProvider).submitTxsBatchNew( + batch.txs, + batch.signature + ); + await syncWallet.provider.notifyTransaction(submitBatchResponse.transactionHashes[0], 'COMMIT'); + const txBatchHash = submitBatchResponse.batchHash; + + const signedTransfer = await syncWallet.signSyncTransfer({ + to: '0xD3c62D2F7b6d4A63577F2415E55A6Aa6E1DbB9CA', + token: 'ETH', + amount: '17500000000000000', + fee: '12000000000000000000', + nonce: 12123, + validFrom: 0, + validUntil: 1239213821 + }); + const address = syncWallet.address(); + const accountId = (await syncWallet.getAccountId())!; + const pubKey = signedTransfer.tx.signature!.pubKey; + const l2Signature = signedTransfer.tx.signature!.signature; + const ethereumSignature = (signedTransfer.ethereumSignature as zksync.types.TxEthSignature).signature; + + const mintHandle = await syncWallet.mintNFT({ + recipient: address, + contentHash: ethers.utils.randomBytes(32), + feeToken: 'ETH' + }); + await mintHandle.awaitVerifyReceipt(); + const state = await syncWallet.getAccountState(); + const nftId = Object.values(state.verified.nfts)[0].id; + + let result: Parameters = { + txHash, + txBatchHash, + address, + accountId, + pubKey, + l2Signature, + ethereumSignature, + nftId + }; + return result; +} + +export async function compileApibForDocumentation() { + const before = await compileCommon(); + let template = handlebars.compile(before, { noEscape: true }); + + let replaceObject: any = {}; + replaceObject['isResultNullable'] = ', nullable'; + + const after = template(replaceObject); + + fs.writeFileSync(path.join(getDirPath(), 'blueprint/documentation.apib'), after); +} + +export async function compileApibForTest() { + const before = await compileCommon(); + let template = handlebars.compile(before, { noEscape: true }); + + let replaceObject: any = {}; + replaceObject['isResultNullable'] = ''; + + const after = template(replaceObject); + + fs.writeFileSync(path.join(getDirPath(), 'blueprint/test.apib'), after); +} diff --git a/infrastructure/api-docs/src/index.ts b/infrastructure/api-docs/src/index.ts new file mode 100644 index 0000000000..c5459dfade --- /dev/null +++ b/infrastructure/api-docs/src/index.ts @@ -0,0 +1,40 @@ +import { Command, program } from 'commander'; +import * as path from 'path'; +import { compileApibForTest, compileApibForDocumentation, getDirPath } from './compile'; +import { spawn } from './utils'; + +export const compile = new Command('compile') + .description('compile .apib files') + .option('--test', 'build test.apib') + .action(async (cmd: Command) => { + if (cmd.test) { + await compileApibForTest(); + } else { + await compileApibForDocumentation(); + } + }); + +export const generateDocs = new Command('generate-docs') + .description('generate docs .html file') + .action(async (_cmd: Command) => { + const pathToApib = path.join(getDirPath(), 'blueprint/documentation.apib'); + await spawn(`aglio -i ${pathToApib} -o index.html`); + }); + +export const test = new Command('test').description('test docs').action(async (_cmd: Command) => { + await spawn(`cd ${getDirPath()} && dredd`); +}); + +program.version('1.0.0').name('api-docs').description('api documentation tool'); +program.addCommand(compile); +program.addCommand(generateDocs); +program.addCommand(test); + +async function main() { + await program.parseAsync(process.argv); +} + +main().catch((err: Error) => { + console.error('Error:', err.message || err); + process.exitCode = 1; +}); diff --git a/infrastructure/api-docs/src/utils.ts b/infrastructure/api-docs/src/utils.ts new file mode 100644 index 0000000000..46d54ec594 --- /dev/null +++ b/infrastructure/api-docs/src/utils.ts @@ -0,0 +1,14 @@ +import { spawn as _spawn } from 'child_process'; + +// executes a command in a new shell +// but pipes data to parent's stdout/stderr +export function spawn(command: string) { + command = command.replace(/\n/g, ' '); + const child = _spawn(command, { stdio: 'inherit', shell: true }); + return new Promise((resolve, reject) => { + child.on('error', reject); + child.on('close', (code) => { + code == 0 ? resolve(code) : reject(`Child process exited with code ${code}`); + }); + }); +} diff --git a/infrastructure/api-docs/tsconfig.json b/infrastructure/api-docs/tsconfig.json new file mode 100644 index 0000000000..f96df8d60e --- /dev/null +++ b/infrastructure/api-docs/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "es2019", + "module": "commonjs", + "outDir": "build", + "strict": true, + "esModuleInterop": true, + "noEmitOnError": true, + "skipLibCheck": true, + "declaration": true + }, + "files": [ + "src/index.ts" + ] +} diff --git a/infrastructure/zk/src/api-docs.ts b/infrastructure/zk/src/api-docs.ts new file mode 100644 index 0000000000..f4a1596360 --- /dev/null +++ b/infrastructure/zk/src/api-docs.ts @@ -0,0 +1,10 @@ +import { Command } from 'commander'; +import * as utils from './utils'; + +export async function buildDocs() { + await utils.spawn('api_docs'); + await utils.spawn('api_docs compile'); + await utils.spawn('api_docs generate-docs'); +} + +export const command = new Command('api-docs').description('build api v0.2 documentation').action(buildDocs); diff --git a/infrastructure/zk/src/docker.ts b/infrastructure/zk/src/docker.ts index 2651416bf2..35549d8704 100644 --- a/infrastructure/zk/src/docker.ts +++ b/infrastructure/zk/src/docker.ts @@ -45,15 +45,13 @@ async function _build(image: string) { await contract.build(); } const { stdout: imageTag } = await utils.exec('git rev-parse --short HEAD'); - // TODO Uncomment this code, after nft deploying - // const latestImage = `-t matterlabs/${image}:latest`; + const latestImage = `-t matterlabs/${image}:latest`; const taggedImage = ['nginx', 'server', 'prover'].includes(image) ? `-t matterlabs/${image}:${imageTag}` : ''; - await utils.spawn(`DOCKER_BUILDKIT=1 docker build ${taggedImage} -f ./docker/${image}/Dockerfile .`); + await utils.spawn(`DOCKER_BUILDKIT=1 docker build ${latestImage} ${taggedImage} -f ./docker/${image}/Dockerfile .`); } async function _push(image: string) { - // TODO Uncomment this code, after nft deploying - // await utils.spawn(`docker push matterlabs/${image}:latest`); + await utils.spawn(`docker push matterlabs/${image}:latest`); if (['nginx', 'server', 'prover', 'event-listener'].includes(image)) { const { stdout: imageTag } = await utils.exec('git rev-parse --short HEAD'); await utils.spawn(`docker push matterlabs/${image}:${imageTag}`); diff --git a/infrastructure/zk/src/index.ts b/infrastructure/zk/src/index.ts index 12513c7057..de12acda3f 100644 --- a/infrastructure/zk/src/index.ts +++ b/infrastructure/zk/src/index.ts @@ -18,6 +18,7 @@ import { command as fmt } from './fmt'; import { command as lint } from './lint'; import { command as completion } from './completion'; import { command as config } from './config'; +import { command as apiDocs } from './api-docs'; import * as env from './env'; const COMMANDS = [ @@ -36,6 +37,7 @@ const COMMANDS = [ lint, docker, config, + apiDocs, env.command, completion(program as Command) ]; diff --git a/infrastructure/zk/src/run/run.ts b/infrastructure/zk/src/run/run.ts index 976a85f72f..e2b0b0495c 100644 --- a/infrastructure/zk/src/run/run.ts +++ b/infrastructure/zk/src/run/run.ts @@ -22,6 +22,7 @@ export async function deployERC20(command: 'dev' | 'new', name?: string, symbol? ]' > ./etc/tokens/localhost.json`); if (!process.env.CI) { await docker.restart('dev-liquidity-token-watcher'); + await docker.restart('dev-ticker'); } } else if (command == 'new') { await utils.spawn( diff --git a/infrastructure/zk/src/test/integration.ts b/infrastructure/zk/src/test/integration.ts index bb0ed631e5..e83f24e270 100644 --- a/infrastructure/zk/src/test/integration.ts +++ b/infrastructure/zk/src/test/integration.ts @@ -94,6 +94,7 @@ export async function inDocker(command: string, timeout: number) { export async function all() { await server(); await api(); + await apiDocs(); await withdrawalHelpers(); await zcli(); await rustSDK(); @@ -102,6 +103,16 @@ export async function all() { await run.dataRestore.checkExisting(); } +export async function apiDocs() { + await utils.spawn('api_docs'); + // Checks that documentation can be built successfully. + await utils.spawn('api_docs compile'); + await utils.spawn('api_docs generate-docs'); + // Checks that response structures of endpoints match structures defined in the documentation. + await utils.spawn('api_docs compile --test'); + await utils.spawn('api_docs test'); +} + export async function api() { await utils.spawn('yarn ts-tests api-test'); } @@ -237,6 +248,14 @@ command cmd.withServer ? await withServer(api, 240) : await api(); }); +command + .command('api-docs') + .description('run api-docs integration tests') + .option('--with-server') + .action(async (cmd: Command) => { + cmd.withServer ? await withServer(apiDocs, 240) : await apiDocs(); + }); + command .command('testkit [mode]') .description('run testkit tests') diff --git a/package.json b/package.json index d1eeb8f15d..1bd9e4c170 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "infrastructure/zk", "infrastructure/reading-tool", "infrastructure/token-lists-manager", + "infrastructure/api-docs", "core/tests/ts-tests" ], "nohoist": [ @@ -32,7 +33,8 @@ "ts-tests": "yarn workspace ts-tests", "explorer": "yarn workspace sync-explorer", "zk": "yarn workspace zk", - "reading-tool": "yarn workspace reading-tool" + "reading-tool": "yarn workspace reading-tool", + "api-docs": "yarn workspace api-docs" }, "devDependencies": { "@typescript-eslint/eslint-plugin": "^4.10.0", @@ -40,6 +42,7 @@ "babel-eslint": "^10.1.0", "eslint": "^7.16.0", "eslint-config-alloy": "^3.8.2", + "markdown-toc": "^1.2.0", "markdownlint-cli": "^0.24.0", "prettier": "^2.2.1", "prettier-plugin-solidity": "^1.0.0-alpha.60", diff --git a/sdk/zksync-crypto/package.json b/sdk/zksync-crypto/package.json index 08d8ba9707..9369520fff 100644 --- a/sdk/zksync-crypto/package.json +++ b/sdk/zksync-crypto/package.json @@ -1,6 +1,6 @@ { "name": "zksync-crypto", - "version": "0.6.0-beta.1", + "version": "0.6.0", "browser": "dist/zksync-crypto-web.js", "main": "dist/zksync-crypto-node.js", "files": [ diff --git a/sdk/zksync.js/package.json b/sdk/zksync.js/package.json index 369a59056e..74ecaaae7d 100644 --- a/sdk/zksync.js/package.json +++ b/sdk/zksync.js/package.json @@ -1,6 +1,6 @@ { "name": "zksync", - "version": "0.11.0-beta.7", + "version": "0.11.1", "license": "MIT", "main": "build/index.js", "types": "build/index.d.ts", @@ -8,7 +8,7 @@ "axios": "^0.21.1", "websocket": "^1.0.30", "websocket-as-promised": "^1.1.0", - "zksync-crypto": "^0.6.0-beta.1" + "zksync-crypto": "^0.6.0" }, "peerDependencies": { "@ethersproject/logger": "^5.0.0", diff --git a/sdk/zksync.js/src/batch-builder.ts b/sdk/zksync.js/src/batch-builder.ts index 591efe8f66..c40db23011 100644 --- a/sdk/zksync.js/src/batch-builder.ts +++ b/sdk/zksync.js/src/batch-builder.ts @@ -20,7 +20,16 @@ import { Wallet } from './wallet'; interface InternalTx { type: 'Withdraw' | 'Transfer' | 'ChangePubKey' | 'ForcedExit' | 'MintNFT' | 'WithdrawNFT' | 'Swap'; tx: any; - feeType: 'Withdraw' | 'Transfer' | ChangePubKeyFee | 'MintNFT' | 'WithdrawNFT' | 'Swap'; + feeType: + | 'Withdraw' + | 'Transfer' + | 'FastWithdraw' + | 'ForcedExit' + | ChangePubKeyFee + | 'Swap' + | 'MintNFT' + | 'WithdrawNFT' + | 'ForcedExit'; address: Address; token: TokenLike; // Whether or not the tx has been signed. @@ -292,7 +301,7 @@ export class BatchBuilder { this.txs.push({ type: 'ForcedExit', tx: _forcedExit, - feeType: 'Withdraw', + feeType: 'ForcedExit', address: _forcedExit.target, token: _forcedExit.token }); diff --git a/sdk/zksync.js/src/index.ts b/sdk/zksync.js/src/index.ts index fd2193fd77..2eb83f9daa 100644 --- a/sdk/zksync.js/src/index.ts +++ b/sdk/zksync.js/src/index.ts @@ -1,5 +1,7 @@ export { Wallet, Transaction, ETHOperation, submitSignedTransaction, submitSignedTransactionsBatch } from './wallet'; export { Provider, ETHProxy, getDefaultProvider } from './provider'; +export { RestProvider, getDefaultRestProvider } from './rest-provider'; +export { SyncProvider } from './provider-interface'; export { Signer, Create2WalletSigner } from './signer'; export { closestPackableTransactionAmount, closestPackableTransactionFee } from './utils'; export { EthMessageSigner } from './eth-message-signer'; diff --git a/sdk/zksync.js/src/provider-interface.ts b/sdk/zksync.js/src/provider-interface.ts new file mode 100644 index 0000000000..b246161927 --- /dev/null +++ b/sdk/zksync.js/src/provider-interface.ts @@ -0,0 +1,63 @@ +import { + AccountState, + Address, + ContractAddress, + Fee, + IncomingTxFeeType, + PriorityOperationReceipt, + TokenLike, + Tokens, + TransactionReceipt, + TxEthSignature, + TxEthSignatureVariant, + NFTInfo +} from './types'; +import { BigNumber } from 'ethers'; +import { TokenSet, isNFT } from './utils'; + +export abstract class SyncProvider { + contractAddress: ContractAddress; + public tokenSet: TokenSet; + public providerType: 'RPC' | 'Rest'; + // For HTTP provider + public pollIntervalMilliSecs = 500; + + abstract submitTx(tx: any, signature?: TxEthSignatureVariant, fastProcessing?: boolean): Promise; + abstract submitTxsBatch( + transactions: { tx: any; signature?: TxEthSignatureVariant }[], + ethSignatures?: TxEthSignature | TxEthSignature[] + ): Promise; + abstract getContractAddress(): Promise; + abstract getTokens(): Promise; + abstract getState(address: Address): Promise; + abstract getTxReceipt(txHash: string): Promise; + abstract getPriorityOpStatus(hashOrSerialId: string | number): Promise; + abstract getConfirmationsForEthOpAmount(): Promise; + abstract notifyPriorityOp( + hashOrSerialId: string | number, + action: 'COMMIT' | 'VERIFY' + ): Promise; + abstract notifyTransaction(hash: string, action: 'COMMIT' | 'VERIFY'): Promise; + abstract getTransactionFee(txType: IncomingTxFeeType, address: Address, tokenLike: TokenLike): Promise; + abstract getTransactionsBatchFee( + txTypes: IncomingTxFeeType[], + addresses: Address[], + tokenLike: TokenLike + ): Promise; + abstract getTokenPrice(tokenLike: TokenLike): Promise; + abstract getEthTxForWithdrawal(withdrawalHash: string): Promise; + abstract getNFT(id: number): Promise; + + async updateTokenSet(): Promise { + const updatedTokenSet = new TokenSet(await this.getTokens()); + this.tokenSet = updatedTokenSet; + } + async getTokenSymbol(token: TokenLike): Promise { + if (isNFT(token)) { + const nft = await this.getNFT(token as number); + return nft.symbol || `NFT-${token}`; + } + return this.tokenSet.resolveTokenSymbol(token); + } + async disconnect() {} +} diff --git a/sdk/zksync.js/src/provider.ts b/sdk/zksync.js/src/provider.ts index aacc72dce6..fafd16fc2d 100644 --- a/sdk/zksync.js/src/provider.ts +++ b/sdk/zksync.js/src/provider.ts @@ -3,10 +3,9 @@ import { BigNumber, ethers } from 'ethers'; import { AccountState, Address, - ChangePubKeyFee, + IncomingTxFeeType, ContractAddress, Fee, - LegacyChangePubKeyFee, Network, PriorityOperationReceipt, TokenAddress, @@ -17,7 +16,7 @@ import { TxEthSignatureVariant, NFTInfo } from './types'; -import { isTokenETH, sleep, TokenSet, isNFT } from './utils'; +import { isTokenETH, sleep, TokenSet } from './utils'; import { Governance, GovernanceFactory, @@ -27,6 +26,8 @@ import { ZkSyncNFTFactoryFactory } from './typechain'; +import { SyncProvider } from './provider-interface'; + export async function getDefaultProvider(network: Network, transport: 'WS' | 'HTTP' = 'HTTP'): Promise { if (transport === 'WS') { console.warn('Websocket support will be removed in future. Use HTTP transport instead.'); @@ -72,14 +73,11 @@ export async function getDefaultProvider(network: Network, transport: 'WS' | 'HT } } -export class Provider { - contractAddress: ContractAddress; - public tokenSet: TokenSet; - - // For HTTP provider - public pollIntervalMilliSecs = 500; - - private constructor(public transport: AbstractJSONRPCTransport) {} +export class Provider extends SyncProvider { + private constructor(public transport: AbstractJSONRPCTransport) { + super(); + this.providerType = 'RPC'; + } /** * @deprecated Websocket support will be removed in future. Use HTTP transport instead. @@ -154,11 +152,6 @@ export class Provider { return await this.transport.request('tokens', null); } - async updateTokenSet(): Promise { - const updatedTokenSet = new TokenSet(await this.getTokens()); - this.tokenSet = updatedTokenSet; - } - async getState(address: Address): Promise { return await this.transport.request('account_info', [address]); } @@ -191,14 +184,6 @@ export class Provider { return nft; } - async getTokenSymbol(token: TokenLike): Promise { - if (isNFT(token)) { - const nft = await this.getNFT(token as number); - return nft.symbol || `NFT-${token}`; - } - return this.tokenSet.resolveTokenSymbol(token); - } - async notifyPriorityOp(serialId: number, action: 'COMMIT' | 'VERIFY'): Promise { if (this.transport.subscriptionsSupported()) { return await new Promise((resolve) => { @@ -256,20 +241,7 @@ export class Provider { } } - async getTransactionFee( - txType: - | 'Withdraw' - | 'Transfer' - | 'FastWithdraw' - | 'MintNFT' - | 'Swap' - | ChangePubKeyFee - | 'WithdrawNFT' - | 'FastWithdrawNFT' - | LegacyChangePubKeyFee, - address: Address, - tokenLike: TokenLike - ): Promise { + async getTransactionFee(txType: IncomingTxFeeType, address: Address, tokenLike: TokenLike): Promise { const transactionFee = await this.transport.request('get_tx_fee', [txType, address.toString(), tokenLike]); return { feeType: transactionFee.feeType, @@ -282,17 +254,7 @@ export class Provider { } async getTransactionsBatchFee( - txTypes: ( - | 'Withdraw' - | 'Transfer' - | 'FastWithdraw' - | 'MintNFT' - | 'WithdrawNFT' - | 'FastWithdrawNFT' - | ChangePubKeyFee - | LegacyChangePubKeyFee - | 'Swap' - )[], + txTypes: IncomingTxFeeType[], addresses: Address[], tokenLike: TokenLike ): Promise { diff --git a/sdk/zksync.js/src/rest-provider.ts b/sdk/zksync.js/src/rest-provider.ts new file mode 100644 index 0000000000..600fb9831a --- /dev/null +++ b/sdk/zksync.js/src/rest-provider.ts @@ -0,0 +1,625 @@ +import Axios from 'axios'; +import { BigNumber } from 'ethers'; +import { SyncProvider } from './provider-interface'; +import * as types from './types'; +import { sleep, TokenSet } from './utils'; + +export async function getDefaultRestProvider(network: types.Network): Promise { + if (network === 'localhost') { + return await RestProvider.newProvider('http://127.0.0.1:3001/api/v0.2'); + } else if (network === 'ropsten') { + return await RestProvider.newProvider('https://ropsten-api.zksync.io/api/v0.2'); + } else if (network === 'rinkeby') { + return await RestProvider.newProvider('https://rinkeby-api.zksync.io/api/v0.2'); + } else if (network === 'ropsten-beta') { + return await RestProvider.newProvider('https://ropsten-beta-api.zksync.io/api/v0.2'); + } else if (network === 'rinkeby-beta') { + return await RestProvider.newProvider('https://rinkeby-beta-api.zksync.io/api/v0.2'); + } else if (network === 'mainnet') { + return await RestProvider.newProvider('https://api.zksync.io/api/v0.2'); + } else { + throw new Error(`Ethereum network ${network} is not supported`); + } +} + +export interface Request { + network: types.Network; + apiVersion: 'v02'; + resource: string; + args: any; + timestamp: string; +} + +export interface Error { + errorType: string; + code: number; + message: string; +} + +export interface Response { + request: Request; + status: 'success' | 'error'; + error?: Error; + result?: T; +} + +export class RESTError extends Error { + constructor(message: string, public restError: Error) { + super(message); + } +} + +export class RestProvider extends SyncProvider { + public static readonly MAX_LIMIT = 100; + + private constructor(public address: string) { + super(); + this.providerType = 'Rest'; + } + + static async newProvider( + address: string = 'http://127.0.0.1:3001/api/v0.2', + pollIntervalMilliSecs?: number + ): Promise { + const provider = new RestProvider(address); + if (pollIntervalMilliSecs) { + provider.pollIntervalMilliSecs = pollIntervalMilliSecs; + } + provider.contractAddress = await provider.getContractAddress(); + provider.tokenSet = new TokenSet(await provider.getTokens()); + return provider; + } + + parseResponse(response: Response): T { + if (response.status === 'success') { + return response.result; + } else { + throw new RESTError( + `zkSync API response error: errorType: ${response.error.errorType};` + + ` code ${response.error.code}; message: ${response.error.message}`, + response.error + ); + } + } + + async get(url: string): Promise> { + return await Axios.get(url).then((resp) => { + return resp.data; + }); + } + + async post(url: string, body: any): Promise> { + return await Axios.post(url, body).then((resp) => { + return resp.data; + }); + } + + async accountInfoDetailed( + idOrAddress: number | types.Address, + infoType: 'committed' | 'finalized' + ): Promise> { + return await this.get(`${this.address}/accounts/${idOrAddress}/${infoType}`); + } + + async accountInfo( + idOrAddress: number | types.Address, + infoType: 'committed' | 'finalized' + ): Promise { + return this.parseResponse(await this.accountInfoDetailed(idOrAddress, infoType)); + } + + async accountFullInfoDetailed(idOrAddress: number | types.Address): Promise> { + return await this.get(`${this.address}/accounts/${idOrAddress}`); + } + + async accountFullInfo(idOrAddress: number | types.Address): Promise { + return this.parseResponse(await this.accountFullInfoDetailed(idOrAddress)); + } + + async accountTxsDetailed( + idOrAddress: number | types.Address, + paginationQuery: types.PaginationQuery + ): Promise>> { + return await this.get( + `${this.address}/accounts/${idOrAddress}/transactions?from=${paginationQuery.from}` + + `&limit=${paginationQuery.limit}&direction=${paginationQuery.direction}` + ); + } + + async accountTxs( + idOrAddress: number | types.Address, + paginationQuery: types.PaginationQuery + ): Promise> { + return this.parseResponse(await this.accountTxsDetailed(idOrAddress, paginationQuery)); + } + + async accountPendingTxsDetailed( + idOrAddress: number | types.Address, + paginationQuery: types.PaginationQuery + ): Promise>> { + return await this.get( + `${this.address}/accounts/${idOrAddress}/transactions/pending?from=${paginationQuery.from}` + + `&limit=${paginationQuery.limit}&direction=${paginationQuery.direction}` + ); + } + + async accountPendingTxs( + idOrAddress: number | types.Address, + paginationQuery: types.PaginationQuery + ): Promise> { + return this.parseResponse(await this.accountPendingTxsDetailed(idOrAddress, paginationQuery)); + } + + async blockPaginationDetailed( + paginationQuery: types.PaginationQuery + ): Promise>> { + return await this.get( + `${this.address}/blocks?from=${paginationQuery.from}&limit=${paginationQuery.limit}` + + `&direction=${paginationQuery.direction}` + ); + } + + async blockPagination( + paginationQuery: types.PaginationQuery + ): Promise> { + return this.parseResponse(await this.blockPaginationDetailed(paginationQuery)); + } + + async blockByPositionDetailed(blockPosition: types.BlockPosition): Promise> { + return await this.get(`${this.address}/blocks/${blockPosition}`); + } + + async blockByPosition(blockPosition: types.BlockPosition): Promise { + return this.parseResponse(await this.blockByPositionDetailed(blockPosition)); + } + + async blockTransactionsDetailed( + blockPosition: types.BlockPosition, + paginationQuery: types.PaginationQuery + ): Promise>> { + return await this.get( + `${this.address}/blocks/${blockPosition}/transactions?from=${paginationQuery.from}` + + `&limit=${paginationQuery.limit}&direction=${paginationQuery.direction}` + ); + } + + async blockTransactions( + blockPosition: types.BlockPosition, + paginationQuery: types.PaginationQuery + ): Promise> { + return this.parseResponse(await this.blockTransactionsDetailed(blockPosition, paginationQuery)); + } + + async configDetailed(): Promise> { + return await this.get(`${this.address}/config`); + } + + async config(): Promise { + return this.parseResponse(await this.configDetailed()); + } + + async getTransactionFeeDetailed( + txType: types.IncomingTxFeeType, + address: types.Address, + tokenLike: types.TokenLike + ): Promise> { + const rawFee = await this.post<{ gasFee: string; zkpFee: string; totalFee: string }>(`${this.address}/fee`, { + txType, + address, + tokenLike + }); + let fee: Response; + if (rawFee.status === 'success') { + fee = { + request: rawFee.request, + status: rawFee.status, + error: null, + result: { + gasFee: BigNumber.from(rawFee.result.gasFee), + zkpFee: BigNumber.from(rawFee.result.zkpFee), + totalFee: BigNumber.from(rawFee.result.totalFee) + } + }; + } else { + fee = { + request: rawFee.request, + status: rawFee.status, + error: rawFee.error, + result: null + }; + } + return fee; + } + + async getTransactionFee( + txType: types.IncomingTxFeeType, + address: types.Address, + tokenLike: types.TokenLike + ): Promise { + return this.parseResponse(await this.getTransactionFeeDetailed(txType, address, tokenLike)); + } + + async getBatchFullFeeDetailed( + transactions: { + txType: types.IncomingTxFeeType; + address: types.Address; + }[], + tokenLike: types.TokenLike + ): Promise> { + const rawFee = await this.post<{ gasFee: string; zkpFee: string; totalFee: string }>( + `${this.address}/fee/batch`, + { transactions, tokenLike } + ); + let fee: Response; + if (rawFee.status === 'success') { + fee = { + request: rawFee.request, + status: rawFee.status, + error: null, + result: { + gasFee: BigNumber.from(rawFee.result.gasFee), + zkpFee: BigNumber.from(rawFee.result.zkpFee), + totalFee: BigNumber.from(rawFee.result.totalFee) + } + }; + } else { + fee = { + request: rawFee.request, + status: rawFee.status, + error: rawFee.error, + result: null + }; + } + return fee; + } + + async getBatchFullFee( + transactions: { + txType: types.IncomingTxFeeType; + address: types.Address; + }[], + tokenLike: types.TokenLike + ): Promise { + return this.parseResponse(await this.getBatchFullFeeDetailed(transactions, tokenLike)); + } + + async networkStatusDetailed(): Promise> { + return await this.get(`${this.address}/networkStatus`); + } + + async networkStatus(): Promise { + return this.parseResponse(await this.networkStatusDetailed()); + } + + async tokenPaginationDetailed( + paginationQuery: types.PaginationQuery + ): Promise>> { + return await this.get( + `${this.address}/tokens?from=${paginationQuery.from}&limit=${paginationQuery.limit}` + + `&direction=${paginationQuery.direction}` + ); + } + + async tokenPagination( + paginationQuery: types.PaginationQuery + ): Promise> { + return this.parseResponse(await this.tokenPaginationDetailed(paginationQuery)); + } + + async tokenByIdOrAddressDetailed(idOrAddress: number | types.TokenAddress): Promise> { + return await this.get(`${this.address}/tokens/${idOrAddress}`); + } + + async tokenByIdOrAddress(idOrAddress: number | types.TokenAddress): Promise { + return this.parseResponse(await this.tokenByIdOrAddressDetailed(idOrAddress)); + } + + async tokenPriceInfoDetailed( + idOrAddress: number | types.TokenAddress, + tokenIdOrUsd: number | 'usd' + ): Promise> { + return await this.get(`${this.address}/tokens/${idOrAddress}/priceIn/${tokenIdOrUsd}`); + } + + async tokenPriceInfo( + idOrAddress: number | types.TokenAddress, + tokenIdOrUsd: number | 'usd' + ): Promise { + return this.parseResponse(await this.tokenPriceInfoDetailed(idOrAddress, tokenIdOrUsd)); + } + + async submitTxNewDetailed(tx: types.L2Tx, signature?: types.TxEthSignatureVariant): Promise> { + return await this.post(`${this.address}/transactions`, { tx, signature }); + } + + async submitTxNew(tx: types.L2Tx, signature?: types.TxEthSignatureVariant): Promise { + return this.parseResponse(await this.submitTxNewDetailed(tx, signature)); + } + + /** + * @deprecated Use submitTxNew method instead + */ + async submitTx(tx: any, signature?: types.TxEthSignatureVariant, fastProcessing?: boolean): Promise { + if (fastProcessing) { + tx.fastProcessing = fastProcessing; + } + let txHash = await this.submitTxNew(tx, signature); + txHash.replace('0x', 'sync-tx:'); + return txHash; + } + + async txStatusDetailed(txHash: string): Promise> { + return await this.get(`${this.address}/transactions/${txHash}`); + } + + async txStatus(txHash: string): Promise { + return this.parseResponse(await this.txStatusDetailed(txHash)); + } + + async txDataDetailed(txHash: string): Promise> { + return await this.get(`${this.address}/transactions/${txHash}/data`); + } + + async txData(txHash: string): Promise { + return this.parseResponse(await this.txDataDetailed(txHash)); + } + + async submitTxsBatchNewDetailed( + txs: { tx: any; signature?: types.TxEthSignatureVariant }[], + signature?: types.TxEthSignature | types.TxEthSignature[] + ): Promise> { + return await this.post(`${this.address}/transactions/batches`, { txs, signature }); + } + + async submitTxsBatchNew( + txs: { tx: any; signature?: types.TxEthSignatureVariant }[], + signature?: types.TxEthSignature | types.TxEthSignature[] + ): Promise { + return this.parseResponse(await this.submitTxsBatchNewDetailed(txs, signature)); + } + + /** + * @deprecated Use submitTxsBatchNew method instead. + */ + async submitTxsBatch( + transactions: { tx: any; signature?: types.TxEthSignatureVariant }[], + ethSignatures?: types.TxEthSignature | types.TxEthSignature[] + ): Promise { + return (await this.submitTxsBatchNew(transactions, ethSignatures)).transactionHashes; + } + + async getBatchDetailed(batchHash: string): Promise> { + return await this.get(`${this.address}/transactions/batches/${batchHash}`); + } + + async getBatch(batchHash: string): Promise { + return this.parseResponse(await this.getBatchDetailed(batchHash)); + } + + async getNFTDetailed(id: number): Promise> { + return await this.get(`${this.address}/tokens/nft/${id}`); + } + + async getNFT(id: number): Promise { + const nft = this.parseResponse(await this.getNFTDetailed(id)); + + // If the NFT does not exist, throw an exception + if (nft == null) { + throw new Error(`Requested NFT doesn't exist or the corresponding mintNFT operation is not verified yet`); + } + return nft; + } + + async notifyAnyTransaction(hash: string, action: 'COMMIT' | 'VERIFY'): Promise { + while (true) { + let transactionStatus = await this.txStatus(hash); + let notifyDone; + if (action === 'COMMIT') { + notifyDone = transactionStatus && transactionStatus.rollupBlock; + } else { + if (transactionStatus && transactionStatus.rollupBlock) { + if (transactionStatus.status === 'rejected') { + // If the transaction status is rejected + // it cannot be known if transaction is queued, committed or finalized. + // That is why there is separate `blockByPosition` query. + const blockStatus = await this.blockByPosition(transactionStatus.rollupBlock); + notifyDone = blockStatus && blockStatus.status === 'finalized'; + } else { + notifyDone = transactionStatus.status === 'finalized'; + } + } + } + if (notifyDone) { + // Transaction status needs to be recalculated because it can + // be updated between `txStatus` and `blockByPosition` calls. + return await this.txStatus(hash); + } else { + await sleep(this.pollIntervalMilliSecs); + } + } + } + + async notifyTransaction(hash: string, action: 'COMMIT' | 'VERIFY'): Promise { + await this.notifyAnyTransaction(hash, action); + return await this.getTxReceipt(hash); + } + + async notifyPriorityOp(hash: string, action: 'COMMIT' | 'VERIFY'): Promise { + await this.notifyAnyTransaction(hash, action); + return await this.getPriorityOpStatus(hash); + } + + async getContractAddress(): Promise { + const config = await this.config(); + return { + mainContract: config.contract, + govContract: config.govContract + }; + } + + async getTokens(limit?: number): Promise { + let tokens = {}; + let tmpId = 0; + limit = limit ? limit : RestProvider.MAX_LIMIT; + let tokenPage: types.Paginated; + do { + tokenPage = await this.tokenPagination({ + from: tmpId, + limit, + direction: 'newer' + }); + for (let token of tokenPage.list) { + tokens[token.symbol] = { + address: token.address, + id: token.id, + symbol: token.symbol, + decimals: token.decimals + }; + } + tmpId += limit; + } while (tokenPage.list.length == limit); + + return tokens; + } + + async getState(address: types.Address): Promise { + const fullInfo = await this.accountFullInfo(address); + const defaultInfo = { + balances: {}, + nonce: 0, + pubKeyHash: 'sync:0000000000000000000000000000000000000000', + nfts: {}, + mintedNfts: {} + }; + + if (fullInfo.finalized) { + return { + address, + id: fullInfo.committed.accountId, + accountType: fullInfo.committed.accountType, + committed: { + balances: fullInfo.committed.balances, + nonce: fullInfo.committed.nonce, + pubKeyHash: fullInfo.committed.pubKeyHash, + nfts: fullInfo.committed.nfts, + mintedNfts: fullInfo.committed.mintedNfts + }, + verified: { + balances: fullInfo.finalized.balances, + nonce: fullInfo.finalized.nonce, + pubKeyHash: fullInfo.finalized.pubKeyHash, + nfts: fullInfo.finalized.nfts, + mintedNfts: fullInfo.finalized.mintedNfts + } + }; + } else if (fullInfo.committed) { + return { + address, + id: fullInfo.committed.accountId, + accountType: fullInfo.committed.accountType, + committed: { + balances: fullInfo.committed.balances, + nonce: fullInfo.committed.nonce, + pubKeyHash: fullInfo.committed.pubKeyHash, + nfts: fullInfo.committed.nfts, + mintedNfts: fullInfo.committed.mintedNfts + }, + verified: defaultInfo + }; + } else { + return { + address, + committed: defaultInfo, + verified: defaultInfo + }; + } + } + + async getConfirmationsForEthOpAmount(): Promise { + const config = await this.config(); + return config.depositConfirmations; + } + + async getTransactionsBatchFee( + txTypes: types.IncomingTxFeeType[], + addresses: types.Address[], + tokenLike: types.TokenLike + ): Promise { + let transactions = []; + for (let i = 0; i < txTypes.length; ++i) { + transactions.push({ txType: txTypes[i], address: addresses[i] }); + } + const fee = await this.getBatchFullFee(transactions, tokenLike); + return fee.totalFee; + } + + async getTokenPrice(tokenLike: types.TokenLike): Promise { + const price = await this.tokenPriceInfo(tokenLike, 'usd'); + return price.price.toNumber(); + } + + async getTxReceipt(txHash: string): Promise { + const receipt = await this.txStatus(txHash); + if (!receipt || !receipt.rollupBlock) { + return { + executed: false + }; + } else { + if (receipt.status === 'rejected') { + const blockFullInfo = await this.blockByPosition(receipt.rollupBlock); + const blockInfo = { + blockNumber: receipt.rollupBlock, + committed: blockFullInfo ? true : false, + verified: blockFullInfo && blockFullInfo.status === 'finalized' ? true : false + }; + return { + executed: true, + success: false, + failReason: receipt.failReason, + block: blockInfo + }; + } else { + return { + executed: true, + success: true, + block: { + blockNumber: receipt.rollupBlock, + committed: true, + verified: receipt.status === 'finalized' + } + }; + } + } + } + + async getPriorityOpStatus(hash: string): Promise { + const receipt = await this.txStatus(hash); + if (!receipt || !receipt.rollupBlock) { + return { + executed: false + }; + } else { + return { + executed: true, + block: { + blockNumber: receipt.rollupBlock, + committed: true, + verified: receipt.status === 'finalized' + } + }; + } + } + + async getEthTxForWithdrawal(withdrawalHash: string): Promise { + const txData = await this.txData(withdrawalHash); + if ( + txData.tx.op.type === 'Withdraw' || + txData.tx.op.type === 'ForcedExit' || + txData.tx.op.type === 'WithdrawNFT' + ) { + return txData.tx.op.ethTxHash; + } else { + return null; + } + } +} diff --git a/sdk/zksync.js/src/signer.ts b/sdk/zksync.js/src/signer.ts index 8f22b29b34..d2909f544a 100644 --- a/sdk/zksync.js/src/signer.ts +++ b/sdk/zksync.js/src/signer.ts @@ -315,7 +315,9 @@ export class Signer { return new Signer(await privateKeyFromSeed(seed)); } - static async fromETHSignature(ethSigner: ethers.Signer): Promise<{ + static async fromETHSignature( + ethSigner: ethers.Signer + ): Promise<{ signer: Signer; ethSignatureType: EthSignerType; }> { diff --git a/sdk/zksync.js/src/typechain/Governance.d.ts b/sdk/zksync.js/src/typechain/Governance.d.ts index d7280c055e..9883d8fb67 100644 --- a/sdk/zksync.js/src/typechain/Governance.d.ts +++ b/sdk/zksync.js/src/typechain/Governance.d.ts @@ -9,16 +9,21 @@ import { BigNumber, BigNumberish, PopulatedTransaction, -} from "ethers"; -import { Contract, ContractTransaction, Overrides, CallOverrides, -} from "@ethersproject/contracts"; -import { BytesLike } from "@ethersproject/bytes"; -import { Listener, Provider } from "@ethersproject/providers"; -import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; + BytesLike, + utils, + providers +} from "ethers"; +type FunctionFragment = utils.FunctionFragment; +type EventFragment = utils.EventFragment; +type Result = utils.Result; + +type Listener = providers.Listener; +type Provider = providers.Provider; + interface GovernanceInterface extends ethers.utils.Interface { functions: { diff --git a/sdk/zksync.js/src/typechain/GovernanceFactory.ts b/sdk/zksync.js/src/typechain/GovernanceFactory.ts index b873cee26d..505b23bc3f 100644 --- a/sdk/zksync.js/src/typechain/GovernanceFactory.ts +++ b/sdk/zksync.js/src/typechain/GovernanceFactory.ts @@ -2,9 +2,10 @@ /* tslint:disable */ /* eslint-disable */ -import { Signer } from "ethers"; -import { Provider, TransactionRequest } from "@ethersproject/providers"; -import { Contract, ContractFactory, Overrides } from "@ethersproject/contracts"; +import { Signer, providers, Contract, ContractFactory, Overrides } from "ethers"; + +type TransactionRequest = providers.TransactionRequest; +type Provider = providers.Provider; import type { Governance } from "./Governance"; diff --git a/sdk/zksync.js/src/typechain/ZkSync.d.ts b/sdk/zksync.js/src/typechain/ZkSync.d.ts index 0586a78013..8da49bdbb2 100644 --- a/sdk/zksync.js/src/typechain/ZkSync.d.ts +++ b/sdk/zksync.js/src/typechain/ZkSync.d.ts @@ -9,17 +9,21 @@ import { BigNumber, BigNumberish, PopulatedTransaction, -} from "ethers"; -import { Contract, ContractTransaction, Overrides, PayableOverrides, CallOverrides, -} from "@ethersproject/contracts"; -import { BytesLike } from "@ethersproject/bytes"; -import { Listener, Provider } from "@ethersproject/providers"; -import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; + BytesLike, + utils, + providers +} from "ethers"; +type FunctionFragment = utils.FunctionFragment; +type EventFragment = utils.EventFragment; +type Result = utils.Result; + +type Listener = providers.Listener; +type Provider = providers.Provider; interface ZkSyncInterface extends ethers.utils.Interface { functions: { diff --git a/sdk/zksync.js/src/typechain/ZkSyncFactory.ts b/sdk/zksync.js/src/typechain/ZkSyncFactory.ts index 72f82c01d3..35e96feb90 100644 --- a/sdk/zksync.js/src/typechain/ZkSyncFactory.ts +++ b/sdk/zksync.js/src/typechain/ZkSyncFactory.ts @@ -2,9 +2,10 @@ /* tslint:disable */ /* eslint-disable */ -import { Signer } from "ethers"; -import { Provider, TransactionRequest } from "@ethersproject/providers"; -import { Contract, ContractFactory, Overrides } from "@ethersproject/contracts"; +import { Signer, Contract, ContractFactory, Overrides, providers } from "ethers"; + +type TransactionRequest = providers.TransactionRequest; +type Provider = providers.Provider; import type { ZkSync } from "./ZkSync"; diff --git a/sdk/zksync.js/src/typechain/ZkSyncNFTFactory.d.ts b/sdk/zksync.js/src/typechain/ZkSyncNFTFactory.d.ts index eb014448e2..393ae340c8 100644 --- a/sdk/zksync.js/src/typechain/ZkSyncNFTFactory.d.ts +++ b/sdk/zksync.js/src/typechain/ZkSyncNFTFactory.d.ts @@ -9,16 +9,20 @@ import { BigNumber, BigNumberish, PopulatedTransaction, -} from "ethers"; -import { Contract, ContractTransaction, Overrides, CallOverrides, -} from "@ethersproject/contracts"; -import { BytesLike } from "@ethersproject/bytes"; -import { Listener, Provider } from "@ethersproject/providers"; -import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; + BytesLike, + utils, + providers +} from "ethers"; +type FunctionFragment = utils.FunctionFragment; +type EventFragment = utils.EventFragment; +type Result = utils.Result; + +type Listener = providers.Listener; +type Provider = providers.Provider; interface ZkSyncNFTFactoryInterface extends ethers.utils.Interface { functions: { diff --git a/sdk/zksync.js/src/typechain/ZkSyncNFTFactoryFactory.ts b/sdk/zksync.js/src/typechain/ZkSyncNFTFactoryFactory.ts index da1e858314..cd8ca0844b 100644 --- a/sdk/zksync.js/src/typechain/ZkSyncNFTFactoryFactory.ts +++ b/sdk/zksync.js/src/typechain/ZkSyncNFTFactoryFactory.ts @@ -2,9 +2,10 @@ /* tslint:disable */ /* eslint-disable */ -import { Signer } from "ethers"; -import { Provider, TransactionRequest } from "@ethersproject/providers"; -import { Contract, ContractFactory, Overrides } from "@ethersproject/contracts"; +import { Signer, Contract, ContractFactory, Overrides, providers } from "ethers"; + +type TransactionRequest = providers.TransactionRequest; +type Provider = providers.Provider; import type { ZkSyncNFTFactory } from "./ZkSyncNFTFactory"; diff --git a/sdk/zksync.js/src/types.ts b/sdk/zksync.js/src/types.ts index 4b8f3ea089..c3c169b90e 100644 --- a/sdk/zksync.js/src/types.ts +++ b/sdk/zksync.js/src/types.ts @@ -46,9 +46,52 @@ export interface NFTInfo { withdrawnFactory?: Address; } -export interface AccountState { +export type EthAccountType = 'Owned' | 'CREATE2'; + +export type AccountState = AccountStateRest | AccountStateRpc; + +export interface AccountStateRest { address: Address; id?: number; + accountType?: EthAccountType; + committed: { + balances: { + // Token are indexed by their symbol (e.g. "ETH") + [token: string]: BigNumberish; + }; + nfts: { + // NFT are indexed by their id + [tokenId: number]: NFT; + }; + mintedNfts: { + // NFT are indexed by their id + [tokenId: number]: NFT; + }; + nonce: number; + pubKeyHash: PubKeyHash; + }; + verified: { + balances: { + // Token are indexed by their symbol (e.g. "ETH") + [token: string]: BigNumberish; + }; + nfts: { + // NFT are indexed by their id + [tokenId: number]: NFT; + }; + mintedNfts: { + // NFT are indexed by their id + [tokenId: number]: NFT; + }; + nonce: number; + pubKeyHash: PubKeyHash; + }; +} + +export interface AccountStateRpc { + address: Address; + id?: number; + accountType?: EthAccountType; depositing: { balances: { // Token are indexed by their symbol (e.g. "ETH") @@ -320,7 +363,9 @@ export interface LegacyChangePubKeyFee { }; } -export interface Fee { +export type Fee = FeeRpc | FeeRest; + +export interface FeeRpc { // Operation type (amount of chunks in operation differs and impacts the total fee). feeType: | 'Withdraw' @@ -343,7 +388,238 @@ export interface Fee { totalFee: BigNumber; } -export interface BatchFee { +export type BatchFee = BatchFeeRpc | FeeRest; + +export interface BatchFeeRpc { // Total fee amount (in wei) totalFee: BigNumber; } + +export type IncomingTxFeeType = + | 'Withdraw' + | 'Transfer' + | 'FastWithdraw' + | 'ForcedExit' + | 'MintNFT' + | 'WithdrawNFT' + | 'FastWithdrawNFT' + | 'Swap' + | ChangePubKeyFee + | LegacyChangePubKeyFee; + +export interface PaginationQuery { + from: F | 'latest'; + limit: number; + direction: 'newer' | 'older'; +} + +export interface Paginated { + list: T[]; + pagination: { + from: F; + limit: number; + direction: 'newer' | 'older'; + count: number; + }; +} + +export interface ApiBlockInfo { + blockNumber: number; + newStateRoot: string; + blockSize: number; + commitTxHash?: string; + verifyTxHash?: string; + committedAt: string; + finalizedAt?: string; + status: 'committed' | 'finalized'; +} + +export type BlockPosition = number | 'lastCommitted' | 'lastFinalized'; + +export interface ApiAccountInfo { + accountId: number; + address: Address; + nonce: number; + pubKeyHash: PubKeyHash; + lastUpdateInBlock: number; + balances: { + [token: string]: BigNumber; + }; + accountType?: EthAccountType; + nfts: { + [tokenId: number]: NFT; + }; + mintedNfts: { + [tokenId: number]: NFT; + }; +} + +export interface ApiAccountFullInfo { + committed: ApiAccountInfo; + finalized: ApiAccountInfo; +} + +export interface ApiConfig { + network: Network; + contract: Address; + govContract: Address; + depositConfirmations: number; + zksyncVersion: 'contractV4'; + // TODO: server_version (ZKS-627) +} + +export interface FeeRest { + gasFee: BigNumber; + zkpFee: BigNumber; + totalFee: BigNumber; +} + +export interface NetworkStatus { + lastCommitted: number; + finalized: number; + totalTransactions: number; + mempoolSize: number; +} + +export interface TokenInfo { + id: number; + address: Address; + symbol: string; + decimals: number; + enabledForFees: boolean; +} + +export interface TokenPriceInfo { + tokenId: number; + tokenSymbol: string; + priceIn: string; + decimals: number; + price: BigNumber; +} + +export interface SubmitBatchResponse { + transactionHashes: string[]; + batchHash: string; +} + +export interface ApiL1TxReceipt { + status: 'queued' | 'committed' | 'finalized'; + ethBlock: number; + rollupBlock?: number; + id: number; +} + +export type L2TxStatus = 'queued' | 'committed' | 'finalized' | 'rejected'; + +export interface ApiL2TxReceipt { + txHash: string; + rollupBlock?: number; + status: L2TxStatus; + failReason?: string; +} + +export type ApiTxReceipt = ApiL1TxReceipt | ApiL2TxReceipt; + +export interface WithdrawData { + type: 'Withdraw'; + accountId: number; + from: Address; + to: Address; + token: number; + amount: BigNumberish; + fee: BigNumberish; + nonce: number; + signature?: Signature; + validFrom: number; + validUntil: number; + ethTxHash?: string; +} + +export interface ForcedExitData { + type: 'ForcedExit'; + initiatorAccountId: number; + target: Address; + token: number; + fee: BigNumberish; + nonce: number; + signature?: Signature; + validFrom: number; + validUntil: number; + ethTxHash?: string; +} + +export interface WithdrawNFTData { + type: 'WithdrawNFT'; + accountId: number; + from: Address; + to: Address; + token: number; + feeToken: number; + fee: BigNumberish; + nonce: number; + signature?: Signature; + validFrom: number; + validUntil: number; + ethTxHash?: string; +} + +export interface ApiDeposit { + type: 'Deposit'; + from: Address; + tokenId: number; + amount: BigNumber; + to: Address; + accountId?: number; + ethHash: string; + id: number; + txHash: string; +} + +export interface ApiFullExit { + type: 'FullExit'; + accountId: number; + tokenId: number; + ethHash: string; + id: number; + txHash: string; +} + +export type L2Tx = Transfer | Withdraw | ChangePubKey | ForcedExit | CloseAccount | MintNFT | WithdrawNFT | Swap; + +export type L2TxData = + | Transfer + | WithdrawData + | ChangePubKey + | ForcedExitData + | CloseAccount + | MintNFT + | WithdrawNFTData + | Swap; + +export type TransactionData = L2TxData | ApiDeposit | ApiFullExit; + +export interface ApiTransaction { + txHash: string; + blockNumber?: number; + op: TransactionData; + status: L2TxStatus; + failReason?: string; + createdAt?: string; +} + +export interface ApiSignedTx { + tx: ApiTransaction; + ethSignature?: string; +} + +export interface ApiBatchStatus { + updatedAt: string; + lastState: L2TxStatus; +} + +export interface ApiBatchData { + batchHash: string; + transactionHashes: string[]; + createdAt: string; + batchStatus: ApiBatchStatus; +} diff --git a/sdk/zksync.js/src/utils.ts b/sdk/zksync.js/src/utils.ts index 2751f58fd1..7327fe392e 100644 --- a/sdk/zksync.js/src/utils.ts +++ b/sdk/zksync.js/src/utils.ts @@ -1,5 +1,5 @@ import { utils, constants, ethers, BigNumber, BigNumberish, Contract } from 'ethers'; -import { Provider } from '.'; +import { SyncProvider } from './provider-interface'; import { PubKeyHash, TokenAddress, @@ -880,7 +880,7 @@ export function getCREATE2AddressAndSalt( export async function getEthereumBalance( ethProvider: ethers.providers.Provider, - syncProvider: Provider, + syncProvider: SyncProvider, address: Address, token: TokenLike ): Promise { @@ -901,7 +901,7 @@ export async function getEthereumBalance( export async function getPendingBalance( ethProvider: ethers.providers.Provider, - syncProvider: Provider, + syncProvider: SyncProvider, address: Address, token: TokenLike ): Promise { diff --git a/sdk/zksync.js/src/wallet.ts b/sdk/zksync.js/src/wallet.ts index 7f3b48882e..a9239cb9f2 100644 --- a/sdk/zksync.js/src/wallet.ts +++ b/sdk/zksync.js/src/wallet.ts @@ -1,7 +1,7 @@ import { BigNumber, BigNumberish, Contract, ContractTransaction, ethers } from 'ethers'; import { ErrorCode } from '@ethersproject/logger'; import { EthMessageSigner } from './eth-message-signer'; -import { Provider } from './provider'; +import { SyncProvider } from './provider-interface'; import { Create2WalletSigner, Signer } from './signer'; import { BatchBuilder } from './batch-builder'; import { @@ -60,7 +60,7 @@ export class ZKSyncTxError extends Error { } export class Wallet { - public provider: Provider; + public provider: SyncProvider; private constructor( public ethSigner: ethers.Signer, @@ -71,14 +71,14 @@ export class Wallet { public ethSignerType?: EthSignerType ) {} - connect(provider: Provider) { + connect(provider: SyncProvider) { this.provider = provider; return this; } static async fromEthSigner( ethWallet: ethers.Signer, - provider: Provider, + provider: SyncProvider, signer?: Signer, accountId?: number, ethSignerType?: EthSignerType @@ -107,7 +107,7 @@ export class Wallet { static async fromCreate2Data( syncSigner: Signer, - provider: Provider, + provider: SyncProvider, create2Data: Create2Data, accountId?: number ): Promise { @@ -120,7 +120,7 @@ export class Wallet { static async fromEthSignerNoKeys( ethWallet: ethers.Signer, - provider: Provider, + provider: SyncProvider, accountId?: number, ethSignerType?: EthSignerType ): Promise { @@ -225,7 +225,9 @@ export class Wallet { }; } - async signRegisterFactory(factoryAddress: Address): Promise<{ + async signRegisterFactory( + factoryAddress: Address + ): Promise<{ signature: TxEthSignature; accountId: number; accountAddress: Address; @@ -311,8 +313,7 @@ export class Wallet { }): Promise { forcedExit.nonce = forcedExit.nonce != null ? await this.getNonce(forcedExit.nonce) : await this.getNonce(); if (forcedExit.fee == null) { - // Fee for forced exit is defined by `Withdraw` transaction type (as it's essentially just a forced withdraw). - const fullFee = await this.provider.getTransactionFee('Withdraw', forcedExit.target, forcedExit.token); + const fullFee = await this.provider.getTransactionFee('ForcedExit', forcedExit.target, forcedExit.token); forcedExit.fee = fullFee.totalFee; } @@ -1451,7 +1452,7 @@ export class ETHOperation { error?: ZKSyncTxError; priorityOpId?: BigNumber; - constructor(public ethTx: ContractTransaction, public zkSyncProvider: Provider) { + constructor(public ethTx: ContractTransaction, public zkSyncProvider: SyncProvider) { this.state = 'Sent'; } @@ -1480,7 +1481,14 @@ export class ETHOperation { await this.awaitEthereumTxCommit(); if (this.state !== 'Mined') return; - const receipt = await this.zkSyncProvider.notifyPriorityOp(this.priorityOpId.toNumber(), 'COMMIT'); + + let query: number | string; + if (this.zkSyncProvider.providerType === 'RPC') { + query = this.priorityOpId.toNumber(); + } else { + query = this.ethTx.hash; + } + const receipt = await this.zkSyncProvider.notifyPriorityOp(query, 'COMMIT'); if (!receipt.executed) { this.setErrorState(new ZKSyncTxError('Priority operation failed', receipt)); @@ -1495,7 +1503,13 @@ export class ETHOperation { await this.awaitReceipt(); if (this.state !== 'Committed') return; - const receipt = await this.zkSyncProvider.notifyPriorityOp(this.priorityOpId.toNumber(), 'VERIFY'); + let query: number | string; + if (this.zkSyncProvider.providerType === 'RPC') { + query = this.priorityOpId.toNumber(); + } else { + query = this.ethTx.hash; + } + const receipt = await this.zkSyncProvider.notifyPriorityOp(query, 'VERIFY'); this.state = 'Verified'; @@ -1516,7 +1530,7 @@ export class Transaction { state: 'Sent' | 'Committed' | 'Verified' | 'Failed'; error?: ZKSyncTxError; - constructor(public txData, public txHash: string, public sidechainProvider: Provider) { + constructor(public txData, public txHash: string, public sidechainProvider: SyncProvider) { this.state = 'Sent'; } @@ -1556,7 +1570,7 @@ export class Transaction { export async function submitSignedTransaction( signedTx: SignedTransaction, - provider: Provider, + provider: SyncProvider, fastProcessing?: boolean ): Promise { const transactionHash = await provider.submitTx(signedTx.tx, signedTx.ethereumSignature, fastProcessing); @@ -1564,7 +1578,7 @@ export async function submitSignedTransaction( } export async function submitSignedTransactionsBatch( - provider: Provider, + provider: SyncProvider, signedTxs: SignedTransaction[], ethSignatures?: TxEthSignature[] ): Promise { diff --git a/yarn.lock b/yarn.lock index 534397d387..cddcf7bc09 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,38 +16,38 @@ dependencies: "@babel/highlight" "^7.12.13" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.15", "@babel/compat-data@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.0.tgz#a901128bce2ad02565df95e6ecbf195cf9465919" - integrity sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q== +"@babel/compat-data@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.13.tgz#27e19e0ed3726ccf54067ced4109501765e7e2e8" + integrity sha512-U/hshG5R+SIoW7HVWIdmy1cB7s3ki+r3FpyEZiCgpi4tFgPnX/vynY80ZGSASOIrUM6O7VxOgCZgdt7h97bUGg== "@babel/core@^7.11.0": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.3.tgz#5395e30405f0776067fbd9cf0884f15bfb770a38" - integrity sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg== + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.16.tgz#8c6ba456b23b680a6493ddcfcd9d3c3ad51cab7c" + integrity sha512-t/hHIB504wWceOeaOoONOhu+gX+hpjfeN6YRBT209X/4sibZQfSF1I0HFRRlBe97UZZosGx5XwUg1ZgNbelmNw== dependencies: "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.14.3" - "@babel/helper-compilation-targets" "^7.13.16" - "@babel/helper-module-transforms" "^7.14.2" - "@babel/helpers" "^7.14.0" - "@babel/parser" "^7.14.3" + "@babel/generator" "^7.12.15" + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helpers" "^7.12.13" + "@babel/parser" "^7.12.16" "@babel/template" "^7.12.13" - "@babel/traverse" "^7.14.2" - "@babel/types" "^7.14.2" + "@babel/traverse" "^7.12.13" + "@babel/types" "^7.12.13" convert-source-map "^1.7.0" debug "^4.1.0" - gensync "^1.0.0-beta.2" + gensync "^1.0.0-beta.1" json5 "^2.1.2" - semver "^6.3.0" + lodash "^4.17.19" + semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.14.2", "@babel/generator@^7.14.3": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.3.tgz#0c2652d91f7bddab7cccc6ba8157e4f40dcedb91" - integrity sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA== +"@babel/generator@^7.12.13", "@babel/generator@^7.12.15": + version "7.12.15" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.15.tgz#4617b5d0b25cc572474cc1aafee1edeaf9b5368f" + integrity sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ== dependencies: - "@babel/types" "^7.14.2" + "@babel/types" "^7.12.13" jsesc "^2.5.1" source-map "^0.5.0" @@ -66,65 +66,50 @@ "@babel/helper-explode-assignable-expression" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.9.6": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c" - integrity sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA== +"@babel/helper-compilation-targets@^7.12.16", "@babel/helper-compilation-targets@^7.9.6": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.16.tgz#6905238b4a5e02ba2d032c1a49dd1820fe8ce61b" + integrity sha512-dBHNEEaZx7F3KoUYqagIhRIeqyyuI65xMndMZ3WwGwEBI609I4TleYQHcrS627vbKyNTXqShoN+fvYD9HuQxAg== dependencies: - "@babel/compat-data" "^7.13.15" - "@babel/helper-validator-option" "^7.12.17" + "@babel/compat-data" "^7.12.13" + "@babel/helper-validator-option" "^7.12.16" browserslist "^4.14.5" - semver "^6.3.0" + semver "^5.5.0" -"@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.14.0", "@babel/helper-create-class-features-plugin@^7.14.2", "@babel/helper-create-class-features-plugin@^7.14.3": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.3.tgz#832111bcf4f57ca57a4c5b1a000fc125abc6554a" - integrity sha512-BnEfi5+6J2Lte9LeiL6TxLWdIlEv9Woacc1qXzXBgbikcOzMRM2Oya5XGg/f/ngotv1ej2A/b+3iJH8wbS1+lQ== +"@babel/helper-create-class-features-plugin@^7.12.13": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.16.tgz#955d5099fd093e5afb05542190f8022105082c61" + integrity sha512-KbSEj8l9zYkMVHpQqM3wJNxS1d9h3U9vm/uE5tpjMbaj3lTp+0noe3KPsV5dSD9jxKnf9jO9Ip9FX5PKNZCKow== dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-function-name" "^7.14.2" - "@babel/helper-member-expression-to-functions" "^7.13.12" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-member-expression-to-functions" "^7.12.16" "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-replace-supers" "^7.14.3" + "@babel/helper-replace-supers" "^7.12.13" "@babel/helper-split-export-declaration" "^7.12.13" "@babel/helper-create-regexp-features-plugin@^7.12.13": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.3.tgz#149aa6d78c016e318c43e2409a0ae9c136a86688" - integrity sha512-JIB2+XJrb7v3zceV2XzDhGIB902CmKGSpSl4q2C6agU9SNLG/2V1RtFRGPG1Ajh9STj3+q6zJMOC+N/pp2P9DA== + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.16.tgz#3b31d13f39f930fad975e151163b7df7d4ffe9d3" + integrity sha512-jAcQ1biDYZBdaAxB4yg46/XirgX7jBDiMHDbwYQOgtViLBXGxJpZQ24jutmBqAIB/q+AwB6j+NbBXjKxEY8vqg== dependencies: "@babel/helper-annotate-as-pure" "^7.12.13" regexpu-core "^4.7.1" -"@babel/helper-define-polyfill-provider@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz#a640051772045fedaaecc6f0c6c69f02bdd34bf1" - integrity sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw== - dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - "@babel/helper-explode-assignable-expression@^7.12.13": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz#17b5c59ff473d9f956f40ef570cf3a76ca12657f" - integrity sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA== + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.13.tgz#0e46990da9e271502f77507efa4c9918d3d8634a" + integrity sha512-5loeRNvMo9mx1dA/d6yNi+YiKziJZFylZnCo1nmFF4qPU4yJ14abhWESuSMQSlQxWdxdOFzxXjk/PpfudTtYyw== dependencies: - "@babel/types" "^7.13.0" + "@babel/types" "^7.12.13" -"@babel/helper-function-name@^7.12.13", "@babel/helper-function-name@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz#397688b590760b6ef7725b5f0860c82427ebaac2" - integrity sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ== +"@babel/helper-function-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" + integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== dependencies: "@babel/helper-get-function-arity" "^7.12.13" "@babel/template" "^7.12.13" - "@babel/types" "^7.14.2" + "@babel/types" "^7.12.13" "@babel/helper-get-function-arity@^7.12.13": version "7.12.13" @@ -133,41 +118,41 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-hoist-variables@^7.13.0": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.16.tgz#1b1651249e94b51f8f0d33439843e33e39775b30" - integrity sha512-1eMtTrXtrwscjcAeO4BVK+vvkxaLJSPFz1w1KLawz6HLNi9bPFGBNwwDyVfiu1Tv/vRRFYfoGaKhmAQPGPn5Wg== +"@babel/helper-hoist-variables@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.12.13.tgz#13aba58b7480b502362316ea02f52cca0e9796cd" + integrity sha512-KSC5XSj5HreRhYQtZ3cnSnQwDzgnbdUDEFsxkN0m6Q3WrCRt72xrnZ8+h+pX7YxM7hr87zIO3a/v5p/H3TrnVw== dependencies: - "@babel/traverse" "^7.13.15" - "@babel/types" "^7.13.16" + "@babel/types" "^7.12.13" -"@babel/helper-member-expression-to-functions@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" - integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw== +"@babel/helper-member-expression-to-functions@^7.12.13", "@babel/helper-member-expression-to-functions@^7.12.16": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.16.tgz#41e0916b99f8d5f43da4f05d85f4930fa3d62b22" + integrity sha512-zYoZC1uvebBFmj1wFAlXwt35JLEgecefATtKp20xalwEK8vHAixLBXTGxNrVGEmTT+gzOThUgr8UEdgtalc1BQ== dependencies: - "@babel/types" "^7.13.12" + "@babel/types" "^7.12.13" -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.13.12", "@babel/helper-module-imports@^7.8.3": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" - integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA== +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0" + integrity sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g== dependencies: - "@babel/types" "^7.13.12" + "@babel/types" "^7.12.13" -"@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.14.0", "@babel/helper-module-transforms@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz#ac1cc30ee47b945e3e0c4db12fa0c5389509dfe5" - integrity sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA== +"@babel/helper-module-transforms@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.13.tgz#01afb052dcad2044289b7b20beb3fa8bd0265bea" + integrity sha512-acKF7EjqOR67ASIlDTupwkKM1eUisNAjaSduo5Cz+793ikfnpe7p4Q7B7EWU2PCoSTPWsQkR7hRUWEIZPiVLGA== dependencies: - "@babel/helper-module-imports" "^7.13.12" - "@babel/helper-replace-supers" "^7.13.12" - "@babel/helper-simple-access" "^7.13.12" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" + "@babel/helper-simple-access" "^7.12.13" "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/helper-validator-identifier" "^7.14.0" + "@babel/helper-validator-identifier" "^7.12.11" "@babel/template" "^7.12.13" - "@babel/traverse" "^7.14.2" - "@babel/types" "^7.14.2" + "@babel/traverse" "^7.12.13" + "@babel/types" "^7.12.13" + lodash "^4.17.19" "@babel/helper-optimise-call-expression@^7.12.13": version "7.12.13" @@ -176,36 +161,36 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" - integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz#174254d0f2424d8aefb4dd48057511247b0a9eeb" + integrity sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA== -"@babel/helper-remap-async-to-generator@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz#376a760d9f7b4b2077a9dd05aa9c3927cadb2209" - integrity sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg== +"@babel/helper-remap-async-to-generator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.13.tgz#170365f4140e2d20e5c88f8ba23c24468c296878" + integrity sha512-Qa6PU9vNcj1NZacZZI1Mvwt+gXDH6CTfgAkSjeRMLE8HxtDK76+YDId6NQR+z7Rgd5arhD2cIbS74r0SxD6PDA== dependencies: "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-wrap-function" "^7.13.0" - "@babel/types" "^7.13.0" + "@babel/helper-wrap-function" "^7.12.13" + "@babel/types" "^7.12.13" -"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.12", "@babel/helper-replace-supers@^7.14.3": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.3.tgz#ca17b318b859d107f0e9b722d58cf12d94436600" - integrity sha512-Rlh8qEWZSTfdz+tgNV/N4gz1a0TMNwCUcENhMjHTHKp3LseYH5Jha0NSlyTQWMnjbYcwFt+bqAMqSLHVXkQ6UA== +"@babel/helper-replace-supers@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz#00ec4fb6862546bd3d0aff9aac56074277173121" + integrity sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg== dependencies: - "@babel/helper-member-expression-to-functions" "^7.13.12" + "@babel/helper-member-expression-to-functions" "^7.12.13" "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/traverse" "^7.14.2" - "@babel/types" "^7.14.2" + "@babel/traverse" "^7.12.13" + "@babel/types" "^7.12.13" -"@babel/helper-simple-access@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" - integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA== +"@babel/helper-simple-access@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz#8478bcc5cacf6aa1672b251c1d2dde5ccd61a6c4" + integrity sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA== dependencies: - "@babel/types" "^7.13.12" + "@babel/types" "^7.12.13" "@babel/helper-skip-transparent-expression-wrappers@^7.12.1": version "7.12.1" @@ -221,186 +206,156 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-validator-identifier@^7.12.11", "@babel/helper-validator-identifier@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" - integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== +"@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== -"@babel/helper-validator-option@^7.12.17": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" - integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== +"@babel/helper-validator-option@^7.12.16": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.16.tgz#f73cbd3bbba51915216c5dea908e9b206bb10051" + integrity sha512-uCgsDBPUQDvzr11ePPo4TVEocxj8RXjUVSC/Y8N1YpVAI/XDdUwGJu78xmlGhTxj2ntaWM7n9LQdRtyhOzT2YQ== -"@babel/helper-wrap-function@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz#bdb5c66fda8526ec235ab894ad53a1235c79fcc4" - integrity sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA== +"@babel/helper-wrap-function@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.13.tgz#e3ea8cb3ee0a16911f9c1b50d9e99fe8fe30f9ff" + integrity sha512-t0aZFEmBJ1LojdtJnhOaQEVejnzYhyjWHSsNSNo8vOYRbAJNh6r6GQF7pd36SqG7OKGbn+AewVQ/0IfYfIuGdw== dependencies: "@babel/helper-function-name" "^7.12.13" "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" + "@babel/traverse" "^7.12.13" + "@babel/types" "^7.12.13" -"@babel/helpers@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.0.tgz#ea9b6be9478a13d6f961dbb5f36bf75e2f3b8f62" - integrity sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg== +"@babel/helpers@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.13.tgz#3c75e993632e4dadc0274eae219c73eb7645ba47" + integrity sha512-oohVzLRZ3GQEk4Cjhfs9YkJA4TdIDTObdBEZGrd6F/T0GPSnuV6l22eMcxlvcvzVIPH3VTtxbseudM1zIE+rPQ== dependencies: "@babel/template" "^7.12.13" - "@babel/traverse" "^7.14.0" - "@babel/types" "^7.14.0" + "@babel/traverse" "^7.12.13" + "@babel/types" "^7.12.13" "@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" - integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg== + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.12.13.tgz#8ab538393e00370b26271b01fa08f7f27f2e795c" + integrity sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww== dependencies: - "@babel/helper-validator-identifier" "^7.14.0" + "@babel/helper-validator-identifier" "^7.12.11" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.12.13", "@babel/parser@^7.14.2", "@babel/parser@^7.14.3", "@babel/parser@^7.7.0": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.3.tgz#9b530eecb071fd0c93519df25c5ff9f14759f298" - integrity sha512-7MpZDIfI7sUC5zWo2+foJ50CSI5lcqDehZ0lVgIhSi4bFEk94fLAKlF3Q0nzSQQ+ca0lm+O6G9ztKVBeu8PMRQ== +"@babel/parser@^7.12.13", "@babel/parser@^7.12.16", "@babel/parser@^7.7.0": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.16.tgz#cc31257419d2c3189d394081635703f549fc1ed4" + integrity sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw== -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz#a3484d84d0b549f3fc916b99ee4783f26fabad2a" - integrity sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ== - dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" - "@babel/plugin-proposal-optional-chaining" "^7.13.12" - -"@babel/plugin-proposal-async-generator-functions@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.2.tgz#3a2085abbf5d5f962d480dbc81347385ed62eb1e" - integrity sha512-b1AM4F6fwck4N8ItZ/AtC4FP/cqZqmKRQ4FaTDutwSYyjuhtvsGEMLK4N/ztV/ImP40BjIDyMgBQAeAMsQYVFQ== - dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-remap-async-to-generator" "^7.13.0" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.8.3": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37" - integrity sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg== +"@babel/plugin-proposal-async-generator-functions@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.13.tgz#d1c6d841802ffb88c64a2413e311f7345b9e66b5" + integrity sha512-1KH46Hx4WqP77f978+5Ye/VUbuwQld2hph70yaw2hXS2v7ER2f3nlpNMu909HO2rbvP0NKLlMVDPh9KXklVMhA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-remap-async-to-generator" "^7.12.13" + "@babel/plugin-syntax-async-generators" "^7.8.0" -"@babel/plugin-proposal-class-static-block@^7.13.11": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.3.tgz#5a527e2cae4a4753119c3a3e7f64ecae8ccf1360" - integrity sha512-HEjzp5q+lWSjAgJtSluFDrGGosmwTgKwCXdDQZvhKsRlwv3YdkUEqxNrrjesJd+B9E9zvr1PVPVBvhYZ9msjvQ== +"@babel/plugin-proposal-class-properties@^7.12.13", "@babel/plugin-proposal-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.13.tgz#3d2ce350367058033c93c098e348161d6dc0d8c8" + integrity sha512-8SCJ0Ddrpwv4T7Gwb33EmW1V9PY5lggTO+A8WjyIwxrSHDUyBw4MtF96ifn1n8H806YlxbVCoKXbbmzD6RD+cA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.3" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-class-static-block" "^7.12.13" + "@babel/helper-create-class-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-proposal-decorators@^7.8.3": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.14.2.tgz#e68c3c5e4a6a08834456568256fc3e71b93590cf" - integrity sha512-LauAqDd/VjQDtae58QgBcEOE42NNP+jB2OE+XeC3KBI/E+BhhRjtr5viCIrj1hmu1YvrguLipIPRJZmS5yUcFw== + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.13.tgz#d4c89b40c2b7a526b0d394de4f4def36191e413e" + integrity sha512-x2aOr5w4ARJoYHFKoG2iEUL/Xe99JAJXjAasHijXp3/KgaetJXGE62SmHgsW3Tia/XUT5AxF2YC0F+JyhPY/0Q== dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.2" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-create-class-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-decorators" "^7.12.13" -"@babel/plugin-proposal-dynamic-import@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.2.tgz#01ebabd7c381cff231fa43e302939a9de5be9d9f" - integrity sha512-oxVQZIWFh91vuNEMKltqNsKLFWkOIyJc95k2Gv9lWVyDfPUQGSSlbDEgWuJUU1afGE9WwlzpucMZ3yDRHIItkA== +"@babel/plugin-proposal-dynamic-import@^7.12.16": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.16.tgz#b9f33b252e3406d492a15a799c9d45a9a9613473" + integrity sha512-yiDkYFapVxNOCcBfLnsb/qdsliroM+vc3LHiZwS4gh7pFjo5Xq3BDhYBNn3H3ao+hWPvqeeTdU+s+FIvokov+w== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" -"@babel/plugin-proposal-export-namespace-from@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.2.tgz#62542f94aa9ce8f6dba79eec698af22112253791" - integrity sha512-sRxW3z3Zp3pFfLAgVEvzTFutTXax837oOatUIvSG9o5gRj9mKwm3br1Se5f4QalTQs9x4AzlA/HrCWbQIHASUQ== +"@babel/plugin-proposal-export-namespace-from@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" + integrity sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.2.tgz#830b4e2426a782e8b2878fbfe2cba85b70cbf98c" - integrity sha512-w2DtsfXBBJddJacXMBhElGEYqCZQqN99Se1qeYn8DVLB33owlrlLftIbMzn5nz1OITfDVknXF433tBrLEAOEjA== +"@babel/plugin-proposal-json-strings@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.13.tgz#ced7888a2db92a3d520a2e35eb421fdb7fcc9b5d" + integrity sha512-v9eEi4GiORDg8x+Dmi5r8ibOe0VXoKDeNPYcTTxdGN4eOWikrJfDJCJrr1l5gKGvsNyGJbrfMftC2dTL6oz7pg== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-json-strings" "^7.8.0" -"@babel/plugin-proposal-logical-assignment-operators@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.2.tgz#222348c080a1678e0e74ea63fe76f275882d1fd7" - integrity sha512-1JAZtUrqYyGsS7IDmFeaem+/LJqujfLZ2weLR9ugB0ufUPjzf8cguyVT1g5im7f7RXxuLq1xUxEzvm68uYRtGg== +"@babel/plugin-proposal-logical-assignment-operators@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.13.tgz#575b5d9a08d8299eeb4db6430da6e16e5cf14350" + integrity sha512-fqmiD3Lz7jVdK6kabeSr1PZlWSUVqSitmHEe3Z00dtGTKieWnX9beafvavc32kjORa5Bai4QNHgFDwWJP+WtSQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.2.tgz#425b11dc62fc26939a2ab42cbba680bdf5734546" - integrity sha512-ebR0zU9OvI2N4qiAC38KIAK75KItpIPTpAtd2r4OZmMFeKbKJpUFLYP2EuDut82+BmYi8sz42B+TfTptJ9iG5Q== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.13.tgz#24867307285cee4e1031170efd8a7ac807deefde" + integrity sha512-Qoxpy+OxhDBI5kRqliJFAl4uWXk3Bn24WeFstPH0iLymFehSAUR8MHpqU7njyXv/qbo7oN6yTy5bfCmXdKpo1Q== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/plugin-proposal-numeric-separator@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.2.tgz#82b4cc06571143faf50626104b335dd71baa4f9e" - integrity sha512-DcTQY9syxu9BpU3Uo94fjCB3LN9/hgPS8oUL7KrSW3bA2ePrKZZPJcc5y0hoJAM9dft3pGfErtEUvxXQcfLxUg== +"@babel/plugin-proposal-numeric-separator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" + integrity sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.2.tgz#e17d418f81cc103fedd4ce037e181c8056225abc" - integrity sha512-hBIQFxwZi8GIp934+nj5uV31mqclC1aYDhctDu5khTi9PCCUOczyy0b34W0oE9U/eJXiqQaKyVsmjeagOaSlbw== +"@babel/plugin-proposal-object-rest-spread@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.13.tgz#f93f3116381ff94bc676fdcb29d71045cd1ec011" + integrity sha512-WvA1okB/0OS/N3Ldb3sziSrXg6sRphsBgqiccfcQq7woEn5wQLNX82Oc4PlaFcdwcWHuQXAtb8ftbS8Fbsg/sg== dependencies: - "@babel/compat-data" "^7.14.0" - "@babel/helper-compilation-targets" "^7.13.16" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.14.2" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.12.13" -"@babel/plugin-proposal-optional-catch-binding@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.2.tgz#150d4e58e525b16a9a1431bd5326c4eed870d717" - integrity sha512-XtkJsmJtBaUbOxZsNk0Fvrv8eiqgneug0A6aqLFZ4TSkar2L5dSXWcnUKHgmjJt49pyB/6ZHvkr3dPgl9MOWRQ== +"@babel/plugin-proposal-optional-catch-binding@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.13.tgz#4640520afe57728af14b4d1574ba844f263bcae5" + integrity sha512-9+MIm6msl9sHWg58NvqpNpLtuFbmpFYk37x8kgnGzAHvX35E1FyAwSUt5hIkSoWJFSAH+iwU8bJ4fcD1zKXOzg== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.2.tgz#df8171a8b9c43ebf4c1dabe6311b432d83e1b34e" - integrity sha512-qQByMRPwMZJainfig10BoaDldx/+VDtNcrA7qdNaEOAj6VXud+gfrkA8j4CRAU5HjnWREXqIpSpH30qZX1xivA== +"@babel/plugin-proposal-optional-chaining@^7.12.16": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.16.tgz#600c7531f754186b0f2096e495a92da7d88aa139" + integrity sha512-O3ohPwOhkwji5Mckb7F/PJpJVJY3DpPsrt/F0Bk40+QMk9QpAIqeGusHWqu/mYqsM8oBa6TziL/2mbERWsUZjg== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz#04bd4c6d40f6e6bbfa2f57e2d8094bad900ef787" - integrity sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-private-property-in-object@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.0.tgz#b1a1f2030586b9d3489cc26179d2eb5883277636" - integrity sha512-59ANdmEwwRUkLjB7CRtwJxxwtjESw+X2IePItA+RGQh+oy5RmpCh/EvVVvh5XQc3yxsm5gtv0+i9oBZhaDNVTg== +"@babel/plugin-proposal-private-methods@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.13.tgz#ea78a12554d784ecf7fc55950b752d469d9c4a71" + integrity sha512-sV0V57uUwpauixvR7s2o75LmwJI6JECwm5oPUY5beZB1nBl2i37hc7CJGqB5G+58fur5Y6ugvl3LRONk5x34rg== dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-create-class-features-plugin" "^7.14.0" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-private-property-in-object" "^7.14.0" + "@babel/helper-create-class-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.12.13" @@ -410,7 +365,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-async-generators@^7.8.4": +"@babel/plugin-syntax-async-generators@^7.8.0": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== @@ -424,13 +379,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-class-static-block@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.12.13.tgz#8e3d674b0613e67975ceac2776c97b60cafc5c9c" - integrity sha512-ZmKQ0ZXR0nYpHZIIuj9zE7oIqCx2hw9TKi+lIo73NNrMPAZGHfS92/VRV0ZmPj6H2ffBgyFHXvJ5NYsNeEaP2A== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-decorators@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz#fac829bf3c7ef4a1bc916257b403e58c6bdaf648" @@ -438,7 +386,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-dynamic-import@^7.8.3": +"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== @@ -452,7 +400,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-json-strings@^7.8.3": +"@babel/plugin-syntax-json-strings@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== @@ -473,7 +421,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== @@ -487,34 +435,27 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": +"@babel/plugin-syntax-optional-catch-binding@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-chaining@^7.8.3": +"@babel/plugin-syntax-optional-chaining@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-private-property-in-object@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.0.tgz#762a4babec61176fec6c88480dec40372b140c0b" - integrity sha512-bda3xF8wGl5/5btF794utNOL0Jw+9jE5C1sLZcoK7c4uonE/y3iQiyG+KbkF3WBV/paX58VCpjhxLPkdj5Fe4w== - dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-top-level-await@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" @@ -522,21 +463,21 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-arrow-functions@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz#10a59bebad52d637a027afa692e8d5ceff5e3dae" - integrity sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg== +"@babel/plugin-transform-arrow-functions@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.13.tgz#eda5670b282952100c229f8a3bd49e0f6a72e9fe" + integrity sha512-tBtuN6qtCTd+iHzVZVOMNp+L04iIJBpqkdY42tWbmjIT5wvR2kx7gxMBsyhQtFzHwBbyGi9h8J8r9HgnOpQHxg== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-async-to-generator@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz#8e112bf6771b82bf1e974e5e26806c5c99aa516f" - integrity sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg== +"@babel/plugin-transform-async-to-generator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.13.tgz#fed8c69eebf187a535bfa4ee97a614009b24f7ae" + integrity sha512-psM9QHcHaDr+HZpRuJcE1PXESuGWSCcbiGFFhhwfzdbTxaGDVzuVtdNYliAwcRo3GFg0Bc8MmI+AvIGYIJG04A== dependencies: "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-remap-async-to-generator" "^7.13.0" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-remap-async-to-generator" "^7.12.13" "@babel/plugin-transform-block-scoped-functions@^7.12.13": version "7.12.13" @@ -545,39 +486,39 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-block-scoping@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.2.tgz#761cb12ab5a88d640ad4af4aa81f820e6b5fdf5c" - integrity sha512-neZZcP19NugZZqNwMTH+KoBjx5WyvESPSIOQb4JHpfd+zPfqcH65RMu5xJju5+6q/Y2VzYrleQTr+b6METyyxg== +"@babel/plugin-transform-block-scoping@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz#f36e55076d06f41dfd78557ea039c1b581642e61" + integrity sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-classes@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.2.tgz#3f1196c5709f064c252ad056207d87b7aeb2d03d" - integrity sha512-7oafAVcucHquA/VZCsXv/gmuiHeYd64UJyyTYU+MPfNu0KeNlxw06IeENBO8bJjXVbolu+j1MM5aKQtH1OMCNg== +"@babel/plugin-transform-classes@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.13.tgz#9728edc1838b5d62fc93ad830bd523b1fcb0e1f6" + integrity sha512-cqZlMlhCC1rVnxE5ZGMtIb896ijL90xppMiuWXcwcOAuFczynpd3KYemb91XFFPi3wJSe/OcrX9lXoowatkkxA== dependencies: "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-function-name" "^7.14.2" + "@babel/helper-function-name" "^7.12.13" "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-replace-supers" "^7.13.12" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" "@babel/helper-split-export-declaration" "^7.12.13" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz#845c6e8b9bb55376b1fa0b92ef0bdc8ea06644ed" - integrity sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg== +"@babel/plugin-transform-computed-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.13.tgz#6a210647a3d67f21f699cfd2a01333803b27339d" + integrity sha512-dDfuROUPGK1mTtLKyDPUavmj2b6kFu82SmgpztBFEO974KMjJT+Ytj3/oWsTUMBmgPcp9J5Pc1SlcAYRpJ2hRA== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-destructuring@^7.13.17": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz#678d96576638c19d5b36b332504d3fd6e06dea27" - integrity sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA== +"@babel/plugin-transform-destructuring@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.13.tgz#fc56c5176940c5b41735c677124d1d20cecc9aeb" + integrity sha512-Dn83KykIFzjhA3FDPA1z4N+yfF3btDGhjnJwxIj0T43tP0flCujnU8fKgEkf0C1biIpSv9NZegPBQ1J6jYkwvQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.12.13" @@ -602,12 +543,12 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-for-of@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz#c799f881a8091ac26b54867a845c3e97d2696062" - integrity sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg== +"@babel/plugin-transform-for-of@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.13.tgz#561ff6d74d9e1c8879cb12dbaf4a14cd29d15cf6" + integrity sha512-xCbdgSzXYmHGyVX3+BsQjcd4hv4vA/FDy7Kc8eOpzKmBBPEOTurt0w5fCRQaGl+GSBORKgJdstQ1rHl4jbNseQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-transform-function-name@^7.12.13": version "7.12.13" @@ -631,43 +572,43 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-modules-amd@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.2.tgz#6622806fe1a7c07a1388444222ef9535f2ca17b0" - integrity sha512-hPC6XBswt8P3G2D1tSV2HzdKvkqOpmbyoy+g73JG0qlF/qx2y3KaMmXb1fLrpmWGLZYA0ojCvaHdzFWjlmV+Pw== +"@babel/plugin-transform-modules-amd@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.13.tgz#43db16249b274ee2e551e2422090aa1c47692d56" + integrity sha512-JHLOU0o81m5UqG0Ulz/fPC68/v+UTuGTWaZBUwpEk1fYQ1D9LfKV6MPn4ttJKqRo5Lm460fkzjLTL4EHvCprvA== dependencies: - "@babel/helper-module-transforms" "^7.14.2" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz#52bc199cb581e0992edba0f0f80356467587f161" - integrity sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ== +"@babel/plugin-transform-modules-commonjs@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.13.tgz#5043b870a784a8421fa1fd9136a24f294da13e50" + integrity sha512-OGQoeVXVi1259HjuoDnsQMlMkT9UkZT9TpXAsqWplS/M0N1g3TJAn/ByOCeQu7mfjc5WpSsRU+jV1Hd89ts0kQ== dependencies: - "@babel/helper-module-transforms" "^7.14.0" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-simple-access" "^7.13.12" + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-simple-access" "^7.12.13" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz#6d066ee2bff3c7b3d60bf28dec169ad993831ae3" - integrity sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A== +"@babel/plugin-transform-modules-systemjs@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.13.tgz#351937f392c7f07493fc79b2118201d50404a3c5" + integrity sha512-aHfVjhZ8QekaNF/5aNdStCGzwTbU7SI5hUybBKlMzqIMC7w7Ho8hx5a4R/DkTHfRfLwHGGxSpFt9BfxKCoXKoA== dependencies: - "@babel/helper-hoist-variables" "^7.13.0" - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-hoist-variables" "^7.12.13" + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/helper-validator-identifier" "^7.12.11" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.0.tgz#2f8179d1bbc9263665ce4a65f305526b2ea8ac34" - integrity sha512-nPZdnWtXXeY7I87UZr9VlsWme3Y0cfFFE41Wbxz4bbaexAjNMInXPFUpRRUJ8NoMm0Cw+zxbqjdPmLhcjfazMw== +"@babel/plugin-transform-modules-umd@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.13.tgz#26c66f161d3456674e344b4b1255de4d530cfb37" + integrity sha512-BgZndyABRML4z6ibpi7Z98m4EVLFI9tVsZDADC14AElFaNHHBcJIovflJ6wtCqFxwy2YJ1tJhGRsr0yLPKoN+w== dependencies: - "@babel/helper-module-transforms" "^7.14.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-transform-named-capturing-groups-regex@^7.12.13": version "7.12.13" @@ -691,12 +632,12 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/helper-replace-supers" "^7.12.13" -"@babel/plugin-transform-parameters@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.2.tgz#e4290f72e0e9e831000d066427c4667098decc31" - integrity sha512-NxoVmA3APNCC1JdMXkdYXuQS+EMdqy0vIwyDHeKHiJKRxmp1qGSdb0JLEIoPRhkx6H/8Qi3RJ3uqOCYw8giy9A== +"@babel/plugin-transform-parameters@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.13.tgz#461e76dfb63c2dfd327b8a008a9e802818ce9853" + integrity sha512-e7QqwZalNiBRHCpJg/P8s/VJeSRYgmtWySs1JwvfwPqhBbiWfOcHDKdeAi6oAyIimoKWBlwc8oTgbZHdhCoVZA== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-transform-property-literals@^7.12.13": version "7.12.13" @@ -705,10 +646,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-regenerator@^7.13.15": - version "7.13.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz#e5eb28945bf8b6563e7f818945f966a8d2997f39" - integrity sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ== +"@babel/plugin-transform-regenerator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz#b628bcc9c85260ac1aeb05b45bde25210194a2f5" + integrity sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA== dependencies: regenerator-transform "^0.14.2" @@ -720,16 +661,13 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-transform-runtime@^7.11.0": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.3.tgz#1fd885a2d0de1d3c223795a4e9be72c2db4515cf" - integrity sha512-t960xbi8wpTFE623ef7sd+UpEC5T6EEguQlTBJDEO05+XwnIWVfuqLw/vdLWY6IdFmtZE+65CZAfByT39zRpkg== - dependencies: - "@babel/helper-module-imports" "^7.13.12" - "@babel/helper-plugin-utils" "^7.13.0" - babel-plugin-polyfill-corejs2 "^0.2.0" - babel-plugin-polyfill-corejs3 "^0.2.0" - babel-plugin-polyfill-regenerator "^0.2.0" - semver "^6.3.0" + version "7.12.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.15.tgz#4337b2507288007c2b197059301aa0af8d90c085" + integrity sha512-OwptMSRnRWJo+tJ9v9wgAf72ydXWfYSXWhnQjZing8nGZSDFqU1MBleKM3+DriKkcbv7RagA8gVeB0A1PNlNow== + dependencies: + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + semver "^5.5.1" "@babel/plugin-transform-shorthand-properties@^7.12.13": version "7.12.13" @@ -738,12 +676,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-spread@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz#84887710e273c1815ace7ae459f6f42a5d31d5fd" - integrity sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg== +"@babel/plugin-transform-spread@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.13.tgz#ca0d5645abbd560719c354451b849f14df4a7949" + integrity sha512-dUCrqPIowjqk5pXsx1zPftSq4sT0aCeZVAxhdgs3AMgyaDmoUT0G+5h3Dzja27t76aUEIJWlFgPJqJ/d4dbTtg== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" "@babel/plugin-transform-sticky-regex@^7.12.13": @@ -753,12 +691,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-template-literals@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz#a36049127977ad94438dee7443598d1cefdf409d" - integrity sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw== +"@babel/plugin-transform-template-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.13.tgz#655037b07ebbddaf3b7752f55d15c2fd6f5aa865" + integrity sha512-arIKlWYUgmNsF28EyfmiQHJLJFlAJNYkuQO10jL46ggjBpeb2re1P9K9YGxNJB45BqTbaslVysXDYm/g3sN/Qg== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-transform-typeof-symbol@^7.12.13": version "7.12.13" @@ -783,85 +721,78 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/preset-env@^7.11.0": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.2.tgz#e80612965da73579c84ad2f963c2359c71524ed5" - integrity sha512-7dD7lVT8GMrE73v4lvDEb85cgcQhdES91BSD7jS/xjC6QY8PnRhux35ac+GCpbiRhp8crexBvZZqnaL6VrY8TQ== - dependencies: - "@babel/compat-data" "^7.14.0" - "@babel/helper-compilation-targets" "^7.13.16" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-validator-option" "^7.12.17" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.13.12" - "@babel/plugin-proposal-async-generator-functions" "^7.14.2" - "@babel/plugin-proposal-class-properties" "^7.13.0" - "@babel/plugin-proposal-class-static-block" "^7.13.11" - "@babel/plugin-proposal-dynamic-import" "^7.14.2" - "@babel/plugin-proposal-export-namespace-from" "^7.14.2" - "@babel/plugin-proposal-json-strings" "^7.14.2" - "@babel/plugin-proposal-logical-assignment-operators" "^7.14.2" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.2" - "@babel/plugin-proposal-numeric-separator" "^7.14.2" - "@babel/plugin-proposal-object-rest-spread" "^7.14.2" - "@babel/plugin-proposal-optional-catch-binding" "^7.14.2" - "@babel/plugin-proposal-optional-chaining" "^7.14.2" - "@babel/plugin-proposal-private-methods" "^7.13.0" - "@babel/plugin-proposal-private-property-in-object" "^7.14.0" + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.16.tgz#16710e3490e37764b2f41886de0a33bc4ae91082" + integrity sha512-BXCAXy8RE/TzX416pD2hsVdkWo0G+tYd16pwnRV4Sc0fRwTLRS/Ssv8G5RLXUGQv7g4FG7TXkdDJxCjQ5I+Zjg== + dependencies: + "@babel/compat-data" "^7.12.13" + "@babel/helper-compilation-targets" "^7.12.16" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-validator-option" "^7.12.16" + "@babel/plugin-proposal-async-generator-functions" "^7.12.13" + "@babel/plugin-proposal-class-properties" "^7.12.13" + "@babel/plugin-proposal-dynamic-import" "^7.12.16" + "@babel/plugin-proposal-export-namespace-from" "^7.12.13" + "@babel/plugin-proposal-json-strings" "^7.12.13" + "@babel/plugin-proposal-logical-assignment-operators" "^7.12.13" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.13" + "@babel/plugin-proposal-numeric-separator" "^7.12.13" + "@babel/plugin-proposal-object-rest-spread" "^7.12.13" + "@babel/plugin-proposal-optional-catch-binding" "^7.12.13" + "@babel/plugin-proposal-optional-chaining" "^7.12.16" + "@babel/plugin-proposal-private-methods" "^7.12.13" "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" - "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-async-generators" "^7.8.0" "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.12.13" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" "@babel/plugin-syntax-top-level-await" "^7.12.13" - "@babel/plugin-transform-arrow-functions" "^7.13.0" - "@babel/plugin-transform-async-to-generator" "^7.13.0" + "@babel/plugin-transform-arrow-functions" "^7.12.13" + "@babel/plugin-transform-async-to-generator" "^7.12.13" "@babel/plugin-transform-block-scoped-functions" "^7.12.13" - "@babel/plugin-transform-block-scoping" "^7.14.2" - "@babel/plugin-transform-classes" "^7.14.2" - "@babel/plugin-transform-computed-properties" "^7.13.0" - "@babel/plugin-transform-destructuring" "^7.13.17" + "@babel/plugin-transform-block-scoping" "^7.12.13" + "@babel/plugin-transform-classes" "^7.12.13" + "@babel/plugin-transform-computed-properties" "^7.12.13" + "@babel/plugin-transform-destructuring" "^7.12.13" "@babel/plugin-transform-dotall-regex" "^7.12.13" "@babel/plugin-transform-duplicate-keys" "^7.12.13" "@babel/plugin-transform-exponentiation-operator" "^7.12.13" - "@babel/plugin-transform-for-of" "^7.13.0" + "@babel/plugin-transform-for-of" "^7.12.13" "@babel/plugin-transform-function-name" "^7.12.13" "@babel/plugin-transform-literals" "^7.12.13" "@babel/plugin-transform-member-expression-literals" "^7.12.13" - "@babel/plugin-transform-modules-amd" "^7.14.2" - "@babel/plugin-transform-modules-commonjs" "^7.14.0" - "@babel/plugin-transform-modules-systemjs" "^7.13.8" - "@babel/plugin-transform-modules-umd" "^7.14.0" + "@babel/plugin-transform-modules-amd" "^7.12.13" + "@babel/plugin-transform-modules-commonjs" "^7.12.13" + "@babel/plugin-transform-modules-systemjs" "^7.12.13" + "@babel/plugin-transform-modules-umd" "^7.12.13" "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" "@babel/plugin-transform-new-target" "^7.12.13" "@babel/plugin-transform-object-super" "^7.12.13" - "@babel/plugin-transform-parameters" "^7.14.2" + "@babel/plugin-transform-parameters" "^7.12.13" "@babel/plugin-transform-property-literals" "^7.12.13" - "@babel/plugin-transform-regenerator" "^7.13.15" + "@babel/plugin-transform-regenerator" "^7.12.13" "@babel/plugin-transform-reserved-words" "^7.12.13" "@babel/plugin-transform-shorthand-properties" "^7.12.13" - "@babel/plugin-transform-spread" "^7.13.0" + "@babel/plugin-transform-spread" "^7.12.13" "@babel/plugin-transform-sticky-regex" "^7.12.13" - "@babel/plugin-transform-template-literals" "^7.13.0" + "@babel/plugin-transform-template-literals" "^7.12.13" "@babel/plugin-transform-typeof-symbol" "^7.12.13" "@babel/plugin-transform-unicode-escapes" "^7.12.13" "@babel/plugin-transform-unicode-regex" "^7.12.13" - "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.14.2" - babel-plugin-polyfill-corejs2 "^0.2.0" - babel-plugin-polyfill-corejs3 "^0.2.0" - babel-plugin-polyfill-regenerator "^0.2.0" - core-js-compat "^3.9.0" - semver "^6.3.0" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.12.13" + core-js-compat "^3.8.0" + semver "^5.5.0" -"@babel/preset-modules@^0.1.4": +"@babel/preset-modules@^0.1.3": version "0.1.4" resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== @@ -873,9 +804,9 @@ esutils "^2.0.2" "@babel/runtime@^7.11.0", "@babel/runtime@^7.8.4": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6" - integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA== + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.13.tgz#0a21452352b02542db0ffb928ac2d3ca7cb6d66d" + integrity sha512-8+3UMPBrjFa/6TtKi/7sehPKqfAm4g6K+YQjyyFOLUTxzOngcRZTlAVY8sc2CORJYqdHQY8gRPHmn+qo15rCBw== dependencies: regenerator-runtime "^0.13.4" @@ -888,26 +819,28 @@ "@babel/parser" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.13.15", "@babel/traverse@^7.14.0", "@babel/traverse@^7.14.2", "@babel/traverse@^7.7.0": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.2.tgz#9201a8d912723a831c2679c7ebbf2fe1416d765b" - integrity sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA== +"@babel/traverse@^7.0.0", "@babel/traverse@^7.12.13", "@babel/traverse@^7.7.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.13.tgz#689f0e4b4c08587ad26622832632735fb8c4e0c0" + integrity sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA== dependencies: "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.14.2" - "@babel/helper-function-name" "^7.14.2" + "@babel/generator" "^7.12.13" + "@babel/helper-function-name" "^7.12.13" "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/parser" "^7.14.2" - "@babel/types" "^7.14.2" + "@babel/parser" "^7.12.13" + "@babel/types" "^7.12.13" debug "^4.1.0" globals "^11.1.0" + lodash "^4.17.19" -"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.16", "@babel/types@^7.14.0", "@babel/types@^7.14.2", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.2.tgz#4208ae003107ef8a057ea8333e56eb64d2f6a2c3" - integrity sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw== +"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.13.tgz#8be1aa8f2c876da11a9cf650c0ecf656913ad611" + integrity sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ== dependencies: - "@babel/helper-validator-identifier" "^7.14.0" + "@babel/helper-validator-identifier" "^7.12.11" + lodash "^4.17.19" to-fast-properties "^2.0.0" "@ensdomains/ens@^0.4.4": @@ -926,10 +859,10 @@ resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89" integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA== -"@eslint/eslintrc@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.1.tgz#442763b88cecbe3ee0ec7ca6d6dd6168550cbf14" - integrity sha512-5v7TDE9plVhvxQeWLXDTvFvJBdH6pEsdnl2g/dAptmuFEPedQ4Erq5rsDsX+mvAM610IhNaO2W5V1dOOnDKxkQ== +"@eslint/eslintrc@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.3.0.tgz#d736d6963d7003b6514e6324bec9c602ac340318" + integrity sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg== dependencies: ajv "^6.12.4" debug "^4.1.1" @@ -938,38 +871,36 @@ ignore "^4.0.6" import-fresh "^3.2.1" js-yaml "^3.13.1" + lodash "^4.17.20" minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@ethereum-waffle/chai@^3.3.0": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.3.1.tgz#3f20b810d0fa516f19af93c50c3be1091333fa8e" - integrity sha512-+vepCjttfOzCSnmiVEmd1bR8ctA2wYVrtWa8bDLhnTpj91BIIHotNDTwpeq7fyjrOCIBTN3Ai8ACfjNoatc4OA== +"@ethereum-waffle/chai@^3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.2.2.tgz#33a349688386c9a8fdc4da5baea329036b9fe75e" + integrity sha512-S2jKmCsCrrS35fw1C6rUwH9CRboytge37PDYBDqlGpIvQQws9v+IvBjv8tLRT2BWCZSS9dvwbvBYTJL31y5ytw== dependencies: - "@ethereum-waffle/provider" "^3.3.1" + "@ethereum-waffle/provider" "^3.2.2" ethers "^5.0.0" -"@ethereum-waffle/compiler@^3.3.0": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-3.3.1.tgz#946128fd565aa4347075fd716dbd0f3f38189280" - integrity sha512-X/TeQugt94AQwXEdCjIQxcXYGawNulVBYEBE7nloj4wE/RBxNolXwjoVNjcS4kuiMMbKkdO0JkL5sn6ixx8bDg== +"@ethereum-waffle/compiler@^3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-3.2.2.tgz#73d5bce44bcdc880d8630b9064591470c0123f57" + integrity sha512-6Y0TLIq26psgeoUSXCZIffeQHVqs6TOaJjHlQieJBx19defQIq5cYt8dRo1AZZGf+Eyjc2PZJERME/CfXiJgiQ== dependencies: "@resolver-engine/imports" "^0.3.3" "@resolver-engine/imports-fs" "^0.3.3" - "@typechain/ethers-v5" "^2.0.0" "@types/mkdirp" "^0.5.2" "@types/node-fetch" "^2.5.5" ethers "^5.0.1" mkdirp "^0.5.1" node-fetch "^2.6.0" solc "^0.6.3" - ts-generator "^0.1.1" - typechain "^3.0.0" -"@ethereum-waffle/ens@^3.2.4": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-3.2.4.tgz#c486be4879ea7107e1ff01b24851a5e44f5946ce" - integrity sha512-lkRVPCEkk7KOwH9MqFMB+gL0X8cZNsm+MnKpP9CNbAyhFos2sCDGcY8t6BA12KBK6pdMuuRXPxYL9WfPl9bqSQ== +"@ethereum-waffle/ens@^3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-3.2.2.tgz#2a1ea3270b8d64498324a80cd659db843b1ba4b3" + integrity sha512-bvoi/52dWEpLpvOBOm4fCkGEv7T88M7QI4StFAh7tRlCbp2oIZ0VcItQrIrz7Hek5BPMS/AJF2QtYoec4CtxBg== dependencies: "@ensdomains/ens" "^0.4.4" "@ensdomains/resolver" "^0.2.4" @@ -983,87 +914,17 @@ "@ethersproject/abi" "^5.0.1" ethers "^5.0.1" -"@ethereum-waffle/provider@^3.3.0", "@ethereum-waffle/provider@^3.3.1": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-3.3.2.tgz#33677baf6af5cbb087c3072d84f38c152968ebb1" - integrity sha512-ilz6cXK0ylSKCmZktTMpY4gjo0CN6rb86JfN7+RZYk6tKtZA6sXoOe95skWEQkGf1fZk7G817fTzLb0CmFDp1g== +"@ethereum-waffle/provider@^3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-3.2.2.tgz#6ab422015641f340ba71739d6ab85896277281e5" + integrity sha512-2UCNHsgr1fiI6JA7kmpSqt9AdOajGRK4Wyh24DeoAkCcZuaOdUY80fEmkSzhq8w3jIIvWRUQajBJPieEKw5NIw== dependencies: - "@ethereum-waffle/ens" "^3.2.4" + "@ethereum-waffle/ens" "^3.2.2" ethers "^5.0.1" - ganache-core "^2.13.2" + ganache-core "^2.10.2" patch-package "^6.2.2" postinstall-postinstall "^2.1.0" -"@ethereumjs/block@^3.2.0", "@ethereumjs/block@^3.2.1": - version "3.2.1" - resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.2.1.tgz#c24c345e6dd6299efa4bed40979280b7dda96d3a" - integrity sha512-FCxo5KwwULne2A2Yuae4iaGGqSsRjwzXOlDhGalOFiBbLfP3hE04RHaHGw4c8vh1PfOrLauwi0dQNUBkOG3zIA== - dependencies: - "@ethereumjs/common" "^2.2.0" - "@ethereumjs/tx" "^3.1.3" - ethereumjs-util "^7.0.10" - merkle-patricia-tree "^4.1.0" - -"@ethereumjs/blockchain@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.2.1.tgz#83ed83647667265f1666f111caf065ef9d1e82b5" - integrity sha512-+hshP2qSOOFsiYvZCbaDQFG7jYTWafE8sfBi+pAsdhAHfP7BN7VLyob7qoQISgwS1s7NTR4c4+2t/woU9ahItw== - dependencies: - "@ethereumjs/block" "^3.2.0" - "@ethereumjs/common" "^2.2.0" - "@ethereumjs/ethash" "^1.0.0" - debug "^2.2.0" - ethereumjs-util "^7.0.9" - level-mem "^5.0.1" - lru-cache "^5.1.1" - rlp "^2.2.4" - semaphore-async-await "^1.5.1" - -"@ethereumjs/common@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.2.0.tgz#850a3e3e594ee707ad8d44a11e8152fb62450535" - integrity sha512-PyQiTG00MJtBRkJmv46ChZL8u2XWxNBeAthznAUIUiefxPAXjbkuiCZOuncgJS34/XkMbNc9zMt/PlgKRBElig== - dependencies: - crc-32 "^1.2.0" - ethereumjs-util "^7.0.9" - -"@ethereumjs/ethash@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.0.0.tgz#4e77f85b37be1ade5393e8719bdabac3e796ddaa" - integrity sha512-iIqnGG6NMKesyOxv2YctB2guOVX18qMAWlj3QlZyrc+GqfzLqoihti+cVNQnyNxr7eYuPdqwLQOFuPe6g/uKjw== - dependencies: - "@types/levelup" "^4.3.0" - buffer-xor "^2.0.1" - ethereumjs-util "^7.0.7" - miller-rabin "^4.0.0" - -"@ethereumjs/tx@^3.1.3": - version "3.1.4" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.1.4.tgz#04cf9e9406da5f04a1a26c458744641f4b4b8dd0" - integrity sha512-6cJpmmjCpG5ZVN9NJYtWvmrEQcevw9DIR8hj2ca2PszD2fxbIFXky3Z37gpf8S6u0Npv09kG8It+G4xjydZVLg== - dependencies: - "@ethereumjs/common" "^2.2.0" - ethereumjs-util "^7.0.10" - -"@ethereumjs/vm@^5.3.2": - version "5.3.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.3.2.tgz#b4d83a3d50a7ad22d6d412cc21bbde221b3e2871" - integrity sha512-QmCUQrW6xbhgEbQh9njue4kAJdM056C+ytBFUTF/kDYa3kNDm4Qxp9HUyTlt1OCSXvDhws0qqlh8+q+pmXpN7g== - dependencies: - "@ethereumjs/block" "^3.2.1" - "@ethereumjs/blockchain" "^5.2.1" - "@ethereumjs/common" "^2.2.0" - "@ethereumjs/tx" "^3.1.3" - async-eventemitter "^0.2.4" - core-js-pure "^3.0.1" - debug "^2.2.0" - ethereumjs-util "^7.0.10" - functional-red-black-tree "^1.0.1" - mcl-wasm "^0.7.1" - merkle-patricia-tree "^4.1.0" - rustbn.js "~0.2.0" - util.promisify "^1.0.1" - "@ethersproject/abi@5.0.0-beta.153": version "5.0.0-beta.153" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz#43a37172b33794e4562999f6e2d555b7599a8eee" @@ -1079,343 +940,341 @@ "@ethersproject/properties" ">=5.0.0-beta.131" "@ethersproject/strings" ">=5.0.0-beta.130" -"@ethersproject/abi@5.1.2", "@ethersproject/abi@^5.0.1", "@ethersproject/abi@^5.0.2", "@ethersproject/abi@^5.1.0": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.1.2.tgz#a8e75cd0455e6dc9e4861c3d1c22bbe436c1d775" - integrity sha512-uMhoQVPX0UtfzTpekYQSEUcJGDgsJ25ifz+SV6PDETWaUFhcR8RNgb1QPTASP13inW8r6iy0/Xdq9D5hK2pNvA== - dependencies: - "@ethersproject/address" "^5.1.0" - "@ethersproject/bignumber" "^5.1.0" - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/constants" "^5.1.0" - "@ethersproject/hash" "^5.1.0" - "@ethersproject/keccak256" "^5.1.0" - "@ethersproject/logger" "^5.1.0" - "@ethersproject/properties" "^5.1.0" - "@ethersproject/strings" "^5.1.0" - -"@ethersproject/abstract-provider@5.1.0", "@ethersproject/abstract-provider@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.1.0.tgz#1f24c56cda5524ef4ed3cfc562a01d6b6f8eeb0b" - integrity sha512-8dJUnT8VNvPwWhYIau4dwp7qe1g+KgdRm4XTWvjkI9gAT2zZa90WF5ApdZ3vl1r6NDmnn6vUVvyphClRZRteTQ== - dependencies: - "@ethersproject/bignumber" "^5.1.0" - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/logger" "^5.1.0" - "@ethersproject/networks" "^5.1.0" - "@ethersproject/properties" "^5.1.0" - "@ethersproject/transactions" "^5.1.0" - "@ethersproject/web" "^5.1.0" - -"@ethersproject/abstract-signer@5.1.0", "@ethersproject/abstract-signer@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.1.0.tgz#744c7a2d0ebe3cc0bc38294d0f53d5ca3f4e49e3" - integrity sha512-qQDMkjGZSSJSKl6AnfTgmz9FSnzq3iEoEbHTYwjDlEAv+LNP7zd4ixCcVWlWyk+2siud856M5CRhAmPdupeN9w== - dependencies: - "@ethersproject/abstract-provider" "^5.1.0" - "@ethersproject/bignumber" "^5.1.0" - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/logger" "^5.1.0" - "@ethersproject/properties" "^5.1.0" - -"@ethersproject/address@5.1.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.1.0.tgz#3854fd7ebcb6af7597de66f847c3345dae735b58" - integrity sha512-rfWQR12eHn2cpstCFS4RF7oGjfbkZb0oqep+BfrT+gWEGWG2IowJvIsacPOvzyS1jhNF4MQ4BS59B04Mbovteg== - dependencies: - "@ethersproject/bignumber" "^5.1.0" - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/keccak256" "^5.1.0" - "@ethersproject/logger" "^5.1.0" - "@ethersproject/rlp" "^5.1.0" - -"@ethersproject/base64@5.1.0", "@ethersproject/base64@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.1.0.tgz#27240c174d0a4e13f6eae87416fd876caf7f42b6" - integrity sha512-npD1bLvK4Bcxz+m4EMkx+F8Rd7CnqS9DYnhNu0/GlQBXhWjvfoAZzk5HJ0f1qeyp8d+A86PTuzLOGOXf4/CN8g== +"@ethersproject/abi@5.0.12", "@ethersproject/abi@^5.0.1", "@ethersproject/abi@^5.0.10", "@ethersproject/abi@^5.0.2": + version "5.0.12" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.12.tgz#9aebe6aedc05ce45bb6c41b06d80bd195b7de77c" + integrity sha512-Ujr/3bwyYYjXLDQfebeiiTuvOw9XtUKM8av6YkoBeMXyGQM9GkjrQlwJMNwGTmqjATH/ZNbRgCh98GjOLiIB1Q== + dependencies: + "@ethersproject/address" "^5.0.9" + "@ethersproject/bignumber" "^5.0.13" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/constants" "^5.0.8" + "@ethersproject/hash" "^5.0.10" + "@ethersproject/keccak256" "^5.0.7" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/properties" "^5.0.7" + "@ethersproject/strings" "^5.0.8" + +"@ethersproject/abstract-provider@5.0.9", "@ethersproject/abstract-provider@^5.0.8": + version "5.0.9" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.0.9.tgz#a55410b73e3994842884eb82b1f43e3a9f653eea" + integrity sha512-X9fMkqpeu9ayC3JyBkeeZhn35P4xQkpGX/l+FrxDtEW9tybf/UWXSMi8bGThpPtfJ6q6U2LDetXSpSwK4TfYQQ== + dependencies: + "@ethersproject/bignumber" "^5.0.13" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/networks" "^5.0.7" + "@ethersproject/properties" "^5.0.7" + "@ethersproject/transactions" "^5.0.9" + "@ethersproject/web" "^5.0.12" + +"@ethersproject/abstract-signer@5.0.13", "@ethersproject/abstract-signer@^5.0.10": + version "5.0.13" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.0.13.tgz#59b4d0367d6327ec53bc269c6730c44a4a3b043c" + integrity sha512-VBIZEI5OK0TURoCYyw0t3w+TEO4kdwnI9wvt4kqUwyxSn3YCRpXYVl0Xoe7XBR/e5+nYOi2MyFGJ3tsFwONecQ== + dependencies: + "@ethersproject/abstract-provider" "^5.0.8" + "@ethersproject/bignumber" "^5.0.13" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/properties" "^5.0.7" + +"@ethersproject/address@5.0.10", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.0.9": + version "5.0.10" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.0.10.tgz#2bc69fdff4408e0570471cd19dee577ab06a10d0" + integrity sha512-70vqESmW5Srua1kMDIN6uVfdneZMaMyRYH4qPvkAXGkbicrCOsA9m01vIloA4wYiiF+HLEfL1ENKdn5jb9xiAw== + dependencies: + "@ethersproject/bignumber" "^5.0.13" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/keccak256" "^5.0.7" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/rlp" "^5.0.7" + +"@ethersproject/base64@5.0.8", "@ethersproject/base64@^5.0.7": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.0.8.tgz#1bc4b4b8c59c1debf972c7164b96c0b8964a20a1" + integrity sha512-PNbpHOMgZpZ1skvQl119pV2YkCPXmZTxw+T92qX0z7zaMFPypXWTZBzim+hUceb//zx4DFjeGT4aSjZRTOYThg== dependencies: - "@ethersproject/bytes" "^5.1.0" + "@ethersproject/bytes" "^5.0.9" -"@ethersproject/basex@5.1.0", "@ethersproject/basex@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.1.0.tgz#80da2e86f9da0cb5ccd446b337364d791f6a131c" - integrity sha512-vBKr39bum7DDbOvkr1Sj19bRMEPA4FnST6Utt6xhDzI7o7L6QNkDn2yrCfP+hnvJGhZFKtLygWwqlTBZoBXYLg== +"@ethersproject/basex@5.0.8", "@ethersproject/basex@^5.0.7": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.0.8.tgz#6867fad20047aa29fbd4b880f27894ed04cc7bb8" + integrity sha512-PCVKZIShBQUqAXjJSvaCidThPvL0jaaQZcewJc0sf8Xx05BizaOS8r3jdPdpNdY+/qZtRDqwHTSKjvR/xssyLQ== dependencies: - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/properties" "^5.1.0" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/properties" "^5.0.7" -"@ethersproject/bignumber@5.1.1", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.1.0": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.1.1.tgz#84812695253ccbc639117f7ac49ee1529b68e637" - integrity sha512-AVz5iqz7+70RIqoQTznsdJ6DOVBYciNlvO+AlQmPTB6ofCvoihI9bQdr6wljsX+d5W7Yc4nyvQvP4JMzg0Agig== +"@ethersproject/bignumber@5.0.14", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.0.13": + version "5.0.14" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.0.14.tgz#605bc61dcbd4a8c6df8b5a7a77c0210273f3de8a" + integrity sha512-Q4TjMq9Gg3Xzj0aeJWqJgI3tdEiPiET7Y5OtNtjTAODZ2kp4y9jMNg97zVcvPedFvGROdpGDyCI77JDFodUzOw== dependencies: - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/logger" "^5.1.0" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/logger" "^5.0.8" bn.js "^4.4.0" -"@ethersproject/bytes@5.1.0", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.1.0.tgz#55dfa9c4c21df1b1b538be3accb50fb76d5facfd" - integrity sha512-sGTxb+LVjFxJcJeUswAIK6ncgOrh3D8c192iEJd7mLr95V6du119rRfYT/b87WPkZ5I3gRBUYIYXtdgCWACe8g== - dependencies: - "@ethersproject/logger" "^5.1.0" - -"@ethersproject/constants@5.1.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.1.0.tgz#4e7da6367ea0e9be87585d8b09f3fccf384b1452" - integrity sha512-0/SuHrxc8R8k+JiLmJymxHJbojUDWBQqO+b+XFdwaP0jGzqC09YDy/CAlSZB6qHsBifY8X3I89HcK/oMqxRdBw== - dependencies: - "@ethersproject/bignumber" "^5.1.0" - -"@ethersproject/contracts@5.1.1": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.1.1.tgz#c66cb6d618fcbd73e20a6b808e8f768b2b781d0b" - integrity sha512-6WwktLJ0DFWU8pDkgH4IGttQHhQN4SnwKFu9h+QYVe48VGWtbDu4W8/q/7QA1u/HWlWMrKxqawPiZUJj0UMvOw== - dependencies: - "@ethersproject/abi" "^5.1.0" - "@ethersproject/abstract-provider" "^5.1.0" - "@ethersproject/abstract-signer" "^5.1.0" - "@ethersproject/address" "^5.1.0" - "@ethersproject/bignumber" "^5.1.0" - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/constants" "^5.1.0" - "@ethersproject/logger" "^5.1.0" - "@ethersproject/properties" "^5.1.0" - "@ethersproject/transactions" "^5.1.0" - -"@ethersproject/hash@5.1.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.1.0.tgz#40961d64837d57f580b7b055e0d74174876d891e" - integrity sha512-fNwry20yLLPpnRRwm3fBL+2ksgO+KMadxM44WJmRIoTKzy4269+rbq9KFoe2LTqq2CXJM2CE70beGaNrpuqflQ== - dependencies: - "@ethersproject/abstract-signer" "^5.1.0" - "@ethersproject/address" "^5.1.0" - "@ethersproject/bignumber" "^5.1.0" - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/keccak256" "^5.1.0" - "@ethersproject/logger" "^5.1.0" - "@ethersproject/properties" "^5.1.0" - "@ethersproject/strings" "^5.1.0" - -"@ethersproject/hdnode@5.1.0", "@ethersproject/hdnode@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.1.0.tgz#2bf5c4048935136ce83e9242e1bd570afcc0bc83" - integrity sha512-obIWdlujloExPHWJGmhJO/sETOOo7SEb6qemV4f8kyFoXg+cJK+Ta9SvBrj7hsUK85n3LZeZJZRjjM7oez3Clg== - dependencies: - "@ethersproject/abstract-signer" "^5.1.0" - "@ethersproject/basex" "^5.1.0" - "@ethersproject/bignumber" "^5.1.0" - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/logger" "^5.1.0" - "@ethersproject/pbkdf2" "^5.1.0" - "@ethersproject/properties" "^5.1.0" - "@ethersproject/sha2" "^5.1.0" - "@ethersproject/signing-key" "^5.1.0" - "@ethersproject/strings" "^5.1.0" - "@ethersproject/transactions" "^5.1.0" - "@ethersproject/wordlists" "^5.1.0" - -"@ethersproject/json-wallets@5.1.0", "@ethersproject/json-wallets@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.1.0.tgz#bba7af2e520e8aea4d3829d80520db5d2e4fb8d2" - integrity sha512-00n2iBy27w8zrGZSiU762UOVuzCQZxUZxopsZC47++js6xUFuI74DHcJ5K/2pddlF1YBskvmMuboEu1geK8mnA== - dependencies: - "@ethersproject/abstract-signer" "^5.1.0" - "@ethersproject/address" "^5.1.0" - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/hdnode" "^5.1.0" - "@ethersproject/keccak256" "^5.1.0" - "@ethersproject/logger" "^5.1.0" - "@ethersproject/pbkdf2" "^5.1.0" - "@ethersproject/properties" "^5.1.0" - "@ethersproject/random" "^5.1.0" - "@ethersproject/strings" "^5.1.0" - "@ethersproject/transactions" "^5.1.0" +"@ethersproject/bytes@5.0.10", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.9": + version "5.0.10" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.0.10.tgz#aa49afe7491ba24ff76fa33d98677351263f9ba4" + integrity sha512-vpu0v1LZ1j1s9kERQIMnVU69MyHEzUff7nqK9XuCU4vx+AM8n9lU2gj7jtJIvGSt9HzatK/6I6bWusI5nyuaTA== + dependencies: + "@ethersproject/logger" "^5.0.8" + +"@ethersproject/constants@5.0.9", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.0.8": + version "5.0.9" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.0.9.tgz#81ac44c3bf612de63eb1c490b314ea1b932cda9f" + integrity sha512-2uAKH89UcaJP/Sc+54u92BtJtZ4cPgcS1p0YbB1L3tlkavwNvth+kNCUplIB1Becqs7BOZr0B/3dMNjhJDy4Dg== + dependencies: + "@ethersproject/bignumber" "^5.0.13" + +"@ethersproject/contracts@5.0.11": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.0.11.tgz#e6cc57698a05be2329cb2ca3d7e87686f95e438a" + integrity sha512-FTUUd/6x00dYL2VufE2VowZ7h3mAyBfCQMGwI3tKDIWka+C0CunllFiKrlYCdiHFuVeMotR65dIcnzbLn72MCw== + dependencies: + "@ethersproject/abi" "^5.0.10" + "@ethersproject/abstract-provider" "^5.0.8" + "@ethersproject/abstract-signer" "^5.0.10" + "@ethersproject/address" "^5.0.9" + "@ethersproject/bignumber" "^5.0.13" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/constants" "^5.0.8" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/properties" "^5.0.7" + +"@ethersproject/hash@5.0.11", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.0.10": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.0.11.tgz#da89517438bbbf8a39df56fff09f0a71669ae7a7" + integrity sha512-H3KJ9fk33XWJ2djAW03IL7fg3DsDMYjO1XijiUb1hJ85vYfhvxu0OmsU7d3tg2Uv1H1kFSo8ghr3WFQ8c+NL3g== + dependencies: + "@ethersproject/abstract-signer" "^5.0.10" + "@ethersproject/address" "^5.0.9" + "@ethersproject/bignumber" "^5.0.13" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/keccak256" "^5.0.7" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/properties" "^5.0.7" + "@ethersproject/strings" "^5.0.8" + +"@ethersproject/hdnode@5.0.9", "@ethersproject/hdnode@^5.0.8": + version "5.0.9" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.0.9.tgz#ce65b430d3d3f0cd3c8f9dfaaf376b55881d9dba" + integrity sha512-S5UMmIC6XfFtqhUK4uTjD8GPNzSbE+sZ/0VMqFnA3zAJ+cEFZuEyhZDYnl2ItGJzjT4jsy+uEy1SIl3baYK1PQ== + dependencies: + "@ethersproject/abstract-signer" "^5.0.10" + "@ethersproject/basex" "^5.0.7" + "@ethersproject/bignumber" "^5.0.13" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/pbkdf2" "^5.0.7" + "@ethersproject/properties" "^5.0.7" + "@ethersproject/sha2" "^5.0.7" + "@ethersproject/signing-key" "^5.0.8" + "@ethersproject/strings" "^5.0.8" + "@ethersproject/transactions" "^5.0.9" + "@ethersproject/wordlists" "^5.0.8" + +"@ethersproject/json-wallets@5.0.11", "@ethersproject/json-wallets@^5.0.10": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.0.11.tgz#86fdc41b7762acb443d6a896f6c61231ab2aee5d" + integrity sha512-0GhWScWUlXXb4qJNp0wmkU95QS3YdN9UMOfMSEl76CRANWWrmyzxcBVSXSBu5iQ0/W8wO+xGlJJ3tpA6v3mbIw== + dependencies: + "@ethersproject/abstract-signer" "^5.0.10" + "@ethersproject/address" "^5.0.9" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/hdnode" "^5.0.8" + "@ethersproject/keccak256" "^5.0.7" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/pbkdf2" "^5.0.7" + "@ethersproject/properties" "^5.0.7" + "@ethersproject/random" "^5.0.7" + "@ethersproject/strings" "^5.0.8" + "@ethersproject/transactions" "^5.0.9" aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@5.1.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.1.0.tgz#fdcd88fb13bfef4271b225cdd8dec4d315c8e60e" - integrity sha512-vrTB1W6AEYoadww5c9UyVJ2YcSiyIUTNDRccZIgwTmFFoSHwBtcvG1hqy9RzJ1T0bMdATbM9Hfx2mJ6H0i7Hig== +"@ethersproject/keccak256@5.0.8", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.0.7": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.0.8.tgz#13aaf69e1c8bd15fc59a2ebd055c0878f2a059c8" + integrity sha512-zoGbwXcWWs9MX4NOAZ7N0hhgIRl4Q/IO/u9c/RHRY4WqDy3Ywm0OLamEV53QDwhjwn3YiiVwU1Ve5j7yJ0a/KQ== dependencies: - "@ethersproject/bytes" "^5.1.0" + "@ethersproject/bytes" "^5.0.9" js-sha3 "0.5.7" -"@ethersproject/logger@5.1.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.1.0.tgz#4cdeeefac029373349d5818f39c31b82cc6d9bbf" - integrity sha512-wtUaD1lBX10HBXjjKV9VHCBnTdUaKQnQ2XSET1ezglqLdPdllNOIlLfhyCRqXm5xwcjExVI5ETokOYfjPtaAlw== - -"@ethersproject/networks@5.1.0", "@ethersproject/networks@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.1.0.tgz#f537290cb05aa6dc5e81e910926c04cfd5814bca" - integrity sha512-A/NIrIED/G/IgU1XUukOA3WcFRxn2I4O5GxsYGA5nFlIi+UZWdGojs85I1VXkR1gX9eFnDXzjE6OtbgZHjFhIA== - dependencies: - "@ethersproject/logger" "^5.1.0" +"@ethersproject/logger@5.0.9", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.0.8": + version "5.0.9" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.0.9.tgz#0e6a0b3ecc938713016954daf4ac7967467aa763" + integrity sha512-kV3Uamv3XOH99Xf3kpIG3ZkS7mBNYcLDM00JSDtNgNB4BihuyxpQzIZPRIDmRi+95Z/R1Bb0X2kUNHa/kJoVrw== -"@ethersproject/pbkdf2@5.1.0", "@ethersproject/pbkdf2@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.1.0.tgz#6b740a85dc780e879338af74856ca2c0d3b24d19" - integrity sha512-B8cUbHHTgs8OtgJIafrRcz/YPDobVd5Ru8gTnShOiM9EBuFpYHQpq3+8iQJ6pyczDu6HP/oc/njAsIBhwFZYew== +"@ethersproject/networks@5.0.8", "@ethersproject/networks@^5.0.7": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.0.8.tgz#37e6f8c058f2d540373ea5939056cd3de069132e" + integrity sha512-PYpptlO2Tu5f/JEBI5hdlMds5k1DY1QwVbh3LKPb3un9dQA2bC51vd2/gRWAgSBpF3kkmZOj4FhD7ATLX4H+DA== dependencies: - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/sha2" "^5.1.0" + "@ethersproject/logger" "^5.0.8" -"@ethersproject/properties@5.1.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.1.0.tgz#9484bd6def16595fc6e4bdc26f29dff4d3f6ac42" - integrity sha512-519KKTwgmH42AQL3+GFV3SX6khYEfHsvI6v8HYejlkigSDuqttdgVygFTDsGlofNFchhDwuclrxQnD5B0YLNMg== +"@ethersproject/pbkdf2@5.0.8", "@ethersproject/pbkdf2@^5.0.7": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.0.8.tgz#06a086b1ac04c75e6846afd6cf6170a49a634411" + integrity sha512-UlmAMGbIPaS2xXsI38FbePVTfJMuU9jnwcqVn3p88HxPF4kD897ha+l3TNsBqJqf32UbQL5GImnf1oJkSKq4vQ== dependencies: - "@ethersproject/logger" "^5.1.0" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/sha2" "^5.0.7" -"@ethersproject/providers@5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.1.2.tgz#4e4459698903f911402fe91aa7544eb07f3921ed" - integrity sha512-GqsS8rd+eyd4eNkcNgzZ4l9IRULBPUZa7JPnv22k4MHflMobUseyhfbVnmoN5bVNNkOxjV1IPTw9i0sV1hwdpg== - dependencies: - "@ethersproject/abstract-provider" "^5.1.0" - "@ethersproject/abstract-signer" "^5.1.0" - "@ethersproject/address" "^5.1.0" - "@ethersproject/basex" "^5.1.0" - "@ethersproject/bignumber" "^5.1.0" - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/constants" "^5.1.0" - "@ethersproject/hash" "^5.1.0" - "@ethersproject/logger" "^5.1.0" - "@ethersproject/networks" "^5.1.0" - "@ethersproject/properties" "^5.1.0" - "@ethersproject/random" "^5.1.0" - "@ethersproject/rlp" "^5.1.0" - "@ethersproject/sha2" "^5.1.0" - "@ethersproject/strings" "^5.1.0" - "@ethersproject/transactions" "^5.1.0" - "@ethersproject/web" "^5.1.0" +"@ethersproject/properties@5.0.8", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.0.7": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.0.8.tgz#e45d28d25402c73394873dbf058f856c966cae01" + integrity sha512-zEnLMze2Eu2VDPj/05QwCwMKHh506gpT9PP9KPVd4dDB+5d6AcROUYVLoIIQgBYK7X/Gw0UJmG3oVtnxOQafAw== + dependencies: + "@ethersproject/logger" "^5.0.8" + +"@ethersproject/providers@5.0.23": + version "5.0.23" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.0.23.tgz#1e26512303d60bbd557242532fdb5fa3c5d5fb73" + integrity sha512-eJ94z2tgPaUgUmxwd3BVkIzkgkbNIkY6wRPVas04LVaBTycObQbgj794aaUu2bfk7+Bn2B/gjUZtJW1ybxh9/A== + dependencies: + "@ethersproject/abstract-provider" "^5.0.8" + "@ethersproject/abstract-signer" "^5.0.10" + "@ethersproject/address" "^5.0.9" + "@ethersproject/basex" "^5.0.7" + "@ethersproject/bignumber" "^5.0.13" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/constants" "^5.0.8" + "@ethersproject/hash" "^5.0.10" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/networks" "^5.0.7" + "@ethersproject/properties" "^5.0.7" + "@ethersproject/random" "^5.0.7" + "@ethersproject/rlp" "^5.0.7" + "@ethersproject/sha2" "^5.0.7" + "@ethersproject/strings" "^5.0.8" + "@ethersproject/transactions" "^5.0.9" + "@ethersproject/web" "^5.0.12" bech32 "1.1.4" ws "7.2.3" -"@ethersproject/random@5.1.0", "@ethersproject/random@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.1.0.tgz#0bdff2554df03ebc5f75689614f2d58ea0d9a71f" - integrity sha512-+uuczLQZ4+no9cP6TCoCktXx0u2YbNaRT7lRkSt12d8263e702f0u+4JnnRO8Qmv5nylWJebnqCHzyxP+6mLqw== +"@ethersproject/random@5.0.8", "@ethersproject/random@^5.0.7": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.0.8.tgz#8d3726be48e95467abce9b23c93adbb1de009dda" + integrity sha512-4rHtotmd9NjklW0eDvByicEkL+qareIyFSbG1ShC8tPJJSAC0g55oQWzw+3nfdRCgBHRuEE7S8EcPcTVPvZ9cA== dependencies: - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/logger" "^5.1.0" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/logger" "^5.0.8" -"@ethersproject/rlp@5.1.0", "@ethersproject/rlp@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.1.0.tgz#700f4f071c27fa298d3c1d637485fefe919dd084" - integrity sha512-vDTyHIwNPrecy55gKGZ47eJZhBm8LLBxihzi5ou+zrSvYTpkSTWRcKUlXFDFQVwfWB+P5PGyERAdiDEI76clxw== +"@ethersproject/rlp@5.0.8", "@ethersproject/rlp@^5.0.7": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.0.8.tgz#ff54e206d0ae28640dd054f2bcc7070f06f9dfbe" + integrity sha512-E4wdFs8xRNJfzNHmnkC8w5fPeT4Wd1U2cust3YeT16/46iSkLT8nn8ilidC6KhR7hfuSZE4UqSPzyk76p7cdZg== dependencies: - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/logger" "^5.1.0" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/logger" "^5.0.8" -"@ethersproject/sha2@5.1.0", "@ethersproject/sha2@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.1.0.tgz#6ca42d1a26884b3e32ffa943fe6494af7211506c" - integrity sha512-+fNSeZRstOpdRJpdGUkRONFCaiAqWkc91zXgg76Nlp5ndBQE25Kk5yK8gCPG1aGnCrbariiPr5j9DmrYH78JCA== +"@ethersproject/sha2@5.0.8", "@ethersproject/sha2@^5.0.7": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.0.8.tgz#9903c67e562739d8b312820b0a265b9c9bf35fc3" + integrity sha512-ILP1ZgyvDj4rrdE+AXrTv9V88m7x87uga2VZ/FeULKPumOEw/4bGnJz/oQ8zDnDvVYRCJ+48VaQBS2CFLbk1ww== dependencies: - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/logger" "^5.1.0" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/logger" "^5.0.8" hash.js "1.1.3" -"@ethersproject/signing-key@5.1.0", "@ethersproject/signing-key@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.1.0.tgz#6eddfbddb6826b597b9650e01acf817bf8991b9c" - integrity sha512-tE5LFlbmdObG8bY04NpuwPWSRPgEswfxweAI1sH7TbP0ml1elNfqcq7ii/3AvIN05i5U0Pkm3Tf8bramt8MmLw== +"@ethersproject/signing-key@5.0.10", "@ethersproject/signing-key@^5.0.8": + version "5.0.10" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.0.10.tgz#05e26e04f0aa5360dc78674d7331bacea8fea5c1" + integrity sha512-w5it3GbFOvN6e0mTd5gDNj+bwSe6L9jqqYjU+uaYS8/hAEp4qYLk5p8ZjbJJkNn7u1p0iwocp8X9oH/OdK8apA== dependencies: - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/logger" "^5.1.0" - "@ethersproject/properties" "^5.1.0" - bn.js "^4.4.0" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/properties" "^5.0.7" elliptic "6.5.4" -"@ethersproject/solidity@5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.1.0.tgz#095a9c75244edccb26c452c155736d363399b954" - integrity sha512-kPodsGyo9zg1g9XSXp1lGhFaezBAUUsAUB1Vf6OkppE5Wksg4Et+x3kG4m7J/uShDMP2upkJtHNsIBK2XkVpKQ== - dependencies: - "@ethersproject/bignumber" "^5.1.0" - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/keccak256" "^5.1.0" - "@ethersproject/sha2" "^5.1.0" - "@ethersproject/strings" "^5.1.0" - -"@ethersproject/strings@5.1.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.1.0.tgz#0f95a56c3c8c9d5510a06c241d818779750e2da5" - integrity sha512-perBZy0RrmmL0ejiFGUOlBVjMsUceqLut3OBP3zP96LhiJWWbS8u1NqQVgN4/Gyrbziuda66DxiQocXhsvx+Sw== - dependencies: - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/constants" "^5.1.0" - "@ethersproject/logger" "^5.1.0" - -"@ethersproject/transactions@5.1.1", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.1.0": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.1.1.tgz#5a6bbb25fb062c3cc75eb0db12faefcdd3870813" - integrity sha512-Nwgbp09ttIVN0OoUBatCXaHxR7grWPHbozJN8v7AXDLrl6nnOIBEMDh+yJTnosSQlFhcyjfTGGN+Mx6R8HdvMw== - dependencies: - "@ethersproject/address" "^5.1.0" - "@ethersproject/bignumber" "^5.1.0" - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/constants" "^5.1.0" - "@ethersproject/keccak256" "^5.1.0" - "@ethersproject/logger" "^5.1.0" - "@ethersproject/properties" "^5.1.0" - "@ethersproject/rlp" "^5.1.0" - "@ethersproject/signing-key" "^5.1.0" - -"@ethersproject/units@5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.1.0.tgz#b6ab3430ebc22adc3cb4839516496f167bee3ad5" - integrity sha512-isvJrx6qG0nKWfxsGORNjmOq/nh175fStfvRTA2xEKrGqx8JNJY83fswu4GkILowfriEM/eYpretfJnfzi7YhA== - dependencies: - "@ethersproject/bignumber" "^5.1.0" - "@ethersproject/constants" "^5.1.0" - "@ethersproject/logger" "^5.1.0" - -"@ethersproject/wallet@5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.1.0.tgz#134c5816eaeaa586beae9f9ff67891104a2c9a15" - integrity sha512-ULmUtiYQLTUS+y3DgkLzRhFEK10zMwmjOthnjiZxee3Q/MVwr3rnmuAnXIUZrPjna6hvUPnyRIdW5XuF0Ld0YQ== - dependencies: - "@ethersproject/abstract-provider" "^5.1.0" - "@ethersproject/abstract-signer" "^5.1.0" - "@ethersproject/address" "^5.1.0" - "@ethersproject/bignumber" "^5.1.0" - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/hash" "^5.1.0" - "@ethersproject/hdnode" "^5.1.0" - "@ethersproject/json-wallets" "^5.1.0" - "@ethersproject/keccak256" "^5.1.0" - "@ethersproject/logger" "^5.1.0" - "@ethersproject/properties" "^5.1.0" - "@ethersproject/random" "^5.1.0" - "@ethersproject/signing-key" "^5.1.0" - "@ethersproject/transactions" "^5.1.0" - "@ethersproject/wordlists" "^5.1.0" - -"@ethersproject/web@5.1.0", "@ethersproject/web@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.1.0.tgz#ed56bbe4e3d9a8ffe3b2ed882da5c62d3551381b" - integrity sha512-LTeluWgTq04+RNqAkVhpydPcRZK/kKxD2Vy7PYGrAD27ABO9kTqTBKwiOuzTyAHKUQHfnvZbXmxBXJAGViSDcA== - dependencies: - "@ethersproject/base64" "^5.1.0" - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/logger" "^5.1.0" - "@ethersproject/properties" "^5.1.0" - "@ethersproject/strings" "^5.1.0" - -"@ethersproject/wordlists@5.1.0", "@ethersproject/wordlists@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.1.0.tgz#54eb9ef3a00babbff90ffe124e19c89e07e6aace" - integrity sha512-NsUCi/TpBb+oTFvMSccUkJGtp5o/84eOyqp5q5aBeiNBSLkYyw21znRn9mAmxZgySpxgruVgKbaapnYPgvctPQ== - dependencies: - "@ethersproject/bytes" "^5.1.0" - "@ethersproject/hash" "^5.1.0" - "@ethersproject/logger" "^5.1.0" - "@ethersproject/properties" "^5.1.0" - "@ethersproject/strings" "^5.1.0" +"@ethersproject/solidity@5.0.9": + version "5.0.9" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.0.9.tgz#49100fbe9f364ac56f7ff7c726f4f3d151901134" + integrity sha512-LIxSAYEQgLRXE3mRPCq39ou61kqP8fDrGqEeNcaNJS3aLbmAOS8MZp56uK++WsdI9hj8sNsFh78hrAa6zR9Jag== + dependencies: + "@ethersproject/bignumber" "^5.0.13" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/keccak256" "^5.0.7" + "@ethersproject/sha2" "^5.0.7" + "@ethersproject/strings" "^5.0.8" + +"@ethersproject/strings@5.0.9", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.0.8": + version "5.0.9" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.0.9.tgz#8e2eb2918b140231e1d1b883d77e43213a8ac280" + integrity sha512-ogxBpcUpdO524CYs841MoJHgHxEPUy0bJFDS4Ezg8My+WYVMfVAOlZSLss0Rurbeeam8CpUVDzM4zUn09SU66Q== + dependencies: + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/constants" "^5.0.8" + "@ethersproject/logger" "^5.0.8" + +"@ethersproject/transactions@5.0.10", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.0.9": + version "5.0.10" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.0.10.tgz#d50cafd80d27206336f80114bc0f18bc18687331" + integrity sha512-Tqpp+vKYQyQdJQQk4M73tDzO7ODf2D42/sJOcKlDAAbdSni13v6a+31hUdo02qYXhVYwIs+ZjHnO4zKv5BNk8w== + dependencies: + "@ethersproject/address" "^5.0.9" + "@ethersproject/bignumber" "^5.0.13" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/constants" "^5.0.8" + "@ethersproject/keccak256" "^5.0.7" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/properties" "^5.0.7" + "@ethersproject/rlp" "^5.0.7" + "@ethersproject/signing-key" "^5.0.8" + +"@ethersproject/units@5.0.10": + version "5.0.10" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.0.10.tgz#9cca3b65cd0c92fab1bd33f2abd233546dd61987" + integrity sha512-eaiHi9ham5lbC7qpqxpae7OY/nHJUnRUnFFuEwi2VB5Nwe3Np468OAV+e+HR+jAK4fHXQE6PFBTxWGtnZuO37g== + dependencies: + "@ethersproject/bignumber" "^5.0.13" + "@ethersproject/constants" "^5.0.8" + "@ethersproject/logger" "^5.0.8" + +"@ethersproject/wallet@5.0.11": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.0.11.tgz#9891936089d1b91e22ed59f850bc344b1544bf26" + integrity sha512-2Fg/DOvUltR7aZTOyWWlQhru+SKvq2UE3uEhXSyCFgMqDQNuc2nHXh1SHJtN65jsEbjVIppOe1Q7EQMvhmeeRw== + dependencies: + "@ethersproject/abstract-provider" "^5.0.8" + "@ethersproject/abstract-signer" "^5.0.10" + "@ethersproject/address" "^5.0.9" + "@ethersproject/bignumber" "^5.0.13" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/hash" "^5.0.10" + "@ethersproject/hdnode" "^5.0.8" + "@ethersproject/json-wallets" "^5.0.10" + "@ethersproject/keccak256" "^5.0.7" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/properties" "^5.0.7" + "@ethersproject/random" "^5.0.7" + "@ethersproject/signing-key" "^5.0.8" + "@ethersproject/transactions" "^5.0.9" + "@ethersproject/wordlists" "^5.0.8" + +"@ethersproject/web@5.0.13", "@ethersproject/web@^5.0.12": + version "5.0.13" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.0.13.tgz#5a92ac6d835d2ebce95b6b645a86668736e2f532" + integrity sha512-G3x/Ns7pQm21ALnWLbdBI5XkW/jrsbXXffI9hKNPHqf59mTxHYtlNiSwxdoTSwCef3Hn7uvGZpaSgTyxs7IufQ== + dependencies: + "@ethersproject/base64" "^5.0.7" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/properties" "^5.0.7" + "@ethersproject/strings" "^5.0.8" + +"@ethersproject/wordlists@5.0.9", "@ethersproject/wordlists@^5.0.8": + version "5.0.9" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.0.9.tgz#f16cc0b317637c3ae9c689ebd7bc2cbbffadd013" + integrity sha512-Sn6MTjZkfbriod6GG6+p43W09HOXT4gwcDVNj0YoPYlo4Zq2Fk6b1CU9KUX3c6aI17PrgYb4qwZm5BMuORyqyQ== + dependencies: + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/hash" "^5.0.10" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/properties" "^5.0.7" + "@ethersproject/strings" "^5.0.8" "@hapi/address@2.x.x": version "2.1.4" @@ -1497,15 +1356,36 @@ "@nodelib/fs.scandir" "2.1.4" fastq "^1.6.0" +"@nomiclabs/ethereumjs-vm@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@nomiclabs/ethereumjs-vm/-/ethereumjs-vm-4.2.2.tgz#2f8817113ca0fb6c44c1b870d0a809f0e026a6cc" + integrity sha512-8WmX94mMcJaZ7/m7yBbyuS6B+wuOul+eF+RY9fBpGhNaUpyMR/vFIcDojqcWQ4Yafe1tMKY5LDu2yfT4NZgV4Q== + dependencies: + async "^2.1.2" + async-eventemitter "^0.2.2" + core-js-pure "^3.0.1" + ethereumjs-account "^3.0.0" + ethereumjs-block "^2.2.2" + ethereumjs-blockchain "^4.0.3" + ethereumjs-common "^1.5.0" + ethereumjs-tx "^2.1.2" + ethereumjs-util "^6.2.0" + fake-merkle-patricia-tree "^1.0.1" + functional-red-black-tree "^1.0.1" + merkle-patricia-tree "3.0.0" + rustbn.js "~0.2.0" + safe-buffer "^5.1.1" + util.promisify "^1.0.0" + "@nomiclabs/hardhat-ethers@^2.0.0": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.2.tgz#c472abcba0c5185aaa4ad4070146e95213c68511" - integrity sha512-6quxWe8wwS4X5v3Au8q1jOvXYEPkS1Fh+cME5u6AwNdnI4uERvPlVjlgRWzpnb+Rrt1l/cEqiNRH9GlsBMSDQg== + version "2.0.1" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.1.tgz#f86a6fa210dbe6270adffccc75e93ed60a856904" + integrity sha512-uTFHDhhvJ+UjfvvMeQxD3ZALuzuI3FXzTYT1Z5N3ebyZL5z4Ogwt55GB0R9tdKY0p5HhDhBjU/gsCjUEwIVoaw== "@nomiclabs/hardhat-etherscan@^2.1.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-2.1.2.tgz#333b70a6116e922d16de2ef833dcb7191319afdd" - integrity sha512-SExzaBuHlnmHw0HKkElHITzdvhUQmlIRc2tlaywzgvPbh7WoI24nYqZ4N0CO+JXSDgRpFycvQNA8zRaCqjuqUg== + version "2.1.1" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-2.1.1.tgz#186f3fa652a0ca20fb77aa857cfad2da845d5cbf" + integrity sha512-8TNUFsO5DpAfwNlXMDhcEtFAMOYsVNaQL2vq5vuCD45kUKBgL8H21++zOk231ha9D7LQWBMCIg7A7iPxw6Jwmg== dependencies: "@ethersproject/abi" "^5.0.2" "@ethersproject/address" "^5.0.2" @@ -1696,20 +1576,6 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== -"@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^7.0.4": - version "7.0.5" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.0.5.tgz#558a7f8145a01366c44b3dcbdd7172c05c461564" - integrity sha512-fUt6b15bjV/VW93UP5opNXJxdwZSbK1EdiwnhN7XrQrcpaOhMJpZ/CjwFpM3THpxwA+YviBUJKSuEqKlCK5alw== - dependencies: - "@sinonjs/commons" "^1.7.0" - "@soda/friendly-errors-webpack-plugin@^1.7.1": version "1.8.0" resolved "https://registry.yarnpkg.com/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.0.tgz#84751d82a93019d5c92c0cf0e45ac59087cd2240" @@ -1730,10 +1596,10 @@ resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.11.1.tgz#fa840af64840c930f24a9c82c08d4a092a068add" integrity sha512-H8BSBoKE8EubJa0ONqecA2TviT3TnHeC4NpgnAHSUiuhZoQBfPB4L2P9bs8R6AoTW10Endvh3vc+fomVMIDIYQ== -"@solidity-parser/parser@^0.12.0", "@solidity-parser/parser@^0.12.1": - version "0.12.2" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.12.2.tgz#1afad367cb29a2ed8cdd4a3a62701c2821fb578f" - integrity sha512-d7VS7PxgMosm5NyaiyDJRNID5pK4AWj1l64Dbz0147hJgy5k2C0/ZiKK/9u5c5K+HRUVHmp+RMvGEjGh84oA5Q== +"@solidity-parser/parser@^0.8.2": + version "0.8.2" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.8.2.tgz#a6a5e93ac8dca6884a99a532f133beba59b87b69" + integrity sha512-8LySx3qrNXPgB5JiULfG10O3V7QTxI/TLzSw5hFQhXWSkVxZBAv4rZQ0sYgLEbc8g3L2lmnujj1hKul38Eu5NQ== "@szmarczak/http-timer@^1.1.2": version "1.1.2" @@ -1749,17 +1615,17 @@ dependencies: ethers "^5.0.2" -"@types/abstract-leveldown@*": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-5.0.1.tgz#3c7750d0186b954c7f2d2f6acc8c3c7ba0c3412e" - integrity sha512-wYxU3kp5zItbxKmeRYCEplS2MW7DzyBnxPGj+GJVHZEUZiK/nn5Ei1sUFgURDh+X051+zsGe28iud3oHjrYWQQ== +"@types/anymatch@*": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" + integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA== "@types/argparse@^1.0.36": version "1.0.38" resolved "https://registry.yarnpkg.com/@types/argparse/-/argparse-1.0.38.tgz#a81fd8606d481f873a3800c6ebae4f1d768a56a9" integrity sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA== -"@types/bn.js@*", "@types/bn.js@^5.1.0": +"@types/bn.js@*": version "5.1.0" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== @@ -1782,21 +1648,21 @@ "@types/node" "*" "@types/chai-as-promised@^7.1.3": - version "7.1.4" - resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.4.tgz#caf64e76fb056b8c8ced4b761ed499272b737601" - integrity sha512-1y3L1cHePcIm5vXkh1DSGf/zQq5n5xDKG1fpCvf18+uOkpce0Z1ozNFPkyWsVswK7ntN1sZBw3oU6gmN+pDUcA== + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.3.tgz#779166b90fda611963a3adbfd00b339d03b747bd" + integrity sha512-FQnh1ohPXJELpKhzjuDkPLR2BZCAqed+a6xV4MI/T3XzHfd2FlarfUGUdZYgqYe8oxkYn0fchHEeHfHqdZ96sg== dependencies: "@types/chai" "*" "@types/chai@*", "@types/chai@^4.2.14": - version "4.2.18" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.18.tgz#0c8e298dbff8205e2266606c1ea5fbdba29b46e4" - integrity sha512-rS27+EkB/RE1Iz3u0XtVL5q36MGDWbgYe7zWiodyKNUnthxY0rukK5V36eiUCtCisB7NN8zKYH6DO2M37qxFEQ== + version "4.2.15" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.15.tgz#b7a6d263c2cecf44b6de9a051cf496249b154553" + integrity sha512-rYff6FI+ZTKAPkJUoyz7Udq3GaoDZnxYDEvdEdFZASiA7PoErltHezDishqQiSDWrGxvxmplH304jyzQmjp0AQ== "@types/connect-history-api-fallback@*": - version "1.3.4" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.4.tgz#8c0f0e6e5d8252b699f5a662f51bdf82fd9d8bb8" - integrity sha512-Kf8v0wljR5GSCOCF/VQWdV3ZhKOVA73drXtY3geMTQgHy9dgqQ0dLrf31M0hcuWkhFzK5sP0kkS3mJzcKVtZbw== + version "1.3.3" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.3.tgz#4772b79b8b53185f0f4c9deab09236baf76ee3b4" + integrity sha512-7SxFCd+FLlxCfwVwbyPxbR4khL9aNikJhrorw8nUIOqeuooc9gifBuDQOJw5kzN7i6i3vLn9G8Wde/4QDihpYw== dependencies: "@types/express-serve-static-core" "*" "@types/node" "*" @@ -1814,9 +1680,9 @@ integrity sha512-0stqrMZB7vxsRTe//XEpr6A9+fThL2y/g6qzDG5ZgMJwuOceqOBDfh+g99tuN/XS58V52aPNTfWVS49Xvh842w== "@types/estree@*": - version "0.0.47" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.47.tgz#d7a51db20f0650efec24cd04994f523d93172ed4" - integrity sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg== + version "0.0.46" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.46.tgz#0fb6bfbbeabd7a30880504993369c4bf1deab1fe" + integrity sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg== "@types/estree@0.0.39": version "0.0.39" @@ -1824,9 +1690,9 @@ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": - version "4.17.19" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz#00acfc1632e729acac4f1530e9e16f6dd1508a1d" - integrity sha512-DJOSHzX7pCiSElWaGR8kCprwibCB/3yW6vcT8VG3P0SJjnv19gnWG/AZMfM60Xj/YJIp/YCaDHyvzsFVeniARA== + version "4.17.18" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.18.tgz#8371e260f40e0e1ca0c116a9afcd9426fa094c40" + integrity sha512-m4JTwx5RUBNZvky/JJ8swEJPKFd8si08pPF2PfizYjGZOKr/svUWPcoUmLow6MmPzhasphB7gSTINY67xn3JNA== dependencies: "@types/node" "*" "@types/qs" "*" @@ -1857,10 +1723,19 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/http-proxy@^1.17.5": - version "1.17.6" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.6.tgz#62dc3fade227d6ac2862c8f19ee0da9da9fd8616" - integrity sha512-+qsjqR75S/ib0ig0R9WN+CDoZeOBU6F2XLewgC4KVgdXiNHiKKHFEMRHOrs5PbYE97D5vataw5wPj4KLYfUkuQ== +"@types/http-proxy-middleware@*": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@types/http-proxy-middleware/-/http-proxy-middleware-0.19.3.tgz#b2eb96fbc0f9ac7250b5d9c4c53aade049497d03" + integrity sha512-lnBTx6HCOUeIJMLbI/LaL5EmdKLhczJY5oeXZpX/cXE4rRqb3RmV7VcMpiEfYkmTjipv3h7IAyIINe4plEv7cA== + dependencies: + "@types/connect" "*" + "@types/http-proxy" "*" + "@types/node" "*" + +"@types/http-proxy@*": + version "1.17.5" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.5.tgz#c203c5e6e9dc6820d27a40eb1e511c70a220423d" + integrity sha512-GNkDE7bTv6Sf8JbV2GksknKOsk7OznNYHSdrtvPJXO0qJ9odZig6IZKUi5RFGi6d1bf6dgIAe4uXi3DBc7069Q== dependencies: "@types/node" "*" @@ -1874,14 +1749,6 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== -"@types/levelup@^4.3.0": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.1.tgz#7a53b9fd510716e11b2065332790fdf5f9b950b9" - integrity sha512-n//PeTpbHLjMLTIgW5B/g06W/6iuTBHuvUka2nFL9APMSVMNe2r4enADfu3CIE9IyV9E+uquf9OEQQqrDeg24A== - dependencies: - "@types/abstract-leveldown" "*" - "@types/node" "*" - "@types/lru-cache@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.0.tgz#57f228f2b80c046b4a1bd5cac031f81f207f4f03" @@ -1893,9 +1760,9 @@ integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== "@types/minimatch@*": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.4.tgz#f0ec25dbf2f0e4b18647313ac031134ca5b24b21" - integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== "@types/minimist@^1.2.0": version "1.2.1" @@ -1917,9 +1784,9 @@ "@types/mocha" "*" "@types/mocha@*", "@types/mocha@^8.0.3": - version "8.2.2" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.2.tgz#91daa226eb8c2ff261e6a8cbf8c7304641e095e0" - integrity sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw== + version "8.2.0" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.0.tgz#3eb56d13a1de1d347ecb1957c6860c911704bc44" + integrity sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ== "@types/mock-fs@^4.13.0": version "4.13.0" @@ -1929,27 +1796,22 @@ "@types/node" "*" "@types/node-fetch@^2.5.5", "@types/node-fetch@^2.5.7": - version "2.5.10" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.10.tgz#9b4d4a0425562f9fcea70b12cb3fcdd946ca8132" - integrity sha512-IpkX0AasN44hgEad0gEF/V6EgR5n69VEqPEgnmoM8GsIGro3PowbWs4tR6IhxUTyPLpOn+fiGG6nrQhcmoCuIQ== + version "2.5.8" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.8.tgz#e199c835d234c7eb0846f6618012e558544ee2fb" + integrity sha512-fbjI6ja0N5ZA8TV53RUqzsKNkl9fv8Oj3T7zxW7FGv1GSH7gwJaNF8dzCjrqKaxKeUpTz4yT1DaJFq/omNpGfw== dependencies: "@types/node" "*" form-data "^3.0.0" -"@types/node@*": - version "15.3.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-15.3.1.tgz#23a06b87eedb524016616e886b116b8fdcb180af" - integrity sha512-weaeiP4UF4XgF++3rpQhpIJWsCTS4QJw5gvBhQu6cFIxTwyxWIe3xbnrY/o2lTCQ0lsdb8YIUDUvLR4Vuz5rbw== +"@types/node@*", "@types/node@^14.14.5", "@types/node@^14.6.1": + version "14.14.28" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.28.tgz#cade4b64f8438f588951a6b35843ce536853f25b" + integrity sha512-lg55ArB+ZiHHbBBttLpzD07akz0QPrZgUODNakeC09i62dnrywr9mFErHuaPlB6I7z+sEbK+IYmplahvplCj2g== "@types/node@^12.12.6": - version "12.20.13" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.13.tgz#e743bae112bd779ac9650f907197dd2caa7f0364" - integrity sha512-1x8W5OpxPq+T85OUsHRP6BqXeosKmeXRtjoF39STcdf/UWLqUsoehstZKOi0CunhVqHG17AyZgpj20eRVooK6A== - -"@types/node@^14.14.5", "@types/node@^14.6.1": - version "14.17.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.0.tgz#3ba770047723b3eeb8dc9fca02cce8a7fb6378da" - integrity sha512-w8VZUN/f7SSbvVReb9SWp6cJFevxb4/nkG65yLAya//98WgocKm5PLDAtSs5CtJJJM+kHmJjO/6mmYW4MHShZA== + version "12.20.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.1.tgz#63d36c10e162666f0107f247cdca76542c3c7472" + integrity sha512-tCkE96/ZTO+cWbln2xfyvd6ngHLanvVlJ3e5BeirJ3BYI5GbAyubIrmV4JjjugDly5D9fHjOL5MNsqsCnqwW6g== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -1964,9 +1826,9 @@ "@types/node" "*" "@types/prettier@^2.1.1": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.2.3.tgz#ef65165aea2924c9359205bf748865b8881753c0" - integrity sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA== + version "2.2.1" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.2.1.tgz#374e31645d58cb18a07b3ecd8e9dede4deb2cccd" + integrity sha512-DxZZbyMAM9GWEzXL+BMZROWz9oo6A9EilwwOMET2UVu2uZTqMWS5S69KVtuVKaRjCUpcrOXRalet86/OpG4kqw== "@types/q@^1.5.1": version "1.5.4" @@ -1974,9 +1836,9 @@ integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== "@types/qs@*": - version "6.9.6" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.6.tgz#df9c3c8b31a247ec315e6996566be3171df4b3b1" - integrity sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA== + version "6.9.5" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.5.tgz#434711bdd49eb5ee69d90c1d67c354a9a8ecb18b" + integrity sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ== "@types/range-parser@*": version "1.2.3" @@ -1998,9 +1860,9 @@ "@types/node" "*" "@types/secp256k1@^4.0.1": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.2.tgz#20c29a87149d980f64464e56539bf4810fdb5d1d" - integrity sha512-QMg+9v0bbNJ2peLuHRWxzmy0HRJIG6gFZNhaRSp7S3ggSbCCxiqQB2/ybvhXyhHOCequpNkrx7OavNhrWOsW0A== + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.1.tgz#fb3aa61a1848ad97d7425ff9dcba784549fca5a4" + integrity sha512-+ZjSA8ELlOp8SlKi0YLB2tz9d5iPNEmOBd+8Rz21wTMdaXQIa9b6TEnD6l5qKOCypE7FSyPyck12qZJxSDNoog== dependencies: "@types/node" "*" @@ -2021,11 +1883,16 @@ "@types/sinon" "*" "@types/sinon@*": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.0.tgz#eecc3847af03d45ffe53d55aaaaf6ecb28b5e584" - integrity sha512-jDZ55oCKxqlDmoTBBbBBEx+N8ZraUVhggMZ9T5t+6/Dh8/4NiOjSUfpLrPiEwxQDlAe3wpAkoXhWvE6LibtsMQ== + version "9.0.10" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-9.0.10.tgz#7fb9bcb6794262482859cab66d59132fca18fcf7" + integrity sha512-/faDC0erR06wMdybwI/uR8wEKV/E83T0k4sepIpB7gXuy2gzx2xiOjmztq6a2Y6rIGJ04D+6UU0VBmWy+4HEMA== dependencies: - "@sinonjs/fake-timers" "^7.0.4" + "@types/sinonjs__fake-timers" "*" + +"@types/sinonjs__fake-timers@*": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.2.tgz#3a84cf5ec3249439015e14049bd3161419bf9eae" + integrity sha512-dIPoZ3g5gcx9zZEszaxLSVTvMReD3xxyyDnQUjA6IYDG9Ba2AV0otMPs+77sG9ojB4Qr2N2Vk5RnKeuA0X/0bg== "@types/source-list-map@*": version "0.1.2" @@ -2039,22 +1906,22 @@ dependencies: "@types/node" "*" -"@types/tapable@^1": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.7.tgz#545158342f949e8fd3bfd813224971ecddc3fac4" - integrity sha512-0VBprVqfgFD7Ehb2vd8Lh9TG3jP98gvr8rgehQqzztZNI7o8zS8Ad4jyZneKELphpuE212D8J70LnSNQSyO6bQ== +"@types/tapable@*": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74" + integrity sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA== "@types/uglify-js@*": - version "3.13.0" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.0.tgz#1cad8df1fb0b143c5aba08de5712ea9d1ff71124" - integrity sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q== + version "3.12.0" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.12.0.tgz#2bb061c269441620d46b946350c8f16d52ef37c5" + integrity sha512-sYAF+CF9XZ5cvEBkI7RtrG9g2GtMBkviTnBxYYyq+8BWvO4QtXfwwR6a2LFwCi4evMKZfpv6U43ViYvv17Wz3Q== dependencies: source-map "^0.6.1" "@types/underscore@*": - version "1.11.2" - resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.11.2.tgz#9441e0f6402bbcb72dbee771582fa57c5a1dedd3" - integrity sha512-Ls2ylbo7++ITrWk2Yc3G/jijwSq5V3GT0tlgVXEl2kKYXY3ImrtmTCoE2uyTWFRI5owMBriloZFWbE1SXOsE7w== + version "1.10.24" + resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.10.24.tgz#dede004deed3b3f99c4db0bdb9ee21cae25befdd" + integrity sha512-T3NQD8hXNW2sRsSbLNjF/aBo18MyJlbw0lSpQHB/eZZtScPdexN4HSa8cByYwTw9Wy7KuOFr81mlDQcQQaZ79w== "@types/web3@1.0.19": version "1.0.19" @@ -2065,15 +1932,15 @@ "@types/underscore" "*" "@types/webpack-dev-server@^3.11.0": - version "3.11.4" - resolved "https://registry.yarnpkg.com/@types/webpack-dev-server/-/webpack-dev-server-3.11.4.tgz#90d47dd660b696d409431ab8c1e9fa3615103a07" - integrity sha512-DCKORHjqNNVuMIDWFrlljftvc9CL0+09p3l7lBpb8dRqgN5SmvkWCY4MPKxoI6wJgdRqohmoNbptkxqSKAzLRg== + version "3.11.1" + resolved "https://registry.yarnpkg.com/@types/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz#f8f4dac1da226d530bd15a1d5dc34b23ba766ccb" + integrity sha512-rIb+LtUkKnh7+oIJm3WiMJONd71Q0lZuqGLcSqhZ5qjN9gV/CNmZe7Bai+brnBPZ/KVYOsr+4bFLiNZwjBicLw== dependencies: "@types/connect-history-api-fallback" "*" "@types/express" "*" + "@types/http-proxy-middleware" "*" "@types/serve-static" "*" - "@types/webpack" "^4" - http-proxy-middleware "^1.0.0" + "@types/webpack" "*" "@types/webpack-sources@*": version "2.1.0" @@ -2084,25 +1951,25 @@ "@types/source-list-map" "*" source-map "^0.7.3" -"@types/webpack@^4", "@types/webpack@^4.0.0": - version "4.41.29" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.29.tgz#2e66c1de8223c440366469415c50a47d97625773" - integrity sha512-6pLaORaVNZxiB3FSHbyBiWM7QdazAWda1zvAq4SbZObZqHSDbWLi62iFdblVea6SK9eyBIVp5yHhKt/yNQdR7Q== +"@types/webpack@*", "@types/webpack@^4.0.0": + version "4.41.26" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.26.tgz#27a30d7d531e16489f9c7607c747be6bc1a459ef" + integrity sha512-7ZyTfxjCRwexh+EJFwRUM+CDB2XvgHl4vfuqf1ZKrgGvcS5BrNvPQqJh3tsZ0P6h6Aa1qClVHaJZszLPzpqHeA== dependencies: + "@types/anymatch" "*" "@types/node" "*" - "@types/tapable" "^1" + "@types/tapable" "*" "@types/uglify-js" "*" "@types/webpack-sources" "*" - anymatch "^3.0.0" source-map "^0.6.0" "@typescript-eslint/eslint-plugin@^4.10.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.24.0.tgz#03801ffc25b2af9d08f3dc9bccfc0b7ce3780d0f" - integrity sha512-qbCgkPM7DWTsYQGjx9RTuQGswi+bEt0isqDBeo+CKV0953zqI0Tp7CZ7Fi9ipgFA6mcQqF4NOVNwS/f2r6xShw== + version "4.15.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.15.1.tgz#835f64aa0a403e5e9e64c10ceaf8d05c3f015180" + integrity sha512-yW2epMYZSpNJXZy22Biu+fLdTG8Mn6b22kR3TqblVk50HGNV8Zya15WAXuQCr8tKw4Qf1BL4QtI6kv6PCkLoJw== dependencies: - "@typescript-eslint/experimental-utils" "4.24.0" - "@typescript-eslint/scope-manager" "4.24.0" + "@typescript-eslint/experimental-utils" "4.15.1" + "@typescript-eslint/scope-manager" "4.15.1" debug "^4.1.1" functional-red-black-tree "^1.0.1" lodash "^4.17.15" @@ -2110,60 +1977,60 @@ semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.24.0.tgz#c23ead9de44b99c3a5fd925c33a106b00165e172" - integrity sha512-IwTT2VNDKH1h8RZseMH4CcYBz6lTvRoOLDuuqNZZoThvfHEhOiZPQCow+5El3PtyxJ1iDr6UXZwYtE3yZQjhcw== +"@typescript-eslint/experimental-utils@4.15.1": + version "4.15.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.15.1.tgz#d744d1ac40570a84b447f7aa1b526368afd17eec" + integrity sha512-9LQRmOzBRI1iOdJorr4jEnQhadxK4c9R2aEAsm7WE/7dq8wkKD1suaV0S/JucTL8QlYUPU1y2yjqg+aGC0IQBQ== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/scope-manager" "4.24.0" - "@typescript-eslint/types" "4.24.0" - "@typescript-eslint/typescript-estree" "4.24.0" + "@typescript-eslint/scope-manager" "4.15.1" + "@typescript-eslint/types" "4.15.1" + "@typescript-eslint/typescript-estree" "4.15.1" eslint-scope "^5.0.0" eslint-utils "^2.0.0" "@typescript-eslint/parser@^4.10.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.24.0.tgz#2e5f1cc78ffefe43bfac7e5659309a92b09a51bd" - integrity sha512-dj1ZIh/4QKeECLb2f/QjRwMmDArcwc2WorWPRlB8UNTZlY1KpTVsbX7e3ZZdphfRw29aTFUSNuGB8w9X5sS97w== + version "4.15.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.15.1.tgz#4c91a0602733db63507e1dbf13187d6c71a153c4" + integrity sha512-V8eXYxNJ9QmXi5ETDguB7O9diAXlIyS+e3xzLoP/oVE4WCAjssxLIa0mqCLsCGXulYJUfT+GV70Jv1vHsdKwtA== dependencies: - "@typescript-eslint/scope-manager" "4.24.0" - "@typescript-eslint/types" "4.24.0" - "@typescript-eslint/typescript-estree" "4.24.0" + "@typescript-eslint/scope-manager" "4.15.1" + "@typescript-eslint/types" "4.15.1" + "@typescript-eslint/typescript-estree" "4.15.1" debug "^4.1.1" -"@typescript-eslint/scope-manager@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.24.0.tgz#38088216f0eaf235fa30ed8cabf6948ec734f359" - integrity sha512-9+WYJGDnuC9VtYLqBhcSuM7du75fyCS/ypC8c5g7Sdw7pGL4NDTbeH38eJPfzIydCHZDoOgjloxSAA3+4l/zsA== +"@typescript-eslint/scope-manager@4.15.1": + version "4.15.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.15.1.tgz#f6511eb38def2a8a6be600c530c243bbb56ac135" + integrity sha512-ibQrTFcAm7yG4C1iwpIYK7vDnFg+fKaZVfvyOm3sNsGAerKfwPVFtYft5EbjzByDJ4dj1WD8/34REJfw/9wdVA== dependencies: - "@typescript-eslint/types" "4.24.0" - "@typescript-eslint/visitor-keys" "4.24.0" + "@typescript-eslint/types" "4.15.1" + "@typescript-eslint/visitor-keys" "4.15.1" -"@typescript-eslint/types@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.24.0.tgz#6d0cca2048cbda4e265e0c4db9c2a62aaad8228c" - integrity sha512-tkZUBgDQKdvfs8L47LaqxojKDE+mIUmOzdz7r+u+U54l3GDkTpEbQ1Jp3cNqqAU9vMUCBA1fitsIhm7yN0vx9Q== +"@typescript-eslint/types@4.15.1": + version "4.15.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.15.1.tgz#da702f544ef1afae4bc98da699eaecd49cf31c8c" + integrity sha512-iGsaUyWFyLz0mHfXhX4zO6P7O3sExQpBJ2dgXB0G5g/8PRVfBBsmQIc3r83ranEQTALLR3Vko/fnCIVqmH+mPw== -"@typescript-eslint/typescript-estree@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.24.0.tgz#b49249679a98014d8b03e8d4b70864b950e3c90f" - integrity sha512-kBDitL/by/HK7g8CYLT7aKpAwlR8doshfWz8d71j97n5kUa5caHWvY0RvEUEanL/EqBJoANev8Xc/mQ6LLwXGA== +"@typescript-eslint/typescript-estree@4.15.1": + version "4.15.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.15.1.tgz#fa9a9ff88b4a04d901ddbe5b248bc0a00cd610be" + integrity sha512-z8MN3CicTEumrWAEB2e2CcoZa3KP9+SMYLIA2aM49XW3cWIaiVSOAGq30ffR5XHxRirqE90fgLw3e6WmNx5uNw== dependencies: - "@typescript-eslint/types" "4.24.0" - "@typescript-eslint/visitor-keys" "4.24.0" + "@typescript-eslint/types" "4.15.1" + "@typescript-eslint/visitor-keys" "4.15.1" debug "^4.1.1" globby "^11.0.1" is-glob "^4.0.1" semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/visitor-keys@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.24.0.tgz#a8fafdc76cad4e04a681a945fbbac4e35e98e297" - integrity sha512-4ox1sjmGHIxjEDBnMCtWFFhErXtKA1Ec0sBpuz0fqf3P+g3JFGyTxxbF06byw0FRsPnnbq44cKivH7Ks1/0s6g== +"@typescript-eslint/visitor-keys@4.15.1": + version "4.15.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.15.1.tgz#c76abbf2a3be8a70ed760f0e5756bf62de5865dd" + integrity sha512-tYzaTP9plooRJY8eNlpAewTOqtWW/4ff/5wBjNVaJ0S0wC4Gpq/zDVRTJa5bq2v1pCNQ08xxMCndcvR+h7lMww== dependencies: - "@typescript-eslint/types" "4.24.0" + "@typescript-eslint/types" "4.15.1" eslint-visitor-keys "^2.0.0" "@ungap/promise-all-settled@1.1.2": @@ -2186,10 +2053,10 @@ resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz#9b9c691cd06fc855221a2475c3cc831d774bc7dc" integrity sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA== -"@vue/babel-plugin-jsx@^1.0.3": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.0.6.tgz#184bf3541ab6efdbe5079ab8b20c19e2af100bfb" - integrity sha512-RzYsvBhzKUmY2YG6LoV+W5PnlnkInq0thh1AzCmewwctAgGN6e9UFon6ZrQQV1CO5G5PeME7MqpB+/vvGg0h4g== +"@vue/babel-plugin-jsx@^1.0.0-0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.0.3.tgz#ad5ee86ebc9fc40900add9914534e223c719eace" + integrity sha512-+52ZQFmrM0yh61dQlgwQlfHZXmYbswbQEL25SOSt9QkjegAdfIGu87oELw0l8H6cuJYazZCiNjPR9eU++ZIbxg== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/plugin-syntax-jsx" "^7.0.0" @@ -2213,10 +2080,10 @@ lodash.kebabcase "^4.1.1" svg-tags "^1.0.0" -"@vue/babel-preset-app@^4.5.13": - version "4.5.13" - resolved "https://registry.yarnpkg.com/@vue/babel-preset-app/-/babel-preset-app-4.5.13.tgz#cb475321e4c73f7f110dac29a48c2a9cb80afeb6" - integrity sha512-pM7CR3yXB6L8Gfn6EmX7FLNE3+V/15I3o33GkSNsWvgsMp6HVGXKkXgojrcfUUauyL1LZOdvTmu4enU2RePGHw== +"@vue/babel-preset-app@^4.5.11": + version "4.5.11" + resolved "https://registry.yarnpkg.com/@vue/babel-preset-app/-/babel-preset-app-4.5.11.tgz#f677bc10472e418f71f61f10dde5a79976a215b8" + integrity sha512-9VoFlm/9vhynKNGM+HA7qBsoQSUEnuG5i5kcFI9vTLLrh8A0fxrwUyVLLppO6T1sAZ6vrKdQFnEkjL+RkRAwWQ== dependencies: "@babel/core" "^7.11.0" "@babel/helper-compilation-targets" "^7.9.6" @@ -2228,14 +2095,14 @@ "@babel/plugin-transform-runtime" "^7.11.0" "@babel/preset-env" "^7.11.0" "@babel/runtime" "^7.11.0" - "@vue/babel-plugin-jsx" "^1.0.3" - "@vue/babel-preset-jsx" "^1.2.4" + "@vue/babel-plugin-jsx" "^1.0.0-0" + "@vue/babel-preset-jsx" "^1.1.2" babel-plugin-dynamic-import-node "^2.3.3" core-js "^3.6.5" core-js-compat "^3.6.5" semver "^6.1.0" -"@vue/babel-preset-jsx@^1.2.4": +"@vue/babel-preset-jsx@^1.1.2": version "1.2.4" resolved "https://registry.yarnpkg.com/@vue/babel-preset-jsx/-/babel-preset-jsx-1.2.4.tgz#92fea79db6f13b01e80d3a0099e2924bdcbe4e87" integrity sha512-oRVnmN2a77bYDJzeGSt92AuHXbkIxbf/XXSE3klINnh9AXBmVS1DGa1f0d+dDYpLfsAKElMnqKTQfKn7obcL4w== @@ -2298,40 +2165,40 @@ "@vue/babel-plugin-transform-vue-jsx" "^1.2.1" camelcase "^5.0.0" -"@vue/cli-overlay@^4.5.13": - version "4.5.13" - resolved "https://registry.yarnpkg.com/@vue/cli-overlay/-/cli-overlay-4.5.13.tgz#4f1fd2161be8f69d6cba8079f3f0d7dc4dee47a7" - integrity sha512-jhUIg3klgi5Cxhs8dnat5hi/W2tQJvsqCxR0u6hgfSob0ORODgUBlN+F/uwq7cKIe/pzedVUk1y07F13GQvPqg== +"@vue/cli-overlay@^4.5.11": + version "4.5.11" + resolved "https://registry.yarnpkg.com/@vue/cli-overlay/-/cli-overlay-4.5.11.tgz#ea99493131182285f7ac2762290354d6e5b188e8" + integrity sha512-aDQNw+oGk5+KR0vL9TocjfzyYHTJxR2lS8iPbcL4lRglCs2dudOE7QWXypj5dM4rQus0jJ5fxJTS55o9uy9fcQ== "@vue/cli-plugin-babel@^4.0.0": - version "4.5.13" - resolved "https://registry.yarnpkg.com/@vue/cli-plugin-babel/-/cli-plugin-babel-4.5.13.tgz#a89c482edcc4ea1d135645cec502a7f5fd4c30e7" - integrity sha512-ykvEAfD8PgGs+dGMGqr7l/nRmIS39NRzWLhMluPLTvDV1L+IxcoB73HNLGA/aENDpl8CuWrTE+1VgydcOhp+wg== + version "4.5.11" + resolved "https://registry.yarnpkg.com/@vue/cli-plugin-babel/-/cli-plugin-babel-4.5.11.tgz#7c1db4ca2f911e2156e7d1cf774fe2ad0f7428eb" + integrity sha512-ogUMeO2waDtghIWwmuAzMJAnnPdmqRdJlwJDca9u6BK9jX1bxNThBSFS/MN2VmlYzulOnqH4zAC87jTWNg/czg== dependencies: "@babel/core" "^7.11.0" - "@vue/babel-preset-app" "^4.5.13" - "@vue/cli-shared-utils" "^4.5.13" + "@vue/babel-preset-app" "^4.5.11" + "@vue/cli-shared-utils" "^4.5.11" babel-loader "^8.1.0" cache-loader "^4.1.0" thread-loader "^2.1.3" webpack "^4.0.0" -"@vue/cli-plugin-router@^4.5.13": - version "4.5.13" - resolved "https://registry.yarnpkg.com/@vue/cli-plugin-router/-/cli-plugin-router-4.5.13.tgz#0b67c8898a2bf132941919a2a2e5f3aacbd9ffbe" - integrity sha512-tgtMDjchB/M1z8BcfV4jSOY9fZSMDTPgF9lsJIiqBWMxvBIsk9uIZHxp62DibYME4CCKb/nNK61XHaikFp+83w== +"@vue/cli-plugin-router@^4.5.11": + version "4.5.11" + resolved "https://registry.yarnpkg.com/@vue/cli-plugin-router/-/cli-plugin-router-4.5.11.tgz#3b6df738c5a1a5f50376822bf661d9a3b0c3fa62" + integrity sha512-09tzw3faOs48IUPwLutYaNC7eoyyL140fKruTwdFdXuBLDdSQVida57Brx0zj2UKXc5qF8hk4GoGrOshN0KfNg== dependencies: - "@vue/cli-shared-utils" "^4.5.13" + "@vue/cli-shared-utils" "^4.5.11" -"@vue/cli-plugin-vuex@^4.5.13": - version "4.5.13" - resolved "https://registry.yarnpkg.com/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.5.13.tgz#98646d8bc1e69cf6c6a6cba2fed3eace0356c360" - integrity sha512-I1S9wZC7iI0Wn8kw8Zh+A2Qkf6s1M6vTGBkx8boXjuzfwEEyEHRxadsVCecZc8Mkpydo0nykj+MyYF96TKFuVA== +"@vue/cli-plugin-vuex@^4.5.11": + version "4.5.11" + resolved "https://registry.yarnpkg.com/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.5.11.tgz#f6f619bcfb66c86cc45340d73152844635e548bd" + integrity sha512-JBPeZLubiSHbRkEKDj0tnLiU43AJ3vt6JULn4IKWH1XWZ6MFC8vElaP5/AA4O3Zko5caamDDBq3TRyxdA2ncUQ== "@vue/cli-service@^4.0.0": - version "4.5.13" - resolved "https://registry.yarnpkg.com/@vue/cli-service/-/cli-service-4.5.13.tgz#a09e684a801684b6e24e5414ad30650970eec9ed" - integrity sha512-CKAZN4iokMMsaUyJRU22oUAz3oS/X9sVBSKAF2/shFBV5xh3jqAlKl8OXZYz4cXGFLA6djNuYrniuLAo7Ku97A== + version "4.5.11" + resolved "https://registry.yarnpkg.com/@vue/cli-service/-/cli-service-4.5.11.tgz#b157e2eee2351889cbbd4ccb4a4a9d8575409175" + integrity sha512-FXeJh2o6B8q/njv2Ebhe9EsLXt9sPMXGDY5zVvcV5jgj9wkoej9yLfnmwWCau5kegNClP6bcM+BEHuMYxJ+ubQ== dependencies: "@intervolga/optimize-cssnano-plugin" "^1.0.5" "@soda/friendly-errors-webpack-plugin" "^1.7.1" @@ -2339,10 +2206,10 @@ "@types/minimist" "^1.2.0" "@types/webpack" "^4.0.0" "@types/webpack-dev-server" "^3.11.0" - "@vue/cli-overlay" "^4.5.13" - "@vue/cli-plugin-router" "^4.5.13" - "@vue/cli-plugin-vuex" "^4.5.13" - "@vue/cli-shared-utils" "^4.5.13" + "@vue/cli-overlay" "^4.5.11" + "@vue/cli-plugin-router" "^4.5.11" + "@vue/cli-plugin-vuex" "^4.5.11" + "@vue/cli-shared-utils" "^4.5.11" "@vue/component-compiler-utils" "^3.1.2" "@vue/preload-webpack-plugin" "^1.1.0" "@vue/web-component-wrapper" "^1.2.0" @@ -2377,8 +2244,8 @@ pnp-webpack-plugin "^1.6.4" portfinder "^1.0.26" postcss-loader "^3.0.0" - ssri "^8.0.1" - terser-webpack-plugin "^1.4.4" + ssri "^7.1.0" + terser-webpack-plugin "^2.3.6" thread-loader "^2.1.3" url-loader "^2.2.0" vue-loader "^15.9.2" @@ -2391,10 +2258,10 @@ optionalDependencies: vue-loader-v16 "npm:vue-loader@^16.1.0" -"@vue/cli-shared-utils@^4.5.13": - version "4.5.13" - resolved "https://registry.yarnpkg.com/@vue/cli-shared-utils/-/cli-shared-utils-4.5.13.tgz#acd40f31b4790f1634292bdaa5fca95dc1e0ff50" - integrity sha512-HpnOrkLg42RFUsQGMJv26oTG3J3FmKtO2WSRhKIIL+1ok3w9OjGCtA3nMMXN27f9eX14TqO64M36DaiSZ1fSiw== +"@vue/cli-shared-utils@^4.5.11": + version "4.5.11" + resolved "https://registry.yarnpkg.com/@vue/cli-shared-utils/-/cli-shared-utils-4.5.11.tgz#fff71673ee9128f998c691515b9d327071b4f41e" + integrity sha512-+aaQ+ThQG3+WMexfSWNl0y6f43edqVqRNbguE53F3TIH81I7saS5S750ayqXhZs2r6STJJyqorQnKtAWfHo29A== dependencies: "@hapi/joi" "^15.0.1" chalk "^2.4.2" @@ -2628,17 +2495,6 @@ abstract-leveldown@^5.0.0, abstract-leveldown@~5.0.0: dependencies: xtend "~4.0.0" -abstract-leveldown@^6.2.1: - version "6.3.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" - integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== - dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - abstract-leveldown@~2.6.0: version "2.6.3" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8" @@ -2646,17 +2502,6 @@ abstract-leveldown@~2.6.0: dependencies: xtend "~4.0.0" -abstract-leveldown@~6.2.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" - integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ== - dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" @@ -2712,6 +2557,14 @@ agent-base@6: dependencies: debug "4" +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" @@ -2732,10 +2585,10 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.6.1, ajv@ json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.1: - version "8.5.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.5.0.tgz#695528274bcb5afc865446aa275484049a18ae4b" - integrity sha512-Y2l399Tt1AguU3BPRP9Fn4eN+Or+StUGWCUpbnFyXSo8NZ9S4uj+AG2pjs5apK+ZMOwYOz1+a+VKvKH7CudXgQ== +ajv@^7.0.2: + version "7.1.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.1.0.tgz#f982ea7933dc7f1012eae9eec5a86687d805421b" + integrity sha512-svS9uILze/cXbH0z2myCK2Brqprx/+JJYK5pHicT/GQiBfzzhUVAIT6MwqJg8y4xV/zoGsUeuPuwtoiKSGE15g== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -2773,17 +2626,24 @@ ansi-escapes@^3.2.0: integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== ansi-escapes@^4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== dependencies: - type-fest "^0.21.3" + type-fest "^0.11.0" ansi-html@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= +ansi-red@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" + integrity sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw= + dependencies: + ansi-wrap "0.1.0" + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -2823,15 +2683,20 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-wrap@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" + integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= + antlr4@4.7.1: version "4.7.1" resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.7.1.tgz#69984014f096e9e775f53dd9744bf994d8959773" integrity sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ== antlr4@^4.7.1: - version "4.9.2" - resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.9.2.tgz#abbc53d275954b1b6f4d8b3468b4a2cb258121fc" - integrity sha512-UjMSlenUORL+a+6g4RNZxRh5LcFWybRi2g0ASDBpgXBY6nlavg0BRVAVEQF0dz8jH6SyX3lV7uP5y/krJzc+Hw== + version "4.9.1" + resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.9.1.tgz#cd9cc8d96c9d8bc5b758fe9e02f4066f46fc287e" + integrity sha512-sBI/Pf2aF5leFoAqx3S0if6IGX4vKDsWPHkVt0PfvZb8BnxrrVkNP4Tczc5cp/ZduhfNXvdQTOKRy7ihbql76g== any-promise@^1.0.0: version "1.3.0" @@ -2846,10 +2711,10 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@^3.0.0, anymatch@~3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -3015,7 +2880,7 @@ async-each@^1.0.1: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== -async-eventemitter@^0.2.2, async-eventemitter@^0.2.4: +async-eventemitter@^0.2.2: version "0.2.4" resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== @@ -3061,6 +2926,13 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +autolinker@~0.28.0: + version "0.28.1" + resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-0.28.1.tgz#0652b491881879f0775dace0cdca3233942a4e47" + integrity sha1-BlK0kYgYefB3XazgzcoyM5QqTkc= + dependencies: + gulp-header "^1.7.1" + autoprefixer@^9.8.6: version "9.8.6" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" @@ -3303,30 +3175,6 @@ babel-plugin-dynamic-import-node@^2.3.3: dependencies: object.assign "^4.1.0" -babel-plugin-polyfill-corejs2@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz#686775bf9a5aa757e10520903675e3889caeedc4" - integrity sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg== - dependencies: - "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.2.0" - semver "^6.1.1" - -babel-plugin-polyfill-corejs3@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz#f4b4bb7b19329827df36ff56f6e6d367026cb7a2" - integrity sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.0" - core-js-compat "^3.9.1" - -babel-plugin-polyfill-regenerator@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz#853f5f5716f4691d98c84f8069c7636ea8da7ab8" - integrity sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.0" - babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" @@ -3679,9 +3527,9 @@ backoff@^2.5.0: precond "0.2" balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= base-x@^3.0.2, base-x@^3.0.8: version "3.0.8" @@ -3809,14 +3657,14 @@ bn.js@4.11.6: integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU= bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.4.0, bn.js@^4.8.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + version "4.11.9" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" + integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2: - version "5.2.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" - integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + version "5.1.3" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" + integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== body-parser@1.19.0, body-parser@^1.16.0: version "1.19.0" @@ -3977,16 +3825,16 @@ browserslist@^3.2.6: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.6: - version "4.16.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" - integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.1: + version "4.16.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717" + integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== dependencies: - caniuse-lite "^1.0.30001219" - colorette "^1.2.2" - electron-to-chromium "^1.3.723" + caniuse-lite "^1.0.30001181" + colorette "^1.2.1" + electron-to-chromium "^1.3.649" escalade "^3.1.1" - node-releases "^1.1.71" + node-releases "^1.1.70" bs58@^4.0.0: version "4.0.1" @@ -4126,6 +3974,30 @@ cacache@^12.0.2, cacache@^12.0.3: unique-filename "^1.1.1" y18n "^4.0.0" +cacache@^13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c" + integrity sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w== + dependencies: + chownr "^1.1.2" + figgy-pudding "^3.5.1" + fs-minipass "^2.0.0" + glob "^7.1.4" + graceful-fs "^4.2.2" + infer-owner "^1.0.4" + lru-cache "^5.1.1" + minipass "^3.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + p-map "^3.0.0" + promise-inflight "^1.0.1" + rimraf "^2.7.1" + ssri "^7.0.0" + unique-filename "^1.1.1" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -4257,15 +4129,15 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001219: - version "1.0.30001228" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz#bfdc5942cd3326fa51ee0b42fbef4da9d492a7fa" - integrity sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001181: + version "1.0.30001187" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001187.tgz#5706942631f83baa5a0218b7dfa6ced29f845438" + integrity sha512-w7/EP1JRZ9552CyrThUnay2RkZ1DXxKe/Q2swTC4+LElLh9RRYrL1Z+27LlakB8kzY0fSmHw9mc7XYDUKAKWMA== case-sensitive-paths-webpack-plugin@^2.3.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" - integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== + version "2.3.0" + resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7" + integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ== caseless@~0.12.0: version "0.12.0" @@ -4288,15 +4160,15 @@ chai-as-promised@^7.1.1: check-error "^1.0.2" chai@^4.2.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" - integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA== + version "4.3.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.0.tgz#5523a5faf7f819c8a92480d70a8cccbadacfc25f" + integrity sha512-/BFd2J30EcOwmdOgXvVsmM48l0Br0nmZPlO0uOW4XKh6kpsUumRXBgPV+IlaqFaqr9cYbeoZAM1Npx0i4A+aiA== dependencies: assertion-error "^1.1.0" check-error "^1.0.2" deep-eql "^3.0.1" get-func-name "^2.0.0" - pathval "^1.1.1" + pathval "^1.1.0" type-detect "^4.0.5" chalk@^1.1.1, chalk@^1.1.3: @@ -4320,9 +4192,9 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4 supports-color "^5.3.0" chalk@^4.0.0, chalk@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" - integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" @@ -4403,15 +4275,17 @@ chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" -chownr@^1.1.1: +chownr@^1.1.1, chownr@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" ci-info@^2.0.0: version "2.0.0" @@ -4459,6 +4333,11 @@ clean-css@4.2.x: dependencies: source-map "~0.6.0" +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" @@ -4467,21 +4346,21 @@ cli-cursor@^2.1.0: restore-cursor "^2.0.0" cli-highlight@^2.1.4: - version "2.1.11" - resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf" - integrity sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg== + version "2.1.10" + resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.10.tgz#26a087da9209dce4fcb8cf5427dc97cd96ac173a" + integrity sha512-CcPFD3JwdQ2oSzy+AMG6j3LRTkNjM82kzcSKzoVw6cLanDCJNlsLjeqVTOTfOfucnWv5F0rmBemVf1m9JiIasw== dependencies: chalk "^4.0.0" - highlight.js "^10.7.1" + highlight.js "^10.0.0" mz "^2.4.0" parse5 "^5.1.1" parse5-htmlparser2-tree-adapter "^6.0.0" yargs "^16.0.0" cli-spinners@^2.0.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.0.tgz#36c7dc98fb6a9a76bd6238ec3f77e2425627e939" - integrity sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q== + version "2.5.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.5.0.tgz#12763e47251bf951cb75c201dfa58ff1bcb2d047" + integrity sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ== cli-table3@^0.6.0: version "0.6.0" @@ -4583,6 +4462,11 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= +coffee-script@^1.12.4: + version "1.12.7" + resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.12.7.tgz#c05dae0cb79591d05b3070a8433a98c9a89ccc53" + integrity sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw== + collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -4616,9 +4500,9 @@ color-name@^1.0.0, color-name@~1.1.4: integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^1.5.4: - version "1.5.5" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.5.tgz#65474a8f0e7439625f3d27a6a19d89fc45223014" - integrity sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg== + version "1.5.4" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.4.tgz#dd51cd25cfee953d138fe4002372cc3d0e504cb6" + integrity sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw== dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" @@ -4631,10 +4515,10 @@ color@^3.0.0: color-convert "^1.9.1" color-string "^1.5.4" -colorette@^1.1.0, colorette@^1.2.1, colorette@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" - integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== +colorette@^1.1.0, colorette@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" + integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== colors@^1.1.2, colors@^1.4.0: version "1.4.0" @@ -4734,7 +4618,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.0, concat-stream@^1.5.1: +concat-stream@^1.5.0, concat-stream@^1.5.1, concat-stream@^1.5.2: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -4744,6 +4628,13 @@ concat-stream@^1.5.0, concat-stream@^1.5.1: readable-stream "^2.2.2" typedarray "^0.0.6" +concat-with-sourcemaps@*: + version "1.1.0" + resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz#d4ea93f05ae25790951b99e7b3b09e3908a4082e" + integrity sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg== + dependencies: + source-map "^0.6.1" + connect-history-api-fallback@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" @@ -4859,18 +4750,18 @@ copy-webpack-plugin@^5.1.1: serialize-javascript "^4.0.0" webpack-log "^2.0.0" -core-js-compat@^3.6.5, core-js-compat@^3.9.0, core-js-compat@^3.9.1: - version "3.12.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.12.1.tgz#2c302c4708505fa7072b0adb5156d26f7801a18b" - integrity sha512-i6h5qODpw6EsHAoIdQhKoZdWn+dGBF3dSS8m5tif36RlWvW3A6+yu2S16QHUo3CrkzrnEskMAt9f8FxmY9fhWQ== +core-js-compat@^3.6.5, core-js-compat@^3.8.0: + version "3.8.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.8.3.tgz#9123fb6b9cad30f0651332dc77deba48ef9b0b3f" + integrity sha512-1sCb0wBXnBIL16pfFG1Gkvei6UzvKyTNYpiC41yrdjEv0UoJoq9E/abTMzyYJ6JpTkAj15dLjbqifIzEBDVvog== dependencies: - browserslist "^4.16.6" + browserslist "^4.16.1" semver "7.0.0" core-js-pure@^3.0.1: - version "3.12.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.12.1.tgz#934da8b9b7221e2a2443dc71dfa5bd77a7ea00b8" - integrity sha512-1cch+qads4JnDSWsvc7d6nzlKAippwjUlf6vykkTLW53VSV+NkE6muGBToAjEA8pG90cSfcud3JgVmW2ds5TaQ== + version "3.8.3" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.8.3.tgz#10e9e3b2592ecaede4283e8f3ad7020811587c02" + integrity sha512-V5qQZVAr9K0xu7jXg1M7qTEwuxUgqr7dUOezGaNa7i+Xn9oXAU/d1fzqD9ObuwpVQOaorO5s70ckyi1woP9lVA== core-js@^2.4.0, core-js@^2.5.0: version "2.6.12" @@ -4878,9 +4769,9 @@ core-js@^2.4.0, core-js@^2.5.0: integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-js@^3.3.2, core-js@^3.6.5: - version "3.12.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.12.1.tgz#6b5af4ff55616c08a44d386f1f510917ff204112" - integrity sha512-Ne9DKPHTObRuB09Dru5AjwKjY4cJHVGu+y5f7coGn1E9Grkc3p2iBwE9AI/nJzsE29mQF7oq+mhYYRqOMFN1Bw== + version "3.8.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.8.3.tgz#c21906e1f14f3689f93abcc6e26883550dd92dd0" + integrity sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -4905,14 +4796,6 @@ cosmiconfig@^5.0.0, cosmiconfig@^5.0.7: js-yaml "^3.13.1" parse-json "^4.0.0" -crc-32@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208" - integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA== - dependencies: - exit-on-epipe "~1.0.1" - printj "~1.1.0" - create-ecdh@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" @@ -5058,9 +4941,9 @@ css-tree@1.0.0-alpha.37: source-map "^0.6.1" css-tree@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + version "1.1.2" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.2.tgz#9ae393b5dafd7dae8a622475caec78d3d8fbd7b5" + integrity sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ== dependencies: mdn-data "2.0.14" source-map "^0.6.1" @@ -5075,10 +4958,10 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-default@^4.0.0, cssnano-preset-default@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz#920622b1fc1e95a34e8838203f1397a504f2d3ff" - integrity sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ== +cssnano-preset-default@^4.0.0, cssnano-preset-default@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== dependencies: css-declaration-sorter "^4.0.1" cssnano-util-raw-cache "^4.0.1" @@ -5108,7 +4991,7 @@ cssnano-preset-default@^4.0.0, cssnano-preset-default@^4.0.8: postcss-ordered-values "^4.1.2" postcss-reduce-initial "^4.0.3" postcss-reduce-transforms "^4.0.2" - postcss-svgo "^4.0.3" + postcss-svgo "^4.0.2" postcss-unique-selectors "^4.0.1" cssnano-util-get-arguments@^4.0.0: @@ -5134,12 +5017,12 @@ cssnano-util-same-parent@^4.0.0: integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== cssnano@^4.0.0, cssnano@^4.1.10: - version "4.1.11" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.11.tgz#c7b5f5b81da269cb1fd982cb960c1200910c9a99" - integrity sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g== + version "4.1.10" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== dependencies: cosmiconfig "^5.0.0" - cssnano-preset-default "^4.0.8" + cssnano-preset-default "^4.0.7" is-resolvable "^1.0.0" postcss "^7.0.0" @@ -5330,14 +5213,6 @@ deferred-leveldown@~4.0.0: abstract-leveldown "~5.0.0" inherits "^2.0.3" -deferred-leveldown@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" - integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw== - dependencies: - abstract-leveldown "~6.2.1" - inherits "^2.0.3" - define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -5421,9 +5296,14 @@ detect-indent@^4.0.0: repeating "^2.0.0" detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + +diacritics-map@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/diacritics-map/-/diacritics-map-0.1.0.tgz#6dfc0ff9d01000a2edf2865371cac316e94977af" + integrity sha1-bfwP+dAQAKLt8oZTccrDFulJd68= diff@3.5.0: version "3.5.0" @@ -5526,9 +5406,9 @@ domelementtype@1, domelementtype@^1.3.1: integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== domelementtype@^2.0.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" - integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== + version "2.1.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e" + integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w== domhandler@^2.3.0: version "2.4.2" @@ -5558,9 +5438,9 @@ dotenv-expand@^5.1.0: integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== dotenv@^8.2.0: - version "8.6.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" - integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== + version "8.2.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" + integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== dotignore@~0.1.2: version "0.1.2" @@ -5619,10 +5499,10 @@ ejs@^2.6.1: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== -electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.723: - version "1.3.734" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.734.tgz#c8d318a4eb27509190cf3a08870dbcbf06c74dcb" - integrity sha512-iQF2mjPZ6zNNq45kbJ6MYZYCBNdv2JpGiJC/lVx4tGJWi9MNg73KkL9sWGN4X4I/CP2SBLWsT8nPADZZpAHIyw== +electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.649: + version "1.3.665" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.665.tgz#6d0937376f6a919c0f289202c4be77790a6175e5" + integrity sha512-LIjx1JheOz7LM8DMEQ2tPnbBzJ4nVG1MKutsbEMLnJfwfVdPIsyagqfLp56bOWhdBrYGXWHaTayYkllIU2TauA== elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3: version "6.5.4" @@ -5647,10 +5527,10 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== +emoji-regex@^9.2.1: + version "9.2.1" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.1.tgz#c9b25604256bb3428964bead3ab63069d736f7ee" + integrity sha512-117l1H6U4X3Krn+MrzYrL57d5H7siRHWraBs7s+LjRuFK7Fe7hJqnJ0skWlinqsycVLU5YAo6L8CsEYQ0V5prg== emojis-list@^2.0.0: version "2.1.0" @@ -5678,16 +5558,6 @@ encoding-down@5.0.4, encoding-down@~5.0.0: level-errors "^2.0.0" xtend "^4.0.1" -encoding-down@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" - integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== - dependencies: - abstract-leveldown "^6.2.1" - inherits "^2.0.3" - level-codec "^9.0.0" - level-errors "^2.0.0" - encoding@^0.1.11: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" @@ -5734,9 +5604,9 @@ entities@~2.0.0: integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== env-paths@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" - integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + version "2.2.0" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" + integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== errno@^0.1.3, errno@~0.1.1, errno@~0.1.7: version "0.1.8" @@ -5759,27 +5629,42 @@ error-stack-parser@^2.0.2: dependencies: stackframe "^1.1.1" -es-abstract@^1.17.0-next.0, es-abstract@^1.17.2, es-abstract@^1.18.0-next.2: - version "1.18.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4" - integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw== +es-abstract@^1.17.0-next.0, es-abstract@^1.17.2: + version "1.17.7" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" + integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-abstract@^1.18.0-next.1: + version "1.18.0-next.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.2.tgz#088101a55f0541f595e7e057199e27ddc8f3a5c2" + integrity sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" - get-intrinsic "^1.1.1" + get-intrinsic "^1.0.2" has "^1.0.3" - has-symbols "^1.0.2" - is-callable "^1.2.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" is-negative-zero "^2.0.1" - is-regex "^1.1.2" - is-string "^1.0.5" + is-regex "^1.1.1" object-inspect "^1.9.0" object-keys "^1.1.1" object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.0" + string.prototype.trimend "^1.0.3" + string.prototype.trimstart "^1.0.3" es-to-primitive@^1.2.1: version "1.2.1" @@ -5882,9 +5767,9 @@ eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3 integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" + integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== eslint@^5.6.0: version "5.16.0" @@ -5929,12 +5814,12 @@ eslint@^5.6.0: text-table "^0.2.0" eslint@^7.16.0: - version "7.26.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.26.0.tgz#d416fdcdcb3236cd8f282065312813f8c13982f6" - integrity sha512-4R1ieRf52/izcZE7AlLy56uIHHDLT74Yzz2Iv2l6kDaYvEu9x+wMB5dZArVL8SYGXSYV2YAg70FcW5Y5nGGNIg== + version "7.20.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.20.0.tgz#db07c4ca4eda2e2316e7aa57ac7fc91ec550bdc7" + integrity sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw== dependencies: "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.1" + "@eslint/eslintrc" "^0.3.0" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -5947,10 +5832,10 @@ eslint@^7.16.0: espree "^7.3.1" esquery "^1.4.0" esutils "^2.0.2" - file-entry-cache "^6.0.1" + file-entry-cache "^6.0.0" functional-red-black-tree "^1.0.1" glob-parent "^5.0.0" - globals "^13.6.0" + globals "^12.1.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" @@ -5958,7 +5843,7 @@ eslint@^7.16.0: js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" - lodash "^4.17.21" + lodash "^4.17.20" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" @@ -6212,14 +6097,14 @@ ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3: setimmediate "^1.0.5" ethereum-waffle@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.3.0.tgz#166a0cc1d3b2925f117b20ef0951b3fe72e38e79" - integrity sha512-4xm3RWAPCu5LlaVxYEg0tG3L7g5ovBw1GY/UebrzZ+OTx22vcPjI+bvelFlGBpkdnO5yOIFXjH2eK59tNAe9IA== + version "3.2.2" + resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.2.2.tgz#dbcdb96ebfa35d4deb6b749906ff7e12f593284f" + integrity sha512-Q8XrcFmQGDKKH0Lr867WA9Rl0oWQGMZcFrFPMV2KBIOkdeQnRlGEJq8RGFxj4MMWWxkoXIoxWgxg7U3qdgddEw== dependencies: - "@ethereum-waffle/chai" "^3.3.0" - "@ethereum-waffle/compiler" "^3.3.0" + "@ethereum-waffle/chai" "^3.2.2" + "@ethereum-waffle/compiler" "^3.2.2" "@ethereum-waffle/mock-contract" "^3.2.2" - "@ethereum-waffle/provider" "^3.3.0" + "@ethereum-waffle/provider" "^3.2.2" ethers "^5.0.1" ethereumjs-abi@0.6.5: @@ -6364,12 +6249,12 @@ ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereum rlp "^2.0.0" safe-buffer "^5.1.1" -ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.2, ethereumjs-util@^7.0.7, ethereumjs-util@^7.0.8, ethereumjs-util@^7.0.9: - version "7.0.10" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.0.10.tgz#5fb7b69fa1fda0acc59634cf39d6b0291180fc1f" - integrity sha512-c/xThw6A+EAnej5Xk5kOzFzyoSnw0WX0tSlZ6pAsfGVvQj3TItaDg9b1+Fz1RJXA+y2YksKwQnuzgt1eY6LKzw== +ethereumjs-util@^7.0.2: + version "7.0.8" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.0.8.tgz#5258762b7b17e3d828e41834948363ff0a703ffd" + integrity sha512-JJt7tDpCAmDPw/sGoFYeq0guOVqT3pTE9xlEbBmc/nlCij3JRCoS2c96SQ6kXVHOT3xWUNLDm5QCJLQaUnVAtQ== dependencies: - "@types/bn.js" "^5.1.0" + "@types/bn.js" "^4.11.3" bn.js "^5.1.2" create-hash "^1.1.2" ethereum-cryptography "^0.1.3" @@ -6430,40 +6315,40 @@ ethereumjs-wallet@0.6.5: uuid "^3.3.2" ethers@^5.0.0, ethers@^5.0.1, ethers@^5.0.18, ethers@^5.0.19, ethers@^5.0.2, ethers@^5.0.26: - version "5.1.4" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.1.4.tgz#8ae973705ed962f8f41dc59693704002a38dd18b" - integrity sha512-EAPQ/fgGRu0PoR/VNFnHTMOtG/IZ0AItdW55C9T8ffmVu0rnyllZL404eBF66elJehOLz2kxnUrhXpE7TCpW7g== - dependencies: - "@ethersproject/abi" "5.1.2" - "@ethersproject/abstract-provider" "5.1.0" - "@ethersproject/abstract-signer" "5.1.0" - "@ethersproject/address" "5.1.0" - "@ethersproject/base64" "5.1.0" - "@ethersproject/basex" "5.1.0" - "@ethersproject/bignumber" "5.1.1" - "@ethersproject/bytes" "5.1.0" - "@ethersproject/constants" "5.1.0" - "@ethersproject/contracts" "5.1.1" - "@ethersproject/hash" "5.1.0" - "@ethersproject/hdnode" "5.1.0" - "@ethersproject/json-wallets" "5.1.0" - "@ethersproject/keccak256" "5.1.0" - "@ethersproject/logger" "5.1.0" - "@ethersproject/networks" "5.1.0" - "@ethersproject/pbkdf2" "5.1.0" - "@ethersproject/properties" "5.1.0" - "@ethersproject/providers" "5.1.2" - "@ethersproject/random" "5.1.0" - "@ethersproject/rlp" "5.1.0" - "@ethersproject/sha2" "5.1.0" - "@ethersproject/signing-key" "5.1.0" - "@ethersproject/solidity" "5.1.0" - "@ethersproject/strings" "5.1.0" - "@ethersproject/transactions" "5.1.1" - "@ethersproject/units" "5.1.0" - "@ethersproject/wallet" "5.1.0" - "@ethersproject/web" "5.1.0" - "@ethersproject/wordlists" "5.1.0" + version "5.0.31" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.0.31.tgz#60e3b1425864fe5d2babc147ede01be8382a7d2a" + integrity sha512-zpq0YbNFLFn+t+ibS8UkVWFeK5w6rVMSvbSHrHAQslfazovLnQ/mc2gdN5+6P45/k8fPgHrfHrYvJ4XvyK/S1A== + dependencies: + "@ethersproject/abi" "5.0.12" + "@ethersproject/abstract-provider" "5.0.9" + "@ethersproject/abstract-signer" "5.0.13" + "@ethersproject/address" "5.0.10" + "@ethersproject/base64" "5.0.8" + "@ethersproject/basex" "5.0.8" + "@ethersproject/bignumber" "5.0.14" + "@ethersproject/bytes" "5.0.10" + "@ethersproject/constants" "5.0.9" + "@ethersproject/contracts" "5.0.11" + "@ethersproject/hash" "5.0.11" + "@ethersproject/hdnode" "5.0.9" + "@ethersproject/json-wallets" "5.0.11" + "@ethersproject/keccak256" "5.0.8" + "@ethersproject/logger" "5.0.9" + "@ethersproject/networks" "5.0.8" + "@ethersproject/pbkdf2" "5.0.8" + "@ethersproject/properties" "5.0.8" + "@ethersproject/providers" "5.0.23" + "@ethersproject/random" "5.0.8" + "@ethersproject/rlp" "5.0.8" + "@ethersproject/sha2" "5.0.8" + "@ethersproject/signing-key" "5.0.10" + "@ethersproject/solidity" "5.0.9" + "@ethersproject/strings" "5.0.9" + "@ethersproject/transactions" "5.0.10" + "@ethersproject/units" "5.0.10" + "@ethersproject/wallet" "5.0.11" + "@ethersproject/web" "5.0.13" + "@ethersproject/wordlists" "5.0.9" ethjs-abi@0.2.0: version "0.2.0" @@ -6601,14 +6486,14 @@ eventemitter3@^4.0.0: integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== events@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + version "3.2.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" + integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== eventsource@^1.0.7: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf" - integrity sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg== + version "1.0.7" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" + integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== dependencies: original "^1.0.0" @@ -6649,11 +6534,6 @@ execa@^3.3.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" -exit-on-epipe@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" - integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== - expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -6667,6 +6547,13 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= + dependencies: + fill-range "^2.1.0" + express@^4.14.0, express@^4.16.3, express@^4.17.1: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" @@ -6815,9 +6702,9 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fastq@^1.6.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" - integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g== + version "1.10.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.10.1.tgz#8b8f2ac8bf3632d67afcd65dac248d5fdc45385e" + integrity sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA== dependencies: reusify "^1.0.4" @@ -6854,10 +6741,10 @@ file-entry-cache@^5.0.1: dependencies: flat-cache "^2.0.1" -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== +file-entry-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.0.tgz#7921a89c391c6d93efec2169ac6bf300c527ea0a" + integrity sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA== dependencies: flat-cache "^3.0.4" @@ -6879,6 +6766,17 @@ filesize@^3.6.1: resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== +fill-range@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^3.0.0" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -6981,13 +6879,6 @@ find-yarn-workspace-root@^1.2.1: fs-extra "^4.0.3" micromatch "^3.1.4" -find-yarn-workspace-root@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" - integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== - dependencies: - micromatch "^4.0.2" - flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" @@ -7048,9 +6939,9 @@ follow-redirects@1.5.10: debug "=3.1.0" follow-redirects@^1.0.0, follow-redirects@^1.10.0, follow-redirects@^1.12.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" - integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== + version "1.13.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.2.tgz#dd73c8effc12728ba5cf4259d760ea5fb83e3147" + integrity sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA== for-each@^0.3.3, for-each@~0.3.3: version "0.3.3" @@ -7167,6 +7058,13 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.6.0" +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + fs-write-stream-atomic@^1.0.8: version "1.0.10" resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" @@ -7225,7 +7123,7 @@ functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -ganache-core@^2.13.2: +ganache-core@^2.10.2: version "2.13.2" resolved "https://registry.yarnpkg.com/ganache-core/-/ganache-core-2.13.2.tgz#27e6fc5417c10e6e76e2e646671869d7665814a3" integrity sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw== @@ -7283,7 +7181,7 @@ gaze@^1.0.0: dependencies: globule "^1.0.0" -gensync@^1.0.0-beta.2: +gensync@^1.0.0-beta.1: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== @@ -7303,7 +7201,7 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: +get-intrinsic@^1.0.2: version "1.1.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== @@ -7362,9 +7260,9 @@ glob-parent@^3.1.0: path-dirname "^1.0.0" glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== dependencies: is-glob "^4.0.1" @@ -7385,7 +7283,7 @@ glob@7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.1.6: +glob@7.1.6, glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.1, glob@~7.1.2, glob@~7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -7397,18 +7295,6 @@ glob@7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.1, glob@~7.1.2, glob@~7.1.6: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - global@~4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" @@ -7429,13 +7315,6 @@ globals@^12.1.0: dependencies: type-fest "^0.8.1" -globals@^13.6.0: - version "13.8.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.8.0.tgz#3e20f504810ce87a8d72e55aecf8435b50f4c1b3" - integrity sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q== - dependencies: - type-fest "^0.20.2" - globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -7456,9 +7335,9 @@ globby@10.0.1: slash "^3.0.0" globby@^11.0.1: - version "11.0.3" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" - integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== + version "11.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.2.tgz#1af538b766a3b540ebfb58a32b2e2d5897321d83" + integrity sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og== dependencies: array-union "^2.1.0" dir-glob "^3.0.1" @@ -7550,7 +7429,7 @@ got@^7.1.0: url-parse-lax "^1.0.0" url-to-options "^1.0.1" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.2: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== @@ -7560,11 +7439,31 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= +gray-matter@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-2.1.1.tgz#3042d9adec2a1ded6a7707a9ed2380f8a17a430e" + integrity sha1-MELZrewqHe1qdwep7SOA+KF6Qw4= + dependencies: + ansi-red "^0.1.1" + coffee-script "^1.12.4" + extend-shallow "^2.0.1" + js-yaml "^3.8.1" + toml "^2.3.2" + growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== +gulp-header@^1.7.1: + version "1.8.12" + resolved "https://registry.yarnpkg.com/gulp-header/-/gulp-header-1.8.12.tgz#ad306be0066599127281c4f8786660e705080a84" + integrity sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ== + dependencies: + concat-with-sourcemaps "*" + lodash.template "^4.4.0" + through2 "^2.0.0" + gzip-size@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" @@ -7578,6 +7477,18 @@ handle-thing@^2.0.0: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== +handlebars@4.7.6: + version "4.7.6" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e" + integrity sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.0" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + handlebars@^4.7.6: version "4.7.7" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" @@ -7604,31 +7515,27 @@ har-validator@~5.1.3: har-schema "^2.0.0" hardhat-contract-sizer@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/hardhat-contract-sizer/-/hardhat-contract-sizer-2.0.3.tgz#604455fd803865f81c29f60364e863eaa19395a7" - integrity sha512-iaixOzWxwOSIIE76cl2uk4m9VXI1hKU3bFt+gl7jDhyb2/JB2xOp5wECkfWqAoc4V5lD4JtjldZlpSTbzX+nPQ== + version "2.0.2" + resolved "https://registry.yarnpkg.com/hardhat-contract-sizer/-/hardhat-contract-sizer-2.0.2.tgz#735e00c4776188683886226b9b37dfe75cbd16fa" + integrity sha512-6vDj3OoqPvzuEnURY2lN6veFXH8uIBRgnaIJoN7cpn7ENuciIR3qotNgLtbC6BNp4y0Cn/8FeMfKS6MdAvIdgQ== dependencies: cli-table3 "^0.6.0" colors "^1.4.0" hardhat-typechain@^0.3.3: - version "0.3.5" - resolved "https://registry.yarnpkg.com/hardhat-typechain/-/hardhat-typechain-0.3.5.tgz#8e50616a9da348b33bd001168c8fda9c66b7b4af" - integrity sha512-w9lm8sxqTJACY+V7vijiH+NkPExnmtiQEjsV9JKD1KgMdVk2q8y+RhvU/c4B7+7b1+HylRUCxpOIvFuB3rE4+w== + version "0.3.4" + resolved "https://registry.yarnpkg.com/hardhat-typechain/-/hardhat-typechain-0.3.4.tgz#6d7d86184152b5a3c83bde0fbbb26224b6fbfd70" + integrity sha512-oI9YSutDfZnRlAV1bYTpLkBHw4rkhz9JDWAEXz2PR34ylpgLWxPFbPiHT5QXadGTlBqJUAT6JSTxCK1kADMkjA== hardhat@^2.0.8: - version "2.3.0" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.3.0.tgz#5c29f8b4d08155c3dc8c908af9713fd5079522d5" - integrity sha512-nc4ro2bM4wPaA6/0Y22o5F5QrifQk2KCyPUUKLPUeFFZoGNGYB8vmeW/k9gV9DdMukdWTzfYlKc2Jn4bfb6tDQ== - dependencies: - "@ethereumjs/block" "^3.2.1" - "@ethereumjs/blockchain" "^5.2.1" - "@ethereumjs/common" "^2.2.0" - "@ethereumjs/tx" "^3.1.3" - "@ethereumjs/vm" "^5.3.2" + version "2.0.10" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.0.10.tgz#9b50da13b6915bb9b61b7f38f8f2b9b352447462" + integrity sha512-ZAcC+9Nb1AEb22/2hWj/zLPyIRLD9y1O3LW2KhbONpxn1bf0qWLW8QegB9J3KP9Bvt8LbW9pWuSyRQJU0vUWqA== + dependencies: + "@nomiclabs/ethereumjs-vm" "4.2.2" "@sentry/node" "^5.18.1" "@solidity-parser/parser" "^0.11.0" - "@types/bn.js" "^5.1.0" + "@types/bn.js" "^4.11.5" "@types/lru-cache" "^5.1.0" abort-controller "^3.0.0" adm-zip "^0.4.16" @@ -7642,7 +7549,11 @@ hardhat@^2.0.8: eth-sig-util "^2.5.2" ethereum-cryptography "^0.1.2" ethereumjs-abi "^0.6.8" - ethereumjs-util "^7.0.10" + ethereumjs-account "^3.0.0" + ethereumjs-block "^2.2.2" + ethereumjs-common "^1.5.0" + ethereumjs-tx "^2.1.2" + ethereumjs-util "^6.2.0" find-up "^2.1.0" fp-ts "1.19.3" fs-extra "^7.0.1" @@ -7650,8 +7561,7 @@ hardhat@^2.0.8: immutable "^4.0.0-rc.12" io-ts "1.10.4" lodash "^4.17.11" - merkle-patricia-tree "^4.1.0" - mnemonist "^0.38.0" + merkle-patricia-tree "3.0.0" mocha "^7.1.2" node-fetch "^2.6.0" qs "^6.7.0" @@ -7674,11 +7584,6 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" -has-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -7694,10 +7599,10 @@ has-symbol-support-x@^1.4.1: resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== -has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== has-to-string-tag-x@^1.2.0: version "1.4.1" @@ -7799,10 +7704,10 @@ hex-color-regex@^1.1.0: resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== -highlight.js@^10.7.1: - version "10.7.2" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.2.tgz#89319b861edc66c48854ed1e6da21ea89f847360" - integrity sha512-oFLl873u4usRM9K63j4ME9u3etNF0PLiJhSQ8rdfuL51Wn3zkD6drf9ZW0dOzjnZI22YYG24z30JcmfCZjMgYg== +highlight.js@^10.0.0: + version "10.6.0" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.6.0.tgz#0073aa71d566906965ba6e1b7be7b2682f5e18b6" + integrity sha512-8mlRcn5vk/r4+QcqerapwBYTe+iPL5ih6xrNylxrnBdHQiijDETfXX7VIxC3UiCRiINBJfANBAsPzAvRQj8RpQ== hmac-drbg@^1.0.1: version "1.0.1" @@ -7827,9 +7732,9 @@ hoopy@^0.1.4: integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== hpack.js@^2.1.6: version "2.1.6" @@ -7851,6 +7756,11 @@ hsla-regex@^1.0.0: resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= +html-comment-regex@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" + integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== + html-entities@^1.3.1: version "1.4.0" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" @@ -7966,18 +7876,7 @@ http-proxy-middleware@0.19.1: lodash "^4.17.11" micromatch "^3.1.10" -http-proxy-middleware@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz#43700d6d9eecb7419bf086a128d0f7205d9eb665" - integrity sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg== - dependencies: - "@types/http-proxy" "^1.17.5" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - -http-proxy@^1.17.0, http-proxy@^1.18.1: +http-proxy@^1.17.0: version "1.18.1" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== @@ -8136,12 +8035,17 @@ indent-string@^2.1.0: dependencies: repeating "^2.0.0" +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= -infer-owner@^1.0.3: +infer-owner@^1.0.3, infer-owner@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== @@ -8276,11 +8180,6 @@ is-arrayish@^0.3.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== -is-bigint@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" - integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== - is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -8295,13 +8194,6 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-boolean-object@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8" - integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng== - dependencies: - call-bind "^1.0.2" - is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -8312,7 +8204,7 @@ is-buffer@^2.0.2, is-buffer@~2.0.3: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.3: +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== @@ -8337,9 +8229,9 @@ is-color-stop@^1.0.0: rgba-regex "^1.0.0" is-core-module@^2.2.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" - integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" + integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== dependencies: has "^1.0.3" @@ -8358,9 +8250,9 @@ is-data-descriptor@^1.0.0: kind-of "^6.0.0" is-date-object@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" - integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== is-descriptor@^0.1.0: version "0.1.6" @@ -8386,9 +8278,9 @@ is-directory@^0.3.1: integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= is-docker@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" + integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" @@ -8468,10 +8360,12 @@ is-negative-zero@^2.0.1: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== -is-number-object@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" - integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= + dependencies: + kind-of "^3.0.2" is-number@^3.0.0: version "3.0.0" @@ -8480,6 +8374,11 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -8522,12 +8421,7 @@ is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: is-plain-obj@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-plain-obj@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" - integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" @@ -8548,13 +8442,13 @@ is-reference@^1.2.1: dependencies: "@types/estree" "*" -is-regex@^1.0.4, is-regex@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" - integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== +is-regex@^1.0.4, is-regex@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" + integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== dependencies: call-bind "^1.0.2" - has-symbols "^1.0.2" + has-symbols "^1.0.1" is-regex@~1.0.5: version "1.0.5" @@ -8583,17 +8477,19 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== -is-string@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" - integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== +is-svg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== + dependencies: + html-comment-regex "^1.1.0" -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== dependencies: - has-symbols "^1.0.2" + has-symbols "^1.0.1" is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" @@ -8676,9 +8572,17 @@ isurl@^1.0.0-alpha5: is-object "^1.0.1" javascript-stringify@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz#27c76539be14d8bd128219a2d731b09337904e79" - integrity sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg== + version "2.0.1" + resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.0.1.tgz#6ef358035310e35d667c675ed63d3eb7c1aa19e5" + integrity sha512-yV+gqbd5vaOYjqlbk16EG89xB5udgjqQF3C5FAORDg4f/IS1Yc5ERCv5e/57yBcfJYw05V5JyIXabhwb75Xxow== + +jest-worker@^25.4.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" + integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw== + dependencies: + merge-stream "^2.0.0" + supports-color "^7.0.0" jest-worker@^26.2.1: version "26.6.2" @@ -8746,7 +8650,7 @@ js-yaml@4.0.0: dependencies: argparse "^2.0.1" -js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1: +js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.8.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -9009,6 +8913,13 @@ launch-editor@^2.2.1: chalk "^2.3.0" shell-quote "^1.6.1" +lazy-cache@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" + integrity sha1-uRkKT5EzVGlIQIWfio9whNiCImQ= + dependencies: + set-getter "^0.1.0" + lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -9028,11 +8939,6 @@ level-codec@~7.0.0: resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7" integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ== -level-concat-iterator@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263" - integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== - level-errors@^1.0.3: version "1.1.2" resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d" @@ -9082,15 +8988,6 @@ level-iterator-stream@~3.0.0: readable-stream "^2.3.6" xtend "^4.0.0" -level-iterator-stream@~4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c" - integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== - dependencies: - inherits "^2.0.4" - readable-stream "^3.4.0" - xtend "^4.0.2" - level-mem@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-3.0.1.tgz#7ce8cf256eac40f716eb6489654726247f5a89e5" @@ -9099,22 +8996,6 @@ level-mem@^3.0.1: level-packager "~4.0.0" memdown "~3.0.0" -level-mem@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d" - integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg== - dependencies: - level-packager "^5.0.3" - memdown "^5.0.0" - -level-packager@^5.0.3: - version "5.1.1" - resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" - integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== - dependencies: - encoding-down "^6.3.0" - levelup "^4.3.2" - level-packager@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-4.0.1.tgz#7e7d3016af005be0869bc5fa8de93d2a7f56ffe6" @@ -9146,13 +9027,6 @@ level-sublevel@6.6.4: typewiselite "~1.0.0" xtend "~4.0.0" -level-supports@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d" - integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg== - dependencies: - xtend "^4.0.2" - level-ws@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b" @@ -9170,15 +9044,6 @@ level-ws@^1.0.0: readable-stream "^2.2.8" xtend "^4.0.1" -level-ws@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339" - integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA== - dependencies: - inherits "^2.0.3" - readable-stream "^3.1.0" - xtend "^4.0.1" - levelup@3.1.1, levelup@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/levelup/-/levelup-3.1.1.tgz#c2c0b3be2b4dc316647c53b42e2f559e232d2189" @@ -9202,17 +9067,6 @@ levelup@^1.2.1: semver "~5.4.1" xtend "~4.0.0" -levelup@^4.3.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" - integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== - dependencies: - deferred-leveldown "~5.3.0" - level-errors "~2.0.0" - level-iterator-stream "~4.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -9241,6 +9095,16 @@ linkify-it@^3.0.1: dependencies: uc.micro "^1.0.1" +list-item@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/list-item/-/list-item-1.1.1.tgz#0c65d00e287cb663ccb3cb3849a77e89ec268a56" + integrity sha1-DGXQDih8tmPMs8s4Sad+iewmilY= + dependencies: + expand-range "^1.8.1" + extend-shallow "^2.0.1" + is-number "^2.1.0" + repeat-string "^1.5.2" + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -9315,21 +9179,16 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + lodash.assign@^4.0.3, lodash.assign@^4.0.6: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= - lodash.defaultsdeep@^4.6.1: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz#512e9bd721d272d94e3d3a63653fa17516741ca6" @@ -9395,31 +9254,36 @@ lodash.once@^4.0.0: resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= +lodash.template@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.transform@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.transform/-/lodash.transform-4.6.0.tgz#12306422f63324aed8483d3f38332b5f670547a0" integrity sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A= -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= - lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@4.17.20: +lodash@4.17.20, lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.3, lodash@^4.17.4, lodash@~4.17.10: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== -lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.17.4, lodash@~4.17.10: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - log-symbols@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" @@ -9585,6 +9449,29 @@ markdown-it@11.0.0: mdurl "^1.0.1" uc.micro "^1.0.5" +markdown-link@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/markdown-link/-/markdown-link-0.1.1.tgz#32c5c65199a6457316322d1e4229d13407c8c7cf" + integrity sha1-MsXGUZmmRXMWMi0eQinRNAfIx88= + +markdown-toc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/markdown-toc/-/markdown-toc-1.2.0.tgz#44a15606844490314afc0444483f9e7b1122c339" + integrity sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg== + dependencies: + concat-stream "^1.5.2" + diacritics-map "^0.1.0" + gray-matter "^2.1.0" + lazy-cache "^2.0.2" + list-item "^1.1.1" + markdown-link "^0.1.1" + minimist "^1.2.0" + mixin-deep "^1.1.3" + object.pick "^1.2.0" + remarkable "^1.7.1" + repeat-string "^1.6.1" + strip-color "^0.1.0" + markdownlint-cli@^0.24.0: version "0.24.0" resolved "https://registry.yarnpkg.com/markdownlint-cli/-/markdownlint-cli-0.24.0.tgz#d1c1d43cd53b87aaec93035b3234eef7097139a8" @@ -9617,10 +9504,10 @@ markdownlint@~0.21.0: dependencies: markdown-it "11.0.0" -mcl-wasm@^0.7.1: - version "0.7.7" - resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.7.tgz#fd463dd1641a37f9f55b6ca8e5a38e95be2bc58f" - integrity sha512-jDGiCQA++5hX37gdH6RDZ3ZsA0raet7xyY/R5itj5cbcdf4Gvw+YyxWX/ZZ0Z2UPxJiw1ktRsCJZzpnqlQILdw== +math-random@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" + integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== md5.js@^1.3.4: version "1.3.5" @@ -9663,18 +9550,6 @@ memdown@^1.0.0: ltgt "~2.2.0" safe-buffer "~5.1.1" -memdown@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb" - integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw== - dependencies: - abstract-leveldown "~6.2.1" - functional-red-black-tree "~1.0.1" - immediate "~3.2.3" - inherits "~2.0.1" - ltgt "~2.2.0" - safe-buffer "~5.2.0" - memdown@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/memdown/-/memdown-3.0.0.tgz#93aca055d743b20efc37492e9e399784f2958309" @@ -9773,19 +9648,6 @@ merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: rlp "^2.0.0" semaphore ">=1.0.1" -merkle-patricia-tree@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.1.0.tgz#010636c4cfd68682df33a2e3186b7d0be7b98b9d" - integrity sha512-vmP1J7FwIpprFMVjjSMM1JAwFce85Q+tp0TYIedYv8qaMh2oLUZ3ETXn9wbgi9S6elySzKzGa+Ai6VNKGEwSlg== - dependencies: - "@types/levelup" "^4.3.0" - ethereumjs-util "^7.0.8" - level-mem "^5.0.1" - level-ws "^2.0.0" - readable-stream "^3.6.0" - rlp "^2.2.3" - semaphore-async-await "^1.5.1" - methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -9811,12 +9673,12 @@ micromatch@^3.1.10, micromatch@^3.1.4: to-regex "^3.0.2" micromatch@^4.0.2: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== dependencies: braces "^3.0.1" - picomatch "^2.2.3" + picomatch "^2.0.5" miller-rabin@^4.0.0: version "4.0.1" @@ -9826,17 +9688,22 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.47.0, "mime-db@>= 1.43.0 < 2": - version "1.47.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" - integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== +mime-db@1.45.0: + version "1.45.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" + integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== + +"mime-db@>= 1.43.0 < 2": + version "1.46.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" + integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.30" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" - integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== + version "2.1.28" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd" + integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ== dependencies: - mime-db "1.47.0" + mime-db "1.45.0" mime@1.6.0: version "1.6.0" @@ -9844,9 +9711,9 @@ mime@1.6.0: integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mime@^2.4.4: - version "2.5.2" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" - integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== + version "2.5.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.0.tgz#2b4af934401779806ee98026bb42e8c1ae1876b1" + integrity sha512-ft3WayFSFUVBuJj7BMLKAQcSlItKtfjsKDDsii3rqFDAZ7t11zRe8ASw/GlmivGwVUYtwkQrxiGGpL6gFvB0ag== mimic-fn@^1.0.0: version "1.2.0" @@ -9902,6 +9769,27 @@ minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" @@ -9910,7 +9798,7 @@ minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: safe-buffer "^5.1.2" yallist "^3.0.0" -minipass@^3.1.1: +minipass@^3.0.0, minipass@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== @@ -9940,7 +9828,7 @@ mississippi@^3.0.0: stream-each "^1.1.0" through2 "^2.0.0" -mixin-deep@^1.2.0: +mixin-deep@^1.1.3, mixin-deep@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== @@ -9967,13 +9855,6 @@ mkdirp@0.5.5, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkd dependencies: minimist "^1.2.5" -mnemonist@^0.38.0: - version "0.38.3" - resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.3.tgz#35ec79c1c1f4357cfda2fe264659c2775ccd7d9d" - integrity sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw== - dependencies: - obliterator "^1.6.1" - mocha-steps@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/mocha-steps/-/mocha-steps-1.3.0.tgz#2449231ec45ec56810f65502cb22e2571862957f" @@ -10010,9 +9891,9 @@ mocha@^7.1.2: yargs-unparser "1.6.0" mocha@^8.2.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff" - integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ== + version "8.3.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.3.0.tgz#a83a7432d382ae1ca29686062d7fdc2c36f63fe5" + integrity sha512-TQqyC89V1J/Vxx0DhJIXlq9gbbL9XFNdeLQ1+JsnZsVaSOV1z3tWfw0qZmQJGQRIfkvZcs7snQnZnOCKoldq1Q== dependencies: "@ungap/promise-all-settled" "1.1.2" ansi-colors "4.1.1" @@ -10041,9 +9922,9 @@ mocha@^8.2.0: yargs-unparser "2.0.0" mock-fs@^4.1.0, mock-fs@^4.13.0: - version "4.14.0" - resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" - integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== + version "4.13.0" + resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.13.0.tgz#31c02263673ec3789f90eb7b6963676aa407a598" + integrity sha512-DD0vOdofJdoaRNtnWcrXe6RQbpHkPPmtqGq14uRX0F8ZKJ5nv89CVTYl/BZdppDxBDaV0hl75htg3abpEWlPZA== move-concurrently@^1.0.1: version "1.0.1" @@ -10268,9 +10149,9 @@ node-gyp@^3.8.0: which "1" node-ipc@^9.1.1: - version "9.1.4" - resolved "https://registry.yarnpkg.com/node-ipc/-/node-ipc-9.1.4.tgz#2acf962681afdac2602876d98fe6434d54d9bd3c" - integrity sha512-A+f0mn2KxUt1uRTSd5ktxQUsn2OEhj5evo7NUi/powBzMSZ0vocdzDjlq9QN2v3LH6CJi3e5xAenpZ1QwU5A8g== + version "9.1.3" + resolved "https://registry.yarnpkg.com/node-ipc/-/node-ipc-9.1.3.tgz#1df3f069d103184ae9127fa885dbdaea56a4436f" + integrity sha512-8RS4RZyS/KMKKYG8mrje+cLxwATe9dBCuOiqKFSWND4oOuKytfuKCiR9yinvhoXF/nGdX/WnbywaUee+9U87zA== dependencies: event-pubsub "4.3.0" js-message "1.0.7" @@ -10305,10 +10186,10 @@ node-libs-browser@^2.2.1: util "^0.11.0" vm-browserify "^1.0.1" -node-releases@^1.1.71: - version "1.1.72" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" - integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw== +node-releases@^1.1.70: + version "1.1.70" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.70.tgz#66e0ed0273aa65666d7fe78febe7634875426a08" + integrity sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw== node-sass@^4.13.0: version "4.14.1" @@ -10460,10 +10341,10 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.9.0: - version "1.10.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369" - integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw== +object-inspect@^1.8.0, object-inspect@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" + integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== object-inspect@~1.7.0: version "1.7.0" @@ -10471,11 +10352,11 @@ object-inspect@~1.7.0: integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== object-is@^1.0.1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + version "1.1.4" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.4.tgz#63d6c83c00a43f4cbc9434eb9757c8a5b8565068" + integrity sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.0" define-properties "^1.1.3" object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: @@ -10505,7 +10386,7 @@ object.assign@4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.assign@^4.1.0, object.assign@^4.1.2: +object.assign@^4.1.0, object.assign@^4.1.1, object.assign@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== @@ -10516,15 +10397,15 @@ object.assign@^4.1.0, object.assign@^4.1.2: object-keys "^1.1.1" object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0, object.getownpropertydescriptors@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" - integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz#0dfda8d108074d9c563e80490c883b6661091544" + integrity sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" + es-abstract "^1.18.0-next.1" -object.pick@^1.3.0: +object.pick@^1.2.0, object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= @@ -10532,20 +10413,15 @@ object.pick@^1.3.0: isobject "^3.0.1" object.values@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.3.tgz#eaa8b1e17589f02f698db093f7c62ee1699742ee" - integrity sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw== + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.2.tgz#7a2015e06fcb0f546bd652486ce8583a4731c731" + integrity sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" + es-abstract "^1.18.0-next.1" has "^1.0.3" -obliterator@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-1.6.1.tgz#dea03e8ab821f6c4d96a299e17aef6a3af994ef3" - integrity sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig== - oboe@2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.4.tgz#20c88cdb0c15371bb04119257d4fdd34b0aa49f6" @@ -10598,14 +10474,6 @@ open@^6.3.0: dependencies: is-wsl "^1.1.0" -open@^7.4.2: - version "7.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" - integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== - dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" - opener@^1.5.1: version "1.5.2" resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" @@ -10723,7 +10591,7 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" -p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.1: +p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.1, p-limit@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== @@ -10770,6 +10638,13 @@ p-map@^2.0.0: resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + p-retry@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" @@ -10890,7 +10765,7 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= -patch-package@6.2.2: +patch-package@6.2.2, patch-package@^6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.2.tgz#71d170d650c65c26556f0d0fbbb48d92b6cc5f39" integrity sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg== @@ -10908,25 +10783,6 @@ patch-package@6.2.2: slash "^2.0.0" tmp "^0.0.33" -patch-package@^6.2.2: - version "6.4.7" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.4.7.tgz#2282d53c397909a0d9ef92dae3fdeb558382b148" - integrity sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ== - dependencies: - "@yarnpkg/lockfile" "^1.1.0" - chalk "^2.4.2" - cross-spawn "^6.0.5" - find-yarn-workspace-root "^2.0.0" - fs-extra "^7.0.1" - is-ci "^2.0.0" - klaw-sync "^6.0.0" - minimist "^1.2.0" - open "^7.4.2" - rimraf "^2.6.3" - semver "^5.6.0" - slash "^2.0.0" - tmp "^0.0.33" - path-browserify@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" @@ -11018,15 +10874,15 @@ path@^0.12.7: process "^0.11.1" util "^0.10.3" -pathval@^1.1.1: +pathval@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== pbkdf2@^3.0.17, pbkdf2@^3.0.3, pbkdf2@^3.0.9: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + version "3.1.1" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" + integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -11039,10 +10895,10 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d" - integrity sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg== +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1, picomatch@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== pify@^2.0.0, pify@^2.3.0: version "2.3.0" @@ -11405,18 +11261,21 @@ postcss-selector-parser@^3.0.0: uniq "^1.0.1" postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: - version "6.0.6" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" - integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" + integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== dependencies: cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" util-deprecate "^1.0.2" -postcss-svgo@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e" - integrity sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw== +postcss-svgo@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== dependencies: + is-svg "^3.0.0" postcss "^7.0.0" postcss-value-parser "^3.0.0" svgo "^1.0.0" @@ -11480,18 +11339,18 @@ prepend-http@^2.0.0: integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= prettier-plugin-solidity@^1.0.0-alpha.27, prettier-plugin-solidity@^1.0.0-alpha.60: - version "1.0.0-beta.10" - resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.0.0-beta.10.tgz#f2a249002733826b08d981b599335ddb7e93af8d" - integrity sha512-55UsEbeJfqYKB3RFR7Nvpi+ApEoUfgdKHVg2ZybrbOkRW4RTblyONLL3mEr8Vrxpo7wBbObVLbWodGg4YXIQ7g== + version "1.0.0-beta.5" + resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.0.0-beta.5.tgz#04347bc3fb8deb5d097c9c823cbc01451a40da7a" + integrity sha512-Fd0a+rF/FD7dnN/ZyaSHjH9q/onw6Qd4lzU+nIPj9FoqBkt+WDUYLpiwuVZ/I0i5hZRTVAxiwErp7qmgdyqYpA== dependencies: - "@solidity-parser/parser" "^0.12.1" + "@solidity-parser/parser" "^0.11.0" dir-to-object "^2.0.0" - emoji-regex "^9.2.2" + emoji-regex "^9.2.1" escape-string-regexp "^4.0.0" prettier "^2.2.1" - semver "^7.3.5" - solidity-comments-extractor "^0.0.7" - string-width "^4.2.2" + semver "^7.3.4" + solidity-comments-extractor "^0.0.4" + string-width "^4.2.0" prettier@^1.14.3, prettier@^1.18.2: version "1.19.1" @@ -11499,9 +11358,9 @@ prettier@^1.14.3, prettier@^1.18.2: integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== prettier@^2.1.2, prettier@^2.2.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.0.tgz#b6a5bf1284026ae640f17f7ff5658a7567fc0d18" - integrity sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w== + version "2.2.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" + integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== pretty-error@^2.0.2: version "2.1.2" @@ -11511,11 +11370,6 @@ pretty-error@^2.0.2: lodash "^4.17.20" renderkid "^2.0.4" -printj@~1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" - integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== - private@^0.1.6, private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -11702,11 +11556,9 @@ qs@6.7.0: integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== qs@^6.7.0: - version "6.10.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" - integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== - dependencies: - side-channel "^1.0.4" + version "6.9.6" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" + integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== qs@~6.5.2: version "6.5.2" @@ -11751,9 +11603,18 @@ querystringify@^2.1.1: integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + version "1.2.2" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.2.tgz#abf64491e6ecf0f38a6502403d4cda04f372dfd3" + integrity sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg== + +randomatic@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" + integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.0.6, randombytes@^2.1.0: version "2.1.0" @@ -11855,7 +11716,7 @@ readable-stream@^1.0.33: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^3.0.6, readable-stream@^3.1.0, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -12008,9 +11869,9 @@ regjsparser@^0.1.4: jsesc "~0.5.0" regjsparser@^0.6.4: - version "0.6.9" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.9.tgz#b489eef7c9a2ce43727627011429cf833a7183e6" - integrity sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ== + version "0.6.7" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.7.tgz#c00164e1e6713c2e3ee641f1701c4b7aa0a7f86c" + integrity sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ== dependencies: jsesc "~0.5.0" @@ -12019,6 +11880,14 @@ relateurl@0.2.x: resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= +remarkable@^1.7.1: + version "1.7.4" + resolved "https://registry.yarnpkg.com/remarkable/-/remarkable-1.7.4.tgz#19073cb960398c87a7d6546eaa5e50d2022fcd00" + integrity sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg== + dependencies: + argparse "^1.0.10" + autolinker "~0.28.0" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -12036,11 +11905,11 @@ renderkid@^2.0.4: strip-ansi "^3.0.0" repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.6.1: +repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= @@ -12137,7 +12006,7 @@ resolve@1.17.0, resolve@~1.17.0: dependencies: path-parse "^1.0.6" -resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.8.1: +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.8.1: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -12192,7 +12061,7 @@ rgba-regex@^1.0.0: resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.3: +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -12229,9 +12098,9 @@ rlp@^2.0.0, rlp@^2.2.1, rlp@^2.2.2, rlp@^2.2.3, rlp@^2.2.4: bn.js "^4.11.1" rollup-plugin-copy@^3.3.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-copy/-/rollup-plugin-copy-3.4.0.tgz#f1228a3ffb66ffad8606e2f3fb7ff23141ed3286" - integrity sha512-rGUmYYsYsceRJRqLVlE9FivJMxJ7X6jDlP79fmFkL8sJs7VVMSVyA2yfyL+PGyO/vJs4A87hwhgVfz61njI+uQ== + version "3.3.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-copy/-/rollup-plugin-copy-3.3.0.tgz#5ba230047f86b9f703a29288f242948a5580e7b9" + integrity sha512-euDjCUSBXZa06nqnwCNADbkAcYDfzwowfZQkto9K/TFhiH+QG7I4PUsEMwM9tDgomGWJc//z7KLW8t+tZwxADA== dependencies: "@types/fs-extra" "^8.0.1" colorette "^1.1.0" @@ -12250,9 +12119,9 @@ rollup-plugin-terser@^7.0.0: terser "^5.0.0" rollup@^2.32.1: - version "2.48.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.48.0.tgz#fceb01ed771f991f29f7bd2ff7838146e55acb74" - integrity sha512-wl9ZSSSsi5579oscSDYSzGn092tCS076YB+TQrzsGuSfYyJeep8eEWj0eaRjuC5McuMNmcnR8icBqiE/FWNB1A== + version "2.39.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.39.0.tgz#be4f98c9e421793a8fec82c854fb567c35e22ab6" + integrity sha512-+WR3bttcq7zE+BntH09UxaW3bQo3vItuYeLsyk4dL2tuwbeSKJuvwiawyhEnvRdRgrII0Uzk00FpctHO/zB1kw== optionalDependencies: fsevents "~2.3.1" @@ -12281,9 +12150,9 @@ rustbn.js@~0.2.0: integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== rxjs@^6.4.0: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + version "6.6.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" + integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== dependencies: tslib "^1.9.0" @@ -12351,7 +12220,7 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^2.0.0, schema-utils@^2.5.0, schema-utils@^2.6.1, schema-utils@^2.6.5, schema-utils@^2.7.0: +schema-utils@^2.0.0, schema-utils@^2.5.0, schema-utils@^2.6.1, schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0: version "2.7.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== @@ -12400,23 +12269,18 @@ select-hose@^2.0.0: integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= selfsigned@^1.10.8: - version "1.10.11" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.11.tgz#24929cd906fe0f44b6d01fb23999a739537acbe9" - integrity sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA== + version "1.10.8" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.8.tgz#0d17208b7d12c33f8eac85c41835f27fc3d81a30" + integrity sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w== dependencies: node-forge "^0.10.0" -semaphore-async-await@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" - integrity sha1-hXvvXjZEYBykuVcLh+nfXKEpdPo= - semaphore@>=1.0.1, semaphore@^1.0.3, semaphore@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa" integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA== -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -12426,15 +12290,15 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.2, semver@^7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== +semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== dependencies: lru-cache "^6.0.0" @@ -12520,6 +12384,13 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= +set-getter@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.1.tgz#a3110e1b461d31a9cfc8c5c9ee2e9737ad447102" + integrity sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw== + dependencies: + to-object-path "^0.3.0" + set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" @@ -12594,15 +12465,6 @@ shell-quote@^1.6.1: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" @@ -12693,16 +12555,16 @@ snapdragon@^0.8.1: use "^3.1.0" sockjs-client@^1.5.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.1.tgz#256908f6d5adfb94dabbdbd02c66362cca0f9ea6" - integrity sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ== + version "1.5.0" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.0.tgz#2f8ff5d4b659e0d092f7aba0b7c386bd2aa20add" + integrity sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q== dependencies: debug "^3.2.6" eventsource "^1.0.7" faye-websocket "^0.11.3" inherits "^2.0.4" json3 "^3.3.3" - url-parse "^1.5.1" + url-parse "^1.4.7" sockjs@^0.3.21: version "0.3.21" @@ -12769,11 +12631,11 @@ solc@^0.6.3: tmp "0.0.33" solhint@^3.3.2: - version "3.3.4" - resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.3.4.tgz#81770c60eeb027e6e447cb91ed599baf5e888e09" - integrity sha512-AEyjshF/PC6kox1c1l79Pji+DK9WVuk5u2WEh6bBKt188gWa63NBOAgYg0fBRr5CTUmsuGc1sGH7dgUVs83mKw== + version "3.3.2" + resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.3.2.tgz#ebd7270bb50fd378b427d7a6fc9f2a7fd00216c0" + integrity sha512-8tHCkIAk1axLLG6Qu2WIH3GgNABonj9eAWejJbov3o3ujkZQRNHeHU1cC4/Dmjsh3Om7UzFFeADUHu2i7ZJeiw== dependencies: - "@solidity-parser/parser" "^0.12.0" + "@solidity-parser/parser" "^0.8.2" ajv "^6.6.1" antlr4 "4.7.1" ast-parents "0.0.1" @@ -12790,10 +12652,10 @@ solhint@^3.3.2: optionalDependencies: prettier "^1.14.3" -solidity-comments-extractor@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz#99d8f1361438f84019795d928b931f4e5c39ca19" - integrity sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw== +solidity-comments-extractor@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/solidity-comments-extractor/-/solidity-comments-extractor-0.0.4.tgz#ce420aef23641ffd0131c7d80ba85b6e1e42147e" + integrity sha512-58glBODwXIKMaQ7rfcJOrWtFQMMOK28tJ0/LcB5Xhu7WtAxk4UX2fpgKPuaL41XjMp/y0gAa1MTLqk018wuSzA== solpp@^0.10.1: version "0.10.2" @@ -12910,9 +12772,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.8" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.8.tgz#eb1e97ad99b11bf3f82a3b71a0472dd9a00f2ecf" - integrity sha512-NDgA96EnaLSvtbM7trJj+t1LUR3pirkDCcz9nOUlPb5DMBGsH7oES6C3hs3j7R9oHEa1EMvReS/BUAIT5Tcr0g== + version "3.0.7" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" + integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== spdy-transport@^3.0.0: version "3.0.0" @@ -12965,17 +12827,18 @@ sshpk@^1.7.0: tweetnacl "~0.14.0" ssri@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" - integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== dependencies: figgy-pudding "^3.5.1" -ssri@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" - integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== +ssri@^7.0.0, ssri@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.0.tgz#92c241bf6de82365b5c7fb4bd76e975522e1294d" + integrity sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g== dependencies: + figgy-pudding "^3.5.1" minipass "^3.1.1" stable@^0.1.8: @@ -13086,38 +12949,38 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" - integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" string.prototype.trim@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz#6014689baf5efaf106ad031a5fa45157666ed1bd" - integrity sha512-hWCk/iqf7lp0/AgTF7/ddO1IWtSNPASjlzCicV5irAVdE1grjsneK26YG6xACMBEdCvO8fUST0UzDMh/2Qy+9Q== + version "1.2.3" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.3.tgz#d23a22fde01c1e6571a7fadcb9be11decd8061a7" + integrity sha512-16IL9pIBA5asNOSukPfxX2W68BaBvxyiRK16H3RA/lWW9BDosh+w7f+LhomPHpXJ82QEe7w7/rY/S1CV97raLg== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" + es-abstract "^1.18.0-next.1" -string.prototype.trimend@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" - integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== +string.prototype.trimend@^1.0.1, string.prototype.trimend@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" + integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.0" define-properties "^1.1.3" -string.prototype.trimstart@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" - integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== +string.prototype.trimstart@^1.0.1, string.prototype.trimstart@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" + integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.0" define-properties "^1.1.3" string_decoder@^1.0.0, string_decoder@^1.1.1: @@ -13174,6 +13037,11 @@ strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.0" +strip-color@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/strip-color/-/strip-color-0.1.0.tgz#106f65d3d3e6a2d9401cac0eb0ce8b8a702b4f7b" + integrity sha1-EG9l09PmotlAHKwOsM6LinArT3s= + strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -13309,16 +13177,14 @@ table@^5.2.3: string-width "^3.0.0" table@^6.0.4: - version "6.7.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" - integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== + version "6.0.7" + resolved "https://registry.yarnpkg.com/table/-/table-6.0.7.tgz#e45897ffbcc1bcf9e8a87bf420f2c9e5a7a52a34" + integrity sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g== dependencies: - ajv "^8.0.1" - lodash.clonedeep "^4.5.0" - lodash.truncate "^4.4.2" + ajv "^7.0.2" + lodash "^4.17.20" slice-ansi "^4.0.0" string-width "^4.2.0" - strip-ansi "^6.0.0" tabtab@^3.0.2: version "3.0.2" @@ -13380,7 +13246,7 @@ tar@^4.0.2: safe-buffer "^5.1.2" yallist "^3.0.3" -terser-webpack-plugin@^1.4.3, terser-webpack-plugin@^1.4.4: +terser-webpack-plugin@^1.4.3: version "1.4.5" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== @@ -13395,7 +13261,22 @@ terser-webpack-plugin@^1.4.3, terser-webpack-plugin@^1.4.4: webpack-sources "^1.4.0" worker-farm "^1.7.0" -terser@^4.1.2: +terser-webpack-plugin@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz#894764a19b0743f2f704e7c2a848c5283a696724" + integrity sha512-/fKw3R+hWyHfYx7Bv6oPqmk4HGQcrWLtV3X6ggvPuwPNHSnzvVV51z6OaaCOus4YLjutYGOz3pEpbhe6Up2s1w== + dependencies: + cacache "^13.0.1" + find-cache-dir "^3.3.1" + jest-worker "^25.4.0" + p-limit "^2.3.0" + schema-utils "^2.6.6" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^4.6.12" + webpack-sources "^1.4.3" + +terser@^4.1.2, terser@^4.6.12: version "4.8.0" resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== @@ -13405,9 +13286,9 @@ terser@^4.1.2: source-map-support "~0.5.12" terser@^5.0.0: - version "5.7.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.0.tgz#a761eeec206bc87b605ab13029876ead938ae693" - integrity sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g== + version "5.6.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.6.0.tgz#138cdf21c5e3100b1b3ddfddf720962f88badcd2" + integrity sha512-vyqLMoqadC1uR0vywqOZzriDYzgEkNJFK4q9GeyOBHIbiECHiWLKcWfbQWAUaPfxkjDhapSlZB9f7fkMrvkVjA== dependencies: commander "^2.20.0" source-map "~0.7.2" @@ -13560,6 +13441,11 @@ toidentifier@1.0.0: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== +toml@^2.3.2: + version "2.3.6" + resolved "https://registry.yarnpkg.com/toml/-/toml-2.3.6.tgz#25b0866483a9722474895559088b436fd11f861b" + integrity sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ== + toposort@^1.0.0: version "1.0.7" resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" @@ -13605,11 +13491,6 @@ ts-essentials@^1.0.0: resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-1.0.4.tgz#ce3b5dade5f5d97cf69889c11bf7d2da8555b15a" integrity sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ== -ts-essentials@^6.0.3: - version "6.0.7" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-6.0.7.tgz#5f4880911b7581a873783740ce8b94da163d18a6" - integrity sha512-2E4HIIj4tQJlIHuATRHayv0EfMGK3ris/GRk1E3CFnsZzeNV+hUmelbaTZHLtXaZppM5oLhHRtO04gINC4Jusw== - ts-essentials@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.1.tgz#d205508cae0cdadfb73c89503140cf2228389e2d" @@ -13684,9 +13565,9 @@ tsutils@^2.29.0: tslib "^1.8.1" tsutils@^3.17.1: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + version "3.20.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.20.0.tgz#ea03ea45462e146b53d70ce0893de453ff24f698" + integrity sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg== dependencies: tslib "^1.8.1" @@ -13731,20 +13612,15 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5: +type-detect@^4.0.0, type-detect@^4.0.5: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== type-fest@^0.6.0: version "0.6.0" @@ -13775,27 +13651,14 @@ type@^1.0.1: integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== type@^2.0.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" - integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== - -typechain@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-3.0.0.tgz#d5a47700831f238e43f7429b987b4bb54849b92e" - integrity sha512-ft4KVmiN3zH4JUFu2WJBrwfHeDf772Tt2d8bssDTo/YcckKW2D+OwFrHXRC6hJvO3mHjFQTihoMV6fJOi0Hngg== - dependencies: - command-line-args "^4.0.7" - debug "^4.1.1" - fs-extra "^7.0.0" - js-sha3 "^0.8.0" - lodash "^4.17.15" - ts-essentials "^6.0.3" - ts-generator "^0.1.1" + version "2.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.2.0.tgz#3edd448793f517d8b9dd108b486a043f5befd91f" + integrity sha512-M/u37b4oSGlusaU8ZB96BfFPWQ8MbsZYXB+kXGMiDj6IKinkcNaQvmirBuWj8mAXqP6LYn1rQvbTYum3yPhaOA== typechain@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-4.0.3.tgz#e8fcd6c984676858c64eeeb155ea783a10b73779" - integrity sha512-tmoHQeXZWHxIdeLK+i6dU0CU0vOd9Cndr3jFTZIMzak5/YpFZ8XoiYpTZcngygGBqZo+Z1EUmttLbW9KkFZLgQ== + version "4.0.1" + resolved "https://registry.yarnpkg.com/typechain/-/typechain-4.0.1.tgz#b40eaf5ede15588d97a4b9a5f85120f7ea1cf262" + integrity sha512-H/1VpRmplp1qhCTVLU9PCgzyVCQ7Lth7YvaaI1hTvT31IpWnLLNpDpQD4vXJGr26T9BsZ0ZIceOwieAbcoywXw== dependencies: command-line-args "^4.0.7" debug "^4.1.1" @@ -13818,9 +13681,9 @@ typedarray@^0.0.6: integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= typescript@^4.0.2, typescript@^4.0.5: - version "4.2.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961" - integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg== + version "4.1.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.5.tgz#123a3b214aaff3be32926f0d8f1f6e704eb89a72" + integrity sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA== typewise-core@^1.2, typewise-core@^1.2.0: version "1.2.0" @@ -13858,30 +13721,15 @@ uglify-js@3.4.x: source-map "~0.6.1" uglify-js@^3.1.4: - version "3.13.7" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.7.tgz#25468a3b39b1c875df03f0937b2b7036a93f3fee" - integrity sha512-1Psi2MmnZJbnEsgJJIlfnd7tFlJfitusmR7zDI8lXlFI0ACD4/Rm/xdrU8bh6zF0i74aiVoBtkRiFulkrmh3AA== + version "3.12.8" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.12.8.tgz#a82e6e53c9be14f7382de3d068ef1e26e7d4aaf8" + integrity sha512-fvBeuXOsvqjecUtF/l1dwsrrf5y2BCUk9AOJGzGcm6tE7vegku5u/YvqjyDaAGr422PLoLnrxg3EnRvTqsdC1w== ultron@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== -unbox-primitive@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== - dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" - which-boxed-primitive "^1.0.2" - -underscore@1.12.1: - version "1.12.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" - integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw== - underscore@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" @@ -14022,10 +13870,10 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -url-parse@^1.4.3, url-parse@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.1.tgz#d5fa9890af8a5e1f274a2c98376510f6425f6e3b" - integrity sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q== +url-parse@^1.4.3, url-parse@^1.4.7: + version "1.4.7" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" + integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== dependencies: querystringify "^2.1.1" requires-port "^1.0.0" @@ -14054,9 +13902,9 @@ use@^3.1.0: integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== utf-8-validate@^5.0.2: - version "5.0.5" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.5.tgz#dd32c2e82c72002dc9f02eb67ba6761f43456ca1" - integrity sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ== + version "5.0.4" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.4.tgz#72a1735983ddf7a05a43a9c6b67c5ce1c910f9b8" + integrity sha512-MEF05cPSq3AwJ2C7B7sHAA6i53vONoZbMGX8My5auEVm6W+dJ2Jd/TZPyGJ5CH42V2XtbI5FD28HeHeqlPzZ3Q== dependencies: node-gyp-build "^4.2.0" @@ -14078,7 +13926,7 @@ util.promisify@1.0.0: define-properties "^1.1.2" object.getownpropertydescriptors "^2.0.3" -util.promisify@^1.0.0, util.promisify@^1.0.1: +util.promisify@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b" integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw== @@ -14146,9 +13994,9 @@ v-clipboard@^2.2.2: integrity sha512-Wg+ObZoYK6McHb5OOCFWvm0R7xHp0/p0G1ocx/8bO22jvA/yVY05rADbfiztwCokXBNfQuGv/XSd1ozcTFgekw== v8-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" + integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== validate-npm-package-license@^3.0.1: version "3.0.4" @@ -14198,18 +14046,18 @@ vue-hot-reload-api@^2.3.0: integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog== "vue-loader-v16@npm:vue-loader@^16.1.0": - version "16.2.0" - resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-16.2.0.tgz#046a53308dd47e58efe20ddec1edec027ce3b46e" - integrity sha512-TitGhqSQ61RJljMmhIGvfWzJ2zk9m1Qug049Ugml6QP3t0e95o0XJjk29roNEiPKJQBEi8Ord5hFuSuELzSp8Q== + version "16.1.2" + resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-16.1.2.tgz#5c03b6c50d2a5f983c7ceba15c50d78ca2b298f4" + integrity sha512-8QTxh+Fd+HB6fiL52iEVLKqE9N1JSlMXLR92Ijm6g8PZrwIxckgpqjPDWRP5TWxdiPaHR+alUWsnu1ShQOwt+Q== dependencies: chalk "^4.1.0" hash-sum "^2.0.0" loader-utils "^2.0.0" vue-loader@^15.9.2: - version "15.9.7" - resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.9.7.tgz#15b05775c3e0c38407679393c2ce6df673b01044" - integrity sha512-qzlsbLV1HKEMf19IqCJqdNvFJRCI58WNbS6XbPqK13MrLz65es75w392MSQ5TsARAfIjUw+ATm3vlCXUJSOH9Q== + version "15.9.6" + resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.9.6.tgz#f4bb9ae20c3a8370af3ecf09b8126d38ffdb6b8b" + integrity sha512-j0cqiLzwbeImIC6nVIby2o/ABAWhlppyL/m5oJ67R5MloP0hj/DtFgb0Zmq3J9CG7AJ+AXIvHVnJAPBvrLyuDg== dependencies: "@vue/component-compiler-utils" "^3.1.0" hash-sum "^1.0.2" @@ -14223,9 +14071,9 @@ vue-router@^3.1.3: integrity sha512-RRQNLT8Mzr8z7eL4p7BtKvRaTSGdCbTy2+Mm5HTJvLGYSSeG9gDzNasJPP/yOYKLy+/cLG/ftrqq5fvkFwBJEw== vue-style-loader@^4.1.0, vue-style-loader@^4.1.2: - version "4.1.3" - resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz#6d55863a51fa757ab24e89d9371465072aa7bc35" - integrity sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg== + version "4.1.2" + resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.2.tgz#dedf349806f25ceb4e64f3ad7c0a44fba735fcf8" + integrity sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ== dependencies: hash-sum "^1.0.2" loader-utils "^1.0.2" @@ -14538,9 +14386,9 @@ web3-utils@1.2.11: utf8 "3.0.0" web3-utils@^1.0.0-beta.31: - version "1.3.6" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.3.6.tgz#390bc9fa3a7179746963cfaca55bb80ac4d8dc10" - integrity sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg== + version "1.3.4" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.3.4.tgz#9b1aa30d7549f860b573e7bb7e690999e7192198" + integrity sha512-/vC2v0MaZNpWooJfpRw63u0Y3ag2gNjAWiLtMSL6QQLmCqCy4SQIndMt/vRyx0uMoeGt1YTwSXEcHjUzOhLg0A== dependencies: bn.js "^4.11.9" eth-lib "0.2.8" @@ -14548,7 +14396,7 @@ web3-utils@^1.0.0-beta.31: ethjs-unit "0.1.6" number-to-bn "1.7.0" randombytes "^2.1.0" - underscore "1.12.1" + underscore "1.9.1" utf8 "3.0.0" web3@1.2.11: @@ -14656,7 +14504,7 @@ webpack-merge@^4.2.2: dependencies: lodash "^4.17.15" -webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1: +webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== @@ -14729,9 +14577,9 @@ websocket@1.0.32: yaeti "^0.0.6" websocket@^1.0.30, websocket@^1.0.31: - version "1.0.34" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" - integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== + version "1.0.33" + resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.33.tgz#407f763fc58e74a3fa41ca3ae5d78d3f5e3b82a5" + integrity sha512-XwNqM2rN5eh3G2CUQE3OHZj+0xfdH42+OFK6LdC2yqiC0YU8e5UK0nYre220T0IyyN031V/XOvtHvXozvJYFWA== dependencies: bufferutil "^4.0.1" debug "^2.2.0" @@ -14746,20 +14594,9 @@ whatwg-fetch@2.0.4: integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== whatwg-fetch@^3.4.1: - version "3.6.2" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" - integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" + version "3.5.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.5.0.tgz#605a2cd0a7146e5db141e29d1c62ab84c0c4c868" + integrity sha512-jXkLtsR42xhXg7akoDKvKWE40eJeI+2KZqcp2h3NsOrRnDvtWX36KcKl30dy+hxECivdk2BVUHVNrPtoMBUx6A== which-module@^1.0.0: version "1.0.0" @@ -14895,9 +14732,9 @@ ws@^6.0.0, ws@^6.2.1: async-limiter "~1.0.0" ws@^7.2.1: - version "7.4.5" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.5.tgz#a484dd851e9beb6fdb420027e3885e8ce48986c1" - integrity sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g== + version "7.4.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.3.tgz#1f9643de34a543b8edb124bdcbc457ae55a6e5cd" + integrity sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA== xhr-request-promise@^0.1.2: version "0.1.3" @@ -14941,7 +14778,7 @@ xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3: parse-headers "^2.0.0" xtend "^4.0.0" -xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -14959,14 +14796,14 @@ y18n@^3.2.1: integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + version "4.0.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" + integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + version "5.0.5" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" + integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== yaeti@^0.0.6: version "0.0.6" @@ -15010,9 +14847,9 @@ yargs-parser@^2.4.1: lodash.assign "^4.0.6" yargs-parser@^20.2.2: - version "20.2.7" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" - integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== + version "20.2.5" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.5.tgz#5d37729146d3f894f39fc94b6796f5b239513186" + integrity sha512-jYRGS3zWy20NtDtK2kBgo/TlAoy5YUuhD9/LZ7z7W4j1Fdw2cqD0xEEclf8fxc8xjD6X5Qr+qQQwCEsP8iRiYg== yargs-unparser@1.6.0: version "1.6.0" @@ -15093,9 +14930,9 @@ yocto-queue@^0.1.0: integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== "zksync@link:sdk/zksync.js": - version "0.11.0-beta.6" + version "0.11.1" dependencies: axios "^0.21.1" websocket "^1.0.30" websocket-as-promised "^1.1.0" - zksync-crypto "^0.6.0-beta.0" + zksync-crypto "^0.6.0"