diff --git a/_raw/locales/en/messages.json b/_raw/locales/en/messages.json index 56e2ed6434e..023a4ed7915 100644 --- a/_raw/locales/en/messages.json +++ b/_raw/locales/en/messages.json @@ -795,7 +795,7 @@ "slippage-adjusted-refresh-quote": "Slippage adjusted. Refresh quote.", "price-expired-refresh-quote": "Price expired. Refresh quote.", "approve-x-symbol": "Approve {{symbol}}", - "approve-and-swap": "Approve and Swap", + "approve-and-swap": "Approve and Swap via {{name}}", "swap-via-x": "Swap via {{name}}", "get-quotes": "Get quotes", "chain": "Chain", @@ -805,6 +805,10 @@ "amount-in": "Amount in {{symbol}}", "unlimited-allowance": "Unlimited allowance", "insufficient-balance": "Insufficient balance", + "hidden-no-quote-rates_one": "Hidden {{count}} no-quote rate", + "hidden-no-quote-rates_other": "Hidden {{count}} no-quote rates", + + "Gas-fee-too-high": "Gas fee too high", "rabby-fee": "Rabby fee", "preferMEV": "Prefer MEV Guarded", "preferMEVTip": "Enable \"MEV Guarded\" feature for Ethereum swaps to reduce sandwich attack risks. Note: this feature is not supported if you use a custom RPC or wallet connect address", @@ -854,6 +858,62 @@ "estimate": "Estimate:", "actual": "Actual:" }, + "bridge": { + "title": "Bridge", + "history": "Bridge history", + "the-following-bridge-route-are-found": "Found following bridge route", + "no-transaction-records": "No transaction records", + "pendingTip": "Tx submitted. If the tx is pending for long hours, you can try to clear pending in settings.", + "Pending": "Pending", + "completedTip": "Transaction on chain, decoding data to generate record", + "Completed": "Completed", + "estimate": "Estimate:", + "actual": "Actual:", + "gas-fee": "GasFee: {{gasUsed}}", + "gas-x-price": "Gas price: {{price}} Gwei.", + "detail-tx": "Detail", + "unlimited-allowance": "Unlimited allowance", + "insufficient-balance": "Insufficient balance", + "bridgeTo": "Bridge To", + "BridgeTokenPair": "Bridge Token Pair", + "tokenPairPlaceholder": "Select Token Pair", + "Amount": "Amount", + "getRoutes": "Get routes", + "slippage-adjusted-refresh-quote": "Slippage adjusted. Refresh route.", + "price-expired-refresh-route": "Price expired. Refresh route.", + "approve-x-symbol": "Approve {{symbol}}", + "approve-and-bridge": "Approve and Bridge on {{name}}", + "need-to-approve-token-before-bridge": "Need to approve token before bridge", + "via-bridge": "via {{bridge}}", + "duration": "{{duration}} min", + "estimated-value": "≈ {{value}}", + "best": "Best", + "bridge-cost": "Bridge cost", + "rabby-fee": "Rabby fee", + "bridge-via-x": "Bridge on {{name}}", + "no-route-found": "No route found", + "aggregator-not-enabled": "This aggregator is not enabled to trade by you.", + "enable-it": "Enable it", + + "settingModal": { + "title": "Enable Bridge Aggregators to trade", + "confirm": "Confirm", + "SupportedBridge": "Supported Bridge:", + "confirmModal": { + "title": "Enable Trading with this Aggregator", + "tip1": "1. Once enabled, you will interact directly with the contract from this aggregator.", + "tip2": "2. Rabby is not liable for any risks arising from the contract of this aggregator", + "i-understand-and-accept-it": "I understand and accept it" + } + }, + "tokenPairDrawer": { + "title": "Select from supported token pair", + "tokenPair": "Token Pair", + "balance": "Balance Value", + "noData": "No Supported Token Pair" + } + }, + "manageAddress": { "no-address": "No address", "no-match": "No match", @@ -912,7 +972,8 @@ "rabbyPoints": "Rabby Points", "more": "More", "manageAddress": "Manage Address", - "nft": "NFT" + "nft": "NFT", + "bridge": "Bridge" }, "comingSoon": "Coming soon", "soon": "Soon", diff --git a/package.json b/package.json index 949f69f1f21..651012789f6 100644 --- a/package.json +++ b/package.json @@ -58,9 +58,9 @@ "@rabby-wallet/eth-watch-keyring": "1.0.0", "@rabby-wallet/gnosis-sdk": "1.3.6", "@rabby-wallet/page-provider": "0.3.5", - "@rabby-wallet/rabby-api": "0.7.22", + "@rabby-wallet/rabby-api": "0.7.23", "@rabby-wallet/rabby-security-engine": "2.0.3", - "@rabby-wallet/rabby-swap": "0.0.37", + "@rabby-wallet/rabby-swap": "0.0.38", "@rabby-wallet/widgets": "1.0.9", "@rematch/core": "2.2.0", "@rematch/select": "3.1.2", diff --git a/src/background/controller/provider/controller.ts b/src/background/controller/provider/controller.ts index 420e51a5a66..26e9055fc0c 100644 --- a/src/background/controller/provider/controller.ts +++ b/src/background/controller/provider/controller.ts @@ -30,6 +30,7 @@ import { swapService, transactionBroadcastWatchService, notificationService, + bridgeService, } from 'background/service'; import { Session } from 'background/service/session'; import { Tx, TxPushType } from 'background/service/openapi'; @@ -503,6 +504,7 @@ class ProviderController extends BaseController { if (hash) { swapService.postSwap(chain, hash, other); + bridgeService.postBridge(chain, hash, other); } statsData.submit = true; diff --git a/src/background/controller/wallet.ts b/src/background/controller/wallet.ts index 5626da7709f..883fe2dd0a2 100644 --- a/src/background/controller/wallet.ts +++ b/src/background/controller/wallet.ts @@ -23,6 +23,7 @@ import { transactionBroadcastWatchService, RabbyPointsService, HDKeyRingLastAddAddrTimeService, + bridgeService, } from 'background/service'; import buildinProvider, { EthereumProvider, @@ -104,6 +105,7 @@ import { matomoRequestEvent } from '@/utils/matomo-request'; import { BALANCE_LOADING_CONFS } from '@/constant/timeout'; import { IExtractFromPromise } from '@/ui/utils/type'; import { Wallet, thirdparty } from '@ethereumjs/wallet'; +import { BridgeRecord } from '../service/bridge'; const stashKeyrings: Record = {}; @@ -523,6 +525,115 @@ export class WalletController extends BaseController { } }; + bridgeToken = async ( + { + to, + data, + payTokenRawAmount, + payTokenId, + payTokenChainServerId, + shouldApprove, + shouldTwoStepApprove, + gasPrice, + info, + value, + }: { + data: string; + to: string; + value: string; + chainId: number; + shouldApprove: boolean; + shouldTwoStepApprove: boolean; + payTokenId: string; + payTokenChainServerId: string; + payTokenRawAmount: string; + gasPrice?: number; + info: BridgeRecord; + }, + $ctx?: any + ) => { + const account = await preferenceService.getCurrentAccount(); + if (!account) throw new Error(t('background.error.noCurrentAccount')); + const chainObj = findChain({ serverId: payTokenChainServerId }); + if (!chainObj) + throw new Error( + t('background.error.notFindChain', { payTokenChainServerId }) + ); + try { + if (shouldTwoStepApprove) { + unTriggerTxCounter.increase(3); + await this.approveToken( + payTokenChainServerId, + payTokenId, + to, + 0, + { + ga: { + ...$ctx?.ga, + source: 'approvalAndBridge|tokenApproval', + }, + }, + gasPrice, + { isBridge: true } + ); + unTriggerTxCounter.decrease(); + } + + if (shouldApprove) { + if (!shouldTwoStepApprove) { + unTriggerTxCounter.increase(2); + } + await this.approveToken( + payTokenChainServerId, + payTokenId, + to, + payTokenRawAmount, + { + ga: { + ...$ctx?.ga, + source: 'approvalAndBridge|tokenApproval', + }, + }, + gasPrice, + { isBridge: true } + ); + unTriggerTxCounter.decrease(); + } + + if (info) { + bridgeService.addTx(chainObj.enum, data, info); + } + await this.sendRequest({ + $ctx: + shouldApprove && payTokenId !== chainObj.nativeTokenAddress + ? { + ga: { + ...$ctx?.ga, + source: 'approvalAndBridge|bridge', + }, + } + : $ctx, + method: 'eth_sendTransaction', + params: [ + { + from: account.address, + to: to, + data: data || '0x', + value: `0x${new BigNumber(value || '0').toString(16)}`, + chainId: chainObj.id, + gasPrice: gasPrice + ? `0x${new BigNumber(gasPrice).toString(16)}` + : undefined, + isBridge: true, + }, + ], + }); + unTriggerTxCounter.decrease(); + } catch (e) { + unTriggerTxCounter.reset(); + } + }; + getUnTriggerTxCount = () => { return unTriggerTxCounter.count; }; @@ -581,7 +692,11 @@ export class WalletController extends BaseController { amount: number | string, $ctx?: any, gasPrice?: number, - extra?: { isSwap: boolean; swapPreferMEVGuarded?: boolean } + extra?: { + isSwap?: boolean; + swapPreferMEVGuarded?: boolean; + isBridge?: boolean; + } ) => { const account = await preferenceService.getCurrentAccount(); if (!account) throw new Error(t('background.error.noCurrentAccount')); @@ -1243,6 +1358,18 @@ export class WalletController extends BaseController { addHDKeyRingLastAddAddrTime = HDKeyRingLastAddAddrTimeService.addUnixRecord; getHDKeyRingLastAddAddrTimeStore = HDKeyRingLastAddAddrTimeService.getStore; + getBridgeData = bridgeService.getBridgeData; + getBridgeAggregators = bridgeService.getBridgeAggregators; + setBridgeAggregators = bridgeService.setBridgeAggregators; + getBridgeUnlimitedAllowance = bridgeService.getUnlimitedAllowance; + setBridgeUnlimitedAllowance = bridgeService.setUnlimitedAllowance; + setBridgeSelectedChain = bridgeService.setSelectedChain; + setBridgeSelectedFromToken = bridgeService.setSelectedFromToken; + setBridgeSelectedToToken = bridgeService.setSelectedToToken; + getBridgeSortIncludeGasFee = bridgeService.getBridgeSortIncludeGasFee; + setBridgeSortIncludeGasFee = bridgeService.setBridgeSortIncludeGasFee; + setBridgeSettingFirstOpen = bridgeService.setBridgeSettingFirstOpen; + setCustomRPC = RPCService.setRPC; removeCustomRPC = RPCService.removeCustomRPC; getAllCustomRPC = RPCService.getAllRPC; diff --git a/src/background/index.ts b/src/background/index.ts index 244c6c2e47e..9ce4ca00b17 100644 --- a/src/background/index.ts +++ b/src/background/index.ts @@ -31,6 +31,7 @@ import { securityEngineService, transactionBroadcastWatchService, HDKeyRingLastAddAddrTimeService, + bridgeService, } from './service'; import { providerController, walletController } from './controller'; import { getOriginFromUrl } from '@/utils'; @@ -97,6 +98,7 @@ async function restoreAppState() { await securityEngineService.init(); await RabbyPointsService.init(); await HDKeyRingLastAddAddrTimeService.init(); + await bridgeService.init(); setPopupIcon( walletController.isUnlocked() || !walletController.isBooted() diff --git a/src/background/service/bridge.ts b/src/background/service/bridge.ts new file mode 100644 index 00000000000..0f7893b043b --- /dev/null +++ b/src/background/service/bridge.ts @@ -0,0 +1,136 @@ +import { CHAINS_ENUM } from '@debank/common'; +import { createPersistStore } from 'background/utils'; +import { Tx } from '@rabby-wallet/rabby-api/dist/types'; + +import { openapiService } from 'background/service'; +import { TokenItem } from './openapi'; + +export type BridgeRecord = { + aggregator_id: string; + bridge_id: string; + from_chain_id: string; + from_token_id: string; + from_token_amount: string | number; + to_chain_id: string; + to_token_id: string; + to_token_amount: string | number; + tx: Partial; + rabby_fee: number; +}; + +export type BridgeServiceStore = { + selectedChain: CHAINS_ENUM | null; + selectedFromToken?: TokenItem; + selectedToToken?: TokenItem; + selectedAggregators?: string[]; + unlimitedAllowance: boolean; + sortIncludeGasFee?: boolean; + txQuotes?: Record; + firstOpen: boolean; +}; + +class BridgeService { + store: BridgeServiceStore = { + selectedChain: null, + selectedFromToken: undefined, + selectedToToken: undefined, + selectedAggregators: undefined, + unlimitedAllowance: false, + sortIncludeGasFee: true, + firstOpen: true, + }; + + init = async () => { + const storage = await createPersistStore({ + name: 'bridge', + template: { + selectedChain: null, + unlimitedAllowance: false, + sortIncludeGasFee: true, + txQuotes: {}, + firstOpen: true, + }, + }); + + this.store = storage || this.store; + }; + + getBridgeData = (key?: keyof BridgeServiceStore) => { + return key ? this.store[key] : { ...this.store }; + }; + + getBridgeAggregators = () => { + return this.store.selectedAggregators; + }; + + setBridgeAggregators = (selectedAggregators: string[]) => { + this.store.selectedAggregators = [...selectedAggregators]; + }; + + getSelectedChain = () => { + return this.store.selectedChain; + }; + + setSelectedChain = (chain: CHAINS_ENUM) => { + this.store.selectedChain = chain; + }; + + getSelectedFromToken = () => { + return this.store.selectedFromToken; + }; + getSelectedToToken = () => { + return this.store.selectedToToken; + }; + + setSelectedFromToken = (token?: TokenItem) => { + this.store.selectedFromToken = token; + }; + setSelectedToToken = (token?: TokenItem) => { + this.store.selectedToToken = token; + }; + + getUnlimitedAllowance = () => { + return this.store.unlimitedAllowance; + }; + + setUnlimitedAllowance = (bool: boolean) => { + this.store.unlimitedAllowance = bool; + }; + + getBridgeSortIncludeGasFee = () => { + return this.store.sortIncludeGasFee; + }; + + setBridgeSortIncludeGasFee = (bool: boolean) => { + this.store.sortIncludeGasFee = bool; + }; + + setBridgeSettingFirstOpen = (bool: boolean) => { + this.store.firstOpen = bool; + }; + + txQuotes: Record = {}; + + addTx = (chain: CHAINS_ENUM, data: string, info: BridgeRecord) => { + this.txQuotes[`${chain}-${data}`] = info; + }; + + postBridge = (chain: CHAINS_ENUM, hash: string, tx: Tx) => { + const { postBridgeHistory } = openapiService; + // const { txQuotes } = this; + const key = `${chain}-${tx.data}`; + const data = { ...this.txQuotes }; + const quoteInfo = data[key]; + if (quoteInfo) { + delete data[key]; + this.txQuotes = data; + return postBridgeHistory({ + ...quoteInfo, + tx, + tx_id: hash, + }); + } + }; +} + +export default new BridgeService(); diff --git a/src/background/service/index.ts b/src/background/service/index.ts index caeb55b728f..895c01567d0 100644 --- a/src/background/service/index.ts +++ b/src/background/service/index.ts @@ -19,3 +19,4 @@ export { default as securityEngineService } from './securityEngine'; export * from './transactionBroadcastWatcher'; export { default as RabbyPointsService } from './rabbyPoints'; export { default as HDKeyRingLastAddAddrTimeService } from './HDKeyRingLastAddAddrTime'; +export { default as bridgeService } from './bridge'; diff --git a/src/background/service/rabbyPoints.ts b/src/background/service/rabbyPoints.ts index d1a9a309387..f594681b71b 100644 --- a/src/background/service/rabbyPoints.ts +++ b/src/background/service/rabbyPoints.ts @@ -1,5 +1,4 @@ import { createPersistStore } from 'background/utils'; -import { CEX, DEX } from '@/constant'; export type RabbyPointsStore = { signatures: Record; diff --git a/src/background/service/transactionBroadcastWatcher.ts b/src/background/service/transactionBroadcastWatcher.ts index 9d428f8bef4..69dfda7a179 100644 --- a/src/background/service/transactionBroadcastWatcher.ts +++ b/src/background/service/transactionBroadcastWatcher.ts @@ -1,6 +1,7 @@ import { findChainByEnum, findChainByID } from '@/utils/chain'; import { TxRequest } from '@rabby-wallet/rabby-api/dist/types'; import { + bridgeService, openapiService, swapService, transactionWatchService, @@ -100,6 +101,7 @@ class TransactionBroadcastWatcher { const chain = findChainByID(item.signed_tx.chainId); if (chain) { swapService.postSwap(chain?.enum, item.tx_id, item.signed_tx); + bridgeService.postBridge(chain?.enum, item.tx_id, item.signed_tx); } } } diff --git a/src/constant/bridge.ts b/src/constant/bridge.ts new file mode 100644 index 00000000000..f100017ab26 --- /dev/null +++ b/src/constant/bridge.ts @@ -0,0 +1,161 @@ +export const DEFAULT_BRIDGE_SUPPORTED_CHAIN = [ + 'arb', + 'matic', + 'era', + 'base', + 'op', + 'linea', + 'xdai', + 'eth', + 'mnt', + 'mode', + 'bsc', + 'scrl', + 'avax', + 'zora', +]; + +export const DEFAULT_BRIDGE_AGGREGATOR = [ + { + id: 'bungee', + name: 'Bungee', + logo_url: + 'https://static.debank.com/image/project/logo_url/op_bungee/0f25166d72b1c552f6acc16b90345464.png', + bridge_list: [ + { + id: 'base-bridge', + name: 'Base', + logo_url: + 'https://static.debank.com/image/bridge/logo_url/cc84a9e0457f1049b1d15dadfd2a7ee9/cc84a9e0457f1049b1d15dadfd2a7ee9.png', + }, + { + id: 'mantle-native-bridge', + name: 'Mantle Native', + logo_url: + 'https://static.debank.com/image/bridge/logo_url/46f1a95cb0823639f037383dfc19115b/46f1a95cb0823639f037383dfc19115b.png', + }, + { + id: 'cctp', + name: 'Circle CCTP', + logo_url: + 'https://static.debank.com/image/bridge/logo_url/cd1a5ceb398d491dd03836c43dddc471/cd1a5ceb398d491dd03836c43dddc471.png', + }, + { + id: 'zora-bridge', + name: 'Zora', + logo_url: + 'https://static.debank.com/image/bridge/logo_url/5414b373d9c2111ea48c73294626b8a0/5414b373d9c2111ea48c73294626b8a0.png', + }, + { + id: 'arbitrum-bridge', + name: 'Arbitrum', + logo_url: + 'https://static.debank.com/image/bridge/logo_url/d7dbe968da9ad5ea006808e5372c8618/d7dbe968da9ad5ea006808e5372c8618.png', + }, + { + id: 'across', + name: 'Across', + logo_url: + 'https://static.debank.com/image/bridge/logo_url/cc446f8ac61966c9640852aa0ad53468/cc446f8ac61966c9640852aa0ad53468.png', + }, + { + id: 'gnosis-native-bridge', + name: 'Gnosis Native', + logo_url: + 'https://static.debank.com/image/bridge/logo_url/7c6461546fbf750179eeb5fa1fc06be8/7c6461546fbf750179eeb5fa1fc06be8.png', + }, + { + id: 'hyphen', + name: 'Hyphen', + logo_url: + 'https://static.debank.com/image/bridge/logo_url/7ed84e73706f779af2b022ceb3c1cb95/7ed84e73706f779af2b022ceb3c1cb95.png', + }, + { + id: 'optimism-bridge', + name: 'Optimism', + logo_url: + 'https://static.debank.com/image/bridge/logo_url/b10597a12fbe424bf2f519f31d3962ad/b10597a12fbe424bf2f519f31d3962ad.png', + }, + { + id: 'mode-native-bridge', + name: 'Mode Native', + logo_url: + 'https://static.debank.com/image/bridge/logo_url/358cc95c7825ab21c98fff5fac1fa759/358cc95c7825ab21c98fff5fac1fa759.png', + }, + { + id: 'scroll-native-bridge', + name: 'Scroll Native', + logo_url: + 'https://static.debank.com/image/bridge/logo_url/abe9a451211ce2a158b54b79c98d2ea3/abe9a451211ce2a158b54b79c98d2ea3.png', + }, + { + id: 'polygon-bridge', + name: 'Polygon POS', + logo_url: + 'https://static.debank.com/image/bridge/logo_url/c364ee023349579f28c0f7c176bc3fac/c364ee023349579f28c0f7c176bc3fac.png', + }, + { + id: 'refuel-bridge', + name: 'Refuel', + logo_url: + 'https://static.debank.com/image/bridge/logo_url/ead1d90ef86fec7f28dfbd0ca203f48b/ead1d90ef86fec7f28dfbd0ca203f48b.png', + }, + { + id: 'zksync-native', + name: 'ZkSync', + logo_url: + 'https://static.debank.com/image/bridge/logo_url/fc0fcd6e93a6c02e2aa2772fb38465ae/fc0fcd6e93a6c02e2aa2772fb38465ae.png', + }, + ], + }, + { + id: 'lifi', + name: 'Li.fi', + logo_url: + 'https://static.debank.com/image/project/logo_url/lifiprotocol/22262cb8c3879421c841c1e1e8c468ee.png', + bridge_list: [ + { + id: 'hyphen', + name: 'Hyphen', + logo_url: + 'https://static.debank.com/image/bridge/logo_url/7ed84e73706f779af2b022ceb3c1cb95/7ed84e73706f779af2b022ceb3c1cb95.png', + }, + { + id: 'gnosis', + name: 'Gnosis Bridge', + logo_url: + 'https://static.debank.com/image/bridge/logo_url/7c6461546fbf750179eeb5fa1fc06be8/7c6461546fbf750179eeb5fa1fc06be8.png', + }, + { + id: 'arbitrum', + name: 'Arbitrum Bridge', + logo_url: + 'https://static.debank.com/image/bridge/logo_url/d7dbe968da9ad5ea006808e5372c8618/d7dbe968da9ad5ea006808e5372c8618.png', + }, + { + id: 'celercircle', + name: 'Circle CCTP', + logo_url: + 'https://static.debank.com/image/bridge/logo_url/cd1a5ceb398d491dd03836c43dddc471/cd1a5ceb398d491dd03836c43dddc471.png', + }, + { + id: 'optimism', + name: 'Optimism Gateway', + logo_url: + 'https://static.debank.com/image/bridge/logo_url/b10597a12fbe424bf2f519f31d3962ad/b10597a12fbe424bf2f519f31d3962ad.png', + }, + { + id: 'omni', + name: 'Omni Bridge', + logo_url: + 'https://static.debank.com/image/bridge/logo_url/0638c112ea4c235061e82c57dc092673/0638c112ea4c235061e82c57dc092673.png', + }, + { + id: 'across', + name: 'Across', + logo_url: + 'https://static.debank.com/image/bridge/logo_url/cc446f8ac61966c9640852aa0ad53468/cc446f8ac61966c9640852aa0ad53468.png', + }, + ], + }, +]; diff --git a/src/constant/default-support-chains.json b/src/constant/default-support-chains.json index 45f5ceb863a..89f631dfe45 100644 --- a/src/constant/default-support-chains.json +++ b/src/constant/default-support-chains.json @@ -1 +1 @@ -[{"id": "eth", "community_id": 1, "name": "Ethereum", "native_token": {"id": "eth", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/eth/42ba589cd077e7bdd97db6480b0ff61d.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/eth/561dda8f1ed8f0b2f46474bde3f02d0b.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://etherscan.io", "need_estimate_gas": false}, {"id": "bsc", "community_id": 56, "name": "BNB Chain", "native_token": {"id": "bsc", "symbol": "BNB", "logo": "https://static.debank.com/image/coin/logo_url/bnb/9784283a36f23a58982fc964574ea530.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/bsc/bc73fa84b7fc5337905e527dadcbc854.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/bsc/8e44e643d6e2fd335a72b4cda6368e1a.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://bscscan.com", "need_estimate_gas": false}, {"id": "xdai", "community_id": 100, "name": "Gnosis Chain", "native_token": {"id": "xdai", "symbol": "xDai", "logo": "https://static.debank.com/image/xdai_token/logo_url/xdai/297890dc063e6dfb6cb4065cdf38382e.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/xdai/43c1e09e93e68c9f0f3b132976394529.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/xdai/d8744f83d1a3bef4941c0820d76242a2.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://gnosisscan.io", "need_estimate_gas": false}, {"id": "matic", "community_id": 137, "name": "Polygon", "native_token": {"id": "matic", "symbol": "MATIC", "logo": "https://static.debank.com/image/matic_token/logo_url/matic/6f5a6b6f0732a7a235131bd7804d357c.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/matic/52ca152c08831e4765506c9bd75767e8.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/matic/d9d33b57922dce7a5ac567b0e5eb1e4b.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://polygonscan.com", "need_estimate_gas": false}, {"id": "ftm", "community_id": 250, "name": "Fantom", "native_token": {"id": "ftm", "symbol": "FTM", "logo": "https://static.debank.com/image/ftm_token/logo_url/ftm/33fdb9c5067e94f3a1b9e78f6fa86984.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/ftm/14133435f89637157a4405e954e1b1b2.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/ftm/64178bae592be3a33c160b1d9b9a124a.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://ftmscan.com", "need_estimate_gas": false}, {"id": "avax", "community_id": 43114, "name": "Avalanche", "native_token": {"id": "avax", "symbol": "AVAX", "logo": "https://static.debank.com/image/avax_token/logo_url/avax/0b9c84359c84d6bdd5bfda9c2d4c4a82.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/avax/4d1649e8a0c7dec9de3491b81807d402.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/avax/e8a86458cb9e656052f0250d079622d8.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://snowtrace.io", "need_estimate_gas": false}, {"id": "op", "community_id": 10, "name": "OP", "native_token": {"id": "op", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/op/01ae734fe781c9c2ae6a4cc7e9244056.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/op/b571a53bc1ce3833a6cc3db42847931b.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://optimistic.etherscan.io", "need_estimate_gas": false}, {"id": "arb", "community_id": 42161, "name": "Arbitrum", "native_token": {"id": "arb", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/arb/854f629937ce94bebeb2cd38fb336de7.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/arb/315c3c4560a12e9c94841706e3ed9ce5.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://arbiscan.io", "need_estimate_gas": true}, {"id": "celo", "community_id": 42220, "name": "Celo", "native_token": {"id": "celo", "symbol": "CELO", "logo": "https://static.debank.com/image/celo_token/logo_url/0x471ece3750da237f93b8e339c536989b8978a438/6f524d91db674876ba0f5767cf0124cc.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/celo/41da5c1d3c0945ae822a1f85f02c76cf.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/celo/17b4db6dd9f3559117547bc22ddc5b89.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://celoscan.io", "need_estimate_gas": false}, {"id": "movr", "community_id": 1285, "name": "Moonriver", "native_token": {"id": "movr", "symbol": "MOVR", "logo": "https://static.debank.com/image/mtr_token/logo_url/0xb158870beb809ad955bf56065c5c10d7fd957cc0/aa42368ae1d5856d15c13ecc0ff74af6.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/movr/4b0de5a711b437f187c0d0f15cc0398b.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/movr/c13a5af6c923aad7cc6cad311267da8e.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://moonriver.moonscan.io", "need_estimate_gas": false}, {"id": "cro", "community_id": 25, "name": "Cronos", "native_token": {"id": "cro", "symbol": "CRO", "logo": "https://static.debank.com/image/cro_token/logo_url/cro/7803de9b434be197c2c1399465abdf39.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/cro/f947000cc879ee8ffa032793808c741c.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/cro/555a092be8378d6e55000b3846043bec.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://cronoscan.com", "need_estimate_gas": false}, {"id": "boba", "community_id": 288, "name": "Boba", "native_token": {"id": "boba", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/boba/e43d79cd8088ceb3ea3e4a240a75728f.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/boba/aea02e2a1cf1087f299f4d501777d0cd.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://bobascan.com", "need_estimate_gas": true}, {"id": "metis", "community_id": 1088, "name": "Metis", "native_token": {"id": "metis", "symbol": "Metis", "logo": "https://static.debank.com/image/coin/logo_url/metis/7485c0a61c1e05fdf707113b6b6ac917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/metis/7485c0a61c1e05fdf707113b6b6ac917.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/metis/3fb2c5171563b035fe4add98eca01efc.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://explorer.metis.io", "need_estimate_gas": false}, {"id": "btt", "community_id": 199, "name": "BitTorrent", "native_token": {"id": "btt", "symbol": "BTT", "logo": "https://static.debank.com/image/btt_token/logo_url/btt/2130a8d57ff2a0f3d50a4ec9432897c6.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/btt/2130a8d57ff2a0f3d50a4ec9432897c6.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/btt/4d76b329327ccfa153e47c750d0775d3.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://bttcscan.com", "need_estimate_gas": false}, {"id": "aurora", "community_id": 1313161554, "name": "Aurora", "native_token": {"id": "aurora", "symbol": "AETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/aurora/da491099bb44690eda122cdd67c5c610.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/aurora/f4109e1ec9f24aa36c23a5d9d27286fb.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://aurorascan.dev", "need_estimate_gas": true}, {"id": "mobm", "community_id": 1284, "name": "Moonbeam", "native_token": {"id": "mobm", "symbol": "GLMR", "logo": "https://static.debank.com/image/mobm_token/logo_url/mobm/a8442077d76b258297181c3e6eb8c9cc.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/mobm/a8442077d76b258297181c3e6eb8c9cc.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/mobm/293430b9780093287759bbf2ed80f939.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://moonscan.io", "need_estimate_gas": false}, {"id": "sbch", "community_id": 10000, "name": "SmartBch", "native_token": {"id": "sbch", "symbol": "BCH", "logo": "https://static.debank.com/image/sbch_token/logo_url/sbch/03007b5353bb9e221efb82a6a70d9ec9.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/sbch/d78ac780803e7f0a17b73558f423502e.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/sbch/0b08879f05d6a13d7a4181510a1138cf.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://www.smartscan.cash", "need_estimate_gas": false}, {"id": "fuse", "community_id": 122, "name": "Fuse", "native_token": {"id": "fuse", "symbol": "FUSE", "logo": "https://static.debank.com/image/arb_token/logo_url/0xbdef0e9ef12e689f366fe494a7a7d0dad25d9286/b9fe0bbfeccc43ac46bc652752e25532.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/fuse/7a21b958761d52d04ff0ce829d1703f4.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/fuse/ceda89bc24064a4c583f369811ee29b6.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://explorer.fuse.io", "need_estimate_gas": false}, {"id": "hmy", "community_id": 1666600000, "name": "Harmony", "native_token": {"id": "hmy", "symbol": "ONE", "logo": "https://static.debank.com/image/hmy_token/logo_url/hmy/734c003023531e31c636ae25d5a73172.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/hmy/b3bfb4681f81a85e25c28e150dcbfe51.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/hmy/a92fd20b6691292d93160e2606035468.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://explorer.harmony.one", "need_estimate_gas": false}, {"id": "klay", "community_id": 8217, "name": "Klaytn", "native_token": {"id": "klay", "symbol": "KLAY", "logo": "https://static.debank.com/image/klay_token/logo_url/klay/1df018b8493cb97c50b7e390ef63cba4.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/klay/1df018b8493cb97c50b7e390ef63cba4.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/klay/f5a2aefdbaa9cbc90c0fa1ec0443ec63.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://scope.klaytn.com", "need_estimate_gas": false}, {"id": "astar", "community_id": 592, "name": "Astar", "native_token": {"id": "astar", "symbol": "ASTR", "logo": "https://static.debank.com/image/astar_token/logo_url/astar/a827be92d88617a918ea060a9a6f1572.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/astar/398c7e0014bdada3d818367a7273fabe.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/astar/116f17a7abe800b7675377857fac1dcd.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://blockscout.com/astar", "need_estimate_gas": false}, {"id": "iotx", "community_id": 4689, "name": "IoTeX", "native_token": {"id": "iotx", "symbol": "IOTX", "logo": "https://static.debank.com/image/iotx_token/logo_url/iotx/d3be2cd8677f86bd9ab7d5f3701afcc9.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/iotx/d3be2cd8677f86bd9ab7d5f3701afcc9.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/iotx/419fdcf87eceb9b8c34af0c5e3985d44.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://iotexscan.io", "need_estimate_gas": false}, {"id": "rsk", "community_id": 30, "name": "Rootstock", "native_token": {"id": "rsk", "symbol": "RBTC", "logo": "https://static.debank.com/image/rsk_token/logo_url/rsk/1dae003fa89234ac011c0dac51126770.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/rsk/ff47def89fba98394168bf5f39920c8c.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/rsk/8f621d4d08c69ba79d5aae53bc9d3eeb.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://rootstock.blockscout.com", "need_estimate_gas": false}, {"id": "wan", "community_id": 888, "name": "Wanchain", "native_token": {"id": "wan", "symbol": "WAN", "logo": "https://static.debank.com/image/wan_token/logo_url/wan/f205dea796c0abae5b6749d697adfffa.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/wan/f3aa8b31414732ea5e026e05665146e6.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/wan/dc0ce7bb158767b2de10ce3f23b62675.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://www.wanscan.org", "need_estimate_gas": false}, {"id": "kcc", "community_id": 321, "name": "KCC", "native_token": {"id": "kcc", "symbol": "KCS", "logo": "https://static.debank.com/image/kcc_token/logo_url/kcc/7fca710b626725fc67f02be57f71c597.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/kcc/3a5a4ef7d5f1db1e53880d70219d75b6.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/kcc/d3f270fe9ccdd0fc9047bcf9a62d8110.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://explorer.kcc.io/en", "need_estimate_gas": false}, {"id": "sgb", "community_id": 19, "name": "Songbird", "native_token": {"id": "sgb", "symbol": "SGB", "logo": "https://static.debank.com/image/sgb_token/logo_url/0x02f0826ef6ad107cfc861152b32b52fd11bab9ed/619f46d574d62a50bdfd9f0e2f47ddc1.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/sgb/619f46d574d62a50bdfd9f0e2f47ddc1.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/sgb/eeef2dd3241f458e7f43dd06319e6cb2.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://songbird-explorer.flare.network", "need_estimate_gas": false}, {"id": "evmos", "community_id": 9001, "name": "EvmOS", "native_token": {"id": "evmos", "symbol": "EVMOS", "logo": "https://static.debank.com/image/evmos_token/logo_url/evmos/26e038b4d5475d5a4b92f7fc08bdabc9.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/evmos/26e038b4d5475d5a4b92f7fc08bdabc9.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/evmos/4d575ca6baef4f1de8dcead622091a79.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://escan.live", "need_estimate_gas": false}, {"id": "dfk", "community_id": 53935, "name": "DFK", "native_token": {"id": "dfk", "symbol": "JEWEL", "logo": "https://static.debank.com/image/dfk_token/logo_url/dfk/09b4ee0e9d0695201fcc7e912ac31595.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/dfk/233867c089c5b71be150aa56003f3f7a.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/dfk/bab611be6bf763da73c6179c2150ffdf.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://subnets.avax.network/defi-kingdoms/dfk-chain/explorer", "need_estimate_gas": false}, {"id": "tlos", "community_id": 40, "name": "Telos", "native_token": {"id": "tlos", "symbol": "TLOS", "logo": "https://static.debank.com/image/tlos_token/logo_url/tlos/7e45efcbc8d74f7fd6cda972938f4ade.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/telos/f9f7493def4c08ed222540bebd8ce87a.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/tlos/deae1896415f9dac66e60cb47d8165d7.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://www.teloscan.io", "need_estimate_gas": false}, {"id": "nova", "community_id": 42170, "name": "Arbitrum Nova", "native_token": {"id": "nova", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/nova/06eb2b7add8ba443d5b219c04089c326.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/nova/b61c3a7723f39265c8b98967407e46db.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://nova.arbiscan.io", "need_estimate_gas": true}, {"id": "canto", "community_id": 7700, "name": "Canto", "native_token": {"id": "canto", "symbol": "CANTO", "logo": "https://static.debank.com/image/canto_token/logo_url/canto/47574ef619e057d2c6bbce1caba57fb6.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/canto/47574ef619e057d2c6bbce1caba57fb6.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/canto/29bd07f96ac7805a1b14649f356d3eee.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://tuber.build", "need_estimate_gas": false}, {"id": "doge", "community_id": 2000, "name": "Dogechain", "native_token": {"id": "doge", "symbol": "DOGE", "logo": "https://static.debank.com/image/doge_token/logo_url/doge/2538141079688a7a43bc22c7b60fb45f.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/doge/2538141079688a7a43bc22c7b60fb45f.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/doge/aa18ed341ae19e5e381dfac1062fee73.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://explorer.dogechain.dog", "need_estimate_gas": false}, {"id": "kava", "community_id": 2222, "name": "Kava", "native_token": {"id": "kava", "symbol": "KAVA", "logo": "https://static.debank.com/image/kava_token/logo_url/kava/f5b7c6ffbe4d99da363a78d98e748880.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/kava/b26bf85a1a817e409f9a3902e996dc21.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/kava/2e672dd7947e41a34d6cbc5995ad24b2.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://kavascan.com", "need_estimate_gas": false}, {"id": "step", "community_id": 1234, "name": "Step", "native_token": {"id": "step", "symbol": "FITFI", "logo": "https://static.debank.com/image/step_token/logo_url/step/9d345f7e03f078657bb1ffd494442d67.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/step/db79600b8feafe17845617ca9c606dbe.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/step/e3250b0b574f55b1ec82434549e6f959.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://stepscan.io", "need_estimate_gas": false}, {"id": "mada", "community_id": 2001, "name": "Milkomeda C1", "native_token": {"id": "mada", "symbol": "milkADA", "logo": "https://static.debank.com/image/mada_token/logo_url/mada/cb356bfa1b48206c834e62113604567d.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/mada/cdc4b1112c2c5a2757cbda33f4476b7f.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/mada/185df9833e6215d48ccfd389be59b752.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://explorer-mainnet-cardano-evm.c1.milkomeda.com", "need_estimate_gas": false}, {"id": "cfx", "community_id": 1030, "name": "Conflux", "native_token": {"id": "cfx", "symbol": "CFX", "logo": "https://static.debank.com/image/cfx_token/logo_url/cfx/f493f92ad1087e23cf8dadab9850abb5.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/cfx/eab0c7304c6820b48b2a8d0930459b82.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/cfx/d45e5225fc8e97623c798599a2f8ce50.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://evm.confluxscan.io", "need_estimate_gas": false}, {"id": "brise", "community_id": 32520, "name": "Bitgert", "native_token": {"id": "brise", "symbol": "BRISE", "logo": "https://static.debank.com/image/brise_token/logo_url/brise/4f6c040cf49f4d8c4eabbad7cd2f4ae4.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/brise/4f6c040cf49f4d8c4eabbad7cd2f4ae4.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/brise/34c2bec8f0eaaf44929ce604c645c729.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://brisescan.com", "need_estimate_gas": false}, {"id": "ckb", "community_id": 71402, "name": "Godwoken", "native_token": {"id": "ckb", "symbol": "CKB", "logo": "https://static.debank.com/image/ckb_token/logo_url/ckb/18d430b7e9b48750bad7e88513a8f2c5.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/ckb/e821893503104870d5e73f56dbd73746.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/ckb/5b7e976954a29e0ff3fc67a03d702d44.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://gwscan.com", "need_estimate_gas": false}, {"id": "era", "community_id": 324, "name": "zkSync Era", "native_token": {"id": "era", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/era/2cfcd0c8436b05d811b03935f6c1d7da.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/era/ae1951502c3514d43374d7e6718bda9a.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://era.zksync.network", "need_estimate_gas": true}, {"id": "ron", "community_id": 2020, "name": "Ronin", "native_token": {"id": "ron", "symbol": "RON", "logo": "https://static.debank.com/image/ron_token/logo_url/0xe514d9deb7966c8be0ca922de8a064264ea6bcd4/f65d4fdc17d5533c59ebcd6eb1f47320.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/ron/6e0f509804bc83bf042ef4d674c1c5ee.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/ron/a7164cbb1bcf36c6b13abece4956e7ec.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://explorer.roninchain.com", "need_estimate_gas": false}, {"id": "pze", "community_id": 1101, "name": "Polygon zkEVM", "native_token": {"id": "pze", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/pze/a2276dce2d6a200c6148fb975f0eadd3.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/pze/94d0cff539cb8f18c93f11a454f894b3.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://zkevm.polygonscan.com", "need_estimate_gas": false}, {"id": "core", "community_id": 1116, "name": "CORE", "native_token": {"id": "core", "symbol": "CORE", "logo": "https://static.debank.com/image/core_token/logo_url/core/1a7becfe112c0c9bfc25628cd70e94a6.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/core/ccc02f660e5dd410b23ca3250ae7c060.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/core/e52df8e06f7763e05e1d94cce21683a5.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://scan.coredao.org", "need_estimate_gas": false}, {"id": "wemix", "community_id": 1111, "name": "WEMIX", "native_token": {"id": "wemix", "symbol": "WEMIX", "logo": "https://static.debank.com/image/wemix_token/logo_url/wemix/6431c197ec9f2a1d334a356b316fbb49.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/wemix/d1ba88d1df6cca0b0cb359c36a09c054.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/wemix/66b877a83349d6d158796f825f5b9633.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.wemix.com", "need_estimate_gas": false}, {"id": "etc", "community_id": 61, "name": "Ethereum Classic", "native_token": {"id": "etc", "symbol": "ETC", "logo": "https://static.debank.com/image/okt_token/logo_url/0x99970778e2715bbc9cf8fb83d10dcbc2d2d551a3/782943aff604f69c7889d90926348210.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/etc/7ccf90ee6822ab440fb603337da256fa.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/etc/81a154d78dce2782739ac9e0d8e05f6d.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://blockscout.com/etc/mainnet", "need_estimate_gas": false}, {"id": "pls", "community_id": 369, "name": "PulseChain", "native_token": {"id": "pls", "symbol": "PLS", "logo": "https://static.debank.com/image/pls_token/logo_url/pls/aa6be079fa9eb568e02150734ebb3db0.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/pls/aa6be079fa9eb568e02150734ebb3db0.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/pls/7c01fc668883d77e87c9334ec7d6b6ab.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://scan.mypinata.cloud/ipfs/bafybeidn64pd2u525lmoipjl4nh3ooa2imd7huionjsdepdsphl5slfowy/#", "need_estimate_gas": false}, {"id": "flr", "community_id": 14, "name": "Flare", "native_token": {"id": "flr", "symbol": "FLR", "logo": "https://static.debank.com/image/flr_token/logo_url/flr/c7d8087092d5d7b80794630612afb32e.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/flr/9ee03d5d7036ad9024e81d55596bb4dc.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/flr/ad866bf4323576b66651c9e2bbfd8a80.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://flare-explorer.flare.network", "need_estimate_gas": false}, {"id": "fsn", "community_id": 32659, "name": "Fusion", "native_token": {"id": "fsn", "symbol": "FSN", "logo": "https://static.debank.com/image/fsn_token/logo_url/fsn/047789979f0b5733602b29517753bdf3.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/fsn/047789979f0b5733602b29517753bdf3.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/fsn/dfb374f7abf97b869ccf42bbf697feae.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://fsnscan.com", "need_estimate_gas": false}, {"id": "mtr", "community_id": 82, "name": "Meter", "native_token": {"id": "mtr", "symbol": "MTR", "logo": "https://static.debank.com/image/mtr_token/logo_url/mtr/920c6f4fdcb408703b435a97b963200b.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/mtr/2dc6f079f52ca22778eb684e1ce650b3.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/mtr/0eafbdc8de9656a9de0f28efa2070450.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://scan.meter.io", "need_estimate_gas": false}, {"id": "rose", "community_id": 42262, "name": "Oasis Emerald", "native_token": {"id": "rose", "symbol": "ROSE", "logo": "https://static.debank.com/image/rose_token/logo_url/rose/33ade55b0f3efa10e9eec002c6417257.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/rose/33ade55b0f3efa10e9eec002c6417257.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/rose/2e2351720f1772e3b3c7c2891f3d0192.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.emerald.oasis.dev", "need_estimate_gas": false}, {"id": "oas", "community_id": 248, "name": "Oasys", "native_token": {"id": "oas", "symbol": "OAS", "logo": "https://static.debank.com/image/oas_token/logo_url/oas/322b2cb0935af95b9cabd8a59b629566.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/oas/61dfecab1ba8a404354ce94b5a54d4b3.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/oas/95888aa80c9eb4dbde714c69b3cc7425.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://scan.oasys.games", "need_estimate_gas": false}, {"id": "zora", "community_id": 7777777, "name": "Zora", "native_token": {"id": "zora", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/zora/de39f62c4489a2359d5e1198a8e02ef1.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/zora/25dfb04c552c35d3d8e30e5ba136b9e6.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.zora.energy", "need_estimate_gas": false}, {"id": "base", "community_id": 8453, "name": "Base", "native_token": {"id": "base", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/base/ccc1513e4f390542c4fb2f4b88ce9579.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/base/025de9d02848e257740c14bdd1f9330b.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://www.basescan.org", "need_estimate_gas": false}, {"id": "linea", "community_id": 59144, "name": "Linea", "native_token": {"id": "linea", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/linea/32d4ff2cf92c766ace975559c232179c.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/linea/adee1a93003ab543957692844fdaf9f2.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://lineascan.build", "need_estimate_gas": false}, {"id": "mnt", "community_id": 5000, "name": "Mantle", "native_token": {"id": "mnt", "symbol": "MNT", "logo": "https://static.debank.com/image/eth_token/logo_url/0x3c3a81e81dc49a522a592e7622a7e711c06bf354/a443c78c33704d48f06e5686bb87f85e.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/mnt/0af11a52431d60ded59655c7ca7e1475.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/mnt/f642653f191f4fd59cbf9efefc4c007d.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://mantlescan.xyz", "need_estimate_gas": true}, {"id": "tenet", "community_id": 1559, "name": "Tenet", "native_token": {"id": "tenet", "symbol": "TENET", "logo": "https://static.debank.com/image/tenet_token/logo_url/tenet/2da9b626102a7de9625aaf753cfac321.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/tenet/803be22e467ee9a5abe00d69a9c3ea4f.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/tenet/651386abf4fa22f64613faf8dc5187f1.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://tenetscan.io", "need_estimate_gas": false}, {"id": "lyx", "community_id": 42, "name": "LUKSO", "native_token": {"id": "lyx", "symbol": "LYX", "logo": "https://static.debank.com/image/eth_token/logo_url/0xa8b919680258d369114910511cc87595aec0be6d/78a30c7b781e3889548d5920c09133dc.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/lyx/dbe6eef57e66817e61297d9b188248ed.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/lyx/83230c4279ab2813907de034d87ab319.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.execution.mainnet.lukso.network", "need_estimate_gas": false}, {"id": "manta", "community_id": 169, "name": "Manta Pacific", "native_token": {"id": "manta", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/manta/0e25a60b96a29d6a5b9e524be7565845.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/manta/ead2552c140ffd5482e7222964bac558.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://pacific-explorer.manta.network", "need_estimate_gas": true}, {"id": "scrl", "community_id": 534352, "name": "Scroll", "native_token": {"id": "scrl", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/scrl/1fa5c7e0bfd353ed0a97c1476c9c42d2.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/scrl/dd0d05b6fba614d57b55f0724acd723c.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://scrollscan.com", "need_estimate_gas": false}, {"id": "opbnb", "community_id": 204, "name": "opBNB", "native_token": {"id": "opbnb", "symbol": "BNB", "logo": "https://static.debank.com/image/coin/logo_url/bnb/9784283a36f23a58982fc964574ea530.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/opbnb/07e2e686e363a842d0982493638e1285.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/opbnb/8e44e643d6e2fd335a72b4cda6368e1a.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://mainnet.opbnbscan.com", "need_estimate_gas": false}, {"id": "loot", "community_id": 5151706, "name": "Loot", "native_token": {"id": "loot", "symbol": "AGLD", "logo": "https://static.debank.com/image/loot_token/logo_url/loot/a6c0dc128d515e2d32526075decae9ec.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/loot/0f098333a1a4f474115b05862e680573.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/loot/af8f162614f388e896872f628f3e3e6e.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://explorer.lootchain.com", "need_estimate_gas": false}, {"id": "shib", "community_id": 109, "name": "Shibarium", "native_token": {"id": "shib", "symbol": "BONE", "logo": "https://static.debank.com/image/shib_token/logo_url/shib/e49e9a98f5fb1fb04ad96bb536457df9.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/shib/4ec79ed9ee4988dfdfc41e1634a447be.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/shib/574d888cbdce3a08ea8a5f636fc2ae3e.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://shibariumscan.io", "need_estimate_gas": false}, {"id": "fx", "community_id": 530, "name": "Function X", "native_token": {"id": "fx", "symbol": "FX", "logo": "https://static.debank.com/image/fx_token/logo_url/fx/6fee82420b2394e0b68d7d7e692a0a01.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/fx/6fee82420b2394e0b68d7d7e692a0a01.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/fx/528e10d16f64db1798bca33092526d96.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://starscan.io/evm", "need_estimate_gas": false}, {"id": "mode", "community_id": 34443, "name": "Mode", "native_token": {"id": "mode", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/mode/466e6e12f4fd827f8f497cceb0601a5e.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/mode/f7033404c6d09fafcbe53cbf806a585f.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.mode.network", "need_estimate_gas": false}, {"id": "beam", "community_id": 4337, "name": "Beam", "native_token": {"id": "beam", "symbol": "BEAM", "logo": "https://static.debank.com/image/beam_token/logo_url/beam/90a1e9f46664d070752deeb65878a3bd.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/beam/90a1e9f46664d070752deeb65878a3bd.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/beam/f54a6974e60b63c5f328721ad0281f1b.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://subnets.avax.network/beam", "need_estimate_gas": false}, {"id": "fon", "community_id": 201022, "name": "FON Chain", "native_token": {"id": "fon", "symbol": "FON", "logo": "https://static.debank.com/image/fon_token/logo_url/fon/369618f4d45053fa4439943c9c2d387d.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/fon/369618f4d45053fa4439943c9c2d387d.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/fon/6c5ee096ec2173f9250d58b4384343aa.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://fonscan.io", "need_estimate_gas": false}, {"id": "zkfair", "community_id": 42766, "name": "ZKFair", "native_token": {"id": "zkfair", "symbol": "USDC", "logo": "https://static.debank.com/image/zkfair_token/logo_url/zkfair/35ab0987153a8355a454223aae371ac7.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/zkfair/c66f35d57c6146cdff82dfeb316ba801.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/zkfair/4133904f2769ebcffa48177c0b7831a6.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://scan.zkfair.io", "need_estimate_gas": false}, {"id": "alot", "community_id": 432204, "name": "Dexalot", "native_token": {"id": "alot", "symbol": "ALOT", "logo": "https://static.debank.com/image/alot_token/logo_url/alot/a03e5e8bc56a8bcd5f5c7b830e8b5877.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/alot/0ed4884da27d022dbd5ed5bc919ee248.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/alot/8ed0cbf9842daef43fbb32558d4f4309.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://subnets.avax.network/dexalot", "need_estimate_gas": false}, {"id": "bfc", "community_id": 3068, "name": "Bifrost", "native_token": {"id": "bfc", "symbol": "BFC", "logo": "https://static.debank.com/image/bfc_token/logo_url/bfc/f0c01b58f084660f8c8ff43f5c85301c.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/bfc/7c10f5191b16d0cc068cb6eff32b6347.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/bfc/728682dd1707271a7b268fac3594e94e.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.mainnet.bifrostnetwork.com", "need_estimate_gas": false}, {"id": "xai", "community_id": 660279, "name": "Xai", "native_token": {"id": "xai", "symbol": "XAI", "logo": "https://static.debank.com/image/xai_token/logo_url/xai/022ab00135c182f6e67e583ecda93863.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/xai/b02622ce65251bdcb31aa6621a10a096.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/xai/9eb29c6f965e70ed84e50f8e9e577b1e.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.xai-chain.net", "need_estimate_gas": false}, {"id": "zeta", "community_id": 7000, "name": "ZetaChain", "native_token": {"id": "zeta", "symbol": "ZETA", "logo": "https://static.debank.com/image/zeta_token/logo_url/zeta/d0e1b5e519d99c452a30e83a1263d1d0.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/zeta/d0e1b5e519d99c452a30e83a1263d1d0.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/zeta/fb4ab4eb798244887bfd65455bd42d6b.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://zetachain.blockscout.com", "need_estimate_gas": false}, {"id": "rari", "community_id": 1380012617, "name": "RARI", "native_token": {"id": "rari", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/rari/67fc6abba5cfc6bb3a57bb6afcf5afee.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/rari/73456a9386ce19d00584fec493206005.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://mainnet.explorer.rarichain.org", "need_estimate_gas": false}, {"id": "dym", "community_id": 1100, "name": "Dymension", "native_token": {"id": "dym", "symbol": "DYM", "logo": "https://static.debank.com/image/dym_token/logo_url/dym/ab62b0f446408c84a2e17d9178a4e8e9.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/dym/ab62b0f446408c84a2e17d9178a4e8e9.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/dym/0a9e4481802f4c0aae6a5a97605809d8.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://dym.fyi", "need_estimate_gas": false}, {"id": "merlin", "community_id": 4200, "name": "Merlin", "native_token": {"id": "merlin", "symbol": "BTC", "logo": "https://static.debank.com/image/merlin_token/logo_url/merlin/fe230e468272b84aba78d08bb4140456.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/merlin/458e4686dfb909ba871bd96fe45417a8.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/merlin/72e28432e865c544c1045017892187bc.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://scan.merlinchain.io", "need_estimate_gas": false}, {"id": "blast", "community_id": 81457, "name": "Blast", "native_token": {"id": "blast", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/blast/15132294afd38ce980639a381ee30149.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/blast/828eb570083948e156a34ab8588e26b3.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://blastscan.io", "need_estimate_gas": false}, {"id": "smr", "community_id": 148, "name": "Shimmer EVM", "native_token": {"id": "smr", "symbol": "SMR", "logo": "https://static.debank.com/image/smr_token/logo_url/smr/fbf679837a276530dd9b253dfa85c1f5.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/smr/d22267bfdee42c88a15e605b30861a30.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/smr/2e536df7a52d2f5948f8fd0b9f5d0cb4.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://explorer.evm.shimmer.network", "need_estimate_gas": false}, {"id": "iota", "community_id": 8822, "name": "IOTA EVM", "native_token": {"id": "iota", "symbol": "IOTA", "logo": "https://static.debank.com/image/iota_token/logo_url/iota/b2fbb37acc6a3be27231fbc49aed481a.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/iota/b2fbb37acc6a3be27231fbc49aed481a.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/iota/acedda9f542b72c0109c8c20caf526d9.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://explorer.evm.iota.org", "need_estimate_gas": false}, {"id": "platon", "community_id": 210425, "name": "PlatON", "native_token": {"id": "platon", "symbol": "LAT", "logo": "https://static.debank.com/image/platon_token/logo_url/platon/b5df1214981b0888e48fbb18d302c6ba.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/platon/b5df1214981b0888e48fbb18d302c6ba.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/platon/e5104b97d20a18df9f28b0673ebd7440.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://scan.platon.network", "need_estimate_gas": false}, {"id": "rollux", "community_id": 570, "name": "Rollux", "native_token": {"id": "rollux", "symbol": "SYS", "logo": "https://static.debank.com/image/rollux_token/logo_url/rollux/a57476d6cd8e27ee6d7eae318c3c7eee.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/rollux/b38f1a5be41a8e87766436ad9d9919a9.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/rollux/25c6383b3ae8b989c1e234c6734ba2ae.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.rollux.com", "need_estimate_gas": false}, {"id": "sx", "community_id": 416, "name": "SX", "native_token": {"id": "sx", "symbol": "SX", "logo": "https://static.debank.com/image/sx_token/logo_url/sx/1cd91dbcb82de12b4587607bc4924bc9.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/sx/1cd91dbcb82de12b4587607bc4924bc9.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/sx/0bddf854e56d6e7629b2f8ca1be707b0.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://explorer.sx.technology", "need_estimate_gas": false}, {"id": "eon", "community_id": 7332, "name": "Horizen EON", "native_token": {"id": "eon", "symbol": "ZEN", "logo": "https://static.debank.com/image/eon_token/logo_url/eon/bf6e7dbdd2facde7ed39c9f881537775.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/eon/36deb31f3e0a7c74762971d79245f82e.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/eon/f071cd6b0e2c8a9ea6a3e213651ed7f2.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://eon-explorer.horizenlabs.io", "need_estimate_gas": false}, {"id": "ulx", "community_id": 1231, "name": "Ultron", "native_token": {"id": "ulx", "symbol": "ULX", "logo": "https://static.debank.com/image/ulx_token/logo_url/ulx/371eb14527f3a80ed382f67278f43c7e.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/ulx/371eb14527f3a80ed382f67278f43c7e.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/ulx/7d6d20d13ec0a5c7d286aaea404f2d91.png", "eip_1559": false, "is_disabled": true, "explorer_host": "https://ulxscan.com", "need_estimate_gas": false}, {"id": "map", "community_id": 22776, "name": "MAP Protocol", "native_token": {"id": "map", "symbol": "MAPO", "logo": "https://static.debank.com/image/map_token/logo_url/map/3efde740a6e9d32661757aad8ae2b3a2.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/map/3efde740a6e9d32661757aad8ae2b3a2.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/map/18ec31888ba251dd6d47e469b636d5fe.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://www.maposcan.io", "need_estimate_gas": false}, {"id": "karak", "community_id": 2410, "name": "Karak", "native_token": {"id": "karak", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/karak/a9e47f00f6eeb2c9cc8f9551cff5fe68.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/karak/5d5ca3507b4a1d64a85406f7382412d7.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.karak.network", "need_estimate_gas": false}, {"id": "aze", "community_id": 3776, "name": "Astar zkEVM", "native_token": {"id": "aze", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/aze/6def6ac081a37e94ed0106da2cefeaf4.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/aze/490d08032b0ee878dc0251c35c26383b.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://astar-zkevm.explorer.startale.com", "need_estimate_gas": false}, {"id": "frax", "community_id": 252, "name": "Fraxtal", "native_token": {"id": "frax", "symbol": "frxETH", "logo": "https://static.debank.com/image/frax_token/logo_url/frax/4313f25f6c5196e8fce2c80fa34c73d0.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/frax/2e210d888690ad0c424355cc8471d48d.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/frax/7ae2bc54b406cd3c378b0bd28df2b3ff.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://fraxscan.com", "need_estimate_gas": false}, {"id": "lumio", "community_id": 8866, "name": "SuperLumio", "native_token": {"id": "lumio", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/lumio/be6cd376260e0e214d8486f2300a4fb9.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/lumio/7960121f0a9235ff30bc65c57f0fe3a8.png", "eip_1559": true, "is_disabled": true, "explorer_host": "https://explorer.lumio.io", "need_estimate_gas": false}, {"id": "apex", "community_id": 70700, "name": "Proof of Play Apex", "native_token": {"id": "apex", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/apex/f60665106aba5b08563e26b4ba4baf83.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/apex/e1b94232b7eeedb147c489761118411a.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.apex.proofofplay.com", "need_estimate_gas": false}, {"id": "savm", "community_id": 3109, "name": "SatoshiVM Alpha", "native_token": {"id": "savm", "symbol": "BTC", "logo": "https://static.debank.com/image/savm_token/logo_url/savm/fe230e468272b84aba78d08bb4140456.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/savm/8f92638826f2c97063c7de7726160655.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/savm/3315cc8579422c06720d9521e3bb0f90.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://svmscan.io", "need_estimate_gas": false}, {"id": "kroma", "community_id": 255, "name": "Kroma", "native_token": {"id": "kroma", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/kroma/7c88e9e0e2488172fc1fcb9da3096a70.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/kroma/a7c2e13d0aaaf866a4adf0fc7f0aa9df.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://kromascan.com", "need_estimate_gas": false}, {"id": "ela", "community_id": 20, "name": "Elastos", "native_token": {"id": "ela", "symbol": "ELA", "logo": "https://static.debank.com/image/ela_token/logo_url/ela/42a9831ba9df693f00437527ec851099.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/ela/42a9831ba9df693f00437527ec851099.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/ela/fc429a7e514b50a08ff5627575a47f6f.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://esc.elastos.io", "need_estimate_gas": false}, {"id": "bevm", "community_id": 11501, "name": "BEVM", "native_token": {"id": "bevm", "symbol": "BTC", "logo": "https://static.debank.com/image/bevm_token/logo_url/bevm/fe230e468272b84aba78d08bb4140456.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/bevm/aafd9b13a2187db02661b85c72fb3cc3.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/bevm/0030aceb597e1c79f55c53676171d636.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://scan-mainnet.bevm.io", "need_estimate_gas": false}, {"id": "degen", "community_id": 666666666, "name": "Degen", "native_token": {"id": "degen", "symbol": "DEGEN", "logo": "https://static.debank.com/image/degen_token/logo_url/degen/29dd6d5df71347d2ad3b77c194915844.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/degen/29dd6d5df71347d2ad3b77c194915844.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/degen/c046b42727ff864d1865a102442affb8.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.degen.tips", "need_estimate_gas": false}, {"id": "zklink", "community_id": 810180, "name": "zkLink Nova", "native_token": {"id": "zklink", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/zklink/b3a4000979cc4f3701135a5f565ffeb0.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/zklink/585235bd940f119317757760798237ae.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.zklink.io", "need_estimate_gas": false}, {"id": "xlayer", "community_id": 196, "name": "X Layer", "native_token": {"id": "xlayer", "symbol": "OKB", "logo": "https://static.debank.com/image/xlayer_token/logo_url/xlayer/02e2fec5f8b2f5783ceb38d683557de3.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/xlayer/282a62903a4c74a964b704a161d1ba39.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/xlayer/bb5d85b54ec4634bd8b6703b27e254ba.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://www.oklink.com/xlayer", "need_estimate_gas": false}, {"id": "molten", "community_id": 360, "name": "Molten", "native_token": {"id": "molten", "symbol": "MOLTEN", "logo": "https://static.debank.com/image/molten_token/logo_url/molten/9cb5d5dc7b200ceaa577e0431a731203.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/molten/9cb5d5dc7b200ceaa577e0431a731203.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/molten/56b94881ef4e1e8ea6765dc5442bf17a.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://molten.calderaexplorer.xyz", "need_estimate_gas": false}, {"id": "btr", "community_id": 200901, "name": "Bitlayer", "native_token": {"id": "btr", "symbol": "BTC", "logo": "https://static.debank.com/image/btr_token/logo_url/btr/fe230e468272b84aba78d08bb4140456.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/btr/78ff16cf14dad73c168a70f7c971e401.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/btr/33a233f67cb62320dd49c7a3a05c1d4b.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://www.btrscan.com", "need_estimate_gas": false}, {"id": "b2", "community_id": 223, "name": "B\u00b2", "native_token": {"id": "b2", "symbol": "BTC", "logo": "https://static.debank.com/image/b2_token/logo_url/b2/fe230e468272b84aba78d08bb4140456.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/b2/6ca6c8bc33af59c5b9273a2b7efbd236.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/b2/3df748afc47cc1c76107981bc312a190.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.bsquared.network", "need_estimate_gas": false}, {"id": "bob", "community_id": 60808, "name": "BOB", "native_token": {"id": "bob", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/bob/4e0029be99877775664327213a8da60e.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/bob/7f61e1ed6fae04833ee21d83c9998d22.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.gobob.xyz", "need_estimate_gas": false}, {"id": "reya", "community_id": 1729, "name": "Reya", "native_token": {"id": "reya", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/reya/20d71aad4279c33229297da1f00d8ae1.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/reya/7643e04c35af62a7572aecbdc4565040.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.reya.network", "need_estimate_gas": true}, {"id": "bb", "community_id": 6001, "name": "BounceBit", "native_token": {"id": "bb", "symbol": "BB", "logo": "https://static.debank.com/image/bb_token/logo_url/bb/da74a4980f24d870cb43ccd763e0c966.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/bb/da74a4980f24d870cb43ccd763e0c966.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/bb/31ba7b64206471376f34f2b4c5c097f8.png", "eip_1559": true, "is_disabled": true, "explorer_host": "https://bbscan.io", "need_estimate_gas": false}, {"id": "ailayer", "community_id": 2649, "name": "AILayer", "native_token": {"id": "ailayer", "symbol": "BTC", "logo": "https://static.debank.com/image/ailayer_token/logo_url/ailayer/fe230e468272b84aba78d08bb4140456.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/ailayer/54ed2cefa4246acecb0b0ba6ddaf5e8a.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/ailayer/cdf4f9fb0b1c4d14da133ce76ebf0b76.png", "eip_1559": true, "is_disabled": true, "explorer_host": "https://mainnet-explorer.anvm.io", "need_estimate_gas": false}, {"id": "sanko", "community_id": 1996, "name": "Sanko", "native_token": {"id": "sanko", "symbol": "DMT", "logo": "https://static.debank.com/image/sanko_token/logo_url/sanko/a3ab5461c7afa714c877cf57fbb033ad.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/sanko/a3ab5461c7afa714c877cf57fbb033ad.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/sanko/596ade63d11b1a8eafcffc9ecac32632.png", "eip_1559": true, "is_disabled": true, "explorer_host": "https://explorer.sanko.xyz", "need_estimate_gas": false}, {"id": "taiko", "community_id": 167000, "name": "Taiko", "native_token": {"id": "taiko", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/taiko/7723fbdb38ef181cd07a8b8691671e6b.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/taiko/16d831636a2aa32e5b58f264a61311e0.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://taikoscan.io", "need_estimate_gas": false}, {"id": "cyber", "community_id": 7560, "name": "Cyber", "native_token": {"id": "cyber", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/cyber/3a3c0c5da5fa8876c8c338afae0db478.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/cyber/239566559dc0c5fd5f5e2d76b85c6490.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://cyberscan.co", "need_estimate_gas": false}, {"id": "sei", "community_id": 1329, "name": "Sei", "native_token": {"id": "sei", "symbol": "SEI", "logo": "https://static.debank.com/image/sei_token/logo_url/sei/34ddf58f678be2db5b2636b59c9828b5.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/sei/34ddf58f678be2db5b2636b59c9828b5.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/sei/632af17fefaa435817bd6bc3c549280d.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://seitrace.com", "need_estimate_gas": false}, {"id": "strax", "community_id": 105105, "name": "Stratis", "native_token": {"id": "strax", "symbol": "STRAX", "logo": "https://static.debank.com/image/strax_token/logo_url/strax/62929cc22496a34349782a0c685377dd.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/strax/7675d16c026442847faf6bbe7708bf9c.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/strax/01db3348ae950906fec6ec74966b59f9.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.stratisevm.com", "need_estimate_gas": false}, {"id": "mint", "community_id": 185, "name": "Mint", "native_token": {"id": "mint", "symbol": "ETH", "logo": "https://static.debank.com/image/mint_token/logo_url/mint/48bfb74adddd170e936578aec422836d.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/mint/86404f93cd4e51eafcc2e244d417c03f.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/mint/1bc50cbf5ec022d40efe48c4ec68c25d.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://mintscan.org", "need_estimate_gas": false}] \ No newline at end of file +[{"id": "eth", "community_id": 1, "name": "Ethereum", "native_token": {"id": "eth", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/eth/42ba589cd077e7bdd97db6480b0ff61d.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/eth/561dda8f1ed8f0b2f46474bde3f02d0b.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://etherscan.io", "need_estimate_gas": false}, {"id": "bsc", "community_id": 56, "name": "BNB Chain", "native_token": {"id": "bsc", "symbol": "BNB", "logo": "https://static.debank.com/image/coin/logo_url/bnb/9784283a36f23a58982fc964574ea530.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/bsc/bc73fa84b7fc5337905e527dadcbc854.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/bsc/8e44e643d6e2fd335a72b4cda6368e1a.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://bscscan.com", "need_estimate_gas": false}, {"id": "xdai", "community_id": 100, "name": "Gnosis Chain", "native_token": {"id": "xdai", "symbol": "xDai", "logo": "https://static.debank.com/image/xdai_token/logo_url/xdai/297890dc063e6dfb6cb4065cdf38382e.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/xdai/43c1e09e93e68c9f0f3b132976394529.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/xdai/d8744f83d1a3bef4941c0820d76242a2.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://gnosisscan.io", "need_estimate_gas": false}, {"id": "matic", "community_id": 137, "name": "Polygon", "native_token": {"id": "matic", "symbol": "MATIC", "logo": "https://static.debank.com/image/matic_token/logo_url/matic/6f5a6b6f0732a7a235131bd7804d357c.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/matic/52ca152c08831e4765506c9bd75767e8.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/matic/d9d33b57922dce7a5ac567b0e5eb1e4b.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://polygonscan.com", "need_estimate_gas": false}, {"id": "ftm", "community_id": 250, "name": "Fantom", "native_token": {"id": "ftm", "symbol": "FTM", "logo": "https://static.debank.com/image/ftm_token/logo_url/ftm/33fdb9c5067e94f3a1b9e78f6fa86984.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/ftm/14133435f89637157a4405e954e1b1b2.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/ftm/64178bae592be3a33c160b1d9b9a124a.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://ftmscan.com", "need_estimate_gas": false}, {"id": "avax", "community_id": 43114, "name": "Avalanche", "native_token": {"id": "avax", "symbol": "AVAX", "logo": "https://static.debank.com/image/avax_token/logo_url/avax/0b9c84359c84d6bdd5bfda9c2d4c4a82.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/avax/4d1649e8a0c7dec9de3491b81807d402.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/avax/e8a86458cb9e656052f0250d079622d8.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://snowtrace.io", "need_estimate_gas": false}, {"id": "op", "community_id": 10, "name": "OP", "native_token": {"id": "op", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/op/01ae734fe781c9c2ae6a4cc7e9244056.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/op/b571a53bc1ce3833a6cc3db42847931b.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://optimistic.etherscan.io", "need_estimate_gas": false}, {"id": "arb", "community_id": 42161, "name": "Arbitrum", "native_token": {"id": "arb", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/arb/854f629937ce94bebeb2cd38fb336de7.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/arb/315c3c4560a12e9c94841706e3ed9ce5.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://arbiscan.io", "need_estimate_gas": true}, {"id": "celo", "community_id": 42220, "name": "Celo", "native_token": {"id": "celo", "symbol": "CELO", "logo": "https://static.debank.com/image/celo_token/logo_url/0x471ece3750da237f93b8e339c536989b8978a438/6f524d91db674876ba0f5767cf0124cc.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/celo/41da5c1d3c0945ae822a1f85f02c76cf.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/celo/17b4db6dd9f3559117547bc22ddc5b89.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://celoscan.io", "need_estimate_gas": false}, {"id": "movr", "community_id": 1285, "name": "Moonriver", "native_token": {"id": "movr", "symbol": "MOVR", "logo": "https://static.debank.com/image/mtr_token/logo_url/0xb158870beb809ad955bf56065c5c10d7fd957cc0/aa42368ae1d5856d15c13ecc0ff74af6.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/movr/4b0de5a711b437f187c0d0f15cc0398b.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/movr/c13a5af6c923aad7cc6cad311267da8e.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://moonriver.moonscan.io", "need_estimate_gas": false}, {"id": "cro", "community_id": 25, "name": "Cronos", "native_token": {"id": "cro", "symbol": "CRO", "logo": "https://static.debank.com/image/cro_token/logo_url/cro/7803de9b434be197c2c1399465abdf39.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/cro/f947000cc879ee8ffa032793808c741c.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/cro/555a092be8378d6e55000b3846043bec.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://cronoscan.com", "need_estimate_gas": false}, {"id": "boba", "community_id": 288, "name": "Boba", "native_token": {"id": "boba", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/boba/e43d79cd8088ceb3ea3e4a240a75728f.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/boba/aea02e2a1cf1087f299f4d501777d0cd.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://bobascan.com", "need_estimate_gas": true}, {"id": "metis", "community_id": 1088, "name": "Metis", "native_token": {"id": "metis", "symbol": "Metis", "logo": "https://static.debank.com/image/coin/logo_url/metis/7485c0a61c1e05fdf707113b6b6ac917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/metis/7485c0a61c1e05fdf707113b6b6ac917.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/metis/3fb2c5171563b035fe4add98eca01efc.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://explorer.metis.io", "need_estimate_gas": false}, {"id": "btt", "community_id": 199, "name": "BitTorrent", "native_token": {"id": "btt", "symbol": "BTT", "logo": "https://static.debank.com/image/btt_token/logo_url/btt/2130a8d57ff2a0f3d50a4ec9432897c6.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/btt/2130a8d57ff2a0f3d50a4ec9432897c6.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/btt/4d76b329327ccfa153e47c750d0775d3.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://bttcscan.com", "need_estimate_gas": false}, {"id": "aurora", "community_id": 1313161554, "name": "Aurora", "native_token": {"id": "aurora", "symbol": "AETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/aurora/da491099bb44690eda122cdd67c5c610.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/aurora/f4109e1ec9f24aa36c23a5d9d27286fb.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://aurorascan.dev", "need_estimate_gas": true}, {"id": "mobm", "community_id": 1284, "name": "Moonbeam", "native_token": {"id": "mobm", "symbol": "GLMR", "logo": "https://static.debank.com/image/mobm_token/logo_url/mobm/a8442077d76b258297181c3e6eb8c9cc.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/mobm/a8442077d76b258297181c3e6eb8c9cc.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/mobm/293430b9780093287759bbf2ed80f939.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://moonscan.io", "need_estimate_gas": false}, {"id": "sbch", "community_id": 10000, "name": "SmartBch", "native_token": {"id": "sbch", "symbol": "BCH", "logo": "https://static.debank.com/image/sbch_token/logo_url/sbch/03007b5353bb9e221efb82a6a70d9ec9.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/sbch/d78ac780803e7f0a17b73558f423502e.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/sbch/0b08879f05d6a13d7a4181510a1138cf.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://www.smartscan.cash", "need_estimate_gas": false}, {"id": "fuse", "community_id": 122, "name": "Fuse", "native_token": {"id": "fuse", "symbol": "FUSE", "logo": "https://static.debank.com/image/arb_token/logo_url/0xbdef0e9ef12e689f366fe494a7a7d0dad25d9286/b9fe0bbfeccc43ac46bc652752e25532.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/fuse/7a21b958761d52d04ff0ce829d1703f4.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/fuse/ceda89bc24064a4c583f369811ee29b6.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://explorer.fuse.io", "need_estimate_gas": false}, {"id": "hmy", "community_id": 1666600000, "name": "Harmony", "native_token": {"id": "hmy", "symbol": "ONE", "logo": "https://static.debank.com/image/hmy_token/logo_url/hmy/734c003023531e31c636ae25d5a73172.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/hmy/b3bfb4681f81a85e25c28e150dcbfe51.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/hmy/a92fd20b6691292d93160e2606035468.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://explorer.harmony.one", "need_estimate_gas": false}, {"id": "klay", "community_id": 8217, "name": "Klaytn", "native_token": {"id": "klay", "symbol": "KLAY", "logo": "https://static.debank.com/image/klay_token/logo_url/klay/1df018b8493cb97c50b7e390ef63cba4.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/klay/1df018b8493cb97c50b7e390ef63cba4.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/klay/f5a2aefdbaa9cbc90c0fa1ec0443ec63.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://scope.klaytn.com", "need_estimate_gas": false}, {"id": "astar", "community_id": 592, "name": "Astar", "native_token": {"id": "astar", "symbol": "ASTR", "logo": "https://static.debank.com/image/astar_token/logo_url/astar/a827be92d88617a918ea060a9a6f1572.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/astar/398c7e0014bdada3d818367a7273fabe.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/astar/116f17a7abe800b7675377857fac1dcd.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://blockscout.com/astar", "need_estimate_gas": false}, {"id": "iotx", "community_id": 4689, "name": "IoTeX", "native_token": {"id": "iotx", "symbol": "IOTX", "logo": "https://static.debank.com/image/iotx_token/logo_url/iotx/d3be2cd8677f86bd9ab7d5f3701afcc9.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/iotx/d3be2cd8677f86bd9ab7d5f3701afcc9.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/iotx/419fdcf87eceb9b8c34af0c5e3985d44.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://iotexscan.io", "need_estimate_gas": false}, {"id": "rsk", "community_id": 30, "name": "Rootstock", "native_token": {"id": "rsk", "symbol": "RBTC", "logo": "https://static.debank.com/image/rsk_token/logo_url/rsk/1dae003fa89234ac011c0dac51126770.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/rsk/ff47def89fba98394168bf5f39920c8c.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/rsk/8f621d4d08c69ba79d5aae53bc9d3eeb.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://rootstock.blockscout.com", "need_estimate_gas": false}, {"id": "wan", "community_id": 888, "name": "Wanchain", "native_token": {"id": "wan", "symbol": "WAN", "logo": "https://static.debank.com/image/wan_token/logo_url/wan/f205dea796c0abae5b6749d697adfffa.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/wan/f3aa8b31414732ea5e026e05665146e6.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/wan/dc0ce7bb158767b2de10ce3f23b62675.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://www.wanscan.org", "need_estimate_gas": false}, {"id": "kcc", "community_id": 321, "name": "KCC", "native_token": {"id": "kcc", "symbol": "KCS", "logo": "https://static.debank.com/image/kcc_token/logo_url/kcc/7fca710b626725fc67f02be57f71c597.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/kcc/3a5a4ef7d5f1db1e53880d70219d75b6.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/kcc/d3f270fe9ccdd0fc9047bcf9a62d8110.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://explorer.kcc.io/en", "need_estimate_gas": false}, {"id": "sgb", "community_id": 19, "name": "Songbird", "native_token": {"id": "sgb", "symbol": "SGB", "logo": "https://static.debank.com/image/sgb_token/logo_url/0x02f0826ef6ad107cfc861152b32b52fd11bab9ed/619f46d574d62a50bdfd9f0e2f47ddc1.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/sgb/619f46d574d62a50bdfd9f0e2f47ddc1.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/sgb/eeef2dd3241f458e7f43dd06319e6cb2.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://songbird-explorer.flare.network", "need_estimate_gas": false}, {"id": "evmos", "community_id": 9001, "name": "EvmOS", "native_token": {"id": "evmos", "symbol": "EVMOS", "logo": "https://static.debank.com/image/evmos_token/logo_url/evmos/26e038b4d5475d5a4b92f7fc08bdabc9.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/evmos/26e038b4d5475d5a4b92f7fc08bdabc9.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/evmos/4d575ca6baef4f1de8dcead622091a79.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://escan.live", "need_estimate_gas": false}, {"id": "dfk", "community_id": 53935, "name": "DFK", "native_token": {"id": "dfk", "symbol": "JEWEL", "logo": "https://static.debank.com/image/dfk_token/logo_url/dfk/09b4ee0e9d0695201fcc7e912ac31595.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/dfk/233867c089c5b71be150aa56003f3f7a.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/dfk/bab611be6bf763da73c6179c2150ffdf.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://subnets.avax.network/defi-kingdoms/dfk-chain/explorer", "need_estimate_gas": false}, {"id": "tlos", "community_id": 40, "name": "Telos", "native_token": {"id": "tlos", "symbol": "TLOS", "logo": "https://static.debank.com/image/tlos_token/logo_url/tlos/7e45efcbc8d74f7fd6cda972938f4ade.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/telos/f9f7493def4c08ed222540bebd8ce87a.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/tlos/deae1896415f9dac66e60cb47d8165d7.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://www.teloscan.io", "need_estimate_gas": false}, {"id": "nova", "community_id": 42170, "name": "Arbitrum Nova", "native_token": {"id": "nova", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/nova/06eb2b7add8ba443d5b219c04089c326.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/nova/b61c3a7723f39265c8b98967407e46db.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://nova.arbiscan.io", "need_estimate_gas": true}, {"id": "canto", "community_id": 7700, "name": "Canto", "native_token": {"id": "canto", "symbol": "CANTO", "logo": "https://static.debank.com/image/canto_token/logo_url/canto/47574ef619e057d2c6bbce1caba57fb6.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/canto/47574ef619e057d2c6bbce1caba57fb6.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/canto/29bd07f96ac7805a1b14649f356d3eee.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://tuber.build", "need_estimate_gas": false}, {"id": "doge", "community_id": 2000, "name": "Dogechain", "native_token": {"id": "doge", "symbol": "DOGE", "logo": "https://static.debank.com/image/doge_token/logo_url/doge/2538141079688a7a43bc22c7b60fb45f.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/doge/2538141079688a7a43bc22c7b60fb45f.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/doge/aa18ed341ae19e5e381dfac1062fee73.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://explorer.dogechain.dog", "need_estimate_gas": false}, {"id": "kava", "community_id": 2222, "name": "Kava", "native_token": {"id": "kava", "symbol": "KAVA", "logo": "https://static.debank.com/image/kava_token/logo_url/kava/f5b7c6ffbe4d99da363a78d98e748880.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/kava/b26bf85a1a817e409f9a3902e996dc21.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/kava/2e672dd7947e41a34d6cbc5995ad24b2.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://kavascan.com", "need_estimate_gas": false}, {"id": "step", "community_id": 1234, "name": "Step", "native_token": {"id": "step", "symbol": "FITFI", "logo": "https://static.debank.com/image/step_token/logo_url/step/9d345f7e03f078657bb1ffd494442d67.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/step/db79600b8feafe17845617ca9c606dbe.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/step/e3250b0b574f55b1ec82434549e6f959.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://stepscan.io", "need_estimate_gas": false}, {"id": "mada", "community_id": 2001, "name": "Milkomeda C1", "native_token": {"id": "mada", "symbol": "milkADA", "logo": "https://static.debank.com/image/mada_token/logo_url/mada/cb356bfa1b48206c834e62113604567d.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/mada/cdc4b1112c2c5a2757cbda33f4476b7f.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/mada/185df9833e6215d48ccfd389be59b752.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://explorer-mainnet-cardano-evm.c1.milkomeda.com", "need_estimate_gas": false}, {"id": "cfx", "community_id": 1030, "name": "Conflux", "native_token": {"id": "cfx", "symbol": "CFX", "logo": "https://static.debank.com/image/cfx_token/logo_url/cfx/f493f92ad1087e23cf8dadab9850abb5.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/cfx/eab0c7304c6820b48b2a8d0930459b82.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/cfx/d45e5225fc8e97623c798599a2f8ce50.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://evm.confluxscan.io", "need_estimate_gas": false}, {"id": "brise", "community_id": 32520, "name": "Bitgert", "native_token": {"id": "brise", "symbol": "BRISE", "logo": "https://static.debank.com/image/brise_token/logo_url/brise/4f6c040cf49f4d8c4eabbad7cd2f4ae4.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/brise/4f6c040cf49f4d8c4eabbad7cd2f4ae4.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/brise/34c2bec8f0eaaf44929ce604c645c729.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://brisescan.com", "need_estimate_gas": false}, {"id": "ckb", "community_id": 71402, "name": "Godwoken", "native_token": {"id": "ckb", "symbol": "CKB", "logo": "https://static.debank.com/image/ckb_token/logo_url/ckb/18d430b7e9b48750bad7e88513a8f2c5.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/ckb/e821893503104870d5e73f56dbd73746.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/ckb/5b7e976954a29e0ff3fc67a03d702d44.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://gwscan.com", "need_estimate_gas": false}, {"id": "era", "community_id": 324, "name": "zkSync Era", "native_token": {"id": "era", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/era/2cfcd0c8436b05d811b03935f6c1d7da.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/era/ae1951502c3514d43374d7e6718bda9a.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://era.zksync.network", "need_estimate_gas": true}, {"id": "ron", "community_id": 2020, "name": "Ronin", "native_token": {"id": "ron", "symbol": "RON", "logo": "https://static.debank.com/image/ron_token/logo_url/0xe514d9deb7966c8be0ca922de8a064264ea6bcd4/f65d4fdc17d5533c59ebcd6eb1f47320.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/ron/6e0f509804bc83bf042ef4d674c1c5ee.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/ron/a7164cbb1bcf36c6b13abece4956e7ec.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://explorer.roninchain.com", "need_estimate_gas": false}, {"id": "pze", "community_id": 1101, "name": "Polygon zkEVM", "native_token": {"id": "pze", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/pze/a2276dce2d6a200c6148fb975f0eadd3.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/pze/94d0cff539cb8f18c93f11a454f894b3.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://zkevm.polygonscan.com", "need_estimate_gas": false}, {"id": "core", "community_id": 1116, "name": "CORE", "native_token": {"id": "core", "symbol": "CORE", "logo": "https://static.debank.com/image/core_token/logo_url/core/1a7becfe112c0c9bfc25628cd70e94a6.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/core/ccc02f660e5dd410b23ca3250ae7c060.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/core/e52df8e06f7763e05e1d94cce21683a5.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://scan.coredao.org", "need_estimate_gas": false}, {"id": "wemix", "community_id": 1111, "name": "WEMIX", "native_token": {"id": "wemix", "symbol": "WEMIX", "logo": "https://static.debank.com/image/wemix_token/logo_url/wemix/6431c197ec9f2a1d334a356b316fbb49.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/wemix/d1ba88d1df6cca0b0cb359c36a09c054.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/wemix/66b877a83349d6d158796f825f5b9633.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.wemix.com", "need_estimate_gas": false}, {"id": "etc", "community_id": 61, "name": "Ethereum Classic", "native_token": {"id": "etc", "symbol": "ETC", "logo": "https://static.debank.com/image/okt_token/logo_url/0x99970778e2715bbc9cf8fb83d10dcbc2d2d551a3/782943aff604f69c7889d90926348210.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/etc/7ccf90ee6822ab440fb603337da256fa.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/etc/81a154d78dce2782739ac9e0d8e05f6d.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://blockscout.com/etc/mainnet", "need_estimate_gas": false}, {"id": "pls", "community_id": 369, "name": "PulseChain", "native_token": {"id": "pls", "symbol": "PLS", "logo": "https://static.debank.com/image/pls_token/logo_url/pls/aa6be079fa9eb568e02150734ebb3db0.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/pls/aa6be079fa9eb568e02150734ebb3db0.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/pls/7c01fc668883d77e87c9334ec7d6b6ab.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://scan.mypinata.cloud/ipfs/bafybeidn64pd2u525lmoipjl4nh3ooa2imd7huionjsdepdsphl5slfowy/#", "need_estimate_gas": false}, {"id": "flr", "community_id": 14, "name": "Flare", "native_token": {"id": "flr", "symbol": "FLR", "logo": "https://static.debank.com/image/flr_token/logo_url/flr/c7d8087092d5d7b80794630612afb32e.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/flr/9ee03d5d7036ad9024e81d55596bb4dc.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/flr/ad866bf4323576b66651c9e2bbfd8a80.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://flare-explorer.flare.network", "need_estimate_gas": false}, {"id": "fsn", "community_id": 32659, "name": "Fusion", "native_token": {"id": "fsn", "symbol": "FSN", "logo": "https://static.debank.com/image/fsn_token/logo_url/fsn/047789979f0b5733602b29517753bdf3.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/fsn/047789979f0b5733602b29517753bdf3.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/fsn/dfb374f7abf97b869ccf42bbf697feae.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://fsnscan.com", "need_estimate_gas": false}, {"id": "mtr", "community_id": 82, "name": "Meter", "native_token": {"id": "mtr", "symbol": "MTR", "logo": "https://static.debank.com/image/mtr_token/logo_url/mtr/920c6f4fdcb408703b435a97b963200b.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/mtr/2dc6f079f52ca22778eb684e1ce650b3.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/mtr/0eafbdc8de9656a9de0f28efa2070450.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://scan.meter.io", "need_estimate_gas": false}, {"id": "rose", "community_id": 42262, "name": "Oasis Emerald", "native_token": {"id": "rose", "symbol": "ROSE", "logo": "https://static.debank.com/image/rose_token/logo_url/rose/33ade55b0f3efa10e9eec002c6417257.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/rose/33ade55b0f3efa10e9eec002c6417257.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/rose/2e2351720f1772e3b3c7c2891f3d0192.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.emerald.oasis.dev", "need_estimate_gas": false}, {"id": "oas", "community_id": 248, "name": "Oasys", "native_token": {"id": "oas", "symbol": "OAS", "logo": "https://static.debank.com/image/oas_token/logo_url/oas/322b2cb0935af95b9cabd8a59b629566.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/oas/61dfecab1ba8a404354ce94b5a54d4b3.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/oas/95888aa80c9eb4dbde714c69b3cc7425.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://scan.oasys.games", "need_estimate_gas": false}, {"id": "zora", "community_id": 7777777, "name": "Zora", "native_token": {"id": "zora", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/zora/de39f62c4489a2359d5e1198a8e02ef1.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/zora/25dfb04c552c35d3d8e30e5ba136b9e6.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.zora.energy", "need_estimate_gas": false}, {"id": "base", "community_id": 8453, "name": "Base", "native_token": {"id": "base", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/base/ccc1513e4f390542c4fb2f4b88ce9579.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/base/025de9d02848e257740c14bdd1f9330b.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://www.basescan.org", "need_estimate_gas": false}, {"id": "linea", "community_id": 59144, "name": "Linea", "native_token": {"id": "linea", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/linea/32d4ff2cf92c766ace975559c232179c.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/linea/adee1a93003ab543957692844fdaf9f2.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://lineascan.build", "need_estimate_gas": false}, {"id": "mnt", "community_id": 5000, "name": "Mantle", "native_token": {"id": "mnt", "symbol": "MNT", "logo": "https://static.debank.com/image/eth_token/logo_url/0x3c3a81e81dc49a522a592e7622a7e711c06bf354/a443c78c33704d48f06e5686bb87f85e.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/mnt/0af11a52431d60ded59655c7ca7e1475.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/mnt/f642653f191f4fd59cbf9efefc4c007d.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://mantlescan.xyz", "need_estimate_gas": true}, {"id": "tenet", "community_id": 1559, "name": "Tenet", "native_token": {"id": "tenet", "symbol": "TENET", "logo": "https://static.debank.com/image/tenet_token/logo_url/tenet/2da9b626102a7de9625aaf753cfac321.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/tenet/803be22e467ee9a5abe00d69a9c3ea4f.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/tenet/651386abf4fa22f64613faf8dc5187f1.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://tenetscan.io", "need_estimate_gas": false}, {"id": "lyx", "community_id": 42, "name": "LUKSO", "native_token": {"id": "lyx", "symbol": "LYX", "logo": "https://static.debank.com/image/eth_token/logo_url/0xa8b919680258d369114910511cc87595aec0be6d/78a30c7b781e3889548d5920c09133dc.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/lyx/dbe6eef57e66817e61297d9b188248ed.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/lyx/83230c4279ab2813907de034d87ab319.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.execution.mainnet.lukso.network", "need_estimate_gas": false}, {"id": "manta", "community_id": 169, "name": "Manta Pacific", "native_token": {"id": "manta", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/manta/0e25a60b96a29d6a5b9e524be7565845.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/manta/ead2552c140ffd5482e7222964bac558.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://pacific-explorer.manta.network", "need_estimate_gas": true}, {"id": "scrl", "community_id": 534352, "name": "Scroll", "native_token": {"id": "scrl", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/scrl/1fa5c7e0bfd353ed0a97c1476c9c42d2.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/scrl/dd0d05b6fba614d57b55f0724acd723c.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://scrollscan.com", "need_estimate_gas": false}, {"id": "opbnb", "community_id": 204, "name": "opBNB", "native_token": {"id": "opbnb", "symbol": "BNB", "logo": "https://static.debank.com/image/coin/logo_url/bnb/9784283a36f23a58982fc964574ea530.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/opbnb/07e2e686e363a842d0982493638e1285.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/opbnb/8e44e643d6e2fd335a72b4cda6368e1a.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://mainnet.opbnbscan.com", "need_estimate_gas": false}, {"id": "loot", "community_id": 5151706, "name": "Loot", "native_token": {"id": "loot", "symbol": "AGLD", "logo": "https://static.debank.com/image/loot_token/logo_url/loot/a6c0dc128d515e2d32526075decae9ec.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/loot/0f098333a1a4f474115b05862e680573.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/loot/af8f162614f388e896872f628f3e3e6e.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://explorer.lootchain.com", "need_estimate_gas": false}, {"id": "shib", "community_id": 109, "name": "Shibarium", "native_token": {"id": "shib", "symbol": "BONE", "logo": "https://static.debank.com/image/shib_token/logo_url/shib/e49e9a98f5fb1fb04ad96bb536457df9.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/shib/4ec79ed9ee4988dfdfc41e1634a447be.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/shib/574d888cbdce3a08ea8a5f636fc2ae3e.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://shibariumscan.io", "need_estimate_gas": false}, {"id": "fx", "community_id": 530, "name": "Function X", "native_token": {"id": "fx", "symbol": "FX", "logo": "https://static.debank.com/image/fx_token/logo_url/fx/6fee82420b2394e0b68d7d7e692a0a01.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/fx/6fee82420b2394e0b68d7d7e692a0a01.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/fx/528e10d16f64db1798bca33092526d96.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://starscan.io/evm", "need_estimate_gas": false}, {"id": "mode", "community_id": 34443, "name": "Mode", "native_token": {"id": "mode", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/mode/466e6e12f4fd827f8f497cceb0601a5e.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/mode/f7033404c6d09fafcbe53cbf806a585f.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.mode.network", "need_estimate_gas": false}, {"id": "beam", "community_id": 4337, "name": "Beam", "native_token": {"id": "beam", "symbol": "BEAM", "logo": "https://static.debank.com/image/beam_token/logo_url/beam/90a1e9f46664d070752deeb65878a3bd.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/beam/90a1e9f46664d070752deeb65878a3bd.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/beam/f54a6974e60b63c5f328721ad0281f1b.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://subnets.avax.network/beam", "need_estimate_gas": false}, {"id": "fon", "community_id": 201022, "name": "FON Chain", "native_token": {"id": "fon", "symbol": "FON", "logo": "https://static.debank.com/image/fon_token/logo_url/fon/369618f4d45053fa4439943c9c2d387d.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/fon/369618f4d45053fa4439943c9c2d387d.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/fon/6c5ee096ec2173f9250d58b4384343aa.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://fonscan.io", "need_estimate_gas": false}, {"id": "zkfair", "community_id": 42766, "name": "ZKFair", "native_token": {"id": "zkfair", "symbol": "USDC", "logo": "https://static.debank.com/image/zkfair_token/logo_url/zkfair/35ab0987153a8355a454223aae371ac7.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/zkfair/c66f35d57c6146cdff82dfeb316ba801.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/zkfair/4133904f2769ebcffa48177c0b7831a6.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://scan.zkfair.io", "need_estimate_gas": false}, {"id": "alot", "community_id": 432204, "name": "Dexalot", "native_token": {"id": "alot", "symbol": "ALOT", "logo": "https://static.debank.com/image/alot_token/logo_url/alot/a03e5e8bc56a8bcd5f5c7b830e8b5877.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/alot/0ed4884da27d022dbd5ed5bc919ee248.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/alot/8ed0cbf9842daef43fbb32558d4f4309.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://subnets.avax.network/dexalot", "need_estimate_gas": false}, {"id": "bfc", "community_id": 3068, "name": "Bifrost", "native_token": {"id": "bfc", "symbol": "BFC", "logo": "https://static.debank.com/image/bfc_token/logo_url/bfc/f0c01b58f084660f8c8ff43f5c85301c.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/bfc/7c10f5191b16d0cc068cb6eff32b6347.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/bfc/728682dd1707271a7b268fac3594e94e.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.mainnet.bifrostnetwork.com", "need_estimate_gas": false}, {"id": "xai", "community_id": 660279, "name": "Xai", "native_token": {"id": "xai", "symbol": "XAI", "logo": "https://static.debank.com/image/xai_token/logo_url/xai/022ab00135c182f6e67e583ecda93863.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/xai/b02622ce65251bdcb31aa6621a10a096.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/xai/9eb29c6f965e70ed84e50f8e9e577b1e.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.xai-chain.net", "need_estimate_gas": false}, {"id": "zeta", "community_id": 7000, "name": "ZetaChain", "native_token": {"id": "zeta", "symbol": "ZETA", "logo": "https://static.debank.com/image/zeta_token/logo_url/zeta/d0e1b5e519d99c452a30e83a1263d1d0.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/zeta/d0e1b5e519d99c452a30e83a1263d1d0.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/zeta/fb4ab4eb798244887bfd65455bd42d6b.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://zetachain.blockscout.com", "need_estimate_gas": false}, {"id": "rari", "community_id": 1380012617, "name": "RARI", "native_token": {"id": "rari", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/rari/67fc6abba5cfc6bb3a57bb6afcf5afee.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/rari/73456a9386ce19d00584fec493206005.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://mainnet.explorer.rarichain.org", "need_estimate_gas": false}, {"id": "dym", "community_id": 1100, "name": "Dymension", "native_token": {"id": "dym", "symbol": "DYM", "logo": "https://static.debank.com/image/dym_token/logo_url/dym/ab62b0f446408c84a2e17d9178a4e8e9.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/dym/ab62b0f446408c84a2e17d9178a4e8e9.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/dym/0a9e4481802f4c0aae6a5a97605809d8.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://dym.fyi", "need_estimate_gas": false}, {"id": "merlin", "community_id": 4200, "name": "Merlin", "native_token": {"id": "merlin", "symbol": "BTC", "logo": "https://static.debank.com/image/merlin_token/logo_url/merlin/fe230e468272b84aba78d08bb4140456.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/merlin/458e4686dfb909ba871bd96fe45417a8.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/merlin/72e28432e865c544c1045017892187bc.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://scan.merlinchain.io", "need_estimate_gas": false}, {"id": "blast", "community_id": 81457, "name": "Blast", "native_token": {"id": "blast", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/blast/15132294afd38ce980639a381ee30149.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/blast/828eb570083948e156a34ab8588e26b3.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://blastscan.io", "need_estimate_gas": false}, {"id": "smr", "community_id": 148, "name": "Shimmer EVM", "native_token": {"id": "smr", "symbol": "SMR", "logo": "https://static.debank.com/image/smr_token/logo_url/smr/fbf679837a276530dd9b253dfa85c1f5.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/smr/d22267bfdee42c88a15e605b30861a30.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/smr/2e536df7a52d2f5948f8fd0b9f5d0cb4.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://explorer.evm.shimmer.network", "need_estimate_gas": false}, {"id": "iota", "community_id": 8822, "name": "IOTA EVM", "native_token": {"id": "iota", "symbol": "IOTA", "logo": "https://static.debank.com/image/iota_token/logo_url/iota/b2fbb37acc6a3be27231fbc49aed481a.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/iota/b2fbb37acc6a3be27231fbc49aed481a.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/iota/acedda9f542b72c0109c8c20caf526d9.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://explorer.evm.iota.org", "need_estimate_gas": false}, {"id": "platon", "community_id": 210425, "name": "PlatON", "native_token": {"id": "platon", "symbol": "LAT", "logo": "https://static.debank.com/image/platon_token/logo_url/platon/b5df1214981b0888e48fbb18d302c6ba.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/platon/b5df1214981b0888e48fbb18d302c6ba.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/platon/e5104b97d20a18df9f28b0673ebd7440.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://scan.platon.network", "need_estimate_gas": false}, {"id": "rollux", "community_id": 570, "name": "Rollux", "native_token": {"id": "rollux", "symbol": "SYS", "logo": "https://static.debank.com/image/rollux_token/logo_url/rollux/a57476d6cd8e27ee6d7eae318c3c7eee.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/rollux/b38f1a5be41a8e87766436ad9d9919a9.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/rollux/25c6383b3ae8b989c1e234c6734ba2ae.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.rollux.com", "need_estimate_gas": false}, {"id": "sx", "community_id": 416, "name": "SX", "native_token": {"id": "sx", "symbol": "SX", "logo": "https://static.debank.com/image/sx_token/logo_url/sx/1cd91dbcb82de12b4587607bc4924bc9.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/sx/1cd91dbcb82de12b4587607bc4924bc9.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/sx/0bddf854e56d6e7629b2f8ca1be707b0.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://explorer.sx.technology", "need_estimate_gas": false}, {"id": "eon", "community_id": 7332, "name": "Horizen EON", "native_token": {"id": "eon", "symbol": "ZEN", "logo": "https://static.debank.com/image/eon_token/logo_url/eon/bf6e7dbdd2facde7ed39c9f881537775.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/eon/36deb31f3e0a7c74762971d79245f82e.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/eon/f071cd6b0e2c8a9ea6a3e213651ed7f2.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://eon-explorer.horizenlabs.io", "need_estimate_gas": false}, {"id": "ulx", "community_id": 1231, "name": "Ultron", "native_token": {"id": "ulx", "symbol": "ULX", "logo": "https://static.debank.com/image/ulx_token/logo_url/ulx/371eb14527f3a80ed382f67278f43c7e.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/ulx/371eb14527f3a80ed382f67278f43c7e.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/ulx/7d6d20d13ec0a5c7d286aaea404f2d91.png", "eip_1559": false, "is_disabled": true, "explorer_host": "https://ulxscan.com", "need_estimate_gas": false}, {"id": "map", "community_id": 22776, "name": "MAP Protocol", "native_token": {"id": "map", "symbol": "MAPO", "logo": "https://static.debank.com/image/map_token/logo_url/map/3efde740a6e9d32661757aad8ae2b3a2.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/map/3efde740a6e9d32661757aad8ae2b3a2.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/map/18ec31888ba251dd6d47e469b636d5fe.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://www.maposcan.io", "need_estimate_gas": false}, {"id": "karak", "community_id": 2410, "name": "Karak", "native_token": {"id": "karak", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/karak/a9e47f00f6eeb2c9cc8f9551cff5fe68.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/karak/5d5ca3507b4a1d64a85406f7382412d7.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.karak.network", "need_estimate_gas": false}, {"id": "aze", "community_id": 3776, "name": "Astar zkEVM", "native_token": {"id": "aze", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/aze/6def6ac081a37e94ed0106da2cefeaf4.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/aze/490d08032b0ee878dc0251c35c26383b.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://astar-zkevm.explorer.startale.com", "need_estimate_gas": false}, {"id": "frax", "community_id": 252, "name": "Fraxtal", "native_token": {"id": "frax", "symbol": "frxETH", "logo": "https://static.debank.com/image/frax_token/logo_url/frax/4313f25f6c5196e8fce2c80fa34c73d0.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/frax/2e210d888690ad0c424355cc8471d48d.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/frax/7ae2bc54b406cd3c378b0bd28df2b3ff.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://fraxscan.com", "need_estimate_gas": false}, {"id": "lumio", "community_id": 8866, "name": "SuperLumio", "native_token": {"id": "lumio", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/lumio/be6cd376260e0e214d8486f2300a4fb9.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/lumio/7960121f0a9235ff30bc65c57f0fe3a8.png", "eip_1559": true, "is_disabled": true, "explorer_host": "https://explorer.lumio.io", "need_estimate_gas": false}, {"id": "apex", "community_id": 70700, "name": "Proof of Play Apex", "native_token": {"id": "apex", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/apex/f60665106aba5b08563e26b4ba4baf83.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/apex/e1b94232b7eeedb147c489761118411a.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.apex.proofofplay.com", "need_estimate_gas": false}, {"id": "savm", "community_id": 3109, "name": "SatoshiVM Alpha", "native_token": {"id": "savm", "symbol": "BTC", "logo": "https://static.debank.com/image/savm_token/logo_url/savm/fe230e468272b84aba78d08bb4140456.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/savm/8f92638826f2c97063c7de7726160655.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/savm/3315cc8579422c06720d9521e3bb0f90.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://svmscan.io", "need_estimate_gas": false}, {"id": "kroma", "community_id": 255, "name": "Kroma", "native_token": {"id": "kroma", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/kroma/7c88e9e0e2488172fc1fcb9da3096a70.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/kroma/a7c2e13d0aaaf866a4adf0fc7f0aa9df.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://kromascan.com", "need_estimate_gas": false}, {"id": "ela", "community_id": 20, "name": "Elastos", "native_token": {"id": "ela", "symbol": "ELA", "logo": "https://static.debank.com/image/ela_token/logo_url/ela/42a9831ba9df693f00437527ec851099.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/ela/42a9831ba9df693f00437527ec851099.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/ela/fc429a7e514b50a08ff5627575a47f6f.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://esc.elastos.io", "need_estimate_gas": false}, {"id": "bevm", "community_id": 11501, "name": "BEVM", "native_token": {"id": "bevm", "symbol": "BTC", "logo": "https://static.debank.com/image/bevm_token/logo_url/bevm/fe230e468272b84aba78d08bb4140456.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/bevm/aafd9b13a2187db02661b85c72fb3cc3.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/bevm/0030aceb597e1c79f55c53676171d636.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://scan-mainnet.bevm.io", "need_estimate_gas": false}, {"id": "degen", "community_id": 666666666, "name": "Degen", "native_token": {"id": "degen", "symbol": "DEGEN", "logo": "https://static.debank.com/image/degen_token/logo_url/degen/29dd6d5df71347d2ad3b77c194915844.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/degen/29dd6d5df71347d2ad3b77c194915844.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/degen/c046b42727ff864d1865a102442affb8.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.degen.tips", "need_estimate_gas": false}, {"id": "zklink", "community_id": 810180, "name": "zkLink Nova", "native_token": {"id": "zklink", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/zklink/b3a4000979cc4f3701135a5f565ffeb0.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/zklink/585235bd940f119317757760798237ae.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.zklink.io", "need_estimate_gas": false}, {"id": "xlayer", "community_id": 196, "name": "X Layer", "native_token": {"id": "xlayer", "symbol": "OKB", "logo": "https://static.debank.com/image/xlayer_token/logo_url/xlayer/02e2fec5f8b2f5783ceb38d683557de3.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/xlayer/282a62903a4c74a964b704a161d1ba39.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/xlayer/bb5d85b54ec4634bd8b6703b27e254ba.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://www.oklink.com/xlayer", "need_estimate_gas": false}, {"id": "molten", "community_id": 360, "name": "Molten", "native_token": {"id": "molten", "symbol": "MOLTEN", "logo": "https://static.debank.com/image/molten_token/logo_url/molten/9cb5d5dc7b200ceaa577e0431a731203.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/molten/9cb5d5dc7b200ceaa577e0431a731203.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/molten/56b94881ef4e1e8ea6765dc5442bf17a.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://molten.calderaexplorer.xyz", "need_estimate_gas": false}, {"id": "btr", "community_id": 200901, "name": "Bitlayer", "native_token": {"id": "btr", "symbol": "BTC", "logo": "https://static.debank.com/image/btr_token/logo_url/btr/fe230e468272b84aba78d08bb4140456.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/btr/78ff16cf14dad73c168a70f7c971e401.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/btr/33a233f67cb62320dd49c7a3a05c1d4b.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://www.btrscan.com", "need_estimate_gas": false}, {"id": "b2", "community_id": 223, "name": "B\u00b2", "native_token": {"id": "b2", "symbol": "BTC", "logo": "https://static.debank.com/image/b2_token/logo_url/b2/fe230e468272b84aba78d08bb4140456.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/b2/6ca6c8bc33af59c5b9273a2b7efbd236.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/b2/3df748afc47cc1c76107981bc312a190.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.bsquared.network", "need_estimate_gas": false}, {"id": "bob", "community_id": 60808, "name": "BOB", "native_token": {"id": "bob", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/bob/4e0029be99877775664327213a8da60e.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/bob/7f61e1ed6fae04833ee21d83c9998d22.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.gobob.xyz", "need_estimate_gas": false}, {"id": "reya", "community_id": 1729, "name": "Reya", "native_token": {"id": "reya", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/reya/20d71aad4279c33229297da1f00d8ae1.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/reya/7643e04c35af62a7572aecbdc4565040.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.reya.network", "need_estimate_gas": true}, {"id": "bb", "community_id": 6001, "name": "BounceBit", "native_token": {"id": "bb", "symbol": "BB", "logo": "https://static.debank.com/image/bb_token/logo_url/bb/da74a4980f24d870cb43ccd763e0c966.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/bb/da74a4980f24d870cb43ccd763e0c966.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/bb/31ba7b64206471376f34f2b4c5c097f8.png", "eip_1559": true, "is_disabled": true, "explorer_host": "https://bbscan.io", "need_estimate_gas": false}, {"id": "ailayer", "community_id": 2649, "name": "AILayer", "native_token": {"id": "ailayer", "symbol": "BTC", "logo": "https://static.debank.com/image/ailayer_token/logo_url/ailayer/fe230e468272b84aba78d08bb4140456.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/ailayer/54ed2cefa4246acecb0b0ba6ddaf5e8a.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/ailayer/cdf4f9fb0b1c4d14da133ce76ebf0b76.png", "eip_1559": true, "is_disabled": true, "explorer_host": "https://mainnet-explorer.anvm.io", "need_estimate_gas": false}, {"id": "sanko", "community_id": 1996, "name": "Sanko", "native_token": {"id": "sanko", "symbol": "DMT", "logo": "https://static.debank.com/image/sanko_token/logo_url/sanko/a3ab5461c7afa714c877cf57fbb033ad.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/sanko/a3ab5461c7afa714c877cf57fbb033ad.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/sanko/596ade63d11b1a8eafcffc9ecac32632.png", "eip_1559": true, "is_disabled": true, "explorer_host": "https://explorer.sanko.xyz", "need_estimate_gas": false}, {"id": "taiko", "community_id": 167000, "name": "Taiko", "native_token": {"id": "taiko", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/taiko/7723fbdb38ef181cd07a8b8691671e6b.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/taiko/16d831636a2aa32e5b58f264a61311e0.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://taikoscan.io", "need_estimate_gas": false}, {"id": "cyber", "community_id": 7560, "name": "Cyber", "native_token": {"id": "cyber", "symbol": "ETH", "logo": "https://static.debank.com/image/coin/logo_url/eth/6443cdccced33e204d90cb723c632917.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/cyber/3a3c0c5da5fa8876c8c338afae0db478.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/cyber/239566559dc0c5fd5f5e2d76b85c6490.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://cyberscan.co", "need_estimate_gas": false}, {"id": "sei", "community_id": 1329, "name": "Sei", "native_token": {"id": "sei", "symbol": "SEI", "logo": "https://static.debank.com/image/sei_token/logo_url/sei/34ddf58f678be2db5b2636b59c9828b5.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/sei/34ddf58f678be2db5b2636b59c9828b5.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/sei/632af17fefaa435817bd6bc3c549280d.png", "eip_1559": false, "is_disabled": false, "explorer_host": "https://seitrace.com", "need_estimate_gas": false}, {"id": "strax", "community_id": 105105, "name": "Stratis", "native_token": {"id": "strax", "symbol": "STRAX", "logo": "https://static.debank.com/image/strax_token/logo_url/strax/62929cc22496a34349782a0c685377dd.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/strax/7675d16c026442847faf6bbe7708bf9c.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/strax/01db3348ae950906fec6ec74966b59f9.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://explorer.stratisevm.com", "need_estimate_gas": false}, {"id": "mint", "community_id": 185, "name": "Mint", "native_token": {"id": "mint", "symbol": "ETH", "logo": "https://static.debank.com/image/mint_token/logo_url/mint/48bfb74adddd170e936578aec422836d.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/mint/86404f93cd4e51eafcc2e244d417c03f.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/mint/1bc50cbf5ec022d40efe48c4ec68c25d.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://mintscan.org", "need_estimate_gas": false}, {"id": "dbk", "community_id": 20240603, "name": "DBK Chain", "native_token": {"id": "dbk", "symbol": "ETH", "logo": "https://static.debank.com/image/dbk_token/logo_url/dbk/48bfb74adddd170e936578aec422836d.png", "decimals": 18}, "logo_url": "https://static.debank.com/image/chain/logo_url/dbk/1255de5a9316fed901d14c069ac62f39.png", "white_logo_url": "https://static.debank.com/image/chain/white_logo_url/dbk/f3b17c6a54b98b86a158061706277f06.png", "eip_1559": true, "is_disabled": false, "explorer_host": "https://scan.dbkchain.io", "need_estimate_gas": false}] \ No newline at end of file diff --git a/src/constant/index.ts b/src/constant/index.ts index eaee4b1143d..6161b9e07f5 100644 --- a/src/constant/index.ts +++ b/src/constant/index.ts @@ -1403,12 +1403,6 @@ export const SWAP_FEE_ADDRESS = '0x39041F1B366fE33F9A5a79dE5120F2Aee2577ebc'; export const ETH_USDT_CONTRACT = '0xdac17f958d2ee523a2206206994597c13d831ec7'; export const DEX = { - [DEX_ENUM.ONEINCH]: { - id: DEX_ENUM.ONEINCH, - logo: Logo1inch, - name: '1inch', - chains: DEX_SUPPORT_CHAINS[DEX_ENUM.ONEINCH], - }, [DEX_ENUM.ZEROXAPI]: { id: DEX_ENUM.ZEROXAPI, logo: Logo0X, @@ -1421,6 +1415,25 @@ export const DEX = { name: 'ParaSwap', chains: DEX_SUPPORT_CHAINS[DEX_ENUM.PARASWAP], }, + [DEX_ENUM.ONEINCH]: { + id: DEX_ENUM.ONEINCH, + logo: Logo1inch, + name: '1inch', + chains: DEX_SUPPORT_CHAINS[DEX_ENUM.ONEINCH], + }, + + [DEX_ENUM.OPENOCEAN]: { + id: DEX_ENUM.OPENOCEAN, + logo: LogoOpenOcean, + name: 'OpenOcean', + chains: DEX_SUPPORT_CHAINS[DEX_ENUM.OPENOCEAN], + }, + [DEX_ENUM.KYBERSWAP]: { + id: DEX_ENUM.KYBERSWAP, + logo: LogoKyberSwap, + name: 'KyberSwap', + chains: DEX_SUPPORT_CHAINS[DEX_ENUM.KYBERSWAP], + }, }; export const DEX_WITH_WRAP = { @@ -1433,21 +1446,21 @@ export const DEX_WITH_WRAP = { }; export const CEX = { - binance: { - id: 'binance', - name: 'Binance', - logo: LogoBinance, - }, - coinbase: { - id: 'coinbase', - name: 'Coinbase', - logo: LogoCoinbase, - }, - okex: { - id: 'okex', - name: 'OKX', - logo: LogoOkx, - }, + // binance: { + // id: 'binance', + // name: 'Binance', + // logo: LogoBinance, + // }, + // coinbase: { + // id: 'coinbase', + // name: 'Coinbase', + // logo: LogoCoinbase, + // }, + // okex: { + // id: 'okex', + // name: 'OKX', + // logo: LogoOkx, + // }, }; export const SWAP_SUPPORT_CHAINS = Array.from( diff --git a/src/ui/assets/bridge/bungee.png b/src/ui/assets/bridge/bungee.png new file mode 100644 index 00000000000..960186907ac Binary files /dev/null and b/src/ui/assets/bridge/bungee.png differ diff --git a/src/ui/assets/bridge/down.svg b/src/ui/assets/bridge/down.svg new file mode 100644 index 00000000000..1ee15622aa4 --- /dev/null +++ b/src/ui/assets/bridge/down.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/src/ui/assets/bridge/duration.svg b/src/ui/assets/bridge/duration.svg new file mode 100644 index 00000000000..7cb07acf2ae --- /dev/null +++ b/src/ui/assets/bridge/duration.svg @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/src/ui/assets/bridge/empty-cc.svg b/src/ui/assets/bridge/empty-cc.svg new file mode 100644 index 00000000000..3a3fe22ed6b --- /dev/null +++ b/src/ui/assets/bridge/empty-cc.svg @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/src/ui/assets/bridge/li-fi.png b/src/ui/assets/bridge/li-fi.png new file mode 100644 index 00000000000..d8a07527059 Binary files /dev/null and b/src/ui/assets/bridge/li-fi.png differ diff --git a/src/ui/assets/bridge/pending.svg b/src/ui/assets/bridge/pending.svg new file mode 100644 index 00000000000..ae43b6d8b62 --- /dev/null +++ b/src/ui/assets/bridge/pending.svg @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/ui/assets/bridge/question-cc.svg b/src/ui/assets/bridge/question-cc.svg new file mode 100644 index 00000000000..8692e9c996c --- /dev/null +++ b/src/ui/assets/bridge/question-cc.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/ui/assets/dashboard/bridge.svg b/src/ui/assets/dashboard/bridge.svg new file mode 100644 index 00000000000..4c5a2296ed8 --- /dev/null +++ b/src/ui/assets/dashboard/bridge.svg @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/src/ui/assets/dashboard/receive-header.svg b/src/ui/assets/dashboard/receive-header.svg new file mode 100644 index 00000000000..036e71bf746 --- /dev/null +++ b/src/ui/assets/dashboard/receive-header.svg @@ -0,0 +1,16 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/ui/assets/swap/gas-cc.svg b/src/ui/assets/swap/gas-cc.svg new file mode 100644 index 00000000000..c17857533b8 --- /dev/null +++ b/src/ui/assets/swap/gas-cc.svg @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/src/ui/assets/swap/hidden-quote-arrow.svg b/src/ui/assets/swap/hidden-quote-arrow.svg new file mode 100644 index 00000000000..cdcd9ee8940 --- /dev/null +++ b/src/ui/assets/swap/hidden-quote-arrow.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/src/ui/component/ChainSelector/InForm.tsx b/src/ui/component/ChainSelector/InForm.tsx index cd41544df3d..c4c9482d399 100644 --- a/src/ui/component/ChainSelector/InForm.tsx +++ b/src/ui/component/ChainSelector/InForm.tsx @@ -45,10 +45,12 @@ export const ChainRender = ({ chain, readonly, className, + arrowDownComponent, ...other }: { chain: CHAINS_ENUM; readonly: boolean; + arrowDownComponent?: React.ReactNode; } & InsHTMLAttributes) => { const wallet = useWallet(); @@ -82,7 +84,12 @@ export const ChainRender = ({ /> {chainInfo?.name} {/* {!readonly && } */} - {!readonly && } + {!readonly && + (arrowDownComponent ? ( + arrowDownComponent + ) : ( + + ))} ); }; @@ -96,6 +103,8 @@ interface ChainSelectorProps { supportChains?: SelectChainListProps['supportChains']; disabledTips?: SelectChainListProps['disabledTips']; title?: React.ReactNode; + chainRenderClassName?: string; + arrowDownComponent?: React.ReactNode; } export default function ChainSelectorInForm({ value, @@ -105,6 +114,8 @@ export default function ChainSelectorInForm({ disabledTips, title, supportChains, + chainRenderClassName, + arrowDownComponent, }: ChainSelectorProps) { const [showSelectorModal, setShowSelectorModal] = useState(showModal); @@ -130,6 +141,8 @@ export default function ChainSelectorInForm({ chain={value} onClick={handleClickSelector} readonly={readonly} + className={chainRenderClassName} + arrowDownComponent={arrowDownComponent} /> {!readonly && ( ()({ dispatch.preference.init(); dispatch.swap.init(); dispatch.whitelist.init(); + dispatch.bridge.init(); }, }), }); diff --git a/src/ui/models/bridge.ts b/src/ui/models/bridge.ts new file mode 100644 index 00000000000..5e5a0a610b3 --- /dev/null +++ b/src/ui/models/bridge.ts @@ -0,0 +1,157 @@ +import { createModel } from '@rematch/core'; +import { RootModel } from '.'; +import { CHAINS, CHAINS_ENUM } from 'consts'; +import { TokenItem } from '@rabby-wallet/rabby-api/dist/types'; +import { BridgeServiceStore } from '@/background/service/bridge'; +import { BridgeAggregator } from '@/background/service/openapi'; +import { + DEFAULT_BRIDGE_AGGREGATOR, + DEFAULT_BRIDGE_SUPPORTED_CHAIN, +} from '@/constant/bridge'; + +export const bridge = createModel()({ + name: 'bridge', + + state: { + supportedChains: DEFAULT_BRIDGE_SUPPORTED_CHAIN, + aggregatorsListInit: false, + aggregatorsList: DEFAULT_BRIDGE_AGGREGATOR, + selectedAggregators: [], + selectedDex: null, + selectedChain: null, + unlimitedAllowance: false, + sortIncludeGasFee: true, + $$initialSelectedChain: null, + firstOpen: true, + } as Partial & { + $$initialSelectedChain: CHAINS_ENUM | null; + aggregatorsList: BridgeAggregator[]; + aggregatorsListInit: boolean; + supportedChains: CHAINS_ENUM[]; + }, + + reducers: { + setField(state, payload: Partial) { + return Object.keys(payload).reduce( + (accu, key) => { + accu[key] = payload[key]; + return accu; + }, + { ...state } + ); + }, + }, + + effects: (dispatch) => ({ + init() { + return this.syncState(); + }, + async syncState(key: keyof BridgeServiceStore | undefined, store) { + const data = await store.app.wallet.getBridgeData(key); + this.fetchAggregatorsList(); + this.fetchSupportedChains(); + + this.setField( + key + ? { + [key]: data, + } + : { + ...(data as BridgeServiceStore), + } + ); + + if (!key) { + this.setField({ + $$initialSelectedChain: + (data as BridgeServiceStore).selectedChain || null, + }); + } + }, + + async setSelectedAggregators(selectedAggregators: string[], store) { + await store.app.wallet.setBridgeAggregators(selectedAggregators); + + this.setField({ + selectedAggregators, + }); + }, + + async setSelectedChain(selectedChain: CHAINS_ENUM, store) { + await store.app.wallet.setBridgeSelectedChain(selectedChain); + + this.setField({ + selectedChain, + }); + }, + + async setSelectedFromToken( + selectedFromToken: TokenItem | undefined, + store + ) { + await store.app.wallet.setBridgeSelectedFromToken(selectedFromToken); + + this.setField({ + selectedFromToken, + }); + }, + + async setSelectedToToken(selectedToToken: TokenItem | undefined, store) { + await store.app.wallet.setBridgeSelectedToToken(selectedToToken); + + this.setField({ + selectedToToken, + }); + }, + + async setUnlimitedAllowance(unlimitedAllowance: boolean, store) { + await store.app.wallet.setBridgeUnlimitedAllowance(unlimitedAllowance); + + this.setField({ + unlimitedAllowance, + }); + }, + + async getSwapSortIncludeGasFee(_: void, store) { + const sortIncludeGasFee = await store.app.wallet.getBridgeSortIncludeGasFee(); + this.setField({ + sortIncludeGasFee, + }); + }, + + async setSwapSortIncludeGasFee(bool: boolean, store) { + await store.app.wallet.setBridgeSortIncludeGasFee(bool); + this.getSwapSortIncludeGasFee(); + }, + + async fetchAggregatorsList(_: void, store) { + const aggregatorsList = await store.app.wallet.openapi.getBridgeAggregatorList(); + if (aggregatorsList.length) { + this.setField({ + aggregatorsListInit: true, + aggregatorsList, + }); + } + }, + + async fetchSupportedChains(_: void, store) { + const chains = await store.app.wallet.openapi.getBridgeSupportChain(); + if (chains.length) { + const mappings = Object.values(CHAINS).reduce((acc, chain) => { + acc[chain.serverId] = chain.enum; + return acc; + }, {} as Record); + this.setField({ + supportedChains: chains.map((item) => mappings[item]), + }); + } + }, + + async setBridgeSettingFirstOpen(bool: boolean, store) { + await store.app.wallet.setBridgeSettingFirstOpen(bool); + this.setField({ + firstOpen: bool, + }); + }, + }), +}); diff --git a/src/ui/models/index.ts b/src/ui/models/index.ts index d4229139dda..a07e7f06bba 100644 --- a/src/ui/models/index.ts +++ b/src/ui/models/index.ts @@ -18,6 +18,7 @@ import { swap } from './swap'; import { customRPC } from './customRPC'; import { securityEngine } from './securityEngine'; import { sign } from './sign'; +import { bridge } from './bridge'; export interface RootModel extends Models { app: typeof app; @@ -38,6 +39,7 @@ export interface RootModel extends Models { customRPC: typeof customRPC; securityEngine: typeof securityEngine; sign: typeof sign; + bridge: typeof bridge; } export const models: RootModel = { @@ -59,6 +61,7 @@ export const models: RootModel = { customRPC, securityEngine, sign, + bridge, }; export type RabbyDispatch = RematchDispatch; diff --git a/src/ui/models/swap.ts b/src/ui/models/swap.ts index a931a78c5ad..ba95124b3ce 100644 --- a/src/ui/models/swap.ts +++ b/src/ui/models/swap.ts @@ -1,7 +1,7 @@ import { createModel } from '@rematch/core'; import { RootModel } from '.'; import { ChainGas } from 'background/service/preference'; -import { CHAINS_ENUM } from 'consts'; +import { CHAINS_ENUM, DEX } from 'consts'; import { SwapServiceStore } from '@/background/service/swap'; import { DEX_ENUM } from '@rabby-wallet/rabby-swap'; import { TokenItem } from '@rabby-wallet/rabby-api/dist/types'; @@ -10,6 +10,7 @@ export const swap = createModel()({ name: 'swap', state: { + supportedDEXList: Object.keys(DEX), selectedDex: null, selectedChain: null, gasPriceCache: {}, @@ -21,6 +22,7 @@ export const swap = createModel()({ $$initialSelectedChain: null, } as Partial & { $$initialSelectedChain: CHAINS_ENUM | null; + supportedDEXList: string[]; }, reducers: { @@ -58,6 +60,8 @@ export const swap = createModel()({ (data as SwapServiceStore).selectedChain || null, }); } + + await this.getSwapSupportedDEXList(); }, async getSwapGasCache(chain: CHAINS_ENUM, store) { @@ -180,5 +184,14 @@ export const swap = createModel()({ await store.app.wallet.setSwapPreferMEVGuarded(bool); this.getSwapPreferMEV(); }, + + async getSwapSupportedDEXList(_: void, store) { + const data = await store.app.wallet.openapi.getSupportedDEXList(); + if (data.dex_list) { + this.setField({ + supportedDEXList: data.dex_list, + }); + } + }, }), }); diff --git a/src/ui/style/antd-overwrite.less b/src/ui/style/antd-overwrite.less index 899fa8e1c47..d62e826da66 100644 --- a/src/ui/style/antd-overwrite.less +++ b/src/ui/style/antd-overwrite.less @@ -273,6 +273,19 @@ ---------------------*/ .ant-switch { background: #b4bdcc; + + &.ant-switch-small { + height: 14px; + line-height: 14px; + .ant-switch-handle { + top: 1px; + left: 1px; + } + + &.ant-switch-checked .ant-switch-handle { + left: calc(100% - 12px - 1px); + } + } } .ant-switch-disabled { diff --git a/src/ui/views/Bridge/Component/AggregatorsSettings.tsx b/src/ui/views/Bridge/Component/AggregatorsSettings.tsx new file mode 100644 index 00000000000..aeae5f20c47 --- /dev/null +++ b/src/ui/views/Bridge/Component/AggregatorsSettings.tsx @@ -0,0 +1,205 @@ +import { Checkbox, Modal, Popup } from '@/ui/component'; +import React, { useEffect, useState } from 'react'; +import { useSetSettingVisible } from '../hooks'; +import clsx from 'clsx'; +import { Button, Switch } from 'antd'; +import { useTranslation } from 'react-i18next'; + +import { useRabbyDispatch, useRabbySelector } from '@/ui/store'; +import { TooltipWithMagnetArrow } from '@/ui/component/Tooltip/TooltipWithMagnetArrow'; + +export const AggregatorsSettings = ({ + visible, + onClose, +}: { + visible: boolean; + onClose: () => void; +}) => { + const { t } = useTranslation(); + + const setVisible = useSetSettingVisible(); + + const dispatch = useRabbyDispatch(); + + const aggregatorsList = useRabbySelector((s) => s.bridge.aggregatorsList); + + const aggregatorsListInit = useRabbySelector( + (s) => s.bridge.aggregatorsListInit + ); + const selectedAggregators = useRabbySelector( + (s) => s.bridge.selectedAggregators || [] + ); + const aggregatorsSettingFirstOpen = useRabbySelector( + (s) => s.bridge.firstOpen ?? true + ); + const [willChangedAggregatorId, setSillChangedAggregatorId] = useState(''); + + const [open, setOpen] = useState(false); + + const onConfirm = async () => { + if (willChangedAggregatorId) { + const changedItems = selectedAggregators.includes(willChangedAggregatorId) + ? selectedAggregators.filter((id) => id !== willChangedAggregatorId) + : [...selectedAggregators, willChangedAggregatorId]; + + dispatch.bridge.setSelectedAggregators(changedItems); + setOpen(false); + } + }; + + useEffect(() => { + if (aggregatorsListInit && aggregatorsList.length) { + const availableAggregators = aggregatorsList.some((item) => { + return selectedAggregators?.includes(item.id); + }); + if (!availableAggregators && aggregatorsSettingFirstOpen) { + setVisible(true); + dispatch.bridge.setBridgeSettingFirstOpen(false); + } + dispatch.bridge.setBridgeSettingFirstOpen(false); + } + }, [ + aggregatorsList, + aggregatorsListInit, + selectedAggregators, + aggregatorsSettingFirstOpen, + ]); + + return ( + + {t('page.bridge.settingModal.title')} + + } + height={412} + onClose={onClose} + bodyStyle={{ + paddingTop: 16, + }} + isSupportDarkMode + isNew + > +
+ {aggregatorsList?.map((item) => { + const checked = !!selectedAggregators?.includes(item.id); + + const switchChecked = () => { + if (!checked) { + setSillChangedAggregatorId(item.id); + setOpen(true); + } + dispatch.bridge.setSelectedAggregators( + selectedAggregators.filter((id) => id !== item.id) + ); + }; + + return ( +
+
+
+ + + {item.name} + +
+ + +
+ +
+ + {t('page.bridge.settingModal.SupportedBridge')} + + {item.bridge_list?.map((bridge) => { + return ( + + + + ); + })} +
+
+ ); + })} + + +
+ { + setOpen(false); + }} + > + + +
+ ); +}; + +function EnableTrading({ onConfirm }: { onConfirm: () => void }) { + const [checked, setChecked] = useState(false); + const { t } = useTranslation(); + return ( +
+
+ {t('page.bridge.settingModal.confirmModal.title')} +
+
+

{t('page.bridge.settingModal.confirmModal.tip1')}

+

{t('page.bridge.settingModal.confirmModal.tip2')}

+
+
+ + {t( + 'page.bridge.settingModal.confirmModal.i-understand-and-accept-it' + )} + + + +
+
+ ); +} diff --git a/src/ui/views/Bridge/Component/BridgeContent.tsx b/src/ui/views/Bridge/Component/BridgeContent.tsx new file mode 100644 index 00000000000..4da29aac9ba --- /dev/null +++ b/src/ui/views/Bridge/Component/BridgeContent.tsx @@ -0,0 +1,559 @@ +import React, { + useCallback, + useLayoutEffect, + useMemo, + useRef, + useState, +} from 'react'; +import { useRabbySelector } from '@/ui/store'; +import { useTokenPair } from '../hooks/token'; +import { Alert, Button, Input, message, Modal } from 'antd'; +import BigNumber from 'bignumber.js'; +import { + formatAmount, + formatTokenAmount, + formatUsdValue, + useWallet, +} from '@/ui/utils'; +import styled from 'styled-components'; +import clsx from 'clsx'; +import { QuoteList } from './BridgeQuotes'; +import { useQuoteVisible, useSetQuoteVisible } from '../hooks'; +import { InfoCircleFilled } from '@ant-design/icons'; +import { BridgeReceiveDetails } from './BridgeReceiveDetail'; +import { useRbiSource } from '@/ui/utils/ga-event'; +import { useCss } from 'react-use'; +import { getTokenSymbol } from '@/ui/utils/token'; +import ChainSelectorInForm from '@/ui/component/ChainSelector/InForm'; +import { findChainByServerID } from '@/utils/chain'; +import type { SelectChainItemProps } from '@/ui/component/ChainSelector/components/SelectChainItem'; +import i18n from '@/i18n'; +import { useTranslation } from 'react-i18next'; +import { BridgeTokenPair } from './BridgeTokenPair'; +import { ReactComponent as RcArrowDown } from '@/ui/assets/bridge/down.svg'; + +import { ReactComponent as RcIconQuestion } from '@/ui/assets/bridge/question-cc.svg'; +import { TooltipWithMagnetArrow } from '@/ui/component/Tooltip/TooltipWithMagnetArrow'; +import pRetry from 'p-retry'; +import stats from '@/stats'; + +const tipsClassName = clsx('text-r-neutral-body text-12 mb-8 pt-16'); + +const StyledInput = styled(Input)` + height: 46px; + font-weight: 500; + font-size: 18px; + box-shadow: none; + border-radius: 4px; + border: 0.5px solid var(--r-neutral-line, #d3d8e0); + background: transparent !important; + & > .ant-input { + font-weight: 500; + font-size: 18px; + border-width: 0px !important; + border-color: transparent; + } + &.ant-input-affix-wrapper:not(.ant-input-affix-wrapper-disabled):hover { + border-width: 0.5px !important; + } + &:active { + border: 0.5px solid transparent; + } + &:focus, + &:focus-within { + border-width: 0.5px !important; + border-color: var(--r-blue-default, #7084ff) !important; + } + &:hover { + border-width: 0.5px !important; + border-color: var(--r-blue-default, #7084ff) !important; + box-shadow: none; + } + + &:placeholder-shown { + color: #707280; + } + &::-webkit-inner-spin-button, + &::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; + } +`; + +const getDisabledTips: SelectChainItemProps['disabledTips'] = (ctx) => { + const chainItem = findChainByServerID(ctx.chain.serverId); + + if (chainItem?.isTestnet) return i18n.t('page.swap.testnet-is-not-supported'); + + return i18n.t('page.swap.not-supported'); +}; + +export const BridgeContent = () => { + const { userAddress } = useRabbySelector((state) => ({ + userAddress: state.account.currentAccount?.address || '', + })); + + const { + chain, + switchChain, + + payToken, + setPayToken, + receiveToken, + setReceiveToken, + + handleAmountChange, + handleBalance, + payAmount, + inSufficient, + + quoteLoading, + quoteList, + + selectedBridgeQuote, + + setSelectedBridgeQuote, + expired, + } = useTokenPair(userAddress); + + const aggregatorIds = useRabbySelector( + (s) => s.bridge.aggregatorsList.map((e) => e.id) || [] + ); + + const inputRef = useRef(); + + useLayoutEffect(() => { + if ((payToken?.id, receiveToken?.id)) { + inputRef.current?.focus(); + } + }, [payToken?.id, receiveToken?.id]); + + const visible = useQuoteVisible(); + const setVisible = useSetQuoteVisible(); + const { t } = useTranslation(); + + const btnText = useMemo(() => { + if (selectedBridgeQuote && expired) { + return t('page.bridge.price-expired-refresh-route'); + } + if (selectedBridgeQuote?.shouldApproveToken) { + return t('page.bridge.approve-and-bridge', { + name: selectedBridgeQuote?.aggregator.name || '', + }); + } + if (selectedBridgeQuote?.aggregator.name) { + return t('page.bridge.bridge-via-x', { + name: selectedBridgeQuote?.aggregator.name, + }); + } + + return t('page.bridge.getRoutes'); + }, [selectedBridgeQuote, expired, t]); + + const wallet = useWallet(); + const rbiSource = useRbiSource(); + + const supportedChains = useRabbySelector((s) => s.bridge.supportedChains); + const [fetchingBridgeQuote, setFetchingBridgeQuote] = useState(false); + + const gotoBridge = useCallback(async () => { + if ( + !inSufficient && + payToken && + receiveToken && + selectedBridgeQuote?.bridge_id + ) { + try { + setFetchingBridgeQuote(true); + const { tx } = await pRetry( + () => + wallet.openapi.getBridgeQuote({ + aggregator_id: selectedBridgeQuote.aggregator.id, + bridge_id: selectedBridgeQuote.bridge_id, + from_token_id: payToken.id, + user_addr: userAddress, + from_chain_id: payToken.chain, + from_token_raw_amount: new BigNumber(payAmount) + .times(10 ** payToken.decimals) + .toFixed(0, 1) + .toString(), + to_chain_id: receiveToken.chain, + to_token_id: receiveToken.id, + }), + { retries: 1 } + ); + stats.report('bridgeQuoteResult', { + aggregatorIds: selectedBridgeQuote.aggregator.id, + bridgeId: selectedBridgeQuote.bridge_id, + fromChainId: payToken.chain, + fromTokenId: payToken.id, + toTokenId: receiveToken.id, + toChainId: receiveToken.chain, + status: tx ? 'success' : 'fail', + }); + wallet.bridgeToken( + { + to: tx.to, + value: tx.value, + data: tx.data, + payTokenRawAmount: new BigNumber(payAmount) + .times(10 ** payToken.decimals) + .toFixed(0, 1) + .toString(), + chainId: tx.chainId, + shouldApprove: !!selectedBridgeQuote.shouldApproveToken, + shouldTwoStepApprove: !!selectedBridgeQuote.shouldTwoStepApprove, + payTokenId: payToken.id, + payTokenChainServerId: payToken.chain, + info: { + aggregator_id: selectedBridgeQuote.aggregator.id, + bridge_id: selectedBridgeQuote.bridge_id, + from_chain_id: payToken.chain, + from_token_id: payToken.id, + from_token_amount: payAmount, + to_chain_id: receiveToken.chain, + to_token_id: receiveToken.id, + to_token_amount: selectedBridgeQuote.to_token_amount, + tx: tx, + rabby_fee: selectedBridgeQuote.rabby_fee.usd_value, + }, + }, + { + ga: { + category: 'Bridge', + source: 'bridge', + trigger: rbiSource, + }, + } + ); + window.close(); + } catch (error) { + message.error(error?.message || String(error)); + stats.report('bridgeQuoteResult', { + aggregatorIds: selectedBridgeQuote.aggregator.id, + bridgeId: selectedBridgeQuote.bridge_id, + fromChainId: payToken.chain, + fromTokenId: payToken.id, + toTokenId: receiveToken.id, + toChainId: receiveToken.chain, + status: 'fail', + }); + console.error(error); + } finally { + setFetchingBridgeQuote(false); + } + } + }, [ + inSufficient, + payToken, + receiveToken, + selectedBridgeQuote?.tx, + selectedBridgeQuote?.shouldApproveToken, + selectedBridgeQuote?.shouldTwoStepApprove, + selectedBridgeQuote?.aggregator.id, + selectedBridgeQuote?.bridge_id, + selectedBridgeQuote?.to_token_amount, + wallet, + payAmount, + rbiSource, + ]); + + const twoStepApproveCn = useCss({ + '& .ant-modal-content': { + background: '#fff', + }, + '& .ant-modal-body': { + padding: '12px 8px 32px 16px', + }, + '& .ant-modal-confirm-content': { + padding: '4px 0 0 0', + }, + '& .ant-modal-confirm-btns': { + justifyContent: 'center', + '.ant-btn-primary': { + width: '260px', + height: '40px', + }, + 'button:first-child': { + display: 'none', + }, + }, + }); + + return ( +
+
+
{t('page.bridge.bridgeTo')}
+ } + /> + +
+ {t('page.bridge.BridgeTokenPair')} +
+ +
+ { + setPayToken(value.from); + setReceiveToken(value.to); + }} + value={useMemo( + () => + payToken && receiveToken + ? { + from: payToken, + to: receiveToken, + } + : undefined, + [payToken, receiveToken] + )} + aggregatorIds={aggregatorIds || []} + chain={chain} + /> +
+ +
+
+ {t('page.bridge.Amount', { + symbol: payToken ? getTokenSymbol(payToken) : '', + })} +
+
{ + handleBalance(); + }} + > + {t('global.Balance')}: {formatAmount(payToken?.amount || 0)} +
+
+ + {payAmount + ? `≈ ${formatUsdValue( + new BigNumber(payAmount) + .times(payToken?.price || 0) + .toString(10) + )}` + : ''} + + } + /> + + {payAmount && + selectedBridgeQuote && + selectedBridgeQuote?.to_token_amount && + payToken && + receiveToken && ( + <> + + +
+
+
+
+ {t('page.bridge.bridge-cost')} + + +

+ {selectedBridgeQuote?.aggregator?.name} Fee:{' '} + {formatTokenAmount( + new BigNumber( + selectedBridgeQuote.protocol_fee.raw_amount_hex_str + ) + .div(10 ** (receiveToken?.decimals || 18)) + .toString(), + 4, + true + )}{' '} + {getTokenSymbol(receiveToken)} +

+ +

+ Rabby Fee:{' '} + {formatTokenAmount( + new BigNumber( + selectedBridgeQuote.rabby_fee.raw_amount_hex_str + ) + .div(10 ** (receiveToken?.decimals || 18)) + .toString(), + 4, + true + )}{' '} + {getTokenSymbol(receiveToken)} +

+
+ } + > + + + + +
+ + {formatTokenAmount( + new BigNumber( + selectedBridgeQuote.rabby_fee.raw_amount_hex_str + ) + .plus( + selectedBridgeQuote.protocol_fee.raw_amount_hex_str + ) + .div(10 ** (receiveToken?.decimals || 18)) + .toString() + )}{' '} + {receiveToken ? getTokenSymbol(receiveToken) : ''} + +
+ +
+ {t('page.bridge.rabby-fee')} + + 0.25% + +
+
+
+ + )} +
+ + {inSufficient ? ( + + } + banner + message={ + + {t('page.bridge.insufficient-balance')} + + } + /> + ) : null} + +
+ +
+ {payToken && receiveToken && chain ? ( + { + setVisible(false); + }} + userAddress={userAddress} + chain={chain} + payToken={payToken} + payAmount={payAmount} + receiveToken={receiveToken} + inSufficient={inSufficient} + setSelectedBridgeQuote={setSelectedBridgeQuote} + /> + ) : null} + + ); +}; diff --git a/src/ui/views/Bridge/Component/BridgeHeader.tsx b/src/ui/views/Bridge/Component/BridgeHeader.tsx new file mode 100644 index 00000000000..6a13ec6a248 --- /dev/null +++ b/src/ui/views/Bridge/Component/BridgeHeader.tsx @@ -0,0 +1,76 @@ +import { ReactComponent as RcIconSettings } from '@/ui/assets/swap/settings.svg'; +import { ReactComponent as RcIconHistory } from '@/ui/assets/swap/history.svg'; + +import { PageHeader } from '@/ui/component'; +import React, { memo, useCallback, useEffect, useMemo, useState } from 'react'; +import { AggregatorsSettings } from './AggregatorsSettings'; +import { + usePollBridgePendingNumber, + useSetSettingVisible, + useSettingVisible, +} from '../hooks'; +import { BridgeTxHistory } from './BridgeHistory'; +import { useTranslation } from 'react-i18next'; +import { useRabbyDispatch } from '@/ui/store'; +import { PendingTx } from './PendingTx'; + +export const Header = () => { + const visible = useSettingVisible(); + const setVisible = useSetSettingVisible(); + + const [historyVisible, setHistoryVisible] = useState(false); + const { t } = useTranslation(); + + const dispath = useRabbyDispatch(); + + // const loadingNumber = 0; + + const loadingNumber = usePollBridgePendingNumber(); + + const openHistory = useCallback(() => { + setHistoryVisible(true); + }, []); + + useEffect(() => { + dispath.bridge.fetchAggregatorsList(); + dispath.bridge.fetchSupportedChains(); + }, []); + + return ( + <> + + {loadingNumber ? ( + + ) : ( + + )} + { + setVisible(true); + }, [])} + /> + + } + > + {t('page.bridge.title')} + + { + setVisible(false); + }, [])} + /> + { + setHistoryVisible(false); + }, [])} + /> + + ); +}; diff --git a/src/ui/views/Bridge/Component/BridgeHistory.tsx b/src/ui/views/Bridge/Component/BridgeHistory.tsx new file mode 100644 index 00000000000..cc0fa792192 --- /dev/null +++ b/src/ui/views/Bridge/Component/BridgeHistory.tsx @@ -0,0 +1,277 @@ +import { Popup } from '@/ui/component'; +import React, { forwardRef, useMemo } from 'react'; +import { useBridgeHistory } from '../hooks'; +import { TokenItem } from '@rabby-wallet/rabby-api/dist/types'; +import { formatAmount, formatUsdValue, openInTab, sinceTime } from '@/ui/utils'; +import { getTokenSymbol } from '@/ui/utils/token'; +import { TooltipWithMagnetArrow } from '@/ui/component/Tooltip/TooltipWithMagnetArrow'; +import ImgPending from 'ui/assets/swap/pending.svg'; +import { ReactComponent as RCIconCCEmpty } from 'ui/assets/bridge/empty-cc.svg'; + +import { ReactComponent as RcIconSwapArrow } from 'ui/assets/swap/arrow-right.svg'; + +import clsx from 'clsx'; +import SkeletonInput from 'antd/lib/skeleton/Input'; +import { ellipsis } from '@/ui/utils/address'; +import { useTranslation } from 'react-i18next'; +import { findChain } from '@/utils/chain'; +import { BridgeHistory } from '@/background/service/openapi'; + +const BridgeTokenIcon = (props: { token: TokenItem }) => { + const { token } = props; + const chain = React.useMemo(() => { + const chainServerId = token.chain; + return findChain({ + serverId: chainServerId, + }); + }, [token]); + + return ( +
+ + +
+ ); +}; + +const TokenCost = ({ + payToken, + receiveToken, + payTokenAmount, + receiveTokenAmount, + loading = false, + actual = false, +}: { + payToken: TokenItem; + receiveToken: TokenItem; + payTokenAmount?: number; + receiveTokenAmount?: number; + loading?: boolean; + actual?: boolean; +}) => { + if (loading) { + return ( + + ); + } + return ( +
+ +
+ {formatAmount(payTokenAmount || '0')} {getTokenSymbol(payToken)} +
+ + +
+ {formatAmount(receiveTokenAmount || '0')} {getTokenSymbol(receiveToken)} +
+
+ ); +}; + +interface TransactionProps { + data: BridgeHistory; +} +const Transaction = forwardRef( + ({ data }, ref) => { + const isPending = data.status === 'pending'; + const isCompleted = data?.status === 'completed'; + const time = + // data?.finished_at || + data?.create_at; + + const txId = data?.detail_url?.split('/').pop() || ''; + + const loading = data?.status !== 'completed'; + + const gasUsed = useMemo(() => { + if (data?.from_gas) { + return `${formatAmount(data.from_gas.gas_amount)} ${getTokenSymbol( + data?.from_gas.native_token + )} (${formatUsdValue(data.from_gas.usd_gas_fee)})`; + } + return ''; + }, [data?.from_gas]); + + const gotoScan = React.useCallback(() => { + if (data?.detail_url) { + openInTab(data?.detail_url); + } + }, []); + + const { t } = useTranslation(); + + return ( +
+
+
+ {isPending && ( + +
+ loading + + {t('page.bridge.Pending')} + +
+
+ )} + + {!isPending && sinceTime(time)} +
+
+ + + {data.aggregator.name} + + + {t('page.bridge.via-bridge', { + bridge: data?.bridge?.name || '', + })} + +
+
+ +
+ {t('page.bridge.estimate')} +
+ +
+
+ +
+ {t('page.bridge.actual')} +
+ +
+
+ +
+ + {t('page.bridge.detail-tx')}:{' '} + + {txId ? ellipsis(txId) : ''} + + + + {!loading ? ( + + {t('page.bridge.gas-fee', { gasUsed })} + + ) : ( + + {t('page.bridge.gas-x-price', { + price: data?.from_gas?.gas_price || '', + })} + + )} +
+
+ ); + } +); + +const HistoryList = () => { + const { txList, loading, loadingMore, ref } = useBridgeHistory(); + const { t } = useTranslation(); + + if (!loading && (!txList || !txList?.list?.length)) { + return ( +
+ +

+ {t('page.bridge.no-transaction-records')} +

+
+ ); + } + + return ( +
+ {txList?.list + ?.sort((a, b) => { + let aIndex = 0, + bIndex = 0; + if (a.status === 'pending') { + aIndex = 1; + } + if (b.status === 'pending') { + bIndex = 1; + } + return bIndex - aIndex; + }) + ?.map((swap, idx) => ( + + ))} + {((loading && !txList) || loadingMore) && ( + <> + + + + )} +
+ ); +}; + +export const BridgeTxHistory = ({ + visible, + onClose, +}: { + visible: boolean; + onClose: () => void; +}) => { + const { t } = useTranslation(); + return ( + + + + ); +}; diff --git a/src/ui/views/Bridge/Component/BridgeQuoteItem.tsx b/src/ui/views/Bridge/Component/BridgeQuoteItem.tsx new file mode 100644 index 00000000000..c72341fdfbe --- /dev/null +++ b/src/ui/views/Bridge/Component/BridgeQuoteItem.tsx @@ -0,0 +1,267 @@ +import React, { useMemo, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { QuoteLogo } from './QuoteLogo'; +import ImgLock from '@/ui/assets/swap/lock.svg'; +import { TokenWithChain } from '@/ui/component'; +import ImgGas from '@/ui/assets/swap/gas.svg'; +import { ReactComponent as RCIconDuration } from '@/ui/assets/bridge/duration.svg'; +import clsx from 'clsx'; +import { TooltipWithMagnetArrow } from '@/ui/component/Tooltip/TooltipWithMagnetArrow'; +import { TokenItem } from '@/background/service/openapi'; +import { formatTokenAmount } from '@debank/common'; +import { formatUsdValue } from '@/ui/utils'; +import BigNumber from 'bignumber.js'; +import { + SelectedBridgeQuote, + useSetQuoteVisible, + useSetSettingVisible, +} from '../hooks'; +import { Tooltip } from 'antd'; +import { useRabbySelector } from '@/ui/store'; +import ImgWhiteWarning from '@/ui/assets/swap/warning-white.svg'; +import styled from 'styled-components'; + +const ItemWrapper = styled.div` + position: relative; + + .disabled-trade { + position: absolute; + left: 0; + top: 0; + transform: translateY(-20px); + opacity: 0; + width: 100%; + height: 0; + padding-left: 16px; + background: #000000; + border-radius: 6px; + display: flex; + align-items: center; + gap: 8px; + font-weight: 400; + font-size: 13px; + color: #ffffff; + pointer-events: none; + } + &.enabledAggregator:hover .disabled-trade { + cursor: pointer; + pointer-events: auto; + height: 100%; + transform: translateY(0); + opacity: 1; + } +`; + +interface QuoteItemProps extends SelectedBridgeQuote { + payAmount: string; + payToken: TokenItem; + receiveToken: TokenItem; + isBestQuote?: boolean; + bestQuoteUsd: string; + sortIncludeGasFee: boolean; + setSelectedBridgeQuote?: React.Dispatch< + React.SetStateAction + >; + onlyShow?: boolean; + loading?: boolean; + inSufficient?: boolean; +} + +export const bridgeQuoteEstimatedValueBn = ( + quote: SelectedBridgeQuote, + receiveToken: TokenItem, + sortIncludeGasFee: boolean +) => { + return new BigNumber(quote.to_token_amount) + .times(receiveToken.price || 1) + .minus(sortIncludeGasFee ? quote.gas_fee.usd_value : 0); +}; + +export const BridgeQuoteItem = (props: QuoteItemProps) => { + const { t } = useTranslation(); + const [disabledTipsOpen, setDisabledTipsOpen] = useState(false); + + const openSwapQuote = useSetQuoteVisible(); + + const openSettings = useSetSettingVisible(); + + const aggregatorsList = useRabbySelector( + (s) => s.bridge.aggregatorsList || [] + ); + const selectedAggregators = useRabbySelector( + (s) => s.bridge.selectedAggregators || [] + ); + + const availableSelectedAggregators = useMemo(() => { + return selectedAggregators?.filter((e) => + aggregatorsList.some((item) => item.id === e) + ); + }, [selectedAggregators, aggregatorsList]); + + const enabledAggregator = useMemo(() => { + return availableSelectedAggregators.includes(props?.aggregator?.id); + }, [props?.aggregator?.id, availableSelectedAggregators]); + + const diffPercent = React.useMemo(() => { + if (props.onlyShow || props.isBestQuote) { + return ''; + } + + const percent = bridgeQuoteEstimatedValueBn( + props, + props.receiveToken, + props.sortIncludeGasFee + ) + .minus(props.bestQuoteUsd) + .div(props.bestQuoteUsd) + .abs() + .times(100) + .toFixed(2, 1) + .toString(); + return `-${percent}%`; + }, [props]); + + const handleClick = async () => { + if (props.inSufficient) { + return; + } + if (!enabledAggregator) { + return; + } + props?.setSelectedBridgeQuote?.(props); + openSwapQuote(false); + }; + return ( + + +
+
+ + + {props.aggregator.name} + + + {t('page.bridge.via-bridge', { + bridge: props.bridge.name, + })} + + {/* {props.shouldApproveToken && */} + {props.shouldApproveToken && ( + + + + )} +
+ +
+ + + {formatTokenAmount(props.to_token_amount)} + +
+
+ +
+
+ + {formatUsdValue(props.gas_fee.usd_value)} + + + {t('page.bridge.duration', { + duration: Math.round(props.duration / 60), + })} + +
+
+ + {t('page.bridge.estimated-value', { + value: formatUsdValue( + new BigNumber(props.to_token_amount) + .times(props.receiveToken.price) + .toString() + ), + })} + + {!props.onlyShow && ( + + {props.isBestQuote ? t('page.bridge.best') : diffPercent} + + )} +
+
+ + {!props.inSufficient && !enabledAggregator && ( +
{ + e.stopPropagation(); + openSettings(true); + }} + > + + + {t('page.bridge.aggregator-not-enabled')} +
+ + {t('page.bridge.enable-it')} + +
+
+ )} +
+
+ ); +}; diff --git a/src/ui/views/Bridge/Component/BridgeQuotes.tsx b/src/ui/views/Bridge/Component/BridgeQuotes.tsx new file mode 100644 index 00000000000..416dd290ea3 --- /dev/null +++ b/src/ui/views/Bridge/Component/BridgeQuotes.tsx @@ -0,0 +1,200 @@ +import { Checkbox, Popup } from '@/ui/component'; +import React, { useMemo } from 'react'; +import { QuoteLoading } from './loading'; +import { IconRefresh } from './IconRefresh'; +import { SelectedBridgeQuote, useSetRefreshId } from '../hooks'; +import BigNumber from 'bignumber.js'; +import { CHAINS_ENUM } from '@/constant'; +import { SvgIconCross } from 'ui/assets'; +import { useTranslation } from 'react-i18next'; +import { TokenItem } from '@/background/service/openapi'; +import { BridgeQuoteItem } from './BridgeQuoteItem'; +import { useRabbyDispatch, useRabbySelector } from '@/ui/store'; +import { ReactComponent as RCIconCCEmpty } from 'ui/assets/bridge/empty-cc.svg'; + +interface QuotesProps { + chain: CHAINS_ENUM; + userAddress: string; + loading: boolean; + inSufficient: boolean; + payToken: TokenItem; + receiveToken: TokenItem; + list?: SelectedBridgeQuote[]; + activeName?: string; + visible: boolean; + onClose: () => void; + payAmount: string; + setSelectedBridgeQuote: React.Dispatch< + React.SetStateAction + >; +} + +export const Quotes = ({ + list, + activeName, + inSufficient, + ...other +}: QuotesProps) => { + const { t } = useTranslation(); + const sortIncludeGasFee = useRabbySelector((s) => s.bridge.sortIncludeGasFee); + + const sortedList = useMemo(() => { + return list?.sort((b, a) => { + return new BigNumber(a.to_token_amount) + .times(other.receiveToken.price || 1) + .minus(sortIncludeGasFee ? a.gas_fee.usd_value : 0) + .minus( + new BigNumber(b.to_token_amount) + .times(other.receiveToken.price || 1) + .minus(sortIncludeGasFee ? b.gas_fee.usd_value : 0) + ) + .toNumber(); + }); + }, [list, sortIncludeGasFee, other.receiveToken]); + + const bestQuoteUsd = useMemo(() => { + const bestQuote = sortedList?.[0]; + if (!bestQuote) { + return '0'; + } + return new BigNumber(bestQuote.to_token_amount) + .times(other.receiveToken.price || 1) + .minus(sortIncludeGasFee ? bestQuote.gas_fee.usd_value : 0) + .toString(); + }, [sortedList, other.receiveToken, sortIncludeGasFee]); + + return ( +
+
+ {sortedList?.map((item, idx) => { + return ( + + ); + })} + {other.loading && + !sortedList?.length && + Array.from({ length: 4 }).map((_, idx) => )} + + {!other.loading && !sortedList?.length && ( +
+ + + {t('page.bridge.no-route-found')} + +
+ )} +
+
+ ); +}; + +const bodyStyle = { + paddingTop: 0, + paddingBottom: 0, +}; + +export const QuoteList = (props: QuotesProps) => { + const { visible, onClose } = props; + const refresh = useSetRefreshId(); + + const refreshQuote = React.useCallback(() => { + refresh((e) => e + 1); + }, [refresh]); + + const { t } = useTranslation(); + + const sortIncludeGasFee = useRabbySelector((s) => s.bridge.sortIncludeGasFee); + + const dispatch = useRabbyDispatch(); + + return ( + + } + headerStyle={{ + paddingTop: 16, + }} + visible={visible} + title={ +
+
+
{t('page.bridge.the-following-bridge-route-are-found')}
+
+
+ +
+
+
+ + + + + + ) : ( + + + + ) + } + > + {t('page.swap.sort-with-gas')} + +
+ } + height={440} + onClose={onClose} + closable={false} + destroyOnClose + className="isConnectView z-[999]" + bodyStyle={bodyStyle} + isSupportDarkMode + > + +
+ ); +}; diff --git a/src/ui/views/Bridge/Component/BridgeReceiveDetail.tsx b/src/ui/views/Bridge/Component/BridgeReceiveDetail.tsx new file mode 100644 index 00000000000..ff7137f5ff5 --- /dev/null +++ b/src/ui/views/Bridge/Component/BridgeReceiveDetail.tsx @@ -0,0 +1,141 @@ +import { TokenItem } from '@rabby-wallet/rabby-api/dist/types'; +import { InsHTMLAttributes } from 'react'; +import styled from 'styled-components'; + +import ImgSwitch from '@/ui/assets/swap/switch.svg'; + +import React from 'react'; +import { useSetQuoteVisible } from '../hooks'; +import { useTranslation } from 'react-i18next'; +import { SelectedBridgeQuote } from '../hooks'; +import { BridgeQuoteItem } from './BridgeQuoteItem'; + +const ReceiveWrapper = styled.div` + position: relative; + margin-top: 24px; + border: 0.5px solid var(--r-neutral-line, #d3d8e0); + border-radius: 4px; + padding: 12px; + padding-top: 16px; + + color: var(--r-neutral-title-1, #192945); + font-size: 13px; + .receive-token { + font-size: 15px; + color: #13141a; + } + + .diffPercent { + &.negative { + color: var(--r-red-default, #e34935); + } + &.positive { + color: var(--r-green-default, #2abb7f); + } + } + .column { + display: flex; + justify-content: space-between; + + .right { + font-weight: medium; + display: inline-flex; + align-items: center; + gap: 4px; + .ellipsis { + max-width: 170px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + img { + width: 14px; + height: 14px; + } + } + } + + .warning { + margin-bottom: 8px; + padding: 8px; + font-weight: 400; + font-size: 13px; + color: #ffb020; + position: relative; + background: rgba(255, 176, 32, 0.1); + border-radius: 4px; + } + + .footer { + position: relative; + border-top: 0.5px solid var(--r-neutral-line, #d3d8e0); + padding-top: 8px; + + .rate { + color: var(--r-neutral-body, #d3d8e0) !important; + } + } + .quote-provider { + position: absolute; + top: -12px; + left: 12px; + height: 20px; + padding: 4px 6px; + display: flex; + align-items: center; + justify-content: center; + font-size: 13px; + cursor: pointer; + + color: var(--r-neutral-body, #d3d8e0); + background: var(--r-blue-light-2); + border-radius: 4px; + border: 1px solid transparent; + &:hover { + /* background: var(--r-neutral-bg-1, #fff); */ + border: 1px solid var(--r-neutral-line, #d3d8e0); + } + } +`; + +interface ReceiveDetailsProps { + payAmount: string; + // receiveRawAmount: string | number; + payToken: TokenItem; + receiveToken: TokenItem; + // receiveTokenDecimals?: number; + // quoteWarning?: [string, string]; + loading?: boolean; + activeProvider: SelectedBridgeQuote; + // isWrapToken?: boolean; +} +export const BridgeReceiveDetails = ( + props: ReceiveDetailsProps & InsHTMLAttributes +) => { + const { t } = useTranslation(); + const { activeProvider, ...other } = props; + + const openQuote = useSetQuoteVisible(); + // const payTokenSymbol = getTokenSymbol(props.payToken); + // const receiveTokenSymbol = getTokenSymbol(props.receiveToken); + + return ( + + +
{ + openQuote(true); + }} + > + +
+
+ ); +}; diff --git a/src/ui/views/Bridge/Component/BridgeTokenPair.tsx b/src/ui/views/Bridge/Component/BridgeTokenPair.tsx new file mode 100644 index 00000000000..d69c50cd919 --- /dev/null +++ b/src/ui/views/Bridge/Component/BridgeTokenPair.tsx @@ -0,0 +1,260 @@ +import React from 'react'; +import styled from 'styled-components'; +import { ReactComponent as RcArrowDown } from '@/ui/assets/bridge/down.svg'; +import { useTranslation } from 'react-i18next'; +import { TokenItem } from '@rabby-wallet/rabby-api/dist/types'; +import { TokenWithChain } from '@/ui/component'; +import { getTokenSymbol } from '@/ui/utils/token'; +import { Drawer, DrawerProps, Tooltip } from 'antd'; +import clsx from 'clsx'; +import { formatUsdValue, useWallet } from '@/ui/utils'; +import BigNumber from 'bignumber.js'; +import { useAsync } from 'react-use'; +import { CHAINS, CHAINS_ENUM } from '@debank/common'; +import { TokenPairLoading } from './loading'; +import MatchImage from 'ui/assets/match.svg'; +import { SvgIconCross } from '@/ui/assets'; + +const TokenPairDrawer = ( + props: DrawerProps & { + aggregatorIds: string[]; + chain: CHAINS_ENUM; + onSelectTokenPair: (value: TokenPair) => void; + } +) => { + const { t } = useTranslation(); + const wallet = useWallet(); + const { value, loading } = useAsync(async () => { + const currentAddress = await wallet.getCurrentAccount(); + if (currentAddress && props.visible) { + return wallet.openapi.getBridgePairList({ + aggregator_ids: props.aggregatorIds, + to_chain_id: CHAINS[props.chain].serverId, + user_addr: currentAddress.address, + }); + } + }, [props.visible, props.chain, props.aggregatorIds]); + + return ( + +
+
+ {t('page.bridge.tokenPairDrawer.tokenPair')} + {t('page.bridge.tokenPairDrawer.balance')} +
+ +
+ {loading && + Array.from({ length: 6 }).map((_, i) => ( + + ))} + + {!loading && + value?.map((tokenPair, i) => { + return ( + +
{ + if (tokenPair.from_token_amount) { + props.onSelectTokenPair({ + from: { + ...tokenPair.from_token, + amount: tokenPair.from_token_amount, + raw_amount_hex_str: + tokenPair.from_token_raw_amount_hex_str, + }, + to: tokenPair.to_token, + }); + } + }} + className={clsx( + 'px-20 min-h-[56px] cursor-pointer', + 'flex items-center justify-between', + 'border border-solid border-transparent rounded-md', + 'hover:border-rabby-blue-default', + !tokenPair.from_token_amount && + 'opacity-40 cursor-not-allowed' + )} + > +
+ + + {getTokenSymbol(tokenPair.from_token)} + + + {getTokenSymbol(tokenPair.to_token)} +
+ +
+ {/* {formatUsdValue( + new BigNumber( + tokenPair.from_token.raw_amount_hex_str || '0' + ) + .dividedBy(10 ** tokenPair.from_token.decimals) + .times(tokenPair.from_token.price) + .toString() + )} */} + {formatUsdValue( + new BigNumber(tokenPair.from_token_amount || '0') + .times(tokenPair.from_token.price) + .toString() + )} +
+
+
+ ); + })} + + {!loading && !value?.length && ( +
+ + + {t('page.bridge.tokenPairDrawer.noData')} + +
+ )} +
+
+
+ ); +}; + +const RenderWrapper = styled.div` + height: 52px; + background: var(--r-neutral-card-2, #f2f4f7); + border-radius: 6px; + padding: 0 12px; + width: 100%; + display: flex; + align-items: center; + gap: 8px; + border: 1px solid transparent; + cursor: pointer; + font-size: 16px; + font-weight: 500; + color: var(--r-neutral-title1, #192945); + + &:hover { + background: rgba(134, 151, 255, 0.2); + } + + & > { + .pair { + display: flex; + align-items: center; + gap: 12px; + + .token { + display: flex; + align-items: center; + gap: 8px; + font-size: 16px; + font-weight: 500; + color: var(--r-neutral-title1, #192945); + + .token-symbol { + max-width: 90px; + display: inline-block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + } + } + + .down { + margin-left: auto; + width: 20px; + height: 20px; + } + } +`; + +type TokenPair = { + from: TokenItem; + to: TokenItem; +}; + +export const BridgeTokenPair = (props: { + aggregatorIds: string[]; + chain: CHAINS_ENUM; + value?: TokenPair; + onChange: (value: TokenPair) => void; +}) => { + const { value } = props; + const { t } = useTranslation(); + const [visible, setVisible] = React.useState(false); + const onSelectTokenPair = React.useCallback( + (params: TokenPair) => { + props.onChange(params); + setVisible(false); + }, + [props.onChange] + ); + return ( + <> + setVisible(true)}> + {!value ? ( +
{t('page.bridge.tokenPairPlaceholder')}
+ ) : ( +
+
+ + + {getTokenSymbol(value?.from)} + +
+ + +
+ + + {getTokenSymbol(value?.to)} + +
+
+ )} + +
+ + {/* modal */} + + } + onClose={() => setVisible(false)} + title={t('page.bridge.tokenPairDrawer.title')} + /> + + ); +}; diff --git a/src/ui/views/Bridge/Component/IconRefresh.tsx b/src/ui/views/Bridge/Component/IconRefresh.tsx new file mode 100644 index 00000000000..2aec92c694e --- /dev/null +++ b/src/ui/views/Bridge/Component/IconRefresh.tsx @@ -0,0 +1,93 @@ +import clsx from 'clsx'; +import React, { memo } from 'react'; + +export const IconRefresh = memo((props: React.SVGProps) => { + const { className, ...other } = props; + + return ( + + + + + + + + + + + + + + + + + + + ); +}); diff --git a/src/ui/views/Bridge/Component/InsufficientTip.tsx b/src/ui/views/Bridge/Component/InsufficientTip.tsx new file mode 100644 index 00000000000..d73122f2e05 --- /dev/null +++ b/src/ui/views/Bridge/Component/InsufficientTip.tsx @@ -0,0 +1,20 @@ +import ImgWarning from 'ui/assets/swap/warn.svg'; +import React from 'react'; +import { useTranslation } from 'react-i18next'; + +export const InSufficientTip = ({ + inSufficient, +}: { + inSufficient: boolean; +}) => { + const { t } = useTranslation(); + if (!inSufficient) return null; + return ( +
+ + + {t('page.swap.InSufficientTip')} + +
+ ); +}; diff --git a/src/ui/views/Bridge/Component/PendingTx.tsx b/src/ui/views/Bridge/Component/PendingTx.tsx new file mode 100644 index 00000000000..eaaddf848b4 --- /dev/null +++ b/src/ui/views/Bridge/Component/PendingTx.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import { ReactComponent as RcIconPending } from '@/ui/assets/bridge/pending.svg'; +export const PendingTx = ({ + number, + onClick, +}: { + number: number | string; + onClick?: () => void; +}) => { + return ( +
+ + {number} +
+ ); +}; diff --git a/src/ui/views/Bridge/Component/QuoteLogo.tsx b/src/ui/views/Bridge/Component/QuoteLogo.tsx new file mode 100644 index 00000000000..660eea8b1ea --- /dev/null +++ b/src/ui/views/Bridge/Component/QuoteLogo.tsx @@ -0,0 +1,38 @@ +import { ReactComponent as IconQuoteLoading } from '@/ui/assets/swap/quote-loading.svg'; +import clsx from 'clsx'; +import React from 'react'; + +export const QuoteLogo = ({ + isLoading, + bridgeLogo, + logo, +}: { + isLoading?: boolean; + logo: string; + bridgeLogo?: string; +}) => { + return ( +
+
+ + {!!bridgeLogo && ( + + )} + {isLoading && ( +
+ +
+ )} +
+
+ ); +}; diff --git a/src/ui/views/Bridge/Component/loading.tsx b/src/ui/views/Bridge/Component/loading.tsx new file mode 100644 index 00000000000..2f40ee94fe3 --- /dev/null +++ b/src/ui/views/Bridge/Component/loading.tsx @@ -0,0 +1,82 @@ +import { Skeleton } from 'antd'; +import clsx from 'clsx'; +import React from 'react'; + +export const QuoteLoading = () => { + return ( +
+
+
+ + +
+ + +
+ +
+ + +
+
+ ); +}; + +export const TokenPairLoading = () => { + return ( +
+
+ + +
+ +
+ ); +}; diff --git a/src/ui/views/Bridge/hooks/context.tsx b/src/ui/views/Bridge/hooks/context.tsx new file mode 100644 index 00000000000..936bc52f180 --- /dev/null +++ b/src/ui/views/Bridge/hooks/context.tsx @@ -0,0 +1,24 @@ +import { BridgeAggregator } from '@/background/service/openapi'; +import { createContextState } from '@/ui/hooks/contextState'; + +const [ + SettingVisibleProvider, + useSettingVisible, + useSetSettingVisible, +] = createContextState(false); + +const [ + QuoteVisibleProvider, + useQuoteVisible, + useSetQuoteVisible, +] = createContextState(false); + +const [RefreshIdProvider, useRefreshId, useSetRefreshId] = createContextState( + 0 +); + +export { SettingVisibleProvider, useSettingVisible, useSetSettingVisible }; + +export { RefreshIdProvider, useRefreshId, useSetRefreshId }; + +export { QuoteVisibleProvider, useQuoteVisible, useSetQuoteVisible }; diff --git a/src/ui/views/Bridge/hooks/history.tsx b/src/ui/views/Bridge/hooks/history.tsx new file mode 100644 index 00000000000..b0d9ee089b6 --- /dev/null +++ b/src/ui/views/Bridge/hooks/history.tsx @@ -0,0 +1,165 @@ +import { useInViewport, useInfiniteScroll } from 'ahooks'; +import React, { useEffect, useRef, useState } from 'react'; +import { useRabbySelector } from '@/ui/store'; +import { useAsync } from 'react-use'; +import { uniqBy } from 'lodash'; +import { useWallet } from '@/ui/utils'; + +export const usePollBridgePendingNumber = (timer = 10000) => { + const [refetchCount, setRefetchCount] = useState(0); + + const wallet = useWallet(); + + const { value, loading, error } = useAsync(async () => { + const account = await wallet.getCurrentAccount(); + if (!account?.address) { + return 0; + } + + const data = await wallet.openapi.getBridgeHistoryList({ + user_addr: account!.address, + start: 0, + limit: 10, + }); + return ( + data?.history_list?.filter((item) => item?.status === 'pending') + ?.length || 0 + ); + }, [refetchCount]); + + const timerRef = useRef(); + + useEffect(() => { + if ((!loading && value !== undefined) || error) { + timerRef.current = setTimeout(() => { + setRefetchCount((e) => e + 1); + }, timer); + } + + return () => { + timerRef.current && clearTimeout(timerRef.current); + }; + }, [loading, value, error, timer]); + + useEffect(() => { + return () => { + timerRef.current && clearTimeout(timerRef.current); + }; + }, []); + + return value; +}; + +export const useBridgeHistory = () => { + const addr = useRabbySelector( + (state) => state.account.currentAccount?.address || '' + ); + + const [refreshTxListCount, setRefreshListTx] = useState(0); + const refreshBridgeListTx = React.useCallback(() => { + setRefreshListTx((e) => e + 1); + }, []); + const isInBridge = true; + + const wallet = useWallet(); + const getBridgeHistoryList = React.useCallback( + async (addr: string, start = 0, limit = 5) => { + const data = await wallet.openapi.getBridgeHistoryList({ + user_addr: addr, + start: start, + limit: limit, + }); + return { + list: data?.history_list, + last: data, + totalCount: data?.total_cnt, + }; + }, + [wallet?.openapi?.getBridgeHistoryList] + ); + + const { + data: txList, + loading, + loadMore, + loadingMore, + noMore, + mutate, + } = useInfiniteScroll( + (d) => + getBridgeHistoryList( + addr, + d?.list?.length && d?.list?.length > 1 ? d?.list?.length : 0, + 5 + ), + { + reloadDeps: [isInBridge], + isNoMore(data) { + if (data) { + return data?.list.length >= data?.totalCount; + } + return true; + }, + manual: !isInBridge || !addr, + } + ); + + const { value } = useAsync(async () => { + if (addr) { + return getBridgeHistoryList(addr, 0, 5); + } + }, [addr, refreshTxListCount]); + + useEffect(() => { + if (value?.list) { + mutate((d) => { + if (!d) { + return; + } + return { + last: d?.last, + totalCount: d?.totalCount, + list: uniqBy( + [...(value.list || []), ...(d?.list || [])], + (e) => `${e.chain}-${e.detail_url}` + ), + }; + }); + } + }, [mutate, value]); + + const ref = useRef(null); + + const [inViewport] = useInViewport(ref); + + useEffect(() => { + if (!noMore && inViewport && !loadingMore && loadMore && isInBridge) { + console.log('loadMore'); + loadMore(); + } + }, [inViewport, loadMore, loading, loadingMore, noMore, isInBridge]); + + useEffect(() => { + let timer: NodeJS.Timeout; + if ( + !loading && + !loadingMore && + txList?.list?.some((e) => e.status !== 'completed') && + isInBridge + ) { + timer = setTimeout(refreshBridgeListTx, 2000); + } + return () => { + if (timer) { + clearTimeout(timer); + } + }; + }, [loading, loadingMore, refreshBridgeListTx, txList?.list, isInBridge]); + + return { + loading, + txList, + loadingMore, + ref, + }; +}; diff --git a/src/ui/views/Bridge/hooks/index.tsx b/src/ui/views/Bridge/hooks/index.tsx new file mode 100644 index 00000000000..50dbf073e7c --- /dev/null +++ b/src/ui/views/Bridge/hooks/index.tsx @@ -0,0 +1,3 @@ +export * from './token'; +export * from './context'; +export * from './history'; diff --git a/src/ui/views/Bridge/hooks/token.tsx b/src/ui/views/Bridge/hooks/token.tsx new file mode 100644 index 00000000000..da9c0d3ca92 --- /dev/null +++ b/src/ui/views/Bridge/hooks/token.tsx @@ -0,0 +1,480 @@ +import { useRabbyDispatch, useRabbySelector } from '@/ui/store'; +import { isSameAddress, useWallet } from '@/ui/utils'; +import { CHAINS, CHAINS_ENUM } from '@debank/common'; +import { TokenItem } from '@rabby-wallet/rabby-api/dist/types'; +import BigNumber from 'bignumber.js'; +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { useAsync, useDebounce } from 'react-use'; + +import { + useQuoteVisible, + useRefreshId, + useSetRefreshId, + useSettingVisible, +} from './context'; +import { useAsyncInitializeChainList } from '@/ui/hooks/useChain'; +import { ETH_USDT_CONTRACT } from '@/constant'; +import { findChain } from '@/utils/chain'; +import { BridgeQuote } from '@/background/service/openapi'; +import stats from '@/stats'; + +const useTokenInfo = ({ + userAddress, + chain, + defaultToken, +}: { + userAddress?: string; + chain?: CHAINS_ENUM; + defaultToken?: TokenItem; +}) => { + const refreshId = useRefreshId(); + const wallet = useWallet(); + const [token, setToken] = useState(defaultToken); + + const { value, loading, error } = useAsync(async () => { + if (userAddress && token?.id && chain) { + const data = await wallet.openapi.getToken( + userAddress, + CHAINS[chain].serverId, + token.id + ); + return data; + } + }, [refreshId, userAddress, token?.id, token?.raw_amount_hex_str, chain]); + + useDebounce( + () => { + if (value && !error && !loading) { + setToken(value); + } + }, + 300, + [value, error, loading] + ); + + if (error) { + console.error('token info error', chain, token?.symbol, token?.id, error); + } + return [token, setToken] as const; +}; + +export interface SelectedBridgeQuote extends Omit { + shouldApproveToken?: boolean; + shouldTwoStepApprove?: boolean; + loading?: boolean; + tx?: BridgeQuote['tx']; +} + +export const useTokenPair = (userAddress: string) => { + const dispatch = useRabbyDispatch(); + const refreshId = useRefreshId(); + + const { + initialSelectedChain, + oChain, + defaultSelectedFromToken, + defaultSelectedToToken, + } = useRabbySelector((state) => { + return { + initialSelectedChain: state.bridge.$$initialSelectedChain, + oChain: state.bridge.selectedChain || CHAINS_ENUM.ETH, + defaultSelectedFromToken: state.bridge.selectedFromToken, + defaultSelectedToToken: state.bridge.selectedToToken, + }; + }); + + const [chain, setChain] = useState(oChain); + const handleChain = (c: CHAINS_ENUM) => { + setChain(c); + dispatch.bridge.setSelectedChain(c); + }; + + const [payToken, setPayToken] = useTokenInfo({ + userAddress, + chain: defaultSelectedFromToken?.chain + ? findChain({ serverId: defaultSelectedFromToken?.chain })?.enum + : undefined, + defaultToken: defaultSelectedFromToken, + }); + + const [receiveToken, setReceiveToken] = useTokenInfo({ + userAddress, + chain, + defaultToken: defaultSelectedToToken, + }); + + const setSelectedBridgeQuote: React.Dispatch< + React.SetStateAction + > = useCallback((p) => { + if (expiredTimer.current) { + clearTimeout(expiredTimer.current); + } + setExpired(false); + expiredTimer.current = setTimeout(() => { + setExpired(true); + }, 1000 * 30); + setOriSelectedBridgeQuote(p); + }, []); + + const switchChain = useCallback( + (c: CHAINS_ENUM, opts?: { payTokenId?: string; changeTo?: boolean }) => { + handleChain(c); + setPayToken(undefined); + setReceiveToken(undefined); + setPayAmount(''); + setSelectedBridgeQuote(undefined); + }, + [handleChain, setSelectedBridgeQuote, setPayToken, setReceiveToken] + ); + + const supportedChains = useRabbySelector((s) => s.bridge.supportedChains); + + useAsyncInitializeChainList({ + // NOTICE: now `useTokenPair` is only used for swap page, so we can use `SWAP_SUPPORT_CHAINS` here + supportChains: supportedChains, + onChainInitializedAsync: (firstEnum) => { + // only init chain if it's not cached before + if (!initialSelectedChain) { + switchChain(firstEnum); + } + }, + }); + + useEffect(() => { + dispatch.bridge.setSelectedFromToken(payToken); + }, [payToken]); + + useEffect(() => { + dispatch.bridge.setSelectedToToken(receiveToken); + }, [receiveToken]); + + const [payAmount, setPayAmount] = useState(''); + + const [selectedBridgeQuote, setOriSelectedBridgeQuote] = useState< + SelectedBridgeQuote | undefined + >(); + + const expiredTimer = useRef(); + const [expired, setExpired] = useState(false); + + const handleAmountChange: React.ChangeEventHandler = useCallback( + (e) => { + const v = e.target.value; + if (!/^\d*(\.\d*)?$/.test(v)) { + return; + } + setPayAmount(v); + }, + [] + ); + + const handleBalance = useCallback(() => { + if (payToken) { + setPayAmount(tokenAmountBn(payToken).toString(10)); + } + }, [payToken]); + + const inSufficient = useMemo( + () => + payToken + ? tokenAmountBn(payToken).lt(payAmount) + : new BigNumber(0).lt(payAmount), + [payToken, payAmount] + ); + + const [quoteList, setQuotesList] = useState([]); + + useEffect(() => { + setQuotesList([]); + }, [payToken?.id, receiveToken?.id, chain, payAmount]); + + const visible = useQuoteVisible(); + const settingVisible = useSettingVisible(); + + useEffect(() => { + if (!visible) { + setQuotesList([]); + } + }, [visible]); + + const setRefreshId = useSetRefreshId(); + + useDebounce( + () => { + if (!settingVisible) { + setQuotesList([]); + setRefreshId((e) => e + 1); + } + }, + 300, + [settingVisible] + ); + + const aggregatorsList = useRabbySelector( + (s) => s.bridge.aggregatorsList || [] + ); + + const fetchIdRef = useRef(0); + const wallet = useWallet(); + const { loading: quoteLoading, error: quotesError } = useAsync(async () => { + if ( + visible && + userAddress && + payToken?.id && + receiveToken?.id && + receiveToken && + chain && + payAmount && + aggregatorsList.length > 0 + ) { + fetchIdRef.current += 1; + const currentFetchId = fetchIdRef.current; + + let isEmpty = false; + const result: SelectedBridgeQuote[] = []; + + setQuotesList((e) => { + if (!e.length) { + isEmpty = true; + } + return e?.map((e) => ({ ...e, loading: true })); + }); + + const originData = await wallet.openapi + .getBridgeQuoteList({ + aggregator_ids: aggregatorsList.map((e) => e.id).join(','), + from_token_id: payToken.id, + user_addr: userAddress, + from_chain_id: payToken.chain, + from_token_raw_amount: new BigNumber(payAmount) + .times(10 ** payToken.decimals) + .toFixed(0, 1) + .toString(), + to_chain_id: receiveToken.chain, + to_token_id: receiveToken.id, + }) + .catch((e) => { + if (currentFetchId === fetchIdRef.current) { + stats.report('bridgeQuoteResult', { + aggregatorIds: aggregatorsList.map((e) => e.id).join(','), + fromChainId: payToken.chain, + fromTokenId: payToken.id, + toTokenId: receiveToken.id, + toChainId: receiveToken.chain, + status: 'fail', + }); + } + }) + .finally(() => {}); + + const data = originData?.filter( + (quote) => + !!quote?.bridge && + !!quote?.bridge?.id && + !!quote?.bridge?.logo_url && + !!quote.bridge.name + ); + + if (currentFetchId === fetchIdRef.current) { + stats.report('bridgeQuoteResult', { + aggregatorIds: aggregatorsList.map((e) => e.id).join(','), + fromChainId: payToken.chain, + fromTokenId: payToken.id, + toTokenId: receiveToken.id, + toChainId: receiveToken.chain, + status: data ? 'success' : 'fail', + }); + } + + if (data && currentFetchId === fetchIdRef.current) { + if (!isEmpty) { + setQuotesList(data.map((e) => ({ ...e, loading: true }))); + } + + await Promise.allSettled( + data.map(async (quote) => { + if (currentFetchId !== fetchIdRef.current) { + return; + } + let tokenApproved = false; + let allowance = '0'; + const fromChain = findChain({ serverId: payToken?.chain }); + if (payToken?.id === fromChain?.nativeTokenAddress) { + tokenApproved = true; + } else { + allowance = await wallet.getERC20Allowance( + payToken.chain, + payToken.id, + quote.approve_contract_id + ); + tokenApproved = new BigNumber(allowance).gte( + new BigNumber(payAmount).times(10 ** payToken.decimals) + ); + } + let shouldTwoStepApprove = false; + if ( + fromChain?.enum === CHAINS_ENUM.ETH && + isSameAddress(payToken.id, ETH_USDT_CONTRACT) && + Number(allowance) !== 0 && + !tokenApproved + ) { + shouldTwoStepApprove = true; + } + + if (isEmpty) { + result.push({ + ...quote, + shouldTwoStepApprove, + shouldApproveToken: !tokenApproved, + }); + } else { + if (currentFetchId === fetchIdRef.current) { + setQuotesList((e) => { + const filteredArr = e.filter( + (item) => + item.aggregator.id !== quote.aggregator.id || + item.bridge.id !== quote.bridge.id + ); + return [ + ...filteredArr, + { + ...quote, + loading: false, + shouldTwoStepApprove, + shouldApproveToken: !tokenApproved, + }, + ]; + }); + } + } + }) + ); + // await Promise.allSettled( + // data.map((e) => + // wallet.openapi + // .getBridgeQuote({ + // aggregator_id: e.aggregator.id, + // bridge_id: e.bridge_id, + // from_token_id: payToken.id, + // user_addr: userAddress, + // from_chain_id: payToken.chain, + // from_token_raw_amount: new BigNumber(payAmount) + // .times(10 ** payToken.decimals) + // .toFixed(0, 1) + // .toString(), + // to_chain_id: receiveToken.chain, + // to_token_id: receiveToken.id, + // }) + // .then(async (data) => { + // if (currentFetchId !== fetchIdRef.current) { + // return; + // } + // let tokenApproved = false; + // let allowance = '0'; + // const fromChain = findChain({ serverId: payToken?.chain }); + // if (payToken?.id === fromChain?.nativeTokenAddress) { + // tokenApproved = true; + // } else { + // allowance = await wallet.getERC20Allowance( + // payToken.chain, + // payToken.id, + // data.tx.to + // ); + // tokenApproved = new BigNumber(allowance).gte( + // new BigNumber(payAmount).times(10 ** payToken.decimals) + // ); + // } + // let shouldTwoStepApprove = false; + // if ( + // fromChain?.enum === CHAINS_ENUM.ETH && + // isSameAddress(payToken.id, ETH_USDT_CONTRACT) && + // Number(allowance) !== 0 && + // !tokenApproved + // ) { + // shouldTwoStepApprove = true; + // } + + // if (isEmpty) { + // result.push({ + // ...data, + // shouldTwoStepApprove, + // shouldApproveToken: !tokenApproved, + // }); + // } else { + // if (currentFetchId === fetchIdRef.current) { + // setQuotesList((e) => { + // const filteredArr = e.filter( + // (item) => + // item.aggregator.id !== data.aggregator.id || + // item.bridge.id !== data.bridge.id + // ); + // return [ + // ...filteredArr, + // { + // ...data, + // loading: false, + // shouldTwoStepApprove, + // shouldApproveToken: !tokenApproved, + // }, + // ]; + // }); + // } + // } + // }) + // ) + // ); + + if (isEmpty && currentFetchId === fetchIdRef.current) { + setQuotesList(result); + } + } + } + }, [ + visible, + aggregatorsList, + refreshId, + userAddress, + payToken?.id, + receiveToken?.id, + chain, + payAmount, + ]); + + if (quotesError) { + console.error('quotesError', quotesError); + } + + useEffect(() => { + setExpired(false); + setSelectedBridgeQuote(undefined); + }, [payToken?.id, receiveToken?.id, chain, payAmount, inSufficient]); + + return { + chain, + switchChain, + + payToken, + setPayToken, + receiveToken, + setReceiveToken, + + handleAmountChange, + handleBalance, + payAmount, + + inSufficient, + + quoteLoading, + quoteList, + selectedBridgeQuote, + setSelectedBridgeQuote, + + expired, + }; +}; + +function tokenAmountBn(token: TokenItem) { + return new BigNumber(token?.raw_amount_hex_str || 0, 16).div( + 10 ** (token?.decimals || 1) + ); +} diff --git a/src/ui/views/Bridge/index.tsx b/src/ui/views/Bridge/index.tsx new file mode 100644 index 00000000000..622745b73aa --- /dev/null +++ b/src/ui/views/Bridge/index.tsx @@ -0,0 +1,23 @@ +import React from 'react'; +import { Header } from './Component/BridgeHeader'; +import { BridgeContent } from './Component/BridgeContent'; +import { + QuoteVisibleProvider, + RefreshIdProvider, + SettingVisibleProvider, +} from './hooks'; + +export const Bridge = () => { + return ( + + + +
+
+ +
+
+
+
+ ); +}; diff --git a/src/ui/views/Dashboard/components/ChainAndSiteSelector/index.tsx b/src/ui/views/Dashboard/components/ChainAndSiteSelector/index.tsx index f110f2ffd55..d85e5561bf0 100644 --- a/src/ui/views/Dashboard/components/ChainAndSiteSelector/index.tsx +++ b/src/ui/views/Dashboard/components/ChainAndSiteSelector/index.tsx @@ -17,9 +17,8 @@ import IconSendToken, { import IconSwap, { ReactComponent as RcIconSwap, } from 'ui/assets/dashboard/swap.svg'; -import IconReceive, { - ReactComponent as RcIconReceive, -} from 'ui/assets/dashboard/receive.svg'; + +import { ReactComponent as RcIconBridge } from 'ui/assets/dashboard/bridge.svg'; import IconGasTopUp, { ReactComponent as RcIconGasTopUp, } from 'ui/assets/dashboard/gas-top-up.svg'; @@ -45,7 +44,6 @@ import { useWallet, } from 'ui/utils'; import { CurrentConnection } from '../CurrentConnection'; -import ChainSelectorModal from 'ui/component/ChainSelector/Modal'; import { Settings } from '../index'; import './style.less'; import { CHAINS_ENUM, ThemeIconType } from '@/constant'; @@ -95,9 +93,7 @@ export default ({ showChainsModal?: boolean; }>(); const { showChainsModal = false, trigger } = state ?? {}; - const [isShowReceiveModal, setIsShowReceiveModal] = useState( - trigger === 'receive' && showChainsModal - ); + const wallet = useWallet(); const account = useRabbySelector((state) => state.account.currentAccount); @@ -208,11 +204,11 @@ export default ({ onClick: () => history.push('/send-token?rbisource=dashboard'), } as IPanelItem, receive: { - icon: RcIconReceive, - eventKey: 'Receive', - content: t('page.dashboard.home.panel.receive'), + icon: RcIconBridge, + eventKey: 'Bridge', + content: t('page.dashboard.home.panel.bridge'), onClick: () => { - setIsShowReceiveModal(true); + history.push('/bridge'); }, } as IPanelItem, gasTopUp: { @@ -399,18 +395,6 @@ export default ({ } }} /> - { - history.push(`/receive?rbisource=dashboard&chain=${chain}`); - setIsShowReceiveModal(false); - }} - onCancel={() => { - setIsShowReceiveModal(false); - }} - /> { { copyAddress(currentAccount.address); matomoRequestEvent({ @@ -389,6 +390,18 @@ const Dashboard = () => { }} /> + { + matomoRequestEvent({ + category: 'Front Page Click', + action: 'Click', + label: 'Receive', + }); + history.push('/receive?rbisource=dashboard'); + }} + /> +
{ + + + + diff --git a/src/ui/views/ManageAddress/index.tsx b/src/ui/views/ManageAddress/index.tsx index 679d0602665..47a849aa934 100644 --- a/src/ui/views/ManageAddress/index.tsx +++ b/src/ui/views/ManageAddress/index.tsx @@ -269,7 +269,10 @@ const ManageAddress = () => { {TypedWalletObj?.[activeIndex] ? (
- {TypedWalletObj?.[activeIndex]?.name} + {TypedWalletObj?.[activeIndex]?.type === + KEYRING_TYPE.WatchAddressKeyring + ? 'Contact Address' + : TypedWalletObj?.[activeIndex]?.name}
{isSeedPhrase && ( diff --git a/src/ui/views/RabbyPoints/index.tsx b/src/ui/views/RabbyPoints/index.tsx index aa4557cdc4b..f04c6d33e6f 100644 --- a/src/ui/views/RabbyPoints/index.tsx +++ b/src/ui/views/RabbyPoints/index.tsx @@ -229,7 +229,7 @@ const RabbyPoints = () => { [wallet.openapi, account?.address, signature] ); - const ended = useMemo(() => !!campaignIsEnded, [campaignIsEnded]); + const ended = useMemo(() => true, [campaignIsEnded]); useEffect(() => { if ( diff --git a/src/ui/views/Receive/index.tsx b/src/ui/views/Receive/index.tsx index 8dd09fb57cb..cc21f5cf129 100644 --- a/src/ui/views/Receive/index.tsx +++ b/src/ui/views/Receive/index.tsx @@ -66,7 +66,7 @@ const useAccount = () => { const useReceiveTitle = (search: string) => { const { t } = useTranslation(); const qs = useMemo(() => query2obj(search), [search]); - const chain = findChainByEnum(qs.chain)?.name || 'Ethereum'; + const chain = findChainByEnum(qs.chain)?.name || 'EVM chains'; const token = qs.token || t('global.assets'); return t('page.receive.title', { @@ -232,7 +232,7 @@ const Receive = () => {
{account?.address && }
-
{account?.address}
+
{account?.address}